From 797acbb9dce90c549169a537d8c5d90388fc1acc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 17 Jul 2014 11:27:25 -0400 Subject: 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/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/RepoProblem.hs | 34 + 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/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 + ...nt_19_dc7b428f525a082834cb87221fc627ff._comment | 8 + ...nt_20_81940ea56ace3dcd5fa84dfccd88ad96._comment | 10 + ...nt_29_37aa87a451d4390ed367402eec740855._comment | 12 + ...ent_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment | 16 + ...ent_6_97704e0d89bb87155e019e09e54fc9bf._comment | 13 + doc/Android/oldcomments.mdwn | 2 + ...nt_10_20e3d513b8b97496d76aca4619026cd6._comment | 16 + ...nt_11_c96b8f1cc1583a74eb2483f48357f023._comment | 15 + ...nt_12_6551f5fa081494b079c10a33c9b0d8ad._comment | 10 + ...nt_13_7c633d245651ec08f63194fe1fc194ae._comment | 8 + ...nt_14_60c2403140085f9caf48a33b59a36ab4._comment | 8 + ...nt_15_77bafc01b47d4cf8f96bde2b6704ed71._comment | 8 + ...nt_16_9af73451be09f03cfff81fdf9481ffc4._comment | 27 + ...nt_17_f76561a654b534df3a807b1c045710b2._comment | 8 + ...nt_18_1b46cdf154ddadfe17e4b6e4054dc619._comment | 17 + ...ent_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment | 15 + ...nt_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment | 8 + ...nt_22_36afd354f9669a154d7b6b2c4d43ded9._comment | 8 + ...nt_23_de98154792e8611a134429f06d82bcb1._comment | 8 + ...nt_24_7ab509c25243009bfbffd796ec64e77b._comment | 10 + ...nt_25_026d1a01d5753d71ac3dfc002f2a5eec._comment | 10 + ...nt_26_f0a044fb649d43e32c96b08edbc336c3._comment | 12 + ...nt_27_6b9ae35b1ceeba14cd7a74e142870705._comment | 34 + ...nt_28_c91db1215f529aa68bfb0576c3c5eddc._comment | 10 + ...ent_2_c2422b7dd9d526b3616e49f48cf178c2._comment | 10 + ...ent_3_0e4980c27b13dbc28477c02a82898248._comment | 14 + ...ent_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment | 10 + ...ent_5_9d78009435736a178d5a3f5a9bc0ed6a._comment | 8 + ...ent_6_7b9523ddb20dc4a929e556c3ed0c7406._comment | 18 + ...ent_7_a56628a622da752806c42c5b8b54ceef._comment | 8 + ...ent_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment | 8 + ...ent_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment | 10 + doc/android/DCIM.png | Bin 0 -> 95786 bytes doc/android/appinstalled.png | Bin 0 -> 16805 bytes doc/android/apps.png | Bin 0 -> 53971 bytes doc/android/install.png | Bin 0 -> 55106 bytes doc/android/newwindow.png | Bin 0 -> 1009 bytes doc/android/terminal.png | Bin 0 -> 20565 bytes doc/android/webapp.png | Bin 0 -> 64097 bytes doc/assistant.mdwn | 41 + doc/assistant/addsshserver.png | Bin 0 -> 31740 bytes doc/assistant/archival_walkthrough.mdwn | 32 + doc/assistant/brokenrepositoryalert.png | Bin 0 -> 5806 bytes doc/assistant/buddylist.png | Bin 0 -> 4347 bytes doc/assistant/cloudnudge.png | Bin 0 -> 7332 bytes doc/assistant/combinerepos.png | Bin 0 -> 10677 bytes ...ent_1_f2c4857b7b000e005f0c19279db14eaf._comment | 8 + ...ent_2_befa1f48e5a43a7965060491430a6bc4._comment | 9 + ...ent_3_9bd3b532a5c026a1d664c898f8e335e6._comment | 8 + ...ent_4_c546a24459ca29025f00e424353c40d2._comment | 8 + ...ent_5_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 + .../local_pairing_walkthrough/addrepository.png | Bin 0 -> 2259 bytes ...ent_1_b33deed054d3aa8cfa6c9e3958643f16._comment | 8 + ...ent_2_39f1162b4d43b61e957e7497df4b9e2b._comment | 8 + ...ent_3_588869692b290483f58f3a7aa2bfb55f._comment | 17 + ...ent_4_f6bf82c263fefe38701709d9dbd974cc._comment | 10 + ...ent_5_bada601ea4b7104f162a3e00def4be2b._comment | 19 + ...ent_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment | 8 + ...ent_7_17d44229e4fa46c50815672b96a9735a._comment | 10 + ...ent_8_b9d4c29cf2cca0427808df6af08fb789._comment | 8 + .../local_pairing_walkthrough/pairing.png | Bin 0 -> 6771 bytes .../local_pairing_walkthrough/pairrequest.png | Bin 0 -> 5383 bytes doc/assistant/local_pairing_walkthrough/secret.png | Bin 0 -> 5132 bytes .../local_pairing_walkthrough/secretempty.png | Bin 0 -> 9575 bytes doc/assistant/logs.png | Bin 0 -> 33631 bytes doc/assistant/makerepo.png | Bin 0 -> 32061 bytes doc/assistant/menu.png | Bin 0 -> 22921 bytes doc/assistant/nautilusmenu.png | Bin 0 -> 59867 bytes doc/assistant/osx-app.png | Bin 0 -> 2604 bytes doc/assistant/preferences.png | Bin 0 -> 22815 bytes doc/assistant/quickstart.mdwn | 30 + doc/assistant/release_notes.mdwn | 414 ++ ...ent_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment | 14 + ...ent_2_75e0774ad042717fbd059a8a9ec2db1e._comment | 12 + ...ent_3_b3bfd8e547e20c51f7c32c6c9424e936._comment | 10 + ...ent_4_c6caa2b521b456bb4ce594d64919cffe._comment | 8 + doc/assistant/remote_sharing_walkthrough.mdwn | 12 + ...ent_1_e0187b0a926904b363065ab0f850f0b2._comment | 10 + ...ent_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment | 8 + ...ent_4_978fab3cd165b4ca245e32fc48cf0970._comment | 8 + ...ent_4_d7e879f7b098964040df2e27a18eda72._comment | 18 + ...ent_5_00852736d47c05772b15c5ff54ae7da7._comment | 8 + ...ent_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment | 14 + ...ent_7_61c1f5b00381b2fa891a8578267881ab._comment | 8 + ...ent_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment | 8 + ...ent_9_c900e4ef49388826c87cadef4235c073._comment | 8 + doc/assistant/repairrepository.png | Bin 0 -> 31791 bytes doc/assistant/repogroups.png | Bin 0 -> 15636 bytes doc/assistant/repoinfo.png | Bin 0 -> 7603 bytes doc/assistant/repositories.png | Bin 0 -> 63405 bytes doc/assistant/rsync.net.encryption.png | Bin 0 -> 40504 bytes doc/assistant/rsync.net.png | Bin 0 -> 61465 bytes doc/assistant/running.png | Bin 0 -> 24664 bytes doc/assistant/share_with_a_friend_walkthrough.mdwn | 58 + .../share_with_a_friend_walkthrough/buddylist.png | Bin 0 -> 5114 bytes ...ent_1_c87889721e3a7e52ac1ed3752fa7db46._comment | 8 + .../share_with_a_friend_walkthrough/pairing.png | Bin 0 -> 6892 bytes .../share_with_a_friend_walkthrough/repolist.png | Bin 0 -> 8525 bytes .../share_with_a_friend_walkthrough/xmppalert.png | Bin 0 -> 4070 bytes doc/assistant/thanks.mdwn | 1 + doc/assistant/thumbnail.png | Bin 0 -> 3491 bytes doc/assistant/unused.png | Bin 0 -> 49957 bytes doc/assistant/upgradecomplete.png | Bin 0 -> 4817 bytes doc/assistant/xmpp.png | Bin 0 -> 27753 bytes doc/assistant/xmppnudge.png | Bin 0 -> 6156 bytes doc/assistant/xmpppairingend.png | Bin 0 -> 34379 bytes doc/automatic_conflict_resolution.mdwn | 23 + ...ent_1_307898855f91a2a189d4fa5eae62cce1._comment | 10 + ...ent_2_0a8ea42764dde1a33d2112197b961c51._comment | 8 + ...ent_3_5c587c6633cae1c8547ca970d55ee97e._comment | 8 + ...ent_4_80539e11e36a0b64cee83b6b373bd843._comment | 17 + ...ent_5_00ac9e4a47ce9a886dbf573480f151bd._comment | 10 + ...ent_6_8a0860fee88f5954918305f055a39d8d._comment | 10 + ...ent_7_3d2250cc26036b8532faa980065e20d0._comment | 23 + ...ent_8_ef474c258ce8e0ebc6485c1366ae6315._comment | 8 + doc/backends.mdwn | 43 + ...ent_1_375bb1fb5973e8fa67b763f2dd6e404b._comment | 13 + ...ent_2_1f2626eca9004b31a0b7fc1a0df8027b._comment | 24 + ...ent_3_fdcbf8727fdefb9942a54689234b9698._comment | 12 + ...ent_4_46591a3ba888fb686b1b319b80ca2c22._comment | 9 + ...ent_5_2210c7ff2d5812fb3b778ac172291656._comment | 8 + ...ent_6_82f239b58680a2681bd8074c7ef9584d._comment | 8 + doc/bare_repositories.mdwn | 48 + ...ent_1_148e1da70d37d311634a0309a4ff8dcd._comment | 22 + doc/bugs.mdwn | 7 + ...ils_to_talk_to_other_5.x_git-annex_remotes.mdwn | 37 + ...ent_1_323262a080daed9cebd4caee4c887210._comment | 10 + ...ent_2_6172dcd7db2322084483a18d4f3cc2d6._comment | 8 + ...ent_3_5ae2178863709230ddb995905c629c4e._comment | 10 + ...ent_4_19d32634789a09c1b04e9d3fcde364f7._comment | 8 + ...durl_downloads_but_does_not_checkout_files.mdwn | 74 + ...___47__etc__47__resolv.conf_does_not_exist.mdwn | 26 + ...ent_1_d4f22335d5b6cb178c77579a1b450f9c._comment | 13 + ...ent_2_19dd9ebfebbece9d3654825492ebd5b9._comment | 20 + ...ent_3_4a85c4c45768f96bdc6619c193de55ab._comment | 10 + ...ils_with___34__Internal_Server_Error__34__.mdwn | 20 + ...ent_1_414adc1bee73711e3133c7fe8811aae2._comment | 10 + ...ent_2_977a529f488ce0c167035675f76ebabf._comment | 8 + ...___or___34__Full_backup__34___server__41__.mdwn | 84 + ...ent_1_3f0e3fed240252207020d31ab96d0666._comment | 10 + ...ent_2_87746f4fd0b404db7070c0b2346e8e2b._comment | 66 + ...ent_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment | 27 + ...ent_4_b54c169a96e263e12495690fe14d8b4a._comment | 14 + ...ent_5_56ef816d3d4f3d85d31ccaf806133073._comment | 8 + ...ng_DCIM__47__Camera_not_being_configurable.mdwn | 16 + ...ent_1_1fe5f8c68a430b2436649cf4ba8f4987._comment | 10 + ...roid___91__Terminal_session_finished__93__.mdwn | 33 + ...ent_1_31af3e5226430a4e94de58c0e33bd22b._comment | 12 + ...ent_2_a5bcbd2f85283e29e237e9850cd8109a._comment | 22 + ...ent_3_965efa6736dcff4d7010ea5533f31a59._comment | 8 + ...ent_4_90a0be2296b4a1d8c1708423666c9619._comment | 31 + ...ent_5_be4b720293992f75b9cc3e8f6687fb87._comment | 8 + ...ent_6_8e439138c97b8853ab2b6f96f6111568._comment | 8 + ...ent_7_6142516d816f78c724e22737aa3bca53._comment | 8 + ..._sync_files_with_utf-8_characters_in_names.mdwn | 36 + ...ent_1_bcc3ce19cf26731057a7f3189fcbae19._comment | 10 + ...Android_fails_on_Google_Nexus_10_Jellybean.mdwn | 166 + ...ent_1_b41666c032aeb2d0de35023328391edb._comment | 25 + ...ent_2_95ebed938df3db2b6d4ebe4c666c08f8._comment | 8 + ...el_version_broken_on_Synology_DSM_4.3-3810.mdwn | 28 + ...ent_1_c398f92de91729e60b59127733759a38._comment | 14 + ...ent_2_646087d44ee32f78784ae9e8d65d87e6._comment | 8 + ...ent_3_205e41cb0abaed3e16d45206bb2e77a4._comment | 10 + ...n_symlinks_are_in_.git__47__annex__47__tmp.mdwn | 9 + ...ent_1_659e0c5127c92b1c7643823d0c240543._comment | 10 + ...nt_doesn__39__t_check_if_it_can_drop_files.mdwn | 64 + ...ent_1_f32fbae29e4db039804c0853256c238c._comment | 10 + ...ent_2_405bfa00dfd433352c263afe75e94b2c._comment | 10 + ...ent_3_c8cac8d800199ca4d8a65ba72abf678e._comment | 40 + ...ent_4_ee5fa8a22d1571b0040aa97c4979ef92._comment | 14 + ...ent_5_eef448b9e3dd1a717430a60d1001a7ee._comment | 10 + ...rate_local_repositories_100__37___separate.mdwn | 435 ++ ...ent_1_418103046e296a43cfe0f0cf69e729d5._comment | 8 + ...ent_2_9405804842bb23e8040ec85b271b18af._comment | 23 + ...ent_3_01fc26e443ea3a8a351174b45f25dc2a._comment | 10 + ...ent_4_6e8f0889359bb2f3e3438658c9776f76._comment | 14 + ...ent_5_902fe9ff295453461b66d84463205fc3._comment | 10 + ...ent_6_ce01656b191d2bb13a3ddc29794e1e7a._comment | 12 + doc/bugs/Assistant_dropping_from_backup_repo.mdwn | 28 + ...ent_1_c13d86fb2541676ee4ca1446b99e0e68._comment | 8 + ...dalone_5.20131230_64bit_crashes_on_startup.mdwn | 31 + ...ent_1_56befc288c40e062e086d93d26064342._comment | 14 + ...ent_2_107ab23eac98a168d2920bb88b4ec86f._comment | 24 + ...ent_3_7707c47aacde425ca6149dd828dd27fb._comment | 10 + ...t_has_created_155_semitrusted_repositories.mdwn | 191 + ...nt_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment | 18 + ...nt_11_cb49edcc8a13928c171a2acdde32dce9._comment | 12 + ...nt_12_a86c8347526e7b0a6f7633f3aea528bb._comment | 8 + ...nt_13_a26c2b49ee7746be06f4772aa838d5aa._comment | 21 + ...nt_14_b958da97a69091d283918e0d5a658da5._comment | 26 + ...ent_1_169b24b34cce3f5c8446c2150beb6827._comment | 8 + ...ent_2_6acd6f38297772a07d8d5fb999bd2eaa._comment | 183 + ...ent_3_6a4118e5c5fbe5e84d27094ac72b741b._comment | 22 + ...ent_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment | 8 + ...ent_5_11af8ab2587e6eeb671051ba8191995b._comment | 11 + ...ent_6_26236cdc2bce532017854791bcd727d1._comment | 8 + ...ent_7_3c532dd5b8a01ecdeda1300b49aba675._comment | 12 + ...ent_8_119142c5ebc499f0ee0926dbca265308._comment | 10 + ...ent_9_0651071ee1654eeaa9aa9369873fdf6a._comment | 8 + ...ng_over_and_over_and_using_a_lot_of_memory.mdwn | 520 ++ ...nt_10_edb2428552cf98bfb1735c2d6daf2b20._comment | 8 + ...ent_1_ac8c39e362e6c806b9d68befc0199ccd._comment | 10 + ...ent_2_b2941bf7901a1b2237b7210c8f0af2a5._comment | 22 + ...ent_3_1429ca784a03bc424b3537cbe0449421._comment | 23 + ...ent_4_f9e65cf5598b4b14eeee1f41f46d4084._comment | 12 + ...ent_5_044ecac2d2e670e1ef69809c944093d1._comment | 19 + ...ent_6_6f4f51e1583bed5e7e601e4f30f4207b._comment | 8 + ...ent_7_683a0a3d4caea0ee625e41ae8a6c7c06._comment | 81 + ...ent_8_03dd76b01f46a7cc66eddac3e054c8ad._comment | 8 + ...ent_9_5f4444f03cbebaa44628288095383679._comment | 89 + doc/bugs/Assistant_merge_loop.mdwn | 19 + ...nt_10_8fe176691f0f61c15085d3c38f0ea50f._comment | 8 + ...nt_11_6e3a78327c0b813415ebf85e298813d4._comment | 10 + ...ent_1_ccf46511b924f86b488dba25060baa06._comment | 14 + ...ent_2_afcbf3f8575e1a967c79693b94ef055c._comment | 12 + ...ent_3_07341221b2839fdc1c43634e011451d2._comment | 62 + ...ent_4_7ae215b478843d2a8c705cac385fcf22._comment | 8 + ...ent_5_11873461f093a266f0bb7e129bc21cde._comment | 8 + ...ent_6_e7b6ecdd7e2b0222ea0baa0ed770e66d._comment | 80 + ...ent_7_7717d074611943b831f00ad10918b515._comment | 8 + ...ent_8_5ce91ac76498539ada344d1639984302._comment | 8 + ...ent_9_b09a5eaa2588559e19b3549bd3c8b496._comment | 10 + ...Auto-repair_greatly_slows_down_the_machine.mdwn | 21 + ...nt_10_d46c6314bff75a0ae679bc2358b28c2b._comment | 8 + ...nt_11_1c2c3adfbccd2b14a7d1c4618800e735._comment | 8 + ...ent_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment | 10 + ...ent_2_9f5340ab1012f335af0c246b82c1a777._comment | 16 + ...ent_3_67bfccf0934075559d439b1deafc001e._comment | 9 + ...ent_4_5fa785aa759d1a1917f2a292324fe5ec._comment | 8 + ...ent_5_9fe529034ad0115792b58d7da99c167e._comment | 8 + ...ent_6_93ed991ef2a74c18575073ca72e06185._comment | 8 + ...ent_7_4649fa11745ff668e43833209811d005._comment | 10 + ...ent_8_6138a48f0b7e8be2bb66430397afdf5a._comment | 8 + ...ent_9_3da5940bb2e9689b00239eec9a073f1c._comment | 8 + doc/bugs/Bootstrap3_icons_missing_on_Android.mdwn | 7 + ...nt_10_da4e26c77376a8171493a815bdb51ff1._comment | 10 + ...nt_11_506e26de284a6429366def33b007bc0c._comment | 8 + ...nt_12_a77477951576fc657d693811f11f9975._comment | 24 + ...nt_13_c3ef67bded8ed3c511a8ea85b8bd81a5._comment | 8 + ...ent_1_97cf233d8401d642337d5fe9dd525e2b._comment | 8 + ...ent_2_4981a0a894b77e94a3bffec82b0f6e51._comment | 16 + ...ent_3_dbe960392aaa0839886381820754814a._comment | 10 + ...ent_4_cdf9621fe3e9f8eb8b7af88f779a7116._comment | 8 + ...ent_5_a2318f094b30f58fefc072807896c099._comment | 8 + ...ent_6_7c2f1d914793798708ca13b6ac3dd474._comment | 29 + ...ent_7_a24b5165590b5d58919da1003cd20c54._comment | 8 + ...ent_8_71ed14b8e5a898b1643d5e37591c2476._comment | 8 + ...ent_9_15357e33c2431080d45f7cef5f4f1209._comment | 8 + doc/bugs/Box.com_ReposnseTimeout.mdwn | 12 + ...ent_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment | 20 + ...ent_2_29d8a9fa8d385a08fa70337baaba462c._comment | 10 + ...ent_3_b73450b3a9728ac6f34f0e63255f6fa9._comment | 8 + ...ent_4_0bd9eb5947a21d0657e79cf276923bb5._comment | 9 + doc/bugs/Bug_Report_doesn__39__t_work.mdwn | 20 + doc/bugs/Build_failure_at_commit_1efe4f3.mdwn | 45 + ...ails:_Not_in_scope:___96__myHomeDir__39___.mdwn | 56 + ...ath_repo__47__.git__47__X__34___for_many_X.mdwn | 37 + ...ent_1_7f54e24c8e721d69bdb1e5a4181641b8._comment | 10 + ...ent_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment | 14 + ...ent_3_4cf34da6050dd96f94ffc3652aa39715._comment | 12 + ...ent_4_cafcc24e98a89f10adaed5e09f75b659._comment | 19 + ...ent_5_118d61dea9ef0faa2960da6f2f62ec8b._comment | 12 + ...ent_6_3978557c6e85608243e5b4eb698ac5a5._comment | 27 + ...ent_7_e6dfc41d2042402b40efb6f6139d5662._comment | 18 + ...ent_8_33a84937c87dd2406bc090a0d2969683._comment | 30 + ...ent_9_28bb02572d453db3b30824ec7604d91a._comment | 17 + ...ecause_some_filenames_have_a_colon_in_them.mdwn | 20 + ...ent_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment | 12 + ...ent_2_38696178e658d1d32deec37dbea66a3d._comment | 8 + ...ent_3_f34d996827f5e7662bec409cbcce961b._comment | 12 + ...n__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn | 158 + .../Can_not_Drop_Unused_Files_With_Spaces.mdwn | 22 + ...ent_1_b909ed9f474601587b2adad7ad4f674d._comment | 8 + ...ent_2_b2735a6e03db3f77a87a0f7d87347685._comment | 16 + ...ent_3_dd82a0cd698b0688ff08f0462af0275f._comment | 8 + ...ent_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment | 8 + ...ent_5_106c271d5174342055910bf57c0a34c5._comment | 8 + ...ent_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment | 8 + doc/bugs/Cannot_clone_an_annex.mdwn | 69 + ...ent_1_b40a2652361a79c6c6eab0fc21be8e46._comment | 8 + .../Cannot_delete_remote_when_ssh_sync_fails.mdwn | 8 + ...ent_1_3c8e8fae688a9db8e18e869a187fb4eb._comment | 8 + ...ent_2_e189617c4ac23df50f02af8c517fa399._comment | 14 + ...g_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn | 46 + ...ent_1_81a4647a9b51bed8c230a2a16990915d._comment | 14 + ...ent_2_f8e97dded9ba6d2305de1278025924fe._comment | 23 + ...ent_3_eb34061429cb8c7d0b155825e84b657b._comment | 35 + ...ilding_version_5.20140402_in_cabal_sandbox.mdwn | 36 + ...ent_1_bd830cadaeffda0366b3ae46b34c0c55._comment | 39 + ...les_deleted_and_deletes_them_elsewhere_too.mdwn | 36 + ...ent_1_80ca50f5305eda71fe32f2b0bc922c34._comment | 21 + ...ent_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment | 9 + ...ent_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment | 12 + ...ent_5_6058a22b733cb02126286af950074ed4._comment | 10 + ...ent_6_593a49669e2fadfb91773f8c84fbb031._comment | 8 + ...ent_6_5a348c5f327f16e1192ef6bd7f2880bb._comment | 15 + .../Could_not_read_from_remote_repository.mdwn | 28 + ...ent_1_da842a9d146bcd5c7773b58364c25597._comment | 8 + ...ent_2_82746a0cf989d884cd0fd796db092b3c._comment | 36 + ...ent_3_95d16045dc238dba19a98808de2eeedf._comment | 11 + ...Crash_when_disabling_syncing_in_the_webapp.mdwn | 25 + ...ent_1_e25dd80370820782f9c6a877101d8703._comment | 10 + ...ent_2_4031c16362137747717e9595cb5c8a15._comment | 10 + ...ent_3_0667f39f60bdaba6670f5b8304a8a77c._comment | 12 + doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn | 53 + ...26____47__wherever__34___works_incorrectly.mdwn | 37 + ...pted_S3_does_not_check_for_presence_of_GPG.mdwn | 19 + ..._40__using_git-annex_webapp_--listen__41__.mdwn | 35 + .../Daemon_stops_working_on_mounted_CIF_share.mdwn | 12 + ...ent_1_2a5fb522cbf6e2cefbee0a5fc48287d0._comment | 45 + ...ent_2_6b8d35d464e248c29764e3adbc1c9bae._comment | 8 + ...ent_3_e134ba74ec996a419d6f9903871b9b03._comment | 47 + ...ent_4_2ad592d92dda2d1e78235bad5764f5d9._comment | 22 + ...ent_5_42ad8c7944c210ac1be812e463e03d7c._comment | 13 + ...ean_up_ssh_keys_after_removing_remote_repo.mdwn | 18 + ...ent_1_88fbf70eae48484988dbb433a437c717._comment | 14 + ..._repositories_still_use_symlinks_sometimes.mdwn | 36 + doc/bugs/Disconcerting_warning_from_git-annex.mdwn | 8 + ...ent_1_58cebd377bfdf247b6c4fee27a3ba461._comment | 8 + ...ent_2_dc7407044d4c739d05248300c58d8ef2._comment | 8 + ...ent_3_13999207f4ddac2f9c345415f25f7ada._comment | 28 + ...Drop_--from_always_trusts_local_repository.mdwn | 46 + doc/bugs/Empty_folders_don__39__t_get_remove.mdwn | 4 + ...ent_1_9f41638299c214b2ee13f23ab41349da._comment | 10 + ...emote_ssh_server_with_multiple_directories.mdwn | 19 + ...ent_1_e8affeca873c2ef73255f8f77e0ac16f._comment | 10 + doc/bugs/Endless_SSH_password_prompts.mdwn | 34 + ...ent_1_b3a32d7a53c30478f409a47f856282ab._comment | 10 + ...ent_2_0a1fc4b4580d8be4c37064e0a16de99b._comment | 8 + ...ent_3_46210f7745b8c7c237fc8b08309390fe._comment | 11 + ...ent_4_bf311301063db06bcfa8ce8d7db54028._comment | 8 + ...ent_5_7490ca530d4e7d49eaa264eb5880dd17._comment | 8 + ...ent_6_57952f91c8d55558cce18b229398f70c._comment | 11 + ...ent_7_6d6a131fda398840cfe00c52ad560ed2._comment | 10 + ...reating_remote_repository_using_ssh_on_OSX.mdwn | 39 + ...ent_1_559555934d79ae6be383063abcaae22e._comment | 10 + ...ent_2_a9f4f9db042ab6f6c15d6954651971b2._comment | 12 + ...ent_3_55a496d0a0be80ba723b17bf9faa3bc0._comment | 8 + ...Linker_needs_to_escape_spaces_in_user_name.mdwn | 18 + ...ent_1_6b289221a65a750444b1b5850df3386c._comment | 10 + ...solution_for_mtime_2s--__62___implications.mdwn | 138 + ...nt_10_13a35801805ea3d2d4428b1539f96b16._comment | 18 + ...nt_11_632456a0a1d399ee2bbac76b7d63a5f1._comment | 14 + ...nt_12_e4d268f269cc1701736cc5a39719ac20._comment | 23 + ...nt_13_962cd8d7280cbc1d61778d69f3a393f0._comment | 16 + ...nt_14_5b3bb068b62b12c7cc7504836a8acf32._comment | 10 + ...nt_15_5271ba4eed013adec8391ddfcc11eda8._comment | 19 + ...ent_1_7a536b79bae7d8f897f014d17dbb90b6._comment | 8 + ...ent_2_349959a6daa722c8350f73feb0b27162._comment | 16 + ...ent_3_923fc470727ecf21f0bb368b0486b15d._comment | 22 + ...ent_4_68a8434018430a0d2671c4e23e9a3b12._comment | 8 + ...ent_5_0b7d69489b9f10bb5ed617b5b62ae063._comment | 8 + ...ent_6_650d950da065eeac966c2498418c668d._comment | 22 + ...ent_7_834c512e32ad5a157d8fa9fd472831b4._comment | 8 + ...ent_8_2500e6f9545b916dfa41549140c053fd._comment | 41 + ...ent_9_e2dc3ff80bbd66837f00975b16e17126._comment | 10 + ...lace_can_be_sequentially_copy_then_dropped.mdwn | 17 + ...ar_from_locally_paired_annexes_when_edited.mdwn | 36 + ...ent_1_bdc97db9dc9954331e4c400baf9e5541._comment | 10 + ...taged_change___34__deleted:_uuid.log__34__.mdwn | 44 + ...ent_1_6441dd04adc158df22589c81746108a9._comment | 10 + ...ent_2_d1c5d7642284a375f9c455dbf76efa5c._comment | 12 + ...ent_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment | 14 + ...ent_4_8e0f489305ce30ad578b9f8526e86416._comment | 10 + ...ent_5_c699034c8e02b2354516414d0ab73aab._comment | 53 + ...ent_6_786cb7e643811dfd2496ceeff8f34f44._comment | 10 + doc/bugs/GIT_DIR_support_incomplete.mdwn | 17 + ...issues_with_pubkey___40__Again__63____41__.mdwn | 44 + ...ent_1_ac3631024abf372e6f578a472b86d792._comment | 8 + ...ent_3_980c149d7f9040f5e71e662d95a5fbf1._comment | 9 + ...ent_3_c279f5cc3f96910287e72bf59120d02b._comment | 8 + ...ent_4_ec6abe7074f767f866e9618d65a4a900._comment | 12 + ...ent_5_44f80d89360a5620f919f8bc7c1c2879._comment | 8 + doc/bugs/GPG_passphrase_repeated_prompt.mdwn | 25 + ...ent_1_6ef1c9725befc84ad57bce196ef630ef._comment | 16 + ...-Annex_requires_all_repositories_to_repair.mdwn | 3 + ...ent_1_dff1424e48835d7d3eb8653fc59de18a._comment | 10 + ...Git_annex_add_._dies_when_you_add_too_much.mdwn | 58 + ...ent_1_a99b96c38bba3af54e0152cc3730c16c._comment | 10 + ...ong_when_submodule_is_not_in_the_same_path.mdwn | 65 + ...ent_1_b3197993dbdfaf2db5e4651ac54a896e._comment | 12 + ...ent_2_1fbbd02e61ef524597dafd69460b00b4._comment | 10 + ...-region_parameter_to_glacier-cli_on_hasKey.mdwn | 38 + doc/bugs/Glacier_remote_uploads_duplicates.mdwn | 36 + ...ent_1_8aef582a0f0d0c7f764b425fc45de3b4._comment | 25 + ...ent_2_150ce8b7c4424a83c4b1760da5a89d27._comment | 8 + ...ent_3_718af5048c5f894eee134547a2e0a644._comment | 8 + ...ent_4_184ad0f8c2847309632f8c18b918cd42._comment | 10 + ...ent_5_6980a912d3582c2f2511e4827e9e76b3._comment | 21 + ...ent_6_feea067d6856af2840604782b29af86a._comment | 12 + ...ent_7_e96187bad3dae2f5f95118f6df87a1ec._comment | 10 + ...ent_8_34216b514a6fca788cfacb8579ce5311._comment | 12 + ...outside_archive_directory_at_the_same_time.mdwn | 18 + ...ent_1_e8bb3d6a2318402b985caed08282d473._comment | 12 + ...ent_2_ead9fa75a12ef36be9a92637b144e74f._comment | 14 + doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn | 126 + ...ent_1_aaa781664ae0c62c4f6530cb075ed367._comment | 17 + ...ent_2_213aa10909d1fd0f20ed078a7ed93e79._comment | 8 + ...ent_3_e6b783d9aaae20c0d35e9888d878716a._comment | 10 + ...ent_4_b008ae7b1cf8685d92c9a87a7609de1e._comment | 18 + ...ent_5_949c891209713a2c0a5e66af11ed4c79._comment | 14 + ...mory_on_switch_to_indirect_mode_and_status.mdwn | 69 + ...ent_1_94c678e1348280a96f11d7456c240d3a._comment | 8 + ...ent_2_09450d58df2373174a1f0d90b08e9eb3._comment | 14 + ...ent_3_a07105226ef3488b97731db004651976._comment | 10 + ...able_an_existing_gcrypt_repo_in_the_webapp.mdwn | 23 + ...ent_1_17814787e333d15da3ab4e57c7d31d4b._comment | 12 + ...ect_merge__44___direct_repos___40__2__41__.mdwn | 44 + ...ent_1_15c354c4841d364e78882d2b46a0a764._comment | 66 + ...ent_2_8bc496226a977dbeeb1ce3f06122f1c2._comment | 12 + ...Incorrect_merge___40__a_special_case__41__.mdwn | 48 + ...ent_1_c80418d76b501c688e3a9fb4831520fd._comment | 41 + ...ent_2_8b2a188696f46819f6e3f0e9660362d2._comment | 45 + ...ent_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment | 15 + ...ent_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment | 14 + ...nnex___40__1.0.52__41___as_seen_by_Android.mdwn | 24 + ..._34__Duplicate_instance_declarations__34__.mdwn | 35 + doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn | 37 + ...ent_1_f42f703a5d267557abf5e932f0890d4a._comment | 37 + ...ent_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment | 18 + ...ent_3_bda72b0d615843d18d6ef21f833432a8._comment | 9 + ...ent_4_651440cda405ad40a04479f5d87d581e._comment | 10 + ...ent_5_21fa189b631c246ac5df16a49c3c0178._comment | 8 + ...ent_6_1f712693d2ded5abceb869fdb7f47ef3._comment | 12 + ...ent_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment | 14 + ...ent_8_a4683fd73ae452a9cd7f61d9930f6266._comment | 10 + ...ent_9_ced3516c3e7161e4d7e599232f62a511._comment | 8 + ...ver_Error_unknown_UUID__59___cannot_modify.mdwn | 26 + ..._rate_limit_uploads_to_an_S3_backend__63__.mdwn | 20 + ...ent_1_ef97e735ce308f7bcc03f5d9fda588bf._comment | 10 + ...ent_2_539b89de8743e435386b86119d1e982f._comment | 8 + doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn | 27 + ...ent_1_5fc1eedb5231edc37c87a2d9b91313b9._comment | 12 + ...ent_2_b14e697c211843163285aaa8de5bf4c6._comment | 12 + ...ent_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment | 19 + ...ent_4_c25a8eb369e546f65e1a72d89f43066f._comment | 12 + ...ent_5_6407a3e7aa0316cba2994bfef0e3c633._comment | 37 + ...ent_6_f01887695e8b8386e125464c6d401565._comment | 8 + ...ent_7_c7776d5b2d073e0d2ae36515185c25aa._comment | 17 + ..._very_easy_to_turn_git-annex_into_a_zombie.mdwn | 25 + ...ent_1_d5fba6c061fb21795021ea83070dbfa2._comment | 8 + ...ent_2_12cba707239018989e8d5b6f456fa754._comment | 10 + ...atest_64_bit_standalone_Linux_build_broken.mdwn | 18 + ...ent_1_428eba88016d50a6631fffa906815767._comment | 8 + ...ent_2_87f70b3eececca8a5b7946cff53e0a2f._comment | 10 + .../comment_3_manually_added._comment | 18 + ...ent_4_43947607472193e2199b98ee2192af30._comment | 8 + ...reaks_support_for_glibc_2.13_debian_stable.mdwn | 43 + ...ent_1_dc7f726a0b60f64392cbbd1b4317bab5._comment | 10 + ...ent_2_4a0198d714bd3b52ba9baa68dc45f535._comment | 12 + ...rk___40__ssh__41___fails_to_pair__47__sync.mdwn | 177 + ...ent_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment | 14 + ...ent_2_104898dce3c67c082a9f2b36e2f45ff8._comment | 10 + .../Local_pairing_fails:_PairListener_crashed.mdwn | 18 + ...ent_1_d9c5d2147cf6d8d8477eb13b72081d46._comment | 12 + ...ent_2_60a21105145ac228f486bc4beb2ea54d._comment | 32 + ..._when_creating_USB_repo___40__solved__41__.mdwn | 23 + ...ent_1_0b4dcedc58e5071733e1239490aed2ea._comment | 10 + ...ent_2_1cb1ef0292a3357874b461a77c13373e._comment | 8 + ...ent_3_e5ec1e3ab304d738e3b0847287a47af4._comment | 10 + ...PG_error_adding_S3_repo___40__solved__41__.mdwn | 28 + ...ent_1_d95accb43bd18cc9acbbf1d4069f86b3._comment | 8 + ...ent_2_452a3c524974832f0742efb00df4d576._comment | 13 + ...ent_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment | 10 + ...ent_4_b524649cee751532d20a4894d71c5cf3._comment | 8 + ...ent_5_8312ba868ef616ec00563446c9c3464f._comment | 12 + ...ent_6_1af75c691d27c97397f1901f7c2483b0._comment | 8 + ...ent_7_e519df252875de87c4ef5b727f033bdf._comment | 8 + ...ent_8_4bb959e2659991cd392853e8beacf708._comment | 8 + ...Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn | 12 + ...ent_1_b918a741f2397b6588e7a9f1feca7e66._comment | 8 + ...version_still_too_old_for_.gitignore__63__.mdwn | 28 + ...ent_1_1768ece63499c643c75085773b6d4c18._comment | 8 + ...ent_2_888fb193072cf05a34943db072eb7a3b._comment | 8 + ...ent_3_f199ac6ae2448949ef0779177cf0ef58._comment | 8 + ...S_git_version_too_old_to_honour_.gitignore.mdwn | 38 + .../Manual_content_mode_isn__39__t_manual.mdwn | 89 + ...nvolving_symlink_yields_unexpected_results.mdwn | 51 + ...ent_1_e8a2ea1b8573bee45b70bcc7ef7e3bed._comment | 8 + ...ent_2_b6182038292bd72dc4711e4575510172._comment | 8 + ...ent_3_c6ca13d475b3f846c95606c20e1a3052._comment | 8 + ...ent_4_13179e0f72026092e48c13082818ce68._comment | 15 + ...ent_5_585c8a5a13bb17032bfe30818345f936._comment | 10 + ..._uuid_after_local_pairing_with_older_annex.mdwn | 31 + ...ent_1_8229df64a872bee7590f75eb78f78c4a._comment | 10 + ...ent_2_f37be896396915b1c85cff8811dceb4a._comment | 12 + ...ent_3_df7fc1078059538a76f384a40541e91f._comment | 10 + ...ent_4_70c444c61f41df2f59294c10f94f0c09._comment | 8 + doc/bugs/More_build_oddities_under_OpenBSD.mdwn | 39 + ...nt_10_09297f99f3c1c081738ca4ab32808fde._comment | 8 + ...nt_11_1407efc78b92a3c6156154f54e4a14e2._comment | 97 + ...nt_12_fdec033e37652c51fbcd74438586d285._comment | 12 + ...nt_13_ed3716baf787ca17d227ce2e327a1959._comment | 8 + ...nt_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment | 11 + ...nt_15_ad4b7191c9b8f67def33b26a1d762a5d._comment | 26 + ...nt_16_2e765b5286d816bea00880a17a20cbfb._comment | 10 + ...nt_17_ded9011dcdbe4de05189a0e8d040f045._comment | 10 + ...nt_18_f7a85b46bf7afaaf431d6771219c66b0._comment | 16 + ...nt_19_217be2000e423e844241d405ba9f64c8._comment | 10 + ...ent_1_4ffea64907656ff2ec65ff4450aadda7._comment | 11 + ...nt_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment | 10 + ...ent_2_4fb96984757b3d37a1a5ebce664aa8fe._comment | 8 + ...ent_3_c5fdf29499a02be83850d1238fc8ce23._comment | 8 + ...ent_4_d42106128c3dac2dd7761a82cc03912f._comment | 9 + ...ent_5_71166beb796f22dcee065a167cd5e0ed._comment | 12 + ...ent_6_65913a2de8bbe981beaa66c58d2429b5._comment | 8 + ...ent_7_8dd46cec230125d1410d8e6824aeddf2._comment | 12 + ...ent_8_275d3e62cb5667a2d6ddd90db7a40bff._comment | 18 + ...ent_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment | 12 + ...are_not_picked_up_by_the_assistant_on_OS_X.mdwn | 24 + ...ent_1_75c14b405929a8f771a7c261dcc4b7a2._comment | 42 + ...ent_2_f52483415c623ea0649c3805728ce761._comment | 35 + ...ent_3_fd73fbeef61df106f084ac235fca904a._comment | 8 + ...ent_4_c5e9843a956984efd22bad629930f6bd._comment | 8 + ...hen_synchronized_to_a_different_repository.mdwn | 15 + ...ent_1_651965d8a9f0e0c07313c1a2916f77e5._comment | 8 + ...easy_way_to_re-inject_a_file_into_an_annex.mdwn | 12 + ...ent_1_c871605e187f539f3bfe7478433e7fb5._comment | 8 + ...ent_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment | 10 + ...ent_3_be62be5fe819acc0cb8b878802decd46._comment | 14 + ...ent_4_480a4f72445a636eab1b1c0f816d365c._comment | 8 + .../No_manual_page_on_prebuilt_linux_version.mdwn | 18 + ..._with_certain_filenames_using_WORM_backend.mdwn | 61 + ...ent_1_a1db4ff3e8517d7cbe649bca1ed275d0._comment | 8 + ...copies_not_checked_when_running_with_--all.mdwn | 40 + ...ent_1_63af5a11c3ae370433c4bf84de097414._comment | 9 + ...ls_to_download_new_file_after_initial_pass.mdwn | 119 + ...nt_10_3feba4ba84efb77bd4f8f46b6b4600f1._comment | 8 + ...ent_1_a33fcd088e419d8e6c459e42f21f8bbe._comment | 10 + ...ent_2_47196f7e781137751ebd1a1d7083838a._comment | 18 + ...ent_3_672d98ee06e051430f8e01faa93bb4cf._comment | 28 + ...ent_4_06fb3031b838cd443326f4ecd689b600._comment | 10 + ...ent_5_42d447400c15acf6ca031d165b2c781c._comment | 8 + ...ent_6_edd7d5d5c761ff665840f0ef7bea50c9._comment | 10 + ...ent_7_18e5334ab89efcf89ba8847436d55065._comment | 13 + ...ent_8_35b2bbdc24a7bd686527cd1839dee7d0._comment | 10 + ...ent_9_a771c6b453e6a4b3895dd69a53093440._comment | 246 + ...all_but_the_first_copy_are_lost_on_unannex.mdwn | 54 + ...ent_2_f7149b684a97070cff051b780c73be48._comment | 15 + doc/bugs/Old_repository_stuck.mdwn | 9 + ...ssion_package_update_from_2014-06-30__41__.mdwn | 93 + ...ent_1_7508685b6f676c72e316642b80e40ee8._comment | 10 + ...ent_2_c4dd12ea578d1f07464e1b9d68ec96cf._comment | 20 + ...ent_3_8687c1d1c44d88a8ac13208273565d6c._comment | 37 + ...ent_4_62be3dd4092b15cdf85cf9a231b2863a._comment | 8 + ...ent_5_cca4905426a3e01da6e12be855c7a418._comment | 27 + ...ent_6_ae2ca07169321c4a51b7e8e581fda5e2._comment | 72 + ...ent_7_ae5c434a9c94aa000b604095f52e3d3c._comment | 14 + ...r_HTTP_sends_URLs_with_incorrect_separator.mdwn | 186 + ...9__t_use_a_USB_disk_annex_created_on_Linux.mdwn | 18 + ...ent_1_f224f4155d857a59595658357f97dac1._comment | 12 + ...t_has_a_unix-style_local_remote_configured.mdwn | 22 + ...ent_1_95655915ff6ba9fb5d873358ff047496._comment | 10 + ...ows_the_Comitted_Symlinks_are_not_Relative.mdwn | 102 + ...s__44___including_original_one__44___gone..mdwn | 240 + ...ent_1_3a3891c9d7ee808f6a71780cb628f23d._comment | 12 + ...ent_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment | 27 + ...ent_3_fff1e778a6334258c173a96e6bf7ef6a._comment | 10 + ...ent_4_2a86da97a89e28f0a0f5e160d4932ae6._comment | 19 + ...ent_5_41b8e8e58025cc8c8f12efb9a51acd29._comment | 50 + ...ent_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment | 10 + ...ent_7_06de36dcde4c52ab74c8134f3242ac02._comment | 9 + ...start__41___even_if_repo_exists_on_Android.mdwn | 40 + ...ent_1_9f10bf273b15e93f1eea029f091f26cb._comment | 12 + ...error_in_fsck_whereis_find_and_status_cmds.mdwn | 84 + ...ent_1_3aef6ca929fad198f2dda0868f2d49cb._comment | 18 + ...ent_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment | 8 + ...ent_3_480c39648e3ca6fc58c30377bdb25a8c._comment | 16 + ...ent_4_b31496b37046a9886f632ba4f11c56e3._comment | 8 + ...ent_5_d25ff424dda1f6021c1ba20f79d71ffc._comment | 12 + ...ent_6_9e3300b223dd54a3f07c650f5cf70ae0._comment | 8 + ...ent_7_b91f4a87b6d29ae6b4262922fd65a79d._comment | 8 + ...ad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn | 23 + doc/bugs/Prevent_accidental_merges.mdwn | 16 + ...ent_1_4c46a193915eab8f308a04175cb2e40a._comment | 8 + doc/bugs/Proxy_support.mdwn | 19 + ...on_between_watch__47__assistant_and_addurl.mdwn | 195 + ...ent_1_8f56b8661a600729d7a9d569e8a0ba70._comment | 55 + ...ent_2_46dc67bdcd174cd50ccc421ec56735ad._comment | 14 + .../Recreating_remote_repository__39__s_annex.mdwn | 34 + ...ent_1_9fffb1329a4a06111cf2afd8552aea62._comment | 8 + ...ent_2_b7f5634e136294ea1a3d4ce6de58fc5d._comment | 12 + ...te_repositories_have_to_be_setup_encrypted.mdwn | 28 + ...ent_1_95f73315657bc35a8d3ff9b4ba207af0._comment | 8 + ...remote_cannot_be_reactivated_by_the_webapp.mdwn | 30 + doc/bugs/Repository_Information_Is_Lost.mdwn | 33 + ...ent_1_bae0ed4c0a6baf1675f8de1663042f43._comment | 8 + ...lve_.local_adresses_using_avahi_or_bonjour.mdwn | 16 + ...ent_1_71cfedf4328eab224c7fb797c420ad0a._comment | 8 + doc/bugs/Resource_exhausted.mdwn | 45 + ...nt_10_bccf9528ffe963154c92ce49762e7ea6._comment | 10 + ...nt_11_24ad3a76a25a787ac59e2c5270709e72._comment | 12 + ...nt_12_1943ff77f3bccf885229ecc10c82399d._comment | 12 + ...nt_13_c3cac0717232e04e89df62efa1db0870._comment | 8 + ...ent_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment | 9 + ...ent_2_cdba2015e603f3c21f3e1697dd6fafcd._comment | 18 + ...ent_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment | 39 + ...ent_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment | 10 + ...ent_5_f55d933bce77fd2185ebd0cc46fe57ec._comment | 64 + ...ent_6_26c98fca45b029a527f9684873db4be5._comment | 18 + ...ent_7_8bab413b472f900e04977db2bc3951b6._comment | 8 + ...ent_8_e9bec0b80179b1229b6af0979a21c727._comment | 9 + ...ent_9_419e24e0b91f569294ece28c42daa246._comment | 15 + ...le_version_in_direct_mode___40__VFAT__41__.mdwn | 27 + ...ent_1_7e512732f1d24300dd13bb093f28122d._comment | 9 + ...ent_2_0ede40e0d68bfb9c6dbc1777f944ed06._comment | 18 + ...ent_3_4ce1601f5dbd8fb769d3c5bb429c3bc5._comment | 8 + ...nc_remote_created_via_webapp_remains_empty.mdwn | 138 + ...ent_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment | 12 + ...with_capital_letters_breaks_authentication.mdwn | 32 + doc/bugs/S3_memory_leaks.mdwn | 15 + ...ent_1_a7268213b090bce6b1f1858a8e23d90e._comment | 14 + ...ent_2_320a8e3bb7b207d1aff8926b9247f5ba._comment | 8 + doc/bugs/S3_upload_not_using_multipart.mdwn | 54 + ...ent_1_5bed9faafc43b535f7820749510aaa14._comment | 10 + ...ent_2_d82952cf324e769e45f4d90f200210f4._comment | 17 + doc/bugs/SanityCheckerStartup_crashed.mdwn | 28 + ...ent_1_f30b69c11b487334ef02ce7bfcdeb36c._comment | 8 + ...ent_2_8b800bf7b54e487e82d0897c87967f22._comment | 8 + ...d_certificates_with_jabber_fail_miserably..mdwn | 26 + ...ent_1_13d27ba41d9ef78c8db534b6bc26314e._comment | 12 + ...ent_2_018eed99e71680be9e7c0844020419bb._comment | 8 + ...ent_3_1e7578dd1321f399b12197056495b0b6._comment | 8 + ...ent_4_a1948b7cd6ea990c8f1be5e483c835fa._comment | 14 + ...ent_5_293b333134c97dc666a825cc7a8b2b62._comment | 12 + doc/bugs/Share_with_friends_crash_in_osx.mdwn | 370 ++ ...nt_10_8d90e23514d9f14283857c57017a5fcf._comment | 8 + ...nt_11_1a0e174969e99e7b562854d2c3b3e606._comment | 19 + ...nt_12_dfde39222a91923c570e5405d9e527f4._comment | 8 + ...nt_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment | 12 + ...ent_1_804c394e97223b1f9cc9f1f3adaa2e74._comment | 14 + ...ent_2_f1fe0c05724236988e77f4b7f393e7d5._comment | 12 + ...ent_3_3d9ec79231e1b340b5e8b7b63a902546._comment | 9 + ...ent_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment | 19 + ...ent_5_a024902e300cf50e8f6a63c7feef63a1._comment | 10 + ...ent_6_baf0333f307dff0f79cd7c73b4c56c18._comment | 356 ++ ...ent_7_849759a5c92de57733b14adce2f49c14._comment | 10 + ...ent_8_01530dd4ddbf620435a4d8f1edeaee8e._comment | 17 + ...ent_9_6ef922e1ebb72db8ebbff4a76017e535._comment | 19 + ...in_when_network_fails___40__esp._DNS__41__.mdwn | 50 + ...ent_1_dd792bd98a48554a65150c06401ed3e5._comment | 12 + doc/bugs/Small_archive_behaving_like_archive.mdwn | 33 + ...ent_1_718dc246cbbbeae04436fa033011ab12._comment | 13 + doc/bugs/Stress_test.mdwn | 45 + ...nt_10_1694e990eab6592159309c231c6dcc16._comment | 12 + ...nt_11_ab4cb6eefd279e6c1f229e089f703581._comment | 25 + ...ent_1_c4c764488ac082f5c48d3a6b4b5fba42._comment | 17 + ...ent_2_42125bba09a0ea9821cda7183e458100._comment | 47 + ...ent_3_8240e61106b494d3600ad91f16eb5b1c._comment | 20 + ...ent_4_c38d84e0dcc834931804c44bce7f7b7a._comment | 11 + ...ent_5_60ce20ee255451c4ea809ba475561adb._comment | 15 + ...ent_6_1371562e201393986cd41597f6f288cb._comment | 14 + ...ent_7_a14be7699da224a8f6c9b34f1b911219._comment | 8 + ...ent_8_a01995bdca7ade7dde9842b53fbc4e0c._comment | 57 + ...ent_9_9f7efe81b7e40aaa04a865394c53e20f._comment | 52 + ...ry_to_outside_git_repository_not_supported.mdwn | 27 + ...ent_1_06ac38f32039ad43b0c2623c8fdb1df6._comment | 8 + ...ent_2_91a8daa3d49799d0784c9fe3ee10558a._comment | 10 + ...ent_3_166ae413b7c41f00f13292855ac66974._comment | 8 + ...broken_in_recent_versions_of_the_assistant.mdwn | 134 + ...ent_1_8100505a7ac74646e0767d03fe643a45._comment | 8 + ...ent_2_9833e8f77c6148db9572316066a67eee._comment | 8 + ...ent_3_1504f8767f1f4415222d8c315c734e81._comment | 9 + ...h___34__conflictor_directory_missing__34__.mdwn | 1175 +++++ ...ent_1_dfb520258fdd633285b44cb16fd35612._comment | 12 + ...ent_2_7908bf367652d2485ec703ae8958891b._comment | 8 + ...ent_3_30684a993b667b2594890f734638e91b._comment | 142 + ...ent_4_30e847ff438eda036c57cc740b638d8a._comment | 12 + ...ent_5_04232cf2097676057cddf841ad47f44c._comment | 86 + ...ent_6_9cb32f198eee25b7175cc9ad1795acb3._comment | 8 + ...ent_7_f8a70156d56c4be6cfbadb50e8a08285._comment | 174 + ...ent_8_02699dbf30270db090b00192850831db._comment | 10 + ...t_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn | 23 + ...nner_crashed:_fd:59:_hGetLine:_end_of_file.mdwn | 50 + ...ent_1_a1392b92efdff82783a4b0cc2c3c7f2f._comment | 14 + ...ent_2_5e153b7c59c474988fe551a505e545bc._comment | 8 + .../Transfers_continue_after_daemon_stopped.mdwn | 5 + ...ent_1_39eb527d64367e6762281246f1d49b1f._comment | 12 + ...o_upload_to_remote_although_remote_is_dead.mdwn | 51 + ...ent_1_108b3984891f82429430b503cddfb3c1._comment | 10 + ...ent_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment | 8 + ...ent_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment | 10 + doc/bugs/Truncated_file_transferred_via_S3.mdwn | 614 +++ ...ent_1_5962358e6067448f633cc0eaf42f9ca7._comment | 10 + ...ent_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment | 19 + ...ent_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment | 8 + ...ent_4_3c5fe109f2196cfc196c30da3b62bafd._comment | 10 + ...ent_5_f86f83c89300f255e730ddd23f876f61._comment | 16 + ...ent_6_6aa9261c0cdb02c6dd66d25f5c71f622._comment | 8 + ...files_on_Android_due_to_weird_rename_error.mdwn | 37 + ...ent_1_928289956111d1b22f9d55f15b54f72f._comment | 10 + ...ent_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment | 8 + .../Unicode_file_names_ignored_on_Windows.mdwn | 41 + ...ent_1_3dfa4559dceec50c08ba180f41b4c220._comment | 14 + ...ent_2_4dafea4367d455c2e63b0f7b1cc39559._comment | 10 + ...ent_3_bdde68a990a330ee0cf626be44b1c132._comment | 8 + ...ent_4_9140fb8034b1449ee2f4762093bc1f89._comment | 10 + ...ent_5_661ca15b68bc0e3fbe85f11400570446._comment | 15 + ...ent_6_0e8820169c0300d296c697154fd05dc4._comment | 8 + ...ent_7_b23a2bf106053f105798b270536057e5._comment | 38 + ...ent_8_7f23911705eaa58a9230f19ab890e87f._comment | 12 + doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn | 32 + doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn | 22 + ...nt_10_8c1487635f724d017ebe2f8b7bc10e8d._comment | 8 + ...ent_1_84e52a4d1502fd622bdb25e04b459292._comment | 13 + ...ent_2_f2b109f6cf92f101d7f0afeb91605240._comment | 24 + ...ent_3_df9b111aefea82b9d108495b79d7ffb4._comment | 24 + ...ent_4_e3b5bc815376383bbd1f312cc1c32a41._comment | 12 + ...ent_5_cd9b77e6670840a9902f5be80e1e658a._comment | 87 + ...ent_6_4584393333d377532d8607b42319abd9._comment | 8 + ...ent_7_d9d36ff62267dde98a27c5981951df7f._comment | 10 + ...ent_8_5b26711c737eeb0b302060f098cb320b._comment | 8 + ...ent_9_1bf050056dcac7c1e0f497ee6e87a95a._comment | 10 + ..._crazy_limit_on_max_filenames_in_directory.mdwn | 2 + ..._on___47__storage__47__sdcard1_-_bug__63__.mdwn | 45 + ...ent_1_71b052be40fbdaca09ca3ede8c59ac7a._comment | 8 + ...ent_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment | 20 + ...ent_3_1a7542249b9c37507126e97441057c12._comment | 12 + .../Webapp_fails_to_resolve_ipv6_hostname.mdwn | 15 + doc/bugs/Weird_directories_appearing.mdwn | 82 + ...ent_1_989541faf18e476c06e3be94c979e588._comment | 10 + ...ent_2_7aedaa3286a827303d90bd660429f0e7._comment | 43 + ...ent_3_5d3afa17d1e038c66a2cb6400b74aa41._comment | 8 + ...ent_4_8db476bc89d3b9b1fdd82624829b4975._comment | 8 + ...ent_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment | 10 + ...ent_6_1c3218c8858397acc0e9fd718d7fd973._comment | 8 + ...ent_7_9d055063f58042ff048c5b71e9e67f6e._comment | 8 + ...ent_8_b39be0251e96099142b659f3c8340293._comment | 8 + ...ent_9_431c62c81573468ccf99eeed6ecc2bfd._comment | 8 + doc/bugs/Windows_build_test_failures.mdwn | 1232 +++++ ...ent_1_ea7523fdbafdc8be2971df52d9038826._comment | 10 + doc/bugs/Windows_daemon_silently_dies.mdwn | 132 + ...ent_1_b590aaeedec78c8540d549a8c773881e._comment | 10 + ...ent_2_472975d2bd9784ae40b35f11fc561231._comment | 72 + ...ent_3_48415a7251abffca998b8dccc5e0ba80._comment | 22 + ...ent_4_1c0b0b2e7180425ff2d5e5316a138f7d._comment | 10 + ...ent_5_0d14dd2c8d94a81ffd5aae07e927344f._comment | 40 + ...ent_6_20a420680058f84a8cbd43682957fe7b._comment | 8 + ...ent_7_1514739ba9885917d03597dcc6aa7bec._comment | 20 + ...ent_8_0210436870e6622a83c9b4788e31eef4._comment | 8 + .../Windows_file_timestamp_timezone_madness.mdwn | 31 + ...ent_1_9db59ab2242186a23a47337a1597f4e2._comment | 12 + ...ent_2_a6a3871747306913b69abcd73d13305e._comment | 26 + ...ent_3_7fe149bedb8ceab75953996ac8e20f0f._comment | 20 + ...ent_4_c9e8c9997b7c3a82c14fc34af319382d._comment | 10 + ...ent_5_0739426403f5bf9954acbc86ca0d11ea._comment | 23 + ..._curl_and_wget__44___but_not_required_DLLs.mdwn | 17 + ...ent_1_a7bf0f027f2209e5632e292afd7214d0._comment | 10 + ..._drive_letters_cause_git_annex_get_to_fail.mdwn | 131 + ...ent_1_c87bae87b7902db60a3fef41e1fca85d._comment | 9 + ...ent_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment | 10 + ...ent_3_3a0787912f4a3a8797b7786f5ce38590._comment | 8 + ...ent_4_c4249f32d65594d79ea01145b93ec948._comment | 9 + ...ugh_remote_annexes_have_at_least_numcopies.mdwn | 39 + .../Wrong_port_while_configuring_ssh_remote.mdwn | 35 + ..._processes_and__47__or_stuck_git_processes.mdwn | 44 + ...ent_1_0f8b248025722309e9577d7dad74b76b._comment | 10 + ...ent_2_f5f7db688a2a93ee7453674fb742043b._comment | 52 + ...ent_3_ffcae976aa3dc2426188797c1aaffb82._comment | 10 + ...ent_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment | 49 + ...ent_5_406fdee0728680774a69d28446163f10._comment | 26 + ..._transferkey__187___fails_for_bare_remotes.mdwn | 21 + ...ent_1_dd4538ab19a7f8e0f49aa0156aeaae43._comment | 32 + ...ent_2_4276ff682d10c1d4be9728f9b649ebae._comment | 10 + ...enied___40__Permission_denied__41____187__.mdwn | 33 + ...34__Adding_4923_files__34___is_really_slow.mdwn | 102 + ...ent_2_5f3b9f00bc31ce71d695c008971ed7fd._comment | 16 + ...ent_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment | 16 + ...ent_3_6a735b7875d2a0c92df6786dd649985d._comment | 28 + ...ent_4_7e768908ba6983ea13af27635c4a947f._comment | 12 + doc/bugs/__34__fatal:_bad_config_file__34__.mdwn | 14 + ...t-annex:_direct:_1_failed__34___on_Windows.mdwn | 107 + ...39__git_add__39___for_parent_relative_path.mdwn | 15 + ...s_-_not_installed_automatically_on_xubuntu.mdwn | 26 + ...ent_1_f4656f8a0f36535def0772db06098c5f._comment | 13 + ...on_linux_accessed_from_a_windows_git-annex.mdwn | 27 + ...me_if_symlinks_are_fixed_in_the_background.mdwn | 51 + ...rce__96_____95__revives__95___repositories.mdwn | 88 + ...ent_1_930b40e0f68da95d335eea5bd4216126._comment | 12 + ...ent_2_5397d488bc337cb3d7cb46ed774d0437._comment | 90 + ...ent_3_1b30e7611ec824dc6e79ef35e43ac740._comment | 10 + ..._96__git_annex_import__96___clobbers_mtime.mdwn | 62 + ...ent_1_d173f2903faf4bff115a0be02c146ce9._comment | 8 + ...ent_2_3563d9eeb9806f8ca1b9b340925837f5._comment | 18 + ...ent_3_d5c7488db16b71c4f337662c897278ca._comment | 95 + ...ent_4_7235130786e764ec3ad5facfecde62da._comment | 8 + ..._39____fails_due_to_missing_stm_dependency.mdwn | 95 + ...ent_1_86e26ee9ec90aa00f25392052737f0f0._comment | 36 + ..._switch_repositories_on_android__in_webapp.mdwn | 21 + ...ent_1_d488d71a72eb54d7711d2a867db6172f._comment | 8 + ...ent_2_85b31db6d0fb2d20018db3d8c8258bf4._comment | 8 + ...ent_3_9ffafbeb572e110b3e072029d1ce177c._comment | 8 + doc/bugs/acl_not_honoured_in_rsync_remote.mdwn | 59 + ...ent_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment | 8 + ...ent_2_ffb9424e966ee10a4fe2d446b3042cb2._comment | 10 + ...es_makes___39__git_annex_unused__39___slow.mdwn | 87 + ...ent_1_d350c39c67031c500e3224e92c0029ea._comment | 19 + ...ent_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment | 20 + ...ent_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment | 30 + ...ent_4_a50b43c15d2650df90f0fa1ced47f532._comment | 10 + ...ent_5_7328bc51bd001f2b732a92a2ae175839._comment | 114 + ...ent_6_880ef2ee797221332dbb629b2d55522f._comment | 10 + ...ent_7_826fd82cdf9b1c79c9b555ca26c2c176._comment | 8 + doc/bugs/adding_a_remote_server_fails.mdwn | 27 + ...ent_1_cf7ea9171f002c5793a882b42d33a77d._comment | 10 + ...po_as_remote_in_webapp_may_reset_its_group.mdwn | 16 + ...__34___and_reports_fail__44___but_succeeds.mdwn | 197 + ...ent_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment | 20 + ...__galaxy_nexus_java.lang.SecurityException.mdwn | 41 + doc/bugs/android_4.3_install_failed_.mdwn | 20 + ...ent_1_82447f1e24d7e8df8048464d1b7df117._comment | 8 + ...ent_2_67ace7c454c7e962ca69e42178142e80._comment | 8 + ...ent_3_051e39129a38e439f24703385f503cf4._comment | 8 + doc/bugs/android_autobuild_broken.mdwn | 4 + ...x_unannex__47__uninit_should_handle_copies.mdwn | 20 + ...ent_1_c896ff6589f62178b60e606771e4f2bf._comment | 10 + ...ent_2_9249609f83f8e9c7521cd2f007c1a39e._comment | 8 + ..._loading_shared_libraries:_libselinux.so.1.mdwn | 31 + ...ent_1_ccc2c90d05862edda9ce1ac92efab516._comment | 44 + ...ent_2_1cdf6de88c7f121c604177593915e626._comment | 8 + ...-upload-pack_and_-receive-pack_not_shimmed.mdwn | 23 + ...ent_1_403f1058c3eab5c95fefab5a96aa3f51._comment | 12 + doc/bugs/assistant_-_GTalk_collision.mdwn | 17 + ...ent_1_ab2c1f36113d40f27e1893d32f214296._comment | 12 + ...ent_2_91dff34c629a3b3a97a2313ff077e4ae._comment | 14 + ...ent_3_fefb73f6e570f96b4d82779d6622f690._comment | 8 + ...when_adding_encrypted_usbdrive_repo_on_mac.mdwn | 53 + ...ent_1_4ea192e57f86a33087997746722e6acf._comment | 10 + ...ent_2_622ad5b34780fc8468c5c515ad9f27fa._comment | 8 + ...t_creating_.git_directory_inside_bare_repo.mdwn | 90 + ...ent_1_675210444f7801eb8c2c455a5accf8e9._comment | 12 + ...ent_2_d7f1378bc75e7a8be9da2585acc6fd63._comment | 8 + ...ant_does_not_allow_adding_an_existing_repo.mdwn | 10 + ...ent_1_87e84d56d56abefe8cac8a52b76c9003._comment | 8 + ...use_repo_cost_info_when_queueing_downloads.mdwn | 18 + ...istant_doesn__39__t_sync_empty_directories.mdwn | 32 + ...ent_1_78a3bde607f43c0f518bd2d3d7196022._comment | 8 + ...ent_2_83777384b72732b1d0a19b32686d3d1f._comment | 8 + ...ent_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment | 9 + ...ent_4_014d213a959dd7993bdd247722a8817e._comment | 8 + ...ent_5_440f349781d7d9ca2d1ed81386f7dd26._comment | 8 + ...sistant_doesn__39__t_sync_file_permissions.mdwn | 47 + ...ent_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment | 10 + ...ent_2_1a364c422e0dd7418f74e1cc3d543a3c._comment | 8 + ...ent_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment | 8 + ...ent_4_ec7b491ad3c9a1f253d886682bff8b82._comment | 11 + ...ent_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment | 10 + ...ent_6_13db3474113b157b7431eb1c835e5814._comment | 14 + doc/bugs/assistant_eats_all_CPU.mdwn | 529 ++ ...nt_10_4a9f149048e387e0a8b4ebb0838decfd._comment | 8 + ...nt_11_98be30621a8a435ed54662f7ea9654b4._comment | 10 + ...nt_12_a7d7141b81e73a989eb5c1233bcd1478._comment | 15 + ...nt_13_60f95e6e5d52f03727bd41f8419c9384._comment | 10 + ...nt_14_a6d039ba95f92d9d0c3a343165ba7991._comment | 36 + ...nt_15_b7f9a8e214eefc3a6976065782157e81._comment | 28 + ...nt_16_16382708d1683a7a9eaaf953f3cdb735._comment | 8 + ...nt_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment | 8 + ...nt_18_970899faca972af6795ae0d3be1ce444._comment | 42 + ...nt_19_2b8241800ae265260506ac9c73cca209._comment | 56 + ...ent_1_847ff393fe3a0227d61440f6be899907._comment | 10 + ...nt_20_1d9020679d66e6b4742df067cb9da4f1._comment | 9 + ...nt_21_8ce65a701604b9d13941844c62f62f23._comment | 14 + ...nt_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment | 12 + ...nt_23_48a4c8d9dcc6cec243c6072090f26b6d._comment | 12 + ...ent_2_0d577d5ca22df14dadf21d4a1a5f9474._comment | 12 + ...ent_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment | 8 + ...ent_4_ce85b4715a2f7315b68bed62e26d4f0e._comment | 8 + ...ent_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment | 26 + ...ent_6_a7c9f3262b6eca6258ba53324d321a7a._comment | 17 + ...ent_7_340414e9c19903b16ab617d075fbb94e._comment | 10 + ...ent_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment | 19 + ...ent_9_1c129c924ef3a4a594de6580cf4224c7._comment | 11 + ..._expensive_scan_unnecessarily_queues_files.mdwn | 65 + ...ent_1_bc874e077009b81ab36a6d43d793030a._comment | 10 + ...ent_2_a7e9d8ec500399dd6794e168f85e6a5c._comment | 40 + ...ent_3_a0824e00f04f95c39823f29d6c76e7fe._comment | 10 + doc/bugs/assistant_hangs_during_commit.mdwn | 27 + ...ent_1_aacc15c589d2795254387e427b3afe0c._comment | 8 + ...ent_2_b9f1bf9fa919603dca28182c80d39a11._comment | 10 + ...ent_3_fb5be10fcf5e7c89da5c34f48539612f._comment | 12 + ...ent_4_9ba7efe9112578729d02ac4e6557b3cc._comment | 10 + ...ent_5_73b24c901c73d41e0e0abe91267d4920._comment | 16 + ...ent_6_1a30b8c82e58222f1366aa368c23e6d3._comment | 10 + ...ent_7_56868b2a504ad0a60e8a8c1928330175._comment | 8 + doc/bugs/assistant_ignore_.gitignore.mdwn | 31 + ...ent_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment | 8 + ...ent_2_22f75af80c779dcb4d6033b90373f74e._comment | 10 + ...ent_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment | 8 + doc/bugs/assistant_locked_my_files.mdwn | 30 + ...ent_1_74ee7ea12df7bfbb44c9d0485f787b73._comment | 8 + ...ticing_file_renames__44___not_fixing_files.mdwn | 68 + ...ent_1_e0dafc410ffd617d445bb9403c7bfafe._comment | 9 + ...ent_2_2af247c8a1fcbde10795a990ef3303e9._comment | 9 + ...s_for_remotes_using_the_standalone_tarball.mdwn | 21 + ...ith_remotes_even_when_all_remotes_disabled.mdwn | 33 + ...sistant_unable_to_auth___40__windows__41__.mdwn | 85 + ...ent_1_3128b025d15d3af6e9c8725d4659cdfa._comment | 12 + ...ent_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment | 8 + ..._using_the_incorrect_path_on_windows__63__.mdwn | 45 + ...ent_1_68be9ee77cc89fb72a4abc944f1da41d._comment | 8 + ...ent_2_6530d67e7d94ccbea9ce11ba1445035e._comment | 9 + ...ent_3_682556a8182abd5bd6abb57b519d4c76._comment | 10 + ...ent_4_331cdacb099a8c7b170c37715bbca895._comment | 8 + ...has_nothing_to_drop_or_copy_to_that_remote.mdwn | 5 + ...ent_1_10a9570a5d762ba2da271b38dc63edb6._comment | 12 + ...ent_2_57d50955b038c2e2405068536c7e83f3._comment | 8 + ...ent_3_a66f34daaba421c87eb404ef933e5191._comment | 10 + ...ent_4_094a3272eca1c6d2b4d264911ffe96e5._comment | 19 + ...ent_5_0161410d042a3421addd4a1fc7c1cd01._comment | 10 + ...viour_with_file_names_with_newline_in_them.mdwn | 5 + ...ent_1_92dfe6e9089c79eb64e2177fb135ef55._comment | 10 + doc/bugs/bad_merge_commit_deleting_all_files.mdwn | 78 + ...ent_1_3503644244e39c65d531807769365f50._comment | 10 + ...ent_2_9c4c950da0c07bf7c7edfcc7cc3b6011._comment | 8 + ...ent_3_be42de12faf15562265ad6cf8964f5db._comment | 18 + ...ent_4_d5cbd1440e4d6706eb14644a4ff1883b._comment | 8 + ...ent_6_c532859deb682dff9e59037d08f66a51._comment | 8 + ...ent_6_c946d2793fe0354151c447ddd0e59fd7._comment | 41 + ...ent_7_24dea380fcf470e0ea488dece0410f37._comment | 8 + doc/bugs/box.com_never_stops_syncing..mdwn | 74 + ...ent_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment | 10 + ...ent_2_42574181aa721319ba54eadf0a15ddff._comment | 11 + ...ent_3_2ad727849070cfd52d6c719478e9cce3._comment | 8 + ...ent_4_83ce23e45f5a5845d4f04519ee14ec65._comment | 9 + ...ent_5_ef1c9d87b04db5047ab72167d3269687._comment | 8 + ...ent_6_c9cb39eba941678035f9b2888da1085c._comment | 10 + ...ent_7_4b0632a4e37c96959a8e6434e9fd86fb._comment | 17 + ...ent_8_d9d318b8c958de6031ae323da20af625._comment | 55 + ...ent_9_689ac6a4a305197cf5566f98dab47b4b._comment | 8 + doc/bugs/broken_git_annex_map_on_direct_mode.mdwn | 58 + ...fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn | 57 + ...s_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn | 25 + ...h_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn | 43 + ...nect_jabber_with_custom_google_apps_domain.mdwn | 21 + ...ent_1_6537e928a0d6d5c41b55370f112f4afb._comment | 10 + doc/bugs/can__39__t_get.mdwn | 81 + ...ent_1_ef32287828481c161bd913c9db9052a5._comment | 27 + ...ent_2_31fe400f4bac516a5c1101612cb06a54._comment | 32 + ...ent_3_87d123c04815d38abb92f967829c3a23._comment | 16 + ...ent_4_b99cff87dbe38f08f888200dfe7e2436._comment | 14 + doc/bugs/cannot_link_executable_on_android.mdwn | 28 + doc/bugs/case-insensitive.mdwn | 20 + ...lid_argument___40__invalid_character__41__.mdwn | 228 + ...annex_processes_can_lead_to_locking_issues.mdwn | 53 + doc/bugs/configurable_path_to_git-annex-shell.mdwn | 7 + ...ent_1_fb6771f902b57f2b690e7cc46fdac47e._comment | 10 + ...ent_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment | 8 + ...ent_3_aea42acc039a82efc6bb3a8f173a632e._comment | 12 + ...ent_5_178452f3c2671830d1a9f5e1d11accb4._comment | 8 + ...ent_5_77b2269936f740cacbc955b95f9da51d._comment | 8 + doc/bugs/confirmed.mdwn | 5 + ...y_fails_for_some_fails_without_explanation.mdwn | 7 + ...nt_10_0c1a5837305b721fc4a529cae3f4c3fb._comment | 10 + ...nt_11_dabfec2d74fb847f3b40093a2866045b._comment | 8 + ...ent_1_e456604b26ed9c72b0a88cfb57f1a475._comment | 12 + ...ent_2_4823d66bfb569605868af5cefe0d94dc._comment | 12 + ...ent_3_46305aa2d43da000c1a7cb003c822572._comment | 18 + ...ent_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment | 8 + ...ent_5_1e0c06a07345d85b3712339e6f0d9a9f._comment | 8 + ...ent_6_41798e92068eb227c5e75cae2edef68a._comment | 10 + ...ent_7_1f33d694a08d8dcbf04595e3442b8cd5._comment | 8 + ...ent_8_884f31ce917c8e5ce9a32a55da9b42d6._comment | 10 + ...ent_9_ab770dafee3bd9212f553db222adbfe6._comment | 10 + ...st_should_not_mention_every_file_it_checks.mdwn | 28 + ...ent_1_5f51452d939d61496e97805310746ea3._comment | 14 + ...ent_2_2cd3e9561c4442259c765743b423a7df._comment | 8 + doc/bugs/copy_unused_and_unused_not_agreeing.mdwn | 50 + ...ent_1_a11a45868867361fcff61471ffe0ce39._comment | 10 + ...ent_2_15559ba19393f5c061f77bc56379f8e1._comment | 12 + ...ent_3_9b1340e0f6a107695849c04374aaeae2._comment | 10 + ...ent_4_b88530080fd90686cfa7e336f8328dcb._comment | 8 + ...ent_5_792ab128a91c66e4ddeaa69d09430a78._comment | 20 + ...ent_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment | 8 + ...ent_7_635acd64b524c682c58f26ae96ae0d7d._comment | 10 + ...ent_8_1aaeb808e20c67f89eaac5e45d9309f0._comment | 15 + ...ent_9_6abca5f4927e09089cdc5f0bd27b798f._comment | 26 + ...ectory_where_a_mountpoint_should_have_been.mdwn | 29 + ...ent_1_41cfd5e48426a6ef52bef70a06a6f46a._comment | 11 + ...ent_2_bd584ccbe128427fca99e61d66d301c9._comment | 18 + ...ent_3_5bb0347215b321444643646f25a35759._comment | 10 + ...ent_4_73848a9c783ecf3d9fccdd41b20fbe36._comment | 56 + ...ent_5_64bf56f2b0ff206c3caf5cadebfd0cda._comment | 20 + doc/bugs/creating_a_remote_server_repository.mdwn | 24 + ...ent_1_de1a370347428245bcfca60eaca96779._comment | 10 + ...ent_2_482ac9b0f881099910f9bd9f7cda184d._comment | 8 + ...ent_3_b7c7f684d0eef14fcc00cb2ac0566703._comment | 10 + .../creds_directory_not_automatically_created.mdwn | 3 + .../direct_mode_assistant_in_subdir_confusion.mdwn | 37 + ...ent_1_351143deec29e712f8718a373ad650d7._comment | 8 + ..._fails__44___left_in_an_inconsistent_state.mdwn | 60 + ...ent_1_be1302a006a66e501fe543f3af191fea._comment | 22 + ...an_overwrite_local__44___non-annexed_files.mdwn | 14 + doc/bugs/direct_mode_merge_interrupt.mdwn | 54 + ...uld_refuse_to_merge_with_illegal_filenames.mdwn | 38 + ...on_FAT32_fails_to_addurl_containing___63__.mdwn | 44 + doc/bugs/done.mdwn | 4 + .../dropping_files_with_a_URL_backend_fails.mdwn | 13 + doc/bugs/encfs_accused_of_being_crippled.mdwn | 41 + ...ent_1_5c5be012e1171ef108f38825d72791b6._comment | 23 + doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn | 42 + ...ent_1_46c37aacb7ae41864488fb7c7d87d437._comment | 10 + doc/bugs/endless_loop_when_PWD_gone.mdwn | 16 + ...ent_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment | 8 + doc/bugs/enormous_fsck_output_OOM.mdwn | 30 + ...ent_1_490b8bfe95b01a23408ecb5d63dcd40b._comment | 10 + ...ent_2_2666c135dd3378cf6301aa4957049fbd._comment | 10 + ...ent_3_dfb169c441215b671f8c971184de3e16._comment | 10 + ...ent_4_19ef90803aa7ce158bce02378e18ea0f._comment | 30 + ...ent_5_2b5406768fff2834f7aefa76ef949de2._comment | 12 + ...ent_6_0997f1a94c2fda9fe69824e074011518._comment | 18 + ...ent_7_2cdc79f1e0f72693814e91dc88a758e1._comment | 10 + ...ent_8_b9aab0aba4dab30260371b4762e0e51d._comment | 8 + ...ent_9_8de694dff75e27856c8282d1f2d120b6._comment | 14 + ...ling_network-info_when_compiling_git-annex.mdwn | 12 + ...ent_1_1b5d236567123300924427624e0e48c8._comment | 53 + ...ent_2_4e5ffd0d5b965b9429b937610b7998d5._comment | 8 + .../error_on_only_repository_copy_deletion.mdwn | 16 + ...ent_1_af394ac0956ab33a77256bcb02ef2a0f._comment | 14 + ...xtraneous_shell_escaping_for_rsync_remotes.mdwn | 15 + doc/bugs/failed_sync_with_direct_mode_repo.mdwn | 9 + ...ent_1_fb4026cc81eb0ec1e656e4a81ffacc4f._comment | 13 + ...s_to_get_content_from_bare_repo_on_windows.mdwn | 143 + ...ent_1_31cf32ef2d597573ed3c5f06a1b40a1c._comment | 10 + ...ent_2_7d64382c66555ec9c5531840aa19e809._comment | 10 + ...ent_3_850a917a3d1ae50ba8f0e81a64168268._comment | 10 + ...ent_4_7c4660ea44178cba7f7a4cc5f1bebae4._comment | 8 + ...e_during_ssh_key_setup___40__windows__41__.mdwn | 12 + ...34__should__34___exist_in_remote_is_silent.mdwn | 37 + ...ent_1_c686df2824d3f588c0bfb339c99168b7._comment | 29 + ...ent_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment | 14 + ...ent_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment | 17 + ...ent_4_7d642fc65040a7b583cdece33db01826._comment | 8 + ...ent_5_49be366b6af6db595fa538373a61e650._comment | 10 + .../failure_to_return_to_indirect_mode_on_usb.mdwn | 19 + ...ent_1_d7822b90c68bf845572b0a04a378d0bb._comment | 10 + doc/bugs/fat_support.mdwn | 13 + ...ent_1_04bcc4795d431e8cb32293aab29bbfe2._comment | 12 + ...ent_2_bb4a97ebadb5c53809fc78431eabd7c8._comment | 14 + ...ent_3_df3b943bc1081a8f3f7434ae0c8e061e._comment | 11 + ...ent_4_90a8a15bedd94480945a374f9d706b86._comment | 10 + ...ent_5_64bbf89de0836673224b83fdefa0407b._comment | 8 + ...ent_6_a3b6000330c9c376611c228d746a1d55._comment | 8 + ...ent_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment | 7 + ...ent_8_acc947643a635eb10a1bff92083a3506._comment | 10 + ...atal:_git-write-tree:_error_building_trees.mdwn | 103 + ...ent_2_77295c0b749e984a6fb200d3b73b5765._comment | 8 + ...39__:_Invalid_argument___40__Windows__41__.mdwn | 63 + ...ent_1_e6f39b2ef55b0daa491f4b6329a906bc._comment | 8 + ...ent_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment | 48 + ...ent_4_b533b1de535a057b7ebf99afc92691ed._comment | 13 + doc/bugs/files_lost_during_upgrade.mdwn | 2191 +++++++++ ...ent_1_3f779c4d0c9fb27532b2981bd3ad4eee._comment | 22 + ...ent_2_80ba8c217e83c9d44a9dc52f4028719d._comment | 11 + doc/bugs/follows_symlinks_to_outside_annex.mdwn | 3 + ...ent_1_f7a01bb627a6780d6940886401cde454._comment | 10 + ...ent_2_fcbeffab5a0146062a9c945dfff48507._comment | 8 + doc/bugs/forget_corrupts_non-ascii_chars.mdwn | 78 + ...ent_1_fc8a4a93be2c234567836a4acee90957._comment | 22 + ...ent_2_31f9362619dee0b8ebae80694ae1b2d0._comment | 8 + ...ent_3_6310ae21036582688881f1890a5c4643._comment | 8 + doc/bugs/forwarded.mdwn | 2 + .../fsck_giving_false_checking_information.mdwn | 29 + ...ent_1_1000603ea6b8a19eb09e6754789ad528._comment | 10 + ...ent_2_3ce7c8f7098f0bf86ed409a3a095c152._comment | 14 + ...ent_3_be4d0fec56c29cf978ef7d1715eaa516._comment | 14 + ...annex-shell:_gcryptsetup_permission_denied.mdwn | 48 + ...ent_1_f4584158b35b80ece1060308883e2dc4._comment | 8 + ...ent_2_a4d7aae848340771a9b8e2c87abeea42._comment | 26 + ...ent_3_06bda101ad584b4b882de8b2e202d679._comment | 8 + ...ent_4_4fc6b25401b645cabc04b510bdfa6863._comment | 10 + ...ent_5_4e193306801680bba433e75eb4dcba05._comment | 12 + ...ent_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment | 10 + ...ent_7_cd964d0a375c5cba299bf2bbbbb86acb._comment | 12 + ...ent_8_9bac87c85deb5bb15795df28533d0cde._comment | 10 + ...p_doesn__39__t_seem_to_use_the_bundled_git.mdwn | 50 + ...ent_1_73924adc1c3c0dca5adce9a5e1740e48._comment | 10 + ...ent_2_81c2896c9dfe5d96ad5a8f40cb312790._comment | 10 + ..._resource_vanished___40__Broken_pipe__41__.mdwn | 18 + ...ent_1_e962317a939bf76097ae1a3b53b146e6._comment | 14 + ...ent_2_b32472b4c9b61e7a33dca802ecafb05b._comment | 11 + ...ent_3_fcfea3216831df9afbd855fbd842c27e._comment | 20 + ...ent_4_30d0b40efa59eeecb8a4be6d1baa1520._comment | 10 + ...ent_5_4af107f3184bc2abd2c9693167018628._comment | 8 + ...ent_6_f96027f1e3c405809fae42ce8533c6d1._comment | 8 + ...ent_7_b6fe89deb468a7e4f63f7faab147e3fb._comment | 12 + ...ent_8_ebec5d9266604f03959dc16d933ff4a4._comment | 13 + ...denied___40__Operation_not_permitted__41__.mdwn | 33 + ...ent_1_b7a327b668e2ca053713bec1dc4e6314._comment | 14 + ...ent_2_8864149bd87f7956143109ab591afe4f._comment | 19 + ...ent_3_1229d5ea8799f0a744b3f03f620df1ec._comment | 12 + ...ent_4_975d2631faa17d257a6fce40e24a6e3b._comment | 14 + ...ent_5_013be36151fc710ec30756b0f68f43dc._comment | 12 + .../git-annex:_fd:14:_hGetLine:_end_of_file.mdwn | 51 + ...ent_1_36756f5d9d591cc52113c5cc0c1eae91._comment | 8 + ...UserEntryForID:_failed___40__Success__41__.mdwn | 13 + ...ent_1_11a1615962325327466895d03e3d2379._comment | 8 + ...ent_2_eac51c3299e9fc04025675360969d537._comment | 8 + ...ent_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment | 9 + ...ent_4_0e8b28de5c173bc60ecc0126fb2209ca._comment | 10 + doc/bugs/git-annex_annex_repo_not_found.mdwn | 23 + doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn | 34 + ...ent_1_67cdbedc70695d1e4be81e59ab9b87bd._comment | 9 + ...ent_2_3a8041ce622b9288261fab57ecb87c28._comment | 8 + ...ent_3_2597b2008557b80f4b71630c5c4a4241._comment | 8 + ...ent_4_5dc46103994f064f5b9e120a16317dbd._comment | 10 + ...ent_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment | 14 + ...ent_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment | 8 + ...ent_7_85e8a286d6b1ec5212614c36bf54addb._comment | 10 + ...ent_8_2b2152844612d83f295a5de02f6ed3e7._comment | 8 + ..._branch_shows_commit_with_looong_commitlog.mdwn | 74 + ...ent_1_b83888a98075125dd043f323c99da03b._comment | 25 + ...ent_2_4a7d824b6e75693cf47f6efbf2c99e2e._comment | 10 + doc/bugs/git-annex_broken_on_Android_4.3.mdwn | 7 + ...nt_10_e47c073f1614f7b57f86acedeeb1cadc._comment | 8 + ...nt_11_ce34578c45060b7c8b759efd1c1d8df8._comment | 13 + ...nt_12_75965395dc33046ce34ac5ba972b7d64._comment | 8 + ...nt_13_f07bc76dd3c5580fc0855a33ae835c8d._comment | 12 + ...nt_14_637c59becc68a1e4f60069d8873489ff._comment | 8 + ...nt_15_d80b87055f72873f5678a01d2630bea4._comment | 10 + ...nt_16_57ac84868b223b30f005704eefa01b8d._comment | 8 + ...nt_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment | 8 + ...nt_18_7d36637f11cda51de395303d5c1c6a3f._comment | 8 + ...nt_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment | 8 + ...ent_1_0ffb3833ce2c2e0320468dc9a09866d7._comment | 10 + ...nt_20_0886bca6d0c6a9415a7794d256be2e9d._comment | 14 + ...nt_21_2b39729f95c9c4bba620ecdd3d1558ed._comment | 8 + ...nt_22_8d90d92951919aa70638b31e9248bec5._comment | 16 + ...nt_23_6398271f5cd9e94996202ef3bce6f6ed._comment | 20 + ...nt_24_c9e399833cc6235077161f490dfa866f._comment | 8 + ...nt_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment | 9 + ...nt_26_c122ce53175fc9e0e114a8acd2385c0d._comment | 29 + ...nt_27_237e41e61781bb058f5fd39362a904e4._comment | 10 + ...nt_28_97f423a41ee9d2d74291594fae20dd4e._comment | 10 + ...nt_29_7b3fbe7e38f637fcea511441ac243d93._comment | 10 + ...ent_2_53e2d095b2501844cadec910de286814._comment | 14 + ...nt_30_26c04584c3c6dacf59e1b6c82042c97c._comment | 8 + ...ent_3_ddc9cbae1a721400a9acf2153e18f4f0._comment | 8 + ...ent_4_593235735e32238094121b1f79355bbd._comment | 8 + ...ent_5_f806fd5930e90920db24456297465bae._comment | 9 + ...ent_6_5741b6a5997328fdcd5cc99f841b18d3._comment | 8 + ...ent_7_3e0d9949dd810069af0b8076807e5924._comment | 8 + ...ent_8_f58897eff6b4693f0c73474ccfe6e733._comment | 8 + ...ent_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment | 18 + ..._rsync_transfer_is_interrupted_and_resumed.mdwn | 47 + ...ent_1_0fc5c7251ead7a0fbbcd357a8bc53f05._comment | 18 + ...ent_2_992c1a51d0300bd676cb431688efa524._comment | 13 + ...ent_3_3001a11839eff6a4c3a9f12096b29704._comment | 8 + ...ent_4_a13abb45b9a94d275177641db0538765._comment | 10 + ...ent_5_faac2d48950307ce245f0da501ace730._comment | 9 + ...ent_6_7df03eee7d5dc5a7ed0c9abef5053788._comment | 17 + ...ot_install_on_windows_without_admin_rights.mdwn | 24 + ...ent_1_2533800ab5a95c5d71c3b47a630e751a._comment | 10 + ...ent_2_5b71785acf16a8d9ea457726599daef3._comment | 8 + ...ent_3_63e4ff79bc683a70dd9a85c66e26e56a._comment | 8 + ...ls_to_initialize_under_Windows_with_cygwin.mdwn | 40 + ...ent_1_24d626923403b097f57bc3d3a8c5befa._comment | 10 + ...ent_2_32a74f078f45ee069a7d386734e379e2._comment | 8 + ..._when_nautilus_script_directory_is_missing.mdwn | 49 + ...e_allows_bad_settings_with_standard_groups.mdwn | 25 + ...ent_1_b3090201e90a78e049cf299fc322d60e._comment | 12 + ..._most_of_my_files___36____35____38____33__.mdwn | 58 + ...ent_1_5dd4d1cec069c13184f5dd9efca6721b._comment | 8 + ...ent_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment | 14 + ...ent_3_1027187b203addd65af8cf1faf28727d._comment | 10 + ...ent_4_ac65028203ff0cbdb978200235fb4e9c._comment | 10 + doc/bugs/git-annex_merge_stalls.mdwn | 18 + ...ent_1_31578a754945bdcb902c62ff58704bcb._comment | 17 + ...ent_2_f3b6bf180466b5931bfd20b2f0229422._comment | 10 + ...ent_3_ced9b0d724fb55c756106b64c3721003._comment | 18 + doc/bugs/git-annex_opens_too_many_files.mdwn | 42 + ...ent_1_37f6f5838c41c533df4be1f927b9b03d._comment | 26 + ...ent_2_347ef233b9845b84d7c4d49ed166e797._comment | 10 + ...ent_3_d5f644d97cd2db471deb5dcd728cae60._comment | 8 + ...ent_4_c03bde64be8fdd962826bc7afa07d2a9._comment | 137 + ...ent_5_33a2e783e5355e981497b9861997570b._comment | 18 + ...ent_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment | 15 + ...ent_7_d73454c9ab3729989e4bc3f2223ccde9._comment | 8 + doc/bugs/git-annex_remotedeamon.mdwn | 27 + ...ent_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment | 12 + ...ent_2_82f71852df61d12333d08ba25af9d7be._comment | 10 + ...sucking_up_all_available_RAM_after_startup.mdwn | 49 + ...ent_1_b550f292359b44977481bf69abad4012._comment | 14 + ...ent_2_76e6c1d4db27bcc1767ba34e13e8211c._comment | 8 + ...ent_3_14007c8e927b75c5706e80cc4242fae4._comment | 8 + ...ent_4_f3266b74517b421e5310e67818fe3969._comment | 12 + ...ent_5_1a07f15eb0353768c1e67a1e47e2e494._comment | 9 + ...ent_6_7d0d49fd165af5e30606982e05335d34._comment | 10 + doc/bugs/git-annex_sync_does_not_push.mdwn | 52 + ...ent_1_8b9b53163b012563b3e80f8eded76aaa._comment | 10 + ..._when_the_directory_I__39__m_in_disepeared.mdwn | 15 + doc/bugs/git-annex_webapp_command_not_found.mdwn | 25 + ...ent_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment | 10 + ...ent_2_d25232bb5eaff725281869d7681e81ad._comment | 8 + ...ent_3_f593752a0c5c60daaacca46ced5ac5d8._comment | 12 + ...ent_4_e4ef964274e74cb4a39dc8ecac8ceade._comment | 12 + ...3___mmap_failed:_No_such_file_or_directory.mdwn | 43 + ...ent_1_984f75d8078f2809486f38ecb3b16be3._comment | 10 + ...ent_2_c0f07e2d4bb142389629050479dd1465._comment | 10 + ...ent_3_7a58a884aaacedca9697b17cd5248214._comment | 33 + ...ent_4_aa4f1806207138115d2a95935bb0546b._comment | 8 + ...ent_5_fa95f93416e3d6e66af557df6562f1e5._comment | 8 + ...out_the___124_____40__pipe__41___character.mdwn | 27 + .../git_annex_copy_--fast_does_not_copy_files.mdwn | 22 + ...s_not_working_as_expected_in_the_assistant.mdwn | 140 + ...ent_1_ab82b880bd75a206e0717146e1b79aba._comment | 8 + ...ent_2_460e78ea8603bd87203d8014bcc3eb9a._comment | 55 + ...ent_3_17e9c2d29ddadcabc30ce884ffe0f853._comment | 12 + ...crashes_when_authenticating_with_jabber.de.mdwn | 26 + ...ent_1_5ba4f22bda2f5438fb08753cf149b649._comment | 12 + ...ent_2_b096cfdf26bfedfff16d882d7b2e060d._comment | 10 + ...ent_3_210be77aabb0ef5b85865cd08c51861e._comment | 12 + ...ent_4_bb974d882fbb31aa54e6de38410a2318._comment | 8 + ...ent_5_be655cbea27b6c87d298a75e1697a87d._comment | 8 + ...ent_6_72d1dac6627bbe22d5bd140215d82c47._comment | 8 + ...ent_7_8a8dfb15684525e156d6334e9f67a55c._comment | 66 + ...ent_8_f1a6e413756066659020e20147373a11._comment | 8 + ...me___40__notably_including_dead_ones__41__.mdwn | 44 + ...ent_1_7ee08a60e4b2516c010d3c2163049681._comment | 15 + ...ent_2_c29525bfda08717f68aaac83014e6b08._comment | 8 + ...t_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn | 220 + ...nt_10_141819a6b67de2602673698f6f148106._comment | 13 + ...nt_11_8be96359fd2bd33ed2961e499dc2685e._comment | 12 + ...nt_12_26950a37e86d4dd83dd59fb2564d0a2e._comment | 11 + ...nt_13_cbf8150dbe0da64bde7f6af8e041eda8._comment | 8 + ...nt_14_0c203f90d911cf6869894dae89575a49._comment | 13 + ...nt_15_68cbb7268bdad73357da2d11e05d73c4._comment | 8 + ...nt_16_816d552f871a1b06306f04d575adb2e5._comment | 8 + ...nt_17_7905b097a9c582452fb04cdc88ed4285._comment | 14 + ...nt_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment | 9 + ...nt_19_9881db7bb6fef4e47c54cdc23e995f17._comment | 13 + ...ent_1_4fb9d3de245dddab65fb1a53a67a095c._comment | 8 + ...nt_20_41e2ea458669f59f96b5860825745910._comment | 8 + ...nt_21_515039e321e0595f95430d8082bd54a5._comment | 20 + ...nt_22_9412236296871c570c66f5b4c7f9681e._comment | 10 + ...nt_23_e4e7d13be6c0bc63f426e535de6172f8._comment | 8 + ...nt_24_c73e1277c5f284b1019362fb2bef94a8._comment | 8 + ...ent_2_f513259a2641e00b049203014ab940c8._comment | 12 + ...ent_3_54ee7b90467fee8b0457e9c447747500._comment | 10 + ...ent_4_7e6223c2dae3346e17276c7bbb01d53e._comment | 12 + ...ent_5_13b6e595d595da7f036e81258a65541e._comment | 8 + ...ent_6_94144c0cbdbccc72c13e12daf7657a29._comment | 8 + ...ent_7_9eb064ffdc3fdb70e85572185e151a3f._comment | 8 + ...ent_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment | 10 + ...ent_9_1fd6a4374a334bc03914c3e0df95ef95._comment | 10 + ...nableremote_gcrypt_failure_leaves_a_remote.mdwn | 31 + doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn | 24 + ...__47__whereis_and_uncommited_local_changes.mdwn | 30 + ...ent_1_99e8d2c1bbc23438f954d8ddc827078e._comment | 9 + ...ent_2_7c8d91d78608d717164cb3e825654654._comment | 10 + ..._has_problems_with_urls_containing___126__.mdwn | 46 + ...doesn__39__t_use_.gitignore_in_direct_mode.mdwn | 18 + ...nex_sync_--content_not_syncing_all_objects.mdwn | 33 + ...ent_1_36deea0f1277d6888c8bb79156c56efa._comment | 16 + ...ent_2_70804d50b07630fadfc029a22173c5a0._comment | 14 + ...ent_3_d7349af488008e3ca6557e0c1fbfc5b6._comment | 9 + ..._a_bunch_of_files___40__not_expected__41__.mdwn | 42 + ...ent_1_e25451863622eefed664f6a210cbe67d._comment | 72 + ...ent_2_f49e6f4016b3a6f918961a2412902e03._comment | 12 + ...ent_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment | 20 + ...ent_4_a01a867500fd94e6b317e74a0b0b1401._comment | 8 + ...n_direct_mode_does_not_honor_skip-worktree.mdwn | 37 + ...ent_1_69baeb997086c885f34fd1dc385cf5d6._comment | 12 + ...ent_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment | 10 + ...ent_3_6bfd4e9a7853af93e72b717249de9439._comment | 8 + ...ent_4_a7eab4171af7e46bcc637aacf630e9db._comment | 8 + ...ent_5_cb98789c50c58f01055183dbaf7b4eba._comment | 11 + doc/bugs/git_annex_unlock_is_not_atomic.mdwn | 7 + ...it_annex_unused_failes_on_empty_repository.mdwn | 15 + ..._character___40__and_probably_others__41__.mdwn | 33 + ...ent_1_861506e40e0d04d2be98bbfe9188be89._comment | 12 + ...x_webapp_--listen_on_a_remote_linux_server.mdwn | 50 + ...ent_1_db99c00830d3f15ebe790c4dc8b60bd7._comment | 8 + ...command_has_tons_of_redundant_-a_paramters.mdwn | 15 + doc/bugs/git_mv_before_commit_breaks_symlinks.mdwn | 28 + doc/bugs/git_rename_detection_on_file_move.mdwn | 14 + ...nt_10_5ec2f965c80cc5dd31ee3c4edb695664._comment | 8 + ...ent_1_0531dcfa833b0321a7009526efe3df33._comment | 26 + ...ent_2_7101d07400ad5935f880dc00d89bf90e._comment | 27 + ...ent_3_57010bcaca42089b451ad8659a1e018e._comment | 8 + ...ent_4_79d96599f757757f34d7b784e6c0e81c._comment | 34 + ...ent_5_d61f5693d947b9736b29fca1dbc7ad76._comment | 12 + ...ent_6_f63de6fe2f7189c8c2908cc41c4bc963._comment | 19 + ...ent_7_7f20d0b2f6ed1c34021a135438037306._comment | 10 + ...ent_8_6a00500b24ba53248c78e1ffc8d1a591._comment | 21 + ...ent_9_75e0973f6d573df615e01005ebcea87d._comment | 9 + ...nore_for_DCIM_on_Android_misses_some_files.mdwn | 17 + ...ent_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment | 12 + doc/bugs/glacier_from_multiple_repos.mdwn | 16 + doc/bugs/googlemail.mdwn | 16 + doc/bugs/gpg-agent.mdwn | 5049 ++++++++++++++++++++ ...ent_1_86860841aaa38541968693ec02f6a506._comment | 10 + .../gpg_does_not_ask_for_password_inside_tmux.mdwn | 25 + ...ent_1_053b12e8b412723ff1d6b4e64e71af9e._comment | 24 + ...ent_2_44830ba952cad3b153249bd405671507._comment | 10 + ...ent_3_a63db33a1dc70e64418de8b4bea6a9fa._comment | 11 + ...pg_goes_to_100__37___cpu_on_bad_input_data.mdwn | 18 + ...ent_1_889218fb7c0115b03d9bad0c07296097._comment | 36 + .../how_to_get_git-annex_shell_on_MAC__63__.mdwn | 27 + ...ent_1_780fbb7b8dda331503064dfa6bcabaa3._comment | 23 + ...ent_2_1785e99846998aa50e1c62a88b558196._comment | 14 + doc/bugs/id__95__rsa_on_android.mdwn | 32 + ...ent_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment | 8 + ...ent_2_7039ed326c92211aa92e9276aba8c6b6._comment | 12 + ...ent_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment | 10 + ...instruction_on_OSX_for_5.20131230-g9a495e6.mdwn | 25 + ...ent_1_515682c2338c861580105e869df648a1._comment | 8 + ...tray___96__.tmp__96___files_if_interrupted.mdwn | 12 + doc/bugs/import_memleak_from_the_assistant.mdwn | 1608 +++++++ ...ent_1_81c80ca3ea288c651ccf45c83477e058._comment | 10 + ...ent_2_56089b7ad5d02c39ae0aacb442d789e9._comment | 16 + ...ent_3_b193a4a0901c681b59a97b93b456765b._comment | 15 + ...ent_4_d9464c7dc41773650ef7291391e1b414._comment | 10 + .../leakafter.png | Bin 0 -> 43348 bytes .../leakbefore.png | Bin 0 -> 24006 bytes doc/bugs/inconsistent_use_of_SI_prefixes.mdwn | 55 + ...incremental_fsck_should_not_use_sticky_bit.mdwn | 17 + ...ent_1_204f45a43cd10bcb45c4920a13d66e8d._comment | 28 + ...ent_2_a8bb264cb2ceece72e0dd9191b2b566e._comment | 8 + ...ent_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment | 12 + ...ent_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment | 10 + ...ent_5_ec29ed50c4321cf9e21c56c13c65156b._comment | 8 + ...ent_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment | 8 + doc/bugs/index_file_smaller_than_expected.mdwn | 53 + ...ent_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment | 17 + doc/bugs/info_file_contains_wrong_version.mdwn | 20 + ...rference_with_Dropbox_results_in_data_loss.mdwn | 50 + ...ent_1_837c7ab2d31531ac8a61509225926814._comment | 20 + ...ent_2_fe852adc1d7d3062ace269ceb134f3ad._comment | 8 + ...argument___40__invalid_byte_sequence__41__.mdwn | 29 + .../issues_with_non-posix_compatible_shells.mdwn | 41 + ...ent_1_076948499a9d581a50da52b7690e5d4e._comment | 8 + doc/bugs/links_in_firefox_do_not_always_work.mdwn | 26 + ...ent_1_5e506674f157e8ed612eca1f9adfa068._comment | 18 + ...ent_2_dfde57b433301e971c2d5b9e4d3c824a._comment | 12 + ...ent_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment | 15 + .../make_install_can__39__t_be_used_with_sudo.mdwn | 20 + ...nstall_doesn__39__t_create_git-annex-shell.mdwn | 62 + ...ent_1_8c20edd8c6483500f807528d616c6dfd._comment | 14 + ...ent_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment | 31 + ...ent_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment | 8 + ...ent_4_ec78032ba62d6918baa2c0b07ead5b50._comment | 8 + doc/bugs/manpage_has_slight_indentation_error.mdwn | 38 + .../merge_causes_out_of_memory_on_large_repos.mdwn | 26 + ...ent_1_6d47485728ea65a9b555f8be7159dea5._comment | 10 + ...ent_2_06723d13ecdaf87de5ff2b209e3c5198._comment | 10 + ...ent_3_9f83ef190547b291a715cda55b7977d4._comment | 10 + ...ent_4_0e32ae0300472c56079cfbcd78a3e386._comment | 9 + ...ent_5_e8998716107e7ae8d0e8d332812517ad._comment | 14 + ...grated_files_not_showing_up_in_unused_list.mdwn | 62 + ...ent_1_2cfbf6693b051c758fe5efa5ee885829._comment | 16 + ...ent_2_acb1abeb32c3aba8ba65151afbea753c._comment | 10 + doc/bugs/moreinfo.mdwn | 2 + ...xist___40__No_such_file_or_directory__41__.mdwn | 30 + ...ent_1_9fdeaa51ccc7c71dcfeea3ea783d3b50._comment | 9 + doc/bugs/no_git-annex_shell_on_Windows.mdwn | 28 + ...ent_1_988768c3e4f30c751034a0b0390cdd88._comment | 8 + ...ent_2_70a6c9af57eed4f8ceb3de63cbf8a5e6._comment | 10 + ...ent_3_7f48959c6242c5cc52e9d0a79fd3f85d._comment | 8 + ...ent_4_04b30dd9e510762ee547e7b45bdba660._comment | 12 + ...ent_5_beebbd4a41cccfc7aac3c19d76c3b978._comment | 8 + ...ent_6_957c5da5f336c7ef59e4149602471888._comment | 15 + ...ent_7_a8654cf656de55ccdcf40270a1ef4ca9._comment | 35 + ...ent_8_3c8bb1b1d67ca1a6e568e381d24a2574._comment | 16 + ...ent_9_03646c9df9d4f4ea27459660fe65a976._comment | 25 + ...exed_file_changed_to_annexed_on_typechange.mdwn | 40 + ...ent_1_6ac691645edb483797bee05043fd83b3._comment | 8 + ...ent_2_5d67e3a60b7cc30c2b1857f50895d363._comment | 8 + ...ent_3_78f1e081b92f418c20893d86a8715501._comment | 8 + ...ent_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment | 12 + ...ent_5_5e74431048b07631e0dbeca90fdb365b._comment | 47 + ...ent_6_3724e1c1a5fc6d3589452478249792ec._comment | 8 + ...ent_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment | 8 + ...ent_8_c53ce2274388711ffbde1595b64f932b._comment | 10 + ...r_weird_output__41___from_git_annex_status.mdwn | 89 + ...ent_1_fcd230cbb2ac363c469b98021042c011._comment | 10 + ...ent_2_23207ecabd4b41d9551d0491fa71e96b._comment | 12 + ...ent_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment | 119 + ...ent_4_d0e55585f1612148163039d157253258._comment | 11 + ...ent_6_5506dc1b08516677886da4aa97263864._comment | 12 + ...ent_7_073449cc2cb73efd2b2d3d778a5573de._comment | 14 + ...ent_7_3516e71ba3b07427a10cbb4965712aa6._comment | 24 + ...ent_8_ea2e4704adb2f304f9c11c61eb62e919._comment | 8 + ...ent_9_4d17fedead7977541371a3f2c192e030._comment | 46 + ..._deprecated__44___but_still_in_walkthrough.mdwn | 21 + ...__.fuse__95__hiddenXXXXX_files_left_behind.mdwn | 52 + ...ent_1_b96ea3ece44d42e79e4d903ca66065ee._comment | 12 + ...atement_does_not_allow_spaces_in_filenames.mdwn | 31 + ...ent_1_ca10638d4b4b178cfd0de8736542c4dc._comment | 12 + ...ent_2_986a393a512229d35e529ba242b77b1e._comment | 10 + doc/bugs/problem_commit_normal_links.mdwn | 59 + doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn | 3 + ...ent_1_5f60006c9bb095167d817f234a14d20b._comment | 8 + ...ent_2_cd0123392b16d89db41b45464165c247._comment | 23 + ...ent_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment | 16 + ...ent_4_91439d4dbbf1461e281b276eb0003691._comment | 8 + ...ent_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment | 8 + ...ent_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment | 10 + doc/bugs/problems_with_android_and_gpg.mdwn | 73 + ...ent_1_526d8805cb1ae896e8b1920ac2aecc17._comment | 8 + ...ent_2_2e1ae66bac4f55b74074b09e22ab270d._comment | 16 + ...ent_3_47510400e8e45a71a1581aed99a157a1._comment | 12 + ...ent_4_d28d773450d09e03160548d99f12256d._comment | 12 + ...ent_5_74f1177d6dd42bab5ddfc040cbfb035e._comment | 10 + doc/bugs/problems_with_android_and_xmpp.mdwn | 82 + ...ent_1_dd56eb74660a606c7db54861ec745cc6._comment | 11 + ...ent_2_ae4554fadfc3ea1913a36aa535815cfb._comment | 12 + ...ent_3_128702a7974bd00337c3304e49a74f0b._comment | 23 + doc/bugs/problems_with_glacier.mdwn | 65 + ...ent_1_8d233428a16ae4276d9c69b329e8216b._comment | 12 + doc/bugs/protocol_mismatch_after_interrupt.mdwn | 33 + ...ent_1_415de83053dc61a64cf2e301223f1916._comment | 11 + ...an_once_then_stopped_running_opensuse_13.1.mdwn | 13 + ...ent_1_a9daf9e8f968b32f25e236f53ea4b845._comment | 14 + ...es_vanishing_when_assistant_gets_restarted.mdwn | 34 + ...ent_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment | 21 + ...ent_2_e66532b23b089c9ea61122d6664cddb9._comment | 10 + ...ent_3_c9d692c867acc076f64f1213ea03ca11._comment | 8 + ..._weird___96__git_annex_sync__96___behavior.mdwn | 113 + ...ent_1_1a0b964f93c753838d6ccbdc8f79b39e._comment | 8 + ...ent_2_d22dcd7f95c5dc1c381c3c746781efce._comment | 8 + ...ent_3_a25140eb90f6b24c1a3ca39c901694e2._comment | 10 + ...ent_4_825e15183008ff7d97a81cacc3f55fb4._comment | 8 + ...ent_5_e858fc7c729cd39740354fb12627d556._comment | 10 + ...ent_6_9881b0f2dfb0907a60c0da296bc3da3f._comment | 10 + ...ent_7_ca017b9d3bafea4cb31448c802f3834e._comment | 8 + ...use_their_symlink_targets_don__39__t_exist.mdwn | 67 + ...nt_10_8a1d16b2aaba224e94be3d9dcc036d91._comment | 12 + ...nt_11_434ed328a22a6657dba3b2929a56e499._comment | 18 + ...nt_12_1837b70ace42882db3ab82e001680934._comment | 29 + ...nt_13_ca9c87a10f29e41572540edeb99652f2._comment | 11 + ...ent_1_69eafc4201e3014ef1b5d74fe319e462._comment | 10 + ...ent_2_b7a64db9abe006af8c30169ad849efe9._comment | 76 + ...ent_3_197ac6070f256131c6e18a07aa3834fa._comment | 14 + ...ent_4_fe07832333b536c71b7dcb46a4a44bd0._comment | 19 + ...ent_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment | 10 + ...ent_6_3f236b35e9820cd88bb77fcd57d6975e._comment | 43 + ...ent_7_3cc5dae0351201522711a7caeecd60d5._comment | 10 + ...ent_8_3c3883cb66d02a15d5de84d22aa113da._comment | 38 + ...ent_9_c8cece9559bd2dc6154cd28772369e48._comment | 10 + ...e_gcrypt_based_repos_and_conflicting_uuids.mdwn | 30 + ...ent_1_11af589cf646cb7552eeb5c7401934f5._comment | 8 + ...ent_2_d81cb9b47dea34b639dc250bb231010a._comment | 16 + ...ent_3_8df00f0ed4a26f702e0935b366521530._comment | 164 + ...ent_4_7eb33c23223dfc634eb3c9c6621f7f3e._comment | 12 + doc/bugs/remote_not_showing_up_in_webapp.mdwn | 100 + ...ent_1_2a269732fd528f505777542d3556437a._comment | 17 + ...ent_2_10638e99e2e11460f99266f56adbc1db._comment | 10 + ...ent_3_4aa72acc0938f7f824ba10f3f102e8bc._comment | 16 + doc/bugs/repo_creation_fails_on_android_4.4.3.mdwn | 30 + ...ent_1_01e638ec9c6d74966d76b6ceb7c06bad._comment | 26 + ...ent_2_07c0f9387433b7107e9def2bfbed3039._comment | 8 + ...ent_3_caf4f02677ea9e7fe28dbace99aa6860._comment | 8 + ...__files_which_have_names_containing_spaces.mdwn | 50 + .../rsync_transport:_username_not_respected.mdwn | 43 + .../runs_of_of_memory_adding_2_million_files.mdwn | 17 + ...ent_1_8b60b7816b9bf2c8cdd21b5cae431555._comment | 8 + ...ent_2_32908da23e4fb38a7d20b765a5ab4656._comment | 12 + ...ent_3_3cff88b50eb3872565bccbeb6ee15716._comment | 27 + ...ent_4_e991986eb8ae49d2e69f7ed7fd61485f._comment | 8 + ...ent_5_241ad838135a7a377374ca9ba90aec5c._comment | 8 + ...ent_6_744982b77cc867e9e3a7d638c7a653d6._comment | 12 + ...ent_7_9add4ee13b7ea846e6495c28da214269._comment | 8 + doc/bugs/set_metadata_on_wrong_files.mdwn | 90 + ...ent_1_074f124e5d313e90b3e9217325799587._comment | 8 + doc/bugs/signal_weirdness.mdwn | 50 + ..._HUGE_--_please_seek_possibility_to_shrink.mdwn | 41 + ...ent_1_d2faaff98386433110dcf7aae87916b7._comment | 9 + ...ent_2_1359ddf1b5db4303f8bd219d3f07df3a._comment | 10 + ...ygen_failed_when_adding_remote_server_repo.mdwn | 44 + ...ent_1_52180983b59c247389a55a9523ec435b._comment | 14 + doc/bugs/ssh:_unprotected_private_key_file.mdwn | 62 + doc/bugs/ssh_portnum_bugs.mdwn | 15 + ...ent_1_2026785c06e99b55158cd65c221eb598._comment | 10 + ...ent_2_76551dfcd29b54814809c434d7cb64af._comment | 8 + ...ent_3_ab49a0e307a29c7c20627bbb3b10ab1d._comment | 8 + ...ent_4_e0d96a43208453dc29373d0e045751e3._comment | 8 + ...ent_5_9ed44cdb79224dac6b000983d77d53f3._comment | 8 + ...__with_the_annex_directory_exposed_to_http.mdwn | 20 + ..._not_commit_with_alwasycommit___61___false.mdwn | 90 + .../test_failures_on_window_for_5.20131118.mdwn | 22 + ...ent_1_5a7a284625c12d54390fe4a4ec1d4211._comment | 188 + ...sc_has_problems_on_non-linux_based_systems.mdwn | 20 + ...ent_1_1d38283c9ea87174f3bbef9a58f5cb88._comment | 10 + ...ent_2_bf112edd075fbebe4fc959a387946eb9._comment | 8 + ...ent_3_a46080fbe82adf0986c5dc045e382501._comment | 8 + ...ent_4_760437bf3ba972a775bb190fb4b38202._comment | 8 + ...ent_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment | 10 + ...ent_6_548303d6ffb21a9370b6904f41ff49c1._comment | 42 + ...ent_7_7ca00527ab5db058aadec4fe813e51fd._comment | 8 + ...ent_8_881aecb9ae671689453f6d5d780d844b._comment | 8 + ..._gitconfig_contradiction_causing_confusion.mdwn | 35 + doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn | 11 + ...ent_1_e8df4b36a89b37edd94f3a318ae93a32._comment | 8 + ...ent_2_3b2c3c84bd1910280c549a2ee1c622b9._comment | 8 + ...hange_repository_group_of___34__here__34__.mdwn | 13 + doc/bugs/undefined.mdwn | 5 + ...d_repository_when_using_annex-ignore_true_.mdwn | 25 + ...ommitBuffer_containing_an_invalid_argument.mdwn | 87 + ...ent_1_004cb3015895ad67386276f3e1f0de0d._comment | 10 + ...ent_2_3fe298ebb3ff04d12f2528aa982d7084._comment | 24 + ...ent_3_9302536d1577c12337d714fa3a9ea7a1._comment | 10 + ...ent_4_c1c8de66192957b7026d99b9ff90589c._comment | 16 + ...ent_5_8c2dad766e4115073d49b698919b5ed5._comment | 8 + ...ent_6_8da2a73381309ecef4b2796d8f2bb0bb._comment | 10 + ...tracked_.git-annex__47____42___directories.mdwn | 16 + ...ent_1_9ca2da52f3c8add0276b72d6099516a6._comment | 10 + ...ent_2_e14e84b770305893f2fc6e4938359f47._comment | 18 + ...ent_3_ec04e306c96fd20ab912aea54a8340aa._comment | 8 + .../uploads_queued_to_annex-ignore_remotes.mdwn | 34 + ...ent_1_fa1c98f38253db8c2be3604c72eb3726._comment | 17 + ...ng_gpg_encryption_with_multiple_keys_fails.mdwn | 57 + ...ent_1_584390159278577da78b05bc7bb0e673._comment | 10 + ...ent_2_51855f5bb857e1b6bc5531cdd7073c31._comment | 10 + ...ent_3_3a6ff3dbc24850b065d045c7c9398eb1._comment | 20 + ...ent_4_84168b56288262e01280da59ffaf19f6._comment | 8 + ..._remote_format_generates_irritating_output.mdwn | 30 + ...ent_1_fceba878f1097e27f056580e8d6d5b31._comment | 26 + ...ent_2_416992874813f120721a56d88b2bef65._comment | 9 + ...ent_3_a20f470c5226ac5693eb15146a02b3f5._comment | 8 + ...ent_4_a81f06191bc03a7aad5929af99f0634e._comment | 28 + ...ent_5_7438caecf78b4fb5d21f9f31dff95cf2._comment | 14 + .../web_app_loops_over_a_non-addable_file.mdwn | 56 + ...pp:_difficult_to_abort_adding_a_repository.mdwn | 24 + ...n___126____47__annex_isn__39__t_a_git_repo.mdwn | 29 + ...:_fails_mysteriously_on_newer_repo_layouts.mdwn | 34 + doc/bugs/weird_unicode_bug_on_windows.mdwn | 17 + ...ent_1_69af9bd8c7898fccc2219edd860d547b._comment | 12 + doc/bugs/wget_and_android_4.4.mdwn | 27 + ...git_annex_delete_non_annexed_new_git_files.mdwn | 55 + ...ent_1_6c9f5fe14e46ac96254426e1e9cff23f._comment | 8 + ...ent_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment | 9 + ...ent_3_f449f259f076ea1b11bd289bdbcc9339._comment | 13 + ...ent_4_78ccd70a17d776f14ea9193ab55c6732._comment | 10 + ...ent_5_95fcc19327b57222844302bb81236ee9._comment | 8 + ..._available_both_here_and_in_another_remote.mdwn | 30 + ...ent_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment | 8 + ...ent_2_f430538101f0ef6114b5e953248fa599._comment | 8 + ..._outputs_no_informaiton_for_unlocked_files.mdwn | 46 + ...ent_1_47bd0fc8d1c65f8a868d9722e66c71db._comment | 10 + doc/bugs/windows_install_failure.mdwn | 33 + ...ent_1_f339574c7cfa35c1f0dfd515fde457f5._comment | 8 + ...ent_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment | 8 + .../youtube_support_suddenly_stopped_working.mdwn | 62 + doc/builds.mdwn | 44 + doc/coding_style.mdwn | 92 + ...ent_1_70521cf79ad06832b1d73fc2c20c68ec._comment | 20 + ...ent_2_a820b7c8ae7c2290eb000f61bdb5c514._comment | 8 + doc/comments.mdwn | 9 + doc/contact.mdwn | 11 + ...ent_1_12d60f767d90bea94974e1ff6b206d31._comment | 8 + ...ent_2_95b6d868b913418de50ba121d71d2390._comment | 10 + ...ent_3_2cf43bd406673294e6cdbd785c4a0d0c._comment | 16 + ...ent_4_586a506e27379d74fbc0f4b654e89c7d._comment | 10 + doc/contribute.mdwn | 38 + doc/copies.mdwn | 35 + ...ent_1_af9bee33777fb8a187b714fc8c5fb11d._comment | 8 + doc/design.mdwn | 6 + doc/design/assistant.mdwn | 45 + doc/design/assistant/OSX.mdwn | 13 + ...ent_1_9290f6e6f265e906b08631224392b7bf._comment | 14 + doc/design/assistant/android.mdwn | 42 + ...nt_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment | 14 + ...ent_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment | 8 + ...ent_2_3dd386ac1b757c73d14f14377b9eedd4._comment | 8 + ...ent_3_5dca47a4599d6e88d19193701c5a571b._comment | 46 + ...ent_4_054f06311e2b51d73be569f181eb004f._comment | 10 + ...ent_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment | 21 + ...ent_6_fee32a831eeb5736fe1dce52e30320c8._comment | 16 + ...ent_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment | 17 + ...ent_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment | 11 + ...ent_9_55ea70a6929523d26248ff6409b04a6e._comment | 10 + doc/design/assistant/blog.mdwn | 11 + .../assistant/blog/day_100__cursed_clouds.mdwn | 19 + .../blog/day_102__very_high_level_programming.mdwn | 37 + ...ent_1_c028b403261dd66bcf83e6ffd134b80b._comment | 8 + doc/design/assistant/blog/day_103__bugfix_day.mdwn | 25 + doc/design/assistant/blog/day_104__misc.mdwn | 18 + ...ent_1_13d7fad2d3f8eab10314784c035e2a16._comment | 8 + .../assistant/blog/day_105__lazy_Sunday.mdwn | 43 + .../assistant/blog/day_106__lazy_Monday.mdwn | 10 + .../assistant/blog/day_107__memory_leak.mdwn | 11 + .../blog/day_108__another_zombie_outbreak.mdwn | 33 + ...ent_1_194c48d65993462f809a2cfaa774a3e2._comment | 11 + ...ent_2_ef5ee5933fcadcb81cc81b816db14bda._comment | 8 + doc/design/assistant/blog/day_109__dropping.mdwn | 16 + doc/design/assistant/blog/day_10__lsof.mdwn | 54 + ...ent_1_9b8c28c85c979f32e5c295b6a03c048e._comment | 9 + .../assistant/blog/day_110__more_dropping.mdwn | 55 + .../assistant/blog/day_111__config_monitor.mdwn | 18 + ...and_now_for_something_completely_different.mdwn | 50 + ...ent_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment | 10 + ...ent_2_c5a734f611ecc95729904e645583ee43._comment | 8 + ...ent_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment | 8 + ...ent_4_1fe036e4c65fb4211aa2c394f535344a._comment | 8 + ...ent_5_e4ba3568c4efd98f212dd47427a1cf47._comment | 10 + .../assistant/blog/day_113__notifier_work.mdwn | 22 + doc/design/assistant/blog/day_114__xmpp.mdwn | 56 + ...ent_1_c2b0617a2fc3dc4f19a6be6947913842._comment | 8 + ...ent_2_d14375dfb5791615802dab3c5438f8e2._comment | 8 + ...ent_3_6d72ea32c111e605be30ad2153fc71c9._comment | 10 + ...ent_4_e51d6f854db5f9e74a1aa58bd8923795._comment | 12 + .../assistant/blog/day_115__my_new_form.mdwn | 17 + .../assistant/blog/day_116__the_segfault.mdwn | 25 + .../assistant/blog/day_117__new_topologies.mdwn | 41 + .../blog/day_118__monadic_discontinuity.mdwn | 15 + .../assistant/blog/day_119__time_for_testing.mdwn | 12 + doc/design/assistant/blog/day_11__freebsd.mdwn | 50 + doc/design/assistant/blog/day_120__test_day.mdwn | 2 + doc/design/assistant/blog/day_121__buddy_list.mdwn | 10 + .../assistant/blog/day_122__xmpp_pairing.mdwn | 29 + ...ent_1_e95efb23eb2e67e3f11a5c7de56424a7._comment | 10 + ...ent_2_30e251e73146512bde8b2f69eddeef2e._comment | 8 + .../assistant/blog/day_123__xmpp_insanity.mdwn | 49 + .../day_124__git_push_over_xmpp_groundwork.mdwn | 28 + .../blog/day_125__xmpp_push_continues.mdwn | 15 + .../blog/day_126__mr_watson_come_here.mdwn | 52 + ...ent_1_ee1361e6b235f4e1c00596ba516b519a._comment | 10 + ...ent_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment | 8 + doc/design/assistant/blog/day_127__xmpp_syncs.mdwn | 35 + .../assistant/blog/day_128__last_xmpp_day.mdwn | 49 + ...ent_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment | 10 + ...ent_2_43664b73c71c41d71bc95e665f128106._comment | 8 + ...ent_3_d369b04f686009a9dbb57b999107a55e._comment | 11 + ...ent_4_095855d301e7ccd3689ffe507cfb63ee._comment | 8 + ...ent_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment | 9 + ...ent_6_2f9ba367e19d77bf52f372b6f0f5938a._comment | 8 + doc/design/assistant/blog/day_129__release.mdwn | 4 + .../assistant/blog/day_12__freebsd_redux.mdwn | 23 + ...ent_1_5da32cf53f1de27bfe6cec2d294db3e1._comment | 8 + ...ent_2_696d6e22034acf5bb60d80124b72ef2f._comment | 8 + doc/design/assistant/blog/day_130__what_now.mdwn | 36 + ...ent_1_402f00cc034351d8253a797dd4de55bf._comment | 8 + .../assistant/blog/day_131__webdav_groundwork.mdwn | 28 + .../assistant/blog/day_132__webdav_continued.mdwn | 22 + .../assistant/blog/day_133__webdav_working.mdwn | 31 + .../blog/day_134__box.com_configurator.mdwn | 8 + .../blog/day_135__progress_revisited.mdwn | 37 + doc/design/assistant/blog/day_136__misc.mdwn | 14 + doc/design/assistant/blog/day_137__Glacier.mdwn | 30 + doc/design/assistant/blog/day_138__back.mdwn | 25 + ...ent_1_65a8499b284bed38d2bde1886a54a311._comment | 8 + doc/design/assistant/blog/day_139__catch_up.mdwn | 11 + .../assistant/blog/day_13__kqueue_continued.mdwn | 34 + .../assistant/blog/day_140__release_monday.mdwn | 25 + .../assistant/blog/day_141__release_tuesday.mdwn | 6 + ...ent_1_a5adea7a726df12f9121c744a036f08d._comment | 10 + doc/design/assistant/blog/day_142__filling_in.mdwn | 9 + doc/design/assistant/blog/day_143__what_next.mdwn | 22 + ...ent_1_40cf25a2ebdd43d8974a28e180e100e5._comment | 13 + ...ent_2_af9ccbbc5131e6333c029415141bdb51._comment | 10 + .../assistant/blog/day_144__webapp_work.mdwn | 8 + .../assistant/blog/day_145__more_webapp_work.mdwn | 12 + doc/design/assistant/blog/day_146__meanwhile.mdwn | 22 + .../assistant/blog/day_147__direct_mode.mdwn | 36 + ...ent_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment | 16 + ...ent_2_3b26f0d081c3bf1037bb872d529ce825._comment | 8 + .../assistant/blog/day_148__direct_mode.mdwn | 42 + doc/design/assistant/blog/day_149__rainy_day.mdwn | 15 + .../blog/day_14__kqueue_kqueue_kqueue.mdwn | 23 + .../blog/day_14__thinking_about_syncing.mdwn | 44 + doc/design/assistant/blog/day_150__12:12.mdwn | 53 + .../blog/day_151__direct_mode_toggle.mdwn | 59 + doc/design/assistant/blog/day_152__bugfixes.mdwn | 18 + ...ent_1_46863a875f9daa6f2c9248b66ff91929._comment | 9 + ...ent_2_a586e617bc024c8a9ff60f1b8345d74d._comment | 8 + .../assistant/blog/day_153__hibernation.mdwn | 26 + .../blog/day_154__direct_mode_merging.mdwn | 21 + doc/design/assistant/blog/day_155__bugfixes.mdwn | 15 + .../day_156_and_157__direct_mode_assistant.mdwn | 45 + doc/design/assistant/blog/day_158__fsevents.mdwn | 20 + ...ent_1_b278372ac6399f64d5fa9da178278a6d._comment | 8 + ...ent_2_2d5ce9b2807068c3517e185945662bd2._comment | 8 + .../blog/day_159__fsevents_and_assistant.mdwn | 16 + ...ent_1_b85f446c3fa8d703a2a8882825c6f33f._comment | 8 + ...ent_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment | 8 + ...ent_3_37abc41bae23a1d7de0d19d952aec492._comment | 8 + doc/design/assistant/blog/day_15__its_aliiive.mdwn | 33 + .../blog/day_160__finishing_up_direct_mode.mdwn | 10 + .../assistant/blog/day_161__release_day.mdwn | 8 + ...ent_1_e82c67f3ce216618149537bba1e0b850._comment | 19 + ...ent_2_b1fe96fd818935c0497b78bb8ad32ffa._comment | 14 + ...ent_3_40bac0e1756aa77bb966c4654857141c._comment | 44 + ...ent_4_af65656b0d1179636937595868bb97b0._comment | 30 + ...ent_5_0c05caaaf9588e124585041bf5f45d75._comment | 20 + ...ent_6_5dfb5f428633d6062925f61af2b8829b._comment | 23 + ...ent_7_ac4effb381b08d94d4a2d2482e92c89a._comment | 13 + ...ent_8_32600e89e3098e52a1280895e03b3f86._comment | 13 + ...ent_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment | 8 + doc/design/assistant/blog/day_162__UI.mdwn | 17 + .../assistant/blog/day_163__free_features.mdwn | 32 + doc/design/assistant/blog/day_164__bugfixes.mdwn | 17 + .../assistant/blog/day_165__release_day.mdwn | 16 + .../assistant/blog/day_166__a_short_long_day.mdwn | 25 + .../blog/day_167__safe_direct_mode_transfers.mdwn | 12 + ...ent_1_f1aa64fe803d8c14b250a4e98b88142a._comment | 8 + ...ent_2_5ce1db84c9ead713f1272c4975645b93._comment | 8 + .../assistant/blog/day_168__back_to_theme.mdwn | 18 + ...ent_1_f248780bfcbd0384d9d72c2633a4ea46._comment | 12 + ...ent_2_5beba073373b8e75a32d1fcfdc1a0782._comment | 13 + .../blog/day_169__direct_mode_is_safe.mdwn | 24 + ...ent_1_65f87656c4e6bc7cdb614f53961341c9._comment | 8 + ...ent_2_a116a402a126c62be54c06afd82439ab._comment | 19 + .../blog/day_16__more_robust_syncing.mdwn | 44 + ...ent_1_23e7a90429e4431f90787cd016ebe188._comment | 8 + ...ent_2_8e7e7cd27791bb47625e60a284e9c802._comment | 10 + .../blog/day_170__bugfixes_and_release.mdwn | 8 + doc/design/assistant/blog/day_171__logs.mdwn | 23 + doc/design/assistant/blog/day_172__short_day.mdwn | 22 + ...ent_1_b75e26b77a23a45da1c4c3bca1399246._comment | 12 + doc/design/assistant/blog/day_173__snow_day.mdwn | 22 + .../blog/day_174__last_weekend_before_AU.mdwn | 25 + ...ent_1_05a8fd47f54373331741cc869a53b0c3._comment | 10 + ...ent_2_fc8e65eef954c4caa8321c2fe8b711b7._comment | 8 + ...ent_3_399534f540d85cac067fbb7be9d373b4._comment | 8 + .../assistant/blog/day_175__pacific_features.mdwn | 15 + ...ent_1_c3ee4386f872b7c76aaecfa638b368cb._comment | 9 + .../assistant/blog/day_176__thread_management.mdwn | 13 + .../assistant/blog/day_178__bus_hacking.mdwn | 10 + .../assistant/blog/day_179__brief_updates.mdwn | 19 + ...ent_1_920a84457d40358507a3eb817a4568d9._comment | 8 + .../assistant/blog/day_17__push_queue_prune.mdwn | 19 + doc/design/assistant/blog/day_180__back.mdwn | 7 + doc/design/assistant/blog/day_181__triage.mdwn | 23 + doc/design/assistant/blog/day_182__it_begins.mdwn | 50 + doc/design/assistant/blog/day_183__plan_b.mdwn | 19 + .../blog/day_184__just_wanna_run_something.mdwn | 46 + ...ent_1_689adac7e26cb0b0a4e7ecc787cfd716._comment | 16 + .../assistant/blog/day_185__android_liftoff.mdwn | 20 + ...ent_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment | 9 + ...ent_2_ddeb24e86fafb7dae93142cc02767aad._comment | 10 + .../assistant/blog/day_186__Android_success.mdwn | 33 + ...ent_1_1629da240ca7db5f8a32059f561fd435._comment | 8 + .../assistant/blog/day_187__porting_utilities.mdwn | 22 + ...ent_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment | 8 + .../blog/day_188__crippled_filesystem_support.mdwn | 37 + ...ent_1_32a296fce23ae4b1e18bd5a9964bf619._comment | 14 + .../assistant/blog/day_189__more_crippling.mdwn | 44 + doc/design/assistant/blog/day_18__merging.mdwn | 82 + ...ent_1_7a553ad559519f3b3e3cd20115b4c44e._comment | 15 + .../assistant/blog/day_190-191__weekend.mdwn | 28 + ...ent_1_dbd692d12c14d08acd7d73a655b34e8b._comment | 10 + ...ent_2_c813830e53471a9732e010a748d574fc._comment | 28 + .../assistant/blog/day_192_193__more_porting.mdwn | 44 + .../assistant/blog/day_194__nice_moment.mdwn | 37 + .../assistant/blog/day_195__real_android_app.mdwn | 32 + ...nt_10_0112007552b30cd9bfeac614a1e399c4._comment | 10 + ...nt_11_230d3c169c713f613b9d607d84ce5092._comment | 12 + ...nt_12_8d74ad2a61c02272758d157282ad56ec._comment | 10 + ...nt_13_4f6bc0680f2debd638933968a26975e0._comment | 10 + ...nt_14_71539c62608866464e8faa76bc522a55._comment | 9 + ...nt_15_e1b205289721ae79ac7fbed2f44018b2._comment | 10 + ...ent_1_4bc0aeae4fa1116944644c64feaf9697._comment | 8 + ...ent_2_17bb6e7565d4c757f6c1e3514c22f47d._comment | 10 + ...ent_3_cd8a6bec0f7c6843dd11d3266f25f864._comment | 44 + ...ent_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment | 13 + ...ent_6_3d96568c469a8c53a982f304eae5e7d4._comment | 10 + ...ent_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment | 8 + ...ent_7_cf8da7720ddc20b05955ee671ca4acd5._comment | 8 + ...ent_8_f4709bdbc739182819b648fd6aa00531._comment | 36 + ...ent_9_e66af12c7eca0d457b8406e9fb4b69be._comment | 8 + .../assistant/blog/day_196__android_bugfixes.mdwn | 26 + .../assistant/blog/day_197__template_haskell.mdwn | 36 + ...ent_1_82d9f9508929d84abf7b718c59436ae8._comment | 18 + doc/design/assistant/blog/day_198__bugfixes.mdwn | 11 + ...ent_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment | 19 + ...ent_2_36d94b838e5e65c85e7afaabe8a578f1._comment | 12 + ...ent_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment | 10 + ...ent_4_5a4827227c03bcff3b1e4c44b531f816._comment | 12 + ...ent_5_9c5f4c85217e898be4c57c615e53c36f._comment | 8 + ...ent_6_bccf1abfb7f56d97673158f3ccfce511._comment | 9 + ...ent_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment | 8 + ...ent_8_8a3542437663028b17442818eba3f7c5._comment | 9 + .../blog/day_199__wrapping_up_Android_for_now.mdwn | 26 + ...ent_1_ec57358afc7e78d2860aa4237793832d._comment | 11 + .../blog/day_19__random_improvements.mdwn | 50 + doc/design/assistant/blog/day_1__inotify.mdwn | 57 + .../assistant/blog/day_200__release_day.mdwn | 19 + ...nt_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment | 10 + ...nt_11_b26890fdae575d42170988073fb2e45d._comment | 8 + ...nt_13_710a30c5d31bf549833ecfe9a0997c94._comment | 8 + ...nt_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment | 8 + ...ent_1_a68e1ed7829b49086c567d97ddc09912._comment | 8 + ...ent_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment | 8 + ...ent_3_5b752d6a8d74e61190f09384b6108206._comment | 31 + ...ent_4_881274ae0d6230bb4cafa4151ad72b49._comment | 12 + ...ent_5_e220059be77cf0ef396f37a4f9ccf9b5._comment | 8 + ...ent_6_ec2152151188dd252cdb61c68cfc12e4._comment | 10 + ...ent_7_42572411617c287368482bb9dcf94324._comment | 18 + ...ent_8_6b69aa81a9ba4e07e547ed1869946d51._comment | 15 + ...ent_9_b070a2e4151d9fbf43d7906efa78515f._comment | 12 + .../blog/day_201__real_Android_wrapup.mdwn | 38 + ...ent_1_88b9950c51324f0bb89c5646b3170952._comment | 19 + .../blog/day_201__real_Android_wrapup/fib.png | Bin 0 -> 69535 bytes .../blog/day_201__working_web_server.mdwn | 31 + .../assistant/blog/day_203__procrastination.mdwn | 25 + .../assistant/blog/day_204__deprocrastination.mdwn | 62 + .../blog/day_205_206__rainy_day__snow_day.mdwn | 12 + doc/design/assistant/blog/day_207__XMPP.mdwn | 7 + doc/design/assistant/blog/day_208__bugfixes.mdwn | 17 + doc/design/assistant/blog/day_209__The_Bug.mdwn | 23 + .../blog/day_20__data_transfer_design.mdwn | 22 + doc/design/assistant/blog/day_210__spring.mdwn | 29 + .../assistant/blog/day_211__zooming_along.mdwn | 24 + .../blog/day_212__accidental_all_nighter.mdwn | 24 + ...ent_1_6ee1f8056eedb6eb18013faf8f5ec212._comment | 8 + ...ent_2_07c83d75bb105bb77ada07359ed0ea7a._comment | 8 + ...ent_3_2c904d33f4f14807fbe718a01e98800a._comment | 8 + ...ent_4_59ec5c1cab75df87293800a7a03fe9c6._comment | 8 + ...ent_5_13893f106e835dcc52e03c7c6740c35b._comment | 8 + doc/design/assistant/blog/day_213__costs.mdwn | 34 + .../assistant/blog/day_214__release_day.mdwn | 5 + .../blog/day_215__dashboard_UI_refresh.mdwn | 25 + .../assistant/blog/day_216__more_bugfixes.mdwn | 42 + ...ent_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment | 10 + ...ent_2_1913d65dfe4ba08379d82a4a2ca91c40._comment | 8 + ...ent_3_92c774599a78540ad398afcd1d05f7ce._comment | 20 + doc/design/assistant/blog/day_217__nothing.mdwn | 2 + doc/design/assistant/blog/day_219__bug_triage.mdwn | 14 + ...ent_1_c6b977a969cacdce62987a439b7686f5._comment | 16 + .../assistant/blog/day_21__transfer_tracking.mdwn | 28 + .../assistant/blog/day_220__performance.mdwn | 40 + .../assistant/blog/day_221__this_and_that.mdwn | 28 + doc/design/assistant/blog/day_222__back.mdwn | 16 + ...ent_1_f05b48231a1ee0cffba7d66e112e5551._comment | 8 + ...ent_2_4d5f003ccd81580017ebf0dc31bc9cda._comment | 8 + .../blog/day_223__progress_revisited.mdwn | 24 + .../assistant/blog/day_224__annex.largefiles.mdwn | 23 + ...ent_1_408e4021b18f7ff5548d2d19ab558922._comment | 8 + ...ent_2_b24d1da2bc4307ded0216daffb8f9336._comment | 8 + .../blog/day_225__back_from_the_dead.mdwn | 47 + ...ent_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment | 8 + ...ent_2_26125dd9ef2bd10b597d14b2c6180952._comment | 8 + .../assistant/blog/day_226__poll_results.mdwn | 28 + ...ent_1_1ed980472214be6d0a8cf55f37797fda._comment | 8 + ...ent_2_6823b0a9a8037f1a5214db4db98fb16e._comment | 8 + .../blog/day_227__bigfixing_all_day_today.mdwn | 21 + .../day_228__more_work_on_repository_removals.mdwn | 27 + .../blog/day_229__rainy_day_bugfixes.mdwn | 17 + .../blog/day_22__horrible_option_parsing_hack.mdwn | 34 + doc/design/assistant/blog/day_230__Mom.mdwn | 35 + ...ent_1_696bba2246c8a9e6ce4aed3071bcc96c._comment | 8 + ...ent_2_2fa295ab6db0828cb725cfcfb6777822._comment | 8 + ...ent_3_fafd7abec629290418334ddb015bf62c._comment | 10 + ...ent_4_450cac0f2e82c94fd34b527ae05ef1b8._comment | 8 + .../assistant/blog/day_231__insert_title.mdwn | 26 + .../assistant/blog/day_232__headless_webapp.mdwn | 22 + ...ent_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment | 16 + ...ent_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment | 8 + ...ent_3_ccb9fa22422fb913b6a496ebe65c49fb._comment | 8 + ...ent_4_ceba4468760a2525960327698431cee2._comment | 8 + doc/design/assistant/blog/day_233__taxes.mdwn | 11 + ...ent_1_9473ffdc42595af9c293fbcd5a1cdb54._comment | 14 + ...ent_2_5feed8d7053ba03812ccda8c61fd9775._comment | 8 + .../assistant/blog/day_234__clean_shutdown.mdwn | 29 + doc/design/assistant/blog/day_235__birthday.mdwn | 31 + ...ent_1_db558b071067c1e63cde05cca0551094._comment | 8 + ...ent_2_d1a2c1124781118267599457ae9e0512._comment | 8 + ...ent_3_b853508d1d15234958b9f4a39277e45c._comment | 8 + ...ent_5_73aad3398a43bc4d28bca9bf635fa757._comment | 8 + .../assistant/blog/day_236__evil_splicer.mdwn | 29 + .../blog/day_237__gnome-keyring_craziness.mdwn | 29 + ...ent_1_0cb088b732881d1fa92493aa1fd93d43._comment | 8 + ...ent_2_b855fd710954beebaafe6d2bd03eb368._comment | 8 + .../assistant/blog/day_238__back_to_Android.mdwn | 11 + .../blog/day_239__bugfixes_and_frustration.mdwn | 28 + .../assistant/blog/day_23__transfer_watching.mdwn | 25 + doc/design/assistant/blog/day_240__it_builds.mdwn | 37 + ...ent_1_151840ae0020ea63b2f041488c905386._comment | 25 + doc/design/assistant/blog/day_241__cleanup.mdwn | 14 + ...ent_1_0e283cdf66a25b3cc9423fe651084cb9._comment | 8 + .../assistant/blog/day_242__more_porting.mdwn | 4 + .../assistant/blog/day_243__in_the_field.mdwn | 21 + .../assistant/blog/day_244__android_porting.mdwn | 6 + doc/design/assistant/blog/day_245__misc.mdwn | 15 + ...ent_1_3a2976617bb0cdc206fb1397a2ef1177._comment | 8 + ...ent_2_e0f9704e91fedca8ff26356f354cc1c3._comment | 10 + ...ent_3_93003a0d0983efbdc046d7459be194b0._comment | 8 + .../assistant/blog/day_246__bug_treadmill.mdwn | 18 + ...ent_1_f76f653364fe2b97e85e8356c93b0fce._comment | 8 + .../blog/day_247__performance_tuning.mdwn | 16 + .../assistant/blog/day_248__Internet_Archive.mdwn | 28 + doc/design/assistant/blog/day_249__quiet_day.mdwn | 7 + .../blog/day_24__airport_digressions.mdwn | 99 + doc/design/assistant/blog/day_250__stymied.mdwn | 23 + ...ent_1_330a10d447ccc3db03fcbfe571dbb404._comment | 8 + .../assistant/blog/day_251__xmpp_improvements.mdwn | 34 + .../assistant/blog/day_252__release_day.mdwn | 6 + doc/design/assistant/blog/day_253__OMG.mdwn | 22 + ...ent_1_bbdc61092771163e65a90a4755a807d8._comment | 8 + .../blog/day_254__Android_app_polishing.mdwn | 35 + ...ent_1_37f4ff5227566ce4b3fa69fc32568841._comment | 14 + ...ent_2_58bbb105bdbb72bba85c3622195f43b9._comment | 12 + .../blog/day_255__Debian_release_day.mdwn | 26 + doc/design/assistant/blog/day_256__8bit.mdwn | 27 + ...ent_1_f9b50263e3997d4c5b9836a2e0a346d7._comment | 8 + doc/design/assistant/blog/day_257__rainy_day.mdwn | 6 + .../blog/day_258__beginning_of_the_end.mdwn | 24 + .../blog/day_259__Android_dominos_toppling.mdwn | 15 + ...ent_1_0b4a6e4893b0157e4768b46468dbbb87._comment | 10 + ...ent_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment | 14 + ...ent_3_eed7792f6142f3fc74d3c384bb16559b._comment | 8 + .../assistant/blog/day_25__transfer_queueing.mdwn | 41 + ...ent_1_59fd4f1ffe96c412f613dc86276e7dbd._comment | 10 + ...ent_2_93bf768a67117e873af5732ecf08dc78._comment | 7 + .../blog/day_260__Windows_dev_environment.mdwn | 46 + .../day_261__Windows_first_stage_complete.mdwn | 29 + .../blog/day_262__DOS_path_separators.mdwn | 14 + ...ent_1_45ecae90b22e31202c21083980d6b567._comment | 10 + doc/design/assistant/blog/day_263_catching_up.mdwn | 11 + ...ent_1_9023da0573dfc81644d68128adb331a7._comment | 8 + .../day_264__Windows_second_stage_complete.mdwn | 21 + ...ent_1_42a7502d6ece75520eb59a76fdb1e2f0._comment | 9 + ...ent_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment | 8 + ...ent_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment | 8 + ...ent_4_9ce106baf28b7f75f7f6febd7bfcea70._comment | 8 + .../assistant/blog/day_265__correctness.mdwn | 23 + ...ent_1_e8959a6df87eb92310947e66c7471e97._comment | 12 + ...ent_2_0cb953fcc085eedb34e65c227309ede7._comment | 8 + ...ent_3_df57628a8969af2995732e7ea2a0fae3._comment | 10 + .../assistant/blog/day_266__release_day.mdwn | 6 + ...ent_1_92c8d1d9216b46b07dfe69bbc77a923e._comment | 8 + .../blog/day_267__windows_autobuilder.mdwn | 9 + ...ent_1_978b584d86395f2f621b0e1f7c5e70d7._comment | 21 + ...ent_2_8f978d2811c8fbf11e3d12f245bdb52b._comment | 10 + .../assistant/blog/day_268__core_monad_change.mdwn | 9 + doc/design/assistant/blog/day_269__bugfixes.mdwn | 14 + .../assistant/blog/day_26__dying_drives.mdwn | 28 + .../assistant/blog/day_270__release_and_xmpp.mdwn | 39 + doc/design/assistant/blog/day_271__more_xmpp.mdwn | 31 + .../assistant/blog/day_272__fuzz_tester.mdwn | 37 + doc/design/assistant/blog/day_273-274__fun.mdwn | 19 + .../assistant/blog/day_275__working_hard_or.mdwn | 12 + .../assistant/blog/day_276__fuzzing_continues.mdwn | 12 + ...ent_1_f5dd0658511a1063c2eb025b0fe98426._comment | 14 + ...ent_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment | 10 + .../day_277__private_static_protected_void.mdwn | 19 + .../assistant/blog/day_278__winding_down.mdwn | 11 + .../blog/day_279__final_release_prep.mdwn | 14 + .../assistant/blog/day_27__robust_transfers.mdwn | 31 + .../blog/day_28-35__threaded_runtime_tarpit.mdwn | 17 + doc/design/assistant/blog/day_280__yesod.mdwn | 7 + ...ent_1_a42213a8cef71f2b54db18606028136d._comment | 8 + doc/design/assistant/blog/day_281__back.mdwn | 37 + ...ent_1_128809c5a2a9f5cc345a10fdbf55be01._comment | 8 + ...ent_2_6d0bbdf6ebaff9da399804570f0e606d._comment | 10 + .../assistant/blog/day_282-283__caught_up.mdwn | 18 + doc/design/assistant/blog/day_284__porting.mdwn | 13 + .../day_285__fixed_the_archive_directory_loop.mdwn | 23 + ...ent_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment | 25 + .../blog/day_286__Windows_test_suite.mdwn | 19 + doc/design/assistant/blog/day_287__niceness.mdwn | 13 + .../assistant/blog/day_288__success_stories.mdwn | 32 + ...nt_10_9ddf57b8ae0241268bb33bec1b169e4c._comment | 20 + ...nt_11_50b8a597bd8677608f2ef176443f23f3._comment | 10 + ...nt_12_f2df427cf3608377e9a52d8bdeadb26f._comment | 21 + ...nt_13_8762efed97f21eeba8f0a7be45bd924a._comment | 35 + ...nt_14_55e1bb15c3a93d582d110f8173ceefc2._comment | 9 + ...nt_15_5749aef8b585b293385b20b75c40f9d8._comment | 31 + ...nt_16_911c6d2764906cad7d6324835441ed34._comment | 12 + ...nt_17_eb6aa8af5aa70877255a11d132d51aba._comment | 10 + ...nt_18_9a57de4cea407a73b2d023d85afdccc6._comment | 12 + ...nt_19_1767c86067bee35941004282b96b8e95._comment | 10 + ...ent_1_22b28ca3d4d3283ad8c21ae052fb9752._comment | 11 + ...nt_20_1d47f3e1b9f0081649cedae4288bac83._comment | 8 + ...nt_21_31d3f58cad83cb1ecc4821a15ca258d8._comment | 14 + ...nt_22_b512bd2bf29dfaab6b36bf204518fdb6._comment | 8 + ...ent_2_343333356de20e170edb8020faa7400d._comment | 10 + ...ent_3_4e4034bec789543b562ac263df3e21dd._comment | 15 + ...ent_4_0c52794c77a9b7afc5112f5edf9cb793._comment | 8 + ...ent_5_7ca419aa3a187857b19268572d5df297._comment | 18 + ...ent_6_3edd56b3b04f19faba8d75cca285a662._comment | 10 + ...ent_7_146331ae2de25a6dc3595dffab9514de._comment | 12 + ...ent_8_72be9307e75eb120451f3d6ab7c8165e._comment | 8 + ...ent_9_c27eb0a4181e85a3eed41130402350bf._comment | 12 + .../assistant/blog/day_289__back_in_the_swing.mdwn | 16 + .../assistant/blog/day_290__https_release.mdwn | 17 + doc/design/assistant/blog/day_291__--all.mdwn | 32 + ...ent_1_eaa9fef19a035bef9c439e87d47c834b._comment | 17 + ...ent_2_90bbc26bf92048de7cbaf5fb719c9593._comment | 11 + ...ent_3_75006e9909425dcbf86415a9f7c90372._comment | 10 + ...ent_4_5440449bbc5a353f7430f72e19c35e92._comment | 8 + doc/design/assistant/blog/day_292__bugfixes.mdwn | 24 + ...ent_1_bbac3878d80f7540d229183c56664784._comment | 8 + ...ent_2_8c9e5291ceb257f3a938af0ad967c5d7._comment | 10 + ...ent_3_02f875e8edd30f47939249f16d92712b._comment | 8 + doc/design/assistant/blog/day_293__gpg_builds.mdwn | 32 + ...ent_1_4f152de8ea5aca4ec381d439e2a821f7._comment | 12 + ...ent_2_42f625638638bc875379f6c604d6f673._comment | 8 + .../assistant/blog/day_294__release_day.mdwn | 7 + .../assistant/blog/day_295__balls_in_the_air.mdwn | 13 + .../blog/day_296__new_crowdfunding_campaign.mdwn | 41 + ...ent_1_cccad1a5103c504d21d0f8e69bb39e1b._comment | 8 + ...ent_2_4fef7bd9c8e15cd57df365fadb95717f._comment | 8 + ...ent_3_0b9258a1f5079e53c60138f06d0c63b1._comment | 8 + ...ent_4_46183b97ca904bc06e46569c30db2edc._comment | 8 + .../assistant/blog/day_297__back_to_work.mdwn | 16 + ...ent_1_e300feb821bfe7b76b2cec4376d16ffa._comment | 8 + .../assistant/blog/day_298__exceptional.mdwn | 21 + doc/design/assistant/blog/day_299__bugfixing.mdwn | 8 + doc/design/assistant/blog/day_2__races.mdwn | 45 + doc/design/assistant/blog/day_300__new_logo.mdwn | 36 + ...ent_1_9fc64e33863b9fce00f6a03417a91e36._comment | 9 + ...ent_2_e8aac0298f90004e81492d2c7f85eda0._comment | 8 + ...ent_3_6308c767f6e4bf090102191c91520d04._comment | 8 + .../assistant/blog/day_301__direct_unannex.mdwn | 21 + doc/design/assistant/blog/day_302_release_day.mdwn | 6 + ...ent_1_fe6e572ba706e95188463d9f3e004d03._comment | 17 + doc/design/assistant/blog/day_303__oops.mdwn | 8 + .../assistant/blog/day_304__dropunused_safety.mdwn | 28 + ...ent_1_1bbcf6c74b6437c44ff8604401fb1432._comment | 10 + .../assistant/blog/day_305__interesting_bugs.mdwn | 21 + doc/design/assistant/blog/day_306__offtopic.mdwn | 2 + doc/design/assistant/blog/day_307__buuuugs.mdwn | 31 + doc/design/assistant/blog/day_308__ssh-agent.mdwn | 16 + ...ent_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment | 12 + doc/design/assistant/blog/day_309__filenames.mdwn | 17 + .../assistant/blog/day_310__release_day.mdwn | 18 + ...ent_1_1e008583cebd8e373e83729529914db7._comment | 8 + .../assistant/blog/day_311__Windows_porting.mdwn | 10 + ...ent_1_8e738f54a72557bee1e19970472b925c._comment | 8 + .../assistant/blog/day_312__DebConf_midpoint.mdwn | 30 + doc/design/assistant/blog/day_313__back.mdwn | 34 + ...ent_1_fbf3fdf9688c18156753d446facd942d._comment | 10 + doc/design/assistant/blog/day_314__quvi.mdwn | 27 + ...ent_1_3fdfb0742cb5422530ddd97b904f2a42._comment | 8 + doc/design/assistant/blog/day_315__backlog.mdwn | 12 + doc/design/assistant/blog/day_316__day_off.mdwn | 6 + doc/design/assistant/blog/day_317__misc.mdwn | 17 + .../assistant/blog/day_36__minimal_test_case.mdwn | 9 + doc/design/assistant/blog/day_37__back.mdwn | 64 + .../blog/day_39__twice_is_enemy_action.mdwn | 66 + doc/design/assistant/blog/day_3__more_races.mdwn | 26 + ...ent_1_d6015338f602b574a3805de5481fc45e._comment | 8 + ...ent_2_4d6b23fc6442e0ee0303523cb69d0fba._comment | 8 + ...ent_3_03f5b2344c2a47dea60086f217d60f9b._comment | 14 + ...ent_4_860e90e989ec022100001c65e353a91e._comment | 8 + doc/design/assistant/blog/day_40__dbus.mdwn | 100 + ...ent_1_43ed2a79629868b018ec9f54a32bcacc._comment | 12 + ...ent_2_6799f2baf6a6ce14b1fa76a8402840c0._comment | 10 + ...ent_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment | 10 + ...ent_4_3399ddad951c1a950281bb6941fc3f6f._comment | 8 + ...ent_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment | 12 + doc/design/assistant/blog/day_41__foo.mdwn | 46 + ...ent_1_ace21fa257a4c2fd412b6ff2944a23e8._comment | 10 + doc/design/assistant/blog/day_42__the_answer.mdwn | 27 + .../assistant/blog/day_43__simple_scanner.mdwn | 37 + .../assistant/blog/day_44__webapp_basics.mdwn | 83 + ...ent_1_d5fb67f373038e9f583cb2e1992bef67._comment | 18 + .../assistant/blog/day_45__long_polling.mdwn | 66 + ...ent_1_994bec0978324e268666073e8ff4f6ae._comment | 8 + ...ent_2_dfa164c86290899139491acccddd8b2b._comment | 10 + ...ent_3_5526c9dd4fd87da56cb8456083169f55._comment | 8 + ...ent_4_91630f5bf162dfd4fbb3920f1318535b._comment | 8 + ...ent_5_b3e41ba77f21e93a4e086483793bf5ce._comment | 10 + .../assistant/blog/day_45__long_polling/full.png | Bin 0 -> 55185 bytes .../assistant/blog/day_45__long_polling/phone.png | Bin 0 -> 41602 bytes .../assistant/blog/day_46__notification_pools.mdwn | 68 + .../assistant/blog/day_47__alert_messages.mdwn | 14 + doc/design/assistant/blog/day_48__intro.mdwn | 8 + .../blog/day_49__first_run_experience.mdwn | 39 + ...ent_1_e146cf06c8dd6303dd6a991f152a73fe._comment | 8 + ...ent_2_5d6adcf6782c02283bef6189582ee467._comment | 12 + ...ent_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment | 14 + ...ent_4_549b07bb02c07a5b1b95445b01758db2._comment | 14 + doc/design/assistant/blog/day_4__speed.mdwn | 47 + ...ent_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment | 8 + ...ent_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment | 8 + .../assistant/blog/day_50__directory_name.mdwn | 20 + ...ent_1_782cec95a8558a05b2b38a2d2302214d._comment | 8 + ...ent_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment | 8 + doc/design/assistant/blog/day_51__desktop.mdwn | 34 + .../assistant/blog/day_52__file_browser.mdwn | 21 + ...ent_1_cd000c2d56b60cc1f17b221322a32aa7._comment | 8 + ...ent_2_21d1da67cf9105a545583ba2302c10fb._comment | 7 + .../blog/day_54__adding_removable_drives.mdwn | 99 + ...ent_1_5de4f220a3534f55b1f2208d1d812d63._comment | 10 + ...ent_2_8dae1ed0a70acf9628b88692dc32ac5f._comment | 10 + doc/design/assistant/blog/day_55__alerts.mdwn | 10 + ...ent_1_6319045500a8a5e049304fdec5ff4cf4._comment | 8 + .../assistant/blog/day_56__transfer_control.mdwn | 8 + doc/design/assistant/blog/day_57__afk.mdwn | 40 + ...ent_1_70e1c9f925f040c1700d3e26bab373d5._comment | 9 + ...ent_2_c70d3faccfcebf47deb25e270498cb56._comment | 18 + ...ent_3_89020ebc6d31485339bdea41a872df3c._comment | 11 + ...ent_4_8b1f65f141ffd9813e7f5a3380f7f520._comment | 27 + .../blog/day_58__more_transfer_control.mdwn | 26 + doc/design/assistant/blog/day_59__dinner.mdwn | 10 + ...ent_1_0c1e2d69496473e7e4a2956a2814f5dd._comment | 9 + doc/design/assistant/blog/day_5__committing.mdwn | 57 + .../assistant/blog/day_60__taking_stock.mdwn | 40 + ...ent_1_6722f81ee084f1ea9e8fe47f34576397._comment | 8 + .../blog/day_61__network_connection_detection.mdwn | 36 + ...ent_1_09b58f41a8d48f218619711ee19511ac._comment | 8 + .../assistant/blog/day_62__smarter_syncing.mdwn | 21 + .../assistant/blog/day_63__transfer_retries.mdwn | 26 + ...ent_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment | 10 + .../assistant/blog/day_64__syncing_robustly.mdwn | 33 + .../assistant/blog/day_65__transfer_polish.mdwn | 33 + doc/design/assistant/blog/day_66__the_merge.mdwn | 19 + ...nt_10_eeccf4e73cc321542a1fe4780805a81e._comment | 12 + ...ent_1_a34e89316d1662826848f31061c4e46b._comment | 8 + ...ent_2_09e244d23d05052fa2b11a7181888366._comment | 8 + ...ent_3_3961a03e167903959b96b054835613f6._comment | 8 + ...ent_4_12a57af9f580918818b4a9f68396d5c4._comment | 23 + ...ent_5_8ce638960012367c888e018a5f05db19._comment | 8 + ...ent_6_f461b856b940e6914bcd2b681cf9505f._comment | 13 + ...ent_7_6e73aca1fc1747d0e742e054b88b5d78._comment | 12 + ...ent_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment | 19 + ...ent_9_c06dab4d78122c85beeaf300ffc3e376._comment | 8 + .../assistant/blog/day_67__progress_bars.mdwn | 10 + doc/design/assistant/blog/day_68__transfers.mdwn | 15 + ...ent_1_5282960c0b553fbc0f411345b9745324._comment | 14 + doc/design/assistant/blog/day_69__build_fixes.mdwn | 7 + doc/design/assistant/blog/day_6__polish.mdwn | 50 + .../assistant/blog/day_70__adding_ssh_remotes.mdwn | 66 + ...nt_10_2fac85357ac8feccff82beabd3791439._comment | 13 + ...nt_11_e9e496005fd1bf5a10c9e286b83e51fa._comment | 8 + ...ent_1_913e6ae7c8f7db90b9767ec35fc84205._comment | 23 + ...ent_2_634ca3c236e2062289e7df5f0d77a3c5._comment | 8 + ...ent_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment | 16 + ...ent_4_b15499722a655489f9ea60ff9d4c47c6._comment | 12 + ...ent_5_8ea48276f060e75d9f40617d2a1ccd08._comment | 12 + ...ent_6_9b8bf7e9fa715977fbeb98087deefd1a._comment | 10 + ...ent_7_42e09eacdc10c7cf579bfc6470b5117c._comment | 8 + ...ent_8_6c02f31063b3d399d1b4f823bd6543ce._comment | 16 + ...ent_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment | 10 + doc/design/assistant/blog/day_71__ssh_probing.mdwn | 26 + ...ent_1_56a0c29f7454cfca5cc30b2849e6e942._comment | 8 + ...ent_2_f3bd3e366c92c833c7e217da125481b8._comment | 8 + ...2__remote_ssh_server_configurator_finished.mdwn | 34 + .../blog/day_73__rsync.net_configurator.mdwn | 17 + .../assistant/blog/day_74__bits_and_peices.mdwn | 7 + .../assistant/blog/day_75__zeromq_and_pairing.mdwn | 50 + doc/design/assistant/blog/day_76__pairing.mdwn | 16 + ...ent_1_09665f269343422cd18051fad1a8c19e._comment | 24 + ...ent_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment | 10 + ...ent_3_a8b6a8432da20c468c633da8e7cbc2f3._comment | 8 + ...ent_4_36a428a2e1803f4391b821d1892f0cd7._comment | 10 + ...ent_5_11f332fe2050d8c1416e71f9e85ba280._comment | 8 + ...ent_6_973aeb656b78eca97474ea1a3f5b57b7._comment | 12 + ...ent_7_03d2b3343f34377a4d6171e06b7609f6._comment | 8 + .../assistant/blog/day_77_alert_buttons.mdwn | 21 + .../assistant/blog/day_78__pairing_continued.mdwn | 8 + .../assistant/blog/day_79__pairing_finished.mdwn | 33 + doc/design/assistant/blog/day_7__bugfixes.mdwn | 45 + .../assistant/blog/day_7__bugfixes/profile.png | Bin 0 -> 47098 bytes .../assistant/blog/day_7__bugfixes/profile2.png | Bin 0 -> 230937 bytes .../assistant/blog/day_80__default_backend.mdwn | 14 + ..._81__enabling_pre-existing_special_remotes.mdwn | 34 + .../blog/day_82__git-annex_branch_work.mdwn | 26 + doc/design/assistant/blog/day_83__3-way.mdwn | 73 + .../assistant/blog/day_84__deferred_downloads.mdwn | 33 + .../blog/day_85__more_foundation_work.mdwn | 17 + .../assistant/blog/day_86__towards_the_beta.mdwn | 33 + .../blog/day_87__more_progress_progress.mdwn | 28 + .../day_88__progressbars_still_progressing.mdwn | 18 + .../assistant/blog/day_89__final_polish.mdwn | 24 + doc/design/assistant/blog/day_8__speed.mdwn | 67 + ...ent_1_a3dba537b276d5737abc8cb93f1965f4._comment | 10 + doc/design/assistant/blog/day_90__beta.mdwn | 16 + ...ent_1_5f2a3b18ad7558abe04f51534a29ff13._comment | 9 + ...ent_2_961c4eba97f4eac75174244d6b2b00c0._comment | 8 + ...ent_3_c76675a4633cbbe347ed42c222918d38._comment | 24 + ...ent_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment | 8 + ...ent_5_99fbc9feac62e66a12b0d357cf86ccc1._comment | 8 + doc/design/assistant/blog/day_91__break.mdwn | 7 + doc/design/assistant/blog/day_92__S3.mdwn | 23 + ...ent_1_eda656247d11cea7fbed2e33137a39e5._comment | 10 + ...ent_2_8249d2d9521e44c674da3fda74be077a._comment | 10 + .../assistant/blog/day_93__OSX_standalone_app.mdwn | 23 + .../assistant/blog/day_93__easy_install.mdwn | 34 + ...ent_1_d4f7de723c98577ef28d89ee6b87fd13._comment | 10 + ...ent_2_6337b341c1cfb2132b59704394e57b36._comment | 8 + .../assistant/blog/day_95__repository_groups.mdwn | 21 + .../blog/day_96__revisiting_file_adds.mdwn | 24 + ...ent_1_da3ca47041168b6c82aeb2c18acc5017._comment | 8 + doc/design/assistant/blog/day_97__stuffing.mdwn | 14 + .../assistant/blog/day_98__preferred_content.mdwn | 44 + ...ent_1_2136618e3515d0ac6369a41f1934ec2a._comment | 17 + ...ent_2_5f6db00e69628bf2f72b0e6f2981a49b._comment | 14 + doc/design/assistant/blog/day_99_shotgun.mdwn | 70 + ...ent_1_12bb8f54bb13ea20ac4187a2301d77ca._comment | 10 + doc/design/assistant/blog/day_9__correctness.mdwn | 30 + ...ent_1_564a39cb976767e2c0a9c74fabe10be4._comment | 8 + ...ent_2_77924e9d50b40f05e792e427a25849a6._comment | 9 + ...ent_3_92bd86cd06d579e23800af2e5c66a291._comment | 8 + ...ent_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment | 10 + ...ent_5_208f9dd3e1d92555b05c29159538a901._comment | 14 + ...ent_6_90cc6b60718896fb175919417600fdf9._comment | 8 + doc/design/assistant/chunks.mdwn | 7 + doc/design/assistant/cloud.mdwn | 45 + ...ent_1_4997778abc171999499487b71b31c9ba._comment | 16 + ...ent_2_08da8bc74a4845e354dca99184cffd70._comment | 8 + ...ent_3_faafd1266301997b1822d215ec8e8d8c._comment | 8 + ...ent_4_3eb557d5439831f6e0032944d12c02cf._comment | 12 + ...nt_10_f2233fad55c20686cf299bf6788f1f23._comment | 10 + ...nt_11_a38f0f21c2346e65b786d791b6829f9b._comment | 12 + ...nt_12_5e991177d6577384f39a36ae02f5f574._comment | 13 + ...nt_13_f8625c6f43b58847840df338a73b7972._comment | 7 + ...nt_14_c37ef5931b0f5c1f808083e0d636a208._comment | 11 + ...nt_15_68c98a27083567f20c2e6bc2a760991b._comment | 9 + ...nt_16_8e6788c817c60371d2a2f158e1a65f87._comment | 8 + ...nt_17_97bdfacac5ac492281c9454ee4c0228e._comment | 8 + ...nt_18_53137b2df4913496c0afb2d895aa4ee2._comment | 8 + ...nt_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment | 8 + ...ent_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment | 8 + ...nt_20_099da245e3276fa84f5e14312d186621._comment | 8 + ...ent_2_6d3552414fdcc2ed3244567e6c67989d._comment | 7 + ...ent_3_05223be50c889b2ed6bc4abf74116450._comment | 9 + ...ent_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment | 9 + ...ent_5_f4e9af3fed6c27e8ff39badb9794064d._comment | 12 + ...ent_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment | 10 + ...ent_7_609d38e993267195a80fecd84c93d1e2._comment | 8 + ...ent_8_22b818e1a2a825efb78139271a14f944._comment | 10 + ...ent_9_d052e2142da8b4838fb1edf791ea23ae._comment | 10 + doc/design/assistant/configurators.mdwn | 20 + doc/design/assistant/deltas.mdwn | 9 + ...ent_1_bdb477af913c9782c0e8509e6b294b6e._comment | 8 + ...ent_2_71889d15ba20ebb0fe13080c68162a5b._comment | 11 + doc/design/assistant/desymlink.mdwn | 145 + ...ent_1_f1bfe250b7f872359f7075998b6e42e3._comment | 11 + ...ent_2_5e876edfe9853645f761b5ed9b5021aa._comment | 9 + ...ent_3_538561d74371e53c2f8df7f5ebdf58a8._comment | 8 + ...ent_4_586ecaa800e6c162377c937da5e65440._comment | 12 + ...ent_5_8fc703de67814cf2aec2a908852298a4._comment | 10 + ...ent_6_1b473ad89494afb82250af4b6df5f5c9._comment | 22 + doc/design/assistant/disaster_recovery.mdwn | 185 + ...ent_1_955dc807196863da23aa8dbd15e04364._comment | 10 + doc/design/assistant/encrypted_git_remotes.mdwn | 22 + doc/design/assistant/gpgkeys.mdwn | 40 + ...ent_1_a14427f88c9fd8e25ad8708146bb4bff._comment | 15 + doc/design/assistant/inotify.mdwn | 234 + ...ent_1_3d3ff74447452d65c10ccc3dbfc323cd._comment | 7 + ...ent_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment | 7 + ...ent_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment | 8 + ...ent_4_32be58b4c3b17a4ea539690d2fb45159._comment | 12 + ...ent_5_0cdd3046d90ad2012025d846ece0731e._comment | 8 + ...ent_6_e197d5d0d853572ec1f2e5985762e60d._comment | 9 + ...ent_7_00809aaad6b68f189a9cc42af810a0a6._comment | 8 + doc/design/assistant/leftovers.mdwn | 17 + ...ent_1_b20c88bb3c583a32023c1f6b6dc9486d._comment | 8 + doc/design/assistant/more_cloud_providers.mdwn | 24 + doc/design/assistant/pairing.mdwn | 83 + doc/design/assistant/partial_content.mdwn | 36 + ...ent_1_58c4faa321a5bb71adf9fdee079849f4._comment | 18 + doc/design/assistant/polls.mdwn | 1 + doc/design/assistant/polls/2013_user_survey.mdwn | 1 + doc/design/assistant/polls/Android.mdwn | 18 + ...ent_1_fa6c409833f28c67da105d25f4a440e0._comment | 8 + .../assistant/polls/Android_default_directory.mdwn | 7 + ...ent_1_d39655091ac3ed51a9d4325d86b23ad7._comment | 10 + ...ent_2_2f1eaae95075db26488517720afd1c63._comment | 8 + ...ent_3_b484012f60789be73d7d5b338cff6203._comment | 10 + doc/design/assistant/polls/goals_for_April.mdwn | 17 + ...ent_1_9f81fa96db5970a4be0828c74a6d2d55._comment | 22 + ...ent_2_d8956d220ccacff3d2f6cbeb15718459._comment | 28 + ...ent_3_aadad6dfd56d068d2e377606910c006f._comment | 8 + .../polls/prioritizing_special_remotes.mdwn | 16 + ...ent_1_dd9280df27848a7ff132f5809dab0a79._comment | 8 + ...ent_2_370e0b9c43486ee96c825f9155eebde4._comment | 8 + ...ent_3_883a003b9c552b89f191135c582f99aa._comment | 14 + ...ent_4_746006c3fffc7f917c4526fd688051f7._comment | 8 + ...eventing_me_from_using_git-annex_assistant.mdwn | 16 + ...nt_10_10a4839a05be39ced54ffbe880a588bb._comment | 25 + ...nt_11_ac91d866f11c66dd8c86e2cd1a368c85._comment | 10 + ...nt_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment | 29 + ...nt_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment | 12 + ...nt_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment | 16 + ...nt_15_c437adeaccf0b3d134e0f81c64e25b9f._comment | 14 + ...nt_16_6e3fce3a32ab346dc3d0fd4b69967536._comment | 8 + ...nt_17_1b7233d88593d0d99b26ea3e7af20d9c._comment | 8 + ...nt_18_a23d5a0e2718b8e486f036fe8a413b36._comment | 10 + ...nt_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment | 18 + ...ent_1_00a0de8190d946caaeeca3b44646146f._comment | 16 + ...nt_20_199c9807499470771af6cbca6d034cfa._comment | 8 + ...nt_21_9185b0e05b1b1997533694da1de83073._comment | 22 + ...ent_2_35f6f121e54260cb960211a6e2e51e8e._comment | 14 + ...ent_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment | 25 + ...ent_4_0d988280865caae498a3b693b6342e37._comment | 16 + ...ent_5_ac8fe3768c30dd7999c183500f8567bb._comment | 19 + ...ent_6_36832de705a2bebf8dc6e65dcd661731._comment | 15 + ...ent_7_3618067e473577a112e36970ca71e0ab._comment | 12 + ...ent_8_07a13b6f000ddc0ac4472b863d8b50bd._comment | 14 + ...ent_9_e15eb407d988fda363296c8b566cc8fb._comment | 12 + doc/design/assistant/progressbars.mdwn | 43 + ...ent_1_3ea263b1f334e8e38e14f00a96202988._comment | 8 + doc/design/assistant/rate_limiting.mdwn | 57 + doc/design/assistant/screenshot/firstrun.png | Bin 0 -> 54347 bytes doc/design/assistant/screenshot/intro.png | Bin 0 -> 50730 bytes doc/design/assistant/sshpassword.mdwn | 65 + ...ent_1_24399abe0a0c1de271490ee15e064760._comment | 8 + ...ent_2_36a811bca209c7ac8a44d64bf8bc5bf3._comment | 8 + doc/design/assistant/syncing.mdwn | 220 + ...ent_1_c70156174ff19b503978d623bd2df36f._comment | 19 + ...ent_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment | 8 + ...ent_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment | 80 + doc/design/assistant/syncing/efficiency.mdwn | 77 + doc/design/assistant/telehash.mdwn | 90 + ...ent_1_8b08b5c30e5aea3fc4599f856fd25df5._comment | 8 + doc/design/assistant/todo.mdwn | 4 + doc/design/assistant/transfer_control.mdwn | 123 + ...ent_1_d5adaef4712913dc0263d4ebafb79320._comment | 15 + ...ent_2_3b51474fefa6c0d19055046e06af196d._comment | 14 + ...ent_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment | 8 + doc/design/assistant/upgrading.mdwn | 52 + doc/design/assistant/webapp.mdwn | 65 + ...ent_1_bab6f6fa720273c0f9700a3765150189._comment | 8 + ...ent_2_3cf0cf460c7869d0cc22940fcc84aec4._comment | 10 + ...ent_3_428e153135f7a64215730719207d82c4._comment | 8 + ...ent_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment | 10 + doc/design/assistant/windows.mdwn | 33 + ...ent_1_f4b829318b182e1cec29f13babb6498e._comment | 10 + doc/design/assistant/xmpp.mdwn | 136 + ...ent_1_f20650f93d7f0ca39b9ba3ce0380193f._comment | 10 + ...ent_2_8c22839a8f5912b4a817415c4a359697._comment | 8 + ...ent_4_773102522f21844cffc841e6cde9229e._comment | 8 + doc/design/assistant/xmpp_security.mdwn | 29 + ...ent_1_c714e86553c02600249795efb224be8a._comment | 10 + doc/design/caching_database.mdwn | 124 + doc/design/encryption.mdwn | 126 + ...ent_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment | 12 + ...ent_2_a610b3d056a059899178859a3a821ea5._comment | 10 + ...ent_3_cca186a9536cd3f6e86994631b14231c._comment | 12 + ...ent_4_8f3ba3e504b058791fc6e6f9c38154cf._comment | 10 + ...ent_5_520e60aa53217b5ba428d4c05d897dee._comment | 16 + ...ent_6_d677fead0fe0c543f48f07d85f83f592._comment | 14 + ...ent_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment | 14 + doc/design/external_special_remote_protocol.mdwn | 293 ++ ...nt_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment | 8 + ...nt_12_241e57092d9e5631ac0ec4dd962477a6._comment | 12 + ...nt_12_e3029c65d34f78272bc11961ebfd8237._comment | 10 + ...nt_13_472748f03ba8dad773da7f35b70cb6e4._comment | 15 + ...nt_14_71c3e21a72222250bab933e1c9167fbc._comment | 14 + ...nt_15_c77386deddc64b2028d9c3a7393d4df7._comment | 10 + ...ent_1_5baff75d278394a8818c348fb4f13b8a._comment | 10 + ...ent_2_70429b7c4f1e4083a9d5a6e2e238056d._comment | 8 + ...ent_3_c763e44d06d9f50f0d357889b180b819._comment | 15 + ...ent_4_20ff41d82b5f1872698a5b24adcd0c41._comment | 12 + ...ent_5_3ee158e548002badae5bf44dc0442626._comment | 13 + ...ent_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment | 12 + ...ent_7_edb649d0019a061ef7bf6534a444429d._comment | 16 + ...ent_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment | 8 + ...ent_9_15c4cfe064be37cc104dcb6aa049a449._comment | 14 + doc/design/gcrypt.mdwn | 8 + doc/design/git-remote-daemon.mdwn | 173 + ...ent_1_bfa8f33a3fdb6e271dfbdd0378b5d364._comment | 16 + doc/design/metadata.mdwn | 196 + ...ent_1_22ed80bd8eabaa836e9dfc2432531f04._comment | 22 + ...ent_2_03ae28acedbe1fa45c366b30b58fcf48._comment | 14 + ...ent_3_ee850df7d3fa4c56194f13a6e3890a30._comment | 12 + ...ent_4_c32ade1524487e5fdc6f83b2db39f04c._comment | 8 + ...ent_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment | 8 + ...ent_6_fa51ae544b193122334dbae7960ab3d9._comment | 15 + doc/design/preferred_content.mdwn | 21 + doc/design/requests_routing.mdwn | 100 + ...ent_1_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 + ...ent_1_f3cc7a25af4c59fda3924c737a789419._comment | 8 + ...ent_2_e47476c80af02a2e9cf76c53fdbb8534._comment | 9 + ...ent_3_b57956a8ce372d620f21ea9a497e8013._comment | 8 + ...ent_4_812b630df01ac35254e3c4e677554e2b._comment | 8 + ...ent_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment | 8 + ...ent_6_4f87e2ab119f3cd81266159f02952188._comment | 9 + ...ent_7_a865216046aa91a47d0d2b2f0668ea89._comment | 12 + ...ent_8_3f7045a00905b4287d950b08d5a77a82._comment | 9 + doc/devblog/day_100__git-annex_sync_--content.mdwn | 4 + doc/devblog/day_101__old_mistakes.mdwn | 23 + ...ent_1_2c6e991efde3296450189b2821f2ccc3._comment | 17 + ...ent_2_524690d69056737dd296e4f7626737d2._comment | 12 + doc/devblog/day_102__cleanups.mdwn | 10 + doc/devblog/day_103__unused.mdwn | 34 + doc/devblog/day_104__unused_II.mdwn | 7 + ...ent_1_a693a56123497a39c30cbd35b8e35bce._comment | 10 + ...ent_2_9833fb9daa50bc838cc46ca2f6c16580._comment | 10 + ...ent_3_873a882ec1ddc3be473473cb224a9040._comment | 12 + ...ent_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment | 13 + ...ent_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment | 12 + ...ent_6_0ed4023c9c249024fe0454fc5bab3b14._comment | 10 + doc/devblog/day_105__locking.mdwn | 30 + doc/devblog/day_106__catching_up.mdwn | 5 + doc/devblog/day_107__TDD.mdwn | 10 + .../day_108__new_use_for_location_tracking.mdwn | 20 + doc/devblog/day_109__elimintating_absNormPath.mdwn | 18 + doc/devblog/day_10__lazy_Sunday.mdwn | 23 + doc/devblog/day_110__release_prep.mdwn | 25 + doc/devblog/day_111__windows_beta_release.mdwn | 6 + doc/devblog/day_112__metadata_design.mdwn | 18 + doc/devblog/day_113__metadata_groundwork.mdwn | 9 + doc/devblog/day_114__windows_porting.mdwn | 8 + doc/devblog/day_115__windows_porting.mdwn | 17 + doc/devblog/day_116__views.mdwn | 54 + doc/devblog/day_117__views_implemented.mdwn | 76 + doc/devblog/day_118__views_refined.mdwn | 7 + doc/devblog/day_119__catching_up.mdwn | 15 + ...ent_1_8aa413e75cab411b0aec254f0f33ebb9._comment | 8 + ...ent_2_db31d08690730836ce6277e797fcae1d._comment | 8 + ...ent_3_d44da76b18f53a5f51b46e3e15090a48._comment | 8 + doc/devblog/day_11__webapp_encrypted_drives.mdwn | 12 + doc/devblog/day_120__more_metadata.mdwn | 17 + .../day_121__special_remote_maintenance.mdwn | 23 + doc/devblog/day_122_more_windows_porting.mdwn | 4 + doc/devblog/day_123__stuck.mdwn | 13 + doc/devblog/day_124__day_off.mdwn | 13 + doc/devblog/day_125__metadata_and_views.mdwn | 11 + doc/devblog/day_128__release_prep.mdwn | 27 + doc/devblog/day_12__gpg_key_generation.mdwn | 35 + ...ent_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment | 8 + doc/devblog/day_130__post_release.mdwn | 17 + doc/devblog/day_131__more_bug_squashing.mdwn | 11 + doc/devblog/day_132__database_musings.mdwn | 17 + doc/devblog/day_133__db_and_bugfixes.mdwn | 20 + .../day_134-135__avoiding_the_turing_tarpit.mdwn | 18 + doc/devblog/day_136__frustrating_day.mdwn | 10 + ...y_137-138__bug_triage_and_too_much_windows.mdwn | 15 + doc/devblog/day_139-140__traveling.mdwn | 17 + .../day_13__encrypted_sneakernet_working.mdwn | 13 + doc/devblog/day_141__f-droid_sprint.mdwn | 3 + ...ent_1_1cc76207020ac478747117c76d7b5f9c._comment | 8 + doc/devblog/day_142__digging_out.mdwn | 13 + doc/devblog/day_143__foolish_hiatus.mdwn | 20 + doc/devblog/day_144__catching_up.mdwn | 12 + ...ent_1_311a7245dd12f1a7e432168d16041348._comment | 8 + doc/devblog/day_145__a_plan.mdwn | 16 + ...ent_1_c0ceea77443be1172527ed8549f000a4._comment | 10 + .../day_146__halfway_to_git-remote-daemon.mdwn | 17 + doc/devblog/day_147__git-annex_remotedaemon.mdwn | 5 + doc/devblog/day_148__too_many_documents.mdwn | 8 + doc/devblog/day_149__remote_control_working.mdwn | 15 + doc/devblog/day_149__signal.mdwn | 16 + .../day_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 + doc/devblog/day_153__remotedaemon_has_landed.mdwn | 10 + ...ent_1_f19ae6b3d6f33a68e4ffe0c32f788745._comment | 13 + ...ent_2_fbf0c50f772e958af638d2b72dac73f5._comment | 10 + doc/devblog/day_154__catching_up.mdwn | 13 + doc/devblog/day_155__missing_bits.mdwn | 27 + ...ent_1_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 + ...outing_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 + ...ng_the_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 + doc/devblog/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 + ...ent_1_820d29f84dade09b0e7bb7435c52fcb8._comment | 12 + .../day_178-179__screencast_and_what_next.mdwn | 12 + ...ent_1_eeba788fed45cb22f9cc2a738ceaa074._comment | 8 + ...ent_2_d44e67e34615c7b00e29f307556cdd06._comment | 8 + doc/devblog/day_180__porting.mdwn | 13 + ...ent_1_133875f4435a298b85ddfb8a2cc11a7a._comment | 9 + doc/devblog/day_181__tricky_merge.mdwn | 8 + doc/devblog/day_182__service.mdwn | 6 + doc/devblog/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 + ...ent_1_288b736adf392acd0f45667b2980138d._comment | 11 + ...ent_2_d1d79e93ac420f6b3a6f8a622e8e00bd._comment | 8 + ...ent_3_8ca17a51b10b4e4a63d0672d5ce29024._comment | 8 + doc/devblog/day_187__release_prep.mdwn | 10 + ...ent_1_206692d16177c2a9ca11c0eeff545697._comment | 13 + ...ent_2_961fb35d9cf7d5e518f8d0bddb8626a6._comment | 8 + doc/devblog/day_188__back_sans_laptop.mdwn | 5 + doc/devblog/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 + ...ent_1_91ce3dc707ba1ba7c5d9e57e20ffce40._comment | 8 + doc/devblog/day_199__ten_minute_cycle.mdwn | 6 + doc/devblog/day_19__moving_on.mdwn | 37 + ...ent_1_870106f671f9a055b81e6fc83e0850b5._comment | 8 + ...ent_2_fad055c8860385ac6c012f897c96408f._comment | 10 + ...ent_3_69e47d612159587f080ab761566d1830._comment | 18 + doc/devblog/day_1__inauspicious_beginning.mdwn | 11 + ...ent_1_cc4dea43caf3126c6f814b589b701d70._comment | 10 + .../day_20__gcrypt_and_git-annex-shell.mdwn | 14 + doc/devblog/day_21__bugfix_day.mdwn | 5 + doc/devblog/day_22__gcrypt_on_rsync.net.mdwn | 20 + doc/devblog/day_23__GNU_day.mdwn | 23 + doc/devblog/day_24__nearly_done_with_gcrypt.mdwn | 23 + doc/devblog/day_25__finishing_up_gcrypt.mdwn | 25 + .../day_26__gcrypt_really_done_this_time.mdwn | 17 + doc/devblog/day_27__locking_fun.mdwn | 49 + ...ent_1_0eb247235fbf8f563934f3548e1d2e10._comment | 8 + ...ent_2_e8b1dfe1b0641e031d05733448b7bc8b._comment | 8 + ...ent_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment | 18 + ...ent_4_0759644baf26b75f4e48dbb387d725a5._comment | 10 + doc/devblog/day_28__lazy_saturday.mdwn | 17 + doc/devblog/day_29__scheduling.mdwn | 10 + doc/devblog/day_2__new_laptop.mdwn | 8 + ...ent_1_93447dbd4eb09b4db96770644ea663cb._comment | 10 + ...ent_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment | 8 + doc/devblog/day_30__cronner.mdwn | 17 + ...ent_1_53dfd9310e92f5225db52a13e20a46d4._comment | 10 + ...ent_2_f98357c6f7a6da23873ac27c2e1e9638._comment | 10 + doc/devblog/day_31__blah.mdwn | 17 + doc/devblog/day_32__fsck_config_UI.mdwn | 20 + doc/devblog/day_33__fsck_on_connect.mdwn | 9 + doc/devblog/day_34__wrapping_up_fsck.mdwn | 7 + doc/devblog/day_35__anacron_and_bugfixing.mdwn | 15 + doc/devblog/day_36__bugfixing.mdwn | 1 + doc/devblog/day_37__long_day.mdwn | 6 + doc/devblog/day_38__starting_git_repo_repair.mdwn | 11 + ...ent_1_321468d9686db5dde072500bdaeb7d29._comment | 10 + doc/devblog/day_39__git-recover-repository.mdwn | 54 + doc/devblog/day_3__gcrypt_uuids.mdwn | 63 + doc/devblog/day_40__another_fine_mess.mdwn | 15 + doc/devblog/day_41__onward.mdwn | 17 + ...ent_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment | 8 + ...ent_2_33149e424cd5f03fac376288bcc4dfdc._comment | 8 + ...ent_3_3b07503bd79089ad3ce3ddd7535ed116._comment | 14 + doc/devblog/day_42__repair_milestone.mdwn | 35 + doc/devblog/day_43__bugfix_day.mdwn | 26 + .../day_44__automatic_removable_drive_repair.mdwn | 16 + doc/devblog/day_45__command_line.mdwn | 9 + doc/devblog/day_46__wrapping_up_the_month.mdwn | 18 + .../day_47__fell_off_the_blogging_wagon.mdwn | 3 + doc/devblog/day_48__direct_mode_guard_design.mdwn | 29 + ...ent_1_ec0147ccc55bad3a38652383f4098a65._comment | 8 + .../day_49__direct_mode_guard_implementation.mdwn | 14 + ...ent_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment | 8 + doc/devblog/day_4__unexpected_windows_day.mdwn | 10 + doc/devblog/day_50__grab_bag.mdwn | 34 + ...ent_1_01846f6494fe843889391fd09fd127a0._comment | 8 + ...ent_2_12736014aa2c1af81e4b83072505e7d5._comment | 8 + .../day_51__direct_mode_guard_finished.mdwn | 6 + doc/devblog/day_52__slowly_but_surely.mdwn | 5 + doc/devblog/day_54__android_bisection_minions.mdwn | 9 + ...ent_1_bea8fbe2b87d4a4865b92fa796298fa0._comment | 8 + doc/devblog/day_55__fireside_porting.mdwn | 22 + ...ent_1_d690a52db82f9594d99ae65fe51e1f1a._comment | 8 + doc/devblog/day_56__git-annex_user_survey.mdwn | 20 + doc/devblog/day_57__mavericks.mdwn | 14 + doc/devblog/day_58__urgle.mdwn | 16 + ...ent_1_bd279f58f614b103a53215dfb0211007._comment | 12 + doc/devblog/day_59__release_day.mdwn | 11 + .../day_5__gcrypt_special_remote_part_1.mdwn | 7 + doc/devblog/day_60__damage_driven_development.mdwn | 36 + .../day_61__damage_driven_development__II.mdwn | 15 + doc/devblog/day_62__upgrade_alerts.mdwn | 22 + ...ent_1_cdb44aaa1d2a784a72613cbf16038f89._comment | 8 + ...ent_2_b08bb946e4760d7f03b45c852c745b2e._comment | 8 + doc/devblog/day_63__leverage.mdwn | 24 + doc/devblog/day_64__overkill.mdwn | 31 + ...ent_1_e1db7678aae37af281d31ae211677786._comment | 10 + ...ent_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment | 8 + doc/devblog/day_65__wrapping_up_upgrades.mdwn | 5 + doc/devblog/day_66__upgrade_testing.mdwn | 17 + doc/devblog/day_67_thanksgiving_rush.mdwn | 19 + doc/devblog/day_68__bits_and_pieces.mdwn | 14 + doc/devblog/day_69__catching_up.mdwn | 14 + doc/devblog/day_6__gcrypt_fully_working.mdwn | 8 + ...ent_1_136bb7537a9ba93d400ce6f6ea1932ac._comment | 8 + ...ent_2_1f8faa65bbd56a12588b43a5bc822d96._comment | 10 + .../day_70__preliminary_user_survey_analysis.mdwn | 104 + doc/devblog/day_71__that_was_unexpected.mdwn | 30 + doc/devblog/day_72__windows_webapp_not.mdwn | 22 + doc/devblog/day_73__EvilLinker.mdwn | 28 + doc/devblog/day_74__so_close.mdwn | 20 + ...ent_1_b1aa185734c3d74830b81def4fe63bff._comment | 10 + doc/devblog/day_75__hallelujah.mdwn | 8 + ...ent_1_df04c456e99d47743494a18c1badba8c._comment | 8 + doc/devblog/day_76__results.mdwn | 15 + doc/devblog/day_77__it_builds.mdwn | 8 + doc/devblog/day_78__desidetracked.mdwn | 34 + doc/devblog/day_79__catch_up.mdwn | 3 + doc/devblog/day_7__release_day.mdwn | 10 + ...ent_1_12bb94d903868ecddb3e348c9c4afeaf._comment | 8 + ...ent_2_d3e38d6f6bba179dab40d4d75ff061de._comment | 8 + doc/devblog/day_80__plumbing.mdwn | 9 + doc/devblog/day_81__more_standalone.mdwn | 15 + ...ent_1_25ceb116406b55a8ff28f7b392806bc9._comment | 10 + doc/devblog/day_82__rpi_and_synology.mdwn | 21 + ...ent_1_d154ddcf22027fd06acf9da73e12c006._comment | 8 + doc/devblog/day_83__armel_webapp.mdwn | 19 + doc/devblog/day_84__ho_uh_oh.mdwn | 11 + ...85__external_special_remote_protocol_types.mdwn | 25 + ...86__external_special_remote_implementation.mdwn | 11 + ...ent_1_5116bcf4b60030cb46683df94a75d7ee._comment | 8 + ...ent_2_7b6e734f785fbd9db7883b63150023dc._comment | 8 + .../day_87__external_special_remotes_done.mdwn | 16 + doc/devblog/day_88__lazy_sunday.mdwn | 15 + doc/devblog/day_89__reflections.mdwn | 18 + doc/devblog/day_8__ill.mdwn | 20 + doc/devblog/day_90__slow_start.mdwn | 23 + doc/devblog/day_91__wintry_mix.mdwn | 11 + doc/devblog/day_92-93__reconnection.mdwn | 34 + doc/devblog/day_94__leaks.mdwn | 12 + doc/devblog/day_95__reconnection_revisited.mdwn | 13 + ...ent_1_c1106e573fcf9f3d4524c0e4f4254790._comment | 8 + ...ent_2_40478739f95e0b56ce0103db6e405ef4._comment | 10 + doc/devblog/day_96__catching_up.mdwn | 7 + .../day_97__exciting_telehash_possiblities.mdwn | 20 + ...ent_1_7c775d93cbeed0d553e224751d30fbaa._comment | 10 + doc/devblog/day_98__old_bug.mdwn | 17 + doc/devblog/day_99__catching_up_again.mdwn | 19 + ...ent_1_b871bf0606dc29be9b8c2e5dc150f708._comment | 10 + ...ent_2_c8363d47223e7bb899420e800bde3e27._comment | 8 + doc/devblog/day_9__Friday_the_13th.mdwn | 21 + ...ent_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment | 12 + doc/devblog/day__126-127__merge_fixes.mdwn | 61 + doc/devblog/moving_blogs.mdwn | 5 + ...ent_1_6caa7e67461a6ea5de8155ae9cf75fab._comment | 8 + ...ent_2_e3e2048fc2397b87a2f29c9fe49394cb._comment | 10 + doc/devblog/whither_XMPP.mdwn | 30 + doc/direct_mode.mdwn | 93 + ...nt_11_1c79c93f4b17cfc354ab920e3775cc60._comment | 26 + ...nt_12_1b5218fdb6ee362d6df68ff1229590d4._comment | 10 + ...nt_12_7d507b6f87085a19d8dd5014f580922b._comment | 24 + ...nt_13_5169c5541970d3b3bc1e080e07539b22._comment | 8 + ...nt_13_55108ac736ea450df89332ba5de4a208._comment | 12 + ...nt_14_03a02e689d92faa596de98e02b2ffe28._comment | 10 + ...nt_14_ff4ffc2aabc5fd174d7386ef13860f78._comment | 10 + ...nt_15_1cd32456630b25d5aaa6d2763e6eb384._comment | 8 + ...ent_3_8020d74bddf0e38b0a297e5dae7c217b._comment | 12 + ...ent_4_97c26bd82f623a3b2d56bab4afff0126._comment | 12 + ...ent_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment | 10 + ...ent_6_5f03b1686c1fb3f7606a5bc724ac3812._comment | 8 + ...ent_7_5355ac418bfb26e990762b80f4c36b77._comment | 12 + ...ent_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment | 9 + doc/distributed_version_control.mdwn | 21 + doc/download.mdwn | 40 + ...ent_1_ec2578241a966cfcdd43f2a26a5c8709._comment | 13 + ...ent_2_ee0d158ac59903737dbc4ef632f11fe3._comment | 7 + doc/ekg.mdwn | 31 + doc/ekg/ekg.png | Bin 0 -> 57392 bytes doc/encryption.mdwn | 101 + ...ent_1_1afca8d7182075d46db41f6ad3dd5911._comment | 10 + doc/favicon.ico | Bin 0 -> 2550 bytes doc/feeds.mdwn | 4 + doc/footer/column_a.mdwn | 7 + doc/footer/column_b.mdwn | 7 + doc/forum.mdwn | 8 + ...rypted_server_for_syncing_-_possible__63__.mdwn | 3 + ...ent_1_924521ad5972046bac44d2e04ec296c7._comment | 10 + ...ent_2_e2a7f34a3ccc1b6467e6da611c067d66._comment | 8 + ...ent_3_f9a369a6ac69f091e6128990274d3228._comment | 10 + ...ent_4_91b422f8d55b68077245c606c4f7f87c._comment | 28 + ...ent_5_f6128fe75ff3453747f69f12e0fd0a5b._comment | 12 + ...ent_6_9b90b4031a5ed26c375903b33ed65a10._comment | 17 + ...ent_7_acd64ce1b08a97ddf730622272e9f611._comment | 14 + ...ent_8_9baacb14fc5eb449cb13e0b4a4995fb0._comment | 8 + ..._files_to_delete__44___files_to_keep__63__.mdwn | 12 + ...ent_1_fe291cd6cd8e2d5b8e23f8e3689d824b._comment | 15 + ...ent_2_f0dbc3c723999bf0f22502e3a89d1d4a._comment | 8 + doc/forum/A_really_stupid_question.mdwn | 3 + ...ent_1_40e02556de0b00b94f245a0196b5a89f._comment | 31 + doc/forum/A_tiny_filesystem__63__.mdwn | 7 + ...ent_1_993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment | 8 + ...ent_2_af57591d42868c8aa1cc1eda43ca8b98._comment | 8 + ...ent_3_3869c0472b50d7cf5e29ac0720f4f20f._comment | 10 + .../Accessing_files_directly_on__a_USB_device.mdwn | 11 + doc/forum/Accessing_files_in_bare_repository.mdwn | 5 + ...nt_10_7eb66e3806f9524e043fae2da9d57d64._comment | 10 + ...nt_11_f0165d66865ad14f7eb5d50e900c1df4._comment | 10 + ...nt_12_0e7ea5161b6da6e9bb9425bdb953de33._comment | 8 + ...nt_13_f804b9bf71f7d04bd23ce32d813dc340._comment | 8 + ...ent_1_6de649d38febd2240eb5b703da77c2d6._comment | 15 + ...ent_2_7e8dd09915ddc3267377e900891cb02c._comment | 24 + ...ent_3_80eae4a73f38d1a7e35f97c33b6401f8._comment | 8 + ...ent_4_5ec13e98d3ecb69426e974d34f712f9b._comment | 8 + ...ent_5_dccbf5793998c6381e23eb8ff6497ebf._comment | 17 + ...ent_6_42d923916232c81f3b8bdbefa34a89d3._comment | 18 + ...ent_7_43a0a7d222faee582aeb3150a59cef87._comment | 8 + ...ent_8_ec1024235c1c74c113483a833df84654._comment | 12 + ...ent_9_c156b8c1ae0f2905566bbdb13b84e577._comment | 37 + ...___40__and_crippled__41___annex_repository.mdwn | 28 + .../direct_mode_sync_should_avoid_git_commit.mdwn | 1 + ...nt_10_06dae5709750ea1da4f7fdbee4e84efc._comment | 16 + ...nt_11_2069c5c41882ae0a1973fb7da583b60e._comment | 10 + ...nt_12_b35e3a87c30974eedd71ebe52ecbed96._comment | 8 + ...nt_13_84e026f9bda87bfd12a3769dcef77f8b._comment | 8 + ...nt_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment | 8 + ...ent_1_ed3534196164c6736a8dbf21c65c119d._comment | 10 + ...ent_2_1e29bcf568f02765c48f0eac6c640673._comment | 45 + ...ent_3_9ea6803a94b1de15079a3fa20d59c9af._comment | 10 + ...ent_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment | 8 + ...ent_5_57a5b73cff480266355e75c7bdc762c2._comment | 8 + ...ent_6_bbcf5e863c8f152e1079536e9011a404._comment | 16 + ...ent_7_fdcd144c22601bdf98ff844254b0120d._comment | 8 + ...ent_8_b77243e765b2af7ba71e963fcb5cbbb1._comment | 71 + ...ent_9_cb0815e96ee211d4778f2e7a4274e855._comment | 8 + doc/forum/Add_a___34__local__34___remote.mdwn | 13 + ...ent_1_c68ad724b465c4be5243be687168c0b3._comment | 12 + .../Adding_existing_S3_bucket_to_sync_with.mdwn | 16 + ...ent_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment | 10 + ...ent_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment | 8 + ...ent_3_c3878989f74e740c0ed42f440750f3a4._comment | 8 + ...ent_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment | 8 + ...ent_5_0a1c2dd0929511ff824be8de2c8d85eb._comment | 9 + ...ent_6_1444c2f89885f028f20a4d3ce225a403._comment | 23 + ...ent_7_1c30944010d541096baff18198a5560d._comment | 23 + ...ce_needed:_git-annex_slows_down_my_macbook.mdwn | 21 + ...ent_1_af8ab0a47cd379fcb1445e50782ad086._comment | 12 + ...ent_2_a7202bcbdda36a3801833d2432db1965._comment | 25 + doc/forum/Android:_Encrypted_Remotes__63__.mdwn | 3 + ...ent_1_6b16cd372a9bd4f99d4c8b09a82ce3ed._comment | 10 + ...nstant_high_cpu_usage_to_be_expected__63__.mdwn | 3 + ...ent_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment | 8 + ...ent_2_840fbce18b4fdec21ee557fdf52c366e._comment | 10 + doc/forum/Android_-_ext3__47__4__47__....mdwn | 1 + doc/forum/Android_version_does_not_sync.mdwn | 23 + ...ent_1_ed9e33eef2c6d651847dca9d3f7a63f6._comment | 8 + ...ent_2_4eafd3e989611f835c489b379bd6ec8a._comment | 8 + .../Annex_contents_just_disappeared__63__.mdwn | 12 + ...ent_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment | 12 + ...ent_2_657f737c5d64d440aa133ddb41408fbc._comment | 8 + ...ent_3_9b4c35feb14b37d43d053d7430da9abf._comment | 12 + ...ent_4_c3625409652bff5f2165260803269a8a._comment | 10 + doc/forum/Annex_dropping_files.mdwn | 12 + ...ent_1_62fbea95248fda2ff075b5a8952a728f._comment | 8 + .../Annex_slow_on_Windows__47__direct_mode.mdwn | 11 + ...ent_1_d80839f4582fc2a6269db31e30e1dbab._comment | 9 + ...ent_2_593e1e01b70a2b6a15ad6bca09a80c7b._comment | 8 + ...ent_3_c4e4c596f31aa97645fe1e1527dc2c31._comment | 12 + ...ent_4_92db0b99ada9af15a5383da41397ebd7._comment | 19 + ...ent_5_3d628c9db9ebdfd5bff92af105c47719._comment | 13 + ...ent_6_db7965fa928c093233769ed52b2fcd43._comment | 10 + ...ent_7_674f52c5e5484207db403b18efc986c6._comment | 8 + ...called___34__.git__34___to_git-annex__63__.mdwn | 9 + ...ent_1_51f4392e718d857e2f155d6217727a53._comment | 10 + ...ent_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment | 8 + doc/forum/Assistant:_configure_auto-sync.mdwn | 11 + ...ent_1_c8cabd38114582bbdbad49f2d81959d7._comment | 13 + doc/forum/Assistant_Droping_Files.mdwn | 8 + doc/forum/Assistant_loosing_advantages__63__.mdwn | 10 + ...ent_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment | 10 + doc/forum/Assistant_not_syncing_to_Rsync.mdwn | 15 + ...ent_1_2178a7fc0d66643e84597b0938ef65f2._comment | 10 + ...ent_2_650651398443e128c2adc6a2a2d320d0._comment | 12 + ...ent_3_e6d0c9620b148acc72342862a8b4cfef._comment | 10 + ...ent_4_b91f9febdb8b69d8b487ba4ea08c119a._comment | 11 + ...ent_5_c5ad7c1546a17d8459c995c9c8c26414._comment | 31 + ...ent_6_4c12587f972eced91c5128d4885800b5._comment | 30 + ...ent_7_6ecaaee9316bcf0c65688676d60fc055._comment | 8 + ...ent_8_daa9a9a6188afa0394833e1b682f7cd4._comment | 10 + doc/forum/Auto_archiving.mdwn | 17 + doc/forum/Auto_sync_with_music_player.mdwn | 1 + ...ent_1_81ad1c15cfd753531c01dae8945d1caf._comment | 8 + ...ent_2_a15e3f298c3d3faa5b3295355f9bb794._comment | 11 + ...ent_3_99f65a0efaf5d5f9b8ff530acc122860._comment | 8 + ...l_files_due_to_external_modification__63__.mdwn | 46 + ...ent_1_dab1099ee56541c194de319c593f1268._comment | 9 + ...ent_2_b5faccf132fb47e3cda778a6600fd9ef._comment | 8 + ...tomatic_commit_messages_for_git_annex_sync.mdwn | 1 + ...ent_1_ea2ec57bc695da4df8a30a35d433959d._comment | 15 + ...ent_2_af71f53dbbca35d5a5c66ff131887ada._comment | 8 + doc/forum/Automatically_dropping_files.mdwn | 7 + ...ent_1_f5fc608f9cb0edf3272b586b62050637._comment | 12 + ...atically_syncronise_centralised_repository.mdwn | 14 + ...ent_1_6a2047daa9faf4309d2ed27d5cc48b76._comment | 10 + ...ent_2_3be7b45bc2284019f17a81375637a576._comment | 10 + doc/forum/Basic_set_up_with_one_remote.mdwn | 14 + ...ent_1_3ad06a0dbebf62e6440f549e77af59b6._comment | 15 + ...ent_2_59e18e759c907b8adabf8c34eef08065._comment | 10 + ...ent_3_5221a713ee3f65fa2740c9fa6cb1db0f._comment | 27 + ...ent_4_62e554a546e4b50d211f5f65446fd289._comment | 13 + doc/forum/Behaviour_of_fsck.mdwn | 13 + ...ent_1_0e40f158b3f4ccdcaab1408d858b68b8._comment | 8 + ...ent_2_ead36a23c3e6efa1c41e4555f93e014e._comment | 19 + ...ent_3_97848f9a3db89c0427cfb671ba13300e._comment | 19 + ...ent_4_e4911dc6793f98fb81151daacbe49968._comment | 8 + ...ach_for_central_sharing_and_multiple_users.mdwn | 8 + ...ent_1_48ffb50b92588daec6887bf08f1b97f5._comment | 10 + ...ent_2_6b9a20f9707da9d2cfc3697a538d6935._comment | 12 + ...y_to_manage_files_on_removable_media__63__.mdwn | 18 + ..._in_a_direct_and_crippled_annex_repository.mdwn | 17 + ...ent_1_552e74f9573a34ec178f396b83252c3e._comment | 12 + ...ent_2_33c57922714f204fc63c260b838f3712._comment | 8 + doc/forum/Big_repository_vs._multiple_small.mdwn | 8 + ...ent_1_8e21ee3c674ef6e595bdab53dd5c2356._comment | 8 + ...ent_2_656c62351502492d20e8490242e51169._comment | 14 + ...ent_3_e9c44ea364513f090844f46af2ea46a1._comment | 8 + ...ent_4_82e13580426dc648688e4c26e7ed91ec._comment | 8 + ...ent_5_632aceb71dc6a4a9a4bb03de25a9b21a._comment | 23 + ...om_hasn__39__t_been_working_for_a_few_days.mdwn | 72 + ...ent_1_6ca872c241399b9129cf9a18f42ebd43._comment | 8 + .../Building_a_Debian_package_of_git-annex.mdwn | 27 + ...ent_1_0848513c46f3efa21bc34784554ae88a._comment | 10 + doc/forum/Building_git-annex-3.20121112-19309.mdwn | 78 + ...ent_1_b115e28c77fe748ee6643c41f766beb4._comment | 12 + ...ent_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment | 16 + ...ent_3_2f30b301c14f3a7fa0f52715d6140353._comment | 13 + ...ent_4_1e3c3903a71a2ff7109372aa4dd5742a._comment | 8 + ...not_resolve_dependencies___40__yesod__41__.mdwn | 19 + ...ent_1_2eb4f410b54a25fcc895893a3c631c43._comment | 8 + ...ent_2_44cd6f6dd674df105d6f0b3f320f3236._comment | 19 + ...ent_3_992af6855901df79a2018a07941cb8b6._comment | 8 + .../Calculating_Annex_Cost_by_Ping_Times.mdwn | 1 + ...ent_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment | 15 + ...ent_2_7e04f85c6ba74c18c8dde148aef9bf80._comment | 8 + ...iles_in_the_git-annex_git_repository__63__.mdwn | 6 + ...ent_1_c8f9923d8dc76b8bed25dce5ae09b520._comment | 8 + doc/forum/Can_Not_Sync_to_Git_Repo.mdwn | 1 + ...nt_10_e0f82074eb1a4b8258729d9a23a7f421._comment | 33 + ...nt_11_842aaf685aa843c21bf3eef0b61f8630._comment | 8 + ...nt_12_b4f8be428a08db01dbd004e1f06dcffd._comment | 10 + ...ent_1_80344c54804ddee81d89c0b40731fb9c._comment | 8 + ...ent_2_1797c2fef5c20e885b56b8a2c6330ff0._comment | 8 + ...ent_3_fb23d640f9634cab2da91848f1848627._comment | 58 + ...ent_4_a947736911e68856f2c3494963063df8._comment | 8 + ...ent_5_ce0e77143cfd2d578b1e5a71e35060da._comment | 18 + ...ent_6_10e114da6a2bb54b860b44767ba1ca94._comment | 17 + ...ent_7_415bab6a7ab564e671f42cfad83e0e58._comment | 10 + ...ent_8_36abd829ea71a44c7cded1123a7c913d._comment | 8 + ...ent_9_2fb745aaffe544f97bbdc670261fd4fd._comment | 14 + ..._get_git-annex_merge_to_work_from_git_hook.mdwn | 41 + ...ent_1_8b71cb6772b219c27c17392d5099907a._comment | 12 + ...ent_2_af2a2634d8d128868022d033d6adb549._comment | 13 + ...ent_3_31ec762a0684d2ce87d229ed2924db93._comment | 16 + doc/forum/Can__39__t_get_jabber_working.mdwn | 7 + ...ent_1_def20bf0b3c1a188e4dad5ec67b455d8._comment | 8 + ...ent_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment | 8 + ...ent_3_852dc402a286e38b77b99f174c33f8d1._comment | 8 + ...ent_4_259741e146906ff70540390bdfe07002._comment | 8 + doc/forum/Can__39__t_get_pairing_to_work.mdwn | 5 + ...ent_1_b981977b4fb942fd109c37fcf40f35d7._comment | 22 + ...ent_2_341e2ff6c88ace1b1422e16781edf580._comment | 8 + ...ent_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment | 8 + ...ent_4_169d77b30cea05125068ee1eeb2ef328._comment | 25 + ...ent_5_70e6c4f4f01277be1767b38ca8374793._comment | 11 + ...ent_6_2cd014a76fac6e08269dfd8146957418._comment | 10 + ...ent_7_b9b715084d5a5562998b1724699d49e5._comment | 8 + doc/forum/Can__39__t_init_git_annex.mdwn | 15 + ...nt_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment | 10 + ...nt_12_fca9ed3707e097bee2cd642424681005._comment | 8 + ...ent_1_a294b5e7e52aa9f66a708866be16f137._comment | 10 + ...ent_2_fcf678d5188821d63b4c9ea5b59474a8._comment | 13 + ...ent_3_c83f7dea7d5304e226e52eb3c43ef14a._comment | 9 + ...ent_4_06a01dd51ffbfd006c0afb8eab40b530._comment | 8 + ...ent_5_53c33484bded57abc60f0449331c7b05._comment | 11 + ...ent_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment | 14 + ...ent_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment | 10 + ...ent_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment | 8 + ...ent_9_31a45f6a72266190b3ed7a7b02e03d5b._comment | 8 + doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn | 36 + ...ent_1_c44023d81e9e4f7c9341af0e4271a1e4._comment | 10 + ...ent_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment | 30 + ...ent_3_b37b2a9906ffb956cca91adb4bb4e521._comment | 8 + ...ent_4_afddf16f8faedc78d458835480f10dc3._comment | 15 + ...__40__or_Dropbox...__41___substitute__63__.mdwn | 76 + ...ent_1_a3fbae205c0312436f8861f432643811._comment | 10 + ...ent_2_de49cf261c644a6e7f6ac881a48d4e6c._comment | 10 + doc/forum/Can_not_delete_Repository.mdwn | 3 + ...ent_1_b1a9420974e2e50c9c86a379ad62502c._comment | 12 + doc/forum/Can_not_drop_unused_file.mdwn | 14 + ...ent_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment | 16 + ...ent_2_ed1543cff5e6e81ca18c43b716ca8199._comment | 42 + ...ent_3_0c9c9c0ed557af4845a67434c21bb4bc._comment | 10 + ...ve_remotes_that_aren__39__t_tracked__63___.mdwn | 13 + ...ent_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment | 10 + ...ent_2_7cde9785886c8450e1475f0b54481ae3._comment | 10 + doc/forum/Cannot_find_git-annex_in_server.mdwn | 10 + ...ent_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment | 15 + ...ent_2_168dda4aed09f90a510bc453e8a7cda7._comment | 10 + ...ot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn | 6 + ...ent_1_9345551f5772c3a6f1490b00e1edbf69._comment | 8 + ...ent_2_0b688a442b6a911a0353e73097a24cb6._comment | 12 + ...ent_3_7e246caa00005560bb489c927c663046._comment | 12 + ...ent_4_1d8025aabe8bc72711a77f691f67da5f._comment | 8 + ...ent_5_7c2f95da65190016192424e7c622122f._comment | 8 + ...ent_6_9b8465cefe609e7a696e7573b8892e38._comment | 8 + ...ent_7_af6472762a598a454ba52ac0caa059aa._comment | 10 + doc/forum/Centralized_repository_with_webapp.mdwn | 13 + ...ent_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment | 18 + ...ent_2_08c84f2703f89dc12982eba9dd2a06d1._comment | 11 + doc/forum/Change_remote_server_address.mdwn | 6 + ...ent_1_401c3d2530ac7ba41dd3857ab4737ed5._comment | 10 + doc/forum/Check_if_remote_is_using_GPG__63__.mdwn | 1 + ...ent_1_db8ce8ef50fc33a28860ee475988450f._comment | 14 + ...ent_2_11c7033904c9c7a1df766e915632c386._comment | 8 + ...ent_3_a7ab70ad87a334c36761ddb3d830d99b._comment | 8 + doc/forum/Check_when_your_last_fsck_was__63__.mdwn | 4 + ...ent_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment | 10 + ...files_in_S3___40__reduced_redundancy__41__.mdwn | 5 + ...ent_2_793b3d9f78562f3aecf27dd926bbcf82._comment | 8 + ...heckout_only_some_files_with_the_assistant.mdwn | 14 + ...ent_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment | 10 + ...ent_2_bf095ff5b5af95b062ae1f7da566a279._comment | 12 + ...ent_3_7c026e36e1cdd52053c34638c87d793c._comment | 10 + ...aning_up_after_aborted_sync_in_direct_mode.mdwn | 19 + ...ent_1_3440b2e1662d3b113c18283afcbf4520._comment | 8 + ...ent_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment | 14 + ...ent_3_6b9d8c48547f3d0a911310622ba91df7._comment | 13 + doc/forum/Coming_from_git_world.mdwn | 9 + ...nt_10_098bef38c2688607e869425a557cc482._comment | 8 + ...nt_11_98d75a1415e0c3689ab4231855e61233._comment | 12 + ...nt_12_5e7079e9bf3e4d97191333c66ac00e52._comment | 10 + ...ent_1_357443dc601ae38784c01cf18552f4d5._comment | 14 + ...ent_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment | 8 + ...ent_3_09c6bb83a73d34dff2b8bc185a14a1db._comment | 18 + ...ent_4_6c731bb9a8d21dd9ab8c09612b23f908._comment | 16 + ...ent_5_e719d99af5afd90da3d3db692eff28dc._comment | 11 + ...ent_6_85a42106944dba9995fb3f4bfee3443a._comment | 10 + ...ent_7_90623294b910ceca3dc8ebd41b50fc9b._comment | 38 + ...ent_8_28dbee30eb54877418f72eb8935302d8._comment | 8 + ...ent_9_6edb36ea9535030fa3766937398e5bc7._comment | 8 + .../Comparison_with_other_big_files_solutions.mdwn | 11 + ..._remotes___40__specifically_S3__41____63__.mdwn | 1 + ...ent_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment | 8 + doc/forum/Consistency_Check_for_S3.mdwn | 1 + ...ent_1_40385806ef1cc082232cd2723a24be1a._comment | 8 + ...ent_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment | 8 + ...ent_3_ec9de6882a0eef4d2786e55b583ad020._comment | 10 + .../Controlling_content_on_mobile_device.mdwn | 46 + ...ent_1_708649b7f30d8619d7b34dcb0ef46515._comment | 12 + ...ent_2_dba1a1b0917332a1dee387b1183bd2cb._comment | 8 + ...ert_regular_git-annex_repo_to_a_rsync_repo.mdwn | 1 + ...ent_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment | 12 + ...ent_2_76bfb11396dc20a5105376b22e7e773b._comment | 10 + ...ent_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment | 16 + ...ent_4_8f5e323b29745591f9f2f0f867353f69._comment | 8 + ...ent_5_9824c953694770afa0611ff7276737bf._comment | 12 + ...ent_6_5899741cb7f83e1b22c5ee3509c5ff21._comment | 8 + doc/forum/Corrupt_Repository_Invalid_Object.mdwn | 10 + ...ent_1_b7fd4b6212b50400342931e70684b96c._comment | 14 + doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn | 3 + ...ent_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment | 28 + ...ent_2_608a30e274e6a691a39f69503720e320._comment | 10 + ...ent_3_791b9978b410c1aff7fd8ef05c38f5f9._comment | 40 + ...ent_4_8665c95299916138c4af375626d9ec7d._comment | 8 + .../DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn | 41 + doc/forum/DS__95__Store_files_are_not_added.mdwn | 3 + ...ent_1_30687306da9bd35ec02a806193c5e240._comment | 7 + doc/forum/Debugging_Git_Annex.mdwn | 4 + ...ent_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment | 7 + ...ent_2_1d70ff052d00f33c34fd45730ea13040._comment | 12 + doc/forum/Default_text__47__html_handler.mdwn | 2 + ...ent_1_4730061916c7e12b7a41906152f847ee._comment | 12 + doc/forum/Delete_unused_files__47__metadata.mdwn | 7 + ...ent_1_3efc19895c8dec89b71ae3778b583fea._comment | 11 + ...ent_2_23597d9468347b3d94257f3c02afe1b8._comment | 8 + doc/forum/Detached_git_work_tree__63__.mdwn | 11 + ...nt_10_656c737772bf92be2c7a2f33bd2bb0f0._comment | 10 + ...ent_1_28ac35a325fba250721d9f1b7c994960._comment | 8 + ...ent_2_7128c26bbc8efea04a5a317edf0ca9f2._comment | 13 + ...ent_3_a3c22f905748ff2c803e8621c74a87a0._comment | 8 + ...ent_4_8063921241760458349e7cb0cadf3d4e._comment | 8 + ...ent_5_4510a787255cb03e7d0c3e7b830b7d52._comment | 16 + ...ent_6_ffd9c67ecc5b46ae98996018573f5591._comment | 10 + ...ent_7_36ca007643c983604fc4aed6ec8cb3d2._comment | 8 + ...ent_8_b7a2da4fbace7156e11c48a496a19dc9._comment | 8 + ...ent_9_f9fa237a693d28178f0451799209f7e2._comment | 8 + ...ence_between_copy__44___move_and_get__63__.mdwn | 24 + ...ent_1_26ee8192af3a62178c1ccf17c6da5ca5._comment | 10 + ...exes_pointing_to_same_special_remote__63__.mdwn | 6 + ...ent_1_359f46805e6508d03aadd90429937546._comment | 10 + doc/forum/Direct_special_remotes.mdwn | 26 + ...ent_1_50357130a1c57ad2fab70f71925faf02._comment | 8 + ...ent_2_e94a722ca056a068bcc16eb822008602._comment | 18 + ...ent_4_187036bbfee0508e2914afb51ead3c71._comment | 16 + ...ent_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment | 66 + ...ent_5_69c34c655e4b153dfc0d1b8580091124._comment | 8 + ...ent_6_b054cfc3d3f81873f3faae7eb4f5337c._comment | 8 + ...ent_7_5f9d8a0ef2f13f242594848825d29ee7._comment | 8 + .../Distributing_data_to_a_set_of_drives.mdwn | 1 + ...ent_1_f1fa72879f4e1db13bf59dea33c91624._comment | 8 + ...ent_2_e13b4e5c1e6f1f503f93d521b504d5c1._comment | 16 + ...ncing_work_when_the_buddy_is_offline__63__.mdwn | 1 + ...ent_1_f290dd8547176793934f8077374e1c0a._comment | 17 + ...ent_2_c358eb51047f333e582bd824be5e0e65._comment | 8 + ...ent_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment | 12 + .../Does_git-annex_version_big_files__63__.mdwn | 5 + ...ent_1_0b44003c1dc53adb807298ae452f8004._comment | 8 + ...ent_2_ca40b67abd7bd36155d16d0396d7472c._comment | 14 + ...ent_3_32de3501feedce51b43ed9dcc399c7a9._comment | 15 + ...ent_4_8c65a7f8bda3c876971c2801fb6a76a1._comment | 8 + .../Does_migrate_ensure_data_integrity__63__.mdwn | 7 + ...ent_1_cef50b32c46f4406c6f918c5866ddc15._comment | 11 + ...ent_2_f389b924c8531b35fdf5dedd10fc8000._comment | 8 + ...nderstand_how_to_delete__47__recover_files.mdwn | 25 + ...ent_1_b307bfb0b70d649897f411eb753bd50a._comment | 14 + ...ent_2_58a6a1476274b8c4feb3d43ecd998759._comment | 41 + ...ent_3_4b857f481db7b2437ac9f8137a8510e2._comment | 11 + ...ent_4_828db3bf2863d98c0b0fb4074aa7f066._comment | 33 + ...ent_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment | 8 + ...ent_6_1759bcd5708f591f91b9c410f6dc5c54._comment | 14 + ...ent_7_2a389f01eb5131042ea1e71a73c9787a._comment | 21 + ...Don__39__t_understand_local_vs._known_keys.mdwn | 19 + ...ent_1_10749c0d76e824217dd1ff8c8a6e42a5._comment | 10 + ...ent_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment | 13 + doc/forum/Drop_with_assistant.mdwn | 5 + ...ent_1_048f5a31c549afb19b76a65bddd0cd24._comment | 13 + ...ent_2_527d7b6a8efa85b904111f179912d926._comment | 8 + ...ent_3_c50857506869bb1cd306b66acf37fba8._comment | 14 + ...ent_4_1ea37445d5eb96c3efa182e88e07b867._comment | 8 + ...ent_5_c08908ea5232cbe067c73ecd12d0e218._comment | 10 + ...ent_6_015134228cb865f97326fbb7193636ea._comment | 8 + ...ent_7_950759930667588f21659cd6d7065fbb._comment | 17 + ...ent_8_773e540e46adc43487323e8d38ceb2d9._comment | 23 + ...ent_9_d85d120d7219ea6c179c2619a17bdae9._comment | 15 + .../Effectively_replicating_backup_files.mdwn | 25 + ...ent_1_b1ab0da82db076c5244b0dcc95282ddd._comment | 14 + ...ent_2_472ab9c973b475f7f3ce7e3934f94281._comment | 19 + ...ent_3_826493bd59b81786c1f6a56f1c438004._comment | 10 + doc/forum/Encrypted_Content_Remote_Daemon_.mdwn | 1 + ...ent_1_96f63e509e23c081c48302274e21db78._comment | 10 + ...ent_2_acd0ffdc3f5079265858073c2af81557._comment | 8 + .../Encrypted_ssh_remote__44___synced_folders.mdwn | 87 + ...ent_1_7b9b4ef614c90e0b222d24678d1b9026._comment | 10 + .../Error_adding_ssh_remote_in_assistant.mdwn | 15 + ...ent_1_eecc0660db4083cc91c5330587f74610._comment | 8 + ...ent_2_3e6aad22e8020b12ff7ef914b75281d1._comment | 8 + ...ent_3_3ea529e16502071fc0980c6d5c60a036._comment | 8 + ...ncs_git-annex_branch_but_not_master_branch.mdwn | 1 + ...ent_1_9a909e3d89061adacbd8ed370520250c._comment | 9 + ...ent_2_0dd489b264374b7b1065b89e1ff7561b._comment | 8 + doc/forum/Fast_cloning_a_repo_initially.mdwn | 3 + ...ent_1_0db0caafe30dd1b6f15fb1679dec8f9f._comment | 10 + ...ent_2_e17abc209c2b3ba20158be76801ce04a._comment | 8 + ...ture_Request:_add_filename_to_hash_objects.mdwn | 6 + ...ent_1_73dc0a9cad486cf2d34faf064c6193b1._comment | 10 + ...ent_2_f818b3ecfeb1d1dd83df4668c061718a._comment | 8 + ...ure_request:_Multiple_concurrent_transfers.mdwn | 19 + ...git_annex_copy_--auto_does_the_right_thing.mdwn | 5 + ...ent_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment | 12 + ..._webapp_support_for_centralized_bare_repos.mdwn | 1 + ...iles_that_lack_a_certain_field_in_metadata.mdwn | 5 + ...ent_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment | 10 + ...ttempt_at_an_OSX_launcher___40__.app__41__.mdwn | 3 + ...ent_1_97c261b9080c5ecc5424683066bbe05b._comment | 14 + ...ent_2_ae45f9703b635c235409682cf252d36c._comment | 8 + ...ent_3_066ca31a2e5dfe55a58092ba85231c7c._comment | 10 + ...ent_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment | 10 + ...ent_5_92240b3f8629f1f2bbe1829700082a79._comment | 10 + doc/forum/Fixing_up_corrupt_annexes.mdwn | 10 + ...ent_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment | 7 + ...ent_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment | 8 + ...ws_have_disrupted_the_file_structure__63__.mdwn | 20 + ...ng_one_repo_to_contain_a_copy_of_all_files.mdwn | 1 + ...ent_1_702b1b94c735f1b9cde16daa77a80c12._comment | 8 + ...ent_2_3df7fcbcd482bb9377ead238b314995b._comment | 8 + doc/forum/GPG_passphrase_handling.mdwn | 76 + ...ent_1_11ba130e8bea6698858d0a1a5b01830f._comment | 15 + ...ent_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment | 15 + ...ent_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment | 12 + ...ent_4_8724297f6d7ac140ab395a940bab0d7d._comment | 8 + .../Generating_a_Temp_View_of_Available_Files.mdwn | 1 + doc/forum/Getting_started_with_Amazon_S3.mdwn | 28 + ...ent_1_f50883133d5d4903cc95c0dcaa52d052._comment | 10 + ...ent_2_e90aa3259d9a12cd67daa27d42d69ab5._comment | 8 + ...ent_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment | 8 + ...he_status_of_a_remotely_changed_annex_file.mdwn | 75 + ...ent_1_e323c21d27bb0946993ba1438429c457._comment | 14 + doc/forum/Git-Annex_with_Asustor_NAS.mdwn | 4 + ...ent_1_44445200e5b716caeec225972a5d5dce._comment | 10 + ...on_file__40__s__41___location__40__s__41__.mdwn | 6 + ...ent_1_5baffd4d6994bbcb23614b17777a0ffe._comment | 10 + doc/forum/GitBlit_as_a_centralized_repository.mdwn | 2 + ...ent_1_06bedf5fbac45415e0cc81f41b25a5a0._comment | 8 + ...Annex_Assistant:_How_to_add_a_remote__63__.mdwn | 11 + ...ent_1_d0a3d0090928790d5a05e9f8e5f05320._comment | 12 + ...won__39__t_backup_files_to_removable_drive.mdwn | 3 + ...ent_1_a1d1ae9488924b08682b355aff51130d._comment | 17 + ...ent_2_6649077583bc14730a08aaaca7ccb62e._comment | 8 + ...ent_3_f359d9b9356de7ee10b9e725a011cc43._comment | 8 + doc/forum/Git_Annex_Sync_Delinks_Files.mdwn | 11 + ...ent_1_8b03707777a9d8e38715cb77d2a0addc._comment | 12 + ...ent_2_a625e7d88e321532ace103548b31b67b._comment | 18 + ...ent_3_5278164dab570755ed58afe466dfad42._comment | 12 + ...ent_4_e43ede0bdc20de9aa10ab6ce387d8582._comment | 92 + ...ent_5_dc71987f0e19f04a920561201f9552b4._comment | 15 + ...ent_6_257a89f81858659c4dac4d116e7cf0a3._comment | 32 + doc/forum/Git_Annex_Transfer_Protocols.mdwn | 9 + ...ent_1_a870ec991078c95a6bb683d6962ab56e._comment | 8 + ...ent_2_71419376ef50a679ea8f0f9e16991c17._comment | 8 + ...ent_3_fea43664a500111ca99f4043e0dadb14._comment | 8 + ...ent_4_56fb2dab1d4030c9820be32b495afdf0._comment | 8 + ...ent_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment | 8 + ...ent_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment | 8 + .../Git_annex___39__corrupting__39___itself.mdwn | 34 + ...ent_1_bcf50a215e2f8771e098aadfff4c300c._comment | 43 + ...ent_3_75f957e7be6c1ad8936c0a2a5374db3e._comment | 20 + ...ent_3_ab062b1df3b55fd49852a6220c98249e._comment | 10 + ...ent_4_45974f60a81ed2d00b87ffb1a7963c6f._comment | 8 + doc/forum/Git_annex_assistant_in_command_line.mdwn | 2 + ...ent_1_ce05226307ade8db90ada2dbf290bd58._comment | 10 + doc/forum/Git_annex_assistant_on_EC2.mdwn | 5 + ...ent_1_bbdb4611373117a2176c225378110a05._comment | 8 + ...ent_2_614ed11f7134137d6376d36a61c293f5._comment | 8 + doc/forum/Git_annex_on_Windows.mdwn | 11 + ...ent_1_da24ba0219a164f9ab93fe75dd85127e._comment | 11 + ...ent_2_c0880ce3ee13d388ab5b46a740170845._comment | 50 + ...ent_3_70c22716fde60d14fd0c7e74acf4a224._comment | 11 + ...ent_4_b9232deab6bc5036d7339aa202013218._comment | 12 + ...ent_5_27af3c431b50b540d2bd1d3af3f21080._comment | 8 + ...ent_6_79fb5ec1b47593ab3355543c5499284a._comment | 8 + ...ent_7_75d4450b4608ad0b453bc69159e708de._comment | 10 + ...ent_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment | 10 + ...t_annex_syncing_speed__44___possible__63__.mdwn | 21 + ...ent_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment | 12 + doc/forum/Git_repos_in_git_annex__63__.mdwn | 7 + ...ent_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment | 14 + ...ent_2_8546341a561a5f55216c2f437f8ec0c2._comment | 32 + doc/forum/Git_repositories_in_the_annex__63__.mdwn | 5 + doc/forum/Gitolite_problems.mdwn | 11 + ...ent_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment | 10 + ...ent_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment | 9 + ..._special_remote_when_content_changes__63__.mdwn | 19 + ...ent_1_05ee6a1b1943ef3c90634e52233bde1c._comment | 12 + ...ent_2_48d82e391812d8ec0d4e6562d0607fe7._comment | 10 + doc/forum/Help_Windows_walkthrough.mdwn | 177 + ...ent_1_5fc22393a1b28235eabb2871ad83d0a7._comment | 12 + doc/forum/Help_on_my_usecase.mdwn | 22 + ...ent_1_a35b35c7927640f21d47c3df4f91dabb._comment | 12 + doc/forum/Help_with_syncing_file_contents.mdwn | 68 + ...ent_1_7ec34de3140983739080115c82966bf5._comment | 18 + ...ent_2_7dba58d3c62d6f64a270298e4e4329a4._comment | 10 + ...ent_3_b26cfa20dc81517d93e760f4809bdc24._comment | 12 + ...iles_in_directory_that_have_content__63___.mdwn | 6 + ...ent_1_e897d8fc10474cf865279dc22f22ecb7._comment | 10 + ...ent_2_3af326205db6ee04f2a8644baa1dd566._comment | 8 + ...ve_an_Android_git-annex_installation__63__.mdwn | 1 + ...ent_1_e14757c2c106770c2d7069ace4987b3b._comment | 8 + .../How_do_I_do_with_.gitrefs__47_____63__.mdwn | 1 + ...ent_1_5e235af2ea13fd4f6a226c842f69965e._comment | 8 + ...ent_2_50d0c643537175b514d5eae604fb5bea._comment | 51 + ...ent_3_3d342c32b14c7edbece596ba970a8415._comment | 10 + ...do_I_dropunused_with_an_rsync_remote__63__.mdwn | 3 + ...ent_1_8db3cb5348b845eb99c2c829957db9ea._comment | 8 + ...ent_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment | 10 + ...ent_3_f24d678e4192a70322aa164ed9b71fc8._comment | 8 + ...ent_4_9233decd0aaf9211447f36e0d9346445._comment | 15 + ...ent_5_e1deb110f752e5495d5c77ec444abac5._comment | 8 + ..._do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn | 16 + ...ent_1_b3c215cedba51fb47992ef10c60d6acc._comment | 8 + ...ent_2_85415e1fceb737919cc1cd9f37242458._comment | 10 + ...ent_3_fb3a591dc60182f7922fc2b5c24f50f1._comment | 11 + ...ent_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment | 29 + ...ent_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment | 22 + ...you_know_when_something_fails_a_fsck__63__.mdwn | 4 + ...ent_1_1c14981916dd55376d5e9f95023556cb._comment | 32 + ...t-annex_assistant__39__s_web_browser__63__.mdwn | 7 + ...ent_1_f4402eabda2327da3a0bbc64ed3baf9a._comment | 12 + ...ent_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment | 10 + ...ent_3_ca75e928c245eb23a02b5f40ec69cbb1._comment | 8 + ...ent_4_1635f136909711295b9b70d1255e0378._comment | 11 + ...ent_5_ee0cbe9498c518de98480a2ad229f685._comment | 10 + ...ent_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment | 11 + ...ent_7_71ff45948487e9ac8de809a5ccc3d874._comment | 29 + ..._change_the_number_of_simultaneous_uploads.mdwn | 3 + ...ent_1_d5559994ee45a5c185a55c9a4d824aa4._comment | 12 + doc/forum/How_to_cancel_an_add__63__.mdwn | 5 + ...ent_1_f768ce5dc7c76f96ee6eb352f167be44._comment | 8 + ...w_to_change_the_name_of_a_repo_on_S3__63__.mdwn | 2 + ...ent_1_be74d63e1951f515948d232e096b4862._comment | 8 + ...ent_2_d54a7163cfe9a94b7ba337860958e5c5._comment | 8 + ..._tracking_of_a_deleted_file_in_direct_mode.mdwn | 7 + ...ent_1_c6bd2ef90516dde928ff18ded36df625._comment | 8 + ...nc__47__ssh_backend_to_other_backend__63__.mdwn | 14 + ...ent_1_7973928b1aa9e0fcfeb6bf80885441f5._comment | 10 + ...al_with_renamed_files_in_direct_mode__63__.mdwn | 3 + ...ent_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment | 10 + doc/forum/How_to_debug_failing_sync.mdwn | 5 + ...ent_1_a597b868182e55e5f39394f154740534._comment | 10 + ...ent_2_db0a5652d76e4e568a4d7808195bc59c._comment | 10 + ...mote_url_for_a_git_remote_repository__63__.mdwn | 7 + ...ent_1_52918b5ec25e55837215439fe1bb1a14._comment | 8 + ...ent_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment | 8 + ...ent_3_48c3a80c14a85f27d742482b2ccbe628._comment | 8 + doc/forum/How_to_delete_a_remote__63__.mdwn | 1 + ...ent_1_8cba186bb67079ff41bf6d0b04613f4a._comment | 10 + ...ent_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment | 12 + ...ent_3_e9c5508092ca2983f458b16bf1e07082._comment | 14 + ..._remotes_with_git_annex_assistant_and_ext4.mdwn | 28 + ...ent_1_42ca6cfbbb79fe63514805b8119ac16b._comment | 8 + ...ent_2_c94ce6a9767c624e2445a7d9eea40396._comment | 29 + ...ent_3_bcda51053b62bbb20ce71a59469e1b26._comment | 10 + ...ent_4_48e5b9eae920e5f13812de8d6f6bc640._comment | 8 + ...ent_5_787c0bfdc1d309db1486c3a37723a957._comment | 13 + ...ent_6_8894beb06443f234e9200b03b5f3badf._comment | 8 + ...ent_7_457f62ee3e58f68a55f66c5bde6002fd._comment | 10 + ...ent_8_bd2b412116a66107bc0ff0efd7e39a58._comment | 10 + ...sions_of_files_that_have_been_edited__63__.mdwn | 7 + ...ent_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment | 8 + ...ent_2_5710294c1c8652c12b6df2233255a45e._comment | 8 + ..._to_get_git-annex_to_forget_a_commit__63__.mdwn | 54 + ...ent_1_65471c42e163ac8ee6ec109f1397271b._comment | 12 + .../How_to_handle_the_git-annex_branch__63__.mdwn | 5 + ...ent_1_800bd55b322e72f229882d7fd3888b14._comment | 8 + ..._uploading_a_file_to_a_transfer_repository.mdwn | 3 + ...ent_1_17db96492e6bc0e243fc7cb62565c4c4._comment | 17 + ...ent_2_e772ea0383ac690cbcbcf125258986cf._comment | 16 + ..._Maven_releases_work_with_git_annex___63__.mdwn | 5 + ...ent_1_9298aa55771b68873de02e6a7964bbdc._comment | 8 + .../How_to_make_a_server_store_the_files.mdwn | 1 + ...ent_1_20196067475918e788afa0debc4d5ce5._comment | 9 + ..._assistant_from_downloading_all_data__63__.mdwn | 9 + ...ent_1_fd8b287758ad77b3527ae71017cffabf._comment | 8 + ...ent_2_e8e75b4451aaf55461edf2f3d68797ed._comment | 8 + doc/forum/How_to_rename_a_remote__63__.mdwn | 1 + ...ent_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment | 28 + ...e_a_interrupted_merge_in_direct_mode__63__.mdwn | 65 + ...ent_1_8e2a14842b44844f90c80b862a1b3a6d._comment | 10 + ...ent_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment | 8 + ...ent_3_93f20519483837c59a75821621e22dee._comment | 10 + doc/forum/How_to_restore_symlinks.mdwn | 1 + ...ent_1_c67e752cf7d5431096fab4b3304790a7._comment | 11 + ...ent_2_f9ec6096595e2c149c48924e3b54542f._comment | 14 + ...ent_3_4ff80729787a2a4e2baf05dd1db37da3._comment | 12 + ...ctively_annex_a_file_already_in_a_git_repo.mdwn | 5 + ..._with_one_shared_transfer_repository__63__.mdwn | 15 + ...ent_1_bedaf308cfc70b9e751914a400ebcbc2._comment | 10 + ...ent_2_d665b1514253c8aa487ebf8b2728e3b1._comment | 10 + ...ent_3_aef42387a3673ab6710fb23e878d7e17._comment | 10 + ...ent_4_bfbcc041db472f4808979e6b3d7c4be2._comment | 10 + ...epositories_handled_by_the_assistant__63__.mdwn | 40 + ...ent_1_1c913395f076ee203caaab057da8afbe._comment | 13 + ...ent_2_081793c52bf15c74a7f48a67c49ff818._comment | 12 + ...ent_3_f8e0376beb486cf8ce52384ff511ecf2._comment | 11 + doc/forum/Howto_remove_a_repository__63__.mdwn | 4 + ...ent_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment | 8 + doc/forum/Howto_remove_unused_files.mdwn | 31 + ...ent_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment | 16 + ...ent_2_9b4d198c2d8a52adef3d166a8196fc0d._comment | 8 + ...ent_3_441d10901d5c055ac3ed2a6cb61c075c._comment | 8 + doc/forum/Import_options.mdwn | 14 + ...ent_1_118a5f978090a3909299876a01c0adec._comment | 21 + ...ent_2_21da91f08cb6b28ae3e79ade033db516._comment | 17 + ...upgrade_of_the_object_directory_safe__63__.mdwn | 9 + ...ent_1_c25900b9d2d62cc0b8c77150bcfebadf._comment | 13 + ...ious_state_before_the_initial_commit__63__.mdwn | 18 + ...ent_1_f9decde3955f10148febc4646fba5a68._comment | 12 + ...ent_2_ed32a48edce4f150bedf24cfe91de254._comment | 8 + ...ent_3_ef9618850e5e688bac3c646983f00ed8._comment | 10 + ...ent_4_4bf460c5826c36b205e418c4f3f7d770._comment | 15 + ...o_make_git-sync_not_nullify_symlinks__63__.mdwn | 23 + ...ent_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment | 10 + ...ing_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn | 7 + ...ent_1_6bd27bd31833336c1df783253378ccae._comment | 10 + doc/forum/Let_watch_selectively_annex_files.mdwn | 27 + ...ent_1_8379de87d16502d9aadf252da01e4d9a._comment | 10 + ...ent_2_2219ff6b4dc927eb2a299cd1af90aed8._comment | 8 + ...instead_of_broken_link_when_possible__63__.mdwn | 4 + ...ent_1_ce0464d5fca6ada9f1477831fd47ce09._comment | 8 + ...Links_or_actual_files__63___Confused__33__.mdwn | 21 + ...ent_1_779cee2448d7070b1dd636d01296c01e._comment | 8 + ...ent_2_bccda88697ab7beec0b9fe9ee0230688._comment | 18 + ...ent_3_c2a9da3f03b55ff294dc0d2010380119._comment | 8 + doc/forum/Local_and_remote_in_direct_mode.mdwn | 7 + ...ent_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment | 15 + ...ing_a_file_results_in_file_changed_warning.mdwn | 20 + ...ent_1_25a04c7345f5b626aa71524603c833ed._comment | 8 + ...ent_2_7146a3c69749b9b1001fffc6e7a8bcda._comment | 12 + ...ent_3_fd39e6ceffd9bf0709658c34945d8699._comment | 16 + doc/forum/Looking_at_the_webapp_on_OSX.mdwn | 18 + ...ent_1_68820f2f469356633c1abb18a47e0c59._comment | 12 + ...ent_2_4ce86546d8a135df9cfab46b4612fa0b._comment | 23 + ...ent_3_6d398a2cceff14a1b774b85ee1725073._comment | 12 + ...ent_4_5e503787a4b1d3534c5e20da5480b763._comment | 8 + ...ent_5_c735841bc230efc61594ea013fc2902b._comment | 8 + ...ent_6_0e489fbfc89d282e9eb47f1b814ff70c._comment | 8 + doc/forum/Lyve_Home.mdwn | 6 + doc/forum/Make_whereis_output_more_compact.mdwn | 13 + ...king_git-annex_a_self-funded_project__63__.mdwn | 10 + ...ent_1_4a1ba95b7231ba973ddb672d2419e28c._comment | 8 + ...ent_2_7c476ae92e63c991f229708678874ca2._comment | 8 + doc/forum/Making_git-annex_less_necessary.mdwn | 5 + ...ent_1_03faaa3866778d24cd03887b85dc9954._comment | 12 + ...ent_2_2db02a94dffd525885c9d7fc6c5fa464._comment | 12 + ...ent_3_429ec656e0ac02f98843f8d7f3c02d6a._comment | 11 + ...ent_4_384813dd022dfd9c1ef14e0f1479a123._comment | 18 + ..._of_read-only_medium___40__E.G._DVDs__41__.mdwn | 118 + ...nt_10_a061d300b718ad943c940e122cc57220._comment | 23 + ...nt_11_76529080054407570611b4357ce4f3ed._comment | 8 + ...nt_12_9acf5ce41a023f3848a51891cceeb51b._comment | 21 + ...ent_1_25e65ee3949e7d918376298cf11585f2._comment | 10 + ...ent_2_8a71ca048f9de29a198a6afb17d5315e._comment | 11 + ...ent_3_e3d1d3a3d3d831432ec940a8ab6f31e9._comment | 14 + ...ent_4_26a33eae98b4faaf6baf6635e3d28a8f._comment | 27 + ...ent_5_49ac298d39c824b0e52a239961463e09._comment | 14 + ...ent_6_55a4a3616ea59654da1c2f9902561e3b._comment | 13 + ...ent_7_92a2af3e0e328bb48bcc67a69187ee57._comment | 13 + ...ent_8_f6e39e71882d55cdc061166aea3e2bd3._comment | 26 + ...ent_9_6c45a6264d69e22800c329a0f8a2d470._comment | 8 + ...ging_multiple_annexes_with_assistant__63__.mdwn | 13 + ...ent_1_ba8c70e4a46441b48ad910625636eee5._comment | 8 + ...ent_2_4b4f0a7d84a51ae92536e2c190256069._comment | 10 + ...ent_3_86daadc565f96db5db13b6dbcbc66db3._comment | 8 + ...ent_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment | 8 + ...ent_5_e94d33be83b45918d1a39d6e16fba4b4._comment | 8 + ...g_multiple_repositories_concurrently__63__.mdwn | 5 + ...ent_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment | 10 + doc/forum/Manual_Setup_of_a_Central_Repo.mdwn | 1 + ...ent_1_3a163fd5629dc40423f1290a78ae1c07._comment | 12 + .../Manual_commit_message_in_direct_mode.mdwn | 3 + ...ent_1_32f95eefec25bb127ed96248446c21b1._comment | 8 + ...ent_2_bf1d10067379c802ac5020d8becd6d35._comment | 10 + ...Manual_mode_option_in_assistant_auto-syncs.mdwn | 11 + ...ent_1_4a0468b6ca2ffff8ef8f19800597567d._comment | 10 + doc/forum/Manual_webapp_behaviour_on_ARM.mdwn | 15 + doc/forum/MegaAnnex_not_working..mdwn | 32 + ...ent_1_5aa3fd366d4c78ca79bb58005a49791c._comment | 8 + .../Missing_git-annex.linux__47__runshell.mdwn | 44 + ...ent_1_f29a5105649579ef15e79d983c4e1f8e._comment | 8 + ...tained_in_synchronized_remote_copies__63__.mdwn | 5 + ...les_within_the_repo_without_copying___63__.mdwn | 19 + ...ent_1_9e3290138133d5a23a80f72342f47ec4._comment | 8 + ...ent_2_232b77894dda51d02cbc34bd25d3213b._comment | 13 + ...ent_3_d35ac1bdb3fa6e303ad92348ba174158._comment | 11 + ...ent_4_4b443ec6b47eaabe214d0c2222083e4a._comment | 8 + ..._39__s_file_content_without_doing_checkout.mdwn | 4 + ...ent_1_f114b75b29123453758b493fae7f5167._comment | 8 + ...ent_2_e377b7614c2961b460a10e285f3db274._comment | 10 + ...ent_3_d251958795ab0867c65cf182e54a6ffe._comment | 8 + ..._after_some_weeks_with_git-annex_assistant.mdwn | 57 + ...ent_1_9d4019a54fb508e286a5d6d2660361d9._comment | 26 + ...ent_2_109534a45881ce94a4586c8a83945f9f._comment | 85 + ...d_new_build_instructions_for_Debian_stable.mdwn | 5 + ...ent_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment | 8 + ...ent_2_f6ff8306c946219dbe39bb8938a349ab._comment | 21 + ...ent_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment | 8 + doc/forum/Need_some_help_to_fix_my_repository.mdwn | 31 + ...ent_1_f0d279c530b796b2c93d793f85d147e8._comment | 13 + ...ent_2_a3fcfa1f8eadec5fa8a9efacca174048._comment | 10 + ...ent_3_7878f9b76ddfa3392c9ec6a1810cb745._comment | 10 + ...ver_unused_files_because_of_bad_sync__63__.mdwn | 23 + ...ent_1_af0ed0730645c1e3c9a4946acd48c18a._comment | 8 + ...ent_2_12f3c2bb2458b69e6355c8f94bab868f._comment | 13 + ...ent_3_b233b4daac32c452776e1e3d9a29f2cc._comment | 12 + ...ent_4_8e079e92929dcfdf19f6adec16f800e5._comment | 23 + ...git-annex_integration_mode_for_Emacs_users.mdwn | 3 + doc/forum/New_user_misunderstandings.mdwn | 24 + ...ent_1_c1785924109b5d5cde9aa3d3460cf955._comment | 10 + ...able_to_connect_to_the_Jabber_server__34__.mdwn | 5 + ...ent_1_59158afcedac18a7285d57491b2a468a._comment | 8 + ...ent_2_2a70ac08bb95774415b09dab7d7f8605._comment | 8 + ...ent_3_92a52b523ed4c68b70ddcabc2a050b76._comment | 12 + ...ent_4_c52a75761ea107f6d69c09bac64f0f0a._comment | 12 + ...ent_5_2685e3a87464ccd37d593516d94ba5cf._comment | 10 + doc/forum/No_SSL_traffic_for_S3__63__.mdwn | 8 + ...ent_1_f509bf273896180e6df8c771438dd093._comment | 11 + ...ent_2_358635d19c82202c63014ca84de7fc3b._comment | 8 + ...from_git-annex_status_v5.20131224-g692aa01.mdwn | 16 + ...ent_1_b014f1edcb7ce39da9b582683d3b80c0._comment | 10 + ...ent_2_24602de6cfe1f3d988c5105e7266a518._comment | 8 + .../Not_sure_how_to_get_my_s3_remote_back.mdwn | 31 + ...nt_10_ed35a6ec605e8f79ec107856af6d1a46._comment | 18 + ...nt_11_e48b6efa42159dc83e1be11bfb54abcd._comment | 14 + ...nt_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment | 31 + ...nt_13_85368b60091dc3ce2efb58013ffe9f83._comment | 10 + ...nt_14_e65281bef23e0076936c508728a87897._comment | 25 + ...ent_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment | 10 + ...ent_2_0cfcc2075bff556b9fde5acc3dc1d599._comment | 8 + ...ent_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment | 8 + ...ent_4_64338d2d77dcbabd16b55eb145f40dc6._comment | 12 + ...ent_5_dd66c9ea0c83388f6826751944330d10._comment | 16 + ...ent_6_dc0c5e395e4c443b7227afdb157194e5._comment | 10 + ...ent_7_3c0ea4c76cdd889707f7308576e3efa0._comment | 65 + ...ent_8_36519ee4499a19f0864e4fcd264e9933._comment | 20 + ...ent_9_85b23f375e53469fb09b24b945b3aba9._comment | 17 + doc/forum/OSX_Mavericks_anyone__63__.mdwn | 3 + ...ent_1_3075b02aeb57adcbf4addf9fb4c123ba._comment | 11 + ...ent_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment | 17 + ...ent_3_7df9ba63cb1f385681242b4b58d6a87c._comment | 8 + ...ent_4_740fee31c4ca9d84428f97f63ffc075a._comment | 8 + ...fault_sshd_behaviour_has_limited_paths_set.mdwn | 12 + ...ent_1_a136ff877389f0930c066ba118edd9fd._comment | 10 + ...s_haskell-platform_statically_links_things.mdwn | 17 + doc/forum/OpenOffice___47___Libre_Office.mdwn | 5 + ...ent_1_98ed542fedd820d47bf8deb7d3232725._comment | 8 + ...ent_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment | 8 + ...k__44___whereis__44___find_and_status_cmds.mdwn | 5 + doc/forum/Overwriting_data_without_getting_it.mdwn | 3 + ...ent_1_f1c0199ee9bffcc84287370b89361294._comment | 26 + ...ent_2_6a1d08dbca206129ef6cf8aa97daeee1._comment | 8 + ...ent_3_52958e76e506fdbb6b533681ab619b3b._comment | 8 + ...cations_of_triply_nested_objects_directory.mdwn | 23 + ...ent_1_068a8f120d188b8fa5d3e5b687fd02dc._comment | 8 + ...ent_2_cc0f5be21fd1523bdddc7bcf6ff04435._comment | 10 + ...ent_3_1133795276371c86cdd52b25a8b20c52._comment | 28 + ..._publickey__41___On_second_Step_...___63__.mdwn | 36 + ...ent_1_6c74f0b43c457fe97b2d8630ca4fde29._comment | 10 + ...ent_2_b7a384e853e1756a684774348fad29e6._comment | 22 + ...ent_3_3a8a7f51cb04a92c576549d379b57248._comment | 12 + ...ent_4_582ad3ba0c62a77b08a10b37a780c670._comment | 15 + .../Please_fix_compatibility_with_ghc_7.0.mdwn | 1 + ...ent_1_d1d10217ebd0151e947b3a6cd37399ce._comment | 8 + ...lish_new_releases_not_shorter_than_11_days.mdwn | 6 + ...ent_1_da3d39de5be47ebe8b25a42ed1f36510._comment | 8 + doc/forum/Podcast_syncing_use-case.mdwn | 34 + ...ent_1_ace6f9d3a950348a3ac0ff592b62e786._comment | 10 + ...ent_2_930a6620b4d516e69ed952f9da5371bb._comment | 8 + doc/forum/Poor_man__39__s_IMAP.mdwn | 6 + ...ent_1_258ff23c462dc88b88ced405c4f5040f._comment | 11 + ...ent_2_c88d1abdda4cb526a6ee45a710c75bc4._comment | 10 + ...ent_3_3847e371db1c2788c075e7dca1fbd33e._comment | 8 + ...ent_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment | 8 + ...ent_5_d861fa69475ce526841b3195be8ee356._comment | 10 + ...ent_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment | 12 + ...ent_7_b3929281dff6078d77f1b9ae42e25bb6._comment | 16 + ...ent_8_69506e8c519196f44b9ed15b32f00106._comment | 22 + .../Portable_version_of_git-annex_for_windows.mdwn | 22 + ...ent_1_e5e60fa8d104a09152a8164d5a906aec._comment | 10 + ...ent_2_d8d1aa0920351e880ba6678bb97585de._comment | 10 + doc/forum/Post-Kickstarter.mdwn | 5 + ...ghts_in_directory_tree_below_objects__47__.mdwn | 77 + ...ent_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment | 14 + ...ent_2_9f51947b35ee04e473655e20d56c740a._comment | 16 + .../Previous_versions_in_direct_mode__63__.mdwn | 3 + ...ent_1_352d460acd5500587e679d934180eee4._comment | 10 + doc/forum/Problem_compiling_current_master.mdwn | 12 + ...ent_1_135df61ec850c06e3b48ccfef7b5b031._comment | 8 + ...ent_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment | 20 + ...ent_3_b737b3945103c5e2aa798b4e65fbce06._comment | 8 + ...ent_4_28c1b335ae388d4e1f22b711ac1c001f._comment | 8 + doc/forum/Problems_syncing_with_box.com.mdwn | 26 + ...ent_1_8db642849da4d42cd9a43142e2b7cb70._comment | 12 + ...ent_2_cd18f33647aebc04af5469e4ce1fbcd2._comment | 11 + ...lems_using_submodules_with_git-annex__63__.mdwn | 1 + ...ent_1_c7a927736d419d3c31c912001ff16ee4._comment | 7 + ...ent_2_26f6581b5969eb2cb77495c40de88951._comment | 11 + doc/forum/Problems_when_cloning_a_repository.mdwn | 22 + ...ent_1_191c091c384d8d97d24f8a77e8ff90ee._comment | 9 + ...ent_2_74ccbb09677444478074e9eab405fbaf._comment | 16 + ...ent_3_3436e26dd9fe07233a070d4e95d81cdf._comment | 16 + .../Problems_with_large_numbers_of_files.mdwn | 8 + ...ent_1_08791cb78b982087c2a07316fe3ed46c._comment | 22 + ...ent_2_0392a11219463e40c53bae73c8188b69._comment | 25 + ...ent_3_537e9884c1488a7a4bcf131ea63b71f7._comment | 8 + ...ent_4_7cb65d013e72bd2b7e90452079d42ac9._comment | 29 + ...ent_5_86a42ee3173a5d38f803e64b79496ab3._comment | 14 + ...ent_6_4551274288383c9cc27cbf85b122d307._comment | 11 + ...ent_7_d18cf944352f8303799c86f2c0354e8e._comment | 8 + doc/forum/Pruning_out_unwanted_Git_objects.mdwn | 3 + ...ent_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment | 8 + ...ent_2_7472943c02cfe2808b0d566e06caa1a5._comment | 8 + ...ent_3_6a1e7a83d94394454fc085f6d2728cd7._comment | 8 + doc/forum/Purge_a_remote.mdwn | 2 + ...ent_1_78b3b77f457c65d31fd8a5abf714905d._comment | 8 + ...ent_2_dc65719157dee63b3979563ed57ee0ce._comment | 10 + ...ent_3_63e0280273b816fa4b837724e102f813._comment | 8 + ...ent_4_7fad1c4798ca03a4095ac3241c279f6d._comment | 11 + doc/forum/Push__47__Pull_with_the_Assistant.mdwn | 1 + ...ent_1_f7b63d379c2d21794adf8658f546f8a7._comment | 10 + ...ent_2_aec8cc20576e7ffd5a8be4348d1a0073._comment | 21 + ...shing_git_repo_to_AWS_S3_from_behind_proxy.mdwn | 9 + .../Reappearing_repos_in_webapp_and_vicfg.mdwn | 43 + ...ent_1_bd977e864ae89816fa7f4ff69879b15f._comment | 8 + ...ent_2_05749f9e75689d0111339b7126c12300._comment | 15 + ...ent_3_b1531994eea0fbbf4cb097e604378a53._comment | 12 + ...ent_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment | 12 + doc/forum/Recommended_number_of_repositories.mdwn | 4 + ...ent_1_3ef256230756be8a9679b107cdbfd018._comment | 15 + doc/forum/Recover_files__44___annex_stuck.mdwn | 28 + ...nt_10_6d85c3ec73ddc0682d9643f4d5eeda70._comment | 18 + ...nt_11_52e799bb6f24a1ebed58fad6cebd3a71._comment | 17 + ...nt_12_686a285bc7e950aae67856c47e7cb21e._comment | 18 + ...nt_13_a4d62d494b340458e6535d573bade965._comment | 12 + ...nt_14_c10f0fe1440ccd170804a433db2267ee._comment | 12 + ...nt_15_14446cafac6c33a3f95b5344c42c0bef._comment | 14 + ...nt_16_63c19f58b7e95e39ba25a735bdcc0bcf._comment | 10 + ...nt_17_8e5c7572ab8d1f0e41fedf6f805b942a._comment | 8 + ...nt_18_e5357c63107f79571bd3ff609b4406a7._comment | 26 + ...nt_19_3316652073710f39965cd49ceea5c4ff._comment | 8 + ...ent_1_d605f755c363d56cf5f1060ad06ee173._comment | 8 + ...ent_2_f3ee184a4d3b8d82a8a362a6c03a54a3._comment | 54 + ...ent_3_341b47663d133411587ec70ef2b178c6._comment | 14 + ...ent_4_66c0d9284d5edbac189a64b03c4fe50a._comment | 10 + ...ent_5_8b32f6597f447f88bee7a80698fb4df6._comment | 18 + ...ent_6_4cc81169e99a453cdb6e83e57e638f37._comment | 8 + ...ent_7_2d104cf4682e04906f8ca0ced7288cf1._comment | 17 + ...ent_8_d356c4fce9f1197e5292f9dedf85bbc9._comment | 22 + ...ent_9_856c7e1575f5d99530ecd54004315487._comment | 12 + doc/forum/Relocating_annex_directory.mdwn | 1 + ...ent_1_13ff5438baa1db110beb6aab3a783def._comment | 11 + ...ent_2_6d88ff03fcf00ae872442e8a86c968ed._comment | 10 + .../Remote_server_only_for_the_git_repository.mdwn | 3 + ...ent_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment | 10 + ...ent_2_a62dec8ab98ac7bd65059a9e425a01e2._comment | 9 + ...moving_files_not_found_by_git_annex_unused.mdwn | 29 + ...ent_1_420c6230e68de0a0ac7d7da91ac60801._comment | 8 + ...___34__dumb__34___client_without_git-annex.mdwn | 11 + ...ent_1_077c492fd37d335f74a5c886ff0d524f._comment | 32 + ...ent_2_00e6576e3e60d2650461eeb0f918e6e5._comment | 8 + ...ent_3_c36a9562c53ac683b62fc4471405aa2a._comment | 15 + doc/forum/Restricting_SSH_+_supply_key.mdwn | 7 + ...nt_10_8bbd0b6488c23ce8b182bd6b1765c94b._comment | 11 + ...ent_1_cac35ac1ac0b300ddfac5ffc74291bce._comment | 12 + ...ent_2_e9803dd1794b4d078efa9435ff5ba295._comment | 19 + ...ent_3_1c3beb859e76cb69d2bacd2473ec72b7._comment | 10 + ...ent_4_1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment | 23 + ...ent_5_4dbd5605f2638de0a3edfb3886a47938._comment | 22 + ...ent_6_a9c5b424a6acb2da152bf87b2e7617bb._comment | 8 + ...ent_7_93b7c2a5947fb6904c88cd5c120e404c._comment | 16 + ...ent_8_beaa350751eca4642545d1b83e528dd7._comment | 10 + ...ent_9_2faceeaf0d39f82e5d624eae19e4ca53._comment | 31 + ...g_git-annex-shell_to_a_specific_repository.mdwn | 25 + ...ent_1_66544520bff71181e4a03ca583b0b458._comment | 12 + ...ent_2_2a210255e8535712c71fa183e56ab600._comment | 13 + ...ent_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment | 8 + .../Retrieve_previous_version_in_direct_mode.mdwn | 5 + ...ent_1_ca3a999ed64c42b8df810115de205d2f._comment | 12 + ...ent_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment | 8 + ...ent_3_699e816c0397f6db924feeab906f1151._comment | 8 + ...ent_4_d900388753de5870b7b9c0e8b8c06ed7._comment | 8 + ...ent_5_1360b936aa389a0ab5e5e453824b2ece._comment | 9 + .../Revert_file_linkage_to_original_files.mdwn | 9 + ...ent_1_898ca2c9976e92d22470c7404aa9813f._comment | 10 + ...Revert_to_a_precedent_state_in_direct_mode.mdwn | 3 + ...ent_1_1ae9f7defbab44621c3108973a4f683a._comment | 26 + ...ant_on_a_server___40__no_X_available__41__.mdwn | 2 + ...ent_1_dd75d78ef63f2689199a302ed1846017._comment | 8 + ...ent_2_df654df60c5fa6a84d786d248928a352._comment | 11 + doc/forum/Running_assistant_steps_manually.mdwn | 20 + ...ent_1_e14e0a1d55d01cb4f67a94bbe349b872._comment | 20 + ...ent_2_3192f614c929b8060d4fbde56a7adec1._comment | 14 + doc/forum/Running_out_of__inodes.mdwn | 17 + ...ent_1_abc73d9ad662ef642337b683bf0a0253._comment | 12 + doc/forum/S3_Host_Question.mdwn | 11 + ...ent_1_8c8ecea703405753e47e0da5e8325929._comment | 11 + ...ent_2_3d6fa3147d59a5e0d10b005388b23c7a._comment | 8 + ...ent_3_797edf3ad41561ab8960f3b28d20611e._comment | 8 + .../Same_Jabber_account_for_different_annexes.mdwn | 1 + ...ent_1_90c3954fe11980eef42b5f5d34f83488._comment | 8 + ...ent_2_802600b3568e5f94d0550092b22975db._comment | 8 + doc/forum/Securing_a_shared_ssh_server.mdwn | 3 + ...ent_1_ea971b57d94db5b8d487f728faa5e9a8._comment | 10 + ...ent_2_421a19f6e1fb40db6ee205daf8e3f867._comment | 15 + ...ent_3_acdbf92f646dbbf691621f08b3d94c26._comment | 12 + ...ent_4_67533d08e1b8706b844262e9c483d982._comment | 15 + ...ent_5_bf193e02b388b4358632a169d2425b5c._comment | 10 + ...ent_6_50d391992cd444080ebc70db30b215c5._comment | 9 + doc/forum/Sending_requests_across_the_network.mdwn | 15 + ...ent_1_8ff713d4c968705061bf2044ea0fe5a0._comment | 10 + ...ent_2_cb29e5346a8775d87d30b18b7fc005a7._comment | 10 + ..._special_remote_with_non-standard_ssh_port.mdwn | 13 + ...ent_1_1eb6990e93ec92cb6fd7dbee59f31072._comment | 13 + ...ent_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment | 8 + ...tain_files_of_a_repo___40__Assistant__41__.mdwn | 6 + ...ent_1_ec0d56cb31b918023a9184cee168b406._comment | 8 + .../Share_with_friend_copies_only_sym_links.mdwn | 38 + ...ent_1_a8d22dfefb219f0c9130cc294364b198._comment | 17 + doc/forum/Sharing_annex_with_local_clones.mdwn | 1 + ...ent_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment | 12 + ...ent_2_24ff2c1eb643077daa37c01644cebcd2._comment | 8 + ...ent_3_5359b8eada24d27be83214ac0ae62f23._comment | 8 + .../Simple_check_out_with_assistant__63__.mdwn | 2 + ...ent_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment | 8 + ...ightly_finer_control_over_file_whereabouts.mdwn | 18 + ...nt_10_bcb883d46a637dd1a8ef9a92733d202a._comment | 10 + ...nt_11_b7a8b9eaf114f883866fbf2be51b622f._comment | 8 + ...ent_1_6236bcfa9beba705ead3ec2141c5d835._comment | 8 + ...ent_2_ea935b37ca93e73c85d04df7c9bf6057._comment | 12 + ...ent_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment | 8 + ...ent_4_07a0a754a089c46ff69dc97ea7ba9384._comment | 22 + ...ent_5_e884c001a556a0c693d1cc9a97c068ac._comment | 8 + ...ent_6_3e8674b5857e4994dfbc26be4f4b2855._comment | 25 + ...ent_7_7aeabc2e52a39423e83fbd04560e8f91._comment | 8 + ...ent_8_53b95449cfad2fe0f72d2ad642822c03._comment | 15 + ...ent_9_a17c102a45e4fc3f101a79acb8eb4081._comment | 18 + doc/forum/Some_mounted_devices_not_detected.mdwn | 3 + ...ent_1_0ba07b95f12f57ea63bb450b88430c45._comment | 8 + ...ent_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment | 13 + ...ent_3_06c0db7d670d9b82823102d22db15a36._comment | 10 + ...ent_4_80820a29361c5be4a94672dacfdefa6f._comment | 8 + ...ve_lots_of_directories_in_root:_000...ffff.mdwn | 22 + ...ent_1_20147b287fd995fa8ac9e868b5974d8a._comment | 12 + ...Special_remote_public_key_encryption_issue.mdwn | 18 + ...ent_1_a9caafea017a3c148f89d4ddeee15a4c._comment | 10 + ...ent_2_adfa582d611ca501e21110282df07315._comment | 18 + ...ent_3_eac16bf98a6e87461ba2f3ab7e990b2b._comment | 10 + ...ent_6_097f52aaf178340b3abb5bfc80f0d447._comment | 8 + doc/forum/Special_remote_without_chmod.mdwn | 12 + ...ent_1_4f5f9506cae72a1f321296fc5a5f339a._comment | 8 + doc/forum/Ssh_remote_on_NAS.mdwn | 34 + ...ent_1_1dd8a0d0e70a1fb36fce62e89c99b404._comment | 10 + ...ent_2_261601313d8825c52322949b8509bc74._comment | 16 + ...ent_3_ed602f4f972b78bce4f62bdfca8cfe47._comment | 11 + .../Standard_groups__47__preferred_contents.mdwn | 14 + doc/forum/Starting_assistant_from_CLI.mdwn | 9 + ...ent_1_afd51ddb0f1bb3cac528e1d96829ef83._comment | 12 + ...ent_2_76c34c00cf2065809b15a594023a688b._comment | 11 + ...ent_3_f7826867f78b1adbfc2dad2fad4d6720._comment | 17 + ...ent_4_fa7055a232a1dcb743db47308f7acf0b._comment | 14 + doc/forum/Storing_git_repos_in_git-annex.mdwn | 27 + ...ent_1_ac7b52c0b0f75d79760ffe6a9b5c8759._comment | 20 + ...ent_3_3bec1f02ff1a61791e3cbb428c7acb4c._comment | 12 + ...ent_4_76ddbd27cc2f3785bb5aaebb0bb6e087._comment | 14 + ...ent_5_f9520cbc6669622aa342acad35581943._comment | 14 + ...ent_9_d5676400e7148b7d3408f2bdb3d54b7d._comment | 8 + .../Storing_uncontrolled_files_in_an_annex.mdwn | 3 + ...ent_1_175645a90be0c79221c129308adf643e._comment | 27 + ...ent_2_d29f214eadfe3bfd098bbc3bcf07129a._comment | 8 + ...ent_3_286b502e7906cca50e9e747db735bc88._comment | 10 + doc/forum/Stupid_mistake:_recoverable__63__.mdwn | 31 + ...ent_1_00ceb3a5e37825c4bbc806f532893706._comment | 23 + ...ent_2_cbedc29678d9b6af3b3c0bb1915d2391._comment | 12 + ...ent_3_86aa4d92a1330811862da1ba568b3037._comment | 42 + ...ent_4_6d15bf8a3c3c27cc92957070161675a9._comment | 12 + ...ent_5_f836b9b1d03d94c49e3798961790b2ba._comment | 21 + ...:_Put_ssh_server_back_into_android_version.mdwn | 9 + ...ent_1_5c2f376a82458c6387560355940419d3._comment | 12 + ...ent_2_6321dec0b2f22f841f3cb986e063113f._comment | 8 + ..._is_not_available_from_my_central_git_repo.mdwn | 7 + ...ent_1_b31d02c97447996495de73705ac39f71._comment | 12 + ...ent_2_098465ae8af32931779d2cd63750d5dc._comment | 10 + doc/forum/Sync_with_one_offline_peer.mdwn | 11 + ...ent_1_3859d842d4f7e2ef44877b05ebe881fb._comment | 20 + ...ent_2_c9ba3983b37b0c1868269616fd81e518._comment | 14 + ...ent_3_28b9c003b4560c3ce90c9ebf808b091b._comment | 10 + doc/forum/Sync_without_jabber_account.mdwn | 9 + ...ent_1_3e95ac2e67451f953cf0538094109f8b._comment | 10 + ...chronize_large_files___40__VM_images__41__.mdwn | 10 + ...ent_1_619f6ed2d7da5832ab253d61b6dd8044._comment | 10 + .../Syncing_machines_on_different_networks.mdwn | 9 + ...ent_1_1c3523c722c178a96b096a68b9be4165._comment | 8 + ...ent_2_d7b14ffee65072329cfe9ab08a0dba50._comment | 8 + ...ent_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment | 15 + ...ent_4_2ec67428af69d6c0ea051c6a67d58905._comment | 10 + ...ent_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment | 8 + ...ent_6_a55982c28d7b90e0b70ec2bb5e594e08._comment | 8 + ...ent_7_c519d546e1a2a4e834609f3de3a605b0._comment | 8 + ...ent_8_84a822238ddbaf211cce5f527c3559d3._comment | 8 + ...ted_remote_from_a_different_computer__63__.mdwn | 4 + ...ent_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment | 8 + ...ent_2_25cbdf478091af9923090e049c432a7d._comment | 22 + ...ent_3_7e71d355457d6b1a0391d4cdae6895e6._comment | 16 + ...ent_4_a73f67f2fcf0762fbd7c8366b3844af6._comment | 11 + ...yncronisation_between_3_repositories__63__.mdwn | 11 + ...ent_1_ca5192a26950627a1c2efcb55d6d2fa3._comment | 10 + ...a_bit_while_committing_it_repeatedly__63__.mdwn | 3 + ...ent_1_3cbe520b184d323219cb402ff046c3b4._comment | 29 + ...ent_2_6afe7f593e955db2eefe87d9fa01882b._comment | 8 + ...ent_3_209399487fc4f76b29f03ad82dbc2d6f._comment | 8 + ...ent_4_f33fd6f72cb9ad7dd20a04c82199413b._comment | 26 + ...irectory_with_some_hg_and_git_repositories.mdwn | 1 + ...ent_1_9fc3f6c2f7379755e0084a850fa9acd4._comment | 10 + ...ent_2_f024d6a105143af1e06aafe49661ee06._comment | 8 + ...ent_3_aff0093c38bda8b093f05e8cbe8775e9._comment | 8 + ...ent_4_c889050d3079edefc4633451bd5baff8._comment | 11 + doc/forum/Transfer_remotes.mdwn | 3 + ...ent_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment | 8 + ...ent_2_98930629d398329f1161135464a966a5._comment | 12 + ...le_installing_from_cabal_on_debian-testing.mdwn | 15 + ...ent_1_0d3e9d7cffafc34bc212557e8bbb987d._comment | 12 + doc/forum/Truly_purging_dead_repositories.mdwn | 1 + ...ent_1_a4c75d49714b3543a9f1617a15d4a2d1._comment | 8 + ...ent_2_3da60a02e7323a204c5c5dd02ba04d6c._comment | 8 + ...ent_3_2576e45436008ff5a7ae5a38cade658e._comment | 8 + ...ent_4_477e3c213c5a5d4a33afd42a5b94c718._comment | 10 + ..._full_backup__34___repository_groups__63__.mdwn | 18 + ...ent_1_b8702892280447193e6e80be22a580a0._comment | 11 + ...ent_2_50cafde7e30b928480d1f142ddd763d2._comment | 10 + doc/forum/USB_backup_with_files_visible.mdwn | 7 + ...ent_1_2832f8ae24dfb0f101e06f7c18283028._comment | 10 + ...ent_2_6163e01aa441f8435091f026cc6da337._comment | 8 + ...ent_3_ee92ff320eb5d9a031bdd1896aee0d86._comment | 11 + ...ent_4_437c8342c0b65e3a89129800313eb73c._comment | 10 + ...ent_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment | 8 + ...ent_6_add048a16837f7940a859f21426cdbe9._comment | 8 + ...ent_7_de227ca9911fe57d7a6d3e037f574fe9._comment | 14 + ...ent_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment | 10 + ...n_transfer_group_keeps_growing_-_assistant.mdwn | 22 + ...ent_1_0a6f6054d70009979f4a036e24b7c500._comment | 10 + ...ent_2_f9eef3019fe690e90c1228d62a16f70a._comment | 10 + ...ent_3_7fb74f7fab6c1baff4ffc270cf15ef0a._comment | 15 + doc/forum/Ubuntu_PPA.mdwn | 3 + ...ent_1_b55535258b1b4bcfc802235f0cba075d._comment | 8 + ...ent_2_adc4d644fed058d1811acf0b35db9c18._comment | 8 + ...ent_3_fc9cd51558c47718f243437202a11803._comment | 8 + ...ent_4_3a8bbd0a7450a7f5323cd13144824aea._comment | 12 + ...ent_5_2e1beaeebda0201c635db8b276cedf20._comment | 12 + ...ent_6_bd99fb70399fc58d98781a89c6d38428._comment | 8 + ...ent_7_c3f7ec8573934c59d70a48e36e321c13._comment | 12 + doc/forum/Un-git-annex__63__.mdwn | 6 + ...ent_1_6059265afb66190d325083e0f28bcf33._comment | 10 + ...ent_2_fac4bfb81dbbf0dc82059aace261eb51._comment | 10 + .../Undo_Git_Annex_Changes_To_Linked_Files.mdwn | 7 + ...ent_1_568dde820c2608d86d05b07444146a26._comment | 13 + ...ent_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment | 8 + doc/forum/Unknown_remote_type_S3.mdwn | 5 + ...ent_1_2aea2cd51286c809427d16519606cd37._comment | 8 + ...ent_2_06f775062cd30767979fe56bcb3cf7bf._comment | 8 + ...lock_files_when_assistant_is_running__63__.mdwn | 13 + ...ent_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment | 10 + ...ent_2_a76797ee9e05e43af7947508cadd7bed._comment | 9 + ..._with_syncing_only_a_subset_possible__63__.mdwn | 13 + ...ent_1_a0a272a0931b27e5c94b93e42656b62c._comment | 10 + ...s_instead_of_re-downloading_from_S3_remote.mdwn | 3 + ...ent_1_cfb6021a36eee087705967a69967f327._comment | 10 + ...ent_2_7268b194ba72331858bc3274996b780e._comment | 11 + ...flinks_on_BTRFS_instead_of_symlinks___63__.mdwn | 1 + ...ent_1_85806316ed28d7a891f04fab4027141b._comment | 8 + ...ent_2_ecb411a2c4d67917b734a90bd460d44b._comment | 10 + ..._44____while_also_cloning_and_syncing_too..mdwn | 11 + ...ent_1_30205c1ba18e5dca2314f593e1a0e236._comment | 8 + ...ent_2_f8df728de28218a6b060ae9f08adac79._comment | 8 + ...ent_3_ba438b3a371261ee841665f1ae57eba2._comment | 8 + ...ent_4_9f72e6c7c14a77330297526aef260762._comment | 11 + ...ent_5_a06e8c9b4e30c1cd6cbed40d2db50abc._comment | 10 + ...stant__41___to_manage_photos_with_Shotwell.mdwn | 13 + ...ent_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment | 12 + doc/forum/Using_Linux_static_builds.mdwn | 25 + ...ent_1_22fd266cbe68af3e754a10f1f1295e9b._comment | 13 + ...ent_2_36f69f30117ff8696425a754ab19a08b._comment | 8 + ...ent_3_64506833dad0202626239e00d1eb6490._comment | 23 + ..._34__sync__34___to_sink_all_branches__63__.mdwn | 9 + ...ent_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment | 16 + ...ent_2_424b0c6fdfe87ca08f5d408b7684ab08._comment | 10 + ...ent_3_adaf9114c69f1268330adcebd8018fa0._comment | 10 + ...or_multiple_independent_client_repos__63__.mdwn | 36 + ...ent_1_c61c28600f1079fb03ddabc950307f27._comment | 11 + doc/forum/Using_for_Music_repo.mdwn | 13 + ...ent_1_3488ed85ad98f14cb17f229225ece26e._comment | 10 + ...ent_2_c794648878cfc77558f8db862271f997._comment | 25 + ...ent_3_8c5e820f5ff7d717d64b1fd66927941b._comment | 8 + doc/forum/Using_git-annex_as_a_library.mdwn | 1 + ...ent_1_1f8e74c5856f21c53d5a91892cbef0c6._comment | 8 + ...ent_2_11a243fa7d8ac947aa9a798228dbd191._comment | 12 + ...ent_3_ac52304a096ebc66967352efaffb060a._comment | 8 + ...ent_4_d502fea60bf3a82f8a50f72a90a80c25._comment | 8 + .../Using_git-annex_via_command_line_in_OS_X.mdwn | 3 + ...ent_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment | 8 + ...ent_2_52d8ffba82e29ac2722a8e43e469cc47._comment | 9 + ...ablet_which_only_has_exFAT_and_no_symlinks.mdwn | 8 + ...ent_1_b9f202a30ba7e3bc264064d24454c099._comment | 12 + ...ent_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment | 18 + ...ent_3_076f22d05fad140068a540e4d835106f._comment | 8 + ...ent_4_c8446ee1b817f1824fa0df07e742015c._comment | 12 + ...ent_5_f746c1b85ee8e4b57b6819ccceabd28b._comment | 8 + ...MB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn | 5 + ...ent_1_bd73c8d10028e1b45da9ea8f657e5064._comment | 10 + ...ent_2_16c3c994ee8fcb466e52ca0e812e5915._comment | 8 + ...ent_3_ac60f6edb76bdd541711e472eec9591a._comment | 10 + ...ent_4_2194f0600d9a90f0d9c947ea9cc213a3._comment | 8 + ...ent_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment | 48 + ...ent_6_ae323b16ddb9342e91be955408eca3b1._comment | 8 + .../View_performance_with_7__44__000_files.mdwn | 26 + ...ent_1_e45ea752100d09d29efb6136a722eab3._comment | 34 + ...ent_2_b1942eed65e9b5c046095a094191a38c._comment | 8 + ...ent_3_e6e19339c9d72cf8eaae32ef4269e850._comment | 10 + ...:_linker:git-annex_has_text_relocations....mdwn | 7 + ...ent_1_fee360353f0b46aab6ee7a902c0837bb._comment | 11 + ...k_for_me__44___what_am_i_doing_wrong__63__.mdwn | 16 + ...ent_1_cdac15fec6fc41d5487b7f653fa718a4._comment | 14 + ...ent_2_82050b7dc367ca5968ab0306db9bd7e3._comment | 10 + doc/forum/Walkthrough_for_direct_mode__63__.mdwn | 1 + doc/forum/Want_to_stop_using_Git-Annex.mdwn | 9 + ...ent_1_32e37515bd4f5d22ff9aedd3c9d98046._comment | 10 + ...ent_2_e29e6d052ef3677ad7d5615721f3fe33._comment | 8 + ...h__47__assistant__47__webapp_documentation.mdwn | 12 + ...ent_1_adb377589dbae7fc91001df235c6b48e._comment | 14 + doc/forum/Webapp_not_watching_repos.mdwn | 1 + ...ent_1_02735050122afdb6498d91b462d32767._comment | 12 + ...ent_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment | 12 + ...ent_3_b448aa5a95a57a5228b361390e5fc838._comment | 8 + doc/forum/Webapp_on_ARM.mdwn | 6 + ...ent_1_82ac40cef5b59070136527b8d81a5ce2._comment | 10 + ..._behavior_with_OS_X_Finder_and_Preview.app.mdwn | 12 + ...ent_1_8c8d86790a9d31518f9bb96a2d2dafee._comment | 18 + ...ent_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment | 8 + ...ent_3_16e6724fa184392d4decbe0c4eb6efe6._comment | 14 + ...ent_4_e514fe2d4d0ad6a10e281939e6ab4266._comment | 15 + ...ent_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment | 10 + .../What_can_be_done_in_case_of_conflict.mdwn | 7 + ...ent_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment | 12 + ...ent_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment | 10 + ...ent_3_017f4bac57a040c496e0c9d068dcfd9e._comment | 41 + .../What_happened_to_the_walkthrough__63__.mdwn | 1 + ...ent_1_70db0e3cfb1318e95671c23726e5541d._comment | 8 + ...ent_2_f9305dd19b9b5f35e66d915b8c30374b._comment | 7 + ...tory__34___on_an_existing_repository__63__.mdwn | 1 + ...ent_1_d844cfe5f9907a766e871b64d68966c2._comment | 8 + ...way_to___34__git_annex_mv__34___file__63__.mdwn | 1 + ...ent_1_02d305f307b4d2ff7acd98cb36508a2f._comment | 10 + ...mputer__34___and___34__remote_server__34__.mdwn | 3 + ...ent_1_68734a118b7dc0c88ba67eca20953a55._comment | 10 + ...only_an_encrypted_ssh_remote_is_left__63__.mdwn | 1 + ...ent_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment | 12 + ...ent_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment | 8 + ...ent_3_bd506e1ca7307660b3b9769eb97beddb._comment | 8 + doc/forum/Where_is_the_content__63__.mdwn | 8 + ...ent_1_812e1cf740cbfa449ab3ef4dd5f2df08._comment | 132 + ...ent_2_5e2cfdfab6c4f84fe7a19447b417b5a7._comment | 8 + ...ent_3_bd4cbc8f256a94ffde4f57d2c406a9ec._comment | 16 + ...ent_4_a36b35d47472b5db779b0489bf3d4893._comment | 10 + ...Which_cloud_providers_are_supported__63___.mdwn | 3 + ...ent_1_1f9398840144e0452a2fed9336046547._comment | 10 + ...tion_be_enabled_for_removable_drives__63__.mdwn | 7 + ...ent_1_4341898d5ae4f09a5b06d24f5fe6192d._comment | 8 + ...the_bup_remote_use___126____47__.bup__63__.mdwn | 5 + ...ent_1_da9c7c0e93aefc2da7409de5b138d86f._comment | 8 + .../Will_git-annex_solve_my_problem__63__.mdwn | 7 + ...ent_1_35acbdd1a7727df204d776c2e8f02b53._comment | 8 + ...ent_2_230256c19ac139dea207d89c06f70782._comment | 8 + ..._annex_work_on_a_FAT32_formatted_key__63__.mdwn | 3 + ...ent_1_426482e6eb3a27687a48f24f6ef2332f._comment | 8 + ...ent_2_af4f8b52526d8bea2904c95406fd2796._comment | 8 + doc/forum/Windows_S3_host_issue.mdwn | 11 + ...ent_1_8c0a1e84713a04a25fdc1f74919d34aa._comment | 10 + ...ent_2_06ecc76797c430b27a2e24776761d043._comment | 8 + ...ent_3_1715557daa15b9e9e17b4850141e62af._comment | 10 + doc/forum/Windows_support.mdwn | 6 + ...ent_1_23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + doc/forum/Windows_usage_instructions.mdwn | 25 + ...ent_1_d43dbd9406da3b9747b147715eca94ac._comment | 8 + doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn | 5 + ...ent_1_13544d54fb0418af4ca9200cdb045d91._comment | 15 + ...ent_2_9a7dad35bf80c684ad97892420d7370c._comment | 16 + ...ent_3_e5de748bc5da12a4a01e08cde2407dd1._comment | 14 + ...ent_4_e51530178f1e034c0fdd5c9aa9945567._comment | 8 + ...ent_5_81ea9c129d8c02097f09ef8c68f1bb11._comment | 27 + ...ent_6_3b5798414f89686526da3dfa72c0c4f2._comment | 10 + .../Wishlist:_Don__39__t_make_files_readonly.mdwn | 3 + ...ent_1_7148527961e2d27793810966588c8d35._comment | 10 + ..._files_without_copying_the_file_data__63__.mdwn | 6 + ...ent_1_1cf4ab29dfa2cff59b86305fc0018251._comment | 10 + ...ent_2_f5ebb7f43dcef861ecc13373fb1e263f._comment | 15 + ..._selecting_files_based_on_meta-information.mdwn | 15 + ...ent_1_818f38aa988177d3a9415055e084f0fb._comment | 15 + ...ent_2_97e2ed48bd552d02918c4f98f963e6e1._comment | 9 + doc/forum/Wishlist:_automatic_reinject.mdwn | 14 + ...etting_the_disk_used_by_a_subtree_of_files.mdwn | 10 + ...ent_1_7abb1155081a23ce4829ee69b2064541._comment | 9 + ...ent_2_b4c6ebada7526263e04c70eac312fda9._comment | 18 + ...ent_3_ded71b270b94617a8ebb3a713d46a274._comment | 19 + ..._as_a_daemon___40__for_the_assistant__41__.mdwn | 1 + ...ent_1_42aa2b61b880f4048d874210212aa63b._comment | 8 + ...ent_2_3e201039fa0e611554171ee30e69a414._comment | 8 + ...ent_3_d1074724c44f3296cb438b2d526d8728._comment | 8 + doc/forum/Wishlist:_mark_remotes_offline.mdwn | 12 + ...ent_1_9e3901f0123abb66034cce95cc5a941a._comment | 14 + ...ent_2_d10e3d90cf421ae425e64ab266ea811b._comment | 12 + ...st:_options_for_syncing_meta-data_and_data.mdwn | 13 + ...___special_characters_if_filesystem_is_FAT.mdwn | 5 + ...ent_1_5d33bcbd862537f53edd91dcff2b8977._comment | 13 + doc/forum/Workflow_for_adding_files.mdwn | 32 + ...ent_1_a60dae97db827bc641d6256d1f382b5f._comment | 8 + ...ent_2_28dd15ac50f79fb07bacf8b8326c7edc._comment | 19 + doc/forum/XBMC__44___NFS___38___git-annex_.mdwn | 27 + ...ent_1_86480f31d410e903766f82e6ecf83e1c._comment | 12 + ...ent_2_d8ed4dd51d3050db691a8abdec24cd42._comment | 10 + ...ent_3_42b80ee51ce25775bf4532f53a8ecfe3._comment | 11 + ...ent_4_01767f3f864954cf8080274e206da9d4._comment | 8 + doc/forum/XMPP_authentication_failure.mdwn | 15 + ...ent_1_19c7c3aa79d209d613d2e061e3129690._comment | 8 + ...ent_2_870059fed451e8377e5d382464ecc34b._comment | 8 + ...ent_3_1a7ff955e9173f13d10b75f203792384._comment | 10 + ...ent_4_d59031ebc0dd3abc1f4c96878328362c._comment | 8 + ...ent_5_c37ef477bef7efdb79dd05dce90dfde6._comment | 10 + ...ent_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment | 8 + ...ent_7_14cd9b67806db93c3af055d88c9a910a._comment | 10 + ...ent_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment | 24 + ...ent_9_fbb9eba65fbb72201f08511945fbcf8c._comment | 9 + ...an_I_provide_some_kind_of_debug_data__63__.mdwn | 9 + ...ent_1_1ba0735141fc6a21ac15913f4cacefae._comment | 8 + ...ent_2_16994dc86b87592fc62799e2d206d172._comment | 10 + ...ent_3_6afd424edc4095b8f71b136de2a9e64d._comment | 10 + ...ent_4_1381b6a927410642c6a93aa8354be791._comment | 17 + ...ent_5_c5b33c7a8aa8e6d0f9349510dac2366d._comment | 12 + ...ent_6_9913d2983ba2744ed24911f74988e4c7._comment | 11 + ...ent_7_ad6f385a2b95803eb9d81dfe76359551._comment | 10 + ...___batch_queries_to_the_location_log__63__.mdwn | 45 + ...ent_1_01cbfc513c790faef3a3ede5315d3589._comment | 10 + ...ent_2_fe28dfb360caa12d5d5bc186def3eb45._comment | 35 + ...ent_3_9bb30ab62febe4ef63bed49f831a473a._comment | 8 + ...ent_4_7832f0347a41b8204538c01b72487803._comment | 19 + .../__171__Locking__187___files_until_synced.mdwn | 7 + ...ent_1_8bf59f47fee0a8d5741fe209b5899863._comment | 8 + ...ent_2_0c683547a6178e4303f0b1ed1f5605a5._comment | 8 + ..._34__Pairing__34___more_than_two_computers.mdwn | 11 + ...ent_1_80f7a4bb3c66b11e566043407b611bbf._comment | 10 + .../__34__Preseeding__34___a_special_remote.mdwn | 5 + ...ent_1_b0c46d0eba900d0f6169a2c698d7a222._comment | 12 + ...ent_2_5e63f5e6f45c11cc86b293ce8acad77f._comment | 65 + ..._34__du__34___equivalent_on_an_annex__63__.mdwn | 5 + ...ent_1_a41bd02361aa961e5285aeaf1ea062be._comment | 10 + ...ent_2_28ba62a546f5cc8f416491423d743d8a._comment | 10 + ...ent_3_8d97f40c1d14b7230f3656a00a99cf80._comment | 8 + ...ent_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment | 18 + ...ent_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment | 10 + ...ent_6_48f6a2761a34b7f991325f1d24e2c5ff._comment | 8 + ...ent_7_d632baff41b8582f1a79bc5018c68545._comment | 8 + ...doesn__39__t_send_it_to_working_directory..mdwn | 11 + ...ent_1_0c0a5999a92bf5880f2113177dc67cc2._comment | 11 + ...ent_2_c18083d9054f66f0bd51d63452af07eb._comment | 8 + ...it_annex_lock__34___very_slow_for_big_repo.mdwn | 7 + ...ent_1_044f1c5e5f7a939315c28087495a8ba8._comment | 16 + ...ent_2_e854b93415d5ab80eda8e3be3b145ec2._comment | 13 + ...ent_3_95c110500bc54013bc1969c1a9c8f842._comment | 8 + ...ent_4_a4fd212cb066cd53d0d66eb09f3b39a8._comment | 18 + ...line_I_would_like_to_have_file_x_y_z__34__.mdwn | 5 + ...ent_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment | 11 + ...ent_2_e60f2bbc1c058993472fd920edbc75fc._comment | 8 + ...ission_denied__34___in_fsck_on_shared_repo.mdwn | 17 + ...ent_1_3a5202ef2116ebb5559b6f4d920755fc._comment | 10 + ...ent_2_86663eeb75b0477f53c45f26c8e4b051._comment | 8 + ...ent_3_c336b2b07cd006d378e5be9639ff17ec._comment | 10 + ...ent_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment | 10 + ...rence_refs__47__heads__47__git-annex__34__.mdwn | 34 + ...ent_1_e50188896df347f1d92e20a52053aa14._comment | 10 + ...ent_2_d67793f7c969f64943d1fd54a1208c2b._comment | 15 + ...ent_3_3523884833b5fd458a35f898797bf897._comment | 10 + ...ent_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment | 10 + ...e-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn | 16 + ...ent_1_fae6e88115d175239fc55cef4c33fb2c._comment | 13 + ...ent_2_4c7a75638e8717132ccde949018d6008._comment | 10 + ...___manual_ssh_remote_setup_with_shared_key.mdwn | 19 + ...ent_1_811cab17410ba6e07ae7af3249cd98df._comment | 14 + ..._announce__93___metadata_extration_utility.mdwn | 30 + doc/forum/_preferred_content:_lastpresent.mdwn | 1 + ...ent_1_7610cd866b256d36646b642eb5f8cae5._comment | 14 + ...ent_2_d25666a173b78213d583f029fd166d06._comment | 10 + doc/forum/advantages_of_SHA__42___over_WORM.mdwn | 5 + ...ent_1_96c354cac4b5ce5cf6664943bc84db1d._comment | 8 + doc/forum/alternativeto.net___34__Like__34__.mdwn | 3 + doc/forum/android_binary-only_download.mdwn | 9 + ...ent_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment | 8 + ...le_key_for_web_remote_with_SHA256E_backend.mdwn | 12 + ...ent_1_d1605a6e3b4d6863f4089218994ce564._comment | 29 + ...ent_2_d249ff27fa3d9ac3ca32485cdef49930._comment | 8 + doc/forum/archaeology_of_deleted_files.mdwn | 36 + ...ent_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment | 10 + ...ent_2_c698cd10c8038bac45bd1049506a27c3._comment | 8 + doc/forum/archival_and_multiple_users.mdwn | 8 + ...ent_1_fc4ee256f03a7c189d687caf4a34e21e._comment | 9 + ...ent_2_a96d57d4bb567ac9b0b9167d5b1be011._comment | 12 + ...ent_3_bd44634b04732ffb91154c61ef9cf828._comment | 14 + ...ent_4_b89a56a5f1cd641f87925c7a5f74bcec._comment | 13 + ...ent_5_81293bf5dc8ad4552712c2083fd589c9._comment | 19 + ...nd_line_-_how_do_these_play_together__63__.mdwn | 10 + ...ent_1_d90d1d599ce557af03c6f0f2ea188212._comment | 10 + ...ent_2_58b1af497cab132acb28cb5f9283ec2a._comment | 8 + ...ent_3_37d4fd8f69e8066b5aa19454b714e443._comment | 11 + ...ent_4_a974e2105774d4f82ad286ff0792ba84._comment | 10 + ...rypted__backup_remote:_Howto_restore__63__.mdwn | 38 + ...ent_1_70200f871b9df49261f32752a6bb0e67._comment | 14 + ...ent_2_173da510b45f0320ae8aa2df9f14ae7b._comment | 11 + ...ent_3_1ecea12a4be5ad09013cddb62df6ab20._comment | 8 + ...ent_4_af4bc222d1479482bd83952353c97f05._comment | 8 + ..._overzealously_moving_stuff_to_other_repos.mdwn | 5 + ...ent_1_6bd240edf1868615024ff11c24c3d52c._comment | 13 + ...ent_2_37c5e9a7669b5b94fbadb8792a765316._comment | 8 + ...ent_3_87aa4c5942929be81ddc1e2795d56f0e._comment | 9 + doc/forum/assistant_without_watch__63__.mdwn | 13 + ...ent_1_be1f7c038426e53209a85ae1119269d5._comment | 15 + ...remote_server___40__needs_ssh_tunnel__41__.mdwn | 10 + ...ent_1_817a3ed424e4fb76fcd33295f2953250._comment | 8 + ...obuilders_for_git-annex_to_aid_development.mdwn | 34 + ...ent_1_7e88f815e8d9652ef18ea6d54b118962._comment | 8 + ...ent_2_fef17a10226af5671495c2929653c337._comment | 8 + ...nverting_existing_backups_into_new_remotes.mdwn | 3 + .../bainstorming:_git_annex_push___38___pull.mdwn | 28 + ...ent_1_3a0bf74b51586354b7a91f8b43472376._comment | 11 + ...ent_2_b02ca09914e788393c01196686f95831._comment | 14 + doc/forum/bash_completion.mdwn | 1 + ...ent_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment | 8 + ...ent_2_6cbe3c825db99bf9188a0de8bb937d5b._comment | 8 + ...ent_3_948c40f1e46ca220d61365aebcd4f6d7._comment | 136 + ...ent_4_dbae348b230b780cda91ed8576b8f9fa._comment | 8 + .../batch_check_on_remote_when_using_copy.mdwn | 34 + doc/forum/benefit_of_splitting_a_repository.mdwn | 10 + ...ent_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment | 15 + ...ent_2_4e2fed247298d620fee7be883a1e86a6._comment | 15 + .../best_practices_for_importing_photos__63__.mdwn | 13 + ...ent_1_37f0ae4b552ec2a4a144ddcdc17c8453._comment | 19 + ...ent_2_7f96f0fe0fc073321bd7c5bbd9048425._comment | 11 + doc/forum/btsync_equivalent__63__.mdwn | 8 + ...ent_1_6bfdc6f595a8aa8979a7c2a10925812f._comment | 8 + doc/forum/cabal_install_fails_on_uuid.mdwn | 23 + ...ent_1_2a3963e21bc7ff526124b902cb0b6ad2._comment | 8 + ...ent_2_1609525998e2b36c04d67f4d988139c0._comment | 10 + doc/forum/can_I_only_add_my_own_files__63__.mdwn | 27 + ...ent_1_767d647af9d0345f337338d6319071fa._comment | 10 + ...ent_2_0c3306ffb38b97b54e1e0436d12c1876._comment | 8 + doc/forum/can_git-annex_replace_ddm__63__.mdwn | 13 + ...ent_1_aa05008dfe800474ff76678a400099e1._comment | 12 + ...ent_2_008554306dd082d7f543baf283510e92._comment | 19 + ...ent_3_4c69097fe2ee81359655e59a03a9bb8d._comment | 12 + ...gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn | 18 + ...ent_1_21f0101447623f5a0cf9e72c3ff463bb._comment | 8 + ...ent_2_6234ca64bd03a0e15efbe8f5c204338a._comment | 8 + ...ent_3_5ac2b520a907e232984eb513ce088054._comment | 8 + ...ent_4_183dd1c29f66539193e7c0b73f329430._comment | 9 + ...ent_5_c920d04ffe332caed9d223fa0ac42746._comment | 7 + ...ent_6_7a3cf0853a8ec7b996e19b5e80145d21._comment | 8 + doc/forum/central_non-bare_and_git_push.mdwn | 9 + ...ent_1_76d0c73c8985e860eb86333c63be6340._comment | 8 + doc/forum/clear_box.com_repository.mdwn | 1 + ...ent_1_2e839d8f974269c80a9fca183712350f._comment | 8 + ...ent_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment | 8 + ...ent_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment | 10 + ...ent_4_f8c06ac9b23b51cf18d362c260fc47a9._comment | 13 + ...ent_5_61d401b29322802cb25896503f3e6514._comment | 8 + doc/forum/cloud_services_to_support.mdwn | 16 + doc/forum/cloudcmd.mdwn | 6 + ...ommit_current_workdir_state_in_direct_mode.mdwn | 5 + ...ent_1_748481ff00374f570284bd4571584874._comment | 10 + ...repository_vs._working_copy_in_direct_mode.mdwn | 10 + doc/forum/confused_about_external_drives.mdwn | 30 + ...ent_1_8340e5ff17a4846b41789e4966fed70c._comment | 12 + ...ent_2_ad10bd0ec14c16bcad089b3ebe64580e._comment | 10 + doc/forum/confusion_with_remotes__44___map.mdwn | 113 + ...ent_1_a38ded23b7f288292a843abcb1a56f38._comment | 10 + ...ent_2_cd1c98b1276444e859a22c3dbd6f2a79._comment | 8 + ...ent_3_18531754089c991b6caefc57a5c17fe9._comment | 24 + ...ent_4_3b89b6d1518267fcbc050c9de038b9ca._comment | 11 + ...ent_5_27801584325d259fa490f67273f2ff71._comment | 16 + ...ent_6_496b0d9b86869bbac3a1356d53a3dda4._comment | 8 + ...ent_7_9a456f61f956a3d5e81e723d5a90794c._comment | 27 + ...orrect_way_to_add_two_preexisting_datasets.mdwn | 25 + ...ent_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment | 10 + ...ent_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment | 16 + ...ent_3_e29bf8b848da04c761dc601ac979ac14._comment | 11 + .../could_not_read_from_remote_repository.mdwn | 36 + ...ent_1_27d4d1556a80c06505ed3d8a9422d082._comment | 8 + ...ent_2_cf7d5e231675921c3d98faab3613c92f._comment | 49 + doc/forum/differenc_in_webapp_icons__63__.mdwn | 4 + ...ent_1_c38e2692b13a1b76777bf88312a03966._comment | 8 + .../do_not_use_git-annex_inside_your_Dropbox.mdwn | 5 + ...ent_1_5a1dc9da6e6861829e321446ec7991ee._comment | 8 + doc/forum/dot_git_slash_annex_slash_tmp.mdwn | 5 + ...nt_10_14b74438bb1e3e02cff7926d774ba09a._comment | 8 + ...nt_11_b1f717342c1c8ea42a451caa2d936622._comment | 8 + ...nt_12_e2c6ad99333018c8c46e736da416b8ef._comment | 8 + ...nt_13_35ae9d6bcb8d9762a92e3564b686ed72._comment | 8 + ...nt_14_92b1e8956513dbf52da31cec3f58e2c5._comment | 104 + ...nt_15_839e29d41de9dcc8f01dfdc585a51d12._comment | 12 + ...ent_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment | 8 + ...ent_2_f4cc36c493d7c20fbaf949edd38e1252._comment | 15 + ...ent_3_69268f8aa29e807a56248f1fac86aa41._comment | 10 + ...ent_4_0ffb0c803c232a1587f956f16113aeb7._comment | 27 + ...ent_5_c303e28825241733d69fca74f2015fc6._comment | 13 + ...ent_6_3f0b376e37bd092b8d46c46bb1940e35._comment | 14 + ...ent_7_615641b3dd176d4b3a5bbfb521098e38._comment | 9 + ...ent_8_4600fa9234a787004ea0e0dbb36184b9._comment | 8 + ...ent_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment | 8 + doc/forum/downloading_from_moodle.mdwn | 76 + ...ent_1_3f677130d268de4288e87cfa86ea055c._comment | 10 + ...ent_2_dcef60ec144f123dadd165fb602ab950._comment | 8 + ...ent_3_d3efb767bf9b20f96242dcf64817bd4b._comment | 8 + doc/forum/drop_old_versions_of_a_file.mdwn | 3 + ...ent_1_799a413248fb8f98efbf226b1bc4300d._comment | 8 + ...t___40__user_error__41__._How_to_fix__63__.mdwn | 24 + ...ent_1_bb6d749b758b17178227929bf7327fe1._comment | 8 + ...ent_2_d834df30633f7d5569797ee818cf38c3._comment | 20 + ...ent_3_1e02eff33c9fa7bea03aa6d58b910175._comment | 14 + doc/forum/empty_directory_handling.mdwn | 3 + ...ent_1_34ac97b9337b6230ed8a4748203fe543._comment | 8 + ...ent_2_73a39e28d5a09ac342cb4195d263d91e._comment | 8 + doc/forum/endless_password_prompt_loop.mdwn | 8 + ...ent_1_cceba12ed25cd671c7cee5a28631163e._comment | 10 + ...ent_2_f0cb86b45eb289f35197c43f83660a8f._comment | 8 + ...nex_does_not_point_to_a_valid_object__33__.mdwn | 17 + ...ent_1_d370b044da3bfebf9e4c90ce1e243587._comment | 18 + .../error_in_installation_of_base-4.5.0.0.mdwn | 14 + ...ent_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment | 19 + ...ent_2_3badd64e48fbb174cd7de1ac9589bedf._comment | 31 + ...ent_3_d8190061ac1c683a7b699cf42e9db694._comment | 8 + ...ent_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment | 8 + ...xample_of_massively_disconnected_operation.mdwn | 33 + doc/forum/exclude_files_from_annex.mdwn | 10 + ...ent_1_82e7de5e631bae3b347815586274a936._comment | 25 + ...ent_2_03d4599fdceb3dff184eed82824674bc._comment | 12 + .../expire_files__44___move_to_other_hosts.mdwn | 19 + ...ent_1_ddcc2a00be1ae96a352d75a443458bcf._comment | 14 + ...ent_2_7a4c3858c5eae409d04de3f9da43b57e._comment | 17 + doc/forum/exporting_annexed_files.mdwn | 4 + ...ent_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment | 16 + ...ent_2_15dc3024417b5b2ff3544a08beacab34._comment | 8 + ...ent_3_86f0e0f767a84a0f583e121d36cb7d48._comment | 8 + ...us:_does_not_exist__40__v_3.20111231__41__.mdwn | 26 + ...ent_1_990197bf01351dc1ccbe1940d5084adb._comment | 7 + ...ent_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment | 12 + ...ent_3_692f268218690437138ae0540c879425._comment | 16 + doc/forum/faking_location_information.mdwn | 19 + ...3___mmap_failed:_No_such_file_or_directory.mdwn | 112 + ...ent_1_d98a155fa01d10ecff9058d79290156d._comment | 13 + ...ent_2_3b9ea7a1254ac5b50a5ab59cd331ec3f._comment | 8 + ...ent_3_5ee300034819c5825c676cd7e3af659f._comment | 12 + ...ent_4_cf7f5c91d3c15f72d2a714b7362c1197._comment | 30 + doc/forum/first-time_setup_git-annex.mdwn | 7 + ...ent_1_a58d83ee3a7c2251d9a775847223f8ca._comment | 13 + doc/forum/flickrannex_--_not_sure_I_get_it.mdwn | 7 + ...ent_1_57ea9f26760f970a70f09934d31a79b5._comment | 8 + ...ent_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment | 8 + ...ent_3_74f143965f48c89a3583acf1b6a7635a._comment | 9 + ...ent_4_493bb86dedfa91ccc0c9be4045953ee4._comment | 8 + ...ent_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment | 8 + doc/forum/folder_size_question.mdwn | 3 + ...ent_1_782cbf836335d86ff29853c34f00fec3._comment | 12 + ...ent_2_391aa62e4d8c496a58be4707522d8edb._comment | 22 + ...ent_3_1e850dbe36fafe0505b60dd2ce0bd5d7._comment | 8 + ...ent_4_907f3b1cfe745abf94a6a8ba0dbd4396._comment | 25 + doc/forum/fsck_gives_false_positives.mdwn | 6 + ...ent_1_b91070218b9d5fb687eeee1f244237ad._comment | 15 + ...ent_2_f51c53f3f6e6ee1ad463992657db5828._comment | 10 + ...ent_3_692d6d4cd2f75a497e7d314041a768d2._comment | 10 + ...ent_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment | 10 + ...ent_5_86484a504c3bbcecd5876982b9c95688._comment | 13 + ...ent_6_1d4fbbd212fa92967abda346323031f4._comment | 8 + doc/forum/gadu_-_git-annex_disk_usage.mdwn | 7 + ...nt_10_f632a62c4dbbf01b29f146893d7725f9._comment | 15 + ...nt_11_73461da2d55d040cb43e0db286975821._comment | 21 + ...nt_12_6c4fb123091bde435c18ac3dfd5a9b77._comment | 8 + ...ent_1_067d0ffe8900751bd2d2743254ac4d77._comment | 11 + ...ent_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment | 17 + ...ent_3_38296fef5a2dc5794c2dc09df676b8c1._comment | 18 + ...ent_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment | 8 + ...ent_5_4365cd3031456fac1b563ee72984638e._comment | 18 + ...ent_6_2b03d7b857497cb811e992f85700cdcc._comment | 12 + ...ent_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment | 8 + ...ent_8_fc6ddb4dc075ee42368863c1b026dbf7._comment | 13 + ...ent_9_f03254e518cbdda73e4b88e72476275d._comment | 8 + doc/forum/get_and_copy_with_bare_repositories.mdwn | 7 + ...ent_1_a6e4628c0770e3f5e81348a6f29dd845._comment | 10 + ...ent_2_652fa1bae5c2bb63dcffcbda97a567c4._comment | 8 + ...g_git_annex_to_do_a_force_copy_to_a_remote.mdwn | 11 + ...ent_1_3deb2c31cad37a49896f00d600253ee3._comment | 14 + ...ent_2_627f54d158d3ca4b72e45b4da70ff5cd._comment | 12 + ...ent_3_3f49dab11aae5df0c4eb5e4b8d741379._comment | 8 + doc/forum/ghost_semitrusted_repositories.mdwn | 28 + ...ent_1_99bea1a964da9c5603b8cfbdc19bcde8._comment | 19 + ...ent_2_fe5fe5539d06c6b1ef69f3ed805f1ab4._comment | 8 + ...ent_3_588325ef52c80cfc67d1dd80a9d5bd13._comment | 8 + .../git-annes_assistant_+_MAC_OSX_questions.mdwn | 16 + ...ent_1_e661f31acd08a6459842f7f95e5c062b._comment | 9 + ...ent_2_e71a9d1fcf1f945fec0b7834b6038e91._comment | 21 + ...ent_3_372d9da8295d093b8b316f0a48b60ee1._comment | 12 + ...ent_4_573537a49e082515bfb1be84c91b5d1b._comment | 10 + doc/forum/git-annex:_map:_1_failed.mdwn | 12 + ...ent_1_35ff3256e823ab8cfc53276a2123ad5f._comment | 8 + ...ent_2_b0826073ebbd2847f4ab0d9bdba2dce5._comment | 14 + doc/forum/git-annex___38___ikiwiki_experiment.mdwn | 28 + ...ent_1_9f74449ec91577dbf6095f4beafac293._comment | 10 + ...ent_2_e034585c8b51cc30b35c1f7ae68205bf._comment | 14 + ...ent_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment | 14 + ...ent_4_55da5c3c41c13b08590ce1ff8117cef6._comment | 23 + ...ent_5_f67823351164ddfe7d595685c3679652._comment | 10 + ...ent_6_d5cc91164772849d027fed5f962d9000._comment | 10 + ...ent_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment | 17 + ...ent_8_86565e5e1508ff1862f88975446650a2._comment | 12 + doc/forum/git-annex_across_two_filesystems.mdwn | 30 + ...ent_1_53167648b8b70b41d19ca662a5f3687e._comment | 26 + ...ent_2_39adeebc1af9c437f1fc2e00c07509bf._comment | 11 + ...ent_3_f4e3f28db005301adeef7ccd2c9998fb._comment | 18 + ...ent_4_53fa7ac6f80e3281768a7bfd3d438b34._comment | 10 + ...ent_5_2e1be54c01970ef3456e8af4aaf00cbf._comment | 10 + doc/forum/git-annex_and_tagfs.mdwn | 14 + ...ent_1_887c74cb61d30198322ef74ebc80f950._comment | 8 + ...t-annex_assistant_with_2_dedicated_servers.mdwn | 11 + ...nt_10_533ade2215c879cd46782fd66a97b167._comment | 16 + ...nt_11_c9ae51d7b772cf7a91d90925f74d2b60._comment | 10 + ...nt_12_41fbee0ec9bc890e309bcd48a58c3851._comment | 18 + ...nt_13_571cffc0beb8ba5fc936db6971cd3d62._comment | 8 + ...nt_14_0fb62af673a4bc8183e8fef048ceedd4._comment | 10 + ...ent_1_53a79af2d8e3abe50b983bf91972b8f2._comment | 14 + ...ent_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment | 35 + ...ent_3_60c39bc8ef74e80e72381d514b6dd223._comment | 8 + ...ent_4_6241120b4325c905661ef72881f4d7af._comment | 20 + ...ent_5_cab00b8fa195340f4d3fdaf5af975b57._comment | 8 + ...ent_6_e24df9a1c68724a912b8ac6533d9bd25._comment | 16 + ...ent_7_ace3dc7c60c710a04b0a587206b341c4._comment | 8 + ...ent_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment | 14 + ...ent_9_ea88e0696f6e25e6904248a323f6cc36._comment | 8 + ..._40__Meego_Harmattan__41___and_Sailfish_OS.mdwn | 7 + ...ent_1_301a51c48c3d54f9d37feace26a772f8._comment | 8 + doc/forum/git-annex_communication_channels.mdwn | 10 + ...ent_1_198325d2e9337c90f026396de89eec0e._comment | 17 + ...ent_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment | 8 + ...ent_3_1ff08a3e0e63fa0e560cbc9602245caa._comment | 8 + ...ent_4_1ba6ddf54843c17c7d19a9996f2ab712._comment | 8 + ...ent_5_404b723a681eb93fee015cea8024b6bc._comment | 8 + ...ent_6_0d87d0e26461494b1d7f8a701a924729._comment | 8 + ...ent_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment | 10 + doc/forum/git-annex_on_OSX.mdwn | 1 + doc/forum/git-annex_on_Samba_share.mdwn | 9 + ...ent_1_3e9cfdf2c088e48c967ad08f79966742._comment | 12 + ...ent_2_9d3df393b7b727653598453d94dd33db._comment | 12 + ...nnex_on_Ubuntu_13.04_and_13.10_not_working.mdwn | 12 + ...ent_1_209956f3812450a43986d4ca5e647da6._comment | 10 + ...ent_3_12a58b8efe545e09b64760c87849839b._comment | 12 + ...ent_3_e0f7328603256f25c3be3706ecc9c76c._comment | 12 + ...ent_4_6bb8e4522241556fb82784d9b834cbfe._comment | 10 + ...ent_5_89a5296b461d400b51006074a13a4560._comment | 8 + ...ent_6_62daef4b4392c951b914a01b3effac11._comment | 8 + .../git-annex_on_archlinuxarm__44___armv6.mdwn | 20 + ...ent_1_88fa644df8614c2db0d092b3eb1d3156._comment | 10 + ...ent_2_b25ca7520ff7e339ec887a379d5100ee._comment | 10 + ...ent_3_eda0e90c1285396b1ab20ecc04ea6e29._comment | 8 + ...47__closes__47__doesn__39__t_run_on_launch.mdwn | 7 + ...ent_1_a47174f8438bfaa42fb8067bca77bf4c._comment | 8 + ...ent_2_567bb460cec7cd2135386acf4e7dceb4._comment | 8 + ...it-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn | 24 + ...ent_1_ff16c7932b60b85c744bafc48bb040e4._comment | 13 + ...ent_2_5599cddf579d18f70cab6e48d04ae99d._comment | 12 + ...ent_3_412941e9385f63153b23695641e71deb._comment | 15 + ...ent_4_112ad140d9006c530db2121bec24de30._comment | 10 + ...ent_5_9178023b95683a649355f291165a1467._comment | 8 + ...ent_6_9251203421c1c3c3aed7828c4b97ecb8._comment | 17 + ...content_available_from_which_version__63__.mdwn | 12 + ...ent_1_104e1b7e7643844f221f85dcbe9c9c4b._comment | 8 + doc/forum/git-annex_teams___47___groups.mdwn | 5 + ...ent_1_0450673ab74f184a47ac7bab568d26dc._comment | 8 + ...it-annex_unused_not_dropping_deleted_files.mdwn | 34 + ...ent_1_2152cfb09675e46e7492e198dd3ea094._comment | 8 + ...ent_2_97e666dbac9de2a5e688921cba8a42e9._comment | 20 + ...ent_3_d7b0e9515bface28f3650b8aa20ec2f4._comment | 8 + ...ent_4_5816f6cab42e27e724e735368f693b09._comment | 8 + ...ent_5_8e97f39225515f0bf8b168dfd6a0efab._comment | 10 + ...ent_6_bef37f8ec9c337387b79ffd6d56fe425._comment | 10 + doc/forum/git-assistant_clarification.mdwn | 11 + ...ent_1_8f553e59da12f798b854a457b96b5778._comment | 14 + ...ent_2_06cf62b599edea6ad8396776f0081494._comment | 10 + ...ent_3_36f0bd6e7a824e6ef40a309850bb087b._comment | 15 + doc/forum/git-remote-gcrypt.mdwn | 1 + ...ent_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment | 12 + ...ent_2_fdcaf507e14c995636dd93a41e488df3._comment | 8 + ...ent_3_f4e830f961dbe1c60ddd277b9d888133._comment | 8 + .../git-status_typechange_in_direct_mode.mdwn | 48 + ...ent_1_12c8b67aadbfa2b073e12997a55d49a7._comment | 12 + ...ent_2_005d1b17f3c2ae192aa30c6e5163989e._comment | 8 + doc/forum/git-subtree_support__63__.mdwn | 9 + ...ent_1_4f333cb71ed1ff259bbfd86704806aa6._comment | 10 + ...ent_2_73d2a015b1ac79ec99e071a8b1e29034._comment | 8 + ...ent_3_c533400e22c306c033fcd56e64761b0b._comment | 8 + ...ent_4_75b0e072e668aa46ff0a8d62a6620306._comment | 8 + ...ent_5_f5ec9649d9f1dc122e715de5533bc674._comment | 8 + ...ent_6_85df530f7b6d76b74ac8017c6034f95e._comment | 8 + ...it_annex_add_crash_and_subsequent_recovery.mdwn | 25 + ...ent_1_062d0153a379c1ba1df8585b90220d3d._comment | 18 + ...ent_2_6fc6be43c488c468a4811cd0a1360225._comment | 19 + ...ent_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment | 10 + ...ent_4_c560eae40867512b0af2cbef161fc8ac._comment | 8 + doc/forum/git_annex_alternative.mdwn | 10 + ...ssistant_-_Changing_repository_information.mdwn | 1 + ...ent_1_cde71a410200a7478180748fdcde0352._comment | 8 + ...x_assistant__44___share_with_other_devices.mdwn | 3 + ...ast_--to_blah_much_slower_than_--from_blah.mdwn | 15 + ...ent_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment | 12 + ...ent_2_8f2567f4c4f6db2078211a87689757d3._comment | 17 + ...ent_3_ab98121076b88f351fc8cd9197e6bf64._comment | 8 + ...ent_4_cb13328add1b7a812efd817ad3dd1a4f._comment | 8 + ...mative_about_why_some_files_are_not_copied.mdwn | 59 + ...ent_1_75445fc0e01ee99bae1c1f5a60e314bc._comment | 12 + ...on-English_filenames.__Rsync_problem__63__.mdwn | 22 + ...ent_1_292ee7c8b37cbd13f03eb67d0359b99e._comment | 10 + ...ent_2_f6341119fcfde5d8160c8f603b1a6fea._comment | 10 + ...ent_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment | 8 + ...ent_4_86b61b0484f3f4ecff657e46333b3d4f._comment | 8 + ...ent_5_5ffac00d08d26acaba8c3513b24c4d65._comment | 10 + ...git_annex_get_--want-get_another__95__repo.mdwn | 68 + ...ent_1_0be0b3981ddd0743ff26cf6d396e521d._comment | 16 + ...ent_2_b1ead1085a87818625579bf1ef151b5d._comment | 8 + ...ent_3_cf2018852c84b0bf1ac061def6f0ac5d._comment | 27 + ...ent_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment | 38 + doc/forum/git_annex_get_creates_a_new_uuid.mdwn | 6 + ...ent_1_004c87183968c326058bd3159a5baa0b._comment | 14 + ...ex_ls___47___metadata_in_git_annex_whereis.mdwn | 1 + ...ent_1_7fba10b85f4d9289c7782eccef46949e._comment | 8 + ...ent_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment | 8 + ..._on_osx_only_creating_symlinks__63____63__.mdwn | 18 + ...ent_1_6889c4452e636474b4e70798b404fed2._comment | 10 + ...ent_2_978fc11c463a457382fddd668cd1d0dd._comment | 20 + ...ent_3_4420bd3afaecd7536b02fc08cee82dbe._comment | 8 + ...ent_4_99286f17a87049c303f2aa34c0a90286._comment | 13 + ...ent_5_39bad7441dcea4da4b389700301233de._comment | 8 + .../git_annex_sync_dies___40__sometimes__41__.mdwn | 22 + ...ent_1_48bbac0545bf13bbf04da723e418d037._comment | 14 + doc/forum/git_annex_test_on_windows.mdwn | 5 + ...ent_1_258ac5cfa2f5d24e737d94dc48f06899._comment | 10 + .../git_annex_with_local_apache_webdav_server.mdwn | 23 + ...ent_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment | 12 + ...ent_2_d8e9237cf6e7f7558f836ba1352f5517._comment | 13 + doc/forum/git_pull_remote_git-annex.mdwn | 11 + ...ent_1_9c245db3518d8b889ecdf5115ad9e053._comment | 36 + ...ent_2_0f7f4a311b0ec1d89613e80847e69b42._comment | 14 + ...ent_3_1aa89725b5196e40a16edeeb5ccfa371._comment | 14 + ...ent_4_646f2077edcabc000a7d9cb75a93cf55._comment | 37 + ...ent_5_4f2a05ef6551806dd0ec65372f183ca4._comment | 10 + ...ent_6_3925d1aa56bce9380f712e238d63080f._comment | 8 + ...ent_7_24c45ee981b18bc78325c768242e635d._comment | 8 + ...ent_8_7e76ee9b6520cbffaf484c9299a63ad3._comment | 12 + doc/forum/git_tag_missing_for_3.20111011.mdwn | 1 + ...ent_1_7a53bf273f3078ab3351369ef2b5f2a6._comment | 8 + doc/forum/git_unannex_speed.mdwn | 1 + ...ent_1_10cf326248f4e89e1f75bf97d7574763._comment | 7 + ...rievals_and_daily_free_retrieval_allowance.mdwn | 6 + doc/forum/handling_MP3_metadata_changes.mdwn | 12 + ...ent_1_aa4955fd64ea5aa836f1a591e185c4a2._comment | 8 + doc/forum/hashing_objects_directories.mdwn | 27 + ...ent_1_c55c56076be4f54251b0b7f79f28a607._comment | 12 + ...ent_2_504c96959c779176f991f4125ea22009._comment | 14 + ...ent_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment | 12 + ...ent_4_0de9170e429cbfea66f5afa8980d45ac._comment | 12 + ...ent_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment | 12 + ..._running_git-annex_on_top_of_existing_repo.mdwn | 12 + ...ent_1_4cb38d71c943657c5ba0896cd70d2e64._comment | 8 + ...ent_2_b5e94c10ebbed9125c7e2332f75709ca._comment | 13 + ...ent_3_2b3b93bbc60fbc24d436231954d6822a._comment | 10 + ...ent_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment | 21 + ...ent_5_96b1eb1e8e9f315c646f4686870f9b52._comment | 10 + ...ent_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment | 47 + ...do_i_manually_sync_my_external_drive__63__.mdwn | 9 + ...ent_1_4fd8722cafd55b0503c802289206645a._comment | 10 + ...t_file_from_encrypted_special_remote__63__.mdwn | 14 + ...ent_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment | 8 + ...ent_2_79340bf3c0691073a9808c5ac2da0a3d._comment | 14 + ...ent_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment | 12 + ...ent_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment | 8 + ...ent_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment | 8 + ...ent_6_66fe80e634a8f13cce18fe68974ec67a._comment | 8 + ...dentally_running___96__git_add__96____63__.mdwn | 5 + ...ent_1_440dcd19ea2512f968858b780c2a2913._comment | 22 + ...ent_2_e9b70386774996a3d0446faaa3219120._comment | 8 + ...ent_3_3dbd76accad2df2fff14b55452c828ef._comment | 8 + ...symlinks_but_keep_historical_file_contents.mdwn | 7 + ...ent_1_cba76311e146dabb8ffc789bf4c8b714._comment | 14 + ...ent_2_8d99c50fc1347367ccc0714e8d1af385._comment | 40 + ...ent_3_a7a9c55c2ad448179dff5d5b69976c7d._comment | 10 + ...o_link_to_existing_direct_mode_git-annexes.mdwn | 5 + ...ent_1_7bd0edaf2352293678f0942aaa885d13._comment | 8 + doc/forum/howto_update_feed.mdwn | 14 + ...ent_1_bec356619f370a618f19a187d09d2e35._comment | 8 + ...ent_2_84dfb80ba3db8d41164eb97022becae3._comment | 8 + ...ent_3_20166db298c10074e062aecad59ffd71._comment | 20 + ...ent_4_f040e31b763fc9a7aa092442b4d6b8e8._comment | 20 + doc/forum/ignore_changes_made_by_a_remote.mdwn | 8 + ...ent_1_825676069d2e1554499b76fd8c306c30._comment | 10 + ...ent_2_dff49b72f7e072fddaf68584beb97f3c._comment | 10 + doc/forum/incompatible_versions__63__.mdwn | 1 + ...ent_1_629f28258746d413e452cbd42a1a43f4._comment | 8 + ...ly_commit_some_files_in_direct-mode___63__.mdwn | 5 + ...ent_1_804e43111ee97dff15e49e50b6c29d91._comment | 14 + ...ent_2_299ad6cd0225daa166d36af3726a9ef2._comment | 14 + doc/forum/known_and_local_annex_keys.mdwn | 14 + ...ent_1_3cb4828dc7116e4cf49e119f055ae9a3._comment | 20 + ...ent_2_68f20c881eafe986694bde10571cf1c0._comment | 10 + ...ent_3_e195a7091a06ce0427bb28aca9a17d04._comment | 8 + ...ent_4_d81f0bf7465832cb676fd89f5d53ec18._comment | 8 + doc/forum/linux_standalone_tarballs.mdwn | 1 + ...ent_1_5c3ceb845a45e50784f7098bfbf94df1._comment | 13 + doc/forum/local_pairing_with_2_mac.mdwn | 27 + ...nt_10_508585e72c81d197a9a1e193c25a702a._comment | 15 + ...ent_1_6ca4fed183340a2902d1d4d91284b772._comment | 8 + ...ent_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment | 13 + ...ent_3_07fa468aac1288e770487973052bccea._comment | 12 + ...ent_4_dc0494213d2b57b5b9a489b096a5b8d0._comment | 31 + ...ent_5_bcac18e137c00d4279774dec51963289._comment | 10 + ...ent_6_76b62eafda1ecbf88abe288cbe778e17._comment | 17 + ...ent_7_13fe788f2e9a823ad2e4844f114675a7._comment | 10 + ...ent_8_f81b454e9cfc14dcb33148798be55de3._comment | 16 + ...ent_9_f7a1ce9627ebfc854dfde2f6c924db80._comment | 8 + doc/forum/location_tracking_cleanup.mdwn | 24 + ...ent_1_7d6319e8c94dfe998af9cfcbf170efb2._comment | 10 + ...ent_2_e7395cb6e01f42da72adf71ea3ebcde4._comment | 15 + ...ent_3_c15428cec90e969284a5e690fb4b2fde._comment | 10 + doc/forum/lost_in_walkthrough....mdwn | 78 + ...ent_1_51b703b961ca762f0359e1c169f1ee75._comment | 8 + ...ent_2_a9de0401a103bdd4401ba2d5983dc54a._comment | 11 + doc/forum/luks_encrypted_disk_support.mdwn | 3 + ...ent_1_0ea476c778888f34196d9031f72b1844._comment | 10 + ...ent_2_0af149bfe1868dde0a132c5d835c50df._comment | 8 + ...good_use_of_my_shiny_new_rsync.net_account.mdwn | 20 + ...ent_1_0ebe509b768d46081db2100f5b712ef7._comment | 10 + ...ent_2_ef63d893531d93d2eb09f48f8baff4dd._comment | 13 + .../man_pages_in_the_prebuilt_linux_tarball.mdwn | 1 + ...ent_1_a7bc2e84e6d7c0e2de5900685207af78._comment | 9 + doc/forum/managing_multiple_repositories.mdwn | 3 + ...ual_update_of_.git__47__annex__47__objects.mdwn | 8 + ...ent_1_ea6ec91150c8962e2711631f2422bf3a._comment | 10 + ...ent_2_a7bbf304b26650a786e358bdc01e3069._comment | 33 + ...ent_3_a855096b683c4c4f84e72c797e065d59._comment | 12 + doc/forum/many_remotes.mdwn | 24 + ...grate_existing_git_repository_to_git-annex.mdwn | 66 + ...ent_1_4181bf34c71e2e8845e6e5fb55d53381._comment | 10 + ...ent_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment | 60 + ...ent_3_f483038c006cf7dcccf1014fa771744f._comment | 12 + ...ent_4_057f0079fbee3451ccda08026bab21d4._comment | 20 + doc/forum/migration_to_git-annex_and_rsync.mdwn | 33 + doc/forum/misctmp_filling_up.mdwn | 11 + ...ent_1_2739dec72fe0950dd070c8fab9fbd751._comment | 10 + ...ent_2_440081b5e2b9b5b19e8cd5db3649a976._comment | 10 + ...___42__files__42___into_an_annex.__bummer..mdwn | 3 + ...ent_1_752db25abb647804a1cc12c5b247378a._comment | 10 + ...ent_2_db6f4959c35732f72e7a90bd9f4c665c._comment | 8 + doc/forum/multiple_repositories_single_backup.mdwn | 6 + ...ent_1_4a479fa78e0b366fcff1a27bc37081de._comment | 12 + ...ent_2_bbe19eec0969385a0d4682bf9e9de21a._comment | 11 + ...ent_3_1b18ea058e3eb34852055cffe51de176._comment | 8 + doc/forum/multiple_routes_to_same_repository.mdwn | 2 + ...ent_1_26c1734d41d5374f18fc688d862d6b8e._comment | 8 + ...ent_2_d119ab485fb2d5512c15372efdb2327d._comment | 8 + ...links___40__for_tagging_photos__41____63__.mdwn | 11 + ...ent_1_96beb9ea895c80285748adb940b4f57d._comment | 9 + ...ent_2_985065c1feed9300631dac7a2701f669._comment | 8 + doc/forum/multiple_urls_for_the_same_UUID.mdwn | 26 + ...ent_1_de7410d8824a864c4d106c9f1afaec3f._comment | 8 + ...ent_2_309a86cf7e08448be64357a30d8b56ae._comment | 13 + ...ent_3_fa97a45fc1392935fd5e0714db999bc2._comment | 14 + ...ent_4_139178b1ba45b62eec0c89a660c0c81e._comment | 8 + doc/forum/new_linux_arm_tarball_build.mdwn | 12 + ...nt_10_5f9735ec62478c99b8c814055206cff0._comment | 12 + ...nt_11_859c44046b00fe885f6878cfe0e46360._comment | 10 + ...nt_12_35ade68d62e95036344ad33db3279c21._comment | 8 + ...ent_1_7211ddc626bae97d4140c723c3cf028f._comment | 8 + ...ent_2_fcbe3f7fa9d012b21c7a771553fa9142._comment | 8 + ...ent_3_2702cdbae4179a7a103d2a7098a8ed5e._comment | 34 + ...ent_4_e1d802fbcc9d699ece5267e80990255a._comment | 10 + ...ent_5_257b91ecbf5a6040a8e4c9a360c775ba._comment | 9 + ...ent_6_bd8cca86a63be7e330111618c1959a74._comment | 8 + ...ent_7_6814bdeca94328fe6c3f407795ff923a._comment | 10 + ...ent_8_6db99d998ca990494c8f2826ff1ca273._comment | 11 + ...ent_9_2802b24ccb24f1615c9d61904f916d05._comment | 12 + doc/forum/new_microfeatures.mdwn | 59 + ...ent_1_058bd517c6fffaf3446b1f5d5be63623._comment | 8 + ...ent_2_41ad904c68e89c85e1fc49c9e9106969._comment | 8 + ...ent_3_a1a9347b5bc517f2a89a8b292c3f8517._comment | 15 + ...ent_4_5a6786dc52382fff5cc42fdb05770196._comment | 18 + ...ent_5_3c627d275586ff499d928a8f8136babf._comment | 8 + ...ent_6_31ea08c008500560c0b96c6601bc6362._comment | 8 + ...ent_7_94045b9078b1fff877933b012d1b49e2._comment | 10 + doc/forum/nntp__47__usenet_special_remote.mdwn | 18 + ...ent_1_171a0b95b1f95cfd82073e88bdefaab9._comment | 10 + ...ent_2_48736ed17c98ffcfb13ec00b901b2dd6._comment | 13 + doc/forum/non-bare_repo_on_cloud_remote.mdwn | 6 + ...ent_1_da0c023af7c78f1ef1cfe1143a900a9f._comment | 10 + ...ent_2_71baea93f6caaf7b81a9ac00bee91e5e._comment | 67 + .../not_finding_git-annex-shell_on_remote.mdwn | 21 + ...ent_1_84881cad02c251a2515cec50fc22bf16._comment | 16 + ...ent_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment | 36 + ...ent_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment | 8 + ...ent_4_71ae60efcacdba5e11548923b2c85b95._comment | 10 + doc/forum/not_getting_file_contents.mdwn | 1 + ...ent_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment | 10 + ...ent_2_dc7403e1b551552f9fd00da6a1453570._comment | 8 + doc/forum/one_annex_versus_many_annexes__63__.mdwn | 10 + doc/forum/one_or_many_annexes__63__.mdwn | 7 + ...ent_1_656d96011801d67a45b0b3bb3d70fa63._comment | 8 + doc/forum/overmounting_repository_at_home.mdwn | 12 + ...ent_1_399ac5014c489698e1e45deec4db7311._comment | 10 + ...ent_2_d006d89ba204568cdee0731b6251ec1a._comment | 11 + ...ent_3_3734b50c37cbec675813cbeca7bf4ce9._comment | 8 + .../partial_synchronisation._android_phone.mdwn | 7 + ...ent_1_2a48569277945a9c334bdfc51f8fd01f._comment | 8 + ...ent_2_550ae91c8a1fe060368c4682d37514b6._comment | 8 + ...formance_and_multiple_replication_problems.mdwn | 17 + ...ent_1_a2cdf1a4840f099f6bc941fd8de966c7._comment | 16 + ...ent_2_e65b360706c66ede6e0e841b2ebbbfbc._comment | 8 + ...ent_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment | 14 + ...ent_4_23a6dc7ea569944ca55bd21851dd770d._comment | 14 + ...ent_5_8df6cc8b72e0e78c7380f7d471124498._comment | 12 + ...nt:_git_on_ssd__44___annex_on_spindle_disk.mdwn | 12 + ...ent_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment | 8 + ...ent_2_f94abce32ef818176b42a3cc860691ae._comment | 20 + ...ent_3_0c8e77fe248e00bd990d568623e5a5c9._comment | 10 + ...ent_4_4b7e8f9521d61900d9ad418e74808ffb._comment | 8 + ...ent_5_7abbbe7db3988a2d239d11b0a4c597e7._comment | 10 + ...ent_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment | 8 + ...ue_in_log_file_after_upgrade_to_5.20140517.mdwn | 13 + ...ent_1_807d7da99f732f2fa5f9d3cb1ba9f1a1._comment | 8 + ...ent_2_92a7509fc42ab2347d57f080081d14b5._comment | 8 + doc/forum/post-copy__47__sync_hook.mdwn | 14 + ...ent_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment | 11 + doc/forum/preferred_content.mdwn | 11 + ...ent_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment | 10 + ...red_content_settings_for_multiple_symlinks.mdwn | 7 + ...ent_1_70da012d96ab576151fe3e081ef905d1._comment | 10 + ...ent_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment | 8 + ...ent_3_fab70c642d5aaf26de05270860281030._comment | 10 + ...ent_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment | 10 + ...ent_5_963558ab261d8a6315402d371e8348f9._comment | 10 + doc/forum/public-web-frontend.mdwn | 16 + ...ent_1_c73bd2dfe020c25eaad1c0707dd2db01._comment | 9 + ...ent_2_0026d7be6b17e50d86b3b54985882f80._comment | 14 + ..._read_only_annex_without_location_tracking.mdwn | 7 + ...ent_1_47262f048a87fd6b781090f880a9bf99._comment | 12 + ...ent_2_ec3ff6487c9e5c89c7e508d72518bd50._comment | 10 + doc/forum/pulling_from_encrypted_remote.mdwn | 12 + ...ent_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment | 10 + ...ent_2_8d0db2ff65ce935c6e68044a3e0721a8._comment | 16 + doc/forum/pure_git-annex_only_workflow.mdwn | 46 + ...nt_10_683768c9826b0bf0f267e8734b9eb872._comment | 8 + ...nt_11_6b541ed834ef45606f3b98779a25a148._comment | 30 + ...nt_12_ca8ca35d6cd4a9f94568536736c12adc._comment | 10 + ...nt_13_00c82d320c7b4bb51078beba17e14dc8._comment | 8 + ...nt_14_b63568b327215ef8f646a39d760fdfc0._comment | 32 + ...nt_15_cb7c856d8141b2de3cc95874753f1ee5._comment | 12 + ...ent_1_a32f7efd18d174845099a4ed59e6feae._comment | 32 + ...ent_2_66dc9b65523a9912411db03c039ba848._comment | 15 + ...ent_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment | 12 + ...ent_4_dc8a3f75533906ad3756fcc47f7e96bb._comment | 20 + ...ent_5_afe5035a6b35ed2c7e193fb69cc182e2._comment | 24 + ...ent_6_3660d45c5656f68924acbd23790024ee._comment | 12 + ...ent_7_33db51096f568c65b22b4be0b5538c0d._comment | 15 + ...ent_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment | 12 + ...ent_9_ace319652f9c7546883b5152ddc82591._comment | 14 + doc/forum/purge_files_with_no_copies.mdwn | 3 + ...ent_1_12b578689eb8d5d38c06261ec65e2109._comment | 12 + ...on_about_assistant_and___47__archive__47__.mdwn | 22 + ...ent_1_97890e26072af9277144651e3fdcada0._comment | 10 + ...ent_2_542bf265e35a976ac76767762d67d617._comment | 104 + ...ent_3_bafe99159df2adcd5fecc0d67bbf05a5._comment | 8 + ...ent_4_e77fa2992d9302a49a05f514c81612ca._comment | 10 + ...rebuild_location_log_from_encrypted_remote.mdwn | 35 + ...ent_1_f84f955fed7b96ae6208b6ff2ec650cd._comment | 12 + ...ent_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment | 10 + ...ent_3_06a73ca3dc73399ff000b642cca72de7._comment | 10 + ...ing_indirect_renames_on_direct_repo___63__.mdwn | 254 + ...ent_1_f4b0a14373c75cb752597c832e296bcc._comment | 17 + ...ent_2_8c86dfc99f0b9040402c9d746decda53._comment | 41 + ...ent_3_0246fff6c7c75f6be45bd257ec3872a5._comment | 75 + doc/forum/recover_deleted_files___63__.mdwn | 66 + ...ent_1_d7abb7c45c6ec2723a04f153ed215453._comment | 8 + ...ent_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment | 8 + ...ent_3_376de81c70799bf409be189a48234815._comment | 12 + ...ent_4_2e73ac530d65a01768a57058b7220a29._comment | 8 + doc/forum/recovering_from_repo_corruption.mdwn | 11 + ...ent_1_01fc85037e24fc70e5c5329898cf6781._comment | 15 + ...ent_2_3bd1c0bf25a0e892e711a60f53cd5298._comment | 8 + ...ent_3_679dde8ca0081fc6854d6d2e8a42abdb._comment | 8 + doc/forum/recovery_from_failed_merge.mdwn | 7 + ...ent_1_84e5b55d473d16bc9bdba5d88dc29bc3._comment | 10 + ...oned_annex__44___does_not_recognize_remote.mdwn | 8 + ...ent_1_c1962d757dd22f49e774afa13a9862ca._comment | 10 + ...ent_2_1f0f4a1dc89643cee81ff7199b55e747._comment | 8 + ...iability__47__completeness_of_XMPP_updates.mdwn | 7 + ...ent_1_e0f7aa48d54fc0564f41c3a569c723b7._comment | 12 + ...ent_2_4e74039a673c16c0163f2cfb406dc4c3._comment | 8 + ...ent_3_41ade4fe72804b2f06cd4dbf405c1746._comment | 8 + doc/forum/relying_on_git_for_numcopies.mdwn | 47 + ...ent_1_8ad3cccd7f66f6423341d71241ba89fc._comment | 36 + ...ent_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment | 18 + ...ent_3_43d8e1513eb9947f8a503f094c03f307._comment | 8 + doc/forum/remembering_state.mdwn | 5 + ...ent_1_4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment | 8 + ...ent_2_1b02d3713a2986bc027d166589a11c3f._comment | 9 + ...ent_3_b48775ea1e90b061b084f61a4a9baca5._comment | 19 + ...ent_4_cbebcc6ed4bdae6815c0576475e96f6a._comment | 8 + ...r_client_repositories_are_bare__33____63__.mdwn | 17 + ...ent_1_234241460f6c75a8376b303b8dd4e882._comment | 11 + ...ent_2_42dfc382d07af2a4f29c76016084f87c._comment | 12 + .../repo_corruption_in_usb_external_drive.mdwn | 41 + ...ent_1_d9122bb0cc3551d92877c299a25b9c9e._comment | 10 + ...rving_space_with_directory_special_remotes.mdwn | 2 + ...ent_1_cd17b624704d93b51931023f69573323._comment | 8 + ...ent_2_877ca1be23d1484a8a30cdaeb6630053._comment | 15 + ...ent_3_65910eeaf3c6fcfd03f22c2957293232._comment | 8 + doc/forum/retrieving_previous_versions.mdwn | 7 + ...ent_1_a4e83f688d4ec9177e7bf520f12ed26d._comment | 11 + ...ailures_for___42____42____42____42____42__.mdwn | 13 + ...ent_1_7754e2cfb72b034effe8642c1b3e593e._comment | 11 + ...ent_2_04e1da4352ef9f9be90253ea726e5f24._comment | 12 + ...ent_3_84aceb9a9d3e5bd14c044861f47e3b9d._comment | 10 + ...ent_4_2cd17d01edeb230197865e6ea0884de0._comment | 8 + .../rsync_asking_for_an_unknown_password.mdwn | 60 + ...ent_1_f23d1c04a27625089eaef5b4bb7f8456._comment | 12 + ...ent_2_ce4b399fdb2f04e30bd8a951994f1c80._comment | 10 + doc/forum/rsync_over_ssh__63__.mdwn | 2 + ...ent_1_ee21f32e90303e20339e0a568321bbbe._comment | 8 + ...ent_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment | 8 + ...ent_1_2e340c5a6473f165dc06cc35db38e5c0._comment | 8 + .../rsyncing_.git__47__annex__47__objects.mdwn | 24 + ...ent_1_25eb9f7be5730337b9efd96dce9efd2e._comment | 10 + ...ent_2_d7ceae666c8a1951021d3c6e6ac39a11._comment | 8 + doc/forum/s3_vs_ssh_Performance_Problems.mdwn | 8 + ...ent_1_65f064f09d7850abecab97007b0d30f0._comment | 12 + ...ent_2_baaf2384d9196077268e9ca9bbe3b871._comment | 8 + ...ent_3_dc44be42070c073d150c476406e9b425._comment | 10 + ...ent_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment | 10 + doc/forum/safely_dropping_git-annex_history.mdwn | 20 + ...nt_10_a4b93a3fbc98d9b86e942f95e0039862._comment | 8 + ...nt_11_383882fafd32f25ed22b5eb2fb3691b9._comment | 18 + ...nt_12_47794a2abf29bf4ea2763ff89d872ab4._comment | 8 + ...ent_1_4fd76d10a93fe01588fce7a621f9254d._comment | 12 + ...ent_2_10ecf3220ffcbbe94ba09da225458f18._comment | 12 + ...ent_3_e3beb8acb075faaeef6c052aecbf0a41._comment | 50 + ...ent_4_61a5fe2e7e47c60a8b237ea69404a37f._comment | 8 + ...ent_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment | 9 + ...ent_6_410a7296c2cee16d3d5bb618a5a41c1d._comment | 10 + ...ent_7_42cf492fc98a9eba8176387749ef12e0._comment | 8 + ...ent_8_c0327ada073d8b69535f71b4dc6aa57e._comment | 21 + ...ent_9_f83d6090aea2b7d5d54c876df940cbad._comment | 40 + ...ems_to_build_fine_on_haskell_platform_2011.mdwn | 1 + doc/forum/shared_cipher_tries_to_use_gpg.mdwn | 10 + ...ent_1_760961eaaa7d5c254dd71c5792437c9e._comment | 12 + ...ent_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment | 8 + ...thing_really_good_happened_with_3.20130124.mdwn | 5 + ...ent_1_1712bddd2f483a353f6313aa626445f1._comment | 8 + doc/forum/sparse_git_checkouts_with_annex.mdwn | 31 + ...ent_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment | 12 + ...ent_2_e357db3ccc4079f07a291843975535eb._comment | 8 + ...ent_3_fcfafca994194d57dccf5319c7c9e646._comment | 8 + ...ent_4_04dc14880f31eee2b6d767d4d4258c5a._comment | 20 + doc/forum/special_remote_for_IMAP.mdwn | 44 + ...ent_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment | 10 + ...ent_2_9c46fe8a857aa7a5ce797288144386bd._comment | 8 + ...ent_3_27e3b644df6942ce4c103236d0d5cb1b._comment | 23 + doc/forum/special_remote_for_iPods.mdwn | 5 + ...ent_1_37cc3dc740341cc663074fd3bfb85947._comment | 8 + ...up_assistant_startup_on_large_repositories.mdwn | 1 + ...ent_1_5ba637a0f6d01ba24fe25e6265134e0a._comment | 10 + ...ent_2_d65746697977f8971a4b59f5b413f926._comment | 13 + ...ent_3_be6c4fe5a0c745688438b716973791cc._comment | 12 + ...ent_4_a07472338a08c068a9b88b2176fc2bee._comment | 9 + ...tification:_read:_Connection_reset_by_peer.mdwn | 28 + ...ent_1_87b9540e37abb16c0ec7605f5ab204a5._comment | 8 + ...ent_2_bd3383c142bf93d9cd496cb668d7782c._comment | 12 + ...ent_3_9b1911ae6468d09dae74ab1a60d2757b._comment | 12 + doc/forum/ssh_key_setup_woes_in_Android.mdwn | 15 + ...ent_1_f16fbff27a449409699f3dbcf9590622._comment | 10 + doc/forum/ssh_password.mdwn | 3 + ...ent_1_a3e5a41e1d4da683d577976b134b11ee._comment | 10 + ...ent_2_fa261676a99d49d4b237b0d43048d76d._comment | 10 + ...repository__34___option_during_setup__63__.mdwn | 3 + ...ent_1_7244794579a191a677190c60758f32e7._comment | 8 + ...ent_2_277cf12907bd7c5930eb4f137b115e29._comment | 8 + doc/forum/ssh_vs_cifs__47__webdav.mdwn | 7 + doc/forum/start_assistant_from_command_line.mdwn | 11 + ...ent_1_f8dfce1fca9f1212ccaf84e431db71a9._comment | 12 + ...ent_2_e769c5d09afbff85961363ddc5eb4019._comment | 10 + doc/forum/switching_backends.mdwn | 12 + ...ent_1_ecf4109c1148dafde3519243ae3c5a03._comment | 10 + ...ent_2_21f465a18f40b95dafd307fce0de659a._comment | 8 + ...ent_4_4c13d22c1695195e6b101bd20ef6bb42._comment | 35 + ...ent_4_e1d4a48baac23fd3f67b20eba4eee8af._comment | 8 + ...rom_direct_mode_while_assistant_is_running.mdwn | 2 + ...ent_1_7832243a36613c48d0077b438dbf8b4a._comment | 10 + .../sync_between_indirect_and_direct_mode.mdwn | 6 + ...ent_1_7efc0d79196675582571c05fdd133b53._comment | 8 + ...ent_2_8ac84dbaf7a4d503497487cbdb1749d8._comment | 8 + ...ent_3_9acb237711669ec6046a8d07f9ed3b2c._comment | 8 + doc/forum/sync_stages_deletions_on_remote.mdwn | 72 + ...ent_1_2b639066095e450c2d9be3b2775d24b3._comment | 8 + ...ent_2_da5775526a2a476b6ead1cd1a735b8bd._comment | 8 + ...ent_3_9e07593228915936fadcf90373be9f4e._comment | 14 + ...ent_4_e5a3dc34c6229ec40bc999c3cab28041._comment | 8 + doc/forum/syncing_home_directories.mdwn | 7 + ...ent_1_220a6e0ffe0ea610921a63c0a6e3beab._comment | 16 + .../syncing_non-git_trees_with_git-annex.mdwn | 46 + ...ent_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment | 24 + ...ent_2_49f15478781a0ad5e46e75319070335c._comment | 16 + ...ent_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment | 13 + doc/forum/taskwarrior.mdwn | 11 + ...ent_1_1c3a29e7d292cb602d9d349f8009b51e._comment | 10 + ...ent_2_4b3d70501763f6d36c927ae37bbd33c2._comment | 8 + doc/forum/telehash_syncing.mdwn | 10 + .../tell_us_how_you__39__re_using_git-annex.mdwn | 6 + ...ent_1_4884803ddee7f642a3ac995a19967a6a._comment | 17 + ...ent_2_61f5054918e7b36c191454365bc7f3b7._comment | 10 + ...ent_3_db07e8703be606c998c831e91d300d69._comment | 10 + ...ent_4_a58595969cdd42ed20210e9615b42e42._comment | 22 + ...ial__95__remotes__47__hook_with_tahoe-lafs.mdwn | 22 + ...ent_1_76bb33ce45ce6a91b86454147463193b._comment | 10 + ...ent_2_4d9b9d47d01d606a475678f630797bf9._comment | 10 + ...ent_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment | 12 + ...ent_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment | 39 + ...ent_5_c459fb479fe7b13eaea2377cfc1923a6._comment | 8 + ...ent_6_2e9da5a919bbbc27b32de3b243867d4f._comment | 23 + ...ent_7_d636c868524b2055ee85832527437f90._comment | 20 + ...ent_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment | 10 + ...ent_9_2592749c2f02b3e151896e31acba359b._comment | 8 + ..._remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn | 7 + ...ent_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment | 10 + ...ent_2_82dc18ed14879936d04133f248879fb9._comment | 10 + ...rusted_repositories:_fatal:_not_a_git_repo.mdwn | 32 + ...ent_1_0a755a4a281c3bd130722093c8ddd080._comment | 10 + doc/forum/ui.mdwn | 11 + ...ent_1_f3e3446b05d6b573e29e6cad300fb635._comment | 10 + ...ent_2_b493ee97eb2378e72c12f3d137109580._comment | 15 + doc/forum/unannex_alternatives.mdwn | 9 + ...ent_1_dcd4cd41280b41512bbdffafaf307993._comment | 46 + ...ent_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment | 36 + ...ent_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment | 16 + doc/forum/unknown_response_from_git_cat-file.mdwn | 8 + ...ent_1_f26ba569e715fe69b6de3093930362ee._comment | 8 + doc/forum/unlock__47__lock_always_gets_me.mdwn | 11 + ...ent_1_dee73a7ea3e1a5154601adb59782831f._comment | 12 + ...ent_2_f89b4349dde840c355a3bc28908decdf._comment | 8 + ...ent_3_acbab7b75726d34dccb5c9dab7b3e728._comment | 8 + doc/forum/unrelated_repositories_sync.mdwn | 15 + ...ent_1_c899b7b05a96d14e25c2efadff3b4e52._comment | 10 + doc/forum/unsynced_folder.mdwn | 3 + ...ent_1_7d7a262f067c7b02d76e82637223934c._comment | 22 + doc/forum/update_via_cabal_fails.mdwn | 35 + ...ent_1_e1235dc2acd3bac3dd51b7614dabbb88._comment | 8 + .../updating_the___34__number_of_copies__34__.mdwn | 14 + ...ent_1_327bdb0d9c190c60c7147b3acf07af09._comment | 10 + ...ent_2_7e11c839637e0894332e413cde02cee9._comment | 8 + ...ent_3_8b7a70fb3bb41e4eda412302834730bb._comment | 8 + ...indentifier_of_objets___40__doi_like__41__.mdwn | 20 + ...ent_1_955f3aac12c1ddb41267c5a23ccb79e3._comment | 12 + ...ent_2_0aff36755f49afddd5482a602a1ccd2b._comment | 10 + doc/forum/use_existing_ssh_keys__63__.mdwn | 5 + ...ent_1_c420c53f022bbd1b28494bc44d076feb._comment | 8 + ...ent_2_e4cae848e5701852073ced307832872b._comment | 12 + ...ent_3_a97c20b6df74c49e5f57c7caf962f1e2._comment | 10 + ...nize_2_directories___40__like_unison__41__.mdwn | 7 + ...ent_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment | 10 + ...ent_2_648946353c6d90c57351cce4010f1301._comment | 10 + doc/forum/version_3_upgrade.mdwn | 9 + ...ent_1_05fc9c9cad26c520bebb98c852c71e35._comment | 13 + doc/forum/view_from_numeric_values.mdwn | 9 + ...ent_1_f3c440f3f0104002a0020ba96ddcf87b._comment | 11 + ...ent_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment | 12 + ...ent_3_7879a11cc9767cdaac14f9993182dc25._comment | 13 + ...ent_4_517c7659654a6fc608eb3332053df8a4._comment | 28 + doc/forum/view_including_files_with_no_tags.mdwn | 5 + ...ent_1_b0aafc023fbec33af268576c4c199af3._comment | 24 + ...ent_2_5ae9d5308371bdb1f94342c9f9b01aff._comment | 8 + ...ews___40__branches__41___never_get_deleted.mdwn | 16 + ...ent_1_ff53fa0b5f0c4a6554a37e3309e26925._comment | 12 + ...ent_3_1d4a3f4e83b288262e291262a6636602._comment | 21 + ...ent_3_4e96e5325fd12e48f190fe551a6ac07e._comment | 12 + ...ent_4_a4764b5bfb08ebe90430ea14fcb6e8e0._comment | 10 + ...ent_5_02e08dffb01246010b390aeef8f32234._comment | 8 + doc/forum/vlc_and_git-annex.mdwn | 11 + ...ent_1_9c9ab8ce463cf74418aa2f385955f165._comment | 10 + ...ent_2_037f94c1deeac873dbdb36cd4c927e45._comment | 8 + ...o_nonexistent_ref__44___unable_to_checkout.mdwn | 69 + ...ent_1_c0d9758be80d1a349ffe82c80075bebd._comment | 12 + ...ent_2_c28dae2eb0ab825ee6d43735e04a18a3._comment | 22 + .../webapp___47___assistant_without_watch.mdwn | 9 + ...ent_1_1bcd99aa81f937ded683e19a69d33dd9._comment | 10 + ...ent_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment | 16 + doc/forum/webapp_and_manual_mode.mdwn | 7 + ...ent_1_5b5df5ffeb6ee15779972f13fdc11729._comment | 10 + ...ent_2_a1f06b50d1317c78a301b47eb05d2617._comment | 19 + ...ent_3_f0739bf4304a91a5d4ec33ac2421c966._comment | 9 + doc/forum/webapp_does_not_start.mdwn | 72 + ...ent_1_dd27d30ce305562a1552f46c87b1cd27._comment | 12 + ...ent_2_ef37f40288a1181ca619ae13b0f7a994._comment | 8 + ...ent_3_6e625dba9f7fa36bf9c7e9d77fbadeff._comment | 9 + doc/forum/webapp_listen_port_with_autostart.mdwn | 3 + ...ent_1_65dbcf3d8f6c16568f5a326242eab9c5._comment | 20 + ...ent_2_39664f833dedc1a4fe083eec9bc4a7cd._comment | 75 + doc/forum/what_happens_to_deleted_files__63__.mdwn | 24 + ...ent_1_a476174646ad3adfbbe0cafdd7d42d08._comment | 10 + ..._command_with_file_names_instead_of_hashes.mdwn | 7 + ...ent_1_4eaca07152916adc18032fb404e4dd92._comment | 10 + ...ent_2_94b43ac23ff8332b35723422eede8997._comment | 8 + ...ent_3_45ffa6dd17667ecd6685f85f34046eff._comment | 10 + ...ent_4_d459fbcf0db59b821ae67f4949e48103._comment | 14 + ...ent_5_e52a8c9cb418fbc2e2cba71f37bd44ad._comment | 8 + doc/forum/windows_port__63__.mdwn | 2 + ...ent_1_23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + ...st:_get__47__drop_via_webapp_file_explorer.mdwn | 1 + ...ent_1_c818a6d44dc13a56460b1865f70eb97c._comment | 8 + ...st:_make_copy_stop_on_exhausted_disk_space.mdwn | 4 + ...ent_1_467e5e3db3e836030bc4b4f15846951f._comment | 12 + ...ent_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment | 8 + ...ent_3_0ef8c37350fc192d9b784fbab1d9f318._comment | 8 + doc/forum/working_without_git-annex_commits.mdwn | 20 + ...disappeared__44___broken_symlink_showed_up.mdwn | 27 + ...ent_1_00b084f9786de6516f46065c0cb00e79._comment | 11 + ...ent_2_138499b36d28c5e267b4aad8792dc87e._comment | 48 + ...ent_3_6c59c494b563e56d061417eb2216bb19._comment | 8 + ...ent_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment | 12 + ...ent_5_50526283b35997cece2f087507cdd4ee._comment | 12 + ...ct_mode_to_track_my___47__home__63____63__.mdwn | 7 + ...ent_1_b011442de2f67f3ad340031a0767e990._comment | 8 + ...ent_2_c69865c08c3eb49d64310fc76e80c65d._comment | 8 + ...ent_3_7651fb48fc71b2c7b4e7b6830a0f9865._comment | 10 + ...ent_4_7d88f1aa163185c801b7697846086c7f._comment | 12 + doc/future_proofing.mdwn | 38 + doc/git-annex-shell.mdwn | 133 + doc/git-annex.mdwn | 1793 +++++++ doc/git-union-merge.mdwn | 38 + doc/how_it_works.mdwn | 42 + ...ent_1_b3bdd6a06d5764db521ae54878131f5f._comment | 14 + ...ent_2_2a8ce5859040d815e6234fc18f5f1961._comment | 10 + doc/index.mdwn | 46 + doc/install.mdwn | 33 + doc/install/Android.mdwn | 37 + ...nt_10_225f2c6fe255be93702cfbd4dc172f3b._comment | 8 + ...nt_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment | 8 + ...nt_11_4e970633d9073fcf4bc33f3fff2525b2._comment | 10 + ...nt_12_87da4f379a0276b662583e7e22061218._comment | 8 + ...ent_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment | 8 + ...ent_2_74cccae04ea23a8600069c7e658143aa._comment | 8 + ...ent_3_82c7cb31d19d4e18ca5548da5ca19a79._comment | 8 + ...ent_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment | 8 + ...ent_8_34f7c42050fa48769a6bfae60d72e477._comment | 8 + ...ent_9_f3d289b78d6bdb3cc65689495a8439a5._comment | 11 + doc/install/ArchLinux.mdwn | 19 + ...ent_1_da5919c986d2ae187bc2f73de9633978._comment | 8 + ...ent_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment | 16 + ...ent_3_8e607cd883ec174571e9dfe3b25bfd05._comment | 8 + ...ent_4_a378391dd218859f381c479259dd8fe3._comment | 10 + ...ent_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment | 10 + ...ent_6_1d597d6a95f9c2df7dae6e98813e4865._comment | 36 + ...ent_7_2d708977e2fad6b68803494576382df5._comment | 10 + ...ent_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment | 15 + doc/install/Debian.mdwn | 20 + ...nt_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment | 8 + ...nt_15_20d8271ba3f6cfe3c8849c3d41607630._comment | 8 + ...nt_16_89f67da4a4a6a626a7db9c6674b244b6._comment | 11 + ...nt_17_ef7f3e88d61833e51f0302e938343818._comment | 10 + ...ent_1_029486088d098c2d4f1099f2f0e701a9._comment | 9 + ...ent_2_648e3467e260cdf233acdb0b53313ce0._comment | 8 + ...ent_3_4d922e11249627634ecc35bba4044d9e._comment | 8 + ...ent_4_2a93ab18b05ccb90e7acc5885866fca2._comment | 9 + ...ent_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment | 12 + ...ent_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment | 10 + doc/install/Docker.mdwn | 32 + doc/install/Fedora.mdwn | 40 + ...ent_1_c4db84e672ad4b45b522db735706b00f._comment | 16 + ...ent_2_f98c488c09bef86e2b0414589ce9e141._comment | 25 + ...ent_3_d872acf8865fe7c99a9b712db5b38ea4._comment | 8 + ...ent_4_93b3402e4c51e1a5c96f907bb528164b._comment | 16 + ...ent_5_0427e0503764b29e57abf9e97155136b._comment | 15 + ...ent_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment | 12 + ...ent_7_4832d271dcc63a6cd1c40fe38ad5e367._comment | 24 + ...ent_8_80e167cde1a6511683a8f6e8029c0da6._comment | 10 + doc/install/FreeBSD.mdwn | 2 + doc/install/Gentoo.mdwn | 3 + doc/install/Homebrew.mdwn | 21 + doc/install/Linux_standalone.mdwn | 34 + ...ent_1_1adc00aecc51f1e74701bd67cd74155d._comment | 8 + ...ent_2_7983285b56fd10359a7cc3615fd1e2fe._comment | 12 + doc/install/NixOS.mdwn | 6 + ...ent_1_4e487ddd2654a8a992c1538b9c3bf003._comment | 21 + doc/install/OSX.mdwn | 55 + ...nt_10_cd2120552ef894a37933b328136fa4cc._comment | 8 + ...nt_11_740fa80e2e54e6fb570f820ff1f56440._comment | 8 + ...nt_12_a84028080578a8b60115b6c4ef823627._comment | 8 + ...nt_13_d6f1db401858ffea23c123db49f5b296._comment | 8 + ...nt_14_035f856923276b0edad879e196e94097._comment | 9 + ...nt_15_336e0acb00e84943715e69917643a69e._comment | 35 + ...nt_16_1befafa862b7d07b1f6e57c0182497cf._comment | 36 + ...nt_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment | 10 + ...nt_18_537fad5d8854e765499d47602d1ab398._comment | 8 + ...nt_19_18d4377f4ded5604d395d73783ba82c9._comment | 8 + ...nt_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment | 8 + ...nt_21_987f1302f56107c926b6daf83e124654._comment | 11 + ...nt_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment | 12 + ...nt_23_3d82a270dd4b0159f4aab5675166e1e3._comment | 30 + ...nt_24_b9d3563a2cc3d769f27876e028dc344d._comment | 12 + ...nt_25_db90984062a07576a4777b2d743161f1._comment | 24 + ...nt_27_2a60108a440231ba83f5a54b6bcc5488._comment | 14 + ...nt_27_d453510b9bb62072a4c663206c12c8a4._comment | 8 + ...nt_28_0970bfd63137ea48701dff6aea1b4bcb._comment | 18 + ...nt_29_8622ed56c6a8034c20fb311418d94003._comment | 8 + ...ent_2_25552ff2942048fafe97d653757f1ad6._comment | 8 + ...nt_30_ce58633ef5b2f8f4caa7e626358f33be._comment | 8 + ...nt_31_09084a7b3cf06bfa3add0f4991476ffe._comment | 10 + ...nt_32_a46d8e3e7795b9afb1e1c2be943d12af._comment | 10 + ...nt_33_203a36322b3c453c05c8906c64e62e06._comment | 8 + ...nt_34_874ff01f27911baf6ef0f559d5d5f5a0._comment | 27 + ...ent_3_47a77a03040fe628109bd54f82f9ad7a._comment | 17 + ...ent_4_25cac8bcd84a5210fc0a5243260b8cc7._comment | 18 + ...ent_4_bbe99673033e4c48c8bb3db24ee419f9._comment | 8 + ...ent_5_39b4b748b4586bf32b37edfefef84bba._comment | 8 + ...ent_6_1a9c91ef43edc4148947f202ff604114._comment | 8 + ...ent_7_892f7e65f95f43697164267c4b71c0d5._comment | 8 + ...ent_8_38d9c2eea1090674de2361274eab5b0e._comment | 29 + ...ent_9_35bf3812db6f3ef25da9b3bc84f147c5._comment | 8 + doc/install/OSX/old_comments.mdwn | 1 + ...nt_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment | 11 + ...nt_10_798000aab19af2944b6e44dbc550c6fe._comment | 10 + ...nt_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment | 10 + ...nt_12_60d13f2c8e008af1041bea565a392c83._comment | 8 + ...nt_13_a6f48c87c2d6eabe379d6e10a6cac453._comment | 8 + ...nt_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment | 9 + ...nt_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment | 9 + ...nt_16_af6fe3540032cdf4400478de87771058._comment | 30 + ...nt_17_8d3a0596db67108041728b20f2790f31._comment | 7 + ...ent_1_0a1760bf0db1f1ba89bdb4c62032f631._comment | 13 + ...ent_2_0327c64b15249596add635d26f4ce67f._comment | 19 + ...ent_2_7683740a98182de06cb329792e0c0a25._comment | 25 + ...nt_34_c9362141d15a2f68a75df9f8bfe29da0._comment | 17 + ...nt_35_8106196c3fef70652cb2106e2d5857db._comment | 8 + ...ent_3_47c682a779812dda77601c24a619923c._comment | 8 + ...ent_3_733147cebe501c60f2141b711f1d7f24._comment | 16 + ...ent_3_b090f40fe5a32e00b472a5ab2b850b4a._comment | 8 + ...ent_3_fc092412e99cf4c5f095b0ef710bc4de._comment | 8 + ...ent_4_d513e21512a9b207983d38abf348d00f._comment | 16 + ...ent_4_d68c36432c7be3f4a76f4f0d7300bac9._comment | 20 + ...ent_4_e6109a964064a2a799768a370e57801d._comment | 30 + ...ent_5_50777853f808d57b957f8ce9a0f84b3d._comment | 10 + ...ent_5_626a4b4bf302d4ae750174f860402f70._comment | 8 + ...ent_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment | 7 + ...ent_7_2ce7acab15403d3f993cec94ec7f3bc6._comment | 14 + ...ent_8_a93ad4b67c5df4243268bcf32562f6be._comment | 39 + ...ent_9_ae3ed5345bc84f57e44251d2e6c39342._comment | 14 + ...ent_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment | 23 + doc/install/ScientificLinux5.mdwn | 62 + doc/install/Ubuntu.mdwn | 44 + ...nt_10_490e065314693423ab6969d8ae6978fe._comment | 8 + ...nt_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment | 10 + ...nt_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment | 8 + ...ent_1_d1c511153fe94bf33e19a1281f1c92f2._comment | 8 + ...ent_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment | 8 + ...ent_3_a08817322739b03cf0fec97283b16f1a._comment | 8 + ...ent_4_fe0997e56136bd30749f0995cbf19b56._comment | 12 + ...ent_5_fbb5306a162db1a1ee9efa3523aac952._comment | 11 + ...ent_6_a97e7f0e62ac685c3ded423bddeaa67f._comment | 14 + ...ent_7_921a223fd7e679b9ced3d8ba5ce688e0._comment | 8 + ...ent_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment | 8 + ...ent_9_c2f8b35ada873acb1ce593b04e2899fe._comment | 11 + doc/install/Windows.mdwn | 39 + doc/install/cabal.mdwn | 58 + ...nt_10_7ebe353b05d4df29897dc9a4f45c8a91._comment | 8 + ...nt_11_0d06702e6e0ae3cd331cf748a9f6f273._comment | 44 + ...nt_12_b93ca271dffca3f948645d3e1326c1d9._comment | 12 + ...nt_13_3dac019cda71bf99878c0a1d9382323b._comment | 8 + ...nt_14_14b46470593f84f8c3768a91cb77bdab._comment | 9 + ...nt_15_c3a5b0aad28a90e0bb8da31a430578eb._comment | 8 + ...nt_16_4faf214f97f9516898d7c17d743ef825._comment | 10 + ...nt_17_2a9d6807a3a13815c824985521757167._comment | 10 + ...nt_18_1efa0c7a963ec452fc6336fbe4964f6e._comment | 10 + ...nt_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment | 44 + ...ent_1_f04df6bcd50d1d01eb34868bb00ac35c._comment | 18 + ...nt_20_0f553be2a4c666e3bed58b2bce549406._comment | 8 + ...nt_21_f91a6ec21e96eced73ea9579fd8cbd15._comment | 8 + ...nt_22_2f27b78215f97ade1986ca806c634cb3._comment | 16 + ...nt_23_c34d2b1d95830a3e58671a5b566a1758._comment | 8 + ...nt_24_40cbde8ec067b3a860e6df1a9bea5f76._comment | 8 + ...nt_25_8a7664e6f9271718dc607a0782366c5b._comment | 8 + ...nt_26_bd455c732639728bce2bfc39e32871d2._comment | 8 + ...nt_27_c080e9239b6eec88d329c28da7bb4141._comment | 17 + ...nt_28_15951dd070a675300420eea137a28ef9._comment | 10 + ...nt_29_ac082dca67f4a29b06070c0283130f52._comment | 39 + ...ent_2_a69d17c55e56a707ec6606d5cdddee25._comment | 17 + ...nt_30_ad639c07cb79e89406e95c1dafce3a01._comment | 35 + ...nt_31_4763b24a29627d55f465b9ea260ea7ec._comment | 22 + ...nt_32_1d34c294486c85b1149675fa5861ae35._comment | 10 + ...nt_33_8d4dfc33cada6091c30d3a43ce404b8b._comment | 21 + ...nt_34_38451e751add6daf479b559c4b6a7c61._comment | 8 + ...nt_35_4d44e4531e6686bd340f26836ad40026._comment | 8 + ...nt_36_2a095a5af53a356bd29abd22a9cb1bea._comment | 16 + ...nt_37_f33e1a4575dccc20b0d3d7c00e6db709._comment | 69 + ...nt_38_5c1e96221154a4ae4ebd636232044ced._comment | 16 + ...ent_3_55bed050bdb768543dbe1b86edec057d._comment | 10 + ...ent_4_2ff7f8a3b03bea7e860248829d595bd1._comment | 14 + ...ent_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment | 24 + ...ent_6_5afb2d081e8b603bc338cd460ad9317d._comment | 21 + ...ent_7_129c4f2e404c874e5adfa52902a81104._comment | 22 + ...ent_8_738c108f131e3aab0d720bc4fd6a81fd._comment | 8 + ...ent_9_5ddbba419d96a7411f7edddaa4d7b739._comment | 12 + ...ent_1_0aa16754fb08d8f2a54c8c3f78b6c187._comment | 14 + doc/install/fromscratch.mdwn | 27 + ...ent_1_9d085e460553fa045999ab7cb945cdec._comment | 13 + ...ent_2_b7954521d9ab40622b665f278dd72e17._comment | 10 + ...ent_3_a3bf3ce57ea73515a059267f25b816eb._comment | 23 + doc/install/openSUSE.mdwn | 3 + doc/internals.mdwn | 247 + ...ent_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment | 8 + ...ent_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment | 8 + doc/internals/hashing.mdwn | 38 + ...ent_1_9153e4f4f9335e524cf1b96a51bef41f._comment | 10 + doc/internals/key_format.mdwn | 23 + doc/internals/lockdown.mdwn | 44 + doc/license.mdwn | 14 + doc/license/AGPL | 661 +++ doc/license/GPL | 674 +++ doc/license/LGPL | 502 ++ doc/links/key_concepts.mdwn | 7 + doc/links/other_stuff.mdwn | 9 + doc/links/the_details.mdwn | 8 + doc/location_tracking.mdwn | 30 + doc/logo-old-bw.svg | 60 + doc/logo-old.png | Bin 0 -> 9092 bytes doc/logo-old.svg | 77 + doc/logo-old_small.png | Bin 0 -> 4713 bytes doc/logo.mdwn | 13 + doc/logo.svg | 92 + doc/logo_16x16.png | Bin 0 -> 233 bytes doc/logo_32x32.png | Bin 0 -> 473 bytes doc/logo_small.png | Bin 0 -> 4749 bytes doc/meta.mdwn | 5 + doc/metadata.mdwn | 47 + ...ent_1_d367fdaf0425b59d694bf16059d47192._comment | 9 + ...ent_2_e15d2b5a405db4ccdb91d6aad4a22983._comment | 10 + doc/news.mdwn | 11 + doc/news/2013_git-annex_user_survey.mdwn | 5 + doc/news/LWN_article.mdwn | 2 + doc/news/Presentation_at_FOSDEM.mdwn | 4 + doc/news/git_annex_fall_of_code.mdwn | 27 + .../sharebox_a_FUSE_filesystem_for_git-annex.mdwn | 19 + ...ent_1_e238d1734238e37bb55ff952b32e06b8._comment | 9 + 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 + ...nt_10_d8fb9add7e98dadea2a39f8827f75447._comment | 10 + ...nt_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment | 8 + ...nt_12_a0ef1a045257659f0f8722e4987e0ccc._comment | 8 + ...nt_13_c5c20576388f18daba3af913b44fb001._comment | 8 + ...nt_14_837e3699014b73e8f2bd2a668eea9eef._comment | 23 + ...nt_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment | 10 + ...ent_1_ab41bec1ccc884e71780cb9458439170._comment | 8 + ...ent_2_0e19ff7deb5ed65f2bc685d4c516d816._comment | 8 + ...ent_3_bab9584c41a25dda934ad230e3eb732d._comment | 8 + ...ent_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment | 51 + ...ent_5_f2829ecbe80a61aa9a8411d2403de69e._comment | 14 + ...ent_6_547fc59b19ad66d7280c53a7f923ea08._comment | 13 + ...ent_7_581e23cca0219711f8a4500a8d5d20fc._comment | 16 + ...ent_8_5c61457f117de38ef487e5cc2780d554._comment | 24 + ...ent_9_69aa47398a3c13ce64f146de985b727d._comment | 10 + doc/polls.mdwn | 2 + doc/polls/2013.mdwn | 5 + doc/preferred_content.mdwn | 179 + ...nt_10_f0bce3c67f293eaba97b92f0942876b6._comment | 8 + ...ent_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment | 19 + ...ent_2_1ccd90b009245667ad59f4d29d2a3a37._comment | 8 + ...ent_4_384025b5fa23a3f175985a081438149f._comment | 8 + ...ent_4_6a9bc657bc7415f0e118357d8c6664c6._comment | 18 + ...ent_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment | 9 + ...ent_6_b434c0e2aaa132020fd4a01551285376._comment | 12 + ...ent_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment | 8 + ...ent_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment | 27 + ...ent_9_f82538be42428691d7cab60a7add2e74._comment | 13 + doc/preferred_content/standard_groups.mdwn | 126 + ...ent_1_026e47e425d06c4b2580238b3187a379._comment | 13 + ...ent_2_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 + ...nt_10_c366f020c9b97a365e21878a33360079._comment | 10 + ...nt_11_c1da387e082d91feec13dde91ccb111a._comment | 12 + ...nt_12_59c3ecab7dbc8be53258460473cac21c._comment | 8 + ...nt_13_0789a21d980825188bb09f7fc8bba8be._comment | 33 + ...nt_14_29574a51d5831c51e2e765eb2c06e567._comment | 12 + ...nt_15_ceb9048c743135f6beca57a23505f0a3._comment | 8 + ...nt_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment | 8 + ...ent_1_4a1f7a230dad6caa84831685b236fd73._comment | 8 + ...ent_2_5b22d67de946f4d34a4a3c7449d32988._comment | 8 + ...ent_3_bcab2bd0f168954243aa9bcc9671bd94._comment | 8 + ...ent_4_38c0b062997fde1ad28facc05d973e83._comment | 12 + ...ent_5_409bc2b56382417cf26bb222fb783ba7._comment | 8 + ...ent_6_78da9e233882ec0908962882ea8c4056._comment | 10 + ...ent_7_6af9781004d982d8e6b20a83ad29eead._comment | 8 + ...ent_8_0fa68d584ee7f6b5c9058fba7e911a11._comment | 12 + ...ent_9_7ad757b3865b04967c79af0a263bb3b0._comment | 10 + doc/special_remotes/bup.mdwn | 39 + ...nt_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment | 23 + ...nt_11_b53bceb0058acf4d1ab12ea4853ee443._comment | 24 + ...nt_12_65d923226cf6120349d807c5c60f640c._comment | 8 + ...ent_1_96179a003da4444f6fc08867872cda0a._comment | 43 + ...ent_2_612b038c15206f9f3c2e23c7104ca627._comment | 12 + ...ent_3_1186def82741ddab1ade256fb2e59e6f._comment | 17 + ...ent_4_7d22a805dd2914971e7ca628ceea69be._comment | 10 + ...ent_6_5942333cde09fd98e26c4f1d389cb76f._comment | 10 + ...ent_7_cb1a0d3076e9d06e7a24204478f6fa98._comment | 10 + ...ent_8_4cbc67e5911748d13cee3c483d7ece8a._comment | 12 + ...ent_9_ca7096a759961af375e6bd49663b45b3._comment | 10 + ...nt_10_e9881290486a1770bd260f8650ada9c6._comment | 8 + ...nt_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment | 8 + ...nt_12_13237170ef5b6646e0e25d3421af3fe5._comment | 10 + ...nt_13_1a36a0483a9db04d36e0234a192ebad8._comment | 12 + ...nt_14_a8419963dc024b1d9eb73807596012dc._comment | 8 + ...nt_15_95ccfdd22a2391daa99e0beb04adedd6._comment | 11 + ...nt_16_b9d238fb15ad7628e33c90b071e07bb0._comment | 12 + ...nt_17_cc21b81a8f809f6efa5f5b6332513fc3._comment | 12 + ...nt_18_3fe750118ff1edbe91a110b86fb5b662._comment | 10 + ...nt_19_6794eb52bd87c28ef1df3172aa7d5780._comment | 9 + ...ent_1_961276c18e9353ca8e25cad53e7ec51f._comment | 8 + ...nt_20_6b7242721f2f2c77b634568cb737e3e3._comment | 13 + ...nt_21_5c11e69c28b9ed4cbe238a36c0839a47._comment | 15 + ...nt_22_308afc586b86c66bbb3437d63864d9cb._comment | 16 + ...nt_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment | 10 + ...ent_2_97543acfa7434e332ebea5672e446317._comment | 8 + ...ent_3_9229776623c234204c8b164edff95da0._comment | 8 + ...ent_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment | 10 + ...ent_5_f7000975d38077828ab11a99095b39eb._comment | 8 + ...ent_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment | 8 + ...ent_7_af01ee5ce31b1490af565cb087d65277._comment | 10 + ...ent_8_3d4ffec566d68d601eafe8758a616756._comment | 13 + ...ent_9_26af468952f0403171370b56e127830a._comment | 8 + doc/special_remotes/ddar.mdwn | 40 + doc/special_remotes/directory.mdwn | 39 + ...nt_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment | 49 + doc/special_remotes/directory/comment_12._comment | 16 + ...nt_12_311cd013fd8db47856d84161119e059d._comment | 12 + ...ent_1_e8a53592adb13f7d7f212a2eb5a18a31._comment | 12 + ...ent_2_d949edad6a330079f9e15f703f9091e3._comment | 10 + ...ent_3_49009f4e9e335c9a9d0422aa59c9a432._comment | 8 + ...ent_4_f5e9b0b477c4e521f8633fd274757fa3._comment | 8 + ...ent_5_e790718423c41f5ea8047ea5225bfacd._comment | 11 + ...ent_6_325aac80b86588912c4fd61339ccbd0b._comment | 10 + ...ent_7_4206db69d68d9917623ce02500387021._comment | 12 + ...ent_8_acd9023511fe43817718bc89430f96c3._comment | 8 + ...ent_9_d330eb808a990bb71034613c297a265e._comment | 8 + doc/special_remotes/external.mdwn | 27 + doc/special_remotes/external/example.sh | 195 + doc/special_remotes/gcrypt.mdwn | 50 + doc/special_remotes/glacier.mdwn | 47 + ...ent_1_fcd856b99dc6b3f9141b65fe639ef76b._comment | 10 + ...ent_2_38fcca87074f6ea31a12569a822aa8c9._comment | 12 + ...ent_3_cea5bcb162e4288847ba5f25464a0406._comment | 28 + ...ent_4_0c92cc82c7ac513130f862391a02d329._comment | 8 + ...ent_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment | 8 + ...ent_6_adb1db354dc4941e4b004e4ba34660d7._comment | 8 + ...ent_7_747e403aac5acaba00e220931e926951._comment | 10 + ...ent_8_a04bb5f27c1a7cfffe881903f973dbec._comment | 24 + ...ent_9_89c4506e079c299fd098d0fe746d032a._comment | 8 + doc/special_remotes/hook.mdwn | 109 + ...ent_1_6a74a25891974a28a8cb42b87cb53c26._comment | 32 + ...ent_2_ee7c43b93c5b787216334f019643f6a0._comment | 17 + ...ent_3_2593291795e732994862d08bf2ed467b._comment | 17 + ...ent_4_35d79b5ffa5a19056efcdc805070bc4b._comment | 18 + ...ent_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment | 10 + ...ent_6_e0ab48d5333e5de85f016b097e6fdac1._comment | 12 + ...ent_7_cc2b1243c2c36e63241513bcaddfea67._comment | 10 + ...ent_8_bbae315233bda48eb04662dfd48cf1ae._comment | 30 + ...ent_9_037523d1994c702239ca96791156fe65._comment | 10 + doc/special_remotes/rsync.mdwn | 56 + ...nt_10_43e8fa3517c1f5935f02ad06fbed63dc._comment | 8 + ...nt_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment | 8 + ...ent_1_9e180c397486989beab21699b8e8f103._comment | 16 + ...ent_2_25545dc0b53f09ae73b29899c8884b02._comment | 8 + ...ent_3_960a89b1ae7e3888ffba06baa963dc21._comment | 20 + ...ent_4_db84816c31239953dd21f23a8c557b43._comment | 15 + ...ent_5_ccaffa4aded9dab88c76a856b96ea5b9._comment | 9 + ...ent_6_e687b9482b177e1351c8c65ea617d3fa._comment | 8 + ...ent_7_e122979ea811d9ef835ba05bb936190f._comment | 10 + ...ent_8_d566113318d0aa7500d76ffe1bd46069._comment | 10 + ...ent_9_5dcf10a502b2d4feac46b620d43e9d00._comment | 8 + doc/special_remotes/tahoe.mdwn | 47 + doc/special_remotes/web.mdwn | 11 + ...ent_1_0bd570025f6cd551349ea88a4729ac8e._comment | 8 + ...ent_2_333141cc9ec6c26ffd19aa95303a91e3._comment | 8 + doc/special_remotes/webdav.mdwn | 42 + ...nt_10_2c087a132c2203ac20636800bf73dfa7._comment | 8 + ...nt_11_cde4fccaf551ba1eab8235ebf6654316._comment | 10 + ...nt_12_76423262fceeced32ab18fa38ed53bdb._comment | 15 + ...nt_14_2390020fa7daac8a6d3e8b713bd3b8e7._comment | 12 + ...ent_1_6b523eea78eae1d19fe2a9950ee33e3a._comment | 26 + ...ent_2_83fc4e7d9ba7a05c8500da659f561b8f._comment | 10 + ...ent_3_239367ad639c61ecdf87a89f7ac53efe._comment | 10 + ...ent_4_ffa52f7776cdc8caa28667b5eadae123._comment | 8 + ...ent_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment | 12 + ...ent_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment | 10 + ...ent_7_6fa7e11331db5a943015bd5367eb3d73._comment | 12 + ...ent_8_2627b41f80c7511b27464e2040b128a8._comment | 8 + ...ent_9_b8f17efe524bb45a3e16705996df1265._comment | 8 + doc/special_remotes/xmpp.mdwn | 39 + ...nt_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment | 10 + ...nt_11_05d9a67b9331656b4035399641cedb1b._comment | 22 + ...ent_1_568247938929a2934e8198fca80b7184._comment | 11 + ...ent_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment | 10 + ...ent_3_48ddbba1402d89acaea07cff747c48e0._comment | 28 + ...ent_4_59857879abaae22bde444a215e00bf18._comment | 14 + ...ent_5_583ee374bd34fcc9ae26c2fd690e8c47._comment | 73 + ...ent_6_8f0b5bba1271d031a67e7f0c175d67d5._comment | 8 + ...ent_7_ac7acbded03325b015959d82ae77faf1._comment | 10 + ...ent_8_81a9636a1e8a36a58185468a26f8633d._comment | 8 + ...ent_9_eda76b826491c96b1ce072aacf9d3adf._comment | 23 + doc/summary.mdwn | 11 + doc/sync.mdwn | 44 + ...nt_10_2cd8ab86f498d6f676f859b552f831eb._comment | 8 + ...nt_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment | 10 + ...nt_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment | 14 + ...nt_13_690f66be9cefe28844d8df653b7a0331._comment | 10 + ...nt_14_db342785a4dade30b5b75cb95031bed1._comment | 8 + ...nt_15_168e0ab10b4084e13df1a3058fa7e8a9._comment | 8 + ...nt_16_96096f994fc55f921f2b24b274f998f7._comment | 8 + ...ent_1_59681be5568f568f5c54eb0445163dd2._comment | 8 + ...ent_2_9301ff5e81d37475f594e74fbe32f24e._comment | 11 + ...ent_3_49560003da47490e4fabd4ab0089f2d7._comment | 8 + ...ent_4_cf29326408e62575085d1f980087c923._comment | 8 + ...ent_5_18c396c59907147bb2bf713e55392b6b._comment | 8 + ...ent_6_012e9d4468d0b88ee3c5dad3911c3606._comment | 10 + ...ent_7_6276e100d1341f1a0be368f54de0ae7b._comment | 8 + ...ent_8_b89161c82c05634d35f6b65bf8360a96._comment | 14 + ...ent_9_849883b7cc05bfcb01914d8737098010._comment | 18 + doc/templates/bare.tmpl | 1 + doc/templates/buglist.tmpl | 25 + doc/templates/bugtemplate.mdwn | 18 + doc/templates/walkthrough.tmpl | 2 + doc/testimonials.mdwn | 34 + ...ent_1_2bf439f7a3bc3d6fab91849017946182._comment | 8 + doc/thanks.mdwn | 372 ++ doc/tips.mdwn | 4 + ...64____37____38____34____35___Haskell__33__.mdwn | 111 + ...ent_1_835a3608df3e9d044cabe822d0f3e7e4._comment | 27 + ...ent_2_080b30cba72a718e73ea715e259e1cfb._comment | 8 + doc/tips/Crude_Windows_Sync.mdwn | 35 + ...Decentralized_repository_behind_a_Firewall.mdwn | 59 + ...ent_1_78b9035234a690ca5a7c9f3cc78fa092._comment | 8 + doc/tips/Delay_Assistant_Startup_on_Login.mdwn | 13 + ...ent_1_c63917150527efab4b1106183b3aa7ef._comment | 8 + doc/tips/Git_annex_and_Calibre.mdwn | 120 + ...ctively_annex_a_file_already_in_a_git_repo.mdwn | 19 + ...ent_1_7eaf73fb3355bd706ab18a43790b3c10._comment | 8 + ...ent_2_dac1a171204f30d7c906e878eb6bd461._comment | 45 + ...ent_3_b62ec0b848d2487d68d7032682622193._comment | 36 + ...ent_4_2423904e41a86cd1c6bc155d7b733642._comment | 9 + doc/tips/Internet_Archive_via_S3.mdwn | 85 + ...ent_1_d53a3848c20dce61867283fc03c2adaa._comment | 34 + ...ent_2_91c1472da27b00e5d682d22bc1ef04e0._comment | 10 + ...ent_3_e23cf781c532f80d47d52265f2b2c87e._comment | 8 + doc/tips/Shamir_secret_sharing_and_git-annex.mdwn | 21 + doc/tips/Synology_NAS_and_git_annex.mdwn | 59 + ...ent_1_ef7e19f1fd2005eb7cc74509ffb92766._comment | 9 + ...rred_content_settings_for_my_android_phone.mdwn | 36 + ...ent_1_393d1636bb313530be383a075bd3440a._comment | 14 + ...ent_2_51a013213118660bdc06ff4d6c8110ba._comment | 12 + ...sing_Git-annex_as_a_web_browsing_assistant.mdwn | 46 + ...ent_1_74167f9fff400f148916003468c77de4._comment | 8 + doc/tips/ZSH_completion.mdwn | 13 + doc/tips/assume-unstaged.mdwn | 31 + ...ent_1_44abd811ef79a85e557418e17a3927be._comment | 10 + ...ent_2_5b589f37cfc03bf7be33a51826cc4dba._comment | 13 + doc/tips/automatically_adding_metadata.mdwn | 24 + ...ent_1_ffc308cc6aedabbc55820db4f401e0fb._comment | 8 + ...ent_2_bd64a53914107bc000c887b4d4bdf6af._comment | 12 + ...ent_3_02e5314f827d17d482343e8f22c42fd9._comment | 10 + .../automatically_adding_metadata/pre-commit-annex | 71 + .../automatically_getting_files_on_checkout.mdwn | 15 + ...r_when_doing_fsck_on_large_special_remotes.mdwn | 2 + ...ent_1_e7c5c46112a2406b873d08bbf53c40d8._comment | 8 + ...ent_2_daf45ce29fed986fa9aa8b173760d0b7._comment | 14 + ...ent_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment | 8 + ...tralised_repository:_starting_from_nothing.mdwn | 71 + ...ent_1_b0d22822017646775869ce1292e676f4._comment | 8 + doc/tips/centralized_git_repository_tutorial.mdwn | 140 + ...ent_1_9072ebc0c61446d7b151fcfab616fea9._comment | 33 + ...ent_2_528e92b21f0551fde4adb956654953ae._comment | 8 + doc/tips/downloading_podcasts.mdwn | 79 + ...nt_10_4d4f6c22070b58918ee8d34c5e7290ad._comment | 8 + ...nt_11_d8d77048c7e2524968c188e1ad517873._comment | 24 + ...nt_12_0859317471b43c88744dd3df95c879f7._comment | 10 + ...nt_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment | 18 + ...nt_14_05a3694052de36848fbbad6eeeada895._comment | 8 + ...nt_15_21028bed8858c2dae1ac9c2d014fd2a1._comment | 8 + ...nt_16_4869fb5c9f896acc477c44de06c36ca7._comment | 8 + ...nt_17_2e278ff200c1c15efd27c46a3e0aed40._comment | 9 + ...nt_18_382f2b970738d9b1af577955c3083e90._comment | 15 + ...nt_19_f76fc6835e5787b0156380bf09fd81ca._comment | 8 + ...ent_1_f04bc32a34baeeffcd691e9f7cce0230._comment | 13 + ...nt_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment | 10 + ...nt_21_98a1dacc8d264ff31801e6c5c5f2612d._comment | 8 + ...nt_22_00cc7a2fb936d7ea3d5d3764a1637663._comment | 10 + ...ent_2_a9a98cad7358d16792853a2ee413fe6c._comment | 8 + ...ent_3_5a8068a5cb0fd864581157a3aa5d1113._comment | 10 + ...ent_4_e7072a9da30b4c4b4c526013144238d4._comment | 10 + ...ent_5_79b3f8d678ac9f67df4c0cd649657283._comment | 8 + ...ent_6_35106fee5458bdd5c21868fbc49d3616._comment | 10 + ...ent_7_ceb16498b7aadbf04a27acd5d6561d46._comment | 8 + ...ent_8_147397603f0b3fdb42ca387d1da7c5ef._comment | 8 + ...ent_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment | 24 + doc/tips/dropboxannex.mdwn | 29 + doc/tips/emacs_integration.mdwn | 25 + doc/tips/file_manager_integration.mdwn | 119 + ...ent_1_0f82520f415b4715946358658e1799a8._comment | 8 + ...ent_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment | 8 + doc/tips/finding_duplicate_files.mdwn | 21 + ...nt_10_2ed5aa8c632048b13e01d358883fa383._comment | 12 + ...nt_11_5efc6b6ee1dfec88512183e9679ca616._comment | 24 + ...ent_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment | 8 + ...ent_2_900eafe0a781018ff44b35ac232e3ad3._comment | 8 + .../finding_duplicate_files/comment_3._comment | 39 + ...ent_4_1494143a74cc1e9fbe4720c14b73d42b._comment | 8 + ...ent_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment | 8 + ...ent_6_a6e88c93b31f67c933523725ff61b287._comment | 16 + ...ent_7_347b0186755a809594bd42feda6363e2._comment | 10 + ...ent_8_3af51722da0980b724facb184f0f66e9._comment | 10 + ...ent_9_7b4b78a5cd253abfe4f6001049bf64f3._comment | 10 + doc/tips/flickrannex.mdwn | 50 + ...nt_10_50707f259abe5829ce075dfbecd5a4ba._comment | 13 + ...nt_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment | 46 + ...nt_12_90a331275d888221bc695003c8acbe46._comment | 58 + ...nt_13_1596e70dca71c853fd1d6fc9bde02b18._comment | 12 + ...nt_14_c728f10074d194efa8b2c60e97d275e7._comment | 12 + ...ent_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment | 10 + ...ent_2_f53d0d5520e2835e9705bea4e75556f0._comment | 30 + ...ent_4_9ebba4d61140f6c2071e988c9328cf7e._comment | 14 + ...ent_5_4470dae270613dd8712623474bc80ab0._comment | 24 + ...ent_5_d395cdcf815cb430e374ff05c1a63ff4._comment | 17 + ...ent_6_8cf730097001ffe106f2c743edce9d0a._comment | 12 + ...ent_7_a80c8087c4e1562a4c98a24edc182e5a._comment | 12 + ...ent_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment | 8 + ...ent_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment | 9 + ...lly_encrypted_git_repositories_with_gcrypt.mdwn | 127 + ...nt_10_4440a80d64c60c7312d5c405d54e607a._comment | 15 + ...nt_11_28eb9d4ebf28ca310f9b357b1dad244a._comment | 30 + ...nt_12_b697b2ab10705b090a78e7717ec59b18._comment | 10 + ...nt_13_4e37146a870576f09f56d2e5ee784ed7._comment | 23 + ...nt_14_2044e821d841fcd37a51ae768fa88df2._comment | 12 + ...ent_1_5c54690586f2a781905ea4b25aa1147f._comment | 18 + ...ent_2_07feedb4348f8c31176cc744c19368a1._comment | 21 + ...ent_3_c2f873dffa015f1d72ad0c3921909316._comment | 8 + ...ent_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment | 18 + ...ent_5_11b8e82d2a234f65b58b823e71c6d6a2._comment | 10 + ...ent_6_3e41948e1beffcf279bb05ef8e61cc07._comment | 16 + ...ent_7_4ce0b26b25b336f07b2e27246cdfba3e._comment | 16 + ...ent_8_49aa34d75d24a2066baa8a585bc9c2e9._comment | 14 + ...ent_9_3784e0c828cd60b6a9075c2d32d070cc._comment | 14 + doc/tips/googledriveannex.mdwn | 32 + ...ent_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment | 9 + ...ent_2_c98c00e87bc921158c9c3698fd9f89c9._comment | 23 + ...ent_3_e7ba5620c0946874f0ae1287f99d1177._comment | 8 + ...ent_4_239091adaea6ae39fa9a4d9719667a98._comment | 41 + doc/tips/imapannex.mdwn | 25 + doc/tips/megaannex.mdwn | 29 + doc/tips/metadata_driven_views.mdwn | 152 + ...ent_1_1d6793701fd8a1a66bae04662cf853ce._comment | 12 + ...ent_2_13ae4e3668b693c0eefaca23b88515cf._comment | 9 + doc/tips/migrating_data_to_a_new_backend.mdwn | 16 + ...rate_disconnected_directories_to_git_annex.mdwn | 77 + doc/tips/offline_archive_drives.mdwn | 69 + ...ent_1_3d4fdf42191a9d81434d00f51c3609ff._comment | 12 + ...ent_2_864c752aa8d064791a4b14dbbe2e6882._comment | 15 + ...ent_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment | 10 + doc/tips/owncloudannex.mdwn | 28 + ...ent_1_129652308c3c499462828dcaf8e747a4._comment | 40 + ...ent_2_38604990368666f654d41891ba99ac61._comment | 15 + ...ent_3_1bfd290d00d6536da7d31818db46f8ec._comment | 87 + ...ent_4_492b6922a7c5bb5464fedb46b0c5303b._comment | 17 + ...ent_5_1d48ac08714fadcb06d874570d745bd8._comment | 16 + ...ent_6_65959f49a2f56bffd6fe48670c0c8d5a._comment | 8 + ...ent_7_7482002991672ef67836bae43b8d0be8._comment | 8 + doc/tips/powerful_file_matching.mdwn | 36 + doc/tips/recover_data_from_lost+found.mdwn | 19 + ...ent_1_f0901527a4f0faf0b1fd916d5b809314._comment | 9 + ...ent_2_ac405575058beeac992d07c55f7c53a8._comment | 8 + .../recovering_from_a_corrupt_git_repository.mdwn | 17 + ...ent_1_f5827be97f78dbae113a5ba0c9ced896._comment | 8 + ...ent_2_e98df7275bb032308bb87e3607bdde32._comment | 8 + ...ent_3_11bece6dfac090edbcd783b266c482a3._comment | 8 + ...ent_4_86e99017f7585ac2f76753051214637e._comment | 8 + ...ent_6_c8953732ce353cdf0c4fb81ddc98c04a._comment | 8 + ...ent_6_d0da84df0241dc6ccf0aa0c7598917df._comment | 8 + ...ent_7_addf49556e4c33d55a41c393f519d0a4._comment | 10 + ...ent_8_505a2fc2b841fe8eb419801f923ef35f._comment | 8 + doc/tips/remote_webapp_setup.mdwn | 49 + ...eshare_or_dvcs-autosync_with_the_assistant.mdwn | 51 + ...nt_10_d1bd5d6b33951f6d11185bb4a8228269._comment | 8 + ...nt_11_54692ebf854ecbcc5314bb29c33ecc66._comment | 8 + ...ent_1_907e4032ca4a39adb846cf16dbf447dc._comment | 8 + ...ent_2_902d001ba86657ef0f8cca5b175f99ca._comment | 8 + ...ent_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment | 60 + ...ent_4_e10671908b58c554375787d0f76e2366._comment | 13 + ...ent_5_4114380f66b6376c851e93f6876d590b._comment | 8 + ...ent_6_6a5d6af107b297afd008b021f73d787b._comment | 8 + ...ent_7_74d57cf503a86d8f7ace2d769dbb58be._comment | 10 + ...ent_8_85765c0cfeb5b326c06cf60c98147cbf._comment | 21 + ...ent_9_082b5d90ffc836e7c86e40b63a75780d._comment | 8 + .../setup_a_public_repository_on_a_web_site.mdwn | 55 + ...ent_1_1d0fa6da33e401df1d7ff31979247fec._comment | 10 + ...ent_2_b98b761dee9d923153e3c288c1d987ee._comment | 11 + ...ent_3_a6698218f15c598c9b32e0af850133bf._comment | 12 + ...git_annex_directory_between_multiple_users.mdwn | 39 + ...ent_1_01db8cf9dff016bd8e0498d36f325418._comment | 8 + doc/tips/skydriveannex.mdwn | 32 + ...nt_10_c3465b5587548dea56b80b32cd66d653._comment | 16 + ...ent_1_bf383481b2bbb962fbfe783b9f2f213a._comment | 8 + ...ent_2_1f747018b35ab8accd2bf0905e6ad926._comment | 8 + ...ent_3_8b9444006734262693f71e50a40eae1d._comment | 19 + ...ent_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment | 8 + ...ent_5_1d220d96945d497f3a93b5d848eb3995._comment | 8 + ...ent_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment | 12 + ...ent_7_7fcd9c6b5e2a3fc7b753eeac06164036._comment | 18 + ...ent_8_856eaa1b167033aede91a937099c7833._comment | 18 + ...ent_9_cfcf767a1bf07957b76d7f44ef8a9500._comment | 14 + doc/tips/untrusted_repositories.mdwn | 28 + doc/tips/using_Amazon_Glacier.mdwn | 75 + ...ent_1_ccee7f4f5a483a3650270b6e09ab7293._comment | 36 + ...ent_2_d34e05f9244d3a4fcec87b3c360adb4e._comment | 10 + ...ent_3_4c504fd22775afe36296cf54d3e04a8e._comment | 8 + ...ent_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment | 21 + ...ent_5_7788890f58f714b0cdf1462c718ea536._comment | 8 + ...ent_6_0fbe528a57552622e8128196ad80c863._comment | 8 + doc/tips/using_Amazon_S3.mdwn | 37 + ...ent_1_666a26f95024760c99c627eed37b1966._comment | 8 + ...ent_2_f5a0883be7dbb421b584c6dc0165f1ef._comment | 8 + ...ent_3_32acba030c2ad252e2f7027075e4303e._comment | 8 + ...ent_4_92df5a9f923beafba55a1c455728112e._comment | 13 + doc/tips/using_Google_Cloud_Storage.mdwn | 9 + ...ent_1_c576182f39563ae68767391c4227a177._comment | 18 + ...ent_2_0843bfb776b8b6d5de4de7fda4489f34._comment | 15 + ...ent_3_9738f145014d8eae1f1aae7c39e71d31._comment | 12 + doc/tips/using_box.com_as_a_special_remote.mdwn | 71 + ...ent_1_be39f063e8a6155cc2eb71829e884a63._comment | 8 + ..._with_no_fixed_hostname_and_optimising_ssh.mdwn | 59 + ...ent_1_c0b7682a2b6f3078457b85683c825baf._comment | 10 + doc/tips/using_gitolite_with_git-annex.mdwn | 149 + ...nt_10_8767bc8014b459a3cd76f275fd4fa8d6._comment | 8 + ...nt_11_00715e0b47f09130e0e536e29f7b9258._comment | 31 + ...nt_12_7027ce60265b8f24c8ab54553e544068._comment | 8 + ...nt_13_75218b7409c0e281cb01c9b2791e8cdf._comment | 20 + ...nt_14_7d4d4515218d1259d32be3baeb5ee56e._comment | 13 + ...nt_15_dc6f21b5a3d5931c8d949a9753411b9e._comment | 29 + ...nt_16_8e5039e6655fc80dc863b6cdf44ef02a._comment | 15 + ...nt_17_9c40e1da8bb44f7207e802377f5cf923._comment | 11 + ...nt_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment | 21 + ...nt_19_33c19097b6f2b48dfe09ec4c8d952d06._comment | 11 + ...ent_1_9a2a2a8eac9af97e0c984ad105763a73._comment | 15 + ...nt_20_c82af00db3dd74ee9bfe12668e76e57b._comment | 13 + ...nt_21_d2feaaf22d41413048dabf706d1b267e._comment | 8 + ...ent_2_d8efea4ab9576555fadbb47666ecefa9._comment | 8 + ...ent_3_807035f38509ccb9f93f1929ecd37417._comment | 8 + ...ent_4_eb81f824aadc97f098379c5f7e4fba4c._comment | 33 + ...ent_5_f688309532d2993630e9e72e87fb9c46._comment | 20 + ...ent_6_3e203e010a4df5bf03899f867718adc5._comment | 25 + ...ent_7_f8fd08b6ab47378ad88c87348057220d._comment | 10 + ...ent_8_8249772c142117f88e37975d058aa936._comment | 29 + ...ent_9_28418635a6ed7231b89e02211cd3c236._comment | 8 + doc/tips/using_the_SHA1_backend.mdwn | 11 + doc/tips/using_the_web_as_a_special_remote.mdwn | 109 + ...ent_1_321a41d611c6fe45e047af9c96c5176c._comment | 26 + ...ent_2_dfe9c8c49aadff80d2020288584e0390._comment | 10 + ...ent_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment | 18 + ...ent_4_c1133a524989a940f1b5db588707157a._comment | 10 + ...ent_5_5ee9717e74ca2afed98e81fc0ea98a95._comment | 18 + ...ent_6_dceb15bd656e69eefa3ca975d9d642de._comment | 8 + ...ent_7_0bde977c62a53c90cb20491936bc399d._comment | 8 + doc/tips/visualizing_repositories_with_gource.mdwn | 22 + ...ent_1_01c5cd21375990c612b8f291904ddb3e._comment | 10 + .../screenshot.jpg | Bin 0 -> 78509 bytes .../what_to_do_when_a_repository_is_corrupted.mdwn | 27 + ...ent_1_c3543190eae2af594f3e050057e80db6._comment | 8 + ...ent_2_025178c2b11affe2d42a87544b897dc8._comment | 8 + ...ent_3_9a6bae9c0326ecc7610f5415db20f49e._comment | 8 + .../what_to_do_when_you_lose_a_repository.mdwn | 19 + ...ent_1_cf19b8dc304dc37c26717174c4a98aa4._comment | 11 + ...ent_3_fa9ca81668f5faebf2f61b10f82c97d2._comment | 8 + ...ent_3_fdcfca8707e310ca7bb94d359adf8607._comment | 8 + ...ent_4_679eb9be0bfb9d48a2b96383c4816f62._comment | 10 + ...ent_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment | 12 + ...ent_6_05db504cbff2ec2a6346bf43e57a3c25._comment | 8 + ...ent_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment | 16 + ...yet_another_simple_disk_usage_like_utility.mdwn | 9 + ...ent_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment | 9 + ...ent_2_73698913837bfd5a58cf15721211e43e._comment | 8 + doc/todo.mdwn | 4 + ...ious_Versions_of_a_File_From_a_Direct_Repo.mdwn | 1 + ...ent_1_6f477af942aeb98683a56bcf0e819a38._comment | 11 + ...ent_2_45c22f596a18d5dc2331cfeef8c767fa._comment | 12 + ...ent_3_cbca264d86fe733b8106a4bf50c0c6ff._comment | 8 + ...le_way_to_pair_devices_like_bittorent_sync.mdwn | 9 + ...ent_1_d828bc374e50a49101c0b863f9b33080._comment | 8 + ...ent_2_a4badfc248be428e6426a936212cc896._comment | 8 + ...ent_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment | 8 + ...ent_4_2bcab1b7998b4df08fca41b8d810f115._comment | 10 + ...ent_5_677e958c3f2effec7528b484aeb6478d._comment | 13 + ...ent_6_56e53803fdede895cba717e6b6e9a1bb._comment | 23 + ...ia__34___shortcut___34__Add_to_Annex__34__.mdwn | 1 + doc/todo/Bittorrent-like_features.mdwn | 47 + ...ent_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment | 13 + ...ent_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment | 8 + ...ent_3_84f149b30de1562593623aa23dc0396c._comment | 10 + ...ent_4_7c54c83e582c0d4848aaf3d70e312707._comment | 10 + ...ent_5_194dd0e8404ea72af9fb6ff34b994998._comment | 20 + ...ent_6_489505da4143fb1c2bf21e7af695cdef._comment | 9 + ...ble_drive__39___repo_even_if_set_as_client.mdwn | 22 + ...ent_1_25eb2d7d0a9cdd1c55df0cec68472723._comment | 10 + ...ent_2_9e9b96e5113a50533251e946c2560d81._comment | 17 + ...ent_3_6b091198ddd6ed709b076df1296aeb77._comment | 11 + ...ent_4_118b588685b535cca4c02eb6ef297c67._comment | 21 + ...ent_5_5cead277493e1c020e16be6f9245fe33._comment | 12 + ...ent_6_0f135f97c2808dce094628dc6608e617._comment | 8 + ...ent_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment | 10 + ...ent_8_c5758fdb32348b9cd804ff17d27864e1._comment | 16 + ...ent_9_3f0bfc5a79aa59ac76a6968aacda6655._comment | 10 + .../Chunks_support_in_all_special_remotes.mdwn | 5 + ...ent_1_d12604dbeb42bbb6850425d237cb01e7._comment | 8 + doc/todo/Deleting_Unused_Files_by_Age.mdwn | 13 + ...e_auto-merge_for_manual__44___local_merges.mdwn | 9 + ...n___171__git_annex_watch__187___is_running.mdwn | 5 + ...ent_1_e5f2630591ffa7758ca4250a061a8589._comment | 12 + ...ent_2_f8a5cc905d5b06bdbb1a778ab866a28c._comment | 44 + ...ent_3_626c629654508d0d948ece849d43ed86._comment | 8 + .../Improve_direct_mode_using_copy_on_write.mdwn | 42 + doc/todo/LIst_of_Available_Remotes_in_Webapp.mdwn | 1 + ...ent_1_23fe2f3cd44c4357a385452dcd5eedef._comment | 10 + ..._126____47__ssh__47__git-annex__47__config.mdwn | 9 + ...ent_1_284c806e83a32af81b02aea7c7bc285a._comment | 10 + ...ent_2_1f55ad6b39906458779b2d604b003ffe._comment | 10 + ...ent_3_b00dce2374aac6968317d05d23bcfaf7._comment | 8 + ...ent_4_743d0b077110c5cac1e2f47187b75333._comment | 10 + ...special_remote_suggeston_-_clean_directory.mdwn | 23 + ...nt_10_4829c2a2302b4b9611deddfedfbaa944._comment | 10 + ...ent_1_4d81941fe53881eebff97109a07ba2f4._comment | 8 + ...ent_2_660a5b764ad42468154b2bb94f8ec004._comment | 8 + ...ent_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment | 12 + ...ent_4_1dae745cff1c0a38232d033dcc542ac4._comment | 16 + ...ent_5_8d6c791e5e2daec7b25828f6884a67c6._comment | 16 + ...ent_6_92ef2d4a7ed47000fda02732b4794dc0._comment | 10 + ...ent_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment | 28 + ...ent_8_21712dfee4f37232c34eddbce2427691._comment | 11 + ...ent_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment | 35 + doc/todo/Not_working_on_Android-x86.mdwn | 19 + ...ent_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment | 14 + ...ent_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment | 12 + ...ent_3_6b609af60bf1c477139e40eba5cb0c4e._comment | 10 + ...rs_in_all_annexes_watched_by_the_assistant.mdwn | 11 + doc/todo/Recovering_from_a_bad_sync.mdwn | 31 + ...ent_1_6f5f518a3190534b737203787149ef3c._comment | 10 + ...ent_2_e494df56dcede4d14bcaa4cdbf3da4f5._comment | 10 + ...ent_3_4d4904bcbf97401c7c11338f32577f96._comment | 14 + ...ecursive_addurl_simlar_to_wget_--recursive.mdwn | 7 + ...ent_1_4ecd9ddba1b63b571555ec9bef18e2d8._comment | 8 + doc/todo/Show_repo_type_in_repo_list.mdwn | 1 + ...ent_1_ac6eb1072ef902a094b79dd8e0917c4d._comment | 10 + ...ent_2_6979c487f707a724a048d20e2e5744e6._comment | 14 + ...ent_3_529254a6cc20de7259d60a3cbc5ccaf7._comment | 8 + .../Slow_transfer_for_a_lot_of_small_files..mdwn | 20 + doc/todo/Time_Stamping_of_Events_in_Webapp.mdwn | 3 + .../Use_MediaScannerConnection_on_Android.mdwn | 7 + ...haring_site_for_files_with_obfuscated_URLs.mdwn | 7 + ...ent_1_1a1f34f4f389267d67e79409c0ca8b1d._comment | 9 + ...ent_2_735afa6f87a93cdf333c17da32010620._comment | 8 + doc/todo/Views_Demo.mdwn | 15 + ...ent_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment | 8 + ...additional_environment_variables_for_hooks.mdwn | 14 + ...ent_1_d82cbbb478a81a651fbe6cb8b71c1192._comment | 8 + ...ist:_disable_auto-repair_for_the_assistant.mdwn | 3 + ...ent_1_3274820a0d1f10c505f15cd29a37b95a._comment | 12 + ...ent_2_2cf5aef3f1d340c4ed6249ef94c1b607._comment | 8 + ...ent_3_6c53d82e62b2d269a941ba967d05adf5._comment | 8 + ...ecker_fix_wrong_UUID__47__duplicate_remote.mdwn | 7 + ...nex_add__187___for_symlinks_in_direct_mode.mdwn | 8 + ...ent_1_6c6e192bc0f70a386cd4275f98e1bd6f._comment | 8 + ...ent_2_8e22cfdbeb2c841870a623cf4c7baf60._comment | 10 + ..._--branch_to_applicable_git-annex_commands.mdwn | 2 + ...ent_1_3e0a1d1c41f317514dfc496f2274ad1c._comment | 10 + doc/todo/allow_removing_jabber_configuration.mdwn | 5 + ...ote_repo_via_an_ssh_alias_or_an_ip_address.mdwn | 50 + ...ent_1_6b71a390fd16f593216793aec590d9a8._comment | 8 + doc/todo/assistant_parallel_file_transfers.mdwn | 15 + ...d_branches_upon___34__git_annex_sync__34__.mdwn | 16 + doc/todo/build_a_user_guide.mdwn | 3 + doc/todo/cache_key_info.mdwn | 37 + ...ent_1_578df1b3b2cbfdc4aa1805378f35dc48._comment | 11 + doc/todo/checksum_verification_on_transfer.mdwn | 7 + ...ent_1_30f77e631608b9751f9032f97d58cc30._comment | 17 + doc/todo/clear_file_names_in_special_remotes.mdwn | 13 + ...ent_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment | 8 + ...ent_2_823c279683ac3f39c921be3fcbf6bfe2._comment | 10 + ...ent_3_4704e465025b543e47c18d565abd2747._comment | 8 + doc/todo/commit_in_direct_mode.mdwn | 9 + doc/todo/ctrl_c_handling.mdwn | 5 + ...ent_1_3addbe33817db5de836c014287b14c07._comment | 8 + ...ent_2_cc2776dc4805421180edcdf96a89fcaa._comment | 8 + ...ent_3_8d7d357368987f5d5d59b4d8d99a0e06._comment | 8 + doc/todo/custom_f-droid_repo.mdwn | 3 + ...ent_1_d2bdc001584d4b5f925390910ec1ef73._comment | 10 + ...ent_2_20eebe13b76d5279a3d09b346b65ff6e._comment | 9 + ...ent_3_5a79abb8b1dd12426e111e733fa6493b._comment | 8 + ...ent_4_55f05624f0e939f7b8d0c505285e5690._comment | 11 + ...ent_6_de4229f04daf48a153e2f44f57a05a3b._comment | 11 + .../do_not_bug_me_about_intermediate_files.mdwn | 7 + ...standard_groups_more_extensively_in_the_UI.mdwn | 14 + doc/todo/done.mdwn | 4 + ..._different_port_has_been_specified_already.mdwn | 2 + doc/todo/fast_migrate.mdwn | 16 + ...e_space_checking_for_local_special_remotes.mdwn | 4 + ...ent_1_47c254cec58cbbb3ea84c93ef8282f01._comment | 8 + doc/todo/git-annex_ignores_GIT__95__SSH.mdwn | 39 + ...ent_1_958dd21d7e981232f03b4516521ac226._comment | 10 + ...ent_2_319a7e8122e7bc25d9399ba463a16158._comment | 22 + ...ent_3_cc1936f18721a912bb77903be6c4a45f._comment | 8 + ...t___60__file__62___should_verify_file_hash.mdwn | 34 + ...ent_1_650e01a04104120ef1db4ff16fedc4f1._comment | 16 + doc/todo/hidden_files.mdwn | 30 + ...36____123__itemdate__125___with_--template.mdwn | 5 + ...ent_1_62752c760fc12eca0c34d67d58753d00._comment | 10 + ...ent_2_21672360060f48bc2eacfa535ff4c94d._comment | 11 + ...pport_for_spideroak_as_archive__47__backup.mdwn | 9 + ...ent_1_a47ea814f6d7727bbd0eeca6d1fd3219._comment | 10 + doc/todo/keep_annexed_files_for_a_while.mdwn | 8 + doc/todo/notifications.mdwn | 3 + doc/todo/openwrt_package.mdwn | 6 + ...ent_1_100d76109e04bc43979775d71b4152ac._comment | 12 + ...ent_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment | 9 + ...ent_3_5ba8a325a683ff543d81a366c873070d._comment | 8 + doc/todo/optimise_git-annex_merge.mdwn | 23 + doc/todo/parallel_possibilities.mdwn | 13 + ...ent_1_d8e34fc2bc4e5cf761574608f970d496._comment | 8 + ...ent_2_adb76f06a7997abe4559d3169a3181c3._comment | 12 + ...ent_3_145fb974f45da99b7d4b117a3699cccf._comment | 12 + doc/todo/read-only_removable_drives.mdwn | 7 + ...ent_1_979455e3694ae2403134ed6fa2add2fa._comment | 21 + doc/todo/redundancy_stats_in_status.mdwn | 23 + ...ent_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment | 10 + ...ent_2_686ced0684d10511caf07953c64cd5b6._comment | 10 + doc/todo/required_content.mdwn | 23 + ...ent_1_42620a3c958666be2a0d5f5b8eadf7b4._comment | 23 + ...ent_2_132ec6378db63af6281569cf5748b9d3._comment | 14 + ...ent_3_b16a8e8b45ceee887c8c0167b7859654._comment | 8 + doc/todo/resuming_encrypted_uploads.mdwn | 22 + ...ent_1_1832a6fb78e8ad7c838582f46731ac3b._comment | 8 + ...ent_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment | 8 + ...Repository_mode_not_supported_by_git-annex.mdwn | 7 + doc/todo/smudge.mdwn | 162 + ...ent_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment | 8 + ...ent_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment | 12 + ...ent_3_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 + ...sync_my_local_git-annex_from_a_dump_remote.mdwn | 6 + ...ent_1_81d63854f89f00855cda5ace0fc8262a._comment | 14 + ...ent_2_66822b72b1450e79e8edd0c6c21d5aa6._comment | 14 + ...ent_3_b9f73375e2c732e798495f8ee6970c7c._comment | 14 + doc/todo/tahoe_lfs_for_reals.mdwn | 23 + ...ent_1_0a4793ce6a867638f6e510e71dd4bb44._comment | 10 + ...ent_2_80b9e848edfdc7be21baab7d0cef0e3a._comment | 13 + doc/todo/union_mounting.mdwn | 10 + ...ent_1_cb08435812dd7766de26199c73f38e8b._comment | 8 + ...ent_2_240b1736f6bd4fbf87c372d3a46e661b._comment | 9 + ...ent_3_cf0a0d4fbd929f24f7056115b2acb7de._comment | 8 + doc/todo/unwanted_repository_version_upgrades.mdwn | 25 + ...ent_1_48f71865b65db4574a10e5c32ee22197._comment | 12 + ...a_for_preferred___40__wanted__41___content.mdwn | 12 + doc/todo/view_git_annex_log_in_webapp.mdwn | 5 + ...ent_1_945054441d93423b2c7b81712b364a3c._comment | 8 + ...ent_2_0f434dfe80e90951870218bc1b76c374._comment | 12 + ...k_with_locked_down_git-annex-shell_account.mdwn | 7 + doc/todo/windows_git-annex_service.mdwn | 30 + ...nt_11_c3af14453e99dae5425deaa26ca7310e._comment | 14 + ...nt_11_e2dda1037cc85f03613f2774c139ad56._comment | 10 + ...nt_12_249a48a241f14f32dab49f381d2de3b3._comment | 8 + ...nt_12_d3d91ddc00bc275455022d86b779b148._comment | 10 + ...nt_13_59fbe4d07cdbeb786bae792f9c709ddd._comment | 10 + ...nt_13_f1d254fe85b0e5cbc7edf9096af4f942._comment | 27 + ...nt_14_79fc0ff98c5bba2ed616e52e5a58e28f._comment | 8 + ...nt_14_7d5fdac0084c4742967879f5f0f9fccf._comment | 8 + ...nt_15_8f10491f8c0a151284e6d81a83eab212._comment | 12 + ...nt_15_fcd34607116183cc1a764fb307eabe0a._comment | 10 + ...nt_16_51800fd83cd979b021eabdd4c44cfd61._comment | 13 + ...nt_16_6a6424f23772e57f1adb1807ca8b93fa._comment | 14 + ...nt_17_62a1a33c2aaf4b0b8a0149ec526907d7._comment | 16 + ...nt_18_3a408492107ca6f120b631ce8c41faef._comment | 23 + ...nt_19_c6cbc8fe9218f90c661cd1026658c939._comment | 8 + ...nt_20_ca245781a37db5546da3f7204adbeebb._comment | 17 + doc/todo/windows_support.mdwn | 121 + ...nt_10_394127e34e07ab3dc0e7b94ee6898866._comment | 8 + ...nt_11_c91eb7da8ee05064a5bc4a6e2203314b._comment | 8 + ...ent_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment | 10 + ...ent_2_8acae818ce468967499050bbe3c532ea._comment | 12 + ...ent_3_bd0a12f4c9b884ab8a06082842381a01._comment | 8 + ...ent_4_ad06b98b2ddac866ffee334e41fee6a8._comment | 8 + ...ent_5_444fc7251f57db241b6e80abae41851c._comment | 10 + ...ent_6_34f1f60b570c389bb1e741b990064a7e._comment | 8 + ...ent_7_a5ca56c487257434650420acfa60e39f._comment | 8 + ...ent_8_61214de7d967740d42905f3823ce2f65._comment | 12 + ...ent_9_259a0b1a6f4d8d1944173380adc5e7c8._comment | 8 + ...list:_--maxdepth_option_for_git_annex_find.mdwn | 22 + doc/todo/wishlist:_Add_--byte-limit_option.mdwn | 14 + ...ist:_Advanced_settings_for_xmpp_and_webdav.mdwn | 7 + ...ent_1_11c7444ab4988c60732af505b52bde3c._comment | 20 + .../wishlist:_Freeing_X_space_on_remote_Y.mdwn | 1 + ...hlist:_Option_to_specify_max_transfer_rate.mdwn | 3 + ...ent_1_4fd870e14b5b70c8a6ade41406294387._comment | 10 + ...ent_2_dd854f297ad6a94b54be9f3edfd0f766._comment | 8 + ...ent_3_a8b7e90a473d5937807cc7eb456efe33._comment | 10 + ...ishlist:_Restore_s3_files_moved_to_Glacier.mdwn | 7 + ...ent_1_eb934756cb2af7fa13ad3b5fad7f85b2._comment | 9 + ...t__34___annex_get_for_centralized_use_case.mdwn | 14 + ...ent_1_5c8812973cf91b046e7fc44d7e86c78e._comment | 14 + ...ent_2_f36b6a5b128423211aac91a252ecf85f._comment | 18 + ...ent_3_ad1569b2405acacd2e37f42b82f24c88._comment | 10 + ...ent_4_8aba90150fe178ce9712ad951628f3d6._comment | 8 + ...ent_5_6f42d240e0021f4dfa37146bea3f5d7e._comment | 16 + ...ent_6_5fda455febf728b079f26fe42bf7bcab._comment | 16 + ...ent_7_f1052ab997f1a2cccbabfd1533fc0a59._comment | 8 + ...ent_8_07804647b6023436878756bd97a23f32._comment | 8 + ...ent_9_fdc883d3963de8072794f3189742e4e3._comment | 10 + ...hlist:___39__get__39___queue_and_schedule..mdwn | 30 + ...___39__whereis__39___support_in_the_webapp.mdwn | 4 + ...list:___96__git_annex_drop_--relaxed__96__.mdwn | 5 + ...ent_1_c83a6cddd0ce222205a149cfa41ca395._comment | 10 + ...ent_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment | 11 + ...ent_3_3e830035df580601f038ce3a7003c39d._comment | 63 + ...ent_4_e5516689bc128c061dcd66649dc69584._comment | 10 + ...ent_5_be740e4b06d9130ae6afc5783da3c0e0._comment | 14 + ...ent_6_79d115f95cec46bb51e7fba078524db1._comment | 17 + .../wishlist:___96__git_annex_sync_-m__96__.mdwn | 10 + ...__git_annex_sync__96___without_auto-commit.mdwn | 5 + ...ent_1_fff7cdff9e4bc988139152a799b65c99._comment | 8 + ...ent_2_b8dd92d7710a9d194312058e53c38d21._comment | 10 + ...ent_3_206e319f6d7c6b0d1f05af2475a8b335._comment | 8 + .../wishlist:_add_--symlink_option_to_import.mdwn | 1 + ...ent_1_d5d853142d401b95577567e3eb43495e._comment | 8 + ...ices_file_samples_for_assistant_and_webapp.mdwn | 6 + ...ent_1_b89e90f9a70748c95aaf81740a40b76e._comment | 8 + ...ent_2_d64361380cb18b98ddb43ada1c9f540a._comment | 8 + .../wishlist:_allow_custom_S3_url_in_webapp.mdwn | 3 + ...ent_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment | 10 + ...ent_2_f96bb81fde4185368dc6ea5a5aed87da._comment | 10 + ...g_--_tracking_the_sources_of_the_downloads.mdwn | 28 + ...ent_1_36ae3c75053d5ec278b5e6eb2084d57a._comment | 8 + ...ent_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment | 8 + ...ent_3_d9f725de41a8572c85e4c6d9b4bcc927._comment | 8 + ...ent_4_f52492e4cc6f965515800bd1c0e05c90._comment | 10 + ...ent_5_5b36656fc5fa124e763f06711d9da32b._comment | 10 + ...ent_6_285215a4466806baf85b8606f680494a._comment | 12 + ...ent_7_15bf62e46db4b84ed3156f550f03de42._comment | 12 + ...argefiles_configuration_in_webapp_and_sync.mdwn | 1 + ...ent_1_db632de391ce9fce42af51a770ed3aeb._comment | 10 + ...ent_2_4a0931d9884054d764fde315d4fe4851._comment | 14 + ...st:_annex.largefiles_support_for_mimetypes.mdwn | 1 + ...ent_1_304431bb62b5b8a64edc37a11bbaff59._comment | 8 + ...hive_from_remote_with_the_least_free_space.mdwn | 1 + ...ent_1_6813fdc7ecc98765a5d35d34163a1712._comment | 8 + ...ent_2_21a249cedca1ceb80d10784004735524._comment | 8 + doc/todo/wishlist:_derived_content_support.mdwn | 8 + doc/todo/wishlist:_disable_automatic_commits.mdwn | 36 + ...t:_display_status_of_remotes_in_the_webapp.mdwn | 1 + doc/todo/wishlist:_do_not_import_new_files.mdwn | 7 + ...ent_1_b41c214599d6601257a9d824cebbffcc._comment | 14 + ...ent_2_7b26171458baaf5c0057276d2d97e14c._comment | 8 + ...ent_3_6f80ce6cee4519d4f69193d5086e194a._comment | 20 + ...ent_4_22a7a03c30174e42e6d8e639e31e1d34._comment | 12 + ...ent_5_4294e92e2f4efb9dd10b280f5c9843f7._comment | 10 + ...shlist:_do_round_robin_downloading_of_data.mdwn | 5 + ...ent_1_460335b0e59ad03871c524f1fe812357._comment | 8 + ...ted_git_remote_on_hosting_site_from_webapp.mdwn | 1 + doc/todo/wishlist:_generic_annex.cost-command.mdwn | 17 + doc/todo/wishlist:_git_annex_diff.mdwn | 9 + ...ent_1_16ccf2e1036d9e1a913db81988731b5a._comment | 8 + ...annex_info_._also_return_numcopies_setting.mdwn | 1 + doc/todo/wishlist:_git_annex_info_UUID.mdwn | 8 + ...ent_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment | 10 + .../comment_2._comment | 8 + doc/todo/wishlist:_history_of_operations.mdwn | 8 + ...ent_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment | 8 + ...ake_git_annex_reinject_work_in_direct_mode.mdwn | 21 + ...ke_partial_files_available_during_transfer.mdwn | 18 + ...ent_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment | 12 + ...ent_3_1304a721da6f5133fdfa1dac507f1ecb._comment | 10 + ...t:_more_info_in_commit_messages_in_general.mdwn | 8 + ...tandard_commit_message_of___96__sync__96__.mdwn | 3 + ...ent_1_b9c241cf94a35aa6a45f4d44334694b0._comment | 8 + ...ost_to_the_end_of_the_queue_when_one_fails.mdwn | 7 + ...ent_1_82ee9de610a0ac55cd1c27c211079e5b._comment | 10 + ...ent_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment | 10 + ...to_print_more_info_with___39__unused__39__.mdwn | 37 + .../wishlist:_pack_metadata_in_direct_mode.mdwn | 3 + ...ent_1_1a550d6977a255b789337c3d1602db04._comment | 10 + ...ent_2_3cc9c69d33c658058daea9cb5e4ab669._comment | 10 + doc/todo/wishlist:_perform_fsck_remotely.mdwn | 39 + ...ent_1_db92311dcdb1ef0ab0413f83e191c70c._comment | 15 + ...ent_2_2f0dbaf143d94290bfbebb6869eb7241._comment | 12 + ...ent_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment | 8 + ..._print_locations_for_files_in_rsync_remote.mdwn | 6 + ...cursive_directory_remote_setup__47__addurl.mdwn | 7 + ...ent_1_b79976afc2242791523e63831f30af71._comment | 12 + ...ent_2_1741d2392006a9af9cfd1f3b847600b9._comment | 9 + ...ta_stores___40__gnunet__44___freenet__41__.mdwn | 26 + ...ent_1_e2c2047e7401cb95a82ffb686a732859._comment | 8 + ...ent_2_472b576afdb169b233edd01adcb2123d._comment | 8 + ...ent_3_b4ff519ece76c6c3fb29b981320e2e1c._comment | 10 + doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn | 1 + ...ent_1_ab0c761030bc55e8fb75d1b344bb98b9._comment | 8 + ...ent_2_17e948acb1e29793cf172cd6def4160b._comment | 8 + doc/todo/wishlist:_swift_backend.mdwn | 5 + ...ent_1_e6efbb35f61ee521b473a92674036788._comment | 8 + ...ent_2_5d8c83b0485112e98367b7abaab3f4e3._comment | 8 + ...ent_3_bf8625b909c3a7321cae40e6f145e874._comment | 8 + ...ent_4_4d97d12ddd99834788e94648c8eebef9._comment | 10 + ...ent_5_1568f726f91d4589aef7ca9fcc3c957d._comment | 8 + ...wishlist:_traffic_accounting_for_git-annex.mdwn | 3 + ...list:_unify_directory_scheme_for_the_store.mdwn | 20 + ...ent_1_44da58beaaab359ecaba7fb905ca4ae1._comment | 10 + ...ent_2_bc698c501ecdb56df57171f4f3bb831a._comment | 16 + ...ent_3_e555d0dbbaa05528806905c6a940724b._comment | 8 + .../wishlist:_use_hardlinks_for_local_clones.mdwn | 9 + ...ent_1_85064fafe472a5bd395d60ce8f7acb56._comment | 12 + doc/todo/wishlist:alias_system.mdwn | 1 + ...ent_1_5afad4b92f9a449d4a82a94ad31feec2._comment | 8 + ..._time_stamps_to_annex_log_popups_in_webapp.mdwn | 1 + ...ent_1_ec90432a7d46383071401b05243d621f._comment | 8 + ...dd_an_option_to_install__SSH_key_on_remote.mdwn | 9 + ...ent_1_13737dc99aa877b309f7ebe44ecbafee._comment | 16 + ...ent_2_06230669218541ac392d674bedd43176._comment | 43 + ...ent_3_002afd775b82a0ced609c8305803a6c2._comment | 22 + ...ent_4_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 + ...ent_1_20f9b7b75786075de666b2146dc13a60._comment | 12 + doc/upgrades/gcrypt.mdwn | 25 + ...ent_1_606c1527735996ae671f78948e4ad84b._comment | 8 + doc/use_case/Alice.mdwn | 24 + doc/use_case/Bob.mdwn | 25 + doc/users.mdwn | 9 + doc/users/anarcat.mdwn | 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 + doc/videos/git-annex_assistant_introduction.mdwn | 5 + ...ent_1_f42ad4183c2c28319d3705a82fceb82f._comment | 15 + ...ent_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment | 12 + doc/videos/git-annex_assistant_lan.mdwn | 6 + ...ent_1_df8c8b6d9d63fbf5462b225edbb23c82._comment | 8 + ...ent_2_d4e3122da9c9e27fbe872e09fcde762b._comment | 10 + ...ent_3_d43ee0a335c2f010b437cf28437455c2._comment | 8 + ...ent_4_c710e27db41311b157d8caaafc32dc7e._comment | 8 + doc/videos/git-annex_assistant_remote_sharing.mdwn | 6 + doc/videos/git-annex_assistant_sync_demo.mdwn | 8 + doc/videos/git-annex_views_demo.mdwn | 11 + doc/videos/git-annex_watch_demo.mdwn | 7 + doc/videos/git-annex_weppapp_demo.mdwn | 8 + doc/walkthrough.mdwn | 26 + doc/walkthrough/adding_a_remote.mdwn | 19 + ...ent_1_0a59355bd33a796aec97173607e6adc9._comment | 8 + ...ent_2_f8cd79ef1593a8181a7f1086a87713e8._comment | 9 + ...ent_3_60691af4400521b5a8c8d75efe3b44cb._comment | 9 + ...ent_4_6f7cf5c330272c96b3abeb6612075c9d._comment | 10 + doc/walkthrough/adding_files.mdwn | 12 + .../automatically_managing_content.mdwn | 45 + doc/walkthrough/backups.mdwn | 27 + ...ent_1_d0244791d2abbf29553546a6a6568a0f._comment | 10 + doc/walkthrough/creating_a_repository.mdwn | 6 + doc/walkthrough/fsck:_verifying_your_data.mdwn | 16 + doc/walkthrough/fsck:_when_things_go_wrong.mdwn | 13 + doc/walkthrough/getting_file_content.mdwn | 12 + doc/walkthrough/modifying_annexed_files.mdwn | 44 + ...ent_1_624b4a0b521b553d68ab6049f7dbaf8c._comment | 14 + ...ent_2_b000622304535d32b69db17d51156b21._comment | 10 + doc/walkthrough/more.mdwn | 3 + .../moving_file_content_between_repositories.mdwn | 13 + ...ent_1_4c30ade91fc7113a95960aa3bd1d5427._comment | 19 + ...ent_2_7d90e1e150e7524ba31687108fcc38d6._comment | 10 + ...ent_3_558d80384434207b9cfc033763863de3._comment | 12 + ...ent_4_a2f343eceed9e9fba1670f21e0fc6af4._comment | 8 + ...please:_When_git-annex_seems_to_skip_files.mdwn | 27 + doc/walkthrough/removing_files.mdwn | 17 + ...ent_1_cb65e7c510b75be1c51f655b058667c6._comment | 8 + ...ent_2_64709ea4558915edd5c8ca4486965b07._comment | 8 + .../removing_files:_When_things_go_wrong.mdwn | 24 + doc/walkthrough/renaming_files.mdwn | 13 + doc/walkthrough/syncing.mdwn | 27 + .../transferring_files:_When_things_go_wrong.mdwn | 17 + doc/walkthrough/unused_data.mdwn | 35 + ...ent_1_684b7b652d3a8ec04f32129c5528f1ab._comment | 22 + doc/walkthrough/using_bup.mdwn | 37 + doc/walkthrough/using_ddar.mdwn | 32 + doc/walkthrough/using_ssh_remotes.mdwn | 33 + ...nt_10_98e97c4d7fbbcd449eddf683967a71d6._comment | 8 + ...nt_11_f2775a151ed50caba27057bd9c38bae2._comment | 13 + ...nt_12_a8bc6110128431ca2a8624ddc75ea364._comment | 10 + ...ent_2_365db5820d96d5daa62c19fd76fcdf1e._comment | 13 + ...ent_2_451fd0c6a25ee61ef137e8e5be0c286b._comment | 16 + ...ent_3_b2f15a46620385da26d5fe8f11ebfc1a._comment | 15 + ...ent_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment | 8 + ...ent_5_a9805c7965da0b88a1c9f7f207c450a1._comment | 18 + ...ent_6_9d5c12c056892b706cf100ea01866685._comment | 12 + ...ent_7_725e7dbb2d0a74a035127cb01ee0442c._comment | 16 + ...ent_8_8448e55026d2c2b50d8da41707686bea._comment | 16 + ...ent_9_61833299a9878f23ac57598fa6da8839._comment | 23 + doc/walkthrough/using_tags_and_branches.mdwn | 14 + ghci | 4 + git-annex.cabal | 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 + standalone/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 + ...ate_1.3.7-0001-support-Android-cert-store.patch | 37 + .../haskell-patches/comonad_cross-build.patch | 25 + .../haskell-patches/crypto-numbers_build-fix.patch | 227 + ...ributive_0.4.4_0001-fixes-for-cross-build.patch | 25 + ...d-net.dns1-command-instead-of-resolv.conf.patch | 66 + .../haskell-patches/entropy_cross-build.patch | 25 + ...ls_0.1.4-0001-statically-link-with-gnutls.patch | 43 + .../gsasl_0.3.5-0001-link-with-libgsasl.patch | 25 + ...oute_1.2.11_0001-build-without-IPv6-stuff.patch | 47 + ...anguage-javascript_fix-build-with-new-ghc.patch | 25 + ...twork.BSD-symbols-not-available-in-bionic.patch | 157 + ...2.4.1.0_0003-configure-misdetects-accept4.patch | 34 + ..._0004-getprotobyname-hack-for-tcp-and-udp.patch | 28 + ...etwork_2.4.1.0_0005-no-NODELAY-on-android.patch | 25 + .../network_2.5.0.0_0001-android-port-fixes.patch | 161 + ...i386-opt-stuff-to-allow-cross-compilation.patch | 25 + .../socks_0.4.2_0001-remove-IPv6-stuff.patch | 135 + .../haskell-patches/stm-chans_cross-build.patch | 25 + .../system-filepath_cross-build.patch | 25 + .../unbounded-delays_crossbuild.patch | 25 + .../unix-time_hack-for-Bionic.patch | 69 + ...-without-v1-uuid-which-needs-network-info.patch | 79 + .../x509-system_support-Android-cert-store.patch | 36 + ...lib_0.5.4.0_0001-hack-to-build-on-Android.patch | 35 + .../android/icons/drawable-hdpi/ic_launcher.png | Bin 0 -> 2612 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1310 bytes .../android/icons/drawable-ldpi/ic_launcher.png | Bin 0 -> 1279 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 682 bytes .../android/icons/drawable-mdpi/ic_launcher.png | Bin 0 -> 1768 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 946 bytes .../android/icons/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3396 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1837 bytes standalone/android/icons/drawable/ic_launcher.png | 1 + .../drawable/ic_stat_service_notification_icon.png | 1 + standalone/android/install-haskell-packages | 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 .../haskell-patches/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 + .../haskell-patches/DAV_build-without-TH.patch | 415 ++ .../no-th/haskell-patches/aeson_remove-TH.patch | 40 + .../haskell-patches/file-embed_remove-TH.patch | 150 + .../generic-deriving_remove-TH.patch | 394 ++ standalone/no-th/haskell-patches/lens_no-TH.patch | 230 + .../haskell-patches/monad-logger_remove-TH.patch | 27 + .../persistent-template_stub-out.patch | 25 + .../persistent_1.1.5.1_0001-disable-TH.patch | 41 + .../haskell-patches/process-conduit_avoid-TH.patch | 24 + .../profunctors_3.3-0001-fix-cross-build.patch | 26 + .../haskell-patches/reflection_remove-TH.patch | 59 + .../haskell-patches/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 + .../haskell-patches/xml-hamlet_remove_TH.patch | 108 + .../yesod-auth_don-t-really-build.patch | 34 + .../haskell-patches/yesod-core_expand_TH.patch | 771 +++ .../haskell-patches/yesod-form_spliced-TH.patch | 1833 +++++++ .../yesod-persistent_do-not-really-build.patch | 33 + .../haskell-patches/yesod-routes_remove-TH.patch | 170 + .../no-th/haskell-patches/yesod-static_hack.patch | 193 + .../no-th/haskell-patches/yesod_hack-TH.patch | 200 + standalone/osx/git-annex.app/Contents/Info.plist | 41 + standalone/osx/git-annex.app/Contents/MacOS/README | 9 + standalone/osx/git-annex.app/Contents/MacOS/git | 31 + .../osx/git-annex.app/Contents/MacOS/git-annex | 31 + .../git-annex.app/Contents/MacOS/git-annex-shell | 31 + .../git-annex.app/Contents/MacOS/git-annex-webapp | 32 + .../git-annex.app/Contents/MacOS/git-receive-pack | 31 + .../osx/git-annex.app/Contents/MacOS/git-shell | 31 + .../git-annex.app/Contents/MacOS/git-upload-pack | 31 + .../osx/git-annex.app/Contents/MacOS/runshell | 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 + 6478 files changed, 189704 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/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/RepoProblem.hs create mode 100644 Assistant/ScanRemotes.hs create mode 100644 Assistant/Ssh.hs create mode 100644 Assistant/Sync.hs create mode 100644 Assistant/Threads/Committer.hs create mode 100644 Assistant/Threads/ConfigMonitor.hs create mode 100644 Assistant/Threads/Cronner.hs create mode 100644 Assistant/Threads/DaemonStatus.hs create mode 100644 Assistant/Threads/Glacier.hs create mode 100644 Assistant/Threads/Merger.hs create mode 100644 Assistant/Threads/MountWatcher.hs create mode 100644 Assistant/Threads/NetWatcher.hs create mode 100644 Assistant/Threads/PairListener.hs create mode 100644 Assistant/Threads/ProblemFixer.hs create mode 100644 Assistant/Threads/Pusher.hs create mode 100644 Assistant/Threads/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/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 diff --git a/.ghci b/.ghci new file mode 100644 index 000000000..c5550cee6 --- /dev/null +++ b/.ghci @@ -0,0 +1 @@ +:load Common diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..46423bd59 --- /dev/null +++ b/.mailmap @@ -0,0 +1,6 @@ +Joey Hess http://joey.kitenet.net/ +Joey Hess http://joeyh.name/ +Joey Hess http://joeyh.name/ +Yaroslav Halchenko +Yaroslav Halchenko http://yarikoptic.myopenid.com/ +Yaroslav Halchenko https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY diff --git a/Annex.hs b/Annex.hs new file mode 100644 index 000000000..bb271c5e8 --- /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 000000000..c19011e2d --- /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 000000000..a03d6ddf3 --- /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 000000000..5c2c14548 --- /dev/null +++ b/Annex/Branch/Transitions.hs @@ -0,0 +1,60 @@ +{- git-annex branch transitions + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Branch.Transitions ( + FileTransition(..), + getTransitionCalculator +) where + +import Logs +import Logs.Transitions +import Logs.UUIDBased as UUIDBased +import Logs.Presence.Pure as Presence +import Types.TrustLevel +import Types.UUID + +import qualified Data.Map as M + +data FileTransition + = ChangeFile String + | RemoveFile + | PreserveFile + +type TransitionCalculator = FilePath -> String -> TrustMap -> FileTransition + +getTransitionCalculator :: Transition -> Maybe TransitionCalculator +getTransitionCalculator ForgetGitHistory = Nothing +getTransitionCalculator ForgetDeadRemotes = Just dropDead + +dropDead :: FilePath -> String -> TrustMap -> FileTransition +dropDead f content trustmap = case getLogVariety f of + Just UUIDBasedLog + -- Don't remove the dead repo from the trust log, + -- because git remotes may still exist, and they need + -- to still know it's dead. + | f == trustLog -> PreserveFile + | otherwise -> ChangeFile $ UUIDBased.showLog id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLog Just content + Just NewUUIDBasedLog -> ChangeFile $ + UUIDBased.showLogNew id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLogNew Just content + Just (PresenceLog _) -> + let newlog = Presence.compactLog $ dropDeadFromPresenceLog trustmap $ Presence.parseLog content + in if null newlog + then RemoveFile + else ChangeFile $ Presence.showLog newlog + Just OtherLog -> PreserveFile + Nothing -> PreserveFile + +dropDeadFromUUIDBasedLog :: TrustMap -> UUIDBased.Log String -> UUIDBased.Log String +dropDeadFromUUIDBasedLog trustmap = M.filterWithKey $ notDead trustmap . const + +{- Presence logs can contain UUIDs or other values. Any line that matches + - a dead uuid is dropped; any other values are passed through. -} +dropDeadFromPresenceLog :: TrustMap -> [Presence.LogLine] -> [Presence.LogLine] +dropDeadFromPresenceLog trustmap = filter $ notDead trustmap (toUUID . Presence.info) + +notDead :: TrustMap -> (v -> UUID) -> v -> Bool +notDead trustmap a v = M.findWithDefault SemiTrusted (a v) trustmap /= DeadTrusted diff --git a/Annex/BranchState.hs b/Annex/BranchState.hs new file mode 100644 index 000000000..9b2f9a04c --- /dev/null +++ b/Annex/BranchState.hs @@ -0,0 +1,43 @@ +{- git-annex branch state management + - + - Runtime state about the git-annex branch. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.BranchState where + +import Common.Annex +import Types.BranchState +import qualified Annex + +getState :: Annex BranchState +getState = Annex.getState Annex.branchstate + +setState :: BranchState -> Annex () +setState state = Annex.changeState $ \s -> s { Annex.branchstate = state } + +changeState :: (BranchState -> BranchState) -> Annex () +changeState changer = setState =<< changer <$> getState + +{- Runs an action to check that the index file exists, if it's not been + - checked before in this run of git-annex. -} +checkIndexOnce :: Annex () -> Annex () +checkIndexOnce a = unlessM (indexChecked <$> getState) $ do + a + changeState $ \s -> s { indexChecked = True } + +{- Runs an action to update the branch, if it's not been updated before + - in this run of git-annex. -} +runUpdateOnce :: Annex () -> Annex () +runUpdateOnce a = unlessM (branchUpdated <$> getState) $ do + a + disableUpdate + +{- Avoids updating the branch. A useful optimisation when the branch + - is known to have not changed, or git-annex won't be relying on info + - from it. -} +disableUpdate :: Annex () +disableUpdate = changeState $ \s -> s { branchUpdated = True } diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs new file mode 100644 index 000000000..2f8c43079 --- /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 000000000..8eed9e804 --- /dev/null +++ b/Annex/CheckAttr.hs @@ -0,0 +1,35 @@ +{- git check-attr interface, with handle automatically stored in the Annex monad + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckAttr ( + checkAttr, + checkAttrHandle +) where + +import Common.Annex +import qualified Git.CheckAttr as Git +import qualified Annex + +{- All gitattributes used by git-annex. -} +annexAttrs :: [Git.Attr] +annexAttrs = + [ "annex.backend" + , "annex.numcopies" + ] + +checkAttr :: Git.Attr -> FilePath -> Annex String +checkAttr attr file = do + h <- checkAttrHandle + liftIO $ Git.checkAttr h attr file + +checkAttrHandle :: Annex Git.CheckAttrHandle +checkAttrHandle = maybe startup return =<< Annex.getState Annex.checkattrhandle + where + startup = do + h <- inRepo $ Git.checkAttrStart annexAttrs + Annex.changeState $ \s -> s { Annex.checkattrhandle = Just h } + return h diff --git a/Annex/CheckIgnore.hs b/Annex/CheckIgnore.hs new file mode 100644 index 000000000..d45e652bc --- /dev/null +++ b/Annex/CheckIgnore.hs @@ -0,0 +1,32 @@ +{- git check-ignore interface, with handle automatically stored in + - the Annex monad + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckIgnore ( + checkIgnored, + checkIgnoreHandle +) where + +import Common.Annex +import qualified Git.CheckIgnore as Git +import qualified Annex + +checkIgnored :: FilePath -> Annex Bool +checkIgnored file = go =<< checkIgnoreHandle + where + go Nothing = return False + go (Just h) = liftIO $ Git.checkIgnored h file + +checkIgnoreHandle :: Annex (Maybe Git.CheckIgnoreHandle) +checkIgnoreHandle = maybe startup return =<< Annex.getState Annex.checkignorehandle + where + startup = do + v <- inRepo Git.checkIgnoreStart + when (isNothing v) $ + warning "The installed version of git is too old for .gitignores to be honored by git-annex." + Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v } + return v diff --git a/Annex/Content.hs b/Annex/Content.hs new file mode 100644 index 000000000..8ad3d5e65 --- /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 000000000..b249e0557 --- /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 000000000..e6b941e0f --- /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 000000000..13485242a --- /dev/null +++ b/Annex/Direct/Fixup.hs @@ -0,0 +1,31 @@ +{- git-annex direct mode guard fixup + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Direct.Fixup where + +import Git.Types +import Git.Config +import qualified Git.Construct as Construct +import Utility.Path +import Utility.SafeCommand + +{- Direct mode repos have core.bare=true, but are not really bare. + - Fix up the Repo to be a non-bare repo, and arrange for git commands + - run by git-annex to be passed parameters that override this setting. -} +fixupDirect :: Repo -> IO Repo +fixupDirect r@(Repo { location = l@(Local { gitdir = d, worktree = Nothing }) }) = do + let r' = r + { location = l { worktree = Just (parentDir d) } + , gitGlobalOpts = gitGlobalOpts r ++ + [ Param "-c" + , Param $ coreBare ++ "=" ++ boolConfig False + ] + } + -- Recalc now that the worktree is correct. + rs' <- Construct.fromRemotes r' + return $ r' { remotes = rs' } +fixupDirect r = return r diff --git a/Annex/Drop.hs b/Annex/Drop.hs new file mode 100644 index 000000000..71263dc61 --- /dev/null +++ b/Annex/Drop.hs @@ -0,0 +1,124 @@ +{- dropping of unwanted content + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Drop where + +import Common.Annex +import Logs.Trust +import Config.NumCopies +import Types.Remote (uuid) +import Types.Key (key2file) +import qualified Remote +import qualified Command.Drop +import Command +import Annex.Wanted +import Annex.Exception +import Config +import Annex.Content.Direct + +import qualified Data.Set as S +import System.Log.Logger (debugM) + +type Reason = String + +{- Drop a key from local and/or remote when allowed by the preferred content + - and numcopies settings. + - + - The UUIDs are ones where the content is believed to be present. + - The Remote list can include other remotes that do not have the content; + - only ones that match the UUIDs will be dropped from. + - If allowed to drop fromhere, that drop will be tried first. + - + - A remote can be specified that is known to have the key. This can be + - used an an optimisation when eg, a key has just been uploaded to a + - remote. + - + - In direct mode, all associated files are checked, and only if all + - of them are unwanted are they dropped. + - + - The runner is used to run commands, and so can be either callCommand + - or commandAction. + -} +handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> CommandActionRunner -> Annex () +handleDropsFrom locs rs reason fromhere key afile knownpresentremote runner = do + fs <- ifM isDirect + ( do + l <- associatedFilesRelative key + return $ if null l + then maybeToList afile + else l + , return $ maybeToList afile + ) + n <- getcopies fs + if fromhere && checkcopies n Nothing + then go fs rs =<< dropl fs n + else go fs rs n + where + getcopies fs = do + (untrusted, have) <- trustPartition UnTrusted locs + numcopies <- if null fs + then getNumCopies + else maximum <$> mapM getFileNumCopies fs + return (NumCopies (length have), numcopies, S.fromList untrusted) + + {- Check that we have enough copies still to drop the content. + - When the remote being dropped from is untrusted, it was not + - counted as a copy, so having only numcopies suffices. Otherwise, + - we need more than numcopies to safely drop. -} + checkcopies (have, numcopies, _untrusted) Nothing = have > numcopies + checkcopies (have, numcopies, untrusted) (Just u) + | S.member u untrusted = have >= numcopies + | otherwise = have > numcopies + + decrcopies (have, numcopies, untrusted) Nothing = + (NumCopies (fromNumCopies have - 1), numcopies, untrusted) + decrcopies v@(_have, _numcopies, untrusted) (Just u) + | S.member u untrusted = v + | otherwise = decrcopies v Nothing + + go _ [] _ = noop + go fs (r:rest) n + | uuid r `S.notMember` slocs = go fs rest n + | checkcopies n (Just $ Remote.uuid r) = + dropr fs r n >>= go fs rest + | otherwise = noop + + checkdrop fs n u a + | null fs = check $ -- no associated files; unused content + wantDrop True u (Just key) Nothing + | otherwise = check $ + allM (wantDrop True u (Just key) . Just) fs + where + check c = ifM c + ( dodrop n u a + , return n + ) + + dodrop n@(have, numcopies, _untrusted) u a = + ifM (safely $ runner $ a numcopies) + ( do + liftIO $ debugM "drop" $ unwords + [ "dropped" + , fromMaybe (key2file key) afile + , "(from " ++ maybe "here" show u ++ ")" + , "(copies now " ++ show (fromNumCopies have - 1) ++ ")" + , ": " ++ reason + ] + return $ decrcopies n u + , return n + ) + + dropl fs n = checkdrop fs n Nothing $ \numcopies -> + Command.Drop.startLocal afile numcopies key knownpresentremote + + dropr fs r n = checkdrop fs n (Just $ Remote.uuid r) $ \numcopies -> + Command.Drop.startRemote afile numcopies key r + + slocs = S.fromList locs + + safely a = either (const False) id <$> tryAnnex a + diff --git a/Annex/Environment.hs b/Annex/Environment.hs new file mode 100644 index 000000000..4b8d38464 --- /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 000000000..41a9ed921 --- /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 000000000..da6a5e0e9 --- /dev/null +++ b/Annex/FileMatcher.hs @@ -0,0 +1,116 @@ +{- git-annex file matching + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.FileMatcher where + +import qualified Data.Map as M + +import Common.Annex +import Limit +import Utility.Matcher +import Types.Group +import Logs.Group +import Logs.Remote +import Annex.UUID +import qualified Annex +import Types.FileMatcher +import Git.FilePath +import Types.Remote (RemoteConfig) + +import Data.Either +import qualified Data.Set as S + +checkFileMatcher :: (FileMatcher Annex) -> FilePath -> Annex Bool +checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True + +checkMatcher :: (FileMatcher Annex) -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool +checkMatcher matcher mkey afile notpresent def + | isEmpty matcher = return def + | otherwise = case (mkey, afile) of + (_, Just file) -> go =<< fileMatchInfo file + (Just key, _) -> go (MatchingKey key) + _ -> return def + where + go mi = matchMrun matcher $ \a -> a notpresent mi + +fileMatchInfo :: FilePath -> Annex MatchInfo +fileMatchInfo file = do + matchfile <- getTopFilePath <$> inRepo (toTopFilePath file) + return $ MatchingFile FileInfo + { matchFile = matchfile + , relFile = file + } + +matchAll :: FileMatcher Annex +matchAll = generate [] + +parsedToMatcher :: [Either String (Token (MatchFiles Annex))] -> Either String (FileMatcher Annex) +parsedToMatcher parsed = case partitionEithers parsed of + ([], vs) -> Right $ generate vs + (es, _) -> Left $ unwords $ map ("Parse failure: " ++) es + +exprParser :: FileMatcher Annex -> FileMatcher Annex -> GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token (MatchFiles Annex))] +exprParser matchstandard matchgroupwanted groupmap configmap mu expr = + map parse $ tokenizeMatcher expr + where + parse = parseToken + matchstandard + matchgroupwanted + (limitPresent mu) + (limitInDir preferreddir) + groupmap + preferreddir = fromMaybe "public" $ + M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu + +parseToken :: FileMatcher Annex -> FileMatcher Annex -> MkLimit Annex -> MkLimit Annex -> GroupMap -> String -> Either String (Token (MatchFiles Annex)) +parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir groupmap t + | t `elem` tokens = Right $ token t + | t == "standard" = call matchstandard + | t == "groupwanted" = call matchgroupwanted + | t == "present" = use checkpresent + | t == "inpreferreddir" = use checkpreferreddir + | t == "unused" = Right $ Operation limitUnused + | otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $ + M.fromList + [ ("include", limitInclude) + , ("exclude", limitExclude) + , ("copies", limitCopies) + , ("lackingcopies", limitLackingCopies False) + , ("approxlackingcopies", limitLackingCopies True) + , ("inbackend", limitInBackend) + , ("largerthan", limitSize (>)) + , ("smallerthan", limitSize (<)) + , ("metadata", limitMetaData) + , ("inallgroup", limitInAllGroup groupmap) + ] + where + (k, v) = separate (== '=') t + use a = Operation <$> a v + call sub = Right $ Operation $ \notpresent mi -> + matchMrun sub $ \a -> a notpresent mi + +{- This is really dumb tokenization; there's no support for quoted values. + - Open and close parens are always treated as standalone tokens; + - otherwise tokens must be separated by whitespace. -} +tokenizeMatcher :: String -> [String] +tokenizeMatcher = filter (not . null ) . concatMap splitparens . words + where + splitparens = segmentDelim (`elem` "()") + +{- Generates a matcher for files large enough (or meeting other criteria) + - to be added to the annex, rather than directly to git. -} +largeFilesMatcher :: Annex (FileMatcher Annex) +largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig + where + go Nothing = return matchAll + go (Just expr) = do + gm <- groupMap + rc <- readRemoteLog + u <- getUUID + either badexpr return $ + parsedToMatcher $ exprParser matchAll matchAll gm rc (Just u) expr + badexpr e = error $ "bad annex.largefiles configuration: " ++ e diff --git a/Annex/Hook.hs b/Annex/Hook.hs new file mode 100644 index 000000000..4848e2d61 --- /dev/null +++ b/Annex/Hook.hs @@ -0,0 +1,71 @@ +{- git-annex git hooks + - + - Note that it's important that the scripts installed by git-annex + - not change, otherwise removing old hooks using an old version of + - the script would fail. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Hook where + +import Common.Annex +import qualified Git.Hook as Git +import Config +import qualified Annex +import Utility.Shell +import Utility.FileMode + +import qualified Data.Map as M + +preCommitHook :: Git.Hook +preCommitHook = Git.Hook "pre-commit" (mkHookScript "git annex pre-commit .") + +preCommitAnnexHook :: Git.Hook +preCommitAnnexHook = Git.Hook "pre-commit-annex" "" + +mkHookScript :: String -> String +mkHookScript s = unlines + [ shebang_local + , "# automatically configured by git-annex" + , s + ] + +hookWrite :: Git.Hook -> Annex () +hookWrite h = + -- cannot have git hooks in a crippled filesystem (no execute bit) + unlessM crippledFileSystem $ + unlessM (inRepo $ Git.hookWrite h) $ + hookWarning h "already exists, not configuring" + +hookUnWrite :: Git.Hook -> Annex () +hookUnWrite h = unlessM (inRepo $ Git.hookUnWrite h) $ + hookWarning h "contents modified; not deleting. Edit it to remove call to git annex." + +hookWarning :: Git.Hook -> String -> Annex () +hookWarning h msg = do + r <- gitRepo + warning $ Git.hookName h ++ " hook (" ++ Git.hookFile h r ++ ") " ++ msg + +{- Runs a hook. To avoid checking if the hook exists every time, + - the existing hooks are cached. -} +runAnnexHook :: Git.Hook -> Annex () +runAnnexHook hook = do + cmd <- fromRepo $ Git.hookFile hook + m <- Annex.getState Annex.existinghooks + case M.lookup hook m of + Just True -> run cmd + Just False -> noop + Nothing -> do + exists <- hookexists cmd + Annex.changeState $ \s -> s + { Annex.existinghooks = M.insert hook exists m } + when exists $ + run cmd + where + hookexists f = liftIO $ catchBoolIO $ + isExecutable . fileMode <$> getFileStatus f + run cmd = unlessM (liftIO $ boolSystem cmd []) $ + warning $ cmd ++ " failed" diff --git a/Annex/Index.hs b/Annex/Index.hs new file mode 100644 index 000000000..af0cab45e --- /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 000000000..637b130ee --- /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 000000000..f34a7be1b --- /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 000000000..25166bff5 --- /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 000000000..8114e94f2 --- /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 000000000..a1f797a76 --- /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 000000000..22e9e7e50 --- /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 000000000..d41fb1506 --- /dev/null +++ b/Annex/MetaData/StandardFields.hs @@ -0,0 +1,47 @@ +{- git-annex metadata, standard fields + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData.StandardFields ( + tagMetaField, + yearMetaField, + monthMetaField, + lastChangedField, + mkLastChangedField, + isLastChangedField +) where + +import Types.MetaData + +import Data.List + +tagMetaField :: MetaField +tagMetaField = mkMetaFieldUnchecked "tag" + +yearMetaField :: MetaField +yearMetaField = mkMetaFieldUnchecked "year" + +monthMetaField :: MetaField +monthMetaField = mkMetaFieldUnchecked "month" + +lastChangedField :: MetaField +lastChangedField = mkMetaFieldUnchecked lastchanged + +mkLastChangedField :: MetaField -> MetaField +mkLastChangedField f = mkMetaFieldUnchecked (fromMetaField f ++ lastchangedSuffix) + +isLastChangedField :: MetaField -> Bool +isLastChangedField f + | f == lastChangedField = True + | otherwise = lastchanged `isSuffixOf` s && s /= lastchangedSuffix + where + s = fromMetaField f + +lastchanged :: String +lastchanged = "lastchanged" + +lastchangedSuffix :: String +lastchangedSuffix = "-lastchanged" diff --git a/Annex/Notification.hs b/Annex/Notification.hs new file mode 100644 index 000000000..608bda7e2 --- /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 000000000..a8c4907b2 --- /dev/null +++ b/Annex/Path.hs @@ -0,0 +1,34 @@ +{- git-annex program path + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Path where + +import Common +import Config.Files +import System.Environment + +{- A fully qualified path to the currently running git-annex program. + - + - getExecutablePath is available since ghc 7.4.2. On OSs it supports + - well, it returns the complete path to the program. But, on other OSs, + - it might return just the basename. + -} +programPath :: IO (Maybe FilePath) +programPath = do +#if MIN_VERSION_base(4,6,0) + exe <- getExecutablePath + p <- if isAbsolute exe + then return exe + else readProgramFile +#else + p <- readProgramFile +#endif + -- In case readProgramFile returned just the command name, + -- fall back to finding it in PATH. + searchPath p diff --git a/Annex/Perms.hs b/Annex/Perms.hs new file mode 100644 index 000000000..e3a2fa65a --- /dev/null +++ b/Annex/Perms.hs @@ -0,0 +1,125 @@ +{- git-annex file permissions + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Perms ( + setAnnexFilePerm, + setAnnexDirPerm, + annexFileMode, + createAnnexDirectory, + noUmask, + createContentDir, + freezeContentDir, + thawContentDir, + modifyContent, +) where + +import Common.Annex +import Utility.FileMode +import Git.SharedRepository +import qualified Annex +import Annex.Exception +import Config + +import System.Posix.Types + +withShared :: (SharedRepository -> Annex a) -> Annex a +withShared a = maybe startup a =<< Annex.getState Annex.shared + where + startup = do + shared <- fromRepo getSharedRepository + Annex.changeState $ \s -> s { Annex.shared = Just shared } + a shared + +setAnnexFilePerm :: FilePath -> Annex () +setAnnexFilePerm = setAnnexPerm False + +setAnnexDirPerm :: FilePath -> Annex () +setAnnexDirPerm = setAnnexPerm True + +{- Sets appropriate file mode for a file or directory in the annex, + - other than the content files and content directory. Normally, + - use the default mode, but with core.sharedRepository set, + - allow the group to write, etc. -} +setAnnexPerm :: Bool -> FilePath -> Annex () +setAnnexPerm isdir file = unlessM crippledFileSystem $ + withShared $ liftIO . go + where + go GroupShared = modifyFileMode file $ addModes $ + groupSharedModes ++ + if isdir then [ ownerExecuteMode, groupExecuteMode ] else [] + go AllShared = modifyFileMode file $ addModes $ + readModes ++ + [ ownerWriteMode, groupWriteMode ] ++ + if isdir then executeModes else [] + go _ = noop + +{- Gets the appropriate mode to use for creating a file in the annex + - (other than content files, which are locked down more). -} +annexFileMode :: Annex FileMode +annexFileMode = withShared $ return . go + where + go GroupShared = sharedmode + go AllShared = combineModes (sharedmode:readModes) + go _ = stdFileMode + sharedmode = combineModes groupSharedModes + +{- Creates a directory inside the gitAnnexDir, including any parent + - directories. Makes directories with appropriate permissions. -} +createAnnexDirectory :: FilePath -> Annex () +createAnnexDirectory dir = traverse dir [] =<< top + where + top = parentDir <$> fromRepo gitAnnexDir + traverse d below stop + | d `equalFilePath` stop = done + | otherwise = ifM (liftIO $ doesDirectoryExist d) + ( done + , traverse (parentDir d) (d:below) stop + ) + where + done = forM_ below $ \p -> do + liftIO $ createDirectoryIfMissing True p + setAnnexDirPerm p + +{- Blocks writing to the directory an annexed file is in, to prevent the + - file accidentially being deleted. However, if core.sharedRepository + - is set, this is not done, since the group must be allowed to delete the + - file. + -} +freezeContentDir :: FilePath -> Annex () +freezeContentDir file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + dir = parentDir file + go GroupShared = groupWriteRead dir + go AllShared = groupWriteRead dir + go _ = preventWrite dir + +thawContentDir :: FilePath -> Annex () +thawContentDir file = unlessM crippledFileSystem $ + liftIO $ allowWrite $ parentDir file + +{- Makes the directory tree to store an annexed file's content, + - with appropriate permissions on each level. -} +createContentDir :: FilePath -> Annex () +createContentDir dest = do + unlessM (liftIO $ doesDirectoryExist dir) $ + createAnnexDirectory dir + -- might have already existed with restricted perms + unlessM crippledFileSystem $ + liftIO $ allowWrite dir + where + dir = parentDir dest + +{- Creates the content directory for a file if it doesn't already exist, + - or thaws it if it does, then runs an action to modify the file, and + - finally, freezes the content directory. -} +modifyContent :: FilePath -> Annex a -> Annex a +modifyContent f a = do + createContentDir f -- also thaws it + v <- tryAnnex a + freezeContentDir f + either throwAnnex return v diff --git a/Annex/Queue.hs b/Annex/Queue.hs new file mode 100644 index 000000000..a5ef60037 --- /dev/null +++ b/Annex/Queue.hs @@ -0,0 +1,62 @@ +{- git-annex command queue + - + - Copyright 2011, 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Queue ( + addCommand, + addUpdateIndex, + flush, + flushWhenFull, + size +) where + +import Common.Annex +import Annex hiding (new) +import qualified Git.Queue +import qualified Git.UpdateIndex + +{- Adds a git command to the queue. -} +addCommand :: String -> [CommandParam] -> [FilePath] -> Annex () +addCommand command params files = do + q <- get + store <=< inRepo $ Git.Queue.addCommand command params files q + +{- Adds an update-index stream to the queue. -} +addUpdateIndex :: Git.UpdateIndex.Streamer -> Annex () +addUpdateIndex streamer = do + q <- get + store <=< inRepo $ Git.Queue.addUpdateIndex streamer q + +{- Runs the queue if it is full. Should be called periodically. -} +flushWhenFull :: Annex () +flushWhenFull = do + q <- get + when (Git.Queue.full q) flush + +{- Runs (and empties) the queue. -} +flush :: Annex () +flush = do + q <- get + unless (0 == Git.Queue.size q) $ do + showStoringStateAction + q' <- inRepo $ Git.Queue.flush q + store q' + +{- Gets the size of the queue. -} +size :: Annex Int +size = Git.Queue.size <$> get + +get :: Annex Git.Queue.Queue +get = maybe new return =<< getState repoqueue + +new :: Annex Git.Queue.Queue +new = do + q <- Git.Queue.new . annexQueueSize <$> getGitConfig + store q + return q + +store :: Git.Queue.Queue -> Annex () +store q = changeState $ \s -> s { repoqueue = Just q } diff --git a/Annex/Quvi.hs b/Annex/Quvi.hs new file mode 100644 index 000000000..1a2edf6b8 --- /dev/null +++ b/Annex/Quvi.hs @@ -0,0 +1,33 @@ +{- quvi options for git-annex + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE Rank2Types #-} + +module Annex.Quvi where + +import Common.Annex +import qualified Annex +import Utility.Quvi +import Utility.Url + +withQuviOptions :: forall a. Query a -> [QuviParam] -> URLString -> Annex a +withQuviOptions a ps url = do + v <- quviVersion + opts <- map Param . annexQuviOptions <$> Annex.getGitConfig + liftIO $ a v (map (\mkp -> mkp v) ps++opts) url + +quviSupported :: URLString -> Annex Bool +quviSupported u = liftIO . flip supported u =<< quviVersion + +quviVersion :: Annex QuviVersion +quviVersion = go =<< Annex.getState Annex.quviversion + where + go (Just v) = return v + go Nothing = do + v <- liftIO probeVersion + Annex.changeState $ \s -> s { Annex.quviversion = Just v } + return v diff --git a/Annex/ReplaceFile.hs b/Annex/ReplaceFile.hs new file mode 100644 index 000000000..e734c4d64 --- /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 000000000..246ac338d --- /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 000000000..35fdf333c --- /dev/null +++ b/Annex/TaggedPush.hs @@ -0,0 +1,61 @@ +{- git-annex tagged pushes + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.TaggedPush where + +import Common.Annex +import qualified Remote +import qualified Annex.Branch +import qualified Git +import qualified Git.Ref +import qualified Git.Command +import qualified Git.Branch +import Utility.Base64 + +{- Converts a git branch into a branch that is tagged with a UUID, typically + - the UUID of the repo that will be pushing it, and possibly with other + - information. + - + - Pushing to branches on the remote that have our uuid in them is ugly, + - but it reserves those branches for pushing by us, and so our pushes will + - never conflict with other pushes. + - + - To avoid cluttering up the branch display, the branch is put under + - refs/synced/, rather than the usual refs/remotes/ + - + - Both UUIDs and Base64 encoded data are always legal to be used in git + - refs, per git-check-ref-format. + -} +toTaggedBranch :: UUID -> Maybe String -> Git.Branch -> Git.Branch +toTaggedBranch u info b = Git.Ref $ intercalate "/" $ catMaybes + [ Just "refs/synced" + , Just $ fromUUID u + , toB64 <$> info + , Just $ Git.fromRef $ Git.Ref.base b + ] + +fromTaggedBranch :: Git.Branch -> Maybe (UUID, Maybe String) +fromTaggedBranch b = case split "/" $ Git.fromRef b of + ("refs":"synced":u:info:_base) -> + Just (toUUID u, fromB64Maybe info) + ("refs":"synced":u:_base) -> + Just (toUUID u, Nothing) + _ -> Nothing + where + +taggedPush :: UUID -> Maybe String -> Git.Ref -> Remote -> Git.Repo -> IO Bool +taggedPush u info branch remote = Git.Command.runBool + [ Param "push" + , Param $ Remote.name remote + {- Using forcePush here is safe because we "own" the tagged branch + - we're pushing; it has no other writers. Ensures it is pushed + - even if it has been rewritten by a transition. -} + , Param $ Git.Branch.forcePush $ refspec Annex.Branch.name + , Param $ refspec branch + ] + where + refspec b = Git.fromRef b ++ ":" ++ Git.fromRef (toTaggedBranch u info b) diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs new file mode 100644 index 000000000..df5aba09c --- /dev/null +++ b/Annex/Transfer.hs @@ -0,0 +1,131 @@ +{- git-annex transfers + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Transfer ( + module X, + upload, + download, + runTransfer, + noRetry, + forwardRetry, +) where + +import Common.Annex +import Logs.Transfer as X +import Annex.Notification as X +import Annex.Perms +import Annex.Exception +import Utility.Metered +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import Control.Concurrent + +upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +upload u key f d a _witness = runTransfer (Transfer Upload u key) f d a + +download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +download u key f d a _witness = runTransfer (Transfer Download u key) f d a + +{- Runs a transfer action. Creates and locks the lock file while the + - action is running, and stores info in the transfer information + - file. + - + - If the transfer action returns False, the transfer info is + - left in the failedTransferDir. + - + - If the transfer is already in progress, returns False. + - + - An upload can be run from a read-only filesystem, and in this case + - no transfer information or lock file is used. + -} +runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool +runTransfer t file shouldretry a = do + info <- liftIO $ startTransferInfo file + (meter, tfile, metervar) <- mkProgressUpdater t info + mode <- annexFileMode + (fd, inprogress) <- liftIO $ prep tfile mode info + if inprogress + then do + showNote "transfer already in progress" + return False + else do + ok <- retry info metervar $ + bracketIO (return fd) (cleanup tfile) (const $ a meter) + unless ok $ recordFailedTransfer t info + return ok + where +#ifndef mingw32_HOST_OS + prep tfile mode info = do + mfd <- catchMaybeIO $ + openFd (transferLockFile tfile) ReadWrite (Just mode) + defaultFileFlags { trunc = True } + case mfd of + Nothing -> return (Nothing, False) + Just fd -> do + locked <- catchMaybeIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + if isNothing locked + then return (Nothing, True) + else do + void $ tryIO $ writeTransferInfoFile info tfile + return (mfd, False) +#else + prep tfile _mode info = do + v <- catchMaybeIO $ lockExclusive (transferLockFile tfile) + case v of + Nothing -> return (Nothing, False) + Just Nothing -> return (Nothing, True) + Just (Just lockhandle) -> do + void $ tryIO $ writeTransferInfoFile info tfile + return (Just lockhandle, False) +#endif + cleanup _ Nothing = noop + cleanup tfile (Just lockhandle) = do + void $ tryIO $ removeFile tfile +#ifndef mingw32_HOST_OS + void $ tryIO $ removeFile $ transferLockFile tfile + closeFd lockhandle +#else + {- Windows cannot delete the lockfile until the lock + - is closed. So it's possible to race with another + - process that takes the lock before it's removed, + - so ignore failure to remove. + -} + dropLock lockhandle + void $ tryIO $ removeFile $ transferLockFile tfile +#endif + retry oldinfo metervar run = do + v <- tryAnnex run + case v of + Right b -> return b + Left _ -> do + b <- getbytescomplete metervar + let newinfo = oldinfo { bytesComplete = Just b } + if shouldretry oldinfo newinfo + then retry newinfo metervar run + else return False + getbytescomplete metervar + | transferDirection t == Upload = + liftIO $ readMVar metervar + | otherwise = do + f <- fromRepo $ gitAnnexTmpObjectLocation (transferKey t) + liftIO $ catchDefaultIO 0 $ + fromIntegral . fileSize <$> getFileStatus f + +type RetryDecider = TransferInfo -> TransferInfo -> Bool + +noRetry :: RetryDecider +noRetry _ _ = False + +{- Retries a transfer when it fails, as long as the failed transfer managed + - to send some data. -} +forwardRetry :: RetryDecider +forwardRetry old new = bytesComplete old < bytesComplete new diff --git a/Annex/UUID.hs b/Annex/UUID.hs new file mode 100644 index 000000000..5ed887689 --- /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 000000000..397a7910b --- /dev/null +++ b/Annex/Url.hs @@ -0,0 +1,42 @@ +{- Url downloading, with git-annex user agent and configured http + - headers and wget/curl options. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Url ( + module U, + withUrlOptions, + getUrlOptions, + getUserAgent, +) where + +import Common.Annex +import qualified Annex +import Utility.Url as U +import qualified Build.SysConfig as SysConfig + +defaultUserAgent :: U.UserAgent +defaultUserAgent = "git-annex/" ++ SysConfig.packageversion + +getUserAgent :: Annex (Maybe U.UserAgent) +getUserAgent = Annex.getState $ + Just . fromMaybe defaultUserAgent . Annex.useragent + +getUrlOptions :: Annex U.UrlOptions +getUrlOptions = U.UrlOptions + <$> getUserAgent + <*> headers + <*> options + where + headers = do + v <- annexHttpHeadersCommand <$> Annex.getGitConfig + case v of + Just cmd -> lines <$> liftIO (readProcess "sh" ["-c", cmd]) + Nothing -> annexHttpHeaders <$> Annex.getGitConfig + options = map Param . annexWebOptions <$> Annex.getGitConfig + +withUrlOptions :: (U.UrlOptions -> IO a) -> Annex a +withUrlOptions a = liftIO . a =<< getUrlOptions diff --git a/Annex/VariantFile.hs b/Annex/VariantFile.hs new file mode 100644 index 000000000..7c849c59f --- /dev/null +++ b/Annex/VariantFile.hs @@ -0,0 +1,45 @@ +{- git-annex .variant files for automatic merge conflict resolution + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.VariantFile where + +import Common.Annex +import Types.Key + +import Data.Hash.MD5 + +variantMarker :: String +variantMarker = ".variant-" + +mkVariant :: FilePath -> String -> FilePath +mkVariant file variant = takeDirectory file + dropExtension (takeFileName file) + ++ variantMarker ++ variant + ++ takeExtension file + +{- The filename to use when resolving a conflicted merge of a file, + - that points to a key. + - + - Something derived from the key needs to be included in the filename, + - but rather than exposing the whole key to the user, a very weak hash + - is used. There is a very real, although still unlikely, chance of + - conflicts using this hash. + - + - In the event that there is a conflict with the filename generated + - for some other key, that conflict will itself be handled by the + - conflicted merge resolution code. That case is detected, and the full + - key is used in the filename. + -} +variantFile :: FilePath -> Key -> FilePath +variantFile file key + | doubleconflict = mkVariant file (key2file key) + | otherwise = mkVariant file (shortHash $ key2file key) + where + doubleconflict = variantMarker `isInfixOf` file + +shortHash :: String -> String +shortHash = take 4 . md5s . md5FilePath diff --git a/Annex/Version.hs b/Annex/Version.hs new file mode 100644 index 000000000..2a75a1c55 --- /dev/null +++ b/Annex/Version.hs @@ -0,0 +1,41 @@ +{- git-annex repository versioning + - + - Copyright 2010,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Version where + +import Common.Annex +import Config +import qualified Annex + +type Version = String + +supportedVersion :: Version +supportedVersion = "5" + +upgradableVersions :: [Version] +#ifndef mingw32_HOST_OS +upgradableVersions = ["0", "1", "2", "4"] +#else +upgradableVersions = ["2", "3", "4"] +#endif + +autoUpgradeableVersions :: [Version] +autoUpgradeableVersions = ["3", "4"] + +versionField :: ConfigKey +versionField = annexConfig "version" + +getVersion :: Annex (Maybe Version) +getVersion = annexVersion <$> Annex.getGitConfig + +setVersion :: Version -> Annex () +setVersion = setConfig versionField + +removeVersion :: Annex () +removeVersion = unsetConfig versionField diff --git a/Annex/View.hs b/Annex/View.hs new file mode 100644 index 000000000..b96981612 --- /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 000000000..25ac16a34 --- /dev/null +++ b/Annex/View/ViewedFile.hs @@ -0,0 +1,75 @@ +{- filenames (not paths) used in views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.View.ViewedFile ( + ViewedFile, + MkViewedFile, + viewedFileFromReference, + viewedFileReuse, + dirFromViewedFile, + prop_viewedFile_roundtrips, +) where + +import Common.Annex + +type FileName = String +type ViewedFile = FileName + +type MkViewedFile = FilePath -> ViewedFile + +{- Converts a filepath used in a reference branch to the + - filename that will be used in the view. + - + - No two filepaths from the same branch should yeild the same result, + - so all directory structure needs to be included in the output filename + - in some way. + - + - So, from dir/subdir/file.foo, generate file_%dir%subdir%.foo + -} +viewedFileFromReference :: MkViewedFile +viewedFileFromReference f = concat + [ escape base + , if null dirs then "" else "_%" ++ intercalate "%" (map escape dirs) ++ "%" + , escape $ concat extensions + ] + where + (path, basefile) = splitFileName f + dirs = filter (/= ".") $ map dropTrailingPathSeparator (splitPath path) + (base, extensions) = splitShortExtensions basefile + + {- To avoid collisions with filenames or directories that contain + - '%', and to allow the original directories to be extracted + - from the ViewedFile, '%' is escaped to '\%' (and '\' to '\\'). + -} + escape :: String -> String + escape = replace "%" "\\%" . replace "\\" "\\\\" + +{- For use when operating already within a view, so whatever filepath + - is present in the work tree is already a ViewedFile. -} +viewedFileReuse :: MkViewedFile +viewedFileReuse = takeFileName + +{- Extracts from a ViewedFile the directory where the file is located on + - in the reference branch. -} +dirFromViewedFile :: ViewedFile -> FilePath +dirFromViewedFile = joinPath . drop 1 . sep [] "" + where + sep l _ [] = reverse l + sep l curr (c:cs) + | c == '%' = sep (reverse curr:l) "" cs + | c == '\\' = case cs of + (c':cs') -> sep l (c':curr) cs' + [] -> sep l curr cs + | otherwise = sep l (c:curr) cs + +prop_viewedFile_roundtrips :: FilePath -> Bool +prop_viewedFile_roundtrips f + -- Relative filenames wanted, not directories. + | any (isPathSeparator) (end f ++ beginning f) = True + | otherwise = dir == dirFromViewedFile (viewedFileFromReference f) + where + dir = joinPath $ beginning $ splitDirectories f diff --git a/Annex/Wanted.hs b/Annex/Wanted.hs new file mode 100644 index 000000000..42f813bbb --- /dev/null +++ b/Annex/Wanted.hs @@ -0,0 +1,29 @@ +{- git-annex checking whether content is wanted + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Wanted where + +import Common.Annex +import Logs.PreferredContent +import Annex.UUID + +import qualified Data.Set as S + +{- Check if a file is preferred content for the local repository. -} +wantGet :: Bool -> Maybe Key -> AssociatedFile -> Annex Bool +wantGet def key file = isPreferredContent Nothing S.empty key file def + +{- Check if a file is preferred content for a remote. -} +wantSend :: Bool -> Maybe Key -> AssociatedFile -> UUID -> Annex Bool +wantSend def key file to = isPreferredContent (Just to) S.empty key file def + +{- Check if a file can be dropped, maybe from a remote. + - Don't drop files that are preferred content. -} +wantDrop :: Bool -> Maybe UUID -> Maybe Key -> AssociatedFile -> Annex Bool +wantDrop def from key file = do + u <- maybe getUUID (return . id) from + not <$> isPreferredContent (Just u) (S.singleton u) key file def diff --git a/Assistant.hs b/Assistant.hs new file mode 100644 index 000000000..82f157241 --- /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 000000000..745694f59 --- /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 000000000..be631e999 --- /dev/null +++ b/Assistant/Alert/Utility.hs @@ -0,0 +1,130 @@ +{- git-annex assistant alert utilities + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Alert.Utility where + +import Common.Annex +import Assistant.Types.Alert +import Utility.Tense + +import qualified Data.Text as T +import Data.Text (Text) +import qualified Data.Map as M + +{- This is as many alerts as it makes sense to display at a time. + - A display might be smaller, or larger, the point is to not overwhelm the + - user with a ton of alerts. -} +displayAlerts :: Int +displayAlerts = 6 + +{- This is not a hard maximum, but there's no point in keeping a great + - many filler alerts in an AlertMap, so when there's more than this many, + - they start being pruned, down toward displayAlerts. -} +maxAlerts :: Int +maxAlerts = displayAlerts * 2 + +type AlertPair = (AlertId, Alert) + +{- The desired order is the reverse of: + - + - - Pinned alerts + - - High priority alerts, newest first + - - Medium priority Activity, newest first (mostly used for Activity) + - - Low priority alerts, newest first + - - Filler priorty alerts, newest first + - - Ties are broken by the AlertClass, with Errors etc coming first. + -} +compareAlertPairs :: AlertPair -> AlertPair -> Ordering +compareAlertPairs + (aid, Alert { alertClass = aclass, alertPriority = aprio }) + (bid, Alert { alertClass = bclass, alertPriority = bprio }) + = compare aprio bprio + `mappend` compare aid bid + `mappend` compare aclass bclass + +sortAlertPairs :: [AlertPair] -> [AlertPair] +sortAlertPairs = sortBy compareAlertPairs + +{- Renders an alert's header for display, if it has one. -} +renderAlertHeader :: Alert -> Maybe Text +renderAlertHeader alert = renderTense (alertTense alert) <$> alertHeader alert + +{- Renders an alert's message for display. -} +renderAlertMessage :: Alert -> Text +renderAlertMessage alert = renderTense (alertTense alert) $ + (alertMessageRender alert) alert + +showAlert :: Alert -> String +showAlert alert = T.unpack $ T.unwords $ catMaybes + [ renderAlertHeader alert + , Just $ renderAlertMessage alert + ] + +alertTense :: Alert -> Tense +alertTense alert + | alertClass alert == Activity = Present + | otherwise = Past + +{- Checks if two alerts display the same. -} +effectivelySameAlert :: Alert -> Alert -> Bool +effectivelySameAlert x y = all id + [ alertClass x == alertClass y + , alertHeader x == alertHeader y + , alertData x == alertData y + , alertBlockDisplay x == alertBlockDisplay y + , alertClosable x == alertClosable y + , alertPriority x == alertPriority y + ] + +makeAlertFiller :: Bool -> Alert -> Alert +makeAlertFiller success alert + | isFiller alert = alert + | otherwise = alert + { alertClass = if c == Activity then c' else c + , alertPriority = Filler + , alertClosable = True + , alertButtons = [] + , alertIcon = Just $ if success then SuccessIcon else ErrorIcon + } + where + c = alertClass alert + c' + | success = Success + | otherwise = Error + +isFiller :: Alert -> Bool +isFiller alert = alertPriority alert == Filler + +{- Updates the Alertmap, adding or updating an alert. + - + - Any old filler that looks the same as the alert is removed. + - + - Or, if the alert has an alertCombiner that combines it with + - an old alert, the old alert is replaced with the result, and the + - alert is removed. + - + - Old filler alerts are pruned once maxAlerts is reached. + -} +mergeAlert :: AlertId -> Alert -> AlertMap -> AlertMap +mergeAlert i al m = maybe updatePrune updateCombine (alertCombiner al) + where + pruneSame k al' = k == i || not (effectivelySameAlert al al') + pruneBloat m' + | bloat > 0 = M.fromList $ pruneold $ M.toList m' + | otherwise = m' + where + bloat = M.size m' - maxAlerts + pruneold l = + let (f, rest) = partition (\(_, a) -> isFiller a) l + in drop bloat f ++ rest + updatePrune = pruneBloat $ M.filterWithKey pruneSame $ + M.insertWith' const i al m + updateCombine combiner = + let combined = M.mapMaybe (combiner al) m + in if M.null combined + then updatePrune + else M.delete i $ M.union combined m diff --git a/Assistant/BranchChange.hs b/Assistant/BranchChange.hs new file mode 100644 index 000000000..c9354544a --- /dev/null +++ b/Assistant/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.BranchChange where + +import Assistant.Common +import Assistant.Types.BranchChange + +import Control.Concurrent.MSampleVar + +branchChanged :: Assistant () +branchChanged = flip writeSV () <<~ (fromBranchChangeHandle . branchChangeHandle) + +waitBranchChange :: Assistant () +waitBranchChange = readSV <<~ (fromBranchChangeHandle . branchChangeHandle) diff --git a/Assistant/Changes.hs b/Assistant/Changes.hs new file mode 100644 index 000000000..2ecd2036c --- /dev/null +++ b/Assistant/Changes.hs @@ -0,0 +1,47 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Changes where + +import Assistant.Common +import Assistant.Types.Changes +import Utility.TList + +import Data.Time.Clock +import Control.Concurrent.STM + +{- Handlers call this when they made a change that needs to get committed. -} +madeChange :: FilePath -> ChangeInfo -> Assistant (Maybe Change) +madeChange f t = Just <$> (Change <$> liftIO getCurrentTime <*> pure f <*> pure t) + +noChange :: Assistant (Maybe Change) +noChange = return Nothing + +{- Indicates an add needs to be done, but has not started yet. -} +pendingAddChange :: FilePath -> Assistant (Maybe Change) +pendingAddChange f = Just <$> (PendingAddChange <$> liftIO getCurrentTime <*> pure f) + +{- Gets all unhandled changes. + - Blocks until at least one change is made. -} +getChanges :: Assistant [Change] +getChanges = (atomically . getTList) <<~ changePool + +{- Gets all unhandled changes, without blocking. -} +getAnyChanges :: Assistant [Change] +getAnyChanges = (atomically . takeTList) <<~ changePool + +{- Puts unhandled changes back into the pool. + - Note: Original order is not preserved. -} +refillChanges :: [Change] -> Assistant () +refillChanges cs = (atomically . flip appendTList cs) <<~ changePool + +{- Records a change to the pool. -} +recordChange :: Change -> Assistant () +recordChange c = (atomically . flip snocTList c) <<~ changePool + +recordChanges :: [Change] -> Assistant () +recordChanges = refillChanges diff --git a/Assistant/Commits.hs b/Assistant/Commits.hs new file mode 100644 index 000000000..7d1d3780f --- /dev/null +++ b/Assistant/Commits.hs @@ -0,0 +1,23 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Commits where + +import Assistant.Common +import Assistant.Types.Commits +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all unhandled commits. + - Blocks until at least one commit is made. -} +getCommits :: Assistant [Commit] +getCommits = (atomically . getTList) <<~ commitChan + +{- Records a commit in the channel. -} +recordCommit :: Assistant () +recordCommit = (atomically . flip consTList Commit) <<~ commitChan diff --git a/Assistant/Common.hs b/Assistant/Common.hs new file mode 100644 index 000000000..f9719422d --- /dev/null +++ b/Assistant/Common.hs @@ -0,0 +1,14 @@ +{- Common infrastructure for the git-annex assistant. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Common (module X) where + +import Common.Annex as X +import Assistant.Monad as X +import Assistant.Types.DaemonStatus as X +import Assistant.Types.NamedThread as X +import Assistant.Types.Alert as X diff --git a/Assistant/CredPairCache.hs b/Assistant/CredPairCache.hs new file mode 100644 index 000000000..2b8f72e7c --- /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 000000000..35f8fc856 --- /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 000000000..cc05786e4 --- /dev/null +++ b/Assistant/DeleteRemote.hs @@ -0,0 +1,89 @@ +{- git-annex assistant remote deletion utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.DeleteRemote where + +import Assistant.Common +import Assistant.Types.UrlRenderer +import Assistant.TransferQueue +import Logs.Transfer +import Logs.Location +import Assistant.DaemonStatus +import qualified Remote +import Remote.List +import qualified Git.Remote +import Logs.Trust +import qualified Annex + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Removes a remote (but leave the repository as-is), and returns the old + - Remote data. -} +disableRemote :: UUID -> Assistant Remote +disableRemote uuid = do + remote <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + liftAnnex $ do + inRepo $ Git.Remote.remove (Remote.name remote) + void $ remoteListRefresh + updateSyncRemotes + return remote + +{- Removes a remote, marking it dead .-} +removeRemote :: UUID -> Assistant Remote +removeRemote uuid = do + liftAnnex $ trustSet uuid DeadTrusted + disableRemote uuid + +{- Called when a Remote is probably empty, to remove it. + - + - This does one last check for any objects remaining in the Remote, + - and if there are any, queues Downloads of them, and defers removing + - the remote for later. This is to catch any objects not referred to + - in keys in the current branch. + -} +removableRemote :: UrlRenderer -> UUID -> Assistant () +removableRemote urlrenderer uuid = do + keys <- getkeys + if null keys + then finishRemovingRemote urlrenderer uuid + else do + r <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + mapM_ (queueremaining r) keys + where + queueremaining r k = + queueTransferWhenSmall "remaining object in unwanted remote" + Nothing (Transfer Download uuid k) r + {- Scanning for keys can take a long time; do not tie up + - the Annex monad while doing it, so other threads continue to + - run. -} + getkeys = do + a <- liftAnnex $ Annex.withCurrentState $ loggedKeysFor uuid + liftIO a + +{- With the webapp, this asks the user to click on a button to finish + - removing the remote. + - + - Without the webapp, just do the removal now. + -} +finishRemovingRemote :: UrlRenderer -> UUID -> Assistant () +#ifdef WITH_WEBAPP +finishRemovingRemote urlrenderer uuid = do + desc <- liftAnnex $ Remote.prettyUUID uuid + button <- mkAlertButton True (T.pack "Finish deletion process") urlrenderer $ + FinishDeleteRepositoryR uuid + void $ addAlert $ remoteRemovalAlert desc button +#else +finishRemovingRemote _ uuid = void $ removeRemote uuid +#endif diff --git a/Assistant/Drop.hs b/Assistant/Drop.hs new file mode 100644 index 000000000..efd74fdb3 --- /dev/null +++ b/Assistant/Drop.hs @@ -0,0 +1,25 @@ +{- git-annex assistant dropping of unwanted content + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Drop ( + handleDrops, + handleDropsFrom, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Annex.Drop (handleDropsFrom, Reason) +import Logs.Location +import CmdLine.Action + +{- Drop from local and/or remote when allowed by the preferred content and + - numcopies settings. -} +handleDrops :: Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> Assistant () +handleDrops reason fromhere key f knownpresentremote = do + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + liftAnnex $ handleDropsFrom locs syncrs reason fromhere key f knownpresentremote callCommandAction diff --git a/Assistant/Install.hs b/Assistant/Install.hs new file mode 100644 index 000000000..84dc779d4 --- /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 000000000..b03d20224 --- /dev/null +++ b/Assistant/Install/AutoStart.hs @@ -0,0 +1,39 @@ +{- Assistant autostart file installation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.AutoStart where + +import Utility.FreeDesktop +#ifdef darwin_HOST_OS +import Utility.OSX +import Utility.Path +import System.Directory +#endif + +installAutoStart :: FilePath -> FilePath -> IO () +installAutoStart command file = do +#ifdef darwin_HOST_OS + createDirectoryIfMissing True (parentDir file) + writeFile file $ genOSXAutoStartFile osxAutoStartLabel command + ["assistant", "--autostart"] +#else + writeDesktopMenuFile (fdoAutostart command) file +#endif + +osxAutoStartLabel :: String +osxAutoStartLabel = "com.branchable.git-annex.assistant" + +fdoAutostart :: FilePath -> DesktopEntry +fdoAutostart command = genDesktopEntry + "Git Annex Assistant" + "Autostart" + False + (command ++ " assistant --autostart") + Nothing + [] diff --git a/Assistant/Install/Menu.hs b/Assistant/Install/Menu.hs new file mode 100644 index 000000000..d095cdd88 --- /dev/null +++ b/Assistant/Install/Menu.hs @@ -0,0 +1,47 @@ +{- Assistant menu installation. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.Menu where + +import Common + +import Utility.FreeDesktop + +installMenu :: FilePath -> FilePath -> FilePath -> FilePath -> IO () +#ifdef darwin_HOST_OS +installMenu _command _menufile _iconsrcdir _icondir = return () +#else +installMenu command menufile iconsrcdir icondir = do + writeDesktopMenuFile (fdoDesktopMenu command) menufile + installIcon (iconsrcdir "logo.svg") $ + iconFilePath (iconBaseName ++ ".svg") "scalable" icondir + installIcon (iconsrcdir "logo_16x16.png") $ + iconFilePath (iconBaseName ++ ".png") "16x16" icondir +#endif + +{- The command can be either just "git-annex", or the full path to use + - to run it. -} +fdoDesktopMenu :: FilePath -> DesktopEntry +fdoDesktopMenu command = genDesktopEntry + "Git Annex" + "Track and sync the files in your Git Annex" + False + (command ++ " webapp") + (Just iconBaseName) + ["Network", "FileTransfer"] + +installIcon :: FilePath -> FilePath -> IO () +installIcon src dest = do + createDirectoryIfMissing True (parentDir dest) + withBinaryFile src ReadMode $ \hin -> + withBinaryFile dest WriteMode $ \hout -> + hGetContents hin >>= hPutStr hout + +iconBaseName :: String +iconBaseName = "git-annex" diff --git a/Assistant/MakeRemote.hs b/Assistant/MakeRemote.hs new file mode 100644 index 000000000..967a4d41d --- /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 000000000..5b3f5abb4 --- /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 000000000..e1b3983f7 --- /dev/null +++ b/Assistant/NamedThread.hs @@ -0,0 +1,102 @@ +{- git-annex assistant named threads. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.NamedThread where + +import Common.Annex +import Assistant.Types.NamedThread +import Assistant.Types.ThreadName +import Assistant.Types.DaemonStatus +import Assistant.Types.UrlRenderer +import Assistant.DaemonStatus +import Assistant.Monad +import Utility.NotificationBroadcaster + +import Control.Concurrent +import Control.Concurrent.Async +import qualified Data.Map as M +import qualified Control.Exception as E + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Types.Alert +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Starts a named thread, if it's not already running. + - + - Named threads are run by a management thread, so if they crash + - an alert is displayed, allowing the thread to be restarted. -} +startNamedThread :: UrlRenderer -> NamedThread -> Assistant () +startNamedThread urlrenderer (NamedThread afterstartupsanitycheck name a) = do + m <- startedThreads <$> getDaemonStatus + case M.lookup name m of + Nothing -> start + Just (aid, _) -> do + r <- liftIO (E.try (poll aid) :: IO (Either E.SomeException (Maybe (Either E.SomeException ())))) + case r of + Right Nothing -> noop + _ -> start + where + start + | afterstartupsanitycheck = do + status <- getDaemonStatus + h <- liftIO $ newNotificationHandle False $ + startupSanityCheckNotifier status + startwith $ runmanaged $ + liftIO $ waitNotification h + | otherwise = startwith $ runmanaged noop + startwith runner = do + d <- getAssistant id + aid <- liftIO $ runner $ d { threadName = name } + restart <- asIO $ startNamedThread urlrenderer (NamedThread False name a) + modifyDaemonStatus_ $ \s -> s + { startedThreads = M.insertWith' const name (aid, restart) (startedThreads s) } + runmanaged first d = do + aid <- async $ runAssistant d $ do + void first + a + void $ forkIO $ manager d aid + return aid + manager d aid = do + r <- E.try (wait aid) :: IO (Either E.SomeException ()) + case r of + Right _ -> noop + Left e -> do + let msg = unwords + [ fromThreadName $ threadName d + , "crashed:", show e + ] + hPutStrLn stderr msg +#ifdef WITH_WEBAPP + button <- runAssistant d $ mkAlertButton True + (T.pack "Restart Thread") + urlrenderer + (RestartThreadR name) + runAssistant d $ void $ addAlert $ + (warningAlert (fromThreadName name) msg) + { alertButtons = [button] } +#endif + +namedThreadId :: NamedThread -> Assistant (Maybe ThreadId) +namedThreadId (NamedThread _ name _) = do + m <- startedThreads <$> getDaemonStatus + return $ asyncThreadId . fst <$> M.lookup name m + +{- Waits for all named threads that have been started to finish. + - + - Note that if a named thread crashes, it will probably + - cause this to crash as well. Also, named threads that are started + - after this is called will not be waited on. -} +waitNamedThreads :: Assistant () +waitNamedThreads = do + m <- startedThreads <$> getDaemonStatus + liftIO $ mapM_ (wait . fst) $ M.elems m + diff --git a/Assistant/NetMessager.hs b/Assistant/NetMessager.hs new file mode 100644 index 000000000..acb18b648 --- /dev/null +++ b/Assistant/NetMessager.hs @@ -0,0 +1,180 @@ +{- git-annex assistant out of band network messager interface + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.NetMessager where + +import Assistant.Common +import Assistant.Types.NetMessager + +import Control.Concurrent.STM +import Control.Concurrent.MSampleVar +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.DList as D + +sendNetMessage :: NetMessage -> Assistant () +sendNetMessage m = + (atomically . flip writeTChan m) <<~ (netMessages . netMessager) + +waitNetMessage :: Assistant (NetMessage) +waitNetMessage = (atomically . readTChan) <<~ (netMessages . netMessager) + +notifyNetMessagerRestart :: Assistant () +notifyNetMessagerRestart = + flip writeSV () <<~ (netMessagerRestart . netMessager) + +{- This can be used to get an early indication if the network has + - changed, to immediately restart a connection. However, that is not + - available on all systems, so clients also need to deal with + - restarting dropped connections in the usual way. -} +waitNetMessagerRestart :: Assistant () +waitNetMessagerRestart = readSV <<~ (netMessagerRestart . netMessager) + +{- Store a new important NetMessage for a client, and if an equivilant + - older message is already stored, remove it from both importantNetMessages + - and sentImportantNetMessages. -} +storeImportantNetMessage :: NetMessage -> ClientID -> (ClientID -> Bool) -> Assistant () +storeImportantNetMessage m client matchingclient = go <<~ netMessager + where + go nm = atomically $ do + q <- takeTMVar $ importantNetMessages nm + sent <- takeTMVar $ sentImportantNetMessages nm + putTMVar (importantNetMessages nm) $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client $ + M.mapWithKey removematching q + putTMVar (sentImportantNetMessages nm) $ + M.mapWithKey removematching sent + removematching someclient s + | matchingclient someclient = S.filter (not . equivilantImportantNetMessages m) s + | otherwise = s + +{- Indicates that an important NetMessage has been sent to a client. -} +sentImportantNetMessage :: NetMessage -> ClientID -> Assistant () +sentImportantNetMessage m client = go <<~ (sentImportantNetMessages . netMessager) + where + go v = atomically $ do + sent <- takeTMVar v + putTMVar v $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client sent + +{- Checks for important NetMessages that have been stored for a client, and + - sent to a client. Typically the same client for both, although + - a modified or more specific client may need to be used. -} +checkImportantNetMessages :: (ClientID, ClientID) -> Assistant (S.Set NetMessage, S.Set NetMessage) +checkImportantNetMessages (storedclient, sentclient) = go <<~ netMessager + where + go nm = atomically $ do + stored <- M.lookup storedclient <$> (readTMVar $ importantNetMessages nm) + sent <- M.lookup sentclient <$> (readTMVar $ sentImportantNetMessages nm) + return (fromMaybe S.empty stored, fromMaybe S.empty sent) + +{- Queues a push initiation message in the queue for the appropriate + - side of the push but only if there is not already an initiation message + - from the same client in the queue. -} +queuePushInitiation :: NetMessage -> Assistant () +queuePushInitiation msg@(Pushing clientid stage) = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + r <- tryTakeTMVar tv + case r of + Nothing -> putTMVar tv [msg] + Just l -> do + let !l' = msg : filter differentclient l + putTMVar tv l' + where + side = pushDestinationSide stage + differentclient (Pushing cid _) = cid /= clientid + differentclient _ = True +queuePushInitiation _ = noop + +{- Waits for a push inititation message to be received, and runs + - function to select a message from the queue. -} +waitPushInitiation :: PushSide -> ([NetMessage] -> (NetMessage, [NetMessage])) -> Assistant NetMessage +waitPushInitiation side selector = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + q <- takeTMVar tv + if null q + then retry + else do + let (msg, !q') = selector q + unless (null q') $ + putTMVar tv q' + return msg + +{- Stores messages for a push into the appropriate inbox. + - + - To avoid overflow, only 1000 messages max are stored in any + - inbox, which should be far more than necessary. + - + - TODO: If we have more than 100 inboxes for different clients, + - discard old ones that are not currently being used by any push. + -} +storeInbox :: NetMessage -> Assistant () +storeInbox msg@(Pushing clientid stage) = do + inboxes <- getInboxes side + stored <- liftIO $ atomically $ do + m <- readTVar inboxes + let update = \v -> do + writeTVar inboxes $ + M.insertWith' const clientid v m + return True + case M.lookup clientid m of + Nothing -> update (1, tostore) + Just (sz, l) + | sz > 1000 -> return False + | otherwise -> + let !sz' = sz + 1 + !l' = D.append l tostore + in update (sz', l') + if stored + then netMessagerDebug clientid ["stored", logNetMessage msg, "in", show side, "inbox"] + else netMessagerDebug clientid ["discarded", logNetMessage msg, "; ", show side, "inbox is full"] + where + side = pushDestinationSide stage + tostore = D.singleton msg +storeInbox _ = noop + +{- Gets the new message for a push from its inbox. + - Blocks until a message has been received. -} +waitInbox :: ClientID -> PushSide -> Assistant (NetMessage) +waitInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ do + m <- readTVar inboxes + case M.lookup clientid m of + Nothing -> retry + Just (sz, dl) + | sz < 1 -> retry + | otherwise -> do + let msg = D.head dl + let dl' = D.tail dl + let !sz' = sz - 1 + writeTVar inboxes $ + M.insertWith' const clientid (sz', dl') m + return msg + +emptyInbox :: ClientID -> PushSide -> Assistant () +emptyInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ + modifyTVar' inboxes $ + M.delete clientid + +getInboxes :: PushSide -> Assistant Inboxes +getInboxes side = + getSide side . netMessagerInboxes <$> getAssistant netMessager + +getPushInitiationQueue :: PushSide -> Assistant (TMVar [NetMessage]) +getPushInitiationQueue side = + getSide side . netMessagerPushInitiations <$> getAssistant netMessager + +netMessagerDebug :: ClientID -> [String] -> Assistant () +netMessagerDebug clientid l = debug $ + "NetMessager" : l ++ [show $ logClientID clientid] diff --git a/Assistant/Pairing.hs b/Assistant/Pairing.hs new file mode 100644 index 000000000..bb1384a15 --- /dev/null +++ b/Assistant/Pairing.hs @@ -0,0 +1,92 @@ +{- git-annex assistant repo pairing, core data types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Pairing where + +import Common.Annex +import Utility.Verifiable +import Assistant.Ssh + +import Control.Concurrent +import Network.Socket +import Data.Char +import qualified Data.Text as T + +data PairStage + {- "I'll pair with anybody who shares the secret that can be used + - to verify this request." -} + = PairReq + {- "I've verified your request, and you can verify this to see + - that I know the secret. I set up your ssh key already. + - Here's mine for you to set up." -} + | PairAck + {- "I saw your PairAck; you can stop sending them." -} + | PairDone + deriving (Eq, Read, Show, Ord, Enum) + +newtype PairMsg = PairMsg (Verifiable (PairStage, PairData, SomeAddr)) + deriving (Eq, Read, Show) + +verifiedPairMsg :: PairMsg -> PairingInProgress -> Bool +verifiedPairMsg (PairMsg m) pip = verify m $ inProgressSecret pip + +fromPairMsg :: PairMsg -> Verifiable (PairStage, PairData, SomeAddr) +fromPairMsg (PairMsg m) = m + +pairMsgStage :: PairMsg -> PairStage +pairMsgStage (PairMsg (Verifiable (s, _, _) _)) = s + +pairMsgData :: PairMsg -> PairData +pairMsgData (PairMsg (Verifiable (_, d, _) _)) = d + +pairMsgAddr :: PairMsg -> SomeAddr +pairMsgAddr (PairMsg (Verifiable (_, _, a) _)) = a + +data PairData = PairData + -- uname -n output, not a full domain name + { remoteHostName :: Maybe HostName + , remoteUserName :: UserName + , remoteDirectory :: FilePath + , remoteSshPubKey :: SshPubKey + , pairUUID :: UUID + } + deriving (Eq, Read, Show) + +type UserName = String + +{- A pairing that is in progress has a secret, a thread that is + - broadcasting pairing messages, and a SshKeyPair that has not yet been + - set up on disk. -} +data PairingInProgress = PairingInProgress + { inProgressSecret :: Secret + , inProgressThreadId :: Maybe ThreadId + , inProgressSshKeyPair :: SshKeyPair + , inProgressPairData :: PairData + , inProgressPairStage :: PairStage + } + deriving (Show) + +data SomeAddr = IPv4Addr HostAddress +{- My Android build of the Network library does not currently have IPV6 + - support. -} +#ifndef __ANDROID__ + | IPv6Addr HostAddress6 +#endif + deriving (Ord, Eq, Read, Show) + +{- This contains the whole secret, just lightly obfuscated to make it not + - too obvious. It's only displayed in the user's web browser. -} +newtype SecretReminder = SecretReminder [Int] + deriving (Show, Eq, Ord, Read) + +toSecretReminder :: T.Text -> SecretReminder +toSecretReminder = SecretReminder . map ord . T.unpack + +fromSecretReminder :: SecretReminder -> T.Text +fromSecretReminder (SecretReminder s) = T.pack $ map chr s diff --git a/Assistant/Pairing/MakeRemote.hs b/Assistant/Pairing/MakeRemote.hs new file mode 100644 index 000000000..3f3823664 --- /dev/null +++ b/Assistant/Pairing/MakeRemote.hs @@ -0,0 +1,96 @@ +{- git-annex assistant pairing remote creation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.MakeRemote where + +import Assistant.Common +import Assistant.Ssh +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.MakeRemote +import Assistant.Sync +import Config.Cost +import Config +import qualified Types.Remote as Remote + +import Network.Socket +import qualified Data.Text as T + +{- Authorized keys are set up before pairing is complete, so that the other + - side can immediately begin syncing. -} +setupAuthorizedKeys :: PairMsg -> FilePath -> IO () +setupAuthorizedKeys msg repodir = do + validateSshPubKey pubkey + unlessM (liftIO $ addAuthorizedKeys True repodir pubkey) $ + error "failed setting up ssh authorized keys" + where + pubkey = remoteSshPubKey $ pairMsgData msg + +{- When local pairing is complete, this is used to set up the remote for + - the host we paired with. -} +finishedLocalPairing :: PairMsg -> SshKeyPair -> Assistant () +finishedLocalPairing msg keypair = do + sshdata <- liftIO $ setupSshKeyPair keypair =<< pairMsgToSshData msg + {- Ensure that we know the ssh host key for the host we paired with. + - If we don't, ssh over to get it. -} + liftIO $ unlessM (knownHost $ sshHostName sshdata) $ + void $ sshTranscript + [ sshOpt "StrictHostKeyChecking" "no" + , sshOpt "NumberOfPasswordPrompts" "0" + , "-n" + , genSshHost (sshHostName sshdata) (sshUserName sshdata) + , "git-annex-shell -c configlist " ++ T.unpack (sshDirectory sshdata) + ] + Nothing + r <- liftAnnex $ addRemote $ makeSshRemote sshdata + liftAnnex $ setRemoteCost (Remote.repo r) semiExpensiveRemoteCost + syncRemote r + +{- Mostly a straightforward conversion. Except: + - * Determine the best hostname to use to contact the host. + - * Strip leading ~/ from the directory name. + -} +pairMsgToSshData :: PairMsg -> IO SshData +pairMsgToSshData msg = do + let d = pairMsgData msg + hostname <- liftIO $ bestHostName msg + let dir = case remoteDirectory d of + ('~':'/':v) -> v + v -> v + return SshData + { sshHostName = T.pack hostname + , sshUserName = Just (T.pack $ remoteUserName d) + , sshDirectory = T.pack dir + , sshRepoName = genSshRepoName hostname dir + , sshPort = 22 + , needsPubKey = True + , sshCapabilities = [GitAnnexShellCapable, GitCapable, RsyncCapable] + } + +{- Finds the best hostname to use for the host that sent the PairMsg. + - + - If remoteHostName is set, tries to use a .local address based on it. + - That's the most robust, if this system supports .local. + - Otherwise, looks up the hostname in the DNS for the remoteAddress, + - if any. May fall back to remoteAddress if there's no DNS. Ugh. -} +bestHostName :: PairMsg -> IO HostName +bestHostName msg = case remoteHostName $ pairMsgData msg of + Just h -> do + let localname = h ++ ".local" + addrs <- catchDefaultIO [] $ + getAddrInfo Nothing (Just localname) Nothing + maybe fallback (const $ return localname) (headMaybe addrs) + Nothing -> fallback + where + fallback = do + let a = pairMsgAddr msg + let sockaddr = case a of + IPv4Addr addr -> SockAddrInet (PortNum 0) addr + IPv6Addr addr -> SockAddrInet6 (PortNum 0) 0 addr 0 + fromMaybe (showAddr a) + <$> catchDefaultIO Nothing + (fst <$> getNameInfo [] True False sockaddr) diff --git a/Assistant/Pairing/Network.hs b/Assistant/Pairing/Network.hs new file mode 100644 index 000000000..6c625f881 --- /dev/null +++ b/Assistant/Pairing/Network.hs @@ -0,0 +1,130 @@ +{- git-annex assistant pairing network code + - + - All network traffic is sent over multicast UDP. For reliability, + - each message is repeated until acknowledged. This is done using a + - thread, that gets stopped before the next message is sent. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.Network where + +import Assistant.Common +import Assistant.Pairing +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Verifiable + +import Network.Multicast +import Network.Info +import Network.Socket +import Control.Exception (bracket) +import qualified Data.Map as M +import Control.Concurrent + +{- This is an arbitrary port in the dynamic port range, that could + - conceivably be used for some other broadcast messages. + - If so, hope they ignore the garbage from us; we'll certianly + - ignore garbage from them. Wild wild west. -} +pairingPort :: PortNumber +pairingPort = 55556 + +{- Goal: Reach all hosts on the same network segment. + - Method: Use same address that avahi uses. Other broadcast addresses seem + - to not be let through some routers. -} +multicastAddress :: SomeAddr -> HostName +multicastAddress (IPv4Addr _) = "224.0.0.251" +multicastAddress (IPv6Addr _) = "ff02::fb" + +{- Multicasts a message repeatedly on all interfaces, with a 2 second + - delay between each transmission. The message is repeated forever + - unless a number of repeats is specified. + - + - The remoteHostAddress is set to the interface's IP address. + - + - Note that new sockets are opened each time. This is hardly efficient, + - but it allows new network interfaces to be used as they come up. + - On the other hand, the expensive DNS lookups are cached. + -} +multicastPairMsg :: Maybe Int -> Secret -> PairData -> PairStage -> IO () +multicastPairMsg repeats secret pairdata stage = go M.empty repeats + where + go _ (Just 0) = noop + go cache n = do + addrs <- activeNetworkAddresses + let cache' = updatecache cache addrs + mapM_ (sendinterface cache') addrs + threadDelaySeconds (Seconds 2) + go cache' $ pred <$> n + {- The multicast library currently chokes on ipv6 addresses. -} + sendinterface _ (IPv6Addr _) = noop + sendinterface cache i = void $ tryIO $ + withSocketsDo $ bracket setup cleanup use + where + setup = multicastSender (multicastAddress i) pairingPort + cleanup (sock, _) = sClose sock -- FIXME does not work + use (sock, addr) = do + setInterface sock (showAddr i) + maybe noop (\s -> void $ sendTo sock s addr) + (M.lookup i cache) + updatecache cache [] = cache + updatecache cache (i:is) + | M.member i cache = updatecache cache is + | otherwise = updatecache (M.insert i (show $ mkmsg i) cache) is + mkmsg addr = PairMsg $ + mkVerifiable (stage, pairdata, addr) secret + +startSending :: PairingInProgress -> PairStage -> (PairStage -> IO ()) -> Assistant () +startSending pip stage sender = do + a <- asIO start + void $ liftIO $ forkIO a + where + start = do + tid <- liftIO myThreadId + let pip' = pip { inProgressPairStage = stage, inProgressThreadId = Just tid } + oldpip <- modifyDaemonStatus $ + \s -> (s { pairingInProgress = Just pip' }, pairingInProgress s) + maybe noop stopold oldpip + liftIO $ sender stage + stopold = maybe noop (liftIO . killThread) . inProgressThreadId + +stopSending :: PairingInProgress -> Assistant () +stopSending pip = do + maybe noop (liftIO . killThread) $ inProgressThreadId pip + modifyDaemonStatus_ $ \s -> s { pairingInProgress = Nothing } + +class ToSomeAddr a where + toSomeAddr :: a -> SomeAddr + +instance ToSomeAddr IPv4 where + toSomeAddr (IPv4 a) = IPv4Addr a + +instance ToSomeAddr IPv6 where + toSomeAddr (IPv6 o1 o2 o3 o4) = IPv6Addr (o1, o2, o3, o4) + +showAddr :: SomeAddr -> HostName +showAddr (IPv4Addr a) = show $ IPv4 a +showAddr (IPv6Addr (o1, o2, o3, o4)) = show $ IPv6 o1 o2 o3 o4 + +activeNetworkAddresses :: IO [SomeAddr] +activeNetworkAddresses = filter (not . all (`elem` "0.:") . showAddr) + . concatMap (\ni -> [toSomeAddr $ ipv4 ni, toSomeAddr $ ipv6 ni]) + <$> getNetworkInterfaces + +{- A human-visible description of the repository being paired with. + - Note that the repository's description is not shown to the user, because + - it could be something like "my repo", which is confusing when pairing + - with someone else's repo. However, this has the same format as the + - default decription of a repo. -} +pairRepo :: PairMsg -> String +pairRepo msg = concat + [ remoteUserName d + , "@" + , fromMaybe (showAddr $ pairMsgAddr msg) (remoteHostName d) + , ":" + , remoteDirectory d + ] + where + d = pairMsgData msg diff --git a/Assistant/Pushes.hs b/Assistant/Pushes.hs new file mode 100644 index 000000000..54f31a84b --- /dev/null +++ b/Assistant/Pushes.hs @@ -0,0 +1,40 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pushes where + +import Assistant.Common +import Assistant.Types.Pushes + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Blocks until there are failed pushes. + - Returns Remotes whose pushes failed a given time duration or more ago. + - (This may be an empty list.) -} +getFailedPushesBefore :: NominalDiffTime -> Assistant [Remote] +getFailedPushesBefore duration = do + v <- getAssistant failedPushMap + liftIO $ do + m <- atomically $ readTMVar v + now <- getCurrentTime + return $ M.keys $ M.filter (not . toorecent now) m + where + toorecent now time = now `diffUTCTime` time < duration + +{- Modifies the map. -} +changeFailedPushMap :: (PushMap -> PushMap) -> Assistant () +changeFailedPushMap a = do + v <- getAssistant failedPushMap + liftIO $ atomically $ store v . a . fromMaybe M.empty =<< tryTakeTMVar v + where + {- tryTakeTMVar empties the TMVar; refill it only if + - the modified map is not itself empty -} + store v m + | m == M.empty = noop + | otherwise = putTMVar v $! m diff --git a/Assistant/RemoteControl.hs b/Assistant/RemoteControl.hs new file mode 100644 index 000000000..86d13cc56 --- /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/RepoProblem.hs b/Assistant/RepoProblem.hs new file mode 100644 index 000000000..6913fefc6 --- /dev/null +++ b/Assistant/RepoProblem.hs @@ -0,0 +1,34 @@ +{- git-annex assistant remote problem handling + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.RepoProblem where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all repositories that have problems. Blocks until there is at + - least one. -} +getRepoProblems :: Assistant [RepoProblem] +getRepoProblems = nubBy sameRepoProblem + <$> (atomically . getTList) <<~ repoProblemChan + +{- Indicates that there was a problem with a repository, and the problem + - appears to not be a transient (eg network connection) problem. + - + - If the problem is able to be repaired, the passed action will be run. + - (However, if multiple problems are reported with a single repository, + - only a single action will be run.) + -} +repoHasProblem :: UUID -> Assistant () -> Assistant () +repoHasProblem u afterrepair = do + rp <- RepoProblem + <$> pure u + <*> asIO afterrepair + (atomically . flip consTList rp) <<~ repoProblemChan diff --git a/Assistant/ScanRemotes.hs b/Assistant/ScanRemotes.hs new file mode 100644 index 000000000..2743c0f36 --- /dev/null +++ b/Assistant/ScanRemotes.hs @@ -0,0 +1,41 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.ScanRemotes where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import qualified Types.Remote as Remote + +import Data.Function +import Control.Concurrent.STM +import qualified Data.Map as M + +{- Blocks until there is a remote or remotes that need to be scanned. + - + - The list has higher priority remotes listed first. -} +getScanRemote :: Assistant [(Remote, ScanInfo)] +getScanRemote = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ + reverse . sortBy (compare `on` scanPriority . snd) . M.toList + <$> takeTMVar v + +{- Adds new remotes that need scanning. -} +addScanRemotes :: Bool -> [Remote] -> Assistant () +addScanRemotes _ [] = noop +addScanRemotes full rs = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ do + m <- fromMaybe M.empty <$> tryTakeTMVar v + putTMVar v $ M.unionWith merge (M.fromList $ zip rs (map info rs)) m + where + info r = ScanInfo (-1 * Remote.cost r) full + merge x y = ScanInfo + { scanPriority = max (scanPriority x) (scanPriority y) + , fullScan = fullScan x || fullScan y + } diff --git a/Assistant/Ssh.hs b/Assistant/Ssh.hs new file mode 100644 index 000000000..e1a78cd00 --- /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 000000000..4bc63241c --- /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 000000000..afe4aa144 --- /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 000000000..d02e53db5 --- /dev/null +++ b/Assistant/Threads/ConfigMonitor.hs @@ -0,0 +1,91 @@ +{- git-annex assistant config monitor thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ConfigMonitor where + +import Assistant.Common +import Assistant.BranchChange +import Assistant.DaemonStatus +import Assistant.Commits +import Utility.ThreadScheduler +import Logs +import Logs.UUID +import Logs.Trust +import Logs.PreferredContent +import Logs.Group +import Logs.NumCopies +import Remote.List (remoteListRefresh) +import qualified Git.LsTree as LsTree +import Git.FilePath +import qualified Annex.Branch + +import qualified Data.Set as S + +{- This thread detects when configuration changes have been made to the + - git-annex branch and reloads cached configuration. + - + - If the branch is frequently changing, it's checked for configuration + - changes no more often than once every 60 seconds. On the other hand, + - if the branch has not changed in a while, configuration changes will + - be detected immediately. + -} +configMonitorThread :: NamedThread +configMonitorThread = namedThread "ConfigMonitor" $ loop =<< getConfigs + where + loop old = do + waitBranchChange + new <- getConfigs + when (old /= new) $ do + let changedconfigs = new `S.difference` old + debug $ "reloading config" : + map fst (S.toList changedconfigs) + reloadConfigs new + {- Record a commit to get this config + - change pushed out to remotes. -} + recordCommit + liftIO $ threadDelaySeconds (Seconds 60) + loop new + +{- Config files, and their checksums. -} +type Configs = S.Set (FilePath, String) + +{- All git-annex's config files, and actions to run when they change. -} +configFilesActions :: [(FilePath, Assistant ())] +configFilesActions = + [ (uuidLog, void $ liftAnnex uuidMapLoad) + , (remoteLog, void $ liftAnnex remoteListRefresh) + , (trustLog, void $ liftAnnex trustMapLoad) + , (groupLog, void $ liftAnnex groupMapLoad) + , (numcopiesLog, void $ liftAnnex globalNumCopiesLoad) + , (scheduleLog, void updateScheduleLog) + -- Preferred and required content settings depend on most of the + -- other configs, so will be reloaded whenever any configs change. + , (preferredContentLog, noop) + , (requiredContentLog, noop) + , (groupPreferredContentLog, noop) + ] + +reloadConfigs :: Configs -> Assistant () +reloadConfigs changedconfigs = do + sequence_ as + void $ liftAnnex preferredRequiredMapsLoad + {- Changes to the remote log, or the trust log, can affect the + - syncRemotes list. Changes to the uuid log may affect its + - display so are also included. -} + when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) + updateSyncRemotes + where + (fs, as) = unzip $ filter (flip S.member changedfiles . fst) + configFilesActions + changedfiles = S.map fst changedconfigs + +getConfigs :: Assistant Configs +getConfigs = S.fromList . map extract + <$> liftAnnex (inRepo $ LsTree.lsTreeFiles Annex.Branch.fullname files) + where + files = map fst configFilesActions + extract treeitem = (getTopFilePath $ LsTree.file treeitem, LsTree.sha treeitem) diff --git a/Assistant/Threads/Cronner.hs b/Assistant/Threads/Cronner.hs new file mode 100644 index 000000000..55b3ca2f1 --- /dev/null +++ b/Assistant/Threads/Cronner.hs @@ -0,0 +1,225 @@ +{- git-annex assistant sceduled jobs runner + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Threads.Cronner ( + cronnerThread +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.NotificationBroadcaster +import Annex.UUID +import Config.Files +import Logs.Schedule +import Utility.Scheduled +import Types.ScheduledActivity +import Utility.ThreadScheduler +import Utility.HumanTime +import Utility.Batch +import Assistant.TransferQueue +import Annex.Content +import Logs.Transfer +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git +import qualified Git.Fsck +import Assistant.Fsck +import Assistant.Repair + +import Control.Concurrent.Async +import Control.Concurrent.MVar +import Data.Time.LocalTime +import Data.Time.Clock +import qualified Data.Map as M +import qualified Data.Set as S + +{- Loads schedules for this repository, and fires off one thread for each + - scheduled event that runs on this repository. Each thread sleeps until + - its event is scheduled to run. + - + - To handle events that run on remotes, which need to only run when + - their remote gets connected, threads are also started, and are passed + - a MVar to wait on, which is stored in the DaemonStatus's + - connectRemoteNotifiers. + - + - In the meantime the main thread waits for any changes to the + - schedules. When there's a change, compare the old and new list of + - schedules to find deleted and added ones. Start new threads for added + - ones, and kill the threads for deleted ones. -} +cronnerThread :: UrlRenderer -> NamedThread +cronnerThread urlrenderer = namedThreadUnchecked "Cronner" $ do + fsckNudge urlrenderer Nothing + dstatus <- getDaemonStatus + h <- liftIO $ newNotificationHandle False (scheduleLogNotifier dstatus) + go h M.empty M.empty + where + go h amap nmap = do + activities <- liftAnnex $ scheduleGet =<< getUUID + + let addedactivities = activities `S.difference` M.keysSet amap + let removedactivities = M.keysSet amap `S.difference` activities + + forM_ (S.toList removedactivities) $ \activity -> + case M.lookup activity amap of + Just a -> do + debug ["stopping removed job for", fromScheduledActivity activity, show (asyncThreadId a)] + liftIO $ cancel a + Nothing -> noop + + lastruntimes <- liftAnnex getLastRunTimes + started <- startactivities (S.toList addedactivities) lastruntimes + let addedamap = M.fromList $ map fst started + let addednmap = M.fromList $ catMaybes $ map snd started + + let removefiltered = M.filterWithKey (\k _ -> S.member k removedactivities) + let amap' = M.difference (M.union addedamap amap) (removefiltered amap) + let nmap' = M.difference (M.union addednmap nmap) (removefiltered nmap) + modifyDaemonStatus_ $ \s -> s { connectRemoteNotifiers = M.fromListWith (++) (M.elems nmap') } + + liftIO $ waitNotification h + debug ["reloading changed activities"] + go h amap' nmap' + startactivities as lastruntimes = forM as $ \activity -> + case connectActivityUUID activity of + Nothing -> do + runner <- asIO2 (sleepingActivityThread urlrenderer) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Nothing) + Just u -> do + mvar <- liftIO newEmptyMVar + runner <- asIO2 (remoteActivityThread urlrenderer mvar) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Just (activity, (u, [mvar]))) + +{- Calculate the next time the activity is scheduled to run, then + - sleep until that time, and run it. Then call setLastRunTime, and + - loop. + -} +sleepingActivityThread :: UrlRenderer -> ScheduledActivity -> Maybe LocalTime -> Assistant () +sleepingActivityThread urlrenderer activity lasttime = go lasttime =<< getnexttime lasttime + where + getnexttime = liftIO . nextTime schedule + go _ Nothing = debug ["no scheduled events left for", desc] + go l (Just (NextTimeExactly t)) = waitrun l t Nothing + go l (Just (NextTimeWindow windowstart windowend)) = + waitrun l windowstart (Just windowend) + desc = fromScheduledActivity activity + schedule = getSchedule activity + waitrun l t mmaxt = do + seconds <- liftIO $ secondsUntilLocalTime t + when (seconds > Seconds 0) $ do + debug ["waiting", show seconds, "for next scheduled", desc] + liftIO $ threadDelaySeconds seconds + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + let nowt = utcToLocalTime tz now + if tolate nowt tz + then do + debug ["too late to run scheduled", desc] + go l =<< getnexttime l + else run nowt + where + tolate nowt tz = case mmaxt of + Just maxt -> nowt > maxt + -- allow the job to start 10 minutes late + Nothing ->diffUTCTime + (localTimeToUTC tz nowt) + (localTimeToUTC tz t) > 600 + run nowt = do + runActivity urlrenderer activity nowt + go (Just nowt) =<< getnexttime (Just nowt) + +{- Wait for the remote to become available by waiting on the MVar. + - Then check if the time is within a time window when activity + - is scheduled to run, and if so run it. + - Otherwise, just wait again on the MVar. + -} +remoteActivityThread :: UrlRenderer -> MVar () -> ScheduledActivity -> Maybe LocalTime -> Assistant () +remoteActivityThread urlrenderer mvar activity lasttime = do + liftIO $ takeMVar mvar + go =<< liftIO (nextTime (getSchedule activity) lasttime) + where + go (Just (NextTimeWindow windowstart windowend)) = do + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + if now >= localTimeToUTC tz windowstart && now <= localTimeToUTC tz windowend + then do + let nowt = utcToLocalTime tz now + runActivity urlrenderer activity nowt + loop (Just nowt) + else loop lasttime + go _ = noop -- running at exact time not handled here + loop = remoteActivityThread urlrenderer mvar activity + +secondsUntilLocalTime :: LocalTime -> IO Seconds +secondsUntilLocalTime t = do + now <- getCurrentTime + tz <- getTimeZone now + let secs = truncate $ diffUTCTime (localTimeToUTC tz t) now + return $ if secs > 0 + then Seconds secs + else Seconds 0 + +runActivity :: UrlRenderer -> ScheduledActivity -> LocalTime -> Assistant () +runActivity urlrenderer activity nowt = do + debug ["starting", desc] + runActivity' urlrenderer activity + debug ["finished", desc] + liftAnnex $ setLastRunTime activity nowt + where + desc = fromScheduledActivity activity + +runActivity' :: UrlRenderer -> ScheduledActivity -> Assistant () +runActivity' urlrenderer (ScheduledSelfFsck _ d) = do + program <- liftIO $ readProgramFile + g <- liftAnnex gitRepo + fsckresults <- showFscking urlrenderer Nothing $ tryNonAsync $ do + void $ batchCommand program (Param "fsck" : annexFsckParams d) + Git.Fsck.findBroken True g + u <- liftAnnex getUUID + void $ repairWhenNecessary urlrenderer u Nothing fsckresults + mapM_ reget =<< liftAnnex (dirKeys gitAnnexBadDir) + where + reget k = queueTransfers "fsck found bad file; redownloading" Next k Nothing Download +runActivity' urlrenderer (ScheduledRemoteFsck u s d) = handle =<< liftAnnex (remoteFromUUID u) + where + handle Nothing = debug ["skipping remote fsck of uuid without a configured remote", fromUUID u, fromSchedule s] + handle (Just rmt) = void $ case Remote.remoteFsck rmt of + Nothing -> go rmt $ do + program <- readProgramFile + void $ batchCommand program $ + [ Param "fsck" + -- avoid downloading files + , Param "--fast" + , Param "--from" + , Param $ Remote.name rmt + ] ++ annexFsckParams d + Just mkfscker -> do + {- Note that having mkfsker return an IO action + - avoids running a long duration fsck in the + - Annex monad. -} + go rmt =<< liftAnnex (mkfscker (annexFsckParams d)) + go rmt annexfscker = do + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ do + void annexfscker + let r = Remote.repo rmt + if Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) + then Just <$> Git.Fsck.findBroken True r + else pure Nothing + maybe noop (void . repairWhenNecessary urlrenderer u (Just rmt)) fsckresults + +annexFsckParams :: Duration -> [CommandParam] +annexFsckParams d = + [ Param "--incremental-schedule=1d" + , Param $ "--time-limit=" ++ fromDuration d + ] diff --git a/Assistant/Threads/DaemonStatus.hs b/Assistant/Threads/DaemonStatus.hs new file mode 100644 index 000000000..5bbb15acb --- /dev/null +++ b/Assistant/Threads/DaemonStatus.hs @@ -0,0 +1,29 @@ +{- git-annex assistant daemon status thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.DaemonStatus where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster + +{- This writes the daemon status to disk, when it changes, but no more + - frequently than once every ten minutes. + -} +daemonStatusThread :: NamedThread +daemonStatusThread = namedThread "DaemonStatus" $ do + notifier <- liftIO . newNotificationHandle False + =<< changeNotifier <$> getDaemonStatus + checkpoint + runEvery (Seconds tenMinutes) <~> do + liftIO $ waitNotification notifier + checkpoint + where + checkpoint = do + file <- liftAnnex $ fromRepo gitAnnexDaemonStatusFile + liftIO . writeDaemonStatusFile file =<< getDaemonStatus diff --git a/Assistant/Threads/Glacier.hs b/Assistant/Threads/Glacier.hs new file mode 100644 index 000000000..4c4012a67 --- /dev/null +++ b/Assistant/Threads/Glacier.hs @@ -0,0 +1,43 @@ +{- git-annex assistant Amazon Glacier retrieval + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.Glacier where + +import Assistant.Common +import Utility.ThreadScheduler +import qualified Types.Remote as Remote +import qualified Remote.Glacier as Glacier +import Logs.Transfer +import Assistant.DaemonStatus +import Assistant.TransferQueue + +import qualified Data.Set as S + +{- Wakes up every half hour and checks if any glacier remotes have failed + - downloads. If so, runs glacier-cli to check if the files are now + - available, and queues the downloads. -} +glacierThread :: NamedThread +glacierThread = namedThread "Glacier" $ runEvery (Seconds 3600) <~> go + where + isglacier r = Remote.remotetype r == Glacier.remote + go = do + rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus + forM_ rs $ \r -> + check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r) + check _ [] = noop + check r l = do + let keys = map getkey l + (availkeys, failedkeys) <- liftAnnex $ Glacier.jobList r keys + let s = S.fromList (failedkeys ++ availkeys) + let l' = filter (\p -> S.member (getkey p) s) l + forM_ l' $ \(t, info) -> do + liftAnnex $ removeFailedTransfer t + queueTransferWhenSmall "object available from glacier" (associatedFile info) t r + getkey = transferKey . fst diff --git a/Assistant/Threads/Merger.hs b/Assistant/Threads/Merger.hs new file mode 100644 index 000000000..62dab59af --- /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 000000000..bd7aad69c --- /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 000000000..f8c456aac --- /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 000000000..cd95ab5a4 --- /dev/null +++ b/Assistant/Threads/PairListener.hs @@ -0,0 +1,160 @@ +{- git-annex assistant thread to listen for incoming pairing traffic + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.PairListener where + +import Assistant.Common +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.Pairing.MakeRemote +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Types +import Assistant.Alert +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Format +import Git + +import Network.Multicast +import Network.Socket +import qualified Data.Text as T +import Data.Char + +pairListenerThread :: UrlRenderer -> NamedThread +pairListenerThread urlrenderer = namedThread "PairListener" $ do + listener <- asIO1 $ go [] [] + liftIO $ withSocketsDo $ + runEvery (Seconds 60) $ void $ tryIO $ + listener =<< getsock + where + {- Note this can crash if there's no network interface, + - or only one like lo that doesn't support multicast. -} + getsock = multicastReceiver (multicastAddress $ IPv4Addr undefined) pairingPort + + go reqs cache sock = liftIO (getmsg sock []) >>= \msg -> case readish msg of + Nothing -> go reqs cache sock + Just m -> do + debug ["received", show msg] + sane <- checkSane msg + (pip, verified) <- verificationCheck m + =<< (pairingInProgress <$> getDaemonStatus) + let wrongstage = maybe False (\p -> pairMsgStage m <= inProgressPairStage p) pip + let fromus = maybe False (\p -> remoteSshPubKey (pairMsgData m) == remoteSshPubKey (inProgressPairData p)) pip + case (wrongstage, fromus, sane, pairMsgStage m) of + (_, True, _, _) -> do + debug ["ignoring message that looped back"] + go reqs cache sock + (_, _, False, _) -> go reqs cache sock + -- PairReq starts a pairing process, so a + -- new one is always heeded, even if + -- some other pairing is in process. + (_, _, _, PairReq) -> if m `elem` reqs + then go reqs (invalidateCache m cache) sock + else do + pairReqReceived verified urlrenderer m + go (m:take 10 reqs) (invalidateCache m cache) sock + (True, _, _, _) -> do + debug + ["ignoring out of order message" + , show (pairMsgStage m) + , "expected" + , show (succ . inProgressPairStage <$> pip) + ] + go reqs cache sock + (_, _, _, PairAck) -> do + cache' <- pairAckReceived verified pip m cache + go reqs cache' sock + (_,_ , _, PairDone) -> do + pairDoneReceived verified pip m + go reqs cache sock + + {- As well as verifying the message using the shared secret, + - check its UUID against the UUID we have stored. If + - they're the same, someone is sending bogus messages, + - which could be an attempt to brute force the shared secret. -} + verificationCheck _ Nothing = return (Nothing, False) + verificationCheck m (Just pip) + | not verified && sameuuid = do + liftAnnex $ warning + "detected possible pairing brute force attempt; disabled pairing" + stopSending pip + return (Nothing, False) + |otherwise = return (Just pip, verified && sameuuid) + where + verified = verifiedPairMsg m pip + sameuuid = pairUUID (inProgressPairData pip) == pairUUID (pairMsgData m) + + checkSane msg + {- Control characters could be used in a + - console poisoning attack. -} + | any isControl (filter (/= '\n') (decode_c msg)) = do + liftAnnex $ warning + "illegal control characters in pairing message; ignoring" + return False + | otherwise = return True + + {- PairReqs invalidate the cache of recently finished pairings. + - This is so that, if a new pairing is started with the + - same secret used before, a bogus PairDone is not sent. -} + invalidateCache msg = filter (not . verifiedPairMsg msg) + + getmsg sock c = do + (msg, n, _) <- recvFrom sock chunksz + if n < chunksz + then return $ c ++ msg + else getmsg sock $ c ++ msg + where + chunksz = 1024 + +{- Show an alert when a PairReq is seen. -} +pairReqReceived :: Bool -> UrlRenderer -> PairMsg -> Assistant () +pairReqReceived True _ _ = noop -- ignore our own PairReq +pairReqReceived False urlrenderer msg = do + button <- mkAlertButton True (T.pack "Respond") urlrenderer (FinishLocalPairR msg) + void $ addAlert $ pairRequestReceivedAlert repo button + where + repo = pairRepo msg + +{- When a verified PairAck is seen, a host is ready to pair with us, and has + - already configured our ssh key. Stop sending PairReqs, finish the pairing, + - and send a single PairDone. -} +pairAckReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> [PairingInProgress] -> Assistant [PairingInProgress] +pairAckReceived True (Just pip) msg cache = do + stopSending pip + repodir <- repoPath <$> liftAnnex gitRepo + liftIO $ setupAuthorizedKeys msg repodir + finishedLocalPairing msg (inProgressSshKeyPair pip) + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return $ pip : take 10 cache +{- A stale PairAck might also be seen, after we've finished pairing. + - Perhaps our PairDone was not received. To handle this, we keep + - a cache of recently finished pairings, and re-send PairDone in + - response to stale PairAcks for them. -} +pairAckReceived _ _ msg cache = do + let pips = filter (verifiedPairMsg msg) cache + unless (null pips) $ + forM_ pips $ \pip -> + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return cache + +{- If we get a verified PairDone, the host has accepted our PairAck, and + - has paired with us. Stop sending PairAcks, and finish pairing with them. + - + - TODO: Should third-party hosts remove their pair request alert when they + - see a PairDone? + - Complication: The user could have already clicked on the alert and be + - entering the secret. Would be better to start a fresh pair request in this + - situation. + -} +pairDoneReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> Assistant () +pairDoneReceived False _ _ = noop -- not verified +pairDoneReceived True Nothing _ = noop -- not in progress +pairDoneReceived True (Just pip) msg = do + stopSending pip + finishedLocalPairing msg (inProgressSshKeyPair pip) diff --git a/Assistant/Threads/ProblemFixer.hs b/Assistant/Threads/ProblemFixer.hs new file mode 100644 index 000000000..8095581a6 --- /dev/null +++ b/Assistant/Threads/ProblemFixer.hs @@ -0,0 +1,70 @@ +{- git-annex assistant thread to handle fixing problems with repositories + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ProblemFixer ( + problemFixerThread +) where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Assistant.RepoProblem +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git.Fsck +import Assistant.Repair +import qualified Git +import Annex.UUID +import Utility.ThreadScheduler + +{- Waits for problems with a repo, and tries to fsck the repo and repair + - the problem. -} +problemFixerThread :: UrlRenderer -> NamedThread +problemFixerThread urlrenderer = namedThread "ProblemFixer" $ + go =<< getRepoProblems + where + go problems = do + mapM_ (handleProblem urlrenderer) problems + liftIO $ threadDelaySeconds (Seconds 60) + -- Problems may have been re-reported while they were being + -- fixed, so ignore those. If a new unique problem happened + -- 60 seconds after the last was fixed, we're unlikely + -- to do much good anyway. + go =<< filter (\p -> not (any (sameRepoProblem p) problems)) + <$> getRepoProblems + +handleProblem :: UrlRenderer -> RepoProblem -> Assistant () +handleProblem urlrenderer repoproblem = do + fixed <- ifM ((==) (problemUUID repoproblem) <$> liftAnnex getUUID) + ( handleLocalRepoProblem urlrenderer + , maybe (return False) (handleRemoteProblem urlrenderer) + =<< liftAnnex (remoteFromUUID $ problemUUID repoproblem) + ) + when fixed $ + liftIO $ afterFix repoproblem + +handleRemoteProblem :: UrlRenderer -> Remote -> Assistant Bool +handleRemoteProblem urlrenderer rmt + | Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) = + ifM (liftIO $ checkAvailable True rmt) + ( do + fixedlocks <- repairStaleGitLocks r + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ + Git.Fsck.findBroken True r + repaired <- repairWhenNecessary urlrenderer (Remote.uuid rmt) (Just rmt) fsckresults + return $ fixedlocks || repaired + , return False + ) + | otherwise = return False + where + r = Remote.repo rmt + +{- This is not yet used, and should probably do a fsck. -} +handleLocalRepoProblem :: UrlRenderer -> Assistant Bool +handleLocalRepoProblem _urlrenderer = do + repairStaleGitLocks =<< liftAnnex gitRepo diff --git a/Assistant/Threads/Pusher.hs b/Assistant/Threads/Pusher.hs new file mode 100644 index 000000000..3ec922fe4 --- /dev/null +++ b/Assistant/Threads/Pusher.hs @@ -0,0 +1,49 @@ +{- git-annex assistant git pushing thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Pusher where + +import Assistant.Common +import Assistant.Commits +import Assistant.Pushes +import Assistant.DaemonStatus +import Assistant.Sync +import Utility.ThreadScheduler +import qualified Remote +import qualified Types.Remote as Remote + +{- This thread retries pushes that failed before. -} +pushRetryThread :: NamedThread +pushRetryThread = namedThread "PushRetrier" $ runEvery (Seconds halfhour) <~> do + -- We already waited half an hour, now wait until there are failed + -- pushes to retry. + topush <- getFailedPushesBefore (fromIntegral halfhour) + unless (null topush) $ do + debug ["retrying", show (length topush), "failed pushes"] + void $ pushToRemotes True topush + where + halfhour = 1800 + +{- This thread pushes git commits out to remotes soon after they are made. -} +pushThread :: NamedThread +pushThread = namedThread "Pusher" $ runEvery (Seconds 2) <~> do + -- We already waited two seconds as a simple rate limiter. + -- Next, wait until at least one commit has been made + void getCommits + -- Now see if now's a good time to push. + void $ pushToRemotes True =<< pushTargets + +{- We want to avoid pushing to remotes that are marked readonly. + - + - Also, avoid pushing to local remotes we can easily tell are not available, + - to avoid ugly messages when a removable drive is not attached. + -} +pushTargets :: Assistant [Remote] +pushTargets = liftIO . filterM (Remote.checkAvailable True) + =<< candidates <$> getDaemonStatus + where + candidates = filter (not . Remote.readonly) . syncGitRemotes diff --git a/Assistant/Threads/RemoteControl.hs b/Assistant/Threads/RemoteControl.hs new file mode 100644 index 000000000..5af4fddcd --- /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 000000000..b62318382 --- /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 000000000..71bfe3676 --- /dev/null +++ b/Assistant/Threads/TransferPoller.hs @@ -0,0 +1,56 @@ +{- git-annex assistant transfer polling thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferPoller where + +import Assistant.Common +import Assistant.DaemonStatus +import Logs.Transfer +import Utility.NotificationBroadcaster +import qualified Assistant.Threads.TransferWatcher as TransferWatcher + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread polls the status of ongoing transfers, determining how much + - of each transfer is complete. -} +transferPollerThread :: NamedThread +transferPollerThread = namedThread "TransferPoller" $ do + g <- liftAnnex gitRepo + tn <- liftIO . newNotificationHandle True =<< + transferNotifier <$> getDaemonStatus + forever $ do + liftIO $ threadDelay 500000 -- 0.5 seconds + ts <- currentTransfers <$> getDaemonStatus + if M.null ts + -- block until transfers running + then liftIO $ waitNotification tn + else mapM_ (poll g) $ M.toList ts + where + poll g (t, info) + {- Downloads are polled by checking the size of the + - temp file being used for the transfer. -} + | transferDirection t == Download = do + let f = gitAnnexTmpObjectLocation (transferKey t) g + sz <- liftIO $ catchMaybeIO $ + fromIntegral . fileSize <$> getFileStatus f + newsize t info sz + {- Uploads don't need to be polled for when the TransferWatcher + - thread can track file modifications. -} + | TransferWatcher.watchesTransferSize = noop + {- Otherwise, this code polls the upload progress + - by reading the transfer info file. -} + | otherwise = do + let f = transferFile t g + mi <- liftIO $ catchDefaultIO Nothing $ + readTransferInfoFile Nothing f + maybe noop (newsize t info . bytesComplete) mi + + newsize t info sz + | bytesComplete info /= sz && isJust sz = + alterTransferInfo t $ \i -> i { bytesComplete = sz } + | otherwise = noop diff --git a/Assistant/Threads/TransferScanner.hs b/Assistant/Threads/TransferScanner.hs new file mode 100644 index 000000000..daced8d21 --- /dev/null +++ b/Assistant/Threads/TransferScanner.hs @@ -0,0 +1,184 @@ +{- git-annex assistant thread to scan remotes to find needed transfers + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferScanner where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import Assistant.ScanRemotes +import Assistant.TransferQueue +import Assistant.DaemonStatus +import Assistant.Drop +import Assistant.Sync +import Assistant.DeleteRemote +import Assistant.Types.UrlRenderer +import Logs.Transfer +import Logs.Location +import Logs.Group +import Logs.Web (webUUID) +import qualified Remote +import qualified Types.Remote as Remote +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster +import Utility.Batch +import qualified Git.LsFiles as LsFiles +import qualified Backend +import Annex.Content +import Annex.Wanted +import CmdLine.Action + +import qualified Data.Set as S + +{- This thread waits until a remote needs to be scanned, to find transfers + - that need to be made, to keep data in sync. + -} +transferScannerThread :: UrlRenderer -> NamedThread +transferScannerThread urlrenderer = namedThread "TransferScanner" $ do + startupScan + go S.empty + where + go scanned = do + scanrunning False + liftIO $ threadDelaySeconds (Seconds 2) + (rs, infos) <- unzip <$> getScanRemote + scanrunning True + if any fullScan infos || any (`S.notMember` scanned) rs + then do + expensiveScan urlrenderer rs + go $ scanned `S.union` S.fromList rs + else do + mapM_ failedTransferScan rs + go scanned + scanrunning b = do + ds <- modifyDaemonStatus $ \s -> + (s { transferScanRunning = b }, s) + liftIO $ sendNotification $ transferNotifier ds + + {- All git remotes are synced, and all available remotes + - are scanned in full on startup, for multiple reasons, including: + - + - * This may be the first run, and there may be remotes + - already in place, that need to be synced. + - * Changes may have been made last time we run, but remotes were + - not available to be synced with. + - * Changes may have been made to remotes while we were down. + - * We may have run before, and scanned a remote, but + - only been in a subdirectory of the git remote, and so + - not synced it all. + - * We may have run before, and had transfers queued, + - and then the system (or us) crashed, and that info was + - lost. + - * A remote may be in the unwanted group, and this is a chance + - to determine if the remote has been emptied. + -} + startupScan = do + reconnectRemotes True =<< syncGitRemotes <$> getDaemonStatus + addScanRemotes True =<< syncDataRemotes <$> getDaemonStatus + +{- This is a cheap scan for failed transfers involving a remote. -} +failedTransferScan :: Remote -> Assistant () +failedTransferScan r = do + failed <- liftAnnex $ clearFailedTransfers (Remote.uuid r) + mapM_ retry failed + where + retry (t, info) + | transferDirection t == Download = + {- Check if the remote still has the key. + - If not, relies on the expensiveScan to + - get it queued from some other remote. -} + whenM (liftAnnex $ remoteHas r $ transferKey t) $ + requeue t info + | otherwise = + {- The Transferrer checks when uploading + - that the remote doesn't already have the + - key, so it's not redundantly checked here. -} + requeue t info + requeue t info = queueTransferWhenSmall "retrying failed transfer" (associatedFile info) t r + +{- This is a expensive scan through the full git work tree, finding + - files to transfer. The scan is blocked when the transfer queue gets + - too large. + - + - This also finds files that are present either here or on a remote + - but that are not preferred content, and drops them. Searching for files + - to drop is done concurrently with the scan for transfers. + - + - TODO: It would be better to first drop as much as we can, before + - transferring much, to minimise disk use. + - + - During the scan, we'll also check if any unwanted repositories are empty, + - and can be removed. While unrelated, this is a cheap place to do it, + - since we need to look at the locations of all keys anyway. + -} +expensiveScan :: UrlRenderer -> [Remote] -> Assistant () +expensiveScan urlrenderer rs = unless onlyweb $ batch <~> do + debug ["starting scan of", show visiblers] + + let us = map Remote.uuid rs + + mapM_ (liftAnnex . clearFailedTransfers) us + + unwantedrs <- liftAnnex $ S.fromList + <$> filterM inUnwantedGroup us + + g <- liftAnnex gitRepo + (files, cleanup) <- liftIO $ LsFiles.inRepo [] g + removablers <- scan unwantedrs files + void $ liftIO cleanup + + debug ["finished scan of", show visiblers] + + remove <- asIO1 $ removableRemote urlrenderer + liftIO $ mapM_ (void . tryNonAsync . remove) $ S.toList removablers + where + onlyweb = all (== webUUID) $ map Remote.uuid rs + visiblers = let rs' = filter (not . Remote.readonly) rs + in if null rs' then rs else rs' + + scan unwanted [] = return unwanted + scan unwanted (f:fs) = do + (unwanted', ts) <- maybe + (return (unwanted, [])) + (findtransfers f unwanted) + =<< liftAnnex (Backend.lookupFile f) + mapM_ (enqueue f) ts + scan unwanted' fs + + enqueue f (r, t) = + queueTransferWhenSmall "expensive scan found missing object" + (Just f) t r + findtransfers f unwanted key = do + {- The syncable remotes may have changed since this + - scan began. -} + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + present <- liftAnnex $ inAnnex key + liftAnnex $ handleDropsFrom locs syncrs + "expensive scan found too many copies of object" + present key (Just f) Nothing callCommandAction + liftAnnex $ do + let slocs = S.fromList locs + let use a = return $ mapMaybe (a key slocs) syncrs + ts <- if present + then filterM (wantSend True (Just key) (Just f) . Remote.uuid . fst) + =<< use (genTransfer Upload False) + else ifM (wantGet True (Just key) (Just f)) + ( use (genTransfer Download True) , return [] ) + let unwanted' = S.difference unwanted slocs + return (unwanted', ts) + +genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer) +genTransfer direction want key slocs r + | direction == Upload && Remote.readonly r = Nothing + | S.member (Remote.uuid r) slocs == want = Just + (r, Transfer direction (Remote.uuid r) key) + | otherwise = Nothing + +remoteHas :: Remote -> Key -> Annex Bool +remoteHas r key = elem + <$> pure (Remote.uuid r) + <*> loggedLocations key diff --git a/Assistant/Threads/TransferWatcher.hs b/Assistant/Threads/TransferWatcher.hs new file mode 100644 index 000000000..6e8791732 --- /dev/null +++ b/Assistant/Threads/TransferWatcher.hs @@ -0,0 +1,104 @@ +{- git-annex assistant transfer watching thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferWatcher where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.TransferSlots +import Logs.Transfer +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Remote + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread watches for changes to the gitAnnexTransferDir, + - and updates the DaemonStatus's map of ongoing transfers. -} +transferWatcherThread :: NamedThread +transferWatcherThread = namedThread "TransferWatcher" $ do + dir <- liftAnnex $ gitAnnexTransferDir <$> gitRepo + liftIO $ createDirectoryIfMissing True dir + let hook a = Just <$> asIO2 (runHandler a) + addhook <- hook onAdd + delhook <- hook onDel + modifyhook <- hook onModify + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = addhook + , delHook = delhook + , modifyHook = modifyhook + , errHook = errhook + } + void $ liftIO $ watchDir dir (const False) True hooks id + debug ["watching for transfers"] + +type Handler = FilePath -> Assistant () + +{- Runs an action handler. + - + - Exceptions are ignored, otherwise a whole thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file _filestatus = + either (liftIO . print) (const noop) =<< tryIO <~> handler file + +{- Called when there's an error with inotify. -} +onErr :: Handler +onErr = error + +{- Called when a new transfer information file is written. -} +onAdd :: Handler +onAdd file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftAnnex (checkTransfer t) + where + go _ Nothing = noop -- transfer already finished + go t (Just info) = do + debug [ "transfer starting:", describeTransfer t info ] + r <- liftAnnex $ Remote.remoteFromUUID $ transferUUID t + updateTransferInfo t info { transferRemote = r } + +{- Called when a transfer information file is updated. + - + - The only thing that should change in the transfer info is the + - bytesComplete, so that's the only thing updated in the DaemonStatus. -} +onModify :: Handler +onModify file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftIO (readTransferInfoFile Nothing file) + where + go _ Nothing = noop + go t (Just newinfo) = alterTransferInfo t $ + \i -> i { bytesComplete = bytesComplete newinfo } + +{- This thread can only watch transfer sizes when the DirWatcher supports + - tracking modificatons to files. -} +watchesTransferSize :: Bool +watchesTransferSize = modifyTracked + +{- Called when a transfer information file is removed. -} +onDel :: Handler +onDel file = case parseTransferFile file of + Nothing -> noop + Just t -> do + debug [ "transfer finishing:", show t] + minfo <- removeTransfer t + + -- Run transfer hook. + m <- transferHook <$> getDaemonStatus + maybe noop (\hook -> void $ liftIO $ forkIO $ hook t) + (M.lookup (transferKey t) m) + + finished <- asIO2 finishedTransfer + void $ liftIO $ forkIO $ do + {- XXX race workaround delay. The location + - log needs to be updated before finishedTransfer + - runs. -} + threadDelay 10000000 -- 10 seconds + finished t minfo diff --git a/Assistant/Threads/Transferrer.hs b/Assistant/Threads/Transferrer.hs new file mode 100644 index 000000000..53d8a578c --- /dev/null +++ b/Assistant/Threads/Transferrer.hs @@ -0,0 +1,27 @@ +{- git-annex assistant data transferrer thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Transferrer where + +import Assistant.Common +import Assistant.TransferQueue +import Assistant.TransferSlots +import Logs.Transfer +import Config.Files +import Utility.Batch + +{- Dispatches transfers from the queue. -} +transfererThread :: NamedThread +transfererThread = namedThread "Transferrer" $ do + program <- liftIO readProgramFile + batchmaker <- liftIO getBatchCommandMaker + forever $ inTransferSlot program batchmaker $ + maybe (return Nothing) (uncurry genTransfer) + =<< getNextTransfer notrunning + where + {- Skip transfers that are already running. -} + notrunning = isNothing . startedTime diff --git a/Assistant/Threads/UpgradeWatcher.hs b/Assistant/Threads/UpgradeWatcher.hs new file mode 100644 index 000000000..ffad09d3d --- /dev/null +++ b/Assistant/Threads/UpgradeWatcher.hs @@ -0,0 +1,110 @@ +{- git-annex assistant thread to detect when git-annex is upgraded + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.UpgradeWatcher ( + upgradeWatcherThread +) where + +import Assistant.Common +import Assistant.Upgrade +import Utility.DirWatcher +import Utility.DirWatcher.Types +import Utility.ThreadScheduler +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Assistant.DaemonStatus +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import qualified Build.SysConfig +#endif + +import Control.Concurrent.MVar +import qualified Data.Text as T + +data WatcherState = InStartupScan | Started | Upgrading + deriving (Eq) + +upgradeWatcherThread :: UrlRenderer -> NamedThread +upgradeWatcherThread urlrenderer = namedThread "UpgradeWatcher" $ do + whenM (liftIO checkSuccessfulUpgrade) $ + showSuccessfulUpgrade urlrenderer + go =<< liftIO upgradeFlagFile + where + go Nothing = debug [ "cannot determine program path" ] + go (Just flagfile) = do + mvar <- liftIO $ newMVar InStartupScan + changed <- Just <$> asIO2 (changedFile urlrenderer mvar flagfile) + let hooks = mkWatchHooks + { addHook = changed + , delHook = changed + , addSymlinkHook = changed + , modifyHook = changed + , delDirHook = changed + } + let dir = parentDir flagfile + let depth = length (splitPath dir) + 1 + let nosubdirs f = length (splitPath f) == depth + void $ liftIO $ watchDir dir nosubdirs False hooks (startup mvar) + -- Ignore bogus events generated during the startup scan. + -- We ask the watcher to not generate them, but just to be safe.. + startup mvar scanner = do + r <- scanner + void $ swapMVar mvar Started + return r + +changedFile :: UrlRenderer -> MVar WatcherState -> FilePath -> FilePath -> Maybe FileStatus -> Assistant () +changedFile urlrenderer mvar flagfile file _status + | flagfile /= file = noop + | otherwise = do + state <- liftIO $ readMVar mvar + when (state == Started) $ do + setstate Upgrading + ifM (liftIO upgradeSanityCheck) + ( handleUpgrade urlrenderer + , do + debug ["new version failed sanity check; not using"] + setstate Started + ) + where + setstate = void . liftIO . swapMVar mvar + +handleUpgrade :: UrlRenderer -> Assistant () +handleUpgrade urlrenderer = do + -- Wait 2 minutes for any final upgrade changes to settle. + -- (For example, other associated files may be being put into + -- place.) Not needed when using a distribution bundle, because + -- in that case git-annex handles the upgrade in a non-racy way. + liftIO $ unlessM usingDistribution $ + threadDelaySeconds (Seconds 120) + ifM autoUpgradeEnabled + ( do + debug ["starting automatic upgrade"] + unattendedUpgrade +#ifdef WITH_WEBAPP + , do + button <- mkAlertButton True (T.pack "Finish Upgrade") urlrenderer ConfigFinishUpgradeR + void $ addAlert $ upgradeReadyAlert button +#else + , noop +#endif + ) + +showSuccessfulUpgrade :: UrlRenderer -> Assistant () +showSuccessfulUpgrade urlrenderer = do +#ifdef WITH_WEBAPP + button <- ifM autoUpgradeEnabled + ( pure Nothing + , Just <$> mkAlertButton True + (T.pack "Enable Automatic Upgrades") + urlrenderer ConfigEnableAutomaticUpgradeR + ) + void $ addAlert $ upgradeFinishedAlert button Build.SysConfig.packageversion +#else + noop +#endif diff --git a/Assistant/Threads/Upgrader.hs b/Assistant/Threads/Upgrader.hs new file mode 100644 index 000000000..637c82a7d --- /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 000000000..0ed1bd22f --- /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 000000000..416c07874 --- /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 000000000..39b0459b7 --- /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 000000000..30c91c7f0 --- /dev/null +++ b/Assistant/Threads/XMPPPusher.hs @@ -0,0 +1,81 @@ +{- git-annex XMPP pusher threads + - + - This is a pair of threads. One handles git send-pack, + - and the other git receive-pack. Each thread can be running at most + - one such operation at a time. + - + - Why not use a single thread? Consider two clients A and B. + - If both decide to run a receive-pack at the same time to the other, + - they would deadlock with only one thread. For larger numbers of + - clients, the two threads are also sufficient. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.XMPPPusher where + +import Assistant.Common +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Configurators.XMPP (checkCloudRepos) +import Assistant.XMPP.Git + +import Control.Exception as E + +xmppSendPackThread :: UrlRenderer -> NamedThread +xmppSendPackThread = pusherThread "XMPPSendPack" SendPack + +xmppReceivePackThread :: UrlRenderer -> NamedThread +xmppReceivePackThread = pusherThread "XMPPReceivePack" ReceivePack + +pusherThread :: String -> PushSide -> UrlRenderer -> NamedThread +pusherThread threadname side urlrenderer = namedThread threadname $ go Nothing + where + go lastpushedto = do + msg <- waitPushInitiation side $ selectNextPush lastpushedto + debug ["started running push", logNetMessage msg] + + runpush <- asIO $ runPush checker msg + r <- liftIO (E.try runpush :: IO (Either SomeException (Maybe ClientID))) + let successful = case r of + Right (Just _) -> True + _ -> False + + {- Empty the inbox, because stuff may have + - been left in it if the push failed. -} + let justpushedto = getclient msg + maybe noop (`emptyInbox` side) justpushedto + + debug ["finished running push", logNetMessage msg, show successful] + go $ if successful then justpushedto else lastpushedto + + checker = checkCloudRepos urlrenderer + + getclient (Pushing cid _) = Just cid + getclient _ = Nothing + +{- Select the next push to run from the queue. + - The queue cannot be empty! + - + - We prefer to select the most recently added push, because its requestor + - is more likely to still be connected. + - + - When passed the ID of a client we just pushed to, we prefer to not + - immediately push again to that same client. This avoids one client + - drowing out others. So pushes from the client we just pushed to are + - relocated to the beginning of the list, to be processed later. + -} +selectNextPush :: Maybe ClientID -> [NetMessage] -> (NetMessage, [NetMessage]) +selectNextPush _ (m:[]) = (m, []) -- common case +selectNextPush _ [] = error "selectNextPush: empty list" +selectNextPush lastpushedto l = go [] l + where + go (r:ejected) [] = (r, ejected) + go rejected (m:ms) = case m of + (Pushing clientid _) + | Just clientid /= lastpushedto -> (m, rejected ++ ms) + _ -> go (m:rejected) ms + go [] [] = undefined diff --git a/Assistant/TransferQueue.hs b/Assistant/TransferQueue.hs new file mode 100644 index 000000000..93c982224 --- /dev/null +++ b/Assistant/TransferQueue.hs @@ -0,0 +1,233 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.TransferQueue ( + TransferQueue, + Schedule(..), + newTransferQueue, + getTransferQueue, + queueTransfers, + queueTransfersMatching, + queueDeferredDownloads, + queueTransfer, + queueTransferAt, + queueTransferWhenSmall, + getNextTransfer, + getMatchingTransfers, + dequeueTransfers, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Types.TransferQueue +import Logs.Transfer +import Types.Remote +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Wanted +import Utility.TList + +import Control.Concurrent.STM +import qualified Data.Map as M +import qualified Data.Set as S + +type Reason = String + +{- Reads the queue's content without blocking or changing it. -} +getTransferQueue :: Assistant [(Transfer, TransferInfo)] +getTransferQueue = (atomically . readTList . queuelist) <<~ transferQueue + +stubInfo :: AssociatedFile -> Remote -> TransferInfo +stubInfo f r = stubTransferInfo + { transferRemote = Just r + , associatedFile = f + } + +{- Adds transfers to queue for some of the known remotes. + - Honors preferred content settings, only transferring wanted files. -} +queueTransfers :: Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfers = queueTransfersMatching (const True) + +{- Adds transfers to queue for some of the known remotes, that match a + - condition. Honors preferred content settings. -} +queueTransfersMatching :: (UUID -> Bool) -> Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfersMatching matching reason schedule k f direction + | direction == Download = ifM (liftAnnex $ wantGet True (Just k) f) + ( go + , return False + ) + | otherwise = go + where + go = do + + rs <- liftAnnex . selectremotes + =<< syncDataRemotes <$> getDaemonStatus + let matchingrs = filter (matching . Remote.uuid) rs + if null matchingrs + then do + defer + return False + else do + forM_ matchingrs $ \r -> + enqueue reason schedule (gentransfer r) (stubInfo f r) + return True + selectremotes rs + {- Queue downloads from all remotes that + - have the key. The list of remotes is ordered with + - cheapest first. More expensive ones will only be tried + - if downloading from a cheap one fails. -} + | direction == Download = do + s <- locs + return $ filter (inset s) rs + {- Upload to all remotes that want the content and don't + - already have it. -} + | otherwise = do + s <- locs + filterM (wantSend True (Just k) f . Remote.uuid) $ + filter (\r -> not (inset s r || Remote.readonly r)) rs + where + locs = S.fromList <$> Remote.keyLocations k + inset s r = S.member (Remote.uuid r) s + gentransfer r = Transfer + { transferDirection = direction + , transferKey = k + , transferUUID = Remote.uuid r + } + defer + {- Defer this download, as no known remote has the key. -} + | direction == Download = do + q <- getAssistant transferQueue + void $ liftIO $ atomically $ + consTList (deferreddownloads q) (k, f) + | otherwise = noop + +{- Queues any deferred downloads that can now be accomplished, leaving + - any others in the list to try again later. -} +queueDeferredDownloads :: Reason -> Schedule -> Assistant () +queueDeferredDownloads reason schedule = do + q <- getAssistant transferQueue + l <- liftIO $ atomically $ readTList (deferreddownloads q) + rs <- syncDataRemotes <$> getDaemonStatus + left <- filterM (queue rs) l + unless (null left) $ + liftIO $ atomically $ appendTList (deferreddownloads q) left + where + queue rs (k, f) = do + uuids <- liftAnnex $ Remote.keyLocations k + let sources = filter (\r -> uuid r `elem` uuids) rs + unless (null sources) $ + forM_ sources $ \r -> + enqueue reason schedule + (gentransfer r) (stubInfo f r) + return $ null sources + where + gentransfer r = Transfer + { transferDirection = Download + , transferKey = k + , transferUUID = Remote.uuid r + } + +enqueue :: Reason -> Schedule -> Transfer -> TransferInfo -> Assistant () +enqueue reason schedule t info + | schedule == Next = go consTList + | otherwise = go snocTList + where + go modlist = whenM (add modlist) $ do + debug [ "queued", describeTransfer t info, ": " ++ reason ] + notifyTransfer + add modlist = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ ifM (checkRunningTransferSTM dstatus t) + ( return False + , do + l <- readTList (queuelist q) + if (t `notElem` map fst l) + then do + void $ modifyTVar' (queuesize q) succ + void $ modlist (queuelist q) (t, info) + return True + else return False + ) + +{- Adds a transfer to the queue. -} +queueTransfer :: Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransfer reason schedule f t remote = + enqueue reason schedule t (stubInfo f remote) + +{- Blocks until the queue is no larger than a given size, and then adds a + - transfer to the queue. -} +queueTransferAt :: Int -> Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferAt wantsz reason schedule f t remote = do + q <- getAssistant transferQueue + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + unless (sz <= wantsz) $ + retry -- blocks until queuesize changes + enqueue reason schedule t (stubInfo f remote) + +queueTransferWhenSmall :: Reason -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferWhenSmall reason = queueTransferAt 10 reason Later + +{- Blocks until a pending transfer is available in the queue, + - and removes it. + - + - Checks that it's acceptable, before adding it to the + - currentTransfers map. If it's not acceptable, it's discarded. + - + - This is done in a single STM transaction, so there is no window + - where an observer sees an inconsistent status. -} +getNextTransfer :: (TransferInfo -> Bool) -> Assistant (Maybe (Transfer, TransferInfo)) +getNextTransfer acceptable = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + if sz < 1 + then retry -- blocks until queuesize changes + else do + (r@(t,info):rest) <- readTList (queuelist q) + void $ modifyTVar' (queuesize q) pred + setTList (queuelist q) rest + if acceptable info + then do + adjustTransfersSTM dstatus $ + M.insertWith' const t info + return $ Just r + else return Nothing + +{- Moves transfers matching a condition from the queue, to the + - currentTransfers map. -} +getMatchingTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +getMatchingTransfers c = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + ts <- dequeueTransfersSTM q c + unless (null ts) $ + adjustTransfersSTM dstatus $ \m -> M.union m $ M.fromList ts + return ts + +{- Removes transfers matching a condition from the queue, and returns the + - removed transfers. -} +dequeueTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +dequeueTransfers c = do + q <- getAssistant transferQueue + removed <- liftIO $ atomically $ dequeueTransfersSTM q c + unless (null removed) $ + notifyTransfer + return removed + +dequeueTransfersSTM :: TransferQueue -> (Transfer -> Bool) -> STM [(Transfer, TransferInfo)] +dequeueTransfersSTM q c = do + !(removed, ts) <- partition (c . fst) <$> readTList (queuelist q) + let !len = length ts + void $ writeTVar (queuesize q) len + setTList (queuelist q) ts + return removed diff --git a/Assistant/TransferSlots.hs b/Assistant/TransferSlots.hs new file mode 100644 index 000000000..cafbb7bdf --- /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 000000000..3ac9f3452 --- /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 000000000..9fd33c7a2 --- /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 000000000..399abee54 --- /dev/null +++ b/Assistant/Types/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.BranchChange where + +import Control.Concurrent.MSampleVar +import Common.Annex + +newtype BranchChangeHandle = BranchChangeHandle (MSampleVar ()) + +newBranchChangeHandle :: IO BranchChangeHandle +newBranchChangeHandle = BranchChangeHandle <$> newEmptySV + +fromBranchChangeHandle :: BranchChangeHandle -> MSampleVar () +fromBranchChangeHandle (BranchChangeHandle v) = v diff --git a/Assistant/Types/Buddies.hs b/Assistant/Types/Buddies.hs new file mode 100644 index 000000000..36d8a4fed --- /dev/null +++ b/Assistant/Types/Buddies.hs @@ -0,0 +1,80 @@ +{- git-annex assistant buddies + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.Buddies where + +import Common.Annex + +import qualified Data.Map as M +import Control.Concurrent.STM +import Utility.NotificationBroadcaster +import Data.Text as T + +{- For simplicity, dummy types are defined even when XMPP is disabled. -} +#ifdef WITH_XMPP +import Network.Protocol.XMPP +import Data.Set as S +import Data.Ord + +newtype Client = Client JID + deriving (Eq, Show) + +instance Ord Client where + compare = comparing show + +data Buddy = Buddy + { buddyPresent :: S.Set Client + , buddyAway :: S.Set Client + , buddyAssistants :: S.Set Client + , buddyPairing :: Bool + } +#else +data Buddy = Buddy +#endif + deriving (Eq, Show) + +data BuddyKey = BuddyKey T.Text + deriving (Eq, Ord, Show, Read) + +data PairKey = PairKey UUID T.Text + deriving (Eq, Ord, Show, Read) + +type Buddies = M.Map BuddyKey Buddy + +{- A list of buddies, and a way to notify when it changes. -} +type BuddyList = (TMVar Buddies, NotificationBroadcaster) + +noBuddies :: Buddies +noBuddies = M.empty + +newBuddyList :: IO BuddyList +newBuddyList = (,) + <$> atomically (newTMVar noBuddies) + <*> newNotificationBroadcaster + +getBuddyList :: BuddyList -> IO [Buddy] +getBuddyList (v, _) = M.elems <$> atomically (readTMVar v) + +getBuddy :: BuddyKey -> BuddyList -> IO (Maybe Buddy) +getBuddy k (v, _) = M.lookup k <$> atomically (readTMVar v) + +getBuddyBroadcaster :: BuddyList -> NotificationBroadcaster +getBuddyBroadcaster (_, h) = h + +{- Applies a function to modify the buddy list, and if it's changed, + - sends notifications to any listeners. -} +updateBuddyList :: (Buddies -> Buddies) -> BuddyList -> IO () +updateBuddyList a (v, caster) = do + changed <- atomically $ do + buds <- takeTMVar v + let buds' = a buds + putTMVar v buds' + return $ buds /= buds' + when changed $ + sendNotification caster diff --git a/Assistant/Types/Changes.hs b/Assistant/Types/Changes.hs new file mode 100644 index 000000000..e8ecc6e48 --- /dev/null +++ b/Assistant/Types/Changes.hs @@ -0,0 +1,77 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Changes where + +import Types.KeySource +import Types.Key +import Utility.TList + +import Control.Concurrent.STM +import Data.Time.Clock + +{- An un-ordered pool of Changes that have been noticed and should be + - staged and committed. Changes will typically be in order, but ordering + - may be lost. In any case, order should not matter, as any given Change + - may later be reverted by a later Change (ie, a file is added and then + - deleted). Code that processes the changes needs to deal with such + - scenarios. + -} +type ChangePool = TList Change + +newChangePool :: IO ChangePool +newChangePool = atomically newTList + +data Change + = Change + { changeTime :: UTCTime + , _changeFile :: FilePath + , changeInfo :: ChangeInfo + } + | PendingAddChange + { changeTime ::UTCTime + , _changeFile :: FilePath + } + | InProcessAddChange + { changeTime ::UTCTime + , keySource :: KeySource + } + deriving (Show) + +data ChangeInfo = AddKeyChange Key | AddFileChange | LinkChange (Maybe Key) | RmChange + deriving (Show, Eq, Ord) + +changeInfoKey :: ChangeInfo -> Maybe Key +changeInfoKey (AddKeyChange k) = Just k +changeInfoKey (LinkChange (Just k)) = Just k +changeInfoKey _ = Nothing + +changeFile :: Change -> FilePath +changeFile (Change _ f _) = f +changeFile (PendingAddChange _ f) = f +changeFile (InProcessAddChange _ ks) = keyFilename ks + +isPendingAddChange :: Change -> Bool +isPendingAddChange (PendingAddChange {}) = True +isPendingAddChange _ = False + +isInProcessAddChange :: Change -> Bool +isInProcessAddChange (InProcessAddChange {}) = True +isInProcessAddChange _ = False + +retryChange :: Change -> Change +retryChange (InProcessAddChange time ks) = + PendingAddChange time (keyFilename ks) +retryChange c = c + +finishedChange :: Change -> Key -> Change +finishedChange c@(InProcessAddChange { keySource = ks }) k = Change + { changeTime = changeTime c + , _changeFile = keyFilename ks + , changeInfo = AddKeyChange k + } +finishedChange c _ = c diff --git a/Assistant/Types/Commits.hs b/Assistant/Types/Commits.hs new file mode 100644 index 000000000..500faa901 --- /dev/null +++ b/Assistant/Types/Commits.hs @@ -0,0 +1,19 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Commits where + +import Utility.TList + +import Control.Concurrent.STM + +type CommitChan = TList Commit + +data Commit = Commit + +newCommitChan :: IO CommitChan +newCommitChan = atomically newTList diff --git a/Assistant/Types/CredPairCache.hs b/Assistant/Types/CredPairCache.hs new file mode 100644 index 000000000..a1e11c257 --- /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 000000000..2adad2828 --- /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 000000000..5dd1364ad --- /dev/null +++ b/Assistant/Types/NamedThread.hs @@ -0,0 +1,21 @@ +{- named threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.NamedThread where + +import Assistant.Monad +import Assistant.Types.ThreadName + +{- Information about a named thread that can be run. -} +data NamedThread = NamedThread Bool ThreadName (Assistant ()) + +namedThread :: String -> Assistant () -> NamedThread +namedThread = NamedThread True . ThreadName + +{- A named thread that can start running before the startup sanity check. -} +namedThreadUnchecked :: String -> Assistant () -> NamedThread +namedThreadUnchecked = NamedThread False . ThreadName diff --git a/Assistant/Types/NetMessager.hs b/Assistant/Types/NetMessager.hs new file mode 100644 index 000000000..5ae987a61 --- /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 000000000..99e0ee162 --- /dev/null +++ b/Assistant/Types/Pushes.hs @@ -0,0 +1,24 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Pushes where + +import Common.Annex + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Track the most recent push failure for each remote. -} +type PushMap = M.Map Remote UTCTime +type FailedPushMap = TMVar PushMap + +{- The TMVar starts empty, and is left empty when there are no + - failed pushes. This way we can block until there are some failed pushes. + -} +newFailedPushMap :: IO FailedPushMap +newFailedPushMap = atomically newEmptyTMVar diff --git a/Assistant/Types/RemoteControl.hs b/Assistant/Types/RemoteControl.hs new file mode 100644 index 000000000..523cd8b8d --- /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 000000000..ece5a5286 --- /dev/null +++ b/Assistant/Types/RepoProblem.hs @@ -0,0 +1,28 @@ +{- git-annex assistant repository problem tracking + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.RepoProblem where + +import Types +import Utility.TList + +import Control.Concurrent.STM +import Data.Function + +data RepoProblem = RepoProblem + { problemUUID :: UUID + , afterFix :: IO () + } + +{- The afterFix actions are assumed to all be equivilant. -} +sameRepoProblem :: RepoProblem -> RepoProblem -> Bool +sameRepoProblem = (==) `on` problemUUID + +type RepoProblemChan = TList RepoProblem + +newRepoProblemChan :: IO RepoProblemChan +newRepoProblemChan = atomically newTList diff --git a/Assistant/Types/ScanRemotes.hs b/Assistant/Types/ScanRemotes.hs new file mode 100644 index 000000000..8219f9baf --- /dev/null +++ b/Assistant/Types/ScanRemotes.hs @@ -0,0 +1,25 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ScanRemotes where + +import Common.Annex + +import Control.Concurrent.STM +import qualified Data.Map as M + +data ScanInfo = ScanInfo + { scanPriority :: Float + , fullScan :: Bool + } + +type ScanRemoteMap = TMVar (M.Map Remote ScanInfo) + +{- The TMVar starts empty, and is left empty when there are no remotes + - to scan. -} +newScanRemoteMap :: IO ScanRemoteMap +newScanRemoteMap = atomically newEmptyTMVar diff --git a/Assistant/Types/ThreadName.hs b/Assistant/Types/ThreadName.hs new file mode 100644 index 000000000..c8d264a38 --- /dev/null +++ b/Assistant/Types/ThreadName.hs @@ -0,0 +1,14 @@ +{- name of a thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadName where + +newtype ThreadName = ThreadName String + deriving (Eq, Read, Show, Ord) + +fromThreadName :: ThreadName -> String +fromThreadName (ThreadName n) = n diff --git a/Assistant/Types/ThreadedMonad.hs b/Assistant/Types/ThreadedMonad.hs new file mode 100644 index 000000000..1a2aa7eb7 --- /dev/null +++ b/Assistant/Types/ThreadedMonad.hs @@ -0,0 +1,38 @@ +{- making the Annex monad available across threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadedMonad where + +import Common.Annex +import qualified Annex + +import Control.Concurrent +import Data.Tuple + +{- The Annex state is stored in a MVar, so that threaded actions can access + - it. -} +type ThreadState = MVar Annex.AnnexState + +{- Stores the Annex state in a MVar. + - + - Once the action is finished, retrieves the state from the MVar. + -} +withThreadState :: (ThreadState -> Annex a) -> Annex a +withThreadState a = do + state <- Annex.getState id + mvar <- liftIO $ newMVar state + r <- a mvar + newstate <- liftIO $ takeMVar mvar + Annex.changeState (const newstate) + return r + +{- Runs an Annex action, using the state from the MVar. + - + - This serializes calls by threads; only one thread can run in Annex at a + - time. -} +runThreadState :: ThreadState -> Annex a -> IO a +runThreadState mvar a = modifyMVar mvar $ \state -> swap <$> Annex.run state a diff --git a/Assistant/Types/TransferQueue.hs b/Assistant/Types/TransferQueue.hs new file mode 100644 index 000000000..e4bf2ae92 --- /dev/null +++ b/Assistant/Types/TransferQueue.hs @@ -0,0 +1,29 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferQueue where + +import Common.Annex +import Logs.Transfer + +import Control.Concurrent.STM +import Utility.TList + +data TransferQueue = TransferQueue + { queuesize :: TVar Int + , queuelist :: TList (Transfer, TransferInfo) + , deferreddownloads :: TList (Key, AssociatedFile) + } + +data Schedule = Next | Later + deriving (Eq) + +newTransferQueue :: IO TransferQueue +newTransferQueue = atomically $ TransferQueue + <$> newTVar 0 + <*> newTList + <*> newTList diff --git a/Assistant/Types/TransferSlots.hs b/Assistant/Types/TransferSlots.hs new file mode 100644 index 000000000..5140995a3 --- /dev/null +++ b/Assistant/Types/TransferSlots.hs @@ -0,0 +1,34 @@ +{- git-annex assistant transfer slots + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Types.TransferSlots where + +import qualified Control.Exception as E +import qualified Control.Concurrent.MSemN as MSemN +import Data.Typeable + +type TransferSlots = MSemN.MSemN Int + +{- A special exception that can be thrown to pause or resume a transfer, while + - keeping its slot in use. -} +data TransferException = PauseTransfer | ResumeTransfer + deriving (Show, Eq, Typeable) + +instance E.Exception TransferException + +{- Number of concurrent transfers allowed to be run from the assistant. + - + - Transfers launched by other means, including by remote assistants, + - do not currently take up slots. + -} +numSlots :: Int +numSlots = 1 + +newTransferSlots :: IO TransferSlots +newTransferSlots = MSemN.new numSlots diff --git a/Assistant/Types/TransferrerPool.hs b/Assistant/Types/TransferrerPool.hs new file mode 100644 index 000000000..b66fdfa13 --- /dev/null +++ b/Assistant/Types/TransferrerPool.hs @@ -0,0 +1,67 @@ +{- A pool of "git-annex transferkeys" processes available for use + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferrerPool where + +import Common.Annex +import Utility.NotificationBroadcaster +import Assistant.Types.DaemonStatus + +import Control.Concurrent.STM hiding (check) + +{- This TMVar is never left empty. -} +type TransferrerPool = TMVar (MkCheckTransferrer, [TransferrerPoolItem]) + +type CheckTransferrer = IO Bool +type MkCheckTransferrer = IO (IO Bool) + +{- Each item in the pool may have a transferrer running, and has an + - IO action that can be used to check if it's still ok to use the + - transferrer. -} +data TransferrerPoolItem = TransferrerPoolItem (Maybe Transferrer) CheckTransferrer + +data Transferrer = Transferrer + { transferrerRead :: Handle + , transferrerWrite :: Handle + , transferrerHandle :: ProcessHandle + } + +newTransferrerPool :: MkCheckTransferrer -> IO TransferrerPool +newTransferrerPool c = newTMVarIO (c, []) + +popTransferrerPool :: TransferrerPool -> STM (Maybe TransferrerPoolItem, Int) +popTransferrerPool p = do + (c, l) <- takeTMVar p + case l of + [] -> do + putTMVar p (c, []) + return (Nothing, 0) + (i:is) -> do + putTMVar p (c, is) + return $ (Just i, length is) + +pushTransferrerPool :: TransferrerPool -> TransferrerPoolItem -> STM () +pushTransferrerPool p i = do + (c, l) <- takeTMVar p + let l' = i:l + putTMVar p (c, l') + +{- Note that making a CheckTransferrer may allocate resources, + - such as a NotificationHandle, so it's important that the returned + - TransferrerPoolItem is pushed into the pool, and not left to be + - garbage collected. -} +mkTransferrerPoolItem :: TransferrerPool -> Transferrer -> IO TransferrerPoolItem +mkTransferrerPoolItem p t = do + mkcheck <- atomically $ fst <$> readTMVar p + check <- mkcheck + return $ TransferrerPoolItem (Just t) check + +checkNetworkConnections :: DaemonStatusHandle -> MkCheckTransferrer +checkNetworkConnections dstatushandle = do + dstatus <- atomically $ readTMVar dstatushandle + h <- newNotificationHandle False (networkConnectedNotifier dstatus) + return $ not <$> checkNotification h diff --git a/Assistant/Types/UrlRenderer.hs b/Assistant/Types/UrlRenderer.hs new file mode 100644 index 000000000..521905bf3 --- /dev/null +++ b/Assistant/Types/UrlRenderer.hs @@ -0,0 +1,26 @@ +{- webapp url renderer access from the assistant + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.UrlRenderer ( + UrlRenderer, + newUrlRenderer +) where + +#ifdef WITH_WEBAPP + +import Assistant.WebApp (UrlRenderer, newUrlRenderer) + +#else + +data UrlRenderer = UrlRenderer -- dummy type + +newUrlRenderer :: IO UrlRenderer +newUrlRenderer = return UrlRenderer + +#endif diff --git a/Assistant/Unused.hs b/Assistant/Unused.hs new file mode 100644 index 000000000..3ad98c12e --- /dev/null +++ b/Assistant/Unused.hs @@ -0,0 +1,86 @@ +{- git-annex assistant unused files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Unused where + +import qualified Data.Map as M + +import Assistant.Common +import qualified Git +import Types.Key +import Logs.Unused +import Logs.Location +import Annex.Content +import Utility.DataUnits +import Utility.DiskFree +import Utility.HumanTime +import Utility.Tense + +import Data.Time.Clock.POSIX +import qualified Data.Text as T + +describeUnused :: Assistant (Maybe TenseText) +describeUnused = describeUnused' False + +describeUnusedWhenBig :: Assistant (Maybe TenseText) +describeUnusedWhenBig = describeUnused' True + +{- This uses heuristics: 1000 unused keys, or more unused keys + - than the remaining free disk space, or more than 1/10th the total + - disk space being unused keys all suggest a problem. -} +describeUnused' :: Bool -> Assistant (Maybe TenseText) +describeUnused' whenbig = liftAnnex $ go =<< readUnusedLog "" + where + go m = do + let num = M.size m + let diskused = foldl' sumkeysize 0 (M.keys m) + df <- forpath getDiskFree + disksize <- forpath getDiskSize + return $ if num == 0 + then Nothing + else if not whenbig || moreused df diskused || tenthused disksize diskused + then Just $ tenseWords + [ UnTensed $ T.pack $ roughSize storageUnits False diskused + , Tensed "are" "were" + , "taken up by unused files" + ] + else if num > 1000 + then Just $ tenseWords + [ UnTensed $ T.pack $ show num ++ " unused files" + , Tensed "exist" "existed" + ] + else Nothing + + moreused Nothing _ = False + moreused (Just df) used = df <= used + + tenthused Nothing _ = False + tenthused (Just disksize) used = used >= disksize `div` 10 + + sumkeysize s k = s + fromMaybe 0 (keySize k) + + forpath a = inRepo $ liftIO . a . Git.repoPath + +{- With a duration, expires all unused files that are older. + - With Nothing, expires *all* unused files. -} +expireUnused :: Maybe Duration -> Assistant () +expireUnused duration = do + m <- liftAnnex $ readUnusedLog "" + now <- liftIO getPOSIXTime + let oldkeys = M.keys $ M.filter (tooold now) m + forM_ oldkeys $ \k -> do + debug ["removing old unused key", key2file k] + liftAnnex $ do + removeAnnex k + logStatus k InfoMissing + where + boundry = durationToPOSIXTime <$> duration + tooold now (_, mt) = case boundry of + Nothing -> True + Just b -> maybe False (\t -> now - t >= b) mt diff --git a/Assistant/XMPP.hs b/Assistant/XMPP.hs new file mode 100644 index 000000000..e74705021 --- /dev/null +++ b/Assistant/XMPP.hs @@ -0,0 +1,274 @@ +{- core xmpp support + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.XMPP where + +import Assistant.Common +import Assistant.Types.NetMessager +import Assistant.Pairing +import Git.Sha (extractSha) +import Git + +import Network.Protocol.XMPP hiding (Node) +import Data.Text (Text) +import qualified Data.Text as T +import qualified Data.Map as M +import Data.ByteString (ByteString) +import qualified Data.ByteString as B +import Data.XML.Types +import qualified "dataenc" Codec.Binary.Base64 as B64 + +{- Name of the git-annex tag, in our own XML namespace. + - (Not using a namespace URL to avoid unnecessary bloat.) -} +gitAnnexTagName :: Name +gitAnnexTagName = "{git-annex}git-annex" + +{- Creates a git-annex tag containing a particular attribute and value. -} +gitAnnexTag :: Name -> Text -> Element +gitAnnexTag attr val = gitAnnexTagContent attr val [] + +{- Also with some content. -} +gitAnnexTagContent :: Name -> Text -> [Node] -> Element +gitAnnexTagContent attr val = Element gitAnnexTagName [(attr, [ContentText val])] + +isGitAnnexTag :: Element -> Bool +isGitAnnexTag t = elementName t == gitAnnexTagName + +{- Things that a git-annex tag can inserted into. -} +class GitAnnexTaggable a where + insertGitAnnexTag :: a -> Element -> a + + extractGitAnnexTag :: a -> Maybe Element + + hasGitAnnexTag :: a -> Bool + hasGitAnnexTag = isJust . extractGitAnnexTag + +instance GitAnnexTaggable Message where + insertGitAnnexTag m elt = m { messagePayloads = elt : messagePayloads m } + extractGitAnnexTag = headMaybe . filter isGitAnnexTag . messagePayloads + +instance GitAnnexTaggable Presence where + -- always mark extended away and set presence priority to negative + insertGitAnnexTag p elt = p + { presencePayloads = extendedAway : negativePriority : elt : presencePayloads p } + extractGitAnnexTag = headMaybe . filter isGitAnnexTag . presencePayloads + +data GitAnnexTagInfo = GitAnnexTagInfo + { tagAttr :: Name + , tagValue :: Text + , tagElement :: Element + } + +type Decoder = Message -> GitAnnexTagInfo -> Maybe NetMessage + +gitAnnexTagInfo :: GitAnnexTaggable a => a -> Maybe GitAnnexTagInfo +gitAnnexTagInfo v = case extractGitAnnexTag v of + {- Each git-annex tag has a single attribute. -} + Just (tag@(Element _ [(attr, _)] _)) -> GitAnnexTagInfo + <$> pure attr + <*> attributeText attr tag + <*> pure tag + _ -> Nothing + +{- A presence with a git-annex tag in it. + - Also includes a status tag, which may be visible in XMPP clients. -} +gitAnnexPresence :: Element -> Presence +gitAnnexPresence = insertGitAnnexTag $ addStatusTag $ emptyPresence PresenceAvailable + where + addStatusTag p = p + { presencePayloads = status : presencePayloads p } + status = Element "status" [] [statusMessage] + statusMessage = NodeContent $ ContentText $ T.pack "git-annex" + +{- A presence with an empty git-annex tag in it, used for letting other + - clients know we're around and are a git-annex client. -} +gitAnnexSignature :: Presence +gitAnnexSignature = gitAnnexPresence $ Element gitAnnexTagName [] [] + +{- XMPP client to server ping -} +xmppPing :: JID -> IQ +xmppPing selfjid = (emptyIQ IQGet) + { iqID = Just "c2s1" + , iqFrom = Just selfjid + , iqTo = Just $ JID Nothing (jidDomain selfjid) Nothing + , iqPayload = Just $ Element xmppPingTagName [] [] + } + +xmppPingTagName :: Name +xmppPingTagName = "{urn:xmpp}ping" + +{- A message with a git-annex tag in it. -} +gitAnnexMessage :: Element -> JID -> JID -> Message +gitAnnexMessage elt tojid fromjid = (insertGitAnnexTag silentMessage elt) + { messageTo = Just tojid + , messageFrom = Just fromjid + } + +{- A notification that we've pushed to some repositories, listing their + - UUIDs. -} +pushNotification :: [UUID] -> Presence +pushNotification = gitAnnexPresence . gitAnnexTag pushAttr . encodePushNotification + +encodePushNotification :: [UUID] -> Text +encodePushNotification = T.intercalate uuidSep . map (T.pack . fromUUID) + +decodePushNotification :: Text -> [UUID] +decodePushNotification = map (toUUID . T.unpack) . T.splitOn uuidSep + +uuidSep :: Text +uuidSep = "," + +{- A request for other git-annex clients to send presence. -} +presenceQuery :: Presence +presenceQuery = gitAnnexPresence $ gitAnnexTag queryAttr T.empty + +{- A notification about a stage of pairing. -} +pairingNotification :: PairStage -> UUID -> JID -> JID -> Message +pairingNotification pairstage u = gitAnnexMessage $ + gitAnnexTag pairAttr $ encodePairingNotification pairstage u + +encodePairingNotification :: PairStage -> UUID -> Text +encodePairingNotification pairstage u = T.unwords $ map T.pack + [ show pairstage + , fromUUID u + ] + +decodePairingNotification :: Decoder +decodePairingNotification m = parse . words . T.unpack . tagValue + where + parse [stage, u] = PairingNotification + <$> readish stage + <*> (formatJID <$> messageFrom m) + <*> pure (toUUID u) + parse _ = Nothing + +pushMessage :: PushStage -> JID -> JID -> Message +pushMessage = gitAnnexMessage . encode + where + encode (CanPush u shas) = + gitAnnexTag canPushAttr $ T.pack $ unwords $ + fromUUID u : map fromRef shas + encode (PushRequest u) = + gitAnnexTag pushRequestAttr $ T.pack $ fromUUID u + encode (StartingPush u) = + gitAnnexTag startingPushAttr $ T.pack $ fromUUID u + encode (ReceivePackOutput n b) = + gitAnnexTagContent receivePackAttr (val n) $ encodeTagContent b + encode (SendPackOutput n b) = + gitAnnexTagContent sendPackAttr (val n) $ encodeTagContent b + encode (ReceivePackDone code) = + gitAnnexTag receivePackDoneAttr $ val $ encodeExitCode code + val = T.pack . show + +decodeMessage :: Message -> Maybe NetMessage +decodeMessage m = decode =<< gitAnnexTagInfo m + where + decode i = M.lookup (tagAttr i) decoders >>= rundecoder i + rundecoder i d = d m i + decoders = M.fromList $ zip + [ pairAttr + , canPushAttr + , pushRequestAttr + , startingPushAttr + , receivePackAttr + , sendPackAttr + , receivePackDoneAttr + ] + [ decodePairingNotification + , pushdecoder $ shasgen CanPush + , pushdecoder $ gen PushRequest + , pushdecoder $ gen StartingPush + , pushdecoder $ seqgen ReceivePackOutput + , pushdecoder $ seqgen SendPackOutput + , pushdecoder $ + fmap (ReceivePackDone . decodeExitCode) . readish . + T.unpack . tagValue + ] + pushdecoder a m' i = Pushing + <$> (formatJID <$> messageFrom m') + <*> a i + gen c i = c . toUUID <$> headMaybe (words (T.unpack (tagValue i))) + seqgen c i = do + packet <- decodeTagContent $ tagElement i + let seqnum = fromMaybe 0 $ readish $ T.unpack $ tagValue i + return $ c seqnum packet + shasgen c i = do + let (u:shas) = words $ T.unpack $ tagValue i + return $ c (toUUID u) (mapMaybe extractSha shas) + +decodeExitCode :: Int -> ExitCode +decodeExitCode 0 = ExitSuccess +decodeExitCode n = ExitFailure n + +encodeExitCode :: ExitCode -> Int +encodeExitCode ExitSuccess = 0 +encodeExitCode (ExitFailure n) = n + +{- Base 64 encoding a ByteString to use as the content of a tag. -} +encodeTagContent :: ByteString -> [Node] +encodeTagContent b = [NodeContent $ ContentText $ T.pack $ B64.encode $ B.unpack b] + +decodeTagContent :: Element -> Maybe ByteString +decodeTagContent elt = B.pack <$> B64.decode s + where + s = T.unpack $ T.concat $ elementText elt + +{- The JID without the client part. -} +baseJID :: JID -> JID +baseJID j = JID (jidNode j) (jidDomain j) Nothing + +{- An XMPP chat message with an empty body. This should not be displayed + - by clients, but can be used for communications. -} +silentMessage :: Message +silentMessage = (emptyMessage MessageChat) + { messagePayloads = [ emptybody ] } + where + emptybody = Element + { elementName = "body" + , elementAttributes = [] + , elementNodes = [] + } + +{- Add to a presence to mark its client as extended away. -} +extendedAway :: Element +extendedAway = Element "show" [] [NodeContent $ ContentText "xa"] + +{- Add to a presence to give it a negative priority. -} +negativePriority :: Element +negativePriority = Element "priority" [] [NodeContent $ ContentText "-1"] + +pushAttr :: Name +pushAttr = "push" + +queryAttr :: Name +queryAttr = "query" + +pairAttr :: Name +pairAttr = "pair" + +canPushAttr :: Name +canPushAttr = "canpush" + +pushRequestAttr :: Name +pushRequestAttr = "pushrequest" + +startingPushAttr :: Name +startingPushAttr = "startingpush" + +receivePackAttr :: Name +receivePackAttr = "rp" + +sendPackAttr :: Name +sendPackAttr = "sp" + +receivePackDoneAttr :: Name +receivePackDoneAttr = "rpdone" + +shasAttr :: Name +shasAttr = "shas" diff --git a/Assistant/XMPP/Buddies.hs b/Assistant/XMPP/Buddies.hs new file mode 100644 index 000000000..0c466e51c --- /dev/null +++ b/Assistant/XMPP/Buddies.hs @@ -0,0 +1,87 @@ +{- xmpp buddies + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.XMPP.Buddies where + +import Assistant.XMPP +import Common.Annex +import Assistant.Types.Buddies + +import Network.Protocol.XMPP +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Text (Text) +import qualified Data.Text as T + +genBuddyKey :: JID -> BuddyKey +genBuddyKey j = BuddyKey $ formatJID $ baseJID j + +buddyName :: JID -> Text +buddyName j = maybe (T.pack "") strNode (jidNode j) + +ucFirst :: Text -> Text +ucFirst s = let (first, rest) = T.splitAt 1 s + in T.concat [T.toUpper first, rest] + +{- Summary of info about a buddy. + - + - If the buddy has no clients at all anymore, returns Nothing. -} +buddySummary :: [JID] -> Buddy -> Maybe (Text, Bool, Bool, Bool, BuddyKey) +buddySummary pairedwith b = case clients of + ((Client j):_) -> Just (buddyName j, away, canpair, alreadypaired j, genBuddyKey j) + [] -> Nothing + where + away = S.null (buddyPresent b) && S.null (buddyAssistants b) + canpair = not $ S.null (buddyAssistants b) + clients = S.toList $ buddyPresent b `S.union` buddyAway b `S.union` buddyAssistants b + alreadypaired j = baseJID j `elem` pairedwith + +{- Updates the buddies with XMPP presence info. -} +updateBuddies :: Presence -> Buddies -> Buddies +updateBuddies p@(Presence { presenceFrom = Just jid }) = M.alter update key + where + key = genBuddyKey jid + update (Just b) = Just $ applyPresence p b + update Nothing = newBuddy p +updateBuddies _ = id + +{- Creates a new buddy based on XMPP presence info. -} +newBuddy :: Presence -> Maybe Buddy +newBuddy p + | presenceType p == PresenceAvailable = go + | presenceType p == PresenceUnavailable = go + | otherwise = Nothing + where + go = make <$> presenceFrom p + make _jid = applyPresence p $ Buddy + { buddyPresent = S.empty + , buddyAway = S.empty + , buddyAssistants = S.empty + , buddyPairing = False + } + +applyPresence :: Presence -> Buddy -> Buddy +applyPresence p b = fromMaybe b $! go <$> presenceFrom p + where + go jid + | presenceType p == PresenceUnavailable = b + { buddyAway = addto $ buddyAway b + , buddyPresent = removefrom $ buddyPresent b + , buddyAssistants = removefrom $ buddyAssistants b + } + | hasGitAnnexTag p = b + { buddyAssistants = addto $ buddyAssistants b + , buddyAway = removefrom $ buddyAway b } + | presenceType p == PresenceAvailable = b + { buddyPresent = addto $ buddyPresent b + , buddyAway = removefrom $ buddyAway b + } + | otherwise = b + where + client = Client jid + removefrom = S.filter (/= client) + addto = S.insert client diff --git a/Assistant/XMPP/Client.hs b/Assistant/XMPP/Client.hs new file mode 100644 index 000000000..677bb2ff3 --- /dev/null +++ b/Assistant/XMPP/Client.hs @@ -0,0 +1,84 @@ +{- xmpp client support + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.XMPP.Client where + +import Assistant.Common +import Utility.SRV +import Creds + +import Network.Protocol.XMPP +import Network +import Control.Concurrent +import qualified Data.Text as T +import Control.Exception (SomeException) + +{- Everything we need to know to connect to an XMPP server. -} +data XMPPCreds = XMPPCreds + { xmppUsername :: T.Text + , xmppPassword :: T.Text + , xmppHostname :: HostName + , xmppPort :: Int + , xmppJID :: T.Text + } + deriving (Read, Show) + +connectXMPP :: XMPPCreds -> (JID -> XMPP a) -> IO [(HostPort, Either SomeException ())] +connectXMPP c a = case parseJID (xmppJID c) of + Nothing -> error "bad JID" + Just jid -> connectXMPP' jid c a + +{- Do a SRV lookup, but if it fails, fall back to the cached xmppHostname. -} +connectXMPP' :: JID -> XMPPCreds -> (JID -> XMPP a) -> IO [(HostPort, Either SomeException ())] +connectXMPP' jid c a = reverse <$> (handle =<< lookupSRV srvrecord) + where + srvrecord = mkSRVTcp "xmpp-client" $ + T.unpack $ strDomain $ jidDomain jid + serverjid = JID Nothing (jidDomain jid) Nothing + + handle [] = do + let h = xmppHostname c + let p = PortNumber $ fromIntegral $ xmppPort c + r <- run h p $ a jid + return [r] + handle srvs = go [] srvs + + go l [] = return l + go l ((h,p):rest) = do + {- Try each SRV record in turn, until one connects, + - at which point the MVar will be full. -} + mv <- newEmptyMVar + r <- run h p $ do + liftIO $ putMVar mv () + a jid + ifM (isEmptyMVar mv) + ( go (r : l) rest + , return (r : l) + ) + + {- Async exceptions are let through so the XMPP thread can + - be killed. -} + run h p a' = do + r <- tryNonAsync $ + runClientError (Server serverjid h p) jid + (xmppUsername c) (xmppPassword c) (void a') + return ((h, p), r) + +{- XMPP runClient, that throws errors rather than returning an Either -} +runClientError :: Server -> JID -> T.Text -> T.Text -> XMPP a -> IO a +runClientError s j u p x = either (error . show) return =<< runClient s j u p x + +getXMPPCreds :: Annex (Maybe XMPPCreds) +getXMPPCreds = parse <$> readCacheCreds xmppCredsFile + where + parse s = readish =<< s + +setXMPPCreds :: XMPPCreds -> Annex () +setXMPPCreds creds = writeCacheCreds (show creds) xmppCredsFile + +xmppCredsFile :: FilePath +xmppCredsFile = "xmpp" diff --git a/Assistant/XMPP/Git.hs b/Assistant/XMPP/Git.hs new file mode 100644 index 000000000..301aa7185 --- /dev/null +++ b/Assistant/XMPP/Git.hs @@ -0,0 +1,381 @@ +{- git over XMPP + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.XMPP.Git where + +import Assistant.Common +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.XMPP +import Assistant.XMPP.Buddies +import Assistant.DaemonStatus +import Assistant.Alert +import Assistant.MakeRemote +import Assistant.Sync +import qualified Command.Sync +import qualified Annex.Branch +import Annex.UUID +import Logs.UUID +import Annex.TaggedPush +import Annex.CatFile +import Config +import Git +import qualified Git.Branch +import Config.Files +import qualified Types.Remote as Remote +import qualified Remote as Remote +import Remote.List +import Utility.FileMode +import Utility.Shell +import Utility.Env + +import Network.Protocol.XMPP +import qualified Data.Text as T +import System.Posix.Types +import Control.Concurrent +import System.Timeout +import qualified Data.ByteString as B +import qualified Data.Map as M + +{- Largest chunk of data to send in a single XMPP message. -} +chunkSize :: Int +chunkSize = 4096 + +{- How long to wait for an expected message before assuming the other side + - has gone away and canceling a push. + - + - This needs to be long enough to allow a message of up to 2+ times + - chunkSize to propigate up to a XMPP server, perhaps across to another + - server, and back down to us. On the other hand, other XMPP pushes can be + - delayed for running until the timeout is reached, so it should not be + - excessive. + -} +xmppTimeout :: Int +xmppTimeout = 120000000 -- 120 seconds + +finishXMPPPairing :: JID -> UUID -> Assistant () +finishXMPPPairing jid u = void $ alertWhile alert $ + makeXMPPGitRemote buddy (baseJID jid) u + where + buddy = T.unpack $ buddyName jid + alert = pairRequestAcknowledgedAlert buddy Nothing + +gitXMPPLocation :: JID -> String +gitXMPPLocation jid = "xmpp::" ++ T.unpack (formatJID $ baseJID jid) + +makeXMPPGitRemote :: String -> JID -> UUID -> Assistant Bool +makeXMPPGitRemote buddyname jid u = do + remote <- liftAnnex $ addRemote $ + makeGitRemote buddyname $ gitXMPPLocation jid + liftAnnex $ storeUUIDIn (remoteConfig (Remote.repo remote) "uuid") u + liftAnnex $ void remoteListRefresh + remote' <- liftAnnex $ fromMaybe (error "failed to add remote") + <$> Remote.byName (Just buddyname) + syncRemote remote' + return True + +{- Pushes over XMPP, communicating with a specific client. + - Runs an arbitrary IO action to push, which should run git-push with + - an xmpp:: url. + - + - To handle xmpp:: urls, git push will run git-remote-xmpp, which is + - injected into its PATH, and in turn runs git-annex xmppgit. The + - dataflow them becomes: + - + - git push <--> git-annex xmppgit <--> xmppPush <-------> xmpp + - | + - git receive-pack <--> xmppReceivePack <---------------> xmpp + - + - The pipe between git-annex xmppgit and us is set up and communicated + - using two environment variables, relayIn and relayOut, that are set + - to the file descriptors to use. Another, relayControl, is used to + - propigate the exit status of git receive-pack. + - + - We listen at the other end of the pipe and relay to and from XMPP. + -} +xmppPush :: ClientID -> (Git.Repo -> IO Bool) -> Assistant Bool +xmppPush cid gitpush = do + u <- liftAnnex getUUID + sendNetMessage $ Pushing cid (StartingPush u) + + (Fd inf, writepush) <- liftIO createPipe + (readpush, Fd outf) <- liftIO createPipe + (Fd controlf, writecontrol) <- liftIO createPipe + + tmpdir <- gettmpdir + installwrapper tmpdir + + environ <- liftIO getEnvironment + path <- liftIO getSearchPath + let myenviron = addEntries + [ ("PATH", intercalate [searchPathSeparator] $ tmpdir:path) + , (relayIn, show inf) + , (relayOut, show outf) + , (relayControl, show controlf) + ] + environ + + inh <- liftIO $ fdToHandle readpush + outh <- liftIO $ fdToHandle writepush + controlh <- liftIO $ fdToHandle writecontrol + + t1 <- forkIO <~> toxmpp 0 inh + t2 <- forkIO <~> fromxmpp outh controlh + + {- This can take a long time to run, so avoid running it in the + - Annex monad. Also, override environment. -} + g <- liftAnnex gitRepo + r <- liftIO $ gitpush $ g { gitEnv = Just myenviron } + + liftIO $ do + mapM_ killThread [t1, t2] + mapM_ hClose [inh, outh, controlh] + mapM_ closeFd [Fd inf, Fd outf, Fd controlf] + + return r + where + toxmpp seqnum inh = do + b <- liftIO $ B.hGetSome inh chunkSize + if B.null b + then liftIO $ killThread =<< myThreadId + else do + let seqnum' = succ seqnum + sendNetMessage $ Pushing cid $ + SendPackOutput seqnum' b + toxmpp seqnum' inh + + fromxmpp outh controlh = withPushMessagesInSequence cid SendPack handle + where + handle (Just (Pushing _ (ReceivePackOutput _ b))) = + liftIO $ writeChunk outh b + handle (Just (Pushing _ (ReceivePackDone exitcode))) = + liftIO $ do + hPrint controlh exitcode + hFlush controlh + handle (Just _) = noop + handle Nothing = do + debug ["timeout waiting for git receive-pack output via XMPP"] + -- Send a synthetic exit code to git-annex + -- xmppgit, which will exit and cause git push + -- to die. + liftIO $ do + hPrint controlh (ExitFailure 1) + hFlush controlh + killThread =<< myThreadId + + installwrapper tmpdir = liftIO $ do + createDirectoryIfMissing True tmpdir + let wrapper = tmpdir "git-remote-xmpp" + program <- readProgramFile + writeFile wrapper $ unlines + [ shebang_local + , "exec " ++ program ++ " xmppgit" + ] + modifyFileMode wrapper $ addModes executeModes + + {- Use GIT_ANNEX_TMP_DIR if set, since that may be a better temp + - dir (ie, not on a crippled filesystem where we can't make + - the wrapper executable). -} + gettmpdir = do + v <- liftIO $ getEnv "GIT_ANNEX_TMP_DIR" + case v of + Nothing -> do + tmp <- liftAnnex $ fromRepo gitAnnexTmpMiscDir + return $ tmp "xmppgit" + Just d -> return $ d "xmppgit" + +type EnvVar = String + +envVar :: String -> EnvVar +envVar s = "GIT_ANNEX_XMPPGIT_" ++ s + +relayIn :: EnvVar +relayIn = envVar "IN" + +relayOut :: EnvVar +relayOut = envVar "OUT" + +relayControl :: EnvVar +relayControl = envVar "CONTROL" + +relayHandle :: EnvVar -> IO Handle +relayHandle var = do + v <- getEnv var + case readish =<< v of + Nothing -> error $ var ++ " not set" + Just n -> fdToHandle $ Fd n + +{- Called by git-annex xmppgit. + - + - git-push is talking to us on stdin + - we're talking to git-push on stdout + - git-receive-pack is talking to us on relayIn (via XMPP) + - we're talking to git-receive-pack on relayOut (via XMPP) + - git-receive-pack's exit code will be passed to us on relayControl + -} +xmppGitRelay :: IO () +xmppGitRelay = do + flip relay stdout =<< relayHandle relayIn + relay stdin =<< relayHandle relayOut + code <- hGetLine =<< relayHandle relayControl + exitWith $ fromMaybe (ExitFailure 1) $ readish code + where + {- Is it possible to set up pipes and not need to copy the data + - ourselves? See splice(2) -} + relay fromh toh = void $ forkIO $ forever $ do + b <- B.hGetSome fromh chunkSize + when (B.null b) $ do + hClose fromh + hClose toh + killThread =<< myThreadId + writeChunk toh b + +{- Relays git receive-pack stdin and stdout via XMPP, as well as propigating + - its exit status to XMPP. -} +xmppReceivePack :: ClientID -> Assistant Bool +xmppReceivePack cid = do + repodir <- liftAnnex $ fromRepo repoPath + let p = (proc "git" ["receive-pack", repodir]) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + (Just inh, Just outh, _, pid) <- liftIO $ createProcess p + readertid <- forkIO <~> relayfromxmpp inh + relaytoxmpp 0 outh + code <- liftIO $ waitForProcess pid + void $ sendNetMessage $ Pushing cid $ ReceivePackDone code + liftIO $ do + killThread readertid + hClose inh + hClose outh + return $ code == ExitSuccess + where + relaytoxmpp seqnum outh = do + b <- liftIO $ B.hGetSome outh chunkSize + -- empty is EOF, so exit + unless (B.null b) $ do + let seqnum' = succ seqnum + sendNetMessage $ Pushing cid $ ReceivePackOutput seqnum' b + relaytoxmpp seqnum' outh + relayfromxmpp inh = withPushMessagesInSequence cid ReceivePack handle + where + handle (Just (Pushing _ (SendPackOutput _ b))) = + liftIO $ writeChunk inh b + handle (Just _) = noop + handle Nothing = do + debug ["timeout waiting for git send-pack output via XMPP"] + -- closing the handle will make git receive-pack exit + liftIO $ do + hClose inh + killThread =<< myThreadId + +xmppRemotes :: ClientID -> UUID -> Assistant [Remote] +xmppRemotes cid theiruuid = case baseJID <$> parseJID cid of + Nothing -> return [] + Just jid -> do + let loc = gitXMPPLocation jid + um <- liftAnnex uuidMap + filter (matching loc . Remote.repo) . filter (knownuuid um) . syncGitRemotes + <$> getDaemonStatus + where + matching loc r = repoIsUrl r && repoLocation r == loc + knownuuid um r = Remote.uuid r == theiruuid || M.member theiruuid um + +{- Returns the ClientID that it pushed to. -} +runPush :: (Remote -> Assistant ()) -> NetMessage -> Assistant (Maybe ClientID) +runPush checkcloudrepos (Pushing cid (PushRequest theiruuid)) = + go =<< liftAnnex (inRepo Git.Branch.current) + where + go Nothing = return Nothing + go (Just branch) = do + rs <- xmppRemotes cid theiruuid + liftAnnex $ Annex.Branch.commit "update" + (g, u) <- liftAnnex $ (,) + <$> gitRepo + <*> getUUID + liftIO $ Command.Sync.updateBranch (Command.Sync.syncBranch branch) g + selfjid <- ((T.unpack <$>) . xmppClientID) <$> getDaemonStatus + if null rs + then return Nothing + else do + forM_ rs $ \r -> do + void $ alertWhile (syncAlert [r]) $ + xmppPush cid (taggedPush u selfjid branch r) + checkcloudrepos r + return $ Just cid +runPush checkcloudrepos (Pushing cid (StartingPush theiruuid)) = do + rs <- xmppRemotes cid theiruuid + if null rs + then return Nothing + else do + void $ alertWhile (syncAlert rs) $ + xmppReceivePack cid + mapM_ checkcloudrepos rs + return $ Just cid +runPush _ _ = return Nothing + +{- Check if any of the shas that can be pushed are ones we do not + - have. + - + - (Older clients send no shas, so when there are none, always + - request a push.) + -} +handlePushNotice :: NetMessage -> Assistant () +handlePushNotice (Pushing cid (CanPush theiruuid shas)) = + unlessM (null <$> xmppRemotes cid theiruuid) $ + if null shas + then go + else ifM (haveall shas) + ( debug ["ignoring CanPush with known shas"] + , go + ) + where + go = do + u <- liftAnnex getUUID + sendNetMessage $ Pushing cid (PushRequest u) + haveall l = liftAnnex $ not <$> anyM donthave l + donthave sha = isNothing <$> catObjectDetails sha +handlePushNotice _ = noop + +writeChunk :: Handle -> B.ByteString -> IO () +writeChunk h b = do + B.hPut h b + hFlush h + +{- Gets NetMessages for a PushSide, ensures they are in order, + - and runs an action to handle each in turn. The action will be passed + - Nothing on timeout. + - + - Does not currently reorder messages, but does ensure that any + - duplicate messages, or messages not in the sequence, are discarded. + -} +withPushMessagesInSequence :: ClientID -> PushSide -> (Maybe NetMessage -> Assistant ()) -> Assistant () +withPushMessagesInSequence cid side a = loop 0 + where + loop seqnum = do + m <- timeout xmppTimeout <~> waitInbox cid side + let go s = a m >> loop s + let next = seqnum + 1 + case extractSequence =<< m of + Just seqnum' + | seqnum' == next -> go next + | seqnum' == 0 -> go seqnum + | seqnum' == seqnum -> do + debug ["ignoring duplicate sequence number", show seqnum] + loop seqnum + | otherwise -> do + debug ["ignoring out of order sequence number", show seqnum', "expected", show next] + loop seqnum + Nothing -> go seqnum + +extractSequence :: NetMessage -> Maybe Int +extractSequence (Pushing _ (ReceivePackOutput seqnum _)) = Just seqnum +extractSequence (Pushing _ (SendPackOutput seqnum _)) = Just seqnum +extractSequence _ = Nothing diff --git a/Backend.hs b/Backend.hs new file mode 100644 index 000000000..dded0d005 --- /dev/null +++ b/Backend.hs @@ -0,0 +1,122 @@ +{- git-annex key/value backends + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend ( + list, + orderedList, + genKey, + lookupFile, + getBackend, + isAnnexLink, + chooseBackend, + lookupBackendName, + maybeLookupBackendName +) where + +import Common.Annex +import qualified Annex +import Annex.CheckAttr +import Annex.CatFile +import Annex.Link +import Types.Key +import Types.KeySource +import qualified Types.Backend as B +import Config + +-- When adding a new backend, import it here and add it to the list. +import qualified Backend.Hash +import qualified Backend.WORM +import qualified Backend.URL + +list :: [Backend] +list = Backend.Hash.backends ++ Backend.WORM.backends ++ Backend.URL.backends + +{- List of backends in the order to try them when storing a new key. -} +orderedList :: Annex [Backend] +orderedList = do + l <- Annex.getState Annex.backends -- list is cached here + if not $ null l + then return l + else do + f <- Annex.getState Annex.forcebackend + case f of + Just name | not (null name) -> + return [lookupBackendName name] + _ -> do + l' <- gen . annexBackends <$> Annex.getGitConfig + Annex.changeState $ \s -> s { Annex.backends = l' } + return l' + where + gen [] = list + gen l = map lookupBackendName l + +{- Generates a key for a file, trying each backend in turn until one + - accepts it. -} +genKey :: KeySource -> Maybe Backend -> Annex (Maybe (Key, Backend)) +genKey source trybackend = do + bs <- orderedList + let bs' = maybe bs (: bs) trybackend + genKey' bs' source +genKey' :: [Backend] -> KeySource -> Annex (Maybe (Key, Backend)) +genKey' [] _ = return Nothing +genKey' (b:bs) source = do + r <- B.getKey b source + case r of + Nothing -> genKey' bs source + Just k -> return $ Just (makesane k, b) + where + -- keyNames should not contain newline characters. + makesane k = k { keyName = map fixbadchar (keyName k) } + fixbadchar c + | c == '\n' = '_' + | otherwise = c + +{- Looks up the key corresponding to an annexed file, + - by examining what the file links to. + - + - In direct mode, there is often no link on disk, in which case + - the symlink is looked up in git instead. However, a real link + - on disk still takes precedence over what was committed to git in direct + - mode. + -} +lookupFile :: FilePath -> Annex (Maybe Key) +lookupFile file = do + mkey <- isAnnexLink file + case mkey of + Just key -> makeret key + Nothing -> ifM isDirect + ( maybe (return Nothing) makeret =<< catKeyFile file + , return Nothing + ) + where + makeret k = return $ Just k + +getBackend :: FilePath -> Key -> Annex (Maybe Backend) +getBackend file k = let bname = keyBackendName k in + case maybeLookupBackendName bname of + Just backend -> return $ Just backend + Nothing -> do + warning $ "skipping " ++ file ++ " (unknown backend " ++ bname ++ ")" + return Nothing + +{- Looks up the backend that should be used for a file. + - That can be configured on a per-file basis in the gitattributes file. -} +chooseBackend :: FilePath -> Annex (Maybe Backend) +chooseBackend f = Annex.getState Annex.forcebackend >>= go + where + go Nothing = maybeLookupBackendName <$> checkAttr "annex.backend" f + go (Just _) = Just . Prelude.head <$> orderedList + +{- Looks up a backend by name. May fail if unknown. -} +lookupBackendName :: String -> Backend +lookupBackendName s = fromMaybe unknown $ maybeLookupBackendName s + where + unknown = error $ "unknown backend " ++ s +maybeLookupBackendName :: String -> Maybe Backend +maybeLookupBackendName s = headMaybe matches + where + matches = filter (\b -> s == B.name b) list diff --git a/Backend/Hash.hs b/Backend/Hash.hs new file mode 100644 index 000000000..3ff496271 --- /dev/null +++ b/Backend/Hash.hs @@ -0,0 +1,177 @@ +{- git-annex hashing backends + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Backend.Hash (backends) where + +import Common.Annex +import qualified Annex +import Types.Backend +import Types.Key +import Types.KeySource +import Utility.Hash +import Utility.ExternalSHA + +import qualified Build.SysConfig as SysConfig +import qualified Data.ByteString.Lazy as L +import Data.Char + +data Hash = SHAHash HashSize | SkeinHash HashSize +type HashSize = Int + +{- Order is slightly significant; want SHA256 first, and more general + - sizes earlier. -} +hashes :: [Hash] +hashes = concat + [ map SHAHash [256, 1, 512, 224, 384] +#ifdef WITH_CRYPTOHASH + , map SkeinHash [256, 512] +#endif + ] + +{- The SHA256E backend is the default, so genBackendE comes first. -} +backends :: [Backend] +backends = catMaybes $ map genBackendE hashes ++ map genBackend hashes + +genBackend :: Hash -> Maybe Backend +genBackend hash = Just Backend + { name = hashName hash + , getKey = keyValue hash + , fsckKey = Just $ checkKeyChecksum hash + , canUpgradeKey = Just needsUpgrade + , fastMigrate = Just trivialMigrate + } + +genBackendE :: Hash -> Maybe Backend +genBackendE hash = do + b <- genBackend hash + return $ b + { name = hashNameE hash + , getKey = keyValueE hash + } + +hashName :: Hash -> String +hashName (SHAHash size) = "SHA" ++ show size +hashName (SkeinHash size) = "SKEIN" ++ show size + +hashNameE :: Hash -> String +hashNameE hash = hashName hash ++ "E" + +{- A key is a hash of its contents. -} +keyValue :: Hash -> KeySource -> Annex (Maybe Key) +keyValue hash source = do + let file = contentLocation source + stat <- liftIO $ getFileStatus file + let filesize = fromIntegral $ fileSize stat + s <- hashFile hash file filesize + return $ Just $ stubKey + { keyName = s + , keyBackendName = hashName hash + , keySize = Just filesize + } + +{- Extension preserving keys. -} +keyValueE :: Hash -> KeySource -> Annex (Maybe Key) +keyValueE hash source = keyValue hash source >>= maybe (return Nothing) addE + where + addE k = return $ Just $ k + { keyName = keyName k ++ selectExtension (keyFilename source) + , keyBackendName = hashNameE hash + } + +selectExtension :: FilePath -> String +selectExtension f + | null es = "" + | otherwise = intercalate "." ("":es) + where + es = filter (not . null) $ reverse $ + take 2 $ takeWhile shortenough $ + reverse $ split "." $ filter validExtension $ takeExtensions f + shortenough e = length e <= 4 -- long enough for "jpeg" + +{- A key's checksum is checked during fsck. -} +checkKeyChecksum :: Hash -> Key -> FilePath -> Annex Bool +checkKeyChecksum hash key file = do + fast <- Annex.getState Annex.fast + mstat <- liftIO $ catchMaybeIO $ getFileStatus file + case (mstat, fast) of + (Just stat, False) -> do + let filesize = fromIntegral $ fileSize stat + showSideAction "checksum" + check <$> hashFile hash file filesize + _ -> return True + where + expected = keyHash key + check s + | s == expected = True + {- A bug caused checksums to be prefixed with \ in some + - cases; still accept these as legal now that the bug has been + - fixed. -} + | '\\' : s == expected = True + | otherwise = False + +keyHash :: Key -> String +keyHash key = dropExtensions (keyName key) + +validExtension :: Char -> Bool +validExtension c + | isAlphaNum c = True + | c == '.' = True + | otherwise = False + +{- Upgrade keys that have the \ prefix on their sha due to a bug, or + - that contain non-alphanumeric characters in their extension. -} +needsUpgrade :: Key -> Bool +needsUpgrade key = "\\" `isPrefixOf` keyHash key || + any (not . validExtension) (takeExtensions $ keyName key) + +{- Fast migration from hashE to hash backend. (Optimisation) -} +trivialMigrate :: Key -> Backend -> Maybe Key +trivialMigrate oldkey newbackend + | keyBackendName oldkey == name newbackend ++ "E" = Just $ oldkey + { keyName = keyHash oldkey + , keyBackendName = name newbackend + } + | otherwise = Nothing + +hashFile :: Hash -> FilePath -> Integer -> Annex String +hashFile hash file filesize = liftIO $ go hash + where + go (SHAHash hashsize) = case shaHasher hashsize filesize of + Left sha -> sha <$> L.readFile file + Right command -> + either error return + =<< externalSHA command hashsize file + go (SkeinHash hashsize) = skeinHasher hashsize <$> L.readFile file + +shaHasher :: HashSize -> Integer -> Either (L.ByteString -> String) String +shaHasher hashsize filesize + | hashsize == 1 = use SysConfig.sha1 sha1 + | hashsize == 256 = use SysConfig.sha256 sha256 + | hashsize == 224 = use SysConfig.sha224 sha224 + | hashsize == 384 = use SysConfig.sha384 sha384 + | hashsize == 512 = use SysConfig.sha512 sha512 + | otherwise = error $ "unsupported sha size " ++ show hashsize + where + use Nothing hasher = Left $ show . hasher + use (Just c) hasher + {- Use builtin, but slightly slower hashing for + - smallish files. Cryptohash benchmarks 90 to 101% + - faster than external hashers, depending on the hash + - and system. So there is no point forking an external + - process unless the file is large. -} + | filesize < 1048576 = use Nothing hasher + | otherwise = Right c + +skeinHasher :: HashSize -> (L.ByteString -> String) +skeinHasher hashsize +#ifdef WITH_CRYPTOHASH + | hashsize == 256 = show . skein256 + | hashsize == 512 = show . skein512 +#endif + | otherwise = error $ "unsupported skein size " ++ show hashsize diff --git a/Backend/URL.hs b/Backend/URL.hs new file mode 100644 index 000000000..4233c56bc --- /dev/null +++ b/Backend/URL.hs @@ -0,0 +1,38 @@ +{- git-annex "URL" backend -- keys whose content is available from urls. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.URL ( + backends, + fromUrl +) where + +import Common.Annex +import Types.Backend +import Types.Key +import Backend.Utilities + +backends :: [Backend] +backends = [backend] + +backend :: Backend +backend = Backend + { name = "URL" + , getKey = const $ return Nothing + , fsckKey = Nothing + , canUpgradeKey = Nothing + , fastMigrate = Nothing + } + +{- Every unique url has a corresponding key. -} +fromUrl :: String -> Maybe Integer -> Annex Key +fromUrl url size = do + n <- genKeyName url + return $ stubKey + { keyName = n + , keyBackendName = "URL" + , keySize = size + } diff --git a/Backend/Utilities.hs b/Backend/Utilities.hs new file mode 100644 index 000000000..24dbfd6d9 --- /dev/null +++ b/Backend/Utilities.hs @@ -0,0 +1,25 @@ +{- git-annex backend utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.Utilities where + +import Data.Hash.MD5 + +import Common.Annex + +{- Generates a keyName from an input string. Takes care of sanitizing it. + - If it's not too long, the full string is used as the keyName. + - Otherwise, it's truncated at half the filename length limit, and its + - md5 is prepended to ensure a unique key. -} +genKeyName :: String -> Annex String +genKeyName s = do + limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir + let s' = preSanitizeKeyName s + let truncs = truncateFilePath (limit `div` 2) s' + return $ if s' == truncs + then s' + else truncs ++ "-" ++ md5s (Str s) diff --git a/Backend/WORM.hs b/Backend/WORM.hs new file mode 100644 index 000000000..cc7123850 --- /dev/null +++ b/Backend/WORM.hs @@ -0,0 +1,44 @@ +{- git-annex "WORM" backend -- Write Once, Read Many + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.WORM (backends) where + +import Common.Annex +import Types.Backend +import Types.Key +import Types.KeySource +import Backend.Utilities + +backends :: [Backend] +backends = [backend] + +backend :: Backend +backend = Backend + { name = "WORM" + , getKey = keyValue + , fsckKey = Nothing + , canUpgradeKey = Nothing + , fastMigrate = Nothing + } + +{- The key includes the file size, modification time, and the + - basename of the filename. + - + - That allows multiple files with the same names to have different keys, + - while also allowing a file to be moved around while retaining the + - same key. + -} +keyValue :: KeySource -> Annex (Maybe Key) +keyValue source = do + stat <- liftIO $ getFileStatus $ contentLocation source + n <- genKeyName $ keyFilename source + return $ Just Key + { keyName = n + , keyBackendName = name backend + , keySize = Just $ fromIntegral $ fileSize stat + , keyMtime = Just $ modificationTime stat + } diff --git a/Build/BuildVersion.hs b/Build/BuildVersion.hs new file mode 100644 index 000000000..0093f5b5b --- /dev/null +++ b/Build/BuildVersion.hs @@ -0,0 +1,6 @@ +{- Outputs the version of git-annex that was built, for use by + - autobuilders. Note that this includes the git rev. -} + +import Build.Version + +main = putStr =<< getVersion diff --git a/Build/BundledPrograms.hs b/Build/BundledPrograms.hs new file mode 100644 index 000000000..dd78994b0 --- /dev/null +++ b/Build/BundledPrograms.hs @@ -0,0 +1,73 @@ +{- Bundled programs + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Build.BundledPrograms where + +import Data.Maybe + +import Build.SysConfig as SysConfig + +{- Programs that git-annex uses, to include in the bundle. + - + - These may be just the command name, or the full path to it. -} +bundledPrograms :: [FilePath] +bundledPrograms = catMaybes + [ Nothing +#ifndef mingw32_HOST_OS + -- git is not included in the windows bundle + , Just "git" + -- Not strictly needed in PATH by git-annex, but called + -- by git when it sshes to a remote. + , Just "git-upload-pack" + , Just "git-receive-pack" + , Just "git-shell" +#endif + , Just "cp" +#ifndef mingw32_HOST_OS + -- using xargs on windows led to problems, so it's not used there + , Just "xargs" +#endif + , Just "rsync" +#ifndef darwin_HOST_OS + -- OS X has ssh installed by default. + -- (Linux probably, but not guaranteed.) + , Just "ssh" + , Just "ssh-keygen" +#endif +#ifndef mingw32_HOST_OS + , Just "sh" +#endif + , SysConfig.gpg + , ifset SysConfig.curl "curl" +#ifndef darwin_HOST_OS + -- wget on OSX has been problimatic, looking for certs in the wrong + -- places. Don't ship it, use curl or the OSX's own wget if it has + -- one. + , ifset SysConfig.wget "wget" +#endif + , ifset SysConfig.bup "bup" + , SysConfig.lsof + , SysConfig.gcrypt + , SysConfig.sha1 + , SysConfig.sha256 + , SysConfig.sha512 + , SysConfig.sha224 + , SysConfig.sha384 +#ifdef linux_HOST_OS + -- used to unpack the tarball when upgrading + , Just "gunzip" + , Just "tar" +#endif + -- nice, ionice, and nocache are not included in the bundle; + -- we rely on the system's own version, which may better match + -- its kernel, and avoid using them if not available. + ] + where + ifset True s = Just s + ifset False _ = Nothing diff --git a/Build/Configure.hs b/Build/Configure.hs new file mode 100644 index 000000000..d5176bdf5 --- /dev/null +++ b/Build/Configure.hs @@ -0,0 +1,133 @@ +{- Checks system configuration and generates SysConfig.hs. -} + +module Build.Configure where + +import System.Directory +import Control.Applicative +import System.Environment (getArgs) +import Control.Monad.IfElse +import Control.Monad + +import Build.TestConfig +import Build.Version +import Utility.SafeCommand +import Utility.ExternalSHA +import Utility.Env +import qualified Git.Version + +tests :: [TestCase] +tests = + [ TestCase "version" (Config "packageversion" . StringConfig <$> getVersion) + , TestCase "UPGRADE_LOCATION" getUpgradeLocation + , TestCase "git" $ requireCmd "git" "git --version >/dev/null" + , TestCase "git version" getGitVersion + , testCp "cp_a" "-a" + , testCp "cp_p" "-p" + , testCp "cp_reflink_auto" "--reflink=auto" + , TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 /dev/null" + , TestCase "curl" $ testCmd "curl" "curl --version >/dev/null" + , TestCase "wget" $ testCmd "wget" "wget --version >/dev/null" + , TestCase "bup" $ testCmd "bup" "bup --version >/dev/null" + , TestCase "nice" $ testCmd "nice" "nice true >/dev/null" + , TestCase "ionice" $ testCmd "ionice" "ionice -c3 true >/dev/null" + , TestCase "nocache" $ testCmd "nocache" "nocache true >/dev/null" + , TestCase "gpg" $ maybeSelectCmd "gpg" + [ ("gpg", "--version >/dev/null") + , ("gpg2", "--version >/dev/null") ] + , TestCase "lsof" $ findCmdPath "lsof" "lsof" + , TestCase "git-remote-gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt" + , TestCase "ssh connection caching" getSshConnectionCaching + ] ++ shaTestCases + [ (1, "da39a3ee5e6b4b0d3255bfef95601890afd80709") + , (256, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") + , (512, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e") + , (224, "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f") + , (384, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b") + ] + +{- shaNsum are the program names used by coreutils. Some systems + - install these with 'g' prefixes. + - + - On some systems, shaN is used instead, but on other + - systems, it might be "hashalot", which does not produce + - usable checksums. Only accept programs that produce + - known-good hashes when run on files. -} +shaTestCases :: [(Int, String)] -> [TestCase] +shaTestCases l = map make l + where + make (n, knowngood) = TestCase key $ + Config key . MaybeStringConfig <$> search (shacmds n) + where + key = "sha" ++ show n + search [] = return Nothing + search (c:cmds) = do + sha <- externalSHA c n "/dev/null" + if sha == Right knowngood + then return $ Just c + else search cmds + + shacmds n = concatMap (\x -> [x, 'g':x]) $ + map (\x -> "sha" ++ show n ++ x) ["sum", ""] + +tmpDir :: String +tmpDir = "tmp" + +testFile :: String +testFile = tmpDir ++ "/testfile" + +testCp :: ConfigKey -> String -> TestCase +testCp k option = TestCase cmd $ testCmd k cmdline + where + cmd = "cp " ++ option + cmdline = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new" + +getUpgradeLocation :: Test +getUpgradeLocation = do + e <- getEnv "UPGRADE_LOCATION" + return $ Config "upgradelocation" $ MaybeStringConfig e + +getGitVersion :: Test +getGitVersion = do + v <- Git.Version.installed + let oldestallowed = Git.Version.normalize "1.7.1.0" + when (v < oldestallowed) $ + error $ "installed git version " ++ show v ++ " is too old! (Need " ++ show oldestallowed ++ " or newer)" + return $ Config "gitversion" $ StringConfig $ show v + +getSshConnectionCaching :: Test +getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$> + boolSystem "sh" [Param "-c", Param "ssh -o ControlPersist=yes -V >/dev/null 2>/dev/null"] + +setup :: IO () +setup = do + createDirectoryIfMissing True tmpDir + writeFile testFile "test file contents" + +cleanup :: IO () +cleanup = removeDirectoryRecursive tmpDir + +run :: [TestCase] -> IO () +run ts = do + args <- getArgs + setup + config <- runTests ts + if args == ["Android"] + then writeSysConfig $ androidConfig config + else writeSysConfig config + cleanup + whenM isReleaseBuild $ + cabalSetup "git-annex.cabal" + +{- Hard codes some settings to cross-compile for Android. -} +androidConfig :: [Config] -> [Config] +androidConfig c = overrides ++ filter (not . overridden) c + where + overrides = + [ Config "cp_reflink_auto" $ BoolConfig False + , Config "curl" $ BoolConfig False + , Config "sha224" $ MaybeStringConfig Nothing + , Config "sha384" $ MaybeStringConfig Nothing + ] + overridden (Config k _) = k `elem` overridekeys + overridekeys = map (\(Config k _) -> k) overrides diff --git a/Build/DesktopFile.hs b/Build/DesktopFile.hs new file mode 100644 index 000000000..6a5838f81 --- /dev/null +++ b/Build/DesktopFile.hs @@ -0,0 +1,80 @@ +{- Generating and installing a desktop menu entry file and icon, + - and a desktop autostart file. (And OSX equivilants.) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Build.DesktopFile where + +import Utility.Exception +import Utility.FreeDesktop +import Utility.Path +import Utility.Monad +import Config.Files +import Utility.OSX +import Assistant.Install.AutoStart +import Assistant.Install.Menu + +import Control.Applicative +import System.Directory +import System.Environment +#ifndef mingw32_HOST_OS +import System.Posix.User +#endif +import Data.Maybe + +systemwideInstall :: IO Bool +#ifndef mingw32_HOST_OS +systemwideInstall = isroot <||> destdirset + where + isroot = do + uid <- fromIntegral <$> getRealUserID + return $ uid == (0 :: Int) + destdirset = isJust <$> catchMaybeIO (getEnv "DESTDIR") +#else +systemwideInstall = return False +#endif + +inDestDir :: FilePath -> IO FilePath +inDestDir f = do + destdir <- catchDefaultIO "" (getEnv "DESTDIR") + return $ destdir ++ "/" ++ f + +writeFDODesktop :: FilePath -> IO () +writeFDODesktop command = do + systemwide <- systemwideInstall + + datadir <- if systemwide then return systemDataDir else userDataDir + menufile <- inDestDir (desktopMenuFilePath "git-annex" datadir) + icondir <- inDestDir (iconDir datadir) + installMenu command menufile "doc" icondir + + configdir <- if systemwide then return systemConfigDir else userConfigDir + installAutoStart command + =<< inDestDir (autoStartPath "git-annex" configdir) + +writeOSXDesktop :: FilePath -> IO () +writeOSXDesktop command = do + installAutoStart command =<< inDestDir =<< ifM systemwideInstall + ( return $ systemAutoStart osxAutoStartLabel + , userAutoStart osxAutoStartLabel + ) + +install :: FilePath -> IO () +install command = do +#ifdef darwin_HOST_OS + writeOSXDesktop command +#else + writeFDODesktop command +#endif + ifM systemwideInstall + ( return () + , do + programfile <- inDestDir =<< programFile + createDirectoryIfMissing True (parentDir programfile) + writeFile programfile command + ) diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs new file mode 100644 index 000000000..3899f0858 --- /dev/null +++ b/Build/DistributionUpdate.hs @@ -0,0 +1,167 @@ +{- Downloads git-annex autobuilds and installs them into the git-annex + - repository in ~/lib/downloads that is used to distribute git-annex + - releases. + - + - Generates info files, containing the version (of the corresponding file + - from the autobuild). + - + - Also gpg signs the files. + -} + +import Common.Annex +import Types.Distribution +import Build.Version +import Utility.UserInfo +import Utility.Url +import qualified Git.Construct +import qualified Annex +import Annex.Content +import Backend +import Git.Command + +import Data.Default +import Data.Time.Clock +import Data.Char + +-- git-annex distribution signing key (for Joey Hess) +signingKey :: String +signingKey = "89C809CB" + +-- URL to an autobuilt git-annex file, and the place to install +-- it in the repository. +autobuilds :: [(URLString, FilePath)] +autobuilds = + (map linuxarch ["i386", "amd64", "armel"]) ++ + (map androidversion ["4.0", "4.3"]) ++ + [ (autobuild "x86_64-apple-mavericks/git-annex.dmg", "git-annex/OSX/current/10.9_Mavericks/git-annex.dmg") + , (autobuild "windows/git-annex-installer.exe", "git-annex/windows/current/git-annex-installer.exe") + ] + where + linuxarch a = + ( autobuild (a ++ "/git-annex-standalone-" ++ a ++ ".tar.gz") + , "git-annex/linux/current/git-annex-standalone-" ++ a ++ ".tar.gz" + ) + androidversion v = + ( autobuild ("android/" ++ v ++ "/git-annex.apk") + , "git-annex/android/current/" ++ v ++ "/git-annex.apk" + ) + autobuild f = "https://downloads.kitenet.net/git-annex/autobuild/" ++ f + +main :: IO () +main = do + repodir <- getRepoDir + updated <- catMaybes <$> mapM (getbuild repodir) autobuilds + state <- Annex.new =<< Git.Construct.fromPath repodir + Annex.eval state (makeinfos updated) + +-- Download a build from the autobuilder, and return its version. +-- It's very important that the version matches the build, otherwise +-- auto-upgrades can loop reatedly. So, check build-version before +-- and after downloading the file. +getbuild :: FilePath -> (URLString, FilePath) -> IO (Maybe (FilePath, Version)) +getbuild repodir (url, f) = do + bv1 <- getbv + let dest = repodir f + let tmp = dest ++ ".tmp" + nukeFile tmp + createDirectoryIfMissing True (parentDir dest) + let oops s = do + nukeFile tmp + putStrLn $ "*** " ++ s + return Nothing + ifM (download url tmp def) + ( do + bv2 <- getbv + case bv2 of + Nothing -> oops $ "no build-version file for " ++ url + (Just v) + | bv2 == bv1 -> do + nukeFile dest + renameFile tmp dest + -- remove git rev part of version + let v' = takeWhile (/= '-') v + return $ Just (f, v') + | otherwise -> oops $ "build version changed while downloading " ++ url ++ " " ++ show (bv1, bv2) + , oops $ "failed to download " ++ url + ) + where + bvurl = takeDirectory url ++ "/build-version" + getbv = do + bv <- catchDefaultIO "" $ readProcess "curl" ["--silent", bvurl] + return $ if null bv || any (not . versionchar) bv then Nothing else Just bv + versionchar c = isAlphaNum c || c == '.' || c == '-' + +makeinfos :: [(FilePath, Version)] -> Annex () +makeinfos updated = do + version <- liftIO getChangelogVersion + void $ inRepo $ runBool + [ Param "commit" + , Param "-a" + , Param "-m" + , Param $ "publishing git-annex " ++ version + ] + basedir <- liftIO getRepoDir + now <- liftIO getCurrentTime + liftIO $ putStrLn $ "building info files in " ++ basedir + forM_ updated $ \(f, bv) -> do + v <- lookupFile (basedir f) + case v of + Nothing -> noop + Just k -> whenM (inAnnex k) $ do + liftIO $ putStrLn f + let infofile = basedir f ++ ".info" + liftIO $ writeFile infofile $ show $ GitAnnexDistribution + { distributionUrl = mkUrl f + , distributionKey = k + , distributionVersion = bv + , distributionReleasedate = now + , distributionUrgentUpgrade = Nothing + } + void $ inRepo $ runBool [Param "add", File infofile] + signFile infofile + signFile (basedir f) + void $ inRepo $ runBool + [ Param "commit" + , Param "-m" + , Param $ "updated info files for git-annex " ++ version + ] + void $ inRepo $ runBool + [ Param "annex" + , Params "move --to website" + ] + void $ inRepo $ runBool + [ Param "annex" + , Params "sync" + ] + + -- Check for out of date info files. + infos <- liftIO $ filter (".info" `isSuffixOf`) + <$> dirContentsRecursive (basedir "git-annex") + ds <- liftIO $ forM infos (readish <$$> readFile) + let dis = zip infos ds + let ood = filter (outofdate version) dis + unless (null ood) $ + error $ "Some info files are out of date: " ++ show (map fst ood) + where + outofdate version (_, md) = case md of + Nothing -> True + Just d -> distributionVersion d /= version + +getRepoDir :: IO FilePath +getRepoDir = do + home <- liftIO myHomeDir + return $ home "lib" "downloads" + +mkUrl :: FilePath -> String +mkUrl f = "https://downloads.kitenet.net/" ++ f + +signFile :: FilePath -> Annex () +signFile f = do + void $ liftIO $ boolSystem "gpg" + [ Param "-a" + , Param $ "--default-key=" ++ signingKey + , Param "--detach-sign" + , File f + ] + liftIO $ rename (f ++ ".asc") (f ++ ".sig") + void $ inRepo $ runBool [Param "add", File (f ++ ".sig")] diff --git a/Build/EvilLinker.hs b/Build/EvilLinker.hs new file mode 100644 index 000000000..cf0f771e5 --- /dev/null +++ b/Build/EvilLinker.hs @@ -0,0 +1,165 @@ +{- Allows linking haskell programs too big for all the files to fit in a + - command line. + - + - See https://ghc.haskell.org/trac/ghc/ticket/8596 + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Data.List.Utils +import Text.Parsec +import Text.Parsec.String +import Control.Applicative ((<$>)) +import Control.Monad +import System.Directory +import Data.Maybe +import Data.List + +import Utility.Monad +import Utility.Process hiding (env) +import Utility.Env + +data CmdParams = CmdParams + { cmd :: String + , opts :: String + , env :: Maybe [(String, String)] + } deriving (Show) + +{- Find where ghc calls gcc to link the executable. -} +parseGhcLink :: Parser CmdParams +parseGhcLink = do + void $ many prelinkline + void linkheaderline + void $ char '"' + gcccmd <- many1 (noneOf "\"") + void $ string "\" " + gccparams <- restOfLine + return $ CmdParams gcccmd (manglepaths gccparams) Nothing + where + linkheaderline = do + void $ string "*** Linker" + restOfLine + prelinkline = do + void $ notFollowedBy linkheaderline + restOfLine + manglepaths = replace "\\" "/" + +{- Find where gcc calls collect2. -} +parseGccLink :: Parser CmdParams +parseGccLink = do + cenv <- collectenv + void $ try $ char ' ' + path <- manyTill anyChar (try $ string collectcmd) + void $ char ' ' + collect2params <- restOfLine + return $ CmdParams (path ++ collectcmd) (escapeDosPaths collect2params) cenv + where + collectcmd = "collect2.exe" + collectgccenv = "COLLECT_GCC" + collectltoenv = "COLLECT_LTO_WRAPPER" + pathenv = "COMPILER_PATH" + libpathenv = "LIBRARY_PATH" + optenv = "COLLECT_GCC_OPTIONS" + collectenv = do + void $ many1 $ do + notFollowedBy $ string collectgccenv + restOfLine + void $ string collectgccenv + void $ char '=' + g <- restOfLine + void $ string collectltoenv + void $ char '=' + lt <- restOfLine + void $ many1 $ do + notFollowedBy $ string pathenv + restOfLine + void $ string pathenv + void $ char '=' + p <- restOfLine + void $ string libpathenv + void $ char '=' + lp <- restOfLine + void $ string optenv + void $ char '=' + o <- restOfLine + return $ Just [(collectgccenv, g), (collectltoenv, lt), (pathenv, p), (libpathenv, lp), (optenv, o)] + +{- Find where collect2 calls ld. -} +parseCollect2 :: Parser CmdParams +parseCollect2 = do + void $ manyTill restOfLine (try versionline) + path <- manyTill anyChar (try $ string ldcmd) + void $ char ' ' + params <- restOfLine + return $ CmdParams (path ++ ldcmd) (skipHack $ escapeDosPaths params) Nothing + where + ldcmd = "ld.exe" + versionline = do + void $ string "collect2 version" + restOfLine + +{- For unknown reasons, asking the linker to link this in fails, + - with error about multiple definitions of a symbol from the library. + - This is a horrible hack. -} +skipHack :: String -> String +skipHack = replace "dist/build/git-annex/git-annex-tmp/Utility/winprocess.o" "" + +{- Input contains something like + - c:/program files/haskell platform/foo -LC:/Program Files/Haskell Platform/ -L... + - and the *right* spaces must be escaped with \ + - + - Argh. + -} +escapeDosPaths :: String -> String +escapeDosPaths = replace "Program Files" "Program\\ Files" + . replace "program files" "program\\ files" + . replace "Haskell Platform" "Haskell\\ Platform" + . replace "haskell platform" "haskell\\ platform" + . replace "Application Data" "Application\\ Data" + . replace "Documents and Settings" "Documents\\ and\\ Settings" + . replace "Files (x86)" "Files\\ (x86)" + . replace "files (x86)" "files\\ (x86)" + +restOfLine :: Parser String +restOfLine = newline `after` many (noneOf "\n") + +getOutput :: String -> [String] -> Maybe [(String, String)] -> IO (String, Bool) +getOutput c ps environ = do + putStrLn $ unwords [c, show ps] + systemenviron <- getEnvironment + let environ' = fromMaybe [] environ ++ systemenviron + out@(_, ok) <- processTranscript' c ps (Just environ') Nothing + putStrLn $ unwords [c, "finished", show ok] + return out + +atFile :: FilePath -> String +atFile f = '@':f + +runAtFile :: Parser CmdParams -> String -> FilePath -> [String] -> IO (String, Bool) +runAtFile p s f extraparams = do + when (null $ opts c) $ + error $ "failed to find any options for " ++ f ++ " in >>>" ++ s ++ "<<<" + writeFile f (opts c) + out <- getOutput (cmd c) (atFile f:extraparams) (env c) + removeFile f + return out + where + c = case parse p "" s of + Left e -> error $ + (show e) ++ + "\n<<<\n" ++ s ++ "\n>>>" + Right r -> r + +main :: IO () +main = do + ghcout <- fst <$> getOutput "cabal" + ["build", "--ghc-options=-v -keep-tmp-files"] Nothing + gccout <- fst <$> runAtFile parseGhcLink ghcout "gcc.opt" ["-v"] + collect2out <- fst <$> runAtFile parseGccLink gccout "collect2.opt" ["-v"] + (out, ok) <- runAtFile parseCollect2 collect2out "ld.opt" [] + unless ok $ + error $ "ld failed:\n" ++ out diff --git a/Build/EvilSplicer.hs b/Build/EvilSplicer.hs new file mode 100644 index 000000000..6b80929af --- /dev/null +++ b/Build/EvilSplicer.hs @@ -0,0 +1,666 @@ +{- Expands template haskell splices + - + - You should probably just use http://hackage.haskell.org/package/zeroth + - instead. I wish I had known about it before writing this. + - + - First, the code must be built with a ghc that supports TH, + - and the splices dumped to a log. For example: + - cabal build --ghc-options=-ddump-splices 2>&1 | tee log + - + - Along with the log, a headers file may also be provided, containing + - additional imports needed by the template haskell code. + - + - This program will parse the log, and expand all splices therein, + - writing files to the specified destdir (which can be "." to modify + - the source tree directly). They can then be built a second + - time, with a ghc that does not support TH. + - + - Note that template haskell code may refer to symbols that are not + - exported by the library that defines the TH code. In this case, + - the library has to be modifed to export those symbols. + - + - There can also be other problems with the generated code; it may + - need modifications to compile. + - + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Text.Parsec +import Text.Parsec.String +import Control.Applicative ((<$>)) +import Data.Either +import Data.List hiding (find) +import Data.String.Utils +import Data.Char +import System.Environment +import System.FilePath +import System.Directory +import System.IO +import Control.Monad +import Prelude hiding (log) + +import Utility.Monad +import Utility.Misc +import Utility.Exception +import Utility.Path +import Utility.FileSystemEncoding + +data Coord = Coord + { coordLine :: Int + , coordColumn :: Int + } + deriving (Read, Show) + +offsetCoord :: Coord -> Coord -> Coord +offsetCoord a b = Coord + (coordLine a - coordLine b) + (coordColumn a - coordColumn b) + +data SpliceType = SpliceExpression | SpliceDeclaration + deriving (Read, Show, Eq) + +data Splice = Splice + { splicedFile :: FilePath + , spliceStart :: Coord + , spliceEnd :: Coord + , splicedExpression :: String + , splicedCode :: String + , spliceType :: SpliceType + } + deriving (Read, Show) + +isExpressionSplice :: Splice -> Bool +isExpressionSplice s = spliceType s == SpliceExpression + +number :: Parser Int +number = read <$> many1 digit + +{- A pair of Coords is written in one of three ways: + - "95:21-73", "1:1", or "(92,25)-(94,2)" + -} +coordsParser :: Parser (Coord, Coord) +coordsParser = (try singleline <|> try weird <|> multiline) "Coords" + where + singleline = do + line <- number + void $ char ':' + startcol <- number + void $ char '-' + endcol <- number + return $ (Coord line startcol, Coord line endcol) + + weird = do + line <- number + void $ char ':' + col <- number + return $ (Coord line col, Coord line col) + + multiline = do + start <- fromparens + void $ char '-' + end <- fromparens + return $ (start, end) + + fromparens = between (char '(') (char ')') $ do + line <- number + void $ char ',' + col <- number + return $ Coord line col + +indent :: Parser String +indent = many1 $ char ' ' + +restOfLine :: Parser String +restOfLine = newline `after` many (noneOf "\n") + +indentedLine :: Parser String +indentedLine = indent >> restOfLine + +spliceParser :: Parser Splice +spliceParser = do + file <- many1 (noneOf ":\n") + void $ char ':' + (start, end) <- coordsParser + void $ string ": Splicing " + splicetype <- tosplicetype + <$> (string "expression" <|> string "declarations") + void newline + + getthline <- expressionextractor + expression <- unlines <$> many1 getthline + + void indent + void $ string "======>" + void newline + + getcodeline <- expressionextractor + realcoords <- try (Right <$> getrealcoords file) <|> (Left <$> getcodeline) + codelines <- many getcodeline + return $ case realcoords of + Left firstcodeline -> + Splice file start end expression + (unlines $ firstcodeline:codelines) + splicetype + Right (realstart, realend) -> + Splice file realstart realend expression + (unlines codelines) + splicetype + where + tosplicetype "declarations" = SpliceDeclaration + tosplicetype "expression" = SpliceExpression + tosplicetype s = error $ "unknown splice type: " ++ s + + {- All lines of the indented expression start with the same + - indent, which is stripped. Any other indentation is preserved. -} + expressionextractor = do + i <- lookAhead indent + return $ try $ do + void $ string i + restOfLine + + {- When splicing declarations, GHC will output a splice + - at 1:1, and then inside the splice code block, + - the first line will give the actual coordinates of the + - line that was spliced. -} + getrealcoords file = do + void indent + void $ string file + void $ char ':' + char '\n' `after` coordsParser + +{- Extracts the splices, ignoring the rest of the compiler output. -} +splicesExtractor :: Parser [Splice] +splicesExtractor = rights <$> many extract + where + extract = try (Right <$> spliceParser) <|> (Left <$> compilerJunkLine) + compilerJunkLine = restOfLine + +{- Modifies the source file, expanding the splices, which all must + - have the same splicedFile. Writes the new file to the destdir. + - + - Each splice's Coords refer to the original position in the file, + - and not to its position after any previous splices may have inserted + - or removed lines. + - + - To deal with this complication, the file is broken into logical lines + - (which can contain any String, including a multiline or empty string). + - Each splice is assumed to be on its own block of lines; two + - splices on the same line is not currently supported. + - This means that a splice can modify the logical lines within its block + - as it likes, without interfering with the Coords of other splices. + - + - As well as expanding splices, this can add a block of imports to the + - file. These are put right before the first line in the file that + - starts with "import " + -} +applySplices :: FilePath -> Maybe String -> [Splice] -> IO () +applySplices _ _ [] = noop +applySplices destdir imports splices@(first:_) = do + let f = splicedFile first + let dest = (destdir f) + lls <- map (++ "\n") . lines <$> readFileStrictAnyEncoding f + createDirectoryIfMissing True (parentDir dest) + let newcontent = concat $ addimports $ expand lls splices + oldcontent <- catchMaybeIO $ readFileStrictAnyEncoding dest + when (oldcontent /= Just newcontent) $ do + putStrLn $ "splicing " ++ f + withFile dest WriteMode $ \h -> do + fileEncoding h + hPutStr h newcontent + hClose h + where + expand lls [] = lls + expand lls (s:rest) + | isExpressionSplice s = expand (expandExpressionSplice s lls) rest + | otherwise = expand (expandDeclarationSplice s lls) rest + + addimports lls = case imports of + Nothing -> lls + Just v -> + let (start, end) = break ("import " `isPrefixOf`) lls + in if null end + then start + else concat + [ start + , [v] + , end + ] + +{- Declaration splices are expanded to replace their whole line. -} +expandDeclarationSplice :: Splice -> [String] -> [String] +expandDeclarationSplice s lls = concat [before, [splice], end] + where + cs = spliceStart s + ce = spliceEnd s + + (before, rest) = splitAt (coordLine cs - 1) lls + (_oldlines, end) = splitAt (1 + coordLine (offsetCoord ce cs)) rest + splice = mangleCode $ splicedCode s + +{- Expression splices are expanded within their line. -} +expandExpressionSplice :: Splice -> [String] -> [String] +expandExpressionSplice sp lls = concat [before, spliced:padding, end] + where + cs = spliceStart sp + ce = spliceEnd sp + + (before, rest) = splitAt (coordLine cs - 1) lls + (oldlines, end) = splitAt (1 + coordLine (offsetCoord ce cs)) rest + (splicestart, padding, spliceend) = case map expandtabs oldlines of + ss:r + | null r -> (ss, [], ss) + | otherwise -> (ss, take (length r) (repeat []), last r) + _ -> ([], [], []) + spliced = concat + [ joinsplice $ deqqstart $ take (coordColumn cs - 1) splicestart + , addindent (findindent splicestart) (mangleCode $ splicedCode sp) + , deqqend $ drop (coordColumn ce) spliceend + ] + + {- coordinates assume tabs are expanded to 8 spaces -} + expandtabs = replace "\t" (take 8 $ repeat ' ') + + {- splicing leaves $() quasiquote behind; remove it -} + deqqstart s = case reverse s of + ('(':'$':restq) -> reverse restq + _ -> s + deqqend (')':s) = s + deqqend s = s + + {- Prepare the code that comes just before the splice so + - the splice will combine with it appropriately. -} + joinsplice s + -- all indentation? Skip it, we'll use the splice's indentation + | all isSpace s = "" + -- function definition needs no preparation + -- ie: foo = $(splice) + | "=" `isSuffixOf` s' = s + -- nor does lambda definition or case expression + | "->" `isSuffixOf` s' = s + -- nor does a let .. in declaration + | "in" `isSuffixOf` s' = s + -- already have a $ to set off the splice + -- ie: foo $ $(splice) + | "$" `isSuffixOf` s' = s + -- need to add a $ to set off the splice + -- ie: bar $(splice) + | otherwise = s ++ " $ " + where + s' = filter (not . isSpace) s + + findindent = length . takeWhile isSpace + addindent n = unlines . map (i ++) . lines + where + i = take n $ repeat ' ' + +{- Tweaks code output by GHC in splices to actually build. Yipes. -} +mangleCode :: String -> String +mangleCode = flip_colon + . remove_unnecessary_type_signatures + . lambdaparenhack + . lambdaparens + . declaration_parens + . case_layout + . case_layout_multiline + . yesod_url_render_hack + . text_builder_hack + . nested_instances + . boxed_fileembed + . collapse_multiline_strings + . remove_package_version + . emptylambda + where + {- Lambdas are often output without parens around them. + - This breaks when the lambda is immediately applied to a + - parameter. + - + - For example: + - + - renderRoute (StaticR sub_a1nUH) + - = \ (a_a1nUI, b_a1nUJ) + - -> (((pack "static") : a_a1nUI), + - b_a1nUJ) + - (renderRoute sub_a1nUH) + - + - There are sometimes many lines of lambda code that need to be + - parenthesised. Approach: find the "->" and scan down the + - column to the first non-whitespace. This is assumed + - to be the expression after the lambda. + - + - Runs recursively on the body of the lambda, to handle nested + - lambdas. + -} + lambdaparens = parsecAndReplace $ do + -- skip lambdas inside tuples or parens + prefix <- noneOf "(, \n" + preindent <- many1 $ oneOf " \n" + void $ string "\\ " + lambdaparams <- restofline + continuedlambdaparams <- many $ try $ do + indent1 <- many1 $ char ' ' + p <- satisfy isLetter + aram <- many $ satisfy isAlphaNum <|> oneOf "_" + void newline + return $ indent1 ++ p:aram ++ "\n" + indent1 <- many1 $ char ' ' + void $ string "-> " + firstline <- restofline + lambdalines <- many $ try $ do + void $ string indent1 + void $ char ' ' + l <- restofline + return $ indent1 ++ " " ++ l + return $ concat + [ prefix:preindent + , "(\\ " ++ lambdaparams ++ "\n" + , concat continuedlambdaparams + , indent1 ++ "-> " + , lambdaparens $ intercalate "\n" (firstline:lambdalines) + , ")\n" + ] + + {- Hack to add missing parens in a specific case in yesod + - static route code. + - + - StaticR + - yesod_dispatch_env_a4iDV + - (\ p_a4iE2 r_a4iE3 + - -> r_a4iE3 + - {Network.Wai.pathInfo = p_a4iE2} + - xrest_a4iDT req_a4iDW)) } + - + - Need to add another paren around the lambda, and close it + - before its parameters. lambdaparens misses this one because + - there is already one paren present. + - + - Note that the { } may be on the same line, or wrapped to next. + - + - FIXME: This is a hack. lambdaparens could just always add a + - layer of parens even when a lambda seems to be in parent. + -} + lambdaparenhack = parsecAndReplace $ do + indent1 <- many1 $ char ' ' + staticr <- string "StaticR" + void newline + void $ string indent1 + yesod_dispatch_env <- restofline + void $ string indent1 + lambdaprefix <- string "(\\ " + l1 <- restofline + void $ string indent1 + lambdaarrow <- string " ->" + l2 <- restofline + l3 <- if '{' `elem` l2 && '}' `elem` l2 + then return "" + else do + void $ string indent1 + restofline + return $ unlines + [ indent1 ++ staticr + , indent1 ++ yesod_dispatch_env + , indent1 ++ "(" ++ lambdaprefix ++ l1 + , indent1 ++ lambdaarrow ++ l2 ++ l3 ++ ")" + ] + + restofline = manyTill (noneOf "\n") newline + + {- For some reason, GHC sometimes doesn't like the multiline + - strings it creates. It seems to get hung up on \{ at the + - start of a new line sometimes, wanting it to not be escaped. + - + - To work around what is likely a GHC bug, just collapse + - multiline strings. -} + collapse_multiline_strings = parsecAndReplace $ do + void $ string "\\\n" + void $ many1 $ oneOf " \t" + void $ string "\\" + return "\\n" + + {- GHC outputs splices using explicit braces rather than layout. + - For a case expression, it does something weird: + - + - case foo of { + - xxx -> blah + - yyy -> blah }; + - + - This is not legal Haskell; the statements in the case must be + - separated by ';' + - + - To fix, we could just put a semicolon at the start of every line + - containing " -> " ... Except that lambdas also contain that. + - But we can get around that: GHC outputs lambas like this: + - + - \ foo + - -> bar + - + - Or like this: + - + - \ foo -> bar + - + - So, we can put the semicolon at the start of every line + - containing " -> " unless there's a "\ " first, or it's + - all whitespace up until it. + -} + case_layout = parsecAndReplace $ do + void newline + indent1 <- many1 $ char ' ' + prefix <- manyTill (noneOf "\n") (try (string "-> ")) + if length prefix > 10 + then unexpected "too long a prefix" + else if "\\ " `isInfixOf` prefix + then unexpected "lambda expression" + else if null prefix + then unexpected "second line of lambda" + else return $ "\n" ++ indent1 ++ "; " ++ prefix ++ " -> " + {- Sometimes cases themselves span multiple lines: + - + - Nothing + - -> foo + - + - -- This is not yet handled! + - ComplexConstructor var var + - var var + - -> foo + -} + case_layout_multiline = parsecAndReplace $ do + void newline + indent1 <- many1 $ char ' ' + firstline <- restofline + + void $ string indent1 + indent2 <- many1 $ char ' ' + void $ string "-> " + if "\\ " `isInfixOf` firstline + then unexpected "lambda expression" + else return $ "\n" ++ indent1 ++ "; " ++ firstline ++ "\n" + ++ indent1 ++ indent2 ++ "-> " + + {- (foo, \ -> bar) is not valid haskell, GHC. + - Change to (foo, bar) + - + - (Does this ever happen outside a tuple? Only saw + - it inside them.. + -} + emptylambda = replace ", \\ -> " ", " + + {- GHC may output this: + - + - instance RenderRoute WebApp where + - data instance Route WebApp + - ^^^^^^^^ + - The marked word should not be there. + - + - FIXME: This is a yesod-specific hack, it should look for the + - outer instance. + -} + nested_instances = replace " data instance Route" " data Route" + + {- GHC does not properly parenthesise generated data type + - declarations. -} + declaration_parens = replace "StaticR Route Static" "StaticR (Route Static)" + + {- A type signature is sometimes given for an entire lambda, + - which is not properly parenthesized or laid out. This is a + - hack to remove one specific case where this happens and the + - signature is easily inferred, so is just removed. + -} + remove_unnecessary_type_signatures = parsecAndReplace $ do + void $ string " ::" + void newline + void $ many1 $ char ' ' + void $ string "Text.Css.Block Text.Css.Resolved" + void newline + return "" + + {- GHC may add full package and version qualifications for + - symbols from unimported modules. We don't want these. + - + - Examples: + - "blaze-html-0.4.3.1:Text.Blaze.Internal.preEscapedText" + - "ghc-prim:GHC.Types.:" + -} + remove_package_version = parsecAndReplace $ + mangleSymbol <$> qualifiedSymbol + + mangleSymbol "GHC.Types." = "" + mangleSymbol "GHC.Tuple." = "" + mangleSymbol s = s + + qualifiedSymbol :: Parser String + qualifiedSymbol = do + s <- hstoken + void $ char ':' + if length s < 5 + then unexpected "too short to be a namespace" + else do + t <- hstoken + case t of + (c:r) | isUpper c && "." `isInfixOf` r -> return t + _ -> unexpected "not a module qualified symbol" + + hstoken :: Parser String + hstoken = do + t <- satisfy isLetter + oken <- many $ satisfy isAlphaNum <|> oneOf "-.'" + return $ t:oken + + {- This works when it's "GHC.Types.:", but we strip + - that above, so have to fix up after it here. + - The ; is added by case_layout. -} + flip_colon = replace "; : _ " "; _ : " + +{- Embedded files use unsafe packing, which is problimatic + - for several reasons, including that GHC sometimes omits trailing + - newlines in the file content, which leads to the wrong byte + - count. Also, GHC sometimes outputs unicode characters, which + - are not legal in unboxed strings. + - + - Avoid problems by converting: + - GHC.IO.unsafePerformIO + - (Data.ByteString.Unsafe.unsafePackAddressLen + - lllll + - "blabblah"#)), + - to: + - Data.ByteString.Char8.pack "blabblah"), + - + - Note that the string is often multiline. This only works if + - collapse_multiline_strings has run first. + -} +boxed_fileembed :: String -> String +boxed_fileembed = parsecAndReplace $ do + i <- indent + void $ string "GHC.IO.unsafePerformIO" + void newline + void indent + void $ string "(Data.ByteString.Unsafe.unsafePackAddressLen" + void newline + void indent + void number + void newline + void indent + void $ char '"' + s <- restOfLine + let s' = take (length s - 5) s + if "\"#))," `isSuffixOf` s + then return (i ++ "Data.ByteString.Char8.pack \"" ++ s' ++ "\"),\n") + else fail "not an unboxed string" + +{- This works around a problem in the expanded template haskell for Yesod + - type-safe url rendering. + - + - It generates code like this: + - + - (toHtml + - (\ u_a2ehE -> urender_a2ehD u_a2ehE [] + - (CloseAlert aid))))); + - + - Where urender_a2ehD is the function returned by getUrlRenderParams. + - But, that function that only takes 2 params, not 3. + - And toHtml doesn't take a parameter at all! + - + - So, this modifes the code, to look like this: + - + - (toHtml + - (flip urender_a2ehD [] + - (CloseAlert aid))))); + - + - FIXME: Investigate and fix this properly. + -} +yesod_url_render_hack :: String -> String +yesod_url_render_hack = parsecAndReplace $ do + void $ string "(toHtml" + void whitespace + void $ string "(\\" + void whitespace + wtf <- hstoken + void whitespace + void $ string "->" + void whitespace + renderer <- hstoken + void whitespace + void $ string wtf + void whitespace + return $ "(toHtml (flip " ++ renderer ++ " " + where + whitespace :: Parser String + whitespace = many $ oneOf " \t\r\n" + + hstoken :: Parser String + hstoken = many1 $ satisfy isAlphaNum <|> oneOf "_" + +{- Use exported symbol. -} +text_builder_hack :: String -> String +text_builder_hack = replace "Data.Text.Lazy.Builder.Internal.fromText" "Data.Text.Lazy.Builder.fromText" + +{- Given a Parser that finds strings it wants to modify, + - and returns the modified string, does a mass + - find and replace throughout the input string. + - Rather slow, but crazy powerful. -} +parsecAndReplace :: Parser String -> String -> String +parsecAndReplace p s = case parse find "" s of + Left _e -> s + Right l -> concatMap (either return id) l + where + find :: Parser [Either Char String] + find = many $ try (Right <$> p) <|> (Left <$> anyChar) + +main :: IO () +main = go =<< getArgs + where + go (destdir:log:header:[]) = run destdir log (Just header) + go (destdir:log:[]) = run destdir log Nothing + go _ = error "usage: EvilSplicer destdir logfile [headerfile]" + + run destdir log mheader = do + r <- parseFromFile splicesExtractor log + case r of + Left e -> error $ show e + Right splices -> do + let groups = groupBy (\a b -> splicedFile a == splicedFile b) splices + imports <- maybe (return Nothing) (catchMaybeIO . readFile) mheader + mapM_ (applySplices destdir imports) groups diff --git a/Build/InstallDesktopFile.hs b/Build/InstallDesktopFile.hs new file mode 100644 index 000000000..c8a3f07f5 --- /dev/null +++ b/Build/InstallDesktopFile.hs @@ -0,0 +1,19 @@ +{- Generating and installing a desktop menu entry file and icon, + - and a desktop autostart file. (And OSX equivilants.) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Build.DesktopFile + +import System.Environment + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify git-annex command" + go (command:_) = install command diff --git a/Build/LinuxMkLibs.hs b/Build/LinuxMkLibs.hs new file mode 100644 index 000000000..3db724b0a --- /dev/null +++ b/Build/LinuxMkLibs.hs @@ -0,0 +1,103 @@ +{- Linux library copier and binary shimmer + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Control.Applicative +import System.Environment +import Data.Maybe +import System.FilePath +import System.Directory +import Control.Monad +import Data.List +import System.Posix.Files +import Control.Monad.IfElse + +import Utility.LinuxMkLibs +import Utility.Directory +import Utility.Process +import Utility.Monad +import Utility.Path +import Utility.FileMode +import Utility.CopyFile + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify LINUXSTANDALONE_DIST" + go (top:_) = mklibs top + +mklibs :: FilePath -> IO () +mklibs top = do + fs <- dirContentsRecursive top + mapM_ symToHardLink fs + exes <- filterM checkExe fs + libs <- parseLdd <$> readProcess "ldd" exes + glibclibs <- glibcLibs + let libs' = nub $ libs ++ glibclibs + libdirs <- nub . catMaybes <$> mapM (installLib installFile top) libs' + + -- Various files used by runshell to set up env vars used by the + -- linker shims. + writeFile (top "libdirs") (unlines libdirs) + writeFile (top "linker") + (Prelude.head $ filter ("ld-linux" `isInfixOf`) libs') + writeFile (top "gconvdir") + (parentDir $ Prelude.head $ filter ("/gconv/" `isInfixOf`) glibclibs) + + mapM_ (installLinkerShim top) exes + +{- Installs a linker shim script around a binary. + - + - Note that each binary is put into its own separate directory, + - to avoid eg git looking for binaries in its directory rather + - than in PATH.-} +installLinkerShim :: FilePath -> FilePath -> IO () +installLinkerShim top exe = do + createDirectoryIfMissing True shimdir + renameFile exe exedest + writeFile exe $ unlines + [ "#!/bin/sh" + , "exec \"$GIT_ANNEX_LINKER\" --library-path \"$GIT_ANNEX_LD_LIBRARY_PATH\" \"$GIT_ANNEX_SHIMMED/" ++ base ++ "/" ++ base ++ "\" \"$@\"" + ] + modifyFileMode exe $ addModes executeModes + where + base = takeFileName exe + shimdir = top "shimmed" base + exedest = shimdir base + +{- Converting symlinks to hard links simplifies the binary shimming + - process. -} +symToHardLink :: FilePath -> IO () +symToHardLink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus f) $ do + l <- readSymbolicLink f + let absl = absPathFrom (parentDir f) l + nukeFile f + createLink absl f + +installFile :: FilePath -> FilePath -> IO () +installFile top f = do + createDirectoryIfMissing True destdir + void $ copyFileExternal f destdir + where + destdir = inTop top $ parentDir f + +checkExe :: FilePath -> IO Bool +checkExe f + | ".so" `isSuffixOf` f = return False + | otherwise = ifM (isExecutable . fileMode <$> getFileStatus f) + ( checkFileExe <$> readProcess "file" [f] + , return False + ) + +{- Check that file(1) thinks it's a Linux ELF executable, or possibly + - a shared library (a few executables like ssh appear as shared libraries). -} +checkFileExe :: String -> Bool +checkFileExe s = and + [ "ELF" `isInfixOf` s + , "executable" `isInfixOf` s || "shared object" `isInfixOf` s + ] diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs new file mode 100644 index 000000000..b8fc82605 --- /dev/null +++ b/Build/NullSoftInstaller.hs @@ -0,0 +1,203 @@ +{- Generates a NullSoft installer program for git-annex on Windows. + - + - To build the installer, git-annex should already be built by cabal, + - and ssh and rsync, as well as cygwin libraries, already installed. + - + - This uses the Haskell nsis package (cabal install nsis) + - to generate a .nsi file, which is then used to produce + - git-annex-installer.exe + - + - The installer includes git-annex, and utilities it uses, with the + - exception of git. The user needs to install git separately, + - and the installer checks for that. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +import Development.NSIS +import System.Directory +import System.FilePath +import Control.Monad +import Data.String +import Data.Maybe + +import Utility.Tmp +import Utility.Path +import Utility.CopyFile +import Utility.SafeCommand +import Build.BundledPrograms + +main = do + withTmpDir "nsis-build" $ \tmpdir -> do + let gitannex = tmpdir gitannexprogram + mustSucceed "ln" [File "dist/build/git-annex/git-annex.exe", File gitannex] + let license = tmpdir licensefile + mustSucceed "sh" [Param "-c", Param $ "zcat standalone/licences.gz > '" ++ license ++ "'"] + extrabins <- forM (cygwinPrograms ++ cygwinDlls) $ \f -> do + p <- searchPath f + when (isNothing p) $ + print ("unable to find in PATH", f) + return p + webappscript <- vbsLauncher tmpdir "git-annex-webapp" "git-annex webapp" + autostartscript <- vbsLauncher tmpdir "git-annex-autostart" "git annex assistant --autostart" + writeFile nsifile $ makeInstaller gitannex license + (catMaybes extrabins) + [ webappscript, autostartscript ] + mustSucceed "makensis" [File nsifile] + removeFile nsifile -- left behind if makensis fails + where + nsifile = "git-annex.nsi" + mustSucceed cmd params = do + r <- boolSystem cmd params + case r of + True -> return () + False -> error $ cmd ++ " failed" + +{- Generates a .vbs launcher which runs a command without any visible DOS + - box. -} +vbsLauncher :: FilePath -> String -> String -> IO String +vbsLauncher tmpdir basename cmd = do + let f = tmpdir basename ++ ".vbs" + writeFile f $ unlines + [ "Set objshell=CreateObject(\"Wscript.Shell\")" + , "objShell.Run(\"" ++ cmd ++ "\"), 0, False" + ] + return f + +gitannexprogram :: FilePath +gitannexprogram = "git-annex.exe" + +licensefile :: FilePath +licensefile = "git-annex-licenses.txt" + +installer :: FilePath +installer = "git-annex-installer.exe" + +uninstaller :: FilePath +uninstaller = "git-annex-uninstall.exe" + +gitInstallDir :: Exp FilePath +gitInstallDir = fromString "$PROGRAMFILES\\Git" + +startMenuItem :: Exp FilePath +startMenuItem = "$SMPROGRAMS/git-annex.lnk" + +autoStartItem :: Exp FilePath +autoStartItem = "$SMSTARTUP/git-annex-autostart.lnk" + +needGit :: Exp String +needGit = strConcat + [ fromString "You need git installed to use git-annex. Looking at " + , gitInstallDir + , fromString " , it seems to not be installed, " + , fromString "or may be installed in another location. " + , fromString "You can install git from http:////git-scm.com//" + ] + +makeInstaller :: FilePath -> FilePath -> [FilePath] -> [FilePath] -> String +makeInstaller gitannex license extrabins launchers = nsis $ do + name "git-annex" + outFile $ str installer + {- Installing into the same directory as git avoids needing to modify + - path myself, since the git installer already does it. -} + installDir gitInstallDir + requestExecutionLevel Admin + + iff (fileExists gitInstallDir) + (return ()) + (alert needGit) + + -- Pages to display + page Directory -- Pick where to install + page (License license) + page InstFiles -- Give a progress bar while installing + -- Start menu shortcut + Development.NSIS.createDirectory "$SMPROGRAMS" + createShortcut startMenuItem + [ Target "wscript.exe" + , Parameters "\"$INSTDIR/git-annex-webapp.vbs\"" + , StartOptions "SW_SHOWNORMAL" + , IconFile "$INSTDIR/cmd/git-annex.exe" + , IconIndex 2 + , KeyboardShortcut "ALT|CONTROL|a" + , Description "git-annex webapp" + ] + createShortcut autoStartItem + [ Target "wscript.exe" + , Parameters "\"$INSTDIR/git-annex-autostart.vbs\"" + , StartOptions "SW_SHOWNORMAL" + , IconFile "$INSTDIR/cmd/git-annex.exe" + , IconIndex 2 + , Description "git-annex autostart" + ] + section "bins" [] $ do + setOutPath "$INSTDIR\\bin" + mapM_ addfile extrabins + section "cmd" [] $ do + setOutPath "$INSTDIR\\cmd" + addfile gitannex + section "meta" [] $ do + setOutPath "$INSTDIR" + addfile license + mapM_ addfile launchers + writeUninstaller $ str uninstaller + uninstall $ do + delete [RebootOK] $ startMenuItem + delete [RebootOK] $ autoStartItem + removefilesFrom "$INSTDIR/bin" extrabins + removefilesFrom "$INSTDIR/cmd" [gitannex] + removefilesFrom "$INSTDIR" $ + launchers ++ + [ license + , uninstaller + ] + where + addfile f = file [] (str f) + removefilesFrom d = mapM_ (\f -> delete [RebootOK] $ fromString $ d ++ "/" ++ takeFileName f) + +cygwinPrograms :: [FilePath] +cygwinPrograms = map (\p -> p ++ ".exe") bundledPrograms + +-- These are the dlls needed by Cygwin's rsync, ssh, etc. +-- TODO: Use ldd (available in cygwin) to automatically find all +-- needed libs. +cygwinDlls :: [FilePath] +cygwinDlls = + [ "cygwin1.dll" + , "cygasn1-8.dll" + , "cygattr-1.dll" + , "cygheimbase-1.dll" + , "cygroken-18.dll" + , "cygcom_err-2.dll" + , "cygheimntlm-0.dll" + , "cygsqlite3-0.dll" + , "cygcrypt-0.dll" + , "cyghx509-5.dll" + , "cygssp-0.dll" + , "cygcrypto-1.0.0.dll" + , "cygiconv-2.dll" + , "cyggcc_s-1.dll" + , "cygintl-8.dll" + , "cygwind-0.dll" + , "cyggssapi-3.dll" + , "cygkrb5-26.dll" + , "cygz.dll" + , "cygidn-11.dll" + , "libcurl-4.dll" + , "cyggnutls-26.dll" + , "libcrypto.dll" + , "libssl.dll" + , "cyggcrypt-11.dll" + , "cyggpg-error-0.dll" + , "cygp11-kit-0.dll" + , "cygtasn1-3.dll" + , "cygffi-6.dll" + , "cygbz2-1.dll" + , "cygreadline7.dll" + , "cygncursesw-10.dll" + , "cygusb0.dll" + ] diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs new file mode 100644 index 000000000..5640e4d36 --- /dev/null +++ b/Build/OSXMkLibs.hs @@ -0,0 +1,172 @@ +{- OSX library copier + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Control.Applicative +import System.Environment (getArgs) +import Data.Maybe +import System.FilePath +import System.Directory +import Control.Monad +import Data.List +import Data.String.Utils + +import Utility.PartialPrelude +import Utility.Directory +import Utility.Process +import Utility.Monad +import Utility.SafeCommand +import Utility.Path +import Utility.Exception +import Utility.Env + +import qualified Data.Map as M +import qualified Data.Set as S + +type LibMap = M.Map FilePath String + +{- Recursively find and install libs, until nothing new to install is found. -} +mklibs :: FilePath -> [FilePath] -> [(FilePath, FilePath)] -> LibMap -> IO () +mklibs appbase libdirs replacement_libs libmap = do + (new, replacement_libs', libmap') <- installLibs appbase replacement_libs libmap + unless (null new) $ + mklibs appbase (libdirs++new) replacement_libs' libmap' + +{- Returns directories into which new libs were installed. -} +installLibs :: FilePath -> [(FilePath, FilePath)] -> LibMap -> IO ([FilePath], [(FilePath, FilePath)], LibMap) +installLibs appbase replacement_libs libmap = do + (needlibs, replacement_libs', libmap') <- otool appbase replacement_libs libmap + libs <- forM needlibs $ \lib -> do + pathlib <- findLibPath lib + let shortlib = fromMaybe (error "internal") (M.lookup lib libmap') + let fulllib = dropWhile (== '/') lib + let dest = appbase fulllib + let symdest = appbase shortlib + ifM (doesFileExist dest) + ( return Nothing + , do + createDirectoryIfMissing True (parentDir dest) + putStrLn $ "installing " ++ pathlib ++ " as " ++ shortlib + _ <- boolSystem "cp" [File pathlib, File dest] + _ <- boolSystem "chmod" [Param "644", File dest] + _ <- boolSystem "ln" [Param "-s", File fulllib, File symdest] + return $ Just appbase + ) + return (catMaybes libs, replacement_libs', libmap') + +{- Returns libraries to install. + - + - Note that otool -L ignores DYLD_LIBRARY_PATH, so the + - library files returned may need to be run through findLibPath + - to find the actual libraries to install. + -} +otool :: FilePath -> [(FilePath, FilePath)] -> LibMap -> IO ([FilePath], [(FilePath, FilePath)], LibMap) +otool appbase replacement_libs libmap = do + files <- filterM doesFileExist =<< dirContentsRecursive appbase + process [] files replacement_libs libmap + where + want s = not ("@executable_path" `isInfixOf` s) + && not (".framework" `isInfixOf` s) + && not ("libSystem.B" `isInfixOf` s) + process c [] rls m = return (nub $ concat c, rls, m) + process c (file:rest) rls m = do + _ <- boolSystem "chmod" [Param "755", File file] + libs <- filter want . parseOtool + <$> readProcess "otool" ["-L", file] + expanded_libs <- expand_rpath libs replacement_libs file + let rls' = nub $ rls ++ (zip libs expanded_libs) + m' <- install_name_tool file libs expanded_libs m + process (expanded_libs:c) rest rls' m' + +findLibPath :: FilePath -> IO FilePath +findLibPath l = go =<< getEnv "DYLD_LIBRARY_PATH" + where + go Nothing = return l + go (Just p) = fromMaybe l + <$> firstM doesFileExist (map ( f) (split ":" p)) + f = takeFileName l + +{- Expands any @rpath in the list of libraries. + - + - This is done by the nasty method of running the command with a dummy + - option (so it doesn't do anything.. hopefully!) and asking the dynamic + - linker to print expanded rpaths. + -} +expand_rpath :: [String] -> [(FilePath, FilePath)] -> FilePath -> IO [String] +expand_rpath libs replacement_libs cmd + | any ("@rpath" `isInfixOf`) libs = do + installed <- M.fromList . Prelude.read + <$> readFile "tmp/standalone-installed" + let origcmd = case M.lookup cmd installed of + Nothing -> cmd + Just cmd' -> cmd' + s <- catchDefaultIO "" $ readProcess "sh" ["-c", probe origcmd] + let m = if (null s) + then M.fromList replacement_libs + else M.fromList $ mapMaybe parse $ lines s + return $ map (replacem m) libs + | otherwise = return libs + where + probe c = "DYLD_PRINT_RPATHS=1 " ++ c ++ " --getting-rpath-dummy-option 2>&1 | grep RPATH" + parse s = case words s of + ("RPATH":"successful":"expansion":"of":old:"to:":new:[]) -> + Just (old, new) + _ -> Nothing + replacem m l = fromMaybe l $ M.lookup l m + +parseOtool :: String -> [FilePath] +parseOtool = catMaybes . map parse . lines + where + parse l + | "\t" `isPrefixOf` l = headMaybe $ words l + | otherwise = Nothing + +{- Adjusts binaries to use libraries bundled with it, rather than the + - system libraries. -} +install_name_tool :: FilePath -> [FilePath] -> [FilePath] -> LibMap -> IO LibMap +install_name_tool _ [] _ libmap = return libmap +install_name_tool binary libs expanded_libs libmap = do + let (libnames, libmap') = getLibNames expanded_libs libmap + let params = concatMap change $ zip libs libnames + ok <- boolSystem "install_name_tool" $ params ++ [File binary] + unless ok $ + error $ "install_name_tool failed for " ++ binary + return libmap' + where + change (lib, libname) = + [ Param "-change" + , File lib + , Param $ "@executable_path/" ++ libname + ] + +getLibNames :: [FilePath] -> LibMap -> ([FilePath], LibMap) +getLibNames libs libmap = go [] libs libmap + where + go c [] m = (reverse c, m) + go c (l:rest) m = + let (f, m') = getLibName l m + in go (f:c) rest m' + +{- Uses really short names for the library files it installs, because + - binaries have arbitrarily short RPATH field limits. -} +getLibName :: FilePath -> LibMap -> (FilePath, LibMap) +getLibName lib libmap = case M.lookup lib libmap of + Just n -> (n, libmap) + Nothing -> (nextfreename, M.insert lib nextfreename libmap) + where + names = map pure ['A' .. 'Z'] ++ + [[n, l] | n <- ['0' .. '9'], l <- ['A' .. 'Z']] + used = S.fromList $ M.elems libmap + nextfreename = fromMaybe (error "ran out of short library names!") $ + headMaybe $ dropWhile (`S.member` used) names + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify OSXAPP_BASE" + go (appbase:_) = mklibs appbase [] [] M.empty diff --git a/Build/Standalone.hs b/Build/Standalone.hs new file mode 100644 index 000000000..110163acf --- /dev/null +++ b/Build/Standalone.hs @@ -0,0 +1,47 @@ +{- Makes standalone bundle. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Main where + +import Control.Monad.IfElse +import System.Environment +import System.FilePath +import System.Directory +import Control.Monad +import Build.BundledPrograms + +import Utility.SafeCommand +import Utility.Path + +progDir :: FilePath -> FilePath +#ifdef darwin_HOST_OS +progDir topdir = topdir +#else +progDir topdir = topdir "bin" +#endif + +installProg :: FilePath -> FilePath -> IO (FilePath, FilePath) +installProg dir prog = searchPath prog >>= go + where + go Nothing = error $ "cannot find " ++ prog ++ " in PATH" + go (Just f) = do + let dest = dir takeFileName f + unlessM (boolSystem "install" [File f, File dest]) $ + error $ "install failed for " ++ prog + return (dest, f) + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify topdir" + go (topdir:_) = do + let dir = progDir topdir + createDirectoryIfMissing True dir + installed <- forM bundledPrograms $ installProg dir + writeFile "tmp/standalone-installed" (show installed) diff --git a/Build/TestConfig.hs b/Build/TestConfig.hs new file mode 100644 index 000000000..e55641fb0 --- /dev/null +++ b/Build/TestConfig.hs @@ -0,0 +1,141 @@ +{- Tests the system and generates Build.SysConfig.hs. -} + +module Build.TestConfig where + +import Utility.Path +import Utility.Monad +import Utility.SafeCommand + +import System.IO +import System.FilePath +import System.Directory + +type ConfigKey = String +data ConfigValue = + BoolConfig Bool | + StringConfig String | + MaybeStringConfig (Maybe String) | + MaybeBoolConfig (Maybe Bool) +data Config = Config ConfigKey ConfigValue + +type Test = IO Config +type TestName = String +data TestCase = TestCase TestName Test + +instance Show ConfigValue where + show (BoolConfig b) = show b + show (StringConfig s) = show s + show (MaybeStringConfig s) = show s + show (MaybeBoolConfig s) = show s + +instance Show Config where + show (Config key value) = unlines + [ key ++ " :: " ++ valuetype value + , key ++ " = " ++ show value + ] + where + valuetype (BoolConfig _) = "Bool" + valuetype (StringConfig _) = "String" + valuetype (MaybeStringConfig _) = "Maybe String" + valuetype (MaybeBoolConfig _) = "Maybe Bool" + +writeSysConfig :: [Config] -> IO () +writeSysConfig config = writeFile "Build/SysConfig.hs" body + where + body = unlines $ header ++ map show config ++ footer + header = [ + "{- Automatically generated. -}" + , "module Build.SysConfig where" + , "" + ] + footer = [] + +runTests :: [TestCase] -> IO [Config] +runTests [] = return [] +runTests (TestCase tname t : ts) = do + testStart tname + c <- t + testEnd c + rest <- runTests ts + return $ c:rest + +{- Tests that a command is available, aborting if not. -} +requireCmd :: ConfigKey -> String -> Test +requireCmd k cmdline = do + ret <- testCmd k cmdline + handle ret + where + handle r@(Config _ (BoolConfig True)) = return r + handle r = do + testEnd r + error $ "** the " ++ c ++ " command is required" + c = head $ words cmdline + +{- Checks if a command is available by running a command line. -} +testCmd :: ConfigKey -> String -> Test +testCmd k cmdline = do + ok <- boolSystem "sh" [ Param "-c", Param $ quiet cmdline ] + return $ Config k (BoolConfig ok) + +{- Ensures that one of a set of commands is available by running each in + - turn. The Config is set to the first one found. -} +selectCmd :: ConfigKey -> [(String, String)] -> Test +selectCmd k = searchCmd + (return . Config k . StringConfig) + (\cmds -> do + testEnd $ Config k $ BoolConfig False + error $ "* need one of these commands, but none are available: " ++ show cmds + ) + +maybeSelectCmd :: ConfigKey -> [(String, String)] -> Test +maybeSelectCmd k = searchCmd + (return . Config k . MaybeStringConfig . Just) + (\_ -> return $ Config k $ MaybeStringConfig Nothing) + +searchCmd :: (String -> Test) -> ([String] -> Test) -> [(String, String)] -> Test +searchCmd success failure cmdsparams = search cmdsparams + where + search [] = failure $ fst $ unzip cmdsparams + search ((c, params):cs) = do + ok <- boolSystem "sh" [ Param "-c", Param $ quiet $ c ++ " " ++ params ] + if ok + then success c + else search cs + +{- Finds a command, either in PATH or perhaps in a sbin directory not in + - PATH. If it's in PATH the config is set to just the command name, + - but if it's found outside PATH, the config is set to the full path to + - the command. -} +findCmdPath :: ConfigKey -> String -> Test +findCmdPath k command = do + ifM (inPath command) + ( return $ Config k $ MaybeStringConfig $ Just command + , do + r <- getM find ["/usr/sbin", "/sbin", "/usr/local/sbin"] + return $ Config k $ MaybeStringConfig r + ) + where + find d = + let f = d command + in ifM (doesFileExist f) ( return (Just f), return Nothing ) + +quiet :: String -> String +quiet s = s ++ " >/dev/null 2>&1" + +testStart :: TestName -> IO () +testStart s = do + putStr $ " checking " ++ s ++ "..." + hFlush stdout + +testEnd :: Config -> IO () +testEnd (Config _ (BoolConfig True)) = status "yes" +testEnd (Config _ (BoolConfig False)) = status "no" +testEnd (Config _ (StringConfig s)) = status s +testEnd (Config _ (MaybeStringConfig (Just s))) = status s +testEnd (Config _ (MaybeStringConfig Nothing)) = status "not available" +testEnd (Config _ (MaybeBoolConfig (Just True))) = status "yes" +testEnd (Config _ (MaybeBoolConfig (Just False))) = status "no" +testEnd (Config _ (MaybeBoolConfig Nothing)) = status "unknown" + +status :: String -> IO () +status s = putStrLn $ ' ':s diff --git a/Build/Version.hs b/Build/Version.hs new file mode 100644 index 000000000..da9d1bbcb --- /dev/null +++ b/Build/Version.hs @@ -0,0 +1,69 @@ +{- Package version determination, for configure script. -} + +module Build.Version where + +import Data.Maybe +import Control.Applicative +import Data.List +import System.Environment +import System.Directory +import Data.Char +import System.Process + +import Utility.Monad +import Utility.Exception + +type Version = String + +{- Set when making an official release. (Distribution vendors should set + - this too.) -} +isReleaseBuild :: IO Bool +isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD") + +{- Version is usually based on the major version from the changelog, + - plus the date of the last commit, plus the git rev of that commit. + - This works for autobuilds, ad-hoc builds, etc. + - + - If git or a git repo is not available, or something goes wrong, + - or this is a release build, just use the version from the changelog. -} +getVersion :: IO Version +getVersion = do + changelogversion <- getChangelogVersion + ifM (isReleaseBuild) + ( return changelogversion + , catchDefaultIO changelogversion $ do + let major = takeWhile (/= '.') changelogversion + autoversion <- takeWhile (\c -> isAlphaNum c || c == '-') <$> readProcess "sh" + [ "-c" + , "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'" + ] "" + if null autoversion + then return changelogversion + else return $ concat [ major, ".", autoversion ] + ) + +getChangelogVersion :: IO Version +getChangelogVersion = do + changelog <- readFile "debian/changelog" + let verline = takeWhile (/= '\n') changelog + return $ middle (words verline !! 1) + where + middle = drop 1 . init + +{- Set up cabal file with version. -} +cabalSetup :: FilePath -> IO () +cabalSetup cabalfile = do + version <- takeWhile (\c -> isDigit c || c == '.') + <$> getChangelogVersion + cabal <- readFile cabalfile + writeFile tmpcabalfile $ unlines $ + map (setfield "Version" version) $ + lines cabal + renameFile tmpcabalfile cabalfile + where + tmpcabalfile = cabalfile++".tmp" + setfield field value s + | fullfield `isPrefixOf` s = fullfield ++ value + | otherwise = s + where + fullfield = field ++ ": " diff --git a/Build/make-sdist.sh b/Build/make-sdist.sh new file mode 100755 index 000000000..6e1ddae62 --- /dev/null +++ b/Build/make-sdist.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Workaround for `cabal sdist` requiring all included files to be listed +# in .cabal. + +# Create target directory +sdist_dir=git-annex-$(grep '^Version:' git-annex.cabal | sed -re 's/Version: *//') +mkdir --parents dist/$sdist_dir + +find . \( -name .git -or -name dist -or -name cabal-dev \) -prune \ + -or -not -name \\*.orig -not -type d -print \ + | perl -ne "print unless length >= 100 - length q{$sdist_dir}" \ + | grep -v ':' \ + | xargs cp --parents --target-directory dist/$sdist_dir + +cd dist +tar --format=ustar -caf $sdist_dir.tar.gz $sdist_dir + +# Check that tarball can be unpacked by cabal. +# It's picky about tar longlinks etc. +rm -rf $sdist_dir +cabal unpack $sdist_dir.tar.gz diff --git a/Build/mdwn2man b/Build/mdwn2man new file mode 100755 index 000000000..aadb13cdf --- /dev/null +++ b/Build/mdwn2man @@ -0,0 +1,44 @@ +#!/usr/bin/env perl +# Warning: hack + +my $prog=shift; +my $section=shift; + +print ".TH $prog $section\n"; + +while (<>) { + s{(\\?)\[\[([^\s\|\]]+)(\|[^\s\]]+)?\]\]}{$1 ? "[[$2]]" : $2}eg; + s/\`([^\`]*)\`/\\fB$1\\fP/g; + s/\`//g; + s/^\s*\./\\&./g; + if (/^#\s/) { + s/^#\s/.SH /; + <>; # blank; + } + s/^[ \n]+//; + s/^\t/ /; + s/-/\\-/g; + s/^Warning:.*//g; + s/^$/.PP\n/; + s/^\*\s+(.*)/.IP "$1"/; + next if $_ eq ".PP\n" && $skippara; + if (/^.IP /) { + $inlist=1; + $spippara=0; + } + elsif (/^.SH/) { + $skippara=0; + $inlist=0; + } + elsif (/^\./) { + $skippara=1; + } + else { + $skippara=0; + } + if ($inlist && $_ eq ".PP\n") { + $_=".IP\n"; + } + + print $_; +} diff --git a/BuildFlags.hs b/BuildFlags.hs new file mode 100644 index 000000000..59a060cb5 --- /dev/null +++ b/BuildFlags.hs @@ -0,0 +1,92 @@ +{- git-annex build flags reporting + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module BuildFlags where + +buildFlags :: [String] +buildFlags = filter (not . null) + [ "" +#ifdef WITH_ASSISTANT + , "Assistant" +#else +#warning Building without the assistant. +#endif +#ifdef WITH_WEBAPP + , "Webapp" +#else +#warning Building without the webapp. You probably need to install Yesod.. +#endif +#ifdef WITH_WEBAPP_SECURE + , "Webapp-secure" +#endif +#ifdef WITH_PAIRING + , "Pairing" +#else +#warning Building without local pairing. +#endif +#ifdef WITH_TESTSUITE + , "Testsuite" +#else +#warning Building without the testsuite. +#endif +#ifdef WITH_S3 + , "S3" +#else +#warning Building without S3. +#endif +#ifdef WITH_WEBDAV + , "WebDAV" +#else +#warning Building without WebDAV. +#endif +#ifdef WITH_INOTIFY + , "Inotify" +#endif +#ifdef WITH_FSEVENTS + , "FsEvents" +#endif +#ifdef WITH_KQUEUE + , "Kqueue" +#endif +#ifdef WITH_DBUS + , "DBus" +#endif +#ifdef WITH_DESKTOP_NOTIFY + , "DesktopNotify" +#endif +#ifdef WITH_XMPP + , "XMPP" +#else +#warning Building without XMPP. +#endif +#ifdef WITH_DNS + , "DNS" +#endif +#ifdef WITH_FEED + , "Feeds" +#else +#warning Building without Feeds. +#endif +#ifdef WITH_QUVI + , "Quvi" +#else +#warning Building without quvi. +#endif +#ifdef WITH_TDFA + , "TDFA" +#endif +#ifdef WITH_CRYPTOHASH + , "CryptoHash" +#else +#warning Building without CryptoHash. +#endif +#ifdef WITH_EKG + , "EKG" +#endif + ] diff --git a/CHANGELOG b/CHANGELOG new file mode 120000 index 000000000..d526672ce --- /dev/null +++ b/CHANGELOG @@ -0,0 +1 @@ +debian/changelog \ No newline at end of file diff --git a/COPYRIGHT b/COPYRIGHT new file mode 120000 index 000000000..9060ce820 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1 @@ +debian/copyright \ No newline at end of file diff --git a/Checks.hs b/Checks.hs new file mode 100644 index 000000000..7a9cd1e38 --- /dev/null +++ b/Checks.hs @@ -0,0 +1,49 @@ +{- git-annex command checks + - + - Common sanity checks for commands, and an interface to selectively + - remove them, or add others. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Checks where + +import Common.Annex +import Types.Command +import Annex.Init +import Config +import Utility.Daemon +import qualified Git + +commonChecks :: [CommandCheck] +commonChecks = [repoExists] + +repoExists :: CommandCheck +repoExists = CommandCheck 0 ensureInitialized + +notDirect :: Command -> Command +notDirect = addCheck $ whenM isDirect $ + error "You cannot run this command in a direct mode repository." + +notBareRepo :: Command -> Command +notBareRepo = addCheck $ whenM (fromRepo Git.repoIsLocalBare) $ + error "You cannot run this command in a bare repository." + +noDaemonRunning :: Command -> Command +noDaemonRunning = addCheck $ whenM (isJust <$> daemonpid) $ + error "You cannot run this command while git-annex watch or git-annex assistant is running." + where + daemonpid = liftIO . checkDaemon =<< fromRepo gitAnnexPidFile + +dontCheck :: CommandCheck -> Command -> Command +dontCheck check cmd = mutateCheck cmd $ \c -> filter (/= check) c + +addCheck :: Annex () -> Command -> Command +addCheck check cmd = mutateCheck cmd $ \c -> + CommandCheck (length c + 100) check : c + +mutateCheck :: Command -> ([CommandCheck] -> [CommandCheck]) -> Command +mutateCheck cmd@(Command { cmdcheck = c }) a = cmd { cmdcheck = a c } + diff --git a/CmdLine.hs b/CmdLine.hs new file mode 100644 index 000000000..a165b041a --- /dev/null +++ b/CmdLine.hs @@ -0,0 +1,108 @@ +{- git-annex command line parsing and dispatch + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module CmdLine ( + dispatch, + usage, + shutdown +) where + +import qualified Control.Exception as E +import qualified Data.Map as M +import Control.Exception (throw) +import System.Console.GetOpt +#ifndef mingw32_HOST_OS +import System.Posix.Signals +#endif + +import Common.Annex +import qualified Annex +import qualified Git +import qualified Git.AutoCorrect +import Annex.Content +import Annex.Environment +import Command +import Types.Messages + +{- Runs the passed command line. -} +dispatch :: Bool -> CmdParams -> [Command] -> [Option] -> [(String, String)] -> String -> IO Git.Repo -> IO () +dispatch fuzzyok allargs allcmds commonoptions fields header getgitrepo = do + setupConsole + r <- E.try getgitrepo :: IO (Either E.SomeException Git.Repo) + case r of + Left e -> maybe (throw e) (\a -> a params) (cmdnorepo cmd) + Right g -> do + state <- Annex.new g + Annex.eval state $ do + checkEnvironment + checkfuzzy + forM_ fields $ uncurry Annex.setField + when (cmdnomessages cmd) $ + Annex.setOutput QuietOutput + sequence_ flags + whenM (annexDebug <$> Annex.getGitConfig) $ + liftIO enableDebugOutput + startup + performCommandAction cmd params + shutdown $ cmdnocommit cmd + where + err msg = msg ++ "\n\n" ++ usage header allcmds + cmd = Prelude.head cmds + (fuzzy, cmds, name, args) = findCmd fuzzyok allargs allcmds err + (flags, params) = getOptCmd args cmd commonoptions + checkfuzzy = when fuzzy $ + inRepo $ Git.AutoCorrect.prepare name cmdname cmds + +{- Parses command line params far enough to find the Command to run, and + - returns the remaining params. + - Does fuzzy matching if necessary, which may result in multiple Commands. -} +findCmd :: Bool -> CmdParams -> [Command] -> (String -> String) -> (Bool, [Command], String, CmdParams) +findCmd fuzzyok argv cmds err + | isNothing name = error $ err "missing command" + | not (null exactcmds) = (False, exactcmds, fromJust name, args) + | fuzzyok && not (null inexactcmds) = (True, inexactcmds, fromJust name, args) + | otherwise = error $ err $ "unknown command " ++ fromJust name + where + (name, args) = findname argv [] + findname [] c = (Nothing, reverse c) + findname (a:as) c + | "-" `isPrefixOf` a = findname as (a:c) + | otherwise = (Just a, reverse c ++ as) + exactcmds = filter (\c -> name == Just (cmdname c)) cmds + inexactcmds = case name of + Nothing -> [] + Just n -> Git.AutoCorrect.fuzzymatches n cmdname cmds + +{- Parses command line options, and returns actions to run to configure flags + - and the remaining parameters for the command. -} +getOptCmd :: CmdParams -> Command -> [Option] -> ([Annex ()], CmdParams) +getOptCmd argv cmd commonoptions = check $ + getOpt Permute (commonoptions ++ cmdoptions cmd) argv + where + check (flags, rest, []) = (flags, rest) + check (_, _, errs) = error $ unlines + [ concat errs + , commandUsage cmd + ] + +{- Actions to perform each time ran. -} +startup :: Annex () +startup = +#ifndef mingw32_HOST_OS + liftIO $ void $ installHandler sigINT Default Nothing +#else + return () +#endif + +{- Cleanup actions. -} +shutdown :: Bool -> Annex () +shutdown nocommit = do + saveState nocommit + sequence_ =<< M.elems <$> Annex.getState Annex.cleanup + liftIO reapZombies -- zombies from long-running git processes diff --git a/CmdLine/Action.hs b/CmdLine/Action.hs new file mode 100644 index 000000000..247c658bc --- /dev/null +++ b/CmdLine/Action.hs @@ -0,0 +1,70 @@ +{- git-annex command-line actions + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module CmdLine.Action where + +import Common.Annex +import qualified Annex +import Types.Command +import qualified Annex.Queue +import Annex.Exception + +type CommandActionRunner = CommandStart -> CommandCleanup + +{- Runs a command, starting with the check stage, and then + - the seek stage. Finishes by printing the number of commandActions that + - failed. -} +performCommandAction :: Command -> CmdParams -> Annex () +performCommandAction Command { cmdseek = seek, cmdcheck = c, cmdname = name } params = do + mapM_ runCheck c + Annex.changeState $ \s -> s { Annex.errcounter = 0 } + seek params + showerrcount =<< Annex.getState Annex.errcounter + where + showerrcount 0 = noop + showerrcount cnt = error $ name ++ ": " ++ show cnt ++ " failed" + +{- Runs one of the actions needed to perform a command. + - Individual actions can fail without stopping the whole command, + - including by throwing IO errors (but other errors terminate the whole + - command). + - + - This should only be run in the seek stage. -} +commandAction :: CommandActionRunner +commandAction a = handle =<< tryAnnexIO go + where + go = do + Annex.Queue.flushWhenFull + callCommandAction a + handle (Right True) = return True + handle (Right False) = incerr + handle (Left err) = do + showErr err + showEndFail + incerr + incerr = do + Annex.changeState $ \s -> + let ! c = Annex.errcounter s + 1 + ! s' = s { Annex.errcounter = c } + in s' + return False + +{- Runs a single command action through the start, perform and cleanup + - stages, without catching errors. Useful if one command wants to run + - part of another command. -} +callCommandAction :: CommandActionRunner +callCommandAction = start + where + start = stage $ maybe skip perform + perform = stage $ maybe failure cleanup + cleanup = stage $ status + stage = (=<<) + skip = return True + failure = showEndFail >> return False + status r = showEndResult r >> return r diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs new file mode 100644 index 000000000..4c9377df9 --- /dev/null +++ b/CmdLine/GitAnnex.hs @@ -0,0 +1,211 @@ +{- git-annex main program + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, OverloadedStrings #-} + +module CmdLine.GitAnnex where + +import qualified Git.CurrentRepo +import CmdLine +import Command +import Utility.Env +import Annex.Ssh + +import qualified Command.Add +import qualified Command.Unannex +import qualified Command.Drop +import qualified Command.Move +import qualified Command.Copy +import qualified Command.Get +import qualified Command.LookupKey +import qualified Command.ExamineKey +import qualified Command.FromKey +import qualified Command.DropKey +import qualified Command.TransferKey +import qualified Command.TransferKeys +import qualified Command.ReKey +import qualified Command.MetaData +import qualified Command.View +import qualified Command.VAdd +import qualified Command.VFilter +import qualified Command.VPop +import qualified Command.VCycle +import qualified Command.Reinject +import qualified Command.Fix +import qualified Command.Init +import qualified Command.Describe +import qualified Command.InitRemote +import qualified Command.EnableRemote +import qualified Command.Fsck +import qualified Command.Repair +import qualified Command.Unused +import qualified Command.DropUnused +import qualified Command.AddUnused +import qualified Command.Unlock +import qualified Command.Lock +import qualified Command.PreCommit +import qualified Command.Find +import qualified Command.FindRef +import qualified Command.Whereis +import qualified Command.List +import qualified Command.Log +import qualified Command.Merge +import qualified Command.ResolveMerge +import qualified Command.Info +import qualified Command.Status +import qualified Command.Migrate +import qualified Command.Uninit +import qualified Command.Reinit +import qualified Command.NumCopies +import qualified Command.Trust +import qualified Command.Untrust +import qualified Command.Semitrust +import qualified Command.Dead +import qualified Command.Group +import qualified Command.Wanted +import qualified Command.Schedule +import qualified Command.Ungroup +import qualified Command.Vicfg +import qualified Command.Sync +import qualified Command.Mirror +import qualified Command.AddUrl +#ifdef WITH_FEED +import qualified Command.ImportFeed +#endif +import qualified Command.RmUrl +import qualified Command.Import +import qualified Command.Map +import qualified Command.Direct +import qualified Command.Indirect +import qualified Command.Upgrade +import qualified Command.Forget +import qualified Command.Version +import qualified Command.Help +#ifdef WITH_ASSISTANT +import qualified Command.Watch +import qualified Command.Assistant +#ifdef WITH_WEBAPP +import qualified Command.WebApp +#endif +#ifdef WITH_XMPP +import qualified Command.XMPPGit +#endif +import qualified Command.RemoteDaemon +#endif +import qualified Command.Test +#ifdef WITH_TESTSUITE +import qualified Command.FuzzTest +#endif +#ifdef WITH_EKG +import System.Remote.Monitoring +#endif + +cmds :: [Command] +cmds = concat + [ Command.Add.def + , Command.Get.def + , Command.Drop.def + , Command.Move.def + , Command.Copy.def + , Command.Unlock.def + , Command.Lock.def + , Command.Sync.def + , Command.Mirror.def + , Command.AddUrl.def +#ifdef WITH_FEED + , Command.ImportFeed.def +#endif + , Command.RmUrl.def + , Command.Import.def + , Command.Init.def + , Command.Describe.def + , Command.InitRemote.def + , Command.EnableRemote.def + , Command.Reinject.def + , Command.Unannex.def + , Command.Uninit.def + , Command.Reinit.def + , Command.PreCommit.def + , Command.NumCopies.def + , Command.Trust.def + , Command.Untrust.def + , Command.Semitrust.def + , Command.Dead.def + , Command.Group.def + , Command.Wanted.def + , Command.Schedule.def + , Command.Ungroup.def + , Command.Vicfg.def + , Command.LookupKey.def + , Command.ExamineKey.def + , Command.FromKey.def + , Command.DropKey.def + , Command.TransferKey.def + , Command.TransferKeys.def + , Command.ReKey.def + , Command.MetaData.def + , Command.View.def + , Command.VAdd.def + , Command.VFilter.def + , Command.VPop.def + , Command.VCycle.def + , Command.Fix.def + , Command.Fsck.def + , Command.Repair.def + , Command.Unused.def + , Command.DropUnused.def + , Command.AddUnused.def + , Command.Find.def + , Command.FindRef.def + , Command.Whereis.def + , Command.List.def + , Command.Log.def + , Command.Merge.def + , Command.ResolveMerge.def + , Command.Info.def + , Command.Status.def + , Command.Migrate.def + , Command.Map.def + , Command.Direct.def + , Command.Indirect.def + , Command.Upgrade.def + , Command.Forget.def + , Command.Version.def + , Command.Help.def +#ifdef WITH_ASSISTANT + , Command.Watch.def + , Command.Assistant.def +#ifdef WITH_WEBAPP + , Command.WebApp.def +#endif +#ifdef WITH_XMPP + , Command.XMPPGit.def +#endif + , Command.RemoteDaemon.def +#endif + , Command.Test.def +#ifdef WITH_TESTSUITE + , Command.FuzzTest.def +#endif + ] + +header :: String +header = "git-annex command [option ...]" + +run :: [String] -> IO () +run args = do +#ifdef WITH_EKG + _ <- forkServer "localhost" 4242 +#endif + go envmodes + where + go [] = dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get + go ((v, a):rest) = maybe (go rest) a =<< getEnv v + envmodes = + [ (sshCachingEnv, runSshCaching args) + , (sshAskPassEnv, runSshAskPass) + ] diff --git a/CmdLine/GitAnnex/Options.hs b/CmdLine/GitAnnex/Options.hs new file mode 100644 index 000000000..f9f5989ee --- /dev/null +++ b/CmdLine/GitAnnex/Options.hs @@ -0,0 +1,101 @@ +{- git-annex options + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnex.Options where + +import System.Console.GetOpt + +import Common.Annex +import qualified Git.Config +import Git.Types +import Types.TrustLevel +import Types.NumCopies +import Types.Messages +import qualified Annex +import qualified Remote +import qualified Limit +import qualified Limit.Wanted +import CmdLine.Option +import CmdLine.Usage + +gitAnnexOptions :: [Option] +gitAnnexOptions = commonOptions ++ + [ Option ['N'] ["numcopies"] (ReqArg setnumcopies paramNumber) + "override default number of copies" + , Option [] ["trust"] (trustArg Trusted) + "override trust setting" + , Option [] ["semitrust"] (trustArg SemiTrusted) + "override trust setting back to default" + , Option [] ["untrust"] (trustArg UnTrusted) + "override trust setting to untrusted" + , Option ['c'] ["config"] (ReqArg setgitconfig "NAME=VALUE") + "override git configuration setting" + , Option ['x'] ["exclude"] (ReqArg Limit.addExclude paramGlob) + "skip files matching the glob pattern" + , Option ['I'] ["include"] (ReqArg Limit.addInclude paramGlob) + "limit to files matching the glob pattern" + , Option ['i'] ["in"] (ReqArg Limit.addIn paramRemote) + "match files present in a remote" + , Option ['C'] ["copies"] (ReqArg Limit.addCopies paramNumber) + "skip files with fewer copies" + , Option [] ["lackingcopies"] (ReqArg (Limit.addLackingCopies False) paramNumber) + "match files that need more copies" + , Option [] ["approxlackingcopies"] (ReqArg (Limit.addLackingCopies True) paramNumber) + "match files that need more copies (faster)" + , Option ['B'] ["inbackend"] (ReqArg Limit.addInBackend paramName) + "match files using a key-value backend" + , Option [] ["inallgroup"] (ReqArg Limit.addInAllGroup paramGroup) + "match files present in all remotes in a group" + , Option [] ["largerthan"] (ReqArg Limit.addLargerThan paramSize) + "match files larger than a size" + , Option [] ["smallerthan"] (ReqArg Limit.addSmallerThan paramSize) + "match files smaller than a size" + , Option [] ["metadata"] (ReqArg Limit.addMetaData "FIELD=VALUE") + "match files with attached metadata" + , Option [] ["want-get"] (NoArg Limit.Wanted.addWantGet) + "match files the repository wants to get" + , Option [] ["want-drop"] (NoArg Limit.Wanted.addWantDrop) + "match files the repository wants to drop" + , Option ['T'] ["time-limit"] (ReqArg Limit.addTimeLimit paramTime) + "stop after the specified amount of time" + , Option [] ["user-agent"] (ReqArg setuseragent paramName) + "override default User-Agent" + , Option [] ["trust-glacier"] (NoArg (Annex.setFlag "trustglacier")) + "Trust Amazon Glacier inventory" + ] ++ matcherOptions + where + trustArg t = ReqArg (Remote.forceTrust t) paramRemote + setnumcopies v = maybe noop + (\n -> Annex.changeState $ \s -> s { Annex.forcenumcopies = Just $ NumCopies n }) + (readish v) + setuseragent v = Annex.changeState $ \s -> s { Annex.useragent = Just v } + setgitconfig v = inRepo (Git.Config.store v) + >>= pure . (\r -> r { gitGlobalOpts = gitGlobalOpts r ++ [Param "-c", Param v] }) + >>= Annex.changeGitRepo + +keyOptions :: [Option] +keyOptions = + [ Option ['A'] ["all"] (NoArg (Annex.setFlag "all")) + "operate on all versions of all files" + , Option ['U'] ["unused"] (NoArg (Annex.setFlag "unused")) + "operate on files found by last run of git-annex unused" + , Option [] ["key"] (ReqArg (Annex.setField "key") paramKey) + "operate on specified key" + ] + +fromOption :: Option +fromOption = fieldOption ['f'] "from" paramRemote "source remote" + +toOption :: Option +toOption = fieldOption ['t'] "to" paramRemote "destination remote" + +fromToOptions :: [Option] +fromToOptions = [fromOption, toOption] + +jsonOption :: Option +jsonOption = Option ['j'] ["json"] (NoArg (Annex.setOutput JSONOutput)) + "enable JSON output" diff --git a/CmdLine/GitAnnexShell.hs b/CmdLine/GitAnnexShell.hs new file mode 100644 index 000000000..6c212b24d --- /dev/null +++ b/CmdLine/GitAnnexShell.hs @@ -0,0 +1,201 @@ +{- git-annex-shell main program + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnexShell where + +import System.Environment +import System.Console.GetOpt + +import Common.Annex +import qualified Git.Construct +import CmdLine +import Command +import Annex.UUID +import Annex (setField) +import CmdLine.GitAnnexShell.Fields +import Utility.UserInfo +import Remote.GCrypt (getGCryptUUID) +import qualified Annex +import Annex.Init + +import qualified Command.ConfigList +import qualified Command.InAnnex +import qualified Command.DropKey +import qualified Command.RecvKey +import qualified Command.SendKey +import qualified Command.TransferInfo +import qualified Command.Commit +import qualified Command.NotifyChanges +import qualified Command.GCryptSetup + +cmds_readonly :: [Command] +cmds_readonly = concat + [ gitAnnexShellCheck Command.ConfigList.def + , gitAnnexShellCheck Command.InAnnex.def + , gitAnnexShellCheck Command.SendKey.def + , gitAnnexShellCheck Command.TransferInfo.def + , gitAnnexShellCheck Command.NotifyChanges.def + ] + +cmds_notreadonly :: [Command] +cmds_notreadonly = concat + [ gitAnnexShellCheck Command.RecvKey.def + , gitAnnexShellCheck Command.DropKey.def + , gitAnnexShellCheck Command.Commit.def + , Command.GCryptSetup.def + ] + +cmds :: [Command] +cmds = map adddirparam $ cmds_readonly ++ cmds_notreadonly + where + adddirparam c = c { cmdparamdesc = "DIRECTORY " ++ cmdparamdesc c } + +options :: [OptDescr (Annex ())] +options = commonOptions ++ + [ Option [] ["uuid"] (ReqArg checkUUID paramUUID) "local repository uuid" + ] + where + checkUUID expected = getUUID >>= check + where + check u | u == toUUID expected = noop + check NoUUID = checkGCryptUUID expected + check u = unexpectedUUID expected u + checkGCryptUUID expected = check =<< getGCryptUUID True =<< gitRepo + where + check (Just u) | u == toUUID expected = noop + check Nothing = unexpected expected "uninitialized repository" + check (Just u) = unexpectedUUID expected u + unexpectedUUID expected u = unexpected expected $ "UUID " ++ fromUUID u + unexpected expected s = error $ + "expected repository UUID " ++ expected ++ " but found " ++ s + +header :: String +header = "git-annex-shell [-c] command [parameters ...] [option ...]" + +run :: [String] -> IO () +run [] = failure +-- skip leading -c options, passed by eg, ssh +run ("-c":p) = run p +-- a command can be either a builtin or something to pass to git-shell +run c@(cmd:dir:params) + | cmd `elem` builtins = builtin cmd dir params + | otherwise = external c +run c@(cmd:_) + -- Handle the case of being the user's login shell. It will be passed + -- a single string containing all the real parameters. + | "git-annex-shell " `isPrefixOf` cmd = run $ drop 1 $ shellUnEscape cmd + | cmd `elem` builtins = failure + | otherwise = external c + +builtins :: [String] +builtins = map cmdname cmds + +builtin :: String -> String -> [String] -> IO () +builtin cmd dir params = do + checkNotReadOnly cmd + checkDirectory $ Just dir + let (params', fieldparams, opts) = partitionParams params + fields = filter checkField $ parseFields fieldparams + cmds' = map (newcmd $ unwords opts) cmds + dispatch False (cmd : params') cmds' options fields header $ + Git.Construct.repoAbsPath dir >>= Git.Construct.fromAbsPath + where + addrsyncopts opts seek k = setField "RsyncOptions" opts >> seek k + newcmd opts c = c { cmdseek = addrsyncopts opts (cmdseek c) } + +external :: [String] -> IO () +external params = do + {- Normal git-shell commands all have the directory as their last + - parameter. -} + let lastparam = lastMaybe =<< shellUnEscape <$> lastMaybe params + (params', _, _) = partitionParams params + checkDirectory lastparam + checkNotLimited + unlessM (boolSystem "git-shell" $ map Param $ "-c":params') $ + error "git-shell failed" + +{- Split the input list into 3 groups separated with a double dash --. + - Parameters between two -- markers are field settings, in the form: + - field=value field=value + - + - Parameters after the last -- are the command itself and its arguments e.g., + - rsync --bandwidth=100. + -} +partitionParams :: [String] -> ([String], [String], [String]) +partitionParams ps = case segment (== "--") ps of + params:fieldparams:rest -> ( params, fieldparams, intercalate ["--"] rest ) + [params] -> (params, [], []) + _ -> ([], [], []) + +parseFields :: [String] -> [(String, String)] +parseFields = map (separate (== '=')) + +{- Only allow known fields to be set, ignore others. + - Make sure that field values make sense. -} +checkField :: (String, String) -> Bool +checkField (field, value) + | field == fieldName remoteUUID = fieldCheck remoteUUID value + | field == fieldName associatedFile = fieldCheck associatedFile value + | field == fieldName direct = fieldCheck direct value + | otherwise = False + +failure :: IO () +failure = error $ "bad parameters\n\n" ++ usage header cmds + +checkNotLimited :: IO () +checkNotLimited = checkEnv "GIT_ANNEX_SHELL_LIMITED" + +checkNotReadOnly :: String -> IO () +checkNotReadOnly cmd + | cmd `elem` map cmdname cmds_readonly = noop + | otherwise = checkEnv "GIT_ANNEX_SHELL_READONLY" + +checkDirectory :: Maybe FilePath -> IO () +checkDirectory mdir = do + v <- catchMaybeIO $ getEnv "GIT_ANNEX_SHELL_DIRECTORY" + case (v, mdir) of + (Nothing, _) -> noop + (Just d, Nothing) -> req d Nothing + (Just d, Just dir) + | d `equalFilePath` dir -> noop + | otherwise -> do + home <- myHomeDir + d' <- canondir home d + dir' <- canondir home dir + if d' `equalFilePath` dir' + then noop + else req d' (Just dir') + where + req d mdir' = error $ unwords + [ "Only allowed to access" + , d + , maybe "and could not determine directory from command line" ("not " ++) mdir' + ] + + {- A directory may start with ~/ or in some cases, even /~/, + - or could just be relative to home, or of course could + - be absolute. -} + canondir home d + | "~/" `isPrefixOf` d = return d + | "/~/" `isPrefixOf` d = return $ drop 1 d + | otherwise = relHome $ absPathFrom home d + +checkEnv :: String -> IO () +checkEnv var = do + v <- catchMaybeIO $ getEnv var + case v of + Nothing -> noop + Just "" -> noop + Just _ -> error $ "Action blocked by " ++ var + +{- Modifies a Command to check that it is run in either a git-annex + - repository, or a repository with a gcrypt-id set. -} +gitAnnexShellCheck :: [Command] -> [Command] +gitAnnexShellCheck = map $ addCheck okforshell . dontCheck repoExists + where + okforshell = unlessM (isInitialized <||> isJust . gcryptId <$> Annex.getGitConfig) $ + error "Not a git-annex or gcrypt repository." diff --git a/CmdLine/GitAnnexShell/Fields.hs b/CmdLine/GitAnnexShell/Fields.hs new file mode 100644 index 000000000..4f208773b --- /dev/null +++ b/CmdLine/GitAnnexShell/Fields.hs @@ -0,0 +1,36 @@ +{- git-annex-shell fields + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnexShell.Fields where + +import Common.Annex +import qualified Annex +import Git.FilePath + +import Data.Char + +{- A field, stored in Annex state, with a value sanity checker. -} +data Field = Field + { fieldName :: String + , fieldCheck :: String -> Bool + } + +getField :: Field -> Annex (Maybe String) +getField = Annex.getField . fieldName + +remoteUUID :: Field +remoteUUID = Field "remoteuuid" $ + -- does it look like a UUID? + all (\c -> isAlphaNum c || c == '-') + +associatedFile :: Field +associatedFile = Field "associatedfile" $ \f -> + -- is the file a safe relative filename? + not (absoluteGitPath f) && not ("../" `isPrefixOf` f) + +direct :: Field +direct = Field "direct" $ \f -> f == "1" diff --git a/CmdLine/Option.hs b/CmdLine/Option.hs new file mode 100644 index 000000000..ce44d2ace --- /dev/null +++ b/CmdLine/Option.hs @@ -0,0 +1,83 @@ +{- common command-line options + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Option ( + commonOptions, + matcherOptions, + flagOption, + fieldOption, + optionName, + ArgDescr(..), + OptDescr(..), +) where + +import System.Console.GetOpt + +import Common.Annex +import qualified Annex +import Types.Messages +import Types.DesktopNotify +import Limit +import CmdLine.Usage + +commonOptions :: [Option] +commonOptions = + [ Option [] ["force"] (NoArg (setforce True)) + "allow actions that may lose annexed data" + , Option ['F'] ["fast"] (NoArg (setfast True)) + "avoid slow operations" + , Option ['a'] ["auto"] (NoArg (setauto True)) + "automatic mode" + , Option ['q'] ["quiet"] (NoArg (Annex.setOutput QuietOutput)) + "avoid verbose output" + , Option ['v'] ["verbose"] (NoArg (Annex.setOutput NormalOutput)) + "allow verbose output (default)" + , Option ['d'] ["debug"] (NoArg setdebug) + "show debug messages" + , Option [] ["no-debug"] (NoArg unsetdebug) + "don't show debug messages" + , Option ['b'] ["backend"] (ReqArg setforcebackend paramName) + "specify key-value backend to use" + , Option [] ["notify-finish"] (NoArg (setdesktopnotify mkNotifyFinish)) + "show desktop notification after transfer finishes" + , Option [] ["notify-start"] (NoArg (setdesktopnotify mkNotifyStart)) + "show desktop notification after transfer completes" + ] + where + setforce v = Annex.changeState $ \s -> s { Annex.force = v } + setfast v = Annex.changeState $ \s -> s { Annex.fast = v } + setauto v = Annex.changeState $ \s -> s { Annex.auto = v } + setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v } + setdebug = Annex.changeGitConfig $ \c -> c { annexDebug = True } + unsetdebug = Annex.changeGitConfig $ \c -> c { annexDebug = False } + setdesktopnotify v = Annex.changeState $ \s -> s { Annex.desktopnotify = Annex.desktopnotify s <> v } + +matcherOptions :: [Option] +matcherOptions = + [ longopt "not" "negate next option" + , longopt "and" "both previous and next option must match" + , longopt "or" "either previous or next option must match" + , shortopt "(" "open group of options" + , shortopt ")" "close group of options" + ] + where + longopt o = Option [] [o] $ NoArg $ addToken o + shortopt o = Option o [] $ NoArg $ addToken o + +{- An option that sets a flag. -} +flagOption :: String -> String -> String -> Option +flagOption short opt description = + Option short [opt] (NoArg (Annex.setFlag opt)) description + +{- An option that sets a field. -} +fieldOption :: String -> String -> String -> String -> Option +fieldOption short opt paramdesc description = + Option short [opt] (ReqArg (Annex.setField opt) paramdesc) description + +{- The flag or field name used for an option. -} +optionName :: Option -> String +optionName (Option _ o _ _) = Prelude.head o diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs new file mode 100644 index 000000000..431b2e118 --- /dev/null +++ b/CmdLine/Seek.hs @@ -0,0 +1,199 @@ +{- git-annex command seeking + - + - These functions find appropriate files or other things based on + - the values a user passes to a command, and prepare actions operating + - on them. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Seek where + +import Common.Annex +import Types.Command +import Types.Key +import Types.FileMatcher +import qualified Annex +import qualified Git +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Git.LsTree as LsTree +import Git.FilePath +import qualified Limit +import CmdLine.Option +import CmdLine.Action +import Logs.Location +import Logs.Unused +import Annex.CatFile + +withFilesInGit :: (FilePath -> CommandStart) -> CommandSeek +withFilesInGit a params = seekActions $ prepFiltered a $ + seekHelper LsFiles.inRepo params + +withFilesNotInGit :: Bool -> (FilePath -> CommandStart) -> CommandSeek +withFilesNotInGit skipdotfiles a params + | skipdotfiles = do + {- dotfiles are not acted on unless explicitly listed -} + files <- filter (not . dotfile) <$> + seekunless (null ps && not (null params)) ps + dotfiles <- seekunless (null dotps) dotps + go (files++dotfiles) + | otherwise = go =<< seekunless False params + where + (dotps, ps) = partition dotfile params + seekunless True _ = return [] + seekunless _ l = do + force <- Annex.getState Annex.force + g <- gitRepo + liftIO $ Git.Command.leaveZombie <$> LsFiles.notInRepo force l g + go l = seekActions $ prepFiltered a $ + return $ concat $ segmentPaths params l + +withFilesInRefs :: (FilePath -> Key -> CommandStart) -> CommandSeek +withFilesInRefs a = mapM_ go + where + go r = do + matcher <- Limit.getMatcher + l <- inRepo $ LsTree.lsTree (Git.Ref r) + forM_ l $ \i -> do + let f = getTopFilePath $ LsTree.file i + v <- catKey (Git.Ref $ LsTree.sha i) (LsTree.mode i) + case v of + Nothing -> noop + Just k -> whenM (matcher $ MatchingKey k) $ + void $ commandAction $ a f k + +withPathContents :: ((FilePath, FilePath) -> CommandStart) -> CommandSeek +withPathContents a params = seekActions $ + map a . concat <$> liftIO (mapM get params) + where + get p = ifM (isDirectory <$> getFileStatus p) + ( map (\f -> (f, makeRelative (parentDir p) f)) + <$> dirContentsRecursiveSkipping (".git" `isSuffixOf`) True p + , return [(p, takeFileName p)] + ) + +withWords :: ([String] -> CommandStart) -> CommandSeek +withWords a params = seekActions $ return [a params] + +withStrings :: (String -> CommandStart) -> CommandSeek +withStrings a params = seekActions $ return $ map a params + +withPairs :: ((String, String) -> CommandStart) -> CommandSeek +withPairs a params = seekActions $ return $ map a $ pairs [] params + where + pairs c [] = reverse c + pairs c (x:y:xs) = pairs ((x,y):c) xs + pairs _ _ = error "expected pairs" + +withFilesToBeCommitted :: (String -> CommandStart) -> CommandSeek +withFilesToBeCommitted a params = seekActions $ prepFiltered a $ + seekHelper LsFiles.stagedNotDeleted params + +withFilesUnlocked :: (FilePath -> CommandStart) -> CommandSeek +withFilesUnlocked = withFilesUnlocked' LsFiles.typeChanged + +withFilesUnlockedToBeCommitted :: (FilePath -> CommandStart) -> CommandSeek +withFilesUnlockedToBeCommitted = withFilesUnlocked' LsFiles.typeChangedStaged + +{- Unlocked files have changed type from a symlink to a regular file. + - + - Furthermore, unlocked files used to be a git-annex symlink, + - not some other sort of symlink. + -} +withFilesUnlocked' :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> (FilePath -> CommandStart) -> CommandSeek +withFilesUnlocked' typechanged a params = seekActions $ + prepFiltered a unlockedfiles + where + check f = liftIO (notSymlink f) <&&> + (isJust <$> catKeyFile f <||> isJust <$> catKeyFileHEAD f) + unlockedfiles = filterM check =<< seekHelper typechanged params + +{- Finds files that may be modified. -} +withFilesMaybeModified :: (FilePath -> CommandStart) -> CommandSeek +withFilesMaybeModified a params = seekActions $ + prepFiltered a $ seekHelper LsFiles.modified params + +withKeys :: (Key -> CommandStart) -> CommandSeek +withKeys a params = seekActions $ return $ map (a . parse) params + where + parse p = fromMaybe (error "bad key") $ file2key p + +{- Gets the value of a field options, which is fed into + - a conversion function. + -} +getOptionField :: Option -> (Maybe String -> Annex a) -> Annex a +getOptionField option converter = converter <=< Annex.getField $ optionName option + +getOptionFlag :: Option -> Annex Bool +getOptionFlag option = Annex.getFlag (optionName option) + +withNothing :: CommandStart -> CommandSeek +withNothing a [] = seekActions $ return [a] +withNothing _ _ = error "This command takes no parameters." + +{- If --all is specified, or in a bare repo, runs an action on all + - known keys. + - + - If --unused is specified, runs an action on all keys found by + - the last git annex unused scan. + - + - If --key is specified, operates only on that key. + - + - Otherwise, fall back to a regular CommandSeek action on + - whatever params were passed. -} +withKeyOptions :: (Key -> CommandStart) -> CommandSeek -> CommandSeek +withKeyOptions keyop fallbackop params = do + bare <- fromRepo Git.repoIsLocalBare + allkeys <- Annex.getFlag "all" + unused <- Annex.getFlag "unused" + specifickey <- Annex.getField "key" + auto <- Annex.getState Annex.auto + when (auto && bare) $ + error "Cannot use --auto in a bare repository" + case (allkeys, unused, null params, specifickey) of + (False , False , True , Nothing) + | bare -> go auto loggedKeys + | otherwise -> fallbackop params + (False , False , _ , Nothing) -> fallbackop params + (True , False , True , Nothing) -> go auto loggedKeys + (False , True , True , Nothing) -> go auto unusedKeys' + (False , False , True , Just ks) -> case file2key ks of + Nothing -> error "Invalid key" + Just k -> go auto $ return [k] + _ -> error "Can only specify one of file names, --all, --unused, or --key" + where + go True _ = error "Cannot use --auto with --all or --unused or --key" + go False a = do + matcher <- Limit.getMatcher + seekActions $ map (process matcher) <$> a + process matcher k = ifM (matcher $ MatchingKey k) + ( keyop k , return Nothing) + +prepFiltered :: (FilePath -> CommandStart) -> Annex [FilePath] -> Annex [CommandStart] +prepFiltered a fs = do + matcher <- Limit.getMatcher + map (process matcher) <$> fs + where + process matcher f = ifM (matcher $ MatchingFile $ FileInfo f f) + ( a f , return Nothing ) + +seekActions :: Annex [CommandStart] -> Annex () +seekActions gen = do + as <- gen + mapM_ commandAction as + +seekHelper :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> [FilePath] -> Annex [FilePath] +seekHelper a params = do + ll <- inRepo $ \g -> + runSegmentPaths (\fs -> Git.Command.leaveZombie <$> a fs g) params + {- Show warnings only for files/directories that do not exist. -} + forM_ (map fst $ filter (null . snd) $ zip params ll) $ \p -> + unlessM (isJust <$> liftIO (catchMaybeIO $ getSymbolicLinkStatus p)) $ + fileNotFound p + return $ concat ll + +notSymlink :: FilePath -> IO Bool +notSymlink f = liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f diff --git a/CmdLine/Usage.hs b/CmdLine/Usage.hs new file mode 100644 index 000000000..6e0a1ca80 --- /dev/null +++ b/CmdLine/Usage.hs @@ -0,0 +1,115 @@ +{- git-annex usage messages + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Usage where + +import Common.Annex + +import Types.Command + +import System.Console.GetOpt + +usageMessage :: String -> String +usageMessage s = "Usage: " ++ s + +{- Usage message with lists of commands by section. -} +usage :: String -> [Command] -> String +usage header cmds = unlines $ usageMessage header : concatMap go [minBound..] + where + go section + | null cs = [] + | otherwise = + [ "" + , descSection section ++ ":" + , "" + ] ++ map cmdline cs + where + cs = filter (\c -> cmdsection c == section) scmds + cmdline c = concat + [ cmdname c + , namepad (cmdname c) + , cmdparamdesc c + , descpad (cmdparamdesc c) + , cmddesc c + ] + pad n s = replicate (n - length s) ' ' + namepad = pad $ longest cmdname + 1 + descpad = pad $ longest cmdparamdesc + 2 + longest f = foldl max 0 $ map (length . f) cmds + scmds = sort cmds + +{- Usage message for a single command. -} +commandUsage :: Command -> String +commandUsage cmd = unlines + [ usageInfo header (cmdoptions cmd) + , "To see additional options common to all commands, run: git annex help options" + ] + where + header = usageMessage $ unwords + [ "git-annex" + , cmdname cmd + , cmdparamdesc cmd + , "[option ...]" + ] + +{- Descriptions of params used in usage messages. -} +paramPaths :: String +paramPaths = paramOptional $ paramRepeating paramPath -- most often used +paramPath :: String +paramPath = "PATH" +paramKey :: String +paramKey = "KEY" +paramDesc :: String +paramDesc = "DESC" +paramUrl :: String +paramUrl = "URL" +paramNumber :: String +paramNumber = "NUMBER" +paramNumRange :: String +paramNumRange = "NUM|RANGE" +paramRemote :: String +paramRemote = "REMOTE" +paramField :: String +paramField = "FIELD" +paramGlob :: String +paramGlob = "GLOB" +paramName :: String +paramName = "NAME" +paramValue :: String +paramValue = "VALUE" +paramUUID :: String +paramUUID = "UUID" +paramType :: String +paramType = "TYPE" +paramDate :: String +paramDate = "DATE" +paramTime :: String +paramTime = "TIME" +paramFormat :: String +paramFormat = "FORMAT" +paramFile :: String +paramFile = "FILE" +paramRef :: String +paramRef = "REF" +paramGroup :: String +paramGroup = "GROUP" +paramExpression :: String +paramExpression = "EXPR" +paramSize :: String +paramSize = "SIZE" +paramAddress :: String +paramAddress = "ADDRESS" +paramKeyValue :: String +paramKeyValue = "K=V" +paramNothing :: String +paramNothing = "" +paramRepeating :: String -> String +paramRepeating s = s ++ " ..." +paramOptional :: String -> String +paramOptional s = "[" ++ s ++ "]" +paramPair :: String -> String -> String +paramPair a b = a ++ " " ++ b diff --git a/Command.hs b/Command.hs new file mode 100644 index 000000000..fc440f291 --- /dev/null +++ b/Command.hs @@ -0,0 +1,85 @@ +{- git-annex command infrastructure + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command ( + command, + noRepo, + noCommit, + noMessages, + withOptions, + next, + stop, + stopUnless, + whenAnnexed, + ifAnnexed, + isBareRepo, + checkAuto, + module ReExported +) where + +import Common.Annex +import qualified Backend +import qualified Annex +import qualified Git +import Types.Command as ReExported +import Types.Option as ReExported +import CmdLine.Seek as ReExported +import Checks as ReExported +import CmdLine.Usage as ReExported +import CmdLine.Action as ReExported +import CmdLine.Option as ReExported +import CmdLine.GitAnnex.Options as ReExported + +{- Generates a normal command -} +command :: String -> String -> CommandSeek -> CommandSection -> String -> Command +command = Command [] Nothing commonChecks False False + +{- Indicates that a command doesn't need to commit any changes to + - the git-annex branch. -} +noCommit :: Command -> Command +noCommit c = c { cmdnocommit = True } + +{- Indicates that a command should not output anything other than what + - it directly sends to stdout. (--json can override this). -} +noMessages :: Command -> Command +noMessages c = c { cmdnomessages = True } + +{- Adds a fallback action to a command, that will be run if it's used + - outside a git repository. -} +noRepo :: (CmdParams -> IO ()) -> Command -> Command +noRepo a c = c { cmdnorepo = Just a } + +{- Adds options to a command. -} +withOptions :: [Option] -> Command -> Command +withOptions o c = c { cmdoptions = o } + +{- For start and perform stages to indicate what step to run next. -} +next :: a -> Annex (Maybe a) +next a = return $ Just a + +{- Or to indicate nothing needs to be done. -} +stop :: Annex (Maybe a) +stop = return Nothing + +{- Stops unless a condition is met. -} +stopUnless :: Annex Bool -> Annex (Maybe a) -> Annex (Maybe a) +stopUnless c a = ifM c ( a , stop ) + +{- Modifies an action to only act on files that are already annexed, + - and passes the key on to it. -} +whenAnnexed :: (FilePath -> Key -> Annex (Maybe a)) -> FilePath -> Annex (Maybe a) +whenAnnexed a file = ifAnnexed file (a file) (return Nothing) + +ifAnnexed :: FilePath -> (Key -> Annex a) -> Annex a -> Annex a +ifAnnexed file yes no = maybe no yes =<< Backend.lookupFile file + +isBareRepo :: Annex Bool +isBareRepo = fromRepo Git.repoIsLocalBare + +checkAuto :: Annex Bool -> Annex Bool +checkAuto checker = ifM (Annex.getState Annex.auto) + ( checker , return True ) diff --git a/Command/Add.hs b/Command/Add.hs new file mode 100644 index 000000000..ae895464e --- /dev/null +++ b/Command/Add.hs @@ -0,0 +1,274 @@ +{- git-annex command + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Add where + +import Common.Annex +import Annex.Exception +import Command +import Types.KeySource +import Backend +import Logs.Location +import Annex.Content +import Annex.Content.Direct +import Annex.Perms +import Annex.Link +import Annex.MetaData +import qualified Annex +import qualified Annex.Queue +#ifdef WITH_CLIBS +#ifndef __ANDROID__ +import Utility.Touch +#endif +#endif +import Config +import Utility.InodeCache +import Annex.FileMatcher +import Annex.ReplaceFile +import Utility.Tmp + +def :: [Command] +def = [notBareRepo $ withOptions [includeDotFilesOption] $ + command "add" paramPaths seek SectionCommon + "add files to annex"] + +includeDotFilesOption :: Option +includeDotFilesOption = flagOption [] "include-dotfiles" "don't skip dotfiles" + +{- Add acts on both files not checked into git yet, and unlocked files. + - + - In direct mode, it acts on any files that have changed. -} +seek :: CommandSeek +seek ps = do + matcher <- largeFilesMatcher + let go a = flip a ps $ \file -> ifM (checkFileMatcher matcher file <||> Annex.getState Annex.force) + ( start file + , stop + ) + skipdotfiles <- not <$> Annex.getFlag (optionName includeDotFilesOption) + go $ withFilesNotInGit skipdotfiles + ifM isDirect + ( go withFilesMaybeModified + , go withFilesUnlocked + ) + +{- The add subcommand annexes a file, generating a key for it using a + - backend, and then moving it into the annex directory and setting up + - the symlink pointing to its content. -} +start :: FilePath -> CommandStart +start file = ifAnnexed file addpresent add + where + add = do + ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + case ms of + Nothing -> stop + Just s + | isSymbolicLink s || not (isRegularFile s) -> stop + | otherwise -> do + showStart "add" file + next $ perform file + addpresent key = ifM isDirect + ( ifM (goodContent key file) ( stop , add ) + , fixup key + ) + fixup key = do + -- fixup from an interrupted add; the symlink + -- is present but not yet added to git + showStart "add" file + liftIO $ removeFile file + next $ next $ cleanup file key Nothing =<< inAnnex key + +{- The file that's being added is locked down before a key is generated, + - to prevent it from being modified in between. This lock down is not + - perfect at best (and pretty weak at worst). For example, it does not + - guard against files that are already opened for write by another process. + - So a KeySource is returned. Its inodeCache can be used to detect any + - changes that might be made to the file after it was locked down. + - + - When possible, the file is hard linked to a temp directory. This guards + - against some changes, like deletion or overwrite of the file, and + - allows lsof checks to be done more efficiently when adding a lot of files. + - + - Lockdown can fail if a file gets deleted, and Nothing will be returned. + -} +lockDown :: FilePath -> Annex (Maybe KeySource) +lockDown = either (\e -> showErr e >> return Nothing) (return . Just) <=< lockDown' + +lockDown' :: FilePath -> Annex (Either IOException KeySource) +lockDown' file = ifM crippledFileSystem + ( withTSDelta $ liftIO . tryIO . nohardlink + , tryAnnexIO $ do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory tmp + go tmp + ) + where + {- In indirect mode, the write bit is removed from the file as part + - of lock down to guard against further writes, and because objects + - in the annex have their write bit disabled anyway. + - + - Freezing the content early also lets us fail early when + - someone else owns the file. + - + - This is not done in direct mode, because files there need to + - remain writable at all times. + -} + go tmp = do + unlessM isDirect $ + freezeContent file + withTSDelta $ \delta -> liftIO $ do + (tmpfile, h) <- openTempFile tmp $ + relatedTemplate $ takeFileName file + hClose h + nukeFile tmpfile + withhardlink delta tmpfile `catchIO` const (nohardlink delta) + nohardlink delta = do + cache <- genInodeCache file delta + return KeySource + { keyFilename = file + , contentLocation = file + , inodeCache = cache + } + withhardlink delta tmpfile = do + createLink file tmpfile + cache <- genInodeCache tmpfile delta + return KeySource + { keyFilename = file + , contentLocation = tmpfile + , inodeCache = cache + } + +{- Ingests a locked down file into the annex. + - + - In direct mode, leaves the file alone, and just updates bookkeeping + - information. + -} +ingest :: Maybe KeySource -> Annex (Maybe Key, Maybe InodeCache) +ingest Nothing = return (Nothing, Nothing) +ingest (Just source) = withTSDelta $ \delta -> do + backend <- chooseBackend $ keyFilename source + k <- genKey source backend + ms <- liftIO $ catchMaybeIO $ getFileStatus $ contentLocation source + mcache <- maybe (pure Nothing) (liftIO . toInodeCache delta) ms + case (mcache, inodeCache source) of + (_, Nothing) -> go k mcache ms + (Just newc, Just c) | compareStrong c newc -> go k mcache ms + _ -> failure "changed while it was being added" + where + go k mcache ms = ifM isDirect + ( godirect k mcache ms + , goindirect k mcache ms + ) + + goindirect (Just (key, _)) mcache ms = do + catchAnnex (moveAnnex key $ contentLocation source) + (undo (keyFilename source) key) + maybe noop (genMetaData key (keyFilename source)) ms + liftIO $ nukeFile $ keyFilename source + return $ (Just key, mcache) + goindirect _ _ _ = failure "failed to generate a key" + + godirect (Just (key, _)) (Just cache) ms = do + addInodeCache key cache + maybe noop (genMetaData key (keyFilename source)) ms + finishIngestDirect key source + return $ (Just key, Just cache) + godirect _ _ _ = failure "failed to generate a key" + + failure msg = do + warning $ keyFilename source ++ " " ++ msg + when (contentLocation source /= keyFilename source) $ + liftIO $ nukeFile $ contentLocation source + return (Nothing, Nothing) + +finishIngestDirect :: Key -> KeySource -> Annex () +finishIngestDirect key source = do + void $ addAssociatedFile key $ keyFilename source + when (contentLocation source /= keyFilename source) $ + liftIO $ nukeFile $ contentLocation source + + {- Copy to any other locations using the same key. -} + otherfs <- filter (/= keyFilename source) <$> associatedFiles key + forM_ otherfs $ + addContentWhenNotPresent key (keyFilename source) + +perform :: FilePath -> CommandPerform +perform file = lockDown file >>= ingest >>= go + where + go (Just key, cache) = next $ cleanup file key cache True + go (Nothing, _) = stop + +{- On error, put the file back so it doesn't seem to have vanished. + - This can be called before or after the symlink is in place. -} +undo :: FilePath -> Key -> IOException -> Annex a +undo file key e = do + whenM (inAnnex key) $ do + liftIO $ nukeFile file + catchAnnex (fromAnnex key file) tryharder + logStatus key InfoMissing + throwAnnex e + where + -- fromAnnex could fail if the file ownership is weird + tryharder :: IOException -> Annex () + tryharder _ = do + src <- calcRepo $ gitAnnexLocation key + liftIO $ moveFile src file + +{- Creates the symlink to the annexed content, returns the link target. -} +link :: FilePath -> Key -> Maybe InodeCache -> Annex String +link file key mcache = flip catchAnnex (undo file key) $ do + l <- inRepo $ gitAnnexLink file key + replaceFile file $ makeAnnexLink l + + -- touch symlink to have same time as the original file, + -- as provided in the InodeCache + case mcache of +#if defined(WITH_CLIBS) && ! defined(__ANDROID__) + Just c -> liftIO $ touch file (TimeSpec $ inodeCacheToMtime c) False +#else + Just _ -> noop +#endif + Nothing -> noop + + return l + +{- Creates the symlink to the annexed content, and stages it in git. + - + - As long as the filesystem supports symlinks, we use + - git add, rather than directly staging the symlink to git. + - Using git add is best because it allows the queuing to work + - and is faster (staging the symlink runs hash-object commands each time). + - Also, using git add allows it to skip gitignored files, unless forced + - to include them. + -} +addLink :: FilePath -> Key -> Maybe InodeCache -> Annex () +addLink file key mcache = ifM (coreSymlinks <$> Annex.getGitConfig) + ( do + _ <- link file key mcache + params <- ifM (Annex.getState Annex.force) + ( return [Param "-f"] + , return [] + ) + Annex.Queue.addCommand "add" (params++[Param "--"]) [file] + , do + l <- link file key mcache + addAnnexLink l file + ) + +cleanup :: FilePath -> Key -> Maybe InodeCache -> Bool -> CommandCleanup +cleanup file key mcache hascontent = do + ifM (isDirect <&&> pure hascontent) + ( do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + , addLink file key mcache + ) + when hascontent $ + logStatus key InfoPresent + return True diff --git a/Command/AddUnused.hs b/Command/AddUnused.hs new file mode 100644 index 000000000..91427e819 --- /dev/null +++ b/Command/AddUnused.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.AddUnused where + +import Common.Annex +import Logs.Location +import Command +import qualified Command.Add +import Command.Unused (withUnusedMaps, UnusedMaps(..), startUnused) +import Types.Key + +def :: [Command] +def = [notDirect $ command "addunused" (paramRepeating paramNumRange) + seek SectionMaintenance "add back unused files"] + +seek :: CommandSeek +seek = withUnusedMaps start + +start :: UnusedMaps -> Int -> CommandStart +start = startUnused "addunused" perform + (performOther "bad") + (performOther "tmp") + +perform :: Key -> CommandPerform +perform key = next $ do + logStatus key InfoPresent + Command.Add.addLink file key Nothing + return True + where + file = "unused." ++ key2file key + +{- The content is not in the annex, but in another directory, and + - it seems better to error out, rather than moving bad/tmp content into + - the annex. -} +performOther :: String -> Key -> CommandPerform +performOther other _ = error $ "cannot addunused " ++ other ++ "content" diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs new file mode 100644 index 000000000..c21ce928f --- /dev/null +++ b/Command/AddUrl.hs @@ -0,0 +1,252 @@ +{- git-annex command + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.AddUrl where + +import Network.URI + +import Common.Annex +import Command +import Backend +import qualified Command.Add +import qualified Annex +import qualified Annex.Queue +import qualified Annex.Url as Url +import qualified Backend.URL +import Annex.Content +import Logs.Web +import Types.Key +import Types.KeySource +import Config +import Annex.Content.Direct +import Logs.Location +import qualified Annex.Transfer as Transfer +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +#endif + +def :: [Command] +def = [notBareRepo $ withOptions [fileOption, pathdepthOption, relaxedOption] $ + command "addurl" (paramRepeating paramUrl) seek + SectionCommon "add urls to annex"] + +fileOption :: Option +fileOption = fieldOption [] "file" paramFile "specify what file the url is added to" + +pathdepthOption :: Option +pathdepthOption = fieldOption [] "pathdepth" paramNumber "path components to use in filename" + +relaxedOption :: Option +relaxedOption = flagOption [] "relaxed" "skip size check" + +seek :: CommandSeek +seek ps = do + f <- getOptionField fileOption return + relaxed <- getOptionFlag relaxedOption + d <- getOptionField pathdepthOption (return . maybe Nothing readish) + withStrings (start relaxed f d) ps + +start :: Bool -> Maybe FilePath -> Maybe Int -> String -> CommandStart +start relaxed optfile pathdepth s = go $ fromMaybe bad $ parseURI s + where + (s', downloader) = getDownloader s + bad = fromMaybe (error $ "bad url " ++ s') $ + parseURI $ escapeURIString isUnescapedInURI s' + choosefile = flip fromMaybe optfile + go url = case downloader of + QuviDownloader -> usequvi + DefaultDownloader -> +#ifdef WITH_QUVI + ifM (quviSupported s') + ( usequvi + , regulardownload url + ) +#else + regulardownload url +#endif + regulardownload url = do + pathmax <- liftIO $ fileNameLengthLimit "." + let file = choosefile $ url2file url pathdepth pathmax + showStart "addurl" file + next $ perform relaxed s' file +#ifdef WITH_QUVI + badquvi = error $ "quvi does not know how to download url " ++ s' + usequvi = do + page <- fromMaybe badquvi + <$> withQuviOptions Quvi.forceQuery [Quvi.quiet, Quvi.httponly] s' + let link = fromMaybe badquvi $ headMaybe $ Quvi.pageLinks page + pathmax <- liftIO $ fileNameLengthLimit "." + let file = choosefile $ truncateFilePath pathmax $ sanitizeFilePath $ + Quvi.pageTitle page ++ "." ++ Quvi.linkSuffix link + showStart "addurl" file + next $ performQuvi relaxed s' (Quvi.linkUrl link) file +#else + usequvi = error "not built with quvi support" +#endif + +#ifdef WITH_QUVI +performQuvi :: Bool -> URLString -> URLString -> FilePath -> CommandPerform +performQuvi relaxed pageurl videourl file = ifAnnexed file addurl geturl + where + quviurl = setDownloader pageurl QuviDownloader + addurl key = next $ cleanup quviurl file key Nothing + geturl = next $ isJust <$> addUrlFileQuvi relaxed quviurl videourl file +#endif + +#ifdef WITH_QUVI +addUrlFileQuvi :: Bool -> URLString -> URLString -> FilePath -> Annex (Maybe Key) +addUrlFileQuvi relaxed quviurl videourl file = do + key <- Backend.URL.fromUrl quviurl Nothing + ifM (pure relaxed <||> Annex.getState Annex.fast) + ( do + cleanup' quviurl file key Nothing + return (Just key) + , do + {- Get the size, and use that to check + - disk space. However, the size info is not + - retained, because the size of a video stream + - might change and we want to be able to download + - it later. -} + sizedkey <- addSizeUrlKey videourl key + prepGetViaTmpChecked sizedkey Nothing $ do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + showOutput + ok <- Transfer.notifyTransfer Transfer.Download (Just file) $ + Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do + liftIO $ createDirectoryIfMissing True (parentDir tmp) + downloadUrl [videourl] tmp + if ok + then do + cleanup' quviurl file key (Just tmp) + return (Just key) + else return Nothing + ) +#endif + +perform :: Bool -> URLString -> FilePath -> CommandPerform +perform relaxed url file = ifAnnexed file addurl geturl + where + geturl = next $ isJust <$> addUrlFile relaxed url file + addurl key + | relaxed = do + setUrlPresent key url + next $ return True + | otherwise = ifM (elem url <$> getUrls key) + ( stop + , do + (exists, samesize) <- Url.withUrlOptions $ Url.check url (keySize key) + if exists && samesize + then do + setUrlPresent key url + next $ return True + else do + warning $ "while adding a new url to an already annexed file, " ++ if exists + then "url does not have expected file size (use --relaxed to bypass this check) " ++ url + else "failed to verify url exists: " ++ url + stop + ) + +addUrlFile :: Bool -> URLString -> FilePath -> Annex (Maybe Key) +addUrlFile relaxed url file = do + liftIO $ createDirectoryIfMissing True (parentDir file) + ifM (Annex.getState Annex.fast <||> pure relaxed) + ( nodownload relaxed url file + , do + showAction $ "downloading " ++ url ++ " " + download url file + ) + +download :: URLString -> FilePath -> Annex (Maybe Key) +download url file = do + {- Generate a dummy key to use for this download, before we can + - examine the file and find its real key. This allows resuming + - downloads, as the dummy key for a given url is stable. -} + dummykey <- addSizeUrlKey url =<< Backend.URL.fromUrl url Nothing + prepGetViaTmpChecked dummykey Nothing $ do + tmp <- fromRepo $ gitAnnexTmpObjectLocation dummykey + showOutput + ifM (runtransfer dummykey tmp) + ( do + backend <- chooseBackend file + let source = KeySource + { keyFilename = file + , contentLocation = tmp + , inodeCache = Nothing + } + k <- genKey source backend + case k of + Nothing -> return Nothing + Just (key, _) -> do + cleanup' url file key (Just tmp) + return (Just key) + , return Nothing + ) + where + runtransfer dummykey tmp = Transfer.notifyTransfer Transfer.Download (Just file) $ + Transfer.download webUUID dummykey (Just file) Transfer.forwardRetry $ const $ do + liftIO $ createDirectoryIfMissing True (parentDir tmp) + downloadUrl [url] tmp + +{- Hits the url to get the size, if available. + - + - This is needed to avoid exceeding the diskreserve when downloading, + - and so the assistant can display a pretty progress bar. + -} +addSizeUrlKey :: URLString -> Key -> Annex Key +addSizeUrlKey url key = do + size <- snd <$> Url.withUrlOptions (Url.exists url) + return $ key { keySize = size } + +cleanup :: URLString -> FilePath -> Key -> Maybe FilePath -> Annex Bool +cleanup url file key mtmp = do + cleanup' url file key mtmp + return True + +cleanup' :: URLString -> FilePath -> Key -> Maybe FilePath -> Annex () +cleanup' url file key mtmp = do + when (isJust mtmp) $ + logStatus key InfoPresent + setUrlPresent key url + Command.Add.addLink file key Nothing + whenM isDirect $ do + void $ addAssociatedFile key file + {- For moveAnnex to work in direct mode, the symlink + - must already exist, so flush the queue. -} + Annex.Queue.flush + maybe noop (moveAnnex key) mtmp + +nodownload :: Bool -> URLString -> FilePath -> Annex (Maybe Key) +nodownload relaxed url file = do + (exists, size) <- if relaxed + then pure (True, Nothing) + else Url.withUrlOptions (Url.exists url) + if exists + then do + key <- Backend.URL.fromUrl url size + cleanup' url file key Nothing + return (Just key) + else do + warning $ "unable to access url: " ++ url + return Nothing + +url2file :: URI -> Maybe Int -> Int -> FilePath +url2file url pathdepth pathmax = case pathdepth of + Nothing -> truncateFilePath pathmax $ sanitizeFilePath fullurl + Just depth + | depth >= length urlbits -> frombits id + | depth > 0 -> frombits $ drop depth + | depth < 0 -> frombits $ reverse . take (negate depth) . reverse + | otherwise -> error "bad --pathdepth" + where + fullurl = uriRegName auth ++ uriPath url ++ uriQuery url + frombits a = intercalate "/" $ a urlbits + urlbits = map (truncateFilePath pathmax . sanitizeFilePath) $ + filter (not . null) $ split "/" fullurl + auth = fromMaybe (error $ "bad url " ++ show url) $ uriAuthority url diff --git a/Command/Assistant.hs b/Command/Assistant.hs new file mode 100644 index 000000000..8316a9948 --- /dev/null +++ b/Command/Assistant.hs @@ -0,0 +1,90 @@ +{- git-annex assistant + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Assistant where + +import Common.Annex +import Command +import qualified Command.Watch +import Annex.Init +import Config.Files +import qualified Build.SysConfig +import Utility.HumanTime +import Assistant.Install + +import System.Environment + +def :: [Command] +def = [noRepo checkAutoStart $ dontCheck repoExists $ withOptions options $ + notBareRepo $ command "assistant" paramNothing seek SectionCommon + "automatically handle changes"] + +options :: [Option] +options = + [ Command.Watch.foregroundOption + , Command.Watch.stopOption + , autoStartOption + , startDelayOption + ] + +autoStartOption :: Option +autoStartOption = flagOption [] "autostart" "start in known repositories" + +startDelayOption :: Option +startDelayOption = fieldOption [] "startdelay" paramNumber "delay before running startup scan" + +seek :: CommandSeek +seek ps = do + stopdaemon <- getOptionFlag Command.Watch.stopOption + foreground <- getOptionFlag Command.Watch.foregroundOption + autostart <- getOptionFlag autoStartOption + startdelay <- getOptionField startDelayOption (pure . maybe Nothing parseDuration) + withNothing (start foreground stopdaemon autostart startdelay) ps + +start :: Bool -> Bool -> Bool -> Maybe Duration -> CommandStart +start foreground stopdaemon autostart startdelay + | autostart = do + liftIO $ autoStart startdelay + stop + | otherwise = do + liftIO ensureInstalled + ensureInitialized + Command.Watch.start True foreground stopdaemon startdelay + +{- Run outside a git repository. Check to see if any parameter is + - --autostart and enter autostart mode. -} +checkAutoStart :: CmdParams -> IO () +checkAutoStart _ = ifM (elem "--autostart" <$> getArgs) + ( autoStart Nothing + , error "Not in a git repository." + ) + +autoStart :: Maybe Duration -> IO () +autoStart startdelay = do + dirs <- liftIO readAutoStartFile + when (null dirs) $ do + f <- autoStartFile + error $ "Nothing listed in " ++ f + program <- readProgramFile + haveionice <- pure Build.SysConfig.ionice <&&> inPath "ionice" + forM_ dirs $ \d -> do + putStrLn $ "git-annex autostart in " ++ d + ifM (catchBoolIO $ go haveionice program d) + ( putStrLn "ok" + , putStrLn "failed" + ) + where + go haveionice program dir = do + setCurrentDirectory dir + if haveionice + then boolSystem "ionice" (Param "-c3" : Param program : baseparams) + else boolSystem program baseparams + where + baseparams = + [ Param "assistant" + , Param $ "--startdelay=" ++ fromDuration (fromMaybe (Duration 5) startdelay) + ] diff --git a/Command/Commit.hs b/Command/Commit.hs new file mode 100644 index 000000000..f5f13d248 --- /dev/null +++ b/Command/Commit.hs @@ -0,0 +1,29 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Commit where + +import Common.Annex +import Command +import qualified Annex.Branch +import qualified Git + +def :: [Command] +def = [command "commit" paramNothing seek + SectionPlumbing "commits any staged changes to the git-annex branch"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = next $ next $ do + Annex.Branch.commit "update" + _ <- runhook <=< inRepo $ Git.hookPath "annex-content" + return True + where + runhook (Just hook) = liftIO $ boolSystem hook [] + runhook Nothing = return True diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs new file mode 100644 index 000000000..219685c21 --- /dev/null +++ b/Command/ConfigList.hs @@ -0,0 +1,46 @@ +{- git-annex command + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ConfigList where + +import Common.Annex +import Command +import Annex.UUID +import Annex.Init +import qualified Annex.Branch +import qualified Git.Config +import Remote.GCrypt (coreGCryptId) + +def :: [Command] +def = [noCommit $ command "configlist" paramNothing seek + SectionPlumbing "outputs relevant git configuration"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + u <- findOrGenUUID + showConfig "annex.uuid" $ fromUUID u + showConfig coreGCryptId =<< fromRepo (Git.Config.get coreGCryptId "") + stop + where + showConfig k v = liftIO $ putStrLn $ k ++ "=" ++ v + +{- The repository may not yet have a UUID; automatically initialize it + - when there's a git-annex branch available. -} +findOrGenUUID :: Annex UUID +findOrGenUUID = do + u <- getUUID + if u /= NoUUID + then return u + else ifM Annex.Branch.hasSibling + ( do + initialize Nothing + getUUID + , return NoUUID + ) diff --git a/Command/Copy.hs b/Command/Copy.hs new file mode 100644 index 000000000..ae254aae2 --- /dev/null +++ b/Command/Copy.hs @@ -0,0 +1,40 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Copy where + +import Common.Annex +import Command +import qualified Command.Move +import qualified Remote +import Annex.Wanted +import Config.NumCopies + +def :: [Command] +def = [withOptions Command.Move.moveOptions $ command "copy" paramPaths seek + SectionCommon "copy content of files to/from another repository"] + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (Command.Move.startKey to from False) + (withFilesInGit $ whenAnnexed $ start to from) + ps + +{- A copy is just a move that does not delete the source file. + - However, --auto mode avoids unnecessary copies, and avoids getting or + - sending non-preferred content. -} +start :: Maybe Remote -> Maybe Remote -> FilePath -> Key -> CommandStart +start to from file key = stopUnless shouldCopy $ + Command.Move.start to from False file key + where + shouldCopy = checkAuto (check <||> numCopiesCheck file key (<)) + check = case to of + Nothing -> wantGet False (Just key) (Just file) + Just r -> wantSend False (Just key) (Just file) (Remote.uuid r) diff --git a/Command/Dead.hs b/Command/Dead.hs new file mode 100644 index 000000000..f9e5c2e27 --- /dev/null +++ b/Command/Dead.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Dead where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "dead" (paramRepeating paramRemote) seek + SectionSetup "hide a lost repository"] + +seek :: CommandSeek +seek = trustCommand "dead" DeadTrusted diff --git a/Command/Describe.hs b/Command/Describe.hs new file mode 100644 index 000000000..601b3fcc9 --- /dev/null +++ b/Command/Describe.hs @@ -0,0 +1,32 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Describe where + +import Common.Annex +import Command +import qualified Remote +import Logs.UUID + +def :: [Command] +def = [command "describe" (paramPair paramRemote paramDesc) seek + SectionSetup "change description of a repository"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:description) = do + showStart "describe" name + u <- Remote.nameToUUID name + next $ perform u $ unwords description +start _ = error "Specify a repository and a description." + +perform :: UUID -> String -> CommandPerform +perform u description = do + describeUUID u description + next $ return True diff --git a/Command/Direct.hs b/Command/Direct.hs new file mode 100644 index 000000000..a5165a4a2 --- /dev/null +++ b/Command/Direct.hs @@ -0,0 +1,70 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Direct where + +import Control.Exception.Extensible + +import Common.Annex +import Command +import qualified Git +import qualified Git.LsFiles +import qualified Git.Branch +import Config +import Annex.Direct +import Annex.Exception + +def :: [Command] +def = [notBareRepo $ noDaemonRunning $ + command "direct" paramNothing seek + SectionSetup "switch repository to direct mode"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = ifM isDirect ( stop , next perform ) + +perform :: CommandPerform +perform = do + showStart "commit" "" + showOutput + _ <- inRepo $ Git.Branch.commitCommand Git.Branch.ManualCommit + [ Param "-a" + , Param "-m" + , Param "commit before switching to direct mode" + ] + showEndOk + + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + forM_ l go + void $ liftIO clean + next cleanup + where + go = whenAnnexed $ \f k -> do + r <- toDirectGen k f + case r of + Nothing -> noop + Just a -> do + showStart "direct" f + r' <- tryAnnex a + case r' of + Left e -> warnlocked e + Right _ -> showEndOk + return Nothing + + warnlocked :: SomeException -> Annex () + warnlocked e = do + warning $ show e + warning "leaving this file as-is; correct this problem and run git annex fsck on it" + +cleanup :: CommandCleanup +cleanup = do + showStart "direct" "" + setDirect True + return True diff --git a/Command/Drop.hs b/Command/Drop.hs new file mode 100644 index 000000000..4bac07a53 --- /dev/null +++ b/Command/Drop.hs @@ -0,0 +1,191 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Drop where + +import Common.Annex +import Command +import qualified Remote +import qualified Annex +import Annex.UUID +import Logs.Location +import Logs.Trust +import Logs.PreferredContent +import Config.NumCopies +import Annex.Content +import Annex.Wanted +import Annex.Notification + +import qualified Data.Set as S + +def :: [Command] +def = [withOptions [dropFromOption] $ command "drop" paramPaths seek + SectionCommon "indicate content of files not currently wanted"] + +dropFromOption :: Option +dropFromOption = fieldOption ['f'] "from" paramRemote "drop content from a remote" + +seek :: CommandSeek +seek ps = do + from <- getOptionField dropFromOption Remote.byNameWithUUID + withFilesInGit (whenAnnexed $ start from) ps + +start :: Maybe Remote -> FilePath -> Key -> CommandStart +start from file key = checkDropAuto from file key $ \numcopies -> + stopUnless (checkAuto $ wantDrop False (Remote.uuid <$> from) (Just key) (Just file)) $ + case from of + Nothing -> startLocal (Just file) numcopies key Nothing + Just remote -> do + u <- getUUID + if Remote.uuid remote == u + then startLocal (Just file) numcopies key Nothing + else startRemote (Just file) numcopies key remote + +startLocal :: AssociatedFile -> NumCopies -> Key -> Maybe Remote -> CommandStart +startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ do + showStart' "drop" key afile + next $ performLocal key afile numcopies knownpresentremote + +startRemote :: AssociatedFile -> NumCopies -> Key -> Remote -> CommandStart +startRemote afile numcopies key remote = do + showStart' ("drop " ++ Remote.name remote) key afile + next $ performRemote key afile numcopies remote + +performLocal :: Key -> AssociatedFile -> NumCopies -> Maybe Remote -> CommandPerform +performLocal key afile numcopies knownpresentremote = lockContent key $ do + (remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key + let trusteduuids' = case knownpresentremote of + Nothing -> trusteduuids + Just r -> nub (Remote.uuid r:trusteduuids) + untrusteduuids <- trustGet UnTrusted + let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids'++untrusteduuids) + u <- getUUID + ifM (canDrop u key afile numcopies trusteduuids' tocheck []) + ( do + removeAnnex key + notifyDrop afile True + next $ cleanupLocal key + , do + notifyDrop afile False + stop + ) + +performRemote :: Key -> AssociatedFile -> NumCopies -> Remote -> CommandPerform +performRemote key afile numcopies remote = lockContent key $ do + -- Filter the remote it's being dropped from out of the lists of + -- places assumed to have the key, and places to check. + -- When the local repo has the key, that's one additional copy, + -- as long asthe local repo is not untrusted. + (remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key + present <- inAnnex key + u <- getUUID + trusteduuids' <- if present + then ifM ((<= SemiTrusted) <$> lookupTrust u) + ( pure (u:trusteduuids) + , pure trusteduuids + ) + else pure trusteduuids + let have = filter (/= uuid) trusteduuids' + untrusteduuids <- trustGet UnTrusted + let tocheck = filter (/= remote) $ + Remote.remotesWithoutUUID remotes (have++untrusteduuids) + stopUnless (canDrop uuid key afile numcopies have tocheck [uuid]) $ do + ok <- Remote.removeKey remote key + next $ cleanupRemote key remote ok + where + uuid = Remote.uuid remote + +cleanupLocal :: Key -> CommandCleanup +cleanupLocal key = do + logStatus key InfoMissing + return True + +cleanupRemote :: Key -> Remote -> Bool -> CommandCleanup +cleanupRemote key remote ok = do + when ok $ + Remote.logStatus remote key InfoMissing + return ok + +{- Checks specified remotes to verify that enough copies of a key exist to + - allow it to be safely removed (with no data loss). Can be provided with + - some locations where the key is known/assumed to be present. + - + - Also checks if it's required content, and refuses to drop if so. + - + - --force overrides and always allows dropping. + -} +canDrop :: UUID -> Key -> AssociatedFile -> NumCopies -> [UUID] -> [Remote] -> [UUID] -> Annex Bool +canDrop dropfrom key afile numcopies have check skip = ifM (Annex.getState Annex.force) + ( return True + , checkRequiredContent dropfrom key afile + <&&> + findCopies key numcopies skip have check + ) + +findCopies :: Key -> NumCopies -> [UUID] -> [UUID] -> [Remote] -> Annex Bool +findCopies key need skip = helper [] [] + where + helper bad missing have [] + | NumCopies (length have) >= need = return True + | otherwise = notEnoughCopies key need have (skip++missing) bad + helper bad missing have (r:rs) + | NumCopies (length have) >= need = return True + | otherwise = do + let u = Remote.uuid r + let duplicate = u `elem` have + haskey <- Remote.hasKey r key + case (duplicate, haskey) of + (False, Right True) -> helper bad missing (u:have) rs + (False, Left _) -> helper (r:bad) missing have rs + (False, Right False) -> helper bad (u:missing) have rs + _ -> helper bad missing have rs + +notEnoughCopies :: Key -> NumCopies -> [UUID] -> [UUID] -> [Remote] -> Annex Bool +notEnoughCopies key need have skip bad = do + unsafe + showLongNote $ + "Could only verify the existence of " ++ + show (length have) ++ " out of " ++ show (fromNumCopies need) ++ + " necessary copies" + Remote.showTriedRemotes bad + Remote.showLocations key (have++skip) + "Rather than dropping this file, try using: git annex move" + hint + return False + where + unsafe = showNote "unsafe" + hint = showLongNote "(Use --force to override this check, or adjust numcopies.)" + +checkRequiredContent :: UUID -> Key -> AssociatedFile -> Annex Bool +checkRequiredContent u k afile = + ifM (isRequiredContent (Just u) S.empty (Just k) afile False) + ( requiredContent + , return True + ) + +requiredContent :: Annex Bool +requiredContent = do + showLongNote "That file is required content, it cannot be dropped!" + showLongNote "(Use --force to override this check, or adjust required content configuration.)" + return False + +{- In auto mode, only runs the action if there are enough + - copies on other semitrusted repositories. -} +checkDropAuto :: Maybe Remote -> FilePath -> Key -> (NumCopies -> CommandStart) -> CommandStart +checkDropAuto mremote file key a = do + numcopies <- getFileNumCopies file + Annex.getState Annex.auto >>= auto numcopies + where + auto numcopies False = a numcopies + auto numcopies True = do + locs <- Remote.keyLocations key + uuid <- getUUID + let remoteuuid = fromMaybe uuid $ Remote.uuid <$> mremote + locs' <- trustExclude UnTrusted $ filter (/= remoteuuid) locs + if NumCopies (length locs') >= numcopies + then a numcopies + else stop diff --git a/Command/DropKey.hs b/Command/DropKey.hs new file mode 100644 index 000000000..125e6ded4 --- /dev/null +++ b/Command/DropKey.hs @@ -0,0 +1,38 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.DropKey where + +import Common.Annex +import Command +import qualified Annex +import Logs.Location +import Annex.Content + +def :: [Command] +def = [noCommit $ command "dropkey" (paramRepeating paramKey) seek + SectionPlumbing "drops annexed content for specified keys"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = stopUnless (inAnnex key) $ do + unlessM (Annex.getState Annex.force) $ + error "dropkey can cause data loss; use --force if you're sure you want to do this" + showStart' "dropkey" key Nothing + next $ perform key + +perform :: Key -> CommandPerform +perform key = lockContent key $ do + removeAnnex key + next $ cleanup key + +cleanup :: Key -> CommandCleanup +cleanup key = do + logStatus key InfoMissing + return True diff --git a/Command/DropUnused.hs b/Command/DropUnused.hs new file mode 100644 index 000000000..ce49795c9 --- /dev/null +++ b/Command/DropUnused.hs @@ -0,0 +1,45 @@ +{- git-annex command + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.DropUnused where + +import Common.Annex +import Command +import qualified Annex +import qualified Command.Drop +import qualified Remote +import qualified Git +import Command.Unused (withUnusedMaps, UnusedMaps(..), startUnused) +import Config.NumCopies + +def :: [Command] +def = [withOptions [Command.Drop.dropFromOption] $ + command "dropunused" (paramRepeating paramNumRange) + seek SectionMaintenance "drop unused file content"] + +seek :: CommandSeek +seek ps = do + numcopies <- getNumCopies + withUnusedMaps (start numcopies) ps + +start :: NumCopies -> UnusedMaps -> Int -> CommandStart +start numcopies = startUnused "dropunused" (perform numcopies) (performOther gitAnnexBadLocation) (performOther gitAnnexTmpObjectLocation) + +perform :: NumCopies -> Key -> CommandPerform +perform numcopies key = maybe droplocal dropremote =<< Remote.byNameWithUUID =<< from + where + dropremote r = do + showAction $ "from " ++ Remote.name r + Command.Drop.performRemote key Nothing numcopies r + droplocal = Command.Drop.performLocal key Nothing numcopies Nothing + from = Annex.getField $ optionName Command.Drop.dropFromOption + +performOther :: (Key -> Git.Repo -> FilePath) -> Key -> CommandPerform +performOther filespec key = do + f <- fromRepo $ filespec key + liftIO $ nukeFile f + next $ return True diff --git a/Command/EnableRemote.hs b/Command/EnableRemote.hs new file mode 100644 index 000000000..42ab43374 --- /dev/null +++ b/Command/EnableRemote.hs @@ -0,0 +1,56 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.EnableRemote where + +import Common.Annex +import Command +import qualified Logs.Remote +import qualified Types.Remote as R +import qualified Command.InitRemote as InitRemote + +import qualified Data.Map as M + +def :: [Command] +def = [command "enableremote" + (paramPair paramName $ paramOptional $ paramRepeating paramKeyValue) + seek SectionSetup "enables use of an existing special remote"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = unknownNameError "Specify the name of the special remote to enable." +start (name:ws) = go =<< InitRemote.findExisting name + where + config = Logs.Remote.keyValToConfig ws + + go Nothing = unknownNameError "Unknown special remote name." + go (Just (u, c)) = do + let fullconfig = config `M.union` c + t <- InitRemote.findType fullconfig + + showStart "enableremote" name + next $ perform t u fullconfig + +unknownNameError :: String -> Annex a +unknownNameError prefix = do + names <- InitRemote.remoteNames + error $ prefix ++ "\n" ++ + if null names + then "(No special remotes are currently known; perhaps use initremote instead?)" + else "Known special remotes: " ++ unwords names + +perform :: RemoteType -> UUID -> R.RemoteConfig -> CommandPerform +perform t u c = do + (c', u') <- R.setup t (Just u) Nothing c + next $ cleanup u' c' + +cleanup :: UUID -> R.RemoteConfig -> CommandCleanup +cleanup u c = do + Logs.Remote.configSet u c + return True diff --git a/Command/ExamineKey.hs b/Command/ExamineKey.hs new file mode 100644 index 000000000..dd2bec507 --- /dev/null +++ b/Command/ExamineKey.hs @@ -0,0 +1,29 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ExamineKey where + +import Common.Annex +import Command +import qualified Utility.Format +import Command.Find (formatOption, getFormat, showFormatted, keyVars) +import Types.Key + +def :: [Command] +def = [noCommit $ noMessages $ withOptions [formatOption, jsonOption] $ + command "examinekey" (paramRepeating paramKey) seek + SectionPlumbing "prints information from a key"] + +seek :: CommandSeek +seek ps = do + format <- getFormat + withKeys (start format) ps + +start :: Maybe Utility.Format.Format -> Key -> CommandStart +start format key = do + showFormatted format (key2file key) (keyVars key) + stop diff --git a/Command/Find.hs b/Command/Find.hs new file mode 100644 index 000000000..c800933f9 --- /dev/null +++ b/Command/Find.hs @@ -0,0 +1,74 @@ +{- git-annex command + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Find where + +import qualified Data.Map as M + +import Common.Annex +import Command +import Annex.Content +import Limit +import qualified Annex +import qualified Utility.Format +import Utility.DataUnits +import Types.Key + +def :: [Command] +def = [mkCommand $ command "find" paramPaths seek SectionQuery "lists available files"] + +mkCommand :: Command -> Command +mkCommand = noCommit . noMessages . withOptions [formatOption, print0Option, jsonOption] + +formatOption :: Option +formatOption = fieldOption [] "format" paramFormat "control format of output" + +getFormat :: Annex (Maybe Utility.Format.Format) +getFormat = getOptionField formatOption $ return . fmap Utility.Format.gen + +print0Option :: Option +print0Option = Option [] ["print0"] (NoArg set) + "terminate output with null" + where + set = Annex.setField (optionName formatOption) "${file}\0" + +seek :: CommandSeek +seek ps = do + format <- getFormat + withFilesInGit (whenAnnexed $ start format) ps + +start :: Maybe Utility.Format.Format -> FilePath -> Key -> CommandStart +start format file key = do + -- only files inAnnex are shown, unless the user has requested + -- others via a limit + whenM (limited <||> inAnnex key) $ + showFormatted format file $ ("file", file) : keyVars key + stop + +showFormatted :: Maybe Utility.Format.Format -> String -> [(String, String)] -> Annex () +showFormatted format unformatted vars = + unlessM (showFullJSON vars) $ + case format of + Nothing -> liftIO $ putStrLn unformatted + Just formatter -> liftIO $ putStr $ + Utility.Format.format formatter $ + M.fromList vars + +keyVars :: Key -> [(String, String)] +keyVars key = + [ ("key", key2file key) + , ("backend", keyBackendName key) + , ("bytesize", size show) + , ("humansize", size $ roughSize storageUnits True) + , ("keyname", keyName key) + , ("hashdirlower", hashDirLower key) + , ("hashdirmixed", hashDirMixed key) + , ("mtime", whenavail show $ keyMtime key) + ] + where + size c = whenavail c $ keySize key + whenavail = maybe "unknown" diff --git a/Command/FindRef.hs b/Command/FindRef.hs new file mode 100644 index 000000000..26007f7c0 --- /dev/null +++ b/Command/FindRef.hs @@ -0,0 +1,20 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.FindRef where + +import Command +import qualified Command.Find as Find + +def :: [Command] +def = [Find.mkCommand $ command "findref" paramRef seek SectionPlumbing + "lists files in a git ref"] + +seek :: CommandSeek +seek refs = do + format <- Find.getFormat + Find.start format `withFilesInRefs` refs diff --git a/Command/Fix.hs b/Command/Fix.hs new file mode 100644 index 000000000..0c2bf5942 --- /dev/null +++ b/Command/Fix.hs @@ -0,0 +1,59 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Fix where + +import Common.Annex +import Command +import qualified Annex.Queue +#ifdef WITH_CLIBS +#ifndef __ANDROID__ +import Utility.Touch +#endif +#endif + +def :: [Command] +def = [notDirect $ noCommit $ command "fix" paramPaths seek + SectionMaintenance "fix up symlinks to point to annexed content"] + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +{- Fixes the symlink to an annexed file. -} +start :: FilePath -> Key -> CommandStart +start file key = do + link <- inRepo $ gitAnnexLink file key + stopUnless ((/=) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file)) $ do + showStart "fix" file + next $ perform file link + +perform :: FilePath -> FilePath -> CommandPerform +perform file link = do + liftIO $ do +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + -- preserve mtime of symlink + mtime <- catchMaybeIO $ TimeSpec . modificationTime + <$> getSymbolicLinkStatus file +#endif +#endif + createDirectoryIfMissing True (parentDir file) + removeFile file + createSymbolicLink link file +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + maybe noop (\t -> touch file t False) mtime +#endif +#endif + next $ cleanup file + +cleanup :: FilePath -> CommandCleanup +cleanup file = do + Annex.Queue.addCommand "add" [Param "--force", Param "--"] [file] + return True diff --git a/Command/Forget.hs b/Command/Forget.hs new file mode 100644 index 000000000..dbcce6cc3 --- /dev/null +++ b/Command/Forget.hs @@ -0,0 +1,52 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Forget where + +import Common.Annex +import Command +import qualified Annex.Branch as Branch +import Logs.Transitions +import qualified Annex + +import Data.Time.Clock.POSIX + +def :: [Command] +def = [withOptions forgetOptions $ command "forget" paramNothing seek + SectionMaintenance "prune git-annex branch history"] + +forgetOptions :: [Option] +forgetOptions = [dropDeadOption] + +dropDeadOption :: Option +dropDeadOption = flagOption [] "drop-dead" "drop references to dead repositories" + +seek :: CommandSeek +seek ps = do + dropdead <- getOptionFlag dropDeadOption + withNothing (start dropdead) ps + +start :: Bool -> CommandStart +start dropdead = do + showStart "forget" "git-annex" + now <- liftIO getPOSIXTime + let basets = addTransition now ForgetGitHistory noTransitions + let ts = if dropdead + then addTransition now ForgetDeadRemotes basets + else basets + next $ perform ts =<< Annex.getState Annex.force + +perform :: Transitions -> Bool -> CommandPerform +perform ts True = do + recordTransitions Branch.change ts + -- get branch committed before contining with the transition + Branch.update + void $ Branch.performTransitions ts True [] + next $ return True +perform _ False = do + showLongNote "To forget git-annex branch history, you must specify --force. This deletes metadata!" + stop diff --git a/Command/FromKey.hs b/Command/FromKey.hs new file mode 100644 index 000000000..7eb62fa4e --- /dev/null +++ b/Command/FromKey.hs @@ -0,0 +1,44 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.FromKey where + +import Common.Annex +import Command +import qualified Annex.Queue +import Annex.Content +import Types.Key + +def :: [Command] +def = [notDirect $ notBareRepo $ + command "fromkey" (paramPair paramKey paramPath) seek + SectionPlumbing "adds a file using a specific key"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (keyname:file:[]) = do + let key = fromMaybe (error "bad key") $ file2key keyname + inbackend <- inAnnex key + unless inbackend $ error $ + "key ("++ keyname ++") is not present in backend" + showStart "fromkey" file + next $ perform key file +start _ = error "specify a key and a dest file" + +perform :: Key -> FilePath -> CommandPerform +perform key file = do + link <- inRepo $ gitAnnexLink file key + liftIO $ createDirectoryIfMissing True (parentDir file) + liftIO $ createSymbolicLink link file + next $ cleanup file + +cleanup :: FilePath -> CommandCleanup +cleanup file = do + Annex.Queue.addCommand "add" [Param "--"] [file] + return True diff --git a/Command/Fsck.hs b/Command/Fsck.hs new file mode 100644 index 000000000..a17662d62 --- /dev/null +++ b/Command/Fsck.hs @@ -0,0 +1,517 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Fsck where + +import Common.Annex +import Command +import qualified Annex +import qualified Remote +import qualified Types.Backend +import qualified Types.Key +import qualified Backend +import Annex.Content +import Annex.Content.Direct +import Annex.Direct +import Annex.Perms +import Annex.Link +import Logs.Location +import Logs.Trust +import Config.NumCopies +import Annex.UUID +import Utility.DataUnits +import Utility.FileMode +import Config +import Types.Key +import Types.CleanupActions +import Utility.HumanTime +import Git.FilePath +import Utility.PID + +import Data.Time.Clock.POSIX +import Data.Time +import System.Posix.Types (EpochTime) +import System.Locale + +def :: [Command] +def = [withOptions fsckOptions $ command "fsck" paramPaths seek + SectionMaintenance "check for problems"] + +fsckFromOption :: Option +fsckFromOption = fieldOption ['f'] "from" paramRemote "check remote" + +startIncrementalOption :: Option +startIncrementalOption = flagOption ['S'] "incremental" "start an incremental fsck" + +moreIncrementalOption :: Option +moreIncrementalOption = flagOption ['m'] "more" "continue an incremental fsck" + +incrementalScheduleOption :: Option +incrementalScheduleOption = fieldOption [] "incremental-schedule" paramTime + "schedule incremental fscking" + +fsckOptions :: [Option] +fsckOptions = + [ fsckFromOption + , startIncrementalOption + , moreIncrementalOption + , incrementalScheduleOption + ] ++ keyOptions + +seek :: CommandSeek +seek ps = do + from <- getOptionField fsckFromOption Remote.byNameWithUUID + i <- getIncremental + withKeyOptions + (\k -> startKey i k =<< getNumCopies) + (withFilesInGit $ whenAnnexed $ start from i) + ps + +getIncremental :: Annex Incremental +getIncremental = do + i <- maybe (return False) (checkschedule . parseDuration) + =<< Annex.getField (optionName incrementalScheduleOption) + starti <- Annex.getFlag (optionName startIncrementalOption) + morei <- Annex.getFlag (optionName moreIncrementalOption) + case (i, starti, morei) of + (False, False, False) -> return NonIncremental + (False, True, False) -> startIncremental + (False ,False, True) -> ContIncremental <$> getStartTime + (True, False, False) -> + maybe startIncremental (return . ContIncremental . Just) + =<< getStartTime + _ -> error "Specify only one of --incremental, --more, or --incremental-schedule" + where + startIncremental = do + recordStartTime + return StartIncremental + + checkschedule Nothing = error "bad --incremental-schedule value" + checkschedule (Just delta) = do + Annex.addCleanup FsckCleanup $ do + v <- getStartTime + case v of + Nothing -> noop + Just started -> do + now <- liftIO getPOSIXTime + when (now - realToFrac started >= durationToPOSIXTime delta) + resetStartTime + return True + +start :: Maybe Remote -> Incremental -> FilePath -> Key -> CommandStart +start from inc file key = do + v <- Backend.getBackend file key + case v of + Nothing -> stop + Just backend -> do + numcopies <- getFileNumCopies file + case from of + Nothing -> go $ perform key file backend numcopies + Just r -> go $ performRemote key file backend numcopies r + where + go = runFsck inc file key + +perform :: Key -> FilePath -> Backend -> NumCopies -> Annex Bool +perform key file backend numcopies = check + -- order matters + [ fixLink key file + , verifyLocationLog key file + , verifyDirectMapping key file + , verifyDirectMode key file + , checkKeySize key + , checkBackend backend key (Just file) + , checkKeyNumCopies key file numcopies + ] + +{- To fsck a remote, the content is retrieved to a tmp file, + - and checked locally. -} +performRemote :: Key -> FilePath -> Backend -> NumCopies -> Remote -> Annex Bool +performRemote key file backend numcopies remote = + dispatch =<< Remote.hasKey remote key + where + dispatch (Left err) = do + showNote err + return False + dispatch (Right True) = withtmp $ \tmpfile -> + ifM (getfile tmpfile) + ( go True (Just tmpfile) + , go True Nothing + ) + dispatch (Right False) = go False Nothing + go present localcopy = check + [ verifyLocationLogRemote key file remote present + , checkKeySizeRemote key remote localcopy + , checkBackendRemote backend key remote localcopy + , checkKeyNumCopies key file numcopies + ] + withtmp a = do + pid <- liftIO getPID + t <- fromRepo gitAnnexTmpObjectDir + createAnnexDirectory t + let tmp = t "fsck" ++ show pid ++ "." ++ keyFile key + let cleanup = liftIO $ catchIO (removeFile tmp) (const noop) + cleanup + cleanup `after` a tmp + getfile tmp = + ifM (Remote.retrieveKeyFileCheap remote key tmp) + ( return True + , ifM (Annex.getState Annex.fast) + ( return False + , Remote.retrieveKeyFile remote key Nothing tmp dummymeter + ) + ) + dummymeter _ = noop + +startKey :: Incremental -> Key -> NumCopies -> CommandStart +startKey inc key numcopies = + case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of + Nothing -> stop + Just backend -> runFsck inc (key2file key) key $ + performKey key backend numcopies + +performKey :: Key -> Backend -> NumCopies -> Annex Bool +performKey key backend numcopies = check + [ verifyLocationLog key (key2file key) + , checkKeySize key + , checkBackend backend key Nothing + , checkKeyNumCopies key (key2file key) numcopies + ] + +check :: [Annex Bool] -> Annex Bool +check cs = and <$> sequence cs + +{- Checks that the file's link points correctly to the content. + - + - In direct mode, there is only a link when the content is not present. + -} +fixLink :: Key -> FilePath -> Annex Bool +fixLink key file = do + want <- inRepo $ gitAnnexLink file key + have <- getAnnexLinkTarget file + maybe noop (go want) have + return True + where + go want have + | want /= fromInternalGitPath have = do + showNote "fixing link" + liftIO $ createDirectoryIfMissing True (parentDir file) + liftIO $ removeFile file + addAnnexLink want file + | otherwise = noop + +{- Checks that the location log reflects the current status of the key, + - in this repository only. -} +verifyLocationLog :: Key -> String -> Annex Bool +verifyLocationLog key desc = do + present <- inAnnex key + direct <- isDirect + u <- getUUID + + {- Since we're checking that a key's file is present, throw + - in a permission fixup here too. -} + file <- calcRepo $ gitAnnexLocation key + when (present && not direct) $ + freezeContent file + whenM (liftIO $ doesDirectoryExist $ parentDir file) $ + freezeContentDir file + + {- In direct mode, modified files will show up as not present, + - but that is expected and not something to do anything about. -} + if direct && not present + then return True + else verifyLocationLog' key desc present u (logChange key u) + +verifyLocationLogRemote :: Key -> String -> Remote -> Bool -> Annex Bool +verifyLocationLogRemote key desc remote present = + verifyLocationLog' key desc present (Remote.uuid remote) + (Remote.logStatus remote key) + +verifyLocationLog' :: Key -> String -> Bool -> UUID -> (LogStatus -> Annex ()) -> Annex Bool +verifyLocationLog' key desc present u updatestatus = do + uuids <- Remote.keyLocations key + case (present, u `elem` uuids) of + (True, False) -> do + fix InfoPresent + -- There is no data loss, so do not fail. + return True + (False, True) -> do + fix InfoMissing + warning $ + "** Based on the location log, " ++ desc + ++ "\n** was expected to be present, " ++ + "but its content is missing." + return False + _ -> return True + where + fix s = do + showNote "fixing location log" + updatestatus s + +{- Ensures the direct mode mapping file is consistent. Each file + - it lists for the key should exist, and the specified file should be + - included in it. + -} +verifyDirectMapping :: Key -> FilePath -> Annex Bool +verifyDirectMapping key file = do + whenM isDirect $ do + fs <- addAssociatedFile key file + forM_ fs $ \f -> + unlessM (liftIO $ doesFileExist f) $ + void $ removeAssociatedFile key f + return True + +{- Ensures that files whose content is available are in direct mode. -} +verifyDirectMode :: Key -> FilePath -> Annex Bool +verifyDirectMode key file = do + whenM (isDirect <&&> isJust <$> isAnnexLink file) $ do + v <- toDirectGen key file + case v of + Nothing -> noop + Just a -> do + showNote "fixing direct mode" + a + return True + +{- The size of the data for a key is checked against the size encoded in + - the key's metadata, if available. + - + - Not checked in direct mode, because files can be changed directly. + -} +checkKeySize :: Key -> Annex Bool +checkKeySize key = ifM isDirect + ( return True + , do + file <- calcRepo $ gitAnnexLocation key + ifM (liftIO $ doesFileExist file) + ( checkKeySizeOr badContent key file + , return True + ) + ) + +checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool +checkKeySizeRemote _ _ Nothing = return True +checkKeySizeRemote key remote (Just file) = + checkKeySizeOr (badContentRemote remote) key file + +checkKeySizeOr :: (Key -> Annex String) -> Key -> FilePath -> Annex Bool +checkKeySizeOr bad key file = case Types.Key.keySize key of + Nothing -> return True + Just size -> do + size' <- fromIntegral . fileSize + <$> liftIO (getFileStatus file) + comparesizes size size' + where + comparesizes a b = do + let same = a == b + unless same $ badsize a b + return same + badsize a b = do + msg <- bad key + warning $ concat + [ "Bad file size (" + , compareSizes storageUnits True a b + , "); " + , msg + ] + +{- Runs the backend specific check on a key's content. + - + - In direct mode this is not done if the file has clearly been modified, + - because modification of direct mode files is allowed. It's still done + - if the file does not appear modified, to catch disk corruption, etc. + -} +checkBackend :: Backend -> Key -> Maybe FilePath -> Annex Bool +checkBackend backend key mfile = go =<< isDirect + where + go False = do + content <- calcRepo $ gitAnnexLocation key + checkBackendOr badContent backend key content + go True = maybe nocheck checkdirect mfile + checkdirect file = ifM (goodContent key file) + ( checkBackendOr' (badContentDirect file) backend key file + (goodContent key file) + , nocheck + ) + nocheck = return True + +checkBackendRemote :: Backend -> Key -> Remote -> Maybe FilePath -> Annex Bool +checkBackendRemote backend key remote = maybe (return True) go + where + go = checkBackendOr (badContentRemote remote) backend key + +checkBackendOr :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool +checkBackendOr bad backend key file = + checkBackendOr' bad backend key file (return True) + +checkBackendOr' :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool -> Annex Bool +checkBackendOr' bad backend key file postcheck = + case Types.Backend.fsckKey backend of + Nothing -> return True + Just a -> do + ok <- a key file + ifM postcheck + ( do + unless ok $ do + msg <- bad key + warning $ "Bad file content; " ++ msg + return ok + , return True + ) + +checkKeyNumCopies :: Key -> String -> NumCopies -> Annex Bool +checkKeyNumCopies key file numcopies = do + (untrustedlocations, safelocations) <- trustPartition UnTrusted =<< Remote.keyLocations key + let present = NumCopies (length safelocations) + if present < numcopies + then do + ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations + warning $ missingNote file present numcopies ppuuids + return False + else return True + +missingNote :: String -> NumCopies -> NumCopies -> String -> String +missingNote file (NumCopies 0) _ [] = + "** No known copies exist of " ++ file +missingNote file (NumCopies 0) _ untrusted = + "Only these untrusted locations may have copies of " ++ file ++ + "\n" ++ untrusted ++ + "Back it up to trusted locations with git-annex copy." +missingNote file present needed [] = + "Only " ++ show (fromNumCopies present) ++ " of " ++ show (fromNumCopies needed) ++ + " trustworthy copies exist of " ++ file ++ + "\nBack it up with git-annex copy." +missingNote file present needed untrusted = + missingNote file present needed [] ++ + "\nThe following untrusted locations may also have copies: " ++ + "\n" ++ untrusted + +{- Bad content is moved aside. -} +badContent :: Key -> Annex String +badContent key = do + dest <- moveBad key + return $ "moved to " ++ dest + +{- Bad content is left where it is, but we touch the file, so it'll be + - committed to a new key. -} +badContentDirect :: FilePath -> Key -> Annex String +badContentDirect file key = do + void $ liftIO $ catchMaybeIO $ touchFile file + logStatus key InfoMissing + return "left in place for you to examine" + +badContentRemote :: Remote -> Key -> Annex String +badContentRemote remote key = do + ok <- Remote.removeKey remote key + when ok $ + Remote.logStatus remote key InfoMissing + return $ (if ok then "dropped from " else "failed to drop from ") + ++ Remote.name remote + +data Incremental = StartIncremental | ContIncremental (Maybe EpochTime) | NonIncremental + deriving (Eq, Show) + +runFsck :: Incremental -> FilePath -> Key -> Annex Bool -> CommandStart +runFsck inc file key a = ifM (needFsck inc key) + ( do + showStart "fsck" file + next $ do + ok <- a + when ok $ + recordFsckTime key + next $ return ok + , stop + ) + +{- Check if a key needs to be fscked, with support for incremental fscks. -} +needFsck :: Incremental -> Key -> Annex Bool +needFsck (ContIncremental Nothing) _ = return True +needFsck (ContIncremental starttime) key = do + fscktime <- getFsckTime key + return $ fscktime < starttime +needFsck _ _ = return True + +{- To record the time that a key was last fscked, without + - modifying its mtime, we set the timestamp of its parent directory. + - Each annexed file is the only thing in its directory, so this is fine. + - + - To record that the file was fscked, the directory's sticky bit is set. + - (None of the normal unix behaviors of the sticky bit should matter, so + - we can reuse this permission bit.) + - + - Note that this relies on the parent directory being deleted when a file + - is dropped. That way, if it's later added back, the fsck record + - won't still be present. + -} +recordFsckTime :: Key -> Annex () +recordFsckTime key = do + parent <- parentDir <$> calcRepo (gitAnnexLocation key) + liftIO $ void $ tryIO $ do + touchFile parent +#ifndef mingw32_HOST_OS + setSticky parent +#endif + +getFsckTime :: Key -> Annex (Maybe EpochTime) +getFsckTime key = do + parent <- parentDir <$> calcRepo (gitAnnexLocation key) + liftIO $ catchDefaultIO Nothing $ do + s <- getFileStatus parent + return $ if isSticky $ fileMode s + then Just $ modificationTime s + else Nothing + +{- Records the start time of an incremental fsck. + - + - To guard against time stamp damange (for example, if an annex directory + - is copied without -a), the fsckstate file contains a time that should + - be identical to its modification time. + - (This is not possible to do on Windows, and so the timestamp in + - the file will only be equal or greater than the modification time.) + -} +recordStartTime :: Annex () +recordStartTime = do + f <- fromRepo gitAnnexFsckState + createAnnexDirectory $ parentDir f + liftIO $ do + nukeFile f + withFile f WriteMode $ \h -> do +#ifndef mingw32_HOST_OS + t <- modificationTime <$> getFileStatus f +#else + t <- getPOSIXTime +#endif + hPutStr h $ showTime $ realToFrac t + where + showTime :: POSIXTime -> String + showTime = show + +resetStartTime :: Annex () +resetStartTime = liftIO . nukeFile =<< fromRepo gitAnnexFsckState + +{- Gets the incremental fsck start time. -} +getStartTime :: Annex (Maybe EpochTime) +getStartTime = do + f <- fromRepo gitAnnexFsckState + liftIO $ catchDefaultIO Nothing $ do + timestamp <- modificationTime <$> getFileStatus f + let fromstatus = Just (realToFrac timestamp) + fromfile <- readishTime <$> readFile f + return $ if matchingtimestamp fromfile fromstatus + then Just timestamp + else Nothing + where + readishTime :: String -> Maybe POSIXTime + readishTime s = utcTimeToPOSIXSeconds <$> + parseTime defaultTimeLocale "%s%Qs" s + matchingtimestamp fromfile fromstatus = +#ifndef mingw32_HOST_OS + fromfile == fromstatus +#else + fromfile >= fromstatus +#endif diff --git a/Command/FuzzTest.hs b/Command/FuzzTest.hs new file mode 100644 index 000000000..08103edc8 --- /dev/null +++ b/Command/FuzzTest.hs @@ -0,0 +1,281 @@ +{- git-annex fuzz generator + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.FuzzTest where + +import Common.Annex +import qualified Annex +import Command +import qualified Git.Config +import Config +import Utility.ThreadScheduler +import Annex.Exception +import Utility.DiskFree + +import Data.Time.Clock +import System.Random (getStdRandom, random, randomR) +import Test.QuickCheck +import Control.Concurrent + +def :: [Command] +def = [ notBareRepo $ command "fuzztest" paramNothing seek SectionPlumbing + "generates fuzz test files"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + guardTest + logf <- fromRepo gitAnnexFuzzTestLogFile + showStart "fuzztest" logf + logh <-liftIO $ openFile logf WriteMode + void $ forever $ fuzz logh + stop + +guardTest :: Annex () +guardTest = unlessM (fromMaybe False . Git.Config.isTrue <$> getConfig key "") $ + error $ unlines + [ "Running fuzz tests *writes* to and *deletes* files in" + , "this repository, and pushes those changes to other" + , "repositories! This is a developer tool, not something" + , "to play with." + , "" + , "Refusing to run fuzz tests, since " ++ keyname ++ " is not set!" + ] + where + key = annexConfig "eat-my-repository" + (ConfigKey keyname) = key + + +fuzz :: Handle -> Annex () +fuzz logh = do + action <- genFuzzAction + record logh $ flip Started action + result <- tryAnnex $ runFuzzAction action + record logh $ flip Finished $ + either (const False) (const True) result + +record :: Handle -> (UTCTime -> TimeStampedFuzzAction) -> Annex () +record h tmpl = liftIO $ do + now <- getCurrentTime + let s = show $ tmpl now + print s + hPrint h s + hFlush h + +{- Delay for either a fraction of a second, or a few seconds, or up + - to 1 minute. + - + - The MinutesDelay is used as an opportunity to do housekeeping tasks. + -} +randomDelay :: Delay -> Annex () +randomDelay TinyDelay = liftIO $ + threadDelay =<< getStdRandom (randomR (10000, 1000000)) +randomDelay SecondsDelay = liftIO $ + threadDelaySeconds =<< Seconds <$> getStdRandom (randomR (1, 10)) +randomDelay MinutesDelay = do + liftIO $ threadDelaySeconds =<< Seconds <$> getStdRandom (randomR (1, 60)) + reserve <- annexDiskReserve <$> Annex.getGitConfig + free <- liftIO $ getDiskFree "." + case free of + Just have | have < reserve -> do + warning "Low disk space; fuzz test paused." + liftIO $ threadDelaySeconds (Seconds 60) + randomDelay MinutesDelay + _ -> noop + +data Delay + = TinyDelay + | SecondsDelay + | MinutesDelay + deriving (Read, Show, Eq) + +instance Arbitrary Delay where + arbitrary = elements [TinyDelay, SecondsDelay, MinutesDelay] + +data FuzzFile = FuzzFile FilePath + deriving (Read, Show, Eq) + +data FuzzDir = FuzzDir FilePath + deriving (Read, Show, Eq) + +instance Arbitrary FuzzFile where + arbitrary = FuzzFile <$> arbitrary + +instance Arbitrary FuzzDir where + arbitrary = FuzzDir <$> arbitrary + +class ToFilePath a where + toFilePath :: a -> FilePath + +instance ToFilePath FuzzFile where + toFilePath (FuzzFile f) = f + +instance ToFilePath FuzzDir where + toFilePath (FuzzDir d) = d + +isFuzzFile :: FilePath -> Bool +isFuzzFile f = "fuzzfile_" `isPrefixOf` takeFileName f + +isFuzzDir :: FilePath -> Bool +isFuzzDir d = "fuzzdir_" `isPrefixOf` d + +mkFuzzFile :: FilePath -> [FuzzDir] -> FuzzFile +mkFuzzFile file dirs = FuzzFile $ joinPath (map toFilePath dirs) ("fuzzfile_" ++ file) + +mkFuzzDir :: Int -> FuzzDir +mkFuzzDir n = FuzzDir $ "fuzzdir_" ++ show n + +{- File is placed inside a directory hierarchy up to 4 subdirectories deep. -} +genFuzzFile :: IO FuzzFile +genFuzzFile = do + n <- getStdRandom $ randomR (0, 4) + dirs <- replicateM n genFuzzDir + file <- show <$> (getStdRandom random :: IO Int) + return $ mkFuzzFile file dirs + +{- Only 16 distinct subdirectories are used. When nested 4 deep, this + - yields 69904 total directories max, which is below the default Linux + - inotify limit of 81920. The goal is not to run the assistant out of + - inotify descriptors. -} +genFuzzDir :: IO FuzzDir +genFuzzDir = mkFuzzDir <$> (getStdRandom (randomR (1,16)) :: IO Int) + +data TimeStampedFuzzAction + = Started UTCTime FuzzAction + | Finished UTCTime Bool + deriving (Read, Show) + +data FuzzAction + = FuzzAdd FuzzFile + | FuzzDelete FuzzFile + | FuzzMove FuzzFile FuzzFile + | FuzzModify FuzzFile + | FuzzDeleteDir FuzzDir + | FuzzMoveDir FuzzDir FuzzDir + | FuzzPause Delay + deriving (Read, Show, Eq) + +instance Arbitrary FuzzAction where + arbitrary = frequency + [ (50, FuzzAdd <$> arbitrary) + , (50, FuzzDelete <$> arbitrary) + , (10, FuzzMove <$> arbitrary <*> arbitrary) + , (10, FuzzModify <$> arbitrary) + , (10, FuzzDeleteDir <$> arbitrary) + , (10, FuzzMoveDir <$> arbitrary <*> arbitrary) + , (10, FuzzPause <$> arbitrary) + ] + +runFuzzAction :: FuzzAction -> Annex () +runFuzzAction (FuzzAdd (FuzzFile f)) = liftIO $ do + createDirectoryIfMissing True $ parentDir f + n <- getStdRandom random :: IO Int + writeFile f $ show n ++ "\n" +runFuzzAction (FuzzDelete (FuzzFile f)) = liftIO $ nukeFile f +runFuzzAction (FuzzMove (FuzzFile src) (FuzzFile dest)) = liftIO $ + rename src dest +runFuzzAction (FuzzModify (FuzzFile f)) = whenM isDirect $ liftIO $ do + n <- getStdRandom random :: IO Int + appendFile f $ show n ++ "\n" +runFuzzAction (FuzzDeleteDir (FuzzDir d)) = liftIO $ + removeDirectoryRecursive d +runFuzzAction (FuzzMoveDir (FuzzDir src) (FuzzDir dest)) = liftIO $ + rename src dest +runFuzzAction (FuzzPause d) = randomDelay d + +genFuzzAction :: Annex FuzzAction +genFuzzAction = do + tmpl <- liftIO $ Prelude.head <$> sample' (arbitrary :: Gen FuzzAction) + -- Fix up template action to make sense in the current repo tree. + case tmpl of + FuzzAdd _ -> do + f <- liftIO newFile + maybe genFuzzAction (return . FuzzAdd) f + FuzzDelete _ -> do + f <- liftIO $ existingFile 0 "" + maybe genFuzzAction (return . FuzzDelete) f + FuzzMove _ _ -> do + src <- liftIO $ existingFile 0 "" + dest <- liftIO newFile + case (src, dest) of + (Just s, Just d) -> return $ FuzzMove s d + _ -> genFuzzAction + FuzzMoveDir _ _ -> do + md <- liftIO existingDir + case md of + Nothing -> genFuzzAction + Just d -> do + newd <- liftIO $ newDir (parentDir $ toFilePath d) + maybe genFuzzAction (return . FuzzMoveDir d) newd + FuzzDeleteDir _ -> do + d <- liftIO existingDir + maybe genFuzzAction (return . FuzzDeleteDir) d + FuzzModify _ -> do + f <- liftIO $ existingFile 0 "" + maybe genFuzzAction (return . FuzzModify) f + FuzzPause _ -> return tmpl + +existingFile :: Int -> FilePath -> IO (Maybe FuzzFile) +existingFile 0 _ = return Nothing +existingFile n top = do + dir <- existingDirIncludingTop + contents <- catchDefaultIO [] (getDirectoryContents dir) + let files = filter isFuzzFile contents + if null files + then do + let dirs = filter isFuzzDir contents + if null dirs + then return Nothing + else do + i <- getStdRandom $ randomR (0, length dirs - 1) + existingFile (n - 1) (top dirs !! i) + else do + i <- getStdRandom $ randomR (0, length files - 1) + return $ Just $ FuzzFile $ top dir files !! i + +existingDirIncludingTop :: IO FilePath +existingDirIncludingTop = do + dirs <- filter isFuzzDir <$> getDirectoryContents "." + if null dirs + then return "." + else do + n <- getStdRandom $ randomR (0, length dirs) + return $ ("." : dirs) !! n + +existingDir :: IO (Maybe FuzzDir) +existingDir = do + d <- existingDirIncludingTop + return $ if isFuzzDir d + then Just $ FuzzDir d + else Nothing + +newFile :: IO (Maybe FuzzFile) +newFile = go (100 :: Int) + where + go 0 = return Nothing + go n = do + f <- genFuzzFile + ifM (doesnotexist (toFilePath f)) + ( return $ Just f + , go (n - 1) + ) + +newDir :: FilePath -> IO (Maybe FuzzDir) +newDir parent = go (100 :: Int) + where + go 0 = return Nothing + go n = do + (FuzzDir d) <- genFuzzDir + ifM (doesnotexist (parent d)) + ( return $ Just $ FuzzDir d + , go (n - 1) + ) + +doesnotexist :: FilePath -> IO Bool +doesnotexist f = isNothing <$> catchMaybeIO (getSymbolicLinkStatus f) diff --git a/Command/GCryptSetup.hs b/Command/GCryptSetup.hs new file mode 100644 index 000000000..2448467fd --- /dev/null +++ b/Command/GCryptSetup.hs @@ -0,0 +1,39 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.GCryptSetup where + +import Common.Annex +import Command +import Annex.UUID +import qualified Remote.GCrypt +import qualified Git + +def :: [Command] +def = [dontCheck repoExists $ noCommit $ + command "gcryptsetup" paramValue seek + SectionPlumbing "sets up gcrypt repository"] + +seek :: CommandSeek +seek = withStrings start + +start :: String -> CommandStart +start gcryptid = next $ next $ do + u <- getUUID + when (u /= NoUUID) $ + error "gcryptsetup refusing to run; this repository already has a git-annex uuid!" + + g <- gitRepo + gu <- Remote.GCrypt.getGCryptUUID True g + let newgu = genUUIDInNameSpace gCryptNameSpace gcryptid + if gu == Nothing || gu == Just newgu + then if Git.repoIsLocalBare g + then do + void $ Remote.GCrypt.setupRepo gcryptid g + return True + else error "cannot use gcrypt in a non-bare repository" + else error "gcryptsetup uuid mismatch" diff --git a/Command/Get.hs b/Command/Get.hs new file mode 100644 index 000000000..d0be20018 --- /dev/null +++ b/Command/Get.hs @@ -0,0 +1,92 @@ +{- git-annex command + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Get where + +import Common.Annex +import Command +import qualified Remote +import Annex.Content +import Annex.Transfer +import Config.NumCopies +import Annex.Wanted +import qualified Command.Move + +def :: [Command] +def = [withOptions getOptions $ command "get" paramPaths seek + SectionCommon "make content of annexed files available"] + +getOptions :: [Option] +getOptions = fromOption : keyOptions + +seek :: CommandSeek +seek ps = do + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKeys from) + (withFilesInGit $ whenAnnexed $ start from) + ps + +start :: Maybe Remote -> FilePath -> Key -> CommandStart +start from file key = start' expensivecheck from key (Just file) + where + expensivecheck = checkAuto (numCopiesCheck file key (<) <||> wantGet False (Just key) (Just file)) + +startKeys :: Maybe Remote -> Key -> CommandStart +startKeys from key = start' (return True) from key Nothing + +start' :: Annex Bool -> Maybe Remote -> Key -> AssociatedFile -> CommandStart +start' expensivecheck from key afile = stopUnless (not <$> inAnnex key) $ + stopUnless expensivecheck $ + case from of + Nothing -> go $ perform key afile + Just src -> + stopUnless (Command.Move.fromOk src key) $ + go $ Command.Move.fromPerform src False key afile + where + go a = do + showStart' "get" key afile + next a + +perform :: Key -> AssociatedFile -> CommandPerform +perform key afile = stopUnless (getViaTmp key $ getKeyFile key afile) $ + next $ return True -- no cleanup needed + +{- Try to find a copy of the file in one of the remotes, + - and copy it to here. -} +getKeyFile :: Key -> AssociatedFile -> FilePath -> Annex Bool +getKeyFile key afile dest = getKeyFile' key afile dest + =<< Remote.keyPossibilities key + +getKeyFile' :: Key -> AssociatedFile -> FilePath -> [Remote] -> Annex Bool +getKeyFile' key afile dest = dispatch + where + dispatch [] = do + showNote "not available" + showlocs + return False + dispatch remotes = notifyTransfer Download afile $ trycopy remotes remotes + trycopy full [] _ = do + Remote.showTriedRemotes full + showlocs + return False + trycopy full (r:rs) witness = + ifM (probablyPresent r) + ( docopy r witness <||> trycopy full rs witness + , trycopy full rs witness + ) + showlocs = Remote.showLocations key [] + "No other repository is known to contain the file." + -- This check is to avoid an ugly message if a remote is a + -- drive that is not mounted. + probablyPresent r + | Remote.hasKeyCheap r = + either (const False) id <$> Remote.hasKey r key + | otherwise = return True + docopy r = download (Remote.uuid r) key afile noRetry $ \p -> do + showAction $ "from " ++ Remote.name r + Remote.retrieveKeyFile r key afile dest p diff --git a/Command/Group.hs b/Command/Group.hs new file mode 100644 index 000000000..2b5cd2ec4 --- /dev/null +++ b/Command/Group.hs @@ -0,0 +1,39 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Group where + +import Common.Annex +import Command +import qualified Remote +import Logs.Group +import Types.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "group" (paramPair paramRemote paramDesc) seek + SectionSetup "add a repository to a group"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:g:[]) = do + showStart "group" name + u <- Remote.nameToUUID name + next $ setGroup u g +start (name:[]) = do + u <- Remote.nameToUUID name + showRaw . unwords . S.toList =<< lookupGroups u + stop +start _ = error "Specify a repository and a group." + +setGroup :: UUID -> Group -> CommandPerform +setGroup uuid g = do + groupChange uuid (S.insert g) + next $ return True diff --git a/Command/Help.hs b/Command/Help.hs new file mode 100644 index 000000000..7998ed796 --- /dev/null +++ b/Command/Help.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Help where + +import Common.Annex +import Command +import qualified Command.Init +import qualified Command.Add +import qualified Command.Drop +import qualified Command.Get +import qualified Command.Move +import qualified Command.Copy +import qualified Command.Sync +import qualified Command.Whereis +import qualified Command.Fsck + +import System.Console.GetOpt + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "help" paramNothing seek SectionQuery "display help"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + liftIO $ start' params + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo = start' + +start' :: [String] -> IO () +start' ["options"] = showCommonOptions +start' _ = showGeneralHelp + +showCommonOptions :: IO () +showCommonOptions = putStrLn $ usageInfo "Common options:" gitAnnexOptions + +showGeneralHelp :: IO () +showGeneralHelp = putStrLn $ unlines + [ "The most frequently used git-annex commands are:" + , unlines $ map cmdline $ concat + [ Command.Init.def + , Command.Add.def + , Command.Drop.def + , Command.Get.def + , Command.Move.def + , Command.Copy.def + , Command.Sync.def + , Command.Whereis.def + , Command.Fsck.def + ] + , "Run 'git-annex' for a complete command list." + , "Run 'git-annex command --help' for help on a specific command." + , "Run `git annex help options' for a list of common options." + ] + where + cmdline c = "\t" ++ cmdname c ++ "\t" ++ cmddesc c diff --git a/Command/Import.hs b/Command/Import.hs new file mode 100644 index 000000000..db3601a1b --- /dev/null +++ b/Command/Import.hs @@ -0,0 +1,115 @@ +{- git-annex command + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Import where + +import Common.Annex +import Command +import qualified Annex +import qualified Command.Add +import Utility.CopyFile +import Backend +import Remote +import Types.KeySource + +def :: [Command] +def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek + SectionCommon "move and add files from outside git working copy"] + +opts :: [Option] +opts = + [ duplicateOption + , deduplicateOption + , cleanDuplicatesOption + , skipDuplicatesOption + ] + +duplicateOption :: Option +duplicateOption = flagOption [] "duplicate" "do not delete source files" + +deduplicateOption :: Option +deduplicateOption = flagOption [] "deduplicate" "delete source files whose content was imported before" + +cleanDuplicatesOption :: Option +cleanDuplicatesOption = flagOption [] "clean-duplicates" "delete duplicate source files (import nothing)" + +skipDuplicatesOption :: Option +skipDuplicatesOption = flagOption [] "skip-duplicates" "import only new files" + +data DuplicateMode = Default | Duplicate | DeDuplicate | CleanDuplicates | SkipDuplicates + deriving (Eq) + +getDuplicateMode :: Annex DuplicateMode +getDuplicateMode = gen + <$> getflag duplicateOption + <*> getflag deduplicateOption + <*> getflag cleanDuplicatesOption + <*> getflag skipDuplicatesOption + where + getflag = Annex.getFlag . optionName + gen False False False False = Default + gen True False False False = Duplicate + gen False True False False = DeDuplicate + gen False False True False = CleanDuplicates + gen False False False True = SkipDuplicates + gen _ _ _ _ = error "bad combination of --duplicate, --deduplicate, --clean-duplicates, --skip-duplicates" + +seek :: CommandSeek +seek ps = do + mode <- getDuplicateMode + withPathContents (start mode) ps + +start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart +start mode (srcfile, destfile) = + ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) + ( do + isdup <- do + backend <- chooseBackend destfile + let ks = KeySource srcfile srcfile Nothing + v <- genKey ks backend + case v of + Just (k, _) -> not . null <$> keyLocations k + _ -> return False + case pickaction isdup of + Nothing -> stop + Just a -> do + showStart "import" destfile + next a + , stop + ) + where + deletedup = do + showNote "duplicate" + liftIO $ removeFile srcfile + next $ return True + importfile = do + handleexisting =<< liftIO (catchMaybeIO $ getSymbolicLinkStatus destfile) + liftIO $ createDirectoryIfMissing True (parentDir destfile) + liftIO $ if mode == Duplicate || mode == SkipDuplicates + then void $ copyFileExternal srcfile destfile + else moveFile srcfile destfile + Command.Add.perform destfile + handleexisting Nothing = noop + handleexisting (Just s) + | isDirectory s = notoverwriting "(is a directory)" + | otherwise = ifM (Annex.getState Annex.force) $ + ( liftIO $ nukeFile destfile + , notoverwriting "(use --force to override)" + ) + notoverwriting why = error $ "not overwriting existing " ++ destfile ++ " " ++ why + pickaction isdup = case mode of + DeDuplicate + | isdup -> Just deletedup + | otherwise -> Just importfile + CleanDuplicates + | isdup -> Just deletedup + | otherwise -> Nothing + SkipDuplicates + | isdup -> Nothing + | otherwise -> Just importfile + _ -> Just importfile + diff --git a/Command/ImportFeed.hs b/Command/ImportFeed.hs new file mode 100644 index 000000000..e78588518 --- /dev/null +++ b/Command/ImportFeed.hs @@ -0,0 +1,297 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.ImportFeed where + +import Text.Feed.Import +import Text.Feed.Query +import Text.Feed.Types +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Clock +import Data.Time.Format +import System.Locale + +import Common.Annex +import qualified Annex +import Command +import qualified Annex.Url as Url +import Logs.Web +import qualified Utility.Format +import Utility.Tmp +import Command.AddUrl (addUrlFile, relaxedOption) +import Annex.Perms +import Backend.URL (fromUrl) +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +import Command.AddUrl (addUrlFileQuvi) +#endif +import Types.MetaData +import Logs.MetaData +import Annex.MetaData + +def :: [Command] +def = [notBareRepo $ withOptions [templateOption, relaxedOption] $ + command "importfeed" (paramRepeating paramUrl) seek + SectionCommon "import files from podcast feeds"] + +templateOption :: Option +templateOption = fieldOption [] "template" paramFormat "template for filenames" + +seek :: CommandSeek +seek ps = do + tmpl <- getOptionField templateOption return + relaxed <- getOptionFlag relaxedOption + cache <- getCache tmpl + withStrings (start relaxed cache) ps + +start :: Bool -> Cache -> URLString -> CommandStart +start relaxed cache url = do + showStart "importfeed" url + next $ perform relaxed cache url + +perform :: Bool -> Cache -> URLString -> CommandPerform +perform relaxed cache url = do + v <- findDownloads url + case v of + [] -> do + feedProblem url "bad feed content" + next $ return True + l -> do + ok <- and <$> mapM (performDownload relaxed cache) l + unless ok $ + feedProblem url "problem downloading item" + next $ cleanup url True + +cleanup :: URLString -> Bool -> CommandCleanup +cleanup url ok = do + when ok $ + clearFeedProblem url + return ok + +data ToDownload = ToDownload + { feed :: Feed + , feedurl :: URLString + , item :: Item + , location :: DownloadLocation + } + +data DownloadLocation = Enclosure URLString | QuviLink URLString + +data Cache = Cache + { knownurls :: S.Set URLString + , template :: Utility.Format.Format + } + +getCache :: Maybe String -> Annex Cache +getCache opttemplate = ifM (Annex.getState Annex.force) + ( ret S.empty + , do + showSideAction "checking known urls" + ret =<< S.fromList <$> knownUrls + ) + where + tmpl = Utility.Format.gen $ fromMaybe defaultTemplate opttemplate + ret s = return $ Cache s tmpl + +findDownloads :: URLString -> Annex [ToDownload] +findDownloads u = go =<< downloadFeed u + where + go Nothing = pure [] + go (Just f) = catMaybes <$> mapM (mk f) (feedItems f) + + mk f i = case getItemEnclosure i of + Just (enclosureurl, _, _) -> return $ + Just $ ToDownload f u i $ Enclosure enclosureurl + Nothing -> mkquvi f i +#ifdef WITH_QUVI + mkquvi f i = case getItemLink i of + Just link -> ifM (quviSupported link) + ( return $ Just $ ToDownload f u i $ QuviLink link + , return Nothing + ) + Nothing -> return Nothing +#else + mkquvi = return Nothing +#endif + +{- Feeds change, so a feed download cannot be resumed. -} +downloadFeed :: URLString -> Annex (Maybe Feed) +downloadFeed url = do + showOutput + uo <- Url.getUrlOptions + liftIO $ withTmpFile "feed" $ \f h -> do + fileEncoding h + ifM (Url.download url f uo) + ( parseFeedString <$> hGetContentsStrict h + , return Nothing + ) + +performDownload :: Bool -> Cache -> ToDownload -> Annex Bool +performDownload relaxed cache todownload = case location todownload of + Enclosure url -> checkknown url $ + rundownload url (takeExtension url) $ + addUrlFile relaxed url + QuviLink pageurl -> do + let quviurl = setDownloader pageurl QuviDownloader + checkknown quviurl $ do + mp <- withQuviOptions Quvi.query [Quvi.quiet, Quvi.httponly] pageurl + case mp of + Nothing -> return False + Just page -> case headMaybe $ Quvi.pageLinks page of + Nothing -> return False + Just link -> do + let videourl = Quvi.linkUrl link + checkknown videourl $ + rundownload videourl ("." ++ Quvi.linkSuffix link) $ + addUrlFileQuvi relaxed quviurl videourl + where + forced = Annex.getState Annex.force + + {- Avoids downloading any urls that are already known to be + - associated with a file in the annex, unless forced. -} + checkknown url a + | S.member url (knownurls cache) = ifM forced (a, return True) + | otherwise = a + + rundownload url extension getter = do + dest <- makeunique url (1 :: Integer) $ + feedFile (template cache) todownload extension + case dest of + Nothing -> return True + Just f -> do + showStart "addurl" f + mk <- getter f + case mk of + Just key -> do + whenM (annexGenMetaData <$> Annex.getGitConfig) $ + addMetaData key $ extractMetaData todownload + showEndOk + return True + Nothing -> do + showEndFail + checkFeedBroken (feedurl todownload) + + {- Find a unique filename to save the url to. + - If the file exists, prefixes it with a number. + - When forced, the file may already exist and have the same + - url, in which case Nothing is returned as it does not need + - to be re-downloaded. -} + makeunique url n file = ifM alreadyexists + ( ifM forced + ( ifAnnexed f checksameurl tryanother + , tryanother + ) + , return $ Just f + ) + where + f = if n < 2 + then file + else + let (d, base) = splitFileName file + in d show n ++ "_" ++ base + tryanother = makeunique url (n + 1) file + alreadyexists = liftIO $ isJust <$> catchMaybeIO (getSymbolicLinkStatus f) + checksameurl k = ifM (elem url <$> getUrls k) + ( return Nothing + , tryanother + ) + +defaultTemplate :: String +defaultTemplate = "${feedtitle}/${itemtitle}${extension}" + +{- Generates a filename to use for a feed item by filling out the template. + - The filename may not be unique. -} +feedFile :: Utility.Format.Format -> ToDownload -> String -> FilePath +feedFile tmpl i extension = Utility.Format.format tmpl $ + M.map sanitizeFilePath $ M.fromList $ extractFields i ++ + [ ("extension", extension) + , extractField "itempubdate" [pubdate $ item i] + ] + where +#if MIN_VERSION_feed(0,3,9) + pubdate itm = case getItemPublishDate itm :: Maybe (Maybe UTCTime) of + Just (Just d) -> Just $ + formatTime defaultTimeLocale "%F" d + -- if date cannot be parsed, use the raw string + _ -> replace "/" "-" <$> getItemPublishDateString itm +#else + pubdate _ = Nothing +#endif + +extractMetaData :: ToDownload -> MetaData +extractMetaData i = case getItemPublishDate (item i) :: Maybe (Maybe UTCTime) of + Just (Just d) -> unionMetaData meta (dateMetaData d meta) + _ -> meta + where + tometa (k, v) = (mkMetaFieldUnchecked k, S.singleton (toMetaValue v)) + meta = MetaData $ M.fromList $ map tometa $ extractFields i + +{- Extract fields from the feed and item, that are both used as metadata, + - and to generate the filename. -} +extractFields :: ToDownload -> [(String, String)] +extractFields i = map (uncurry extractField) + [ ("feedtitle", [feedtitle]) + , ("itemtitle", [itemtitle]) + , ("feedauthor", [feedauthor]) + , ("itemauthor", [itemauthor]) + , ("itemsummary", [getItemSummary $ item i]) + , ("itemdescription", [getItemDescription $ item i]) + , ("itemrights", [getItemRights $ item i]) + , ("itemid", [snd <$> getItemId (item i)]) + , ("title", [itemtitle, feedtitle]) + , ("author", [itemauthor, feedauthor]) + ] + where + feedtitle = Just $ getFeedTitle $ feed i + itemtitle = getItemTitle $ item i + feedauthor = getFeedAuthor $ feed i + itemauthor = getItemAuthor $ item i + +extractField :: String -> [Maybe String] -> (String, String) +extractField k [] = (k, "none") +extractField k (Just v:_) + | not (null v) = (k, v) +extractField k (_:rest) = extractField k rest + +{- Called when there is a problem with a feed. + - Throws an error if the feed is broken, otherwise shows a warning. -} +feedProblem :: URLString -> String -> Annex () +feedProblem url message = ifM (checkFeedBroken url) + ( error $ message ++ " (having repeated problems with feed: " ++ url ++ ")" + , warning $ "warning: " ++ message + ) + +{- A feed is only broken if problems have occurred repeatedly, for at + - least 23 hours. -} +checkFeedBroken :: URLString -> Annex Bool +checkFeedBroken url = checkFeedBroken' url =<< feedState url +checkFeedBroken' :: URLString -> FilePath -> Annex Bool +checkFeedBroken' url f = do + prev <- maybe Nothing readish <$> liftIO (catchMaybeIO $ readFile f) + now <- liftIO getCurrentTime + case prev of + Nothing -> do + createAnnexDirectory (parentDir f) + liftIO $ writeFile f $ show now + return False + Just prevtime -> do + let broken = diffUTCTime now prevtime > 60 * 60 * 23 + when broken $ + -- Avoid repeatedly complaining about + -- broken feed. + clearFeedProblem url + return broken + +clearFeedProblem :: URLString -> Annex () +clearFeedProblem url = void $ liftIO . tryIO . removeFile =<< feedState url + +feedState :: URLString -> Annex FilePath +feedState url = fromRepo . gitAnnexFeedState =<< fromUrl url Nothing diff --git a/Command/InAnnex.hs b/Command/InAnnex.hs new file mode 100644 index 000000000..11cbdb73d --- /dev/null +++ b/Command/InAnnex.hs @@ -0,0 +1,27 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.InAnnex where + +import Common.Annex +import Command +import Annex.Content + +def :: [Command] +def = [noCommit $ command "inannex" (paramRepeating paramKey) seek + SectionPlumbing "checks if keys are present in the annex"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = inAnnexSafe key >>= dispatch + where + dispatch (Just True) = stop + dispatch (Just False) = exit 1 + dispatch Nothing = exit 100 + exit n = liftIO $ exitWith $ ExitFailure n diff --git a/Command/Indirect.hs b/Command/Indirect.hs new file mode 100644 index 000000000..4ce4c2c38 --- /dev/null +++ b/Command/Indirect.hs @@ -0,0 +1,109 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Indirect where + +import Control.Exception.Extensible + +import Common.Annex +import Command +import qualified Git +import qualified Git.Branch +import qualified Git.LsFiles +import Git.FileMode +import Config +import qualified Annex +import Annex.Direct +import Annex.Content +import Annex.Content.Direct +import Annex.CatFile +import Annex.Exception +import Annex.Init +import qualified Command.Add + +def :: [Command] +def = [notBareRepo $ noDaemonRunning $ + command "indirect" paramNothing seek + SectionSetup "switch repository to indirect mode"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = ifM isDirect + ( do + unlessM (coreSymlinks <$> Annex.getGitConfig) $ + error "Git is configured to not use symlinks, so you must use direct mode." + whenM probeCrippledFileSystem $ + error "This repository seems to be on a crippled filesystem, you must use direct mode." + next perform + , stop + ) + +perform :: CommandPerform +perform = do + showStart "commit" "" + whenM stageDirect $ do + showOutput + void $ inRepo $ Git.Branch.commitCommand Git.Branch.ManualCommit + [ Param "-m" + , Param "commit before switching to indirect mode" + ] + showEndOk + + -- Note that we set indirect mode early, so that we can use + -- moveAnnex in indirect mode. + setDirect False + + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] + forM_ l go + void $ liftIO clean + next cleanup + where + {- Walk tree from top and move all present direct mode files into + - the annex, replacing with symlinks. Also delete direct mode + - caches and mappings. -} + go (f, Just sha, Just mode) | isSymLink mode = do + r <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus f + case r of + Just s + | isSymbolicLink s -> void $ flip whenAnnexed f $ + \_ k -> do + removeInodeCache k + removeAssociatedFiles k + return Nothing + | otherwise -> + maybe noop (fromdirect f) + =<< catKey sha mode + _ -> noop + go _ = noop + + fromdirect f k = do + showStart "indirect" f + removeInodeCache k + removeAssociatedFiles k + whenM (liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f) $ do + v <-tryAnnexIO (moveAnnex k f) + case v of + Right _ -> do + l <- inRepo $ gitAnnexLink f k + liftIO $ createSymbolicLink l f + Left e -> catchAnnex (Command.Add.undo f k e) + warnlocked + showEndOk + + warnlocked :: SomeException -> Annex () + warnlocked e = do + warning $ show e + warning "leaving this file as-is; correct this problem and run git annex add on it" + +cleanup :: CommandCleanup +cleanup = do + showStart "indirect" "" + showEndOk + return True diff --git a/Command/Info.hs b/Command/Info.hs new file mode 100644 index 000000000..63bc92bbe --- /dev/null +++ b/Command/Info.hs @@ -0,0 +1,385 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Command.Info where + +import "mtl" Control.Monad.State.Strict +import qualified Data.Map as M +import Text.JSON +import Data.Tuple +import Data.Ord + +import Common.Annex +import qualified Remote +import qualified Command.Unused +import qualified Git +import qualified Annex +import Command +import Utility.DataUnits +import Utility.DiskFree +import Annex.Content +import Types.Key +import Logs.UUID +import Logs.Trust +import Config.NumCopies +import Remote +import Config +import Utility.Percentage +import Logs.Transfer +import Types.TrustLevel +import Types.FileMatcher +import qualified Limit + +-- a named computation that produces a statistic +type Stat = StatState (Maybe (String, StatState String)) + +-- data about a set of keys +data KeyData = KeyData + { countKeys :: Integer + , sizeKeys :: Integer + , unknownSizeKeys :: Integer + , backendsKeys :: M.Map String Integer + } + +data NumCopiesStats = NumCopiesStats + { numCopiesVarianceMap :: M.Map Variance Integer + } + +newtype Variance = Variance Int + deriving (Eq, Ord) + +instance Show Variance where + show (Variance n) + | n >= 0 = "numcopies +" ++ show n + | otherwise = "numcopies " ++ show n + +-- cached info that multiple Stats use +data StatInfo = StatInfo + { presentData :: Maybe KeyData + , referencedData :: Maybe KeyData + , numCopiesStats :: Maybe NumCopiesStats + } + +-- a state monad for running Stats in +type StatState = StateT StatInfo Annex + +def :: [Command] +def = [noCommit $ dontCheck repoExists $ withOptions [jsonOption] $ + command "info" paramPaths seek SectionQuery + "shows general information about the annex"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start [] = do + globalInfo + stop +start ps = do + mapM_ localInfo =<< filterM isdir ps + stop + where + isdir = liftIO . catchBoolIO . (isDirectory <$$> getFileStatus) + +globalInfo :: Annex () +globalInfo = do + stats <- selStats global_fast_stats global_slow_stats + showCustom "info" $ do + evalStateT (mapM_ showStat stats) (StatInfo Nothing Nothing Nothing) + return True + +localInfo :: FilePath -> Annex () +localInfo dir = showCustom (unwords ["info", dir]) $ do + stats <- selStats (tostats local_fast_stats) (tostats local_slow_stats) + evalStateT (mapM_ showStat stats) =<< getLocalStatInfo dir + return True + where + tostats = map (\s -> s dir) + +selStats :: [Stat] -> [Stat] -> Annex [Stat] +selStats fast_stats slow_stats = do + fast <- Annex.getState Annex.fast + return $ if fast + then fast_stats + else fast_stats ++ slow_stats + +{- Order is significant. Less expensive operations, and operations + - that share data go together. + -} +global_fast_stats :: [Stat] +global_fast_stats = + [ repository_mode + , remote_list Trusted + , remote_list SemiTrusted + , remote_list UnTrusted + , transfer_list + , disk_size + ] +global_slow_stats :: [Stat] +global_slow_stats = + [ tmp_size + , bad_data_size + , local_annex_keys + , local_annex_size + , known_annex_files + , known_annex_size + , bloom_info + , backend_usage + ] +local_fast_stats :: [FilePath -> Stat] +local_fast_stats = + [ local_dir + , const local_annex_keys + , const local_annex_size + , const known_annex_files + , const known_annex_size + ] +local_slow_stats :: [FilePath -> Stat] +local_slow_stats = + [ const numcopies_stats + ] + +stat :: String -> (String -> StatState String) -> Stat +stat desc a = return $ Just (desc, a desc) + +nostat :: Stat +nostat = return Nothing + +json :: JSON j => (j -> String) -> StatState j -> String -> StatState String +json serialize a desc = do + j <- a + lift $ maybeShowJSON [(desc, j)] + return $ serialize j + +nojson :: StatState String -> String -> StatState String +nojson a _ = a + +showStat :: Stat -> StatState () +showStat s = maybe noop calc =<< s + where + calc (desc, a) = do + (lift . showHeader) desc + lift . showRaw =<< a + +repository_mode :: Stat +repository_mode = stat "repository mode" $ json id $ lift $ + ifM isDirect + ( return "direct", return "indirect" ) + +remote_list :: TrustLevel -> Stat +remote_list level = stat n $ nojson $ lift $ do + us <- M.keys <$> (M.union <$> uuidMap <*> remoteMap Remote.name) + rs <- fst <$> trustPartition level us + s <- prettyPrintUUIDs n rs + return $ if null s then "0" else show (length rs) ++ "\n" ++ beginning s + where + n = showTrustLevel level ++ " repositories" + +local_dir :: FilePath -> Stat +local_dir dir = stat "directory" $ json id $ return dir + +local_annex_keys :: Stat +local_annex_keys = stat "local annex keys" $ json show $ + countKeys <$> cachedPresentData + +local_annex_size :: Stat +local_annex_size = stat "local annex size" $ json id $ + showSizeKeys <$> cachedPresentData + +known_annex_files :: Stat +known_annex_files = stat "annexed files in working tree" $ json show $ + countKeys <$> cachedReferencedData + +known_annex_size :: Stat +known_annex_size = stat "size of annexed files in working tree" $ json id $ + showSizeKeys <$> cachedReferencedData + +tmp_size :: Stat +tmp_size = staleSize "temporary object directory size" gitAnnexTmpObjectDir + +bad_data_size :: Stat +bad_data_size = staleSize "bad keys size" gitAnnexBadDir + +bloom_info :: Stat +bloom_info = stat "bloom filter size" $ json id $ do + localkeys <- countKeys <$> cachedPresentData + capacity <- fromIntegral <$> lift Command.Unused.bloomCapacity + let note = aside $ + if localkeys >= capacity + then "appears too small for this repository; adjust annex.bloomcapacity" + else showPercentage 1 (percentage capacity localkeys) ++ " full" + + -- Two bloom filters are used at the same time, so double the size + -- of one. + size <- roughSize memoryUnits False . (* 2) . fromIntegral . fst <$> + lift Command.Unused.bloomBitsHashes + + return $ size ++ note + +transfer_list :: Stat +transfer_list = stat "transfers in progress" $ nojson $ lift $ do + uuidmap <- Remote.remoteMap id + ts <- getTransfers + return $ if null ts + then "none" + else multiLine $ + map (uncurry $ line uuidmap) $ sort ts + where + line uuidmap t i = unwords + [ showLcDirection (transferDirection t) ++ "ing" + , fromMaybe (key2file $ transferKey t) (associatedFile i) + , if transferDirection t == Upload then "to" else "from" + , maybe (fromUUID $ transferUUID t) Remote.name $ + M.lookup (transferUUID t) uuidmap + ] + +disk_size :: Stat +disk_size = stat "available local disk space" $ json id $ lift $ + calcfree + <$> (annexDiskReserve <$> Annex.getGitConfig) + <*> inRepo (getDiskFree . gitAnnexDir) + where + calcfree reserve (Just have) = unwords + [ roughSize storageUnits False $ nonneg $ have - reserve + , "(+" ++ roughSize storageUnits False reserve + , "reserved)" + ] + calcfree _ _ = "unknown" + + nonneg x + | x >= 0 = x + | otherwise = 0 + +backend_usage :: Stat +backend_usage = stat "backend usage" $ nojson $ + calc + <$> (backendsKeys <$> cachedReferencedData) + <*> (backendsKeys <$> cachedPresentData) + where + calc x y = multiLine $ + map (\(n, b) -> b ++ ": " ++ show n) $ + reverse $ sort $ map swap $ M.toList $ + M.unionWith (+) x y + +numcopies_stats :: Stat +numcopies_stats = stat "numcopies stats" $ nojson $ + calc <$> (maybe M.empty numCopiesVarianceMap <$> cachedNumCopiesStats) + where + calc = multiLine + . map (\(variance, count) -> show variance ++ ": " ++ show count) + . reverse . sortBy (comparing snd) . M.toList + +cachedPresentData :: StatState KeyData +cachedPresentData = do + s <- get + case presentData s of + Just v -> return v + Nothing -> do + v <- foldKeys <$> lift (getKeysPresent InRepository) + put s { presentData = Just v } + return v + +cachedReferencedData :: StatState KeyData +cachedReferencedData = do + s <- get + case referencedData s of + Just v -> return v + Nothing -> do + !v <- lift $ Command.Unused.withKeysReferenced + emptyKeyData addKey + put s { referencedData = Just v } + return v + +-- currently only available for local info +cachedNumCopiesStats :: StatState (Maybe NumCopiesStats) +cachedNumCopiesStats = numCopiesStats <$> get + +getLocalStatInfo :: FilePath -> Annex StatInfo +getLocalStatInfo dir = do + fast <- Annex.getState Annex.fast + matcher <- Limit.getMatcher + (presentdata, referenceddata, numcopiesstats) <- + Command.Unused.withKeysFilesReferencedIn dir initial + (update matcher fast) + return $ StatInfo (Just presentdata) (Just referenceddata) (Just numcopiesstats) + where + initial = (emptyKeyData, emptyKeyData, emptyNumCopiesStats) + update matcher fast key file vs@(presentdata, referenceddata, numcopiesstats) = + ifM (matcher $ MatchingFile $ FileInfo file file) + ( do + !presentdata' <- ifM (inAnnex key) + ( return $ addKey key presentdata + , return presentdata + ) + let !referenceddata' = addKey key referenceddata + !numcopiesstats' <- if fast + then return numcopiesstats + else updateNumCopiesStats key file numcopiesstats + return $! (presentdata', referenceddata', numcopiesstats') + , return vs + ) + +emptyKeyData :: KeyData +emptyKeyData = KeyData 0 0 0 M.empty + +emptyNumCopiesStats :: NumCopiesStats +emptyNumCopiesStats = NumCopiesStats M.empty + +foldKeys :: [Key] -> KeyData +foldKeys = foldl' (flip addKey) emptyKeyData + +addKey :: Key -> KeyData -> KeyData +addKey key (KeyData count size unknownsize backends) = + KeyData count' size' unknownsize' backends' + where + {- All calculations strict to avoid thunks when repeatedly + - applied to many keys. -} + !count' = count + 1 + !backends' = M.insertWith' (+) (keyBackendName key) 1 backends + !size' = maybe size (+ size) ks + !unknownsize' = maybe (unknownsize + 1) (const unknownsize) ks + ks = keySize key + +updateNumCopiesStats :: Key -> FilePath -> NumCopiesStats -> Annex NumCopiesStats +updateNumCopiesStats key file (NumCopiesStats m) = do + !variance <- Variance <$> numCopiesCheck file key (-) + let !m' = M.insertWith' (+) variance 1 m + let !ret = NumCopiesStats m' + return ret + +showSizeKeys :: KeyData -> String +showSizeKeys d = total ++ missingnote + where + total = roughSize storageUnits False $ sizeKeys d + missingnote + | unknownSizeKeys d == 0 = "" + | otherwise = aside $ + "+ " ++ show (unknownSizeKeys d) ++ + " unknown size" + +staleSize :: String -> (Git.Repo -> FilePath) -> Stat +staleSize label dirspec = go =<< lift (dirKeys dirspec) + where + go [] = nostat + go keys = onsize =<< sum <$> keysizes keys + onsize 0 = nostat + onsize size = stat label $ + json (++ aside "clean up with git-annex unused") $ + return $ roughSize storageUnits False size + keysizes keys = do + dir <- lift $ fromRepo dirspec + liftIO $ forM keys $ \k -> catchDefaultIO 0 $ + fromIntegral . fileSize + <$> getFileStatus (dir keyFile k) + +aside :: String -> String +aside s = " (" ++ s ++ ")" + +multiLine :: [String] -> String +multiLine = concatMap (\l -> "\n\t" ++ l) diff --git a/Command/Init.hs b/Command/Init.hs new file mode 100644 index 000000000..e8d9af167 --- /dev/null +++ b/Command/Init.hs @@ -0,0 +1,31 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Init where + +import Common.Annex +import Command +import Annex.Init + +def :: [Command] +def = [dontCheck repoExists $ + command "init" paramDesc seek SectionSetup "initialize git-annex"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start ws = do + showStart "init" description + next $ perform description + where + description = unwords ws + +perform :: String -> CommandPerform +perform description = do + initialize $ if null description then Nothing else Just description + next $ return True diff --git a/Command/InitRemote.hs b/Command/InitRemote.hs new file mode 100644 index 000000000..dc54023cc --- /dev/null +++ b/Command/InitRemote.hs @@ -0,0 +1,98 @@ +{- git-annex command + - + - Copyright 2011,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.InitRemote where + +import qualified Data.Map as M + +import Common.Annex +import Command +import qualified Remote +import qualified Logs.Remote +import qualified Types.Remote as R +import Logs.UUID +import Logs.Trust + +import Data.Ord + +def :: [Command] +def = [command "initremote" + (paramPair paramName $ paramOptional $ paramRepeating paramKeyValue) + seek SectionSetup "creates a special (non-git) remote"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = error "Specify a name for the remote." +start (name:ws) = ifM (isJust <$> findExisting name) + ( error $ "There is already a special remote named \"" ++ name ++ + "\". (Use enableremote to enable an existing special remote.)" + , do + let c = newConfig name + t <- findType config + + showStart "initremote" name + next $ perform t name $ M.union config c + ) + where + config = Logs.Remote.keyValToConfig ws + +perform :: RemoteType -> String -> R.RemoteConfig -> CommandPerform +perform t name c = do + (c', u) <- R.setup t Nothing Nothing c + next $ cleanup u name c' + +cleanup :: UUID -> String -> R.RemoteConfig -> CommandCleanup +cleanup u name c = do + describeUUID u name + Logs.Remote.configSet u c + return True + +{- See if there's an existing special remote with this name. -} +findExisting :: String -> Annex (Maybe (UUID, R.RemoteConfig)) +findExisting name = do + t <- trustMap + matches <- sortBy (comparing $ \(u, _c) -> M.lookup u t ) + . findByName name + <$> Logs.Remote.readRemoteLog + return $ headMaybe matches + +newConfig :: String -> R.RemoteConfig +newConfig name = M.singleton nameKey name + +findByName :: String -> M.Map UUID R.RemoteConfig -> [(UUID, R.RemoteConfig)] +findByName n = filter (matching . snd) . M.toList + where + matching c = case M.lookup nameKey c of + Nothing -> False + Just n' + | n' == n -> True + | otherwise -> False + +remoteNames :: Annex [String] +remoteNames = do + m <- Logs.Remote.readRemoteLog + return $ mapMaybe (M.lookup nameKey . snd) $ M.toList m + +{- find the specified remote type -} +findType :: R.RemoteConfig -> Annex RemoteType +findType config = maybe unspecified specified $ M.lookup typeKey config + where + unspecified = error "Specify the type of remote with type=" + specified s = case filter (findtype s) Remote.remoteTypes of + [] -> error $ "Unknown remote type " ++ s + (t:_) -> return t + findtype s i = R.typename i == s + +{- The name of a configured remote is stored in its config using this key. -} +nameKey :: String +nameKey = "name" + +{- The type of a remote is stored in its config using this key. -} +typeKey :: String +typeKey = "type" diff --git a/Command/List.hs b/Command/List.hs new file mode 100644 index 000000000..d038d6deb --- /dev/null +++ b/Command/List.hs @@ -0,0 +1,85 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - Copyright 2013 Antoine Beaupré + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.List where + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Function +import Data.Tuple.Utils +import Data.Ord + +import Common.Annex +import Command +import Remote +import Logs.Trust +import Logs.UUID +import Annex.UUID +import qualified Annex +import Git.Types (RemoteName) + +def :: [Command] +def = [noCommit $ withOptions [allrepos] $ command "list" paramPaths seek + SectionQuery "show which remotes contain files"] + +allrepos :: Option +allrepos = flagOption [] "allrepos" "show all repositories, not only remotes" + +seek :: CommandSeek +seek ps = do + list <- getList + printHeader list + withFilesInGit (whenAnnexed $ start list) ps + +getList :: Annex [(UUID, RemoteName, TrustLevel)] +getList = ifM (Annex.getFlag $ optionName allrepos) + ( nubBy ((==) `on` fst3) <$> ((++) <$> getRemotes <*> getAllUUIDs) + , getRemotes + ) + where + getRemotes = do + rs <- remoteList + ts <- mapM (lookupTrust . uuid) rs + hereu <- getUUID + heretrust <- lookupTrust hereu + return $ (hereu, "here", heretrust) : zip3 (map uuid rs) (map name rs) ts + getAllUUIDs = do + rs <- M.toList <$> uuidMap + rs3 <- forM rs $ \(u, n) -> (,,) + <$> pure u + <*> pure n + <*> lookupTrust u + return $ sortBy (comparing snd3) $ + filter (\t -> thd3 t /= DeadTrusted) rs3 + +printHeader :: [(UUID, RemoteName, TrustLevel)] -> Annex () +printHeader l = liftIO $ putStrLn $ header $ map (\(_, n, t) -> (n, t)) l + +start :: [(UUID, RemoteName, TrustLevel)] -> FilePath -> Key -> CommandStart +start l file key = do + ls <- S.fromList <$> keyLocations key + liftIO $ putStrLn $ format (map (\(u, _, t) -> (t, S.member u ls)) l) file + stop + +type Present = Bool + +header :: [(RemoteName, TrustLevel)] -> String +header remotes = unlines (zipWith formatheader [0..] remotes) ++ pipes (length remotes) + where + formatheader n (remotename, trustlevel) = pipes n ++ remotename ++ trust trustlevel + pipes = flip replicate '|' + trust UnTrusted = " (untrusted)" + trust _ = "" + +format :: [(TrustLevel, Present)] -> FilePath -> String +format remotes file = thereMap ++ " " ++ file + where + thereMap = concatMap there remotes + there (UnTrusted, True) = "x" + there (_, True) = "X" + there (_, False) = "_" diff --git a/Command/Lock.hs b/Command/Lock.hs new file mode 100644 index 000000000..e6733dcb1 --- /dev/null +++ b/Command/Lock.hs @@ -0,0 +1,34 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Lock where + +import Common.Annex +import Command +import qualified Annex.Queue +import qualified Annex + +def :: [Command] +def = [notDirect $ command "lock" paramPaths seek SectionCommon + "undo unlock command"] + +seek :: CommandSeek +seek ps = do + withFilesUnlocked start ps + withFilesUnlockedToBeCommitted start ps + +start :: FilePath -> CommandStart +start file = do + showStart "lock" file + unlessM (Annex.getState Annex.force) $ + error "Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override)" + next $ perform file + +perform :: FilePath -> CommandPerform +perform file = do + Annex.Queue.addCommand "checkout" [Param "--"] [file] + next $ return True -- no cleanup needed diff --git a/Command/Log.hs b/Command/Log.hs new file mode 100644 index 000000000..b0109f117 --- /dev/null +++ b/Command/Log.hs @@ -0,0 +1,177 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Log where + +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.ByteString.Lazy.Char8 as L +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import Data.Char + +import Common.Annex +import Command +import Logs +import qualified Logs.Presence +import Annex.CatFile +import qualified Annex.Branch +import qualified Git +import Git.Command +import qualified Remote +import qualified Annex + +data RefChange = RefChange + { changetime :: POSIXTime + , oldref :: Git.Ref + , newref :: Git.Ref + } + +type Outputter = Bool -> POSIXTime -> [UUID] -> Annex () + +def :: [Command] +def = [withOptions options $ + command "log" paramPaths seek SectionQuery "shows location log"] + +options :: [Option] +options = passthruOptions ++ [gourceOption] + +passthruOptions :: [Option] +passthruOptions = map odate ["since", "after", "until", "before"] ++ + [ fieldOption ['n'] "max-count" paramNumber + "limit number of logs displayed" + ] + where + odate n = fieldOption [] n paramDate $ "show log " ++ n ++ " date" + +gourceOption :: Option +gourceOption = flagOption [] "gource" "format output for gource" + +seek :: CommandSeek +seek ps = do + m <- Remote.uuidDescriptions + zone <- liftIO getCurrentTimeZone + os <- concat <$> mapM getoption passthruOptions + gource <- getOptionFlag gourceOption + withFilesInGit (whenAnnexed $ start m zone os gource) ps + where + getoption o = maybe [] (use o) <$> + Annex.getField (optionName o) + use o v = [Param ("--" ++ optionName o), Param v] + +start + :: M.Map UUID String + -> TimeZone + -> [CommandParam] + -> Bool + -> FilePath + -> Key + -> CommandStart +start m zone os gource file key = do + showLog output =<< readLog <$> getLog key os + -- getLog produces a zombie; reap it + liftIO reapZombies + stop + where + output + | gource = gourceOutput lookupdescription file + | otherwise = normalOutput lookupdescription file zone + lookupdescription u = fromMaybe (fromUUID u) $ M.lookup u m + +showLog :: Outputter -> [RefChange] -> Annex () +showLog outputter ps = do + sets <- mapM (getset newref) ps + previous <- maybe (return genesis) (getset oldref) (lastMaybe ps) + sequence_ $ compareChanges outputter $ sets ++ [previous] + where + genesis = (0, S.empty) + getset select change = do + s <- S.fromList <$> get (select change) + return (changetime change, s) + get ref = map toUUID . Logs.Presence.getLog . L.unpack <$> + catObject ref + +normalOutput :: (UUID -> String) -> FilePath -> TimeZone -> Outputter +normalOutput lookupdescription file zone present ts us = + liftIO $ mapM_ (putStrLn . format) us + where + time = showTimeStamp zone ts + addel = if present then "+" else "-" + format u = unwords [ addel, time, file, "|", + fromUUID u ++ " -- " ++ lookupdescription u ] + +gourceOutput :: (UUID -> String) -> FilePath -> Outputter +gourceOutput lookupdescription file present ts us = + liftIO $ mapM_ (putStrLn . intercalate "|" . format) us + where + time = takeWhile isDigit $ show ts + addel = if present then "A" else "M" + format u = [ time, lookupdescription u, addel, file ] + +{- Generates a display of the changes (which are ordered with newest first), + - by comparing each change with the previous change. + - Uses a formatter to generate a display of items that are added and + - removed. -} +compareChanges :: Ord a => (Bool -> POSIXTime -> [a] -> b) -> [(POSIXTime, S.Set a)] -> [b] +compareChanges format changes = concatMap diff $ zip changes (drop 1 changes) + where + diff ((ts, new), (_, old)) = + [format True ts added, format False ts removed] + where + added = S.toList $ S.difference new old + removed = S.toList $ S.difference old new + +{- Gets the git log for a given location log file. + - + - This is complicated by git log using paths relative to the current + - directory, even when looking at files in a different branch. A wacky + - relative path to the log file has to be used. + - + - The --remove-empty is a significant optimisation. It relies on location + - log files never being deleted in normal operation. Letting git stop + - once the location log file is gone avoids it checking all the way back + - to commit 0 to see if it used to exist, so generally speeds things up a + - *lot* for newish files. -} +getLog :: Key -> [CommandParam] -> Annex [String] +getLog key os = do + top <- fromRepo Git.repoPath + p <- liftIO $ relPathCwdToFile top + let logfile = p locationLogFile key + inRepo $ pipeNullSplitZombie $ + [ Params "log -z --pretty=format:%ct --raw --abbrev=40" + , Param "--remove-empty" + ] ++ os ++ + [ Param $ Git.fromRef Annex.Branch.fullname + , Param "--" + , Param logfile + ] + +readLog :: [String] -> [RefChange] +readLog = mapMaybe (parse . lines) + where + parse (ts:raw:[]) = let (old, new) = parseRaw raw in + Just RefChange + { changetime = parseTimeStamp ts + , oldref = old + , newref = new + } + parse _ = Nothing + +-- Parses something like ":100644 100644 oldsha newsha M" +parseRaw :: String -> (Git.Ref, Git.Ref) +parseRaw l = go $ words l + where + go (_:_:oldsha:newsha:_) = (Git.Ref oldsha, Git.Ref newsha) + go _ = error $ "unable to parse git log output: " ++ l + +parseTimeStamp :: String -> POSIXTime +parseTimeStamp = utcTimeToPOSIXSeconds . fromMaybe (error "bad timestamp") . + parseTime defaultTimeLocale "%s" + +showTimeStamp :: TimeZone -> POSIXTime -> String +showTimeStamp zone = show . utcToLocalTime zone . posixSecondsToUTCTime diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs new file mode 100644 index 000000000..814c5d2d7 --- /dev/null +++ b/Command/LookupKey.hs @@ -0,0 +1,26 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.LookupKey where + +import Common.Annex +import Command +import Annex.CatFile +import Types.Key + +def :: [Command] +def = [notBareRepo $ noCommit $ noMessages $ + command "lookupkey" (paramRepeating paramFile) seek + SectionPlumbing "looks up key used for file"] + +seek :: CommandSeek +seek = withStrings start + +start :: String -> CommandStart +start file = do + liftIO . maybe exitFailure (putStrLn . key2file) =<< catKeyFile file + stop diff --git a/Command/Map.hs b/Command/Map.hs new file mode 100644 index 000000000..5a32d7f52 --- /dev/null +++ b/Command/Map.hs @@ -0,0 +1,253 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Map where + +import Control.Exception.Extensible +import qualified Data.Map as M + +import Common.Annex +import Command +import qualified Git +import qualified Git.Url +import qualified Git.Config +import qualified Git.Construct +import qualified Annex +import Annex.UUID +import Logs.UUID +import Logs.Trust +import qualified Remote.Helper.Ssh as Ssh +import qualified Utility.Dot as Dot + +-- a link from the first repository to the second (its remote) +data Link = Link Git.Repo Git.Repo + +def :: [Command] +def = [dontCheck repoExists $ + command "map" paramNothing seek SectionQuery + "generate map of repositories"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + rs <- combineSame <$> (spider =<< gitRepo) + + umap <- uuidMap + trusted <- trustGet Trusted + + file <- () <$> fromRepo gitAnnexDir <*> pure "map.dot" + + liftIO $ writeFile file (drawMap rs umap trusted) + next $ next $ + ifM (Annex.getState Annex.fast) + ( return True + , do + showLongNote $ "running: dot -Tx11 " ++ file + showOutput + liftIO $ boolSystem "dot" [Param "-Tx11", File file] + ) + +{- Generates a graph for dot(1). Each repository, and any other uuids, are + - displayed as a node, and each of its remotes is represented as an edge + - pointing at the node for the remote. + - + - The order nodes are added to the graph matters, since dot will draw + - the first ones near to the top and left. So it looks better to put + - the repositories first, followed by uuids that were not matched + - to a repository. + -} +drawMap :: [Git.Repo] -> M.Map UUID String -> [UUID] -> String +drawMap rs umap ts = Dot.graph $ repos ++ trusted ++ others + where + repos = map (node umap rs) rs + ruuids = ts ++ map getUncachedUUID rs + others = map (unreachable . uuidnode) $ + filter (`notElem` ruuids) (M.keys umap) + trusted = map (trustworthy . uuidnode) ts + uuidnode u = Dot.graphNode (fromUUID u) $ M.findWithDefault "" u umap + +hostname :: Git.Repo -> String +hostname r + | Git.repoIsUrl r = fromMaybe (Git.repoLocation r) (Git.Url.host r) + | otherwise = "localhost" + +basehostname :: Git.Repo -> String +basehostname r = fromMaybe "" $ headMaybe $ split "." $ hostname r + +{- A name to display for a repo. Uses the name from uuid.log if available, + - or the remote name if not. -} +repoName :: M.Map UUID String -> Git.Repo -> String +repoName umap r + | repouuid == NoUUID = fallback + | otherwise = M.findWithDefault fallback repouuid umap + where + repouuid = getUncachedUUID r + fallback = fromMaybe "unknown" $ Git.remoteName r + +{- A unique id for the node for a repo. Uses the annex.uuid if available. -} +nodeId :: Git.Repo -> String +nodeId r = + case getUncachedUUID r of + NoUUID -> Git.repoLocation r + UUID u -> u + +{- A node representing a repo. -} +node :: M.Map UUID String -> [Git.Repo] -> Git.Repo -> String +node umap fullinfo r = unlines $ n:edges + where + n = Dot.subGraph (hostname r) (basehostname r) "lightblue" $ + decorate $ Dot.graphNode (nodeId r) (repoName umap r) + edges = map (edge umap fullinfo r) (Git.remotes r) + decorate + | Git.config r == M.empty = unreachable + | otherwise = reachable + +{- An edge between two repos. The second repo is a remote of the first. -} +edge :: M.Map UUID String -> [Git.Repo] -> Git.Repo -> Git.Repo -> String +edge umap fullinfo from to = + Dot.graphEdge (nodeId from) (nodeId fullto) edgename + where + -- get the full info for the remote, to get its UUID + fullto = findfullinfo to + findfullinfo n = + case filter (same n) fullinfo of + [] -> n + (n':_) -> n' + {- Only name an edge if the name is different than the name + - that will be used for the destination node, and is + - different from its hostname. (This reduces visual clutter.) -} + edgename = maybe Nothing calcname $ Git.remoteName to + calcname n + | n `elem` [repoName umap fullto, hostname fullto] = Nothing + | otherwise = Just n + +unreachable :: String -> String +unreachable = Dot.fillColor "red" +reachable :: String -> String +reachable = Dot.fillColor "white" +trustworthy :: String -> String +trustworthy = Dot.fillColor "green" + +{- Recursively searches out remotes starting with the specified repo. -} +spider :: Git.Repo -> Annex [Git.Repo] +spider r = spider' [r] [] +spider' :: [Git.Repo] -> [Git.Repo] -> Annex [Git.Repo] +spider' [] known = return known +spider' (r:rs) known + | any (same r) known = spider' rs known + | otherwise = do + r' <- scan r + + -- The remotes will be relative to r', and need to be + -- made absolute for later use. + remotes <- mapM (absRepo r') (Git.remotes r') + let r'' = r' { Git.remotes = remotes } + + spider' (rs ++ remotes) (r'':known) + +{- Converts repos to a common absolute form. -} +absRepo :: Git.Repo -> Git.Repo -> Annex Git.Repo +absRepo reference r + | Git.repoIsUrl reference = return $ Git.Construct.localToUrl reference r + | Git.repoIsUrl r = return r + | otherwise = liftIO $ do + r' <- Git.Construct.fromAbsPath =<< absPath (Git.repoPath r) + r'' <- safely $ flip Annex.eval Annex.gitRepo =<< Annex.new r' + return (fromMaybe r' r'') + +{- Checks if two repos are the same. -} +same :: Git.Repo -> Git.Repo -> Bool +same a b + | both Git.repoIsSsh = matching Git.Url.authority && matching Git.repoPath + | both Git.repoIsUrl && neither Git.repoIsSsh = matching show + | neither Git.repoIsSsh = matching Git.repoPath + | otherwise = False + where + matching t = t a == t b + both t = t a && t b + neither t = not (t a) && not (t b) + +{- reads the config of a remote, with progress display -} +scan :: Git.Repo -> Annex Git.Repo +scan r = do + showStart "map" $ Git.repoDescribe r + v <- tryScan r + case v of + Just r' -> do + showEndOk + return r' + Nothing -> do + showOutput + showEndFail + return r + +{- tries to read the config of a remote, returning it only if it can + - be accessed -} +tryScan :: Git.Repo -> Annex (Maybe Git.Repo) +tryScan r + | Git.repoIsSsh r = sshscan + | Git.repoIsUrl r = return Nothing + | otherwise = liftIO $ safely $ Git.Config.read r + where + pipedconfig cmd params = liftIO $ safely $ + withHandle StdoutHandle createProcessSuccess p $ + Git.Config.hRead r + where + p = proc cmd $ toCommand params + + configlist = Ssh.onRemote r (pipedconfig, Nothing) "configlist" [] [] + manualconfiglist = do + gc <- Annex.getRemoteGitConfig r + sshparams <- Ssh.toRepo r gc [Param sshcmd] + liftIO $ pipedconfig "ssh" sshparams + where + sshcmd = cddir ++ " && " ++ + "git config --null --list" + dir = Git.repoPath r + cddir + | "/~" `isPrefixOf` dir = + let (userhome, reldir) = span (/= '/') (drop 1 dir) + in "cd " ++ userhome ++ " && cd " ++ shellEscape (drop 1 reldir) + | otherwise = "cd " ++ shellEscape dir + + -- First, try sshing and running git config manually, + -- only fall back to git-annex-shell configlist if that + -- fails. + -- + -- This is done for two reasons, first I'd like this + -- subcommand to be usable on non-git-annex repos. + -- Secondly, configlist doesn't include information about + -- the remote's remotes. + sshscan = do + sshnote + v <- manualconfiglist + case v of + Nothing -> do + sshnote + configlist + ok -> return ok + + sshnote = do + showAction "sshing" + showOutput + +{- Spidering can find multiple paths to the same repo, so this is used + - to combine (really remove) duplicate repos with the same UUID. -} +combineSame :: [Git.Repo] -> [Git.Repo] +combineSame = map snd . nubBy sameuuid . map pair + where + sameuuid (u1, _) (u2, _) = u1 == u2 && u1 /= NoUUID + pair r = (getUncachedUUID r, r) + +safely :: IO Git.Repo -> IO (Maybe Git.Repo) +safely a = do + result <- try a :: IO (Either SomeException Git.Repo) + case result of + Left _ -> return Nothing + Right r' -> return $ Just r' diff --git a/Command/Merge.hs b/Command/Merge.hs new file mode 100644 index 000000000..51a8b9c52 --- /dev/null +++ b/Command/Merge.hs @@ -0,0 +1,37 @@ +{- git-annex command + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Merge where + +import Common.Annex +import Command +import qualified Annex.Branch +import qualified Git.Branch +import Command.Sync (prepMerge, mergeLocal) + +def :: [Command] +def = [command "merge" paramNothing seek SectionMaintenance + "automatically merge changes from remotes"] + +seek :: CommandSeek +seek ps = do + withNothing mergeBranch ps + withNothing mergeSynced ps + +mergeBranch :: CommandStart +mergeBranch = do + showStart "merge" "git-annex" + next $ do + Annex.Branch.update + -- commit explicitly, in case no remote branches were merged + Annex.Branch.commit "update" + next $ return True + +mergeSynced :: CommandStart +mergeSynced = do + prepMerge + mergeLocal =<< inRepo Git.Branch.current diff --git a/Command/MetaData.hs b/Command/MetaData.hs new file mode 100644 index 000000000..38f9b8522 --- /dev/null +++ b/Command/MetaData.hs @@ -0,0 +1,98 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.MetaData where + +import Common.Annex +import qualified Annex +import Command +import Annex.MetaData +import Logs.MetaData + +import qualified Data.Set as S +import Data.Time.Clock.POSIX + +def :: [Command] +def = [withOptions metaDataOptions $ + command "metadata" paramPaths seek + SectionMetaData "sets metadata of a file"] + +metaDataOptions :: [Option] +metaDataOptions = + [ setOption + , tagOption + , untagOption + , getOption + , jsonOption + ] ++ keyOptions + +storeModMeta :: ModMeta -> Annex () +storeModMeta modmeta = Annex.changeState $ + \s -> s { Annex.modmeta = modmeta:Annex.modmeta s } + +setOption :: Option +setOption = Option ['s'] ["set"] (ReqArg mkmod "FIELD[+-]=VALUE") "set metadata" + where + mkmod = either error storeModMeta . parseModMeta + +getOption :: Option +getOption = fieldOption ['g'] "get" paramField "get single metadata field" + +tagOption :: Option +tagOption = Option ['t'] ["tag"] (ReqArg mkmod "TAG") "set a tag" + where + mkmod = storeModMeta . AddMeta tagMetaField . toMetaValue + +untagOption :: Option +untagOption = Option ['u'] ["untag"] (ReqArg mkmod "TAG") "remove a tag" + where + mkmod = storeModMeta . AddMeta tagMetaField . mkMetaValue (CurrentlySet False) + +seek :: CommandSeek +seek ps = do + modmeta <- Annex.getState Annex.modmeta + getfield <- getOptionField getOption $ \ms -> + return $ either error id . mkMetaField <$> ms + now <- liftIO getPOSIXTime + withKeyOptions + (startKeys now getfield modmeta) + (withFilesInGit (whenAnnexed $ start now getfield modmeta)) + ps + +start :: POSIXTime -> Maybe MetaField -> [ModMeta] -> FilePath -> Key -> CommandStart +start now f ms file = start' (Just file) now f ms + +startKeys :: POSIXTime -> Maybe MetaField -> [ModMeta] -> Key -> CommandStart +startKeys = start' Nothing + +start' :: AssociatedFile -> POSIXTime -> Maybe MetaField -> [ModMeta] -> Key -> CommandStart +start' afile now Nothing ms k = do + showStart' "metadata" k afile + next $ perform now ms k +start' _ _ (Just f) _ k = do + l <- S.toList . currentMetaDataValues f <$> getCurrentMetaData k + liftIO $ forM_ l $ + putStrLn . fromMetaValue + stop + +perform :: POSIXTime -> [ModMeta] -> Key -> CommandPerform +perform _ [] k = next $ cleanup k +perform now ms k = do + oldm <- getCurrentMetaData k + let m = combineMetaData $ map (modMeta oldm) ms + addMetaData' k m now + next $ cleanup k + +cleanup :: Key -> CommandCleanup +cleanup k = do + l <- map unwrapmeta . fromMetaData <$> getCurrentMetaData k + maybeShowJSON l + showLongNote $ unlines $ concatMap showmeta l + return True + where + unwrapmeta (f, v) = (fromMetaField f, map fromMetaValue (S.toList v)) + showmeta (f, vs) = map ((f ++ "=") ++) vs diff --git a/Command/Migrate.hs b/Command/Migrate.hs new file mode 100644 index 000000000..cea9e9426 --- /dev/null +++ b/Command/Migrate.hs @@ -0,0 +1,87 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Migrate where + +import Common.Annex +import Command +import Backend +import qualified Types.Key +import Types.Backend (canUpgradeKey, fastMigrate) +import Types.KeySource +import Annex.Content +import qualified Command.ReKey +import qualified Command.Fsck + +def :: [Command] +def = [notDirect $ + command "migrate" paramPaths seek + SectionUtility "switch data to different backend"] + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +start :: FilePath -> Key -> CommandStart +start file key = do + v <- Backend.getBackend file key + case v of + Nothing -> stop + Just oldbackend -> do + exists <- inAnnex key + newbackend <- choosebackend =<< chooseBackend file + if (newbackend /= oldbackend || upgradableKey oldbackend key) && exists + then do + showStart "migrate" file + next $ perform file key oldbackend newbackend + else stop + where + choosebackend Nothing = Prelude.head <$> orderedList + choosebackend (Just backend) = return backend + +{- Checks if a key is upgradable to a newer representation. + - + - Reasons for migration: + - - Ideally, all keys have file size metadata. Old keys may not. + - - Something has changed in the backend, such as a bug fix. + -} +upgradableKey :: Backend -> Key -> Bool +upgradableKey backend key = isNothing (Types.Key.keySize key) || backendupgradable + where + backendupgradable = maybe False (\a -> a key) (canUpgradeKey backend) + +{- Store the old backend's key in the new backend + - The old backend's key is not dropped from it, because there may + - be other files still pointing at that key. + - + - To ensure that the data we have for the old key is valid, it's + - fscked here. First we generate the new key. This ensures that the + - data cannot get corrupted after the fsck but before the new key is + - generated. + -} +perform :: FilePath -> Key -> Backend -> Backend -> CommandPerform +perform file oldkey oldbackend newbackend = go =<< genkey + where + go Nothing = stop + go (Just (newkey, knowngoodcontent)) + | knowngoodcontent = finish newkey + | otherwise = stopUnless checkcontent $ finish newkey + checkcontent = Command.Fsck.checkBackend oldbackend oldkey $ Just file + finish newkey = stopUnless (Command.ReKey.linkKey oldkey newkey) $ + next $ Command.ReKey.cleanup file oldkey newkey + genkey = case maybe Nothing (\fm -> fm oldkey newbackend) (fastMigrate oldbackend) of + Just newkey -> return $ Just (newkey, True) + Nothing -> do + content <- calcRepo $ gitAnnexLocation oldkey + let source = KeySource + { keyFilename = file + , contentLocation = content + , inodeCache = Nothing + } + v <- genKey source (Just newbackend) + return $ case v of + Just (newkey, _) -> Just (newkey, False) + _ -> Nothing diff --git a/Command/Mirror.hs b/Command/Mirror.hs new file mode 100644 index 000000000..4e9a85009 --- /dev/null +++ b/Command/Mirror.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Mirror where + +import Common.Annex +import Command +import qualified Command.Move +import qualified Command.Drop +import qualified Command.Get +import qualified Remote +import Annex.Content +import qualified Annex +import Config.NumCopies + +def :: [Command] +def = [withOptions (fromToOptions ++ keyOptions) $ + command "mirror" paramPaths seek + SectionCommon "mirror content of files to/from another repository"] + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKey to from Nothing) + (withFilesInGit $ whenAnnexed $ start to from) + ps + +start :: Maybe Remote -> Maybe Remote -> FilePath -> Key -> CommandStart +start to from file key = startKey to from (Just file) key + +startKey :: Maybe Remote -> Maybe Remote -> Maybe FilePath -> Key -> CommandStart +startKey to from afile key = do + noAuto + case (from, to) of + (Nothing, Nothing) -> error "specify either --from or --to" + (Nothing, Just r) -> mirrorto r + (Just r, Nothing) -> mirrorfrom r + _ -> error "only one of --from or --to can be specified" + where + noAuto = whenM (Annex.getState Annex.auto) $ + error "--auto is not supported for mirror" + mirrorto r = ifM (inAnnex key) + ( Command.Move.toStart r False afile key + , do + numcopies <- getnumcopies + Command.Drop.startRemote afile numcopies key r + ) + mirrorfrom r = do + haskey <- Remote.hasKey r key + case haskey of + Left _ -> stop + Right True -> Command.Get.start' (return True) Nothing key afile + Right False -> ifM (inAnnex key) + ( do + numcopies <- getnumcopies + Command.Drop.startLocal afile numcopies key Nothing + , stop + ) + getnumcopies = maybe getNumCopies getFileNumCopies afile diff --git a/Command/Move.hs b/Command/Move.hs new file mode 100644 index 000000000..396ea4afc --- /dev/null +++ b/Command/Move.hs @@ -0,0 +1,173 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Move where + +import Common.Annex +import Command +import qualified Command.Drop +import qualified Annex +import Annex.Content +import qualified Remote +import Annex.UUID +import Annex.Transfer +import Logs.Presence + +def :: [Command] +def = [withOptions moveOptions $ command "move" paramPaths seek + SectionCommon "move content of files to/from another repository"] + +moveOptions :: [Option] +moveOptions = fromToOptions ++ keyOptions + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKey to from True) + (withFilesInGit $ whenAnnexed $ start to from True) + ps + +start :: Maybe Remote -> Maybe Remote -> Bool -> FilePath -> Key -> CommandStart +start to from move file key = start' to from move (Just file) key + +startKey :: Maybe Remote -> Maybe Remote -> Bool -> Key -> CommandStart +startKey to from move = start' to from move Nothing + +start' :: Maybe Remote -> Maybe Remote -> Bool -> AssociatedFile -> Key -> CommandStart +start' to from move afile key = do + noAuto + case (from, to) of + (Nothing, Nothing) -> error "specify either --from or --to" + (Nothing, Just dest) -> toStart dest move afile key + (Just src, Nothing) -> fromStart src move afile key + _ -> error "only one of --from or --to can be specified" + where + noAuto = when move $ whenM (Annex.getState Annex.auto) $ error + "--auto is not supported for move" + +showMoveAction :: Bool -> Key -> AssociatedFile -> Annex () +showMoveAction move = showStart' (if move then "move" else "copy") + +{- Moves (or copies) the content of an annexed file to a remote. + - + - If the remote already has the content, it is still removed from + - the current repository. + - + - Note that unlike drop, this does not honor numcopies. + - A file's content can be moved even if there are insufficient copies to + - allow it to be dropped. + -} +toStart :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +toStart dest move afile key = do + u <- getUUID + ishere <- inAnnex key + if not ishere || u == Remote.uuid dest + then stop -- not here, so nothing to do + else toStart' dest move afile key + +toStart' :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +toStart' dest move afile key = do + fast <- Annex.getState Annex.fast + if fast && not move && not (Remote.hasKeyCheap dest) + then ifM (expectedPresent dest key) + ( stop + , go True (pure $ Right False) + ) + else go False (Remote.hasKey dest key) + where + go fastcheck isthere = do + showMoveAction move key afile + next $ toPerform dest move key afile fastcheck =<< isthere + +expectedPresent :: Remote -> Key -> Annex Bool +expectedPresent dest key = do + remotes <- Remote.keyPossibilities key + return $ dest `elem` remotes + +toPerform :: Remote -> Bool -> Key -> AssociatedFile -> Bool -> Either String Bool -> CommandPerform +toPerform dest move key afile fastcheck isthere = moveLock move key $ + case isthere of + Left err -> do + showNote err + stop + Right False -> do + showAction $ "to " ++ Remote.name dest + ok <- notifyTransfer Upload afile $ + upload (Remote.uuid dest) key afile noRetry $ + Remote.storeKey dest key afile + if ok + then do + Remote.logStatus dest key InfoPresent + finish + else do + when fastcheck $ + warning "This could have failed because --fast is enabled." + stop + Right True -> do + unlessM (expectedPresent dest key) $ + Remote.logStatus dest key InfoPresent + finish + where + finish + | move = do + removeAnnex key + next $ Command.Drop.cleanupLocal key + | otherwise = next $ return True + +{- Moves (or copies) the content of an annexed file from a remote + - to the current repository. + - + - If the current repository already has the content, it is still removed + - from the remote. + -} +fromStart :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +fromStart src move afile key + | move = go + | otherwise = stopUnless (not <$> inAnnex key) go + where + go = stopUnless (fromOk src key) $ do + showMoveAction move key afile + next $ fromPerform src move key afile + +fromOk :: Remote -> Key -> Annex Bool +fromOk src key = go =<< Annex.getState Annex.force + where + go True = either (const $ return True) return =<< haskey + go False + | Remote.hasKeyCheap src = + either (const expensive) return =<< haskey + | otherwise = expensive + haskey = Remote.hasKey src key + expensive = do + u <- getUUID + remotes <- Remote.keyPossibilities key + return $ u /= Remote.uuid src && elem src remotes + +fromPerform :: Remote -> Bool -> Key -> AssociatedFile -> CommandPerform +fromPerform src move key afile = moveLock move key $ + ifM (inAnnex key) + ( handle move True + , handle move =<< go + ) + where + go = notifyTransfer Download afile $ + download (Remote.uuid src) key afile noRetry $ \p -> do + showAction $ "from " ++ Remote.name src + getViaTmp key $ \t -> Remote.retrieveKeyFile src key afile t p + handle _ False = stop -- failed + handle False True = next $ return True -- copy complete + handle True True = do -- finish moving + ok <- Remote.removeKey src key + next $ Command.Drop.cleanupRemote key src ok + +{- Locks a key in order for it to be moved. + - No lock is needed when a key is being copied. -} +moveLock :: Bool -> Key -> Annex a -> Annex a +moveLock True key a = lockContent key a +moveLock False _ a = a diff --git a/Command/NotifyChanges.hs b/Command/NotifyChanges.hs new file mode 100644 index 000000000..d0df05551 --- /dev/null +++ b/Command/NotifyChanges.hs @@ -0,0 +1,83 @@ +{- git-annex-shell command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.NotifyChanges where + +import Common.Annex +import Command +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Git +import Git.Sha +import RemoteDaemon.Transport.Ssh.Types + +import Control.Concurrent +import Control.Concurrent.Async +import Control.Concurrent.STM + +def :: [Command] +def = [noCommit $ command "notifychanges" paramNothing seek SectionPlumbing + "sends notification when git refs are changed"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + -- This channel is used to accumulate notifcations, + -- because the DirWatcher might have multiple threads that find + -- changes at the same time. + chan <- liftIO newTChanIO + + g <- gitRepo + let refdir = Git.localGitDir g "refs" + liftIO $ createDirectoryIfMissing True refdir + + let notifyhook = Just $ notifyHook chan + let hooks = mkWatchHooks + { addHook = notifyhook + , modifyHook = notifyhook + } + + void $ liftIO $ watchDir refdir (const False) True hooks id + + let sender = do + send READY + forever $ send . CHANGED =<< drain chan + + -- No messages need to be received from the caller, + -- but when it closes the connection, notice and terminate. + let receiver = forever $ void $ getLine + void $ liftIO $ concurrently sender receiver + stop + +notifyHook :: TChan Git.Sha -> FilePath -> Maybe FileStatus -> IO () +notifyHook chan reffile _ + | ".lock" `isSuffixOf` reffile = noop + | otherwise = void $ do + sha <- catchDefaultIO Nothing $ + extractSha <$> readFile reffile + maybe noop (atomically . writeTChan chan) sha + +-- When possible, coalesce ref writes that occur closely together +-- in time. Delay up to 0.05 seconds to get more ref writes. +drain :: TChan Git.Sha -> IO [Git.Sha] +drain chan = do + r <- atomically $ readTChan chan + threadDelay 50000 + rs <- atomically $ drain' chan + return (r:rs) + +drain' :: TChan Git.Sha -> STM [Git.Sha] +drain' chan = loop [] + where + loop rs = maybe (return rs) (\r -> loop (r:rs)) =<< tryReadTChan chan + +send :: Notification -> IO () +send n = do + putStrLn $ unwords $ formatMessage n + hFlush stdout diff --git a/Command/NumCopies.hs b/Command/NumCopies.hs new file mode 100644 index 000000000..b7323ae35 --- /dev/null +++ b/Command/NumCopies.hs @@ -0,0 +1,56 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.NumCopies where + +import Common.Annex +import qualified Annex +import Command +import Config.NumCopies +import Types.Messages + +def :: [Command] +def = [command "numcopies" paramNumber seek + SectionSetup "configure desired number of copies"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = startGet +start [s] = do + case readish s of + Nothing -> error $ "Bad number: " ++ s + Just n + | n > 0 -> startSet n + | n == 0 -> ifM (Annex.getState Annex.force) + ( startSet n + , error "Setting numcopies to 0 is very unsafe. You will lose data! If you really want to do that, specify --force." + ) + | otherwise -> error "Number cannot be negative!" +start _ = error "Specify a single number." + +startGet :: CommandStart +startGet = next $ next $ do + Annex.setOutput QuietOutput + v <- getGlobalNumCopies + case v of + Just n -> liftIO $ putStrLn $ show $ fromNumCopies n + Nothing -> do + liftIO $ putStrLn $ "global numcopies is not set" + old <- deprecatedNumCopies + case old of + Nothing -> liftIO $ putStrLn "(default is 1)" + Just n -> liftIO $ putStrLn $ "(deprecated git config annex.numcopies is set to " ++ show (fromNumCopies n) ++ " locally)" + return True + +startSet :: Int -> CommandStart +startSet n = do + showStart "numcopies" (show n) + next $ next $ do + setGlobalNumCopies $ NumCopies n + return True diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs new file mode 100644 index 000000000..412b9ae08 --- /dev/null +++ b/Command/PreCommit.hs @@ -0,0 +1,111 @@ +{- git-annex command + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.PreCommit where + +import Common.Annex +import Command +import Config +import qualified Command.Add +import qualified Command.Fix +import Annex.Direct +import Annex.Hook +import Annex.View +import Annex.View.ViewedFile +import Annex.Perms +import Annex.Exception +import Logs.View +import Logs.MetaData +import Types.View +import Types.MetaData + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import qualified Data.Set as S + +def :: [Command] +def = [command "pre-commit" paramPaths seek SectionPlumbing + "run by git pre-commit hook"] + +seek :: CommandSeek +seek ps = lockPreCommitHook $ ifM isDirect + ( do + -- update direct mode mappings for committed files + withWords startDirect ps + runAnnexHook preCommitAnnexHook + , do + -- fix symlinks to files being committed + withFilesToBeCommitted (whenAnnexed Command.Fix.start) ps + -- inject unlocked files into the annex + withFilesUnlockedToBeCommitted startIndirect ps + runAnnexHook preCommitAnnexHook + -- committing changes to a view updates metadata + mv <- currentView + case mv of + Nothing -> noop + Just v -> withViewChanges + (addViewMetaData v) + (removeViewMetaData v) + ) + + +startIndirect :: FilePath -> CommandStart +startIndirect f = next $ do + unlessM (callCommandAction $ Command.Add.start f) $ + error $ "failed to add " ++ f ++ "; canceling commit" + next $ return True + +startDirect :: [String] -> CommandStart +startDirect _ = next $ next $ preCommitDirect + +addViewMetaData :: View -> ViewedFile -> Key -> CommandStart +addViewMetaData v f k = do + showStart "metadata" f + next $ next $ changeMetaData k $ fromView v f + +removeViewMetaData :: View -> ViewedFile -> Key -> CommandStart +removeViewMetaData v f k = do + showStart "metadata" f + next $ next $ changeMetaData k $ unsetMetaData $ fromView v f + +changeMetaData :: Key -> MetaData -> CommandCleanup +changeMetaData k metadata = do + showMetaDataChange metadata + addMetaData k metadata + return True + +showMetaDataChange :: MetaData -> Annex () +showMetaDataChange = showLongNote . unlines . concatMap showmeta . fromMetaData + where + showmeta (f, vs) = map (showmetavalue f) $ S.toList vs + showmetavalue f v = fromMetaField f ++ showset v ++ "=" ++ fromMetaValue v + showset v + | isSet v = "+" + | otherwise = "-" + +{- Takes exclusive lock; blocks until available. -} +lockPreCommitHook :: Annex a -> Annex a +lockPreCommitHook a = do + lockfile <- fromRepo gitAnnexPreCommitLock + createAnnexDirectory $ takeDirectory lockfile + mode <- annexFileMode + bracketIO (lock lockfile mode) unlock (const a) + where +#ifndef mingw32_HOST_OS + lock lockfile mode = do + l <- liftIO $ noUmask mode $ createFile lockfile mode + liftIO $ waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) + return l + unlock = closeFd +#else + lock lockfile _mode = liftIO $ waitToLock $ lockExclusive lockfile + unlock = dropLock +#endif diff --git a/Command/ReKey.hs b/Command/ReKey.hs new file mode 100644 index 000000000..2919a09e9 --- /dev/null +++ b/Command/ReKey.hs @@ -0,0 +1,71 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ReKey where + +import Common.Annex +import Command +import qualified Annex +import Types.Key +import Annex.Content +import qualified Command.Add +import Logs.Web +import Logs.Location +import Utility.CopyFile + +def :: [Command] +def = [notDirect $ command "rekey" + (paramOptional $ paramRepeating $ paramPair paramPath paramKey) + seek SectionPlumbing "change keys used for files"] + +seek :: CommandSeek +seek = withPairs start + +start :: (FilePath, String) -> CommandStart +start (file, keyname) = ifAnnexed file go stop + where + newkey = fromMaybe (error "bad key") $ file2key keyname + go oldkey + | oldkey == newkey = stop + | otherwise = do + showStart "rekey" file + next $ perform file oldkey newkey + +perform :: FilePath -> Key -> Key -> CommandPerform +perform file oldkey newkey = do + present <- inAnnex oldkey + _ <- if present + then linkKey oldkey newkey + else do + unlessM (Annex.getState Annex.force) $ + error $ file ++ " is not available (use --force to override)" + return True + next $ cleanup file oldkey newkey + +{- Make a hard link to the old key content (when supported), + - to avoid wasting disk space. -} +linkKey :: Key -> Key -> Annex Bool +linkKey oldkey newkey = getViaTmpUnchecked newkey $ \tmp -> do + src <- calcRepo $ gitAnnexLocation oldkey + liftIO $ ifM (doesFileExist tmp) + ( return True + , createLinkOrCopy src tmp + ) + +cleanup :: FilePath -> Key -> Key -> CommandCleanup +cleanup file oldkey newkey = do + -- If the old key had some associated urls, record them for + -- the new key as well. + urls <- getUrls oldkey + unless (null urls) $ + mapM_ (setUrlPresent newkey) urls + + -- Update symlink to use the new key. + liftIO $ removeFile file + Command.Add.addLink file newkey Nothing + logStatus newkey InfoPresent + return True diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs new file mode 100644 index 000000000..1794596c5 --- /dev/null +++ b/Command/RecvKey.hs @@ -0,0 +1,87 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.RecvKey where + +import Common.Annex +import Command +import CmdLine +import Annex.Content +import Annex +import Utility.Rsync +import Logs.Transfer +import Command.SendKey (fieldTransfer) +import qualified CmdLine.GitAnnexShell.Fields as Fields +import qualified Types.Key +import qualified Types.Backend +import qualified Backend + +def :: [Command] +def = [noCommit $ command "recvkey" paramKey seek + SectionPlumbing "runs rsync in server mode to receive content"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = ifM (inAnnex key) + ( error "key is already present in annex" + , fieldTransfer Download key $ \_p -> + ifM (getViaTmp key go) + ( do + -- forcibly quit after receiving one key, + -- and shutdown cleanly + _ <- shutdown True + return True + , return False + ) + ) + where + go tmp = do + opts <- filterRsyncSafeOptions . maybe [] words + <$> getField "RsyncOptions" + ok <- liftIO $ rsyncServerReceive (map Param opts) tmp + + -- The file could have been received with permissions that + -- do not allow reading it, so this is done before the + -- directcheck. + freezeContent tmp + + if ok + then ifM (isJust <$> Fields.getField Fields.direct) + ( directcheck tmp + , return True + ) + else return False + {- If the sending repository uses direct mode, the file + - it sends could be modified as it's sending it. So check + - that the right size file was received, and that the key/value + - Backend is happy with it. -} + directcheck tmp = do + oksize <- case Types.Key.keySize key of + Nothing -> return True + Just size -> do + size' <- fromIntegral . fileSize + <$> liftIO (getFileStatus tmp) + return $ size == size' + if oksize + then case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of + Nothing -> do + warning "recvkey: received key from direct mode repository using unknown backend; cannot check; discarding" + return False + Just backend -> maybe (return True) runfsck + (Types.Backend.fsckKey backend) + else do + warning "recvkey: received key with wrong size; discarding" + return False + where + runfsck check = ifM (check key tmp) + ( return True + , do + warning "recvkey: received key from direct mode repository seems to have changed as it was transferred; discarding" + return False + ) diff --git a/Command/Reinit.hs b/Command/Reinit.hs new file mode 100644 index 000000000..0fc1e8314 --- /dev/null +++ b/Command/Reinit.hs @@ -0,0 +1,38 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Reinit where + +import Common.Annex +import Command +import Annex.Init +import Annex.UUID +import Types.UUID +import qualified Remote + +def :: [Command] +def = [dontCheck repoExists $ + command "reinit" (paramUUID ++ " or " ++ paramDesc) seek SectionUtility ""] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start ws = do + showStart "reinit" s + next $ perform s + where + s = unwords ws + +perform :: String -> CommandPerform +perform s = do + u <- if isUUID s + then return $ toUUID s + else Remote.nameToUUID s + storeUUID u + initialize' + next $ return True diff --git a/Command/Reinject.hs b/Command/Reinject.hs new file mode 100644 index 000000000..a516fe93c --- /dev/null +++ b/Command/Reinject.hs @@ -0,0 +1,63 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Reinject where + +import Common.Annex +import Command +import Logs.Location +import Annex.Content +import qualified Command.Fsck +import qualified Backend + +def :: [Command] +def = [command "reinject" (paramPair "SRC" "DEST") seek + SectionUtility "sets content of annexed file"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start (src:dest:[]) + | src == dest = stop + | otherwise = + ifAnnexed src + (error $ "cannot used annexed file as src: " ++ src) + go + where + go = do + showStart "reinject" dest + next $ whenAnnexed (perform src) dest +start _ = error "specify a src file and a dest file" + +perform :: FilePath -> FilePath -> Key -> CommandPerform +perform src dest key = do + {- Check the content before accepting it. -} + v <- Backend.getBackend dest key + case v of + Nothing -> stop + Just backend -> + ifM (Command.Fsck.checkKeySizeOr reject key src + <&&> Command.Fsck.checkBackendOr reject backend key src) + ( do + unlessM move $ error "mv failed!" + next $ cleanup key + , error "not reinjecting" + ) + where + -- the file might be on a different filesystem, + -- so mv is used rather than simply calling + -- moveToObjectDir; disk space is also + -- checked this way. + move = getViaTmp key $ \tmp -> + liftIO $ boolSystem "mv" [File src, File tmp] + reject = const $ return "wrong file?" + +cleanup :: Key -> CommandCleanup +cleanup key = do + logStatus key InfoPresent + return True diff --git a/Command/RemoteDaemon.hs b/Command/RemoteDaemon.hs new file mode 100644 index 000000000..61c3a7d84 --- /dev/null +++ b/Command/RemoteDaemon.hs @@ -0,0 +1,24 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.RemoteDaemon where + +import Common.Annex +import Command +import RemoteDaemon.Core + +def :: [Command] +def = [noCommit $ command "remotedaemon" paramNothing seek SectionPlumbing + "detects when remotes have changed, and fetches from them"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + liftIO runForeground + stop diff --git a/Command/Repair.hs b/Command/Repair.hs new file mode 100644 index 000000000..56925d83d --- /dev/null +++ b/Command/Repair.hs @@ -0,0 +1,84 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Repair where + +import Common.Annex +import Command +import qualified Annex +import qualified Git.Repair +import qualified Annex.Branch +import qualified Git.Ref +import Git.Types +import Annex.Version + +def :: [Command] +def = [noCommit $ dontCheck repoExists $ + command "repair" paramNothing seek SectionMaintenance "recover broken git repository"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = next $ next $ runRepair =<< Annex.getState Annex.force + +runRepair :: Bool -> Annex Bool +runRepair forced = do + (ok, modifiedbranches) <- inRepo $ + Git.Repair.runRepair isAnnexSyncBranch forced + -- This command can be run in git repos not using git-annex, + -- so avoid git annex branch stuff in that case. + whenM (isJust <$> getVersion) $ + repairAnnexBranch modifiedbranches + return ok + +{- After git repository repair, the .git/annex/index file could + - still be broken, by pointing to bad objects, or might just be corrupt on + - its own. Since this index file is not used to stage things + - for long durations of time, it can safely be deleted if it is broken. + - + - Otherwise, if the git-annex branch was modified by the repair, + - commit the index file to the git-annex branch. + - This way, if the git-annex branch got rewound to an old version by + - the repository repair, or was completely deleted, this will get it back + - to a good state. Note that in the unlikely case where the git-annex + - branch was rewound to a state that, had new changes from elsewhere not + - yet reflected in the index, this does properly merge those into the + - index before committing. + -} +repairAnnexBranch :: [Branch] -> Annex () +repairAnnexBranch modifiedbranches + | Annex.Branch.fullname `elem` modifiedbranches = ifM okindex + ( commitindex + , do + nukeindex + missingbranch + ) + | otherwise = ifM okindex + ( noop + , do + nukeindex + ifM (null <$> inRepo (Git.Ref.matching [Annex.Branch.fullname])) + ( missingbranch + , liftIO $ putStrLn "No data was lost." + ) + ) + where + okindex = Annex.Branch.withIndex $ inRepo $ Git.Repair.checkIndex + commitindex = do + Annex.Branch.forceCommit "committing index after git repository repair" + liftIO $ putStrLn "Successfully recovered the git-annex branch using .git/annex/index" + nukeindex = do + inRepo $ nukeFile . gitAnnexIndex + liftIO $ putStrLn "Had to delete the .git/annex/index file as it was corrupt." + missingbranch = liftIO $ putStrLn "Since the git-annex branch is not up-to-date anymore. It would be a very good idea to run: git annex fsck --fast" + +trackingOrSyncBranch :: Ref -> Bool +trackingOrSyncBranch b = Git.Repair.isTrackingBranch b || isAnnexSyncBranch b + +isAnnexSyncBranch :: Ref -> Bool +isAnnexSyncBranch b = "refs/synced/" `isPrefixOf` fromRef b diff --git a/Command/ResolveMerge.hs b/Command/ResolveMerge.hs new file mode 100644 index 000000000..a50e2aa9d --- /dev/null +++ b/Command/ResolveMerge.hs @@ -0,0 +1,40 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ResolveMerge where + +import Common.Annex +import Command +import qualified Git +import Git.Sha +import qualified Git.Branch +import Annex.AutoMerge + +def :: [Command] +def = [command "resolvemerge" paramNothing seek SectionPlumbing + "resolve merge conflicts"] + +seek :: CommandSeek +seek ps = withNothing start ps + +start :: CommandStart +start = do + showStart "resolvemerge" "" + us <- fromMaybe nobranch <$> inRepo Git.Branch.current + d <- fromRepo Git.localGitDir + let merge_head = d "MERGE_HEAD" + them <- fromMaybe (error nomergehead) . extractSha + <$> liftIO (readFile merge_head) + ifM (resolveMerge (Just us) them) + ( do + void $ commitResolvedMerge Git.Branch.ManualCommit + next $ next $ return True + , error "Merge conflict could not be automatically resolved." + ) + where + nobranch = error "No branch is currently checked out." + nomergehead = error "No SHA found in .git/merge_head" diff --git a/Command/RmUrl.hs b/Command/RmUrl.hs new file mode 100644 index 000000000..e961575a3 --- /dev/null +++ b/Command/RmUrl.hs @@ -0,0 +1,30 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.RmUrl where + +import Common.Annex +import Command +import Logs.Web + +def :: [Command] +def = [notBareRepo $ + command "rmurl" (paramPair paramFile paramUrl) seek + SectionCommon "record file is not available at url"] + +seek :: CommandSeek +seek = withPairs start + +start :: (FilePath, String) -> CommandStart +start (file, url) = flip whenAnnexed file $ \_ key -> do + showStart "rmurl" file + next $ next $ cleanup url key + +cleanup :: String -> Key -> CommandCleanup +cleanup url key = do + setUrlMissing key url + return True diff --git a/Command/Schedule.hs b/Command/Schedule.hs new file mode 100644 index 000000000..a088dbef8 --- /dev/null +++ b/Command/Schedule.hs @@ -0,0 +1,53 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Schedule where + +import Common.Annex +import qualified Annex +import Command +import qualified Remote +import Logs.Schedule +import Types.ScheduledActivity +import Types.Messages + +import qualified Data.Set as S + +def :: [Command] +def = [command "schedule" (paramPair paramRemote (paramOptional paramExpression)) seek + SectionSetup "get or set scheduled jobs"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start = parse + where + parse (name:[]) = go name performGet + parse (name:expr:[]) = go name $ \uuid -> do + showStart "schedile" name + performSet expr uuid + parse _ = error "Specify a repository." + + go name a = do + u <- Remote.nameToUUID name + next $ a u + +performGet :: UUID -> CommandPerform +performGet uuid = do + Annex.setOutput QuietOutput + s <- scheduleGet uuid + liftIO $ putStrLn $ intercalate "; " $ + map fromScheduledActivity $ S.toList s + next $ return True + +performSet :: String -> UUID -> CommandPerform +performSet expr uuid = case parseScheduledActivities expr of + Left e -> error $ "Parse error: " ++ e + Right l -> do + scheduleSet uuid l + next $ return True diff --git a/Command/Semitrust.hs b/Command/Semitrust.hs new file mode 100644 index 000000000..edba27346 --- /dev/null +++ b/Command/Semitrust.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Semitrust where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "semitrust" (paramRepeating paramRemote) seek + SectionSetup "return repository to default trust level"] + +seek :: CommandSeek +seek = trustCommand "semitrust" SemiTrusted diff --git a/Command/SendKey.hs b/Command/SendKey.hs new file mode 100644 index 000000000..a201d1b89 --- /dev/null +++ b/Command/SendKey.hs @@ -0,0 +1,49 @@ +{- git-annex command + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.SendKey where + +import Common.Annex +import Command +import Annex.Content +import Annex +import Utility.Rsync +import Annex.Transfer +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Utility.Metered + +def :: [Command] +def = [noCommit $ command "sendkey" paramKey seek + SectionPlumbing "runs rsync in server mode to send content"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = do + opts <- filterRsyncSafeOptions . maybe [] words + <$> getField "RsyncOptions" + ifM (inAnnex key) + ( fieldTransfer Upload key $ \_p -> + sendAnnex key rollback $ liftIO . rsyncServerSend (map Param opts) + , do + warning "requested key is not present" + liftIO exitFailure + ) + where + {- No need to do any rollback; when sendAnnex fails, a nonzero + - exit will be propigated, and the remote will know the transfer + - failed. -} + rollback = noop + +fieldTransfer :: Direction -> Key -> (MeterUpdate -> Annex Bool) -> CommandStart +fieldTransfer direction key a = do + afile <- Fields.getField Fields.associatedFile + ok <- maybe (a $ const noop) + (\u -> runTransfer (Transfer direction (toUUID u) key) afile noRetry a) + =<< Fields.getField Fields.remoteUUID + liftIO $ exitBool ok diff --git a/Command/Status.hs b/Command/Status.hs new file mode 100644 index 000000000..9d184c33b --- /dev/null +++ b/Command/Status.hs @@ -0,0 +1,90 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Status where + +import Common.Annex +import Command +import Annex.CatFile +import Annex.Content.Direct +import Config +import qualified Git.LsFiles as LsFiles +import qualified Git.Ref +import qualified Git + +def :: [Command] +def = [notBareRepo $ noCommit $ noMessages $ withOptions [jsonOption] $ + command "status" paramPaths seek SectionCommon + "show the working tree status"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start [] = do + -- Like git status, when run without a directory, behave as if + -- given the path to the top of the repository. + currdir <- liftIO getCurrentDirectory + top <- fromRepo Git.repoPath + start' [relPathDirToFile currdir top] +start locs = start' locs + +start' :: [FilePath] -> CommandStart +start' locs = do + (l, cleanup) <- inRepo $ LsFiles.modifiedOthers locs + getstatus <- ifM isDirect + ( return statusDirect + , return $ Just <$$> statusIndirect + ) + forM_ l $ \f -> maybe noop (showFileStatus f) =<< getstatus f + void $ liftIO cleanup + stop + +data Status + = NewFile + | DeletedFile + | ModifiedFile + +showStatus :: Status -> String +showStatus NewFile = "?" +showStatus DeletedFile = "D" +showStatus ModifiedFile = "M" + +showFileStatus :: FilePath -> Status -> Annex () +showFileStatus f s = unlessM (showFullJSON [("status", ss), ("file", f)]) $ + liftIO $ putStrLn $ ss ++ " " ++ f + where + ss = showStatus s + +statusDirect :: FilePath -> Annex (Maybe Status) +statusDirect f = checkstatus =<< liftIO (catchMaybeIO $ getFileStatus f) + where + checkstatus Nothing = return $ Just DeletedFile + checkstatus (Just s) + -- Git thinks that present direct mode files modifed, + -- so have to check. + | not (isSymbolicLink s) = checkkey s =<< catKeyFile f + | otherwise = Just <$> checkNew f + + checkkey s (Just k) = ifM (sameFileStatus k s) + ( return Nothing + , return $ Just ModifiedFile + ) + checkkey _ Nothing = Just <$> checkNew f + +statusIndirect :: FilePath -> Annex Status +statusIndirect f = ifM (liftIO $ isJust <$> catchMaybeIO (getFileStatus f)) + ( checkNew f + , return DeletedFile + ) + where + +checkNew :: FilePath -> Annex Status +checkNew f = ifM (isJust <$> catObjectDetails (Git.Ref.fileRef f)) + ( return ModifiedFile + , return NewFile + ) diff --git a/Command/Sync.hs b/Command/Sync.hs new file mode 100644 index 000000000..50c6fbe69 --- /dev/null +++ b/Command/Sync.hs @@ -0,0 +1,383 @@ +{- git-annex command + - + - Copyright 2011 Joachim Breitner + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Sync where + +import Common.Annex +import Command +import qualified Annex +import qualified Annex.Branch +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Direct +import Annex.Hook +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Git.Branch +import qualified Git.Ref +import qualified Git +import qualified Remote.Git +import Config +import Annex.Wanted +import Annex.Content +import Command.Get (getKeyFile') +import qualified Command.Move +import Logs.Location +import Annex.Drop +import Annex.UUID +import Annex.AutoMerge +import Annex.Ssh + +import Control.Concurrent.MVar + +def :: [Command] +def = [withOptions syncOptions $ + command "sync" (paramOptional (paramRepeating paramRemote)) + seek SectionCommon "synchronize local repository with remotes"] + +syncOptions :: [Option] +syncOptions = [ contentOption ] + +contentOption :: Option +contentOption = flagOption [] "content" "also transfer file contents" + +seek :: CommandSeek +seek rs = do + prepMerge + + -- There may not be a branch checked out until after the commit, + -- or perhaps after it gets merged from the remote. + -- So only look it up once it's needed, and if once there is a + -- branch, cache it. + mvar <- liftIO newEmptyMVar + let getbranch = ifM (liftIO $ isEmptyMVar mvar) + ( do + branch <- inRepo Git.Branch.current + when (isJust branch) $ + liftIO $ putMVar mvar branch + return branch + , liftIO $ readMVar mvar + ) + let withbranch a = a =<< getbranch + + remotes <- syncRemotes rs + let gitremotes = filter Remote.gitSyncableRemote remotes + let dataremotes = filter (not . remoteAnnexIgnore . Remote.gitconfig) remotes + + -- Syncing involves many actions, any of which can independently + -- fail, without preventing the others from running. + seekActions $ return $ concat + [ [ commit ] + , [ withbranch mergeLocal ] + , map (withbranch . pullRemote) gitremotes + , [ mergeAnnex ] + ] + whenM (Annex.getFlag $ optionName contentOption) $ + whenM (seekSyncContent dataremotes) $ + -- Transferring content can take a while, + -- and other changes can be pushed to the git-annex + -- branch on the remotes in the meantime, so pull + -- and merge again to avoid our push overwriting + -- those changes. + seekActions $ return $ concat + [ map (withbranch . pullRemote) gitremotes + , [ commitAnnex, mergeAnnex ] + ] + seekActions $ return $ concat + [ [ withbranch pushLocal ] + , map (withbranch . pushRemote) gitremotes + ] + +{- Merging may delete the current directory, so go to the top + - of the repo. This also means that sync always acts on all files in the + - repository, not just on a subdirectory. -} +prepMerge :: Annex () +prepMerge = liftIO . setCurrentDirectory =<< fromRepo Git.repoPath + +syncBranch :: Git.Ref -> Git.Ref +syncBranch = Git.Ref.under "refs/heads/synced" . fromDirectBranch + +remoteBranch :: Remote -> Git.Ref -> Git.Ref +remoteBranch remote = Git.Ref.underBase $ "refs/remotes/" ++ Remote.name remote + +syncRemotes :: [String] -> Annex [Remote] +syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted ) + where + pickfast = (++) <$> listed <*> (filterM good =<< fastest <$> available) + wanted + | null rs = filterM good =<< concat . Remote.byCost <$> available + | otherwise = listed + listed = catMaybes <$> mapM (Remote.byName . Just) rs + available = filter (remoteAnnexSync . Remote.gitconfig) + . filter (not . Remote.isXMPPRemote) + <$> Remote.remoteList + good r + | Remote.gitSyncableRemote r = Remote.Git.repoAvail $ Remote.repo r + | otherwise = return True + fastest = fromMaybe [] . headMaybe . Remote.byCost + +commit :: CommandStart +commit = next $ next $ ifM isDirect + ( do + showStart "commit" "" + void stageDirect + void preCommitDirect + commitStaged Git.Branch.ManualCommit commitmessage + , do + showStart "commit" "" + Annex.Branch.commit "update" + inRepo $ Git.Branch.commitQuiet Git.Branch.ManualCommit + [ Param "-a" + , Param "-m" + , Param commitmessage + ] + return True + ) + where + commitmessage = "git-annex automatic sync" + +commitStaged :: Git.Branch.CommitMode -> String -> Annex Bool +commitStaged commitmode commitmessage = go =<< inRepo Git.Branch.currentUnsafe + where + go Nothing = return False + go (Just branch) = do + runAnnexHook preCommitAnnexHook + parent <- inRepo $ Git.Ref.sha branch + void $ inRepo $ Git.Branch.commit commitmode False commitmessage branch + (maybeToList parent) + return True + +mergeLocal :: Maybe Git.Ref -> CommandStart +mergeLocal Nothing = stop +mergeLocal (Just branch) = go =<< needmerge + where + syncbranch = syncBranch branch + needmerge = ifM isBareRepo + ( return False + , do + unlessM (inRepo $ Git.Ref.exists syncbranch) $ + inRepo $ updateBranch syncbranch + inRepo $ Git.Branch.changed branch syncbranch + ) + go False = stop + go True = do + showStart "merge" $ Git.Ref.describe syncbranch + next $ next $ autoMergeFrom syncbranch (Just branch) Git.Branch.ManualCommit + +pushLocal :: Maybe Git.Ref -> CommandStart +pushLocal b = do + updateSyncBranch b + stop + +updateSyncBranch :: Maybe Git.Ref -> Annex () +updateSyncBranch Nothing = noop +updateSyncBranch (Just branch) = do + -- Update the sync branch to match the new state of the branch + inRepo $ updateBranch $ syncBranch branch + -- In direct mode, we're operating on some special direct mode + -- branch, rather than the intended branch, so update the indended + -- branch. + whenM isDirect $ + inRepo $ updateBranch $ fromDirectBranch branch + +updateBranch :: Git.Ref -> Git.Repo -> IO () +updateBranch syncbranch g = + unlessM go $ error $ "failed to update " ++ Git.fromRef syncbranch + where + go = Git.Command.runBool + [ Param "branch" + , Param "-f" + , Param $ Git.fromRef $ Git.Ref.base syncbranch + ] g + +pullRemote :: Remote -> Maybe Git.Ref -> CommandStart +pullRemote remote branch = do + showStart "pull" (Remote.name remote) + next $ do + showOutput + stopUnless fetch $ + next $ mergeRemote remote branch + where + fetch = inRepoWithSshCachingTo (Remote.repo remote) $ Git.Command.runBool + [Param "fetch", Param $ Remote.name remote] + +{- The remote probably has both a master and a synced/master branch. + - Which to merge from? Well, the master has whatever latest changes + - were committed (or pushed changes, if this is a bare remote), + - while the synced/master may have changes that some + - other remote synced to this remote. So, merge them both. -} +mergeRemote :: Remote -> Maybe Git.Ref -> CommandCleanup +mergeRemote remote b = case b of + Nothing -> do + branch <- inRepo Git.Branch.currentUnsafe + and <$> mapM (merge Nothing) (branchlist branch) + Just thisbranch -> + and <$> (mapM (merge (Just thisbranch)) =<< tomerge (branchlist b)) + where + merge thisbranch br = autoMergeFrom (remoteBranch remote br) thisbranch Git.Branch.ManualCommit + tomerge = filterM (changed remote) + branchlist Nothing = [] + branchlist (Just branch) = [branch, syncBranch branch] + +pushRemote :: Remote -> Maybe Git.Ref -> CommandStart +pushRemote _remote Nothing = stop +pushRemote remote (Just branch) = go =<< needpush + where + needpush + | remoteAnnexReadOnly (Remote.gitconfig remote) = return False + | otherwise = anyM (newer remote) [syncBranch branch, Annex.Branch.name] + go False = stop + go True = do + showStart "push" (Remote.name remote) + next $ next $ do + showOutput + ok <- inRepoWithSshCachingTo (Remote.repo remote) $ + pushBranch remote branch + unless ok $ do + warning $ unwords [ "Pushing to " ++ Remote.name remote ++ " failed." ] + showLongNote "(non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config)" + return ok + +{- Pushes a regular branch like master to a remote. Also pushes the git-annex + - branch. + - + - If the remote is a bare git repository, it's best to push the regular + - branch directly to it, so that cloning/pulling will get it. + - On the other hand, if it's not bare, pushing to the checked out branch + - will fail, and this is why we push to its syncBranch. + - + - Git offers no way to tell if a remote is bare or not, so both methods + - are tried. + - + - The direct push is likely to spew an ugly error message, so stderr is + - elided. Since git progress display goes to stderr too, the sync push + - is done first, and actually sends the data. Then the direct push is + - tried, with stderr discarded, to update the branch ref on the remote. + - + - The sync push forces the update of the remote synced/git-annex branch. + - This is necessary if a transition has rewritten the git-annex branch. + - Normally any changes to the git-annex branch get pulled and merged before + - this push, so this forcing is unlikely to overwrite new data pushed + - in from another repository that is also syncing. + - + - But overwriting of data on synced/git-annex can happen, in a race. + - The only difference caused by using a forced push in that case is that + - the last repository to push wins the race, rather than the first to push. + - + - The sync push will fail to overwrite if receive.denyNonFastforwards is + - set on the remote. + -} +pushBranch :: Remote -> Git.Ref -> Git.Repo -> IO Bool +pushBranch remote branch g = tryIO (directpush g) `after` syncpush g + where + syncpush = Git.Command.runBool $ pushparams + [ Git.Branch.forcePush $ refspec Annex.Branch.name + , refspec branch + ] + directpush = Git.Command.runQuiet $ pushparams + [Git.fromRef $ Git.Ref.base $ fromDirectBranch branch] + pushparams branches = + [ Param "push" + , Param $ Remote.name remote + ] ++ map Param branches + refspec b = concat + [ Git.fromRef $ Git.Ref.base b + , ":" + , Git.fromRef $ Git.Ref.base $ syncBranch b + ] + +commitAnnex :: CommandStart +commitAnnex = do + Annex.Branch.commit "update" + stop + +mergeAnnex :: CommandStart +mergeAnnex = do + void Annex.Branch.forceUpdate + stop + +changed :: Remote -> Git.Ref -> Annex Bool +changed remote b = do + let r = remoteBranch remote b + ifM (inRepo $ Git.Ref.exists r) + ( inRepo $ Git.Branch.changed b r + , return False + ) + +newer :: Remote -> Git.Ref -> Annex Bool +newer remote b = do + let r = remoteBranch remote b + ifM (inRepo $ Git.Ref.exists r) + ( inRepo $ Git.Branch.changed r b + , return True + ) + +{- If it's preferred content, and we don't have it, get it from one of the + - listed remotes (preferring the cheaper earlier ones). + - + - Send it to each remote that doesn't have it, and for which it's + - preferred content. + - + - Drop it locally if it's not preferred content (honoring numcopies). + - + - Drop it from each remote that has it, where it's not preferred content + - (honoring numcopies). + - + - If any file movements were generated, returns true. + -} +seekSyncContent :: [Remote] -> Annex Bool +seekSyncContent rs = do + mvar <- liftIO newEmptyMVar + mapM_ (go mvar) =<< seekHelper LsFiles.inRepo [] + liftIO $ not <$> isEmptyMVar mvar + where + go mvar f = ifAnnexed f + (\v -> void (liftIO (tryPutMVar mvar ())) >> syncFile rs f v) + noop + +syncFile :: [Remote] -> FilePath -> Key -> Annex () +syncFile rs f k = do + locs <- loggedLocations k + let (have, lack) = partition (\r -> Remote.uuid r `elem` locs) rs + + got <- anyM id =<< handleget have + putrs <- catMaybes . snd . unzip <$> (sequence =<< handleput lack) + + u <- getUUID + let locs' = concat [[u | got], putrs, locs] + + -- Using callCommandAction rather than commandAction for drops, + -- because a failure to drop does not mean the sync failed. + handleDropsFrom locs' rs "unwanted" True k (Just f) + Nothing callCommandAction + where + wantget have = allM id + [ pure (not $ null have) + , not <$> inAnnex k + , wantGet True (Just k) (Just f) + ] + handleget have = ifM (wantget have) + ( return [ get have ] + , return [] + ) + get have = commandAction $ do + showStart "get" f + next $ next $ getViaTmp k $ \dest -> getKeyFile' k (Just f) dest have + + wantput r + | Remote.readonly r || remoteAnnexReadOnly (Remote.gitconfig r) = return False + | otherwise = wantSend True (Just k) (Just f) (Remote.uuid r) + handleput lack = ifM (inAnnex k) + ( map put <$> filterM wantput lack + , return [] + ) + put dest = do + ok <- commandAction $ do + showStart "copy" f + Command.Move.toStart' dest False (Just f) k + return (ok, if ok then Just (Remote.uuid dest) else Nothing) diff --git a/Command/Test.hs b/Command/Test.hs new file mode 100644 index 000000000..ee7220142 --- /dev/null +++ b/Command/Test.hs @@ -0,0 +1,37 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Test where + +import Common +import Command +import Messages + +def :: [Command] +def = [ noRepo startIO $ dontCheck repoExists $ + command "test" paramNothing seek SectionPlumbing + "run built-in test suite"] + +seek :: CommandSeek +seek = withWords start + +{- We don't actually run the test suite here because of a dependency loop. + - The main program notices when the command is test and runs it; this + - function is never run if that works. + - + - However, if git-annex is built without the test suite, just print a + - warning, and do not exit nonzero. This is so git-annex test can be run + - in debian/rules despite some architectures not being able to build the + - test suite. + -} +start :: [String] -> CommandStart +start ps = do + liftIO $ startIO ps + stop + +startIO :: CmdParams -> IO () +startIO _ = warningIO "git-annex was built without its test suite; not testing" diff --git a/Command/TransferInfo.hs b/Command/TransferInfo.hs new file mode 100644 index 000000000..8ab577a81 --- /dev/null +++ b/Command/TransferInfo.hs @@ -0,0 +1,64 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.TransferInfo where + +import Common.Annex +import Command +import Annex.Content +import Logs.Transfer +import Types.Key +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Utility.Metered + +def :: [Command] +def = [noCommit $ command "transferinfo" paramKey seek SectionPlumbing + "updates sender on number of bytes of content received"] + +seek :: CommandSeek +seek = withWords start + +{- Security: + - + - The transfer info file contains the user-supplied key, but + - the built-in guards prevent slashes in it from showing up in the filename. + - It also contains the UUID of the remote. But slashes are also filtered + - out of that when generating the filename. + - + - Checks that the key being transferred is inAnnex, to prevent + - malicious spamming of bogus keys. Does not check that a transfer + - of the key is actually in progress, because this could be started + - concurrently with sendkey, and win the race. + -} +start :: [String] -> CommandStart +start (k:[]) = do + case file2key k of + Nothing -> error "bad key" + (Just key) -> whenM (inAnnex key) $ do + file <- Fields.getField Fields.associatedFile + u <- maybe (error "missing remoteuuid") toUUID + <$> Fields.getField Fields.remoteUUID + let t = Transfer + { transferDirection = Upload + , transferUUID = u + , transferKey = key + } + info <- liftIO $ startTransferInfo file + (update, tfile, _) <- mkProgressUpdater t info + liftIO $ mapM_ void + [ tryIO $ forever $ do + bytes <- readUpdate + maybe (error "transferinfo protocol error") + (update . toBytesProcessed) bytes + , tryIO $ removeFile tfile + , exitSuccess + ] + stop +start _ = error "wrong number of parameters" + +readUpdate :: IO (Maybe Integer) +readUpdate = readish <$> getLine diff --git a/Command/TransferKey.hs b/Command/TransferKey.hs new file mode 100644 index 000000000..13bfd825e --- /dev/null +++ b/Command/TransferKey.hs @@ -0,0 +1,57 @@ +{- git-annex plumbing command (for use by old assistant, and users) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.TransferKey where + +import Common.Annex +import Command +import Annex.Content +import Logs.Location +import Annex.Transfer +import qualified Remote +import Types.Remote + +def :: [Command] +def = [withOptions transferKeyOptions $ + noCommit $ command "transferkey" paramKey seek SectionPlumbing + "transfers a key from or to a remote"] + +transferKeyOptions :: [Option] +transferKeyOptions = fileOption : fromToOptions + +fileOption :: Option +fileOption = fieldOption [] "file" paramFile "the associated file" + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + file <- getOptionField fileOption return + withKeys (start to from file) ps + +start :: Maybe Remote -> Maybe Remote -> AssociatedFile -> Key -> CommandStart +start to from file key = + case (from, to) of + (Nothing, Just dest) -> next $ toPerform dest key file + (Just src, Nothing) -> next $ fromPerform src key file + _ -> error "specify either --from or --to" + +toPerform :: Remote -> Key -> AssociatedFile -> CommandPerform +toPerform remote key file = go Upload file $ + upload (uuid remote) key file forwardRetry $ \p -> do + ok <- Remote.storeKey remote key file p + when ok $ + Remote.logStatus remote key InfoPresent + return ok + +fromPerform :: Remote -> Key -> AssociatedFile -> CommandPerform +fromPerform remote key file = go Upload file $ + download (uuid remote) key file forwardRetry $ \p -> + getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p + +go :: Direction -> AssociatedFile -> (NotifyWitness -> Annex Bool) -> CommandPerform +go direction file a = notifyTransfer direction file a >>= liftIO . exitBool diff --git a/Command/TransferKeys.hs b/Command/TransferKeys.hs new file mode 100644 index 000000000..fba0e6593 --- /dev/null +++ b/Command/TransferKeys.hs @@ -0,0 +1,128 @@ +{- git-annex command, used internally by assistant + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} + +module Command.TransferKeys where + +import Common.Annex +import Command +import Annex.Content +import Logs.Location +import Annex.Transfer +import qualified Remote +import Types.Key +import Utility.SimpleProtocol (ioHandles) +import Git.Types (RemoteName) + +data TransferRequest = TransferRequest Direction Remote Key AssociatedFile + +def :: [Command] +def = [command "transferkeys" paramNothing seek + SectionPlumbing "transfers keys"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + (readh, writeh) <- liftIO ioHandles + runRequests readh writeh runner + stop + where + runner (TransferRequest direction remote key file) + | direction == Upload = notifyTransfer direction file $ + upload (Remote.uuid remote) key file forwardRetry $ \p -> do + ok <- Remote.storeKey remote key file p + when ok $ + Remote.logStatus remote key InfoPresent + return ok + | otherwise = notifyTransfer direction file $ + download (Remote.uuid remote) key file forwardRetry $ \p -> + getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p + +runRequests + :: Handle + -> Handle + -> (TransferRequest -> Annex Bool) + -> Annex () +runRequests readh writeh a = do + liftIO $ do + hSetBuffering readh NoBuffering + fileEncoding readh + fileEncoding writeh + go =<< readrequests + where + go (d:rn:k:f:rest) = do + case (deserialize d, deserialize rn, deserialize k, deserialize f) of + (Just direction, Just remotename, Just key, Just file) -> do + mremote <- Remote.byName' remotename + case mremote of + Left _ -> sendresult False + Right remote -> sendresult =<< a + (TransferRequest direction remote key file) + _ -> sendresult False + go rest + go [] = noop + go [""] = noop + go v = error $ "transferkeys protocol error: " ++ show v + + readrequests = liftIO $ split fieldSep <$> hGetContents readh + sendresult b = liftIO $ do + hPutStrLn writeh $ serialize b + hFlush writeh + +sendRequest :: Transfer -> TransferInfo -> Handle -> IO () +sendRequest t info h = do + hPutStr h $ intercalate fieldSep + [ serialize (transferDirection t) + , maybe (serialize (fromUUID (transferUUID t))) + (serialize . Remote.name) + (transferRemote info) + , serialize (transferKey t) + , serialize (associatedFile info) + , "" -- adds a trailing null + ] + hFlush h + +readResponse :: Handle -> IO Bool +readResponse h = fromMaybe False . deserialize <$> hGetLine h + +fieldSep :: String +fieldSep = "\0" + +class TCSerialized a where + serialize :: a -> String + deserialize :: String -> Maybe a + +instance TCSerialized Bool where + serialize True = "1" + serialize False = "0" + deserialize "1" = Just True + deserialize "0" = Just False + deserialize _ = Nothing + +instance TCSerialized Direction where + serialize Upload = "u" + serialize Download = "d" + deserialize "u" = Just Upload + deserialize "d" = Just Download + deserialize _ = Nothing + +instance TCSerialized AssociatedFile where + serialize (Just f) = f + serialize Nothing = "" + deserialize "" = Just Nothing + deserialize f = Just $ Just f + +instance TCSerialized RemoteName where + serialize n = n + deserialize n = Just n + +instance TCSerialized Key where + serialize = key2file + deserialize = file2key diff --git a/Command/Trust.hs b/Command/Trust.hs new file mode 100644 index 000000000..c0f013699 --- /dev/null +++ b/Command/Trust.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2010, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Trust where + +import Common.Annex +import Command +import qualified Remote +import Types.TrustLevel +import Logs.Trust +import Logs.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "trust" (paramRepeating paramRemote) seek + SectionSetup "trust a repository"] + +seek :: CommandSeek +seek = trustCommand "trust" Trusted + +trustCommand :: String -> TrustLevel -> CommandSeek +trustCommand cmd level = withWords start + where + start ws = do + let name = unwords ws + showStart cmd name + u <- Remote.nameToUUID name + next $ perform u + perform uuid = do + trustSet uuid level + when (level == DeadTrusted) $ + groupSet uuid S.empty + l <- lookupTrust uuid + when (l /= level) $ + warning $ "This remote's trust level is locally overridden to " ++ showTrustLevel l ++ " via git config." + next $ return True diff --git a/Command/Unannex.hs b/Command/Unannex.hs new file mode 100644 index 000000000..9cb88564c --- /dev/null +++ b/Command/Unannex.hs @@ -0,0 +1,120 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Unannex where + +import Common.Annex +import Command +import Config +import qualified Annex +import Annex.Content +import Annex.Content.Direct +import qualified Git.Command +import qualified Git.Branch +import qualified Git.Ref +import qualified Git.DiffTree as DiffTree +import Utility.CopyFile +import Command.PreCommit (lockPreCommitHook) + +def :: [Command] +def = [command "unannex" paramPaths seek SectionUtility + "undo accidential add command"] + +seek :: CommandSeek +seek = wrapUnannex . (withFilesInGit $ whenAnnexed start) + +wrapUnannex :: Annex a -> Annex a +wrapUnannex a = ifM isDirect + ( a + {- Run with the pre-commit hook disabled, to avoid confusing + - behavior if an unannexed file is added back to git as + - a normal, non-annexed file and then committed. + - Otherwise, the pre-commit hook would think that the file + - has been unlocked and needs to be re-annexed. + - + - At the end, make a commit removing the unannexed files. + -} + , ifM cleanindex + ( lockPreCommitHook $ commit `after` a + , error "Cannot proceed with uncommitted changes staged in the index. Recommend you: git commit" + ) + ) + where + commit = inRepo $ Git.Branch.commitCommand Git.Branch.ManualCommit + [ Param "-q" + , Param "--allow-empty" + , Param "--no-verify" + , Param "-m", Param "content removed from git annex" + ] + cleanindex = do + (diff, cleanup) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + if null diff + then void (liftIO cleanup) >> return True + else void (liftIO cleanup) >> return False + +start :: FilePath -> Key -> CommandStart +start file key = stopUnless (inAnnex key) $ do + showStart "unannex" file + next $ ifM isDirect + ( performDirect file key + , performIndirect file key) + +performIndirect :: FilePath -> Key -> CommandPerform +performIndirect file key = do + liftIO $ removeFile file + inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file] + next $ cleanupIndirect file key + +cleanupIndirect :: FilePath -> Key -> CommandCleanup +cleanupIndirect file key = do + src <- calcRepo $ gitAnnexLocation key + ifM (Annex.getState Annex.fast) + ( do + -- Only make a hard link if the annexed file does not + -- already have other hard links pointing at it. + -- This avoids unannexing (and uninit) ending up + -- hard linking files together, which would be + -- surprising. + s <- liftIO $ getFileStatus src + if linkCount s > 1 + then copyfrom src + else hardlinkfrom src + , copyfrom src + ) + where + copyfrom src = + thawContent file `after` liftIO (copyFileExternal src file) + hardlinkfrom src = +#ifndef mingw32_HOST_OS + -- creating a hard link could fall; fall back to copying + ifM (liftIO $ catchBoolIO $ createLink src file >> return True) + ( return True + , copyfrom src + ) +#else + copyfrom src +#endif + +performDirect :: FilePath -> Key -> CommandPerform +performDirect file key = do + -- --force is needed when the file is not committed + inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file] + next $ cleanupDirect file key + +{- The direct mode file is not touched during unannex, so the content + - is already where it needs to be, so this does not need to do anything + - except remove it from the associated file map (which also updates + - the location log if this was the last copy), and, if this was the last + - associated file, remove the inode cache. -} +cleanupDirect :: FilePath -> Key -> CommandCleanup +cleanupDirect file key = do + fs <- removeAssociatedFile key file + when (null fs) $ + removeInodeCache key + return True diff --git a/Command/Ungroup.hs b/Command/Ungroup.hs new file mode 100644 index 000000000..a88e3f7c8 --- /dev/null +++ b/Command/Ungroup.hs @@ -0,0 +1,35 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Ungroup where + +import Common.Annex +import Command +import qualified Remote +import Logs.Group +import Types.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "ungroup" (paramPair paramRemote paramDesc) seek + SectionSetup "remove a repository from a group"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:g:[]) = do + showStart "ungroup" name + u <- Remote.nameToUUID name + next $ perform u g +start _ = error "Specify a repository and a group." + +perform :: UUID -> Group -> CommandPerform +perform uuid g = do + groupChange uuid (S.delete g) + next $ return True diff --git a/Command/Uninit.hs b/Command/Uninit.hs new file mode 100644 index 000000000..4433de6d0 --- /dev/null +++ b/Command/Uninit.hs @@ -0,0 +1,112 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Uninit where + +import Common.Annex +import qualified Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Command.Unannex +import qualified Annex.Branch +import Annex.Content +import Annex.Init +import Utility.FileMode + +import System.IO.HVFS +import System.IO.HVFS.Utils + +def :: [Command] +def = [addCheck check $ command "uninit" paramPaths seek + SectionUtility "de-initialize git-annex and clean out repository"] + +check :: Annex () +check = do + b <- current_branch + when (b == Annex.Branch.name) $ error $ + "cannot uninit when the " ++ Git.fromRef b ++ " branch is checked out" + top <- fromRepo Git.repoPath + currdir <- liftIO getCurrentDirectory + whenM ((/=) <$> liftIO (absPath top) <*> liftIO (absPath currdir)) $ + error "can only run uninit from the top of the git repository" + where + current_branch = Git.Ref . Prelude.head . lines <$> revhead + revhead = inRepo $ Git.Command.pipeReadStrict + [Params "rev-parse --abbrev-ref HEAD"] + +seek :: CommandSeek +seek ps = do + withFilesNotInGit False (whenAnnexed startCheckIncomplete) ps + Annex.changeState $ \s -> s { Annex.fast = True } + withFilesInGit (whenAnnexed Command.Unannex.start) ps + finish + +{- git annex symlinks that are not checked into git could be left by an + - interrupted add. -} +startCheckIncomplete :: FilePath -> Key -> CommandStart +startCheckIncomplete file _ = error $ unlines + [ file ++ " points to annexed content, but is not checked into git." + , "Perhaps this was left behind by an interrupted git annex add?" + , "Not continuing with uninit; either delete or git annex add the file and retry." + ] + +finish :: Annex () +finish = do + annexdir <- fromRepo gitAnnexDir + annexobjectdir <- fromRepo gitAnnexObjectDir + leftovers <- removeUnannexed =<< getKeysPresent InAnnex + liftIO $ prepareRemoveAnnexDir annexdir + if null leftovers + then liftIO $ removeDirectoryRecursive annexdir + else error $ unlines + [ "Not fully uninitialized" + , "Some annexed data is still left in " ++ annexobjectdir + , "This may include deleted files, or old versions of modified files." + , "" + , "If you don't care about preserving the data, just delete the" + , "directory." + , "" + , "Or, you can move it to another location, in case it turns out" + , "something in there is important." + , "" + , "Or, you can run `git annex unused` followed by `git annex dropunused`" + , "to remove data that is not used by any tag or branch, which might" + , "take care of all the data." + , "" + , "Then run `git annex uninit` again to finish." + ] + uninitialize + -- avoid normal shutdown + saveState False + inRepo $ Git.Command.run + [Param "branch", Param "-D", Param $ Git.fromRef Annex.Branch.name] + liftIO exitSuccess + +{- Turn on write bits in all remaining files in the annex directory, in + - preparation for removal. -} +prepareRemoveAnnexDir :: FilePath -> IO () +prepareRemoveAnnexDir annexdir = + recurseDir SystemFS annexdir >>= mapM_ (void . tryIO . allowWrite) + +{- Keys that were moved out of the annex have a hard link still in the + - annex, with > 1 link count, and those can be removed. + - + - Returns keys that cannot be removed. -} +removeUnannexed :: [Key] -> Annex [Key] +removeUnannexed = go [] + where + go c [] = return c + go c (k:ks) = ifM (inAnnexCheck k $ liftIO . enoughlinks) + ( do + removeAnnex k + go c ks + , go (k:c) ks + ) + enoughlinks f = catchBoolIO $ do + s <- getFileStatus f + return $ linkCount s > 1 diff --git a/Command/Unlock.hs b/Command/Unlock.hs new file mode 100644 index 000000000..0070410a6 --- /dev/null +++ b/Command/Unlock.hs @@ -0,0 +1,50 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Unlock where + +import Common.Annex +import Command +import Annex.Content +import Utility.CopyFile + +def :: [Command] +def = + [ c "unlock" "unlock files for modification" + , c "edit" "same as unlock" + ] + where + c n = notDirect . command n paramPaths seek SectionCommon + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +{- The unlock subcommand replaces the symlink with a copy of the file's + - content. -} +start :: FilePath -> Key -> CommandStart +start file key = do + showStart "unlock" file + next $ perform file key + +perform :: FilePath -> Key -> CommandPerform +perform dest key = do + unlessM (inAnnex key) $ error "content not present" + unlessM (checkDiskSpace Nothing key 0) $ error "cannot unlock" + + src <- calcRepo $ gitAnnexLocation key + tmpdest <- fromRepo $ gitAnnexTmpObjectLocation key + liftIO $ createDirectoryIfMissing True (parentDir tmpdest) + showAction "copying" + ifM (liftIO $ copyFileExternal src tmpdest) + ( do + liftIO $ do + removeFile dest + moveFile tmpdest dest + thawContent dest + next $ return True + , error "copy failed!" + ) diff --git a/Command/Untrust.hs b/Command/Untrust.hs new file mode 100644 index 000000000..4c1035dcd --- /dev/null +++ b/Command/Untrust.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Untrust where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "untrust" (paramRepeating paramRemote) seek + SectionSetup "do not trust a repository"] + +seek :: CommandSeek +seek = trustCommand "untrust" UnTrusted diff --git a/Command/Unused.hs b/Command/Unused.hs new file mode 100644 index 000000000..bf98e53bc --- /dev/null +++ b/Command/Unused.hs @@ -0,0 +1,371 @@ +{- git-annex command + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Command.Unused where + +import qualified Data.Set as S +import Control.Monad.ST +import qualified Data.Map as M + +import Common.Annex +import Command +import Logs.Unused +import Annex.Content +import Logs.Location +import Logs.Transfer +import qualified Annex +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Branch +import qualified Git.LsFiles as LsFiles +import qualified Git.DiffTree as DiffTree +import qualified Backend +import qualified Remote +import qualified Annex.Branch +import Annex.CatFile +import Types.Key +import Git.FilePath +import Logs.View (is_branchView) +import Utility.Bloom + +def :: [Command] +def = [withOptions [unusedFromOption] $ command "unused" paramNothing seek + SectionMaintenance "look for unused file content"] + +unusedFromOption :: Option +unusedFromOption = fieldOption ['f'] "from" paramRemote "remote to check for unused content" + +seek :: CommandSeek +seek = withNothing start + +{- Finds unused content in the annex. -} +start :: CommandStart +start = do + from <- Annex.getField $ optionName unusedFromOption + let (name, action) = case from of + Nothing -> (".", checkUnused) + Just "." -> (".", checkUnused) + Just "here" -> (".", checkUnused) + Just n -> (n, checkRemoteUnused n) + showStart "unused" name + next action + +checkUnused :: CommandPerform +checkUnused = chain 0 + [ check "" unusedMsg $ findunused =<< Annex.getState Annex.fast + , check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir False + , check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpObjectDir True + ] + where + findunused True = do + showNote "fast mode enabled; only finding stale files" + return [] + findunused False = do + showAction "checking for unused data" + -- InAnnex, not InRepository because if a direct mode + -- file exists, it is obviously not unused. + excludeReferenced =<< getKeysPresent InAnnex + chain _ [] = next $ return True + chain v (a:as) = do + v' <- a v + chain v' as + +checkRemoteUnused :: String -> CommandPerform +checkRemoteUnused name = go =<< fromJust <$> Remote.byNameWithUUID (Just name) + where + go r = do + showAction "checking for unused data" + _ <- check "" (remoteUnusedMsg r) (remoteunused r) 0 + next $ return True + remoteunused r = excludeReferenced <=< loggedKeysFor $ Remote.uuid r + +check :: FilePath -> ([(Int, Key)] -> String) -> Annex [Key] -> Int -> Annex Int +check file msg a c = do + l <- a + let unusedlist = number c l + unless (null l) $ showLongNote $ msg unusedlist + updateUnusedLog file $ M.fromList unusedlist + return $ c + length l + +number :: Int -> [a] -> [(Int, a)] +number _ [] = [] +number n (x:xs) = (n+1, x) : number (n+1) xs + +table :: [(Int, Key)] -> [String] +table l = " NUMBER KEY" : map cols l + where + cols (n,k) = " " ++ pad 6 (show n) ++ " " ++ key2file k + pad n s = s ++ replicate (n - length s) ' ' + +staleTmpMsg :: [(Int, Key)] -> String +staleTmpMsg t = unlines $ + ["Some partially transferred data exists in temporary files:"] + ++ table t ++ [dropMsg Nothing] + +staleBadMsg :: [(Int, Key)] -> String +staleBadMsg t = unlines $ + ["Some corrupted files have been preserved by fsck, just in case:"] + ++ table t ++ [dropMsg Nothing] + +unusedMsg :: [(Int, Key)] -> String +unusedMsg u = unusedMsg' u + ["Some annexed data is no longer used by any files:"] + [dropMsg Nothing] +unusedMsg' :: [(Int, Key)] -> [String] -> [String] -> String +unusedMsg' u header trailer = unlines $ + header ++ + table u ++ + ["(To see where data was previously used, try: git log --stat -S'KEY')"] ++ + trailer + +remoteUnusedMsg :: Remote -> [(Int, Key)] -> String +remoteUnusedMsg r u = unusedMsg' u + ["Some annexed data on " ++ name ++ " is not used by any files:"] + [dropMsg $ Just r] + where + name = Remote.name r + +dropMsg :: Maybe Remote -> String +dropMsg Nothing = dropMsg' "" +dropMsg (Just r) = dropMsg' $ " --from " ++ Remote.name r +dropMsg' :: String -> String +dropMsg' s = "\nTo remove unwanted data: git-annex dropunused" ++ s ++ " NUMBER\n" + +{- Finds keys in the list that are not referenced in the git repository. + - + - Strategy: + - + - * Build a bloom filter of all keys referenced by symlinks. This + - is the fastest one to build and will filter out most keys. + - * If keys remain, build a second bloom filter of keys referenced by + - all branches. + - * The list is streamed through these bloom filters lazily, so both will + - exist at the same time. This means that twice the memory is used, + - but they're relatively small, so the added complexity of using a + - mutable bloom filter does not seem worthwhile. + - * Generating the second bloom filter can take quite a while, since + - it needs enumerating all keys in all git branches. But, the common + - case, if the second filter is needed, is for some keys to be globally + - unused, and in that case, no short-circuit is possible. + - Short-circuiting if the first filter filters all the keys handles the + - other common case. + -} +excludeReferenced :: [Key] -> Annex [Key] +excludeReferenced ks = runfilter firstlevel ks >>= runfilter secondlevel + where + runfilter _ [] = return [] -- optimisation + runfilter a l = bloomFilter show l <$> genBloomFilter show a + firstlevel = withKeysReferencedM + secondlevel = withKeysReferencedInGit + +{- Finds items in the first, smaller list, that are not + - present in the second, larger list. + - + - Constructing a single set, of the list that tends to be + - smaller, appears more efficient in both memory and CPU + - than constructing and taking the S.difference of two sets. -} +exclude :: Ord a => [a] -> [a] -> [a] +exclude [] _ = [] -- optimisation +exclude smaller larger = S.toList $ remove larger $ S.fromList smaller + where + remove a b = foldl (flip S.delete) b a + +{- A bloom filter capable of holding half a million keys with a + - false positive rate of 1 in 1000 uses around 8 mb of memory, + - so will easily fit on even my lowest memory systems. + -} +bloomCapacity :: Annex Int +bloomCapacity = fromMaybe 500000 . annexBloomCapacity <$> Annex.getGitConfig +bloomAccuracy :: Annex Int +bloomAccuracy = fromMaybe 1000 . annexBloomAccuracy <$> Annex.getGitConfig +bloomBitsHashes :: Annex (Int, Int) +bloomBitsHashes = do + capacity <- bloomCapacity + accuracy <- bloomAccuracy + return $ suggestSizing capacity (1/ fromIntegral accuracy) + +{- Creates a bloom filter, and runs an action, such as withKeysReferenced, + - to populate it. + - + - The action is passed a callback that it can use to feed values into the + - bloom filter. + - + - Once the action completes, the mutable filter is frozen + - for later use. + -} +genBloomFilter :: Hashable t => (v -> t) -> ((v -> Annex ()) -> Annex b) -> Annex (Bloom t) +genBloomFilter convert populate = do + (numbits, numhashes) <- bloomBitsHashes + bloom <- lift $ newMB (cheapHashes numhashes) numbits + _ <- populate $ \v -> lift $ insertMB bloom (convert v) + lift $ unsafeFreezeMB bloom + where + lift = liftIO . stToIO + +bloomFilter :: Hashable t => (v -> t) -> [v] -> Bloom t -> [v] +bloomFilter convert l bloom = filter (\k -> convert k `notElemB` bloom) l + +{- Given an initial value, folds it with each key referenced by + - symlinks in the git repo. -} +withKeysReferenced :: v -> (Key -> v -> v) -> Annex v +withKeysReferenced initial a = withKeysReferenced' Nothing initial folda + where + folda k _ v = return $ a k v + +{- Runs an action on each referenced key in the git repo. -} +withKeysReferencedM :: (Key -> Annex ()) -> Annex () +withKeysReferencedM a = withKeysReferenced' Nothing () calla + where + calla k _ _ = a k + +{- Folds an action over keys and files referenced in a particular directory. -} +withKeysFilesReferencedIn :: FilePath -> v -> (Key -> FilePath -> v -> Annex v) -> Annex v +withKeysFilesReferencedIn = withKeysReferenced' . Just + +withKeysReferenced' :: Maybe FilePath -> v -> (Key -> FilePath -> v -> Annex v) -> Annex v +withKeysReferenced' mdir initial a = do + (files, clean) <- getfiles + r <- go initial files + liftIO $ void clean + return r + where + getfiles = case mdir of + Nothing -> ifM isBareRepo + ( return ([], return True) + , do + top <- fromRepo Git.repoPath + inRepo $ LsFiles.allFiles [top] + ) + Just dir -> inRepo $ LsFiles.inRepo [dir] + go v [] = return v + go v (f:fs) = do + x <- Backend.lookupFile f + case x of + Nothing -> go v fs + Just k -> do + !v' <- a k f v + go v' fs + +withKeysReferencedInGit :: (Key -> Annex ()) -> Annex () +withKeysReferencedInGit a = do + current <- inRepo Git.Branch.currentUnsafe + shaHead <- maybe (return Nothing) (inRepo . Git.Ref.sha) current + showref >>= mapM_ (withKeysReferencedInGitRef a) . + relevantrefs (shaHead, current) + where + showref = inRepo $ Git.Command.pipeReadStrict [Param "show-ref"] + relevantrefs headRef = addHead headRef . + filter ourbranches . + map (separate (== ' ')) . + lines + nubRefs = map (Git.Ref . snd) . nubBy (\(x, _) (y, _) -> x == y) + ourbranchend = '/' : Git.fromRef Annex.Branch.name + ourbranches (_, b) = not (ourbranchend `isSuffixOf` b) + && not ("refs/synced/" `isPrefixOf` b) + && not (is_branchView (Git.Ref b)) + addHead headRef refs = case headRef of + -- if HEAD diverges from all branches (except the branch it + -- points to), run the actions on staged keys (and keys + -- that are only present in the work tree if the repo is + -- non bare) + (Just (Git.Ref x), Just (Git.Ref b)) + | all (\(x',b') -> x /= x' || b == b') refs -> + Git.Ref.headRef + : nubRefs (filter ((/= x) . fst) refs) + _ -> nubRefs refs + +{- Runs an action on keys referenced in the given Git reference which + - differ from those referenced in the index. -} +withKeysReferencedInGitRef :: (Key -> Annex ()) -> Git.Ref -> Annex () +withKeysReferencedInGitRef a ref = do + showAction $ "checking " ++ Git.Ref.describe ref + bare <- isBareRepo + (ts,clean) <- inRepo $ if bare + then DiffTree.diffIndex ref + else DiffTree.diffWorkTree ref + let lookAtWorkingTree = not bare && ref == Git.Ref.headRef + forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a + liftIO $ void clean + where + tKey True = Backend.lookupFile . getTopFilePath . DiffTree.file + tKey False = fileKey . takeFileName . decodeBS <$$> + catFile ref . getTopFilePath . DiffTree.file + +{- Looks in the specified directory for bad/tmp keys, and returns a list + - of those that might still have value, or might be stale and removable. + - + - Also, stale keys that can be proven to have no value are deleted. + -} +staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key] +staleKeysPrune dirspec nottransferred = do + contents <- dirKeys dirspec + + dups <- filterM inAnnex contents + let stale = contents `exclude` dups + + dir <- fromRepo dirspec + liftIO $ forM_ dups $ \t -> removeFile $ dir keyFile t + + if nottransferred + then do + inprogress <- S.fromList . map (transferKey . fst) + <$> getTransfers + return $ filter (`S.notMember` inprogress) stale + else return stale + +data UnusedMaps = UnusedMaps + { unusedMap :: UnusedMap + , unusedBadMap :: UnusedMap + , unusedTmpMap :: UnusedMap + } + +withUnusedMaps :: (UnusedMaps -> Int -> CommandStart) -> CommandSeek +withUnusedMaps a params = do + unused <- readUnusedMap "" + unusedbad <- readUnusedMap "bad" + unusedtmp <- readUnusedMap "tmp" + let m = unused `M.union` unusedbad `M.union` unusedtmp + let unusedmaps = UnusedMaps unused unusedbad unusedtmp + seekActions $ return $ map (a unusedmaps) $ + concatMap (unusedSpec m) params + +unusedSpec :: UnusedMap -> String -> [Int] +unusedSpec m spec + | spec == "all" = if M.null m + then [] + else [fst (M.findMin m)..fst (M.findMax m)] + | "-" `isInfixOf` spec = range $ separate (== '-') spec + | otherwise = maybe badspec (: []) (readish spec) + where + range (a, b) = case (readish a, readish b) of + (Just x, Just y) -> [x..y] + _ -> badspec + badspec = error $ "Expected number or range, not \"" ++ spec ++ "\"" + +{- Seek action for unused content. Finds the number in the maps, and + - calls one of 3 actions, depending on the type of unused file. -} +startUnused :: String + -> (Key -> CommandPerform) + -> (Key -> CommandPerform) + -> (Key -> CommandPerform) + -> UnusedMaps -> Int -> CommandStart +startUnused message unused badunused tmpunused maps n = search + [ (unusedMap maps, unused) + , (unusedBadMap maps, badunused) + , (unusedTmpMap maps, tmpunused) + ] + where + search [] = error $ show n ++ " not valid (run git annex unused for list)" + search ((m, a):rest) = + case M.lookup n m of + Nothing -> search rest + Just key -> do + showStart message (show n) + next $ a key diff --git a/Command/Upgrade.hs b/Command/Upgrade.hs new file mode 100644 index 000000000..80876290a --- /dev/null +++ b/Command/Upgrade.hs @@ -0,0 +1,26 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Upgrade where + +import Common.Annex +import Command +import Upgrade + +def :: [Command] +def = [dontCheck repoExists $ -- because an old version may not seem to exist + command "upgrade" paramNothing seek + SectionMaintenance "upgrade repository layout"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + showStart "upgrade" "." + r <- upgrade False + next $ next $ return r diff --git a/Command/VAdd.hs b/Command/VAdd.hs new file mode 100644 index 000000000..e3726a051 --- /dev/null +++ b/Command/VAdd.hs @@ -0,0 +1,36 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VAdd where + +import Common.Annex +import Command +import Annex.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ command "vadd" (paramRepeating "FIELD=GLOB") + seek SectionMetaData "add subdirs to current view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + showStart "vadd" "" + withCurrentView $ \view -> do + let (view', change) = refineView view $ + map parseViewParam $ reverse params + case change of + Unchanged -> do + showNote "unchanged" + next $ next $ return True + Narrowing -> next $ next $ do + if visibleViewSize view' == visibleViewSize view + then error "That would not add an additional level of directory structure to the view. To filter the view, use vfilter instead of vadd." + else checkoutViewBranch view' narrowView + Widening -> error "Widening view to match more files is not currently supported." diff --git a/Command/VCycle.hs b/Command/VCycle.hs new file mode 100644 index 000000000..f7da47fa2 --- /dev/null +++ b/Command/VCycle.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VCycle where + +import Common.Annex +import Command +import Annex.View +import Types.View +import Logs.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vcycle" paramNothing seek SectionUtility + "switch view to next layout"] + +seek :: CommandSeek +seek = withNothing start + +start ::CommandStart +start = go =<< currentView + where + go Nothing = error "Not in a view." + go (Just v) = do + showStart "vcycle" "" + let v' = v { viewComponents = vcycle [] (viewComponents v) } + if v == v' + then do + showNote "unchanged" + next $ next $ return True + else next $ next $ checkoutViewBranch v' narrowView + + vcycle rest (c:cs) + | viewVisible c = rest ++ cs ++ [c] + | otherwise = vcycle (c:rest) cs + vcycle rest c = rest ++ c diff --git a/Command/VFilter.hs b/Command/VFilter.hs new file mode 100644 index 000000000..bd17aca45 --- /dev/null +++ b/Command/VFilter.hs @@ -0,0 +1,30 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VFilter where + +import Common.Annex +import Command +import Annex.View +import Command.View (paramView, checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vfilter" paramView seek SectionMetaData "filter current view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + showStart "vfilter" "" + withCurrentView $ \view -> do + let view' = filterView view $ + map parseViewParam $ reverse params + next $ next $ if visibleViewSize view' > visibleViewSize view + then error "That would add an additional level of directory structure to the view, rather than filtering it. If you want to do that, use vadd instead of vfilter." + else checkoutViewBranch view' narrowView diff --git a/Command/VPop.hs b/Command/VPop.hs new file mode 100644 index 000000000..706a522f8 --- /dev/null +++ b/Command/VPop.hs @@ -0,0 +1,50 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VPop where + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import Types.View +import Logs.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vpop" (paramOptional paramNumber) seek SectionMetaData + "switch back to previous view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start ps = go =<< currentView + where + go Nothing = error "Not in a view." + go (Just v) = do + showStart "vpop" (show num) + removeView v + (oldvs, vs) <- splitAt (num - 1) . filter (sameparentbranch v) + <$> recentViews + mapM_ removeView oldvs + case vs of + (oldv:_) -> next $ next $ do + showOutput + checkoutViewBranch oldv (return . branchView) + _ -> next $ next $ do + showOutput + inRepo $ Git.Command.runBool + [ Param "checkout" + , Param $ Git.fromRef $ Git.Ref.base $ + viewParentBranch v + ] + sameparentbranch a b = viewParentBranch a == viewParentBranch b + + num = fromMaybe 1 $ readish =<< headMaybe ps diff --git a/Command/Version.hs b/Command/Version.hs new file mode 100644 index 000000000..526b752f0 --- /dev/null +++ b/Command/Version.hs @@ -0,0 +1,49 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Version where + +import Common.Annex +import Command +import qualified Build.SysConfig as SysConfig +import Annex.Version +import BuildFlags +import qualified Types.Backend as B +import qualified Types.Remote as R +import qualified Remote +import qualified Backend + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "version" paramNothing seek SectionQuery "show version info"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + v <- getVersion + liftIO $ do + showPackageVersion + info "local repository version" $ fromMaybe "unknown" v + info "supported repository version" supportedVersion + info "upgrade supported from repository versions" $ + unwords upgradableVersions + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo _ = showPackageVersion + +showPackageVersion :: IO () +showPackageVersion = do + info "git-annex version" SysConfig.packageversion + info "build flags" $ unwords buildFlags + info "key/value backends" $ unwords $ map B.name Backend.list + info "remote types" $ unwords $ map R.typename Remote.remoteTypes + +info :: String -> String -> IO () +info k v = putStrLn $ k ++ ": " ++ v diff --git a/Command/Vicfg.hs b/Command/Vicfg.hs new file mode 100644 index 000000000..5ec6bbf72 --- /dev/null +++ b/Command/Vicfg.hs @@ -0,0 +1,280 @@ +{- git-annex command + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Vicfg where + +import qualified Data.Map as M +import qualified Data.Set as S +import System.Environment (getEnv) +import Data.Tuple (swap) +import Data.Char (isSpace) + +import Common.Annex +import Command +import Annex.Perms +import Types.TrustLevel +import Types.Group +import Logs.Trust +import Logs.Group +import Logs.PreferredContent +import Logs.Schedule +import Types.StandardGroups +import Types.ScheduledActivity +import Remote + +def :: [Command] +def = [command "vicfg" paramNothing seek + SectionSetup "edit git-annex's configuration"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + f <- fromRepo gitAnnexTmpCfgFile + createAnnexDirectory $ parentDir f + cfg <- getCfg + descs <- uuidDescriptions + liftIO $ writeFile f $ genCfg cfg descs + vicfg cfg f + stop + +vicfg :: Cfg -> FilePath -> Annex () +vicfg curcfg f = do + vi <- liftIO $ catchDefaultIO "vi" $ getEnv "EDITOR" + -- Allow EDITOR to be processed by the shell, so it can contain options. + unlessM (liftIO $ boolSystem "sh" [Param "-c", Param $ unwords [vi, shellEscape f]]) $ + error $ vi ++ " exited nonzero; aborting" + r <- parseCfg curcfg <$> liftIO (readFileStrict f) + liftIO $ nukeFile f + case r of + Left s -> do + liftIO $ writeFile f s + vicfg curcfg f + Right newcfg -> setCfg curcfg newcfg + +data Cfg = Cfg + { cfgTrustMap :: TrustMap + , cfgGroupMap :: M.Map UUID (S.Set Group) + , cfgPreferredContentMap :: M.Map UUID PreferredContentExpression + , cfgRequiredContentMap :: M.Map UUID PreferredContentExpression + , cfgGroupPreferredContentMap :: M.Map Group PreferredContentExpression + , cfgScheduleMap :: M.Map UUID [ScheduledActivity] + } + +getCfg :: Annex Cfg +getCfg = Cfg + <$> trustMapRaw -- without local trust overrides + <*> (groupsByUUID <$> groupMap) + <*> preferredContentMapRaw + <*> requiredContentMapRaw + <*> groupPreferredContentMapRaw + <*> scheduleMap + +setCfg :: Cfg -> Cfg -> Annex () +setCfg curcfg newcfg = do + let diff = diffCfg curcfg newcfg + mapM_ (uncurry trustSet) $ M.toList $ cfgTrustMap diff + mapM_ (uncurry groupSet) $ M.toList $ cfgGroupMap diff + mapM_ (uncurry preferredContentSet) $ M.toList $ cfgPreferredContentMap diff + mapM_ (uncurry requiredContentSet) $ M.toList $ cfgRequiredContentMap diff + mapM_ (uncurry groupPreferredContentSet) $ M.toList $ cfgGroupPreferredContentMap diff + mapM_ (uncurry scheduleSet) $ M.toList $ cfgScheduleMap diff + +diffCfg :: Cfg -> Cfg -> Cfg +diffCfg curcfg newcfg = Cfg + { cfgTrustMap = diff cfgTrustMap + , cfgGroupMap = diff cfgGroupMap + , cfgPreferredContentMap = diff cfgPreferredContentMap + , cfgRequiredContentMap = diff cfgRequiredContentMap + , cfgGroupPreferredContentMap = diff cfgGroupPreferredContentMap + , cfgScheduleMap = diff cfgScheduleMap + } + where + diff f = M.differenceWith (\x y -> if x == y then Nothing else Just x) + (f newcfg) (f curcfg) + +genCfg :: Cfg -> M.Map UUID String -> String +genCfg cfg descs = unlines $ intercalate [""] + [ intro + , trust + , groups + , preferredcontent + , grouppreferredcontent + , standardgroups + , requiredcontent + , schedule + ] + where + intro = + [ com "git-annex configuration" + , com "" + , com "Changes saved to this file will be recorded in the git-annex branch." + , com "" + , com "Lines in this file have the format:" + , com " setting field = value" + ] + + trust = settings cfg descs cfgTrustMap + [ com "Repository trust configuration" + , com "(Valid trust levels: " ++ trustlevels ++ ")" + ] + (\(t, u) -> line "trust" u $ showTrustLevel t) + (\u -> lcom $ line "trust" u $ showTrustLevel SemiTrusted) + where + trustlevels = unwords $ map showTrustLevel [Trusted .. DeadTrusted] + + groups = settings cfg descs cfgGroupMap + [ com "Repository groups" + , com $ "(Standard groups: " ++ grouplist ++ ")" + , com "(Separate group names with spaces)" + ] + (\(s, u) -> line "group" u $ unwords $ S.toList s) + (\u -> lcom $ line "group" u "") + where + grouplist = unwords $ map fromStandardGroup [minBound..] + + preferredcontent = settings cfg descs cfgPreferredContentMap + [ com "Repository preferred contents" + , com "(Set to \"standard\" to use a repository's group's preferred contents)" + ] + (\(s, u) -> line "wanted" u s) + (\u -> line "wanted" u "") + + requiredcontent = settings cfg descs cfgRequiredContentMap + [ com "Repository required contents" ] + (\(s, u) -> line "required" u s) + (\u -> line "required" u "") + + grouppreferredcontent = settings' cfg allgroups cfgGroupPreferredContentMap + [ com "Group preferred contents" + , com "(Used by repositories with \"groupwanted\" in their preferred contents)" + ] + (\(s, g) -> gline g s) + (\g -> gline g "") + where + gline g value = [ unwords ["groupwanted", g, "=", value] ] + allgroups = S.unions $ stdgroups : M.elems (cfgGroupMap cfg) + stdgroups = S.fromList $ map fromStandardGroup [minBound..maxBound] + + standardgroups = + [ com "Standard preferred contents" + , com "(Used by wanted or groupwanted expressions containing \"standard\")" + , com "(For reference only; built-in and cannot be changed!)" + ] + ++ map gline [minBound..maxBound] + where + gline g = com $ unwords + [ "standard" + , fromStandardGroup g, "=", standardPreferredContent g + ] + + schedule = settings cfg descs cfgScheduleMap + [ com "Scheduled activities" + , com "(Separate multiple activities with \"; \")" + ] + (\(l, u) -> line "schedule" u $ fromScheduledActivities l) + (\u -> line "schedule" u "") + + line setting u value = + [ com $ "(for " ++ fromMaybe "" (M.lookup u descs) ++ ")" + , unwords [setting, fromUUID u, "=", value] + ] + +settings :: Ord v => Cfg -> M.Map UUID String -> (Cfg -> M.Map UUID v) -> [String] -> ((v, UUID) -> [String]) -> (UUID -> [String]) -> [String] +settings cfg descs = settings' cfg (M.keysSet descs) + +settings' :: (Ord v, Ord f) => Cfg -> S.Set f -> (Cfg -> M.Map f v) -> [String] -> ((v, f) -> [String]) -> (f -> [String]) -> [String] +settings' cfg s field desc showvals showdefaults = concat + [ desc + , concatMap showvals $ sort $ map swap $ M.toList $ field cfg + , concatMap (lcom . showdefaults) missing + ] + where + missing = S.toList $ s `S.difference` M.keysSet (field cfg) + +lcom :: [String] -> [String] +lcom = map (\l -> if "#" `isPrefixOf` l then l else '#' : l) + +{- If there's a parse error, returns a new version of the file, + - with the problem lines noted. -} +parseCfg :: Cfg -> String -> Either String Cfg +parseCfg curcfg = go [] curcfg . lines + where + go c cfg [] + | null (mapMaybe fst c) = Right cfg + | otherwise = Left $ unlines $ + badheader ++ concatMap showerr (reverse c) + go c cfg (l:ls) = case parse (dropWhile isSpace l) cfg of + Left msg -> go ((Just msg, l):c) cfg ls + Right cfg' -> go ((Nothing, l):c) cfg' ls + + parse l cfg + | null l = Right cfg + | "#" `isPrefixOf` l = Right cfg + | null setting || null f = Left "missing field" + | otherwise = handle cfg f setting value' + where + (setting, rest) = separate isSpace l + (r, value) = separate (== '=') rest + value' = trimspace value + f = reverse $ trimspace $ reverse $ trimspace r + trimspace = dropWhile isSpace + + handle cfg f setting value + | setting == "trust" = case readTrustLevel value of + Nothing -> badval "trust value" value + Just t -> + let m = M.insert u t (cfgTrustMap cfg) + in Right $ cfg { cfgTrustMap = m } + | setting == "group" = + let m = M.insert u (S.fromList $ words value) (cfgGroupMap cfg) + in Right $ cfg { cfgGroupMap = m } + | setting == "wanted" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert u value (cfgPreferredContentMap cfg) + in Right $ cfg { cfgPreferredContentMap = m } + | setting == "required" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert u value (cfgRequiredContentMap cfg) + in Right $ cfg { cfgRequiredContentMap = m } + | setting == "groupwanted" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert f value (cfgGroupPreferredContentMap cfg) + in Right $ cfg { cfgGroupPreferredContentMap = m } + | setting == "schedule" = case parseScheduledActivities value of + Left e -> Left e + Right l -> + let m = M.insert u l (cfgScheduleMap cfg) + in Right $ cfg { cfgScheduleMap = m } + | otherwise = badval "setting" setting + where + u = toUUID f + + showerr (Just msg, l) = [parseerr ++ msg, l] + showerr (Nothing, l) + -- filter out the header and parse error lines + -- from any previous parse failure + | any (`isPrefixOf` l) (parseerr:badheader) = [] + | otherwise = [l] + + badval desc val = Left $ "unknown " ++ desc ++ " \"" ++ val ++ "\"" + badheader = + [ com "** There was a problem parsing your input!" + , com "** Search for \"Parse error\" to find the bad lines." + , com "** Either fix the bad lines, or delete them (to discard your changes)." + ] + parseerr = com "** Parse error in next line: " + +com :: String -> String +com s = "# " ++ s diff --git a/Command/View.hs b/Command/View.hs new file mode 100644 index 000000000..93b045c39 --- /dev/null +++ b/Command/View.hs @@ -0,0 +1,82 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.View where + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Branch +import Types.View +import Annex.View +import Logs.View + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "view" paramView seek SectionMetaData "enter a view branch"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = error "Specify metadata to include in view" +start params = do + showStart "view" "" + view <- mkView params + go view =<< currentView + where + go view Nothing = next $ perform view + go view (Just v) + | v == view = stop + | otherwise = error "Already in a view. Use the vfilter and vadd commands to further refine this view." + +perform :: View -> CommandPerform +perform view = do + showSideAction "searching" + next $ checkoutViewBranch view applyView + +paramView :: String +paramView = paramPair (paramRepeating "TAG") (paramRepeating "FIELD=VALUE") + +mkView :: [String] -> Annex View +mkView params = go =<< inRepo Git.Branch.current + where + go Nothing = error "not on any branch!" + go (Just b) = return $ fst $ refineView (View b []) $ + map parseViewParam $ reverse params + +checkoutViewBranch :: View -> (View -> Annex Git.Branch) -> CommandCleanup +checkoutViewBranch view mkbranch = do + oldcwd <- liftIO getCurrentDirectory + + {- Change to top of repository before creating view branch. -} + liftIO . setCurrentDirectory =<< fromRepo Git.repoPath + branch <- mkbranch view + + showOutput + ok <- inRepo $ Git.Command.runBool + [ Param "checkout" + , Param (Git.fromRef $ Git.Ref.base branch) + ] + when ok $ do + setView view + {- A git repo can easily have empty directories in it, + - and this pollutes the view, so remove them. -} + liftIO $ removeemptydirs "." + unlessM (liftIO $ doesDirectoryExist oldcwd) $ do + top <- fromRepo Git.repoPath + showLongNote (cwdmissing top) + return ok + where + removeemptydirs top = mapM_ (tryIO . removeDirectory) + =<< dirTreeRecursiveSkipping (".git" `isSuffixOf`) top + cwdmissing top = unlines + [ "This view does not include the subdirectory you are currently in." + , "Perhaps you should: cd " ++ top + ] diff --git a/Command/Wanted.hs b/Command/Wanted.hs new file mode 100644 index 000000000..bae450d26 --- /dev/null +++ b/Command/Wanted.hs @@ -0,0 +1,51 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Wanted where + +import Common.Annex +import qualified Annex +import Command +import qualified Remote +import Logs.PreferredContent +import Types.Messages + +import qualified Data.Map as M + +def :: [Command] +def = [command "wanted" (paramPair paramRemote (paramOptional paramExpression)) seek + SectionSetup "get or set preferred content expression"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start = parse + where + parse (name:[]) = go name performGet + parse (name:expr:[]) = go name $ \uuid -> do + showStart "wanted" name + performSet expr uuid + parse _ = error "Specify a repository." + + go name a = do + u <- Remote.nameToUUID name + next $ a u + +performGet :: UUID -> CommandPerform +performGet uuid = do + Annex.setOutput QuietOutput + m <- preferredContentMapRaw + liftIO $ putStrLn $ fromMaybe "" $ M.lookup uuid m + next $ return True + +performSet :: String -> UUID -> CommandPerform +performSet expr uuid = case checkPreferredContentExpression expr of + Just e -> error $ "Parse error: " ++ e + Nothing -> do + preferredContentSet uuid expr + next $ return True diff --git a/Command/Watch.hs b/Command/Watch.hs new file mode 100644 index 000000000..79079337c --- /dev/null +++ b/Command/Watch.hs @@ -0,0 +1,36 @@ +{- git-annex watch command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Watch where + +import Common.Annex +import Assistant +import Command +import Utility.HumanTime + +def :: [Command] +def = [notBareRepo $ withOptions [foregroundOption, stopOption] $ + command "watch" paramNothing seek SectionCommon "watch for changes"] + +seek :: CommandSeek +seek ps = do + stopdaemon <- getOptionFlag stopOption + foreground <- getOptionFlag foregroundOption + withNothing (start False foreground stopdaemon Nothing) ps + +foregroundOption :: Option +foregroundOption = flagOption [] "foreground" "do not daemonize" + +stopOption :: Option +stopOption = flagOption [] "stop" "stop daemon" + +start :: Bool -> Bool -> Bool -> Maybe Duration -> CommandStart +start assistant foreground stopdaemon startdelay = do + if stopdaemon + then stopDaemon + else startDaemon assistant foreground startdelay Nothing Nothing Nothing -- does not return + stop diff --git a/Command/WebApp.hs b/Command/WebApp.hs new file mode 100644 index 000000000..e329582e3 --- /dev/null +++ b/Command/WebApp.hs @@ -0,0 +1,253 @@ +{- git-annex webapp launcher + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.WebApp where + +import Common.Annex +import Command +import Assistant +import Assistant.Common +import Assistant.NamedThread +import Assistant.Threads.WebApp +import Assistant.WebApp +import Assistant.Install +import Annex.Environment +import Utility.WebApp +import Utility.Daemon (checkDaemon) +#ifdef __ANDROID__ +import Utility.Env +#endif +import Annex.Init +import qualified Git +import qualified Git.Config +import qualified Git.CurrentRepo +import qualified Annex +import Config.Files +import Upgrade +import Annex.Version + +import Control.Concurrent +import Control.Concurrent.STM +import Network.Socket (HostName) +import System.Environment (getArgs) + +def :: [Command] +def = [ withOptions [listenOption] $ + noCommit $ noRepo startNoRepo $ dontCheck repoExists $ notBareRepo $ + command "webapp" paramNothing seek SectionCommon "launch webapp"] + +listenOption :: Option +listenOption = fieldOption [] "listen" paramAddress + "accept connections to this address" + +seek :: CommandSeek +seek ps = do + listenhost <- getOptionField listenOption return + withNothing (start listenhost) ps + +start :: Maybe HostName -> CommandStart +start = start' True + +start' :: Bool -> Maybe HostName -> CommandStart +start' allowauto listenhost = do + liftIO ensureInstalled + ifM isInitialized + ( maybe notinitialized (go <=< needsUpgrade) =<< getVersion + , if allowauto + then liftIO $ startNoRepo [] + else notinitialized + ) + stop + where + go cannotrun = do + browser <- fromRepo webBrowser + f <- liftIO . absPath =<< fromRepo gitAnnexHtmlShim + listenhost' <- if isJust listenhost + then pure listenhost + else annexListen <$> Annex.getGitConfig + ifM (checkpid <&&> checkshim f) + ( if isJust listenhost + then error "The assistant is already running, so --listen cannot be used." + else do + url <- liftIO . readFile + =<< fromRepo gitAnnexUrlFile + liftIO $ if isJust listenhost' + then putStrLn url + else liftIO $ openBrowser browser f url Nothing Nothing + , do + startDaemon True True Nothing cannotrun listenhost' $ Just $ + \origout origerr url htmlshim -> + if isJust listenhost' + then maybe noop (`hPutStrLn` url) origout + else openBrowser browser htmlshim url origout origerr + ) + checkpid = do + pidfile <- fromRepo gitAnnexPidFile + liftIO $ isJust <$> checkDaemon pidfile + checkshim f = liftIO $ doesFileExist f + notinitialized = do + g <- Annex.gitRepo + liftIO $ cannotStartIn (Git.repoLocation g) "repository has not been initialized by git-annex" + liftIO $ firstRun listenhost + +{- When run without a repo, start the first available listed repository in + - the autostart file. If none, it's our first time being run! -} +startNoRepo :: CmdParams -> IO () +startNoRepo _ = do + -- FIXME should be able to reuse regular getopt, but + -- it currently runs in the Annex monad. + args <- getArgs + let listenhost = headMaybe $ map (snd . separate (== '=')) $ + filter ("--listen=" `isPrefixOf`) args + + go listenhost =<< liftIO (filterM doesDirectoryExist =<< readAutoStartFile) + where + go listenhost [] = firstRun listenhost + go listenhost (d:ds) = do + v <- tryNonAsync $ do + setCurrentDirectory d + Annex.new =<< Git.CurrentRepo.get + case v of + Left e -> do + cannotStartIn d (show e) + go listenhost ds + Right state -> void $ Annex.eval state $ do + whenM (fromRepo Git.repoIsLocalBare) $ + error $ d ++ " is a bare git repository, cannot run the webapp in it" + callCommandAction $ + start' False listenhost + +cannotStartIn :: FilePath -> String -> IO () +cannotStartIn d reason = warningIO $ "unable to start webapp in repository " ++ d ++ ": " ++ reason + +{- Run the webapp without a repository, which prompts the user, makes one, + - changes to it, starts the regular assistant, and redirects the + - browser to its url. + - + - This is a very tricky dance -- The first webapp calls the signaler, + - which signals the main thread when it's ok to continue by writing to a + - MVar. The main thread starts the second webapp, and uses its callback + - to write its url back to the MVar, from where the signaler retrieves it, + - returning it to the first webapp, which does the redirect. + - + - Note that it's important that mainthread never terminates! Much + - of this complication is due to needing to keep the mainthread running. + -} +firstRun :: Maybe HostName -> IO () +firstRun listenhost = do + checkEnvironmentIO + {- Without a repository, we cannot have an Annex monad, so cannot + - get a ThreadState. Using undefined is only safe because the + - webapp checks its noAnnex field before accessing the + - threadstate. -} + let st = undefined + {- Get a DaemonStatus without running in the Annex monad. -} + dstatus <- atomically . newTMVar =<< newDaemonStatus + d <- newAssistantData st dstatus + urlrenderer <- newUrlRenderer + v <- newEmptyMVar + let callback a = Just $ a v + runAssistant d $ do + startNamedThread urlrenderer $ + webAppThread d urlrenderer True Nothing + (callback signaler) + listenhost + (callback mainthread) + waitNamedThreads + where + signaler v = do + putMVar v "" + takeMVar v + mainthread v url htmlshim + | isJust listenhost = do + putStrLn url + hFlush stdout + go + | otherwise = do + browser <- maybe Nothing webBrowser + <$> catchDefaultIO Nothing Git.Config.global + openBrowser browser htmlshim url Nothing Nothing + go + where + go = do + _wait <- takeMVar v + state <- Annex.new =<< Git.CurrentRepo.get + Annex.eval state $ + startDaemon True True Nothing Nothing listenhost $ Just $ + sendurlback v + sendurlback v _origout _origerr url _htmlshim = do + recordUrl url + putMVar v url + +recordUrl :: String -> IO () +#ifdef __ANDROID__ +{- The Android app has a menu item that opens the url recorded + - in this file. -} +recordUrl url = writeFile "/sdcard/git-annex.home/.git-annex-url" url +#else +recordUrl _ = noop +#endif + +openBrowser :: Maybe FilePath -> FilePath -> String -> Maybe Handle -> Maybe Handle -> IO () +#ifndef __ANDROID__ +openBrowser mcmd htmlshim _realurl outh errh = runbrowser +#else +openBrowser mcmd htmlshim realurl outh errh = do + recordUrl url + {- Android's `am` command does not work reliably across the + - wide range of Android devices. Intead, FIFO should be set to + - the filename of a fifo that we can write the URL to. -} + v <- getEnv "FIFO" + case v of + Nothing -> runbrowser + Just f -> void $ forkIO $ do + fd <- openFd f WriteOnly Nothing defaultFileFlags + void $ fdWrite fd url + closeFd fd +#endif + where + p = case mcmd of + Just cmd -> proc cmd [htmlshim] + Nothing -> +#ifndef mingw32_HOST_OS + browserProc url +#else + {- Windows hack to avoid using the full path, + - which might contain spaces that cause problems + - for browserProc. -} + (browserProc (takeFileName htmlshim)) + { cwd = Just (takeDirectory htmlshim) } +#endif +#ifdef __ANDROID__ + {- Android does not support file:// urls, but neither is + - the security of the url in the process table important + - there, so just use the real url. -} + url = realurl +#else + url = fileUrl htmlshim +#endif + runbrowser = do + hPutStrLn (fromMaybe stdout outh) $ "Launching web browser on " ++ url + hFlush stdout + environ <- cleanEnvironment + (_, _, _, pid) <- createProcess p + { env = environ + , std_out = maybe Inherit UseHandle outh + , std_err = maybe Inherit UseHandle errh + } + exitcode <- waitForProcess pid + unless (exitcode == ExitSuccess) $ + hPutStrLn (fromMaybe stderr errh) "failed to start web browser" + +{- web.browser is a generic git config setting for a web browser program -} +webBrowser :: Git.Repo -> Maybe FilePath +webBrowser = Git.Config.getMaybe "web.browser" + +fileUrl :: FilePath -> String +fileUrl file = "file://" ++ file diff --git a/Command/Whereis.hs b/Command/Whereis.hs new file mode 100644 index 000000000..d2c27eb9b --- /dev/null +++ b/Command/Whereis.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Whereis where + +import qualified Data.Map as M + +import Common.Annex +import Command +import Remote +import Logs.Trust + +def :: [Command] +def = [noCommit $ withOptions (jsonOption : keyOptions) $ + command "whereis" paramPaths seek SectionQuery + "lists repositories that have file content"] + +seek :: CommandSeek +seek ps = do + m <- remoteMap id + withKeyOptions + (startKeys m) + (withFilesInGit $ whenAnnexed $ start m) + ps + +start :: M.Map UUID Remote -> FilePath -> Key -> CommandStart +start remotemap file key = start' remotemap key (Just file) + +startKeys :: M.Map UUID Remote -> Key -> CommandStart +startKeys remotemap key = start' remotemap key Nothing + +start' :: M.Map UUID Remote -> Key -> AssociatedFile -> CommandStart +start' remotemap key afile = do + showStart' "whereis" key afile + next $ perform remotemap key + +perform :: M.Map UUID Remote -> Key -> CommandPerform +perform remotemap key = do + locations <- keyLocations key + (untrustedlocations, safelocations) <- trustPartition UnTrusted locations + let num = length safelocations + showNote $ show num ++ " " ++ copiesplural num + pp <- prettyPrintUUIDs "whereis" safelocations + unless (null safelocations) $ showLongNote pp + pp' <- prettyPrintUUIDs "untrusted" untrustedlocations + unless (null untrustedlocations) $ showLongNote $ untrustedheader ++ pp' + forM_ (mapMaybe (`M.lookup` remotemap) locations) $ + performRemote key + if null safelocations then stop else next $ return True + where + copiesplural 1 = "copy" + copiesplural _ = "copies" + untrustedheader = "The following untrusted locations may also have copies:\n" + +performRemote :: Key -> Remote -> Annex () +performRemote key remote = maybe noop go $ whereisKey remote + where + go a = do + ls <- a key + unless (null ls) $ showLongNote $ unlines $ + map (\l -> name remote ++ ": " ++ l) ls diff --git a/Command/XMPPGit.hs b/Command/XMPPGit.hs new file mode 100644 index 000000000..47c2d7ff2 --- /dev/null +++ b/Command/XMPPGit.hs @@ -0,0 +1,46 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.XMPPGit where + +import Common.Annex +import Command +import Assistant.XMPP.Git + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "xmppgit" paramNothing seek + SectionPlumbing "git to XMPP relay"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start _ = do + liftIO gitRemoteHelper + liftIO xmppGitRelay + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo _ = xmppGitRelay + +{- A basic implementation of the git-remote-helpers protocol. -} +gitRemoteHelper :: IO () +gitRemoteHelper = do + expect "capabilities" + respond ["connect"] + expect "connect git-receive-pack" + respond [] + where + expect s = do + cmd <- getLine + unless (cmd == s) $ + error $ "git-remote-helpers protocol error: expected: " ++ s ++ ", but got: " ++ cmd + respond l = do + mapM_ putStrLn l + putStrLn "" + hFlush stdout diff --git a/Common.hs b/Common.hs new file mode 100644 index 000000000..0f3dc71d0 --- /dev/null +++ b/Common.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE PackageImports, CPP #-} + +module Common (module X) where + +import Control.Monad as X +import Control.Monad.IfElse as X +import Control.Applicative as X +import "mtl" Control.Monad.State.Strict as X (liftIO) +import Control.Exception.Extensible as X (IOException) + +import Data.Maybe as X +import Data.List as X hiding (head, tail, init, last) +import Data.String.Utils as X hiding (join) +import Data.Monoid as X + +import System.FilePath as X +import System.Directory as X +import System.IO as X hiding (FilePath) +#ifndef mingw32_HOST_OS +import System.Posix.IO as X +#endif +import System.Exit as X + +import Utility.Misc as X +import Utility.Exception as X +import Utility.SafeCommand as X +import Utility.Process as X +import Utility.Path as X +import Utility.Directory as X +import Utility.Monad as X +import Utility.Data as X +import Utility.Applicative as X +import Utility.FileSystemEncoding as X +import Utility.PosixFiles as X +import Utility.Network as X + +import Utility.PartialPrelude as X diff --git a/Common/Annex.hs b/Common/Annex.hs new file mode 100644 index 000000000..3b8bcdbdd --- /dev/null +++ b/Common/Annex.hs @@ -0,0 +1,8 @@ +module Common.Annex (module X) where + +import Common as X +import Types as X +import Types.UUID as X (toUUID, fromUUID) +import Annex as X (gitRepo, inRepo, fromRepo, calcRepo) +import Locations as X +import Messages as X diff --git a/Config.hs b/Config.hs new file mode 100644 index 000000000..32644263f --- /dev/null +++ b/Config.hs @@ -0,0 +1,84 @@ +{- Git configuration + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config where + +import Common.Annex +import qualified Git +import qualified Git.Config +import qualified Git.Command +import qualified Annex +import Config.Cost +import Types.Availability + +type UnqualifiedConfigKey = String +data ConfigKey = ConfigKey String + +instance Show ConfigKey where + show (ConfigKey s) = s + +{- Looks up a setting in git config. -} +getConfig :: ConfigKey -> String -> Annex String +getConfig (ConfigKey key) def = fromRepo $ Git.Config.get key def + +getConfigMaybe :: ConfigKey -> Annex (Maybe String) +getConfigMaybe (ConfigKey key) = fromRepo $ Git.Config.getMaybe key + +{- Changes a git config setting in both internal state and .git/config -} +setConfig :: ConfigKey -> String -> Annex () +setConfig (ConfigKey key) value = do + inRepo $ Git.Command.run [Param "config", Param key, Param value] + reloadConfig + +reloadConfig :: Annex () +reloadConfig = Annex.changeGitRepo =<< inRepo Git.Config.reRead + +{- Unsets a git config setting. (Leaves it in state currently.) -} +unsetConfig :: ConfigKey -> Annex () +unsetConfig ck@(ConfigKey key) = ifM (isJust <$> getConfigMaybe ck) + ( inRepo $ Git.Command.run + [Param "config", Param "--unset", Param key] + , noop -- avoid unsetting something not set; that would fail + ) + +{- A per-remote config setting in git config. -} +remoteConfig :: Git.Repo -> UnqualifiedConfigKey -> ConfigKey +remoteConfig r key = ConfigKey $ + "remote." ++ fromMaybe "" (Git.remoteName r) ++ ".annex-" ++ key + +{- A global annex setting in git config. -} +annexConfig :: UnqualifiedConfigKey -> ConfigKey +annexConfig key = ConfigKey $ "annex." ++ key + +{- Calculates cost for a remote. Either the specific default, or as configured + - by remote..annex-cost, or if remote..annex-cost-command + - is set and prints a number, that is used. -} +remoteCost :: RemoteGitConfig -> Cost -> Annex Cost +remoteCost c def = fromMaybe def <$> remoteCost' c + +remoteCost' :: RemoteGitConfig -> Annex (Maybe Cost) +remoteCost' c = case remoteAnnexCostCommand c of + Just cmd | not (null cmd) -> liftIO $ + readish <$> readProcess "sh" ["-c", cmd] + _ -> return $ remoteAnnexCost c + +setRemoteCost :: Git.Repo -> Cost -> Annex () +setRemoteCost r c = setConfig (remoteConfig r "cost") (show c) + +setRemoteAvailability :: Git.Repo -> Availability -> Annex () +setRemoteAvailability r c = setConfig (remoteConfig r "availability") (show c) + +isDirect :: Annex Bool +isDirect = annexDirect <$> Annex.getGitConfig + +crippledFileSystem :: Annex Bool +crippledFileSystem = annexCrippledFileSystem <$> Annex.getGitConfig + +setCrippledFileSystem :: Bool -> Annex () +setCrippledFileSystem b = do + setConfig (annexConfig "crippledfilesystem") (Git.Config.boolConfig b) + Annex.changeGitConfig $ \c -> c { annexCrippledFileSystem = b } diff --git a/Config/Cost.hs b/Config/Cost.hs new file mode 100644 index 000000000..2d94a6b15 --- /dev/null +++ b/Config/Cost.hs @@ -0,0 +1,82 @@ +{- Remote costs. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.Cost where + +{- We use a float for a cost to ensure that there is a cost in + - between any two other costs. -} +type Cost = Float + +{- Some predefined default costs. + - Users setting costs in config files can be aware of these, + - and pick values relative to them. So don't change. -} +cheapRemoteCost :: Cost +cheapRemoteCost = 100 +nearlyCheapRemoteCost :: Cost +nearlyCheapRemoteCost = 110 +semiExpensiveRemoteCost :: Cost +semiExpensiveRemoteCost = 175 +expensiveRemoteCost :: Cost +expensiveRemoteCost = 200 +veryExpensiveRemoteCost :: Cost +veryExpensiveRemoteCost = 1000 + +{- Adjusts a remote's cost to reflect it being encrypted. -} +encryptedRemoteCostAdj :: Cost +encryptedRemoteCostAdj = 50 + +{- Given an ordered list of costs, and the position of one of the items + - the list, inserts a new cost into the list, in between the item + - and the item after it. + - + - If two or move items have the same cost, their costs are adjusted + - to make room. The costs of other items in the list are left + - unchanged. + - + - To insert the new cost before any other in the list, specify a negative + - position. To insert the new cost at the end of the list, specify a + - position longer than the list. + -} +insertCostAfter :: [Cost] -> Int -> [Cost] +insertCostAfter [] _ = [] +insertCostAfter l pos + | pos < 0 = costBetween 0 (l !! 0) : l + | nextpos > maxpos = l ++ [1 + l !! maxpos] + | item == nextitem = + let (_dup:new:l') = insertCostAfter lastsegment 0 + in firstsegment ++ [costBetween item new, new] ++ l' + | otherwise = + firstsegment ++ [costBetween item nextitem ] ++ lastsegment + where + nextpos = pos + 1 + maxpos = length l - 1 + + item = l !! pos + nextitem = l !! nextpos + + (firstsegment, lastsegment) = splitAt (pos + 1) l + +costBetween :: Cost -> Cost -> Cost +costBetween x y + | x == y = x + | x > y = -- avoid fractions unless needed + let mid = y + (x - y) / 2 + mid' = fromIntegral (floor mid :: Int) + in if mid' > y then mid' else mid + | otherwise = costBetween y x + +{- Make sure the remote cost numbers work out. -} +prop_cost_sane :: Bool +prop_cost_sane = False `notElem` + [ expensiveRemoteCost > 0 + , cheapRemoteCost < nearlyCheapRemoteCost + , nearlyCheapRemoteCost < semiExpensiveRemoteCost + , semiExpensiveRemoteCost < expensiveRemoteCost + , cheapRemoteCost + encryptedRemoteCostAdj > nearlyCheapRemoteCost + , nearlyCheapRemoteCost + encryptedRemoteCostAdj < semiExpensiveRemoteCost + , nearlyCheapRemoteCost + encryptedRemoteCostAdj < expensiveRemoteCost + ] diff --git a/Config/Files.hs b/Config/Files.hs new file mode 100644 index 000000000..30ed0a3cf --- /dev/null +++ b/Config/Files.hs @@ -0,0 +1,69 @@ +{- git-annex extra config files + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.Files where + +import Common +import Utility.Tmp +import Utility.FreeDesktop + +{- ~/.config/git-annex/file -} +userConfigFile :: FilePath -> IO FilePath +userConfigFile file = do + dir <- userConfigDir + return $ dir "git-annex" file + +autoStartFile :: IO FilePath +autoStartFile = userConfigFile "autostart" + +{- Returns anything listed in the autostart file (which may not exist). -} +readAutoStartFile :: IO [FilePath] +readAutoStartFile = do + f <- autoStartFile + nub . map dropTrailingPathSeparator . lines + <$> catchDefaultIO "" (readFile f) + +modifyAutoStartFile :: ([FilePath] -> [FilePath]) -> IO () +modifyAutoStartFile func = do + dirs <- readAutoStartFile + let dirs' = nubBy equalFilePath $ func dirs + when (dirs' /= dirs) $ do + f <- autoStartFile + createDirectoryIfMissing True (parentDir f) + viaTmp writeFile f $ unlines dirs' + +{- Adds a directory to the autostart file. If the directory is already + - present, it's moved to the top, so it will be used as the default + - when opening the webapp. -} +addAutoStartFile :: FilePath -> IO () +addAutoStartFile path = modifyAutoStartFile $ (:) path + +{- Removes a directory from the autostart file. -} +removeAutoStartFile :: FilePath -> IO () +removeAutoStartFile path = modifyAutoStartFile $ + filter (not . equalFilePath path) + +{- The path to git-annex is written here; which is useful when cabal + - has installed it to some awful non-PATH location. -} +programFile :: IO FilePath +programFile = userConfigFile "program" + +{- Returns a command to run for git-annex. -} +readProgramFile :: IO FilePath +readProgramFile = do + programfile <- programFile + p <- catchDefaultIO cmd $ + fromMaybe cmd . headMaybe . lines <$> readFile programfile + ifM (inPath p) + ( return p + , ifM (inPath cmd) + ( return cmd + , error $ "cannot find git-annex program in PATH or in the location listed in " ++ programfile + ) + ) + where + cmd = "git-annex" diff --git a/Config/NumCopies.hs b/Config/NumCopies.hs new file mode 100644 index 000000000..26d81b8a4 --- /dev/null +++ b/Config/NumCopies.hs @@ -0,0 +1,80 @@ +{- git-annex numcopies configuration + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.NumCopies ( + module Types.NumCopies, + module Logs.NumCopies, + getFileNumCopies, + getGlobalFileNumCopies, + getNumCopies, + numCopiesCheck, + deprecatedNumCopies, + defaultNumCopies +) where + +import Common.Annex +import qualified Annex +import Types.NumCopies +import Logs.NumCopies +import Logs.Trust +import Annex.CheckAttr +import qualified Remote + +defaultNumCopies :: NumCopies +defaultNumCopies = NumCopies 1 + +fromSources :: [Annex (Maybe NumCopies)] -> Annex NumCopies +fromSources = fromMaybe defaultNumCopies <$$> getM id + +{- The git config annex.numcopies is deprecated. -} +deprecatedNumCopies :: Annex (Maybe NumCopies) +deprecatedNumCopies = annexNumCopies <$> Annex.getGitConfig + +{- Value forced on the command line by --numcopies. -} +getForcedNumCopies :: Annex (Maybe NumCopies) +getForcedNumCopies = Annex.getState Annex.forcenumcopies + +{- Numcopies value from any of the non-.gitattributes configuration + - sources. -} +getNumCopies :: Annex NumCopies +getNumCopies = fromSources + [ getForcedNumCopies + , getGlobalNumCopies + , deprecatedNumCopies + ] + +{- Numcopies value for a file, from any configuration source, including the + - deprecated git config. -} +getFileNumCopies :: FilePath -> Annex NumCopies +getFileNumCopies f = fromSources + [ getForcedNumCopies + , getFileNumCopies' f + , deprecatedNumCopies + ] + +{- This is the globally visible numcopies value for a file. So it does + - not include local configuration in the git config or command line + - options. -} +getGlobalFileNumCopies :: FilePath -> Annex NumCopies +getGlobalFileNumCopies f = fromSources + [ getFileNumCopies' f + ] + +getFileNumCopies' :: FilePath -> Annex (Maybe NumCopies) +getFileNumCopies' file = maybe getGlobalNumCopies (return . Just) =<< getattr + where + getattr = (NumCopies <$$> readish) + <$> checkAttr "annex.numcopies" file + +{- Checks if numcopies are satisfied for a file by running a comparison + - between the number of (not untrusted) copies that are + - belived to exist, and the configured value. -} +numCopiesCheck :: FilePath -> Key -> (Int -> Int -> v) -> Annex v +numCopiesCheck file key vs = do + NumCopies needed <- getFileNumCopies file + have <- trustExclude UnTrusted =<< Remote.keyLocations key + return $ length have `vs` needed diff --git a/Creds.hs b/Creds.hs new file mode 100644 index 000000000..7273ed966 --- /dev/null +++ b/Creds.hs @@ -0,0 +1,147 @@ +{- Credentials storage + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Creds ( + module Types.Creds, + CredPairStorage(..), + setRemoteCredPair, + getRemoteCredPairFor, + getRemoteCredPair, + getEnvCredPair, + writeCacheCreds, + readCacheCreds, + removeCreds, +) where + +import Common.Annex +import Types.Creds +import Annex.Perms +import Utility.FileMode +import Crypto +import Types.Remote (RemoteConfig, RemoteConfigKey) +import Remote.Helper.Encryptable (remoteCipher, embedCreds) +import Utility.Env (getEnv) + +import qualified Data.ByteString.Lazy.Char8 as L +import qualified Data.Map as M +import Utility.Base64 + +{- A CredPair can be stored in a file, or in the environment, or perhaps + - in a remote's configuration. -} +data CredPairStorage = CredPairStorage + { credPairFile :: FilePath + , credPairEnvironment :: (String, String) + , credPairRemoteKey :: Maybe RemoteConfigKey + } + +{- Stores creds in a remote's configuration, if the remote allows + - that. Otherwise, caches them locally. + - The creds are found in storage if not provided. -} +setRemoteCredPair :: RemoteConfig -> CredPairStorage -> Maybe CredPair -> Annex RemoteConfig +setRemoteCredPair c storage Nothing = + maybe (return c) (setRemoteCredPair c storage . Just) + =<< getRemoteCredPair c storage +setRemoteCredPair c storage (Just creds) + | embedCreds c = case credPairRemoteKey storage of + Nothing -> localcache + Just key -> storeconfig key =<< remoteCipher c + | otherwise = localcache + where + localcache = do + writeCacheCredPair creds storage + return c + + storeconfig key (Just cipher) = do + s <- liftIO $ encrypt (getGpgEncParams c) cipher + (feedBytes $ L.pack $ encodeCredPair creds) + (readBytes $ return . L.unpack) + return $ M.insert key (toB64 s) c + storeconfig key Nothing = + return $ M.insert key (toB64 $ encodeCredPair creds) c + +{- Gets a remote's credpair, from the environment if set, otherwise + - from the cache in gitAnnexCredsDir, or failing that, from the + - value in RemoteConfig. -} +getRemoteCredPairFor :: String -> RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair) +getRemoteCredPairFor this c storage = maybe missing (return . Just) =<< getRemoteCredPair c storage + where + (loginvar, passwordvar) = credPairEnvironment storage + missing = do + warning $ unwords + [ "Set both", loginvar + , "and", passwordvar + , "to use", this + ] + return Nothing + +getRemoteCredPair :: RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair) +getRemoteCredPair c storage = maybe fromcache (return . Just) =<< fromenv + where + fromenv = liftIO $ getEnvCredPair storage + fromcache = maybe fromconfig (return . Just) =<< readCacheCredPair storage + fromconfig = case credPairRemoteKey storage of + Just key -> do + mcipher <- remoteCipher c + case (M.lookup key c, mcipher) of + (Nothing, _) -> return Nothing + (Just enccreds, Just cipher) -> do + creds <- liftIO $ decrypt cipher + (feedBytes $ L.pack $ fromB64 enccreds) + (readBytes $ return . L.unpack) + fromcreds creds + (Just bcreds, Nothing) -> + fromcreds $ fromB64 bcreds + Nothing -> return Nothing + fromcreds creds = case decodeCredPair creds of + Just credpair -> do + writeCacheCredPair credpair storage + return $ Just credpair + _ -> error "bad creds" + +{- Gets a CredPair from the environment. -} +getEnvCredPair :: CredPairStorage -> IO (Maybe CredPair) +getEnvCredPair storage = liftM2 (,) + <$> getEnv uenv + <*> getEnv penv + where + (uenv, penv) = credPairEnvironment storage + +writeCacheCredPair :: CredPair -> CredPairStorage -> Annex () +writeCacheCredPair credpair storage = + writeCacheCreds (encodeCredPair credpair) (credPairFile storage) + +{- Stores the creds in a file inside gitAnnexCredsDir that only the user + - can read. -} +writeCacheCreds :: Creds -> FilePath -> Annex () +writeCacheCreds creds file = do + d <- fromRepo gitAnnexCredsDir + createAnnexDirectory d + liftIO $ writeFileProtected (d file) creds + +readCacheCredPair :: CredPairStorage -> Annex (Maybe CredPair) +readCacheCredPair storage = maybe Nothing decodeCredPair + <$> readCacheCreds (credPairFile storage) + +readCacheCreds :: FilePath -> Annex (Maybe Creds) +readCacheCreds file = do + d <- fromRepo gitAnnexCredsDir + let f = d file + liftIO $ catchMaybeIO $ readFile f + +encodeCredPair :: CredPair -> Creds +encodeCredPair (l, p) = unlines [l, p] + +decodeCredPair :: Creds -> Maybe CredPair +decodeCredPair creds = case lines creds of + l:p:[] -> Just (l, p) + _ -> Nothing + +removeCreds :: FilePath -> Annex () +removeCreds file = do + d <- fromRepo gitAnnexCredsDir + let f = d file + liftIO $ nukeFile f diff --git a/Crypto.hs b/Crypto.hs new file mode 100644 index 000000000..f3a9e3957 --- /dev/null +++ b/Crypto.hs @@ -0,0 +1,217 @@ +{- git-annex crypto + - + - Currently using gpg; could later be modified to support different + - crypto backends if neccessary. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE FlexibleInstances #-} + +module Crypto ( + Cipher, + KeyIds(..), + StorableCipher(..), + genEncryptedCipher, + genSharedCipher, + updateEncryptedCipher, + describeCipher, + decryptCipher, + encryptKey, + feedFile, + feedBytes, + readBytes, + encrypt, + decrypt, + getGpgEncParams, + + prop_HmacSha1WithCipher_sane +) where + +import qualified Data.ByteString.Lazy as L +import Data.ByteString.Lazy.UTF8 (fromString) +import Control.Applicative +import qualified Data.Map as M + +import Common.Annex +import qualified Utility.Gpg as Gpg +import Types.Key +import Types.Crypto +import Types.Remote + +{- The beginning of a Cipher is used for MAC'ing; the remainder is used + - as the GPG symmetric encryption passphrase when using the hybrid + - scheme. Note that the cipher itself is base-64 encoded, hence the + - string is longer than 'cipherSize': 683 characters, padded to 684. + - + - The 256 first characters that feed the MAC represent at best 192 + - bytes of entropy. However that's more than enough for both the + - default MAC algorithm, namely HMAC-SHA1, and the "strongest" + - currently supported, namely HMAC-SHA512, which respectively need + - (ideally) 64 and 128 bytes of entropy. + - + - The remaining characters (320 bytes of entropy) is enough for GnuPG's + - symetric cipher; unlike weaker public key crypto, the key does not + - need to be too large. + -} +cipherBeginning :: Int +cipherBeginning = 256 + +cipherSize :: Int +cipherSize = 512 + +cipherPassphrase :: Cipher -> String +cipherPassphrase (Cipher c) = drop cipherBeginning c +cipherPassphrase (MacOnlyCipher _) = error "MAC-only cipher" + +cipherMac :: Cipher -> String +cipherMac (Cipher c) = take cipherBeginning c +cipherMac (MacOnlyCipher c) = c + +{- Creates a new Cipher, encrypted to the specified key id. -} +genEncryptedCipher :: String -> EncryptedCipherVariant -> Bool -> IO StorableCipher +genEncryptedCipher keyid variant highQuality = do + ks <- Gpg.findPubKeys keyid + random <- Gpg.genRandom highQuality size + encryptCipher (mkCipher random) variant ks + where + (mkCipher, size) = case variant of + Hybrid -> (Cipher, cipherSize) -- used for MAC + symmetric + PubKey -> (MacOnlyCipher, cipherBeginning) -- only used for MAC + +{- Creates a new, shared Cipher. -} +genSharedCipher :: Bool -> IO StorableCipher +genSharedCipher highQuality = + SharedCipher <$> Gpg.genRandom highQuality cipherSize + +{- Updates an existing Cipher, re-encrypting it to add or remove keyids, + - depending on whether the first component is True or False. -} +updateEncryptedCipher :: [(Bool, String)] -> StorableCipher -> IO StorableCipher +updateEncryptedCipher _ SharedCipher{} = undefined +updateEncryptedCipher [] encipher = return encipher +updateEncryptedCipher newkeys encipher@(EncryptedCipher _ variant (KeyIds ks)) = do + dropKeys <- listKeyIds [ k | (False, k) <- newkeys ] + forM_ dropKeys $ \k -> unless (k `elem` ks) $ + error $ "Key " ++ k ++ " was not present; cannot remove." + addKeys <- listKeyIds [ k | (True, k) <- newkeys ] + let ks' = (addKeys ++ ks) \\ dropKeys + when (null ks') $ + error "Cannot remove the last key." + cipher <- decryptCipher encipher + encryptCipher cipher variant $ KeyIds ks' + where + listKeyIds = concat <$$> mapM (keyIds <$$> Gpg.findPubKeys) + +describeCipher :: StorableCipher -> String +describeCipher (SharedCipher _) = "shared cipher" +describeCipher (EncryptedCipher _ variant (KeyIds ks)) = + scheme ++ " with gpg " ++ keys ks ++ " " ++ unwords ks + where + scheme = case variant of + Hybrid -> "hybrid cipher" + PubKey -> "pubkey crypto" + keys [_] = "key" + keys _ = "keys" + +{- Encrypts a Cipher to the specified KeyIds. -} +encryptCipher :: Cipher -> EncryptedCipherVariant -> KeyIds -> IO StorableCipher +encryptCipher c variant (KeyIds ks) = do + -- gpg complains about duplicate recipient keyids + let ks' = nub $ sort ks + let params = Gpg.pkEncTo ks' ++ Gpg.stdEncryptionParams False + encipher <- Gpg.pipeStrict params cipher + return $ EncryptedCipher encipher variant (KeyIds ks') + where + cipher = case c of + Cipher x -> x + MacOnlyCipher x -> x + +{- Decrypting an EncryptedCipher is expensive; the Cipher should be cached. -} +decryptCipher :: StorableCipher -> IO Cipher +decryptCipher (SharedCipher t) = return $ Cipher t +decryptCipher (EncryptedCipher t variant _) = + mkCipher <$> Gpg.pipeStrict [ Param "--decrypt" ] t + where + mkCipher = case variant of + Hybrid -> Cipher + PubKey -> MacOnlyCipher + +{- Generates an encrypted form of a Key. The encryption does not need to be + - reversable, nor does it need to be the same type of encryption used + - on content. It does need to be repeatable. -} +encryptKey :: Mac -> Cipher -> Key -> Key +encryptKey mac c k = Key + { keyName = macWithCipher mac c (key2file k) + , keyBackendName = "GPG" ++ showMac mac + , keySize = Nothing -- size and mtime omitted + , keyMtime = Nothing -- to avoid leaking data + } + +type Feeder = Handle -> IO () +type Reader a = Handle -> IO a + +feedFile :: FilePath -> Feeder +feedFile f h = L.hPut h =<< L.readFile f + +feedBytes :: L.ByteString -> Feeder +feedBytes = flip L.hPut + +readBytes :: (L.ByteString -> IO a) -> Reader a +readBytes a h = L.hGetContents h >>= a + +{- Runs a Feeder action, that generates content that is symmetrically + - encrypted with the Cipher (unless it is empty, in which case + - public-key encryption is used) using the given gpg options, and then + - read by the Reader action. Note: For public-key encryption, + - recipients MUST be included in 'params' (for instance using + - 'getGpgEncParams'). -} +encrypt :: [CommandParam] -> Cipher -> Feeder -> Reader a -> IO a +encrypt params cipher = case cipher of + Cipher{} -> Gpg.feedRead (params ++ Gpg.stdEncryptionParams True) $ + cipherPassphrase cipher + MacOnlyCipher{} -> Gpg.pipeLazy $ params ++ Gpg.stdEncryptionParams False + +{- Runs a Feeder action, that generates content that is decrypted with the + - Cipher (or using a private key if the Cipher is empty), and read by the + - Reader action. -} +decrypt :: Cipher -> Feeder -> Reader a -> IO a +decrypt cipher = case cipher of + Cipher{} -> Gpg.feedRead [Param "--decrypt"] $ cipherPassphrase cipher + MacOnlyCipher{} -> Gpg.pipeLazy [Param "--decrypt"] + +macWithCipher :: Mac -> Cipher -> String -> String +macWithCipher mac c = macWithCipher' mac (cipherMac c) +macWithCipher' :: Mac -> String -> String -> String +macWithCipher' mac c s = calcMac mac (fromString c) (fromString s) + +{- Ensure that macWithCipher' returns the same thing forevermore. -} +prop_HmacSha1WithCipher_sane :: Bool +prop_HmacSha1WithCipher_sane = known_good == macWithCipher' HmacSha1 "foo" "bar" + where + known_good = "46b4ec586117154dacd49d664e5d63fdc88efb51" + +{- Return some options suitable for GnuPG encryption, symmetric or not. -} +class LensGpgEncParams a where getGpgEncParams :: a -> [CommandParam] + +{- Extract the GnuPG options from a pair of a Remote Config and a Remote + - Git Config. -} +instance LensGpgEncParams (RemoteConfig, RemoteGitConfig) where + getGpgEncParams (c,gc) = map Param (remoteAnnexGnupgOptions gc) ++ getGpgEncParams c + where + +{- Extract the GnuPG options from a Remote Config, ignoring any + - git config settings. (Which is ok if the remote is just being set up + - and so doesn't have any.) + - + - If the remote is configured to use public-key encryption, + - look up the recipient keys and add them to the option list.-} +instance LensGpgEncParams RemoteConfig where + getGpgEncParams c = case M.lookup "encryption" c of + Just "pubkey" -> Gpg.pkEncTo $ maybe [] (split ",") $ M.lookup "cipherkeys" c + _ -> [] + +{- Extract the GnuPG options from a Remote. -} +instance LensGpgEncParams (RemoteA a) where + getGpgEncParams r = getGpgEncParams (config r, gitconfig r) diff --git a/Git.hs b/Git.hs new file mode 100644 index 000000000..55b44a925 --- /dev/null +++ b/Git.hs @@ -0,0 +1,141 @@ +{- git repository handling + - + - This is written to be completely independant of git-annex and should be + - suitable for other uses. + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git ( + Repo(..), + Ref(..), + fromRef, + Branch, + Sha, + Tag, + repoIsUrl, + repoIsSsh, + repoIsHttp, + repoIsLocal, + repoIsLocalBare, + repoIsLocalUnknown, + repoDescribe, + repoLocation, + repoPath, + localGitDir, + attributes, + hookPath, + assertLocal, +) where + +import Network.URI (uriPath, uriScheme, unEscapeString) +#ifndef mingw32_HOST_OS +import System.Posix.Files +#endif + +import Common +import Git.Types +#ifndef mingw32_HOST_OS +import Utility.FileMode +#endif + +{- User-visible description of a git repo. -} +repoDescribe :: Repo -> String +repoDescribe Repo { remoteName = Just name } = name +repoDescribe Repo { location = Url url } = show url +repoDescribe Repo { location = Local { worktree = Just dir } } = dir +repoDescribe Repo { location = Local { gitdir = dir } } = dir +repoDescribe Repo { location = LocalUnknown dir } = dir +repoDescribe Repo { location = Unknown } = "UNKNOWN" + +{- Location of the repo, either as a path or url. -} +repoLocation :: Repo -> String +repoLocation Repo { location = Url url } = show url +repoLocation Repo { location = Local { worktree = Just dir } } = dir +repoLocation Repo { location = Local { gitdir = dir } } = dir +repoLocation Repo { location = LocalUnknown dir } = dir +repoLocation Repo { location = Unknown } = undefined + +{- Path to a repository. For non-bare, this is the worktree, for bare, + - it's the gitdir, and for URL repositories, is the path on the remote + - host. -} +repoPath :: Repo -> FilePath +repoPath Repo { location = Url u } = unEscapeString $ uriPath u +repoPath Repo { location = Local { worktree = Just d } } = d +repoPath Repo { location = Local { gitdir = d } } = d +repoPath Repo { location = LocalUnknown dir } = dir +repoPath Repo { location = Unknown } = undefined + +{- Path to a local repository's .git directory. -} +localGitDir :: Repo -> FilePath +localGitDir Repo { location = Local { gitdir = d } } = d +localGitDir _ = undefined + +{- Some code needs to vary between URL and normal repos, + - or bare and non-bare, these functions help with that. -} +repoIsUrl :: Repo -> Bool +repoIsUrl Repo { location = Url _ } = True +repoIsUrl _ = False + +repoIsSsh :: Repo -> Bool +repoIsSsh Repo { location = Url url } + | scheme == "ssh:" = True + -- git treats these the same as ssh + | scheme == "git+ssh:" = True + | scheme == "ssh+git:" = True + | otherwise = False + where + scheme = uriScheme url +repoIsSsh _ = False + +repoIsHttp :: Repo -> Bool +repoIsHttp Repo { location = Url url } + | uriScheme url == "http:" = True + | uriScheme url == "https:" = True + | otherwise = False +repoIsHttp _ = False + +repoIsLocal :: Repo -> Bool +repoIsLocal Repo { location = Local { } } = True +repoIsLocal _ = False + +repoIsLocalBare :: Repo -> Bool +repoIsLocalBare Repo { location = Local { worktree = Nothing } } = True +repoIsLocalBare _ = False + +repoIsLocalUnknown :: Repo -> Bool +repoIsLocalUnknown Repo { location = LocalUnknown { } } = True +repoIsLocalUnknown _ = False + +assertLocal :: Repo -> a -> a +assertLocal repo action + | repoIsUrl repo = error $ unwords + [ "acting on non-local git repo" + , repoDescribe repo + , "not supported" + ] + | otherwise = action + +{- Path to a repository's gitattributes file. -} +attributes :: Repo -> FilePath +attributes repo + | repoIsLocalBare repo = repoPath repo ++ "/info/.gitattributes" + | otherwise = repoPath repo ++ "/.gitattributes" + +{- Path to a given hook script in a repository, only if the hook exists + - and is executable. -} +hookPath :: String -> Repo -> IO (Maybe FilePath) +hookPath script repo = do + let hook = localGitDir repo "hooks" script + ifM (catchBoolIO $ isexecutable hook) + ( return $ Just hook , return Nothing ) + where +#if mingw32_HOST_OS + isexecutable f = doesFileExist f +#else + isexecutable f = isExecutable . fileMode <$> getFileStatus f +#endif diff --git a/Git/AutoCorrect.hs b/Git/AutoCorrect.hs new file mode 100644 index 000000000..aa8379849 --- /dev/null +++ b/Git/AutoCorrect.hs @@ -0,0 +1,71 @@ +{- git autocorrection using Damerau-Levenshtein edit distance + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.AutoCorrect where + +import Common +import Git.Types +import qualified Git.Config + +import Text.EditDistance +import Control.Concurrent + +{- These are the same cost values as used in git. -} +gitEditCosts :: EditCosts +gitEditCosts = EditCosts + { deletionCosts = ConstantCost 4 + , insertionCosts = ConstantCost 1 + , substitutionCosts = ConstantCost 2 + , transpositionCosts = ConstantCost 0 + } + +{- Git's source calls this "an empirically derived magic number" -} +similarityFloor :: Int +similarityFloor = 7 + +{- Finds inexact matches for the input among the choices. + - Returns an ordered list of good enough matches, or an empty list if + - nothing matches well. -} +fuzzymatches :: String -> (c -> String) -> [c] -> [c] +fuzzymatches input showchoice choices = fst $ unzip $ + sortBy comparecost $ filter similarEnough $ zip choices costs + where + distance = restrictedDamerauLevenshteinDistance gitEditCosts input + costs = map (distance . showchoice) choices + comparecost a b = compare (snd a) (snd b) + similarEnough (_, cst) = cst < similarityFloor + +{- Takes action based on git's autocorrect configuration, in preparation for + - an autocorrected command being run. -} +prepare :: String -> (c -> String) -> [c] -> Repo -> IO () +prepare input showmatch matches r = + case readish $ Git.Config.get "help.autocorrect" "0" r of + Just n + | n == 0 -> list + | n < 0 -> warn + | otherwise -> sleep n + Nothing -> list + where + list = error $ unlines $ + [ "Unknown command '" ++ input ++ "'" + , "" + , "Did you mean one of these?" + ] ++ map (\m -> "\t" ++ showmatch m) matches + warn = + hPutStr stderr $ unlines + [ "WARNING: You called a command named '" ++ + input ++ "', which does not exist." + , "Continuing under the assumption that you meant '" ++ + showmatch (Prelude.head matches) ++ "'" + ] + sleep n = do + warn + hPutStrLn stderr $ unwords + [ "in" + , show (fromIntegral n / 10 :: Float) + , "seconds automatically..."] + threadDelay (n * 100000) -- deciseconds to microseconds diff --git a/Git/Branch.hs b/Git/Branch.hs new file mode 100644 index 000000000..0b7d888b8 --- /dev/null +++ b/Git/Branch.hs @@ -0,0 +1,195 @@ +{- git branch stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Git.Branch where + +import Common +import Git +import Git.Sha +import Git.Command +import qualified Git.Ref +import qualified Git.BuildVersion + +{- The currently checked out branch. + - + - In a just initialized git repo before the first commit, + - symbolic-ref will show the master branch, even though that + - branch is not created yet. So, this also looks at show-ref HEAD + - to double-check. + -} +current :: Repo -> IO (Maybe Git.Ref) +current r = do + v <- currentUnsafe r + case v of + Nothing -> return Nothing + Just branch -> + ifM (null <$> pipeReadStrict [Param "show-ref", Param $ fromRef branch] r) + ( return Nothing + , return v + ) + +{- The current branch, which may not really exist yet. -} +currentUnsafe :: Repo -> IO (Maybe Git.Ref) +currentUnsafe r = parse . firstLine + <$> pipeReadStrict [Param "symbolic-ref", Param $ fromRef Git.Ref.headRef] r + where + parse l + | null l = Nothing + | otherwise = Just $ Git.Ref l + +{- Checks if the second branch has any commits not present on the first + - branch. -} +changed :: Branch -> Branch -> Repo -> IO Bool +changed origbranch newbranch repo + | origbranch == newbranch = return False + | otherwise = not . null <$> diffs + where + diffs = pipeReadStrict + [ Param "log" + , Param (fromRef origbranch ++ ".." ++ fromRef newbranch) + , Param "-n1" + , Param "--pretty=%H" + ] repo + +{- Check if it's possible to fast-forward from the old + - ref to the new ref. + - + - This requires there to be a path from the old to the new. -} +fastForwardable :: Ref -> Ref -> Repo -> IO Bool +fastForwardable old new repo = not . null <$> + pipeReadStrict + [ Param "log" + , Param $ fromRef old ++ ".." ++ fromRef new + , Param "-n1" + , Param "--pretty=%H" + , Param "--ancestry-path" + ] repo + +{- Given a set of refs that are all known to have commits not + - on the branch, tries to update the branch by a fast-forward. + - + - In order for that to be possible, one of the refs must contain + - every commit present in all the other refs. + -} +fastForward :: Branch -> [Ref] -> Repo -> IO Bool +fastForward _ [] _ = return True +fastForward branch (first:rest) repo = + -- First, check that the branch does not contain any + -- new commits that are not in the first ref. If it does, + -- cannot fast-forward. + ifM (changed first branch repo) + ( no_ff + , maybe no_ff do_ff =<< findbest first rest + ) + where + no_ff = return False + do_ff to = do + update branch to repo + return True + findbest c [] = return $ Just c + findbest c (r:rs) + | c == r = findbest c rs + | otherwise = do + better <- changed c r repo + worse <- changed r c repo + case (better, worse) of + (True, True) -> return Nothing -- divergent fail + (True, False) -> findbest r rs -- better + (False, True) -> findbest c rs -- worse + (False, False) -> findbest c rs -- same + +{- The user may have set commit.gpgsign, indending all their manual + - commits to be signed. But signing automatic/background commits could + - easily lead to unwanted gpg prompts or failures. + -} +data CommitMode = ManualCommit | AutomaticCommit + deriving (Eq) + +applyCommitMode :: CommitMode -> [CommandParam] -> [CommandParam] +applyCommitMode commitmode ps + | commitmode == AutomaticCommit && not (Git.BuildVersion.older "2.0.0") = + Param "--no-gpg-sign" : ps + | otherwise = ps + +{- Commit via the usual git command. -} +commitCommand :: CommitMode -> [CommandParam] -> Repo -> IO Bool +commitCommand = commitCommand' runBool + +{- Commit will fail when the tree is clean. This suppresses that error. -} +commitQuiet :: CommitMode -> [CommandParam] -> Repo -> IO () +commitQuiet commitmode ps = void . tryIO . commitCommand' runQuiet commitmode ps + +commitCommand' :: ([CommandParam] -> Repo -> IO a) -> CommitMode -> [CommandParam] -> Repo -> IO a +commitCommand' runner commitmode ps = runner $ + Param "commit" : applyCommitMode commitmode ps + +{- Commits the index into the specified branch (or other ref), + - with the specified parent refs, and returns the committed sha. + - + - Without allowempy set, avoids making a commit if there is exactly + - one parent, and it has the same tree that would be committed. + - + - Unlike git-commit, does not run any hooks, or examine the work tree + - in any way. + -} +commit :: CommitMode -> Bool -> String -> Branch -> [Ref] -> Repo -> IO (Maybe Sha) +commit commitmode allowempty message branch parentrefs repo = do + tree <- getSha "write-tree" $ + pipeReadStrict [Param "write-tree"] repo + ifM (cancommit tree) + ( do + sha <- getSha "commit-tree" $ + pipeWriteRead ([Param "commit-tree", Param (fromRef tree)] ++ ps) sendmsg repo + update branch sha repo + return $ Just sha + , return Nothing + ) + where + ps = applyCommitMode commitmode $ + map Param $ concatMap (\r -> ["-p", fromRef r]) parentrefs + cancommit tree + | allowempty = return True + | otherwise = case parentrefs of + [p] -> maybe False (tree /=) <$> Git.Ref.tree p repo + _ -> return True + sendmsg = Just $ flip hPutStr message + +commitAlways :: CommitMode -> String -> Branch -> [Ref] -> Repo -> IO Sha +commitAlways commitmode message branch parentrefs repo = fromJust + <$> commit commitmode True message branch parentrefs repo + +{- A leading + makes git-push force pushing a branch. -} +forcePush :: String -> String +forcePush b = "+" ++ b + +{- Updates a branch (or other ref) to a new Sha. -} +update :: Branch -> Sha -> Repo -> IO () +update branch sha = run + [ Param "update-ref" + , Param $ fromRef branch + , Param $ fromRef sha + ] + +{- Checks out a branch, creating it if necessary. -} +checkout :: Branch -> Repo -> IO () +checkout branch = run + [ Param "checkout" + , Param "-q" + , Param "-B" + , Param $ fromRef $ Git.Ref.base branch + ] + +{- Removes a branch. -} +delete :: Branch -> Repo -> IO () +delete branch = run + [ Param "branch" + , Param "-q" + , Param "-D" + , Param $ fromRef $ Git.Ref.base branch + ] diff --git a/Git/BuildVersion.hs b/Git/BuildVersion.hs new file mode 100644 index 000000000..832ee8ab7 --- /dev/null +++ b/Git/BuildVersion.hs @@ -0,0 +1,21 @@ +{- git build version + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.BuildVersion where + +import Git.Version +import qualified Build.SysConfig + +{- Using the version it was configured for avoids running git to check its + - version, at the cost that upgrading git won't be noticed. + - This is only acceptable because it's rare that git's version influences + - code's behavior. -} +buildVersion :: GitVersion +buildVersion = normalize Build.SysConfig.gitversion + +older :: String -> Bool +older n = buildVersion < normalize n diff --git a/Git/CatFile.hs b/Git/CatFile.hs new file mode 100644 index 000000000..8e64fc558 --- /dev/null +++ b/Git/CatFile.hs @@ -0,0 +1,113 @@ +{- git cat-file interface + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CatFile ( + CatFileHandle, + catFileStart, + catFileStart', + catFileStop, + catFile, + catFileDetails, + catTree, + catObject, + catObjectDetails, +) where + +import System.IO +import qualified Data.ByteString as S +import qualified Data.ByteString.Lazy as L +import Data.Tuple.Utils +import Numeric +import System.Posix.Types + +import Common +import Git +import Git.Sha +import Git.Command +import Git.Types +import Git.FilePath +import qualified Utility.CoProcess as CoProcess + +data CatFileHandle = CatFileHandle CoProcess.CoProcessHandle Repo + +catFileStart :: Repo -> IO CatFileHandle +catFileStart = catFileStart' True + +catFileStart' :: Bool -> Repo -> IO CatFileHandle +catFileStart' restartable repo = do + coprocess <- CoProcess.rawMode =<< gitCoProcessStart restartable + [ Param "cat-file" + , Param "--batch" + ] repo + return $ CatFileHandle coprocess repo + +catFileStop :: CatFileHandle -> IO () +catFileStop (CatFileHandle p _) = CoProcess.stop p + +{- Reads a file from a specified branch. -} +catFile :: CatFileHandle -> Branch -> FilePath -> IO L.ByteString +catFile h branch file = catObject h $ Ref $ + fromRef branch ++ ":" ++ toInternalGitPath file + +catFileDetails :: CatFileHandle -> Branch -> FilePath -> IO (Maybe (L.ByteString, Sha, ObjectType)) +catFileDetails h branch file = catObjectDetails h $ Ref $ + fromRef branch ++ ":" ++ toInternalGitPath file + +{- Uses a running git cat-file read the content of an object. + - Objects that do not exist will have "" returned. -} +catObject :: CatFileHandle -> Ref -> IO L.ByteString +catObject h object = maybe L.empty fst3 <$> catObjectDetails h object + +catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha, ObjectType)) +catObjectDetails (CatFileHandle hdl _) object = CoProcess.query hdl send receive + where + query = fromRef object + send to = hPutStrLn to query + receive from = do + header <- hGetLine from + case words header of + [sha, objtype, size] + | length sha == shaSize -> + case (readObjectType objtype, reads size) of + (Just t, [(bytes, "")]) -> readcontent t bytes from sha + _ -> dne + | otherwise -> dne + _ + | header == fromRef object ++ " missing" -> dne + | otherwise -> error $ "unknown response from git cat-file " ++ show (header, query) + readcontent objtype bytes from sha = do + content <- S.hGet from bytes + eatchar '\n' from + return $ Just (L.fromChunks [content], Ref sha, objtype) + dne = return Nothing + eatchar expected from = do + c <- hGetChar from + when (c /= expected) $ + error $ "missing " ++ (show expected) ++ " from git cat-file" + +{- Gets a list of files and directories in a tree. (Not recursive.) -} +catTree :: CatFileHandle -> Ref -> IO [(FilePath, FileMode)] +catTree h treeref = go <$> catObjectDetails h treeref + where + go (Just (b, _, TreeObject)) = parsetree [] b + go _ = [] + + parsetree c b = case L.break (== 0) b of + (modefile, rest) + | L.null modefile -> c + | otherwise -> parsetree + (parsemodefile modefile:c) + (dropsha rest) + + -- these 20 bytes after the NUL hold the file's sha + -- TODO: convert from raw form to regular sha + dropsha = L.drop 21 + + parsemodefile b = + let (modestr, file) = separate (== ' ') (decodeBS b) + in (file, readmode modestr) + readmode = fst . fromMaybe (0, undefined) . headMaybe . readOct diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs new file mode 100644 index 000000000..6b5e3bf62 --- /dev/null +++ b/Git/CheckAttr.hs @@ -0,0 +1,93 @@ +{- git check-attr interface + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CheckAttr where + +import Common +import Git +import Git.Command +import qualified Git.BuildVersion +import qualified Utility.CoProcess as CoProcess + +import System.IO.Error + +type CheckAttrHandle = (CoProcess.CoProcessHandle, [Attr], String) + +type Attr = String + +{- Starts git check-attr running to look up the specified gitattributes + - values and returns a handle. -} +checkAttrStart :: [Attr] -> Repo -> IO CheckAttrHandle +checkAttrStart attrs repo = do + currdir <- getCurrentDirectory + h <- CoProcess.rawMode =<< gitCoProcessStart True params repo + return (h, attrs, currdir) + where + params = + [ Param "check-attr" + , Params "-z --stdin" + ] ++ map Param attrs ++ + [ Param "--" ] + +checkAttrStop :: CheckAttrHandle -> IO () +checkAttrStop (h, _, _) = CoProcess.stop h + +{- Gets an attribute of a file. -} +checkAttr :: CheckAttrHandle -> Attr -> FilePath -> IO String +checkAttr (h, attrs, currdir) want file = do + pairs <- CoProcess.query h send (receive "") + let vals = map snd $ filter (\(attr, _) -> attr == want) pairs + case vals of + [v] -> return v + _ -> error $ "unable to determine " ++ want ++ " attribute of " ++ file + where + send to = hPutStr to $ file' ++ "\0" + receive c from = do + s <- hGetSomeString from 1024 + if null s + then eofError + else do + let v = c ++ s + maybe (receive v from) return (parse v) + eofError = ioError $ mkIOError userErrorType "git check-attr EOF" Nothing Nothing + parse s + -- new null separated output + | '\0' `elem` s = if "\0" `isSuffixOf` s + then + let bits = segment (== '\0') s + in if length bits == (numattrs * 3) + 1 + then Just $ getattrvalues bits [] + else Nothing -- more attributes to come + else Nothing -- output incomplete + -- old one line per value output + | otherwise = if "\n" `isSuffixOf` s + then + let ls = lines s + in if length ls == numattrs + then Just $ map (\(attr, val) -> (attr, oldattrvalue attr val)) + (zip attrs ls) + else Nothing -- more attributes to come + else Nothing -- line incomplete + numattrs = length attrs + + {- Before git 1.7.7, git check-attr worked best with + - absolute filenames; using them worked around some bugs + - with relative filenames. + - + - With newer git, git check-attr chokes on some absolute + - filenames, and the bugs that necessitated them were fixed, + - so use relative filenames. -} + oldgit = Git.BuildVersion.older "1.7.7" + file' + | oldgit = absPathFrom currdir file + | otherwise = relPathDirToFile currdir $ absPathFrom currdir file + oldattrvalue attr l = end bits !! 0 + where + bits = split sep l + sep = ": " ++ attr ++ ": " + getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c) + getattrvalues _ c = c diff --git a/Git/CheckIgnore.hs b/Git/CheckIgnore.hs new file mode 100644 index 000000000..2ab7cb3dc --- /dev/null +++ b/Git/CheckIgnore.hs @@ -0,0 +1,71 @@ +{- git check-ignore interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CheckIgnore ( + CheckIgnoreHandle, + checkIgnoreStart, + checkIgnoreStop, + checkIgnored +) where + +import Common +import Git +import Git.Command +import qualified Git.Version +import qualified Utility.CoProcess as CoProcess + +import System.IO.Error + +type CheckIgnoreHandle = CoProcess.CoProcessHandle + +{- Starts git check-ignore running, and returns a handle. + - + - This relies on git check-ignore --non-matching -v outputting + - lines for both matching an non-matching files. Also relies on + - GIT_FLUSH behavior flushing the output buffer when git check-ignore + - is piping to us. + - + - The first version of git to support what we need is 1.8.4. + - Nothing is returned if an older git is installed. + -} +checkIgnoreStart :: Repo -> IO (Maybe CheckIgnoreHandle) +checkIgnoreStart repo = ifM supportedGitVersion + ( Just <$> (CoProcess.rawMode =<< gitCoProcessStart True params repo) + , return Nothing + ) + where + params = + [ Param "check-ignore" + , Params "-z --stdin --verbose --non-matching" + ] + +supportedGitVersion :: IO Bool +supportedGitVersion = do + v <- Git.Version.installed + return $ v >= Git.Version.normalize "1.8.4" + +checkIgnoreStop :: CheckIgnoreHandle -> IO () +checkIgnoreStop = CoProcess.stop + +{- Returns True if a file is ignored. -} +checkIgnored :: CheckIgnoreHandle -> FilePath -> IO Bool +checkIgnored h file = CoProcess.query h send (receive "") + where + send to = do + hPutStr to $ file ++ "\0" + hFlush to + receive c from = do + s <- hGetSomeString from 1024 + if null s + then eofError + else do + let v = c ++ s + maybe (receive v from) return (parse v) + parse s = case segment (== '\0') s of + (_source:_line:pattern:_pathname:_eol:[]) -> Just $ not $ null pattern + _ -> Nothing + eofError = ioError $ mkIOError userErrorType "git cat-file EOF" Nothing Nothing diff --git a/Git/Command.hs b/Git/Command.hs new file mode 100644 index 000000000..30d2dcbf9 --- /dev/null +++ b/Git/Command.hs @@ -0,0 +1,128 @@ +{- running git commands + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Command where + +import Common +import Git +import Git.Types +import qualified Utility.CoProcess as CoProcess + +{- Constructs a git command line operating on the specified repo. -} +gitCommandLine :: [CommandParam] -> Repo -> [CommandParam] +gitCommandLine params r@(Repo { location = l@(Local _ _ ) }) = + setdir : settree ++ gitGlobalOpts r ++ params + where + setdir = Param $ "--git-dir=" ++ gitdir l + settree = case worktree l of + Nothing -> [] + Just t -> [Param $ "--work-tree=" ++ t] +gitCommandLine _ repo = assertLocal repo $ error "internal" + +{- Runs git in the specified repo. -} +runBool :: [CommandParam] -> Repo -> IO Bool +runBool params repo = assertLocal repo $ + boolSystemEnv "git" (gitCommandLine params repo) (gitEnv repo) + +{- Runs git in the specified repo, throwing an error if it fails. -} +run :: [CommandParam] -> Repo -> IO () +run params repo = assertLocal repo $ + unlessM (runBool params repo) $ + error $ "git " ++ show params ++ " failed" + +{- Runs git and forces it to be quiet, throwing an error if it fails. -} +runQuiet :: [CommandParam] -> Repo -> IO () +runQuiet params repo = withQuietOutput createProcessSuccess $ + (proc "git" $ toCommand $ gitCommandLine (params) repo) + { env = gitEnv repo } + +{- Runs a git command and returns its output, lazily. + - + - Also returns an action that should be used when the output is all + - read (or no more is needed), that will wait on the command, and + - return True if it succeeded. Failure to wait will result in zombies. + -} +pipeReadLazy :: [CommandParam] -> Repo -> IO (String, IO Bool) +pipeReadLazy params repo = assertLocal repo $ do + (_, Just h, _, pid) <- createProcess p { std_out = CreatePipe } + fileEncoding h + c <- hGetContents h + return (c, checkSuccessProcess pid) + where + p = gitCreateProcess params repo + +{- Runs a git command, and returns its output, strictly. + - + - Nonzero exit status is ignored. + -} +pipeReadStrict :: [CommandParam] -> Repo -> IO String +pipeReadStrict params repo = assertLocal repo $ + withHandle StdoutHandle (createProcessChecked ignoreFailureProcess) p $ \h -> do + fileEncoding h + output <- hGetContentsStrict h + hClose h + return output + where + p = gitCreateProcess params repo + +{- Runs a git command, feeding it an input, and returning its output, + - which is expected to be fairly small, since it's all read into memory + - strictly. -} +pipeWriteRead :: [CommandParam] -> Maybe (Handle -> IO ()) -> Repo -> IO String +pipeWriteRead params writer repo = assertLocal repo $ + writeReadProcessEnv "git" (toCommand $ gitCommandLine params repo) + (gitEnv repo) writer (Just adjusthandle) + where + adjusthandle h = do + fileEncoding h + hSetNewlineMode h noNewlineTranslation + +{- Runs a git command, feeding it input on a handle with an action. -} +pipeWrite :: [CommandParam] -> Repo -> (Handle -> IO ()) -> IO () +pipeWrite params repo = withHandle StdinHandle createProcessSuccess $ + gitCreateProcess params repo + +{- Reads null terminated output of a git command (as enabled by the -z + - parameter), and splits it. -} +pipeNullSplit :: [CommandParam] -> Repo -> IO ([String], IO Bool) +pipeNullSplit params repo = do + (s, cleanup) <- pipeReadLazy params repo + return (filter (not . null) $ split sep s, cleanup) + where + sep = "\0" + +pipeNullSplitStrict :: [CommandParam] -> Repo -> IO [String] +pipeNullSplitStrict params repo = do + s <- pipeReadStrict params repo + return $ filter (not . null) $ split sep s + where + sep = "\0" + +pipeNullSplitZombie :: [CommandParam] -> Repo -> IO [String] +pipeNullSplitZombie params repo = leaveZombie <$> pipeNullSplit params repo + +{- Doesn't run the cleanup action. A zombie results. -} +leaveZombie :: (a, IO Bool) -> a +leaveZombie = fst + +{- Runs a git command as a coprocess. -} +gitCoProcessStart :: Bool -> [CommandParam] -> Repo -> IO CoProcess.CoProcessHandle +gitCoProcessStart restartable params repo = CoProcess.start numrestarts "git" + (toCommand $ gitCommandLine params repo) + (gitEnv repo) + where + {- If a long-running git command like cat-file --batch + - crashes, it will likely start up again ok. If it keeps crashing + - 10 times, something is badly wrong. -} + numrestarts = if restartable then 10 else 0 + +gitCreateProcess :: [CommandParam] -> Repo -> CreateProcess +gitCreateProcess params repo = + (proc "git" $ toCommand $ gitCommandLine params repo) + { env = gitEnv repo } diff --git a/Git/Command/Batch.hs b/Git/Command/Batch.hs new file mode 100644 index 000000000..9cc176008 --- /dev/null +++ b/Git/Command/Batch.hs @@ -0,0 +1,19 @@ +{- running batch git commands + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Command.Batch where + +import Common +import Git +import Git.Command +import Utility.Batch + +{- Runs git in batch mode. -} +run :: BatchCommandMaker -> [CommandParam] -> Repo -> IO Bool +run batchmaker params repo = assertLocal repo $ do + let (cmd, params') = batchmaker ("git", gitCommandLine params repo) + boolSystemEnv cmd params' (gitEnv repo) diff --git a/Git/Config.hs b/Git/Config.hs new file mode 100644 index 000000000..d998fd1e2 --- /dev/null +++ b/Git/Config.hs @@ -0,0 +1,197 @@ +{- git repository configuration handling + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Config where + +import qualified Data.Map as M +import Data.Char +import Control.Exception.Extensible + +import Common +import Git +import Git.Types +import qualified Git.Construct +import Utility.UserInfo + +{- Returns a single git config setting, or a default value if not set. -} +get :: String -> String -> Repo -> String +get key defaultValue repo = M.findWithDefault defaultValue key (config repo) + +{- Returns a list with each line of a multiline config setting. -} +getList :: String -> Repo -> [String] +getList key repo = M.findWithDefault [] key (fullconfig repo) + +{- Returns a single git config setting, if set. -} +getMaybe :: String -> Repo -> Maybe String +getMaybe key repo = M.lookup key (config repo) + +{- Runs git config and populates a repo with its config. + - Avoids re-reading config when run repeatedly. -} +read :: Repo -> IO Repo +read repo@(Repo { config = c }) + | c == M.empty = read' repo + | otherwise = return repo + +{- Reads config even if it was read before. -} +reRead :: Repo -> IO Repo +reRead r = read' $ r + { config = M.empty + , fullconfig = M.empty + } + +{- Cannot use pipeRead because it relies on the config having been already + - read. Instead, chdir to the repo and run git config. + -} +read' :: Repo -> IO Repo +read' repo = go repo + where + go Repo { location = Local { gitdir = d } } = git_config d + go Repo { location = LocalUnknown d } = git_config d + go _ = assertLocal repo $ error "internal" + git_config d = withHandle StdoutHandle createProcessSuccess p $ + hRead repo + where + params = ["config", "--null", "--list"] + p = (proc "git" params) + { cwd = Just d + , env = gitEnv repo + } + +{- Gets the global git config, returning a dummy Repo containing it. -} +global :: IO (Maybe Repo) +global = do + home <- myHomeDir + ifM (doesFileExist $ home ".gitconfig") + ( do + repo <- Git.Construct.fromUnknown + repo' <- withHandle StdoutHandle createProcessSuccess p $ + hRead repo + return $ Just repo' + , return Nothing + ) + where + params = ["config", "--null", "--list", "--global"] + p = (proc "git" params) + +{- Reads git config from a handle and populates a repo with it. -} +hRead :: Repo -> Handle -> IO Repo +hRead repo h = do + -- We use the FileSystemEncoding when reading from git-config, + -- because it can contain arbitrary filepaths (and other strings) + -- in any encoding. + fileEncoding h + val <- hGetContentsStrict h + store val repo + +{- Stores a git config into a Repo, returning the new version of the Repo. + - The git config may be multiple lines, or a single line. + - Config settings can be updated incrementally. + -} +store :: String -> Repo -> IO Repo +store s repo = do + let c = parse s + repo' <- updateLocation $ repo + { config = (M.map Prelude.head c) `M.union` config repo + , fullconfig = M.unionWith (++) c (fullconfig repo) + } + rs <- Git.Construct.fromRemotes repo' + return $ repo' { remotes = rs } + +{- Updates the location of a repo, based on its configuration. + - + - Git.Construct makes LocalUknown repos, of which only a directory is + - known. Once the config is read, this can be fixed up to a Local repo, + - based on the core.bare and core.worktree settings. + -} +updateLocation :: Repo -> IO Repo +updateLocation r@(Repo { location = LocalUnknown d }) + | isBare r = ifM (doesDirectoryExist dotgit) + ( updateLocation' r $ Local dotgit Nothing + , updateLocation' r $ Local d Nothing + ) + | otherwise = updateLocation' r $ Local dotgit (Just d) + where + dotgit = (d ".git") +updateLocation r@(Repo { location = l@(Local {}) }) = updateLocation' r l +updateLocation r = return r + +updateLocation' :: Repo -> RepoLocation -> IO Repo +updateLocation' r l = do + l' <- case getMaybe "core.worktree" r of + Nothing -> return l + Just d -> do + {- core.worktree is relative to the gitdir -} + top <- absPath $ gitdir l + return $ l { worktree = Just $ absPathFrom top d } + return $ r { location = l' } + +{- Parses git config --list or git config --null --list output into a + - config map. -} +parse :: String -> M.Map String [String] +parse [] = M.empty +parse s + -- --list output will have an = in the first line + | all ('=' `elem`) (take 1 ls) = sep '=' ls + -- --null --list output separates keys from values with newlines + | otherwise = sep '\n' $ split "\0" s + where + ls = lines s + sep c = M.fromListWith (++) . map (\(k,v) -> (k, [v])) . + map (separate (== c)) + +{- Checks if a string from git config is a true value. -} +isTrue :: String -> Maybe Bool +isTrue s + | s' == "true" = Just True + | s' == "false" = Just False + | otherwise = Nothing + where + s' = map toLower s + +boolConfig :: Bool -> String +boolConfig True = "true" +boolConfig False = "false" + +isBare :: Repo -> Bool +isBare r = fromMaybe False $ isTrue =<< getMaybe coreBare r + +coreBare :: String +coreBare = "core.bare" + +{- Runs a command to get the configuration of a repo, + - and returns a repo populated with the configuration, as well as the raw + - output of the command. -} +fromPipe :: Repo -> String -> [CommandParam] -> IO (Either SomeException (Repo, String)) +fromPipe r cmd params = try $ + withHandle StdoutHandle createProcessSuccess p $ \h -> do + fileEncoding h + val <- hGetContentsStrict h + r' <- store val r + return (r', val) + where + p = proc cmd $ toCommand params + +{- Reads git config from a specified file and returns the repo populated + - with the configuration. -} +fromFile :: Repo -> FilePath -> IO (Either SomeException (Repo, String)) +fromFile r f = fromPipe r "git" + [ Param "config" + , Param "--file" + , File f + , Param "--list" + ] + +{- Changes a git config setting in the specified config file. + - (Creates the file if it does not already exist.) -} +changeFile :: FilePath -> String -> String -> IO Bool +changeFile f k v = boolSystem "git" + [ Param "config" + , Param "--file" + , File f + , Param k + , Param v + ] diff --git a/Git/Construct.hs b/Git/Construct.hs new file mode 100644 index 000000000..eed2b9930 --- /dev/null +++ b/Git/Construct.hs @@ -0,0 +1,237 @@ +{- Construction of Git Repo objects + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Construct ( + fromCwd, + fromAbsPath, + fromPath, + fromUrl, + fromUnknown, + localToUrl, + remoteNamed, + remoteNamedFromKey, + fromRemotes, + fromRemoteLocation, + repoAbsPath, + newFrom, + checkForRepo, +) where + +#ifndef mingw32_HOST_OS +import System.Posix.User +#endif +import qualified Data.Map as M hiding (map, split) +import Network.URI + +import Common +import Git.Types +import Git +import Git.Remote +import Git.FilePath +import qualified Git.Url as Url +import Utility.UserInfo + +{- Finds the git repository used for the cwd, which may be in a parent + - directory. -} +fromCwd :: IO (Maybe Repo) +fromCwd = getCurrentDirectory >>= seekUp + where + seekUp dir = do + r <- checkForRepo dir + case r of + Nothing -> case parentDir dir of + "" -> return Nothing + d -> seekUp d + Just loc -> Just <$> newFrom loc + +{- Local Repo constructor, accepts a relative or absolute path. -} +fromPath :: FilePath -> IO Repo +fromPath dir = fromAbsPath =<< absPath dir + +{- Local Repo constructor, requires an absolute path to the repo be + - specified. -} +fromAbsPath :: FilePath -> IO Repo +fromAbsPath dir + | absoluteGitPath dir = ifM (doesDirectoryExist dir') ( ret dir' , hunt ) + | otherwise = + error $ "internal error, " ++ dir ++ " is not absolute" + where + ret = newFrom . LocalUnknown + {- Git always looks for "dir.git" in preference to + - to "dir", even if dir ends in a "/". -} + canondir = dropTrailingPathSeparator dir + dir' = canondir ++ ".git" + {- When dir == "foo/.git", git looks for "foo/.git/.git", + - and failing that, uses "foo" as the repository. -} + hunt + | (pathSeparator:".git") `isSuffixOf` canondir = + ifM (doesDirectoryExist $ dir ".git") + ( ret dir + , ret $ takeDirectory canondir + ) + | otherwise = ret dir + +{- Remote Repo constructor. Throws exception on invalid url. + - + - Git is somewhat forgiving about urls to repositories, allowing + - eg spaces that are not normally allowed unescaped in urls. + -} +fromUrl :: String -> IO Repo +fromUrl url + | not (isURI url) = fromUrlStrict $ escapeURIString isUnescapedInURI url + | otherwise = fromUrlStrict url + +fromUrlStrict :: String -> IO Repo +fromUrlStrict url + | startswith "file://" url = fromAbsPath $ unEscapeString $ uriPath u + | otherwise = newFrom $ Url u + where + u = fromMaybe bad $ parseURI url + bad = error $ "bad url " ++ url + +{- Creates a repo that has an unknown location. -} +fromUnknown :: IO Repo +fromUnknown = newFrom Unknown + +{- Converts a local Repo into a remote repo, using the reference repo + - which is assumed to be on the same host. -} +localToUrl :: Repo -> Repo -> Repo +localToUrl reference r + | not $ repoIsUrl reference = error "internal error; reference repo not url" + | repoIsUrl r = r + | otherwise = case Url.authority reference of + Nothing -> r + Just auth -> + let absurl = concat + [ Url.scheme reference + , "//" + , auth + , repoPath r + ] + in r { location = Url $ fromJust $ parseURI absurl } + +{- Calculates a list of a repo's configured remotes, by parsing its config. -} +fromRemotes :: Repo -> IO [Repo] +fromRemotes repo = mapM construct remotepairs + where + filterconfig f = filter f $ M.toList $ config repo + filterkeys f = filterconfig (\(k,_) -> f k) + remotepairs = filterkeys isremote + isremote k = startswith "remote." k && endswith ".url" k + construct (k,v) = remoteNamedFromKey k $ fromRemoteLocation v repo + +{- Sets the name of a remote when constructing the Repo to represent it. -} +remoteNamed :: String -> IO Repo -> IO Repo +remoteNamed n constructor = do + r <- constructor + return $ r { remoteName = Just n } + +{- Sets the name of a remote based on the git config key, such as + - "remote.foo.url". -} +remoteNamedFromKey :: String -> IO Repo -> IO Repo +remoteNamedFromKey k = remoteNamed basename + where + basename = intercalate "." $ + reverse $ drop 1 $ reverse $ drop 1 $ split "." k + +{- Constructs a new Repo for one of a Repo's remotes using a given + - location (ie, an url). -} +fromRemoteLocation :: String -> Repo -> IO Repo +fromRemoteLocation s repo = gen $ parseRemoteLocation s repo + where + gen (RemotePath p) = fromRemotePath p repo + gen (RemoteUrl u) = fromUrl u + +{- Constructs a Repo from the path specified in the git remotes of + - another Repo. -} +fromRemotePath :: FilePath -> Repo -> IO Repo +fromRemotePath dir repo = do + dir' <- expandTilde dir + fromAbsPath $ repoPath repo dir' + +{- Git remotes can have a directory that is specified relative + - to the user's home directory, or that contains tilde expansions. + - This converts such a directory to an absolute path. + - Note that it has to run on the system where the remote is. + -} +repoAbsPath :: FilePath -> IO FilePath +repoAbsPath d = do + d' <- expandTilde d + h <- myHomeDir + return $ h d' + +expandTilde :: FilePath -> IO FilePath +#ifdef mingw32_HOST_OS +expandTilde = return +#else +expandTilde = expandt True + where + expandt _ [] = return "" + expandt _ ('/':cs) = do + v <- expandt True cs + return ('/':v) + expandt True ('~':'/':cs) = do + h <- myHomeDir + return $ h cs + expandt True ('~':cs) = do + let (name, rest) = findname "" cs + u <- getUserEntryForName name + return $ homeDirectory u rest + expandt _ (c:cs) = do + v <- expandt False cs + return (c:v) + findname n [] = (n, "") + findname n (c:cs) + | c == '/' = (n, cs) + | otherwise = findname (n++[c]) cs +#endif + +{- Checks if a git repository exists in a directory. Does not find + - git repositories in parent directories. -} +checkForRepo :: FilePath -> IO (Maybe RepoLocation) +checkForRepo dir = + check isRepo $ + check gitDirFile $ + check isBareRepo $ + return Nothing + where + check test cont = maybe cont (return . Just) =<< test + checkdir c = ifM c + ( return $ Just $ LocalUnknown dir + , return Nothing + ) + isRepo = checkdir $ gitSignature $ ".git" "config" + isBareRepo = checkdir $ gitSignature "config" + <&&> doesDirectoryExist (dir "objects") + gitDirFile = do + c <- firstLine <$> + catchDefaultIO "" (readFile $ dir ".git") + return $ if gitdirprefix `isPrefixOf` c + then Just $ Local + { gitdir = absPathFrom dir $ + drop (length gitdirprefix) c + , worktree = Just dir + } + else Nothing + where + gitdirprefix = "gitdir: " + gitSignature file = doesFileExist $ dir file + +newFrom :: RepoLocation -> IO Repo +newFrom l = return Repo + { location = l + , config = M.empty + , fullconfig = M.empty + , remotes = [] + , remoteName = Nothing + , gitEnv = Nothing + , gitGlobalOpts = [] + } + + diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs new file mode 100644 index 000000000..23ebbbcad --- /dev/null +++ b/Git/CurrentRepo.hs @@ -0,0 +1,67 @@ +{- The current git repository. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.CurrentRepo where + +import Common +import Git.Types +import Git.Construct +import qualified Git.Config +#ifndef mingw32_HOST_OS +import Utility.Env +#endif + +{- Gets the current git repository. + - + - Honors GIT_DIR and GIT_WORK_TREE. + - Both environment variables are unset, to avoid confusing other git + - commands that also look at them. Instead, the Git module passes + - --work-tree and --git-dir to git commands it runs. + - + - When GIT_WORK_TREE or core.worktree are set, changes the working + - directory if necessary to ensure it is within the repository's work + - tree. While not needed for git commands, this is useful for anything + - else that looks for files in the worktree. + -} +get :: IO Repo +get = do + gd <- pathenv "GIT_DIR" + r <- configure gd =<< fromCwd + wt <- maybe (worktree $ location r) Just <$> pathenv "GIT_WORK_TREE" + case wt of + Nothing -> return r + Just d -> do + curr <- getCurrentDirectory + unless (d `dirContains` curr) $ + setCurrentDirectory d + return $ addworktree wt r + where +#ifndef mingw32_HOST_OS + pathenv s = do + v <- getEnv s + case v of + Just d -> do + void $ unsetEnv s + Just <$> absPath d + Nothing -> return Nothing +#else + pathenv _ = return Nothing +#endif + + configure Nothing (Just r) = Git.Config.read r + configure (Just d) _ = do + absd <- absPath d + curr <- getCurrentDirectory + r <- newFrom $ Local { gitdir = absd, worktree = Just curr } + Git.Config.read r + configure Nothing Nothing = error "Not in a git repository." + + addworktree w r = changelocation r $ + Local { gitdir = gitdir (location r), worktree = w } + changelocation r l = r { location = l } diff --git a/Git/DiffTree.hs b/Git/DiffTree.hs new file mode 100644 index 000000000..59de60871 --- /dev/null +++ b/Git/DiffTree.hs @@ -0,0 +1,102 @@ +{- git diff-tree interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.DiffTree ( + DiffTreeItem(..), + diffTree, + diffTreeRecursive, + diffIndex, + diffWorkTree, +) where + +import Numeric +import System.Posix.Types + +import Common +import Git +import Git.Sha +import Git.Command +import Git.FilePath +import qualified Git.Filename +import qualified Git.Ref + +data DiffTreeItem = DiffTreeItem + { srcmode :: FileMode + , dstmode :: FileMode + , srcsha :: Sha -- nullSha if file was added + , dstsha :: Sha -- nullSha if file was deleted + , status :: String + , file :: TopFilePath + } deriving Show + +{- Diffs two tree Refs. -} +diffTree :: Ref -> Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffTree src dst = getdiff (Param "diff-tree") + [Param (fromRef src), Param (fromRef dst)] + +{- Diffs two tree Refs, recursing into sub-trees -} +diffTreeRecursive :: Ref -> Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffTreeRecursive src dst = getdiff (Param "diff-tree") + [Param "-r", Param (fromRef src), Param (fromRef dst)] + +{- Diffs between a tree and the index. Does nothing if there is not yet a + - commit in the repository. -} +diffIndex :: Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffIndex ref = diffIndex' ref [Param "--cached"] + +{- Diffs between a tree and the working tree. Does nothing if there is not + - yet a commit in the repository, or if the repository is bare. -} +diffWorkTree :: Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffWorkTree ref repo = + ifM (Git.Ref.headExists repo) + ( diffIndex' ref [] repo + , return ([], return True) + ) + +diffIndex' :: Ref -> [CommandParam] -> Repo -> IO ([DiffTreeItem], IO Bool) +diffIndex' ref params repo = + ifM (Git.Ref.headExists repo) + ( getdiff (Param "diff-index") + ( params ++ [Param $ fromRef ref] ) + repo + , return ([], return True) + ) + +getdiff :: CommandParam -> [CommandParam] -> Repo -> IO ([DiffTreeItem], IO Bool) +getdiff command params repo = do + (diff, cleanup) <- pipeNullSplit ps repo + return (parseDiffTree diff, cleanup) + where + ps = command : Params "-z --raw --no-renames -l0" : params + +{- Parses diff-tree output. -} +parseDiffTree :: [String] -> [DiffTreeItem] +parseDiffTree l = go l [] + where + go [] c = c + go (info:f:rest) c = go rest (mk info f : c) + go (s:[]) _ = error $ "diff-tree parse error " ++ s + + mk info f = DiffTreeItem + { srcmode = readmode srcm + , dstmode = readmode dstm + , srcsha = fromMaybe (error "bad srcsha") $ extractSha ssha + , dstsha = fromMaybe (error "bad dstsha") $ extractSha dsha + , status = s + , file = asTopFilePath $ fromInternalGitPath $ Git.Filename.decode f + } + where + readmode = fst . Prelude.head . readOct + + -- info = : SP SP SP SP + -- All fields are fixed, so we can pull them out of + -- specific positions in the line. + (srcm, past_srcm) = splitAt 7 $ drop 1 info + (dstm, past_dstm) = splitAt 7 past_srcm + (ssha, past_ssha) = splitAt shaSize past_dstm + (dsha, past_dsha) = splitAt shaSize $ drop 1 past_ssha + s = drop 1 past_dsha diff --git a/Git/FileMode.hs b/Git/FileMode.hs new file mode 100644 index 000000000..fc4d0264e --- /dev/null +++ b/Git/FileMode.hs @@ -0,0 +1,23 @@ +{- git file modes + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.FileMode where + +import Utility.FileMode + +import System.PosixCompat.Types + +symLinkMode :: FileMode +symLinkMode = 40960 + +{- Git uses a special file mode to indicate a symlink. This is the case + - even on Windows, so we hard code the valuse here, rather than using + - System.Posix.Files.symbolicLinkMode. -} +isSymLink :: FileMode -> Bool +isSymLink = checkMode symLinkMode diff --git a/Git/FilePath.hs b/Git/FilePath.hs new file mode 100644 index 000000000..42eb0812e --- /dev/null +++ b/Git/FilePath.hs @@ -0,0 +1,78 @@ +{- git FilePath library + - + - Different git commands use different types of FilePaths to refer to + - files in the repository. Some commands use paths relative to the + - top of the repository even when run in a subdirectory. Adding some + - types helps keep that straight. + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.FilePath ( + TopFilePath, + fromTopFilePath, + getTopFilePath, + toTopFilePath, + asTopFilePath, + InternalGitPath, + toInternalGitPath, + fromInternalGitPath, + absoluteGitPath +) where + +import Common +import Git + +import qualified System.FilePath.Posix + +{- A FilePath, relative to the top of the git repository. -} +newtype TopFilePath = TopFilePath { getTopFilePath :: FilePath } + deriving (Show) + +{- Returns an absolute FilePath. -} +fromTopFilePath :: TopFilePath -> Git.Repo -> FilePath +fromTopFilePath p repo = absPathFrom (repoPath repo) (getTopFilePath p) + +{- The input FilePath can be absolute, or relative to the CWD. -} +toTopFilePath :: FilePath -> Git.Repo -> IO TopFilePath +toTopFilePath file repo = TopFilePath <$> + relPathDirToFile (repoPath repo) <$> absPath file + +{- The input FilePath must already be relative to the top of the git + - repository -} +asTopFilePath :: FilePath -> TopFilePath +asTopFilePath file = TopFilePath file + +{- Git may use a different representation of a path when storing + - it internally. + - + - On Windows, git uses '/' to separate paths stored in the repository, + - despite Windows using '\'. + - + -} +type InternalGitPath = String + +toInternalGitPath :: FilePath -> InternalGitPath +#ifndef mingw32_HOST_OS +toInternalGitPath = id +#else +toInternalGitPath = replace "\\" "/" +#endif + +fromInternalGitPath :: InternalGitPath -> FilePath +#ifndef mingw32_HOST_OS +fromInternalGitPath = id +#else +fromInternalGitPath = replace "/" "\\" +#endif + +{- isAbsolute on Windows does not think "/foo" or "\foo" is absolute, + - so try posix paths. + -} +absoluteGitPath :: FilePath -> Bool +absoluteGitPath p = isAbsolute p || + System.FilePath.Posix.isAbsolute (toInternalGitPath p) diff --git a/Git/Filename.hs b/Git/Filename.hs new file mode 100644 index 000000000..5e076d3b5 --- /dev/null +++ b/Git/Filename.hs @@ -0,0 +1,28 @@ +{- Some git commands output encoded filenames, in a rather annoyingly complex + - C-style encoding. + - + - Copyright 2010, 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Filename where + +import Utility.Format (decode_c, encode_c) + +import Common + +decode :: String -> FilePath +decode [] = [] +decode f@(c:s) + -- encoded strings will be inside double quotes + | c == '"' && end s == ['"'] = decode_c $ beginning s + | otherwise = f + +{- Should not need to use this, except for testing decode. -} +encode :: FilePath -> String +encode s = "\"" ++ encode_c s ++ "\"" + +{- for quickcheck -} +prop_idempotent_deencode :: String -> Bool +prop_idempotent_deencode s = s == decode (encode s) diff --git a/Git/Fsck.hs b/Git/Fsck.hs new file mode 100644 index 000000000..c6002f681 --- /dev/null +++ b/Git/Fsck.hs @@ -0,0 +1,117 @@ +{- git fsck interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Fsck ( + FsckResults(..), + MissingObjects, + findBroken, + foundBroken, + findMissing, + isMissing, + knownMissing, +) where + +import Common +import Git +import Git.Command +import Git.Sha +import Utility.Batch +import qualified Git.Version + +import qualified Data.Set as S +import Control.Concurrent.Async + +type MissingObjects = S.Set Sha + +data FsckResults + = FsckFoundMissing + { missingObjects :: MissingObjects + , missingObjectsTruncated :: Bool + } + | FsckFailed + deriving (Show) + +{- Runs fsck to find some of the broken objects in the repository. + - May not find all broken objects, if fsck fails on bad data in some of + - the broken objects it does find. + - + - Strategy: Rather than parsing fsck's current specific output, + - look for anything in its output (both stdout and stderr) that appears + - to be a git sha. Not all such shas are of broken objects, so ask git + - to try to cat the object, and see if it fails. + -} +findBroken :: Bool -> Repo -> IO FsckResults +findBroken batchmode r = do + supportsNoDangling <- (>= Git.Version.normalize "1.7.10") + <$> Git.Version.installed + let (command, params) = ("git", fsckParams supportsNoDangling r) + (command', params') <- if batchmode + then toBatchCommand (command, params) + else return (command, params) + + p@(_, _, _, pid) <- createProcess $ + (proc command' (toCommand params')) + { std_out = CreatePipe + , std_err = CreatePipe + } + (bad1, bad2) <- concurrently + (readMissingObjs maxobjs r supportsNoDangling (stdoutHandle p)) + (readMissingObjs maxobjs r supportsNoDangling (stderrHandle p)) + fsckok <- checkSuccessProcess pid + let truncated = S.size bad1 == maxobjs || S.size bad1 == maxobjs + let badobjs = S.union bad1 bad2 + + if S.null badobjs && not fsckok + then return FsckFailed + else return $ FsckFoundMissing badobjs truncated + where + maxobjs = 10000 + +foundBroken :: FsckResults -> Bool +foundBroken FsckFailed = True +foundBroken (FsckFoundMissing s _) = not (S.null s) + +knownMissing :: FsckResults -> MissingObjects +knownMissing FsckFailed = S.empty +knownMissing (FsckFoundMissing s _) = s + +{- Finds objects that are missing from the git repsitory, or are corrupt. + - + - This does not use git cat-file --batch, because catting a corrupt + - object can cause it to crash, or to report incorrect size information. + -} +findMissing :: [Sha] -> Repo -> IO MissingObjects +findMissing objs r = S.fromList <$> filterM (`isMissing` r) objs + +readMissingObjs :: Int -> Repo -> Bool -> Handle -> IO MissingObjects +readMissingObjs maxobjs r supportsNoDangling h = do + objs <- take maxobjs . findShas supportsNoDangling <$> hGetContents h + findMissing objs r + +isMissing :: Sha -> Repo -> IO Bool +isMissing s r = either (const True) (const False) <$> tryIO dump + where + dump = runQuiet + [ Param "show" + , Param (fromRef s) + ] r + +findShas :: Bool -> String -> [Sha] +findShas supportsNoDangling = catMaybes . map extractSha . concat . map words . filter wanted . lines + where + wanted l + | supportsNoDangling = True + | otherwise = not ("dangling " `isPrefixOf` l) + +fsckParams :: Bool -> Repo -> [CommandParam] +fsckParams supportsNoDangling = gitCommandLine $ map Param $ catMaybes + [ Just "fsck" + , if supportsNoDangling + then Just "--no-dangling" + else Nothing + , Just "--no-reflogs" + ] diff --git a/Git/GCrypt.hs b/Git/GCrypt.hs new file mode 100644 index 000000000..c2a5a98fe --- /dev/null +++ b/Git/GCrypt.hs @@ -0,0 +1,109 @@ +{- git-remote-gcrypt support + - + - https://github.com/blake2-ppc/git-remote-gcrypt + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.GCrypt where + +import Common +import Git.Types +import Git.Construct +import qualified Git.Config as Config +import qualified Git.Command as Command +import Utility.Gpg + +urlScheme :: String +urlScheme = "gcrypt:" + +urlPrefix :: String +urlPrefix = urlScheme ++ ":" + +isEncrypted :: Repo -> Bool +isEncrypted Repo { location = Url url } = urlPrefix `isPrefixOf` show url +isEncrypted _ = False + +{- The first Repo is the git repository that has the second Repo + - as one of its remotes. + - + - When the remote Repo uses gcrypt, returns the actual underlying + - git repository that gcrypt is using to store its data. + - + - Throws an exception if an url is invalid or the repo does not use + - gcrypt. + -} +encryptedRemote :: Repo -> Repo -> IO Repo +encryptedRemote baserepo = go + where + go Repo { location = Url url } + | urlPrefix `isPrefixOf` u = + fromRemoteLocation (drop plen u) baserepo + | otherwise = notencrypted + where + u = show url + plen = length urlPrefix + go _ = notencrypted + notencrypted = error "not a gcrypt encrypted repository" + +data ProbeResult = Decryptable | NotDecryptable | NotEncrypted + +{- Checks if the git repo at a location uses gcrypt. + - + - Rather expensive -- many need to fetch the entire repo contents. + - (Which is fine if the repo is going to be added as a remote..) + -} +probeRepo :: String -> Repo -> IO ProbeResult +probeRepo loc baserepo = do + let p = proc "git" $ toCommand $ Command.gitCommandLine + [ Param "remote-gcrypt" + , Param "--check" + , Param loc + ] baserepo + (_, _, _, pid) <- createProcess p + code <- waitForProcess pid + return $ case code of + ExitSuccess -> Decryptable + ExitFailure 1 -> NotDecryptable + ExitFailure _ -> NotEncrypted + +type GCryptId = String + +{- gcrypt gives each encrypted repository a uique gcrypt-id, + - which is stored in the repository (in encrypted form) + - and cached in a per-remote gcrypt-id configuration setting. -} +remoteRepoId :: Repo -> Maybe RemoteName -> Maybe GCryptId +remoteRepoId = getRemoteConfig "gcrypt-id" + +getRemoteConfig :: String -> Repo -> Maybe RemoteName -> Maybe String +getRemoteConfig field repo remotename = do + n <- remotename + Config.getMaybe (remoteConfigKey field n) repo + +{- Gpg keys that the remote is encrypted for. + - If empty, gcrypt uses --default-recipient-self -} +getParticiantList :: Maybe Repo -> Repo -> Maybe RemoteName -> KeyIds +getParticiantList globalconfigrepo repo remotename = KeyIds $ parse $ firstJust + [ getRemoteConfig "gcrypt-participants" repo remotename + , Config.getMaybe defaultkey repo + , Config.getMaybe defaultkey =<< globalconfigrepo + ] + where + defaultkey = "gcrypt.participants" + parse (Just "simple") = [] + parse (Just l) = words l + parse Nothing = [] + +remoteParticipantConfigKey :: RemoteName -> String +remoteParticipantConfigKey = remoteConfigKey "gcrypt-participants" + +remotePublishParticipantConfigKey :: RemoteName -> String +remotePublishParticipantConfigKey = remoteConfigKey "gcrypt-publish-participants" + +remoteSigningKey :: RemoteName -> String +remoteSigningKey = remoteConfigKey "gcrypt-signingkey" + +remoteConfigKey :: String -> RemoteName -> String +remoteConfigKey key remotename = "remote." ++ remotename ++ "." ++ key diff --git a/Git/HashObject.hs b/Git/HashObject.hs new file mode 100644 index 000000000..97e1befe6 --- /dev/null +++ b/Git/HashObject.hs @@ -0,0 +1,58 @@ +{- git hash-object interface + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.HashObject where + +import Common +import Git +import Git.Sha +import Git.Command +import Git.Types +import qualified Utility.CoProcess as CoProcess +import Utility.Tmp + +type HashObjectHandle = CoProcess.CoProcessHandle + +hashObjectStart :: Repo -> IO HashObjectHandle +hashObjectStart = CoProcess.rawMode <=< gitCoProcessStart True + [ Param "hash-object" + , Param "-w" + , Param "--stdin-paths" + , Param "--no-filters" + ] + +hashObjectStop :: HashObjectHandle -> IO () +hashObjectStop = CoProcess.stop + +{- Injects a file into git, returning the Sha of the object. -} +hashFile :: HashObjectHandle -> FilePath -> IO Sha +hashFile h file = CoProcess.query h send receive + where + send to = hPutStrLn to file + receive from = getSha "hash-object" $ hGetLine from + +{- Injects a blob into git. Unfortunately, the current git-hash-object + - interface does not allow batch hashing without using temp files. -} +hashBlob :: HashObjectHandle -> String -> IO Sha +hashBlob h s = withTmpFile "hash" $ \tmp tmph -> do + hPutStr tmph s + hClose tmph + hashFile h tmp + +{- Injects some content into git, returning its Sha. + - + - Avoids using a tmp file, but runs a new hash-object command each + - time called. -} +hashObject :: ObjectType -> String -> Repo -> IO Sha +hashObject objtype content = hashObject' objtype (flip hPutStr content) + +hashObject' :: ObjectType -> (Handle -> IO ()) -> Repo -> IO Sha +hashObject' objtype writer repo = getSha subcmd $ + pipeWriteRead (map Param params) (Just writer) repo + where + subcmd = "hash-object" + params = [subcmd, "-t", show objtype, "-w", "--stdin", "--no-filters"] diff --git a/Git/Hook.hs b/Git/Hook.hs new file mode 100644 index 000000000..6245a292d --- /dev/null +++ b/Git/Hook.hs @@ -0,0 +1,58 @@ +{- git hooks + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Hook where + +import Common +import Git +import Utility.Tmp + +data Hook = Hook + { hookName :: FilePath + , hookScript :: String + } + deriving (Ord) + +instance Eq Hook where + a == b = hookName a == hookName b + +hookFile :: Hook -> Repo -> FilePath +hookFile h r = localGitDir r "hooks" hookName h + +{- Writes a hook. Returns False if the hook already exists with a different + - content. -} +hookWrite :: Hook -> Repo -> IO Bool +hookWrite h r = do + let f = hookFile h r + ifM (doesFileExist f) + ( expectedContent h r + , do + viaTmp writeFile f (hookScript h) + p <- getPermissions f + setPermissions f $ p {executable = True} + return True + ) + +{- Removes a hook. Returns False if the hook contained something else, and + - could not be removed. -} +hookUnWrite :: Hook -> Repo -> IO Bool +hookUnWrite h r = do + let f = hookFile h r + ifM (doesFileExist f) + ( ifM (expectedContent h r) + ( do + removeFile f + return True + , return False + ) + , return True + ) + +expectedContent :: Hook -> Repo -> IO Bool +expectedContent h r = do + content <- readFile $ hookFile h r + return $ content == hookScript h diff --git a/Git/Index.hs b/Git/Index.hs new file mode 100644 index 000000000..d712245a8 --- /dev/null +++ b/Git/Index.hs @@ -0,0 +1,36 @@ +{- git index file stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Index where + +import Common +import Git +import Utility.Env + +{- Forces git to use the specified index file. + - + - Returns an action that will reset back to the default + - index file. + - + - Warning: Not thread safe. + -} +override :: FilePath -> IO (IO ()) +override index = do + res <- getEnv var + void $ setEnv var index True + return $ void $ reset res + where + var = "GIT_INDEX_FILE" + reset (Just v) = setEnv var v True + reset _ = unsetEnv var + +indexFile :: Repo -> FilePath +indexFile r = localGitDir r "index" + +{- Git locks the index by creating this file. -} +indexFileLock :: Repo -> FilePath +indexFileLock r = indexFile r ++ ".lock" diff --git a/Git/LsFiles.hs b/Git/LsFiles.hs new file mode 100644 index 000000000..2aa05ba7f --- /dev/null +++ b/Git/LsFiles.hs @@ -0,0 +1,215 @@ +{- git ls-files interface + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.LsFiles ( + inRepo, + notInRepo, + allFiles, + deleted, + modified, + modifiedOthers, + staged, + stagedNotDeleted, + stagedOthersDetails, + stagedDetails, + typeChanged, + typeChangedStaged, + Conflicting(..), + Unmerged(..), + unmerged, + StagedDetails, +) where + +import Common +import Git +import Git.Command +import Git.Types +import Git.Sha + +import Numeric +import System.Posix.Types + +{- Scans for files that are checked into git at the specified locations. -} +inRepo :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +inRepo l = pipeNullSplit $ Params "ls-files --cached -z --" : map File l + +{- Scans for files at the specified locations that are not checked into git. -} +notInRepo :: Bool -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +notInRepo include_ignored l repo = pipeNullSplit params repo + where + params = [Params "ls-files --others"] ++ exclude ++ + [Params "-z --"] ++ map File l + exclude + | include_ignored = [] + | otherwise = [Param "--exclude-standard"] + +{- Finds all files in the specified locations, whether checked into git or + - not. -} +allFiles :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +allFiles l = pipeNullSplit $ Params "ls-files --cached --others -z --" : map File l + +{- Returns a list of files in the specified locations that have been + - deleted. -} +deleted :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +deleted l repo = pipeNullSplit params repo + where + params = [Params "ls-files --deleted -z --"] ++ map File l + +{- Returns a list of files in the specified locations that have been + - modified. -} +modified :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +modified l repo = pipeNullSplit params repo + where + params = [Params "ls-files --modified -z --"] ++ map File l + +{- Files that have been modified or are not checked into git (and are not + - ignored). -} +modifiedOthers :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +modifiedOthers l repo = pipeNullSplit params repo + where + params = [Params "ls-files --modified --others --exclude-standard -z --"] ++ map File l + +{- Returns a list of all files that are staged for commit. -} +staged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +staged = staged' [] + +{- Returns a list of the files, staged for commit, that are being added, + - moved, or changed (but not deleted), from the specified locations. -} +stagedNotDeleted :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +stagedNotDeleted = staged' [Param "--diff-filter=ACMRT"] + +staged' :: [CommandParam] -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +staged' ps l = pipeNullSplit $ prefix ++ ps ++ suffix + where + prefix = [Params "diff --cached --name-only -z"] + suffix = Param "--" : map File l + +type StagedDetails = (FilePath, Maybe Sha, Maybe FileMode) + +{- Returns details about files that are staged in the index, + - as well as files not yet in git. Skips ignored files. -} +stagedOthersDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedOthersDetails = stagedDetails' [Params "--others --exclude-standard"] + +{- Returns details about all files that are staged in the index. -} +stagedDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedDetails = stagedDetails' [] + +{- Gets details about staged files, including the Sha of their staged + - contents. -} +stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedDetails' ps l repo = do + (ls, cleanup) <- pipeNullSplit params repo + return (map parse ls, cleanup) + where + params = Params "ls-files --stage -z" : ps ++ + Param "--" : map File l + parse s + | null file = (s, Nothing, Nothing) + | otherwise = (file, extractSha $ take shaSize rest, readmode mode) + where + (metadata, file) = separate (== '\t') s + (mode, rest) = separate (== ' ') metadata + readmode = fst <$$> headMaybe . readOct + +{- Returns a list of the files in the specified locations that are staged + - for commit, and whose type has changed. -} +typeChangedStaged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChangedStaged = typeChanged' [Param "--cached"] + +{- Returns a list of the files in the specified locations whose type has + - changed. Files only staged for commit will not be included. -} +typeChanged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChanged = typeChanged' [] + +typeChanged' :: [CommandParam] -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChanged' ps l repo = do + (fs, cleanup) <- pipeNullSplit (prefix ++ ps ++ suffix) repo + -- git diff returns filenames relative to the top of the git repo; + -- convert to filenames relative to the cwd, like git ls-files. + let top = repoPath repo + currdir <- getCurrentDirectory + return (map (\f -> relPathDirToFile currdir $ top f) fs, cleanup) + where + prefix = [Params "diff --name-only --diff-filter=T -z"] + suffix = Param "--" : (if null l then [File "."] else map File l) + +{- A item in conflict has two possible values. + - Either can be Nothing, when that side deleted the file. -} +data Conflicting v = Conflicting + { valUs :: Maybe v + , valThem :: Maybe v + } deriving (Show) + +data Unmerged = Unmerged + { unmergedFile :: FilePath + , unmergedBlobType :: Conflicting BlobType + , unmergedSha :: Conflicting Sha + } deriving (Show) + +{- Returns a list of the files in the specified locations that have + - unresolved merge conflicts. + - + - ls-files outputs multiple lines per conflicting file, each with its own + - stage number: + - 1 = old version, can be ignored + - 2 = us + - 3 = them + - If a line is omitted, that side removed the file. + -} +unmerged :: [FilePath] -> Repo -> IO ([Unmerged], IO Bool) +unmerged l repo = do + (fs, cleanup) <- pipeNullSplit params repo + return (reduceUnmerged [] $ catMaybes $ map parseUnmerged fs, cleanup) + where + params = Params "ls-files --unmerged -z --" : map File l + +data InternalUnmerged = InternalUnmerged + { isus :: Bool + , ifile :: FilePath + , iblobtype :: Maybe BlobType + , isha :: Maybe Sha + } deriving (Show) + +parseUnmerged :: String -> Maybe InternalUnmerged +parseUnmerged s + | null file = Nothing + | otherwise = case words metadata of + (rawblobtype:rawsha:rawstage:_) -> do + stage <- readish rawstage :: Maybe Int + unless (stage == 2 || stage == 3) $ + fail undefined -- skip stage 1 + blobtype <- readBlobType rawblobtype + sha <- extractSha rawsha + return $ InternalUnmerged (stage == 2) file + (Just blobtype) (Just sha) + _ -> Nothing + where + (metadata, file) = separate (== '\t') s + +reduceUnmerged :: [Unmerged] -> [InternalUnmerged] -> [Unmerged] +reduceUnmerged c [] = c +reduceUnmerged c (i:is) = reduceUnmerged (new:c) rest + where + (rest, sibi) = findsib i is + (blobtypeA, blobtypeB, shaA, shaB) + | isus i = (iblobtype i, iblobtype sibi, isha i, isha sibi) + | otherwise = (iblobtype sibi, iblobtype i, isha sibi, isha i) + new = Unmerged + { unmergedFile = ifile i + , unmergedBlobType = Conflicting blobtypeA blobtypeB + , unmergedSha = Conflicting shaA shaB + } + findsib templatei [] = ([], removed templatei) + findsib templatei (l:ls) + | ifile l == ifile templatei = (ls, l) + | otherwise = (l:ls, removed templatei) + removed templatei = templatei + { isus = not (isus templatei) + , iblobtype = Nothing + , isha = Nothing + } diff --git a/Git/LsTree.hs b/Git/LsTree.hs new file mode 100644 index 000000000..6d3ca4813 --- /dev/null +++ b/Git/LsTree.hs @@ -0,0 +1,65 @@ +{- git ls-tree interface + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.LsTree ( + TreeItem(..), + lsTree, + lsTreeParams, + lsTreeFiles, + parseLsTree +) where + +import Numeric +import Control.Applicative +import System.Posix.Types + +import Common +import Git +import Git.Command +import Git.Sha +import Git.FilePath +import qualified Git.Filename + +data TreeItem = TreeItem + { mode :: FileMode + , typeobj :: String + , sha :: String + , file :: TopFilePath + } deriving Show + +{- Lists the complete contents of a tree, recursing into sub-trees, + - with lazy output. -} +lsTree :: Ref -> Repo -> IO [TreeItem] +lsTree t repo = map parseLsTree + <$> pipeNullSplitZombie (lsTreeParams t) repo + +lsTreeParams :: Ref -> [CommandParam] +lsTreeParams t = [ Params "ls-tree --full-tree -z -r --", File $ fromRef t ] + +{- Lists specified files in a tree. -} +lsTreeFiles :: Ref -> [FilePath] -> Repo -> IO [TreeItem] +lsTreeFiles t fs repo = map parseLsTree <$> pipeNullSplitStrict ps repo + where + ps = [Params "ls-tree --full-tree -z --", File $ fromRef t] ++ map File fs + +{- Parses a line of ls-tree output. + - (The --long format is not currently supported.) -} +parseLsTree :: String -> TreeItem +parseLsTree l = TreeItem + { mode = fst $ Prelude.head $ readOct m + , typeobj = t + , sha = s + , file = asTopFilePath $ Git.Filename.decode f + } + where + -- l = SP SP TAB + -- All fields are fixed, so we can pull them out of + -- specific positions in the line. + (m, past_m) = splitAt 7 l + (t, past_t) = splitAt 4 past_m + (s, past_s) = splitAt shaSize $ Prelude.tail past_t + f = Prelude.tail past_s diff --git a/Git/Merge.hs b/Git/Merge.hs new file mode 100644 index 000000000..12dfa7c1f --- /dev/null +++ b/Git/Merge.hs @@ -0,0 +1,38 @@ +{- git merging + - + - Copyright 2012, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Merge where + +import Common +import Git +import Git.Command +import Git.BuildVersion +import Git.Branch (CommitMode(..)) + +{- Avoids recent git's interactive merge. -} +mergeNonInteractive :: Ref -> CommitMode -> Repo -> IO Bool +mergeNonInteractive branch commitmode + | older "1.7.7.6" = merge [Param $ fromRef branch] + | otherwise = merge $ [Param "--no-edit", Param $ fromRef branch] + where + merge ps = runBool $ cp ++ [Param "merge"] ++ ps + cp + | commitmode == AutomaticCommit = + [Param "-c", Param "commit.gpgsign=false"] + | otherwise = [] + +{- Stage the merge into the index, but do not commit it.-} +stageMerge :: Ref -> Repo -> IO Bool +stageMerge branch = runBool + [ Param "merge" + , Param "--quiet" + , Param "--no-commit" + -- Without this, a fast-forward merge is done, since it involves no + -- commit. + , Param "--no-ff" + , Param $ fromRef branch + ] diff --git a/Git/Objects.hs b/Git/Objects.hs new file mode 100644 index 000000000..516aa6d3e --- /dev/null +++ b/Git/Objects.hs @@ -0,0 +1,35 @@ +{- .git/objects + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Objects where + +import Common +import Git +import Git.Sha + +objectsDir :: Repo -> FilePath +objectsDir r = localGitDir r "objects" + +packDir :: Repo -> FilePath +packDir r = objectsDir r "pack" + +packIdxFile :: FilePath -> FilePath +packIdxFile = flip replaceExtension "idx" + +listPackFiles :: Repo -> IO [FilePath] +listPackFiles r = filter (".pack" `isSuffixOf`) + <$> catchDefaultIO [] (dirContents $ packDir r) + +listLooseObjectShas :: Repo -> IO [Sha] +listLooseObjectShas r = catchDefaultIO [] $ + mapMaybe (extractSha . concat . reverse . take 2 . reverse . splitDirectories) + <$> dirContentsRecursiveSkipping (== "pack") True (objectsDir r) + +looseObjectFile :: Repo -> Sha -> FilePath +looseObjectFile r sha = objectsDir r prefix rest + where + (prefix, rest) = splitAt 2 (fromRef sha) diff --git a/Git/Queue.hs b/Git/Queue.hs new file mode 100644 index 000000000..9b87a18ea --- /dev/null +++ b/Git/Queue.hs @@ -0,0 +1,165 @@ +{- git repository command queue + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, BangPatterns #-} + +module Git.Queue ( + Queue, + new, + addCommand, + addUpdateIndex, + size, + full, + flush, +) where + +import Utility.SafeCommand +import Common +import Git +import Git.Command +import qualified Git.UpdateIndex + +import qualified Data.Map as M + +{- Queable actions that can be performed in a git repository. + -} +data Action + {- Updating the index file, using a list of streamers that can + - be added to as the queue grows. -} + = UpdateIndexAction + { getStreamers :: [Git.UpdateIndex.Streamer] -- in reverse order + } + {- A git command to run, on a list of files that can be added to + - as the queue grows. -} + | CommandAction + { getSubcommand :: String + , getParams :: [CommandParam] + , getFiles :: [CommandParam] + } + +{- A key that can uniquely represent an action in a Map. -} +data ActionKey = UpdateIndexActionKey | CommandActionKey String + deriving (Eq, Ord) + +actionKey :: Action -> ActionKey +actionKey (UpdateIndexAction _) = UpdateIndexActionKey +actionKey CommandAction { getSubcommand = s } = CommandActionKey s + +{- A queue of actions to perform (in any order) on a git repository, + - with lists of files to perform them on. This allows coalescing + - similar git commands. -} +data Queue = Queue + { size :: Int + , _limit :: Int + , items :: M.Map ActionKey Action + } + +{- A recommended maximum size for the queue, after which it should be + - run. + - + - 10240 is semi-arbitrary. If we assume git filenames are between 10 and + - 255 characters long, then the queue will build up between 100kb and + - 2550kb long commands. The max command line length on linux is somewhere + - above 20k, so this is a fairly good balance -- the queue will buffer + - only a few megabytes of stuff and a minimal number of commands will be + - run by xargs. -} +defaultLimit :: Int +defaultLimit = 10240 + +{- Constructor for empty queue. -} +new :: Maybe Int -> Queue +new lim = Queue 0 (fromMaybe defaultLimit lim) M.empty + +{- Adds an git command to the queue. + - + - Git commands with the same subcommand but different parameters are + - assumed to be equivilant enough to perform in any order with the same + - result. + -} +addCommand :: String -> [CommandParam] -> [FilePath] -> Queue -> Repo -> IO Queue +addCommand subcommand params files q repo = + updateQueue action different (length files) q repo + where + key = actionKey action + action = CommandAction + { getSubcommand = subcommand + , getParams = params + , getFiles = allfiles + } + allfiles = map File files ++ maybe [] getFiles (M.lookup key $ items q) + + different (CommandAction { getSubcommand = s }) = s /= subcommand + different _ = True + +{- Adds an update-index streamer to the queue. -} +addUpdateIndex :: Git.UpdateIndex.Streamer -> Queue -> Repo -> IO Queue +addUpdateIndex streamer q repo = + updateQueue action different 1 q repo + where + key = actionKey action + -- the list is built in reverse order + action = UpdateIndexAction $ streamer : streamers + streamers = maybe [] getStreamers $ M.lookup key $ items q + + different (UpdateIndexAction _) = False + different _ = True + +{- Updates or adds an action in the queue. If the queue already contains a + - different action, it will be flushed; this is to ensure that conflicting + - actions, like add and rm, are run in the right order.-} +updateQueue :: Action -> (Action -> Bool) -> Int -> Queue -> Repo -> IO Queue +updateQueue !action different sizeincrease q repo + | null (filter different (M.elems (items q))) = return $ go q + | otherwise = go <$> flush q repo + where + go q' = newq + where + !newq = q' + { size = newsize + , items = newitems + } + !newsize = size q' + sizeincrease + !newitems = M.insertWith' const (actionKey action) action (items q') + +{- Is a queue large enough that it should be flushed? -} +full :: Queue -> Bool +full (Queue cur lim _) = cur > lim + +{- Runs a queue on a git repository. -} +flush :: Queue -> Repo -> IO Queue +flush (Queue _ lim m) repo = do + forM_ (M.elems m) $ runAction repo + return $ Queue 0 lim M.empty + +{- Runs an Action on a list of files in a git repository. + - + - Complicated by commandline length limits. + - + - Intentionally runs the command even if the list of files is empty; + - this allows queueing commands that do not need a list of files. -} +runAction :: Repo -> Action -> IO () +runAction repo (UpdateIndexAction streamers) = + -- list is stored in reverse order + Git.UpdateIndex.streamUpdateIndex repo $ reverse streamers +runAction repo action@(CommandAction {}) = do +#ifndef mingw32_HOST_OS + let p = (proc "xargs" $ "-0":"git":toCommand gitparams) { env = gitEnv repo } + withHandle StdinHandle createProcessSuccess p $ \h -> do + fileEncoding h + hPutStr h $ intercalate "\0" $ toCommand $ getFiles action + hClose h +#else + -- Using xargs on Windows is problimatic, so just run the command + -- once per file (not as efficient.) + if null (getFiles action) + then void $ boolSystemEnv "git" gitparams (gitEnv repo) + else forM_ (getFiles action) $ \f -> + void $ boolSystemEnv "git" (gitparams ++ [f]) (gitEnv repo) +#endif + where + gitparams = gitCommandLine + (Param (getSubcommand action):getParams action) repo diff --git a/Git/Ref.hs b/Git/Ref.hs new file mode 100644 index 000000000..3d0c68fb0 --- /dev/null +++ b/Git/Ref.hs @@ -0,0 +1,144 @@ +{- git ref stuff + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Ref where + +import Common +import Git +import Git.Command +import Git.Sha +import Git.Types + +import Data.Char (chr) + +headRef :: Ref +headRef = Ref "HEAD" + +{- Converts a fully qualified git ref into a user-visible string. -} +describe :: Ref -> String +describe = fromRef . base + +{- Often git refs are fully qualified (eg: refs/heads/master). + - Converts such a fully qualified ref into a base ref (eg: master). -} +base :: Ref -> Ref +base = Ref . remove "refs/heads/" . remove "refs/remotes/" . fromRef + where + remove prefix s + | prefix `isPrefixOf` s = drop (length prefix) s + | otherwise = s + +{- Given a directory and any ref, takes the basename of the ref and puts + - it under the directory. -} +under :: String -> Ref -> Ref +under dir r = Ref $ dir ++ "/" ++ + (reverse $ takeWhile (/= '/') $ reverse $ fromRef r) + +{- Given a directory such as "refs/remotes/origin", and a ref such as + - refs/heads/master, yields a version of that ref under the directory, + - such as refs/remotes/origin/master. -} +underBase :: String -> Ref -> Ref +underBase dir r = Ref $ dir ++ "/" ++ fromRef (base r) + +{- A Ref that can be used to refer to a file in the repository, as staged + - in the index. + - + - Prefixing the file with ./ makes this work even if in a subdirectory + - of a repo. + -} +fileRef :: FilePath -> Ref +fileRef f = Ref $ ":./" ++ f + +{- Converts a Ref to refer to the content of the Ref on a given date. -} +dateRef :: Ref -> RefDate -> Ref +dateRef (Ref r) (RefDate d) = Ref $ r ++ "@" ++ d + +{- A Ref that can be used to refer to a file in the repository as it + - appears in a given Ref. -} +fileFromRef :: Ref -> FilePath -> Ref +fileFromRef (Ref r) f = let (Ref fr) = fileRef f in Ref (r ++ fr) + +{- Checks if a ref exists. -} +exists :: Ref -> Repo -> IO Bool +exists ref = runBool + [Param "show-ref", Param "--verify", Param "-q", Param $ fromRef ref] + +{- The file used to record a ref. (Git also stores some refs in a + - packed-refs file.) -} +file :: Ref -> Repo -> FilePath +file ref repo = localGitDir repo fromRef ref + +{- Checks if HEAD exists. It generally will, except for in a repository + - that was just created. -} +headExists :: Repo -> IO Bool +headExists repo = do + ls <- lines <$> pipeReadStrict [Param "show-ref", Param "--head"] repo + return $ any (" HEAD" `isSuffixOf`) ls + +{- Get the sha of a fully qualified git ref, if it exists. -} +sha :: Branch -> Repo -> IO (Maybe Sha) +sha branch repo = process <$> showref repo + where + showref = pipeReadStrict [Param "show-ref", + Param "--hash", -- get the hash + Param $ fromRef branch] + process [] = Nothing + process s = Just $ Ref $ firstLine s + +{- List of (shas, branches) matching a given ref or refs. -} +matching :: [Ref] -> Repo -> IO [(Sha, Branch)] +matching refs repo = matching' (map fromRef refs) repo + +{- Includes HEAD in the output, if asked for it. -} +matchingWithHEAD :: [Ref] -> Repo -> IO [(Sha, Branch)] +matchingWithHEAD refs repo = matching' ("--head" : map fromRef refs) repo + +{- List of (shas, branches) matching a given ref or refs. -} +matching' :: [String] -> Repo -> IO [(Sha, Branch)] +matching' ps repo = map gen . lines <$> + pipeReadStrict (Param "show-ref" : map Param ps) repo + where + gen l = let (r, b) = separate (== ' ') l + in (Ref r, Ref b) + +{- List of (shas, branches) matching a given ref spec. + - Duplicate shas are filtered out. -} +matchingUniq :: [Ref] -> Repo -> IO [(Sha, Branch)] +matchingUniq refs repo = nubBy uniqref <$> matching refs repo + where + uniqref (a, _) (b, _) = a == b + +{- Gets the sha of the tree a ref uses. -} +tree :: Ref -> Repo -> IO (Maybe Sha) +tree ref = extractSha <$$> pipeReadStrict + [ Param "rev-parse", Param (fromRef ref ++ ":") ] + +{- Checks if a String is a legal git ref name. + - + - The rules for this are complex; see git-check-ref-format(1) -} +legal :: Bool -> String -> Bool +legal allowonelevel s = all (== False) illegal + where + illegal = + [ any ("." `isPrefixOf`) pathbits + , any (".lock" `isSuffixOf`) pathbits + , not allowonelevel && length pathbits < 2 + , contains ".." + , any (\c -> contains [c]) illegalchars + , begins "/" + , ends "/" + , contains "//" + , ends "." + , contains "@{" + , null s + ] + contains v = v `isInfixOf` s + ends v = v `isSuffixOf` s + begins v = v `isPrefixOf` s + + pathbits = split "/" s + illegalchars = " ~^:?*[\\" ++ controlchars + controlchars = chr 0o177 : [chr 0 .. chr (0o40-1)] diff --git a/Git/RefLog.hs b/Git/RefLog.hs new file mode 100644 index 000000000..98c9d66ff --- /dev/null +++ b/Git/RefLog.hs @@ -0,0 +1,22 @@ +{- git reflog interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.RefLog where + +import Common +import Git +import Git.Command +import Git.Sha + +{- Gets the reflog for a given branch. -} +get :: Branch -> Repo -> IO [Sha] +get b = mapMaybe extractSha . lines <$$> pipeReadStrict + [ Param "log" + , Param "-g" + , Param "--format=%H" + , Param (fromRef b) + ] diff --git a/Git/Remote.hs b/Git/Remote.hs new file mode 100644 index 000000000..9d969c416 --- /dev/null +++ b/Git/Remote.hs @@ -0,0 +1,115 @@ +{- git remote stuff + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Remote where + +import Common +import Git +import Git.Types +import qualified Git.Command +import qualified Git.BuildVersion + +import Data.Char +import qualified Data.Map as M +import Network.URI +#ifdef mingw32_HOST_OS +import Git.FilePath +#endif + +{- Construct a legal git remote name out of an arbitrary input string. + - + - There seems to be no formal definition of this in the git source, + - just some ad-hoc checks, and some other things that fail with certian + - types of names (like ones starting with '-'). + -} +makeLegalName :: String -> RemoteName +makeLegalName s = case filter legal $ replace "/" "_" s of + -- it can't be empty + [] -> "unnamed" + -- it can't start with / or - or . + '.':s' -> makeLegalName s' + '/':s' -> makeLegalName s' + '-':s' -> makeLegalName s' + s' -> s' + where + {- Only alphanumerics, and a few common bits of punctuation common + - in hostnames. -} + legal '_' = True + legal '.' = True + legal c = isAlphaNum c + +remove :: RemoteName -> Repo -> IO () +remove remotename = Git.Command.run + [ Param "remote" + -- name of this subcommand changed + , Param $ + if Git.BuildVersion.older "1.8.0" + then "rm" + else "remove" + , Param remotename + ] + +data RemoteLocation = RemoteUrl String | RemotePath FilePath + +remoteLocationIsUrl :: RemoteLocation -> Bool +remoteLocationIsUrl (RemoteUrl _) = True +remoteLocationIsUrl _ = False + +remoteLocationIsSshUrl :: RemoteLocation -> Bool +remoteLocationIsSshUrl (RemoteUrl u) = "ssh://" `isPrefixOf` u +remoteLocationIsSshUrl _ = False + +{- Determines if a given remote location is an url, or a local + - path. Takes the repository's insteadOf configuration into account. -} +parseRemoteLocation :: String -> Repo -> RemoteLocation +parseRemoteLocation s repo = ret $ calcloc s + where + ret v +#ifdef mingw32_HOST_OS + | dosstyle v = RemotePath (dospath v) +#endif + | scpstyle v = RemoteUrl (scptourl v) + | urlstyle v = RemoteUrl v + | otherwise = RemotePath v + -- insteadof config can rewrite remote location + calcloc l + | null insteadofs = l + | otherwise = replacement ++ drop (length bestvalue) l + where + replacement = drop (length prefix) $ + take (length bestkey - length suffix) bestkey + (bestkey, bestvalue) = maximumBy longestvalue insteadofs + longestvalue (_, a) (_, b) = compare b a + insteadofs = filterconfig $ \(k, v) -> + startswith prefix k && + endswith suffix k && + startswith v l + filterconfig f = filter f $ + concatMap splitconfigs $ M.toList $ fullconfig repo + splitconfigs (k, vs) = map (\v -> (k, v)) vs + (prefix, suffix) = ("url." , ".insteadof") + urlstyle v = isURI v || ":" `isInfixOf` v && "//" `isInfixOf` v + -- git remotes can be written scp style -- [user@]host:dir + -- but foo::bar is a git-remote-helper location instead + scpstyle v = ":" `isInfixOf` v + && not ("//" `isInfixOf` v) + && not ("::" `isInfixOf` v) + scptourl v = "ssh://" ++ host ++ slash dir + where + (host, dir) = separate (== ':') v + slash d | d == "" = "/~/" ++ d + | "/" `isPrefixOf` d = d + | "~" `isPrefixOf` d = '/':d + | otherwise = "/~/" ++ d +#ifdef mingw32_HOST_OS + -- git on Windows will write a path to .git/config with "drive:", + -- which is not to be confused with a "host:" + dosstyle = hasDrive + dospath = fromInternalGitPath +#endif diff --git a/Git/Repair.hs b/Git/Repair.hs new file mode 100644 index 000000000..67ded359f --- /dev/null +++ b/Git/Repair.hs @@ -0,0 +1,584 @@ +{- git repository recovery + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Repair ( + runRepair, + runRepairOf, + successfulRepair, + cleanCorruptObjects, + retrieveMissingObjects, + resetLocalBranches, + checkIndex, + checkIndexFast, + missingIndex, + emptyGoodCommits, + isTrackingBranch, +) where + +import Common +import Git +import Git.Command +import Git.Objects +import Git.Sha +import Git.Types +import Git.Fsck +import Git.Index +import qualified Git.Config as Config +import qualified Git.Construct as Construct +import qualified Git.LsTree as LsTree +import qualified Git.LsFiles as LsFiles +import qualified Git.Ref as Ref +import qualified Git.RefLog as RefLog +import qualified Git.UpdateIndex as UpdateIndex +import qualified Git.Branch as Branch +import Utility.Tmp +import Utility.Rsync +import Utility.FileMode + +import qualified Data.Set as S +import qualified Data.ByteString.Lazy as L +import Data.Tuple.Utils + +{- Given a set of bad objects found by git fsck, which may not + - be complete, finds and removes all corrupt objects. -} +cleanCorruptObjects :: FsckResults -> Repo -> IO () +cleanCorruptObjects fsckresults r = do + void $ explodePacks r + mapM_ removeLoose (S.toList $ knownMissing fsckresults) + mapM_ removeBad =<< listLooseObjectShas r + where + removeLoose s = nukeFile (looseObjectFile r s) + removeBad s = do + void $ tryIO $ allowRead $ looseObjectFile r s + whenM (isMissing s r) $ + removeLoose s + +{- Explodes all pack files, and deletes them. + - + - First moves all pack files to a temp dir, before unpacking them each in + - turn. + - + - This is because unpack-objects will not unpack a pack file if it's in the + - git repo. + - + - Also, this prevents unpack-objects from possibly looking at corrupt + - pack files to see if they contain an object, while unpacking a + - non-corrupt pack file. + -} +explodePacks :: Repo -> IO Bool +explodePacks r = go =<< listPackFiles r + where + go [] = return False + go packs = withTmpDir "packs" $ \tmpdir -> do + putStrLn "Unpacking all pack files." + forM_ packs $ \packfile -> do + moveFile packfile (tmpdir takeFileName packfile) + nukeFile $ packIdxFile packfile + forM_ packs $ \packfile -> do + let tmp = tmpdir takeFileName packfile + allowRead tmp + -- May fail, if pack file is corrupt. + void $ tryIO $ + pipeWrite [Param "unpack-objects", Param "-r"] r $ \h -> + L.hPut h =<< L.readFile tmp + return True + +{- Try to retrieve a set of missing objects, from the remotes of a + - repository. Returns any that could not be retreived. + - + - If another clone of the repository exists locally, which might not be a + - remote of the repo being repaired, its path can be passed as a reference + - repository. + -} +retrieveMissingObjects :: FsckResults -> Maybe FilePath -> Repo -> IO FsckResults +retrieveMissingObjects missing referencerepo r + | not (foundBroken missing) = return missing + | otherwise = withTmpDir "tmprepo" $ \tmpdir -> do + unlessM (boolSystem "git" [Params "init", File tmpdir]) $ + error $ "failed to create temp repository in " ++ tmpdir + tmpr <- Config.read =<< Construct.fromAbsPath tmpdir + stillmissing <- pullremotes tmpr (remotes r) fetchrefstags missing + if S.null (knownMissing stillmissing) + then return stillmissing + else pullremotes tmpr (remotes r) fetchallrefs stillmissing + where + pullremotes tmpr [] fetchrefs stillmissing = case referencerepo of + Nothing -> return stillmissing + Just p -> ifM (fetchfrom p fetchrefs tmpr) + ( do + void $ explodePacks tmpr + void $ copyObjects tmpr r + case stillmissing of + FsckFailed -> return $ FsckFailed + FsckFoundMissing s t -> FsckFoundMissing + <$> findMissing (S.toList s) r + <*> pure t + , return stillmissing + ) + pullremotes tmpr (rmt:rmts) fetchrefs ms + | not (foundBroken ms) = return ms + | otherwise = do + putStrLn $ "Trying to recover missing objects from remote " ++ repoDescribe rmt ++ "." + ifM (fetchfrom (repoLocation rmt) fetchrefs tmpr) + ( do + void $ explodePacks tmpr + void $ copyObjects tmpr r + case ms of + FsckFailed -> pullremotes tmpr rmts fetchrefs ms + FsckFoundMissing s t -> do + stillmissing <- findMissing (S.toList s) r + pullremotes tmpr rmts fetchrefs (FsckFoundMissing stillmissing t) + , pullremotes tmpr rmts fetchrefs ms + ) + fetchfrom fetchurl ps = runBool $ + [ Param "fetch" + , Param fetchurl + , Params "--force --update-head-ok --quiet" + ] ++ ps + -- fetch refs and tags + fetchrefstags = [ Param "+refs/heads/*:refs/heads/*", Param "--tags"] + -- Fetch all available refs (more likely to fail, + -- as the remote may have refs it refuses to send). + fetchallrefs = [ Param "+*:*" ] + +{- Copies all objects from the src repository to the dest repository. + - This is done using rsync, so it copies all missing objects, and all + - objects they rely on. -} +copyObjects :: Repo -> Repo -> IO Bool +copyObjects srcr destr = rsync + [ Param "-qr" + , File $ addTrailingPathSeparator $ objectsDir srcr + , File $ addTrailingPathSeparator $ objectsDir destr + ] + +{- To deal with missing objects that cannot be recovered, resets any + - local branches to point to an old commit before the missing + - objects. Returns all branches that were changed, and deleted. + -} +resetLocalBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], [Branch], GoodCommits) +resetLocalBranches missing goodcommits r = + go [] [] goodcommits =<< filter islocalbranch <$> getAllRefs r + where + islocalbranch b = "refs/heads/" `isPrefixOf` fromRef b + go changed deleted gcs [] = return (changed, deleted, gcs) + go changed deleted gcs (b:bs) = do + (mc, gcs') <- findUncorruptedCommit missing gcs b r + case mc of + Just c + | c == b -> go changed deleted gcs' bs + | otherwise -> do + reset b c + go (b:changed) deleted gcs' bs + Nothing -> do + nukeBranchRef b r + go changed (b:deleted) gcs' bs + reset b c = do + nukeBranchRef b r + void $ runBool + [ Param "branch" + , Param (fromRef $ Ref.base b) + , Param (fromRef c) + ] r + +isTrackingBranch :: Ref -> Bool +isTrackingBranch b = "refs/remotes/" `isPrefixOf` fromRef b + +{- To deal with missing objects that cannot be recovered, removes + - any branches (filtered by a predicate) that reference them + - Returns a list of all removed branches. + -} +removeBadBranches :: (Ref -> Bool) -> MissingObjects -> GoodCommits -> Repo -> IO ([Branch], GoodCommits) +removeBadBranches removablebranch missing goodcommits r = + go [] goodcommits =<< filter removablebranch <$> getAllRefs r + where + go removed gcs [] = return (removed, gcs) + go removed gcs (b:bs) = do + (ok, gcs') <- verifyCommit missing gcs b r + if ok + then go removed gcs' bs + else do + nukeBranchRef b r + go (b:removed) gcs' bs + +{- Gets all refs, including ones that are corrupt. + - git show-ref does not output refs to commits that are directly + - corrupted, so it is not used. + - + - Relies on packed refs being exploded before it's called. + -} +getAllRefs :: Repo -> IO [Ref] +getAllRefs r = map toref <$> dirContentsRecursive refdir + where + refdir = localGitDir r "refs" + toref = Ref . relPathDirToFile (localGitDir r) + +explodePackedRefsFile :: Repo -> IO () +explodePackedRefsFile r = do + let f = packedRefsFile r + whenM (doesFileExist f) $ do + rs <- mapMaybe parsePacked . lines + <$> catchDefaultIO "" (safeReadFile f) + forM_ rs makeref + nukeFile f + where + makeref (sha, ref) = do + let dest = localGitDir r fromRef ref + createDirectoryIfMissing True (parentDir dest) + unlessM (doesFileExist dest) $ + writeFile dest (fromRef sha) + +packedRefsFile :: Repo -> FilePath +packedRefsFile r = localGitDir r "packed-refs" + +parsePacked :: String -> Maybe (Sha, Ref) +parsePacked l = case words l of + (sha:ref:[]) + | isJust (extractSha sha) && Ref.legal True ref -> + Just (Ref sha, Ref ref) + _ -> Nothing + +{- git-branch -d cannot be used to remove a branch that is directly + - pointing to a corrupt commit. -} +nukeBranchRef :: Branch -> Repo -> IO () +nukeBranchRef b r = nukeFile $ localGitDir r fromRef b + +{- Finds the most recent commit to a branch that does not need any + - of the missing objects. If the input branch is good as-is, returns it. + - Otherwise, tries to traverse the commits in the branch to find one + - that is ok. That might fail, if one of them is corrupt, or if an object + - at the root of the branch is missing. Finally, looks for an old version + - of the branch from the reflog. + -} +findUncorruptedCommit :: MissingObjects -> GoodCommits -> Branch -> Repo -> IO (Maybe Sha, GoodCommits) +findUncorruptedCommit missing goodcommits branch r = do + (ok, goodcommits') <- verifyCommit missing goodcommits branch r + if ok + then return (Just branch, goodcommits') + else do + (ls, cleanup) <- pipeNullSplit + [ Param "log" + , Param "-z" + , Param "--format=%H" + , Param (fromRef branch) + ] r + let branchshas = catMaybes $ map extractSha ls + reflogshas <- RefLog.get branch r + -- XXX Could try a bit harder here, and look + -- for uncorrupted old commits in branches in the + -- reflog. + cleanup `after` findfirst goodcommits (branchshas ++ reflogshas) + where + findfirst gcs [] = return (Nothing, gcs) + findfirst gcs (c:cs) = do + (ok, gcs') <- verifyCommit missing gcs c r + if ok + then return (Just c, gcs') + else findfirst gcs' cs + +{- Verifies that none of the missing objects in the set are used by + - the commit. Also adds to a set of commit shas that have been verified to + - be good, which can be passed into subsequent calls to avoid + - redundant work when eg, chasing down branches to find the first + - uncorrupted commit. -} +verifyCommit :: MissingObjects -> GoodCommits -> Sha -> Repo -> IO (Bool, GoodCommits) +verifyCommit missing goodcommits commit r + | checkGoodCommit commit goodcommits = return (True, goodcommits) + | otherwise = do + (ls, cleanup) <- pipeNullSplit + [ Param "log" + , Param "-z" + , Param "--format=%H %T" + , Param (fromRef commit) + ] r + let committrees = map parse ls + if any isNothing committrees || null committrees + then do + void cleanup + return (False, goodcommits) + else do + let cts = catMaybes committrees + ifM (cleanup <&&> check cts) + ( return (True, addGoodCommits (map fst cts) goodcommits) + , return (False, goodcommits) + ) + where + parse l = case words l of + (commitsha:treesha:[]) -> (,) + <$> extractSha commitsha + <*> extractSha treesha + _ -> Nothing + check [] = return True + check ((c, t):rest) + | checkGoodCommit c goodcommits = return True + | otherwise = verifyTree missing t r <&&> check rest + +{- Verifies that a tree is good, including all trees and blobs + - referenced by it. -} +verifyTree :: MissingObjects -> Sha -> Repo -> IO Bool +verifyTree missing treesha r + | S.member treesha missing = return False + | otherwise = do + (ls, cleanup) <- pipeNullSplit (LsTree.lsTreeParams treesha) r + let objshas = map (extractSha . LsTree.sha . LsTree.parseLsTree) ls + if any isNothing objshas || any (`S.member` missing) (catMaybes objshas) + then do + void cleanup + return False + -- as long as ls-tree succeeded, we're good + else cleanup + +{- Checks that the index file only refers to objects that are not missing, + - and is not itself corrupt. Note that a missing index file is not + - considered a problem (repo may be new). -} +checkIndex :: Repo -> IO Bool +checkIndex r = do + (bad, _good, cleanup) <- partitionIndex r + if null bad + then cleanup + else do + void cleanup + return False + +{- Does not check every object the index refers to, but only that the index + - itself is not corrupt. -} +checkIndexFast :: Repo -> IO Bool +checkIndexFast r = do + (indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r + length indexcontents `seq` cleanup + +missingIndex :: Repo -> IO Bool +missingIndex r = not <$> doesFileExist (localGitDir r "index") + +{- Finds missing and ok files staged in the index. -} +partitionIndex :: Repo -> IO ([LsFiles.StagedDetails], [LsFiles.StagedDetails], IO Bool) +partitionIndex r = do + (indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r + l <- forM indexcontents $ \i -> case i of + (_file, Just sha, Just _mode) -> (,) <$> isMissing sha r <*> pure i + _ -> pure (False, i) + let (bad, good) = partition fst l + return (map snd bad, map snd good, cleanup) + +{- Rewrites the index file, removing from it any files whose blobs are + - missing. Returns the list of affected files. -} +rewriteIndex :: Repo -> IO [FilePath] +rewriteIndex r + | repoIsLocalBare r = return [] + | otherwise = do + (bad, good, cleanup) <- partitionIndex r + unless (null bad) $ do + nukeFile (indexFile r) + UpdateIndex.streamUpdateIndex r + =<< (catMaybes <$> mapM reinject good) + void cleanup + return $ map fst3 bad + where + reinject (file, Just sha, Just mode) = case toBlobType mode of + Nothing -> return Nothing + Just blobtype -> Just <$> + UpdateIndex.stageFile sha blobtype file r + reinject _ = return Nothing + +newtype GoodCommits = GoodCommits (S.Set Sha) + +emptyGoodCommits :: GoodCommits +emptyGoodCommits = GoodCommits S.empty + +checkGoodCommit :: Sha -> GoodCommits -> Bool +checkGoodCommit sha (GoodCommits s) = S.member sha s + +addGoodCommits :: [Sha] -> GoodCommits -> GoodCommits +addGoodCommits shas (GoodCommits s) = GoodCommits $ + S.union s (S.fromList shas) + +displayList :: [String] -> String -> IO () +displayList items header + | null items = return () + | otherwise = do + putStrLn header + putStr $ unlines $ map (\i -> "\t" ++ i) truncateditems + where + numitems = length items + truncateditems + | numitems > 10 = take 10 items ++ ["(and " ++ show (numitems - 10) ++ " more)"] + | otherwise = items + +{- Fix problems that would prevent repair from working at all + - + - A missing or corrupt .git/HEAD makes git not treat the repository as a + - git repo. If there is a git repo in a parent directory, it may move up + - the tree and use that one instead. So, cannot use `git show-ref HEAD` to + - test it. + - + - Explode the packed refs file, to simplify dealing with refs, and because + - fsck can complain about bad refs in it. + -} +preRepair :: Repo -> IO () +preRepair g = do + unlessM (validhead <$> catchDefaultIO "" (safeReadFile headfile)) $ do + nukeFile headfile + writeFile headfile "ref: refs/heads/master" + explodePackedRefsFile g + unless (repoIsLocalBare g) $ do + let f = indexFile g + void $ tryIO $ allowWrite f + where + headfile = localGitDir g "HEAD" + validhead s = "ref: refs/" `isPrefixOf` s || isJust (extractSha s) + +{- Put it all together. -} +runRepair :: (Ref -> Bool) -> Bool -> Repo -> IO (Bool, [Branch]) +runRepair removablebranch forced g = do + preRepair g + putStrLn "Running git fsck ..." + fsckresult <- findBroken False g + if foundBroken fsckresult + then runRepair' removablebranch fsckresult forced Nothing g + else do + putStrLn "No problems found." + return (True, []) + +runRepairOf :: FsckResults -> (Ref -> Bool) -> Bool -> Maybe FilePath -> Repo -> IO (Bool, [Branch]) +runRepairOf fsckresult removablebranch forced referencerepo g = do + preRepair g + runRepair' removablebranch fsckresult forced referencerepo g + +runRepair' :: (Ref -> Bool) -> FsckResults -> Bool -> Maybe FilePath -> Repo -> IO (Bool, [Branch]) +runRepair' removablebranch fsckresult forced referencerepo g = do + cleanCorruptObjects fsckresult g + missing <- findBroken False g + stillmissing <- retrieveMissingObjects missing referencerepo g + case stillmissing of + FsckFoundMissing s t + | S.null s -> if repoIsLocalBare g + then successfulfinish [] + else ifM (checkIndex g) + ( successfulfinish [] + , do + putStrLn "No missing objects found, but the index file is corrupt!" + if forced + then corruptedindex + else needforce + ) + | otherwise -> if forced + then ifM (checkIndex g) + ( forcerepair s t + , corruptedindex + ) + else do + putStrLn $ unwords + [ show (S.size s) + , "missing objects could not be recovered!" + ] + unsuccessfulfinish + FsckFailed + | forced -> ifM (pure (repoIsLocalBare g) <||> checkIndex g) + ( do + cleanCorruptObjects FsckFailed g + stillmissing' <- findBroken False g + case stillmissing' of + FsckFailed -> return (False, []) + FsckFoundMissing s t -> forcerepair s t + , corruptedindex + ) + | otherwise -> unsuccessfulfinish + where + repairbranches missing = do + (removedbranches, goodcommits) <- removeBadBranches removablebranch missing emptyGoodCommits g + let remotebranches = filter isTrackingBranch removedbranches + unless (null remotebranches) $ + putStrLn $ unwords + [ "Removed" + , show (length remotebranches) + , "remote tracking branches that referred to missing objects." + ] + (resetbranches, deletedbranches, _) <- resetLocalBranches missing goodcommits g + displayList (map fromRef resetbranches) + "Reset these local branches to old versions before the missing objects were committed:" + displayList (map fromRef deletedbranches) + "Deleted these local branches, which could not be recovered due to missing objects:" + return (resetbranches ++ deletedbranches) + + forcerepair missing fscktruncated = do + modifiedbranches <- repairbranches missing + deindexedfiles <- rewriteIndex g + displayList deindexedfiles + "Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate." + + -- When the fsck results were truncated, try + -- fscking again, and as long as different + -- missing objects are found, continue + -- the repair process. + if fscktruncated + then do + fsckresult' <- findBroken False g + case fsckresult' of + FsckFailed -> do + putStrLn "git fsck is failing" + return (False, modifiedbranches) + FsckFoundMissing s _ + | S.null s -> successfulfinish modifiedbranches + | S.null (s `S.difference` missing) -> do + putStrLn $ unwords + [ show (S.size s) + , "missing objects could not be recovered!" + ] + return (False, modifiedbranches) + | otherwise -> do + (ok, modifiedbranches') <- runRepairOf fsckresult' removablebranch forced referencerepo g + return (ok, modifiedbranches++modifiedbranches') + else successfulfinish modifiedbranches + + corruptedindex = do + nukeFile (indexFile g) + -- The corrupted index can prevent fsck from finding other + -- problems, so re-run repair. + fsckresult' <- findBroken False g + result <- runRepairOf fsckresult' removablebranch forced referencerepo g + putStrLn "Removed the corrupted index file. You should look at what files are present in your working tree and git add them back to the index when appropriate." + return result + + successfulfinish modifiedbranches + | null modifiedbranches = do + mapM_ putStrLn + [ "Successfully recovered repository!" + , "You should run \"git fsck\" to make sure, but it looks like everything was recovered ok." + ] + return (True, modifiedbranches) + | otherwise = do + unless (repoIsLocalBare g) $ do + mcurr <- Branch.currentUnsafe g + case mcurr of + Nothing -> return () + Just curr -> when (any (== curr) modifiedbranches) $ do + putStrLn $ unwords + [ "You currently have" + , fromRef curr + , "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!" + ] + putStrLn "Successfully recovered repository!" + putStrLn "Please carefully check that the changes mentioned above are ok.." + return (True, modifiedbranches) + + unsuccessfulfinish = do + if repoIsLocalBare g + then do + putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and retry." + putStrLn "If there are no clones of this repository, you can instead retry with the --force parameter to force recovery to a possibly usable state." + return (False, []) + else needforce + needforce = do + putStrLn "To force a recovery to a usable state, retry with the --force parameter." + return (False, []) + +successfulRepair :: (Bool, [Branch]) -> Bool +successfulRepair = fst + +safeReadFile :: FilePath -> IO String +safeReadFile f = do + allowRead f + readFileStrictAnyEncoding f diff --git a/Git/Sha.hs b/Git/Sha.hs new file mode 100644 index 000000000..cbb66ea2d --- /dev/null +++ b/Git/Sha.hs @@ -0,0 +1,43 @@ +{- git SHA stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Sha where + +import Common +import Git.Types + +{- Runs an action that causes a git subcommand to emit a Sha, and strips + - any trailing newline, returning the sha. -} +getSha :: String -> IO String -> IO Sha +getSha subcommand a = maybe bad return =<< extractSha <$> a + where + bad = error $ "failed to read sha from git " ++ subcommand + +{- Extracts the Sha from a string. There can be a trailing newline after + - it, but nothing else. -} +extractSha :: String -> Maybe Sha +extractSha s + | len == shaSize = val s + | len == shaSize + 1 && length s' == shaSize = val s' + | otherwise = Nothing + where + len = length s + s' = firstLine s + val v + | all (`elem` "1234567890ABCDEFabcdef") v = Just $ Ref v + | otherwise = Nothing + +{- Size of a git sha. -} +shaSize :: Int +shaSize = 40 + +nullSha :: Ref +nullSha = Ref $ replicate shaSize '0' + +{- Git's magic empty tree. -} +emptyTree :: Ref +emptyTree = Ref "4b825dc642cb6eb9a060e54bf8d69288fbee4904" diff --git a/Git/SharedRepository.hs b/Git/SharedRepository.hs new file mode 100644 index 000000000..f3efa8fde --- /dev/null +++ b/Git/SharedRepository.hs @@ -0,0 +1,27 @@ +{- git core.sharedRepository handling + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.SharedRepository where + +import Data.Char + +import Common +import Git +import qualified Git.Config + +data SharedRepository = UnShared | GroupShared | AllShared | UmaskShared Int + +getSharedRepository :: Repo -> SharedRepository +getSharedRepository r = + case map toLower $ Git.Config.get "core.sharedrepository" "" r of + "1" -> GroupShared + "group" -> GroupShared + "true" -> GroupShared + "all" -> AllShared + "world" -> AllShared + "everybody" -> AllShared + v -> maybe UnShared UmaskShared (readish v) diff --git a/Git/Types.hs b/Git/Types.hs new file mode 100644 index 000000000..838c9e0e7 --- /dev/null +++ b/Git/Types.hs @@ -0,0 +1,100 @@ +{- git data types + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Types where + +import Network.URI +import qualified Data.Map as M +import System.Posix.Types +import Utility.SafeCommand +import Utility.URI () + +{- Support repositories on local disk, and repositories accessed via an URL. + - + - Repos on local disk have a git directory, and unless bare, a worktree. + - + - A local repo may not have had its config read yet, in which case all + - that's known about it is its path. + - + - Finally, an Unknown repository may be known to exist, but nothing + - else known about it. + -} +data RepoLocation + = Local { gitdir :: FilePath, worktree :: Maybe FilePath } + | LocalUnknown FilePath + | Url URI + | Unknown + deriving (Show, Eq, Ord) + +data Repo = Repo + { location :: RepoLocation + , config :: M.Map String String + -- a given git config key can actually have multiple values + , fullconfig :: M.Map String [String] + , remotes :: [Repo] + -- remoteName holds the name used for this repo in remotes + , remoteName :: Maybe RemoteName + -- alternate environment to use when running git commands + , gitEnv :: Maybe [(String, String)] + -- global options to pass to git when running git commands + , gitGlobalOpts :: [CommandParam] + } deriving (Show, Eq, Ord) + +type RemoteName = String + +{- A git ref. Can be a sha1, or a branch or tag name. -} +newtype Ref = Ref String + deriving (Eq, Ord, Read, Show) + +fromRef :: Ref -> String +fromRef (Ref s) = s + +{- Aliases for Ref. -} +type Branch = Ref +type Sha = Ref +type Tag = Ref + +{- A date in the format described in gitrevisions. Includes the + - braces, eg, "{yesterday}" -} +newtype RefDate = RefDate String + +{- Types of objects that can be stored in git. -} +data ObjectType = BlobObject | CommitObject | TreeObject + deriving (Eq) + +instance Show ObjectType where + show BlobObject = "blob" + show CommitObject = "commit" + show TreeObject = "tree" + +readObjectType :: String -> Maybe ObjectType +readObjectType "blob" = Just BlobObject +readObjectType "commit" = Just CommitObject +readObjectType "tree" = Just TreeObject +readObjectType _ = Nothing + +{- Types of blobs. -} +data BlobType = FileBlob | ExecutableBlob | SymlinkBlob + deriving (Eq) + +{- Git uses magic numbers to denote the type of a blob. -} +instance Show BlobType where + show FileBlob = "100644" + show ExecutableBlob = "100755" + show SymlinkBlob = "120000" + +readBlobType :: String -> Maybe BlobType +readBlobType "100644" = Just FileBlob +readBlobType "100755" = Just ExecutableBlob +readBlobType "120000" = Just SymlinkBlob +readBlobType _ = Nothing + +toBlobType :: FileMode -> Maybe BlobType +toBlobType 0o100644 = Just FileBlob +toBlobType 0o100755 = Just ExecutableBlob +toBlobType 0o120000 = Just SymlinkBlob +toBlobType _ = Nothing diff --git a/Git/UnionMerge.hs b/Git/UnionMerge.hs new file mode 100644 index 000000000..464200af4 --- /dev/null +++ b/Git/UnionMerge.hs @@ -0,0 +1,110 @@ +{- git-union-merge library + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.UnionMerge ( + merge, + mergeIndex +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Set as S + +import Common +import Git +import Git.Sha +import Git.CatFile +import Git.Command +import Git.UpdateIndex +import Git.HashObject +import Git.Types +import Git.FilePath + +{- Performs a union merge between two branches, staging it in the index. + - Any previously staged changes in the index will be lost. + - + - Should be run with a temporary index file configured by useIndex. + -} +merge :: Ref -> Ref -> Repo -> IO () +merge x y repo = do + h <- catFileStart repo + streamUpdateIndex repo + [ lsTree x repo + , mergeTrees x y h repo + ] + catFileStop h + +{- Merges a list of branches into the index. Previously staged changes in + - the index are preserved (and participate in the merge). + - + - update-index is run once per ref in turn, so that each ref is merged on + - top of the merge for the previous ref. It would be more efficient, but + - harder to calculate a single union merge involving all the refs, as well + - as the index. + -} +mergeIndex :: CatFileHandle -> Repo -> [Ref] -> IO () +mergeIndex h repo bs = forM_ bs $ \b -> + streamUpdateIndex repo [mergeTreeIndex b h repo] + +{- For merging two trees. -} +mergeTrees :: Ref -> Ref -> CatFileHandle -> Repo -> Streamer +mergeTrees (Ref x) (Ref y) h = doMerge h $ "diff-tree":diffOpts ++ [x, y] + +{- For merging a single tree into the index. -} +mergeTreeIndex :: Ref -> CatFileHandle -> Repo -> Streamer +mergeTreeIndex (Ref x) h = doMerge h $ + "diff-index" : diffOpts ++ ["--cached", x] + +diffOpts :: [String] +diffOpts = ["--raw", "-z", "-r", "--no-renames", "-l0"] + +{- Streams update-index changes to perform a merge, + - using git to get a raw diff. -} +doMerge :: CatFileHandle -> [String] -> Repo -> Streamer +doMerge ch differ repo streamer = do + (diff, cleanup) <- pipeNullSplit (map Param differ) repo + go diff + void $ cleanup + where + go [] = noop + go (info:file:rest) = mergeFile info file ch repo >>= + maybe (go rest) (\l -> streamer l >> go rest) + go (_:[]) = error $ "parse error " ++ show differ + +{- Given an info line from a git raw diff, and the filename, generates + - a line suitable for update-index that union merges the two sides of the + - diff. -} +mergeFile :: String -> FilePath -> CatFileHandle -> Repo -> IO (Maybe String) +mergeFile info file h repo = case filter (/= nullSha) [Ref asha, Ref bsha] of + [] -> return Nothing + (sha:[]) -> use sha + shas -> use + =<< either return (\s -> hashObject BlobObject (unlines s) repo) + =<< calcMerge . zip shas <$> mapM getcontents shas + where + [_colonmode, _bmode, asha, bsha, _status] = words info + use sha = return $ Just $ + updateIndexLine sha FileBlob $ asTopFilePath file + -- We don't know how the file is encoded, but need to + -- split it into lines to union merge. Using the + -- FileSystemEncoding for this is a hack, but ensures there + -- are no decoding errors. Note that this works because + -- hashObject sets fileEncoding on its write handle. + getcontents s = lines . encodeW8 . L.unpack <$> catObject h s + +{- Calculates a union merge between a list of refs, with contents. + - + - When possible, reuses the content of an existing ref, rather than + - generating new content. + -} +calcMerge :: [(Ref, [String])] -> Either Ref [String] +calcMerge shacontents + | null reuseable = Right $ new + | otherwise = Left $ fst $ Prelude.head reuseable + where + reuseable = filter (\c -> sorteduniq (snd c) == new) shacontents + new = sorteduniq $ concat $ map snd shacontents + sorteduniq = S.toList . S.fromList diff --git a/Git/UpdateIndex.hs b/Git/UpdateIndex.hs new file mode 100644 index 000000000..7de2f1be3 --- /dev/null +++ b/Git/UpdateIndex.hs @@ -0,0 +1,112 @@ +{- git-update-index library + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns, CPP #-} + +module Git.UpdateIndex ( + Streamer, + pureStreamer, + streamUpdateIndex, + streamUpdateIndex', + startUpdateIndex, + stopUpdateIndex, + lsTree, + lsSubTree, + updateIndexLine, + stageFile, + unstageFile, + stageSymlink +) where + +import Common +import Git +import Git.Types +import Git.Command +import Git.FilePath +import Git.Sha + +import Control.Exception (bracket) + +{- Streamers are passed a callback and should feed it lines in the form + - read by update-index, and generated by ls-tree. -} +type Streamer = (String -> IO ()) -> IO () + +{- A streamer with a precalculated value. -} +pureStreamer :: String -> Streamer +pureStreamer !s = \streamer -> streamer s + +{- Streams content into update-index from a list of Streamers. -} +streamUpdateIndex :: Repo -> [Streamer] -> IO () +streamUpdateIndex repo as = bracket (startUpdateIndex repo) stopUpdateIndex $ + (\h -> forM_ as $ streamUpdateIndex' h) + +data UpdateIndexHandle = UpdateIndexHandle ProcessHandle Handle + +streamUpdateIndex' :: UpdateIndexHandle -> Streamer -> IO () +streamUpdateIndex' (UpdateIndexHandle _ h) a = a $ \s -> do + hPutStr h s + hPutStr h "\0" + +startUpdateIndex :: Repo -> IO UpdateIndexHandle +startUpdateIndex repo = do + (Just h, _, _, p) <- createProcess (gitCreateProcess params repo) + { std_in = CreatePipe } + fileEncoding h + return $ UpdateIndexHandle p h + where + params = map Param ["update-index", "-z", "--index-info"] + +stopUpdateIndex :: UpdateIndexHandle -> IO Bool +stopUpdateIndex (UpdateIndexHandle p h) = do + hClose h + checkSuccessProcess p + +{- A streamer that adds the current tree for a ref. Useful for eg, copying + - and modifying branches. -} +lsTree :: Ref -> Repo -> Streamer +lsTree (Ref x) repo streamer = do + (s, cleanup) <- pipeNullSplit params repo + mapM_ streamer s + void $ cleanup + where + params = map Param ["ls-tree", "-z", "-r", "--full-tree", x] +lsSubTree :: Ref -> FilePath -> Repo -> Streamer +lsSubTree (Ref x) p repo streamer = do + (s, cleanup) <- pipeNullSplit params repo + mapM_ streamer s + void $ cleanup + where + params = map Param ["ls-tree", "-z", "-r", "--full-tree", x, p] + +{- Generates a line suitable to be fed into update-index, to add + - a given file with a given sha. -} +updateIndexLine :: Sha -> BlobType -> TopFilePath -> String +updateIndexLine sha filetype file = + show filetype ++ " blob " ++ fromRef sha ++ "\t" ++ indexPath file + +stageFile :: Sha -> BlobType -> FilePath -> Repo -> IO Streamer +stageFile sha filetype file repo = do + p <- toTopFilePath file repo + return $ pureStreamer $ updateIndexLine sha filetype p + +{- A streamer that removes a file from the index. -} +unstageFile :: FilePath -> Repo -> IO Streamer +unstageFile file repo = do + p <- toTopFilePath file repo + return $ pureStreamer $ "0 " ++ fromRef nullSha ++ "\t" ++ indexPath p + +{- A streamer that adds a symlink to the index. -} +stageSymlink :: FilePath -> Sha -> Repo -> IO Streamer +stageSymlink file sha repo = do + !line <- updateIndexLine + <$> pure sha + <*> pure SymlinkBlob + <*> toTopFilePath file repo + return $ pureStreamer line + +indexPath :: TopFilePath -> InternalGitPath +indexPath = toInternalGitPath . getTopFilePath diff --git a/Git/Url.hs b/Git/Url.hs new file mode 100644 index 000000000..d383a6aca --- /dev/null +++ b/Git/Url.hs @@ -0,0 +1,71 @@ +{- git repository urls + - + - Copyright 2010, 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Url ( + scheme, + host, + port, + hostuser, + authority, +) where + +import Network.URI hiding (scheme, authority) + +import Common +import Git.Types +import Git + +{- Scheme of an URL repo. -} +scheme :: Repo -> String +scheme Repo { location = Url u } = uriScheme u +scheme repo = notUrl repo + +{- Work around a bug in the real uriRegName + - -} +uriRegName' :: URIAuth -> String +uriRegName' a = fixup $ uriRegName a + where + fixup x@('[':rest) + | rest !! len == ']' = take len rest + | otherwise = x + where + len = length rest - 1 + fixup x = x + +{- Hostname of an URL repo. -} +host :: Repo -> Maybe String +host = authpart uriRegName' + +{- Port of an URL repo, if it has a nonstandard one. -} +port :: Repo -> Maybe Integer +port r = + case authpart uriPort r of + Nothing -> Nothing + Just ":" -> Nothing + Just (':':p) -> readish p + Just _ -> Nothing + +{- Hostname of an URL repo, including any username (ie, "user@host") -} +hostuser :: Repo -> Maybe String +hostuser r = (++) + <$> authpart uriUserInfo r + <*> authpart uriRegName' r + +{- The full authority portion an URL repo. (ie, "user@host:port") -} +authority :: Repo -> Maybe String +authority = authpart assemble + where + assemble a = uriUserInfo a ++ uriRegName' a ++ uriPort a + +{- Applies a function to extract part of the uriAuthority of an URL repo. -} +authpart :: (URIAuth -> a) -> Repo -> Maybe a +authpart a Repo { location = Url u } = a <$> uriAuthority u +authpart _ repo = notUrl repo + +notUrl :: Repo -> a +notUrl repo = error $ + "acting on local git repo " ++ repoDescribe repo ++ " not supported" diff --git a/Git/Version.hs b/Git/Version.hs new file mode 100644 index 000000000..5ad1d5959 --- /dev/null +++ b/Git/Version.hs @@ -0,0 +1,43 @@ +{- git versions + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Version where + +import Common + +data GitVersion = GitVersion String Integer + deriving (Eq) + +instance Ord GitVersion where + compare (GitVersion _ x) (GitVersion _ y) = compare x y + +instance Show GitVersion where + show (GitVersion s _) = s + +installed :: IO GitVersion +installed = normalize . extract <$> readProcess "git" ["--version"] + where + extract s = case lines s of + [] -> "" + (l:_) -> unwords $ drop 2 $ words l + +{- To compare dotted versions like 1.7.7 and 1.8, they are normalized to + - a somewhat arbitrary integer representation. -} +normalize :: String -> GitVersion +normalize v = GitVersion v $ + sum $ mult 1 $ reverse $ extend precision $ take precision $ + map readi $ split "." v + where + extend n l = l ++ replicate (n - length l) 0 + mult _ [] = [] + mult n (x:xs) = (n*x) : mult (n*10^width) xs + readi :: String -> Integer + readi s = case reads s of + ((x,_):_) -> x + _ -> 0 + precision = 10 -- number of segments of the version to compare + width = length "yyyymmddhhmmss" -- maximum width of a segment diff --git a/INSTALL b/INSTALL new file mode 120000 index 000000000..67566818f --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +doc/install.mdwn \ No newline at end of file diff --git a/Limit.hs b/Limit.hs new file mode 100644 index 000000000..9ac849bce --- /dev/null +++ b/Limit.hs @@ -0,0 +1,280 @@ +{- user-specified limits on files to act on + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Limit where + +import Common.Annex +import qualified Annex +import qualified Utility.Matcher +import qualified Remote +import qualified Backend +import Annex.Content +import Annex.UUID +import Logs.Trust +import Config.NumCopies +import Types.TrustLevel +import Types.Key +import Types.Group +import Types.FileMatcher +import Types.MetaData +import Logs.MetaData +import Logs.Group +import Logs.Unused +import Logs.Location +import Git.Types (RefDate(..)) +import Utility.Glob +import Utility.HumanTime +import Utility.DataUnits + +import Data.Time.Clock.POSIX +import qualified Data.Set as S +import qualified Data.Map as M + +{- Checks if there are user-specified limits. -} +limited :: Annex Bool +limited = (not . Utility.Matcher.isEmpty) <$> getMatcher' + +{- Gets a matcher for the user-specified limits. The matcher is cached for + - speed; once it's obtained the user-specified limits can't change. -} +getMatcher :: Annex (MatchInfo -> Annex Bool) +getMatcher = Utility.Matcher.matchM <$> getMatcher' + +getMatcher' :: Annex (Utility.Matcher.Matcher (MatchInfo -> Annex Bool)) +getMatcher' = go =<< Annex.getState Annex.limit + where + go (CompleteMatcher matcher) = return matcher + go (BuildingMatcher l) = do + let matcher = Utility.Matcher.generate (reverse l) + Annex.changeState $ \s -> + s { Annex.limit = CompleteMatcher matcher } + return matcher + +{- Adds something to the limit list, which is built up reversed. -} +add :: Utility.Matcher.Token (MatchInfo -> Annex Bool) -> Annex () +add l = Annex.changeState $ \s -> s { Annex.limit = prepend $ Annex.limit s } + where + prepend (BuildingMatcher ls) = BuildingMatcher $ l:ls + prepend _ = error "internal" + +{- Adds a new token. -} +addToken :: String -> Annex () +addToken = add . Utility.Matcher.token + +{- Adds a new limit. -} +addLimit :: Either String (MatchFiles Annex) -> Annex () +addLimit = either error (\l -> add $ Utility.Matcher.Operation $ l S.empty) + +{- Add a limit to skip files that do not match the glob. -} +addInclude :: String -> Annex () +addInclude = addLimit . limitInclude + +limitInclude :: MkLimit Annex +limitInclude glob = Right $ const $ return . matchGlobFile glob + +{- Add a limit to skip files that match the glob. -} +addExclude :: String -> Annex () +addExclude = addLimit . limitExclude + +limitExclude :: MkLimit Annex +limitExclude glob = Right $ const $ return . not . matchGlobFile glob + +matchGlobFile :: String -> (MatchInfo -> Bool) +matchGlobFile glob = go + where + cglob = compileGlob glob CaseSensative -- memoized + go (MatchingKey _) = False + go (MatchingFile fi) = matchGlob cglob (matchFile fi) + +{- Adds a limit to skip files not believed to be present + - in a specfied repository. Optionally on a prior date. -} +addIn :: String -> Annex () +addIn s = addLimit =<< mk + where + (name, date) = separate (== '@') s + mk + | name == "." = if null date + then use inhere + else use . inuuid =<< getUUID + | otherwise = use . inuuid =<< Remote.nameToUUID name + use a = return $ Right $ \notpresent -> checkKey (a notpresent) + inuuid u notpresent key + | null date = do + us <- Remote.keyLocations key + return $ u `elem` us && u `S.notMember` notpresent + | otherwise = do + us <- loggedLocationsHistorical (RefDate date) key + return $ u `elem` us + inhere notpresent key + | S.null notpresent = inAnnex key + | otherwise = do + u <- getUUID + if u `S.member` notpresent + then return False + else inAnnex key + +{- Limit to content that is currently present on a uuid. -} +limitPresent :: Maybe UUID -> MkLimit Annex +limitPresent u _ = Right $ matchPresent u + +matchPresent :: Maybe UUID -> MatchFiles Annex +matchPresent u _ = checkKey $ \key -> do + hereu <- getUUID + if u == Just hereu || isNothing u + then inAnnex key + else do + us <- Remote.keyLocations key + return $ maybe False (`elem` us) u + +{- Limit to content that is in a directory, anywhere in the repository tree -} +limitInDir :: FilePath -> MkLimit Annex +limitInDir dir = const $ Right $ const go + where + go (MatchingFile fi) = return $ elem dir $ splitPath $ takeDirectory $ matchFile fi + go (MatchingKey _) = return False + +{- Adds a limit to skip files not believed to have the specified number + - of copies. -} +addCopies :: String -> Annex () +addCopies = addLimit . limitCopies + +limitCopies :: MkLimit Annex +limitCopies want = case split ":" want of + [v, n] -> case parsetrustspec v of + Just checker -> go n $ checktrust checker + Nothing -> go n $ checkgroup v + [n] -> go n $ const $ return True + _ -> Left "bad value for copies" + where + go num good = case readish num of + Nothing -> Left "bad number for copies" + Just n -> Right $ \notpresent -> checkKey $ + handle n good notpresent + handle n good notpresent key = do + us <- filter (`S.notMember` notpresent) + <$> (filterM good =<< Remote.keyLocations key) + return $ length us >= n + checktrust checker u = checker <$> lookupTrust u + checkgroup g u = S.member g <$> lookupGroups u + parsetrustspec s + | "+" `isSuffixOf` s = (>=) <$> readTrustLevel (beginning s) + | otherwise = (==) <$> readTrustLevel s + +{- Adds a limit to match files that need more copies made. -} +addLackingCopies :: Bool -> String -> Annex () +addLackingCopies approx = addLimit . limitLackingCopies approx + +limitLackingCopies :: Bool -> MkLimit Annex +limitLackingCopies approx want = case readish want of + Just needed -> Right $ \notpresent mi -> flip checkKey mi $ + handle mi needed notpresent + Nothing -> Left "bad value for number of lacking copies" + where + handle mi needed notpresent key = do + NumCopies numcopies <- if approx + then approxNumCopies + else case mi of + MatchingKey _ -> approxNumCopies + MatchingFile fi -> getGlobalFileNumCopies $ matchFile fi + us <- filter (`S.notMember` notpresent) + <$> (trustExclude UnTrusted =<< Remote.keyLocations key) + return $ numcopies - length us >= needed + approxNumCopies = fromMaybe defaultNumCopies <$> getGlobalNumCopies + +{- Match keys that are unused. + - + - This has a nice optimisation: When a file exists, + - its key is obviously not unused. + -} +limitUnused :: MatchFiles Annex +limitUnused _ (MatchingFile _) = return False +limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys + +{- Adds a limit to skip files not believed to be present in all + - repositories in the specified group. -} +addInAllGroup :: String -> Annex () +addInAllGroup groupname = do + m <- groupMap + addLimit $ limitInAllGroup m groupname + +limitInAllGroup :: GroupMap -> MkLimit Annex +limitInAllGroup m groupname + | S.null want = Right $ const $ const $ return True + | otherwise = Right $ \notpresent -> checkKey $ check notpresent + where + want = fromMaybe S.empty $ M.lookup groupname $ uuidsByGroup m + check notpresent key + -- optimisation: Check if a wanted uuid is notpresent. + | not (S.null (S.intersection want notpresent)) = return False + | otherwise = do + present <- S.fromList <$> Remote.keyLocations key + return $ S.null $ want `S.difference` present + +{- Adds a limit to skip files not using a specified key-value backend. -} +addInBackend :: String -> Annex () +addInBackend = addLimit . limitInBackend + +limitInBackend :: MkLimit Annex +limitInBackend name = Right $ const $ checkKey check + where + check key = pure $ keyBackendName key == name + +{- Adds a limit to skip files that are too large or too small -} +addLargerThan :: String -> Annex () +addLargerThan = addLimit . limitSize (>) + +addSmallerThan :: String -> Annex () +addSmallerThan = addLimit . limitSize (<) + +limitSize :: (Maybe Integer -> Maybe Integer -> Bool) -> MkLimit Annex +limitSize vs s = case readSize dataUnits s of + Nothing -> Left "bad size" + Just sz -> Right $ go sz + where + go sz _ (MatchingFile fi) = lookupFileKey fi >>= check fi sz + go sz _ (MatchingKey key) = checkkey sz key + checkkey sz key = return $ keySize key `vs` Just sz + check _ sz (Just key) = checkkey sz key + check fi sz Nothing = do + filesize <- liftIO $ catchMaybeIO $ + fromIntegral . fileSize + <$> getFileStatus (relFile fi) + return $ filesize `vs` Just sz + +addMetaData :: String -> Annex () +addMetaData = addLimit . limitMetaData + +limitMetaData :: MkLimit Annex +limitMetaData s = case parseMetaData s of + Left e -> Left e + Right (f, v) -> + let cglob = compileGlob (fromMetaValue v) CaseInsensative + in Right $ const $ checkKey (check f cglob) + where + check f cglob k = not . S.null + . S.filter (matchGlob cglob . fromMetaValue) + . metaDataValues f <$> getCurrentMetaData k + +addTimeLimit :: String -> Annex () +addTimeLimit s = do + let seconds = maybe (error "bad time-limit") durationToPOSIXTime $ + parseDuration s + start <- liftIO getPOSIXTime + let cutoff = start + seconds + addLimit $ Right $ const $ const $ do + now <- liftIO getPOSIXTime + if now > cutoff + then do + warning $ "Time limit (" ++ s ++ ") reached!" + liftIO $ exitWith $ ExitFailure 101 + else return True + +lookupFileKey :: FileInfo -> Annex (Maybe Key) +lookupFileKey = Backend.lookupFile . relFile + +checkKey :: (Key -> Annex Bool) -> MatchInfo -> Annex Bool +checkKey a (MatchingFile fi) = lookupFileKey fi >>= maybe (return False) a +checkKey a (MatchingKey k) = a k diff --git a/Limit/Wanted.hs b/Limit/Wanted.hs new file mode 100644 index 000000000..01b8da6b3 --- /dev/null +++ b/Limit/Wanted.hs @@ -0,0 +1,23 @@ +{- git-annex limits by wanted status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Limit.Wanted where + +import Common.Annex +import Annex.Wanted +import Limit +import Types.FileMatcher + +addWantGet :: Annex () +addWantGet = addLimit $ Right $ const $ checkWant $ wantGet False Nothing + +addWantDrop :: Annex () +addWantDrop = addLimit $ Right $ const $ checkWant $ wantDrop False Nothing Nothing + +checkWant :: (Maybe FilePath -> Annex Bool) -> MatchInfo -> Annex Bool +checkWant a (MatchingFile fi) = a (Just $ matchFile fi) +checkWant _ (MatchingKey _) = return False diff --git a/Locations.hs b/Locations.hs new file mode 100644 index 000000000..d397a97be --- /dev/null +++ b/Locations.hs @@ -0,0 +1,453 @@ +{- git-annex file locations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Locations ( + keyFile, + fileKey, + keyPaths, + keyPath, + annexDir, + objectDir, + gitAnnexLocation, + gitAnnexLink, + gitAnnexContentLock, + gitAnnexMapping, + gitAnnexInodeCache, + gitAnnexInodeSentinal, + gitAnnexInodeSentinalCache, + annexLocations, + annexLocation, + gitAnnexDir, + gitAnnexObjectDir, + gitAnnexTmpMiscDir, + gitAnnexTmpObjectDir, + gitAnnexTmpObjectLocation, + gitAnnexBadDir, + gitAnnexBadLocation, + gitAnnexUnusedLog, + gitAnnexFsckState, + gitAnnexFsckResultsLog, + gitAnnexScheduleState, + gitAnnexTransferDir, + gitAnnexCredsDir, + gitAnnexWebCertificate, + gitAnnexWebPrivKey, + gitAnnexFeedStateDir, + gitAnnexFeedState, + gitAnnexMergeDir, + gitAnnexJournalDir, + gitAnnexJournalLock, + gitAnnexPreCommitLock, + gitAnnexMergeLock, + gitAnnexIndex, + gitAnnexIndexStatus, + gitAnnexViewIndex, + gitAnnexViewLog, + gitAnnexIgnoredRefs, + gitAnnexPidFile, + gitAnnexDaemonStatusFile, + gitAnnexLogFile, + gitAnnexFuzzTestLogFile, + gitAnnexHtmlShim, + gitAnnexUrlFile, + gitAnnexTmpCfgFile, + gitAnnexSshDir, + gitAnnexRemotesDir, + gitAnnexAssistantDefaultDir, + isLinkToAnnex, + annexHashes, + hashDirMixed, + hashDirLower, + preSanitizeKeyName, + + prop_idempotent_fileKey +) where + +import Data.Bits +import Data.Word +import Data.Hash.MD5 +import Data.Char + +import Common +import Types +import Types.Key +import Types.UUID +import qualified Git + +{- Conventions: + - + - Functions ending in "Dir" should always return values ending with a + - trailing path separator. Most code does not rely on that, but a few + - things do. + - + - Everything else should not end in a trailing path sepatator. + - + - Only functions (with names starting with "git") that build a path + - based on a git repository should return an absolute path. + - Everything else should use relative paths. + -} + +{- The directory git annex uses for local state, relative to the .git + - directory -} +annexDir :: FilePath +annexDir = addTrailingPathSeparator "annex" + +{- The directory git annex uses for locally available object content, + - relative to the .git directory -} +objectDir :: FilePath +objectDir = addTrailingPathSeparator $ annexDir "objects" + +{- Annexed file's possible locations relative to the .git directory. + - There are two different possibilities, using different hashes. -} +annexLocations :: Key -> [FilePath] +annexLocations key = map (annexLocation key) annexHashes +annexLocation :: Key -> Hasher -> FilePath +annexLocation key hasher = objectDir keyPath key hasher + +{- Annexed object's absolute location in a repository. + - + - When there are multiple possible locations, returns the one where the + - file is actually present. + - + - When the file is not present, returns the location where the file should + - be stored. + - + - This does not take direct mode into account, so in direct mode it is not + - the actual location of the file's content. + -} +gitAnnexLocation :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexLocation key r config = gitAnnexLocation' key r (annexCrippledFileSystem config) +gitAnnexLocation' :: Key -> Git.Repo -> Bool -> IO FilePath +gitAnnexLocation' key r crippled + {- Bare repositories default to hashDirLower for new + - content, as it's more portable. + - + - Repositories on filesystems that are crippled also use + - hashDirLower, since they do not use symlinks and it's + - more portable. -} + | Git.repoIsLocalBare r || crippled = + check $ map inrepo $ annexLocations key + {- Non-bare repositories only use hashDirMixed, so + - don't need to do any work to check if the file is + - present. -} + | otherwise = return $ inrepo $ annexLocation key hashDirMixed + where + inrepo d = Git.localGitDir r d + check locs@(l:_) = fromMaybe l <$> firstM doesFileExist locs + check [] = error "internal" + +{- Calculates a symlink to link a file to an annexed object. -} +gitAnnexLink :: FilePath -> Key -> Git.Repo -> IO FilePath +gitAnnexLink file key r = do + currdir <- getCurrentDirectory + let absfile = fromMaybe whoops $ absNormPathUnix currdir file + loc <- gitAnnexLocation' key r False + return $ relPathDirToFile (parentDir absfile) loc + where + whoops = error $ "unable to normalize " ++ file + +{- File used to lock a key's content. -} +gitAnnexContentLock :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexContentLock key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".lck" + +{- File that maps from a key to the file(s) in the git repository. + - Used in direct mode. -} +gitAnnexMapping :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexMapping key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".map" + +{- File that caches information about a key's content, used to determine + - if a file has changed. + - Used in direct mode. -} +gitAnnexInodeCache :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexInodeCache key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".cache" + +gitAnnexInodeSentinal :: Git.Repo -> FilePath +gitAnnexInodeSentinal r = gitAnnexDir r "sentinal" + +gitAnnexInodeSentinalCache :: Git.Repo -> FilePath +gitAnnexInodeSentinalCache r = gitAnnexInodeSentinal r ++ ".cache" + +{- The annex directory of a repository. -} +gitAnnexDir :: Git.Repo -> FilePath +gitAnnexDir r = addTrailingPathSeparator $ Git.localGitDir r annexDir + +{- The part of the annex directory where file contents are stored. -} +gitAnnexObjectDir :: Git.Repo -> FilePath +gitAnnexObjectDir r = addTrailingPathSeparator $ Git.localGitDir r objectDir + +{- .git/annex/misctmp/ is used for random temp files -} +gitAnnexTmpMiscDir :: Git.Repo -> FilePath +gitAnnexTmpMiscDir r = addTrailingPathSeparator $ gitAnnexDir r "misctmp" + +{- .git/annex/tmp/ is used for temp files for key's contents -} +gitAnnexTmpObjectDir :: Git.Repo -> FilePath +gitAnnexTmpObjectDir r = addTrailingPathSeparator $ gitAnnexDir r "tmp" + +{- The temp file to use for a given key's content. -} +gitAnnexTmpObjectLocation :: Key -> Git.Repo -> FilePath +gitAnnexTmpObjectLocation key r = gitAnnexTmpObjectDir r keyFile key + +{- .git/annex/bad/ is used for bad files found during fsck -} +gitAnnexBadDir :: Git.Repo -> FilePath +gitAnnexBadDir r = addTrailingPathSeparator $ gitAnnexDir r "bad" + +{- The bad file to use for a given key. -} +gitAnnexBadLocation :: Key -> Git.Repo -> FilePath +gitAnnexBadLocation key r = gitAnnexBadDir r keyFile key + +{- .git/annex/foounused is used to number possibly unused keys -} +gitAnnexUnusedLog :: FilePath -> Git.Repo -> FilePath +gitAnnexUnusedLog prefix r = gitAnnexDir r (prefix ++ "unused") + +{- .git/annex/fsckstate is used to store information about incremental fscks. -} +gitAnnexFsckState :: Git.Repo -> FilePath +gitAnnexFsckState r = gitAnnexDir r "fsckstate" + +{- .git/annex/fsckresults/uuid is used to store results of git fscks -} +gitAnnexFsckResultsLog :: UUID -> Git.Repo -> FilePath +gitAnnexFsckResultsLog u r = gitAnnexDir r "fsckresults" fromUUID u + +{- .git/annex/schedulestate is used to store information about when + - scheduled jobs were last run. -} +gitAnnexScheduleState :: Git.Repo -> FilePath +gitAnnexScheduleState r = gitAnnexDir r "schedulestate" + +{- .git/annex/creds/ is used to store credentials to access some special + - remotes. -} +gitAnnexCredsDir :: Git.Repo -> FilePath +gitAnnexCredsDir r = addTrailingPathSeparator $ gitAnnexDir r "creds" + +{- .git/annex/certificate.pem and .git/annex/key.pem are used by the webapp + - when HTTPS is enabled -} +gitAnnexWebCertificate :: Git.Repo -> FilePath +gitAnnexWebCertificate r = gitAnnexDir r "certificate.pem" +gitAnnexWebPrivKey :: Git.Repo -> FilePath +gitAnnexWebPrivKey r = gitAnnexDir r "privkey.pem" + +{- .git/annex/feeds/ is used to record per-key (url) state by importfeeds -} +gitAnnexFeedStateDir :: Git.Repo -> FilePath +gitAnnexFeedStateDir r = addTrailingPathSeparator $ gitAnnexDir r "feedstate" + +gitAnnexFeedState :: Key -> Git.Repo -> FilePath +gitAnnexFeedState k r = gitAnnexFeedStateDir r keyFile k + +{- .git/annex/merge/ is used for direct mode merges. -} +gitAnnexMergeDir :: Git.Repo -> FilePath +gitAnnexMergeDir r = addTrailingPathSeparator $ gitAnnexDir r "merge" + +{- .git/annex/transfer/ is used to record keys currently + - being transferred, and other transfer bookkeeping info. -} +gitAnnexTransferDir :: Git.Repo -> FilePath +gitAnnexTransferDir r = addTrailingPathSeparator $ gitAnnexDir r "transfer" + +{- .git/annex/journal/ is used to journal changes made to the git-annex + - branch -} +gitAnnexJournalDir :: Git.Repo -> FilePath +gitAnnexJournalDir r = addTrailingPathSeparator $ gitAnnexDir r "journal" + +{- Lock file for the journal. -} +gitAnnexJournalLock :: Git.Repo -> FilePath +gitAnnexJournalLock r = gitAnnexDir r "journal.lck" + +{- Lock file for the pre-commit hook. -} +gitAnnexPreCommitLock :: Git.Repo -> FilePath +gitAnnexPreCommitLock r = gitAnnexDir r "precommit.lck" + +{- Lock file for direct mode merge. -} +gitAnnexMergeLock :: Git.Repo -> FilePath +gitAnnexMergeLock r = gitAnnexDir r "merge.lck" + +{- .git/annex/index is used to stage changes to the git-annex branch -} +gitAnnexIndex :: Git.Repo -> FilePath +gitAnnexIndex r = gitAnnexDir r "index" + +{- Holds the ref of the git-annex branch that the index was last updated to. + - + - The .lck in the name is a historical accident; this is not used as a + - lock. -} +gitAnnexIndexStatus :: Git.Repo -> FilePath +gitAnnexIndexStatus r = gitAnnexDir r "index.lck" + +{- The index file used to generate a filtered branch view._-} +gitAnnexViewIndex :: Git.Repo -> FilePath +gitAnnexViewIndex r = gitAnnexDir r "viewindex" + +{- File containing a log of recently accessed views. -} +gitAnnexViewLog :: Git.Repo -> FilePath +gitAnnexViewLog r = gitAnnexDir r "viewlog" + +{- List of refs that should not be merged into the git-annex branch. -} +gitAnnexIgnoredRefs :: Git.Repo -> FilePath +gitAnnexIgnoredRefs r = gitAnnexDir r "ignoredrefs" + +{- Pid file for daemon mode. -} +gitAnnexPidFile :: Git.Repo -> FilePath +gitAnnexPidFile r = gitAnnexDir r "daemon.pid" + +{- Status file for daemon mode. -} +gitAnnexDaemonStatusFile :: Git.Repo -> FilePath +gitAnnexDaemonStatusFile r = gitAnnexDir r "daemon.status" + +{- Log file for daemon mode. -} +gitAnnexLogFile :: Git.Repo -> FilePath +gitAnnexLogFile r = gitAnnexDir r "daemon.log" + +{- Log file for fuzz test. -} +gitAnnexFuzzTestLogFile :: Git.Repo -> FilePath +gitAnnexFuzzTestLogFile r = gitAnnexDir r "fuzztest.log" + +{- Html shim file used to launch the webapp. -} +gitAnnexHtmlShim :: Git.Repo -> FilePath +gitAnnexHtmlShim r = gitAnnexDir r "webapp.html" + +{- File containing the url to the webapp. -} +gitAnnexUrlFile :: Git.Repo -> FilePath +gitAnnexUrlFile r = gitAnnexDir r "url" + +{- Temporary file used to edit configuriation from the git-annex branch. -} +gitAnnexTmpCfgFile :: Git.Repo -> FilePath +gitAnnexTmpCfgFile r = gitAnnexDir r "config.tmp" + +{- .git/annex/ssh/ is used for ssh connection caching -} +gitAnnexSshDir :: Git.Repo -> FilePath +gitAnnexSshDir r = addTrailingPathSeparator $ gitAnnexDir r "ssh" + +{- .git/annex/remotes/ is used for remote-specific state. -} +gitAnnexRemotesDir :: Git.Repo -> FilePath +gitAnnexRemotesDir r = addTrailingPathSeparator $ gitAnnexDir r "remotes" + +{- This is the base directory name used by the assistant when making + - repositories, by default. -} +gitAnnexAssistantDefaultDir :: FilePath +gitAnnexAssistantDefaultDir = "annex" + +{- Checks a symlink target to see if it appears to point to annexed content. + - + - We only look at paths inside the .git directory, and not at the .git + - directory itself, because GIT_DIR may cause a directory name other + - than .git to be used. + -} +isLinkToAnnex :: FilePath -> Bool +isLinkToAnnex s = (pathSeparator:objectDir) `isInfixOf` s + +{- Sanitizes a String that will be used as part of a Key's keyName, + - dealing with characters that cause problems on substandard filesystems. + - + - This is used when a new Key is initially being generated, eg by getKey. + - Unlike keyFile and fileKey, it does not need to be a reversable + - escaping. Also, it's ok to change this to add more problimatic + - characters later. Unlike changing keyFile, which could result in the + - filenames used for existing keys changing and contents getting lost. + - + - It is, however, important that the input and output of this function + - have a 1:1 mapping, to avoid two different inputs from mapping to the + - same key. + -} +preSanitizeKeyName :: String -> String +preSanitizeKeyName = concatMap escape + where + escape c + | isAsciiUpper c || isAsciiLower c || isDigit c = [c] + | c `elem` ".-_ " = [c] -- common, assumed safe + | c `elem` "/%:" = [c] -- handled by keyFile + -- , is safe and uncommon, so will be used to escape + -- other characters. By itself, it is escaped to + -- doubled form. + | c == ',' = ",," + | otherwise = ',' : show (ord c) + +{- Converts a key into a filename fragment without any directory. + - + - Escape "/" in the key name, to keep a flat tree of files and avoid + - issues with keys containing "/../" or ending with "/" etc. + - + - "/" is escaped to "%" because it's short and rarely used, and resembles + - a slash + - "%" is escaped to "&s", and "&" to "&a"; this ensures that the mapping + - is one to one. + - ":" is escaped to "&c", because it seemed like a good idea at the time. + - + - Changing what this function escapes and how is not a good idea, as it + - can cause existing objects to get lost. + -} +keyFile :: Key -> FilePath +keyFile key = replace "/" "%" $ replace ":" "&c" $ + replace "%" "&s" $ replace "&" "&a" $ key2file key + +{- Reverses keyFile, converting a filename fragment (ie, the basename of + - the symlink target) into a key. -} +fileKey :: FilePath -> Maybe Key +fileKey file = file2key $ + replace "&a" "&" $ replace "&s" "%" $ + replace "&c" ":" $ replace "%" "/" file + +{- for quickcheck -} +prop_idempotent_fileKey :: String -> Bool +prop_idempotent_fileKey s + | null s = True -- it's not legal for a key to have no keyName + | otherwise= Just k == fileKey (keyFile k) + where + k = stubKey { keyName = s, keyBackendName = "test" } + +{- A location to store a key on the filesystem. A directory hash is used, + - to protect against filesystems that dislike having many items in a + - single directory. + - + - The file is put in a directory with the same name, this allows + - write-protecting the directory to avoid accidental deletion of the file. + -} +keyPath :: Key -> Hasher -> FilePath +keyPath key hasher = hasher key f f + where + f = keyFile key + +{- All possibile locations to store a key using different directory hashes. -} +keyPaths :: Key -> [FilePath] +keyPaths key = map (keyPath key) annexHashes + +{- Two different directory hashes may be used. The mixed case hash + - came first, and is fine, except for the problem of case-strict + - filesystems such as Linux VFAT (mounted with shortname=mixed), + - which do not allow using a directory "XX" when "xx" already exists. + - To support that, most repositories use the lower case hash for new data. -} +type Hasher = Key -> FilePath +annexHashes :: [Hasher] +annexHashes = [hashDirLower, hashDirMixed] + +hashDirMixed :: Hasher +hashDirMixed k = addTrailingPathSeparator $ take 2 dir drop 2 dir + where + dir = take 4 $ display_32bits_as_dir =<< [a,b,c,d] + ABCD (a,b,c,d) = md5 $ md5FilePath $ key2file k + +hashDirLower :: Hasher +hashDirLower k = addTrailingPathSeparator $ take 3 dir drop 3 dir + where + dir = take 6 $ md5s $ md5FilePath $ key2file k + +{- modified version of display_32bits_as_hex from Data.Hash.MD5 + - Copyright (C) 2001 Ian Lynagh + - License: Either BSD or GPL + -} +display_32bits_as_dir :: Word32 -> String +display_32bits_as_dir w = trim $ swap_pairs cs + where + -- Need 32 characters to use. To avoid inaverdently making + -- a real word, use letters that appear less frequently. + chars = ['0'..'9'] ++ "zqjxkmvwgpfZQJXKMVWGPF" + cs = map (\x -> getc $ (shiftR w (6*x)) .&. 31) [0..7] + getc n = chars !! fromIntegral n + swap_pairs (x1:x2:xs) = x2:x1:swap_pairs xs + swap_pairs _ = [] + -- Last 2 will always be 00, so omit. + trim = take 6 diff --git a/Logs.hs b/Logs.hs new file mode 100644 index 000000000..c9d58157a --- /dev/null +++ b/Logs.hs @@ -0,0 +1,165 @@ +{- git-annex log file names + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs where + +import Common.Annex +import Types.Key + +{- There are several varieties of log file formats. -} +data LogVariety + = UUIDBasedLog + | NewUUIDBasedLog + | PresenceLog Key + | OtherLog + deriving (Show) + +{- Converts a path from the git-annex branch into one of the varieties + - of logs used by git-annex, if it's a known path. -} +getLogVariety :: FilePath -> Maybe LogVariety +getLogVariety f + | f `elem` topLevelUUIDBasedLogs = Just UUIDBasedLog + | isRemoteStateLog f = Just NewUUIDBasedLog + | isMetaDataLog f || f `elem` otherLogs = Just OtherLog + | otherwise = PresenceLog <$> firstJust (presenceLogs f) + +{- All the uuid-based logs stored in the top of the git-annex branch. -} +topLevelUUIDBasedLogs :: [FilePath] +topLevelUUIDBasedLogs = + [ uuidLog + , remoteLog + , trustLog + , groupLog + , preferredContentLog + , requiredContentLog + , scheduleLog + ] + +{- All the ways to get a key from a presence log file -} +presenceLogs :: FilePath -> [Maybe Key] +presenceLogs f = + [ urlLogFileKey f + , locationLogFileKey f + ] + +{- Logs that are neither UUID based nor presence logs. -} +otherLogs :: [FilePath] +otherLogs = + [ numcopiesLog + , groupPreferredContentLog + ] + +uuidLog :: FilePath +uuidLog = "uuid.log" + +numcopiesLog :: FilePath +numcopiesLog = "numcopies.log" + +remoteLog :: FilePath +remoteLog = "remote.log" + +trustLog :: FilePath +trustLog = "trust.log" + +groupLog :: FilePath +groupLog = "group.log" + +preferredContentLog :: FilePath +preferredContentLog = "preferred-content.log" + +requiredContentLog :: FilePath +requiredContentLog = "required-content.log" + +groupPreferredContentLog :: FilePath +groupPreferredContentLog = "group-preferred-content.log" + +scheduleLog :: FilePath +scheduleLog = "schedule.log" + +{- The pathname of the location log file for a given key. -} +locationLogFile :: Key -> String +locationLogFile key = hashDirLower key ++ keyFile key ++ ".log" + +{- Converts a pathname into a key if it's a location log. -} +locationLogFileKey :: FilePath -> Maybe Key +locationLogFileKey path + | ["remote", "web"] `isPrefixOf` splitDirectories dir = Nothing + | ext == ".log" = fileKey base + | otherwise = Nothing + where + (dir, file) = splitFileName path + (base, ext) = splitAt (length file - 4) file + +{- The filename of the url log for a given key. -} +urlLogFile :: Key -> FilePath +urlLogFile key = hashDirLower key keyFile key ++ urlLogExt + +{- Old versions stored the urls elsewhere. -} +oldurlLogs :: Key -> [FilePath] +oldurlLogs key = + [ "remote/web" hashDirLower key key2file key ++ ".log" + , "remote/web" hashDirLower key keyFile key ++ ".log" + ] + +urlLogExt :: String +urlLogExt = ".log.web" + +{- Converts a url log file into a key. + - (Does not work on oldurlLogs.) -} +urlLogFileKey :: FilePath -> Maybe Key +urlLogFileKey path + | ext == urlLogExt = fileKey base + | otherwise = Nothing + where + file = takeFileName path + (base, ext) = splitAt (length file - extlen) file + extlen = length urlLogExt + +{- Does not work on oldurllogs. -} +isUrlLog :: FilePath -> Bool +isUrlLog file = urlLogExt `isSuffixOf` file + +{- The filename of the remote state log for a given key. -} +remoteStateLogFile :: Key -> FilePath +remoteStateLogFile key = hashDirLower key keyFile key ++ remoteStateLogExt + +remoteStateLogExt :: String +remoteStateLogExt = ".log.rmt" + +isRemoteStateLog :: FilePath -> Bool +isRemoteStateLog path = remoteStateLogExt `isSuffixOf` path + +{- The filename of the metadata log for a given key. -} +metaDataLogFile :: Key -> FilePath +metaDataLogFile key = hashDirLower key keyFile key ++ metaDataLogExt + +metaDataLogExt :: String +metaDataLogExt = ".log.met" + +isMetaDataLog :: FilePath -> Bool +isMetaDataLog path = metaDataLogExt `isSuffixOf` path + +prop_logs_sane :: Key -> Bool +prop_logs_sane dummykey = and + [ isNothing (getLogVariety "unknown") + , expect isUUIDBasedLog (getLogVariety uuidLog) + , expect isPresenceLog (getLogVariety $ locationLogFile dummykey) + , expect isPresenceLog (getLogVariety $ urlLogFile dummykey) + , expect isNewUUIDBasedLog (getLogVariety $ remoteStateLogFile dummykey) + , expect isOtherLog (getLogVariety $ metaDataLogFile dummykey) + , expect isOtherLog (getLogVariety $ numcopiesLog) + ] + where + expect = maybe False + isUUIDBasedLog UUIDBasedLog = True + isUUIDBasedLog _ = False + isNewUUIDBasedLog NewUUIDBasedLog = True + isNewUUIDBasedLog _ = False + isPresenceLog (PresenceLog k) = k == dummykey + isPresenceLog _ = False + isOtherLog OtherLog = True + isOtherLog _ = False diff --git a/Logs/FsckResults.hs b/Logs/FsckResults.hs new file mode 100644 index 000000000..619dd586c --- /dev/null +++ b/Logs/FsckResults.hs @@ -0,0 +1,54 @@ +{- git-annex fsck results log files + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.FsckResults ( + writeFsckResults, + readFsckResults, + clearFsckResults, +) where + +import Common.Annex +import Utility.Tmp +import Git.Fsck +import Git.Types + +import qualified Data.Set as S + +writeFsckResults :: UUID -> FsckResults -> Annex () +writeFsckResults u fsckresults = do + logfile <- fromRepo $ gitAnnexFsckResultsLog u + liftIO $ + case fsckresults of + FsckFailed -> store S.empty False logfile + FsckFoundMissing s t + | S.null s -> nukeFile logfile + | otherwise -> store s t logfile + where + store s t logfile = do + createDirectoryIfMissing True (parentDir logfile) + liftIO $ viaTmp writeFile logfile $ serialize s t + serialize s t = + let ls = map fromRef (S.toList s) + in if t + then unlines ("truncated":ls) + else unlines ls + +readFsckResults :: UUID -> Annex FsckResults +readFsckResults u = do + logfile <- fromRepo $ gitAnnexFsckResultsLog u + liftIO $ catchDefaultIO (FsckFoundMissing S.empty False) $ + deserialize . lines <$> readFile logfile + where + deserialize ("truncated":ls) = deserialize' ls True + deserialize ls = deserialize' ls False + deserialize' ls t = + let s = S.fromList $ map Ref ls + in if S.null s then FsckFailed else FsckFoundMissing s t + +clearFsckResults :: UUID -> Annex () +clearFsckResults = liftIO . nukeFile <=< fromRepo . gitAnnexFsckResultsLog + diff --git a/Logs/Group.hs b/Logs/Group.hs new file mode 100644 index 000000000..3f88b627d --- /dev/null +++ b/Logs/Group.hs @@ -0,0 +1,83 @@ +{- git-annex group log + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Group ( + groupLog, + groupChange, + groupSet, + lookupGroups, + groupMap, + groupMapLoad, + getStandardGroup, + inUnwantedGroup +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX + +import Common.Annex +import Logs +import qualified Annex.Branch +import qualified Annex +import Logs.UUIDBased +import Types.Group +import Types.StandardGroups + +{- Returns the groups of a given repo UUID. -} +lookupGroups :: UUID -> Annex (S.Set Group) +lookupGroups u = (fromMaybe S.empty . M.lookup u) . groupsByUUID <$> groupMap + +{- Applies a set modifier to change the groups for a uuid in the groupLog. -} +groupChange :: UUID -> (S.Set Group -> S.Set Group) -> Annex () +groupChange uuid@(UUID _) modifier = do + curr <- lookupGroups uuid + ts <- liftIO getPOSIXTime + Annex.Branch.change groupLog $ + showLog (unwords . S.toList) . + changeLog ts uuid (modifier curr) . + parseLog (Just . S.fromList . words) + + -- The changed group invalidates the preferred content cache. + Annex.changeState $ \s -> s + { Annex.groupmap = Nothing + , Annex.preferredcontentmap = Nothing + } +groupChange NoUUID _ = error "unknown UUID; cannot modify" + +groupSet :: UUID -> S.Set Group -> Annex () +groupSet u g = groupChange u (const g) + +{- The map is cached for speed. -} +groupMap :: Annex GroupMap +groupMap = maybe groupMapLoad return =<< Annex.getState Annex.groupmap + +{- Loads the map, updating the cache. -} +groupMapLoad :: Annex GroupMap +groupMapLoad = do + m <- makeGroupMap . simpleMap . + parseLog (Just . S.fromList . words) <$> + Annex.Branch.get groupLog + Annex.changeState $ \s -> s { Annex.groupmap = Just m } + return m + +makeGroupMap :: M.Map UUID (S.Set Group) -> GroupMap +makeGroupMap byuuid = GroupMap byuuid bygroup + where + bygroup = M.fromListWith S.union $ + concatMap explode $ M.toList byuuid + explode (u, s) = map (\g -> (g, S.singleton u)) (S.toList s) + +{- If a repository is in exactly one standard group, returns it. -} +getStandardGroup :: S.Set Group -> Maybe StandardGroup +getStandardGroup s = case mapMaybe toStandardGroup $ S.toList s of + [g] -> Just g + _ -> Nothing + +inUnwantedGroup :: UUID -> Annex Bool +inUnwantedGroup u = elem UnwantedGroup + . mapMaybe toStandardGroup . S.toList <$> lookupGroups u diff --git a/Logs/Location.hs b/Logs/Location.hs new file mode 100644 index 000000000..cb1e415fd --- /dev/null +++ b/Logs/Location.hs @@ -0,0 +1,71 @@ +{-# LANGUAGE BangPatterns #-} + +{- git-annex location log + - + - git-annex keeps track of which repositories have the contents of annexed + - files. + - + - Repositories record their UUID and the date when they --get or --drop + - a value. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Location ( + LogStatus(..), + logStatus, + logChange, + loggedLocations, + loggedLocationsHistorical, + loggedKeys, + loggedKeysFor, +) where + +import Common.Annex +import qualified Annex.Branch +import Logs +import Logs.Presence +import Annex.UUID +import Git.Types (RefDate) + +{- Log a change in the presence of a key's value in current repository. -} +logStatus :: Key -> LogStatus -> Annex () +logStatus key s = do + u <- getUUID + logChange key u s + +{- Log a change in the presence of a key's value in a repository. -} +logChange :: Key -> UUID -> LogStatus -> Annex () +logChange key (UUID u) s = addLog (locationLogFile key) =<< logNow s u +logChange _ NoUUID _ = noop + +{- Returns a list of repository UUIDs that, according to the log, have + - the value of a key. -} +loggedLocations :: Key -> Annex [UUID] +loggedLocations = getLoggedLocations currentLog + +{- Gets the location log on a particular date. -} +loggedLocationsHistorical :: RefDate -> Key -> Annex [UUID] +loggedLocationsHistorical = getLoggedLocations . historicalLog + +getLoggedLocations :: (FilePath -> Annex [String]) -> Key -> Annex [UUID] +getLoggedLocations getter key = map toUUID <$> (getter . locationLogFile) key + +{- Finds all keys that have location log information. + - (There may be duplicate keys in the list.) -} +loggedKeys :: Annex [Key] +loggedKeys = mapMaybe locationLogFileKey <$> Annex.Branch.files + +{- Finds all keys that have location log information indicating + - they are present for the specified repository. -} +loggedKeysFor :: UUID -> Annex [Key] +loggedKeysFor u = filterM isthere =<< loggedKeys + where + {- This should run strictly to avoid the filterM + - building many thunks containing keyLocations data. -} + isthere k = do + us <- loggedLocations k + let !there = u `elem` us + return there diff --git a/Logs/MapLog.hs b/Logs/MapLog.hs new file mode 100644 index 000000000..1725ef953 --- /dev/null +++ b/Logs/MapLog.hs @@ -0,0 +1,81 @@ +{- git-annex Map log + - + - This is used to store a Map, in a way that can be union merged. + - + - A line of the log will look like: "timestamp field value" + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.MapLog where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common + +data TimeStamp = Unknown | Date POSIXTime + deriving (Eq, Ord, Show) + +data LogEntry v = LogEntry + { changed :: TimeStamp + , value :: v + } deriving (Eq, Show) + +type MapLog f v = M.Map f (LogEntry v) + +showMapLog :: (f -> String) -> (v -> String) -> MapLog f v -> String +showMapLog fieldshower valueshower = unlines . map showpair . M.toList + where + showpair (f, LogEntry (Date p) v) = + unwords [show p, fieldshower f, valueshower v] + showpair (f, LogEntry Unknown v) = + unwords ["0", fieldshower f, valueshower v] + +parseMapLog :: Ord f => (String -> Maybe f) -> (String -> Maybe v) -> String -> MapLog f v +parseMapLog fieldparser valueparser = M.fromListWith best . mapMaybe parse . lines + where + parse line = do + let (ts, rest) = splitword line + (sf, sv) = splitword rest + date <- Date . utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts + f <- fieldparser sf + v <- valueparser sv + Just (f, LogEntry date v) + splitword = separate (== ' ') + +changeMapLog :: Ord f => POSIXTime -> f -> v -> MapLog f v -> MapLog f v +changeMapLog t f v = M.insert f $ LogEntry (Date t) v + +{- Only add an LogEntry if it's newer (or at least as new as) than any + - existing LogEntry for a field. -} +addMapLog :: Ord f => f -> LogEntry v -> MapLog f v -> MapLog f v +addMapLog = M.insertWith' best + +{- Converts a MapLog into a simple Map without the timestamp information. + - This is a one-way trip, but useful for code that never needs to change + - the log. -} +simpleMap :: MapLog f v -> M.Map f v +simpleMap = M.map value + +best :: LogEntry v -> LogEntry v -> LogEntry v +best new old + | changed old > changed new = old + | otherwise = new + +-- Unknown is oldest. +prop_TimeStamp_sane :: Bool +prop_TimeStamp_sane = Unknown < Date 1 + +prop_addMapLog_sane :: Bool +prop_addMapLog_sane = newWins && newestWins + where + newWins = addMapLog ("foo") (LogEntry (Date 1) "new") l == l2 + newestWins = addMapLog ("foo") (LogEntry (Date 1) "newest") l2 /= l2 + + l = M.fromList [("foo", LogEntry (Date 0) "old")] + l2 = M.fromList [("foo", LogEntry (Date 1) "new")] diff --git a/Logs/MetaData.hs b/Logs/MetaData.hs new file mode 100644 index 000000000..250317090 --- /dev/null +++ b/Logs/MetaData.hs @@ -0,0 +1,186 @@ +{- git-annex general metadata storage log + - + - A line of the log will look like "timestamp field [+-]value [...]" + - + - Note that unset values are preserved. Consider this case: + - + - We have: + - + - 100 foo +x + - 200 foo -x + - + - An unmerged remote has: + - + - 150 foo +x + - + - After union merge, because the foo -x was preserved, we know that + - after the other remote redundantly set foo +x, it was unset, + - and so foo currently has no value. + - + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE CPP #-} + +module Logs.MetaData ( + getCurrentMetaData, + addMetaData, + addMetaData', + currentMetaData, + copyMetaData, +) where + +import Common.Annex +import Types.MetaData +import Annex.MetaData.StandardFields +import qualified Annex.Branch +import Logs +import Logs.SingleValue + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time.Format +import System.Locale + +instance SingleValueSerializable MetaData where + serialize = Types.MetaData.serialize + deserialize = Types.MetaData.deserialize + +getMetaDataLog :: Key -> Annex (Log MetaData) +getMetaDataLog = readLog . metaDataLogFile + +{- Go through the log from oldest to newest, and combine it all + - into a single MetaData representing the current state. + - + - Automatically generates a lastchanged metadata for each field that's + - currently set, based on timestamps in the log. + -} +getCurrentMetaData :: Key -> Annex MetaData +getCurrentMetaData k = do + ls <- S.toAscList <$> getMetaDataLog k + let loggedmeta = currentMetaData $ combineMetaData $ map value ls + return $ currentMetaData $ unionMetaData loggedmeta + (lastchanged ls loggedmeta) + where + lastchanged [] _ = emptyMetaData + lastchanged ls (MetaData currentlyset) = + let m = foldl' (flip M.union) M.empty (map genlastchanged ls) + in MetaData $ + -- Add a overall lastchanged using the oldest log + -- item (log is in ascending order). + M.insert lastChangedField (lastchangedval $ Prelude.last ls) $ + M.mapKeys mkLastChangedField $ + -- Only include fields that are currently set. + m `M.intersection` currentlyset + -- Makes each field have the timestamp as its value. + genlastchanged l = + let MetaData m = value l + ts = lastchangedval l + in M.map (const ts) m + lastchangedval l = S.singleton $ toMetaValue $ showts $ changed l + showts = formatTime defaultTimeLocale "%F@%H-%M-%S" . posixSecondsToUTCTime + +{- Adds in some metadata, which can override existing values, or unset + - them, but otherwise leaves any existing metadata as-is. -} +addMetaData :: Key -> MetaData -> Annex () +addMetaData k metadata = addMetaData' k metadata =<< liftIO getPOSIXTime + +{- Reusing the same timestamp when making changes to the metadata + - of multiple keys is a nice optimisation. The same metadata lines + - will tend to be generated across the different log files, and so + - git will be able to pack the data more efficiently. -} +addMetaData' :: Key -> MetaData -> POSIXTime -> Annex () +addMetaData' k d@(MetaData m) now + | d == emptyMetaData = noop + | otherwise = Annex.Branch.change (metaDataLogFile k) $ + showLog . simplifyLog + . S.insert (LogEntry now metadata) + . parseLog + where + metadata = MetaData $ M.filterWithKey (\f _ -> not (isLastChangedField f)) m + +{- Simplify a log, removing historical values that are no longer + - needed. + - + - This is not as simple as just making a single log line with the newest + - state of all metadata. Consider this case: + - + - We have: + - + - 100 foo +x bar +y + - 200 foo -x + - + - An unmerged remote has: + - + - 150 bar -y baz +w + - + - If what we have were simplified to "200 foo -x bar +y" then when the line + - from the remote became available, it would be older than the simplified + - line, and its change to bar would not take effect. That is wrong. + - + - Instead, simplify it to: + - + - 100 bar +y + - 200 foo -x + - + - (Note that this ends up with the same number of lines as the + - unsimplified version, so there's really no point in updating + - the log to this version. Doing so would only add data to git, + - with little benefit.) + - + - Now merging with the remote yields: + - + - 100 bar +y + - 150 bar -y baz +w + - 200 foo -x + - + - Simplifying again: + - + - 150 bar +z baz +w + - 200 foo -x + -} +simplifyLog :: Log MetaData -> Log MetaData +simplifyLog s = case sl of + (newest:rest) -> + let sl' = go [newest] (value newest) rest + in if length sl' < length sl + then S.fromList sl' + else s + _ -> s + where +#if MIN_VERSION_containers(0,5,0) + sl = S.toDescList s +#else + sl = reverse (S.toAscList s) +#endif + + go c _ [] = c + go c newer (l:ls) + | unique == emptyMetaData = go c newer ls + | otherwise = go (l { value = unique } : c) + (unionMetaData unique newer) ls + where + older = value l + unique = older `differenceMetaData` newer + +{- Copies the metadata from the old key to the new key. + - + - The exact content of the metadata file is copied, so that the timestamps + - remain the same, and because this is more space-efficient in the git + - repository. + - + - Any metadata already attached to the new key is not preserved. + -} +copyMetaData :: Key -> Key -> Annex () +copyMetaData oldkey newkey + | oldkey == newkey = noop + | otherwise = do + l <- getMetaDataLog oldkey + unless (S.null l) $ + Annex.Branch.change (metaDataLogFile newkey) $ + const $ showLog l diff --git a/Logs/NumCopies.hs b/Logs/NumCopies.hs new file mode 100644 index 000000000..5cce61ce6 --- /dev/null +++ b/Logs/NumCopies.hs @@ -0,0 +1,38 @@ +{- git-annex numcopies log + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Logs.NumCopies ( + setGlobalNumCopies, + getGlobalNumCopies, + globalNumCopiesLoad, +) where + +import Common.Annex +import qualified Annex +import Types.NumCopies +import Logs +import Logs.SingleValue + +instance SingleValueSerializable NumCopies where + serialize (NumCopies n) = show n + deserialize = NumCopies <$$> readish + +setGlobalNumCopies :: NumCopies -> Annex () +setGlobalNumCopies = setLog numcopiesLog + +{- Value configured in the numcopies log. Cached for speed. -} +getGlobalNumCopies :: Annex (Maybe NumCopies) +getGlobalNumCopies = maybe globalNumCopiesLoad (return . Just) + =<< Annex.getState Annex.globalnumcopies + +globalNumCopiesLoad :: Annex (Maybe NumCopies) +globalNumCopiesLoad = do + v <- getLog numcopiesLog + Annex.changeState $ \s -> s { Annex.globalnumcopies = v } + return v diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs new file mode 100644 index 000000000..a485ec600 --- /dev/null +++ b/Logs/PreferredContent.hs @@ -0,0 +1,153 @@ +{- git-annex preferred content matcher configuration + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.PreferredContent ( + preferredContentSet, + requiredContentSet, + groupPreferredContentSet, + isPreferredContent, + isRequiredContent, + preferredContentMap, + preferredContentMapRaw, + requiredContentMap, + requiredContentMapRaw, + groupPreferredContentMapRaw, + checkPreferredContentExpression, + setStandardGroup, + defaultStandardGroup, + preferredRequiredMapsLoad, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Either + +import Common.Annex +import Logs.PreferredContent.Raw +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Utility.Matcher hiding (tokens) +import Annex.FileMatcher +import Annex.UUID +import Types.Group +import Types.Remote (RemoteConfig) +import Logs.Group +import Logs.Remote +import Types.FileMatcher +import Types.StandardGroups +import Limit + +{- Checks if a file is preferred content for the specified repository + - (or the current repository if none is specified). -} +isPreferredContent :: Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +isPreferredContent = checkMap preferredContentMap + +isRequiredContent :: Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +isRequiredContent = checkMap requiredContentMap + +checkMap :: Annex (FileMatcherMap Annex) -> Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +checkMap getmap mu notpresent mkey afile def = do + u <- maybe getUUID return mu + m <- getmap + case M.lookup u m of + Nothing -> return def + Just matcher -> checkMatcher matcher mkey afile notpresent def + +preferredContentMap :: Annex (FileMatcherMap Annex) +preferredContentMap = maybe (fst <$> preferredRequiredMapsLoad) return + =<< Annex.getState Annex.preferredcontentmap + +requiredContentMap :: Annex (FileMatcherMap Annex) +requiredContentMap = maybe (snd <$> preferredRequiredMapsLoad) return + =<< Annex.getState Annex.requiredcontentmap + +preferredRequiredMapsLoad :: Annex (FileMatcherMap Annex, FileMatcherMap Annex) +preferredRequiredMapsLoad = do + groupmap <- groupMap + configmap <- readRemoteLog + let genmap l gm = simpleMap + . parseLogWithUUID ((Just .) . makeMatcher groupmap configmap gm) + <$> Annex.Branch.get l + pc <- genmap preferredContentLog =<< groupPreferredContentMapRaw + rc <- genmap requiredContentLog M.empty + -- Required content is implicitly also preferred content, so OR + let m = M.unionWith MOr pc rc + Annex.changeState $ \s -> s + { Annex.preferredcontentmap = Just m + , Annex.requiredcontentmap = Just rc + } + return (m, rc) + +{- This intentionally never fails, even on unparsable expressions, + - because the configuration is shared among repositories and newer + - versions of git-annex may add new features. -} +makeMatcher + :: GroupMap + -> M.Map UUID RemoteConfig + -> M.Map Group PreferredContentExpression + -> UUID + -> PreferredContentExpression + -> FileMatcher Annex +makeMatcher groupmap configmap groupwantedmap u = go True True + where + go expandstandard expandgroupwanted expr + | null (lefts tokens) = generate $ rights tokens + | otherwise = unknownMatcher u + where + tokens = exprParser matchstandard matchgroupwanted groupmap configmap (Just u) expr + matchstandard + | expandstandard = maybe (unknownMatcher u) (go False False) + (standardPreferredContent <$> getStandardGroup mygroups) + | otherwise = unknownMatcher u + matchgroupwanted + | expandgroupwanted = maybe (unknownMatcher u) (go True False) + (groupwanted mygroups) + | otherwise = unknownMatcher u + mygroups = fromMaybe S.empty (u `M.lookup` groupsByUUID groupmap) + groupwanted s = case M.elems $ M.filterWithKey (\k _ -> S.member k s) groupwantedmap of + [pc] -> Just pc + _ -> Nothing + +{- When a preferred content expression cannot be parsed, but is already + - in the log (eg, put there by a newer version of git-annex), + - the fallback behavior is to match only files that are currently present. + - + - This avoid unwanted/expensive changes to the content, until the problem + - is resolved. -} +unknownMatcher :: UUID -> FileMatcher Annex +unknownMatcher u = generate [present] + where + present = Operation $ matchPresent (Just u) + +{- Checks if an expression can be parsed, if not returns Just error -} +checkPreferredContentExpression :: PreferredContentExpression -> Maybe String +checkPreferredContentExpression expr = case parsedToMatcher tokens of + Left e -> Just e + Right _ -> Nothing + where + tokens = exprParser matchAll matchAll emptyGroupMap M.empty Nothing expr + +{- Puts a UUID in a standard group, and sets its preferred content to use + - the standard expression for that group (unless preferred content is + - already set). -} +setStandardGroup :: UUID -> StandardGroup -> Annex () +setStandardGroup u g = do + groupSet u $ S.singleton $ fromStandardGroup g + unlessM (isJust . M.lookup u <$> preferredContentMap) $ + preferredContentSet u "standard" + +{- Avoids overwriting the UUID's standard group or preferred content + - when it's already been configured. -} +defaultStandardGroup :: UUID -> StandardGroup -> Annex () +defaultStandardGroup u g = + unlessM (hasgroup <||> haspc) $ + setStandardGroup u g + where + hasgroup = not . S.null <$> lookupGroups u + haspc = isJust . M.lookup u <$> preferredContentMap diff --git a/Logs/PreferredContent/Raw.hs b/Logs/PreferredContent/Raw.hs new file mode 100644 index 000000000..bbf5a1edc --- /dev/null +++ b/Logs/PreferredContent/Raw.hs @@ -0,0 +1,62 @@ +{- unparsed preferred content expressions + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.PreferredContent.Raw where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Common.Annex +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Logs.MapLog +import Types.StandardGroups +import Types.Group + +{- Changes the preferred content configuration of a remote. -} +preferredContentSet :: UUID -> PreferredContentExpression -> Annex () +preferredContentSet = setLog preferredContentLog + +requiredContentSet :: UUID -> PreferredContentExpression -> Annex () +requiredContentSet = setLog requiredContentLog + +setLog :: FilePath -> UUID -> PreferredContentExpression -> Annex () +setLog logfile uuid@(UUID _) val = do + ts <- liftIO getPOSIXTime + Annex.Branch.change logfile $ + showLog id + . changeLog ts uuid val + . parseLog Just + Annex.changeState $ \s -> s + { Annex.preferredcontentmap = Nothing + , Annex.requiredcontentmap = Nothing + } +setLog _ NoUUID _ = error "unknown UUID; cannot modify" + +{- Changes the preferred content configuration of a group. -} +groupPreferredContentSet :: Group -> PreferredContentExpression -> Annex () +groupPreferredContentSet g val = do + ts <- liftIO getPOSIXTime + Annex.Branch.change groupPreferredContentLog $ + showMapLog id id + . changeMapLog ts g val + . parseMapLog Just Just + Annex.changeState $ \s -> s { Annex.preferredcontentmap = Nothing } + +preferredContentMapRaw :: Annex (M.Map UUID PreferredContentExpression) +preferredContentMapRaw = simpleMap . parseLog Just + <$> Annex.Branch.get preferredContentLog + +requiredContentMapRaw :: Annex (M.Map UUID PreferredContentExpression) +requiredContentMapRaw = simpleMap . parseLog Just + <$> Annex.Branch.get requiredContentLog + +groupPreferredContentMapRaw :: Annex (M.Map Group PreferredContentExpression) +groupPreferredContentMapRaw = simpleMap . parseMapLog Just Just + <$> Annex.Branch.get groupPreferredContentLog diff --git a/Logs/Presence.hs b/Logs/Presence.hs new file mode 100644 index 000000000..7545f5afc --- /dev/null +++ b/Logs/Presence.hs @@ -0,0 +1,56 @@ +{- git-annex presence log + - + - This is used to store presence information in the git-annex branch in + - a way that can be union merged. + - + - A line of the log will look like: "date N INFO" + - Where N=1 when the INFO is present, and 0 otherwise. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Presence ( + module X, + addLog, + readLog, + logNow, + currentLog, + historicalLog +) where + +import Data.Time.Clock.POSIX + +import Logs.Presence.Pure as X +import Common.Annex +import qualified Annex.Branch +import Git.Types (RefDate) + +addLog :: FilePath -> LogLine -> Annex () +addLog file line = Annex.Branch.change file $ \s -> + showLog $ compactLog (line : parseLog s) + +{- Reads a log file. + - Note that the LogLines returned may be in any order. -} +readLog :: FilePath -> Annex [LogLine] +readLog = parseLog <$$> Annex.Branch.get + +{- Generates a new LogLine with the current date. -} +logNow :: LogStatus -> String -> Annex LogLine +logNow s i = do + now <- liftIO getPOSIXTime + return $ LogLine now s i + +{- Reads a log and returns only the info that is still in effect. -} +currentLog :: FilePath -> Annex [String] +currentLog file = map info . filterPresent <$> readLog file + +{- Reads a historical version of a log and returns the info that was in + - effect at that time. + - + - The date is formatted as shown in gitrevisions man page. + -} +historicalLog :: RefDate -> FilePath -> Annex [String] +historicalLog refdate file = map info . filterPresent . parseLog + <$> Annex.Branch.getHistorical refdate file diff --git a/Logs/Presence/Pure.hs b/Logs/Presence/Pure.hs new file mode 100644 index 000000000..ffeb78b26 --- /dev/null +++ b/Logs/Presence/Pure.hs @@ -0,0 +1,84 @@ +{- git-annex presence log, pure operations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Presence.Pure where + +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Map as M + +import Common.Annex +import Utility.QuickCheck + +data LogLine = LogLine { + date :: POSIXTime, + status :: LogStatus, + info :: String +} deriving (Eq, Show) + +data LogStatus = InfoPresent | InfoMissing + deriving (Eq, Show, Bounded, Enum) + +{- Parses a log file. Unparseable lines are ignored. -} +parseLog :: String -> [LogLine] +parseLog = mapMaybe parseline . lines + where + parseline l = LogLine + <$> (utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" d) + <*> parsestatus s + <*> pure rest + where + (d, pastd) = separate (== ' ') l + (s, rest) = separate (== ' ') pastd + parsestatus "1" = Just InfoPresent + parsestatus "0" = Just InfoMissing + parsestatus _ = Nothing + +{- Generates a log file. -} +showLog :: [LogLine] -> String +showLog = unlines . map genline + where + genline (LogLine d s i) = unwords [show d, genstatus s, i] + genstatus InfoPresent = "1" + genstatus InfoMissing = "0" + +{- Given a log, returns only the info that is are still in effect. -} +getLog :: String -> [String] +getLog = map info . filterPresent . parseLog + +{- Returns the info from LogLines that are in effect. -} +filterPresent :: [LogLine] -> [LogLine] +filterPresent = filter (\l -> InfoPresent == status l) . compactLog + +{- Compacts a set of logs, returning a subset that contains the current + - status. -} +compactLog :: [LogLine] -> [LogLine] +compactLog = M.elems . foldr mapLog M.empty + +type LogMap = M.Map String LogLine + +{- Inserts a log into a map of logs, if the log has better (ie, newer) + - information than the other logs in the map -} +mapLog :: LogLine -> LogMap -> LogMap +mapLog l m + | better = M.insert i l m + | otherwise = m + where + better = maybe True newer $ M.lookup i m + newer l' = date l' <= date l + i = info l + +instance Arbitrary LogLine where + arbitrary = LogLine + <$> arbitrary + <*> elements [minBound..maxBound] + <*> arbitrary `suchThat` ('\n' `notElem`) + +prop_parse_show_log :: [LogLine] -> Bool +prop_parse_show_log l = parseLog (showLog l) == l + diff --git a/Logs/Remote.hs b/Logs/Remote.hs new file mode 100644 index 000000000..48ee9eb60 --- /dev/null +++ b/Logs/Remote.hs @@ -0,0 +1,97 @@ +{- git-annex remote log + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Remote ( + remoteLog, + readRemoteLog, + configSet, + keyValToConfig, + configToKeyVal, + showConfig, + parseConfig, + + prop_idempotent_configEscape, + prop_parse_show_Config, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Char + +import Common.Annex +import qualified Annex.Branch +import Types.Remote +import Logs +import Logs.UUIDBased + +{- Adds or updates a remote's config in the log. -} +configSet :: UUID -> RemoteConfig -> Annex () +configSet u c = do + ts <- liftIO getPOSIXTime + Annex.Branch.change remoteLog $ + showLog showConfig . changeLog ts u c . parseLog parseConfig + +{- Map of remotes by uuid containing key/value config maps. -} +readRemoteLog :: Annex (M.Map UUID RemoteConfig) +readRemoteLog = simpleMap . parseLog parseConfig <$> Annex.Branch.get remoteLog + +parseConfig :: String -> Maybe RemoteConfig +parseConfig = Just . keyValToConfig . words + +showConfig :: RemoteConfig -> String +showConfig = unwords . configToKeyVal + +{- Given Strings like "key=value", generates a RemoteConfig. -} +keyValToConfig :: [String] -> RemoteConfig +keyValToConfig ws = M.fromList $ map (/=/) ws + where + (/=/) s = (k, v) + where + k = takeWhile (/= '=') s + v = configUnEscape $ drop (1 + length k) s + +configToKeyVal :: M.Map String String -> [String] +configToKeyVal m = map toword $ sort $ M.toList m + where + toword (k, v) = k ++ "=" ++ configEscape v + +configEscape :: String -> String +configEscape = concatMap escape + where + escape c + | isSpace c || c `elem` "&" = "&" ++ show (ord c) ++ ";" + | otherwise = [c] + +configUnEscape :: String -> String +configUnEscape = unescape + where + unescape [] = [] + unescape (c:rest) + | c == '&' = entity rest + | otherwise = c : unescape rest + entity s + | not (null num) && ";" `isPrefixOf` r = + chr (Prelude.read num) : unescape rest + | otherwise = + '&' : unescape s + where + num = takeWhile isNumber s + r = drop (length num) s + rest = drop 1 r + +{- for quickcheck -} +prop_idempotent_configEscape :: String -> Bool +prop_idempotent_configEscape s = s == (configUnEscape . configEscape) s + +prop_parse_show_Config :: RemoteConfig -> Bool +prop_parse_show_Config c + -- whitespace and '=' are not supported in keys + | any (\k -> any isSpace k || elem '=' k) (M.keys c) = True + | otherwise = parseConfig (showConfig c) ~~ Just c + where + normalize v = sort . M.toList <$> v + a ~~ b = normalize a == normalize b diff --git a/Logs/RemoteState.hs b/Logs/RemoteState.hs new file mode 100644 index 000000000..195d710c7 --- /dev/null +++ b/Logs/RemoteState.hs @@ -0,0 +1,33 @@ +{- Remote state logs. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.RemoteState ( + getRemoteState, + setRemoteState, +) where + +import Common.Annex +import Logs +import Logs.UUIDBased +import qualified Annex.Branch + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +type RemoteState = String + +setRemoteState :: UUID -> Key -> RemoteState -> Annex () +setRemoteState u k s = do + ts <- liftIO getPOSIXTime + Annex.Branch.change (remoteStateLogFile k) $ + showLogNew id . changeLog ts u s . parseLogNew Just + +getRemoteState :: UUID -> Key -> Annex (Maybe RemoteState) +getRemoteState u k = extract . parseLogNew Just + <$> Annex.Branch.get (remoteStateLogFile k) + where + extract m = value <$> M.lookup u m diff --git a/Logs/Schedule.hs b/Logs/Schedule.hs new file mode 100644 index 000000000..1d78467bb --- /dev/null +++ b/Logs/Schedule.hs @@ -0,0 +1,72 @@ +{- git-annex scheduled activities log + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Schedule ( + scheduleLog, + scheduleSet, + scheduleAdd, + scheduleRemove, + scheduleChange, + scheduleGet, + scheduleMap, + getLastRunTimes, + setLastRunTime, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time.LocalTime + +import Common.Annex +import Types.ScheduledActivity +import qualified Annex.Branch +import Logs +import Logs.UUIDBased +import Utility.Tmp + +scheduleSet :: UUID -> [ScheduledActivity] -> Annex () +scheduleSet uuid@(UUID _) activities = do + ts <- liftIO getPOSIXTime + Annex.Branch.change scheduleLog $ + showLog id . changeLog ts uuid val . parseLog Just + where + val = fromScheduledActivities activities +scheduleSet NoUUID _ = error "unknown UUID; cannot modify" + +scheduleMap :: Annex (M.Map UUID [ScheduledActivity]) +scheduleMap = simpleMap + . parseLogWithUUID parser + <$> Annex.Branch.get scheduleLog + where + parser _uuid = eitherToMaybe . parseScheduledActivities + +scheduleGet :: UUID -> Annex (S.Set ScheduledActivity) +scheduleGet u = do + m <- scheduleMap + return $ maybe S.empty S.fromList (M.lookup u m) + +scheduleRemove :: UUID -> ScheduledActivity -> Annex () +scheduleRemove u activity = scheduleChange u $ S.delete activity + +scheduleAdd :: UUID -> ScheduledActivity -> Annex () +scheduleAdd u activity = scheduleChange u $ S.insert activity + +scheduleChange :: UUID -> (S.Set ScheduledActivity -> S.Set ScheduledActivity) -> Annex () +scheduleChange u a = scheduleSet u . S.toList . a =<< scheduleGet u + +getLastRunTimes :: Annex (M.Map ScheduledActivity LocalTime) +getLastRunTimes = do + f <- fromRepo gitAnnexScheduleState + liftIO $ fromMaybe M.empty + <$> catchDefaultIO Nothing (readish <$> readFile f) + +setLastRunTime :: ScheduledActivity -> LocalTime -> Annex () +setLastRunTime activity lastrun = do + f <- fromRepo gitAnnexScheduleState + liftIO . viaTmp writeFile f . show . M.insert activity lastrun + =<< getLastRunTimes diff --git a/Logs/SingleValue.hs b/Logs/SingleValue.hs new file mode 100644 index 000000000..cbebdc8e5 --- /dev/null +++ b/Logs/SingleValue.hs @@ -0,0 +1,65 @@ +{- git-annex single-value log + - + - This is used to store a value in a way that can be union merged. + - + - A line of the log will look like: "timestamp value" + - + - The line with the newest timestamp wins. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.SingleValue where + +import Common.Annex +import qualified Annex.Branch + +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +class SingleValueSerializable v where + serialize :: v -> String + deserialize :: String -> Maybe v + +data LogEntry v = LogEntry + { changed :: POSIXTime + , value :: v + } deriving (Eq, Show, Ord) + +type Log v = S.Set (LogEntry v) + +showLog :: (SingleValueSerializable v) => Log v -> String +showLog = unlines . map showline . S.toList + where + showline (LogEntry t v) = unwords [show t, serialize v] + +parseLog :: (Ord v, SingleValueSerializable v) => String -> Log v +parseLog = S.fromList . mapMaybe parse . lines + where + parse line = do + let (ts, s) = splitword line + date <- utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts + v <- deserialize s + Just (LogEntry date v) + splitword = separate (== ' ') + +newestValue :: Log v -> Maybe v +newestValue s + | S.null s = Nothing + | otherwise = Just (value $ S.findMax s) + +readLog :: (Ord v, SingleValueSerializable v) => FilePath -> Annex (Log v) +readLog = parseLog <$$> Annex.Branch.get + +getLog :: (Ord v, SingleValueSerializable v) => FilePath -> Annex (Maybe v) +getLog = newestValue <$$> readLog + +setLog :: (SingleValueSerializable v) => FilePath -> v -> Annex () +setLog f v = do + now <- liftIO getPOSIXTime + let ent = LogEntry now v + Annex.Branch.change f $ \_old -> showLog (S.singleton ent) diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs new file mode 100644 index 000000000..c96d9cd1e --- /dev/null +++ b/Logs/Transfer.hs @@ -0,0 +1,323 @@ +{- git-annex transfer information files and lock files + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Logs.Transfer where + +import Common.Annex +import Annex.Perms +import Annex.Exception +import qualified Git +import Types.Key +import Utility.Metered +import Utility.Percentage +import Utility.QuickCheck +import Utility.PID +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import Data.Time.Clock +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import Control.Concurrent + +{- Enough information to uniquely identify a transfer, used as the filename + - of the transfer information file. -} +data Transfer = Transfer + { transferDirection :: Direction + , transferUUID :: UUID + , transferKey :: Key + } + deriving (Eq, Ord, Read, Show) + +{- Information about a Transfer, stored in the transfer information file. + - + - Note that the associatedFile may not correspond to a file in the local + - git repository. It's some file, possibly relative to some directory, + - of some repository, that was acted on to initiate the transfer. + -} +data TransferInfo = TransferInfo + { startedTime :: Maybe POSIXTime + , transferPid :: Maybe PID + , transferTid :: Maybe ThreadId + , transferRemote :: Maybe Remote + , bytesComplete :: Maybe Integer + , associatedFile :: Maybe FilePath + , transferPaused :: Bool + } + deriving (Show, Eq, Ord) + +stubTransferInfo :: TransferInfo +stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing Nothing False + +data Direction = Upload | Download + deriving (Eq, Ord, Read, Show) + +showLcDirection :: Direction -> String +showLcDirection Upload = "upload" +showLcDirection Download = "download" + +readLcDirection :: String -> Maybe Direction +readLcDirection "upload" = Just Upload +readLcDirection "download" = Just Download +readLcDirection _ = Nothing + +describeTransfer :: Transfer -> TransferInfo -> String +describeTransfer t info = unwords + [ show $ transferDirection t + , show $ transferUUID t + , fromMaybe (key2file $ transferKey t) (associatedFile info) + , show $ bytesComplete info + ] + +{- Transfers that will accomplish the same task. -} +equivilantTransfer :: Transfer -> Transfer -> Bool +equivilantTransfer t1 t2 + | transferDirection t1 == Download && transferDirection t2 == Download && + transferKey t1 == transferKey t2 = True + | otherwise = t1 == t2 + +percentComplete :: Transfer -> TransferInfo -> Maybe Percentage +percentComplete (Transfer { transferKey = key }) info = + percentage <$> keySize key <*> Just (fromMaybe 0 $ bytesComplete info) + +{- Generates a callback that can be called as transfer progresses to update + - the transfer info file. Also returns the file it'll be updating, and a + - MVar that can be used to read the number of bytesComplete. -} +mkProgressUpdater :: Transfer -> TransferInfo -> Annex (MeterUpdate, FilePath, MVar Integer) +mkProgressUpdater t info = do + tfile <- fromRepo $ transferFile t + _ <- tryAnnex $ createAnnexDirectory $ takeDirectory tfile + mvar <- liftIO $ newMVar 0 + return (liftIO . updater tfile mvar, tfile, mvar) + where + updater tfile mvar b = modifyMVar_ mvar $ \oldbytes -> do + let newbytes = fromBytesProcessed b + if newbytes - oldbytes >= mindelta + then do + let info' = info { bytesComplete = Just newbytes } + _ <- tryIO $ writeTransferInfoFile info' tfile + return newbytes + else return oldbytes + {- The minimum change in bytesComplete that is worth + - updating a transfer info file for is 1% of the total + - keySize, rounded down. -} + mindelta = case keySize (transferKey t) of + Just sz -> sz `div` 100 + Nothing -> 100 * 1024 -- arbitrarily, 100 kb + +startTransferInfo :: Maybe FilePath -> IO TransferInfo +startTransferInfo file = TransferInfo + <$> (Just . utcTimeToPOSIXSeconds <$> getCurrentTime) +#ifndef mingw32_HOST_OS + <*> pure Nothing -- pid not stored in file, so omitted for speed +#else + <*> (Just <$> getPID) +#endif + <*> pure Nothing -- tid ditto + <*> pure Nothing -- not 0; transfer may be resuming + <*> pure Nothing + <*> pure file + <*> pure False + +{- If a transfer is still running, returns its TransferInfo. -} +checkTransfer :: Transfer -> Annex (Maybe TransferInfo) +checkTransfer t = do + tfile <- fromRepo $ transferFile t +#ifndef mingw32_HOST_OS + mode <- annexFileMode + mfd <- liftIO $ catchMaybeIO $ + openFd (transferLockFile tfile) ReadOnly (Just mode) defaultFileFlags + case mfd of + Nothing -> return Nothing -- failed to open file; not running + Just fd -> do + locked <- liftIO $ + getLock fd (WriteLock, AbsoluteSeek, 0, 0) + liftIO $ closeFd fd + case locked of + Nothing -> return Nothing + Just (pid, _) -> liftIO $ catchDefaultIO Nothing $ + readTransferInfoFile (Just pid) tfile +#else + v <- liftIO $ lockShared $ transferLockFile tfile + liftIO $ case v of + Nothing -> catchDefaultIO Nothing $ + readTransferInfoFile Nothing tfile + Just lockhandle -> do + dropLock lockhandle + void $ tryIO $ removeFile $ transferLockFile tfile + return Nothing +#endif + +{- Gets all currently running transfers. -} +getTransfers :: Annex [(Transfer, TransferInfo)] +getTransfers = do + transfers <- mapMaybe parseTransferFile . concat <$> findfiles + infos <- mapM checkTransfer transfers + return $ map (\(t, Just i) -> (t, i)) $ + filter running $ zip transfers infos + where + findfiles = liftIO . mapM dirContentsRecursive + =<< mapM (fromRepo . transferDir) [Download, Upload] + running (_, i) = isJust i + +{- Gets failed transfers for a given remote UUID. -} +getFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)] +getFailedTransfers u = catMaybes <$> (liftIO . getpairs =<< concat <$> findfiles) + where + getpairs = mapM $ \f -> do + let mt = parseTransferFile f + mi <- readTransferInfoFile Nothing f + return $ case (mt, mi) of + (Just t, Just i) -> Just (t, i) + _ -> Nothing + findfiles = liftIO . mapM dirContentsRecursive + =<< mapM (fromRepo . failedTransferDir u) [Download, Upload] + +clearFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)] +clearFailedTransfers u = do + failed <- getFailedTransfers u + mapM_ (removeFailedTransfer . fst) failed + return failed + +removeFailedTransfer :: Transfer -> Annex () +removeFailedTransfer t = do + f <- fromRepo $ failedTransferFile t + liftIO $ void $ tryIO $ removeFile f + +recordFailedTransfer :: Transfer -> TransferInfo -> Annex () +recordFailedTransfer t info = do + failedtfile <- fromRepo $ failedTransferFile t + createAnnexDirectory $ takeDirectory failedtfile + liftIO $ writeTransferInfoFile info failedtfile + +{- The transfer information file to use for a given Transfer. -} +transferFile :: Transfer -> Git.Repo -> FilePath +transferFile (Transfer direction u key) r = transferDir direction r + filter (/= '/') (fromUUID u) + keyFile key + +{- The transfer information file to use to record a failed Transfer -} +failedTransferFile :: Transfer -> Git.Repo -> FilePath +failedTransferFile (Transfer direction u key) r = failedTransferDir u direction r + keyFile key + +{- The transfer lock file corresponding to a given transfer info file. -} +transferLockFile :: FilePath -> FilePath +transferLockFile infofile = let (d,f) = splitFileName infofile in + combine d ("lck." ++ f) + +{- Parses a transfer information filename to a Transfer. -} +parseTransferFile :: FilePath -> Maybe Transfer +parseTransferFile file + | "lck." `isPrefixOf` takeFileName file = Nothing + | otherwise = case drop (length bits - 3) bits of + [direction, u, key] -> Transfer + <$> readLcDirection direction + <*> pure (toUUID u) + <*> fileKey key + _ -> Nothing + where + bits = splitDirectories file + +writeTransferInfoFile :: TransferInfo -> FilePath -> IO () +writeTransferInfoFile info tfile = writeFileAnyEncoding tfile $ + writeTransferInfo info + +{- File format is a header line containing the startedTime and any + - bytesComplete value. Followed by a newline and the associatedFile. + - + - On unix, the transferPid is not included; instead it is obtained + - by looking at the process that locks the file. + - + - On windows, the transferPid is included, as a second line. + -} +writeTransferInfo :: TransferInfo -> String +writeTransferInfo info = unlines + [ (maybe "" show $ startedTime info) ++ + (maybe "" (\b -> ' ' : show b) (bytesComplete info)) +#ifdef mingw32_HOST_OS + , maybe "" show (transferPid info) +#endif + , fromMaybe "" $ associatedFile info -- comes last; arbitrary content + ] + +readTransferInfoFile :: Maybe PID -> FilePath -> IO (Maybe TransferInfo) +readTransferInfoFile mpid tfile = catchDefaultIO Nothing $ + readTransferInfo mpid <$> readFileStrictAnyEncoding tfile + +readTransferInfo :: Maybe PID -> String -> Maybe TransferInfo +readTransferInfo mpid s = TransferInfo + <$> time +#ifdef mingw32_HOST_OS + <*> pure (if isJust mpid then mpid else mpid') +#else + <*> pure mpid +#endif + <*> pure Nothing + <*> pure Nothing + <*> bytes + <*> pure (if null filename then Nothing else Just filename) + <*> pure False + where +#ifdef mingw32_HOST_OS + (firstline, otherlines) = separate (== '\n') s + (secondline, rest) = separate (== '\n') otherlines + mpid' = readish secondline +#else + (firstline, rest) = separate (== '\n') s +#endif + filename + | end rest == "\n" = beginning rest + | otherwise = rest + bits = split " " firstline + numbits = length bits + time = if numbits > 0 + then Just <$> parsePOSIXTime =<< headMaybe bits + else pure Nothing -- not failure + bytes = if numbits > 1 + then Just <$> readish =<< headMaybe (drop 1 bits) + else pure Nothing -- not failure + +parsePOSIXTime :: String -> Maybe POSIXTime +parsePOSIXTime s = utcTimeToPOSIXSeconds + <$> parseTime defaultTimeLocale "%s%Qs" s + +{- The directory holding transfer information files for a given Direction. -} +transferDir :: Direction -> Git.Repo -> FilePath +transferDir direction r = gitAnnexTransferDir r showLcDirection direction + +{- The directory holding failed transfer information files for a given + - Direction and UUID -} +failedTransferDir :: UUID -> Direction -> Git.Repo -> FilePath +failedTransferDir u direction r = gitAnnexTransferDir r + "failed" + showLcDirection direction + filter (/= '/') (fromUUID u) + +instance Arbitrary TransferInfo where + arbitrary = TransferInfo + <$> arbitrary + <*> arbitrary + <*> pure Nothing -- cannot generate a ThreadID + <*> pure Nothing -- remote not needed + <*> arbitrary + -- associated file cannot be empty (but can be Nothing) + <*> arbitrary `suchThat` (/= Just "") + <*> arbitrary + +prop_read_write_transferinfo :: TransferInfo -> Bool +prop_read_write_transferinfo info + | isJust (transferRemote info) = True -- remote not stored + | isJust (transferTid info) = True -- tid not stored + | otherwise = Just (info { transferPaused = False }) == info' + where + info' = readTransferInfo (transferPid info) (writeTransferInfo info) + diff --git a/Logs/Transitions.hs b/Logs/Transitions.hs new file mode 100644 index 000000000..64e9d3344 --- /dev/null +++ b/Logs/Transitions.hs @@ -0,0 +1,86 @@ +{- git-annex transitions log + - + - This is used to record transitions that have been performed on the + - git-annex branch, and when the transition was first started. + - + - We can quickly detect when the local branch has already had an transition + - done that is listed in the remote branch by checking that the local + - branch contains the same transition, with the same or newer start time. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Transitions where + +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Set as S + +import Common.Annex + +transitionsLog :: FilePath +transitionsLog = "transitions.log" + +data Transition + = ForgetGitHistory + | ForgetDeadRemotes + deriving (Show, Ord, Eq, Read) + +data TransitionLine = TransitionLine + { transitionStarted :: POSIXTime + , transition :: Transition + } deriving (Show, Ord, Eq) + +type Transitions = S.Set TransitionLine + +describeTransition :: Transition -> String +describeTransition ForgetGitHistory = "forget git history" +describeTransition ForgetDeadRemotes = "forget dead remotes" + +noTransitions :: Transitions +noTransitions = S.empty + +addTransition :: POSIXTime -> Transition -> Transitions -> Transitions +addTransition ts t = S.insert $ TransitionLine ts t + +showTransitions :: Transitions -> String +showTransitions = unlines . map showTransitionLine . S.elems + +{- If the log contains new transitions we don't support, returns Nothing. -} +parseTransitions :: String -> Maybe Transitions +parseTransitions = check . map parseTransitionLine . lines + where + check l + | all isJust l = Just $ S.fromList $ catMaybes l + | otherwise = Nothing + +parseTransitionsStrictly :: String -> String -> Transitions +parseTransitionsStrictly source = fromMaybe badsource . parseTransitions + where + badsource = error $ "unknown transitions listed in " ++ source ++ "; upgrade git-annex!" + +showTransitionLine :: TransitionLine -> String +showTransitionLine (TransitionLine ts t) = unwords [show t, show ts] + +parseTransitionLine :: String -> Maybe TransitionLine +parseTransitionLine s = TransitionLine <$> pdate ds <*> readish ts + where + ws = words s + ts = Prelude.head ws + ds = unwords $ Prelude.tail ws + pdate = utcTimeToPOSIXSeconds <$$> parseTime defaultTimeLocale "%s%Qs" + +combineTransitions :: [Transitions] -> Transitions +combineTransitions = S.unions + +transitionList :: Transitions -> [Transition] +transitionList = map transition . S.elems + +{- Typically ran with Annex.Branch.change, but we can't import Annex.Branch + - here since it depends on this module. -} +recordTransitions :: (FilePath -> (String -> String) -> Annex ()) -> Transitions -> Annex () +recordTransitions changer t = changer transitionsLog $ + showTransitions . S.union t . parseTransitionsStrictly "local" diff --git a/Logs/Trust.hs b/Logs/Trust.hs new file mode 100644 index 000000000..c6f0ad3ab --- /dev/null +++ b/Logs/Trust.hs @@ -0,0 +1,97 @@ +{- git-annex trust log + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Trust ( + module X, + trustLog, + TrustLevel(..), + trustGet, + trustMap, + trustSet, + trustPartition, + trustExclude, + lookupTrust, + trustMapLoad, + trustMapRaw, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Common.Annex +import Types.TrustLevel +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Remote.List +import qualified Types.Remote +import Logs.Trust.Pure as X + +{- Returns a list of UUIDs that the trustLog indicates have the + - specified trust level. + - Note that the list can be incomplete for SemiTrusted, since that's + - the default. -} +trustGet :: TrustLevel -> Annex [UUID] +trustGet level = M.keys . M.filter (== level) <$> trustMap + +{- Changes the trust level for a uuid in the trustLog. -} +trustSet :: UUID -> TrustLevel -> Annex () +trustSet uuid@(UUID _) level = do + ts <- liftIO getPOSIXTime + Annex.Branch.change trustLog $ + showLog showTrustLog . + changeLog ts uuid level . + parseLog (Just . parseTrustLog) + Annex.changeState $ \s -> s { Annex.trustmap = Nothing } +trustSet NoUUID _ = error "unknown UUID; cannot modify" + +{- Returns the TrustLevel of a given repo UUID. -} +lookupTrust :: UUID -> Annex TrustLevel +lookupTrust u = (fromMaybe SemiTrusted . M.lookup u) <$> trustMap + +{- Partitions a list of UUIDs to those matching a TrustLevel and not. -} +trustPartition :: TrustLevel -> [UUID] -> Annex ([UUID], [UUID]) +trustPartition level ls + | level == SemiTrusted = do + t <- trustGet Trusted + u <- trustGet UnTrusted + d <- trustGet DeadTrusted + let uncandidates = t ++ u ++ d + return $ partition (`notElem` uncandidates) ls + | otherwise = do + candidates <- trustGet level + return $ partition (`elem` candidates) ls + +{- Filters UUIDs to those not matching a TrustLevel. -} +trustExclude :: TrustLevel -> [UUID] -> Annex [UUID] +trustExclude level ls = snd <$> trustPartition level ls + +{- trustLog in a map, overridden with any values from forcetrust or + - the git config. The map is cached for speed. -} +trustMap :: Annex TrustMap +trustMap = maybe trustMapLoad return =<< Annex.getState Annex.trustmap + +{- Loads the map, updating the cache, -} +trustMapLoad :: Annex TrustMap +trustMapLoad = do + overrides <- Annex.getState Annex.forcetrust + logged <- trustMapRaw + configured <- M.fromList . catMaybes + <$> (map configuredtrust <$> remoteList) + let m = M.union overrides $ M.union configured logged + Annex.changeState $ \s -> s { Annex.trustmap = Just m } + return m + where + configuredtrust r = (\l -> Just (Types.Remote.uuid r, l)) + =<< readTrustLevel + =<< remoteAnnexTrustLevel (Types.Remote.gitconfig r) + +{- Does not include forcetrust or git config values, just those from the + - log file. -} +trustMapRaw :: Annex TrustMap +trustMapRaw = calcTrustMap <$> Annex.Branch.get trustLog diff --git a/Logs/Trust/Pure.hs b/Logs/Trust/Pure.hs new file mode 100644 index 000000000..11cfbe056 --- /dev/null +++ b/Logs/Trust/Pure.hs @@ -0,0 +1,36 @@ +{- git-annex trust log, pure operations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Trust.Pure where + +import Common.Annex +import Types.TrustLevel +import Logs.UUIDBased + +calcTrustMap :: String -> TrustMap +calcTrustMap = simpleMap . parseLog (Just . parseTrustLog) + +{- The trust.log used to only list trusted repos, without a field for the + - trust status, which is why this defaults to Trusted. -} +parseTrustLog :: String -> TrustLevel +parseTrustLog s = maybe Trusted parse $ headMaybe $ words s + where + parse "1" = Trusted + parse "0" = UnTrusted + parse "X" = DeadTrusted + parse _ = SemiTrusted + +showTrustLog :: TrustLevel -> String +showTrustLog Trusted = "1" +showTrustLog UnTrusted = "0" +showTrustLog DeadTrusted = "X" +showTrustLog SemiTrusted = "?" + +prop_parse_show_TrustLog :: Bool +prop_parse_show_TrustLog = all check [minBound .. maxBound] + where + check l = parseTrustLog (showTrustLog l) == l diff --git a/Logs/UUID.hs b/Logs/UUID.hs new file mode 100644 index 000000000..154f86d51 --- /dev/null +++ b/Logs/UUID.hs @@ -0,0 +1,96 @@ +{- git-annex uuids + - + - Each git repository used by git-annex has an annex.uuid setting that + - uniquely identifies that repository. + - + - UUIDs of remotes are cached in git config, using keys named + - remote..annex-uuid + - + - uuid.log stores a list of known uuids, and their descriptions. + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.UUID ( + uuidLog, + describeUUID, + recordUUID, + uuidMap, + uuidMapLoad +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Types.UUID +import Common.Annex +import qualified Annex +import qualified Annex.Branch +import Logs +import Logs.UUIDBased +import qualified Annex.UUID + +{- Records a description for a uuid in the log. -} +describeUUID :: UUID -> String -> Annex () +describeUUID uuid desc = do + ts <- liftIO getPOSIXTime + Annex.Branch.change uuidLog $ + showLog id . changeLog ts uuid desc . fixBadUUID . parseLog Just + +{- Temporarily here to fix badly formatted uuid logs generated by + - versions 3.20111105 and 3.20111025. + - + - Those logs contain entries with the UUID and description flipped. + - Due to parsing, if the description is multiword, only the first + - will be taken to be the UUID. So, if the UUID of an entry does + - not look like a UUID, and the last word of the description does, + - flip them back. + -} +fixBadUUID :: Log String -> Log String +fixBadUUID = M.fromList . map fixup . M.toList + where + fixup (k, v) + | isbad = (fixeduuid, LogEntry (Date $ newertime v) fixedvalue) + | otherwise = (k, v) + where + kuuid = fromUUID k + isbad = not (isuuid kuuid) && not (null ws) && isuuid lastword + ws = words $ value v + lastword = Prelude.last ws + fixeduuid = toUUID lastword + fixedvalue = unwords $ kuuid: Prelude.init ws + -- For the fixed line to take precidence, it should be + -- slightly newer, but only slightly. + newertime (LogEntry (Date d) _) = d + minimumPOSIXTimeSlice + newertime (LogEntry Unknown _) = minimumPOSIXTimeSlice + minimumPOSIXTimeSlice = 0.000001 + isuuid s = length s == 36 && length (split "-" s) == 5 + +{- Records the uuid in the log, if it's not already there. -} +recordUUID :: UUID -> Annex () +recordUUID u = go . M.lookup u =<< uuidMap + where + go (Just "") = set + go Nothing = set + go _ = noop + set = describeUUID u "" + +{- The map is cached for speed. -} +uuidMap :: Annex UUIDMap +uuidMap = maybe uuidMapLoad return =<< Annex.getState Annex.uuidmap + +{- Read the uuidLog into a simple Map. + - + - The UUID of the current repository is included explicitly, since + - it may not have been described and so otherwise would not appear. -} +uuidMapLoad :: Annex UUIDMap +uuidMapLoad = do + m <- (simpleMap . parseLog Just) <$> Annex.Branch.get uuidLog + u <- Annex.UUID.getUUID + let m' = M.insertWith' preferold u "" m + Annex.changeState $ \s -> s { Annex.uuidmap = Just m' } + return m' + where + preferold = flip const diff --git a/Logs/UUIDBased.hs b/Logs/UUIDBased.hs new file mode 100644 index 000000000..b403b6253 --- /dev/null +++ b/Logs/UUIDBased.hs @@ -0,0 +1,93 @@ +{- git-annex uuid-based logs + - + - This is used to store information about a UUID in a way that can + - be union merged. + - + - A line of the log will look like: "UUID[ INFO[ timestamp=foo]]" + - The timestamp is last for backwards compatability reasons, + - and may not be present on old log lines. + - + - New uuid based logs instead use the form: "timestamp UUID INFO" + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.UUIDBased ( + Log, + LogEntry(..), + TimeStamp(..), + parseLog, + parseLogNew, + parseLogWithUUID, + showLog, + showLogNew, + changeLog, + addLog, + simpleMap, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common +import Types.UUID +import Logs.MapLog + +type Log v = MapLog UUID v + +showLog :: (v -> String) -> Log v -> String +showLog shower = unlines . map showpair . M.toList + where + showpair (k, LogEntry (Date p) v) = + unwords [fromUUID k, shower v, tskey ++ show p] + showpair (k, LogEntry Unknown v) = + unwords [fromUUID k, shower v] + +parseLog :: (String -> Maybe a) -> String -> Log a +parseLog = parseLogWithUUID . const + +parseLogWithUUID :: (UUID -> String -> Maybe a) -> String -> Log a +parseLogWithUUID parser = M.fromListWith best . mapMaybe parse . lines + where + parse line + -- This is a workaround for a bug that caused + -- NoUUID items to be stored in the log. + -- It can be removed at any time; is just here to clean + -- up logs where that happened temporarily. + | " " `isPrefixOf` line = Nothing + | null ws = Nothing + | otherwise = parser u (unwords info) >>= makepair + where + makepair v = Just (u, LogEntry ts v) + ws = words line + u = toUUID $ Prelude.head ws + t = Prelude.last ws + ts + | tskey `isPrefixOf` t = + pdate $ drop 1 $ dropWhile (/= '=') t + | otherwise = Unknown + info + | ts == Unknown = drop 1 ws + | otherwise = drop 1 $ beginning ws + pdate s = case parseTime defaultTimeLocale "%s%Qs" s of + Nothing -> Unknown + Just d -> Date $ utcTimeToPOSIXSeconds d + +showLogNew :: (v -> String) -> Log v -> String +showLogNew = showMapLog fromUUID + +parseLogNew :: (String -> Maybe v) -> String -> Log v +parseLogNew = parseMapLog (Just . toUUID) + +changeLog :: POSIXTime -> UUID -> v -> Log v -> Log v +changeLog = changeMapLog + +addLog :: UUID -> LogEntry v -> Log v -> Log v +addLog = addMapLog + +tskey :: String +tskey = "timestamp=" diff --git a/Logs/Unused.hs b/Logs/Unused.hs new file mode 100644 index 000000000..cadf7ed9d --- /dev/null +++ b/Logs/Unused.hs @@ -0,0 +1,118 @@ +{- git-annex unused log file + - + - This file is stored locally in .git/annex/, not in the git-annex branch. + - + - The format: "int key timestamp" + - + - The int is a short, stable identifier that the user can use to + - refer to this key. (Equivilant to a filename.) + - + - The timestamp indicates when the key was first determined to be unused. + - Older versions of the log omit the timestamp. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Logs.Unused ( + UnusedMap, + updateUnusedLog, + readUnusedLog, + readUnusedMap, + dateUnusedLog, + unusedKeys, + unusedKeys', + setUnusedKeys, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common.Annex +import qualified Annex +import Types.Key +import Utility.Tmp + +-- everything that is stored in the unused log +type UnusedLog = M.Map Key (Int, Maybe POSIXTime) + +-- used to look up unused keys specified by the user +type UnusedMap = M.Map Int Key + +log2map :: UnusedLog -> UnusedMap +log2map = M.fromList . map (\(k, (i, _t)) -> (i, k)) . M.toList + +map2log :: POSIXTime -> UnusedMap -> UnusedLog +map2log t = M.fromList . map (\(i, k) -> (k, (i, Just t))) . M.toList + +{- Only keeps keys that are in the new log, but uses any timestamps + - those keys had in the old log. -} +preserveTimestamps :: UnusedLog -> UnusedLog -> UnusedLog +preserveTimestamps oldl newl = M.intersection (M.unionWith oldts oldl newl) newl + where + oldts _old@(_, ts) _new@(int, _) = (int, ts) + +updateUnusedLog :: FilePath -> UnusedMap -> Annex () +updateUnusedLog prefix m = do + oldl <- readUnusedLog prefix + newl <- preserveTimestamps oldl . flip map2log m <$> liftIO getPOSIXTime + writeUnusedLog prefix newl + +writeUnusedLog :: FilePath -> UnusedLog -> Annex () +writeUnusedLog prefix l = do + logfile <- fromRepo $ gitAnnexUnusedLog prefix + liftIO $ viaTmp writeFileAnyEncoding logfile $ unlines $ map format $ M.toList l + where + format (k, (i, Just t)) = show i ++ " " ++ key2file k ++ " " ++ show t + format (k, (i, Nothing)) = show i ++ " " ++ key2file k + +readUnusedLog :: FilePath -> Annex UnusedLog +readUnusedLog prefix = do + f <- fromRepo $ gitAnnexUnusedLog prefix + ifM (liftIO $ doesFileExist f) + ( M.fromList . mapMaybe parse . lines + <$> liftIO (readFileStrictAnyEncoding f) + , return M.empty + ) + where + parse line = case (readish sint, file2key skey, utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts) of + (Just int, Just key, mtimestamp) -> Just (key, (int, mtimestamp)) + _ -> Nothing + where + (sint, rest) = separate (== ' ') line + (rts, rskey) = separate (== ' ') (reverse rest) + skey = reverse rskey + ts = reverse rts + +readUnusedMap :: FilePath -> Annex UnusedMap +readUnusedMap = log2map <$$> readUnusedLog + +dateUnusedLog :: FilePath -> Annex (Maybe UTCTime) +#if MIN_VERSION_directory(1,2,0) +dateUnusedLog prefix = do + f <- fromRepo $ gitAnnexUnusedLog prefix + liftIO $ catchMaybeIO $ getModificationTime f +#else +-- old ghc's getModificationTime returned a ClockTime +dateUnusedLog _prefix = return Nothing +#endif + +{- Set of unused keys. This is cached for speed. -} +unusedKeys :: Annex (S.Set Key) +unusedKeys = maybe (setUnusedKeys =<< unusedKeys') return + =<< Annex.getState Annex.unusedkeys + +unusedKeys' :: Annex [Key] +unusedKeys' = M.keys <$> readUnusedLog "" + +setUnusedKeys :: [Key] -> Annex (S.Set Key) +setUnusedKeys ks = do + let v = S.fromList ks + Annex.changeState $ \s -> s { Annex.unusedkeys = Just v } + return v diff --git a/Logs/View.hs b/Logs/View.hs new file mode 100644 index 000000000..b2a92c405 --- /dev/null +++ b/Logs/View.hs @@ -0,0 +1,97 @@ +{- git-annex recent views log + - + - The most recently accessed view comes first. + - + - This file is stored locally in .git/annex/, not in the git-annex branch. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.View ( + currentView, + setView, + removeView, + recentViews, + branchView, + is_branchView, + prop_branchView_legal, +) where + +import Common.Annex +import Types.View +import Types.MetaData +import qualified Git +import qualified Git.Branch +import qualified Git.Ref +import Git.Types +import Utility.Tmp + +import qualified Data.Set as S +import Data.Char + +setView :: View -> Annex () +setView v = do + old <- take 99 . filter (/= v) <$> recentViews + writeViews (v : old) + +writeViews :: [View] -> Annex () +writeViews l = do + f <- fromRepo gitAnnexViewLog + liftIO $ viaTmp writeFile f $ unlines $ map show l + +removeView :: View -> Annex () +removeView v = writeViews =<< filter (/= v) <$> recentViews + +recentViews :: Annex [View] +recentViews = do + f <- fromRepo gitAnnexViewLog + liftIO $ mapMaybe readish . lines <$> catchDefaultIO [] (readFile f) + +{- Gets the currently checked out view, if there is one. -} +currentView :: Annex (Maybe View) +currentView = go =<< inRepo Git.Branch.current + where + go (Just b) | branchViewPrefix `isPrefixOf` fromRef b = + headMaybe . filter (\v -> branchView v == b) <$> recentViews + go _ = return Nothing + +branchViewPrefix :: String +branchViewPrefix = "refs/heads/views" + +{- Generates a git branch name for a View. + - + - There is no guarantee that each view gets a unique branch name, + - but the branch name is used to express the view as well as possible. + -} +branchView :: View -> Git.Branch +branchView view + | null name = Git.Ref branchViewPrefix + | otherwise = Git.Ref $ branchViewPrefix ++ "/" ++ name + where + name = intercalate ";" $ map branchcomp (viewComponents view) + branchcomp c + | viewVisible c = branchcomp' c + | otherwise = "(" ++ branchcomp' c ++ ")" + branchcomp' (ViewComponent metafield viewfilter _) =concat + [ forcelegal (fromMetaField metafield) + , branchvals viewfilter + ] + branchvals (FilterValues set) = '=' : branchset set + branchvals (FilterGlob glob) = '=' : forcelegal glob + branchvals (ExcludeValues set) = "!=" ++ branchset set + branchset = intercalate "," + . map (forcelegal . fromMetaValue) + . S.toList + forcelegal s + | Git.Ref.legal True s = s + | otherwise = map (\c -> if isAlphaNum c then c else '_') s + +is_branchView :: Git.Branch -> Bool +is_branchView (Ref b) + | b == branchViewPrefix = True + | otherwise = (branchViewPrefix ++ "/") `isPrefixOf` b + +prop_branchView_legal :: View -> Bool +prop_branchView_legal = Git.Ref.legal False . fromRef . branchView diff --git a/Logs/Web.hs b/Logs/Web.hs new file mode 100644 index 000000000..ede600ec2 --- /dev/null +++ b/Logs/Web.hs @@ -0,0 +1,95 @@ +{- Web url logs. + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Web ( + URLString, + webUUID, + getUrls, + setUrlPresent, + setUrlMissing, + knownUrls, + Downloader(..), + getDownloader, + setDownloader, +) where + +import qualified Data.ByteString.Lazy.Char8 as L +import Data.Tuple.Utils + +import Common.Annex +import Logs +import Logs.Presence +import Logs.Location +import qualified Annex.Branch +import Annex.CatFile +import qualified Git +import qualified Git.LsFiles + +type URLString = String + +-- Dummy uuid for the whole web. Do not alter. +webUUID :: UUID +webUUID = UUID "00000000-0000-0000-0000-000000000001" + +{- Gets all urls that a key might be available from. -} +getUrls :: Key -> Annex [URLString] +getUrls key = go $ urlLogFile key : oldurlLogs key + where + go [] = return [] + go (l:ls) = do + us <- currentLog l + if null us + then go ls + else return us + +setUrlPresent :: Key -> URLString -> Annex () +setUrlPresent key url = do + us <- getUrls key + unless (url `elem` us) $ do + addLog (urlLogFile key) =<< logNow InfoPresent url + -- update location log to indicate that the web has the key + logChange key webUUID InfoPresent + +setUrlMissing :: Key -> URLString -> Annex () +setUrlMissing key url = do + addLog (urlLogFile key) =<< logNow InfoMissing url + whenM (null <$> getUrls key) $ + logChange key webUUID InfoMissing + +{- Finds all known urls. -} +knownUrls :: Annex [URLString] +knownUrls = do + {- Ensure the git-annex branch's index file is up-to-date and + - any journaled changes are reflected in it, since we're going + - to query its index directly. -} + Annex.Branch.update + Annex.Branch.commit "update" + Annex.Branch.withIndex $ do + top <- fromRepo Git.repoPath + (l, cleanup) <- inRepo $ Git.LsFiles.stagedDetails [top] + r <- mapM (geturls . snd3) $ filter (isUrlLog . fst3) l + void $ liftIO cleanup + return $ concat r + where + geturls Nothing = return [] + geturls (Just logsha) = getLog . L.unpack <$> catObject logsha + +data Downloader = DefaultDownloader | QuviDownloader + +{- Determines the downloader for an URL. + - + - Some URLs are not downloaded by normal means, and this is indicated + - by prefixing them with downloader: when they are recorded in the url + - logs. -} +getDownloader :: URLString -> (URLString, Downloader) +getDownloader u = case separate (== ':') u of + ("quvi", u') -> (u', QuviDownloader) + _ -> (u, DefaultDownloader) + +setDownloader :: URLString -> Downloader -> URLString +setDownloader u DefaultDownloader = u +setDownloader u QuviDownloader = "quvi:" ++ u diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..5c47e9486 --- /dev/null +++ b/Makefile @@ -0,0 +1,262 @@ +mans=git-annex.1 git-annex-shell.1 +all=git-annex $(mans) docs + +CABAL?=cabal # set to "./Setup" if you lack a cabal program +GHC?=ghc + +PREFIX?=/usr +SHAREDIR?=share + +# Am I typing :make in vim? Do a fast build. +ifdef VIM +all=fast +endif + +build: build-stamp +build-stamp: $(all) + touch $@ + +Build/SysConfig.hs: configure.hs Build/TestConfig.hs Build/Configure.hs + if [ "$(CABAL)" = ./Setup ]; then ghc --make Setup; fi + $(CABAL) configure + +git-annex: Build/SysConfig.hs + $(CABAL) build + ln -sf dist/build/git-annex/git-annex git-annex + +git-annex.1: doc/git-annex.mdwn + ./Build/mdwn2man git-annex 1 doc/git-annex.mdwn > git-annex.1 +git-annex-shell.1: doc/git-annex-shell.mdwn + ./Build/mdwn2man git-annex-shell 1 doc/git-annex-shell.mdwn > git-annex-shell.1 + +# These are not built normally. +git-union-merge.1: doc/git-union-merge.mdwn + ./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1 +git-union-merge: + $(GHC) --make -threaded $@ + +install-mans: $(mans) + install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1 + install -m 0644 $(mans) $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1 + +install-docs: docs install-mans + install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex + if [ -d html ]; then \ + rsync -a --delete html/ $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex/html/; \ + fi + +install: build install-docs Build/InstallDesktopFile + install -d $(DESTDIR)$(PREFIX)/bin + install git-annex $(DESTDIR)$(PREFIX)/bin + ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell + ./Build/InstallDesktopFile $(PREFIX)/bin/git-annex || true + +test: git-annex + ./git-annex test + +retest: git-annex + ./git-annex test --rerun-update --rerun-filter failures + +# hothasktags chokes on some template haskell etc, so ignore errors +tags: + (for f in $$(find . | grep -v /.git/ | grep -v /tmp/ | grep -v /dist/ | grep -v /doc/ | egrep '\.hs$$'); do hothasktags -c --cpp -c -traditional -c --include=dist/build/autogen/cabal_macros.h $$f; done) 2>/dev/null | sort > tags + +# If ikiwiki is available, build static html docs suitable for being +# shipped in the software package. +ifeq ($(shell which ikiwiki),) +IKIWIKI=@echo "** ikiwiki not found, skipping building docs" >&2; true +else +IKIWIKI=ikiwiki +endif + +docs: $(mans) + $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \ + --no-usedirs --disable-plugin=openid --plugin=sidebar \ + --underlaydir=/dev/null --disable-plugin=shortcut \ + --disable-plugin=smiley \ + --plugin=comments --set comments_pagespec="*" \ + --exclude='news/.*' --exclude='design/assistant/blog/*' \ + --exclude='bugs/*' --exclude='todo/*' --exclude='forum/*' \ + --exclude='users/*' --exclude='devblog/*' + +clean: + rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ + doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \ + Setup Build/InstallDesktopFile Build/EvilSplicer \ + Build/Standalone Build/OSXMkLibs Build/LinuxMkLibs \ + Build/DistributionUpdate Build/BuildVersion \ + git-union-merge .tasty-rerun-log + find . -name \*.o -exec rm {} \; + find . -name \*.hi -exec rm {} \; + +Build/InstallDesktopFile: Build/InstallDesktopFile.hs + $(GHC) --make $@ -Wall +Build/EvilSplicer: Build/EvilSplicer.hs + $(GHC) --make $@ -Wall +Build/Standalone: Build/Standalone.hs Build/SysConfig.hs + $(GHC) --make $@ -Wall +Build/OSXMkLibs: Build/OSXMkLibs.hs + $(GHC) --make $@ -Wall +Build/LinuxMkLibs: Build/LinuxMkLibs.hs + $(GHC) --make $@ -Wall + +sdist: clean $(mans) + ./Build/make-sdist.sh + +# Upload to hackage. +hackage: sdist + @cabal upload dist/*.tar.gz + +LINUXSTANDALONE_DEST=tmp/git-annex.linux +linuxstandalone: + $(MAKE) git-annex linuxstandalone-nobuild +linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs + rm -rf "$(LINUXSTANDALONE_DEST)" + mkdir -p tmp + cp -R standalone/linux/skel "$(LINUXSTANDALONE_DEST)" + + install -d "$(LINUXSTANDALONE_DEST)/bin" + cp dist/build/git-annex/git-annex "$(LINUXSTANDALONE_DEST)/bin/" + strip "$(LINUXSTANDALONE_DEST)/bin/git-annex" + ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell" + zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE + cp doc/logo_16x16.png doc/logo.svg $(LINUXSTANDALONE_DEST) + cp standalone/trustedkeys.gpg $(LINUXSTANDALONE_DEST) + + ./Build/Standalone "$(LINUXSTANDALONE_DEST)" + + install -d "$(LINUXSTANDALONE_DEST)/git-core" + (cd "$(shell git --exec-path)" && tar c .) | (cd "$(LINUXSTANDALONE_DEST)"/git-core && tar x) + install -d "$(LINUXSTANDALONE_DEST)/templates" + + ./Build/LinuxMkLibs "$(LINUXSTANDALONE_DEST)" + + $(MAKE) install-mans DESTDIR="$(LINUXSTANDALONE_DEST)" + + cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST + cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST + cd tmp && tar czf git-annex-standalone-$(shell dpkg --print-architecture).tar.gz git-annex.linux + +OSXAPP_DEST=tmp/build-dmg/git-annex.app +OSXAPP_BASE=$(OSXAPP_DEST)/Contents/MacOS/bundle +osxapp: Build/Standalone Build/OSXMkLibs + $(MAKE) git-annex + + rm -rf "$(OSXAPP_DEST)" "$(OSXAPP_BASE)" + install -d tmp/build-dmg + cp -R standalone/osx/git-annex.app "$(OSXAPP_DEST)" + + install -d "$(OSXAPP_BASE)" + cp git-annex "$(OSXAPP_BASE)" + strip "$(OSXAPP_BASE)/git-annex" + ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell" + gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE + cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt + cp standalone/trustedkeys.gpg $(OSXAPP_BASE) + + ./Build/Standalone $(OSXAPP_BASE) + + (cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)" && tar x) + install -d "$(OSXAPP_BASE)/templates" + + # OSX looks in man dir nearby the bin + $(MAKE) install-mans DESTDIR="$(OSXAPP_BASE)/.." SHAREDIR="" PREFIX="" + + ./Build/OSXMkLibs $(OSXAPP_BASE) + cd $(OSXAPP_DEST) && find . -type f > Contents/MacOS/git-annex.MANIFEST + cd $(OSXAPP_DEST) && find . -type l >> Contents/MacOS/git-annex.MANIFEST + rm -f tmp/git-annex.dmg + hdiutil create -format UDBZ -size 640m -srcfolder tmp/build-dmg \ + -volname git-annex -o tmp/git-annex.dmg + +# Must be run on a system with TH supported, and the same +# versions of TH splice generating packages as the arm system installed. +no-th-webapp-stage1: Build/EvilSplicer + echo "Running throwaway build, to get TH splices.." + if [ ! -e dist/setup/setup ]; then $(CABAL) configure -f-Production -O0; fi + mkdir -p tmp + if ! $(CABAL) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi + echo "Setting up no-th build tree.." + ./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs + rsync -az --exclude tmp --exclude dist . tmp/no-th-tree +# Copy the files with expanded splices to the source tree, but +# only if the existing source file is not newer. (So, if a file +# used to have TH splices but they were removed, it will be newer, +# and not overwritten.) + cp -uR tmp/splices/* tmp/no-th-tree || true +# Some additional dependencies needed by the expanded splices. + sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, /' tmp/no-th-tree/git-annex.cabal +# Avoid warnings due to sometimes unused imports added for the splices. + sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports -XMagicHash /i' tmp/no-th-tree/git-annex.cabal + +# Run on the arm system, after stage1 +no-th-webapp-stage2: + if [ ! -e tmp/no-th-tree/dist/setup-config ]; then \ + cd tmp/no-th-tree && cabal configure; \ + fi + cd tmp/no-th-tree && cabal build --ghc-option=-D__NO_TH__ + cd tmp/no-th-tree && $(MAKE) linuxstandalone-nobuild + +ANDROID_FLAGS?= +# Cross compile for Android. +# Uses https://github.com/neurocyte/ghc-android +android: Build/EvilSplicer + echo "Running native build, to get TH splices.." + if [ ! -e dist/setup/setup ]; then $(CABAL) configure -f-Production -O0 $(ANDROID_FLAGS) -fAndroidSplice; fi + mkdir -p tmp + if ! $(CABAL) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi + echo "Setting up Android build tree.." + ./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs + rsync -az --exclude tmp --exclude dist . tmp/androidtree +# Copy the files with expanded splices to the source tree, but +# only if the existing source file is not newer. (So, if a file +# used to have TH splices but they were removed, it will be newer, +# and not overwritten.) + cp -uR tmp/splices/* tmp/androidtree || true +# Some additional dependencies needed by the expanded splices. + sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, /' tmp/androidtree/git-annex.cabal +# Avoid warnings due to sometimes unused imports added for the splices. + sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports -XMagicHash /i' tmp/androidtree/git-annex.cabal +# Cabal cannot cross compile with custom build type, so workaround. + sed -i 's/Build-type: Custom/Build-type: Simple/' tmp/androidtree/git-annex.cabal +# Build just once, but link twice, for 2 different versions of Android. + mkdir -p tmp/androidtree/dist/build/git-annex/4.0 tmp/androidtree/dist/build/git-annex/4.3 + if [ ! -e tmp/androidtree/dist/setup-config ]; then \ + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal configure -fAndroid $(ANDROID_FLAGS); \ + fi + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \ + && mv dist/build/git-annex/git-annex dist/build/git-annex/4.0/git-annex + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \ + --ghc-options=-optl-z --ghc-options=-optlnocopyreloc \ + && mv dist/build/git-annex/git-annex dist/build/git-annex/4.3/git-annex + +androidapp: + $(MAKE) android + $(MAKE) -C standalone/android + +# We bypass cabal, and only run the main ghc --make command for a +# fast development built. Note: Does not rebuild C libraries. +fast: dist/caballog + @$$(grep 'ghc --make' dist/caballog | head -n 1 | sed -e 's/-package-id [^ ]*//g' -e 's/-hide-all-packages//') -O0 + @ln -sf dist/build/git-annex/git-annex git-annex + @$(MAKE) tags >/dev/null 2>&1 & + +dist/caballog: git-annex.cabal + $(CABAL) configure -f"-Production" -O0 + $(CABAL) build -v2 | tee $@ + +# Hardcoded command line to make hdevtools start up and work. +# You will need some memory. It's worth it. +# Note: Don't include WebDAV or Webapp. TH use bloats memory > 500 mb! +# TODO should be possible to derive this from caballog. +hdevtools: + hdevtools --stop-server || true + hdevtools check git-annex.hs -g -cpp -g -i -g -idist/build/git-annex/git-annex-tmp -g -i. -g -idist/build/autogen -g -Idist/build/autogen -g -Idist/build/git-annex/git-annex-tmp -g -IUtility -g -DWITH_TESTSUITE -g -DWITH_S3 -g -DWITH_ASSISTANT -g -DWITH_INOTIFY -g -DWITH_DBUS -g -DWITH_PAIRING -g -DWITH_XMPP -g -optP-include -g -optPdist/build/autogen/cabal_macros.h -g -odir -g dist/build/git-annex/git-annex-tmp -g -hidir -g dist/build/git-annex/git-annex-tmp -g -stubdir -g dist/build/git-annex/git-annex-tmp -g -threaded -g -Wall -g -XHaskell98 -g -XPackageImports + +distributionupdate: + git pull + cabal configure + ghc -Wall --make Build/DistributionUpdate -XPackageImports -optP-include -optPdist/build/autogen/cabal_macros.h + ./Build/DistributionUpdate + +.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp diff --git a/Messages.hs b/Messages.hs new file mode 100644 index 000000000..9f473110a --- /dev/null +++ b/Messages.hs @@ -0,0 +1,250 @@ +{- git-annex output messages + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Messages ( + showStart, + showStart', + showNote, + showAction, + showProgress, + metered, + meteredBytes, + showSideAction, + doSideAction, + doQuietSideAction, + showStoringStateAction, + showOutput, + showLongNote, + showEndOk, + showEndFail, + showEndResult, + showErr, + warning, + warningIO, + fileNotFound, + indent, + maybeShowJSON, + showFullJSON, + showCustom, + showHeader, + showRaw, + setupConsole, + enableDebugOutput, + disableDebugOutput +) where + +import Text.JSON +import Data.Progress.Meter +import Data.Progress.Tracker +import Data.Quantity +import System.Log.Logger +import System.Log.Formatter +import System.Log.Handler (setFormatter, LogHandler) +import System.Log.Handler.Simple +import qualified Data.Set as S + +import Common +import Types +import Types.Messages +import qualified Messages.JSON as JSON +import Types.Key +import qualified Annex +import Utility.Metered + +showStart :: String -> FilePath -> Annex () +showStart command file = handle (JSON.start command $ Just file) $ + flushed $ putStr $ command ++ " " ++ file ++ " " + +showStart' :: String -> Key -> Maybe FilePath -> Annex () +showStart' command key afile = showStart command $ + fromMaybe (key2file key) afile + +showNote :: String -> Annex () +showNote s = handle (JSON.note s) $ + flushed $ putStr $ "(" ++ s ++ ") " + +showAction :: String -> Annex () +showAction s = showNote $ s ++ "..." + +{- Progress dots. -} +showProgress :: Annex () +showProgress = handle q $ + flushed $ putStr "." + +{- Shows a progress meter while performing a transfer of a key. + - The action is passed a callback to use to update the meter. -} +metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a +metered combinemeterupdate key a = go (keySize key) + where + go (Just size) = meteredBytes combinemeterupdate size a + go _ = a (const noop) + +{- Shows a progress meter while performing an action on a given number + - of bytes. -} +meteredBytes :: Maybe MeterUpdate -> Integer -> (MeterUpdate -> Annex a) -> Annex a +meteredBytes combinemeterupdate size a = withOutputType go + where + go NormalOutput = do + progress <- liftIO $ newProgress "" size + meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1) + showOutput + r <- a $ \n -> liftIO $ do + setP progress $ fromBytesProcessed n + displayMeter stdout meter + maybe noop (\m -> m n) combinemeterupdate + liftIO $ clearMeter stdout meter + return r + go _ = a (const noop) + +showSideAction :: String -> Annex () +showSideAction m = Annex.getState Annex.output >>= go + where + go st + | sideActionBlock st == StartBlock = do + p + let st' = st { sideActionBlock = InBlock } + Annex.changeState $ \s -> s { Annex.output = st' } + | sideActionBlock st == InBlock = return () + | otherwise = p + p = handle q $ putStrLn $ "(" ++ m ++ "...)" + +showStoringStateAction :: Annex () +showStoringStateAction = showSideAction "Recording state in git" + +{- Performs an action, supressing showSideAction messages. -} +doQuietSideAction :: Annex a -> Annex a +doQuietSideAction = doSideAction' InBlock + +{- Performs an action, that may call showSideAction multiple times. + - Only the first will be displayed. -} +doSideAction :: Annex a -> Annex a +doSideAction = doSideAction' StartBlock + +doSideAction' :: SideActionBlock -> Annex a -> Annex a +doSideAction' b a = do + o <- Annex.getState Annex.output + set $ o { sideActionBlock = b } + set o `after` a + where + set o = Annex.changeState $ \s -> s { Annex.output = o } + +showOutput :: Annex () +showOutput = handle q $ + putStr "\n" + +showLongNote :: String -> Annex () +showLongNote s = handle (JSON.note s) $ + putStrLn $ '\n' : indent s + +showEndOk :: Annex () +showEndOk = showEndResult True + +showEndFail :: Annex () +showEndFail = showEndResult False + +showEndResult :: Bool -> Annex () +showEndResult ok = handle (JSON.end ok) $ putStrLn msg + where + msg + | ok = "ok" + | otherwise = "failed" + +showErr :: (Show a) => a -> Annex () +showErr e = warning' $ "git-annex: " ++ show e + +warning :: String -> Annex () +warning = warning' . indent + +warning' :: String -> Annex () +warning' w = do + handle q $ putStr "\n" + liftIO $ do + hFlush stdout + hPutStrLn stderr w + +warningIO :: String -> IO () +warningIO w = do + putStr "\n" + hFlush stdout + hPutStrLn stderr w + +{- Displays a warning one time about a file the user specified not existing. -} +fileNotFound :: FilePath -> Annex () +fileNotFound file = do + st <- Annex.getState Annex.output + let shown = fileNotFoundShown st + when (S.notMember file shown) $ do + let shown' = S.insert file shown + let st' = st { fileNotFoundShown = shown' } + Annex.changeState $ \s -> s { Annex.output = st' } + liftIO $ hPutStrLn stderr $ unwords + [ "git-annex:", file, "not found" ] + +indent :: String -> String +indent = intercalate "\n" . map (\l -> " " ++ l) . lines + +{- Shows a JSON fragment only when in json mode. -} +maybeShowJSON :: JSON a => [(String, a)] -> Annex () +maybeShowJSON v = handle (JSON.add v) q + +{- Shows a complete JSON value, only when in json mode. -} +showFullJSON :: JSON a => [(String, a)] -> Annex Bool +showFullJSON v = withOutputType $ liftIO . go + where + go JSONOutput = JSON.complete v >> return True + go _ = return False + +{- Performs an action that outputs nonstandard/customized output, and + - in JSON mode wraps its output in JSON.start and JSON.end, so it's + - a complete JSON document. + - This is only needed when showStart and showEndOk is not used. -} +showCustom :: String -> Annex Bool -> Annex () +showCustom command a = do + handle (JSON.start command Nothing) q + r <- a + handle (JSON.end r) q + +showHeader :: String -> Annex () +showHeader h = handle q $ + flushed $ putStr $ h ++ ": " + +showRaw :: String -> Annex () +showRaw s = handle q $ putStrLn s + +setupConsole :: IO () +setupConsole = do + s <- setFormatter + <$> streamHandler stderr DEBUG + <*> pure (simpleLogFormatter "[$time] $msg") + updateGlobalLogger rootLoggerName (setLevel NOTICE . setHandlers [s]) + {- This avoids ghc's output layer crashing on + - invalid encoded characters in + - filenames when printing them out. -} + fileEncoding stdout + fileEncoding stderr + +enableDebugOutput :: IO () +enableDebugOutput = updateGlobalLogger rootLoggerName $ setLevel DEBUG + +disableDebugOutput :: IO () +disableDebugOutput = updateGlobalLogger rootLoggerName $ setLevel NOTICE + +handle :: IO () -> IO () -> Annex () +handle json normal = withOutputType go + where + go NormalOutput = liftIO normal + go QuietOutput = q + go JSONOutput = liftIO $ flushed json + +q :: Monad m => m () +q = noop + +flushed :: IO () -> IO () +flushed a = a >> hFlush stdout + +withOutputType :: (OutputType -> Annex a) -> Annex a +withOutputType a = outputType <$> Annex.getState Annex.output >>= a diff --git a/Messages/JSON.hs b/Messages/JSON.hs new file mode 100644 index 000000000..d57d69318 --- /dev/null +++ b/Messages/JSON.hs @@ -0,0 +1,37 @@ +{- git-annex JSON output + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Messages.JSON ( + start, + end, + note, + add, + complete +) where + +import Text.JSON + +import qualified Utility.JSONStream as Stream + +start :: String -> Maybe String -> IO () +start command file = + putStr $ Stream.start $ ("command", command) : filepart file + where + filepart Nothing = [] + filepart (Just f) = [("file", f)] + +end :: Bool -> IO () +end b = putStr $ Stream.add [("success", b)] ++ Stream.end + +note :: String -> IO () +note s = add [("note", s)] + +add :: JSON a => [(String, a)] -> IO () +add v = putStr $ Stream.add v + +complete :: JSON a => [(String, a)] -> IO () +complete v = putStr $ Stream.start v ++ Stream.end diff --git a/NEWS b/NEWS new file mode 120000 index 000000000..798088bec --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +debian/NEWS \ No newline at end of file diff --git a/README b/README new file mode 100644 index 000000000..ce67d6816 --- /dev/null +++ b/README @@ -0,0 +1,6 @@ +git-annex allows managing files with git, without checking the file +contents into git. While that may seem paradoxical, it is useful when +dealing with files larger than git can currently easily handle, whether due +to limitations in memory, checksumming time, or disk space. + +For documentation, see doc/ or diff --git a/Remote.hs b/Remote.hs new file mode 100644 index 000000000..29097f77d --- /dev/null +++ b/Remote.hs @@ -0,0 +1,314 @@ +{- git-annex remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote ( + Remote, + uuid, + name, + storeKey, + retrieveKeyFile, + retrieveKeyFileCheap, + removeKey, + hasKey, + hasKeyCheap, + whereisKey, + remoteFsck, + + remoteTypes, + remoteList, + gitSyncableRemote, + remoteMap, + remoteMap', + uuidDescriptions, + byName, + byName', + byNameOnly, + byNameWithUUID, + byCost, + prettyPrintUUIDs, + prettyListUUIDs, + prettyUUID, + remoteFromUUID, + remotesWithUUID, + remotesWithoutUUID, + keyLocations, + keyPossibilities, + keyPossibilitiesTrusted, + nameToUUID, + nameToUUID', + showTriedRemotes, + showLocations, + forceTrust, + logStatus, + checkAvailable, + isXMPPRemote +) where + +import qualified Data.Map as M +import Text.JSON +import Text.JSON.Generic +import Data.Ord + +import Common.Annex +import Types.Remote +import qualified Annex +import Annex.UUID +import Logs.UUID +import Logs.Trust +import Logs.Location hiding (logStatus) +import Remote.List +import Config +import Git.Types (RemoteName) +import qualified Git + +{- Map from UUIDs of Remotes to a calculated value. -} +remoteMap :: (Remote -> v) -> Annex (M.Map UUID v) +remoteMap mkv = remoteMap' mkv mkk + where + mkk r = case uuid r of + NoUUID -> Nothing + u -> Just u + +remoteMap' :: Ord k => (Remote -> v) -> (Remote -> Maybe k) -> Annex (M.Map k v) +remoteMap' mkv mkk = M.fromList . mapMaybe mk <$> remoteList + where + mk r = case mkk r of + Nothing -> Nothing + Just k -> Just (k, mkv r) + +{- Map of UUIDs of remotes and their descriptions. + - The names of Remotes are added to suppliment any description that has + - been set for a repository. -} +uuidDescriptions :: Annex (M.Map UUID String) +uuidDescriptions = M.unionWith addName <$> uuidMap <*> remoteMap name + +addName :: String -> RemoteName -> String +addName desc n + | desc == n || null desc = "[" ++ n ++ "]" + | otherwise = desc ++ " [" ++ n ++ "]" + +{- When a name is specified, looks up the remote matching that name. + - (Or it can be a UUID.) -} +byName :: Maybe RemoteName -> Annex (Maybe Remote) +byName Nothing = return Nothing +byName (Just n) = either error Just <$> byName' n + +{- Like byName, but the remote must have a configured UUID. -} +byNameWithUUID :: Maybe RemoteName -> Annex (Maybe Remote) +byNameWithUUID = checkuuid <=< byName + where + checkuuid Nothing = return Nothing + checkuuid (Just r) + | uuid r == NoUUID = + if remoteAnnexIgnore (gitconfig r) + then error $ noRemoteUUIDMsg r ++ + " (" ++ show (remoteConfig (repo r) "ignore") ++ + " is set)" + else error $ noRemoteUUIDMsg r + | otherwise = return $ Just r + +byName' :: RemoteName -> Annex (Either String Remote) +byName' "" = return $ Left "no remote specified" +byName' n = handle . filter matching <$> remoteList + where + handle [] = Left $ "there is no available git remote named \"" ++ n ++ "\"" + handle (match:_) = Right match + matching r = n == name r || toUUID n == uuid r + +{- Only matches remote name, not UUID -} +byNameOnly :: RemoteName -> Annex (Maybe Remote) +byNameOnly n = headMaybe . filter matching <$> remoteList + where + matching r = n == name r + +noRemoteUUIDMsg :: Remote -> String +noRemoteUUIDMsg r = "cannot determine uuid for " ++ name r + +{- Looks up a remote by name (or by UUID, or even by description), + - and returns its UUID. Finds even repositories that are not + - configured in .git/config. -} +nameToUUID :: RemoteName -> Annex UUID +nameToUUID = either error return <=< nameToUUID' + +nameToUUID' :: RemoteName -> Annex (Either String UUID) +nameToUUID' "." = Right <$> getUUID -- special case for current repo +nameToUUID' "here" = Right <$> getUUID +nameToUUID' n = byName' n >>= go + where + go (Right r) = return $ case uuid r of + NoUUID -> Left $ noRemoteUUIDMsg r + u -> Right u + go (Left e) = do + m <- uuidMap + return $ case M.keys (M.filter (== n) m) of + [u] -> Right u + [] -> let u = toUUID n + in case M.keys (M.filterWithKey (\k _ -> k == u) m) of + [] -> Left e + _ -> Right u + _us -> Left "Found multiple repositories with that description" + +{- Pretty-prints a list of UUIDs of remotes, for human display. + - + - When JSON is enabled, also generates a machine-readable description + - of the UUIDs. -} +prettyPrintUUIDs :: String -> [UUID] -> Annex String +prettyPrintUUIDs desc uuids = do + hereu <- getUUID + m <- uuidDescriptions + maybeShowJSON [(desc, map (jsonify m hereu) uuids)] + return $ unwords $ map (\u -> "\t" ++ prettify m hereu u ++ "\n") uuids + where + finddescription m u = M.findWithDefault "" u m + prettify m hereu u + | not (null d) = fromUUID u ++ " -- " ++ d + | otherwise = fromUUID u + where + ishere = hereu == u + n = finddescription m u + d + | null n && ishere = "here" + | ishere = addName n "here" + | otherwise = n + jsonify m hereu u = toJSObject + [ ("uuid", toJSON $ fromUUID u) + , ("description", toJSON $ finddescription m u) + , ("here", toJSON $ hereu == u) + ] + +{- List of remote names and/or descriptions, for human display. -} +prettyListUUIDs :: [UUID] -> Annex [String] +prettyListUUIDs uuids = do + hereu <- getUUID + m <- uuidDescriptions + return $ map (prettify m hereu) uuids + where + finddescription m u = M.findWithDefault "" u m + prettify m hereu u + | u == hereu = addName n "here" + | otherwise = n + where + n = finddescription m u + +{- Nice display of a remote's name and/or description. -} +prettyUUID :: UUID -> Annex String +prettyUUID u = concat <$> prettyListUUIDs [u] + +{- Gets the remote associated with a UUID. -} +remoteFromUUID :: UUID -> Annex (Maybe Remote) +remoteFromUUID u = ifM ((==) u <$> getUUID) + ( return Nothing + , maybe tryharder (return . Just) =<< findinmap + ) + where + findinmap = M.lookup u <$> remoteMap id + {- Re-read remote list in case a new remote has popped up. -} + tryharder = do + void remoteListRefresh + findinmap + +{- Filters a list of remotes to ones that have the listed uuids. -} +remotesWithUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithUUID rs us = filter (\r -> uuid r `elem` us) rs + +{- Filters a list of remotes to ones that do not have the listed uuids. -} +remotesWithoutUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithoutUUID rs us = filter (\r -> uuid r `notElem` us) rs + +{- List of repository UUIDs that the location log indicates may have a key. + - Dead repositories are excluded. -} +keyLocations :: Key -> Annex [UUID] +keyLocations key = trustExclude DeadTrusted =<< loggedLocations key + +{- Cost ordered lists of remotes that the location log indicates + - may have a key. + -} +keyPossibilities :: Key -> Annex [Remote] +keyPossibilities key = fst <$> keyPossibilities' key [] + +{- Cost ordered lists of remotes that the location log indicates + - may have a key. + - + - Also returns a list of UUIDs that are trusted to have the key + - (some may not have configured remotes). + -} +keyPossibilitiesTrusted :: Key -> Annex ([Remote], [UUID]) +keyPossibilitiesTrusted key = keyPossibilities' key =<< trustGet Trusted + +keyPossibilities' :: Key -> [UUID] -> Annex ([Remote], [UUID]) +keyPossibilities' key trusted = do + u <- getUUID + + -- uuids of all remotes that are recorded to have the key + validuuids <- filter (/= u) <$> keyLocations key + + -- note that validuuids is assumed to not have dups + let validtrusteduuids = validuuids `intersect` trusted + + -- remotes that match uuids that have the key + allremotes <- filter (not . remoteAnnexIgnore . gitconfig) + <$> remoteList + let validremotes = remotesWithUUID allremotes validuuids + + return (sortBy (comparing cost) validremotes, validtrusteduuids) + +{- Displays known locations of a key. -} +showLocations :: Key -> [UUID] -> String -> Annex () +showLocations key exclude nolocmsg = do + u <- getUUID + uuids <- keyLocations key + untrusteduuids <- trustGet UnTrusted + let uuidswanted = filteruuids uuids (u:exclude++untrusteduuids) + let uuidsskipped = filteruuids uuids (u:exclude++uuidswanted) + ppuuidswanted <- Remote.prettyPrintUUIDs "wanted" uuidswanted + ppuuidsskipped <- Remote.prettyPrintUUIDs "skipped" uuidsskipped + showLongNote $ message ppuuidswanted ppuuidsskipped + ignored <- filter (remoteAnnexIgnore . gitconfig) <$> remoteList + unless (null ignored) $ + showLongNote $ "(Note that these git remotes have annex-ignore set: " ++ unwords (map name ignored) ++ ")" + where + filteruuids l x = filter (`notElem` x) l + message [] [] = nolocmsg + message rs [] = "Try making some of these repositories available:\n" ++ rs + message [] us = "Also these untrusted repositories may contain the file:\n" ++ us + message rs us = message rs [] ++ message [] us + +showTriedRemotes :: [Remote] -> Annex () +showTriedRemotes [] = noop +showTriedRemotes remotes = + showLongNote $ "Unable to access these remotes: " ++ + intercalate ", " (map name remotes) + +forceTrust :: TrustLevel -> String -> Annex () +forceTrust level remotename = do + u <- nameToUUID remotename + Annex.changeState $ \s -> + s { Annex.forcetrust = M.insert u level (Annex.forcetrust s) } + +{- Used to log a change in a remote's having a key. The change is logged + - in the local repo, not on the remote. The process of transferring the + - key to the remote, or removing the key from it *may* log the change + - on the remote, but this cannot always be relied on. -} +logStatus :: Remote -> Key -> LogStatus -> Annex () +logStatus remote key = logChange key (uuid remote) + +{- Orders remotes by cost, with ones with the lowest cost grouped together. -} +byCost :: [Remote] -> [[Remote]] +byCost = map snd . sortBy (comparing fst) . M.toList . costmap + where + costmap = M.fromListWith (++) . map costpair + costpair r = (cost r, [r]) + +checkAvailable :: Bool -> Remote -> IO Bool +checkAvailable assumenetworkavailable = + maybe (return assumenetworkavailable) doesDirectoryExist . localpath + +{- Remotes using the XMPP transport have urls like xmpp::user@host -} +isXMPPRemote :: Remote -> Bool +isXMPPRemote remote = Git.repoIsUrl r && "xmpp::" `isPrefixOf` Git.repoLocation r + where + r = repo remote diff --git a/Remote/Bup.hs b/Remote/Bup.hs new file mode 100644 index 000000000..778832850 --- /dev/null +++ b/Remote/Bup.hs @@ -0,0 +1,290 @@ +{- Using bup as a remote. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Bup (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import System.Process +import Data.ByteString.Lazy.UTF8 (fromString) + +import Common.Annex +import qualified Annex +import Types.Remote +import Types.Key +import Types.Creds +import qualified Git +import qualified Git.Command +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Ref +import Config +import Config.Cost +import qualified Remote.Helper.Ssh as Ssh +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Messages +import Crypto +import Utility.Hash +import Utility.UserInfo +import Annex.Content +import Annex.UUID +import Utility.Metered + +type BupRepo = String + +remote :: RemoteType +remote = RemoteType { + typename = "bup", + enumerate = findSpecialRemotes "buprepo", + generate = gen, + setup = bupSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + bupr <- liftIO $ bup2GitRemote buprepo + cst <- remoteCost gc $ + if bupLocal buprepo + then nearlyCheapRemoteCost + else expensiveRemoteCost + (u', bupr') <- getBupUUID bupr u + + let new = Remote + { uuid = u' + , cost = cst + , name = Git.repoDescribe r + , storeKey = store new buprepo + , retrieveKeyFile = retrieve buprepo + , retrieveKeyFileCheap = retrieveCheap buprepo + , removeKey = remove + , hasKey = checkPresent r bupr' + , hasKeyCheap = bupLocal buprepo + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , repo = r + , gitconfig = gc + , localpath = if bupLocal buprepo && not (null buprepo) + then Just buprepo + else Nothing + , remotetype = remote + , availability = if bupLocal buprepo then LocallyAvailable else GloballyAvailable + , readonly = False + } + return $ Just $ encryptableRemote c + (storeEncrypted new buprepo) + (retrieveEncrypted buprepo) + new + where + buprepo = fromMaybe (error "missing buprepo") $ remoteAnnexBupRepo gc + +bupSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +bupSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + + -- verify configuration is sane + let buprepo = fromMaybe (error "Specify buprepo=") $ + M.lookup "buprepo" c + c' <- encryptionSetup c + + -- bup init will create the repository. + -- (If the repository already exists, bup init again appears safe.) + showAction "bup init" + unlessM (bup "init" buprepo []) $ error "bup init failed" + + storeBupUUID u buprepo + + -- The buprepo is stored in git config, as well as this repo's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "buprepo" buprepo + + return (c', u) + +bupParams :: String -> BupRepo -> [CommandParam] -> [CommandParam] +bupParams command buprepo params = + Param command : [Param "-r", Param buprepo] ++ params + +bup :: String -> BupRepo -> [CommandParam] -> Annex Bool +bup command buprepo params = do + showOutput -- make way for bup output + liftIO $ boolSystem "bup" $ bupParams command buprepo params + +pipeBup :: [CommandParam] -> Maybe Handle -> Maybe Handle -> IO Bool +pipeBup params inh outh = do + p <- runProcess "bup" (toCommand params) + Nothing Nothing inh outh Nothing + ok <- waitForProcess p + case ok of + ExitSuccess -> return True + _ -> return False + +bupSplitParams :: Remote -> BupRepo -> Key -> [CommandParam] -> Annex [CommandParam] +bupSplitParams r buprepo k src = do + let os = map Param $ remoteAnnexBupSplitOptions $ gitconfig r + showOutput -- make way for bup output + return $ bupParams "split" buprepo + (os ++ [Param "-n", Param (bupRef k)] ++ src) + +store :: Remote -> BupRepo -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r buprepo k _f _p = sendAnnex k (rollback k buprepo) $ \src -> do + params <- bupSplitParams r buprepo k [File src] + liftIO $ boolSystem "bup" params + +storeEncrypted :: Remote -> BupRepo -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r buprepo (cipher, enck) k _p = + sendAnnex k (rollback enck buprepo) $ \src -> do + params <- bupSplitParams r buprepo enck [] + liftIO $ catchBoolIO $ + encrypt (getGpgEncParams r) cipher (feedFile src) $ \h -> + pipeBup params (Just h) Nothing + +retrieve :: BupRepo -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve buprepo k _f d _p = do + let params = bupParams "join" buprepo [Param $ bupRef k] + liftIO $ catchBoolIO $ withFile d WriteMode $ + pipeBup params Nothing . Just + +retrieveCheap :: BupRepo -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: BupRepo -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted buprepo (cipher, enck) _ f _p = liftIO $ catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p $ \h -> do + decrypt cipher (\toh -> L.hPut toh =<< L.hGetContents h) $ + readBytes $ L.writeFile f + return True + where + params = bupParams "join" buprepo [Param $ bupRef enck] + p = proc "bup" $ toCommand params + +remove :: Key -> Annex Bool +remove _ = do + warning "content cannot be removed from bup remote" + return False + +{- Cannot revert having stored a key in bup, but at least the data for the + - key will be used for deltaing data of other keys stored later. + - + - We can, however, remove the git branch that bup created for the key. + -} +rollback :: Key -> BupRepo -> Annex () +rollback k bupr = go =<< liftIO (bup2GitRemote bupr) + where + go r + | Git.repoIsUrl r = void $ onBupRemote r boolSystem "git" params + | otherwise = void $ liftIO $ catchMaybeIO $ + boolSystem "git" $ Git.Command.gitCommandLine params r + params = [ Params "branch -D", Param (bupRef k) ] + +{- Bup does not provide a way to tell if a given dataset is present + - in a bup repository. One way it to check if the git repository has + - a branch matching the name (as created by bup split -n). + -} +checkPresent :: Git.Repo -> Git.Repo -> Key -> Annex (Either String Bool) +checkPresent r bupr k + | Git.repoIsUrl bupr = do + showChecking r + ok <- onBupRemote bupr boolSystem "git" params + return $ Right ok + | otherwise = liftIO $ catchMsgIO $ + boolSystem "git" $ Git.Command.gitCommandLine params bupr + where + params = + [ Params "show-ref --quiet --verify" + , Param $ "refs/heads/" ++ bupRef k + ] + +{- Store UUID in the annex.uuid setting of the bup repository. -} +storeBupUUID :: UUID -> BupRepo -> Annex () +storeBupUUID u buprepo = do + r <- liftIO $ bup2GitRemote buprepo + if Git.repoIsUrl r + then do + showAction "storing uuid" + unlessM (onBupRemote r boolSystem "git" + [Params $ "config annex.uuid " ++ v]) $ + error "ssh failed" + else liftIO $ do + r' <- Git.Config.read r + let olduuid = Git.Config.get "annex.uuid" "" r' + when (olduuid == "") $ + Git.Command.run + [ Param "config" + , Param "annex.uuid" + , Param v + ] r' + where + v = fromUUID u + +onBupRemote :: Git.Repo -> (FilePath -> [CommandParam] -> IO a) -> FilePath -> [CommandParam] -> Annex a +onBupRemote r a command params = do + c <- Annex.getRemoteGitConfig r + sshparams <- Ssh.toRepo r c [Param $ + "cd " ++ dir ++ " && " ++ unwords (command : toCommand params)] + liftIO $ a "ssh" sshparams + where + path = Git.repoPath r + base = fromMaybe path (stripPrefix "/~/" path) + dir = shellEscape base + +{- Allow for bup repositories on removable media by checking + - local bup repositories to see if they are available, and getting their + - uuid (which may be different from the stored uuid for the bup remote). + - + - If a bup repository is not available, returns NoUUID. + - This will cause checkPresent to indicate nothing from the bup remote + - is known to be present. + - + - Also, returns a version of the repo with config read, if it is local. + -} +getBupUUID :: Git.Repo -> UUID -> Annex (UUID, Git.Repo) +getBupUUID r u + | Git.repoIsUrl r = return (u, r) + | otherwise = liftIO $ do + ret <- tryIO $ Git.Config.read r + case ret of + Right r' -> return (toUUID $ Git.Config.get "annex.uuid" "" r', r') + Left _ -> return (NoUUID, r) + +{- Converts a bup remote path spec into a Git.Repo. There are some + - differences in path representation between git and bup. -} +bup2GitRemote :: BupRepo -> IO Git.Repo +bup2GitRemote "" = do + -- bup -r "" operates on ~/.bup + h <- myHomeDir + Git.Construct.fromAbsPath $ h ".bup" +bup2GitRemote r + | bupLocal r = + if "/" `isPrefixOf` r + then Git.Construct.fromAbsPath r + else error "please specify an absolute path" + | otherwise = Git.Construct.fromUrl $ "ssh://" ++ host ++ slash dir + where + bits = split ":" r + host = Prelude.head bits + dir = intercalate ":" $ drop 1 bits + -- "host:~user/dir" is not supported specially by bup; + -- "host:dir" is relative to the home directory; + -- "host:" goes in ~/.bup + slash d + | null d = "/~/.bup" + | "/" `isPrefixOf` d = d + | otherwise = "/~/" ++ d + +{- Converts a key into a git ref name, which bup-split -n will use to point + - to it. -} +bupRef :: Key -> String +bupRef k + | Git.Ref.legal True shown = shown + | otherwise = "git-annex-" ++ show (sha256 (fromString shown)) + where + shown = key2file k + +bupLocal :: BupRepo -> Bool +bupLocal = notElem ':' diff --git a/Remote/Ddar.hs b/Remote/Ddar.hs new file mode 100644 index 000000000..7218226e8 --- /dev/null +++ b/Remote/Ddar.hs @@ -0,0 +1,229 @@ +{- Using ddar as a remote. Based on bup and rsync remotes. + - + - Copyright 2011 Joey Hess + - Copyright 2014 Robie Basak + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Ddar (remote) where + +import Control.Exception +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import System.IO.Error +import System.Process + +import Data.String.Utils +import Common.Annex +import Types.Remote +import Types.Key +import Types.Creds +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Crypto +import Annex.Content +import Annex.Ssh +import Annex.UUID +import Utility.Metered + +type DdarRepo = String + +remote :: RemoteType +remote = RemoteType { + typename = "ddar", + enumerate = findSpecialRemotes "ddarrepo", + generate = gen, + setup = ddarSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc $ + if ddarLocal ddarrepo + then nearlyCheapRemoteCost + else expensiveRemoteCost + + let new = Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = store ddarrepo + , retrieveKeyFile = retrieve ddarrepo + , retrieveKeyFileCheap = retrieveCheap + , removeKey = remove ddarrepo + , hasKey = checkPresent ddarrepo + , hasKeyCheap = ddarLocal ddarrepo + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , repo = r + , gitconfig = gc + , localpath = if ddarLocal ddarrepo && not (null ddarrepo) + then Just ddarrepo + else Nothing + , remotetype = remote + , availability = if ddarLocal ddarrepo then LocallyAvailable else GloballyAvailable + , readonly = False + } + return $ Just $ encryptableRemote c + (storeEncrypted new ddarrepo) + (retrieveEncrypted ddarrepo) + new + where + ddarrepo = fromMaybe (error "missing ddarrepo") $ remoteAnnexDdarRepo gc + +ddarSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +ddarSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + + -- verify configuration is sane + let ddarrepo = fromMaybe (error "Specify ddarrepo=") $ + M.lookup "ddarrepo" c + c' <- encryptionSetup c + + -- The ddarrepo is stored in git config, as well as this repo's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "ddarrepo" ddarrepo + + return (c', u) + +pipeDdar :: [CommandParam] -> Maybe Handle -> Maybe Handle -> IO Bool +pipeDdar params inh outh = do + p <- runProcess "ddar" (toCommand params) + Nothing Nothing inh outh Nothing + ok <- waitForProcess p + case ok of + ExitSuccess -> return True + _ -> return False + +store :: DdarRepo -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store ddarrepo k _f _p = sendAnnex k (void $ remove ddarrepo k) $ \src -> do + let params = + [ Param "c" + , Param "-N" + , Param $ key2file k + , Param ddarrepo + , File src + ] + liftIO $ boolSystem "ddar" params + +storeEncrypted :: Remote -> DdarRepo -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r ddarrepo (cipher, enck) k _p = + sendAnnex k (void $ remove ddarrepo k) $ \src -> + liftIO $ catchBoolIO $ + encrypt (getGpgEncParams r) cipher (feedFile src) $ \h -> + pipeDdar params (Just h) Nothing + where + params = + [ Param "c" + , Param "-N" + , Param $ key2file enck + , Param ddarrepo + , Param "-" + ] + +{- Convert remote DdarRepo to host and path on remote end -} +splitRemoteDdarRepo :: DdarRepo -> (String, String) +splitRemoteDdarRepo ddarrepo = + (host, ddarrepo') + where + (host, remainder) = span (/= ':') ddarrepo + ddarrepo' = drop 1 remainder + +{- Return the command and parameters to use for a ddar call that may need to be + - made on a remote repository. This will call ssh if needed. -} + +ddarRemoteCall :: DdarRepo -> Char -> [CommandParam] -> Annex (String, [CommandParam]) +ddarRemoteCall ddarrepo cmd params + | ddarLocal ddarrepo = return ("ddar", localParams) + | otherwise = do + remoteCachingParams <- sshCachingOptions (host, Nothing) [] + return ("ssh", remoteCachingParams ++ remoteParams) + where + (host, ddarrepo') = splitRemoteDdarRepo ddarrepo + localParams = Param [cmd] : Param ddarrepo : params + remoteParams = Param host : Param "ddar" : Param [cmd] : Param ddarrepo' : params + +{- Specialized ddarRemoteCall that includes extraction command and flags -} + +ddarExtractRemoteCall :: DdarRepo -> Key -> Annex (String, [CommandParam]) +ddarExtractRemoteCall ddarrepo k = + ddarRemoteCall ddarrepo 'x' [Param "--force-stdout", Param $ key2file k] + +retrieve :: DdarRepo -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve ddarrepo k _f d _p = do + (cmd, params) <- ddarExtractRemoteCall ddarrepo k + liftIO $ catchBoolIO $ withFile d WriteMode $ \h -> do + let p = (proc cmd $ toCommand params){ std_out = UseHandle h } + (_, _, _, pid) <- Common.Annex.createProcess p + forceSuccessProcess p pid + return True + +retrieveCheap :: Key -> FilePath -> Annex Bool +retrieveCheap _ _ = return False + +retrieveEncrypted :: DdarRepo -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted ddarrepo (cipher, enck) _ f _p = do + (cmd, params) <- ddarExtractRemoteCall ddarrepo enck + let p = proc cmd $ toCommand params + liftIO $ catchBoolIO $ withHandle StdoutHandle createProcessSuccess p $ \h -> do + decrypt cipher (\toh -> L.hPut toh =<< L.hGetContents h) $ + readBytes $ L.writeFile f + return True + +remove :: DdarRepo -> Key -> Annex Bool +remove ddarrepo key = do + (cmd, params) <- ddarRemoteCall ddarrepo 'd' [Param $ key2file key] + liftIO $ boolSystem cmd params + +ddarDirectoryExists :: DdarRepo -> Annex (Either String Bool) +ddarDirectoryExists ddarrepo + | ddarLocal ddarrepo = do + maybeStatus <- liftIO $ tryJust (guard . isDoesNotExistError) $ getFileStatus ddarrepo + return $ case maybeStatus of + Left _ -> Right False + Right status -> Right $ isDirectory status + | otherwise = do + sshCachingParams <- sshCachingOptions (host, Nothing) [] + exitCode <- liftIO $ safeSystem "ssh" $ sshCachingParams ++ params + case exitCode of + ExitSuccess -> return $ Right True + ExitFailure 1 -> return $ Right False + ExitFailure code -> return $ Left $ "ssh call " ++ + show (Data.String.Utils.join " " $ toCommand params) ++ + " failed with status " ++ show code + where + (host, ddarrepo') = splitRemoteDdarRepo ddarrepo + params = + [ Param host + , Param "test" + , Param "-d" + , Param ddarrepo' + ] + +{- Use "ddar t" to determine if a given key is present in a ddar archive -} +inDdarManifest :: DdarRepo -> Key -> Annex (Either String Bool) +inDdarManifest ddarrepo k = do + (cmd, params) <- ddarRemoteCall ddarrepo 't' [] + let p = proc cmd $ toCommand params + liftIO $ catchMsgIO $ withHandle StdoutHandle createProcessSuccess p $ \h -> do + contents <- hGetContents h + return $ elem k' $ lines contents + where + k' = key2file k + +checkPresent :: DdarRepo -> Key -> Annex (Either String Bool) +checkPresent ddarrepo key = do + directoryExists <- ddarDirectoryExists ddarrepo + case directoryExists of + Left e -> return $ Left e + Right True -> inDdarManifest ddarrepo key + Right False -> return $ Right False + +ddarLocal :: DdarRepo -> Bool +ddarLocal = notElem ':' diff --git a/Remote/Directory.hs b/Remote/Directory.hs new file mode 100644 index 000000000..afa2296ec --- /dev/null +++ b/Remote/Directory.hs @@ -0,0 +1,255 @@ +{- A "remote" that is just a filesystem directory. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Directory (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString as S +import qualified Data.Map as M +import Data.Int + +import Common.Annex +import Types.Remote +import Types.Creds +import qualified Git +import Config.Cost +import Config +import Utility.FileMode +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Chunked +import Crypto +import Annex.Content +import Annex.UUID +import Utility.Metered + +remote :: RemoteType +remote = RemoteType { + typename = "directory", + enumerate = findSpecialRemotes "directory", + generate = gen, + setup = directorySetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc cheapRemoteCost + let chunksize = chunkSize c + return $ Just $ encryptableRemote c + (storeEncrypted dir (getGpgEncParams (c,gc)) chunksize) + (retrieveEncrypted dir chunksize) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store dir chunksize, + retrieveKeyFile = retrieve dir chunksize, + retrieveKeyFileCheap = retrieveCheap dir chunksize, + removeKey = remove dir, + hasKey = checkPresent dir chunksize, + hasKeyCheap = True, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Just dir, + readonly = False, + availability = LocallyAvailable, + remotetype = remote + } + where + dir = fromMaybe (error "missing directory") $ remoteAnnexDirectory gc + +directorySetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +directorySetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + -- verify configuration is sane + let dir = fromMaybe (error "Specify directory=") $ + M.lookup "directory" c + absdir <- liftIO $ absPath dir + liftIO $ unlessM (doesDirectoryExist absdir) $ + error $ "Directory does not exist: " ++ absdir + c' <- encryptionSetup c + + -- The directory is stored in git config, not in this remote's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "directory" absdir + return (M.delete "directory" c', u) + +{- Locations to try to access a given Key in the Directory. + - We try more than since we used to write to different hash directories. -} +locations :: FilePath -> Key -> [FilePath] +locations d k = map (d ) (keyPaths k) + +{- Directory where the file(s) for a key are stored. -} +storeDir :: FilePath -> Key -> FilePath +storeDir d k = addTrailingPathSeparator $ d hashDirLower k keyFile k + +{- Where we store temporary data for a key as it's being uploaded. -} +tmpDir :: FilePath -> Key -> FilePath +tmpDir d k = addTrailingPathSeparator $ d "tmp" keyFile k + +withCheckedFiles :: (FilePath -> IO Bool) -> ChunkSize -> FilePath -> Key -> ([FilePath] -> IO Bool) -> IO Bool +withCheckedFiles _ _ [] _ _ = return False +withCheckedFiles check Nothing d k a = go $ locations d k + where + go [] = return False + go (f:fs) = ifM (check f) ( a [f] , go fs ) +withCheckedFiles check (Just _) d k a = go $ locations d k + where + go [] = return False + go (f:fs) = do + let chunkcount = f ++ chunkCount + ifM (check chunkcount) + ( do + chunks <- listChunks f <$> readFile chunkcount + ifM (allM check chunks) + ( a chunks , return False ) + , do + chunks <- probeChunks f check + if null chunks + then go fs + else a chunks + ) + +withStoredFiles :: ChunkSize -> FilePath -> Key -> ([FilePath] -> IO Bool) -> IO Bool +withStoredFiles = withCheckedFiles doesFileExist + +store :: FilePath -> ChunkSize -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store d chunksize k _f p = sendAnnex k (void $ remove d k) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper d chunksize k k $ \dests -> + case chunksize of + Nothing -> do + let dest = Prelude.head dests + meteredWriteFile meterupdate dest + =<< L.readFile src + return [dest] + Just _ -> + storeSplit meterupdate chunksize dests + =<< L.readFile src + +storeEncrypted :: FilePath -> [CommandParam] -> ChunkSize -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted d gpgOpts chunksize (cipher, enck) k p = sendAnnex k (void $ remove d enck) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper d chunksize enck k $ \dests -> + encrypt gpgOpts cipher (feedFile src) $ readBytes $ \b -> + case chunksize of + Nothing -> do + let dest = Prelude.head dests + meteredWriteFile meterupdate dest b + return [dest] + Just _ -> storeSplit meterupdate chunksize dests b + +{- Splits a ByteString into chunks and writes to dests, obeying configured + - chunk size (not to be confused with the L.ByteString chunk size). + - Note: Must always write at least one file, even for empty ByteString. -} +storeSplit :: MeterUpdate -> ChunkSize -> [FilePath] -> L.ByteString -> IO [FilePath] +storeSplit _ Nothing _ _ = error "bad storeSplit call" +storeSplit _ _ [] _ = error "bad storeSplit call" +storeSplit meterupdate (Just chunksize) alldests@(firstdest:_) b + | L.null b = do + -- must always write at least one file, even for empty + L.writeFile firstdest b + return [firstdest] + | otherwise = storeSplit' meterupdate chunksize alldests (L.toChunks b) [] +storeSplit' :: MeterUpdate -> Int64 -> [FilePath] -> [S.ByteString] -> [FilePath] -> IO [FilePath] +storeSplit' _ _ [] _ _ = error "ran out of dests" +storeSplit' _ _ _ [] c = return $ reverse c +storeSplit' meterupdate chunksize (d:dests) bs c = do + bs' <- withFile d WriteMode $ + feed zeroBytesProcessed chunksize bs + storeSplit' meterupdate chunksize dests bs' (d:c) + where + feed _ _ [] _ = return [] + feed bytes sz (l:ls) h = do + let len = S.length l + let s = fromIntegral len + if s <= sz || sz == chunksize + then do + S.hPut h l + let bytes' = addBytesProcessed bytes len + meterupdate bytes' + feed bytes' (sz - s) ls h + else return (l:ls) + +storeHelper :: FilePath -> ChunkSize -> Key -> Key -> ([FilePath] -> IO [FilePath]) -> Annex Bool +storeHelper d chunksize key origkey storer = check <&&> go + where + tmpdir = tmpDir d key + destdir = storeDir d key + {- An encrypted key does not have a known size, + - so check that the size of the original key is available as free + - space. -} + check = do + liftIO $ createDirectoryIfMissing True tmpdir + checkDiskSpace (Just tmpdir) origkey 0 + go = liftIO $ catchBoolIO $ + storeChunks key tmpdir destdir chunksize storer recorder finalizer + finalizer tmp dest = do + void $ tryIO $ allowWrite dest -- may already exist + void $ tryIO $ removeDirectoryRecursive dest -- or not exist + createDirectoryIfMissing True (parentDir dest) + renameDirectory tmp dest + -- may fail on some filesystems + void $ tryIO $ do + mapM_ preventWrite =<< dirContents dest + preventWrite dest + recorder f s = do + void $ tryIO $ allowWrite f + writeFile f s + void $ tryIO $ preventWrite f + +retrieve :: FilePath -> ChunkSize -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve d chunksize k _ f p = metered (Just p) k $ \meterupdate -> + liftIO $ withStoredFiles chunksize d k $ \files -> + catchBoolIO $ do + meteredWriteFileChunks meterupdate f files L.readFile + return True + +retrieveEncrypted :: FilePath -> ChunkSize -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted d chunksize (cipher, enck) k f p = metered (Just p) k $ \meterupdate -> + liftIO $ withStoredFiles chunksize d enck $ \files -> + catchBoolIO $ do + decrypt cipher (feeder files) $ + readBytes $ meteredWriteFile meterupdate f + return True + where + feeder files h = forM_ files $ L.hPut h <=< L.readFile + +retrieveCheap :: FilePath -> ChunkSize -> Key -> FilePath -> Annex Bool +retrieveCheap _ (Just _) _ _ = return False -- no cheap retrieval for chunks +#ifndef mingw32_HOST_OS +retrieveCheap d _ k f = liftIO $ withStoredFiles Nothing d k go + where + go [file] = catchBoolIO $ createSymbolicLink file f >> return True + go _files = return False +#else +retrieveCheap _ _ _ _ = return False +#endif + +remove :: FilePath -> Key -> Annex Bool +remove d k = liftIO $ do + void $ tryIO $ allowWrite dir +#ifdef mingw32_HOST_OS + {- Windows needs the files inside the directory to be writable + - before it can delete them. -} + void $ tryIO $ mapM_ allowWrite =<< dirContents dir +#endif + catchBoolIO $ do + removeDirectoryRecursive dir + return True + where + dir = storeDir d k + +checkPresent :: FilePath -> ChunkSize -> Key -> Annex (Either String Bool) +checkPresent d chunksize k = liftIO $ catchMsgIO $ withStoredFiles chunksize d k $ + const $ return True -- withStoredFiles checked that it exists diff --git a/Remote/External.hs b/Remote/External.hs new file mode 100644 index 000000000..464e9b57e --- /dev/null +++ b/Remote/External.hs @@ -0,0 +1,444 @@ +{- External special remote interface. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.External (remote) where + +import Remote.External.Types +import qualified Annex +import Common.Annex +import Types.Remote +import Types.CleanupActions +import qualified Git +import Config +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Crypto +import Utility.Metered +import Logs.Transfer +import Logs.PreferredContent.Raw +import Logs.RemoteState +import Config.Cost +import Annex.Content +import Annex.UUID +import Annex.Exception +import Creds + +import Control.Concurrent.STM +import System.Log.Logger (debugM) +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L + +remote :: RemoteType +remote = RemoteType { + typename = "external", + enumerate = findSpecialRemotes "externaltype", + generate = gen, + setup = externalSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + external <- newExternal externaltype u c + Annex.addCleanup (RemoteCleanup u) $ stopExternal external + cst <- getCost external r gc + avail <- getAvailability external r gc + return $ Just $ encryptableRemote c + (storeEncrypted external $ getGpgEncParams (c,gc)) + (retrieveEncrypted external) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store external, + retrieveKeyFile = retrieve external, + retrieveKeyFileCheap = \_ _ -> return False, + removeKey = remove external, + hasKey = checkPresent external, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + localpath = Nothing, + repo = r, + gitconfig = gc, + readonly = False, + availability = avail, + remotetype = remote + } + where + externaltype = fromMaybe (error "missing externaltype") (remoteAnnexExternalType gc) + +externalSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +externalSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + let externaltype = fromMaybe (error "Specify externaltype=") $ + M.lookup "externaltype" c + c' <- encryptionSetup c + + external <- newExternal externaltype u c' + handleRequest external INITREMOTE Nothing $ \resp -> case resp of + INITREMOTE_SUCCESS -> Just noop + INITREMOTE_FAILURE errmsg -> Just $ error errmsg + _ -> Nothing + c'' <- liftIO $ atomically $ readTMVar $ externalConfig external + + gitConfigSpecialRemote u c'' "externaltype" externaltype + return (c'', u) + +store :: External -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store external k _f p = sendAnnex k rollback $ \f -> + metered (Just p) k $ + storeHelper external k f + where + rollback = void $ remove external k + +storeEncrypted :: External -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted external gpgOpts (cipher, enck) k p = withTmp enck $ \tmp -> + sendAnnex k rollback $ \src -> do + metered (Just p) k $ \meterupdate -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + storeHelper external enck tmp meterupdate + where + rollback = void $ remove external enck + +storeHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool +storeHelper external k f p = safely $ + handleRequest external (TRANSFER Upload k f) (Just p) $ \resp -> + case resp of + TRANSFER_SUCCESS Upload k' | k == k' -> + Just $ return True + TRANSFER_FAILURE Upload k' errmsg | k == k' -> + Just $ do + warning errmsg + return False + _ -> Nothing + +retrieve :: External -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve external k _f d p = metered (Just p) k $ + retrieveHelper external k d + +retrieveEncrypted :: External -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted external (cipher, enck) k f p = withTmp enck $ \tmp -> + metered (Just p) k $ \meterupdate -> + ifM (retrieveHelper external enck tmp meterupdate) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + , return False + ) + +retrieveHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveHelper external k d p = safely $ + handleRequest external (TRANSFER Download k d) (Just p) $ \resp -> + case resp of + TRANSFER_SUCCESS Download k' + | k == k' -> Just $ return True + TRANSFER_FAILURE Download k' errmsg + | k == k' -> Just $ do + warning errmsg + return False + _ -> Nothing + +remove :: External -> Key -> Annex Bool +remove external k = safely $ + handleRequest external (REMOVE k) Nothing $ \resp -> + case resp of + REMOVE_SUCCESS k' + | k == k' -> Just $ return True + REMOVE_FAILURE k' errmsg + | k == k' -> Just $ do + warning errmsg + return False + _ -> Nothing + +checkPresent :: External -> Key -> Annex (Either String Bool) +checkPresent external k = either (Left . show) id <$> tryAnnex go + where + go = handleRequest external (CHECKPRESENT k) Nothing $ \resp -> + case resp of + CHECKPRESENT_SUCCESS k' + | k' == k -> Just $ return $ Right True + CHECKPRESENT_FAILURE k' + | k' == k -> Just $ return $ Right False + CHECKPRESENT_UNKNOWN k' errmsg + | k' == k -> Just $ return $ Left errmsg + _ -> Nothing + +safely :: Annex Bool -> Annex Bool +safely a = go =<< tryAnnex a + where + go (Right r) = return r + go (Left e) = do + warning $ show e + return False + +{- Sends a Request to the external remote, and waits for it to generate + - a Response. That is fed into the responsehandler, which should return + - the action to run for it (or Nothing if there's a protocol error). + - + - While the external remote is processing the Request, it may send + - any number of RemoteRequests, that are handled here. + - + - Only one request can be made at a time, so locking is used. + - + - May throw exceptions, for example on protocol errors, or + - when the repository cannot be used. + -} +handleRequest :: External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a +handleRequest external req mp responsehandler = + withExternalLock external $ \lck -> + handleRequest' lck external req mp responsehandler + +handleRequest' :: ExternalLock -> External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a +handleRequest' lck external req mp responsehandler + | needsPREPARE req = do + checkPrepared lck external + go + | otherwise = go + where + go = do + sendMessage lck external req + loop + loop = receiveMessage lck external responsehandler + (\rreq -> Just $ handleRemoteRequest rreq >> loop) + (\msg -> Just $ handleAsyncMessage msg >> loop) + + handleRemoteRequest (PROGRESS bytesprocessed) = + maybe noop (\a -> liftIO $ a bytesprocessed) mp + handleRemoteRequest (DIRHASH k) = + send $ VALUE $ hashDirMixed k + handleRemoteRequest (SETCONFIG setting value) = + liftIO $ atomically $ do + let v = externalConfig external + m <- takeTMVar v + putTMVar v $ M.insert setting value m + handleRemoteRequest (GETCONFIG setting) = do + value <- fromMaybe "" . M.lookup setting + <$> liftIO (atomically $ readTMVar $ externalConfig external) + send $ VALUE value + handleRemoteRequest (SETCREDS setting login password) = do + c <- liftIO $ atomically $ readTMVar $ externalConfig external + c' <- setRemoteCredPair c (credstorage setting) $ + Just (login, password) + void $ liftIO $ atomically $ swapTMVar (externalConfig external) c' + handleRemoteRequest (GETCREDS setting) = do + c <- liftIO $ atomically $ readTMVar $ externalConfig external + creds <- fromMaybe ("", "") <$> + getRemoteCredPair c (credstorage setting) + send $ CREDS (fst creds) (snd creds) + handleRemoteRequest GETUUID = send $ + VALUE $ fromUUID $ externalUUID external + handleRemoteRequest GETGITDIR = send . VALUE =<< fromRepo Git.localGitDir + handleRemoteRequest (SETWANTED expr) = + preferredContentSet (externalUUID external) expr + handleRemoteRequest GETWANTED = do + expr <- fromMaybe "" . M.lookup (externalUUID external) + <$> preferredContentMapRaw + send $ VALUE expr + handleRemoteRequest (SETSTATE key state) = + setRemoteState (externalUUID external) key state + handleRemoteRequest (GETSTATE key) = do + state <- fromMaybe "" + <$> getRemoteState (externalUUID external) key + send $ VALUE state + handleRemoteRequest (DEBUG msg) = liftIO $ debugM "external" msg + handleRemoteRequest (VERSION _) = + sendMessage lck external $ ERROR "too late to send VERSION" + + handleAsyncMessage (ERROR err) = error $ "external special remote error: " ++ err + + send = sendMessage lck external + + credstorage setting = CredPairStorage + { credPairFile = base + , credPairEnvironment = (base ++ "login", base ++ "password") + , credPairRemoteKey = Just setting + } + where + base = replace "/" "_" $ fromUUID (externalUUID external) ++ "-" ++ setting + +sendMessage :: Sendable m => ExternalLock -> External -> m -> Annex () +sendMessage lck external m = + fromExternal lck external externalSend $ \h -> + liftIO $ do + protocolDebug external True line + hPutStrLn h line + hFlush h + where + line = unwords $ formatMessage m + +{- Waits for a message from the external remote, and passes it to the + - apppropriate handler. + - + - If the handler returns Nothing, this is a protocol error.-} +receiveMessage + :: ExternalLock + -> External + -> (Response -> Maybe (Annex a)) + -> (RemoteRequest -> Maybe (Annex a)) + -> (AsyncMessage -> Maybe (Annex a)) + -> Annex a +receiveMessage lck external handleresponse handlerequest handleasync = + go =<< fromExternal lck external externalReceive + (liftIO . catchMaybeIO . hGetLine) + where + go Nothing = protocolError False "" + go (Just s) = do + liftIO $ protocolDebug external False s + case parseMessage s :: Maybe Response of + Just resp -> maybe (protocolError True s) id (handleresponse resp) + Nothing -> case parseMessage s :: Maybe RemoteRequest of + Just req -> maybe (protocolError True s) id (handlerequest req) + Nothing -> case parseMessage s :: Maybe AsyncMessage of + Just msg -> maybe (protocolError True s) id (handleasync msg) + Nothing -> protocolError False s + protocolError parsed s = error $ "external special remote protocol error, unexpectedly received \"" ++ s ++ "\" " ++ + if parsed then "(command not allowed at this time)" else "(unable to parse command)" + +protocolDebug :: External -> Bool -> String -> IO () +protocolDebug external sendto line = debugM "external" $ unwords + [ externalRemoteProgram (externalType external) + , if sendto then "<--" else "-->" + , line + ] + +{- Starts up the external remote if it's not yet running, + - and passes a value extracted from its state to an action. + -} +fromExternal :: ExternalLock -> External -> (ExternalState -> v) -> (v -> Annex a) -> Annex a +fromExternal lck external extractor a = + go =<< liftIO (atomically (tryReadTMVar v)) + where + go (Just st) = run st + go Nothing = do + st <- startExternal $ externalType external + void $ liftIO $ atomically $ do + void $ tryReadTMVar v + putTMVar v st + + {- Handle initial protocol startup; check the VERSION + - the remote sends. -} + receiveMessage lck external + (const Nothing) + (checkVersion lck external) + (const Nothing) + + run st + + run st = a $ extractor st + v = externalState external + +{- Starts an external remote process running, but does not handle checking + - VERSION, etc. -} +startExternal :: ExternalType -> Annex ExternalState +startExternal externaltype = liftIO $ do + (Just hin, Just hout, _, pid) <- createProcess $ (proc cmd []) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + fileEncoding hin + fileEncoding hout + checkearlytermination =<< getProcessExitCode pid + return $ ExternalState + { externalSend = hin + , externalReceive = hout + , externalPid = pid + , externalPrepared = Unprepared + } + where + cmd = externalRemoteProgram externaltype + + checkearlytermination Nothing = noop + checkearlytermination (Just exitcode) = ifM (inPath cmd) + ( error $ unwords [ "failed to run", cmd, "(" ++ show exitcode ++ ")" ] + , do + path <- intercalate ":" <$> getSearchPath + error $ cmd ++ " is not installed in PATH (" ++ path ++ ")" + ) + +stopExternal :: External -> Annex () +stopExternal external = liftIO $ stop =<< atomically (tryReadTMVar v) + where + stop Nothing = noop + stop (Just st) = do + void $ atomically $ tryTakeTMVar v + hClose $ externalSend st + hClose $ externalReceive st + void $ waitForProcess $ externalPid st + v = externalState external + +externalRemoteProgram :: ExternalType -> String +externalRemoteProgram externaltype = "git-annex-remote-" ++ externaltype + +checkVersion :: ExternalLock -> External -> RemoteRequest -> Maybe (Annex ()) +checkVersion lck external (VERSION v) = Just $ + if v `elem` supportedProtocolVersions + then noop + else sendMessage lck external (ERROR "unsupported VERSION") +checkVersion _ _ _ = Nothing + +{- If repo has not been prepared, sends PREPARE. + - + - If the repo fails to prepare, or failed before, throws an exception with + - the error message. -} +checkPrepared :: ExternalLock -> External -> Annex () +checkPrepared lck external = + fromExternal lck external externalPrepared $ \prepared -> + case prepared of + Prepared -> noop + FailedPrepare errmsg -> error errmsg + Unprepared -> + handleRequest' lck external PREPARE Nothing $ \resp -> + case resp of + PREPARE_SUCCESS -> Just $ + setprepared Prepared + PREPARE_FAILURE errmsg -> Just $ do + setprepared $ FailedPrepare errmsg + error errmsg + _ -> Nothing + where + setprepared status = liftIO . atomically $ do + let v = externalState external + st <- takeTMVar v + void $ putTMVar v $ st { externalPrepared = status } + +{- Caches the cost in the git config to avoid needing to start up an + - external special remote every time time just to ask it what its + - cost is. -} +getCost :: External -> Git.Repo -> RemoteGitConfig -> Annex Cost +getCost external r gc = go =<< remoteCost' gc + where + go (Just c) = return c + go Nothing = do + c <- handleRequest external GETCOST Nothing $ \req -> case req of + COST c -> Just $ return c + UNSUPPORTED_REQUEST -> Just $ return expensiveRemoteCost + _ -> Nothing + setRemoteCost r c + return c + +{- Caches the availability in the git config to avoid needing to start up an + - external special remote every time time just to ask it what its + - availability is. + - + - Most remotes do not bother to implement a reply to this request; + - globally available is the default. + -} +getAvailability :: External -> Git.Repo -> RemoteGitConfig -> Annex Availability +getAvailability external r gc = maybe query return (remoteAnnexAvailability gc) + where + query = do + avail <- handleRequest external GETAVAILABILITY Nothing $ \req -> case req of + AVAILABILITY avail -> Just $ return avail + UNSUPPORTED_REQUEST -> Just $ return GloballyAvailable + _ -> Nothing + setRemoteAvailability r avail + return avail diff --git a/Remote/External/Types.hs b/Remote/External/Types.hs new file mode 100644 index 000000000..983764f70 --- /dev/null +++ b/Remote/External/Types.hs @@ -0,0 +1,254 @@ +{- External special remote data types. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Remote.External.Types ( + External(..), + newExternal, + ExternalType, + ExternalLock, + withExternalLock, + ExternalState(..), + PrepareStatus(..), + Proto.parseMessage, + Proto.Sendable(..), + Proto.Receivable(..), + Request(..), + needsPREPARE, + Response(..), + RemoteRequest(..), + RemoteResponse(..), + AsyncMessage(..), + ErrorMsg, + Setting, + ProtocolVersion, + supportedProtocolVersions, +) where + +import Common.Annex +import Annex.Exception +import Types.Key (file2key, key2file) +import Types.StandardGroups (PreferredContentExpression) +import Utility.Metered (BytesProcessed(..)) +import Logs.Transfer (Direction(..)) +import Config.Cost (Cost) +import Types.Remote (RemoteConfig) +import Types.Availability (Availability(..)) +import qualified Utility.SimpleProtocol as Proto + +import Control.Concurrent.STM + +-- If the remote is not yet running, the ExternalState TMVar is empty. +data External = External + { externalType :: ExternalType + , externalUUID :: UUID + -- Empty until the remote is running. + , externalState :: TMVar ExternalState + -- Empty when a remote is in use. + , externalLock :: TMVar ExternalLock + -- Never left empty. + , externalConfig :: TMVar RemoteConfig + } + +newExternal :: ExternalType -> UUID -> RemoteConfig -> Annex External +newExternal externaltype u c = liftIO $ External + <$> pure externaltype + <*> pure u + <*> atomically newEmptyTMVar + <*> atomically (newTMVar ExternalLock) + <*> atomically (newTMVar c) + +type ExternalType = String + +data ExternalState = ExternalState + { externalSend :: Handle + , externalReceive :: Handle + , externalPid :: ProcessHandle + , externalPrepared :: PrepareStatus + } + +data PrepareStatus = Unprepared | Prepared | FailedPrepare ErrorMsg + +-- Constructor is not exported, and only created by newExternal. +data ExternalLock = ExternalLock + +withExternalLock :: External -> (ExternalLock -> Annex a) -> Annex a +withExternalLock external = bracketIO setup cleanup + where + setup = atomically $ takeTMVar v + cleanup = atomically . putTMVar v + v = externalLock external + +-- Messages that can be sent to the external remote to request it do something. +data Request + = PREPARE + | INITREMOTE + | GETCOST + | GETAVAILABILITY + | TRANSFER Direction Key FilePath + | CHECKPRESENT Key + | REMOVE Key + deriving (Show) + +-- Does PREPARE need to have been sent before this request? +needsPREPARE :: Request -> Bool +needsPREPARE PREPARE = False +needsPREPARE INITREMOTE = False +needsPREPARE _ = True + +instance Proto.Sendable Request where + formatMessage PREPARE = ["PREPARE"] + formatMessage INITREMOTE = ["INITREMOTE"] + formatMessage GETCOST = ["GETCOST"] + formatMessage GETAVAILABILITY = ["GETAVAILABILITY"] + formatMessage (TRANSFER direction key file) = + [ "TRANSFER" + , Proto.serialize direction + , Proto.serialize key + , Proto.serialize file + ] + formatMessage (CHECKPRESENT key) = [ "CHECKPRESENT", Proto.serialize key ] + formatMessage (REMOVE key) = [ "REMOVE", Proto.serialize key ] + +-- Responses the external remote can make to requests. +data Response + = PREPARE_SUCCESS + | PREPARE_FAILURE ErrorMsg + | TRANSFER_SUCCESS Direction Key + | TRANSFER_FAILURE Direction Key ErrorMsg + | CHECKPRESENT_SUCCESS Key + | CHECKPRESENT_FAILURE Key + | CHECKPRESENT_UNKNOWN Key ErrorMsg + | REMOVE_SUCCESS Key + | REMOVE_FAILURE Key ErrorMsg + | COST Cost + | AVAILABILITY Availability + | INITREMOTE_SUCCESS + | INITREMOTE_FAILURE ErrorMsg + | UNSUPPORTED_REQUEST + deriving (Show) + +instance Proto.Receivable Response where + parseCommand "PREPARE-SUCCESS" = Proto.parse0 PREPARE_SUCCESS + parseCommand "PREPARE-FAILURE" = Proto.parse1 PREPARE_FAILURE + parseCommand "TRANSFER-SUCCESS" = Proto.parse2 TRANSFER_SUCCESS + parseCommand "TRANSFER-FAILURE" = Proto.parse3 TRANSFER_FAILURE + parseCommand "CHECKPRESENT-SUCCESS" = Proto.parse1 CHECKPRESENT_SUCCESS + parseCommand "CHECKPRESENT-FAILURE" = Proto.parse1 CHECKPRESENT_FAILURE + parseCommand "CHECKPRESENT-UNKNOWN" = Proto.parse2 CHECKPRESENT_UNKNOWN + parseCommand "REMOVE-SUCCESS" = Proto.parse1 REMOVE_SUCCESS + parseCommand "REMOVE-FAILURE" = Proto.parse2 REMOVE_FAILURE + parseCommand "COST" = Proto.parse1 COST + parseCommand "AVAILABILITY" = Proto.parse1 AVAILABILITY + parseCommand "INITREMOTE-SUCCESS" = Proto.parse0 INITREMOTE_SUCCESS + parseCommand "INITREMOTE-FAILURE" = Proto.parse1 INITREMOTE_FAILURE + parseCommand "UNSUPPORTED-REQUEST" = Proto.parse0 UNSUPPORTED_REQUEST + parseCommand _ = Proto.parseFail + +-- Requests that the external remote can send at any time it's in control. +data RemoteRequest + = VERSION ProtocolVersion + | PROGRESS BytesProcessed + | DIRHASH Key + | SETCONFIG Setting String + | GETCONFIG Setting + | SETCREDS Setting String String + | GETCREDS Setting + | GETUUID + | GETGITDIR + | SETWANTED PreferredContentExpression + | GETWANTED + | SETSTATE Key String + | GETSTATE Key + | DEBUG String + deriving (Show) + +instance Proto.Receivable RemoteRequest where + parseCommand "VERSION" = Proto.parse1 VERSION + parseCommand "PROGRESS" = Proto.parse1 PROGRESS + parseCommand "DIRHASH" = Proto.parse1 DIRHASH + parseCommand "SETCONFIG" = Proto.parse2 SETCONFIG + parseCommand "GETCONFIG" = Proto.parse1 GETCONFIG + parseCommand "SETCREDS" = Proto.parse3 SETCREDS + parseCommand "GETCREDS" = Proto.parse1 GETCREDS + parseCommand "GETUUID" = Proto.parse0 GETUUID + parseCommand "GETGITDIR" = Proto.parse0 GETGITDIR + parseCommand "SETWANTED" = Proto.parse1 SETWANTED + parseCommand "GETWANTED" = Proto.parse0 GETWANTED + parseCommand "SETSTATE" = Proto.parse2 SETSTATE + parseCommand "GETSTATE" = Proto.parse1 GETSTATE + parseCommand "DEBUG" = Proto.parse1 DEBUG + parseCommand _ = Proto.parseFail + +-- Responses to RemoteRequest. +data RemoteResponse + = VALUE String + | CREDS String String + deriving (Show) + +instance Proto.Sendable RemoteResponse where + formatMessage (VALUE s) = [ "VALUE", Proto.serialize s ] + formatMessage (CREDS login password) = [ "CREDS", Proto.serialize login, Proto.serialize password ] + +-- Messages that can be sent at any time by either git-annex or the remote. +data AsyncMessage + = ERROR ErrorMsg + deriving (Show) + +instance Proto.Sendable AsyncMessage where + formatMessage (ERROR err) = [ "ERROR", Proto.serialize err ] + +instance Proto.Receivable AsyncMessage where + parseCommand "ERROR" = Proto.parse1 ERROR + parseCommand _ = Proto.parseFail + +-- Data types used for parameters when communicating with the remote. +-- All are serializable. +type ErrorMsg = String +type Setting = String +type ProtocolVersion = Int + +supportedProtocolVersions :: [ProtocolVersion] +supportedProtocolVersions = [1] + +instance Proto.Serializable Direction where + serialize Upload = "STORE" + serialize Download = "RETRIEVE" + + deserialize "STORE" = Just Upload + deserialize "RETRIEVE" = Just Download + deserialize _ = Nothing + +instance Proto.Serializable Key where + serialize = key2file + deserialize = file2key + +instance Proto.Serializable [Char] where + serialize = id + deserialize = Just + +instance Proto.Serializable ProtocolVersion where + serialize = show + deserialize = readish + +instance Proto.Serializable Cost where + serialize = show + deserialize = readish + +instance Proto.Serializable Availability where + serialize GloballyAvailable = "GLOBAL" + serialize LocallyAvailable = "LOCAL" + + deserialize "GLOBAL" = Just GloballyAvailable + deserialize "LOCAL" = Just LocallyAvailable + deserialize _ = Nothing + +instance Proto.Serializable BytesProcessed where + serialize (BytesProcessed n) = show n + deserialize = BytesProcessed <$$> readish diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs new file mode 100644 index 000000000..b2dd6cdaf --- /dev/null +++ b/Remote/GCrypt.hs @@ -0,0 +1,411 @@ +{- git remotes encrypted using git-remote-gcrypt + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.GCrypt ( + remote, + gen, + getGCryptUUID, + coreGCryptId, + setupRepo +) where + +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L +import Control.Exception.Extensible + +import Common.Annex +import Types.Remote +import Types.GitConfig +import Types.Crypto +import Types.Creds +import qualified Git +import qualified Git.Command +import qualified Git.Config +import qualified Git.GCrypt +import qualified Git.Construct +import qualified Git.Types as Git () +import qualified Annex.Branch +import qualified Annex.Content +import Config +import Config.Cost +import Remote.Helper.Git +import Remote.Helper.Encryptable +import Remote.Helper.Special +import Remote.Helper.Messages +import qualified Remote.Helper.Ssh as Ssh +import Utility.Metered +import Crypto +import Annex.UUID +import Annex.Ssh +import qualified Remote.Rsync +import Utility.Rsync +import Utility.Tmp +import Logs.Remote +import Logs.Transfer +import Utility.Gpg +import Annex.Content + +remote :: RemoteType +remote = RemoteType { + typename = "gcrypt", + -- Remote.Git takes care of enumerating gcrypt remotes too, + -- and will call our gen on them. + enumerate = return [], + generate = gen, + setup = gCryptSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen gcryptr u c gc = do + g <- gitRepo + -- get underlying git repo with real path, not gcrypt path + r <- liftIO $ Git.GCrypt.encryptedRemote g gcryptr + let r' = r { Git.remoteName = Git.remoteName gcryptr } + -- doublecheck that cache matches underlying repo's gcrypt-id + -- (which might not be set), only for local repos + (mgcryptid, r'') <- getGCryptId True r' + case (mgcryptid, Git.GCrypt.remoteRepoId g (Git.remoteName gcryptr)) of + (Just gcryptid, Just cachedgcryptid) + | gcryptid /= cachedgcryptid -> resetup gcryptid r'' + _ -> gen' r'' u c gc + where + -- A different drive may have been mounted, making a different + -- gcrypt remote available. So need to set the cached + -- gcrypt-id and annex-uuid of the remote to match the remote + -- that is now available. Also need to set the gcrypt particiants + -- correctly. + resetup gcryptid r = do + let u' = genUUIDInNameSpace gCryptNameSpace gcryptid + v <- M.lookup u' <$> readRemoteLog + case (Git.remoteName gcryptr, v) of + (Just remotename, Just c') -> do + setGcryptEncryption c' remotename + setConfig (remoteConfig gcryptr "uuid") (fromUUID u') + setConfig (ConfigKey $ Git.GCrypt.remoteConfigKey "gcrypt-id" remotename) gcryptid + gen' r u' c' gc + _ -> do + warning $ "not using unknown gcrypt repository pointed to by remote " ++ Git.repoDescribe r + return Nothing + +gen' :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen' r u c gc = do + cst <- remoteCost gc $ + if repoCheap r then nearlyCheapRemoteCost else expensiveRemoteCost + (rsynctransport, rsyncurl) <- rsyncTransportToObjects r + let rsyncopts = Remote.Rsync.genRsyncOpts c gc rsynctransport rsyncurl + let this = Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = \_ _ _ -> noCrypto + , retrieveKeyFile = \_ _ _ _ -> noCrypto + , retrieveKeyFileCheap = \_ _ -> return False + , removeKey = remove this rsyncopts + , hasKey = checkPresent this rsyncopts + , hasKeyCheap = repoCheap r + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , localpath = localpathCalc r + , repo = r + , gitconfig = gc { remoteGitConfig = Just $ extractGitConfig r } + , readonly = Git.repoIsHttp r + , availability = availabilityCalc r + , remotetype = remote + } + return $ Just $ encryptableRemote c + (store this rsyncopts) + (retrieve this rsyncopts) + this + +rsyncTransportToObjects :: Git.Repo -> Annex ([CommandParam], String) +rsyncTransportToObjects r = do + (rsynctransport, rsyncurl, _) <- rsyncTransport r + return (rsynctransport, rsyncurl ++ "/annex/objects") + +rsyncTransport :: Git.Repo -> Annex ([CommandParam], String, AccessMethod) +rsyncTransport r + | "ssh://" `isPrefixOf` loc = sshtransport $ break (== '/') $ drop (length "ssh://") loc + | "//:" `isInfixOf` loc = othertransport + | ":" `isInfixOf` loc = sshtransport $ separate (== ':') loc + | otherwise = othertransport + where + loc = Git.repoLocation r + sshtransport (host, path) = do + let rsyncpath = if "/~/" `isPrefixOf` path + then drop 3 path + else path + opts <- sshCachingOptions (host, Nothing) [] + return (rsyncShell $ Param "ssh" : opts, host ++ ":" ++ rsyncpath, AccessShell) + othertransport = return ([], loc, AccessDirect) + +noCrypto :: Annex a +noCrypto = error "cannot use gcrypt remote without encryption enabled" + +unsupportedUrl :: Annex a +unsupportedUrl = error "using non-ssh remote repo url with gcrypt is not supported" + +gCryptSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +gCryptSetup mu _ c = go $ M.lookup "gitrepo" c + where + remotename = fromJust (M.lookup "name" c) + go Nothing = error "Specify gitrepo=" + go (Just gitrepo) = do + c' <- encryptionSetup c + inRepo $ Git.Command.run + [ Params "remote add" + , Param remotename + , Param $ Git.GCrypt.urlPrefix ++ gitrepo + ] + + setGcryptEncryption c' remotename + + {- Run a git fetch and a push to the git repo in order to get + - its gcrypt-id set up, so that later git annex commands + - will use the remote as a gcrypt remote. The fetch is + - needed if the repo already exists; the push is needed + - if the repo has not yet been initialized by gcrypt. -} + void $ inRepo $ Git.Command.runBool + [ Param "fetch" + , Param remotename + ] + void $ inRepo $ Git.Command.runBool + [ Param "push" + , Param remotename + , Param $ Git.fromRef Annex.Branch.fullname + ] + g <- inRepo Git.Config.reRead + case Git.GCrypt.remoteRepoId g (Just remotename) of + Nothing -> error "unable to determine gcrypt-id of remote" + Just gcryptid -> do + let u = genUUIDInNameSpace gCryptNameSpace gcryptid + if Just u == mu || isNothing mu + then do + method <- setupRepo gcryptid =<< inRepo (Git.Construct.fromRemoteLocation gitrepo) + gitConfigSpecialRemote u c' "gcrypt" (fromAccessMethod method) + return (c', u) + else error $ "uuid mismatch " ++ show (u, mu, gcryptid) + +{- Sets up the gcrypt repository. The repository is either a local + - repo, or it is accessed via rsync directly, or it is accessed over ssh + - and git-annex-shell is available to manage it. + - + - The GCryptID is recorded in the repository's git config for later use. + - Also, if the git config has receive.denyNonFastForwards set, disable + - it; gcrypt relies on being able to fast-forward branches. + -} +setupRepo :: Git.GCrypt.GCryptId -> Git.Repo -> Annex AccessMethod +setupRepo gcryptid r + | Git.repoIsUrl r = do + (_, _, accessmethod) <- rsyncTransport r + case accessmethod of + AccessDirect -> rsyncsetup + AccessShell -> ifM gitannexshellsetup + ( return AccessShell + , rsyncsetup + ) + | Git.repoIsLocalUnknown r = localsetup =<< liftIO (Git.Config.read r) + | otherwise = localsetup r + where + localsetup r' = do + let setconfig k v = liftIO $ Git.Command.run [Param "config", Param k, Param v] r' + setconfig coreGCryptId gcryptid + setconfig denyNonFastForwards (Git.Config.boolConfig False) + return AccessDirect + + {- As well as modifying the remote's git config, + - create the objectDir on the remote, + - which is needed for direct rsync of objects to work. + -} + rsyncsetup = Remote.Rsync.withRsyncScratchDir $ \tmp -> do + liftIO $ createDirectoryIfMissing True $ tmp objectDir + (rsynctransport, rsyncurl, _) <- rsyncTransport r + let tmpconfig = tmp "config" + void $ liftIO $ rsync $ rsynctransport ++ + [ Param $ rsyncurl ++ "/config" + , Param tmpconfig + ] + liftIO $ do + void $ Git.Config.changeFile tmpconfig coreGCryptId gcryptid + void $ Git.Config.changeFile tmpconfig denyNonFastForwards (Git.Config.boolConfig False) + ok <- liftIO $ rsync $ rsynctransport ++ + [ Params "--recursive" + , Param $ tmp ++ "/" + , Param rsyncurl + ] + unless ok $ + error "Failed to connect to remote to set it up." + return AccessDirect + + {- Ask git-annex-shell to configure the repository as a gcrypt + - repository. May fail if it is too old. -} + gitannexshellsetup = Ssh.onRemote r (boolSystem, False) + "gcryptsetup" [ Param gcryptid ] [] + + denyNonFastForwards = "receive.denyNonFastForwards" + +shellOrRsync :: Remote -> Annex a -> Annex a -> Annex a +shellOrRsync r ashell arsync = case method of + AccessShell -> ashell + _ -> arsync + where + method = toAccessMethod $ fromMaybe "" $ + remoteAnnexGCrypt $ gitconfig r + +{- Configure gcrypt to use the same list of keyids that + - were passed to initremote as its participants. + - Also, configure it to use a signing key that is in the list of + - participants, which gcrypt requires is the case, and may not be + - depending on system configuration. + - + - (For shared encryption, gcrypt's default behavior is used.) + - + - Also, sets gcrypt-publish-participants to avoid unncessary gpg + - passphrase prompts. + -} +setGcryptEncryption :: RemoteConfig -> String -> Annex () +setGcryptEncryption c remotename = do + let participants = remoteconfig Git.GCrypt.remoteParticipantConfigKey + case extractCipher c of + Nothing -> noCrypto + Just (EncryptedCipher _ _ (KeyIds { keyIds = ks})) -> do + setConfig participants (unwords ks) + let signingkey = ConfigKey $ Git.GCrypt.remoteSigningKey remotename + skeys <- M.keys <$> liftIO secretKeys + case filter (`elem` ks) skeys of + [] -> noop + (k:_) -> setConfig signingkey k + Just (SharedCipher _) -> + unsetConfig participants + setConfig (remoteconfig Git.GCrypt.remotePublishParticipantConfigKey) + (Git.Config.boolConfig True) + where + remoteconfig n = ConfigKey $ n remotename + +store :: Remote -> Remote.Rsync.RsyncOpts -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +store r rsyncopts (cipher, enck) k p + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ + metered (Just p) k $ \meterupdate -> spoolencrypted $ \h -> do + let dest = gCryptLocation r enck + createDirectoryIfMissing True $ parentDir dest + readBytes (meteredWriteFile meterupdate dest) h + return True + | Git.repoIsSsh (repo r) = shellOrRsync r storeshell storersync + | otherwise = unsupportedUrl + where + gpgopts = getGpgEncParams r + storersync = Remote.Rsync.storeEncrypted rsyncopts gpgopts (cipher, enck) k p + storeshell = withTmp enck $ \tmp -> + ifM (spoolencrypted $ readBytes $ \b -> catchBoolIO $ L.writeFile tmp b >> return True) + ( Ssh.rsyncHelper (Just p) + =<< Ssh.rsyncParamsRemote False r Upload enck tmp Nothing + , return False + ) + spoolencrypted a = Annex.Content.sendAnnex k noop $ \src -> + liftIO $ catchBoolIO $ + encrypt gpgopts cipher (feedFile src) a + +retrieve :: Remote -> Remote.Rsync.RsyncOpts -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieve r rsyncopts (cipher, enck) k d p + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + retrievewith $ L.readFile src + return True + | Git.repoIsSsh (repo r) = shellOrRsync r retrieveshell retrieversync + | otherwise = unsupportedUrl + where + src = gCryptLocation r enck + retrievewith a = metered (Just p) k $ \meterupdate -> liftIO $ + a >>= \b -> + decrypt cipher (feedBytes b) + (readBytes $ meteredWriteFile meterupdate d) + retrieversync = Remote.Rsync.retrieveEncrypted rsyncopts (cipher, enck) k d p + retrieveshell = withTmp enck $ \tmp -> + ifM (Ssh.rsyncHelper (Just p) =<< Ssh.rsyncParamsRemote False r Download enck tmp Nothing) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile d + return True + , return False + ) + +remove :: Remote -> Remote.Rsync.RsyncOpts -> Key -> Annex Bool +remove r rsyncopts k + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + liftIO $ removeDirectoryRecursive $ parentDir $ gCryptLocation r k + return True + | Git.repoIsSsh (repo r) = shellOrRsync r removeshell removersync + | otherwise = unsupportedUrl + where + removersync = Remote.Rsync.remove rsyncopts k + removeshell = Ssh.dropKey (repo r) k + +checkPresent :: Remote -> Remote.Rsync.RsyncOpts -> Key -> Annex (Either String Bool) +checkPresent r rsyncopts k + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) (cantCheck $ repo r) $ + liftIO $ catchDefaultIO (cantCheck $ repo r) $ + Right <$> doesFileExist (gCryptLocation r k) + | Git.repoIsSsh (repo r) = shellOrRsync r checkshell checkrsync + | otherwise = unsupportedUrl + where + checkrsync = Remote.Rsync.checkPresent (repo r) rsyncopts k + checkshell = Ssh.inAnnex (repo r) k + +{- Annexed objects are hashed using lower-case directories for max + - portability. -} +gCryptLocation :: Remote -> Key -> FilePath +gCryptLocation r key = Git.repoLocation (repo r) objectDir keyPath key hashDirLower + +data AccessMethod = AccessDirect | AccessShell + +fromAccessMethod :: AccessMethod -> String +fromAccessMethod AccessShell = "shell" +fromAccessMethod AccessDirect = "true" + +toAccessMethod :: String -> AccessMethod +toAccessMethod "shell" = AccessShell +toAccessMethod _ = AccessDirect + +getGCryptUUID :: Bool -> Git.Repo -> Annex (Maybe UUID) +getGCryptUUID fast r = (genUUIDInNameSpace gCryptNameSpace <$>) . fst + <$> getGCryptId fast r + +coreGCryptId :: String +coreGCryptId = "core.gcrypt-id" + +{- gcrypt repos set up by git-annex as special remotes have a + - core.gcrypt-id setting in their config, which can be mapped back to + - the remote's UUID. + - + - In fast mode, only checks local repos. To check a remote repo, + - tries git-annex-shell and direct rsync of the git config file. + - + - (Also returns a version of input repo with its config read.) -} +getGCryptId :: Bool -> Git.Repo -> Annex (Maybe Git.GCrypt.GCryptId, Git.Repo) +getGCryptId fast r + | Git.repoIsLocal r || Git.repoIsLocalUnknown r = extract <$> + liftIO (catchMaybeIO $ Git.Config.read r) + | not fast = extract . liftM fst <$> getM (eitherToMaybe <$>) + [ Ssh.onRemote r (Git.Config.fromPipe r, Left undefined) "configlist" [] [] + , getConfigViaRsync r + ] + | otherwise = return (Nothing, r) + where + extract Nothing = (Nothing, r) + extract (Just r') = (Git.Config.getMaybe coreGCryptId r', r') + +getConfigViaRsync :: Git.Repo -> Annex (Either SomeException (Git.Repo, String)) +getConfigViaRsync r = do + (rsynctransport, rsyncurl, _) <- rsyncTransport r + liftIO $ do + withTmpFile "tmpconfig" $ \tmpconfig _ -> do + void $ rsync $ rsynctransport ++ + [ Param $ rsyncurl ++ "/config" + , Param tmpconfig + ] + Git.Config.fromFile r tmpconfig diff --git a/Remote/Git.hs b/Remote/Git.hs new file mode 100644 index 000000000..4498ec907 --- /dev/null +++ b/Remote/Git.hs @@ -0,0 +1,562 @@ +{- Standard git remotes. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Git ( + remote, + configRead, + repoAvail, +) where + +import Common.Annex +import Annex.Ssh +import Types.Remote +import Types.GitConfig +import qualified Git +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Command +import qualified Git.GCrypt +import qualified Git.Types as Git +import qualified Annex +import Logs.Presence +import Annex.Transfer +import Annex.UUID +import Annex.Exception +import qualified Annex.Content +import qualified Annex.BranchState +import qualified Annex.Branch +import qualified Annex.Url as Url +import Utility.Tmp +import Config +import Config.Cost +import Annex.Init +import Types.Key +import Types.CleanupActions +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Logs.Location +import Utility.Metered +#ifndef mingw32_HOST_OS +import Utility.CopyFile +#endif +import Utility.Env +import Utility.Batch +import Remote.Helper.Git +import Remote.Helper.Messages +import qualified Remote.Helper.Ssh as Ssh +import qualified Remote.GCrypt +import Config.Files +import Creds + +import Control.Concurrent +import Control.Concurrent.MSampleVar +import qualified Data.Map as M +import Control.Exception.Extensible + +remote :: RemoteType +remote = RemoteType { + typename = "git", + enumerate = list, + generate = gen, + setup = gitSetup +} + +list :: Annex [Git.Repo] +list = do + c <- fromRepo Git.config + rs <- mapM (tweakurl c) =<< fromRepo Git.remotes + mapM configRead rs + where + annexurl n = "remote." ++ n ++ ".annexurl" + tweakurl c r = do + let n = fromJust $ Git.remoteName r + case M.lookup (annexurl n) c of + Nothing -> return r + Just url -> inRepo $ \g -> + Git.Construct.remoteNamed n $ + Git.Construct.fromRemoteLocation url g + +{- Git remotes are normally set up using standard git command, not + - git-annex initremote and enableremote. + - + - For initremote, the git remote must already be set up, and have a uuid. + - Initremote simply remembers its location. + - + - enableremote simply sets up a git remote using the stored location. + - No attempt is made to make the remote be accessible via ssh key setup, + - etc. + -} +gitSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +gitSetup Nothing _ c = do + let location = fromMaybe (error "Specify location=url") $ + Url.parseURIRelaxed =<< M.lookup "location" c + g <- Annex.gitRepo + u <- case filter (\r -> Git.location r == Git.Url location) (Git.remotes g) of + [r] -> getRepoUUID r + [] -> error "could not find existing git remote with specified location" + _ -> error "found multiple git remotes with specified location" + return (c, u) +gitSetup (Just u) _ c = do + inRepo $ Git.Command.run + [ Param "remote" + , Param "add" + , Param $ fromMaybe (error "no name") (M.lookup "name" c) + , Param $ fromMaybe (error "no location") (M.lookup "location" c) + ] + return (c, u) + +{- It's assumed to be cheap to read the config of non-URL remotes, so this is + - done each time git-annex is run in a way that uses remotes. + - + - Conversely, the config of an URL remote is only read when there is no + - cached UUID value. -} +configRead :: Git.Repo -> Annex Git.Repo +configRead r = do + gc <- Annex.getRemoteGitConfig r + u <- getRepoUUID r + case (repoCheap r, remoteAnnexIgnore gc, u) of + (_, True, _) -> return r + (True, _, _) -> tryGitConfigRead r + (False, _, NoUUID) -> tryGitConfigRead r + _ -> return r + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc + | Git.GCrypt.isEncrypted r = Remote.GCrypt.gen r u c gc + | otherwise = go <$> remoteCost gc defcst + where + defcst = if repoCheap r then cheapRemoteCost else expensiveRemoteCost + go cst = Just new + where + new = Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = copyToRemote new + , retrieveKeyFile = copyFromRemote new + , retrieveKeyFileCheap = copyFromRemoteCheap new + , removeKey = dropKey new + , hasKey = inAnnex new + , hasKeyCheap = repoCheap r + , whereisKey = Nothing + , remoteFsck = if Git.repoIsUrl r + then Nothing + else Just $ fsckOnRemote r + , repairRepo = if Git.repoIsUrl r + then Nothing + else Just $ repairRemote r + , config = c + , localpath = localpathCalc r + , repo = r + , gitconfig = gc + { remoteGitConfig = Just $ extractGitConfig r } + , readonly = Git.repoIsHttp r + , availability = availabilityCalc r + , remotetype = remote + } + +{- Checks relatively inexpensively if a repository is available for use. -} +repoAvail :: Git.Repo -> Annex Bool +repoAvail r + | Git.repoIsHttp r = return True + | Git.GCrypt.isEncrypted r = do + g <- gitRepo + liftIO $ do + er <- Git.GCrypt.encryptedRemote g r + if Git.repoIsLocal er || Git.repoIsLocalUnknown er + then catchBoolIO $ + void (Git.Config.read er) >> return True + else return True + | Git.repoIsUrl r = return True + | Git.repoIsLocalUnknown r = return False + | otherwise = liftIO $ isJust <$> catchMaybeIO (Git.Config.read r) + +{- Tries to read the config for a specified remote, updates state, and + - returns the updated repo. -} +tryGitConfigRead :: Git.Repo -> Annex Git.Repo +tryGitConfigRead r + | haveconfig r = return r -- already read + | Git.repoIsSsh r = store $ do + v <- Ssh.onRemote r (pipedconfig, Left undefined) "configlist" [] [] + case v of + Right r' + | haveconfig r' -> return r' + | otherwise -> configlist_failed + Left _ -> configlist_failed + | Git.repoIsHttp r = store geturlconfig + | Git.GCrypt.isEncrypted r = handlegcrypt =<< getConfigMaybe (remoteConfig r "uuid") + | Git.repoIsUrl r = return r + | otherwise = store $ liftIO $ + readlocalannexconfig `catchNonAsync` (const $ return r) + where + haveconfig = not . M.null . Git.config + + pipedconfig cmd params = do + v <- Git.Config.fromPipe r cmd params + case v of + Right (r', val) -> do + when (getUncachedUUID r' == NoUUID && not (null val)) $ do + warningIO $ "Failed to get annex.uuid configuration of repository " ++ Git.repoDescribe r + warningIO $ "Instead, got: " ++ show val + warningIO $ "This is unexpected; please check the network transport!" + return $ Right r' + Left l -> return $ Left l + + geturlconfig = do + uo <- Url.getUrlOptions + v <- liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do + hClose h + ifM (Url.downloadQuiet (Git.repoLocation r ++ "/config") tmpfile uo) + ( pipedconfig "git" [Param "config", Param "--null", Param "--list", Param "--file", File tmpfile] + , return $ Left undefined + ) + case v of + Left _ -> do + set_ignore "not usable by git-annex" False + return r + Right r' -> do + -- Cache when http remote is not bare for + -- optimisation. + unless (Git.Config.isBare r') $ + setremote "annex-bare" (Git.Config.boolConfig False) + return r' + + store = observe $ \r' -> do + g <- gitRepo + let l = Git.remotes g + let g' = g { Git.remotes = exchange l r' } + Annex.changeState $ \s -> s { Annex.repo = g' } + + exchange [] _ = [] + exchange (old:ls) new + | Git.remoteName old == Git.remoteName new = + new : exchange ls new + | otherwise = + old : exchange ls new + + {- Is this remote just not available, or does + - it not have git-annex-shell? + - Find out by trying to fetch from the remote. -} + configlist_failed = case Git.remoteName r of + Nothing -> return r + Just n -> do + whenM (inRepo $ Git.Command.runBool [Param "fetch", Param "--quiet", Param n]) $ do + set_ignore "does not have git-annex installed" True + return r + + set_ignore msg longmessage = do + let k = "annex-ignore" + case Git.remoteName r of + Nothing -> noop + Just n -> do + warning $ "Remote " ++ n ++ " " ++ msg ++ "; setting " ++ k + when longmessage $ + warning $ "This could be a problem with the git-annex installation on the remote. Please make sure that git-annex-shell is available in PATH when you ssh into the remote. Once you have fixed the git-annex installation, run: git config remote." ++ n ++ "." ++ k ++ " false" + setremote k (Git.Config.boolConfig True) + + setremote k v = case Git.remoteName r of + Nothing -> noop + Just n -> do + let k' = "remote." ++ n ++ "." ++ k + inRepo $ Git.Command.run [Param "config", Param k', Param v] + + handlegcrypt Nothing = return r + handlegcrypt (Just _cacheduuid) = do + -- Generate UUID from the gcrypt-id + g <- gitRepo + case Git.GCrypt.remoteRepoId g (Git.remoteName r) of + Nothing -> return r + Just v -> store $ liftIO $ setUUID r $ + genUUIDInNameSpace gCryptNameSpace v + + {- The local repo may not yet be initialized, so try to initialize + - it if allowed. However, if that fails, still return the read + - git config. -} + readlocalannexconfig = do + s <- Annex.new r + Annex.eval s $ do + Annex.BranchState.disableUpdate + void $ tryAnnex $ ensureInitialized + Annex.getState Annex.repo + +{- Checks if a given remote has the content for a key inAnnex. + - If the remote cannot be accessed, or if it cannot determine + - whether it has the content, returns a Left error message. + -} +inAnnex :: Remote -> Key -> Annex (Either String Bool) +inAnnex rmt key + | Git.repoIsHttp r = checkhttp + | Git.repoIsUrl r = checkremote + | otherwise = checklocal + where + r = repo rmt + checkhttp = do + showChecking r + ifM (Url.withUrlOptions $ \uo -> anyM (\u -> Url.checkBoth u (keySize key) uo) (keyUrls rmt key)) + ( return $ Right True + , return $ Left "not found" + ) + checkremote = Ssh.inAnnex r key + checklocal = guardUsable r (cantCheck r) $ dispatch <$> check + where + check = either (Left . show) Right + <$> tryAnnex (onLocal rmt $ Annex.Content.inAnnexSafe key) + dispatch (Left e) = Left e + dispatch (Right (Just b)) = Right b + dispatch (Right Nothing) = cantCheck r + +keyUrls :: Remote -> Key -> [String] +keyUrls r key = map tourl locs' + where + tourl l = Git.repoLocation (repo r) ++ "/" ++ l + -- If the remote is known to not be bare, try the hash locations + -- used for non-bare repos first, as an optimisation. + locs + | remoteAnnexBare (gitconfig r) == Just False = reverse (annexLocations key) + | otherwise = annexLocations key +#ifndef mingw32_HOST_OS + locs' = locs +#else + locs' = map (replace "\\" "/") locs +#endif + +dropKey :: Remote -> Key -> Annex Bool +dropKey r key + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) False $ commitOnCleanup r $ onLocal r $ do + ensureInitialized + whenM (Annex.Content.inAnnex key) $ do + Annex.Content.lockContent key $ + Annex.Content.removeAnnex key + logStatus key InfoMissing + Annex.Content.saveState True + return True + | Git.repoIsHttp (repo r) = error "dropping from http remote not supported" + | otherwise = commitOnCleanup r $ Ssh.dropKey (repo r) key + +{- Tries to copy a key's content from a remote's annex to a file. -} +copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +copyFromRemote r key file dest _p = copyFromRemote' r key file dest +copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool +copyFromRemote' r key file dest + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + params <- Ssh.rsyncParams r Download + u <- getUUID + -- run copy from perspective of remote + onLocal r $ do + ensureInitialized + v <- Annex.Content.prepSendAnnex key + case v of + Nothing -> return False + Just (object, checksuccess) -> + runTransfer (Transfer Download u key) file noRetry + (rsyncOrCopyFile params object dest) + <&&> checksuccess + | Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do + direct <- isDirect + Ssh.rsyncHelper (Just feeder) + =<< Ssh.rsyncParamsRemote direct r Download key dest file + | Git.repoIsHttp (repo r) = Annex.Content.downloadUrl (keyUrls r key) dest + | otherwise = error "copying from non-ssh, non-http remote not supported" + where + {- Feed local rsync's progress info back to the remote, + - by forking a feeder thread that runs + - git-annex-shell transferinfo at the same time + - git-annex-shell sendkey is running. + - + - To avoid extra password prompts, this is only done when ssh + - connection caching is supported. + - Note that it actually waits for rsync to indicate + - progress before starting transferinfo, in order + - to ensure ssh connection caching works and reuses + - the connection set up for the sendkey. + - + - Also note that older git-annex-shell does not support + - transferinfo, so stderr is dropped and failure ignored. + -} + feedprogressback a = ifM (isJust <$> sshCacheDir) + ( feedprogressback' a + , a $ const noop + ) + feedprogressback' a = do + u <- getUUID + let fields = (Fields.remoteUUID, fromUUID u) + : maybe [] (\f -> [(Fields.associatedFile, f)]) file + Just (cmd, params) <- Ssh.git_annex_shell (repo r) "transferinfo" + [Param $ key2file key] fields + v <- liftIO (newEmptySV :: IO (MSampleVar Integer)) + tid <- liftIO $ forkIO $ void $ tryIO $ do + bytes <- readSV v + p <- createProcess $ + (proc cmd (toCommand params)) + { std_in = CreatePipe + , std_err = CreatePipe + } + hClose $ stderrHandle p + let h = stdinHandle p + let send b = do + hPrint h b + hFlush h + send bytes + forever $ + send =<< readSV v + let feeder = writeSV v . fromBytesProcessed + bracketIO noop (const $ tryIO $ killThread tid) (const $ a feeder) + +copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool +#ifndef mingw32_HOST_OS +copyFromRemoteCheap r key file + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + loc <- liftIO $ gitAnnexLocation key (repo r) $ + fromJust $ remoteGitConfig $ gitconfig r + liftIO $ catchBoolIO $ createSymbolicLink loc file >> return True + | Git.repoIsSsh (repo r) = + ifM (Annex.Content.preseedTmp key file) + ( copyFromRemote' r key Nothing file + , return False + ) + | otherwise = return False +#else +copyFromRemoteCheap _ _ _ = return False +#endif + +{- Tries to copy a key's content to a remote's annex. -} +copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +copyToRemote r key file p + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) False $ commitOnCleanup r $ + copylocal =<< Annex.Content.prepSendAnnex key + | Git.repoIsSsh (repo r) = commitOnCleanup r $ + Annex.Content.sendAnnex key noop $ \object -> do + direct <- isDirect + Ssh.rsyncHelper (Just p) + =<< Ssh.rsyncParamsRemote direct r Upload key object file + | otherwise = error "copying to non-ssh repo not supported" + where + copylocal Nothing = return False + copylocal (Just (object, checksuccess)) = do + -- The checksuccess action is going to be run in + -- the remote's Annex, but it needs access to the current + -- Annex monad's state. + checksuccessio <- Annex.withCurrentState checksuccess + params <- Ssh.rsyncParams r Upload + u <- getUUID + -- run copy from perspective of remote + onLocal r $ ifM (Annex.Content.inAnnex key) + ( return True + , do + ensureInitialized + runTransfer (Transfer Download u key) file noRetry $ const $ + Annex.Content.saveState True `after` + Annex.Content.getViaTmpChecked (liftIO checksuccessio) key + (\d -> rsyncOrCopyFile params object d p) + ) + +fsckOnRemote :: Git.Repo -> [CommandParam] -> Annex (IO Bool) +fsckOnRemote r params + | Git.repoIsUrl r = do + s <- Ssh.git_annex_shell r "fsck" params [] + return $ case s of + Nothing -> return False + Just (c, ps) -> batchCommand c ps + | otherwise = return $ do + program <- readProgramFile + r' <- Git.Config.read r + environ <- getEnvironment + let environ' = addEntries + [ ("GIT_WORK_TREE", Git.repoPath r') + , ("GIT_DIR", Git.localGitDir r') + ] environ + batchCommandEnv program (Param "fsck" : params) $ Just environ' + +{- The passed repair action is run in the Annex monad of the remote. -} +repairRemote :: Git.Repo -> Annex Bool -> Annex (IO Bool) +repairRemote r a = return $ do + s <- Annex.new r + Annex.eval s $ do + Annex.BranchState.disableUpdate + ensureInitialized + a + +{- Runs an action from the perspective of a local remote. + - + - The AnnexState is cached for speed and to avoid resource leaks. + - + - The repository's git-annex branch is not updated, as an optimisation. + - No caller of onLocal can query data from the branch and be ensured + - it gets a current value. Caller of onLocal can make changes to + - the branch, however. + -} +onLocal :: Remote -> Annex a -> Annex a +onLocal r a = do + m <- Annex.getState Annex.remoteannexstate + case M.lookup (uuid r) m of + Nothing -> do + st <- liftIO $ Annex.new (repo r) + go st $ do + Annex.BranchState.disableUpdate + a + Just st -> go st a + where + cache st = Annex.changeState $ \s -> s + { Annex.remoteannexstate = M.insert (uuid r) st (Annex.remoteannexstate s) } + go st a' = do + (ret, st') <- liftIO $ Annex.run st a' + cache st' + return ret + +{- Copys a file with rsync unless both locations are on the same + - filesystem. Then cp could be faster. -} +rsyncOrCopyFile :: [CommandParam] -> FilePath -> FilePath -> MeterUpdate -> Annex Bool +rsyncOrCopyFile rsyncparams src dest p = +#ifdef mingw32_HOST_OS + dorsync + where +#else + ifM (sameDeviceIds src dest) (docopy, dorsync) + where + sameDeviceIds a b = (==) <$> getDeviceId a <*> getDeviceId b + getDeviceId f = deviceID <$> liftIO (getFileStatus $ parentDir f) + docopy = liftIO $ bracket + (forkIO $ watchfilesize zeroBytesProcessed) + (void . tryIO . killThread) + (const $ copyFileExternal src dest) + watchfilesize oldsz = do + threadDelay 500000 -- 0.5 seconds + v <- catchMaybeIO $ + toBytesProcessed . fileSize + <$> getFileStatus dest + case v of + Just sz + | sz /= oldsz -> do + p sz + watchfilesize sz + _ -> watchfilesize oldsz +#endif + dorsync = Ssh.rsyncHelper (Just p) $ + rsyncparams ++ [File src, File dest] + +commitOnCleanup :: Remote -> Annex a -> Annex a +commitOnCleanup r a = go `after` a + where + go = Annex.addCleanup (RemoteCleanup $ uuid r) cleanup + cleanup + | not $ Git.repoIsUrl (repo r) = onLocal r $ + doQuietSideAction $ + Annex.Branch.commit "update" + | otherwise = void $ do + Just (shellcmd, shellparams) <- + Ssh.git_annex_shell (repo r) "commit" [] [] + + -- Throw away stderr, since the remote may not + -- have a new enough git-annex shell to + -- support committing. + liftIO $ catchMaybeIO $ + withQuietOutput createProcessSuccess $ + proc shellcmd $ + toCommand shellparams diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs new file mode 100644 index 000000000..00be9e1a9 --- /dev/null +++ b/Remote/Glacier.hs @@ -0,0 +1,302 @@ +{- Amazon Glacier remotes. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Glacier (remote, jobList) where + +import qualified Data.Map as M +import qualified Data.Text as T + +import Common.Annex +import Types.Remote +import Types.Key +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import qualified Remote.Helper.AWS as AWS +import Crypto +import Creds +import Utility.Metered +import qualified Annex +import Annex.Content +import Annex.UUID +import Utility.Env + +type Vault = String +type Archive = FilePath + +remote :: RemoteType +remote = RemoteType { + typename = "glacier", + enumerate = findSpecialRemotes "glacier", + generate = gen, + setup = glacierSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc veryExpensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +glacierSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +glacierSetup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + c' <- setRemoteCredPair c (AWS.creds u) mcreds + glacierSetup' (isJust mu) u c' +glacierSetup' :: Bool -> UUID -> RemoteConfig -> Annex (RemoteConfig, UUID) +glacierSetup' enabling u c = do + c' <- encryptionSetup c + let fullconfig = c' `M.union` defaults + unless enabling $ + genVault fullconfig u + gitConfigSpecialRemote u fullconfig "glacier" "true" + return (fullconfig, u) + where + remotename = fromJust (M.lookup "name" c) + defvault = remotename ++ "-" ++ fromUUID u + defaults = M.fromList + [ ("datacenter", T.unpack $ AWS.defaultRegion AWS.Glacier) + , ("vault", defvault) + ] + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p + | keySize k == Just 0 = do + warning "Cannot store empty files in Glacier." + return False + | otherwise = sendAnnex k (void $ remove r k) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper r k $ streamMeteredFile src meterupdate + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = sendAnnex k (void $ remove r enck) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper r enck $ \h -> + encrypt (getGpgEncParams r) cipher (feedFile src) + (readBytes $ meteredWrite meterupdate h) + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = metered (Just p) k $ \meterupdate -> + retrieveHelper r k $ + readBytes $ meteredWriteFile meterupdate d + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = metered (Just p) k $ \meterupdate -> + retrieveHelper r enck $ readBytes $ \b -> + decrypt cipher (feedBytes b) $ + readBytes $ meteredWriteFile meterupdate d + +storeHelper :: Remote -> Key -> (Handle -> IO ()) -> Annex Bool +storeHelper r k feeder = go =<< glacierEnv c u + where + c = config r + u = uuid r + params = glacierParams c + [ Param "archive" + , Param "upload" + , Param "--name", Param $ archive r k + , Param $ getVault $ config r + , Param "-" + ] + go Nothing = return False + go (Just e) = do + let p = (proc "glacier" (toCommand params)) { env = Just e } + liftIO $ catchBoolIO $ + withHandle StdinHandle createProcessSuccess p $ \h -> do + feeder h + return True + +retrieveHelper :: Remote -> Key -> (Handle -> IO ()) -> Annex Bool +retrieveHelper r k reader = go =<< glacierEnv c u + where + c = config r + u = uuid r + params = glacierParams c + [ Param "archive" + , Param "retrieve" + , Param "-o-" + , Param $ getVault $ config r + , Param $ archive r k + ] + go Nothing = return False + go (Just e) = do + let p = (proc "glacier" (toCommand params)) { env = Just e } + ok <- liftIO $ catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p $ \h -> + ifM (hIsEOF h) + ( return False + , do + reader h + return True + ) + unless ok later + return ok + later = showLongNote "Recommend you wait up to 4 hours, and then run this command again." + +remove :: Remote -> Key -> Annex Bool +remove r k = glacierAction r + [ Param "archive" + , Param "delete" + , Param $ getVault $ config r + , Param $ archive r k + ] + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = do + showAction $ "checking " ++ name r + go =<< glacierEnv (config r) (uuid r) + where + go Nothing = return $ Left "cannot check glacier" + go (Just e) = do + {- glacier checkpresent outputs the archive name to stdout if + - it's present. -} + v <- liftIO $ catchMsgIO $ + readProcessEnv "glacier" (toCommand params) (Just e) + case v of + Right s -> do + let probablypresent = key2file k `elem` lines s + if probablypresent + then ifM (Annex.getFlag "trustglacier") + ( return $ Right True, untrusted ) + else return $ Right False + Left err -> return $ Left err + + params = glacierParams (config r) + [ Param "archive" + , Param "checkpresent" + , Param $ getVault $ config r + , Param "--quiet" + , Param $ archive r k + ] + + untrusted = return $ Left $ unlines + [ "Glacier's inventory says it has a copy." + , "However, the inventory could be out of date, if it was recently removed." + , "(Use --trust-glacier if you're sure it's still in Glacier.)" + , "" + ] + +glacierAction :: Remote -> [CommandParam] -> Annex Bool +glacierAction r = runGlacier (config r) (uuid r) + +runGlacier :: RemoteConfig -> UUID -> [CommandParam] -> Annex Bool +runGlacier c u params = go =<< glacierEnv c u + where + go Nothing = return False + go (Just e) = liftIO $ + boolSystemEnv "glacier" (glacierParams c params) (Just e) + +glacierParams :: RemoteConfig -> [CommandParam] -> [CommandParam] +glacierParams c params = datacenter:params + where + datacenter = Param $ "--region=" ++ + fromMaybe (error "Missing datacenter configuration") + (M.lookup "datacenter" c) + +glacierEnv :: RemoteConfig -> UUID -> Annex (Maybe [(String, String)]) +glacierEnv c u = go =<< getRemoteCredPairFor "glacier" c creds + where + go Nothing = return Nothing + go (Just (user, pass)) = do + e <- liftIO getEnvironment + return $ Just $ addEntries [(uk, user), (pk, pass)] e + + creds = AWS.creds u + (uk, pk) = credPairEnvironment creds + +getVault :: RemoteConfig -> Vault +getVault = fromMaybe (error "Missing vault configuration") + . M.lookup "vault" + +archive :: Remote -> Key -> Archive +archive r k = fileprefix ++ key2file k + where + fileprefix = M.findWithDefault "" "fileprefix" $ config r + +genVault :: RemoteConfig -> UUID -> Annex () +genVault c u = unlessM (runGlacier c u params) $ + error "Failed creating glacier vault." + where + params = + [ Param "vault" + , Param "create" + , Param $ getVault c + ] + +{- Partitions the input list of keys into ones which have + - glacier retieval jobs that have succeeded, or failed. + - + - A complication is that `glacier job list` will display the encrypted + - keys when the remote is encrypted. + -} +jobList :: Remote -> [Key] -> Annex ([Key], [Key]) +jobList r keys = go =<< glacierEnv (config r) (uuid r) + where + params = [ Param "job", Param "list" ] + nada = ([], []) + myvault = getVault $ config r + + go Nothing = return nada + go (Just e) = do + v <- liftIO $ catchMaybeIO $ + readProcessEnv "glacier" (toCommand params) (Just e) + maybe (return nada) extract v + + extract s = do + let result@(succeeded, failed) = + parse nada $ (map words . lines) s + if result == nada + then return nada + else do + enckeys <- forM keys $ \k -> + maybe k snd <$> cipherKey (config r) k + let keymap = M.fromList $ zip enckeys keys + let convert = mapMaybe (`M.lookup` keymap) + return (convert succeeded, convert failed) + + parse c [] = c + parse c@(succeeded, failed) ((status:_date:vault:key:[]):rest) + | vault == myvault = + case file2key key of + Nothing -> parse c rest + Just k + | "a/d" `isPrefixOf` status -> + parse (k:succeeded, failed) rest + | "a/e" `isPrefixOf` status -> + parse (succeeded, k:failed) rest + | otherwise -> + parse c rest + parse c (_:rest) = parse c rest diff --git a/Remote/Helper/AWS.hs b/Remote/Helper/AWS.hs new file mode 100644 index 000000000..0687a5ee1 --- /dev/null +++ b/Remote/Helper/AWS.hs @@ -0,0 +1,63 @@ +{- Amazon Web Services common infrastructure. + - + - Copyright 2011,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, TupleSections #-} + +module Remote.Helper.AWS where + +import Common.Annex +import Creds + +import qualified Data.Map as M +import Data.Text (Text) + +creds :: UUID -> CredPairStorage +creds u = CredPairStorage + { credPairFile = fromUUID u + , credPairEnvironment = ("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY") + , credPairRemoteKey = Just "s3creds" + } + +data Service = S3 | Glacier + deriving (Eq) + +type Region = Text + +regionMap :: Service -> M.Map Text Region +regionMap = M.fromList . regionInfo + +defaultRegion :: Service -> Region +defaultRegion = snd . Prelude.head . regionInfo + +{- S3 and Glacier use different names for some regions. Ie, "us-east-1" + - cannot be used with S3, while "US" cannot be used with Glacier. Dunno why. + - Also, Glacier is not yet available in all regions. -} +regionInfo :: Service -> [(Text, Region)] +regionInfo service = map (\(t, r) -> (t, fromServiceRegion r)) $ + filter (matchingService . snd) $ + concatMap (\(t, l) -> map (t,) l) regions + where + regions = + [ ("US East (N. Virginia)", [S3Region "US", GlacierRegion "us-east-1"]) + , ("US West (Oregon)", [BothRegion "us-west-2"]) + , ("US West (N. California)", [BothRegion "us-west-1"]) + , ("EU (Ireland)", [S3Region "EU", GlacierRegion "eu-west-1"]) + , ("Asia Pacific (Singapore)", [S3Region "ap-southeast-1"]) + , ("Asia Pacific (Tokyo)", [BothRegion "ap-northeast-1"]) + , ("Asia Pacific (Sydney)", [S3Region "ap-southeast-2"]) + , ("South America (São Paulo)", [S3Region "sa-east-1"]) + ] + + fromServiceRegion (BothRegion s) = s + fromServiceRegion (S3Region s) = s + fromServiceRegion (GlacierRegion s) = s + + matchingService (BothRegion _) = True + matchingService (S3Region _) = service == S3 + matchingService (GlacierRegion _) = service == Glacier + +data ServiceRegion = BothRegion Region | S3Region Region | GlacierRegion Region diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs new file mode 100644 index 000000000..ad3b04d49 --- /dev/null +++ b/Remote/Helper/Chunked.hs @@ -0,0 +1,144 @@ +{- git-annex chunked remotes + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Chunked where + +import Common.Annex +import Utility.DataUnits +import Types.Remote +import Utility.Metered + +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L +import Data.Int +import qualified Control.Exception as E + +type ChunkSize = Maybe Int64 + +{- Gets a remote's configured chunk size. -} +chunkSize :: RemoteConfig -> ChunkSize +chunkSize m = + case M.lookup "chunksize" m of + Nothing -> Nothing + Just v -> case readSize dataUnits v of + Nothing -> error "bad chunksize" + Just size + | size <= 0 -> error "bad chunksize" + | otherwise -> Just $ fromInteger size + +{- This is an extension that's added to the usual file (or whatever) + - where the remote stores a key. -} +type ChunkExt = String + +{- A record of the number of chunks used. + - + - While this can be guessed at based on the size of the key, encryption + - makes that larger. Also, using this helps deal with changes to chunksize + - over the life of a remote. + -} +chunkCount :: ChunkExt +chunkCount = ".chunkcount" + +{- An infinite stream of extensions to use for chunks. -} +chunkStream :: [ChunkExt] +chunkStream = map (\n -> ".chunk" ++ show n) [1 :: Integer ..] + +{- Parses the String from the chunkCount file, and returns the files that + - are used to store the chunks. -} +listChunks :: FilePath -> String -> [FilePath] +listChunks basedest chunkcount = take count $ map (basedest ++) chunkStream + where + count = fromMaybe 0 $ readish chunkcount + +{- For use when there is no chunkCount file; uses the action to find + - chunks, and returns them, or Nothing if none found. Relies on + - storeChunks's finalizer atomically moving the chunks into place once all + - are written. + - + - This is only needed to work around a bug that caused the chunkCount file + - not to be written. + -} +probeChunks :: FilePath -> (FilePath -> IO Bool) -> IO [FilePath] +probeChunks basedest check = go [] $ map (basedest ++) chunkStream + where + go l [] = return (reverse l) + go l (c:cs) = ifM (check c) + ( go (c:l) cs + , go l [] + ) + +{- Given the base destination to use to store a value, + - generates a stream of temporary destinations (just one when not chunking) + - and passes it to an action, which should chunk and store the data, + - and return the destinations it stored to, or [] on error. Then + - calls the recorder to write the chunk count (if chunking). Finally, the + - finalizer is called to rename the tmp into the dest + - (and do any other cleanup). + -} +storeChunks :: Key -> FilePath -> FilePath -> ChunkSize -> ([FilePath] -> IO [FilePath]) -> (FilePath -> String -> IO ()) -> (FilePath -> FilePath -> IO ()) -> IO Bool +storeChunks key tmp dest chunksize storer recorder finalizer = either onerr return + =<< (E.try go :: IO (Either E.SomeException Bool)) + where + go = do + stored <- storer tmpdests + when (isJust chunksize) $ do + let chunkcount = basef ++ chunkCount + recorder chunkcount (show $ length stored) + finalizer tmp dest + return (not $ null stored) + onerr e = do + print e + return False + + basef = tmp ++ keyFile key + tmpdests + | isNothing chunksize = [basef] + | otherwise = map (basef ++ ) chunkStream + +{- Given a list of destinations to use, chunks the data according to the + - ChunkSize, and runs the storer action to store each chunk. Returns + - the destinations where data was stored, or [] on error. + - + - This buffers each chunk in memory. + - More optimal versions of this can be written, that rely + - on L.toChunks to split the lazy bytestring into chunks (typically + - smaller than the ChunkSize), and eg, write those chunks to a Handle. + - But this is the best that can be done with the storer interface that + - writes a whole L.ByteString at a time. + -} +storeChunked :: ChunkSize -> [FilePath] -> (FilePath -> L.ByteString -> IO ()) -> L.ByteString -> IO [FilePath] +storeChunked chunksize dests storer content = either onerr return + =<< (E.try (go chunksize dests) :: IO (Either E.SomeException [FilePath])) + where + go _ [] = return [] -- no dests!? + go Nothing (d:_) = do + storer d content + return [d] + go (Just sz) _ + -- always write a chunk, even if the data is 0 bytes + | L.null content = go Nothing dests + | otherwise = storechunks sz [] dests content + + onerr e = do + print e + return [] + + storechunks _ _ [] _ = return [] -- ran out of dests + storechunks sz useddests (d:ds) b + | L.null b = return $ reverse useddests + | otherwise = do + let (chunk, b') = L.splitAt sz b + storer d chunk + storechunks sz (d:useddests) ds b' + +{- Writes a series of chunks to a file. The feeder is called to get + - each chunk. -} +meteredWriteFileChunks :: MeterUpdate -> FilePath -> [v] -> (v -> IO L.ByteString) -> IO () +meteredWriteFileChunks meterupdate dest chunks feeder = + withBinaryFile dest WriteMode $ \h -> + forM_ chunks $ + meteredWrite meterupdate h <=< feeder diff --git a/Remote/Helper/Encryptable.hs b/Remote/Helper/Encryptable.hs new file mode 100644 index 000000000..a6e79ddc4 --- /dev/null +++ b/Remote/Helper/Encryptable.hs @@ -0,0 +1,164 @@ +{- common functions for encryptable remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Encryptable where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Crypto +import Types.Crypto +import qualified Annex +import Config.Cost +import Utility.Base64 +import Utility.Metered + +{- Encryption setup for a remote. The user must specify whether to use + - an encryption key, or not encrypt. An encrypted cipher is created, or is + - updated to be accessible to an additional encryption key. Or the user + - could opt to use a shared cipher, which is stored unencrypted. -} +encryptionSetup :: RemoteConfig -> Annex RemoteConfig +encryptionSetup c = maybe genCipher updateCipher $ extractCipher c + where + -- The type of encryption + encryption = M.lookup "encryption" c + -- Generate a new cipher, depending on the chosen encryption scheme + genCipher = case encryption of + _ | M.member "cipher" c || M.member "cipherkeys" c -> cannotchange + Just "none" -> return c + Just "shared" -> use "encryption setup" . genSharedCipher + =<< highRandomQuality + -- hybrid encryption is the default when a keyid is + -- specified but no encryption + _ | maybe (M.member "keyid" c) (== "hybrid") encryption -> + use "encryption setup" . genEncryptedCipher key Hybrid + =<< highRandomQuality + Just "pubkey" -> use "encryption setup" . genEncryptedCipher key PubKey + =<< highRandomQuality + _ -> error $ "Specify " ++ intercalate " or " + (map ("encryption=" ++) + ["none","shared","hybrid","pubkey"]) + ++ "." + key = fromMaybe (error "Specifiy keyid=...") $ M.lookup "keyid" c + newkeys = maybe [] (\k -> [(True,k)]) (M.lookup "keyid+" c) ++ + maybe [] (\k -> [(False,k)]) (M.lookup "keyid-" c) + cannotchange = error "Cannot set encryption type of existing remotes." + -- Update an existing cipher if possible. + updateCipher v = case v of + SharedCipher _ | maybe True (== "shared") encryption -> return c' + EncryptedCipher _ variant _ + | maybe True (== if variant == Hybrid then "hybrid" else "pubkey") encryption -> + use "encryption update" $ updateEncryptedCipher newkeys v + _ -> cannotchange + use m a = do + showNote m + cipher <- liftIO a + showNote $ describeCipher cipher + return $ storeCipher c' cipher + highRandomQuality = + (&&) (maybe True ( /= "false") $ M.lookup "highRandomQuality" c) + <$> fmap not (Annex.getState Annex.fast) + c' = foldr M.delete c + -- git-annex used to remove 'encryption' as well, since + -- it was redundant; we now need to keep it for + -- public-key incryption, hence we leave it on newer + -- remotes (while being backward-compatible). + [ "keyid", "keyid+", "keyid-", "highRandomQuality" ] + +{- Modifies a Remote to support encryption. + - + - Two additional functions must be provided by the remote, + - to support storing and retrieving encrypted content. -} +encryptableRemote + :: RemoteConfig + -> ((Cipher, Key) -> Key -> MeterUpdate -> Annex Bool) + -> ((Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool) + -> Remote + -> Remote +encryptableRemote c storeKeyEncrypted retrieveKeyFileEncrypted r = + r { + storeKey = store, + retrieveKeyFile = retrieve, + retrieveKeyFileCheap = retrieveCheap, + removeKey = withkey $ removeKey r, + hasKey = withkey $ hasKey r, + cost = cost r + encryptedRemoteCostAdj + } + where + store k f p = cip k >>= maybe + (storeKey r k f p) + (\enck -> storeKeyEncrypted enck k p) + retrieve k f d p = cip k >>= maybe + (retrieveKeyFile r k f d p) + (\enck -> retrieveKeyFileEncrypted enck k d p) + retrieveCheap k d = cip k >>= maybe + (retrieveKeyFileCheap r k d) + (\_ -> return False) + withkey a k = cip k >>= maybe (a k) (a . snd) + cip = cipherKey c + +{- Gets encryption Cipher. The decrypted Ciphers are cached in the Annex + - state. -} +remoteCipher :: RemoteConfig -> Annex (Maybe Cipher) +remoteCipher c = go $ extractCipher c + where + go Nothing = return Nothing + go (Just encipher) = do + cache <- Annex.getState Annex.ciphers + case M.lookup encipher cache of + Just cipher -> return $ Just cipher + Nothing -> do + showNote "gpg" + cipher <- liftIO $ decryptCipher encipher + Annex.changeState (\s -> s { Annex.ciphers = M.insert encipher cipher cache }) + return $ Just cipher + +{- Checks if the remote's config allows storing creds in the remote's config. + - + - embedcreds=yes allows this, and embedcreds=no prevents it. + - + - If not set, the default is to only store creds when it's surely safe: + - When gpg encryption is used, in which case the creds will be encrypted + - using it. Not when a shared cipher is used. + -} +embedCreds :: RemoteConfig -> Bool +embedCreds c + | M.lookup "embedcreds" c == Just "yes" = True + | M.lookup "embedcreds" c == Just "no" = False + | isJust (M.lookup "cipherkeys" c) && isJust (M.lookup "cipher" c) = True + | otherwise = False + +{- Gets encryption Cipher, and encrypted version of Key. -} +cipherKey :: RemoteConfig -> Key -> Annex (Maybe (Cipher, Key)) +cipherKey c k = fmap make <$> remoteCipher c + where + make ciphertext = (ciphertext, encryptKey mac ciphertext k) + mac = fromMaybe defaultMac $ M.lookup "mac" c >>= readMac + +{- Stores an StorableCipher in a remote's configuration. -} +storeCipher :: RemoteConfig -> StorableCipher -> RemoteConfig +storeCipher c (SharedCipher t) = M.insert "cipher" (toB64 t) c +storeCipher c (EncryptedCipher t _ ks) = + M.insert "cipher" (toB64 t) $ M.insert "cipherkeys" (showkeys ks) c + where + showkeys (KeyIds l) = intercalate "," l + +{- Extracts an StorableCipher from a remote's configuration. -} +extractCipher :: RemoteConfig -> Maybe StorableCipher +extractCipher c = case (M.lookup "cipher" c, + M.lookup "cipherkeys" c, + M.lookup "encryption" c) of + (Just t, Just ks, encryption) | maybe True (== "hybrid") encryption -> + Just $ EncryptedCipher (fromB64 t) Hybrid (readkeys ks) + (Just t, Just ks, Just "pubkey") -> + Just $ EncryptedCipher (fromB64 t) PubKey (readkeys ks) + (Just t, Nothing, encryption) | maybe True (== "shared") encryption -> + Just $ SharedCipher (fromB64 t) + _ -> Nothing + where + readkeys = KeyIds . split "," diff --git a/Remote/Helper/Git.hs b/Remote/Helper/Git.hs new file mode 100644 index 000000000..d76cb2ee7 --- /dev/null +++ b/Remote/Helper/Git.hs @@ -0,0 +1,32 @@ +{- Utilities for git remotes. + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Git where + +import Common.Annex +import qualified Git +import Types.Availability + +repoCheap :: Git.Repo -> Bool +repoCheap = not . Git.repoIsUrl + +localpathCalc :: Git.Repo -> Maybe FilePath +localpathCalc r + | availabilityCalc r == GloballyAvailable = Nothing + | otherwise = Just $ Git.repoPath r + +availabilityCalc :: Git.Repo -> Availability +availabilityCalc r + | (Git.repoIsLocal r || Git.repoIsLocalUnknown r) = LocallyAvailable + | otherwise = GloballyAvailable + +{- Avoids performing an action on a local repository that's not usable. + - Does not check that the repository is still available on disk. -} +guardUsable :: Git.Repo -> a -> Annex a -> Annex a +guardUsable r onerr a + | Git.repoIsLocalUnknown r = return onerr + | otherwise = a diff --git a/Remote/Helper/Hooks.hs b/Remote/Helper/Hooks.hs new file mode 100644 index 000000000..c3ff970c6 --- /dev/null +++ b/Remote/Helper/Hooks.hs @@ -0,0 +1,102 @@ +{- Adds hooks to remotes. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Helper.Hooks (addHooks) where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Types.CleanupActions +import qualified Annex +import Annex.LockFile +#ifndef mingw32_HOST_OS +import Annex.Perms +#else +import Utility.WinLock +#endif + +{- Modifies a remote's access functions to first run the + - annex-start-command hook, and trigger annex-stop-command on shutdown. + - This way, the hooks are only run when a remote is actively being used. + -} +addHooks :: Remote -> Remote +addHooks r = addHooks' r + (remoteAnnexStartCommand $ gitconfig r) + (remoteAnnexStopCommand $ gitconfig r) +addHooks' :: Remote -> Maybe String -> Maybe String -> Remote +addHooks' r Nothing Nothing = r +addHooks' r starthook stophook = r' + where + r' = r + { storeKey = \k f p -> wrapper $ storeKey r k f p + , retrieveKeyFile = \k f d p -> wrapper $ retrieveKeyFile r k f d p + , retrieveKeyFileCheap = \k f -> wrapper $ retrieveKeyFileCheap r k f + , removeKey = wrapper . removeKey r + , hasKey = wrapper . hasKey r + } + where + wrapper = runHooks r' starthook stophook + +runHooks :: Remote -> Maybe String -> Maybe String -> Annex a -> Annex a +runHooks r starthook stophook a = do + dir <- fromRepo gitAnnexRemotesDir + let lck = dir remoteid ++ ".lck" + whenM (notElem lck . M.keys <$> getLockPool) $ do + liftIO $ createDirectoryIfMissing True dir + firstrun lck + a + where + remoteid = show (uuid r) + run Nothing = noop + run (Just command) = void $ liftIO $ + boolSystem "sh" [Param "-c", Param command] + firstrun lck = do + -- Take a shared lock; This indicates that git-annex + -- is using the remote, and prevents other instances + -- of it from running the stophook. If another + -- instance is shutting down right now, this + -- will block waiting for its exclusive lock to clear. + lockFileShared lck + + -- The starthook is run even if some other git-annex + -- is already running, and ran it before. + -- It would be difficult to use locking to ensure + -- it's only run once, and it's also possible for + -- git-annex to be interrupted before it can run the + -- stophook, in which case the starthook + -- would be run again by the next git-annex. + -- So, requiring idempotency is the right approach. + run starthook + + Annex.addCleanup (StopHook $ uuid r) $ runstop lck + runstop lck = do + -- Drop any shared lock we have, and take an + -- exclusive lock, without blocking. If the lock + -- succeeds, we're the only process using this remote, + -- so can stop it. + unlockFile lck +#ifndef mingw32_HOST_OS + mode <- annexFileMode + fd <- liftIO $ noUmask mode $ + openFd lck ReadWrite (Just mode) defaultFileFlags + v <- liftIO $ tryIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> noop + Right _ -> run stophook + liftIO $ closeFd fd +#else + v <- liftIO $ lockExclusive lck + case v of + Nothing -> noop + Just lockhandle -> do + run stophook + liftIO $ dropLock lockhandle +#endif diff --git a/Remote/Helper/Messages.hs b/Remote/Helper/Messages.hs new file mode 100644 index 000000000..c4b1966dc --- /dev/null +++ b/Remote/Helper/Messages.hs @@ -0,0 +1,17 @@ +{- git-annex remote messages + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Messages where + +import Common.Annex +import qualified Git + +showChecking :: Git.Repo -> Annex () +showChecking r = showAction $ "checking " ++ Git.repoDescribe r + +cantCheck :: Git.Repo -> Either String Bool +cantCheck r = Left $ "unable to check " ++ Git.repoDescribe r diff --git a/Remote/Helper/ReadOnly.hs b/Remote/Helper/ReadOnly.hs new file mode 100644 index 000000000..cd92a083c --- /dev/null +++ b/Remote/Helper/ReadOnly.hs @@ -0,0 +1,29 @@ +{- Adds readonly support to remotes. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.ReadOnly (adjustReadOnly) where + +import Common.Annex +import Types.Remote + +{- Adds support for read-only remotes, by replacing the + - methods that write to a remote with dummies that fail. + - + - Note that disabling git pushes to remotes is not handled here. + -} +adjustReadOnly :: Remote -> Remote +adjustReadOnly r + | remoteAnnexReadOnly (gitconfig r) = r + { storeKey = \_ _ _ -> failbool + , removeKey = \_ -> failbool + , repairRepo = Nothing + } + | otherwise = r + where + failbool = do + warning "this remote is readonly" + return False diff --git a/Remote/Helper/Special.hs b/Remote/Helper/Special.hs new file mode 100644 index 000000000..7fc421f46 --- /dev/null +++ b/Remote/Helper/Special.hs @@ -0,0 +1,40 @@ +{- common functions for special remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Special where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import qualified Git +import qualified Git.Command +import qualified Git.Construct + +{- Special remotes don't have a configured url, so Git.Repo does not + - automatically generate remotes for them. This looks for a different + - configuration key instead. + -} +findSpecialRemotes :: String -> Annex [Git.Repo] +findSpecialRemotes s = do + m <- fromRepo Git.config + liftIO $ mapM construct $ remotepairs m + where + remotepairs = M.toList . M.filterWithKey match + construct (k,_) = Git.Construct.remoteNamedFromKey k Git.Construct.fromUnknown + match k _ = startswith "remote." k && endswith (".annex-"++s) k + +{- Sets up configuration for a special remote in .git/config. -} +gitConfigSpecialRemote :: UUID -> RemoteConfig -> String -> String -> Annex () +gitConfigSpecialRemote u c k v = do + set ("annex-"++k) v + set ("annex-uuid") (fromUUID u) + where + set a b = inRepo $ Git.Command.run + [Param "config", Param (configsetting a), Param b] + remotename = fromJust (M.lookup "name" c) + configsetting s = "remote." ++ remotename ++ "." ++ s diff --git a/Remote/Helper/Ssh.hs b/Remote/Helper/Ssh.hs new file mode 100644 index 000000000..05a98865f --- /dev/null +++ b/Remote/Helper/Ssh.hs @@ -0,0 +1,161 @@ +{- git-annex remote access with ssh and git-annex-shell + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Ssh where + +import Common.Annex +import qualified Annex +import qualified Git +import qualified Git.Url +import Annex.UUID +import Annex.Ssh +import CmdLine.GitAnnexShell.Fields (Field, fieldName) +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Types.Key +import Remote.Helper.Messages +import Utility.Metered +import Utility.Rsync +import Types.Remote +import Logs.Transfer +import Config + +{- Generates parameters to ssh to a repository's host and run a command. + - Caller is responsible for doing any neccessary shellEscaping of the + - passed command. -} +toRepo :: Git.Repo -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam] +toRepo r gc sshcmd = do + let opts = map Param $ remoteAnnexSshOptions gc + let host = fromMaybe (error "bad ssh url") $ Git.Url.hostuser r + params <- sshCachingOptions (host, Git.Url.port r) opts + return $ params ++ Param host : sshcmd + +{- Generates parameters to run a git-annex-shell command on a remote + - repository. -} +git_annex_shell :: Git.Repo -> String -> [CommandParam] -> [(Field, String)] -> Annex (Maybe (FilePath, [CommandParam])) +git_annex_shell r command params fields + | not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts ++ fieldopts) + | Git.repoIsSsh r = do + gc <- Annex.getRemoteGitConfig r + u <- getRepoUUID r + sshparams <- toRepo r gc [Param $ sshcmd u gc] + return $ Just ("ssh", sshparams) + | otherwise = return Nothing + where + dir = Git.repoPath r + shellcmd = "git-annex-shell" + shellopts = Param command : File dir : params + sshcmd u gc = unwords $ + fromMaybe shellcmd (remoteAnnexShell gc) + : map shellEscape (toCommand shellopts) ++ + uuidcheck u ++ + map shellEscape (toCommand fieldopts) + uuidcheck NoUUID = [] + uuidcheck (UUID u) = ["--uuid", u] + fieldopts + | null fields = [] + | otherwise = fieldsep : map fieldopt fields ++ [fieldsep] + fieldsep = Param "--" + fieldopt (field, value) = Param $ + fieldName field ++ "=" ++ value + +{- Uses a supplied function (such as boolSystem) to run a git-annex-shell + - command on a remote. + - + - Or, if the remote does not support running remote commands, returns + - a specified error value. -} +onRemote + :: Git.Repo + -> (FilePath -> [CommandParam] -> IO a, a) + -> String + -> [CommandParam] + -> [(Field, String)] + -> Annex a +onRemote r (with, errorval) command params fields = do + s <- git_annex_shell r command params fields + case s of + Just (c, ps) -> liftIO $ with c ps + Nothing -> return errorval + +{- Checks if a remote contains a key. -} +inAnnex :: Git.Repo -> Key -> Annex (Either String Bool) +inAnnex r k = do + showChecking r + onRemote r (check, cantCheck r) "inannex" [Param $ key2file k] [] + where + check c p = dispatch <$> safeSystem c p + dispatch ExitSuccess = Right True + dispatch (ExitFailure 1) = Right False + dispatch _ = cantCheck r + +{- Removes a key from a remote. -} +dropKey :: Git.Repo -> Key -> Annex Bool +dropKey r key = onRemote r (boolSystem, False) "dropkey" + [ Params "--quiet --force" + , Param $ key2file key + ] + [] + +rsyncHelper :: Maybe MeterUpdate -> [CommandParam] -> Annex Bool +rsyncHelper callback params = do + showOutput -- make way for progress bar + ifM (liftIO $ (maybe rsync rsyncProgress callback) params) + ( return True + , do + showLongNote "rsync failed -- run git annex again to resume file transfer" + return False + ) + +{- Generates rsync parameters that ssh to the remote and asks it + - to either receive or send the key's content. -} +rsyncParamsRemote :: Bool -> Remote -> Direction -> Key -> FilePath -> AssociatedFile -> Annex [CommandParam] +rsyncParamsRemote direct r direction key file afile = do + u <- getUUID + let fields = (Fields.remoteUUID, fromUUID u) + : (Fields.direct, if direct then "1" else "") + : maybe [] (\f -> [(Fields.associatedFile, f)]) afile + Just (shellcmd, shellparams) <- git_annex_shell (repo r) + (if direction == Download then "sendkey" else "recvkey") + [ Param $ key2file key ] + fields + -- Convert the ssh command into rsync command line. + let eparam = rsyncShell (Param shellcmd:shellparams) + o <- rsyncParams r direction + return $ if direction == Download + then o ++ rsyncopts eparam dummy (File file) + else o ++ rsyncopts eparam (File file) dummy + where + rsyncopts ps source dest + | end ps == [dashdash] = ps ++ [source, dest] + | otherwise = ps ++ [dashdash, source, dest] + dashdash = Param "--" + {- The rsync shell parameter controls where rsync + - goes, so the source/dest parameter can be a dummy value, + - that just enables remote rsync mode. + - For maximum compatability with some patched rsyncs, + - the dummy value needs to still contain a hostname, + - even though this hostname will never be used. -} + dummy = Param "dummy:" + +-- --inplace to resume partial files +-- +-- Only use --perms when not on a crippled file system, as rsync +-- will fail trying to restore file perms onto a filesystem that does not +-- support them. +rsyncParams :: Remote -> Direction -> Annex [CommandParam] +rsyncParams r direction = do + crippled <- crippledFileSystem + return $ map Param $ catMaybes + [ Just "--progress" + , Just "--inplace" + , if crippled then Nothing else Just "--perms" + ] + ++ remoteAnnexRsyncOptions gc ++ dps + where + dps + | direction == Download = remoteAnnexRsyncDownloadOptions gc + | otherwise = remoteAnnexRsyncUploadOptions gc + gc = gitconfig r diff --git a/Remote/Hook.hs b/Remote/Hook.hs new file mode 100644 index 000000000..74641f5aa --- /dev/null +++ b/Remote/Hook.hs @@ -0,0 +1,159 @@ +{- A remote that provides hooks to run shell commands. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Hook (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Types.Key +import Types.Creds +import qualified Git +import Config +import Config.Cost +import Annex.Content +import Annex.UUID +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Crypto +import Utility.Metered +import Utility.Env + +type Action = String +type HookName = String + +remote :: RemoteType +remote = RemoteType { + typename = "hook", + enumerate = findSpecialRemotes "hooktype", + generate = gen, + setup = hookSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + return $ Just $ encryptableRemote c + (storeEncrypted hooktype $ getGpgEncParams (c,gc)) + (retrieveEncrypted hooktype) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store hooktype, + retrieveKeyFile = retrieve hooktype, + retrieveKeyFileCheap = retrieveCheap hooktype, + removeKey = remove hooktype, + hasKey = checkPresent r hooktype, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + localpath = Nothing, + repo = r, + gitconfig = gc, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + where + hooktype = fromMaybe (error "missing hooktype") $ remoteAnnexHookType gc + +hookSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +hookSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + let hooktype = fromMaybe (error "Specify hooktype=") $ + M.lookup "hooktype" c + c' <- encryptionSetup c + gitConfigSpecialRemote u c' "hooktype" hooktype + return (c', u) + +hookEnv :: Action -> Key -> Maybe FilePath -> IO (Maybe [(String, String)]) +hookEnv action k f = Just <$> mergeenv (fileenv f ++ keyenv) + where + mergeenv l = addEntries l <$> getEnvironment + envvar s v = ("ANNEX_" ++ s, v) + keyenv = catMaybes + [ Just $ envvar "KEY" (key2file k) + , Just $ envvar "ACTION" action + , envvar "HASH_1" <$> headMaybe hashbits + , envvar "HASH_2" <$> headMaybe (drop 1 hashbits) + ] + fileenv Nothing = [] + fileenv (Just file) = [envvar "FILE" file] + hashbits = map takeDirectory $ splitPath $ hashDirMixed k + +lookupHook :: HookName -> Action -> Annex (Maybe String) +lookupHook hookname action = do + command <- getConfig (annexConfig hook) "" + if null command + then do + fallback <- getConfig (annexConfig hookfallback) "" + if null fallback + then do + warning $ "missing configuration for " ++ hook ++ " or " ++ hookfallback + return Nothing + else return $ Just fallback + else return $ Just command + where + hook = hookname ++ "-" ++ action ++ "-hook" + hookfallback = hookname ++ "-hook" + +runHook :: HookName -> Action -> Key -> Maybe FilePath -> Annex Bool -> Annex Bool +runHook hook action k f a = maybe (return False) run =<< lookupHook hook action + where + run command = do + showOutput -- make way for hook output + ifM (liftIO $ boolSystemEnv "sh" [Param "-c", Param command] =<< hookEnv action k f) + ( a + , do + warning $ hook ++ " hook exited nonzero!" + return False + ) + +store :: HookName -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store h k _f _p = sendAnnex k (void $ remove h k) $ \src -> + runHook h "store" k (Just src) $ return True + +storeEncrypted :: HookName -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted h gpgOpts (cipher, enck) k _p = withTmp enck $ \tmp -> + sendAnnex k (void $ remove h enck) $ \src -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + runHook h "store" enck (Just tmp) $ return True + +retrieve :: HookName -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve h k _f d _p = runHook h "retrieve" k (Just d) $ return True + +retrieveCheap :: HookName -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: HookName -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted h (cipher, enck) _ f _p = withTmp enck $ \tmp -> + runHook h "retrieve" enck (Just tmp) $ liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + +remove :: HookName -> Key -> Annex Bool +remove h k = runHook h "remove" k Nothing $ return True + +checkPresent :: Git.Repo -> HookName -> Key -> Annex (Either String Bool) +checkPresent r h k = do + showAction $ "checking " ++ Git.repoDescribe r + v <- lookupHook h action + liftIO $ catchMsgIO $ check v + where + action = "checkpresent" + findkey s = key2file k `elem` lines s + check Nothing = error $ action ++ " hook misconfigured" + check (Just hook) = do + environ <- hookEnv action k Nothing + findkey <$> readProcessEnv "sh" ["-c", hook] environ diff --git a/Remote/List.hs b/Remote/List.hs new file mode 100644 index 000000000..1ec2c32b4 --- /dev/null +++ b/Remote/List.hs @@ -0,0 +1,116 @@ +{-# LANGUAGE CPP #-} + +{- git-annex remote list + - + - Copyright 2011,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.List where + +import qualified Data.Map as M + +import Common.Annex +import qualified Annex +import Logs.Remote +import Types.Remote +import Annex.UUID +import Remote.Helper.Hooks +import Remote.Helper.ReadOnly +import qualified Git +import qualified Git.Config + +import qualified Remote.Git +import qualified Remote.GCrypt +#ifdef WITH_S3 +import qualified Remote.S3 +#endif +import qualified Remote.Bup +import qualified Remote.Directory +import qualified Remote.Rsync +import qualified Remote.Web +#ifdef WITH_WEBDAV +import qualified Remote.WebDAV +#endif +#ifdef WITH_TAHOE +import qualified Remote.Tahoe +#endif +import qualified Remote.Glacier +import qualified Remote.Ddar +import qualified Remote.Hook +import qualified Remote.External + +remoteTypes :: [RemoteType] +remoteTypes = + [ Remote.Git.remote + , Remote.GCrypt.remote +#ifdef WITH_S3 + , Remote.S3.remote +#endif + , Remote.Bup.remote + , Remote.Directory.remote + , Remote.Rsync.remote + , Remote.Web.remote +#ifdef WITH_WEBDAV + , Remote.WebDAV.remote +#endif +#ifdef WITH_TAHOE + , Remote.Tahoe.remote +#endif + , Remote.Glacier.remote + , Remote.Ddar.remote + , Remote.Hook.remote + , Remote.External.remote + ] + +{- Builds a list of all available Remotes. + - Since doing so can be expensive, the list is cached. -} +remoteList :: Annex [Remote] +remoteList = do + rs <- Annex.getState Annex.remotes + if null rs + then do + m <- readRemoteLog + rs' <- concat <$> mapM (process m) remoteTypes + Annex.changeState $ \s -> s { Annex.remotes = rs' } + return rs' + else return rs + where + process m t = enumerate t >>= mapM (remoteGen m t) >>= return . catMaybes + +{- Forces the remoteList to be re-generated, re-reading the git config. -} +remoteListRefresh :: Annex [Remote] +remoteListRefresh = do + newg <- inRepo Git.Config.reRead + Annex.changeState $ \s -> s + { Annex.remotes = [] + , Annex.repo = newg + } + remoteList + +{- Generates a Remote. -} +remoteGen :: M.Map UUID RemoteConfig -> RemoteType -> Git.Repo -> Annex (Maybe Remote) +remoteGen m t r = do + u <- getRepoUUID r + gc <- Annex.getRemoteGitConfig r + let c = fromMaybe M.empty $ M.lookup u m + mrmt <- generate t r u c gc + return $ adjustReadOnly . addHooks <$> mrmt + +{- Updates a local git Remote, re-reading its git config. -} +updateRemote :: Remote -> Annex (Maybe Remote) +updateRemote remote = do + m <- readRemoteLog + remote' <- updaterepo $ repo remote + remoteGen m (remotetype remote) remote' + where + updaterepo r + | Git.repoIsLocal r || Git.repoIsLocalUnknown r = + Remote.Git.configRead r + | otherwise = return r + +{- Checks if a remote is syncable using git. -} +gitSyncableRemote :: Remote -> Bool +gitSyncableRemote r = remotetype r `elem` + [ Remote.Git.remote, Remote.GCrypt.remote ] diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs new file mode 100644 index 000000000..7d051d6cd --- /dev/null +++ b/Remote/Rsync.hs @@ -0,0 +1,295 @@ +{- A remote that is only accessible by rsync. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Rsync ( + remote, + storeEncrypted, + retrieveEncrypted, + remove, + checkPresent, + withRsyncScratchDir, + genRsyncOpts, + RsyncOpts +) where + +import Common.Annex +import Types.Remote +import qualified Git +import Config +import Config.Cost +import Annex.Content +import Annex.UUID +import Annex.Ssh +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Rsync.RsyncUrl +import Crypto +import Utility.Rsync +import Utility.CopyFile +import Utility.Metered +import Utility.PID +import Annex.Perms +import Logs.Transfer +import Types.Creds + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M + +remote :: RemoteType +remote = RemoteType { + typename = "rsync", + enumerate = findSpecialRemotes "rsyncurl", + generate = gen, + setup = rsyncSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + (transport, url) <- rsyncTransport gc $ + fromMaybe (error "missing rsyncurl") $ remoteAnnexRsyncUrl gc + let o = genRsyncOpts c gc transport url + let islocal = rsyncUrlIsPath $ rsyncUrl o + return $ Just $ encryptableRemote c + (storeEncrypted o $ getGpgEncParams (c,gc)) + (retrieveEncrypted o) + Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = store o + , retrieveKeyFile = retrieve o + , retrieveKeyFileCheap = retrieveCheap o + , removeKey = remove o + , hasKey = checkPresent r o + , hasKeyCheap = False + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , repo = r + , gitconfig = gc + , localpath = if islocal + then Just $ rsyncUrl o + else Nothing + , readonly = False + , availability = if islocal then LocallyAvailable else GloballyAvailable + , remotetype = remote + } + +genRsyncOpts :: RemoteConfig -> RemoteGitConfig -> [CommandParam] -> RsyncUrl -> RsyncOpts +genRsyncOpts c gc transport url = RsyncOpts + { rsyncUrl = url + , rsyncOptions = opts [] + , rsyncUploadOptions = transport ++ opts (remoteAnnexRsyncUploadOptions gc) + , rsyncDownloadOptions = transport ++ opts (remoteAnnexRsyncDownloadOptions gc) + , rsyncShellEscape = M.lookup "shellescape" c /= Just "no" + } + where + opts specificopts = map Param $ filter safe $ + remoteAnnexRsyncOptions gc ++ specificopts + safe opt + -- Don't allow user to pass --delete to rsync; + -- that could cause it to delete other keys + -- in the same hash bucket as a key it sends. + | opt == "--delete" = False + | opt == "--delete-excluded" = False + | otherwise = True + +rsyncTransport :: RemoteGitConfig -> RsyncUrl -> Annex ([CommandParam], RsyncUrl) +rsyncTransport gc url + | rsyncUrlIsShell url = + (\rsh -> return (rsyncShell rsh, url)) =<< + case fromNull ["ssh"] (remoteAnnexRsyncTransport gc) of + "ssh":sshopts -> do + let (port, sshopts') = sshReadPort sshopts + userhost = takeWhile (/=':') url + -- Connection caching + (Param "ssh":) <$> sshCachingOptions + (userhost, port) + (map Param $ loginopt ++ sshopts') + "rsh":rshopts -> return $ map Param $ "rsh" : + loginopt ++ rshopts + rsh -> error $ "Unknown Rsync transport: " + ++ unwords rsh + | otherwise = return ([], url) + where + login = case separate (=='@') url of + (_h, "") -> Nothing + (l, _) -> Just l + loginopt = maybe [] (\l -> ["-l",l]) login + fromNull as xs = if null xs then as else xs + +rsyncSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +rsyncSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + -- verify configuration is sane + let url = fromMaybe (error "Specify rsyncurl=") $ + M.lookup "rsyncurl" c + c' <- encryptionSetup c + + -- The rsyncurl is stored in git config, not only in this remote's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "rsyncurl" url + return (c', u) + +store :: RsyncOpts -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store o k _f p = sendAnnex k (void $ remove o k) $ rsyncSend o p k False + +storeEncrypted :: RsyncOpts -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted o gpgOpts (cipher, enck) k p = withTmp enck $ \tmp -> + sendAnnex k (void $ remove o enck) $ \src -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + rsyncSend o p enck True tmp + +retrieve :: RsyncOpts -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve o k _ f p = rsyncRetrieve o k f (Just p) + +retrieveCheap :: RsyncOpts -> Key -> FilePath -> Annex Bool +retrieveCheap o k f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False ) + +retrieveEncrypted :: RsyncOpts -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted o (cipher, enck) _ f p = withTmp enck $ \tmp -> + ifM (rsyncRetrieve o enck tmp (Just p)) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + , return False + ) + +remove :: RsyncOpts -> Key -> Annex Bool +remove o k = do + ps <- sendParams + withRsyncScratchDir $ \tmp -> liftIO $ do + {- Send an empty directory to rysnc to make it delete. -} + let dummy = tmp keyFile k + createDirectoryIfMissing True dummy + rsync $ rsyncOptions o ++ ps ++ + map (\s -> Param $ "--include=" ++ s) includes ++ + [ Param "--exclude=*" -- exclude everything else + , Params "--quiet --delete --recursive" + , partialParams + , Param $ addTrailingPathSeparator dummy + , Param $ rsyncUrl o + ] + where + {- Specify include rules to match the directories where the + - content could be. Note that the parent directories have + - to also be explicitly included, due to how rsync + - traverses directories. -} + includes = concatMap use annexHashes + use h = let dir = h k in + [ parentDir dir + , dir + -- match content directory and anything in it + , dir keyFile k "***" + ] + +checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool) +checkPresent r o k = do + showAction $ "checking " ++ Git.repoDescribe r + -- note: Does not currently differentiate between rsync failing + -- to connect, and the file not being present. + Right <$> check + where + check = untilTrue (rsyncUrls o k) $ \u -> + liftIO $ catchBoolIO $ do + withQuietOutput createProcessSuccess $ + proc "rsync" $ toCommand $ + rsyncOptions o ++ [Param u] + return True + +{- Rsync params to enable resumes of sending files safely, + - ensure that files are only moved into place once complete + -} +partialParams :: CommandParam +partialParams = Params "--partial --partial-dir=.rsync-partial" + +{- When sending files from crippled filesystems, the permissions can be all + - messed up, and it's better to use the default permissions on the + - destination. -} +sendParams :: Annex [CommandParam] +sendParams = ifM crippledFileSystem + ( return [rsyncUseDestinationPermissions] + , return [] + ) + +{- Runs an action in an empty scratch directory that can be used to build + - up trees for rsync. -} +withRsyncScratchDir :: (FilePath -> Annex a) -> Annex a +withRsyncScratchDir a = do + p <- liftIO getPID + t <- fromRepo gitAnnexTmpObjectDir + createAnnexDirectory t + let tmp = t "rsynctmp" show p + nuke tmp + liftIO $ createDirectoryIfMissing True tmp + nuke tmp `after` a tmp + where + nuke d = liftIO $ whenM (doesDirectoryExist d) $ + removeDirectoryRecursive d + +rsyncRetrieve :: RsyncOpts -> Key -> FilePath -> Maybe MeterUpdate -> Annex Bool +rsyncRetrieve o k dest callback = + showResumable $ untilTrue (rsyncUrls o k) $ \u -> rsyncRemote Download o callback + -- use inplace when retrieving to support resuming + [ Param "--inplace" + , Param u + , File dest + ] + +showResumable :: Annex Bool -> Annex Bool +showResumable a = ifM a + ( return True + , do + showLongNote "rsync failed -- run git annex again to resume file transfer" + return False + ) + +rsyncRemote :: Direction -> RsyncOpts -> Maybe MeterUpdate -> [CommandParam] -> Annex Bool +rsyncRemote direction o callback params = do + showOutput -- make way for progress bar + liftIO $ (maybe rsync rsyncProgress callback) $ + opts ++ [Params "--progress"] ++ params + where + opts + | direction == Download = rsyncDownloadOptions o + | otherwise = rsyncUploadOptions o + +{- To send a single key is slightly tricky; need to build up a temporary + - directory structure to pass to rsync so it can create the hash + - directories. + - + - This would not be necessary if the hash directory structure used locally + - was always the same as that used on the rsync remote. So if that's ever + - unified, this gets nicer. + - (When we have the right hash directory structure, we can just + - pass --include=X --include=X/Y --include=X/Y/file --exclude=*) + -} +rsyncSend :: RsyncOpts -> MeterUpdate -> Key -> Bool -> FilePath -> Annex Bool +rsyncSend o callback k canrename src = withRsyncScratchDir $ \tmp -> do + let dest = tmp Prelude.head (keyPaths k) + liftIO $ createDirectoryIfMissing True $ parentDir dest + ok <- liftIO $ if canrename + then do + rename src dest + return True + else createLinkOrCopy src dest + ps <- sendParams + if ok + then showResumable $ rsyncRemote Upload o (Just callback) $ ps ++ + [ Param "--recursive" + , partialParams + -- tmp/ to send contents of tmp dir + , File $ addTrailingPathSeparator tmp + , Param $ rsyncUrl o + ] + else return False diff --git a/Remote/Rsync/RsyncUrl.hs b/Remote/Rsync/RsyncUrl.hs new file mode 100644 index 000000000..61bbe2f3f --- /dev/null +++ b/Remote/Rsync/RsyncUrl.hs @@ -0,0 +1,46 @@ +{- Rsync urls. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Rsync.RsyncUrl where + +import Types +import Locations +import Utility.Rsync +import Utility.SafeCommand + +import System.FilePath.Posix +#ifdef mingw32_HOST_OS +import Data.String.Utils +#endif + +type RsyncUrl = String + +data RsyncOpts = RsyncOpts + { rsyncUrl :: RsyncUrl + , rsyncOptions :: [CommandParam] + , rsyncUploadOptions :: [CommandParam] + , rsyncDownloadOptions :: [CommandParam] + , rsyncShellEscape :: Bool +} + +rsyncEscape :: RsyncOpts -> RsyncUrl -> RsyncUrl +rsyncEscape o u + | rsyncShellEscape o && rsyncUrlIsShell (rsyncUrl o) = shellEscape u + | otherwise = u + +rsyncUrls :: RsyncOpts -> Key -> [RsyncUrl] +rsyncUrls o k = map use annexHashes + where + use h = rsyncUrl o hash h rsyncEscape o (f f) + f = keyFile k +#ifndef mingw32_HOST_OS + hash h = h k +#else + hash h = replace "\\" "/" (h k) +#endif diff --git a/Remote/S3.hs b/Remote/S3.hs new file mode 100644 index 000000000..c30d07b8a --- /dev/null +++ b/Remote/S3.hs @@ -0,0 +1,372 @@ +{- S3 remotes + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.S3 (remote, iaHost, isIA, isIAHost, iaItemUrl) where + +import Network.AWS.AWSConnection +import Network.AWS.S3Object hiding (getStorageClass) +import Network.AWS.S3Bucket hiding (size) +import Network.AWS.AWSResult +import qualified Data.Text as T +import qualified Data.Text.Encoding as T +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import Data.Char +import Network.Socket (HostName) + +import Common.Annex +import Types.Remote +import Types.Key +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import qualified Remote.Helper.AWS as AWS +import Crypto +import Creds +import Utility.Metered +import Annex.Content +import Annex.UUID +import Logs.Web + +type Bucket = String + +remote :: RemoteType +remote = RemoteType { + typename = "S3", + enumerate = findSpecialRemotes "s3", + generate = gen, + setup = s3Setup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc expensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this c, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +s3Setup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +s3Setup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + c' <- setRemoteCredPair c (AWS.creds u) mcreds + s3Setup' u c' +s3Setup' :: UUID -> RemoteConfig -> Annex (RemoteConfig, UUID) +s3Setup' u c = if isIA c then archiveorg else defaulthost + where + remotename = fromJust (M.lookup "name" c) + defbucket = remotename ++ "-" ++ fromUUID u + defaults = M.fromList + [ ("datacenter", T.unpack $ AWS.defaultRegion AWS.S3) + , ("storageclass", "STANDARD") + , ("host", defaultAmazonS3Host) + , ("port", show defaultAmazonS3Port) + , ("bucket", defbucket) + ] + + use fullconfig = do + gitConfigSpecialRemote u fullconfig "s3" "true" + return (fullconfig, u) + + defaulthost = do + c' <- encryptionSetup c + let fullconfig = c' `M.union` defaults + genBucket fullconfig u + use fullconfig + + archiveorg = do + showNote "Internet Archive mode" + -- Ensure user enters a valid bucket name, since + -- this determines the name of the archive.org item. + let bucket = replace " " "-" $ map toLower $ + fromMaybe (error "specify bucket=") $ + getBucket c + let archiveconfig = + -- hS3 does not pass through x-archive-* headers + M.mapKeys (replace "x-archive-" "x-amz-") $ + -- encryption does not make sense here + M.insert "encryption" "none" $ + M.insert "bucket" bucket $ + M.union c $ + -- special constraints on key names + M.insert "mungekeys" "ia" $ + -- bucket created only when files are uploaded + M.insert "x-amz-auto-make-bucket" "1" defaults + writeUUIDFile archiveconfig u + use archiveconfig + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p = s3Action r False $ \(conn, bucket) -> + sendAnnex k (void $ remove' r k) $ \src -> do + ok <- s3Bool =<< storeHelper (conn, bucket) r k p src + + -- Store public URL to item in Internet Archive. + when (ok && isIA (config r)) $ + setUrlPresent k (iaKeyUrl r k) + + return ok + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = s3Action r False $ \(conn, bucket) -> + -- To get file size of the encrypted content, have to use a temp file. + -- (An alternative would be chunking to to a constant size.) + withTmp enck $ \tmp -> sendAnnex k (void $ remove' r enck) $ \src -> do + liftIO $ encrypt (getGpgEncParams r) cipher (feedFile src) $ + readBytes $ L.writeFile tmp + s3Bool =<< storeHelper (conn, bucket) r enck p tmp + +storeHelper :: (AWSConnection, Bucket) -> Remote -> Key -> MeterUpdate -> FilePath -> Annex (AWSResult ()) +storeHelper (conn, bucket) r k p file = do + size <- maybe getsize (return . fromIntegral) $ keySize k + meteredBytes (Just p) size $ \meterupdate -> + liftIO $ withMeteredFile file meterupdate $ \content -> do + -- size is provided to S3 so the whole content + -- does not need to be buffered to calculate it + let object = S3Object + bucket (bucketFile r k) "" + (("Content-Length", show size) : getXheaders (config r)) + content + sendObject conn $ + setStorageClass (getStorageClass $ config r) object + where + getsize = liftIO $ fromIntegral . fileSize <$> getFileStatus file + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = s3Action r False $ \(conn, bucket) -> + metered (Just p) k $ \meterupdate -> do + res <- liftIO $ getObject conn $ bucketKey r bucket k + case res of + Right o -> do + liftIO $ meteredWriteFile meterupdate d $ + obj_data o + return True + Left e -> s3Warning e + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = s3Action r False $ \(conn, bucket) -> + metered (Just p) k $ \meterupdate -> do + res <- liftIO $ getObject conn $ bucketKey r bucket enck + case res of + Right o -> liftIO $ decrypt cipher (\h -> meteredWrite meterupdate h $ obj_data o) $ + readBytes $ \content -> do + L.writeFile d content + return True + Left e -> s3Warning e + +{- Internet Archive doesn't easily allow removing content. + - While it may remove the file, there are generally other files + - derived from it that it does not remove. -} +remove :: Remote -> RemoteConfig -> Key -> Annex Bool +remove r c k + | isIA c = do + warning "Cannot remove content from the Internet Archive" + return False + | otherwise = remove' r k + +remove' :: Remote -> Key -> Annex Bool +remove' r k = s3Action r False $ \(conn, bucket) -> + s3Bool =<< liftIO (deleteObject conn $ bucketKey r bucket k) + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = s3Action r noconn $ \(conn, bucket) -> do + showAction $ "checking " ++ name r + res <- liftIO $ getObjectInfo conn $ bucketKey r bucket k + case res of + Right _ -> return $ Right True + Left (AWSError _ _) -> return $ Right False + Left e -> return $ Left (s3Error e) + where + noconn = Left $ error "S3 not configured" + +s3Warning :: ReqError -> Annex Bool +s3Warning e = do + warning $ prettyReqError e + return False + +s3Error :: ReqError -> a +s3Error e = error $ prettyReqError e + +s3Bool :: AWSResult () -> Annex Bool +s3Bool (Right _) = return True +s3Bool (Left e) = s3Warning e + +s3Action :: Remote -> a -> ((AWSConnection, Bucket) -> Annex a) -> Annex a +s3Action r noconn action = do + let bucket = M.lookup "bucket" $ config r + conn <- s3Connection (config r) (uuid r) + case (bucket, conn) of + (Just b, Just c) -> action (c, b) + _ -> return noconn + +bucketFile :: Remote -> Key -> FilePath +bucketFile r = munge . key2file + where + munge s = case M.lookup "mungekeys" c of + Just "ia" -> iaMunge $ filePrefix c ++ s + _ -> filePrefix c ++ s + c = config r + +filePrefix :: RemoteConfig -> String +filePrefix = M.findWithDefault "" "fileprefix" + +bucketKey :: Remote -> Bucket -> Key -> S3Object +bucketKey r bucket k = S3Object bucket (bucketFile r k) "" [] L.empty + +{- Internet Archive limits filenames to a subset of ascii, + - with no whitespace. Other characters are xml entity + - encoded. -} +iaMunge :: String -> String +iaMunge = (>>= munge) + where + munge c + | isAsciiUpper c || isAsciiLower c || isNumber c = [c] + | c `elem` "_-.\"" = [c] + | isSpace c = [] + | otherwise = "&" ++ show (ord c) ++ ";" + +{- Generate the bucket if it does not already exist, including creating the + - UUID file within the bucket. + - + - To check if the bucket exists, ask for its location. However, some ACLs + - can allow read/write to buckets, but not querying location, so first + - check if the UUID file already exists and we can skip doing anything. + -} +genBucket :: RemoteConfig -> UUID -> Annex () +genBucket c u = do + conn <- s3ConnectionRequired c u + showAction "checking bucket" + unlessM ((== Right True) <$> checkUUIDFile c u conn) $ do + loc <- liftIO $ getBucketLocation conn bucket + case loc of + Right _ -> writeUUIDFile c u + Left err@(NetworkError _) -> s3Error err + Left (AWSError _ _) -> do + showAction $ "creating bucket in " ++ datacenter + res <- liftIO $ createBucketIn conn bucket datacenter + case res of + Right _ -> writeUUIDFile c u + Left err -> s3Error err + where + bucket = fromJust $ getBucket c + datacenter = fromJust $ M.lookup "datacenter" c + +{- Writes the UUID to an annex-uuid file within the bucket. + - + - If the file already exists in the bucket, it must match. + - + - Note that IA items do not get created by createBucketIn. + - Rather, they are created the first time a file is stored in them. + - So this also takes care of that. + -} +writeUUIDFile :: RemoteConfig -> UUID -> Annex () +writeUUIDFile c u = do + conn <- s3ConnectionRequired c u + v <- checkUUIDFile c u conn + case v of + Left e -> error e + Right True -> return () + Right False -> do + let object = setStorageClass (getStorageClass c) (mkobject uuidb) + either s3Error return =<< liftIO (sendObject conn object) + where + file = uuidFile c + uuidb = L.fromChunks [T.encodeUtf8 $ T.pack $ fromUUID u] + bucket = fromJust $ getBucket c + + mkobject = S3Object bucket file "" (getXheaders c) + +{- Checks if the UUID file exists in the bucket and has the specified UUID already. -} +checkUUIDFile :: RemoteConfig -> UUID -> AWSConnection -> Annex (Either String Bool) +checkUUIDFile c u conn = check <$> liftIO (tryNonAsync $ getObject conn $ mkobject L.empty) + where + check (Right (Right o)) + | obj_data o == uuidb = Right True + | otherwise = Left $ "This bucket is already in use by a different S3 special remote, with UUID: " ++ show (obj_data o) + check _ = Right False + + uuidb = L.fromChunks [T.encodeUtf8 $ T.pack $ fromUUID u] + bucket = fromJust $ getBucket c + file = uuidFile c + + mkobject = S3Object bucket file "" (getXheaders c) + +uuidFile :: RemoteConfig -> FilePath +uuidFile c = filePrefix c ++ "annex-uuid" + +s3ConnectionRequired :: RemoteConfig -> UUID -> Annex AWSConnection +s3ConnectionRequired c u = + maybe (error "Cannot connect to S3") return =<< s3Connection c u + +s3Connection :: RemoteConfig -> UUID -> Annex (Maybe AWSConnection) +s3Connection c u = go =<< getRemoteCredPairFor "S3" c (AWS.creds u) + where + go Nothing = return Nothing + go (Just (ak, sk)) = return $ Just $ AWSConnection host port ak sk + + host = fromJust $ M.lookup "host" c + port = let s = fromJust $ M.lookup "port" c in + case reads s of + [(p, _)] -> p + _ -> error $ "bad S3 port value: " ++ s + +getBucket :: RemoteConfig -> Maybe Bucket +getBucket = M.lookup "bucket" + +getStorageClass :: RemoteConfig -> StorageClass +getStorageClass c = case fromJust $ M.lookup "storageclass" c of + "REDUCED_REDUNDANCY" -> REDUCED_REDUNDANCY + _ -> STANDARD + +getXheaders :: RemoteConfig -> [(String, String)] +getXheaders = filter isxheader . M.assocs + where + isxheader (h, _) = "x-amz-" `isPrefixOf` h + +{- Hostname to use for archive.org S3. -} +iaHost :: HostName +iaHost = "s3.us.archive.org" + +isIA :: RemoteConfig -> Bool +isIA c = maybe False isIAHost (M.lookup "host" c) + +isIAHost :: HostName -> Bool +isIAHost h = ".archive.org" `isSuffixOf` map toLower h + +iaItemUrl :: Bucket -> URLString +iaItemUrl bucket = "http://archive.org/details/" ++ bucket + +iaKeyUrl :: Remote -> Key -> URLString +iaKeyUrl r k = "http://archive.org/download/" ++ bucket ++ "/" ++ bucketFile r k + where + bucket = fromMaybe "" $ getBucket $ config r diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs new file mode 100644 index 000000000..d265d7ac1 --- /dev/null +++ b/Remote/Tahoe.hs @@ -0,0 +1,256 @@ +{- Tahoe-LAFS special remotes. + - + - Tahoe capabilities for accessing objects stored in the remote + - are preserved in the remote state log. + - + - In order to allow multiple clones of a repository to access the same + - tahoe repository, git-annex needs to store the introducer furl, + - and the shared-convergence-secret. These are stored in the remote + - configuration, when embedcreds is enabled. + - + - Using those creds, git-annex sets up a tahoe configuration directory in + - ~/.tahoe/git-annex/UUID/ + - + - Tahoe has its own encryption, so git-annex's encryption is not used. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Remote.Tahoe (remote) where + +import qualified Data.Map as M +import Data.Aeson +import Data.ByteString.Lazy.UTF8 (fromString) +import Control.Concurrent.STM + +import Common.Annex +import Types.Remote +import Types.Creds +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Annex.UUID +import Annex.Content +import Logs.RemoteState +import Utility.UserInfo +import Utility.Metered +import Utility.Env +import Utility.ThreadScheduler + +{- The TMVar is left empty until tahoe has been verified to be running. -} +data TahoeHandle = TahoeHandle TahoeConfigDir (TMVar ()) + +type TahoeConfigDir = FilePath +type SharedConvergenceSecret = String +type IntroducerFurl = String +type Capability = String + +remote :: RemoteType +remote = RemoteType { + typename = "tahoe", + enumerate = findSpecialRemotes "tahoe", + generate = gen, + setup = tahoeSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + hdl <- liftIO $ TahoeHandle + <$> maybe (defaultTahoeConfigDir u) return (remoteAnnexTahoe gc) + <*> newEmptyTMVarIO + return $ Just $ Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store u hdl, + retrieveKeyFile = retrieve u hdl, + retrieveKeyFileCheap = \_ _ -> return False, + removeKey = remove, + hasKey = checkPresent u hdl, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +tahoeSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +tahoeSetup mu _ c = do + furl <- fromMaybe (fromMaybe missingfurl $ M.lookup furlk c) + <$> liftIO (getEnv "TAHOE_FURL") + u <- maybe (liftIO genUUID) return mu + configdir <- liftIO $ defaultTahoeConfigDir u + scs <- liftIO $ tahoeConfigure configdir furl (M.lookup scsk c) + let c' = if M.lookup "embedcreds" c == Just "yes" + then flip M.union c $ M.fromList + [ (furlk, furl) + , (scsk, scs) + ] + else c + gitConfigSpecialRemote u c' "tahoe" configdir + return (c', u) + where + scsk = "shared-convergence-secret" + furlk = "introducer-furl" + missingfurl = error "Set TAHOE_FURL to the introducer furl to use." + +store :: UUID -> TahoeHandle -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store u hdl k _f _p = sendAnnex k noop $ \src -> + parsePut <$> liftIO (readTahoe hdl "put" [File src]) >>= maybe + (return False) + (\cap -> storeCapability u k cap >> return True) + +retrieve :: UUID -> TahoeHandle -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve u hdl k _f d _p = go =<< getCapability u k + where + go Nothing = return False + go (Just cap) = liftIO $ requestTahoe hdl "get" [Param cap, File d] + +remove :: Key -> Annex Bool +remove _k = do + warning "content cannot be removed from tahoe remote" + return False + +checkPresent :: UUID -> TahoeHandle -> Key -> Annex (Either String Bool) +checkPresent u hdl k = go =<< getCapability u k + where + go Nothing = return (Right False) + go (Just cap) = liftIO $ parseCheck <$> readTahoe hdl "check" + [ Param "--raw" + , Param cap + ] + +defaultTahoeConfigDir :: UUID -> IO TahoeConfigDir +defaultTahoeConfigDir u = do + h <- myHomeDir + return $ h ".tahoe" "git-annex" fromUUID u + +tahoeConfigure :: TahoeConfigDir -> IntroducerFurl -> Maybe SharedConvergenceSecret -> IO SharedConvergenceSecret +tahoeConfigure configdir furl mscs = do + unlessM (createClient configdir furl) $ + error "tahoe create-client failed" + maybe noop (writeSharedConvergenceSecret configdir) mscs + startTahoeDaemon configdir + getSharedConvergenceSecret configdir + +createClient :: TahoeConfigDir -> IntroducerFurl -> IO Bool +createClient configdir furl = do + createDirectoryIfMissing True (parentDir configdir) + boolTahoe configdir "create-client" + [ Param "--nickname", Param "git-annex" + , Param "--introducer", Param furl + ] + +writeSharedConvergenceSecret :: TahoeConfigDir -> SharedConvergenceSecret -> IO () +writeSharedConvergenceSecret configdir scs = + writeFile (convergenceFile configdir) (unlines [scs]) + +{- The tahoe daemon writes the convergenceFile shortly after it starts + - (it does not need to connect to the network). So, try repeatedly to read + - the file, for up to 1 minute. To avoid reading a partially written + - file, look for the newline after the value. -} +getSharedConvergenceSecret :: TahoeConfigDir -> IO SharedConvergenceSecret +getSharedConvergenceSecret configdir = go (60 :: Int) + where + f = convergenceFile configdir + go n + | n == 0 = error $ "tahoe did not write " ++ f ++ " after 1 minute. Perhaps the daemon failed to start?" + | otherwise = do + v <- catchMaybeIO (readFile f) + case v of + Just s | "\n" `isSuffixOf` s || "\r" `isSuffixOf` s -> + return $ takeWhile (`notElem` "\n\r") s + _ -> do + threadDelaySeconds (Seconds 1) + go (n - 1) + +convergenceFile :: TahoeConfigDir -> FilePath +convergenceFile configdir = configdir "private" "convergence" + +startTahoeDaemon :: TahoeConfigDir -> IO () +startTahoeDaemon configdir = void $ boolTahoe configdir "start" [] + +{- Ensures that tahoe has been started, before running an action + - that uses it. -} +withTahoeConfigDir :: TahoeHandle -> (TahoeConfigDir -> IO a) -> IO a +withTahoeConfigDir (TahoeHandle configdir v) a = go =<< atomically needsstart + where + go True = do + startTahoeDaemon configdir + a configdir + go False = a configdir + needsstart = ifM (isEmptyTMVar v) + ( do + putTMVar v () + return True + , return False + ) + +boolTahoe :: TahoeConfigDir -> String -> [CommandParam] -> IO Bool +boolTahoe configdir command params = boolSystem "tahoe" $ + tahoeParams configdir command params + +{- Runs a tahoe command that requests the daemon do something. -} +requestTahoe :: TahoeHandle -> String -> [CommandParam] -> IO Bool +requestTahoe hdl command params = withTahoeConfigDir hdl $ \configdir -> + boolTahoe configdir command params + +{- Runs a tahoe command that requests the daemon output something. -} +readTahoe :: TahoeHandle -> String -> [CommandParam] -> IO String +readTahoe hdl command params = withTahoeConfigDir hdl $ \configdir -> + catchDefaultIO "" $ + readProcess "tahoe" $ toCommand $ + tahoeParams configdir command params + +tahoeParams :: TahoeConfigDir -> String -> [CommandParam] -> [CommandParam] +tahoeParams configdir command params = + Param "-d" : File configdir : Param command : params + +storeCapability :: UUID -> Key -> Capability -> Annex () +storeCapability u k cap = setRemoteState u k cap + +getCapability :: UUID -> Key -> Annex (Maybe Capability) +getCapability u k = getRemoteState u k + +{- tahoe put outputs a single line, containing the capability. -} +parsePut :: String -> Maybe Capability +parsePut s = case lines s of + [cap] | "URI" `isPrefixOf` cap -> Just cap + _ -> Nothing + +{- tahoe check --raw outputs a json document. + - Its contents will vary (for LIT capabilities, it lacks most info), + - but should always contain a results object with a healthy value + - that's true or false. + -} +parseCheck :: String -> Either String Bool +parseCheck s = maybe parseerror (Right . healthy . results) (decode $ fromString s) + where + parseerror + | null s = Left "tahoe check failed to run" + | otherwise = Left "unable to parse tahoe check output" + +data CheckRet = CheckRet { results :: Results } +data Results = Results { healthy :: Bool } + +instance FromJSON CheckRet where + parseJSON (Object v) = CheckRet + <$> v .: "results" + parseJSON _ = mzero + +instance FromJSON Results where + parseJSON (Object v) = Results + <$> v .: "healthy" + parseJSON _ = mzero diff --git a/Remote/Web.hs b/Remote/Web.hs new file mode 100644 index 000000000..ddd1fc1cc --- /dev/null +++ b/Remote/Web.hs @@ -0,0 +1,127 @@ +{- Web remotes. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Web (remote) where + +import Common.Annex +import Types.Remote +import qualified Git +import qualified Git.Construct +import Annex.Content +import Config.Cost +import Logs.Web +import Types.Key +import Utility.Metered +import qualified Annex.Url as Url +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +#endif + +remote :: RemoteType +remote = RemoteType { + typename = "web", + enumerate = list, + generate = gen, + setup = error "not supported" +} + +-- There is only one web remote, and it always exists. +-- (If the web should cease to exist, remove this module and redistribute +-- a new release to the survivors by carrier pigeon.) +list :: Annex [Git.Repo] +list = do + r <- liftIO $ Git.Construct.remoteNamed "web" Git.Construct.fromUnknown + return [r] + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r _ c gc = + return $ Just Remote { + uuid = webUUID, + cost = expensiveRemoteCost, + name = Git.repoDescribe r, + storeKey = uploadKey, + retrieveKeyFile = downloadKey, + retrieveKeyFileCheap = downloadKeyCheap, + removeKey = dropKey, + hasKey = checkKey, + hasKeyCheap = False, + whereisKey = Just getUrls, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + gitconfig = gc, + localpath = Nothing, + repo = r, + readonly = True, + availability = GloballyAvailable, + remotetype = remote + } + +downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +downloadKey key _file dest _p = get =<< getUrls key + where + get [] = do + warning "no known url" + return False + get urls = do + showOutput -- make way for download progress bar + untilTrue urls $ \u -> do + let (u', downloader) = getDownloader u + case downloader of + QuviDownloader -> do +#ifdef WITH_QUVI + flip downloadUrl dest + =<< withQuviOptions Quvi.queryLinks [Quvi.httponly, Quvi.quiet] u' +#else + warning "quvi support needed for this url" + return False +#endif + DefaultDownloader -> downloadUrl [u'] dest + +downloadKeyCheap :: Key -> FilePath -> Annex Bool +downloadKeyCheap _ _ = return False + +uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool +uploadKey _ _ _ = do + warning "upload to web not supported" + return False + +dropKey :: Key -> Annex Bool +dropKey k = do + mapM_ (setUrlMissing k) =<< getUrls k + return True + +checkKey :: Key -> Annex (Either String Bool) +checkKey key = do + us <- getUrls key + if null us + then return $ Right False + else return =<< checkKey' key us +checkKey' :: Key -> [URLString] -> Annex (Either String Bool) +checkKey' key us = firsthit us (Right False) $ \u -> do + let (u', downloader) = getDownloader u + showAction $ "checking " ++ u' + case downloader of + QuviDownloader -> +#ifdef WITH_QUVI + Right <$> withQuviOptions Quvi.check [Quvi.httponly, Quvi.quiet] u' +#else + return $ Left "quvi support needed for this url" +#endif + DefaultDownloader -> do + Url.withUrlOptions $ catchMsgIO . + Url.checkBoth u' (keySize key) + where + firsthit [] miss _ = return miss + firsthit (u:rest) _ a = do + r <- a u + case r of + Right _ -> return r + Left _ -> firsthit rest r a diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs new file mode 100644 index 000000000..91b83053c --- /dev/null +++ b/Remote/WebDAV.hs @@ -0,0 +1,399 @@ +{- WebDAV remotes. + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ScopedTypeVariables, CPP #-} + +module Remote.WebDAV (remote, davCreds, configUrl) where + +import Network.Protocol.HTTP.DAV +import qualified Data.Map as M +import qualified Data.ByteString.UTF8 as B8 +import qualified Data.ByteString.Lazy.UTF8 as L8 +import qualified Data.ByteString.Lazy as L +import qualified Control.Exception as E +import qualified Control.Exception.Lifted as EL +#if MIN_VERSION_DAV(0,6,0) +import Network.HTTP.Client (HttpException(..)) +#else +import Network.HTTP.Conduit (HttpException(..)) +#endif +import Network.HTTP.Types +import System.Log.Logger (debugM) +import System.IO.Error + +import Common.Annex +import Types.Remote +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Chunked +import Crypto +import Creds +import Utility.Metered +import Annex.Content +import Annex.UUID +import Remote.WebDAV.DavUrl + +type DavUser = B8.ByteString +type DavPass = B8.ByteString + +remote :: RemoteType +remote = RemoteType { + typename = "webdav", + enumerate = findSpecialRemotes "webdav", + generate = gen, + setup = webdavSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc expensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +webdavSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +webdavSetup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + let url = fromMaybe (error "Specify url=") $ + M.lookup "url" c + c' <- encryptionSetup c + creds <- maybe (getCreds c' u) (return . Just) mcreds + testDav url creds + gitConfigSpecialRemote u c' "webdav" "true" + c'' <- setRemoteCredPair c' (davCreds u) creds + return (c'', u) + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> + sendAnnex k (void $ remove r k) $ \src -> + liftIO $ withMeteredFile src meterupdate $ + storeHelper r k baseurl user pass + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> + sendAnnex k (void $ remove r enck) $ \src -> + liftIO $ encrypt (getGpgEncParams r) cipher + (streamMeteredFile src meterupdate) $ + readBytes $ storeHelper r enck baseurl user pass + +storeHelper :: Remote -> Key -> DavUrl -> DavUser -> DavPass -> L.ByteString -> IO Bool +storeHelper r k baseurl user pass b = catchBoolIO $ do + mkdirRecursiveDAV tmpurl user pass + storeChunks k tmpurl keyurl chunksize storer recorder finalizer + where + tmpurl = tmpLocation baseurl k + keyurl = davLocation baseurl k + chunksize = chunkSize $ config r + storer urls = storeChunked chunksize urls storehttp b + recorder url s = storehttp url (L8.fromString s) + finalizer srcurl desturl = do + void $ tryNonAsync (deleteDAV desturl user pass) + mkdirRecursiveDAV (urlParent desturl) user pass + moveDAV srcurl desturl user pass + storehttp url = putDAV url user pass + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> liftIO $ catchBoolIO $ + withStoredFiles r k baseurl user pass onerr $ \urls -> do + meteredWriteFileChunks meterupdate d urls $ \url -> do + mb <- getDAV url user pass + case mb of + Nothing -> throwIO "download failed" + Just b -> return b + return True + where + onerr _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> liftIO $ catchBoolIO $ + withStoredFiles r enck baseurl user pass onerr $ \urls -> do + decrypt cipher (feeder user pass urls) $ + readBytes $ meteredWriteFile meterupdate d + return True + where + onerr _ = return False + + feeder _ _ [] _ = noop + feeder user pass (url:urls) h = do + mb <- getDAV url user pass + case mb of + Nothing -> throwIO "download failed" + Just b -> do + L.hPut h b + feeder user pass urls h + +remove :: Remote -> Key -> Annex Bool +remove r k = davAction r False $ \(baseurl, user, pass) -> liftIO $ do + -- Delete the key's whole directory, including any chunked + -- files, etc, in a single action. + let url = davLocation baseurl k + isJust . eitherToMaybe <$> tryNonAsync (deleteDAV url user pass) + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = davAction r noconn go + where + noconn = Left $ error $ name r ++ " not configured" + + go (baseurl, user, pass) = do + showAction $ "checking " ++ name r + liftIO $ withStoredFiles r k baseurl user pass onerr check + where + check [] = return $ Right True + check (url:urls) = do + v <- existsDAV url user pass + if v == Right True + then check urls + else return v + + {- Failed to read the chunkcount file; see if it's missing, + - or if there's a problem accessing it, + - or perhaps this was an intermittent error. -} + onerr url = do + v <- existsDAV url user pass + return $ if v == Right True + then Left $ "failed to read " ++ url + else v + +withStoredFiles + :: Remote + -> Key + -> DavUrl + -> DavUser + -> DavPass + -> (DavUrl -> IO a) + -> ([DavUrl] -> IO a) + -> IO a +withStoredFiles r k baseurl user pass onerr a + | isJust $ chunkSize $ config r = do + let chunkcount = keyurl ++ chunkCount + v <- getDAV chunkcount user pass + case v of + Just s -> a $ listChunks keyurl $ L8.toString s + Nothing -> do + chunks <- probeChunks keyurl $ \u -> (== Right True) <$> existsDAV u user pass + if null chunks + then onerr chunkcount + else a chunks + | otherwise = a [keyurl] + where + keyurl = davLocation baseurl k ++ keyFile k + +davAction :: Remote -> a -> ((DavUrl, DavUser, DavPass) -> Annex a) -> Annex a +davAction r unconfigured action = do + mcreds <- getCreds (config r) (uuid r) + case (mcreds, configUrl r) of + (Just (user, pass), Just url) -> + action (url, toDavUser user, toDavPass pass) + _ -> return unconfigured + +configUrl :: Remote -> Maybe DavUrl +configUrl r = fixup <$> M.lookup "url" (config r) + where + -- box.com DAV url changed + fixup = replace "https://www.box.com/dav/" "https://dav.box.com/dav/" + +toDavUser :: String -> DavUser +toDavUser = B8.fromString + +toDavPass :: String -> DavPass +toDavPass = B8.fromString + +{- Creates a directory in WebDAV, if not already present; also creating + - any missing parent directories. -} +mkdirRecursiveDAV :: DavUrl -> DavUser -> DavPass -> IO () +mkdirRecursiveDAV url user pass = go url + where + make u = mkdirDAV u user pass + + go u = do + r <- E.try (make u) :: IO (Either E.SomeException Bool) + case r of + {- Parent directory is missing. Recurse to create + - it, and try once more to create the directory. -} + Right False -> do + go (urlParent u) + void $ make u + {- Directory created successfully -} + Right True -> return () + {- Directory already exists, or some other error + - occurred. In the latter case, whatever wanted + - to use this directory will fail. -} + Left _ -> return () + +{- Test if a WebDAV store is usable, by writing to a test file, and then + - deleting the file. Exits with an IO error if not. -} +testDav :: String -> Maybe CredPair -> Annex () +testDav baseurl (Just (u, p)) = do + showSideAction "testing WebDAV server" + test "make directory" $ mkdirRecursiveDAV baseurl user pass + test "write file" $ putDAV testurl user pass L.empty + test "delete file" $ deleteDAV testurl user pass + where + test desc a = liftIO $ + either (\e -> throwIO $ "WebDAV failed to " ++ desc ++ ": " ++ show e) + (const noop) + =<< tryNonAsync a + + user = toDavUser u + pass = toDavPass p + testurl = davUrl baseurl "git-annex-test" +testDav _ Nothing = error "Need to configure webdav username and password." + +getCreds :: RemoteConfig -> UUID -> Annex (Maybe CredPair) +getCreds c u = getRemoteCredPairFor "webdav" c (davCreds u) + +davCreds :: UUID -> CredPairStorage +davCreds u = CredPairStorage + { credPairFile = fromUUID u + , credPairEnvironment = ("WEBDAV_USERNAME", "WEBDAV_PASSWORD") + , credPairRemoteKey = Just "davcreds" + } + +{- Content-Type to use for files uploaded to WebDAV. -} +contentType :: Maybe B8.ByteString +contentType = Just $ B8.fromString "application/octet-stream" + +throwIO :: String -> IO a +throwIO msg = ioError $ mkIOError userErrorType msg Nothing Nothing + +debugDAV :: DavUrl -> String -> IO () +debugDAV msg url = debugM "DAV" $ msg ++ " " ++ url + +{--------------------------------------------------------------------- + - Low-level DAV operations, using the new DAV monad when available. + ---------------------------------------------------------------------} + +putDAV :: DavUrl -> DavUser -> DavPass -> L.ByteString -> IO () +putDAV url user pass b = do + debugDAV "PUT" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass $ putContentM (contentType, b) +#else + putContent url user pass (contentType, b) +#endif + +getDAV :: DavUrl -> DavUser -> DavPass -> IO (Maybe L.ByteString) +getDAV url user pass = do + debugDAV "GET" url + eitherToMaybe <$> tryNonAsync go + where +#if MIN_VERSION_DAV(0,6,0) + go = goDAV url user pass $ snd <$> getContentM +#else + go = snd . snd <$> getPropsAndContent url user pass +#endif + +deleteDAV :: DavUrl -> DavUser -> DavPass -> IO () +deleteDAV url user pass = do + debugDAV "DELETE" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass delContentM +#else + deleteContent url user pass +#endif + +moveDAV :: DavUrl -> DavUrl -> DavUser -> DavPass -> IO () +moveDAV url newurl user pass = do + debugDAV ("MOVE to " ++ newurl ++ " from ") url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass $ moveContentM newurl' +#else + moveContent url newurl' user pass +#endif + where + newurl' = B8.fromString newurl + +mkdirDAV :: DavUrl -> DavUser -> DavPass -> IO Bool +mkdirDAV url user pass = do + debugDAV "MKDIR" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass mkCol +#else + makeCollection url user pass +#endif + +existsDAV :: DavUrl -> DavUser -> DavPass -> IO (Either String Bool) +existsDAV url user pass = do + debugDAV "EXISTS" url + either (Left . show) id <$> tryNonAsync check + where + ispresent = return . Right +#if MIN_VERSION_DAV(0,6,0) + check = goDAV url user pass $ do + setDepth Nothing + EL.catchJust + (matchStatusCodeException notFound404) + (getPropsM >> ispresent True) + (const $ ispresent False) +#else + check = E.catchJust + (matchStatusCodeException notFound404) +#if ! MIN_VERSION_DAV(0,4,0) + (getProps url user pass >> ispresent True) +#else + (getProps url user pass Nothing >> ispresent True) +#endif + (const $ ispresent False) +#endif + +matchStatusCodeException :: Status -> HttpException -> Maybe () +#if MIN_VERSION_DAV(0,6,0) +matchStatusCodeException want (StatusCodeException s _ _) +#else +matchStatusCodeException want (StatusCodeException s _) +#endif + | s == want = Just () + | otherwise = Nothing +matchStatusCodeException _ _ = Nothing + +#if MIN_VERSION_DAV(0,6,0) +goDAV :: DavUrl -> DavUser -> DavPass -> DAVT IO a -> IO a +goDAV url user pass a = choke $ evalDAVT url $ do + setResponseTimeout Nothing -- disable default (5 second!) timeout + setCreds user pass + a + where + choke :: IO (Either String a) -> IO a + choke f = do + x <- f + case x of + Left e -> error e + Right r -> return r +#endif diff --git a/Remote/WebDAV/DavUrl.hs b/Remote/WebDAV/DavUrl.hs new file mode 100644 index 000000000..4862c4f37 --- /dev/null +++ b/Remote/WebDAV/DavUrl.hs @@ -0,0 +1,44 @@ +{- WebDAV urls. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.WebDAV.DavUrl where + +import Types +import Locations + +import Network.URI (normalizePathSegments) +import System.FilePath.Posix +#ifdef mingw32_HOST_OS +import Data.String.Utils +#endif + +type DavUrl = String + +{- The directory where files(s) for a key are stored. -} +davLocation :: DavUrl -> Key -> DavUrl +davLocation baseurl k = addTrailingPathSeparator $ + davUrl baseurl $ hashdir keyFile k + where +#ifndef mingw32_HOST_OS + hashdir = hashDirLower k +#else + hashdir = replace "\\" "/" (hashDirLower k) +#endif + +{- Where we store temporary data for a key as it's being uploaded. -} +tmpLocation :: DavUrl -> Key -> DavUrl +tmpLocation baseurl k = addTrailingPathSeparator $ + davUrl baseurl $ "tmp" keyFile k + +davUrl :: DavUrl -> FilePath -> DavUrl +davUrl baseurl file = baseurl file + +urlParent :: DavUrl -> DavUrl +urlParent url = dropTrailingPathSeparator $ + normalizePathSegments (dropTrailingPathSeparator url ++ "/..") diff --git a/RemoteDaemon/Common.hs b/RemoteDaemon/Common.hs new file mode 100644 index 000000000..e844e2c88 --- /dev/null +++ b/RemoteDaemon/Common.hs @@ -0,0 +1,42 @@ +{- git-remote-daemon utilities + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module RemoteDaemon.Common + ( liftAnnex + , inLocalRepo + , checkNewShas + ) where + +import qualified Annex +import Common.Annex +import RemoteDaemon.Types +import qualified Git +import Annex.CatFile + +import Control.Concurrent + +-- Runs an Annex action. Long-running actions should be avoided, +-- since only one liftAnnex can be running at a time, across all +-- transports. +liftAnnex :: TransportHandle -> Annex a -> IO a +liftAnnex (TransportHandle _ annexstate) a = do + st <- takeMVar annexstate + (r, st') <- Annex.run st a + putMVar annexstate st' + return r + +inLocalRepo :: TransportHandle -> (Git.Repo -> IO a) -> IO a +inLocalRepo (TransportHandle g _) a = a g + +-- Check if any of the shas are actally new in the local git repo, +-- to avoid unnecessary fetching. +checkNewShas :: TransportHandle -> [Git.Sha] -> IO Bool +checkNewShas transporthandle = check + where + check [] = return True + check (r:rs) = maybe (check rs) (const $ return False) + =<< liftAnnex transporthandle (catObjectDetails r) diff --git a/RemoteDaemon/Core.hs b/RemoteDaemon/Core.hs new file mode 100644 index 000000000..60a4d5ceb --- /dev/null +++ b/RemoteDaemon/Core.hs @@ -0,0 +1,133 @@ +{- git-remote-daemon core + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module RemoteDaemon.Core (runForeground) where + +import qualified Annex +import Common +import Types.GitConfig +import RemoteDaemon.Common +import RemoteDaemon.Types +import RemoteDaemon.Transport +import qualified Git +import qualified Git.Types as Git +import qualified Git.CurrentRepo +import Utility.SimpleProtocol +import Config +import Annex.Ssh + +import Control.Concurrent.Async +import Control.Concurrent +import Network.URI +import qualified Data.Map as M + +runForeground :: IO () +runForeground = do + (readh, writeh) <- ioHandles + ichan <- newChan :: IO (Chan Consumed) + ochan <- newChan :: IO (Chan Emitted) + + let reader = forever $ do + l <- hGetLine readh + case parseMessage l of + Nothing -> error $ "protocol error: " ++ l + Just cmd -> writeChan ichan cmd + let writer = forever $ do + msg <- readChan ochan + hPutStrLn writeh $ unwords $ formatMessage msg + hFlush writeh + let controller = runController ichan ochan + + -- If any thread fails, the rest will be killed. + void $ tryIO $ + reader `concurrently` writer `concurrently` controller + +type RemoteMap = M.Map Git.Repo (IO (), Chan Consumed) + +-- Runs the transports, dispatching messages to them, and handling +-- the main control messages. +runController :: Chan Consumed -> Chan Emitted -> IO () +runController ichan ochan = do + h <- genTransportHandle + m <- genRemoteMap h ochan + startrunning m + go h False m + where + go h paused m = do + cmd <- readChan ichan + case cmd of + RELOAD -> do + h' <- updateTransportHandle h + m' <- genRemoteMap h' ochan + let common = M.intersection m m' + let new = M.difference m' m + let old = M.difference m m' + broadcast STOP old + unless paused $ + startrunning new + go h' paused (M.union common new) + LOSTNET -> do + -- force close all cached ssh connections + -- (done here so that if there are multiple + -- ssh remotes, it's only done once) + liftAnnex h forceSshCleanup + broadcast LOSTNET m + go h True m + PAUSE -> do + broadcast STOP m + go h True m + RESUME -> do + when paused $ + startrunning m + go h False m + STOP -> exitSuccess + -- All remaining messages are sent to + -- all Transports. + msg -> do + unless paused $ + forM_ chans (`writeChan` msg) + go h paused m + where + chans = map snd (M.elems m) + + startrunning m = forM_ (M.elems m) startrunning' + startrunning' (transport, _) = void $ async transport + + broadcast msg m = forM_ (M.elems m) send + where + send (_, c) = writeChan c msg + +-- Generates a map with a transport for each supported remote in the git repo, +-- except those that have annex.sync = false +genRemoteMap :: TransportHandle -> Chan Emitted -> IO RemoteMap +genRemoteMap h@(TransportHandle g _) ochan = + M.fromList . catMaybes <$> mapM gen (Git.remotes g) + where + gen r = case Git.location r of + Git.Url u -> case M.lookup (uriScheme u) remoteTransports of + Just transport + | remoteAnnexSync (extractRemoteGitConfig r (Git.repoDescribe r)) -> do + ichan <- newChan :: IO (Chan Consumed) + return $ Just + ( r + , (transport r (RemoteURI u) h ichan ochan, ichan) + ) + _ -> return Nothing + _ -> return Nothing + +genTransportHandle :: IO TransportHandle +genTransportHandle = do + annexstate <- newMVar =<< Annex.new =<< Git.CurrentRepo.get + g <- Annex.repo <$> readMVar annexstate + return $ TransportHandle g annexstate + +updateTransportHandle :: TransportHandle -> IO TransportHandle +updateTransportHandle h@(TransportHandle _g annexstate) = do + g' <- liftAnnex h $ do + reloadConfig + Annex.fromRepo id + return (TransportHandle g' annexstate) diff --git a/RemoteDaemon/Transport.hs b/RemoteDaemon/Transport.hs new file mode 100644 index 000000000..09118ca8b --- /dev/null +++ b/RemoteDaemon/Transport.hs @@ -0,0 +1,23 @@ +{- git-remote-daemon transports + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module RemoteDaemon.Transport where + +import RemoteDaemon.Types +import qualified RemoteDaemon.Transport.Ssh +import qualified Git.GCrypt + +import qualified Data.Map as M + +-- Corresponds to uriScheme +type TransportScheme = String + +remoteTransports :: M.Map TransportScheme Transport +remoteTransports = M.fromList + [ ("ssh:", RemoteDaemon.Transport.Ssh.transport) + , (Git.GCrypt.urlScheme, RemoteDaemon.Transport.Ssh.transport) + ] diff --git a/RemoteDaemon/Transport/Ssh.hs b/RemoteDaemon/Transport/Ssh.hs new file mode 100644 index 000000000..65c313852 --- /dev/null +++ b/RemoteDaemon/Transport/Ssh.hs @@ -0,0 +1,123 @@ +{- git-remote-daemon, git-annex-shell over ssh transport + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module RemoteDaemon.Transport.Ssh (transport) where + +import Common.Annex +import Annex.Ssh +import RemoteDaemon.Types +import RemoteDaemon.Common +import Remote.Helper.Ssh +import qualified RemoteDaemon.Transport.Ssh.Types as SshRemote +import Utility.SimpleProtocol +import qualified Git +import Git.Command +import Utility.ThreadScheduler + +import Control.Concurrent.Chan +import Control.Concurrent.Async + +transport :: Transport +transport r url h@(TransportHandle g s) ichan ochan = do + -- enable ssh connection caching wherever inLocalRepo is called + g' <- liftAnnex h $ sshCachingTo r g + transport' r url (TransportHandle g' s) ichan ochan + +transport' :: Transport +transport' r url transporthandle ichan ochan = do + + v <- liftAnnex transporthandle $ git_annex_shell r "notifychanges" [] [] + case v of + Nothing -> noop + Just (cmd, params) -> robustly 1 $ + connect cmd (toCommand params) + where + connect cmd params = do + (Just toh, Just fromh, Just errh, pid) <- + createProcess (proc cmd params) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = CreatePipe + } + + -- Run all threads until one finishes and get the status + -- of the first to finish. Cancel the rest. + status <- catchDefaultIO (Right ConnectionClosed) $ + handlestderr errh + `race` handlestdout fromh + `race` handlecontrol + + send (DISCONNECTED url) + hClose toh + hClose fromh + void $ waitForProcess pid + + return $ either (either id id) id status + + send msg = writeChan ochan msg + + fetch = do + send (SYNCING url) + ok <- inLocalRepo transporthandle $ + runBool [Param "fetch", Param $ Git.repoDescribe r] + send (DONESYNCING url ok) + + handlestdout fromh = do + l <- hGetLine fromh + case parseMessage l of + Just SshRemote.READY -> do + send (CONNECTED url) + handlestdout fromh + Just (SshRemote.CHANGED shas) -> do + whenM (checkNewShas transporthandle shas) $ + fetch + handlestdout fromh + -- avoid reconnect on protocol error + Nothing -> return Stopping + + handlecontrol = do + msg <- readChan ichan + case msg of + STOP -> return Stopping + LOSTNET -> return Stopping + _ -> handlecontrol + + -- Old versions of git-annex-shell that do not support + -- the notifychanges command will exit with a not very useful + -- error message. Detect that error, and avoid reconnecting. + -- Propigate all stderr. + handlestderr errh = do + s <- hGetSomeString errh 1024 + hPutStr stderr s + hFlush stderr + if "git-annex-shell: git-shell failed" `isInfixOf` s + then do + send $ WARNING url $ unwords + [ "Remote", Git.repoDescribe r + , "needs its git-annex upgraded" + , "to 5.20140405 or newer" + ] + return Stopping + else handlestderr errh + +data Status = Stopping | ConnectionClosed + +{- Make connection robustly, with exponentioal backoff on failure. -} +robustly :: Int -> IO Status -> IO () +robustly backoff a = handle =<< catchDefaultIO ConnectionClosed a + where + handle Stopping = return () + handle ConnectionClosed = do + threadDelaySeconds (Seconds backoff) + robustly increasedbackoff a + + increasedbackoff + | b2 > maxbackoff = maxbackoff + | otherwise = b2 + where + b2 = backoff * 2 + maxbackoff = 3600 -- one hour diff --git a/RemoteDaemon/Transport/Ssh/Types.hs b/RemoteDaemon/Transport/Ssh/Types.hs new file mode 100644 index 000000000..d3fd314b4 --- /dev/null +++ b/RemoteDaemon/Transport/Ssh/Types.hs @@ -0,0 +1,32 @@ +{- git-remote-daemon, git-annex-shell notifychanges protocol types + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module RemoteDaemon.Transport.Ssh.Types ( + Notification(..), + Proto.serialize, + Proto.deserialize, + Proto.formatMessage, +) where + +import qualified Utility.SimpleProtocol as Proto +import RemoteDaemon.Types (RefList) + +data Notification + = READY + | CHANGED RefList + +instance Proto.Sendable Notification where + formatMessage READY = ["READY"] + formatMessage (CHANGED shas) = ["CHANGED", Proto.serialize shas] + +instance Proto.Receivable Notification where + parseCommand "READY" = Proto.parse0 READY + parseCommand "CHANGED" = Proto.parse1 CHANGED + parseCommand _ = Proto.parseFail diff --git a/RemoteDaemon/Types.hs b/RemoteDaemon/Types.hs new file mode 100644 index 000000000..0a7269534 --- /dev/null +++ b/RemoteDaemon/Types.hs @@ -0,0 +1,115 @@ +{- git-remote-daemon data types. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module RemoteDaemon.Types where + +import Common +import qualified Annex +import qualified Git.Types as Git +import qualified Utility.SimpleProtocol as Proto + +import Network.URI +import Control.Concurrent + +-- The URI of a remote is used to uniquely identify it (names change..) +newtype RemoteURI = RemoteURI URI + deriving (Show) + +-- A Transport for a particular git remote consumes some messages +-- from a Chan, and emits others to another Chan. +type Transport = RemoteRepo -> RemoteURI -> TransportHandle -> Chan Consumed -> Chan Emitted -> IO () + +type RemoteRepo = Git.Repo +type LocalRepo = Git.Repo + +-- All Transports share a single AnnexState MVar +-- +-- Different TransportHandles may have different versions of the LocalRepo. +-- (For example, the ssh transport modifies it to enable ssh connection +-- caching.) +data TransportHandle = TransportHandle LocalRepo (MVar Annex.AnnexState) + +-- Messages that the daemon emits. +data Emitted + = CONNECTED RemoteURI + | DISCONNECTED RemoteURI + | SYNCING RemoteURI + | DONESYNCING RemoteURI Bool + | WARNING RemoteURI String + deriving (Show) + +-- Messages that the deamon consumes. +data Consumed + = PAUSE + | LOSTNET + | RESUME + | CHANGED RefList + | RELOAD + | STOP + deriving (Show) + +type RefList = [Git.Ref] + +instance Proto.Sendable Emitted where + formatMessage (CONNECTED remote) = + ["CONNECTED", Proto.serialize remote] + formatMessage (DISCONNECTED remote) = + ["DISCONNECTED", Proto.serialize remote] + formatMessage (SYNCING remote) = + ["SYNCING", Proto.serialize remote] + formatMessage (DONESYNCING remote status) = + ["DONESYNCING", Proto.serialize remote, Proto.serialize status] + formatMessage (WARNING remote message) = + ["WARNING", Proto.serialize remote, Proto.serialize message] + +instance Proto.Sendable Consumed where + formatMessage PAUSE = ["PAUSE"] + formatMessage LOSTNET = ["LOSTNET"] + formatMessage RESUME = ["RESUME"] + formatMessage (CHANGED refs) =["CHANGED", Proto.serialize refs] + formatMessage RELOAD = ["RELOAD"] + formatMessage STOP = ["STOP"] + +instance Proto.Receivable Emitted where + parseCommand "CONNECTED" = Proto.parse1 CONNECTED + parseCommand "DISCONNECTED" = Proto.parse1 DISCONNECTED + parseCommand "SYNCING" = Proto.parse1 SYNCING + parseCommand "DONESYNCING" = Proto.parse2 DONESYNCING + parseCommand "WARNING" = Proto.parse2 WARNING + parseCommand _ = Proto.parseFail + +instance Proto.Receivable Consumed where + parseCommand "PAUSE" = Proto.parse0 PAUSE + parseCommand "LOSTNET" = Proto.parse0 LOSTNET + parseCommand "RESUME" = Proto.parse0 RESUME + parseCommand "CHANGED" = Proto.parse1 CHANGED + parseCommand "RELOAD" = Proto.parse0 RELOAD + parseCommand "STOP" = Proto.parse0 STOP + parseCommand _ = Proto.parseFail + +instance Proto.Serializable RemoteURI where + serialize (RemoteURI u) = show u + deserialize = RemoteURI <$$> parseURI + +instance Proto.Serializable [Char] where + serialize = id + deserialize = Just + +instance Proto.Serializable RefList where + serialize = unwords . map Git.fromRef + deserialize = Just . map Git.Ref . words + +instance Proto.Serializable Bool where + serialize False = "0" + serialize True = "1" + + deserialize "0" = Just False + deserialize "1" = Just True + deserialize _ = Nothing diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 000000000..470a0d3db --- /dev/null +++ b/Setup.hs @@ -0,0 +1,62 @@ +{-# LANGUAGE NamedFieldPuns #-} + +{- cabal setup file -} + +import Distribution.Simple +import Distribution.Simple.LocalBuildInfo +import Distribution.Simple.Setup +import Distribution.Simple.Utils (installOrdinaryFiles, rawSystemExit) +import Distribution.PackageDescription (PackageDescription(..)) +import Distribution.Verbosity (Verbosity) +import System.FilePath +import Control.Applicative +import Control.Monad +import System.Directory + +import qualified Build.DesktopFile as DesktopFile +import qualified Build.Configure as Configure + +main :: IO () +main = defaultMainWithHooks simpleUserHooks + { preConf = \_ _ -> do + Configure.run Configure.tests + return (Nothing, []) + , postInst = myPostInst + } + +myPostInst :: Args -> InstallFlags -> PackageDescription -> LocalBuildInfo -> IO () +myPostInst _ (InstallFlags { installVerbosity }) pkg lbi = do + installGitAnnexShell dest verbosity pkg lbi + installManpages dest verbosity pkg lbi + installDesktopFile dest verbosity pkg lbi + where + dest = NoCopyDest + verbosity = fromFlag installVerbosity + +installGitAnnexShell :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installGitAnnexShell copyDest verbosity pkg lbi = + rawSystemExit verbosity "ln" + ["-sf", "git-annex", dstBinDir "git-annex-shell"] + where + dstBinDir = bindir $ absoluteInstallDirs pkg lbi copyDest + +{- See http://www.haskell.org/haskellwiki/Cabal/Developer-FAQ#Installing_manpages + - + - Man pages are provided prebuilt in the tarball in cabal, + - but may not be available otherwise, in which case, skip installing them. + -} +installManpages :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installManpages copyDest verbosity pkg lbi = + installOrdinaryFiles verbosity dstManDir =<< srcManpages + where + dstManDir = mandir (absoluteInstallDirs pkg lbi copyDest) "man1" + srcManpages = zip (repeat srcManDir) + <$> filterM doesFileExist manpages + srcManDir = "" + manpages = ["git-annex.1", "git-annex-shell.1"] + +installDesktopFile :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installDesktopFile copyDest _verbosity pkg lbi = + DesktopFile.install $ dstBinDir "git-annex" + where + dstBinDir = bindir $ absoluteInstallDirs pkg lbi copyDest diff --git a/Test.hs b/Test.hs new file mode 100644 index 000000000..3ae5e323b --- /dev/null +++ b/Test.hs @@ -0,0 +1,1695 @@ +{- git-annex test suite + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Test where + +import Test.Tasty +import Test.Tasty.Runners +import Test.Tasty.HUnit +import Test.Tasty.QuickCheck +import Test.Tasty.Ingredients.Rerun +import Data.Monoid + +import Options.Applicative hiding (command) +#if MIN_VERSION_optparse_applicative(0,8,0) +import qualified Options.Applicative.Types as Opt +#endif +import Control.Exception.Extensible +import qualified Data.Map as M +import qualified Text.JSON + +import Common + +import qualified Utility.SafeCommand +import qualified Annex +import qualified Annex.UUID +import qualified Backend +import qualified Git.CurrentRepo +import qualified Git.Filename +import qualified Git.Construct +import qualified Git.Types +import qualified Git.Ref +import qualified Git.LsTree +import qualified Git.FilePath +import qualified Locations +import qualified Types.KeySource +import qualified Types.Backend +import qualified Types.TrustLevel +import qualified Types +import qualified Logs +import qualified Logs.MapLog +import qualified Logs.Trust +import qualified Logs.Remote +import qualified Logs.Unused +import qualified Logs.Transfer +import qualified Logs.Presence +import qualified Types.MetaData +import qualified Remote +import qualified Types.Key +import qualified Types.Messages +import qualified Config +import qualified Config.Cost +import qualified Crypto +import qualified Annex.Init +import qualified Annex.CatFile +import qualified Annex.View +import qualified Annex.View.ViewedFile +import qualified Logs.View +import qualified Utility.Path +import qualified Utility.FileMode +import qualified Build.SysConfig +import qualified Utility.Format +import qualified Utility.Verifiable +import qualified Utility.Process +import qualified Utility.Misc +import qualified Utility.InodeCache +import qualified Utility.Env +import qualified Utility.Matcher +import qualified Utility.Exception +import qualified Utility.Hash +import qualified Utility.Scheduled +import qualified Utility.HumanTime +import qualified Utility.ThreadScheduler +import qualified Command.Uninit +#ifndef mingw32_HOST_OS +import qualified CmdLine.GitAnnex as GitAnnex +import qualified Remote.Helper.Encryptable +import qualified Types.Crypto +import qualified Utility.Gpg +#endif + +type TestEnv = M.Map String String + +main :: [String] -> IO () +main ps = do + let tests = testGroup "Tests" + -- Test both direct and indirect mode. + -- Windows is only going to use direct mode, + -- so don't test twice. + [ properties +#ifndef mingw32_HOST_OS + , withTestEnv True $ unitTests "(direct)" + , withTestEnv False $ unitTests "(indirect)" +#else + , withTestEnv False $ unitTests "" +#endif + ] + + -- Can't use tasty's defaultMain because one of the command line + -- parameters is "test". + let pinfo = info (helper <*> suiteOptionParser ingredients tests) + ( fullDesc <> header "Builtin test suite" ) + opts <- parseOpts (prefs idm) pinfo ps + case tryIngredients ingredients opts tests of + Nothing -> error "No tests found!?" + Just act -> ifM act + ( exitSuccess + , do + putStrLn " (This could be due to a bug in git-annex, or an incompatability" + putStrLn " with utilities, such as git, installed on this system.)" + exitFailure + ) + where + progdesc = "git-annex test" + parseOpts pprefs pinfo args = +#if MIN_VERSION_optparse_applicative(0,8,0) + pure $ case execParserPure pprefs pinfo args of + Opt.Success v -> v + Opt.Failure f -> error $ fst $ Opt.execFailure f progdesc + Opt.CompletionInvoked _ -> error "completion not supported" +#else + either (error <=< flip errMessage progdesc) return $ + execParserPure pprefs pinfo args +#endif + +ingredients :: [Ingredient] +ingredients = + [ rerunningTests [consoleTestReporter] + , listingTests + ] + +properties :: TestTree +properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck" + [ testProperty "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode + , testProperty "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode + , testProperty "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey + , testProperty "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode + , testProperty "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode + , testProperty "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape + , testProperty "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword + , testProperty "prop_logs_sane" Logs.prop_logs_sane + , testProperty "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape + , testProperty "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config + , testProperty "prop_parentDir_basics" Utility.Path.prop_parentDir_basics + , testProperty "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics + , testProperty "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest + , testProperty "prop_cost_sane" Config.Cost.prop_cost_sane + , testProperty "prop_matcher_sane" Utility.Matcher.prop_matcher_sane + , testProperty "prop_HmacSha1WithCipher_sane" Crypto.prop_HmacSha1WithCipher_sane + , testProperty "prop_TimeStamp_sane" Logs.MapLog.prop_TimeStamp_sane + , testProperty "prop_addMapLog_sane" Logs.MapLog.prop_addMapLog_sane + , testProperty "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane + , testProperty "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest + , testProperty "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo + , testProperty "prop_read_show_inodecache" Utility.InodeCache.prop_read_show_inodecache + , testProperty "prop_parse_show_log" Logs.Presence.prop_parse_show_log + , testProperty "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel + , testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog + , testProperty "prop_hashes_stable" Utility.Hash.prop_hashes_stable + , testProperty "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips + , testProperty "prop_past_sane" Utility.Scheduled.prop_past_sane + , testProperty "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips + , testProperty "prop_metadata_sane" Types.MetaData.prop_metadata_sane + , testProperty "prop_metadata_serialize" Types.MetaData.prop_metadata_serialize + , testProperty "prop_branchView_legal" Logs.View.prop_branchView_legal + , testProperty "prop_view_roundtrips" Annex.View.prop_view_roundtrips + , testProperty "prop_viewedFile_rountrips" Annex.View.ViewedFile.prop_viewedFile_roundtrips + ] + +{- These tests set up the test environment, but also test some basic parts + - of git-annex. They are always run before the unitTests. -} +initTests :: TestEnv -> TestTree +initTests testenv = testGroup "Init Tests" + [ check "init" test_init + , check "add" test_add + ] + where + check desc t = testCase desc (t testenv) + +unitTests :: String -> IO TestEnv -> TestTree +unitTests note gettestenv = testGroup ("Unit Tests " ++ note) + [ check "add sha1dup" test_add_sha1dup + , check "add extras" test_add_extras + , check "reinject" test_reinject + , check "unannex (no copy)" test_unannex_nocopy + , check "unannex (with copy)" test_unannex_withcopy + , check "drop (no remote)" test_drop_noremote + , check "drop (with remote)" test_drop_withremote + , check "drop (untrusted remote)" test_drop_untrustedremote + , check "get" test_get + , check "move" test_move + , check "copy" test_copy + , check "lock" test_lock + , check "edit (no pre-commit)" test_edit + , check "edit (pre-commit)" test_edit_precommit + , check "fix" test_fix + , check "trust" test_trust + , check "fsck (basics)" test_fsck_basic + , check "fsck (bare)" test_fsck_bare + , check "fsck (local untrusted)" test_fsck_localuntrusted + , check "fsck (remote untrusted)" test_fsck_remoteuntrusted + , check "migrate" test_migrate + , check "migrate (via gitattributes)" test_migrate_via_gitattributes + , check" unused" test_unused + , check "describe" test_describe + , check "find" test_find + , check "merge" test_merge + , check "info" test_info + , check "version" test_version + , check "sync" test_sync + , check "union merge regression" test_union_merge_regression + , check "conflict resolution" test_conflict_resolution + , check "conflict resolution movein regression" test_conflict_resolution_movein_regression + , check "conflict resolution (mixed directory and file)" test_mixed_conflict_resolution + , check "conflict resolution symlink bit" test_conflict_resolution_symlink_bit + , check "conflict resolution (uncommitted local file)" test_uncommitted_conflict_resolution + , check "conflict resolution (removed file)" test_remove_conflict_resolution + , check "conflict resolution (nonannexed file)" test_nonannexed_file_conflict_resolution + , check "conflict resolution (nonannexed symlink)" test_nonannexed_symlink_conflict_resolution + , check "map" test_map + , check "uninit" test_uninit + , check "uninit (in git-annex branch)" test_uninit_inbranch + , check "upgrade" test_upgrade + , check "whereis" test_whereis + , check "hook remote" test_hook_remote + , check "directory remote" test_directory_remote + , check "rsync remote" test_rsync_remote + , check "bup remote" test_bup_remote + , check "crypto" test_crypto + , check "preferred content" test_preferred_content + , check "add subdirs" test_add_subdirs + ] + where + check desc t = testCase desc (gettestenv >>= t) + +-- this test case create the main repo +test_init :: TestEnv -> Assertion +test_init testenv = innewrepo testenv $ do + git_annex testenv "init" [reponame] @? "init failed" + handleforcedirect testenv + where + reponame = "test repo" + +-- this test case runs in the main repo, to set up a basic +-- annexed file that later tests will use +test_add :: TestEnv -> Assertion +test_add testenv = inmainrepo testenv $ do + writeFile annexedfile $ content annexedfile + git_annex testenv "add" [annexedfile] @? "add failed" + annexed_present annexedfile + writeFile sha1annexedfile $ content sha1annexedfile + git_annex testenv "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed" + annexed_present sha1annexedfile + checkbackend sha1annexedfile backendSHA1 + ifM (annexeval Config.isDirect) + ( do + writeFile ingitfile $ content ingitfile + not <$> boolSystem "git" [Param "add", File ingitfile] @? "git add failed to fail in direct mode" + nukeFile ingitfile + git_annex testenv "sync" [] @? "sync failed" + , do + writeFile ingitfile $ content ingitfile + boolSystem "git" [Param "add", File ingitfile] @? "git add failed" + boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed" + git_annex testenv "add" [ingitfile] @? "add ingitfile should be no-op" + unannexed ingitfile + ) + +test_add_sha1dup :: TestEnv -> Assertion +test_add_sha1dup testenv = intmpclonerepo testenv $ do + writeFile sha1annexedfiledup $ content sha1annexedfiledup + git_annex testenv "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed" + annexed_present sha1annexedfiledup + annexed_present sha1annexedfile + +test_add_extras :: TestEnv -> Assertion +test_add_extras testenv = intmpclonerepo testenv $ do + writeFile wormannexedfile $ content wormannexedfile + git_annex testenv "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed" + annexed_present wormannexedfile + checkbackend wormannexedfile backendWORM + +test_reinject :: TestEnv -> Assertion +test_reinject testenv = intmpclonerepoInDirect testenv $ do + git_annex testenv "drop" ["--force", sha1annexedfile] @? "drop failed" + writeFile tmp $ content sha1annexedfile + r <- annexeval $ Types.Backend.getKey backendSHA1 + Types.KeySource.KeySource { Types.KeySource.keyFilename = tmp, Types.KeySource.contentLocation = tmp, Types.KeySource.inodeCache = Nothing } + let key = Types.Key.key2file $ fromJust r + git_annex testenv "reinject" [tmp, sha1annexedfile] @? "reinject failed" + git_annex testenv "fromkey" [key, sha1annexedfiledup] @? "fromkey failed for dup" + annexed_present sha1annexedfiledup + where + tmp = "tmpfile" + +test_unannex_nocopy :: TestEnv -> Assertion +test_unannex_nocopy testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + git_annex testenv "unannex" [annexedfile] @? "unannex failed with no copy" + annexed_notpresent annexedfile + +test_unannex_withcopy :: TestEnv -> Assertion +test_unannex_withcopy testenv = intmpclonerepo testenv $ do + git_annex testenv "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex testenv "unannex" [annexedfile, sha1annexedfile] @? "unannex failed" + unannexed annexedfile + git_annex testenv "unannex" [annexedfile] @? "unannex failed on non-annexed file" + unannexed annexedfile + unlessM (annexeval Config.isDirect) $ do + git_annex testenv "unannex" [ingitfile] @? "unannex ingitfile should be no-op" + unannexed ingitfile + +test_drop_noremote :: TestEnv -> Assertion +test_drop_noremote testenv = intmpclonerepo testenv $ do + git_annex testenv "get" [annexedfile] @? "get failed" + boolSystem "git" [Params "remote rm origin"] + @? "git remote rm origin failed" + not <$> git_annex testenv "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of file" + annexed_present annexedfile + git_annex testenv "drop" ["--force", annexedfile] @? "drop --force failed" + annexed_notpresent annexedfile + git_annex testenv "drop" [annexedfile] @? "drop of dropped file failed" + unlessM (annexeval Config.isDirect) $ do + git_annex testenv "drop" [ingitfile] @? "drop ingitfile should be no-op" + unannexed ingitfile + +test_drop_withremote :: TestEnv -> Assertion +test_drop_withremote testenv = intmpclonerepo testenv $ do + git_annex testenv "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex testenv "numcopies" ["2"] @? "numcopies config failed" + not <$> git_annex testenv "drop" [annexedfile] @? "drop succeeded although numcopies is not satisfied" + git_annex testenv "numcopies" ["1"] @? "numcopies config failed" + git_annex testenv "drop" [annexedfile] @? "drop failed though origin has copy" + annexed_notpresent annexedfile + inmainrepo testenv $ annexed_present annexedfile + +test_drop_untrustedremote :: TestEnv -> Assertion +test_drop_untrustedremote testenv = intmpclonerepo testenv $ do + git_annex testenv "untrust" ["origin"] @? "untrust of origin failed" + git_annex testenv "get" [annexedfile] @? "get failed" + annexed_present annexedfile + not <$> git_annex testenv "drop" [annexedfile] @? "drop wrongly suceeded with only an untrusted copy of the file" + annexed_present annexedfile + inmainrepo testenv $ annexed_present annexedfile + +test_get :: TestEnv -> Assertion +test_get testenv = intmpclonerepo testenv $ do + inmainrepo testenv $ annexed_present annexedfile + annexed_notpresent annexedfile + git_annex testenv "get" [annexedfile] @? "get of file failed" + inmainrepo testenv $ annexed_present annexedfile + annexed_present annexedfile + git_annex testenv "get" [annexedfile] @? "get of file already here failed" + inmainrepo testenv $ annexed_present annexedfile + annexed_present annexedfile + unlessM (annexeval Config.isDirect) $ do + inmainrepo testenv $ unannexed ingitfile + unannexed ingitfile + git_annex testenv "get" [ingitfile] @? "get ingitfile should be no-op" + inmainrepo testenv $ unannexed ingitfile + unannexed ingitfile + +test_move :: TestEnv -> Assertion +test_move testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + inmainrepo testenv $ annexed_present annexedfile + git_annex testenv "move" ["--from", "origin", annexedfile] @? "move --from of file failed" + annexed_present annexedfile + inmainrepo testenv $ annexed_notpresent annexedfile + git_annex testenv "move" ["--from", "origin", annexedfile] @? "move --from of file already here failed" + annexed_present annexedfile + inmainrepo testenv $ annexed_notpresent annexedfile + git_annex testenv "move" ["--to", "origin", annexedfile] @? "move --to of file failed" + inmainrepo testenv $ annexed_present annexedfile + annexed_notpresent annexedfile + git_annex testenv "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed" + inmainrepo testenv $ annexed_present annexedfile + annexed_notpresent annexedfile + unlessM (annexeval Config.isDirect) $ do + unannexed ingitfile + inmainrepo testenv $ unannexed ingitfile + git_annex testenv "move" ["--to", "origin", ingitfile] @? "move of ingitfile should be no-op" + unannexed ingitfile + inmainrepo testenv $ unannexed ingitfile + git_annex testenv "move" ["--from", "origin", ingitfile] @? "move of ingitfile should be no-op" + unannexed ingitfile + inmainrepo testenv $ unannexed ingitfile + +test_copy :: TestEnv -> Assertion +test_copy testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + inmainrepo testenv $ annexed_present annexedfile + git_annex testenv "copy" ["--from", "origin", annexedfile] @? "copy --from of file failed" + annexed_present annexedfile + inmainrepo testenv $ annexed_present annexedfile + git_annex testenv "copy" ["--from", "origin", annexedfile] @? "copy --from of file already here failed" + annexed_present annexedfile + inmainrepo testenv $ annexed_present annexedfile + git_annex testenv "copy" ["--to", "origin", annexedfile] @? "copy --to of file already there failed" + annexed_present annexedfile + inmainrepo testenv $ annexed_present annexedfile + git_annex testenv "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed" + annexed_notpresent annexedfile + inmainrepo testenv $ annexed_present annexedfile + unlessM (annexeval Config.isDirect) $ do + unannexed ingitfile + inmainrepo testenv $ unannexed ingitfile + git_annex testenv "copy" ["--to", "origin", ingitfile] @? "copy of ingitfile should be no-op" + unannexed ingitfile + inmainrepo testenv $ unannexed ingitfile + git_annex testenv "copy" ["--from", "origin", ingitfile] @? "copy of ingitfile should be no-op" + checkregularfile ingitfile + checkcontent ingitfile + +test_preferred_content :: TestEnv -> Assertion +test_preferred_content testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + -- get --auto only looks at numcopies when preferred content is not + -- set, and with 1 copy existing, does not get the file. + git_annex testenv "get" ["--auto", annexedfile] @? "get --auto of file failed with default preferred content" + annexed_notpresent annexedfile + + git_annex testenv "wanted" [".", "standard"] @? "set expression to standard failed" + git_annex testenv "group" [".", "client"] @? "set group to standard failed" + git_annex testenv "get" ["--auto", annexedfile] @? "get --auto of file failed for client" + annexed_present annexedfile + git_annex testenv "ungroup" [".", "client"] @? "ungroup failed" + + git_annex testenv "wanted" [".", "standard"] @? "set expression to standard failed" + git_annex testenv "group" [".", "manual"] @? "set group to manual failed" + -- drop --auto with manual leaves the file where it is + git_annex testenv "drop" ["--auto", annexedfile] @? "drop --auto of file failed with manual preferred content" + annexed_present annexedfile + git_annex testenv "drop" [annexedfile] @? "drop of file failed" + annexed_notpresent annexedfile + -- get --auto with manual does not get the file + git_annex testenv "get" ["--auto", annexedfile] @? "get --auto of file failed with manual preferred content" + annexed_notpresent annexedfile + git_annex testenv "ungroup" [".", "client"] @? "ungroup failed" + + git_annex testenv "wanted" [".", "exclude=*"] @? "set expression to exclude=* failed" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "drop" ["--auto", annexedfile] @? "drop --auto of file failed with exclude=*" + annexed_notpresent annexedfile + git_annex testenv "get" ["--auto", annexedfile] @? "get --auto of file failed with exclude=*" + annexed_notpresent annexedfile + +test_lock :: TestEnv -> Assertion +test_lock testenv = intmpclonerepoInDirect testenv $ do + -- regression test: unlock of not present file should skip it + annexed_notpresent annexedfile + not <$> git_annex testenv "unlock" [annexedfile] @? "unlock failed to fail with not present file" + annexed_notpresent annexedfile + + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "unlock" [annexedfile] @? "unlock failed" + unannexed annexedfile + -- write different content, to verify that lock + -- throws it away + changecontent annexedfile + writeFile annexedfile $ content annexedfile ++ "foo" + not <$> git_annex testenv "lock" [annexedfile] @? "lock failed to fail without --force" + git_annex testenv "lock" ["--force", annexedfile] @? "lock --force failed" + annexed_present annexedfile + git_annex testenv "unlock" [annexedfile] @? "unlock failed" + unannexed annexedfile + changecontent annexedfile + git_annex testenv "add" [annexedfile] @? "add of modified file failed" + runchecks [checklink, checkunwritable] annexedfile + c <- readFile annexedfile + assertEqual "content of modified file" c (changedcontent annexedfile) + r' <- git_annex testenv "drop" [annexedfile] + not r' @? "drop wrongly succeeded with no known copy of modified file" + +test_edit :: TestEnv -> Assertion +test_edit = test_edit' False + +test_edit_precommit :: TestEnv -> Assertion +test_edit_precommit = test_edit' True + +test_edit' :: Bool -> TestEnv -> Assertion +test_edit' precommit testenv = intmpclonerepoInDirect testenv $ do + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "edit" [annexedfile] @? "edit failed" + unannexed annexedfile + changecontent annexedfile + boolSystem "git" [Param "add", File annexedfile] + @? "git add of edited file failed" + if precommit + then git_annex testenv "pre-commit" [] + @? "pre-commit failed" + else boolSystem "git" [Params "commit -q -m contentchanged"] + @? "git commit of edited file failed" + runchecks [checklink, checkunwritable] annexedfile + c <- readFile annexedfile + assertEqual "content of modified file" c (changedcontent annexedfile) + not <$> git_annex testenv "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of modified file" + +test_fix :: TestEnv -> Assertion +test_fix testenv = intmpclonerepoInDirect testenv $ do + annexed_notpresent annexedfile + git_annex testenv "fix" [annexedfile] @? "fix of not present failed" + annexed_notpresent annexedfile + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "fix" [annexedfile] @? "fix of present file failed" + annexed_present annexedfile + createDirectory subdir + boolSystem "git" [Param "mv", File annexedfile, File subdir] + @? "git mv failed" + git_annex testenv "fix" [newfile] @? "fix of moved file failed" + runchecks [checklink, checkunwritable] newfile + c <- readFile newfile + assertEqual "content of moved file" c (content annexedfile) + where + subdir = "s" + newfile = subdir ++ "/" ++ annexedfile + +test_trust :: TestEnv -> Assertion +test_trust testenv = intmpclonerepo testenv $ do + git_annex testenv "trust" [repo] @? "trust failed" + trustcheck Logs.Trust.Trusted "trusted 1" + git_annex testenv "trust" [repo] @? "trust of trusted failed" + trustcheck Logs.Trust.Trusted "trusted 2" + git_annex testenv "untrust" [repo] @? "untrust failed" + trustcheck Logs.Trust.UnTrusted "untrusted 1" + git_annex testenv "untrust" [repo] @? "untrust of untrusted failed" + trustcheck Logs.Trust.UnTrusted "untrusted 2" + git_annex testenv "dead" [repo] @? "dead failed" + trustcheck Logs.Trust.DeadTrusted "deadtrusted 1" + git_annex testenv "dead" [repo] @? "dead of dead failed" + trustcheck Logs.Trust.DeadTrusted "deadtrusted 2" + git_annex testenv "semitrust" [repo] @? "semitrust failed" + trustcheck Logs.Trust.SemiTrusted "semitrusted 1" + git_annex testenv "semitrust" [repo] @? "semitrust of semitrusted failed" + trustcheck Logs.Trust.SemiTrusted "semitrusted 2" + where + repo = "origin" + trustcheck expected msg = do + present <- annexeval $ do + l <- Logs.Trust.trustGet expected + u <- Remote.nameToUUID repo + return $ u `elem` l + assertBool msg present + +test_fsck_basic :: TestEnv -> Assertion +test_fsck_basic testenv = intmpclonerepo testenv $ do + git_annex testenv "fsck" [] @? "fsck failed" + git_annex testenv "numcopies" ["2"] @? "numcopies config failed" + fsck_should_fail testenv "numcopies unsatisfied" + git_annex testenv "numcopies" ["1"] @? "numcopies config failed" + corrupt annexedfile + corrupt sha1annexedfile + where + corrupt f = do + git_annex testenv "get" [f] @? "get of file failed" + Utility.FileMode.allowWrite f + writeFile f (changedcontent f) + ifM (annexeval Config.isDirect) + ( git_annex testenv "fsck" [] @? "fsck failed in direct mode with changed file content" + , not <$> git_annex testenv "fsck" [] @? "fsck failed to fail with corrupted file content" + ) + git_annex testenv "fsck" [] @? "fsck unexpectedly failed again; previous one did not fix problem with " ++ f + +test_fsck_bare :: TestEnv -> Assertion +test_fsck_bare testenv = intmpbareclonerepo testenv $ + git_annex testenv "fsck" [] @? "fsck failed" + +test_fsck_localuntrusted :: TestEnv -> Assertion +test_fsck_localuntrusted testenv = intmpclonerepo testenv $ do + git_annex testenv "get" [annexedfile] @? "get failed" + git_annex testenv "untrust" ["origin"] @? "untrust of origin repo failed" + git_annex testenv "untrust" ["."] @? "untrust of current repo failed" + fsck_should_fail testenv "content only available in untrusted (current) repository" + git_annex testenv "trust" ["."] @? "trust of current repo failed" + git_annex testenv "fsck" [annexedfile] @? "fsck failed on file present in trusted repo" + +test_fsck_remoteuntrusted :: TestEnv -> Assertion +test_fsck_remoteuntrusted testenv = intmpclonerepo testenv $ do + git_annex testenv "numcopies" ["2"] @? "numcopies config failed" + git_annex testenv "get" [annexedfile] @? "get failed" + git_annex testenv "get" [sha1annexedfile] @? "get failed" + git_annex testenv "fsck" [] @? "fsck failed with numcopies=2 and 2 copies" + git_annex testenv "untrust" ["origin"] @? "untrust of origin failed" + fsck_should_fail testenv "content not replicated to enough non-untrusted repositories" + +fsck_should_fail :: TestEnv -> String -> Assertion +fsck_should_fail testenv m = not <$> git_annex testenv "fsck" [] + @? "fsck failed to fail with " ++ m + +test_migrate :: TestEnv -> Assertion +test_migrate = test_migrate' False + +test_migrate_via_gitattributes :: TestEnv -> Assertion +test_migrate_via_gitattributes = test_migrate' True + +test_migrate' :: Bool -> TestEnv -> Assertion +test_migrate' usegitattributes testenv = intmpclonerepoInDirect testenv $ do + annexed_notpresent annexedfile + annexed_notpresent sha1annexedfile + git_annex testenv "migrate" [annexedfile] @? "migrate of not present failed" + git_annex testenv "migrate" [sha1annexedfile] @? "migrate of not present failed" + git_annex testenv "get" [annexedfile] @? "get of file failed" + git_annex testenv "get" [sha1annexedfile] @? "get of file failed" + annexed_present annexedfile + annexed_present sha1annexedfile + if usegitattributes + then do + writeFile ".gitattributes" "* annex.backend=SHA1" + git_annex testenv "migrate" [sha1annexedfile] + @? "migrate sha1annexedfile failed" + git_annex testenv "migrate" [annexedfile] + @? "migrate annexedfile failed" + else do + git_annex testenv "migrate" [sha1annexedfile, "--backend", "SHA1"] + @? "migrate sha1annexedfile failed" + git_annex testenv "migrate" [annexedfile, "--backend", "SHA1"] + @? "migrate annexedfile failed" + annexed_present annexedfile + annexed_present sha1annexedfile + checkbackend annexedfile backendSHA1 + checkbackend sha1annexedfile backendSHA1 + + -- check that reversing a migration works + writeFile ".gitattributes" "* annex.backend=SHA256" + git_annex testenv "migrate" [sha1annexedfile] + @? "migrate sha1annexedfile failed" + git_annex testenv "migrate" [annexedfile] + @? "migrate annexedfile failed" + annexed_present annexedfile + annexed_present sha1annexedfile + checkbackend annexedfile backendSHA256 + checkbackend sha1annexedfile backendSHA256 + +test_unused :: TestEnv -> Assertion +-- This test is broken in direct mode +test_unused testenv = intmpclonerepoInDirect testenv $ do + -- keys have to be looked up before files are removed + annexedfilekey <- annexeval $ findkey annexedfile + sha1annexedfilekey <- annexeval $ findkey sha1annexedfile + git_annex testenv "get" [annexedfile] @? "get of file failed" + git_annex testenv "get" [sha1annexedfile] @? "get of file failed" + checkunused [] "after get" + boolSystem "git" [Params "rm -fq", File annexedfile] @? "git rm failed" + checkunused [] "after rm" + boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed" + checkunused [] "after commit" + -- unused checks origin/master; once it's gone it is really unused + boolSystem "git" [Params "remote rm origin"] @? "git remote rm origin failed" + checkunused [annexedfilekey] "after origin branches are gone" + boolSystem "git" [Params "rm -fq", File sha1annexedfile] @? "git rm failed" + boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed" + checkunused [annexedfilekey, sha1annexedfilekey] "after rm sha1annexedfile" + + -- good opportunity to test dropkey also + git_annex testenv "dropkey" ["--force", Types.Key.key2file annexedfilekey] + @? "dropkey failed" + checkunused [sha1annexedfilekey] ("after dropkey --force " ++ Types.Key.key2file annexedfilekey) + + not <$> git_annex testenv "dropunused" ["1"] @? "dropunused failed to fail without --force" + git_annex testenv "dropunused" ["--force", "1"] @? "dropunused failed" + checkunused [] "after dropunused" + not <$> git_annex testenv "dropunused" ["--force", "10", "501"] @? "dropunused failed to fail on bogus numbers" + + -- unused used to miss symlinks that were not staged and pointed + -- at annexed content, and think that content was unused + writeFile "unusedfile" "unusedcontent" + git_annex testenv "add" ["unusedfile"] @? "add of unusedfile failed" + unusedfilekey <- annexeval $ findkey "unusedfile" + renameFile "unusedfile" "unusedunstagedfile" + boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed" + checkunused [] "with unstaged link" + removeFile "unusedunstagedfile" + checkunused [unusedfilekey] "with unstaged link deleted" + + -- unused used to miss symlinks that were deleted or modified + -- manually, but commited as such. + writeFile "unusedfile" "unusedcontent" + git_annex testenv "add" ["unusedfile"] @? "add of unusedfile failed" + boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed" + unusedfilekey' <- annexeval $ findkey "unusedfile" + checkunused [] "with staged deleted link" + boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed" + checkunused [unusedfilekey'] "with staged link deleted" + + -- unused used to miss symlinks that were deleted or modified + -- manually, but not staged as such. + writeFile "unusedfile" "unusedcontent" + git_annex testenv "add" ["unusedfile"] @? "add of unusedfile failed" + boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed" + unusedfilekey'' <- annexeval $ findkey "unusedfile" + checkunused [] "with unstaged deleted link" + removeFile "unusedfile" + checkunused [unusedfilekey''] "with unstaged link deleted" + + where + checkunused expectedkeys desc = do + git_annex testenv "unused" [] @? "unused failed" + unusedmap <- annexeval $ Logs.Unused.readUnusedMap "" + let unusedkeys = M.elems unusedmap + assertEqual ("unused keys differ " ++ desc) + (sort expectedkeys) (sort unusedkeys) + findkey f = do + r <- Backend.lookupFile f + return $ fromJust r + +test_describe :: TestEnv -> Assertion +test_describe testenv = intmpclonerepo testenv $ do + git_annex testenv "describe" [".", "this repo"] @? "describe 1 failed" + git_annex testenv "describe" ["origin", "origin repo"] @? "describe 2 failed" + +test_find :: TestEnv -> Assertion +test_find testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + git_annex_expectoutput testenv "find" [] [] + git_annex testenv "get" [annexedfile] @? "get failed" + annexed_present annexedfile + annexed_notpresent sha1annexedfile + git_annex_expectoutput testenv "find" [] [annexedfile] + git_annex_expectoutput testenv "find" ["--exclude", annexedfile, "--and", "--exclude", sha1annexedfile] [] + git_annex_expectoutput testenv "find" ["--include", annexedfile] [annexedfile] + git_annex_expectoutput testenv "find" ["--not", "--in", "origin"] [] + git_annex_expectoutput testenv "find" ["--copies", "1", "--and", "--not", "--copies", "2"] [sha1annexedfile] + git_annex_expectoutput testenv "find" ["--inbackend", "SHA1"] [sha1annexedfile] + git_annex_expectoutput testenv "find" ["--inbackend", "WORM"] [] + + {- --include=* should match files in subdirectories too, + - and --exclude=* should exclude them. -} + createDirectory "dir" + writeFile "dir/subfile" "subfile" + git_annex testenv "add" ["dir"] @? "add of subdir failed" + git_annex_expectoutput testenv "find" ["--include", "*", "--exclude", annexedfile, "--exclude", sha1annexedfile] ["dir/subfile"] + git_annex_expectoutput testenv "find" ["--exclude", "*"] [] + +test_merge :: TestEnv -> Assertion +test_merge testenv = intmpclonerepo testenv $ + git_annex testenv "merge" [] @? "merge failed" + +test_info :: TestEnv -> Assertion +test_info testenv = intmpclonerepo testenv $ do + json <- git_annex_output testenv "info" ["--json"] + case Text.JSON.decodeStrict json :: Text.JSON.Result (Text.JSON.JSObject Text.JSON.JSValue) of + Text.JSON.Ok _ -> return () + Text.JSON.Error e -> assertFailure e + +test_version :: TestEnv -> Assertion +test_version testenv = intmpclonerepo testenv $ + git_annex testenv "version" [] @? "version failed" + +test_sync :: TestEnv -> Assertion +test_sync testenv = intmpclonerepo testenv $ do + git_annex testenv "sync" [] @? "sync failed" + {- Regression test for bug fixed in + - 7b0970b340d7faeb745c666146c7f701ec71808f, where in direct mode + - sync committed the symlink standin file to the annex. -} + git_annex_expectoutput testenv "find" ["--in", "."] [] + +{- Regression test for union merge bug fixed in + - 0214e0fb175a608a49b812d81b4632c081f63027 -} +test_union_merge_regression :: TestEnv -> Assertion +test_union_merge_regression testenv = + {- We need 3 repos to see this bug. -} + withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> + withtmpclonerepo testenv False $ \r3 -> do + forM_ [r1, r2, r3] $ \r -> indir testenv r $ do + when (r /= r1) $ + boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add" + when (r /= r2) $ + boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add" + when (r /= r3) $ + boolSystem "git" [Params "remote add r3", File ("../../" ++ r3)] @? "remote add" + git_annex testenv "get" [annexedfile] @? "get failed" + boolSystem "git" [Params "remote rm origin"] @? "remote rm" + forM_ [r3, r2, r1] $ \r -> indir testenv r $ + git_annex testenv "sync" [] @? "sync failed" + forM_ [r3, r2] $ \r -> indir testenv r $ + git_annex testenv "drop" ["--force", annexedfile] @? "drop failed" + indir testenv r1 $ do + git_annex testenv "sync" [] @? "sync failed in r1" + git_annex_expectoutput testenv "find" ["--in", "r3"] [] + {- This was the bug. The sync + - mangled location log data and it + - thought the file was still in r2 -} + git_annex_expectoutput testenv "find" ["--in", "r2"] [] + +{- Regression test for the automatic conflict resolution bug fixed + - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -} +test_conflict_resolution_movein_regression :: TestEnv -> Assertion +test_conflict_resolution_movein_regression testenv = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + let rname r = if r == r1 then "r1" else "r2" + forM_ [r1, r2] $ \r -> indir testenv r $ do + {- Get all files, see check below. -} + git_annex testenv "get" [] @? "get failed" + disconnectOrigin + pair testenv r1 r2 + forM_ [r1, r2] $ \r -> indir testenv r $ do + {- Set up a conflict. -} + let newcontent = content annexedfile ++ rname r + ifM (annexeval Config.isDirect) + ( writeFile annexedfile newcontent + , do + git_annex testenv "unlock" [annexedfile] @? "unlock failed" + writeFile annexedfile newcontent + ) + {- Sync twice in r1 so it gets the conflict resolution + - update from r2 -} + forM_ [r1, r2, r1] $ \r -> indir testenv r $ + git_annex testenv "sync" ["--force"] @? "sync failed in " ++ rname r + {- After the sync, it should be possible to get all + - files. This includes both sides of the conflict, + - although the filenames are not easily predictable. + - + - The bug caused, in direct mode, one repo to + - be missing the content of the file that had + - been put in it. -} + forM_ [r1, r2] $ \r -> indir testenv r $ do + git_annex testenv "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r + +{- Simple case of conflict resolution; 2 different versions of annexed + - file. -} +test_conflict_resolution :: TestEnv -> Assertion +test_conflict_resolution testenv = + withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + indir testenv r1 $ do + disconnectOrigin + writeFile conflictor "conflictor1" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ do + disconnectOrigin + writeFile conflictor "conflictor2" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r2" + pair testenv r1 r2 + forM_ [r1,r2,r1] $ \r -> indir testenv r $ + git_annex testenv "sync" [] @? "sync failed" + checkmerge "r1" r1 + checkmerge "r2" r2 + where + conflictor = "conflictor" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + length v == 2 + @? (what ++ " not exactly 2 variant files in: " ++ show l) + conflictor `notElem` l @? ("conflictor still present after conflict resolution") + indir testenv d $ do + git_annex testenv "get" v @? "get failed" + git_annex_expectoutput testenv "find" v v + + +{- Check merge conflict resolution when one side is an annexed + - file, and the other is a directory. -} +test_mixed_conflict_resolution :: TestEnv -> Assertion +test_mixed_conflict_resolution testenv = do + check True + check False + where + check inr1 = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + indir testenv r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ do + disconnectOrigin + createDirectory conflictor + writeFile subfile "subfile" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r2" + pair testenv r1 r2 + let l = if inr1 then [r1, r2] else [r2, r1] + forM_ l $ \r -> indir testenv r $ + git_annex testenv "sync" [] @? "sync failed in mixed conflict" + checkmerge "r1" r1 + checkmerge "r2" r2 + conflictor = "conflictor" + subfile = conflictor "subfile" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + doesDirectoryExist (d conflictor) @? (d ++ " conflictor directory missing") + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + indir testenv d $ do + git_annex testenv "get" (conflictor:v) @? ("get failed in " ++ what) + git_annex_expectoutput testenv "find" [conflictor] [Git.FilePath.toInternalGitPath subfile] + git_annex_expectoutput testenv "find" v v + +{- Check merge conflict resolution when both repos start with an annexed + - file; one modifies it, and the other deletes it. -} +test_remove_conflict_resolution :: TestEnv -> Assertion +test_remove_conflict_resolution testenv = do + check True + check False + where + check inr1 = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + indir testenv r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ + disconnectOrigin + pair testenv r1 r2 + indir testenv r2 $ do + git_annex testenv "sync" [] @? "sync failed in r2" + git_annex testenv "get" [conflictor] + @? "get conflictor failed" + unlessM (annexeval Config.isDirect) $ do + git_annex testenv "unlock" [conflictor] + @? "unlock conflictor failed" + writeFile conflictor "newconflictor" + indir testenv r1 $ + nukeFile conflictor + let l = if inr1 then [r1, r2, r1] else [r2, r1, r2] + forM_ l $ \r -> indir testenv r $ + git_annex testenv "sync" [] @? "sync failed" + checkmerge "r1" r1 + checkmerge "r2" r2 + conflictor = "conflictor" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + + {- Check merge confalict resolution when a file is annexed in one repo, + - and checked directly into git in the other repo. + - + - This test requires indirect mode to set it up, but tests both direct and + - indirect mode. + -} +test_nonannexed_file_conflict_resolution :: TestEnv -> Assertion +test_nonannexed_file_conflict_resolution testenv = do + check True False + check False False + check True True + check False True + where + check inr1 switchdirect = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + whenM (isInDirect r1 <&&> isInDirect r2) $ do + indir testenv r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ do + disconnectOrigin + writeFile conflictor nonannexed_content + boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed" + git_annex testenv "sync" [] @? "sync failed in r2" + pair testenv r1 r2 + let l = if inr1 then [r1, r2] else [r2, r1] + forM_ l $ \r -> indir testenv r $ do + when switchdirect $ + git_annex testenv "direct" [] @? "failed switching to direct mode" + git_annex testenv "sync" [] @? "sync failed" + checkmerge ("r1" ++ show switchdirect) r1 + checkmerge ("r2" ++ show switchdirect) r2 + conflictor = "conflictor" + nonannexed_content = "nonannexed" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + conflictor `elem` l @? (what ++ " conflictor file missing in: " ++ show l) + s <- catchMaybeIO (readFile (d conflictor)) + s == Just nonannexed_content + @? (what ++ " wrong content for nonannexed file: " ++ show s) + + +{- Check merge confalict resolution when a file is annexed in one repo, + - and is a non-git-annex symlink in the other repo. + - + - Test can only run when coreSymlinks is supported, because git needs to + - be able to check out the non-git-annex symlink. + -} +test_nonannexed_symlink_conflict_resolution :: TestEnv -> Assertion +test_nonannexed_symlink_conflict_resolution testenv = do + check True False + check False False + check True True + check False True + where + check inr1 switchdirect = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + whenM (checkRepo (Types.coreSymlinks <$> Annex.getGitConfig) r1 + <&&> isInDirect r1 <&&> isInDirect r2) $ do + indir testenv r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ do + disconnectOrigin + createSymbolicLink symlinktarget "conflictor" + boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed" + git_annex testenv "sync" [] @? "sync failed in r2" + pair testenv r1 r2 + let l = if inr1 then [r1, r2] else [r2, r1] + forM_ l $ \r -> indir testenv r $ do + when switchdirect $ + git_annex testenv "direct" [] @? "failed switching to direct mode" + git_annex testenv "sync" [] @? "sync failed" + checkmerge ("r1" ++ show switchdirect) r1 + checkmerge ("r2" ++ show switchdirect) r2 + conflictor = "conflictor" + symlinktarget = "dummy-target" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + conflictor `elem` l @? (what ++ " conflictor file missing in: " ++ show l) + s <- catchMaybeIO (readSymbolicLink (d conflictor)) + s == Just symlinktarget + @? (what ++ " wrong target for nonannexed symlink: " ++ show s) + +{- Check merge conflict resolution when there is a local file, + - that is not staged or committed, that conflicts with what's being added + - from the remmote. + - + - Case 1: Remote adds file named conflictor; local has a file named + - conflictor. + - + - Case 2: Remote adds conflictor/file; local has a file named conflictor. + -} +test_uncommitted_conflict_resolution :: TestEnv -> Assertion +test_uncommitted_conflict_resolution testenv = do + check conflictor + check (conflictor "file") + where + check remoteconflictor = withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + indir testenv r1 $ do + disconnectOrigin + createDirectoryIfMissing True (parentDir remoteconflictor) + writeFile remoteconflictor annexedcontent + git_annex testenv "add" [conflictor] @? "add remoteconflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + indir testenv r2 $ do + disconnectOrigin + writeFile conflictor localcontent + pair testenv r1 r2 + indir testenv r2 $ ifM (annexeval Config.isDirect) + ( do + git_annex testenv "sync" [] @? "sync failed" + let local = conflictor ++ localprefix + doesFileExist local @? (local ++ " missing after merge") + s <- readFile local + s == localcontent @? (local ++ " has wrong content: " ++ s) + git_annex testenv "get" [conflictor] @? "get failed" + doesFileExist remoteconflictor @? (remoteconflictor ++ " missing after merge") + s' <- readFile remoteconflictor + s' == annexedcontent @? (remoteconflictor ++ " has wrong content: " ++ s) + -- this case is intentionally not handled + -- in indirect mode, since the user + -- can recover on their own easily + , not <$> git_annex testenv "sync" [] @? "sync failed to fail" + ) + conflictor = "conflictor" + localprefix = ".variant-local" + localcontent = "local" + annexedcontent = "annexed" + +{- On Windows/FAT, repeated conflict resolution sometimes + - lost track of whether a file was a symlink. + -} +test_conflict_resolution_symlink_bit :: TestEnv -> Assertion +test_conflict_resolution_symlink_bit testenv = do + withtmpclonerepo testenv False $ \r1 -> + withtmpclonerepo testenv False $ \r2 -> do + withtmpclonerepo testenv False $ \r3 -> do + indir testenv r1 $ do + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + check_is_link conflictor "r1" + indir testenv r2 $ do + createDirectory conflictor + writeFile (conflictor "subfile") "subfile" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r2" + check_is_link (conflictor "subfile") "r2" + indir testenv r3 $ do + writeFile conflictor "conflictor" + git_annex testenv "add" [conflictor] @? "add conflicter failed" + git_annex testenv "sync" [] @? "sync failed in r1" + check_is_link (conflictor "subfile") "r3" + where + conflictor = "conflictor" + check_is_link f what = do + git_annex_expectoutput testenv "find" ["--include=*", f] [Git.FilePath.toInternalGitPath f] + l <- annexeval $ Annex.inRepo $ Git.LsTree.lsTreeFiles Git.Ref.headRef [f] + all (\i -> Git.Types.toBlobType (Git.LsTree.mode i) == Just Git.Types.SymlinkBlob) l + @? (what ++ " " ++ f ++ " lost symlink bit after merge: " ++ show l) + +{- Set up repos as remotes of each other. -} +pair :: TestEnv -> FilePath -> FilePath -> Assertion +pair testenv r1 r2 = forM_ [r1, r2] $ \r -> indir testenv r $ do + when (r /= r1) $ + boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add" + when (r /= r2) $ + boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add" + +test_map :: TestEnv -> Assertion +test_map testenv = intmpclonerepo testenv $ do + -- set descriptions, that will be looked for in the map + git_annex testenv "describe" [".", "this repo"] @? "describe 1 failed" + git_annex testenv "describe" ["origin", "origin repo"] @? "describe 2 failed" + -- --fast avoids it running graphviz, not a build dependency + git_annex testenv "map" ["--fast"] @? "map failed" + +test_uninit :: TestEnv -> Assertion +test_uninit testenv = intmpclonerepo testenv $ do + git_annex testenv "get" [] @? "get failed" + annexed_present annexedfile + _ <- git_annex testenv "uninit" [] -- exit status not checked; does abnormal exit + checkregularfile annexedfile + doesDirectoryExist ".git" @? ".git vanished in uninit" + +test_uninit_inbranch :: TestEnv -> Assertion +test_uninit_inbranch testenv = intmpclonerepoInDirect testenv $ do + boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex" + not <$> git_annex testenv "uninit" [] @? "uninit failed to fail when git-annex branch was checked out" + +test_upgrade :: TestEnv -> Assertion +test_upgrade testenv = intmpclonerepo testenv $ do + git_annex testenv "upgrade" [] @? "upgrade from same version failed" + +test_whereis :: TestEnv -> Assertion +test_whereis testenv = intmpclonerepo testenv $ do + annexed_notpresent annexedfile + git_annex testenv "whereis" [annexedfile] @? "whereis on non-present file failed" + git_annex testenv "untrust" ["origin"] @? "untrust failed" + not <$> git_annex testenv "whereis" [annexedfile] @? "whereis on non-present file only present in untrusted repo failed to fail" + git_annex testenv "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex testenv "whereis" [annexedfile] @? "whereis on present file failed" + +test_hook_remote :: TestEnv -> Assertion +test_hook_remote testenv = intmpclonerepo testenv $ do +#ifndef mingw32_HOST_OS + git_annex testenv "initremote" (words "foo type=hook encryption=none hooktype=foo") @? "initremote failed" + createDirectory dir + git_config "annex.foo-store-hook" $ + "cp $ANNEX_FILE " ++ loc + git_config "annex.foo-retrieve-hook" $ + "cp " ++ loc ++ " $ANNEX_FILE" + git_config "annex.foo-remove-hook" $ + "rm -f " ++ loc + git_config "annex.foo-checkpresent-hook" $ + "if [ -e " ++ loc ++ " ]; then echo $ANNEX_KEY; fi" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "copy" [annexedfile, "--to", "foo"] @? "copy --to hook remote failed" + annexed_present annexedfile + git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex testenv "move" [annexedfile, "--from", "foo"] @? "move --from hook remote failed" + annexed_present annexedfile + not <$> git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + where + dir = "dir" + loc = dir ++ "/$ANNEX_KEY" + git_config k v = boolSystem "git" [Param "config", Param k, Param v] + @? "git config failed" +#else + -- this test doesn't work in Windows TODO + noop +#endif + +test_directory_remote :: TestEnv -> Assertion +test_directory_remote testenv = intmpclonerepo testenv $ do + createDirectory "dir" + git_annex testenv "initremote" (words "foo type=directory encryption=none directory=dir") @? "initremote failed" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "copy" [annexedfile, "--to", "foo"] @? "copy --to directory remote failed" + annexed_present annexedfile + git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex testenv "move" [annexedfile, "--from", "foo"] @? "move --from directory remote failed" + annexed_present annexedfile + not <$> git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + +test_rsync_remote :: TestEnv -> Assertion +test_rsync_remote testenv = intmpclonerepo testenv $ do +#ifndef mingw32_HOST_OS + createDirectory "dir" + git_annex testenv "initremote" (words "foo type=rsync encryption=none rsyncurl=dir") @? "initremote failed" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "copy" [annexedfile, "--to", "foo"] @? "copy --to rsync remote failed" + annexed_present annexedfile + git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex testenv "move" [annexedfile, "--from", "foo"] @? "move --from rsync remote failed" + annexed_present annexedfile + not <$> git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile +#else + -- Rsync remotes with a rsyncurl of a directory do not currently + -- work on Windows. + noop +#endif + +test_bup_remote :: TestEnv -> Assertion +test_bup_remote testenv = intmpclonerepo testenv $ when Build.SysConfig.bup $ do + dir <- absPath "dir" -- bup special remote needs an absolute path + createDirectory dir + git_annex testenv "initremote" (words $ "foo type=bup encryption=none buprepo="++dir) @? "initremote failed" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "copy" [annexedfile, "--to", "foo"] @? "copy --to bup remote failed" + annexed_present annexedfile + git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex testenv "copy" [annexedfile, "--from", "foo"] @? "copy --from bup remote failed" + annexed_present annexedfile + not <$> git_annex testenv "move" [annexedfile, "--from", "foo"] @? "move --from bup remote failed to fail" + annexed_present annexedfile + +-- gpg is not a build dependency, so only test when it's available +test_crypto :: TestEnv -> Assertion +#ifndef mingw32_HOST_OS +test_crypto testenv = do + testscheme "shared" + testscheme "hybrid" + testscheme "pubkey" + where + testscheme scheme = intmpclonerepo testenv $ whenM (Utility.Path.inPath Utility.Gpg.gpgcmd) $ do + Utility.Gpg.testTestHarness @? "test harness self-test failed" + Utility.Gpg.testHarness $ do + createDirectory "dir" + let a cmd = git_annex testenv cmd $ + [ "foo" + , "type=directory" + , "encryption=" ++ scheme + , "directory=dir" + , "highRandomQuality=false" + ] ++ if scheme `elem` ["hybrid","pubkey"] + then ["keyid=" ++ Utility.Gpg.testKeyId] + else [] + a "initremote" @? "initremote failed" + not <$> a "initremote" @? "initremote failed to fail when run twice in a row" + a "enableremote" @? "enableremote failed" + a "enableremote" @? "enableremote failed when run twice in a row" + git_annex testenv "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex testenv "copy" [annexedfile, "--to", "foo"] @? "copy --to encrypted remote failed" + (c,k) <- annexeval $ do + uuid <- Remote.nameToUUID "foo" + rs <- Logs.Remote.readRemoteLog + Just k <- Backend.lookupFile annexedfile + return (fromJust $ M.lookup uuid rs, k) + let key = if scheme `elem` ["hybrid","pubkey"] + then Just $ Utility.Gpg.KeyIds [Utility.Gpg.testKeyId] + else Nothing + testEncryptedRemote scheme key c [k] @? "invalid crypto setup" + + annexed_present annexedfile + git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex testenv "move" [annexedfile, "--from", "foo"] @? "move --from encrypted remote failed" + annexed_present annexedfile + not <$> git_annex testenv "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + {- Ensure the configuration complies with the encryption scheme, and + - that all keys are encrypted properly for the given directory remote. -} + testEncryptedRemote scheme ks c keys = case Remote.Helper.Encryptable.extractCipher c of + Just cip@Crypto.SharedCipher{} | scheme == "shared" && isNothing ks -> + checkKeys cip Nothing + Just cip@(Crypto.EncryptedCipher encipher v ks') + | checkScheme v && keysMatch ks' -> + checkKeys cip (Just v) <&&> checkCipher encipher ks' + _ -> return False + where + keysMatch (Utility.Gpg.KeyIds ks') = + maybe False (\(Utility.Gpg.KeyIds ks2) -> + sort (nub ks2) == sort (nub ks')) ks + checkCipher encipher = Utility.Gpg.checkEncryptionStream encipher . Just + checkScheme Types.Crypto.Hybrid = scheme == "hybrid" + checkScheme Types.Crypto.PubKey = scheme == "pubkey" + checkKeys cip mvariant = do + cipher <- Crypto.decryptCipher cip + files <- filterM doesFileExist $ + map ("dir" ) $ concatMap (key2files cipher) keys + return (not $ null files) <&&> allM (checkFile mvariant) files + checkFile mvariant filename = + Utility.Gpg.checkEncryptionFile filename $ + if mvariant == Just Types.Crypto.PubKey then ks else Nothing + key2files cipher = Locations.keyPaths . + Crypto.encryptKey Types.Crypto.HmacSha1 cipher +#else +test_crypto _env = putStrLn "gpg testing not implemented on Windows" +#endif + +test_add_subdirs :: TestEnv -> Assertion +test_add_subdirs testenv = intmpclonerepo testenv $ do + createDirectory "dir" + writeFile ("dir" "foo") $ "dir/" ++ content annexedfile + git_annex testenv "add" ["dir"] @? "add of subdir failed" + + {- Regression test for Windows bug where symlinks were not + - calculated correctly for files in subdirs. -} + git_annex testenv "sync" [] @? "sync failed" + l <- annexeval $ decodeBS <$> Annex.CatFile.catObject (Git.Types.Ref "HEAD:dir/foo") + "../.git/annex/" `isPrefixOf` l @? ("symlink from subdir to .git/annex is wrong: " ++ l) + + createDirectory "dir2" + writeFile ("dir2" "foo") $ content annexedfile + setCurrentDirectory "dir" + git_annex testenv "add" [".." "dir2"] @? "add of ../subdir failed" + +-- This is equivilant to running git-annex, but it's all run in-process +-- (when the OS allows) so test coverage collection works. +git_annex :: TestEnv -> String -> [String] -> IO Bool +git_annex testenv command params = do +#ifndef mingw32_HOST_OS + forM_ (M.toList testenv) $ \(var, val) -> + Utility.Env.setEnv var val True + + -- catch all errors, including normally fatal errors + r <- try run::IO (Either SomeException ()) + case r of + Right _ -> return True + Left _ -> return False + where + run = GitAnnex.run (command:"-q":params) +#else + Utility.SafeCommand.boolSystemEnv "git-annex" + (map Param $ command : params) + (Just $ M.toList testenv) +#endif + +{- Runs git-annex and returns its output. -} +git_annex_output :: TestEnv -> String -> [String] -> IO String +git_annex_output testenv command params = do + got <- Utility.Process.readProcessEnv "git-annex" (command:params) + (Just $ M.toList testenv) + -- XXX since the above is a separate process, code coverage stats are + -- not gathered for things run in it. + -- Run same command again, to get code coverage. + _ <- git_annex testenv command params + return got + +git_annex_expectoutput :: TestEnv -> String -> [String] -> [String] -> IO () +git_annex_expectoutput testenv command params expected = do + got <- lines <$> git_annex_output testenv command params + got == expected @? ("unexpected value running " ++ command ++ " " ++ show params ++ " -- got: " ++ show got ++ " expected: " ++ show expected) + +-- Runs an action in the current annex. Note that shutdown actions +-- are not run; this should only be used for actions that query state. +annexeval :: Types.Annex a -> IO a +annexeval a = do + s <- Annex.new =<< Git.CurrentRepo.get + Annex.eval s $ do + Annex.setOutput Types.Messages.QuietOutput + a + +innewrepo :: TestEnv -> Assertion -> Assertion +innewrepo testenv a = withgitrepo testenv $ \r -> indir testenv r a + +inmainrepo :: TestEnv -> Assertion -> Assertion +inmainrepo testenv = indir testenv mainrepodir + +intmpclonerepo :: TestEnv -> Assertion -> Assertion +intmpclonerepo testenv a = withtmpclonerepo testenv False $ \r -> indir testenv r a + +intmpclonerepoInDirect :: TestEnv -> Assertion -> Assertion +intmpclonerepoInDirect testenv a = intmpclonerepo testenv $ + ifM isdirect + ( putStrLn "not supported in direct mode; skipping" + , a + ) + where + isdirect = annexeval $ do + Annex.Init.initialize Nothing + Config.isDirect + +checkRepo :: Types.Annex a -> FilePath -> IO a +checkRepo getval d = do + s <- Annex.new =<< Git.Construct.fromPath d + Annex.eval s getval + +isInDirect :: FilePath -> IO Bool +isInDirect = checkRepo (not <$> Config.isDirect) + +intmpbareclonerepo :: TestEnv -> Assertion -> Assertion +intmpbareclonerepo testenv a = withtmpclonerepo testenv True $ \r -> indir testenv r a + +withtmpclonerepo :: TestEnv -> Bool -> (FilePath -> Assertion) -> Assertion +withtmpclonerepo testenv bare a = do + dir <- tmprepodir + bracket (clonerepo testenv mainrepodir dir bare) cleanup a + +disconnectOrigin :: Assertion +disconnectOrigin = boolSystem "git" [Params "remote rm origin"] @? "remote rm" + +withgitrepo :: TestEnv -> (FilePath -> Assertion) -> Assertion +withgitrepo testenv = bracket (setuprepo testenv mainrepodir) return + +indir :: TestEnv -> FilePath -> Assertion -> Assertion +indir testenv dir a = do + currdir <- getCurrentDirectory + -- Assertion failures throw non-IO errors; catch + -- any type of error and change back to currdir before + -- rethrowing. + r <- bracket_ (changeToTmpDir testenv dir) (setCurrentDirectory currdir) + (try a::IO (Either SomeException ())) + case r of + Right () -> return () + Left e -> throw e + +setuprepo :: TestEnv -> FilePath -> IO FilePath +setuprepo testenv dir = do + cleanup dir + ensuretmpdir + boolSystem "git" [Params "init -q", File dir] @? "git init failed" + configrepo testenv dir + return dir + +-- clones are always done as local clones; we cannot test ssh clones +clonerepo :: TestEnv -> FilePath -> FilePath -> Bool -> IO FilePath +clonerepo testenv old new bare = do + cleanup new + ensuretmpdir + let b = if bare then " --bare" else "" + boolSystem "git" [Params ("clone -q" ++ b), File old, File new] @? "git clone failed" + configrepo testenv new + indir testenv new $ + git_annex testenv "init" ["-q", new] @? "git annex init failed" + unless bare $ + indir testenv new $ + handleforcedirect testenv + return new + +configrepo :: TestEnv -> FilePath -> IO () +configrepo testenv dir = indir testenv dir $ do + -- ensure git is set up to let commits happen + boolSystem "git" [Params "config user.name", Param "Test User"] @? "git config failed" + boolSystem "git" [Params "config user.email test@example.com"] @? "git config failed" + -- avoid signed commits by test suite + boolSystem "git" [Params "config commit.gpgsign false"] @? "git config failed" + +handleforcedirect :: TestEnv -> IO () +handleforcedirect testenv = when (M.lookup "FORCEDIRECT" testenv == Just "1") $ + git_annex testenv "direct" ["-q"] @? "git annex direct failed" + +ensuretmpdir :: IO () +ensuretmpdir = do + e <- doesDirectoryExist tmpdir + unless e $ + createDirectory tmpdir + +cleanup :: FilePath -> IO () +cleanup = cleanup' False + +cleanup' :: Bool -> FilePath -> IO () +cleanup' final dir = whenM (doesDirectoryExist dir) $ do + Command.Uninit.prepareRemoveAnnexDir dir + -- This sometimes fails on Windows, due to some files + -- being still opened by a subprocess. + catchIO (removeDirectoryRecursive dir) $ \e -> + when final $ do + print e + putStrLn "sleeping 10 seconds and will retry directory cleanup" + Utility.ThreadScheduler.threadDelaySeconds (Utility.ThreadScheduler.Seconds 10) + whenM (doesDirectoryExist dir) $ + removeDirectoryRecursive dir + +checklink :: FilePath -> Assertion +checklink f = do + s <- getSymbolicLinkStatus f + -- in direct mode, it may be a symlink, or not, depending + -- on whether the content is present. + unlessM (annexeval Config.isDirect) $ + isSymbolicLink s @? f ++ " is not a symlink" + +checkregularfile :: FilePath -> Assertion +checkregularfile f = do + s <- getSymbolicLinkStatus f + isRegularFile s @? f ++ " is not a normal file" + return () + +checkcontent :: FilePath -> Assertion +checkcontent f = do + c <- Utility.Exception.catchDefaultIO "could not read file" $ readFile f + assertEqual ("checkcontent " ++ f) (content f) c + +checkunwritable :: FilePath -> Assertion +checkunwritable f = unlessM (annexeval Config.isDirect) $ do + -- Look at permissions bits rather than trying to write or + -- using fileAccess because if run as root, any file can be + -- modified despite permissions. + s <- getFileStatus f + let mode = fileMode s + when (mode == mode `unionFileModes` ownerWriteMode) $ + assertFailure $ "able to modify annexed file's " ++ f ++ " content" + +checkwritable :: FilePath -> Assertion +checkwritable f = do + r <- tryIO $ writeFile f $ content f + case r of + Left _ -> assertFailure $ "unable to modify " ++ f + Right _ -> return () + +checkdangling :: FilePath -> Assertion +checkdangling f = ifM (annexeval Config.crippledFileSystem) + ( return () -- probably no real symlinks to test + , do + r <- tryIO $ readFile f + case r of + Left _ -> return () -- expected; dangling link + Right _ -> assertFailure $ f ++ " was not a dangling link as expected" + ) + +checklocationlog :: FilePath -> Bool -> Assertion +checklocationlog f expected = do + thisuuid <- annexeval Annex.UUID.getUUID + r <- annexeval $ Backend.lookupFile f + case r of + Just k -> do + uuids <- annexeval $ Remote.keyLocations k + assertEqual ("bad content in location log for " ++ f ++ " key " ++ Types.Key.key2file k ++ " uuid " ++ show thisuuid) + expected (thisuuid `elem` uuids) + _ -> assertFailure $ f ++ " failed to look up key" + +checkbackend :: FilePath -> Types.Backend -> Assertion +checkbackend file expected = do + b <- annexeval $ maybe (return Nothing) (Backend.getBackend file) + =<< Backend.lookupFile file + assertEqual ("backend for " ++ file) (Just expected) b + +inlocationlog :: FilePath -> Assertion +inlocationlog f = checklocationlog f True + +notinlocationlog :: FilePath -> Assertion +notinlocationlog f = checklocationlog f False + +runchecks :: [FilePath -> Assertion] -> FilePath -> Assertion +runchecks [] _ = return () +runchecks (a:as) f = do + a f + runchecks as f + +annexed_notpresent :: FilePath -> Assertion +annexed_notpresent = runchecks + [checklink, checkdangling, notinlocationlog] + +annexed_present :: FilePath -> Assertion +annexed_present = runchecks + [checklink, checkcontent, checkunwritable, inlocationlog] + +unannexed :: FilePath -> Assertion +unannexed = runchecks [checkregularfile, checkcontent, checkwritable] + +withTestEnv :: Bool -> (IO TestEnv -> TestTree) -> TestTree +withTestEnv forcedirect = withResource prepare release + where + prepare = do + testenv <- prepareTestEnv forcedirect + case tryIngredients [consoleTestReporter] mempty (initTests testenv) of + Nothing -> error "No tests found!?" + Just act -> unlessM act $ + error "init tests failed! cannot continue" + return testenv + release = releaseTestEnv + +releaseTestEnv :: TestEnv -> IO () +releaseTestEnv _env = cleanup' True tmpdir + +prepareTestEnv :: Bool -> IO TestEnv +prepareTestEnv forcedirect = do + whenM (doesDirectoryExist tmpdir) $ + error $ "The temporary directory " ++ tmpdir ++ " already exists; cannot run test suite." + + currdir <- getCurrentDirectory + p <- Utility.Env.getEnvDefault "PATH" "" + + environ <- Utility.Env.getEnvironment + let newenv = + -- Ensure that the just-built git annex is used. + [ ("PATH", currdir ++ [searchPathSeparator] ++ p) + , ("TOPDIR", currdir) + -- Avoid git complaining if it cannot determine the user's + -- email address, or exploding if it doesn't know the user's + -- name. + , ("GIT_AUTHOR_EMAIL", "test@example.com") + , ("GIT_AUTHOR_NAME", "git-annex test") + , ("GIT_COMMITTER_EMAIL", "test@example.com") + , ("GIT_COMMITTER_NAME", "git-annex test") + -- force gpg into batch mode for the tests + , ("GPG_BATCH", "1") + , ("FORCEDIRECT", if forcedirect then "1" else "") + ] + + return $ M.fromList newenv `M.union` M.fromList environ + +changeToTmpDir :: TestEnv -> FilePath -> IO () +changeToTmpDir testenv t = do + let topdir = fromMaybe "" $ M.lookup "TOPDIR" testenv + setCurrentDirectory $ topdir ++ "/" ++ t + +tmpdir :: String +tmpdir = ".t" + +mainrepodir :: FilePath +mainrepodir = tmpdir "repo" + +tmprepodir :: IO FilePath +tmprepodir = go (0 :: Int) + where + go n = do + let d = tmpdir "tmprepo" ++ show n + ifM (doesDirectoryExist d) + ( go $ n + 1 + , return d + ) + +annexedfile :: String +annexedfile = "foo" + +wormannexedfile :: String +wormannexedfile = "apple" + +sha1annexedfile :: String +sha1annexedfile = "sha1foo" + +sha1annexedfiledup :: String +sha1annexedfiledup = "sha1foodup" + +ingitfile :: String +ingitfile = "bar" + +content :: FilePath -> String +content f + | f == annexedfile = "annexed file content" + | f == ingitfile = "normal file content" + | f == sha1annexedfile ="sha1 annexed file content" + | f == sha1annexedfiledup = content sha1annexedfile + | f == wormannexedfile = "worm annexed file content" + | otherwise = "unknown file " ++ f + +changecontent :: FilePath -> IO () +changecontent f = writeFile f $ changedcontent f + +changedcontent :: FilePath -> String +changedcontent f = content f ++ " (modified)" + +backendSHA1 :: Types.Backend +backendSHA1 = backend_ "SHA1" + +backendSHA256 :: Types.Backend +backendSHA256 = backend_ "SHA256" + +backendWORM :: Types.Backend +backendWORM = backend_ "WORM" + +backend_ :: String -> Types.Backend +backend_ = Backend.lookupBackendName diff --git a/Types.hs b/Types.hs new file mode 100644 index 000000000..8768ed1fe --- /dev/null +++ b/Types.hs @@ -0,0 +1,31 @@ +{- git-annex abstract data types + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types ( + Annex, + Backend, + Key, + AssociatedFile, + UUID(..), + GitConfig(..), + RemoteGitConfig(..), + Remote, + RemoteType, + Option +) where + +import Annex +import Types.Backend +import Types.GitConfig +import Types.Key +import Types.UUID +import Types.Remote +import Types.Option + +type Backend = BackendA Annex +type Remote = RemoteA Annex +type RemoteType = RemoteTypeA Annex diff --git a/Types/Availability.hs b/Types/Availability.hs new file mode 100644 index 000000000..f8c8ea3f3 --- /dev/null +++ b/Types/Availability.hs @@ -0,0 +1,11 @@ +{- git-annex remote availability + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Availability where + +data Availability = GloballyAvailable | LocallyAvailable + deriving (Eq, Show, Read) diff --git a/Types/Backend.hs b/Types/Backend.hs new file mode 100644 index 000000000..7eb59b6e2 --- /dev/null +++ b/Types/Backend.hs @@ -0,0 +1,27 @@ +{- git-annex key/value backend data type + - + - Most things should not need this, using Types instead + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Backend where + +import Types.Key +import Types.KeySource + +data BackendA a = Backend + { name :: String + , getKey :: KeySource -> a (Maybe Key) + , fsckKey :: Maybe (Key -> FilePath -> a Bool) + , canUpgradeKey :: Maybe (Key -> Bool) + , fastMigrate :: Maybe (Key -> BackendA a -> Maybe Key) + } + +instance Show (BackendA a) where + show backend = "Backend { name =\"" ++ name backend ++ "\" }" + +instance Eq (BackendA a) where + a == b = name a == name b diff --git a/Types/BranchState.hs b/Types/BranchState.hs new file mode 100644 index 000000000..2f7948ebb --- /dev/null +++ b/Types/BranchState.hs @@ -0,0 +1,16 @@ +{- git-annex BranchState data type + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.BranchState where + +data BranchState = BranchState + { branchUpdated :: Bool -- has the branch been updated this run? + , indexChecked :: Bool -- has the index file been checked to exist? + } + +startBranchState :: BranchState +startBranchState = BranchState False False diff --git a/Types/CleanupActions.hs b/Types/CleanupActions.hs new file mode 100644 index 000000000..498d5b4d7 --- /dev/null +++ b/Types/CleanupActions.hs @@ -0,0 +1,17 @@ +{- Enumeration of cleanup actions + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.CleanupActions where + +import Types.UUID + +data CleanupAction + = RemoteCleanup UUID + | StopHook UUID + | FsckCleanup + | SshCachingCleanup + deriving (Eq, Ord) diff --git a/Types/Command.hs b/Types/Command.hs new file mode 100644 index 000000000..0df7c82e6 --- /dev/null +++ b/Types/Command.hs @@ -0,0 +1,81 @@ +{- git-annex command data types + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Command where + +import Data.Ord + +import Types + +{- A command runs in these stages. + - + - a. The check stage runs checks, that error out if + - anything prevents the command from running. -} +data CommandCheck = CommandCheck { idCheck :: Int, runCheck :: Annex () } +{- b. The seek stage takes the parameters passed to the command, + - looks through the repo to find the ones that are relevant + - to that command (ie, new files to add), and runs commandAction + - to handle all necessary actions. -} +type CommandSeek = [String] -> Annex () +{- c. The start stage is run before anything is printed about the + - command, is passed some input, and can early abort it + - if the input does not make sense. It should run quickly and + - should not modify Annex state. -} +type CommandStart = Annex (Maybe CommandPerform) +{- d. The perform stage is run after a message is printed about the command + - being run, and it should be where the bulk of the work happens. -} +type CommandPerform = Annex (Maybe CommandCleanup) +{- e. The cleanup stage is run only if the perform stage succeeds, and it + - returns the overall success/fail of the command. -} +type CommandCleanup = Annex Bool + +{- A command is defined by specifying these things. -} +data Command = Command + { cmdoptions :: [Option] -- command-specific options + , cmdnorepo :: Maybe (CmdParams -> IO ()) -- an action to run when not in a repo + , cmdcheck :: [CommandCheck] -- check stage + , cmdnocommit :: Bool -- don't commit journalled state changes + , cmdnomessages :: Bool -- don't output normal messages + , cmdname :: String + , cmdparamdesc :: String -- description of params for usage + , cmdseek :: CommandSeek + , cmdsection :: CommandSection + , cmddesc :: String -- description of command for usage + } + +type CmdParams = [String] + +{- CommandCheck functions can be compared using their unique id. -} +instance Eq CommandCheck where + a == b = idCheck a == idCheck b + +instance Eq Command where + a == b = cmdname a == cmdname b + +{- Order commands by name. -} +instance Ord Command where + compare = comparing cmdname + +{- The same sections are listed in doc/git-annex.mdwn -} +data CommandSection + = SectionCommon + | SectionSetup + | SectionMaintenance + | SectionQuery + | SectionMetaData + | SectionUtility + | SectionPlumbing + deriving (Eq, Ord, Enum, Bounded) + +descSection :: CommandSection -> String +descSection SectionCommon = "Commonly used commands" +descSection SectionSetup = "Repository setup commands" +descSection SectionMaintenance = "Repository maintenance commands" +descSection SectionQuery = "Query commands" +descSection SectionMetaData = "Metadata commands" +descSection SectionUtility = "Utility commands" +descSection SectionPlumbing = "Plumbing commands" diff --git a/Types/Creds.hs b/Types/Creds.hs new file mode 100644 index 000000000..c16e530b1 --- /dev/null +++ b/Types/Creds.hs @@ -0,0 +1,14 @@ +{- credentials + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Creds where + +type Creds = String -- can be any data that contains credentials + +type CredPair = (Login, Password) +type Login = String +type Password = String -- todo: use securemem diff --git a/Types/Crypto.hs b/Types/Crypto.hs new file mode 100644 index 000000000..1a9a7774a --- /dev/null +++ b/Types/Crypto.hs @@ -0,0 +1,73 @@ +{- git-annex crypto types + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Crypto ( + Cipher(..), + StorableCipher(..), + EncryptedCipherVariant(..), + KeyIds(..), + Mac(..), + readMac, + showMac, + defaultMac, + calcMac, +) where + +import qualified Data.ByteString.Lazy as L +import Data.Digest.Pure.SHA + +import Utility.Gpg (KeyIds(..)) + +-- XXX ideally, this would be a locked memory region +data Cipher = Cipher String | MacOnlyCipher String + +data StorableCipher = EncryptedCipher String EncryptedCipherVariant KeyIds + | SharedCipher String + deriving (Ord, Eq) +data EncryptedCipherVariant = Hybrid | PubKey + deriving (Ord, Eq) + +{- File names are (client-side) MAC'ed on special remotes. + - The chosen MAC algorithm needs to be same for all files stored on the + - remote. + -} +data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512 + deriving (Eq) + +defaultMac :: Mac +defaultMac = HmacSha1 + +-- MAC algorithms are shown as follows in the file names. +showMac :: Mac -> String +showMac HmacSha1 = "HMACSHA1" +showMac HmacSha224 = "HMACSHA224" +showMac HmacSha256 = "HMACSHA256" +showMac HmacSha384 = "HMACSHA384" +showMac HmacSha512 = "HMACSHA512" + +-- Read the MAC algorithm from the remote config. +readMac :: String -> Maybe Mac +readMac "HMACSHA1" = Just HmacSha1 +readMac "HMACSHA224" = Just HmacSha224 +readMac "HMACSHA256" = Just HmacSha256 +readMac "HMACSHA384" = Just HmacSha384 +readMac "HMACSHA512" = Just HmacSha512 +readMac _ = Nothing + +calcMac + :: Mac -- ^ MAC + -> L.ByteString -- ^ secret key + -> L.ByteString -- ^ message + -> String -- ^ MAC'ed message, in hexadecimals +calcMac mac = case mac of + HmacSha1 -> showDigest $* hmacSha1 + HmacSha224 -> showDigest $* hmacSha224 + HmacSha256 -> showDigest $* hmacSha256 + HmacSha384 -> showDigest $* hmacSha384 + HmacSha512 -> showDigest $* hmacSha512 + where + ($*) g f x y = g $ f x y diff --git a/Types/DesktopNotify.hs b/Types/DesktopNotify.hs new file mode 100644 index 000000000..f8494487d --- /dev/null +++ b/Types/DesktopNotify.hs @@ -0,0 +1,27 @@ +{- git-annex DesktopNotify type + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.DesktopNotify where + +import Data.Monoid + +data DesktopNotify = DesktopNotify + { notifyStart :: Bool + , notifyFinish :: Bool + } + deriving (Show) + +instance Monoid DesktopNotify where + mempty = DesktopNotify False False + mappend (DesktopNotify s1 f1) (DesktopNotify s2 f2) = + DesktopNotify (s1 || s2) (f1 || f2) + +mkNotifyStart :: DesktopNotify +mkNotifyStart = DesktopNotify True False + +mkNotifyFinish :: DesktopNotify +mkNotifyFinish = DesktopNotify False True diff --git a/Types/Distribution.hs b/Types/Distribution.hs new file mode 100644 index 000000000..4201f49ad --- /dev/null +++ b/Types/Distribution.hs @@ -0,0 +1,38 @@ +{- Data type for a distribution of git-annex + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Distribution where + +import Types.Key +import Data.Time.Clock +import Git.Config (isTrue, boolConfig) + +data GitAnnexDistribution = GitAnnexDistribution + { distributionUrl :: String + , distributionKey :: Key + , distributionVersion :: GitAnnexVersion + , distributionReleasedate :: UTCTime + , distributionUrgentUpgrade :: Maybe GitAnnexVersion + } + deriving (Read, Show, Eq) + +type GitAnnexVersion = String + +data AutoUpgrade = AskUpgrade | AutoUpgrade | NoAutoUpgrade + deriving (Eq) + +toAutoUpgrade :: (Maybe String) -> AutoUpgrade +toAutoUpgrade Nothing = AskUpgrade +toAutoUpgrade (Just s) + | s == "ask" = AskUpgrade + | isTrue s == Just True = AutoUpgrade + | otherwise = NoAutoUpgrade + +fromAutoUpgrade :: AutoUpgrade -> String +fromAutoUpgrade AskUpgrade = "ask" +fromAutoUpgrade AutoUpgrade = boolConfig True +fromAutoUpgrade NoAutoUpgrade = boolConfig False diff --git a/Types/FileMatcher.hs b/Types/FileMatcher.hs new file mode 100644 index 000000000..03a86a38c --- /dev/null +++ b/Types/FileMatcher.hs @@ -0,0 +1,40 @@ +{- git-annex file matcher types + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.FileMatcher where + +import Types.UUID (UUID) +import Types.Key (Key) +import Utility.Matcher (Matcher, Token) + +import qualified Data.Map as M +import qualified Data.Set as S + +data MatchInfo + = MatchingFile FileInfo + | MatchingKey Key + +data FileInfo = FileInfo + { relFile :: FilePath -- may be relative to cwd + , matchFile :: FilePath -- filepath to match on; may be relative to top + } + +type FileMatcherMap a = M.Map UUID (Utility.Matcher.Matcher (S.Set UUID -> MatchInfo -> a Bool)) + +type MkLimit a = String -> Either String (MatchFiles a) + +type AssumeNotPresent = S.Set UUID + +type MatchFiles a = AssumeNotPresent -> MatchInfo -> a Bool + +type FileMatcher a = Matcher (MatchFiles a) + +-- This is a matcher that can have tokens added to it while it's being +-- built, and once complete is compiled to an unchangable matcher. +data ExpandableMatcher a + = BuildingMatcher [Token (MatchInfo -> a Bool)] + | CompleteMatcher (Matcher (MatchInfo -> a Bool)) diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs new file mode 100644 index 000000000..29a7c9019 --- /dev/null +++ b/Types/GitConfig.hs @@ -0,0 +1,188 @@ +{- git-annex configuration + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.GitConfig ( + GitConfig(..), + extractGitConfig, + RemoteGitConfig(..), + extractRemoteGitConfig, +) where + +import Common +import qualified Git +import qualified Git.Config +import Utility.DataUnits +import Config.Cost +import Types.Distribution +import Types.Availability +import Types.NumCopies +import Utility.HumanTime + +{- Main git-annex settings. Each setting corresponds to a git-config key + - such as annex.foo -} +data GitConfig = GitConfig + { annexVersion :: Maybe String + , annexNumCopies :: Maybe NumCopies + , annexDiskReserve :: Integer + , annexDirect :: Bool + , annexBackends :: [String] + , annexQueueSize :: Maybe Int + , annexBloomCapacity :: Maybe Int + , annexBloomAccuracy :: Maybe Int + , annexSshCaching :: Maybe Bool + , annexAlwaysCommit :: Bool + , annexDelayAdd :: Maybe Int + , annexHttpHeaders :: [String] + , annexHttpHeadersCommand :: Maybe String + , annexAutoCommit :: Bool + , annexDebug :: Bool + , annexWebOptions :: [String] + , annexQuviOptions :: [String] + , annexWebDownloadCommand :: Maybe String + , annexCrippledFileSystem :: Bool + , annexLargeFiles :: Maybe String + , annexFsckNudge :: Bool + , annexAutoUpgrade :: AutoUpgrade + , annexExpireUnused :: Maybe (Maybe Duration) + , annexSecureEraseCommand :: Maybe String + , annexGenMetaData :: Bool + , annexListen :: Maybe String + , annexStartupScan :: Bool + , coreSymlinks :: Bool + , gcryptId :: Maybe String + } + +extractGitConfig :: Git.Repo -> GitConfig +extractGitConfig r = GitConfig + { annexVersion = notempty $ getmaybe (annex "version") + , annexNumCopies = NumCopies <$> getmayberead (annex "numcopies") + , annexDiskReserve = fromMaybe onemegabyte $ + readSize dataUnits =<< getmaybe (annex "diskreserve") + , annexDirect = getbool (annex "direct") False + , annexBackends = getwords (annex "backends") + , annexQueueSize = getmayberead (annex "queuesize") + , annexBloomCapacity = getmayberead (annex "bloomcapacity") + , annexBloomAccuracy = getmayberead (annex "bloomaccuracy") + , annexSshCaching = getmaybebool (annex "sshcaching") + , annexAlwaysCommit = getbool (annex "alwayscommit") True + , annexDelayAdd = getmayberead (annex "delayadd") + , annexHttpHeaders = getlist (annex "http-headers") + , annexHttpHeadersCommand = getmaybe (annex "http-headers-command") + , annexAutoCommit = getbool (annex "autocommit") True + , annexDebug = getbool (annex "debug") False + , annexWebOptions = getwords (annex "web-options") + , annexQuviOptions = getwords (annex "quvi-options") + , annexWebDownloadCommand = getmaybe (annex "web-download-command") + , annexCrippledFileSystem = getbool (annex "crippledfilesystem") False + , annexLargeFiles = getmaybe (annex "largefiles") + , annexFsckNudge = getbool (annex "fscknudge") True + , annexAutoUpgrade = toAutoUpgrade $ getmaybe (annex "autoupgrade") + , annexExpireUnused = maybe Nothing Just . parseDuration + <$> getmaybe (annex "expireunused") + , annexSecureEraseCommand = getmaybe (annex "secure-erase-command") + , annexGenMetaData = getbool (annex "genmetadata") False + , annexListen = getmaybe (annex "listen") + , annexStartupScan = getbool (annex "startupscan") True + , coreSymlinks = getbool "core.symlinks" True + , gcryptId = getmaybe "core.gcrypt-id" + } + where + getbool k def = fromMaybe def $ getmaybebool k + getmaybebool k = Git.Config.isTrue =<< getmaybe k + getmayberead k = readish =<< getmaybe k + getmaybe k = Git.Config.getMaybe k r + getlist k = Git.Config.getList k r + getwords k = fromMaybe [] $ words <$> getmaybe k + + annex k = "annex." ++ k + + onemegabyte = 1000000 + +{- Per-remote git-annex settings. Each setting corresponds to a git-config + - key such as .annex-foo, or if that is not set, a default from + - annex.foo -} +data RemoteGitConfig = RemoteGitConfig + { remoteAnnexCost :: Maybe Cost + , remoteAnnexCostCommand :: Maybe String + , remoteAnnexIgnore :: Bool + , remoteAnnexSync :: Bool + , remoteAnnexReadOnly :: Bool + , remoteAnnexTrustLevel :: Maybe String + , remoteAnnexStartCommand :: Maybe String + , remoteAnnexStopCommand :: Maybe String + , remoteAnnexAvailability :: Maybe Availability + , remoteAnnexBare :: Maybe Bool + + {- These settings are specific to particular types of remotes + - including special remotes. -} + , remoteAnnexShell :: Maybe String + , remoteAnnexSshOptions :: [String] + , remoteAnnexRsyncOptions :: [String] + , remoteAnnexRsyncUploadOptions :: [String] + , remoteAnnexRsyncDownloadOptions :: [String] + , remoteAnnexRsyncTransport :: [String] + , remoteAnnexGnupgOptions :: [String] + , remoteAnnexRsyncUrl :: Maybe String + , remoteAnnexBupRepo :: Maybe String + , remoteAnnexTahoe :: Maybe FilePath + , remoteAnnexBupSplitOptions :: [String] + , remoteAnnexDirectory :: Maybe FilePath + , remoteAnnexGCrypt :: Maybe String + , remoteAnnexDdarRepo :: Maybe String + , remoteAnnexHookType :: Maybe String + , remoteAnnexExternalType :: Maybe String + {- A regular git remote's git repository config. -} + , remoteGitConfig :: Maybe GitConfig + } + +extractRemoteGitConfig :: Git.Repo -> String -> RemoteGitConfig +extractRemoteGitConfig r remotename = RemoteGitConfig + { remoteAnnexCost = getmayberead "cost" + , remoteAnnexCostCommand = notempty $ getmaybe "cost-command" + , remoteAnnexIgnore = getbool "ignore" False + , remoteAnnexSync = getbool "sync" True + , remoteAnnexReadOnly = getbool "readonly" False + , remoteAnnexTrustLevel = notempty $ getmaybe "trustlevel" + , remoteAnnexStartCommand = notempty $ getmaybe "start-command" + , remoteAnnexStopCommand = notempty $ getmaybe "stop-command" + , remoteAnnexAvailability = getmayberead "availability" + , remoteAnnexBare = getmaybebool "bare" + + , remoteAnnexShell = getmaybe "shell" + , remoteAnnexSshOptions = getoptions "ssh-options" + , remoteAnnexRsyncOptions = getoptions "rsync-options" + , remoteAnnexRsyncDownloadOptions = getoptions "rsync-download-options" + , remoteAnnexRsyncUploadOptions = getoptions "rsync-upload-options" + , remoteAnnexRsyncTransport = getoptions "rsync-transport" + , remoteAnnexGnupgOptions = getoptions "gnupg-options" + , remoteAnnexRsyncUrl = notempty $ getmaybe "rsyncurl" + , remoteAnnexBupRepo = getmaybe "buprepo" + , remoteAnnexTahoe = getmaybe "tahoe" + , remoteAnnexBupSplitOptions = getoptions "bup-split-options" + , remoteAnnexDirectory = notempty $ getmaybe "directory" + , remoteAnnexGCrypt = notempty $ getmaybe "gcrypt" + , remoteAnnexDdarRepo = getmaybe "ddarrepo" + , remoteAnnexHookType = notempty $ getmaybe "hooktype" + , remoteAnnexExternalType = notempty $ getmaybe "externaltype" + , remoteGitConfig = Nothing + } + where + getbool k def = fromMaybe def $ getmaybebool k + getmaybebool k = Git.Config.isTrue =<< getmaybe k + getmayberead k = readish =<< getmaybe k + getmaybe k = mplus (Git.Config.getMaybe (key k) r) + (Git.Config.getMaybe (remotekey k) r) + getoptions k = fromMaybe [] $ words <$> getmaybe k + + key k = "annex." ++ k + remotekey k = "remote." ++ remotename ++ ".annex-" ++ k + +notempty :: Maybe String -> Maybe String +notempty Nothing = Nothing +notempty (Just "") = Nothing +notempty (Just s) = Just s + diff --git a/Types/Group.hs b/Types/Group.hs new file mode 100644 index 000000000..88bc35207 --- /dev/null +++ b/Types/Group.hs @@ -0,0 +1,27 @@ +{- git-annex repo groups + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Group ( + Group, + GroupMap(..), + emptyGroupMap +) where + +import Types.UUID + +import qualified Data.Map as M +import qualified Data.Set as S + +type Group = String + +data GroupMap = GroupMap + { groupsByUUID :: M.Map UUID (S.Set Group) + , uuidsByGroup :: M.Map Group (S.Set UUID) + } + +emptyGroupMap :: GroupMap +emptyGroupMap = GroupMap M.empty M.empty diff --git a/Types/Key.hs b/Types/Key.hs new file mode 100644 index 000000000..26af6220f --- /dev/null +++ b/Types/Key.hs @@ -0,0 +1,108 @@ +{- git-annex Key data type + - + - Most things should not need this, using Types instead + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Key ( + Key(..), + AssociatedFile, + stubKey, + key2file, + file2key, + + prop_idempotent_key_encode, + prop_idempotent_key_decode +) where + +import System.Posix.Types + +import Common +import Utility.QuickCheck + +{- A Key has a unique name, which is derived from a particular backend, + - and may contain other optional metadata. -} +data Key = Key + { keyName :: String + , keyBackendName :: String + , keySize :: Maybe Integer + , keyMtime :: Maybe EpochTime + } deriving (Eq, Ord, Read, Show) + +{- A filename may be associated with a Key. -} +type AssociatedFile = Maybe FilePath + +stubKey :: Key +stubKey = Key + { keyName = "" + , keyBackendName = "" + , keySize = Nothing + , keyMtime = Nothing + } + +fieldSep :: Char +fieldSep = '-' + +{- Converts a key to a string that is suitable for use as a filename. + - The name field is always shown last, separated by doubled fieldSeps, + - and is the only field allowed to contain the fieldSep. -} +key2file :: Key -> FilePath +key2file Key { keyBackendName = b, keySize = s, keyMtime = m, keyName = n } = + b +++ ('s' ?: s) +++ ('m' ?: m) +++ (fieldSep : n) + where + "" +++ y = y + x +++ "" = x + x +++ y = x ++ fieldSep:y + c ?: (Just v) = c : show v + _ ?: _ = "" + +file2key :: FilePath -> Maybe Key +file2key s + | key == Just stubKey || (keyName <$> key) == Just "" || (keyBackendName <$> key) == Just "" = Nothing + | otherwise = key + where + key = startbackend stubKey s + + startbackend k v = sepfield k v addbackend + + sepfield k v a = case span (/= fieldSep) v of + (v', _:r) -> findfields r $ a k v' + _ -> Nothing + + findfields (c:v) (Just k) + | c == fieldSep = Just $ k { keyName = v } + | otherwise = sepfield k v $ addfield c + findfields _ v = v + + addbackend k v = Just k { keyBackendName = v } + addfield 's' k v = do + sz <- readish v + return $ k { keySize = Just sz } + addfield 'm' k v = do + mtime <- readish v + return $ k { keyMtime = Just mtime } + addfield _ _ _ = Nothing + +instance Arbitrary Key where + arbitrary = Key + <$> (listOf1 $ elements $ ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "-_\r\n \t") + <*> (listOf1 $ elements ['A'..'Z']) -- BACKEND + <*> ((abs <$>) <$> arbitrary) -- size cannot be negative + <*> arbitrary + +prop_idempotent_key_encode :: Key -> Bool +prop_idempotent_key_encode k = Just k == (file2key . key2file) k + +prop_idempotent_key_decode :: FilePath -> Bool +prop_idempotent_key_decode f + | normalfieldorder = maybe True (\k -> key2file k == f) (file2key f) + | otherwise = True + where + -- file2key will accept the fields in any order, so don't + -- try the test unless the fields are in the normal order + normalfieldorder = fields `isPrefixOf` "sm" + fields = map (f !!) $ filter (< length f) $ map succ $ + elemIndices fieldSep f diff --git a/Types/KeySource.hs b/Types/KeySource.hs new file mode 100644 index 000000000..fd4af07a6 --- /dev/null +++ b/Types/KeySource.hs @@ -0,0 +1,29 @@ +{- KeySource data type + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.KeySource where + +import Utility.InodeCache + +{- When content is in the process of being added to the annex, + - and a Key generated from it, this data type is used. + - + - The contentLocation may be different from the filename + - associated with the key. For example, the add command + - may temporarily hard link the content into a lockdown directory + - for checking. The migrate command uses the content + - of a different Key. + - + - The inodeCache can be used to detect some types of modifications to + - files that may be made while they're in the process of being added. + -} +data KeySource = KeySource + { keyFilename :: FilePath + , contentLocation :: FilePath + , inodeCache :: Maybe InodeCache + } + deriving (Show) diff --git a/Types/LockPool.hs b/Types/LockPool.hs new file mode 100644 index 000000000..dd392f28b --- /dev/null +++ b/Types/LockPool.hs @@ -0,0 +1,24 @@ +{- git-annex lock pool data types + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Types.LockPool ( + LockPool, + LockHandle +) where + +import qualified Data.Map as M + +#ifndef mingw32_HOST_OS +import System.Posix.Types (Fd) +type LockHandle = Fd +#else +import Utility.WinLock -- defines LockHandle +#endif + +type LockPool = M.Map FilePath LockHandle diff --git a/Types/Messages.hs b/Types/Messages.hs new file mode 100644 index 000000000..4fcce79f8 --- /dev/null +++ b/Types/Messages.hs @@ -0,0 +1,24 @@ +{- git-annex Messages data types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Messages where + +import qualified Data.Set as S + +data OutputType = NormalOutput | QuietOutput | JSONOutput + +data SideActionBlock = NoBlock | StartBlock | InBlock + deriving (Eq) + +data MessageState = MessageState + { outputType :: OutputType + , sideActionBlock :: SideActionBlock + , fileNotFoundShown :: S.Set FilePath + } + +defaultMessageState :: MessageState +defaultMessageState = MessageState NormalOutput NoBlock S.empty diff --git a/Types/MetaData.hs b/Types/MetaData.hs new file mode 100644 index 000000000..8df56734d --- /dev/null +++ b/Types/MetaData.hs @@ -0,0 +1,293 @@ +{- git-annex general metadata + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Types.MetaData ( + MetaData(..), + MetaField(..), + MetaValue(..), + CurrentlySet(..), + serialize, + deserialize, + MetaSerializable, + toMetaField, + mkMetaField, + mkMetaFieldUnchecked, + fromMetaField, + toMetaValue, + mkMetaValue, + unsetMetaValue, + unsetMetaData, + fromMetaValue, + fromMetaData, + emptyMetaData, + updateMetaData, + unionMetaData, + combineMetaData, + differenceMetaData, + isSet, + currentMetaData, + currentMetaDataValues, + metaDataValues, + ModMeta(..), + modMeta, + parseModMeta, + parseMetaData, + prop_metadata_sane, + prop_metadata_serialize +) where + +import Common +import Utility.Base64 +import Utility.QuickCheck + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Char +import qualified Data.CaseInsensitive as CI + +newtype MetaData = MetaData (M.Map MetaField (S.Set MetaValue)) + deriving (Show, Eq, Ord) + +{- A metadata value can be currently be set (True), or may have been + - set before and we're remembering it no longer is (False). -} +newtype CurrentlySet = CurrentlySet Bool + deriving (Read, Show, Eq, Ord, Arbitrary) + +{- Fields are case insensitive. -} +newtype MetaField = MetaField (CI.CI String) + deriving (Read, Show, Eq, Ord) + +data MetaValue = MetaValue CurrentlySet String + deriving (Read, Show) + +{- Metadata values compare and order the same whether currently set or not. -} +instance Eq MetaValue where + MetaValue _ a == MetaValue _ b = a == b +instance Ord MetaValue where + compare (MetaValue _ x) (MetaValue _ y) = compare x y + +{- MetaData is serialized to a format like: + - + - field1 +val1 +val2 -val3 field2 +val4 +val5 + -} +class MetaSerializable v where + serialize :: v -> String + deserialize :: String -> Maybe v + +instance MetaSerializable MetaData where + serialize (MetaData m) = unwords $ concatMap go $ M.toList m + where + go (f, vs) = serialize f : map serialize (S.toList vs) + deserialize = Just . getfield emptyMetaData . words + where + getfield m [] = m + getfield m (w:ws) = maybe m (getvalues m ws) (deserialize w) + getvalues m [] _ = m + getvalues m l@(w:ws) f = case deserialize w of + Just v -> getvalues (updateMetaData f v m) ws f + Nothing -> getfield m l + +instance MetaSerializable MetaField where + serialize (MetaField f) = CI.original f + deserialize = Just . mkMetaFieldUnchecked + +{- Base64 problimatic values. -} +instance MetaSerializable MetaValue where + serialize (MetaValue isset v) = + serialize isset ++ + if any isSpace v || "!" `isPrefixOf` v + then '!' : toB64 v + else v + deserialize (isset:'!':v) = MetaValue + <$> deserialize [isset] + <*> fromB64Maybe v + deserialize (isset:v) = MetaValue + <$> deserialize [isset] + <*> pure v + deserialize [] = Nothing + +instance MetaSerializable CurrentlySet where + serialize (CurrentlySet True) = "+" + serialize (CurrentlySet False) = "-" + deserialize "+" = Just (CurrentlySet True) + deserialize "-" = Just (CurrentlySet False) + deserialize _ = Nothing + +mkMetaField :: String -> Either String MetaField +mkMetaField f = maybe (Left $ badField f) Right (toMetaField f) + +badField :: String -> String +badField f = "Illegal metadata field name, \"" ++ f ++ "\"" + +{- Does not check that the field name is valid. Use with caution. -} +mkMetaFieldUnchecked :: String -> MetaField +mkMetaFieldUnchecked = MetaField . CI.mk + +toMetaField :: String -> Maybe MetaField +toMetaField f + | legalField f = Just $ MetaField $ CI.mk f + | otherwise = Nothing + +{- Fields cannot be empty, contain whitespace, or start with "+-" as + - that would break the serialization. + - + - Additionally, fields should not contain any form of path separator, as + - that would break views. + - + - So, require they have an alphanumeric first letter, with the remainder + - being either alphanumeric or a small set of whitelisted common punctuation. + -} +legalField :: String -> Bool +legalField [] = False +legalField (c1:cs) + | not (isAlphaNum c1) = False + | otherwise = all legalchars cs + where + legalchars c + | isAlphaNum c = True + | otherwise = c `elem` "_-." + +toMetaValue :: String -> MetaValue +toMetaValue = MetaValue (CurrentlySet True) + +mkMetaValue :: CurrentlySet -> String -> MetaValue +mkMetaValue = MetaValue + +unsetMetaValue :: MetaValue -> MetaValue +unsetMetaValue (MetaValue _ s) = MetaValue (CurrentlySet False) s + +{- Marks all MetaValues as no longer currently set. -} +unsetMetaData :: MetaData -> MetaData +unsetMetaData (MetaData m) = MetaData $ M.map (S.map unsetMetaValue) m + +fromMetaField :: MetaField -> String +fromMetaField (MetaField f) = CI.original f + +fromMetaValue :: MetaValue -> String +fromMetaValue (MetaValue _ f) = f + +fromMetaData :: MetaData -> [(MetaField, S.Set MetaValue)] +fromMetaData (MetaData m) = M.toList m + +emptyMetaData :: MetaData +emptyMetaData = MetaData M.empty + +{- Can be used to set a value, or to unset it, depending on whether + - the MetaValue has CurrentlySet or not. -} +updateMetaData :: MetaField -> MetaValue -> MetaData -> MetaData +updateMetaData f v (MetaData m) = MetaData $ + M.insertWith' S.union f (S.singleton v) m + +{- New metadata overrides old._-} +unionMetaData :: MetaData -> MetaData -> MetaData +unionMetaData (MetaData old) (MetaData new) = MetaData $ + M.unionWith S.union new old + +combineMetaData :: [MetaData] -> MetaData +combineMetaData = foldl' unionMetaData emptyMetaData + +differenceMetaData :: MetaData -> MetaData -> MetaData +differenceMetaData (MetaData m) (MetaData excludem) = MetaData $ + M.differenceWith diff m excludem + where + diff sl sr = + let s = S.difference sl sr + in if S.null s then Nothing else Just s + +isSet :: MetaValue -> Bool +isSet (MetaValue (CurrentlySet isset) _) = isset + +{- Gets only currently set values -} +currentMetaDataValues :: MetaField -> MetaData -> S.Set MetaValue +currentMetaDataValues f m = S.filter isSet (metaDataValues f m) + +currentMetaData :: MetaData -> MetaData +currentMetaData (MetaData m) = removeEmptyFields $ MetaData $ + M.map (S.filter isSet) m + +removeEmptyFields :: MetaData -> MetaData +removeEmptyFields (MetaData m) = MetaData $ M.filter (not . S.null) m + +{- Gets currently set values, but also values that have been unset. -} +metaDataValues :: MetaField -> MetaData -> S.Set MetaValue +metaDataValues f (MetaData m) = fromMaybe S.empty (M.lookup f m) + +{- Ways that existing metadata can be modified -} +data ModMeta + = AddMeta MetaField MetaValue + | DelMeta MetaField MetaValue + | SetMeta MetaField MetaValue -- removes any existing values + | MaybeSetMeta MetaField MetaValue -- when field has no existing value + +{- Applies a ModMeta, generating the new MetaData. + - Note that the new MetaData does not include all the + - values set in the input metadata. It only contains changed values. -} +modMeta :: MetaData -> ModMeta -> MetaData +modMeta _ (AddMeta f v) = updateMetaData f v emptyMetaData +modMeta _ (DelMeta f oldv) = updateMetaData f (unsetMetaValue oldv) emptyMetaData +modMeta m (SetMeta f v) = updateMetaData f v $ + foldr (updateMetaData f) emptyMetaData $ + map unsetMetaValue $ S.toList $ currentMetaDataValues f m +modMeta m (MaybeSetMeta f v) + | S.null (currentMetaDataValues f m) = updateMetaData f v emptyMetaData + | otherwise = emptyMetaData + +{- Parses field=value, field+=value, field-=value, field?=value -} +parseModMeta :: String -> Either String ModMeta +parseModMeta p = case lastMaybe f of + Just '+' -> AddMeta <$> mkMetaField f' <*> v + Just '-' -> DelMeta <$> mkMetaField f' <*> v + Just '?' -> MaybeSetMeta <$> mkMetaField f' <*> v + _ -> SetMeta <$> mkMetaField f <*> v + where + (f, sv) = separate (== '=') p + f' = beginning f + v = pure (toMetaValue sv) + +{- Parses field=value -} +parseMetaData :: String -> Either String (MetaField, MetaValue) +parseMetaData p = (,) + <$> mkMetaField f + <*> pure (toMetaValue v) + where + (f, v) = separate (== '=') p + +{- Avoid putting too many fields in the map; extremely large maps make + - the seriaization test slow due to the sheer amount of data. + - It's unlikely that more than 100 fields of metadata will be used. -} +instance Arbitrary MetaData where + arbitrary = do + size <- arbitrarySizedBoundedIntegral `suchThat` (< 500) + MetaData . M.filterWithKey legal . M.fromList <$> vector size + where + legal k _v = legalField $ fromMetaField k + +instance Arbitrary MetaValue where + arbitrary = MetaValue <$> arbitrary <*> arbitrary + +instance Arbitrary MetaField where + arbitrary = MetaField . CI.mk <$> arbitrary `suchThat` legalField + +prop_metadata_sane :: MetaData -> MetaField -> MetaValue -> Bool +prop_metadata_sane m f v = and + [ S.member v $ metaDataValues f m' + , not (isSet v) || S.member v (currentMetaDataValues f m') + , differenceMetaData m' emptyMetaData == m' + ] + where + m' = updateMetaData f v m + +prop_metadata_serialize :: MetaField -> MetaValue -> MetaData -> Bool +prop_metadata_serialize f v m = and + [ deserialize (serialize f) == Just f + , deserialize (serialize v) == Just v + , deserialize (serialize m') == Just m' + ] + where + m' = removeEmptyFields m diff --git a/Types/NumCopies.hs b/Types/NumCopies.hs new file mode 100644 index 000000000..b93fcf968 --- /dev/null +++ b/Types/NumCopies.hs @@ -0,0 +1,14 @@ +{- git-annex numcopies type + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.NumCopies where + +newtype NumCopies = NumCopies Int + deriving (Ord, Eq) + +fromNumCopies :: NumCopies -> Int +fromNumCopies (NumCopies n) = n diff --git a/Types/Option.hs b/Types/Option.hs new file mode 100644 index 000000000..036257838 --- /dev/null +++ b/Types/Option.hs @@ -0,0 +1,17 @@ +{- git-annex command options + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Option where + +import System.Console.GetOpt + +import Annex + +{- Each dashed command-line option results in generation of an action + - in the Annex monad that performs the necessary setting. + -} +type Option = OptDescr (Annex ()) diff --git a/Types/Remote.hs b/Types/Remote.hs new file mode 100644 index 000000000..2ddb68dfb --- /dev/null +++ b/Types/Remote.hs @@ -0,0 +1,107 @@ +{- git-annex remotes types + - + - Most things should not need this, using Types instead + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Remote + ( RemoteConfigKey + , RemoteConfig + , RemoteTypeA(..) + , RemoteA(..) + , Availability(..) + ) + where + +import Data.Map as M +import Data.Ord + +import qualified Git +import Types.Key +import Types.UUID +import Types.GitConfig +import Types.Availability +import Types.Creds +import Config.Cost +import Utility.Metered +import Git.Types +import Utility.SafeCommand + +type RemoteConfigKey = String +type RemoteConfig = M.Map RemoteConfigKey String + +{- There are different types of remotes. -} +data RemoteTypeA a = RemoteType { + -- human visible type name + typename :: String, + -- enumerates remotes of this type + enumerate :: a [Git.Repo], + -- generates a remote of this type + generate :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> a (Maybe (RemoteA a)), + -- initializes or changes a remote + setup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> a (RemoteConfig, UUID) +} + +instance Eq (RemoteTypeA a) where + x == y = typename x == typename y + +{- An individual remote. -} +data RemoteA a = Remote { + -- each Remote has a unique uuid + uuid :: UUID, + -- each Remote has a human visible name + name :: RemoteName, + -- Remotes have a use cost; higher is more expensive + cost :: Cost, + -- Transfers a key to the remote. + storeKey :: Key -> AssociatedFile -> MeterUpdate -> a Bool, + -- Retrieves a key's contents to a file. + -- (The MeterUpdate does not need to be used if it retrieves + -- directly to the file, and not to an intermediate file.) + retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a Bool, + -- retrieves a key's contents to a tmp file, if it can be done cheaply + retrieveKeyFileCheap :: Key -> FilePath -> a Bool, + -- removes a key's contents + removeKey :: Key -> a Bool, + -- Checks if a key is present in the remote; if the remote + -- cannot be accessed returns a Left error message. + hasKey :: Key -> a (Either String Bool), + -- Some remotes can check hasKey without an expensive network + -- operation. + hasKeyCheap :: Bool, + -- Some remotes can provide additional details for whereis. + whereisKey :: Maybe (Key -> a [String]), + -- Some remotes can run a fsck operation on the remote, + -- without transferring all the data to the local repo + -- The parameters are passed to the fsck command on the remote. + remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)), + -- Runs an action to repair the remote's git repository. + repairRepo :: Maybe (a Bool -> a (IO Bool)), + -- a Remote has a persistent configuration store + config :: RemoteConfig, + -- git repo for the Remote + repo :: Git.Repo, + -- a Remote's configuration from git + gitconfig :: RemoteGitConfig, + -- a Remote can be assocated with a specific local filesystem path + localpath :: Maybe FilePath, + -- a Remote can be known to be readonly + readonly :: Bool, + -- a Remote can be globally available. (Ie, "in the cloud".) + availability :: Availability, + -- the type of the remote + remotetype :: RemoteTypeA a +} + +instance Show (RemoteA a) where + show remote = "Remote { name =\"" ++ name remote ++ "\" }" + +-- two remotes are the same if they have the same uuid +instance Eq (RemoteA a) where + x == y = uuid x == uuid y + +instance Ord (RemoteA a) where + compare = comparing uuid diff --git a/Types/ScheduledActivity.hs b/Types/ScheduledActivity.hs new file mode 100644 index 000000000..b683409ce --- /dev/null +++ b/Types/ScheduledActivity.hs @@ -0,0 +1,69 @@ +{- git-annex scheduled activities + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.ScheduledActivity where + +import Common +import Utility.Scheduled +import Utility.HumanTime +import Types.UUID + +import Data.Either + +data ScheduledActivity + = ScheduledSelfFsck Schedule Duration + | ScheduledRemoteFsck UUID Schedule Duration + deriving (Eq, Read, Show, Ord) + +{- Activities that run on a remote, within a time window, so + - should be run when the remote gets connected. -} +connectActivityUUID :: ScheduledActivity -> Maybe UUID +connectActivityUUID (ScheduledRemoteFsck u (Schedule _ AnyTime) _) = Just u +connectActivityUUID _ = Nothing + +getSchedule :: ScheduledActivity -> Schedule +getSchedule (ScheduledSelfFsck s _) = s +getSchedule (ScheduledRemoteFsck _ s _) = s + +getDuration :: ScheduledActivity -> Duration +getDuration (ScheduledSelfFsck _ d) = d +getDuration (ScheduledRemoteFsck _ _ d) = d + +fromScheduledActivity :: ScheduledActivity -> String +fromScheduledActivity (ScheduledSelfFsck s d) = unwords + [ "fsck self", fromDuration d, fromSchedule s ] +fromScheduledActivity (ScheduledRemoteFsck u s d) = unwords + [ "fsck", fromUUID u, fromDuration d, fromSchedule s ] + +toScheduledActivity :: String -> Maybe ScheduledActivity +toScheduledActivity = eitherToMaybe . parseScheduledActivity + +parseScheduledActivity :: String -> Either String ScheduledActivity +parseScheduledActivity s = case words s of + ("fsck":"self":d:rest) -> qualified $ ScheduledSelfFsck + <$> parseSchedule (unwords rest) + <*> getduration d + ("fsck":u:d:rest) -> qualified $ ScheduledRemoteFsck + <$> pure (toUUID u) + <*> parseSchedule (unwords rest) + <*> getduration d + _ -> qualified $ Left "unknown activity" + where + qualified (Left e) = Left $ e ++ " in \"" ++ s ++ "\"" + qualified v = v + getduration d = maybe (Left $ "failed to parse duration \""++d++"\"") Right (parseDuration d) + +fromScheduledActivities :: [ScheduledActivity] -> String +fromScheduledActivities = intercalate "; " . map fromScheduledActivity + +parseScheduledActivities :: String -> Either String [ScheduledActivity] +parseScheduledActivities s + | null bad = Right good + | otherwise = Left $ intercalate "; " bad + where + (bad, good) = partitionEithers $ + map parseScheduledActivity $ split "; " s diff --git a/Types/StandardGroups.hs b/Types/StandardGroups.hs new file mode 100644 index 000000000..37ba6e9c6 --- /dev/null +++ b/Types/StandardGroups.hs @@ -0,0 +1,105 @@ +{- git-annex standard repository groups + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.StandardGroups where + +import Types.Remote (RemoteConfig) +import Types.Group + +import qualified Data.Map as M +import Data.Maybe + +type PreferredContentExpression = String + +data StandardGroup + = ClientGroup + | TransferGroup + | BackupGroup + | IncrementalBackupGroup + | SmallArchiveGroup + | FullArchiveGroup + | SourceGroup + | ManualGroup + | PublicGroup + | UnwantedGroup + deriving (Eq, Ord, Enum, Bounded, Show) + +fromStandardGroup :: StandardGroup -> Group +fromStandardGroup ClientGroup = "client" +fromStandardGroup TransferGroup = "transfer" +fromStandardGroup BackupGroup = "backup" +fromStandardGroup IncrementalBackupGroup = "incrementalbackup" +fromStandardGroup SmallArchiveGroup = "smallarchive" +fromStandardGroup FullArchiveGroup = "archive" +fromStandardGroup SourceGroup = "source" +fromStandardGroup ManualGroup = "manual" +fromStandardGroup PublicGroup = "public" +fromStandardGroup UnwantedGroup = "unwanted" + +toStandardGroup :: Group -> Maybe StandardGroup +toStandardGroup "client" = Just ClientGroup +toStandardGroup "transfer" = Just TransferGroup +toStandardGroup "backup" = Just BackupGroup +toStandardGroup "incrementalbackup" = Just IncrementalBackupGroup +toStandardGroup "smallarchive" = Just SmallArchiveGroup +toStandardGroup "archive" = Just FullArchiveGroup +toStandardGroup "source" = Just SourceGroup +toStandardGroup "manual" = Just ManualGroup +toStandardGroup "public" = Just PublicGroup +toStandardGroup "unwanted" = Just UnwantedGroup +toStandardGroup _ = Nothing + +descStandardGroup :: StandardGroup -> String +descStandardGroup ClientGroup = "client: a repository on your computer" +descStandardGroup TransferGroup = "transfer: distributes files to clients" +descStandardGroup BackupGroup = "full backup: backs up all files" +descStandardGroup IncrementalBackupGroup = "incremental backup: backs up files not backed up elsewhere" +descStandardGroup SmallArchiveGroup = "small archive: archives files located in \"archive\" directories" +descStandardGroup FullArchiveGroup = "full archive: archives all files not archived elsewhere" +descStandardGroup SourceGroup = "file source: moves files on to other repositories" +descStandardGroup ManualGroup = "manual mode: only stores files you manually choose" +descStandardGroup UnwantedGroup = "unwanted: remove content from this repository" +descStandardGroup PublicGroup = "public: publishes files located in an associated directory" + +associatedDirectory :: Maybe RemoteConfig -> StandardGroup -> Maybe FilePath +associatedDirectory _ SmallArchiveGroup = Just "archive" +associatedDirectory _ FullArchiveGroup = Just "archive" +associatedDirectory (Just c) PublicGroup = Just $ + fromMaybe "public" $ M.lookup "preferreddir" c +associatedDirectory Nothing PublicGroup = Just "public" +associatedDirectory _ _ = Nothing + +specialRemoteOnly :: StandardGroup -> Bool +specialRemoteOnly PublicGroup = True +specialRemoteOnly _ = False + +{- See doc/preferred_content.mdwn for explanations of these expressions. -} +standardPreferredContent :: StandardGroup -> PreferredContentExpression +standardPreferredContent ClientGroup = lastResort $ + "((exclude=*/archive/* and exclude=archive/*) or (" ++ notArchived ++ ")) and not unused" +standardPreferredContent TransferGroup = lastResort $ + "not (inallgroup=client and copies=client:2) and (" ++ standardPreferredContent ClientGroup ++ ")" +standardPreferredContent BackupGroup = "include=* or unused" +standardPreferredContent IncrementalBackupGroup = lastResort + "(include=* or unused) and (not copies=incrementalbackup:1)" +standardPreferredContent SmallArchiveGroup = lastResort $ + "(include=*/archive/* or include=archive/*) and (" ++ standardPreferredContent FullArchiveGroup ++ ")" +standardPreferredContent FullArchiveGroup = lastResort notArchived +standardPreferredContent SourceGroup = "not (copies=1)" +standardPreferredContent ManualGroup = "present and (" ++ standardPreferredContent ClientGroup ++ ")" +standardPreferredContent PublicGroup = "inpreferreddir" +standardPreferredContent UnwantedGroup = "exclude=*" + +notArchived :: String +notArchived = "not (copies=archive:1 or copies=smallarchive:1)" + +{- Most repositories want any content that is only on untrusted + - or dead repositories, or that otherwise does not have enough copies. + - Does not look at .gitattributes since that is quite a lot slower. + -} +lastResort :: String -> PreferredContentExpression +lastResort s = "(" ++ s ++ ") or approxlackingcopies=1" diff --git a/Types/TrustLevel.hs b/Types/TrustLevel.hs new file mode 100644 index 000000000..a72dbb8c6 --- /dev/null +++ b/Types/TrustLevel.hs @@ -0,0 +1,43 @@ +{- git-annex trust levels + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.TrustLevel ( + TrustLevel(..), + TrustMap, + readTrustLevel, + showTrustLevel, + prop_read_show_TrustLevel +) where + +import qualified Data.Map as M + +import Types.UUID + +-- This order may seem backwards, but we generally want to list dead +-- remotes last and trusted ones first. +data TrustLevel = Trusted | SemiTrusted | UnTrusted | DeadTrusted + deriving (Eq, Enum, Ord, Bounded) + +type TrustMap = M.Map UUID TrustLevel + +readTrustLevel :: String -> Maybe TrustLevel +readTrustLevel "trusted" = Just Trusted +readTrustLevel "untrusted" = Just UnTrusted +readTrustLevel "semitrusted" = Just SemiTrusted +readTrustLevel "dead" = Just DeadTrusted +readTrustLevel _ = Nothing + +showTrustLevel :: TrustLevel -> String +showTrustLevel Trusted = "trusted" +showTrustLevel UnTrusted = "untrusted" +showTrustLevel SemiTrusted = "semitrusted" +showTrustLevel DeadTrusted = "dead" + +prop_read_show_TrustLevel :: Bool +prop_read_show_TrustLevel = all check [minBound .. maxBound] + where + check l = readTrustLevel (showTrustLevel l) == Just l diff --git a/Types/UUID.hs b/Types/UUID.hs new file mode 100644 index 000000000..df3884059 --- /dev/null +++ b/Types/UUID.hs @@ -0,0 +1,29 @@ +{- git-annex UUID type + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.UUID where + +import qualified Data.Map as M +import qualified Data.UUID as U +import Data.Maybe + +-- A UUID is either an arbitrary opaque string, or UUID info may be missing. +data UUID = NoUUID | UUID String + deriving (Eq, Ord, Show, Read) + +fromUUID :: UUID -> String +fromUUID (UUID u) = u +fromUUID NoUUID = "" + +toUUID :: String -> UUID +toUUID [] = NoUUID +toUUID s = UUID s + +isUUID :: String -> Bool +isUUID = isJust . U.fromString + +type UUIDMap = M.Map UUID String diff --git a/Types/View.hs b/Types/View.hs new file mode 100644 index 000000000..43afdb8c8 --- /dev/null +++ b/Types/View.hs @@ -0,0 +1,60 @@ +{- types for metadata based branch views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.View where + +import Common.Annex +import Types.MetaData +import Utility.QuickCheck +import qualified Git + +import qualified Data.Set as S + +{- A view is a list of fields with filters on their allowed values, + - which are applied to files in a parent git branch. -} +data View = View + { viewParentBranch :: Git.Branch + , viewComponents :: [ViewComponent] + } + deriving (Eq, Read, Show) + +instance Arbitrary View where + arbitrary = View <$> pure (Git.Ref "master") <*> arbitrary + +data ViewComponent = ViewComponent + { viewField :: MetaField + , viewFilter :: ViewFilter + , viewVisible :: Bool + } + deriving (Eq, Read, Show) + +instance Arbitrary ViewComponent where + arbitrary = ViewComponent <$> arbitrary <*> arbitrary <*> arbitrary + +data ViewFilter + = FilterValues (S.Set MetaValue) + | FilterGlob String + | ExcludeValues (S.Set MetaValue) + deriving (Eq, Read, Show) + +instance Arbitrary ViewFilter where + arbitrary = do + size <- arbitrarySizedBoundedIntegral `suchThat` (< 100) + s <- S.fromList <$> vector size + ifM arbitrary + ( return (FilterValues s) + , return (ExcludeValues s) + ) + +mkViewComponent :: MetaField -> ViewFilter -> ViewComponent +mkViewComponent f vf = ViewComponent f vf (multiValue vf) + +{- Can a ViewFilter match multiple different MetaValues? -} +multiValue :: ViewFilter -> Bool +multiValue (FilterValues s) = S.size s > 1 +multiValue (FilterGlob _) = True +multiValue (ExcludeValues _) = False diff --git a/Upgrade.hs b/Upgrade.hs new file mode 100644 index 000000000..8566f0d5d --- /dev/null +++ b/Upgrade.hs @@ -0,0 +1,56 @@ +{- git-annex upgrade support + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Upgrade where + +import Common.Annex +import Annex.Version +#ifndef mingw32_HOST_OS +import qualified Upgrade.V0 +import qualified Upgrade.V1 +#endif +import qualified Upgrade.V2 +import qualified Upgrade.V3 +import qualified Upgrade.V4 + +checkUpgrade :: Version -> Annex () +checkUpgrade = maybe noop error <=< needsUpgrade + +needsUpgrade :: Version -> Annex (Maybe String) +needsUpgrade v + | v == supportedVersion = ok + | v `elem` autoUpgradeableVersions = ifM (upgrade True) + ( ok + , err "Automatic upgrade failed!" + ) + | v `elem` upgradableVersions = err "Upgrade this repository: git-annex upgrade" + | otherwise = err "Upgrade git-annex." + where + err msg = return $ Just $ "Repository version " ++ v ++ + " is not supported. " ++ msg + ok = return Nothing + +upgrade :: Bool -> Annex Bool +upgrade automatic = do + upgraded <- go =<< getVersion + when upgraded $ + setVersion supportedVersion + return upgraded + where +#ifndef mingw32_HOST_OS + go (Just "0") = Upgrade.V0.upgrade + go (Just "1") = Upgrade.V1.upgrade +#else + go (Just "0") = error "upgrade from v0 on Windows not supported" + go (Just "1") = error "upgrade from v1 on Windows not supported" +#endif + go (Just "2") = Upgrade.V2.upgrade + go (Just "3") = Upgrade.V3.upgrade automatic + go (Just "4") = Upgrade.V4.upgrade automatic + go _ = return True diff --git a/Upgrade/V0.hs b/Upgrade/V0.hs new file mode 100644 index 000000000..00a08cb45 --- /dev/null +++ b/Upgrade/V0.hs @@ -0,0 +1,49 @@ +{- git-annex v0 -> v1 upgrade support + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V0 where + +import Common.Annex +import Annex.Content +import qualified Upgrade.V1 + +upgrade :: Annex Bool +upgrade = do + showAction "v0 to v1" + + -- do the reorganisation of the key files + olddir <- fromRepo gitAnnexDir + keys <- getKeysPresent0 olddir + forM_ keys $ \k -> moveAnnex k $ olddir keyFile0 k + + -- update the symlinks to the key files + -- No longer needed here; V1.upgrade does the same thing + + -- Few people had v0 repos, so go the long way around from 0 -> 1 -> 2 + Upgrade.V1.upgrade + +-- these stayed unchanged between v0 and v1 +keyFile0 :: Key -> FilePath +keyFile0 = Upgrade.V1.keyFile1 +fileKey0 :: FilePath -> Key +fileKey0 = Upgrade.V1.fileKey1 +lookupFile0 :: FilePath -> Annex (Maybe (Key, Backend)) +lookupFile0 = Upgrade.V1.lookupFile1 + +getKeysPresent0 :: FilePath -> Annex [Key] +getKeysPresent0 dir = ifM (liftIO $ doesDirectoryExist dir) + ( liftIO $ map fileKey0 + <$> (filterM present =<< getDirectoryContents dir) + , return [] + ) + where + present d = do + result <- tryIO $ + getFileStatus $ dir ++ "/" ++ takeFileName d + case result of + Right s -> return $ isRegularFile s + Left _ -> return False diff --git a/Upgrade/V1.hs b/Upgrade/V1.hs new file mode 100644 index 000000000..8af4848a1 --- /dev/null +++ b/Upgrade/V1.hs @@ -0,0 +1,241 @@ +{- git-annex v1 -> v2 upgrade support + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V1 where + +import System.Posix.Types +import Data.Char + +import Common.Annex +import Types.Key +import Annex.Content +import Logs.Presence +import qualified Annex.Queue +import qualified Git +import qualified Git.LsFiles as LsFiles +import Backend +import Annex.Version +import Utility.FileMode +import Utility.Tmp +import qualified Upgrade.V2 + +-- v2 adds hashing of filenames of content and location log files. +-- Key information is encoded in filenames differently, so +-- both content and location log files move around, and symlinks +-- to content need to be changed. +-- +-- When upgrading a v1 key to v2, file size metadata ought to be +-- added to the key (unless it is a WORM key, which encoded +-- mtime:size in v1). This can only be done when the file content +-- is present. Since upgrades need to happen consistently, +-- (so that two repos get changed the same way by the upgrade, and +-- will merge), that metadata cannot be added on upgrade. +-- +-- Note that file size metadata +-- will only be used for detecting situations where git-annex +-- would run out of disk space, so if some keys don't have it, +-- the impact is minor. At least initially. It could be used in the +-- future by smart auto-repo balancing code, etc. +-- +-- Anyway, since v2 plans ahead for other metadata being included +-- in keys, there should probably be a way to update a key. +-- Something similar to the migrate subcommand could be used, +-- and users could then run that at their leisure. + +upgrade :: Annex Bool +upgrade = do + showAction "v1 to v2" + + ifM (fromRepo Git.repoIsLocalBare) + ( do + moveContent + setVersion supportedVersion + , do + moveContent + updateSymlinks + moveLocationLogs + + Annex.Queue.flush + setVersion supportedVersion + ) + + Upgrade.V2.upgrade + +moveContent :: Annex () +moveContent = do + showAction "moving content" + files <- getKeyFilesPresent1 + forM_ files move + where + move f = do + let k = fileKey1 (takeFileName f) + let d = parentDir f + liftIO $ allowWrite d + liftIO $ allowWrite f + moveAnnex k f + liftIO $ removeDirectory d + +updateSymlinks :: Annex () +updateSymlinks = do + showAction "updating symlinks" + top <- fromRepo Git.repoPath + (files, cleanup) <- inRepo $ LsFiles.inRepo [top] + forM_ files fixlink + void $ liftIO cleanup + where + fixlink f = do + r <- lookupFile1 f + case r of + Nothing -> noop + Just (k, _) -> do + link <- inRepo $ gitAnnexLink f k + liftIO $ removeFile f + liftIO $ createSymbolicLink link f + Annex.Queue.addCommand "add" [Param "--"] [f] + +moveLocationLogs :: Annex () +moveLocationLogs = do + showAction "moving location logs" + logkeys <- oldlocationlogs + forM_ logkeys move + where + oldlocationlogs = do + dir <- fromRepo Upgrade.V2.gitStateDir + ifM (liftIO $ doesDirectoryExist dir) + ( mapMaybe oldlog2key + <$> liftIO (getDirectoryContents dir) + , return [] + ) + move (l, k) = do + dest <- fromRepo $ logFile2 k + dir <- fromRepo Upgrade.V2.gitStateDir + let f = dir l + liftIO $ createDirectoryIfMissing True (parentDir dest) + -- could just git mv, but this way deals with + -- log files that are not checked into git, + -- as well as merging with already upgraded + -- logs that have been pulled from elsewhere + old <- liftIO $ readLog1 f + new <- liftIO $ readLog1 dest + liftIO $ writeLog1 dest (old++new) + Annex.Queue.addCommand "add" [Param "--"] [dest] + Annex.Queue.addCommand "add" [Param "--"] [f] + Annex.Queue.addCommand "rm" [Param "--quiet", Param "-f", Param "--"] [f] + +oldlog2key :: FilePath -> Maybe (FilePath, Key) +oldlog2key l + | drop len l == ".log" && sane = Just (l, k) + | otherwise = Nothing + where + len = length l - 4 + k = readKey1 (take len l) + sane = (not . null $ keyName k) && (not . null $ keyBackendName k) + +-- WORM backend keys: "WORM:mtime:size:filename" +-- all the rest: "backend:key" +-- +-- If the file looks like "WORM:XXX-...", then it was created by mixing +-- v2 and v1; that infelicity is worked around by treating the value +-- as the v2 key that it is. +readKey1 :: String -> Key +readKey1 v + | mixup = fromJust $ file2key $ intercalate ":" $ Prelude.tail bits + | otherwise = Key + { keyName = n + , keyBackendName = b + , keySize = s + , keyMtime = t + } + where + bits = split ":" v + b = Prelude.head bits + n = intercalate ":" $ drop (if wormy then 3 else 1) bits + t = if wormy + then Just (Prelude.read (bits !! 1) :: EpochTime) + else Nothing + s = if wormy + then Just (Prelude.read (bits !! 2) :: Integer) + else Nothing + wormy = Prelude.head bits == "WORM" + mixup = wormy && isUpper (Prelude.head $ bits !! 1) + +showKey1 :: Key -> String +showKey1 Key { keyName = n , keyBackendName = b, keySize = s, keyMtime = t } = + intercalate ":" $ filter (not . null) [b, showifhere t, showifhere s, n] + where + showifhere Nothing = "" + showifhere (Just v) = show v + +keyFile1 :: Key -> FilePath +keyFile1 key = replace "/" "%" $ replace "%" "&s" $ replace "&" "&a" $ showKey1 key + +fileKey1 :: FilePath -> Key +fileKey1 file = readKey1 $ + replace "&a" "&" $ replace "&s" "%" $ replace "%" "/" file + +writeLog1 :: FilePath -> [LogLine] -> IO () +writeLog1 file ls = viaTmp writeFile file (showLog ls) + +readLog1 :: FilePath -> IO [LogLine] +readLog1 file = catchDefaultIO [] $ + parseLog <$> readFileStrict file + +lookupFile1 :: FilePath -> Annex (Maybe (Key, Backend)) +lookupFile1 file = do + tl <- liftIO $ tryIO getsymlink + case tl of + Left _ -> return Nothing + Right l -> makekey l + where + getsymlink = takeFileName <$> readSymbolicLink file + makekey l = case maybeLookupBackendName bname of + Nothing -> do + unless (null kname || null bname || + not (isLinkToAnnex l)) $ + warning skip + return Nothing + Just backend -> return $ Just (k, backend) + where + k = fileKey1 l + bname = keyBackendName k + kname = keyName k + skip = "skipping " ++ file ++ + " (unknown backend " ++ bname ++ ")" + +getKeyFilesPresent1 :: Annex [FilePath] +getKeyFilesPresent1 = getKeyFilesPresent1' =<< fromRepo gitAnnexObjectDir +getKeyFilesPresent1' :: FilePath -> Annex [FilePath] +getKeyFilesPresent1' dir = + ifM (liftIO $ doesDirectoryExist dir) + ( do + dirs <- liftIO $ getDirectoryContents dir + let files = map (\d -> dir ++ "/" ++ d ++ "/" ++ takeFileName d) dirs + liftIO $ filterM present files + , return [] + ) + where + present f = do + result <- tryIO $ getFileStatus f + case result of + Right s -> return $ isRegularFile s + Left _ -> return False + +logFile1 :: Git.Repo -> Key -> String +logFile1 repo key = Upgrade.V2.gitStateDir repo ++ keyFile1 key ++ ".log" + +logFile2 :: Key -> Git.Repo -> String +logFile2 = logFile' hashDirLower + +logFile' :: (Key -> FilePath) -> Key -> Git.Repo -> String +logFile' hasher key repo = + gitStateDir repo ++ hasher key ++ keyFile key ++ ".log" + +stateDir :: FilePath +stateDir = addTrailingPathSeparator ".git-annex" + +gitStateDir :: Git.Repo -> FilePath +gitStateDir repo = addTrailingPathSeparator $ Git.repoPath repo stateDir diff --git a/Upgrade/V2.hs b/Upgrade/V2.hs new file mode 100644 index 000000000..0672de8b6 --- /dev/null +++ b/Upgrade/V2.hs @@ -0,0 +1,140 @@ +{- git-annex v2 -> v3 upgrade support + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V2 where + +import Common.Annex +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Annex.Branch +import Annex.Content +import Utility.Tmp +import Logs + +olddir :: Git.Repo -> FilePath +olddir g + | Git.repoIsLocalBare g = "" + | otherwise = ".git-annex" + +{- .git-annex/ moved to a git-annex branch. + - + - Strategy: + - + - * Create the git-annex branch. + - * Find each location log file in .git-annex/, and inject its content + - into the git-annex branch, unioning with any content already in + - there. (in passing, this deals with the semi transition that left + - some location logs hashed two different ways; both are found and + - merged). + - * Also inject remote.log, trust.log, and uuid.log. + - * git rm -rf .git-annex + - * Remove stuff that used to be needed in .gitattributes. + - * Commit changes. + -} +upgrade :: Annex Bool +upgrade = do + showAction "v2 to v3" + bare <- fromRepo Git.repoIsLocalBare + old <- fromRepo olddir + + Annex.Branch.create + showProgress + + e <- liftIO $ doesDirectoryExist old + when e $ do + mapM_ (\(k, f) -> inject f $ locationLogFile k) =<< locationLogs + mapM_ (\f -> inject f f) =<< logFiles old + + saveState False + showProgress + + when e $ do + inRepo $ Git.Command.run [Param "rm", Param "-r", Param "-f", Param "-q", File old] + unless bare $ inRepo gitAttributesUnWrite + showProgress + + unless bare push + + return True + +locationLogs :: Annex [(Key, FilePath)] +locationLogs = do + dir <- fromRepo gitStateDir + liftIO $ do + levela <- dirContents dir + levelb <- mapM tryDirContents levela + files <- mapM tryDirContents (concat levelb) + return $ mapMaybe islogfile (concat files) + where + tryDirContents d = catchDefaultIO [] $ dirContents d + islogfile f = maybe Nothing (\k -> Just (k, f)) $ + locationLogFileKey f + +inject :: FilePath -> FilePath -> Annex () +inject source dest = do + old <- fromRepo olddir + new <- liftIO (readFile $ old source) + Annex.Branch.change dest $ \prev -> + unlines $ nub $ lines prev ++ lines new + +logFiles :: FilePath -> Annex [FilePath] +logFiles dir = return . filter (".log" `isSuffixOf`) + <=< liftIO $ getDirectoryContents dir + +push :: Annex () +push = do + origin_master <- inRepo $ Git.Ref.exists $ Git.Ref "origin/master" + origin_gitannex <- Annex.Branch.hasOrigin + case (origin_master, origin_gitannex) of + (_, True) -> do + -- Merge in the origin's git-annex branch, + -- so that pushing the git-annex branch + -- will immediately work. Not pushed here, + -- because it's less obnoxious to let the user + -- push. + Annex.Branch.update + (True, False) -> do + -- push git-annex to origin, so that + -- "git push" will from then on + -- automatically push it + Annex.Branch.update -- just in case + showAction "pushing new git-annex branch to origin" + showOutput + inRepo $ Git.Command.run + [ Param "push" + , Param "origin" + , Param $ Git.fromRef Annex.Branch.name + ] + _ -> do + -- no origin exists, so just let the user + -- know about the new branch + Annex.Branch.update + showLongNote $ + "git-annex branch created\n" ++ + "Be sure to push this branch when pushing to remotes.\n" + +{- Old .gitattributes contents, not needed anymore. -} +attrLines :: [String] +attrLines = + [ stateDir "*.log merge=union" + , stateDir "*/*/*.log merge=union" + ] + +gitAttributesUnWrite :: Git.Repo -> IO () +gitAttributesUnWrite repo = do + let attributes = Git.attributes repo + whenM (doesFileExist attributes) $ do + c <- readFileStrict attributes + liftIO $ viaTmp writeFile attributes $ unlines $ + filter (`notElem` attrLines) $ lines c + Git.Command.run [Param "add", File attributes] repo + +stateDir :: FilePath +stateDir = addTrailingPathSeparator ".git-annex" +gitStateDir :: Git.Repo -> FilePath +gitStateDir repo = addTrailingPathSeparator $ Git.repoPath repo stateDir diff --git a/Upgrade/V3.hs b/Upgrade/V3.hs new file mode 100644 index 000000000..38f700cf8 --- /dev/null +++ b/Upgrade/V3.hs @@ -0,0 +1,12 @@ +{- git-annex v3 -> v4 uppgrade support + - + - There was no explicit v3 to v4 upgrade, so run v5 upgrade code. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V3 (upgrade) where + +import Upgrade.V4 (upgrade) diff --git a/Upgrade/V4.hs b/Upgrade/V4.hs new file mode 100644 index 000000000..dad073d0b --- /dev/null +++ b/Upgrade/V4.hs @@ -0,0 +1,23 @@ +{- git-annex v4 -> v5 uppgrade support + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V4 where + +import Common.Annex +import Config +import Annex.Direct + +{- Direct mode only upgrade. v4 to v5 indirect update is a no-op -} +upgrade :: Bool -> Annex Bool +upgrade automatic = ifM isDirect + ( do + unless automatic $ + showAction "v4 to v5" + setDirect True + return True + , return True + ) diff --git a/Utility/Applicative.hs b/Utility/Applicative.hs new file mode 100644 index 000000000..fd8944b28 --- /dev/null +++ b/Utility/Applicative.hs @@ -0,0 +1,16 @@ +{- applicative stuff + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Applicative where + +{- Like <$> , but supports one level of currying. + - + - foo v = bar <$> action v == foo = bar <$$> action + -} +(<$$>) :: Functor f => (a -> b) -> (c -> f a) -> c -> f b +f <$$> v = fmap f . v +infixr 4 <$$> diff --git a/Utility/Base64.hs b/Utility/Base64.hs new file mode 100644 index 000000000..3f0c19965 --- /dev/null +++ b/Utility/Base64.hs @@ -0,0 +1,24 @@ +{- Simple Base64 access + - + - Copyright 2011 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Base64 (toB64, fromB64Maybe, fromB64) where + +import "dataenc" Codec.Binary.Base64 +import Data.Bits.Utils +import Control.Applicative +import Data.Maybe + +toB64 :: String -> String +toB64 = encode . s2w8 + +fromB64Maybe :: String -> Maybe String +fromB64Maybe s = w82s <$> decode s + +fromB64 :: String -> String +fromB64 = fromMaybe bad . fromB64Maybe + where + bad = error "bad base64 encoded data" diff --git a/Utility/Batch.hs b/Utility/Batch.hs new file mode 100644 index 000000000..d6dadae67 --- /dev/null +++ b/Utility/Batch.hs @@ -0,0 +1,96 @@ +{- Running a long or expensive batch operation niced. + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Batch where + +import Common + +#if defined(linux_HOST_OS) || defined(__ANDROID__) +import Control.Concurrent.Async +import System.Posix.Process +#endif +import qualified Control.Exception as E + +{- Runs an operation, at batch priority. + - + - This is done by running it in a bound thread, which on Linux can be set + - to have a different nice level than the rest of the program. Note that + - due to running in a bound thread, some operations may be more expensive + - to perform. Also note that if the action calls forkIO or forkOS itself, + - that will make a new thread that does not have the batch priority. + - + - POSIX threads do not support separate nice levels, so on other operating + - systems, the action is simply ran. + -} +batch :: IO a -> IO a +#if defined(linux_HOST_OS) || defined(__ANDROID__) +batch a = wait =<< batchthread + where + batchthread = asyncBound $ do + setProcessPriority 0 maxNice + a +#else +batch a = a +#endif + +maxNice :: Int +maxNice = 19 + +{- Makes a command be run by whichever of nice, ionice, and nocache + - are available in the path. -} +type BatchCommandMaker = (String, [CommandParam]) -> (String, [CommandParam]) + +getBatchCommandMaker :: IO BatchCommandMaker +getBatchCommandMaker = do +#ifndef mingw32_HOST_OS + nicers <- filterM (inPath . fst) + [ ("nice", []) +#ifndef __ANDROID__ + -- Android's ionice does not allow specifying a command, + -- so don't use it. + , ("ionice", ["-c3"]) +#endif + , ("nocache", []) + ] + return $ \(command, params) -> + case nicers of + [] -> (command, params) + (first:rest) -> (fst first, map Param (snd first ++ concatMap (\p -> fst p : snd p) rest ++ [command]) ++ params) +#else + return id +#endif + +toBatchCommand :: (String, [CommandParam]) -> IO (String, [CommandParam]) +toBatchCommand v = do + batchmaker <- getBatchCommandMaker + return $ batchmaker v + +{- Runs a command in a way that's suitable for batch jobs that can be + - interrupted. + - + - If the calling thread receives an async exception, it sends the + - command a SIGTERM, and after the command finishes shuttting down, + - it re-raises the async exception. -} +batchCommand :: String -> [CommandParam] -> IO Bool +batchCommand command params = batchCommandEnv command params Nothing + +batchCommandEnv :: String -> [CommandParam] -> Maybe [(String, String)] -> IO Bool +batchCommandEnv command params environ = do + batchmaker <- getBatchCommandMaker + let (command', params') = batchmaker (command, params) + let p = proc command' $ toCommand params' + (_, _, _, pid) <- createProcess $ p { env = environ } + r <- E.try (waitForProcess pid) :: IO (Either E.SomeException ExitCode) + case r of + Right ExitSuccess -> return True + Right _ -> return False + Left asyncexception -> do + terminateProcess pid + void $ waitForProcess pid + E.throwIO asyncexception diff --git a/Utility/Bloom.hs b/Utility/Bloom.hs new file mode 100644 index 000000000..e3000de3d --- /dev/null +++ b/Utility/Bloom.hs @@ -0,0 +1,60 @@ +{- bloomfilter compatability wrapper + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Bloom ( + Bloom, + suggestSizing, + Hashable, + cheapHashes, + notElemB, + + newMB, + insertMB, + unsafeFreezeMB, +) where + +#if MIN_VERSION_bloomfilter(2,0,0) +import qualified Data.BloomFilter.Mutable as MBloom +import qualified Data.BloomFilter as Bloom +#else +import qualified Data.BloomFilter as Bloom +#endif +import Data.BloomFilter.Easy (suggestSizing, Bloom) +import Data.BloomFilter.Hash (Hashable, cheapHashes) +import Control.Monad.ST.Safe (ST) + +#if MIN_VERSION_bloomfilter(2,0,0) + +notElemB :: a -> Bloom a -> Bool +notElemB = Bloom.notElem + +newMB :: (a -> [Bloom.Hash]) -> Int -> ST s (MBloom.MBloom s a) +newMB = MBloom.new + +insertMB :: MBloom.MBloom s a -> a -> ST s () +insertMB = MBloom.insert + +unsafeFreezeMB :: MBloom.MBloom s a -> ST s (Bloom a) +unsafeFreezeMB = Bloom.unsafeFreeze + +#else + +notElemB :: a -> Bloom a -> Bool +notElemB = Bloom.notElemB + +newMB :: (a -> [Bloom.Hash]) -> Int -> ST s (Bloom.MBloom s a) +newMB = Bloom.newMB + +insertMB :: Bloom.MBloom s a -> a -> ST s () +insertMB = Bloom.insertMB + +unsafeFreezeMB :: Bloom.MBloom s a -> ST s (Bloom a) +unsafeFreezeMB = Bloom.unsafeFreezeMB + +#endif diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs new file mode 100644 index 000000000..332c09d49 --- /dev/null +++ b/Utility/CoProcess.hs @@ -0,0 +1,94 @@ +{- Interface for running a shell command as a coprocess, + - sending it queries and getting back results. + - + - Copyright 2012-2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.CoProcess ( + CoProcessHandle, + start, + stop, + query, + rawMode +) where + +import Common + +import Control.Concurrent.MVar + +type CoProcessHandle = MVar CoProcessState + +data CoProcessState = CoProcessState + { coProcessPid :: ProcessHandle + , coProcessTo :: Handle + , coProcessFrom :: Handle + , coProcessSpec :: CoProcessSpec + } + +data CoProcessSpec = CoProcessSpec + { coProcessNumRestarts :: Int + , coProcessCmd :: FilePath + , coProcessParams :: [String] + , coProcessEnv :: Maybe [(String, String)] + } + +start :: Int -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle +start numrestarts cmd params environ = do + s <- start' $ CoProcessSpec numrestarts cmd params environ + newMVar s + +start' :: CoProcessSpec -> IO CoProcessState +start' s = do + (pid, from, to) <- startInteractiveProcess (coProcessCmd s) (coProcessParams s) (coProcessEnv s) + return $ CoProcessState pid to from s + +stop :: CoProcessHandle -> IO () +stop ch = do + s <- readMVar ch + hClose $ coProcessTo s + hClose $ coProcessFrom s + let p = proc (coProcessCmd $ coProcessSpec s) (coProcessParams $ coProcessSpec s) + forceSuccessProcess p (coProcessPid s) + +{- To handle a restartable process, any IO exception thrown by the send and + - receive actions are assumed to mean communication with the process + - failed, and the failed action is re-run with a new process. -} +query :: CoProcessHandle -> (Handle -> IO a) -> (Handle -> IO b) -> IO b +query ch send receive = do + s <- readMVar ch + restartable s (send $ coProcessTo s) $ const $ + restartable s (hFlush $ coProcessTo s) $ const $ + restartable s (receive $ coProcessFrom s) + return + where + restartable s a cont + | coProcessNumRestarts (coProcessSpec s) > 0 = + maybe restart cont =<< catchMaybeIO a + | otherwise = cont =<< a + restart = do + s <- takeMVar ch + void $ catchMaybeIO $ do + hClose $ coProcessTo s + hClose $ coProcessFrom s + void $ waitForProcess $ coProcessPid s + s' <- start' $ (coProcessSpec s) + { coProcessNumRestarts = coProcessNumRestarts (coProcessSpec s) - 1 } + putMVar ch s' + query ch send receive + +rawMode :: CoProcessHandle -> IO CoProcessHandle +rawMode ch = do + s <- readMVar ch + raw $ coProcessFrom s + raw $ coProcessTo s + return ch + where + raw h = do + fileEncoding h +#ifdef mingw32_HOST_OS + hSetNewlineMode h noNewlineTranslation +#endif diff --git a/Utility/CopyFile.hs b/Utility/CopyFile.hs new file mode 100644 index 000000000..e3ccd0a2b --- /dev/null +++ b/Utility/CopyFile.hs @@ -0,0 +1,48 @@ +{- file copying + - + - Copyright 2010-2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.CopyFile ( + copyFileExternal, + createLinkOrCopy +) where + +import Common +import qualified Build.SysConfig as SysConfig + +{- The cp command is used, because I hate reinventing the wheel, + - and because this allows easy access to features like cp --reflink. -} +copyFileExternal :: FilePath -> FilePath -> IO Bool +copyFileExternal src dest = do + whenM (doesFileExist dest) $ + removeFile dest + boolSystem "cp" $ params ++ [File src, File dest] + where +#ifndef __ANDROID__ + params = map snd $ filter fst + [ (SysConfig.cp_reflink_auto, Param "--reflink=auto") + , (SysConfig.cp_a, Param "-a") + , (SysConfig.cp_p && not SysConfig.cp_a, Param "-p") + ] +#else + params = [] +#endif + +{- Create a hard link if the filesystem allows it, and fall back to copying + - the file. -} +createLinkOrCopy :: FilePath -> FilePath -> IO Bool +#ifndef mingw32_HOST_OS +createLinkOrCopy src dest = go `catchIO` const fallback + where + go = do + createLink src dest + return True + fallback = copyFileExternal src dest +#else +createLinkOrCopy = copyFileExternal +#endif diff --git a/Utility/DBus.hs b/Utility/DBus.hs new file mode 100644 index 000000000..29dbc9479 --- /dev/null +++ b/Utility/DBus.hs @@ -0,0 +1,85 @@ +{- DBus utilities + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} + +module Utility.DBus where + +import Utility.PartialPrelude +import Utility.Exception + +import DBus.Client +import DBus +import Data.Maybe +import Control.Concurrent +import Control.Exception as E + +type ServiceName = String + +listServiceNames :: Client -> IO [ServiceName] +listServiceNames client = do + reply <- callDBus client "ListNames" [] + return $ fromMaybe [] $ fromVariant =<< headMaybe (methodReturnBody reply) + +callDBus :: Client -> MemberName -> [Variant] -> IO MethodReturn +callDBus client name params = call_ client $ + (methodCall "/org/freedesktop/DBus" "org.freedesktop.DBus" name) + { methodCallDestination = Just "org.freedesktop.DBus" + , methodCallBody = params + } + +{- Connects to the bus, and runs the client action. + - + - Throws a ClientError, and closes the connection if it fails to + - process an incoming message, or if the connection is lost. + - Unlike DBus's usual interface, this error is thrown at the top level, + - rather than inside the clientThreadRunner, so it can be caught, and + - runClient re-run as needed. -} +runClient :: IO (Maybe Address) -> (Client -> IO ()) -> IO () +runClient getaddr clientaction = do + env <- getaddr + case env of + Nothing -> throwIO (clientError "runClient: unable to determine DBUS address") + Just addr -> do + {- The clientaction will set up listeners, which + - run in a different thread. We block while + - they're running, until our threadrunner catches + - a ClientError, which it will put into the MVar + - to be rethrown here. -} + mv <- newEmptyMVar + let tr = threadrunner (putMVar mv) + let opts = defaultClientOptions { clientThreadRunner = tr } + client <- connectWith opts addr + clientaction client + e <- takeMVar mv + disconnect client + throw e + where + threadrunner storeerr io = loop + where + loop = catchClientError (io >> loop) storeerr + +{- Connects to the bus, and runs the client action. + - + - If the connection is lost, runs onretry, which can do something like + - a delay, or printing a warning, and has a state value (useful for + - exponential backoff). Once onretry returns, the connection is retried. + -} +persistentClient :: IO (Maybe Address) -> v -> (SomeException -> v -> IO v) -> (Client -> IO ()) -> IO () +persistentClient getaddr v onretry clientaction = + {- runClient can fail with not just ClientError, but also other + - things, if dbus is not running. Let async exceptions through. -} + runClient getaddr clientaction `catchNonAsync` retry + where + retry e = do + v' <- onretry e v + persistentClient getaddr v' onretry clientaction + +{- Catches only ClientError -} +catchClientError :: IO () -> (ClientError -> IO ()) -> IO () +catchClientError io handler = + either handler return =<< (E.try io :: IO (Either ClientError ())) diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs new file mode 100644 index 000000000..228263911 --- /dev/null +++ b/Utility/Daemon.hs @@ -0,0 +1,183 @@ +{- daemon support + - + - Copyright 2012-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Daemon where + +import Common +import Utility.PID +#ifndef mingw32_HOST_OS +import Utility.LogFile +#else +import Utility.WinProcess +import Utility.WinLock +#endif + +#ifndef mingw32_HOST_OS +import System.Posix +import Control.Concurrent.Async +#else +import System.Exit +#endif + +#ifndef mingw32_HOST_OS +{- Run an action as a daemon, with all output sent to a file descriptor. + - + - Can write its pid to a file, to guard against multiple instances + - running and allow easy termination. + - + - When successful, does not return. -} +daemonize :: Fd -> Maybe FilePath -> Bool -> IO () -> IO () +daemonize logfd pidfile changedirectory a = do + maybe noop checkalreadyrunning pidfile + _ <- forkProcess child1 + out + where + checkalreadyrunning f = maybe noop (const alreadyRunning) + =<< checkDaemon f + child1 = do + _ <- tryIO createSession + _ <- forkProcess child2 + out + child2 = do + maybe noop lockPidFile pidfile + when changedirectory $ + setCurrentDirectory "/" + nullfd <- openFd "/dev/null" ReadOnly Nothing defaultFileFlags + redir nullfd stdInput + redirLog logfd + {- In old versions of ghc, forkProcess masks async exceptions; + - unmask them inside the action. -} + wait =<< asyncWithUnmask (\unmask -> unmask a) + out + out = exitImmediately ExitSuccess +#endif + +{- To run an action that is normally daemonized in the forground. -} +#ifndef mingw32_HOST_OS +foreground :: Fd -> Maybe FilePath -> IO () -> IO () +foreground logfd pidfile a = do +#else +foreground :: Maybe FilePath -> IO () -> IO () +foreground pidfile a = do +#endif + maybe noop lockPidFile pidfile +#ifndef mingw32_HOST_OS + _ <- tryIO createSession + redirLog logfd +#endif + a +#ifndef mingw32_HOST_OS + exitImmediately ExitSuccess +#else + exitWith ExitSuccess +#endif + +{- Locks the pid file, with an exclusive, non-blocking lock, + - and leaves it locked on return. + - + - Writes the pid to the file, fully atomically. + - Fails if the pid file is already locked by another process. -} +lockPidFile :: FilePath -> IO () +lockPidFile pidfile = do + createDirectoryIfMissing True (parentDir pidfile) +#ifndef mingw32_HOST_OS + fd <- openFd pidfile ReadWrite (Just stdFileMode) defaultFileFlags + locked <- catchMaybeIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) + fd' <- openFd newfile ReadWrite (Just stdFileMode) defaultFileFlags + { trunc = True } + locked' <- catchMaybeIO $ setLock fd' (WriteLock, AbsoluteSeek, 0, 0) + case (locked, locked') of + (Nothing, _) -> alreadyRunning + (_, Nothing) -> alreadyRunning + _ -> do + _ <- fdWrite fd' =<< show <$> getPID + closeFd fd + rename newfile pidfile + where + newfile = pidfile ++ ".new" +#else + {- Not atomic on Windows, oh well. -} + unlessM (isNothing <$> checkDaemon pidfile) + alreadyRunning + pid <- getPID + writeFile pidfile (show pid) + lckfile <- winLockFile pid pidfile + writeFile lckfile "" + void $ lockExclusive lckfile +#endif + +alreadyRunning :: IO () +alreadyRunning = error "Daemon is already running." + +{- Checks if the daemon is running, by checking that the pid file + - is locked by the same process that is listed in the pid file. + - + - If it's running, returns its pid. -} +checkDaemon :: FilePath -> IO (Maybe PID) +#ifndef mingw32_HOST_OS +checkDaemon pidfile = do + v <- catchMaybeIO $ + openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags + case v of + Just fd -> do + locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0) + p <- readish <$> readFile pidfile + closeFd fd `after` return (check locked p) + Nothing -> return Nothing + where + check Nothing _ = Nothing + check _ Nothing = Nothing + check (Just (pid, _)) (Just pid') + | pid == pid' = Just pid + | otherwise = error $ + "stale pid in " ++ pidfile ++ + " (got " ++ show pid' ++ + "; expected " ++ show pid ++ " )" +#else +checkDaemon pidfile = maybe (return Nothing) (check . readish) + =<< catchMaybeIO (readFile pidfile) + where + check Nothing = return Nothing + check (Just pid) = do + v <- lockShared =<< winLockFile pid pidfile + case v of + Just h -> do + dropLock h + return Nothing + Nothing -> return (Just pid) +#endif + +{- Stops the daemon, safely. -} +stopDaemon :: FilePath -> IO () +stopDaemon pidfile = go =<< checkDaemon pidfile + where + go Nothing = noop + go (Just pid) = +#ifndef mingw32_HOST_OS + signalProcess sigTERM pid +#else + terminatePID pid +#endif + +{- Windows locks a lock file that corresponds with the pid of the process. + - This allows changing the process in the pid file and taking a new lock + - when eg, restarting the daemon. + -} +#ifdef mingw32_HOST_OS +winLockFile :: PID -> FilePath -> IO FilePath +winLockFile pid pidfile = do + cleanstale + return $ prefix ++ show pid ++ suffix + where + prefix = pidfile ++ "." + suffix = ".lck" + cleanstale = mapM_ (void . tryIO . removeFile) =<< + (filter iswinlockfile <$> dirContents (parentDir pidfile)) + iswinlockfile f = suffix `isSuffixOf` f && prefix `isPrefixOf` f +#endif diff --git a/Utility/Data.hs b/Utility/Data.hs new file mode 100644 index 000000000..2df12b36d --- /dev/null +++ b/Utility/Data.hs @@ -0,0 +1,17 @@ +{- utilities for simple data types + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Data where + +{- First item in the list that is not Nothing. -} +firstJust :: Eq a => [Maybe a] -> Maybe a +firstJust ms = case dropWhile (== Nothing) ms of + [] -> Nothing + (md:_) -> md + +eitherToMaybe :: Either a b -> Maybe b +eitherToMaybe = either (const Nothing) Just diff --git a/Utility/DataUnits.hs b/Utility/DataUnits.hs new file mode 100644 index 000000000..7575af21f --- /dev/null +++ b/Utility/DataUnits.hs @@ -0,0 +1,160 @@ +{- data size display and parsing + - + - Copyright 2011 Joey Hess + - + - License: BSD-2-clause + - + - + - And now a rant: + - + - In the beginning, we had powers of two, and they were good. + - + - Disk drive manufacturers noticed that some powers of two were + - sorta close to some powers of ten, and that rounding down to the nearest + - power of ten allowed them to advertise their drives were bigger. This + - was sorta annoying. + - + - Then drives got big. Really, really big. This was good. + - + - Except that the small rounding error perpretrated by the drive + - manufacturers suffered the fate of a small error, and became a large + - error. This was bad. + - + - So, a committee was formed. And it arrived at a committee-like decision, + - which satisfied noone, confused everyone, and made the world an uglier + - place. As with all committees, this was meh. + - + - And the drive manufacturers happily continued selling drives that are + - increasingly smaller than you'd expect, if you don't count on your + - fingers. But that are increasingly too big for anyone to much notice. + - This caused me to need git-annex. + - + - Thus, I use units here that I loathe. Because if I didn't, people would + - be confused that their drives seem the wrong size, and other people would + - complain at me for not being standards compliant. And we call this + - progress? + -} + +module Utility.DataUnits ( + dataUnits, + storageUnits, + memoryUnits, + bandwidthUnits, + oldSchoolUnits, + + roughSize, + compareSizes, + readSize +) where + +import Data.List +import Data.Char + +import Utility.HumanNumber + +type ByteSize = Integer +type Name = String +type Abbrev = String +data Unit = Unit ByteSize Abbrev Name + deriving (Ord, Show, Eq) + +dataUnits :: [Unit] +dataUnits = storageUnits ++ memoryUnits + +{- Storage units are (stupidly) powers of ten. -} +storageUnits :: [Unit] +storageUnits = + [ Unit (p 8) "YB" "yottabyte" + , Unit (p 7) "ZB" "zettabyte" + , Unit (p 6) "EB" "exabyte" + , Unit (p 5) "PB" "petabyte" + , Unit (p 4) "TB" "terabyte" + , Unit (p 3) "GB" "gigabyte" + , Unit (p 2) "MB" "megabyte" + , Unit (p 1) "kB" "kilobyte" -- weird capitalization thanks to committe + , Unit (p 0) "B" "byte" + ] + where + p :: Integer -> Integer + p n = 1000^n + +{- Memory units are (stupidly named) powers of 2. -} +memoryUnits :: [Unit] +memoryUnits = + [ Unit (p 8) "YiB" "yobibyte" + , Unit (p 7) "ZiB" "zebibyte" + , Unit (p 6) "EiB" "exbibyte" + , Unit (p 5) "PiB" "pebibyte" + , Unit (p 4) "TiB" "tebibyte" + , Unit (p 3) "GiB" "gibibyte" + , Unit (p 2) "MiB" "mebibyte" + , Unit (p 1) "KiB" "kibibyte" + , Unit (p 0) "B" "byte" + ] + where + p :: Integer -> Integer + p n = 2^(n*10) + +{- Bandwidth units are only measured in bits if you're some crazy telco. -} +bandwidthUnits :: [Unit] +bandwidthUnits = error "stop trying to rip people off" + +{- Do you yearn for the days when men were men and megabytes were megabytes? -} +oldSchoolUnits :: [Unit] +oldSchoolUnits = zipWith (curry mingle) storageUnits memoryUnits + where + mingle (Unit _ a n, Unit s' _ _) = Unit s' a n + +{- approximate display of a particular number of bytes -} +roughSize :: [Unit] -> Bool -> ByteSize -> String +roughSize units short i + | i < 0 = '-' : findUnit units' (negate i) + | otherwise = findUnit units' i + where + units' = sortBy (flip compare) units -- largest first + + findUnit (u@(Unit s _ _):us) i' + | i' >= s = showUnit i' u + | otherwise = findUnit us i' + findUnit [] i' = showUnit i' (last units') -- bytes + + showUnit x (Unit size abbrev name) = s ++ " " ++ unit + where + v = (fromInteger x :: Double) / fromInteger size + s = showImprecise 2 v + unit + | short = abbrev + | s == "1" = name + | otherwise = name ++ "s" + +{- displays comparison of two sizes -} +compareSizes :: [Unit] -> Bool -> ByteSize -> ByteSize -> String +compareSizes units abbrev old new + | old > new = roughSize units abbrev (old - new) ++ " smaller" + | old < new = roughSize units abbrev (new - old) ++ " larger" + | otherwise = "same" + +{- Parses strings like "10 kilobytes" or "0.5tb". -} +readSize :: [Unit] -> String -> Maybe ByteSize +readSize units input + | null parsednum || null parsedunit = Nothing + | otherwise = Just $ round $ number * fromIntegral multiplier + where + (number, rest) = head parsednum + multiplier = head parsedunit + unitname = takeWhile isAlpha $ dropWhile isSpace rest + + parsednum = reads input :: [(Double, String)] + parsedunit = lookupUnit units unitname + + lookupUnit _ [] = [1] -- no unit given, assume bytes + lookupUnit [] _ = [] + lookupUnit (Unit s a n:us) v + | a ~~ v || n ~~ v = [s] + | plural n ~~ v || a ~~ byteabbrev v = [s] + | otherwise = lookupUnit us v + + a ~~ b = map toLower a == map toLower b + + plural n = n ++ "s" + byteabbrev a = a ++ "b" diff --git a/Utility/DirWatcher.hs b/Utility/DirWatcher.hs new file mode 100644 index 000000000..7e582239d --- /dev/null +++ b/Utility/DirWatcher.hs @@ -0,0 +1,157 @@ +{- generic directory watching interface + - + - Uses inotify, or kqueue, or fsevents, or win32-notify to watch a directory + - (and subdirectories) for changes, and runs hooks for different + - sorts of events as they occur. + - + - Copyright 2012-2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.DirWatcher where + +import Utility.DirWatcher.Types + +#if WITH_INOTIFY +import qualified Utility.DirWatcher.INotify as INotify +import qualified System.INotify as INotify +#endif +#if WITH_KQUEUE +import qualified Utility.DirWatcher.Kqueue as Kqueue +import Control.Concurrent +#endif +#if WITH_FSEVENTS +import qualified Utility.DirWatcher.FSEvents as FSEvents +import qualified System.OSX.FSEvents as FSEvents +#endif +#if WITH_WIN32NOTIFY +import qualified Utility.DirWatcher.Win32Notify as Win32Notify +import qualified System.Win32.Notify as Win32Notify +#endif + +type Pruner = FilePath -> Bool + +canWatch :: Bool +#if (WITH_INOTIFY || WITH_KQUEUE || WITH_FSEVENTS || WITH_WIN32NOTIFY) +canWatch = True +#else +#if defined linux_HOST_OS +#warning "Building without inotify support" +#endif +canWatch = False +#endif + +{- With inotify, discrete events will be received when making multiple changes + - to the same filename. For example, adding it, deleting it, and adding it + - again will be three events. + - + - OTOH, with kqueue, often only one event is received, indicating the most + - recent state of the file. -} +eventsCoalesce :: Bool +#if (WITH_INOTIFY || WITH_WIN32NOTIFY) +eventsCoalesce = False +#else +#if (WITH_KQUEUE || WITH_FSEVENTS) +eventsCoalesce = True +#else +eventsCoalesce = undefined +#endif +#endif + +{- With inotify, file closing is tracked to some extent, so an add event + - will always be received for a file once its writer closes it, and + - (typically) not before. This may mean multiple add events for the same file. + - + - fsevents behaves similarly, although different event types are used for + - creating and modification of the file. + - + - OTOH, with kqueue, add events will often be received while a file is + - still being written to, and then no add event will be received once the + - writer closes it. -} +closingTracked :: Bool +#if (WITH_INOTIFY || WITH_FSEVENTS || WITH_WIN32NOTIFY) +closingTracked = True +#else +#if WITH_KQUEUE +closingTracked = False +#else +closingTracked = undefined +#endif +#endif + +{- With inotify, modifications to existing files can be tracked. + - Kqueue does not support this. + - Fsevents generates events when an existing file is reopened and rewritten, + - but not necessarily when it's opened once and modified repeatedly. -} +modifyTracked :: Bool +#if (WITH_INOTIFY || WITH_FSEVENTS || WITH_WIN32NOTIFY) +modifyTracked = True +#else +#if WITH_KQUEUE +modifyTracked = False +#else +modifyTracked = undefined +#endif +#endif + +{- Starts a watcher thread. The runstartup action is passed a scanner action + - to run, that will return once the initial directory scan is complete. + - Once runstartup returns, the watcher thread continues running, + - and processing events. Returns a DirWatcherHandle that can be used + - to shutdown later. -} +#if WITH_INOTIFY +type DirWatcherHandle = INotify.INotify +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO () -> IO ()) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = do + i <- INotify.initINotify + runstartup $ INotify.watchDir i dir prune scanevents hooks + return i +#else +#if WITH_KQUEUE +type DirWatcherHandle = ThreadId +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO Kqueue.Kqueue -> IO Kqueue.Kqueue) -> IO DirWatcherHandle +watchDir dir prune _scanevents hooks runstartup = do + kq <- runstartup $ Kqueue.initKqueue dir prune + forkIO $ Kqueue.runHooks kq hooks +#else +#if WITH_FSEVENTS +type DirWatcherHandle = FSEvents.EventStream +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO FSEvents.EventStream -> IO FSEvents.EventStream) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = + runstartup $ FSEvents.watchDir dir prune scanevents hooks +#else +#if WITH_WIN32NOTIFY +type DirWatcherHandle = Win32Notify.WatchManager +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO Win32Notify.WatchManager -> IO Win32Notify.WatchManager) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = + runstartup $ Win32Notify.watchDir dir prune scanevents hooks +#else +type DirWatcherHandle = () +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO () -> IO ()) -> IO DirWatcherHandle +watchDir = undefined +#endif +#endif +#endif +#endif + +stopWatchDir :: DirWatcherHandle -> IO () +#if WITH_INOTIFY +stopWatchDir = INotify.killINotify +#else +#if WITH_KQUEUE +stopWatchDir = killThread +#else +#if WITH_FSEVENTS +stopWatchDir = FSEvents.eventStreamDestroy +#else +#if WITH_WIN32NOTIFY +stopWatchDir = Win32Notify.killWatchManager +#else +stopWatchDir = undefined +#endif +#endif +#endif +#endif diff --git a/Utility/DirWatcher/FSEvents.hs b/Utility/DirWatcher/FSEvents.hs new file mode 100644 index 000000000..7d755518f --- /dev/null +++ b/Utility/DirWatcher/FSEvents.hs @@ -0,0 +1,96 @@ +{- FSEvents interface + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.DirWatcher.FSEvents where + +import Common hiding (isDirectory) +import Utility.DirWatcher.Types + +import System.OSX.FSEvents +import qualified System.Posix.Files as Files +import Data.Bits ((.&.)) + +watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO EventStream +watchDir dir ignored scanevents hooks = do + unlessM fileLevelEventsSupported $ + error "Need at least OSX 10.7.0 for file-level FSEvents" + scan dir + eventStreamCreate [dir] 1.0 True True True handle + where + handle evt + | ignoredPath ignored (eventPath evt) = noop + | otherwise = do + {- More than one flag may be set, if events occurred + - close together. + - + - Order is important.. + - If a file is added and then deleted, we'll see it's + - not present, and addHook won't run. + - OTOH, if a file is deleted and then re-added, + - the delHook will run first, followed by the addHook. + -} + + when (hasflag eventFlagItemRemoved) $ + if hasflag eventFlagItemIsDir + then runhook delDirHook Nothing + else runhook delHook Nothing + when (hasflag eventFlagItemCreated) $ + maybe noop handleadd =<< getstatus (eventPath evt) + {- When a file or dir is renamed, a rename event is + - received for both its old and its new name. -} + when (hasflag eventFlagItemRenamed) $ + if hasflag eventFlagItemIsDir + then ifM (doesDirectoryExist $ eventPath evt) + ( scan $ eventPath evt + , runhook delDirHook Nothing + ) + else maybe (runhook delHook Nothing) handleadd + =<< getstatus (eventPath evt) + {- Add hooks are run when a file is modified for + - compatability with INotify, which calls the add + - hook when a file is closed, and so tends to call + - both add and modify for file modifications. -} + when (hasflag eventFlagItemModified && not (hasflag eventFlagItemIsDir)) $ do + ms <- getstatus $ eventPath evt + maybe noop handleadd ms + runhook modifyHook ms + where + hasflag f = eventFlags evt .&. f /= 0 + runhook h s = maybe noop (\a -> a (eventPath evt) s) (h hooks) + handleadd s + | Files.isSymbolicLink s = runhook addSymlinkHook $ Just s + | Files.isRegularFile s = runhook addHook $ Just s + | otherwise = noop + + scan d = unless (ignoredPath ignored d) $ + -- Do not follow symlinks when scanning. + -- This mirrors the inotify startup scan behavior. + mapM_ go =<< dirContentsRecursiveSkipping (const False) False d + where + go f + | ignoredPath ignored f = noop + | otherwise = do + ms <- getstatus f + case ms of + Nothing -> noop + Just s + | Files.isSymbolicLink s -> + when scanevents $ + runhook addSymlinkHook ms + | Files.isRegularFile s -> + when scanevents $ + runhook addHook ms + | otherwise -> + noop + where + runhook h s = maybe noop (\a -> a f s) (h hooks) + + getstatus = catchMaybeIO . getSymbolicLinkStatus + +{- Check each component of the path to see if it's ignored. -} +ignoredPath :: (FilePath -> Bool) -> FilePath -> Bool +ignoredPath ignored = any ignored . map dropTrailingPathSeparator . splitPath diff --git a/Utility/DirWatcher/INotify.hs b/Utility/DirWatcher/INotify.hs new file mode 100644 index 000000000..9400c7940 --- /dev/null +++ b/Utility/DirWatcher/INotify.hs @@ -0,0 +1,187 @@ +{- higher-level inotify interface + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.DirWatcher.INotify where + +import Common hiding (isDirectory) +import Utility.ThreadLock +import Utility.DirWatcher.Types + +import System.INotify +import qualified System.Posix.Files as Files +import System.IO.Error +import Control.Exception (throw) + +{- Watches for changes to files in a directory, and all its subdirectories + - that are not ignored, using inotify. This function returns after + - its initial scan is complete, leaving a thread running. Callbacks are + - made for different events. + - + - Inotify is weak at recursive directory watching; the whole directory + - tree must be scanned and watches set explicitly for each subdirectory. + - + - To notice newly created subdirectories, inotify is used, and + - watches are registered for those directories. There is a race there; + - things can be added to a directory before the watch gets registered. + - + - To close the inotify race, each time a new directory is found, it also + - recursively scans it, assuming all files in it were just added, + - and registering each subdirectory. + - + - Note: Due to the race amelioration, multiple add events may occur + - for the same file. + - + - Note: Moving a file will cause events deleting it from its old location + - and adding it to the new location. + - + - Note: It's assumed that when a file that was open for write is closed, + - it's finished being written to, and can be added. + - + - Note: inotify has a limit to the number of watches allowed, + - /proc/sys/fs/inotify/max_user_watches (default 8192). + - So this will fail if there are too many subdirectories. The + - errHook is called when this happens. + -} +watchDir :: INotify -> FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO () +watchDir i dir ignored scanevents hooks + | ignored dir = noop + | otherwise = do + -- Use a lock to make sure events generated during initial + -- scan come before real inotify events. + lock <- newLock + let handler event = withLock lock (void $ go event) + flip catchNonAsync failedwatch $ do + void (addWatch i watchevents dir handler) + `catchIO` failedaddwatch + withLock lock $ + mapM_ scan =<< filter (not . dirCruft) <$> + getDirectoryContents dir + where + recurse d = watchDir i d ignored scanevents hooks + + -- Select only inotify events required by the enabled + -- hooks, but always include Create so new directories can + -- be scanned. + watchevents = Create : addevents ++ delevents ++ modifyevents + addevents + | hashook addHook || hashook addSymlinkHook = [MoveIn, CloseWrite] + | otherwise = [] + delevents + | hashook delHook || hashook delDirHook = [MoveOut, Delete] + | otherwise = [] + modifyevents + | hashook modifyHook = [Modify] + | otherwise = [] + + scan f = unless (ignored f) $ do + ms <- getstatus f + case ms of + Nothing -> return () + Just s + | Files.isDirectory s -> + recurse $ indir f + | Files.isSymbolicLink s -> + when scanevents $ + runhook addSymlinkHook f ms + | Files.isRegularFile s -> + when scanevents $ + runhook addHook f ms + | otherwise -> + noop + + go (Created { isDirectory = isd, filePath = f }) + | isd = recurse $ indir f + | otherwise = do + ms <- getstatus f + case ms of + Just s + | Files.isSymbolicLink s -> + when (hashook addSymlinkHook) $ + runhook addSymlinkHook f ms + | Files.isRegularFile s -> + when (hashook addHook) $ + runhook addHook f ms + _ -> noop + -- Closing a file is assumed to mean it's done being written, + -- so a new add event is sent. + go (Closed { isDirectory = False, maybeFilePath = Just f }) = + checkfiletype Files.isRegularFile addHook f + -- When a file or directory is moved in, scan it to add new + -- stuff. + go (MovedIn { filePath = f }) = scan f + go (MovedOut { isDirectory = isd, filePath = f }) + | isd = runhook delDirHook f Nothing + | otherwise = runhook delHook f Nothing + -- Verify that the deleted item really doesn't exist, + -- since there can be spurious deletion events for items + -- in a directory that has been moved out, but is still + -- being watched. + go (Deleted { isDirectory = isd, filePath = f }) + | isd = guarded $ runhook delDirHook f Nothing + | otherwise = guarded $ runhook delHook f Nothing + where + guarded = unlessM (filetype (const True) f) + go (Modified { isDirectory = isd, maybeFilePath = Just f }) + | isd = noop + | otherwise = runhook modifyHook f Nothing + go _ = noop + + hashook h = isJust $ h hooks + + runhook h f s + | ignored f = noop + | otherwise = maybe noop (\a -> a (indir f) s) (h hooks) + + indir f = dir f + + getstatus f = catchMaybeIO $ getSymbolicLinkStatus $ indir f + checkfiletype check h f = do + ms <- getstatus f + case ms of + Just s + | check s -> runhook h f ms + _ -> noop + filetype t f = catchBoolIO $ t <$> getSymbolicLinkStatus (indir f) + + failedaddwatch e + -- Inotify fails when there are too many watches with a + -- disk full error. + | isFullError e = + case errHook hooks of + Nothing -> error $ "failed to add inotify watch on directory " ++ dir ++ " (" ++ show e ++ ")" + Just hook -> tooManyWatches hook dir + -- The directory could have been deleted. + | isDoesNotExistError e = return () + | otherwise = throw e + + failedwatch e = hPutStrLn stderr $ "failed to add watch on directory " ++ dir ++ " (" ++ show e ++ ")" + +tooManyWatches :: (String -> Maybe FileStatus -> IO ()) -> FilePath -> IO () +tooManyWatches hook dir = do + sysctlval <- querySysctl [Param maxwatches] :: IO (Maybe Integer) + hook (unlines $ basewarning : maybe withoutsysctl withsysctl sysctlval) Nothing + where + maxwatches = "fs.inotify.max_user_watches" + basewarning = "Too many directories to watch! (Not watching " ++ dir ++")" + withoutsysctl = ["Increase the value in /proc/sys/fs/inotify/max_user_watches"] + withsysctl n = let new = n * 10 in + [ "Increase the limit permanently by running:" + , " echo " ++ maxwatches ++ "=" ++ show new ++ + " | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" + , "Or temporarily by running:" + , " sudo sysctl -w " ++ maxwatches ++ "=" ++ show new + ] + +querySysctl :: Read a => [CommandParam] -> IO (Maybe a) +querySysctl ps = getM go ["sysctl", "/sbin/sysctl", "/usr/sbin/sysctl"] + where + go p = do + v <- catchMaybeIO $ readProcess p (toCommand ps) + case v of + Nothing -> return Nothing + Just s -> return $ parsesysctl s + parsesysctl s = readish =<< lastMaybe (words s) diff --git a/Utility/DirWatcher/Kqueue.hs b/Utility/DirWatcher/Kqueue.hs new file mode 100644 index 000000000..453c8d3f1 --- /dev/null +++ b/Utility/DirWatcher/Kqueue.hs @@ -0,0 +1,267 @@ +{- BSD kqueue file modification notification interface + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.DirWatcher.Kqueue ( + Kqueue, + initKqueue, + stopKqueue, + waitChange, + Change(..), + changedFile, + runHooks, +) where + +import Common +import Utility.DirWatcher.Types + +import System.Posix.Types +import Foreign.C.Types +import Foreign.C.Error +import Foreign.Ptr +import Foreign.Marshal +import qualified Data.Map as M +import qualified Data.Set as S +import qualified System.Posix.Files as Files +import Control.Concurrent + +data Change + = Deleted FilePath + | DeletedDir FilePath + | Added FilePath + deriving (Show) + +isAdd :: Change -> Bool +isAdd (Added _) = True +isAdd (Deleted _) = False +isAdd (DeletedDir _) = False + +changedFile :: Change -> FilePath +changedFile (Added f) = f +changedFile (Deleted f) = f +changedFile (DeletedDir f) = f + +data Kqueue = Kqueue + { kqueueFd :: Fd + , kqueueTop :: FilePath + , kqueueMap :: DirMap + , _kqueuePruner :: Pruner + } + +type Pruner = FilePath -> Bool + +type DirMap = M.Map Fd DirInfo + +{- Enough information to uniquely identify a file in a directory, + - but not too much. -} +data DirEnt = DirEnt + { dirEnt :: FilePath -- relative to the parent directory + , _dirInode :: FileID -- included to notice file replacements + , isSubDir :: Bool + } + deriving (Eq, Ord, Show) + +{- A directory, and its last known contents. -} +data DirInfo = DirInfo + { dirName :: FilePath + , dirCache :: S.Set DirEnt + } + deriving (Show) + +getDirInfo :: FilePath -> IO DirInfo +getDirInfo dir = do + l <- filter (not . dirCruft) <$> getDirectoryContents dir + contents <- S.fromList . catMaybes <$> mapM getDirEnt l + return $ DirInfo dir contents + where + getDirEnt f = catchMaybeIO $ do + s <- getSymbolicLinkStatus (dir f) + return $ DirEnt f (fileID s) (isDirectory s) + +{- Difference between the dirCaches of two DirInfos. -} +(//) :: DirInfo -> DirInfo -> [Change] +oldc // newc = deleted ++ added + where + deleted = calc gendel oldc newc + added = calc genadd newc oldc + gendel x = (if isSubDir x then DeletedDir else Deleted) $ + dirName oldc dirEnt x + genadd x = Added $ dirName newc dirEnt x + calc a x y = map a $ S.toList $ + S.difference (dirCache x) (dirCache y) + +{- Builds a map of directories in a tree, possibly pruning some. + - Opens each directory in the tree, and records its current contents. -} +scanRecursive :: FilePath -> Pruner -> IO DirMap +scanRecursive topdir prune = M.fromList <$> walk [] [topdir] + where + walk c [] = return c + walk c (dir:rest) + | prune dir = walk c rest + | otherwise = do + minfo <- catchMaybeIO $ getDirInfo dir + case minfo of + Nothing -> walk c rest + Just info -> do + mfd <- catchMaybeIO $ + openFd dir ReadOnly Nothing defaultFileFlags + case mfd of + Nothing -> walk c rest + Just fd -> do + let subdirs = map (dir ) . map dirEnt $ + S.toList $ dirCache info + walk ((fd, info):c) (subdirs ++ rest) + +{- Adds a list of subdirectories (and all their children), unless pruned to a + - directory map. Adding a subdirectory that's already in the map will + - cause its contents to be refreshed. -} +addSubDirs :: DirMap -> Pruner -> [FilePath] -> IO DirMap +addSubDirs dirmap prune dirs = do + newmap <- foldr M.union M.empty <$> + mapM (\d -> scanRecursive d prune) dirs + return $ M.union newmap dirmap -- prefer newmap + +{- Removes a subdirectory (and all its children) from a directory map. -} +removeSubDir :: DirMap -> FilePath -> IO DirMap +removeSubDir dirmap dir = do + mapM_ closeFd $ M.keys toremove + return rest + where + (toremove, rest) = M.partition (dirContains dir . dirName) dirmap + +findDirContents :: DirMap -> FilePath -> [FilePath] +findDirContents dirmap dir = concatMap absolutecontents $ search + where + absolutecontents i = map (dirName i ) + (map dirEnt $ S.toList $ dirCache i) + search = map snd $ M.toList $ + M.filter (\i -> dirName i == dir) dirmap + +foreign import ccall safe "libkqueue.h init_kqueue" c_init_kqueue + :: IO Fd +foreign import ccall safe "libkqueue.h addfds_kqueue" c_addfds_kqueue + :: Fd -> CInt -> Ptr Fd -> IO () +foreign import ccall safe "libkqueue.h waitchange_kqueue" c_waitchange_kqueue + :: Fd -> IO Fd + +{- Initializes a Kqueue to watch a directory, and all its subdirectories. -} +initKqueue :: FilePath -> Pruner -> IO Kqueue +initKqueue dir pruned = do + dirmap <- scanRecursive dir pruned + h <- c_init_kqueue + let kq = Kqueue h dir dirmap pruned + updateKqueue kq + return kq + +{- Updates a Kqueue, adding watches for its map. -} +updateKqueue :: Kqueue -> IO () +updateKqueue (Kqueue h _ dirmap _) = + withArrayLen (M.keys dirmap) $ \fdcnt c_fds -> do + c_addfds_kqueue h (fromIntegral fdcnt) c_fds + +{- Stops a Kqueue. Note: Does not directly close the Fds in the dirmap, + - so it can be reused. -} +stopKqueue :: Kqueue -> IO () +stopKqueue = closeFd . kqueueFd + +{- Waits for a change on a Kqueue. + - May update the Kqueue. + -} +waitChange :: Kqueue -> IO (Kqueue, [Change]) +waitChange kq@(Kqueue h _ dirmap _) = do + changedfd <- c_waitchange_kqueue h + if changedfd == -1 + then ifM ((==) eINTR <$> getErrno) + (yield >> waitChange kq, nochange) + else case M.lookup changedfd dirmap of + Nothing -> nochange + Just info -> handleChange kq changedfd info + where + nochange = return (kq, []) + +{- The kqueue interface does not tell what type of change took place in + - the directory; it could be an added file, a deleted file, a renamed + - file, a new subdirectory, or a deleted subdirectory, or a moved + - subdirectory. + - + - So to determine this, the contents of the directory are compared + - with its last cached contents. The Kqueue is updated to watch new + - directories as necessary. + -} +handleChange :: Kqueue -> Fd -> DirInfo -> IO (Kqueue, [Change]) +handleChange kq@(Kqueue _ _ dirmap pruner) fd olddirinfo = + go =<< catchMaybeIO (getDirInfo $ dirName olddirinfo) + where + go (Just newdirinfo) = do + let changes = filter (not . pruner . changedFile) $ + olddirinfo // newdirinfo + let (added, deleted) = partition isAdd changes + + -- Scan newly added directories to add to the map. + -- (Newly added files will fail getDirInfo.) + newdirinfos <- catMaybes <$> + mapM (catchMaybeIO . getDirInfo . changedFile) added + newmap <- addSubDirs dirmap pruner $ map dirName newdirinfos + + -- Remove deleted directories from the map. + newmap' <- foldM removeSubDir newmap (map changedFile deleted) + + -- Update the cached dirinfo just looked up. + let newmap'' = M.insertWith' const fd newdirinfo newmap' + + -- When new directories were added, need to update + -- the kqueue to watch them. + let kq' = kq { kqueueMap = newmap'' } + unless (null newdirinfos) $ + updateKqueue kq' + + return (kq', changes) + go Nothing = do + -- The directory has been moved or deleted, so + -- remove it from our map. + newmap <- removeSubDir dirmap (dirName olddirinfo) + return (kq { kqueueMap = newmap }, []) + +{- Processes changes on the Kqueue, calling the hooks as appropriate. + - Never returns. -} +runHooks :: Kqueue -> WatchHooks -> IO () +runHooks kq hooks = do + -- First, synthetic add events for the whole directory tree contents, + -- to catch any files created beforehand. + recursiveadd (kqueueMap kq) (Added $ kqueueTop kq) + loop kq + where + loop q = do + (q', changes) <- waitChange q + forM_ changes $ dispatch (kqueueMap q') + loop q' + + dispatch _ change@(Deleted _) = + callhook delHook Nothing change + dispatch _ change@(DeletedDir _) = + callhook delDirHook Nothing change + dispatch dirmap change@(Added _) = + withstatus change $ dispatchadd dirmap + + dispatchadd dirmap change s + | Files.isSymbolicLink s = callhook addSymlinkHook (Just s) change + | Files.isDirectory s = recursiveadd dirmap change + | Files.isRegularFile s = callhook addHook (Just s) change + | otherwise = noop + + recursiveadd dirmap change = do + let contents = findDirContents dirmap $ changedFile change + forM_ contents $ \f -> + withstatus (Added f) $ dispatchadd dirmap + + callhook h s change = case h hooks of + Nothing -> noop + Just a -> a (changedFile change) s + + withstatus change a = maybe noop (a change) =<< + (catchMaybeIO (getSymbolicLinkStatus (changedFile change))) diff --git a/Utility/DirWatcher/Types.hs b/Utility/DirWatcher/Types.hs new file mode 100644 index 000000000..2c92d6cd5 --- /dev/null +++ b/Utility/DirWatcher/Types.hs @@ -0,0 +1,24 @@ +{- generic directory watching types + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.DirWatcher.Types where + +import Common + +type Hook a = Maybe (a -> Maybe FileStatus -> IO ()) + +data WatchHooks = WatchHooks + { addHook :: Hook FilePath + , addSymlinkHook :: Hook FilePath + , delHook :: Hook FilePath + , delDirHook :: Hook FilePath + , errHook :: Hook String -- error message + , modifyHook :: Hook FilePath + } + +mkWatchHooks :: WatchHooks +mkWatchHooks = WatchHooks Nothing Nothing Nothing Nothing Nothing Nothing diff --git a/Utility/DirWatcher/Win32Notify.hs b/Utility/DirWatcher/Win32Notify.hs new file mode 100644 index 000000000..ef4f385c5 --- /dev/null +++ b/Utility/DirWatcher/Win32Notify.hs @@ -0,0 +1,66 @@ +{- Win32-notify interface + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.DirWatcher.Win32Notify where + +import Common hiding (isDirectory) +import Utility.DirWatcher.Types + +import System.Win32.Notify +import qualified Utility.PosixFiles as Files + +watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO WatchManager +watchDir dir ignored scanevents hooks = do + scan dir + wm <- initWatchManager + void $ watchDirectory wm dir True [Create, Delete, Modify, Move] handle + return wm + where + handle evt + | ignoredPath ignored (filePath evt) = noop + | otherwise = case evt of + (Deleted _ _) + | isDirectory evt -> runhook delDirHook Nothing + | otherwise -> runhook delHook Nothing + (Created _ _) + | isDirectory evt -> noop + | otherwise -> runhook addHook Nothing + (Modified _ _) + | isDirectory evt -> noop + {- Add hooks are run when a file is modified for + - compatability with INotify, which calls the add + - hook when a file is closed, and so tends to call + - both add and modify for file modifications. -} + | otherwise -> do + runhook addHook Nothing + runhook modifyHook Nothing + where + runhook h s = maybe noop (\a -> a (filePath evt) s) (h hooks) + + scan d = unless (ignoredPath ignored d) $ + mapM_ go =<< dirContentsRecursiveSkipping (const False) False d + where + go f + | ignoredPath ignored f = noop + | otherwise = do + ms <- getstatus f + case ms of + Nothing -> noop + Just s + | Files.isRegularFile s -> + when scanevents $ + runhook addHook ms + | otherwise -> + noop + where + runhook h s = maybe noop (\a -> a f s) (h hooks) + + getstatus = catchMaybeIO . getFileStatus + +{- Check each component of the path to see if it's ignored. -} +ignoredPath :: (FilePath -> Bool) -> FilePath -> Bool +ignoredPath ignored = any ignored . map dropTrailingPathSeparator . splitPath diff --git a/Utility/Directory.hs b/Utility/Directory.hs new file mode 100644 index 000000000..ade5ef811 --- /dev/null +++ b/Utility/Directory.hs @@ -0,0 +1,230 @@ +{- directory traversal and manipulation + - + - Copyright 2011-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Directory where + +import System.IO.Error +import System.Directory +import Control.Exception (throw, bracket) +import Control.Monad +import Control.Monad.IfElse +import System.FilePath +import Control.Applicative +import Control.Concurrent +import System.IO.Unsafe (unsafeInterleaveIO) +import Data.Maybe + +#ifdef mingw32_HOST_OS +import qualified System.Win32 as Win32 +#else +import qualified System.Posix as Posix +#endif + +import Utility.PosixFiles +import Utility.SafeCommand +import Utility.Tmp +import Utility.Exception +import Utility.Monad +import Utility.Applicative + +dirCruft :: FilePath -> Bool +dirCruft "." = True +dirCruft ".." = True +dirCruft _ = False + +{- Lists the contents of a directory. + - Unlike getDirectoryContents, paths are not relative to the directory. -} +dirContents :: FilePath -> IO [FilePath] +dirContents d = map (d ) . filter (not . dirCruft) <$> getDirectoryContents d + +{- Gets files in a directory, and then its subdirectories, recursively, + - and lazily. + - + - Does not follow symlinks to other subdirectories. + - + - When the directory does not exist, no exception is thrown, + - instead, [] is returned. -} +dirContentsRecursive :: FilePath -> IO [FilePath] +dirContentsRecursive = dirContentsRecursiveSkipping (const False) True + +{- Skips directories whose basenames match the skipdir. -} +dirContentsRecursiveSkipping :: (FilePath -> Bool) -> Bool -> FilePath -> IO [FilePath] +dirContentsRecursiveSkipping skipdir followsubdirsymlinks topdir = go [topdir] + where + go [] = return [] + go (dir:dirs) + | skipdir (takeFileName dir) = go dirs + | otherwise = unsafeInterleaveIO $ do + (files, dirs') <- collect [] [] + =<< catchDefaultIO [] (dirContents dir) + files' <- go (dirs' ++ dirs) + return (files ++ files') + collect files dirs' [] = return (reverse files, reverse dirs') + collect files dirs' (entry:entries) + | dirCruft entry = collect files dirs' entries + | otherwise = do + let skip = collect (entry:files) dirs' entries + let recurse = collect files (entry:dirs') entries + ms <- catchMaybeIO $ getSymbolicLinkStatus entry + case ms of + (Just s) + | isDirectory s -> recurse + | isSymbolicLink s && followsubdirsymlinks -> + ifM (doesDirectoryExist entry) + ( recurse + , skip + ) + _ -> skip + +{- Gets the directory tree from a point, recursively and lazily, + - with leaf directories **first**, skipping any whose basenames + - match the skipdir. Does not follow symlinks. -} +dirTreeRecursiveSkipping :: (FilePath -> Bool) -> FilePath -> IO [FilePath] +dirTreeRecursiveSkipping skipdir topdir = go [] [topdir] + where + go c [] = return c + go c (dir:dirs) + | skipdir (takeFileName dir) = go c dirs + | otherwise = unsafeInterleaveIO $ do + subdirs <- go c + =<< filterM (isDirectory <$$> getSymbolicLinkStatus) + =<< catchDefaultIO [] (dirContents dir) + go (subdirs++[dir]) dirs + +{- Moves one filename to another. + - First tries a rename, but falls back to moving across devices if needed. -} +moveFile :: FilePath -> FilePath -> IO () +moveFile src dest = tryIO (rename src dest) >>= onrename + where + onrename (Right _) = noop + onrename (Left e) + | isPermissionError e = rethrow + | isDoesNotExistError e = rethrow + | otherwise = do + -- copyFile is likely not as optimised as + -- the mv command, so we'll use the latter. + -- But, mv will move into a directory if + -- dest is one, which is not desired. + whenM (isdir dest) rethrow + viaTmp mv dest undefined + where + rethrow = throw e + mv tmp _ = do + ok <- boolSystem "mv" [Param "-f", Param src, Param tmp] + unless ok $ do + -- delete any partial + _ <- tryIO $ removeFile tmp + rethrow + + isdir f = do + r <- tryIO $ getFileStatus f + case r of + (Left _) -> return False + (Right s) -> return $ isDirectory s + +{- Removes a file, which may or may not exist, and does not have to + - be a regular file. + - + - Note that an exception is thrown if the file exists but + - cannot be removed. -} +nukeFile :: FilePath -> IO () +nukeFile file = void $ tryWhenExists go + where +#ifndef mingw32_HOST_OS + go = removeLink file +#else + go = removeFile file +#endif + +#ifndef mingw32_HOST_OS +data DirectoryHandle = DirectoryHandle IsOpen Posix.DirStream +#else +data DirectoryHandle = DirectoryHandle IsOpen Win32.HANDLE Win32.FindData (MVar ()) +#endif + +type IsOpen = MVar () -- full when the handle is open + +openDirectory :: FilePath -> IO DirectoryHandle +openDirectory path = do +#ifndef mingw32_HOST_OS + dirp <- Posix.openDirStream path + isopen <- newMVar () + return (DirectoryHandle isopen dirp) +#else + (h, fdat) <- Win32.findFirstFile (path "*") + -- Indicate that the fdat contains a filename that readDirectory + -- has not yet returned, by making the MVar be full. + -- (There's always at least a "." entry.) + alreadyhave <- newMVar () + isopen <- newMVar () + return (DirectoryHandle isopen h fdat alreadyhave) +#endif + +closeDirectory :: DirectoryHandle -> IO () +#ifndef mingw32_HOST_OS +closeDirectory (DirectoryHandle isopen dirp) = + whenOpen isopen $ + Posix.closeDirStream dirp +#else +closeDirectory (DirectoryHandle isopen h _ alreadyhave) = + whenOpen isopen $ do + _ <- tryTakeMVar alreadyhave + Win32.findClose h +#endif + where + whenOpen :: IsOpen -> IO () -> IO () + whenOpen mv f = do + v <- tryTakeMVar mv + when (isJust v) f + +{- |Reads the next entry from the handle. Once the end of the directory +is reached, returns Nothing and automatically closes the handle. +-} +readDirectory :: DirectoryHandle -> IO (Maybe FilePath) +#ifndef mingw32_HOST_OS +readDirectory hdl@(DirectoryHandle _ dirp) = do + e <- Posix.readDirStream dirp + if null e + then do + closeDirectory hdl + return Nothing + else return (Just e) +#else +readDirectory hdl@(DirectoryHandle _ h fdat mv) = do + -- If the MVar is full, then the filename in fdat has + -- not yet been returned. Otherwise, need to find the next + -- file. + r <- tryTakeMVar mv + case r of + Just () -> getfn + Nothing -> do + more <- Win32.findNextFile h fdat + if more + then getfn + else do + closeDirectory hdl + return Nothing + where + getfn = do + filename <- Win32.getFindDataFileName fdat + return (Just filename) +#endif + +-- True only when directory exists and contains nothing. +-- Throws exception if directory does not exist. +isDirectoryEmpty :: FilePath -> IO Bool +isDirectoryEmpty d = bracket (openDirectory d) closeDirectory check + where + check h = do + v <- readDirectory h + case v of + Nothing -> return True + Just f + | not (dirCruft f) -> return False + | otherwise -> check h diff --git a/Utility/DiskFree.hs b/Utility/DiskFree.hs new file mode 100644 index 000000000..af4431e88 --- /dev/null +++ b/Utility/DiskFree.hs @@ -0,0 +1,70 @@ +{- disk free space checking + - + - Copyright 2012, 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE ForeignFunctionInterface, CPP #-} + +module Utility.DiskFree ( + getDiskFree, + getDiskSize +) where + +#ifdef WITH_CLIBS + +import Common + +import Foreign.C.Types +import Foreign.C.String +import Foreign.C.Error + +foreign import ccall safe "libdiskfree.h diskfree" c_diskfree + :: CString -> IO CULLong + +foreign import ccall safe "libdiskfree.h disksize" c_disksize + :: CString -> IO CULLong + +getVal :: (CString -> IO CULLong) -> FilePath -> IO (Maybe Integer) +getVal getter path = withFilePath path $ \c_path -> do + free <- getter c_path + ifM (safeErrno <$> getErrno) + ( return $ Just $ toInteger free + , return Nothing + ) + where + safeErrno (Errno v) = v == 0 + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree = getVal c_diskfree + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize = getVal c_disksize + +#else +#ifdef mingw32_HOST_OS + +import Common + +import System.Win32.File + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree path = catchMaybeIO $ do + (sectors, bytes, nfree, _ntotal) <- getDiskFreeSpace (Just path) + return $ toInteger sectors * toInteger bytes * toInteger nfree + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize _ = return Nothing +#else + +#warning Building without disk free space checking support + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree _ = return Nothing + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize _ = return Nothing + +#endif +#endif diff --git a/Utility/Dot.hs b/Utility/Dot.hs new file mode 100644 index 000000000..3bea644f7 --- /dev/null +++ b/Utility/Dot.hs @@ -0,0 +1,63 @@ +{- a simple graphviz / dot(1) digraph description generator library + - + - Copyright 2010 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Dot where -- import qualified + +{- generates a graph description from a list of lines -} +graph :: [String] -> String +graph s = unlines $ [header] ++ map indent s ++ [footer] + where + header = "digraph map {" + footer= "}" + +{- a node in the graph -} +graphNode :: String -> String -> String +graphNode nodeid desc = label desc $ quote nodeid + +{- an edge between two nodes -} +graphEdge :: String -> String -> Maybe String -> String +graphEdge fromid toid desc = indent $ maybe edge (`label` edge) desc + where + edge = quote fromid ++ " -> " ++ quote toid + +{- adds a label to a node or edge -} +label :: String -> String -> String +label = attr "label" + +{- adds an attribute to a node or edge + - (can be called multiple times for multiple attributes) -} +attr :: String -> String -> String -> String +attr a v s = s ++ " [ " ++ a ++ "=" ++ quote v ++ " ]" + +{- fills a node with a color -} +fillColor :: String -> String -> String +fillColor color s = attr "fillcolor" color $ attr "style" "filled" s + +{- apply to graphNode to put the node in a labeled box -} +subGraph :: String -> String -> String -> String -> String +subGraph subid l color s = + "subgraph " ++ name ++ " {\n" ++ + ii setlabel ++ + ii setfilled ++ + ii setcolor ++ + ii s ++ + indent "}" + where + -- the "cluster_" makes dot draw a box + name = quote ("cluster_" ++ subid) + setlabel = "label=" ++ quote l + setfilled = "style=" ++ quote "filled" + setcolor = "fillcolor=" ++ quote color + ii x = indent (indent x) ++ "\n" + +indent ::String -> String +indent s = '\t' : s + +quote :: String -> String +quote s = "\"" ++ s' ++ "\"" + where + s' = filter (/= '"') s diff --git a/Utility/Env.hs b/Utility/Env.hs new file mode 100644 index 000000000..6763c24e1 --- /dev/null +++ b/Utility/Env.hs @@ -0,0 +1,81 @@ +{- portable environment variables + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Env where + +#ifdef mingw32_HOST_OS +import Utility.Exception +import Control.Applicative +import Data.Maybe +import qualified System.Environment as E +#else +import qualified System.Posix.Env as PE +#endif + +getEnv :: String -> IO (Maybe String) +#ifndef mingw32_HOST_OS +getEnv = PE.getEnv +#else +getEnv = catchMaybeIO . E.getEnv +#endif + +getEnvDefault :: String -> String -> IO String +#ifndef mingw32_HOST_OS +getEnvDefault = PE.getEnvDefault +#else +getEnvDefault var fallback = fromMaybe fallback <$> getEnv var +#endif + +getEnvironment :: IO [(String, String)] +#ifndef mingw32_HOST_OS +getEnvironment = PE.getEnvironment +#else +getEnvironment = E.getEnvironment +#endif + +{- Returns True if it could successfully set the environment variable. + - + - There is, apparently, no way to do this in Windows. Instead, + - environment varuables must be provided when running a new process. -} +setEnv :: String -> String -> Bool -> IO Bool +#ifndef mingw32_HOST_OS +setEnv var val overwrite = do + PE.setEnv var val overwrite + return True +#else +setEnv _ _ _ = return False +#endif + +{- Returns True if it could successfully unset the environment variable. -} +unsetEnv :: String -> IO Bool +#ifndef mingw32_HOST_OS +unsetEnv var = do + PE.unsetEnv var + return True +#else +unsetEnv _ = return False +#endif + +{- Adds the environment variable to the input environment. If already + - present in the list, removes the old value. + - + - This does not really belong here, but Data.AssocList is for some reason + - buried inside hxt. + -} +addEntry :: Eq k => k -> v -> [(k, v)] -> [(k, v)] +addEntry k v l = ( (k,v) : ) $! delEntry k l + +addEntries :: Eq k => [(k, v)] -> [(k, v)] -> [(k, v)] +addEntries = foldr (.) id . map (uncurry addEntry) . reverse + +delEntry :: Eq k => k -> [(k, v)] -> [(k, v)] +delEntry _ [] = [] +delEntry k (x@(k1,_) : rest) + | k == k1 = rest + | otherwise = ( x : ) $! delEntry k rest diff --git a/Utility/Exception.hs b/Utility/Exception.hs new file mode 100644 index 000000000..1fecf65d5 --- /dev/null +++ b/Utility/Exception.hs @@ -0,0 +1,59 @@ +{- Simple IO exception handling (and some more) + - + - Copyright 2011-2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE ScopedTypeVariables #-} + +module Utility.Exception where + +import Control.Exception +import qualified Control.Exception as E +import Control.Applicative +import Control.Monad +import System.IO.Error (isDoesNotExistError) +import Utility.Data + +{- Catches IO errors and returns a Bool -} +catchBoolIO :: IO Bool -> IO Bool +catchBoolIO = catchDefaultIO False + +{- Catches IO errors and returns a Maybe -} +catchMaybeIO :: IO a -> IO (Maybe a) +catchMaybeIO a = catchDefaultIO Nothing $ Just <$> a + +{- Catches IO errors and returns a default value. -} +catchDefaultIO :: a -> IO a -> IO a +catchDefaultIO def a = catchIO a (const $ return def) + +{- Catches IO errors and returns the error message. -} +catchMsgIO :: IO a -> IO (Either String a) +catchMsgIO a = either (Left . show) Right <$> tryIO a + +{- catch specialized for IO errors only -} +catchIO :: IO a -> (IOException -> IO a) -> IO a +catchIO = E.catch + +{- try specialized for IO errors only -} +tryIO :: IO a -> IO (Either IOException a) +tryIO = try + +{- Catches all exceptions except for async exceptions. + - This is often better to use than catching them all, so that + - ThreadKilled and UserInterrupt get through. + -} +catchNonAsync :: IO a -> (SomeException -> IO a) -> IO a +catchNonAsync a onerr = a `catches` + [ Handler (\ (e :: AsyncException) -> throw e) + , Handler (\ (e :: SomeException) -> onerr e) + ] + +tryNonAsync :: IO a -> IO (Either SomeException a) +tryNonAsync a = (Right <$> a) `catchNonAsync` (return . Left) + +{- Catches only DoesNotExist exceptions, and lets all others through. -} +tryWhenExists :: IO a -> IO (Maybe a) +tryWhenExists a = eitherToMaybe <$> + tryJust (guard . isDoesNotExistError) a diff --git a/Utility/ExternalSHA.hs b/Utility/ExternalSHA.hs new file mode 100644 index 000000000..595acd8cf --- /dev/null +++ b/Utility/ExternalSHA.hs @@ -0,0 +1,68 @@ +{- Calculating a SHA checksum with an external command. + - + - This is typically a bit faster than using Haskell libraries, + - by around 1% to 10%. Worth it for really big files. + - + - Copyright 2011-2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.ExternalSHA (externalSHA) where + +import Utility.SafeCommand +import Utility.Process +import Utility.FileSystemEncoding +import Utility.Misc +import Utility.Exception + +import Data.List +import Data.Char +import Control.Applicative +import System.IO + +externalSHA :: String -> Int -> FilePath -> IO (Either String String) +externalSHA command shasize file = do + ls <- lines <$> catchDefaultIO "" (readsha (toCommand [File file])) + return $ sanitycheck =<< parse ls + where + {- sha commands output the filename, so need to set fileEncoding -} + readsha args = + withHandle StdoutHandle (createProcessChecked checkSuccessProcess) p $ \h -> do + fileEncoding h + output <- hGetContentsStrict h + hClose h + return output + where + p = (proc command args) { std_out = CreatePipe } + + {- The first word of the output is taken to be the sha. -} + parse [] = bad + parse (l:_) + | null sha = bad + -- sha is prefixed with \ when filename contains certian chars + | "\\" `isPrefixOf` sha = Right $ drop 1 sha + | otherwise = Right sha + where + sha = fst $ separate (== ' ') l + bad = Left $ command ++ " parse error" + + {- Check that we've correctly parsing the output of the command, + - by making sure the sha we read is of the expected length + - and contains only the right characters. -} + sanitycheck sha + | length sha /= expectedSHALength shasize = + Left $ "Failed to parse the output of " ++ command + | any (`notElem` "0123456789abcdef") sha' = + Left $ "Unexpected character in output of " ++ command ++ "\"" ++ sha ++ "\"" + | otherwise = Right sha' + where + sha' = map toLower sha + +expectedSHALength :: Int -> Int +expectedSHALength 1 = 40 +expectedSHALength 256 = 64 +expectedSHALength 512 = 128 +expectedSHALength 224 = 56 +expectedSHALength 384 = 96 +expectedSHALength _ = 0 diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs new file mode 100644 index 000000000..c2ef683a8 --- /dev/null +++ b/Utility/FileMode.hs @@ -0,0 +1,158 @@ +{- File mode utilities. + - + - Copyright 2010-2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.FileMode where + +import System.IO +import Control.Monad +import Control.Exception (bracket) +import System.PosixCompat.Types +import Utility.PosixFiles +#ifndef mingw32_HOST_OS +import System.Posix.Files +#endif +import Foreign (complement) + +import Utility.Exception + +{- Applies a conversion function to a file's mode. -} +modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO () +modifyFileMode f convert = void $ modifyFileMode' f convert +modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode +modifyFileMode' f convert = do + s <- getFileStatus f + let old = fileMode s + let new = convert old + when (new /= old) $ + setFileMode f new + return old + +{- Adds the specified FileModes to the input mode, leaving the rest + - unchanged. -} +addModes :: [FileMode] -> FileMode -> FileMode +addModes ms m = combineModes (m:ms) + +{- Removes the specified FileModes from the input mode. -} +removeModes :: [FileMode] -> FileMode -> FileMode +removeModes ms m = m `intersectFileModes` complement (combineModes ms) + +{- Runs an action after changing a file's mode, then restores the old mode. -} +withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a +withModifiedFileMode file convert a = bracket setup cleanup go + where + setup = modifyFileMode' file convert + cleanup oldmode = modifyFileMode file (const oldmode) + go _ = a + +writeModes :: [FileMode] +writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode] + +readModes :: [FileMode] +readModes = [ownerReadMode, groupReadMode, otherReadMode] + +executeModes :: [FileMode] +executeModes = [ownerExecuteMode, groupExecuteMode, otherExecuteMode] + +otherGroupModes :: [FileMode] +otherGroupModes = + [ groupReadMode, otherReadMode + , groupWriteMode, otherWriteMode + ] + +{- Removes the write bits from a file. -} +preventWrite :: FilePath -> IO () +preventWrite f = modifyFileMode f $ removeModes writeModes + +{- Turns a file's owner write bit back on. -} +allowWrite :: FilePath -> IO () +allowWrite f = modifyFileMode f $ addModes [ownerWriteMode] + +{- Turns a file's owner read bit back on. -} +allowRead :: FilePath -> IO () +allowRead f = modifyFileMode f $ addModes [ownerReadMode] + +{- Allows owner and group to read and write to a file. -} +groupSharedModes :: [FileMode] +groupSharedModes = + [ ownerWriteMode, groupWriteMode + , ownerReadMode, groupReadMode + ] + +groupWriteRead :: FilePath -> IO () +groupWriteRead f = modifyFileMode f $ addModes groupSharedModes + +checkMode :: FileMode -> FileMode -> Bool +checkMode checkfor mode = checkfor `intersectFileModes` mode == checkfor + +{- Checks if a file mode indicates it's a symlink. -} +isSymLink :: FileMode -> Bool +#ifdef mingw32_HOST_OS +isSymLink _ = False +#else +isSymLink = checkMode symbolicLinkMode +#endif + +{- Checks if a file has any executable bits set. -} +isExecutable :: FileMode -> Bool +isExecutable mode = combineModes executeModes `intersectFileModes` mode /= 0 + +{- Runs an action without that pesky umask influencing it, unless the + - passed FileMode is the standard one. -} +noUmask :: FileMode -> IO a -> IO a +#ifndef mingw32_HOST_OS +noUmask mode a + | mode == stdFileMode = a + | otherwise = withUmask nullFileMode a +#else +noUmask _ a = a +#endif + +withUmask :: FileMode -> IO a -> IO a +#ifndef mingw32_HOST_OS +withUmask umask a = bracket setup cleanup go + where + setup = setFileCreationMask umask + cleanup = setFileCreationMask + go _ = a +#else +withUmask _ a = a +#endif + +combineModes :: [FileMode] -> FileMode +combineModes [] = undefined +combineModes [m] = m +combineModes (m:ms) = foldl unionFileModes m ms + +isSticky :: FileMode -> Bool +#ifdef mingw32_HOST_OS +isSticky _ = False +#else +isSticky = checkMode stickyMode + +stickyMode :: FileMode +stickyMode = 512 + +setSticky :: FilePath -> IO () +setSticky f = modifyFileMode f $ addModes [stickyMode] +#endif + +{- Writes a file, ensuring that its modes do not allow it to be read + - or written by anyone other than the current user, + - before any content is written. + - + - When possible, this is done using the umask. + - + - On a filesystem that does not support file permissions, this is the same + - as writeFile. + -} +writeFileProtected :: FilePath -> String -> IO () +writeFileProtected file content = withUmask 0o0077 $ + withFile file WriteMode $ \h -> do + void $ tryIO $ modifyFileMode file $ removeModes otherGroupModes + hPutStr h content diff --git a/Utility/FileSystemEncoding.hs b/Utility/FileSystemEncoding.hs new file mode 100644 index 000000000..b81fdc532 --- /dev/null +++ b/Utility/FileSystemEncoding.hs @@ -0,0 +1,132 @@ +{- GHC File system encoding handling. + - + - Copyright 2012-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.FileSystemEncoding ( + fileEncoding, + withFilePath, + md5FilePath, + decodeBS, + decodeW8, + encodeW8, + truncateFilePath, +) where + +import qualified GHC.Foreign as GHC +import qualified GHC.IO.Encoding as Encoding +import Foreign.C +import System.IO +import System.IO.Unsafe +import qualified Data.Hash.MD5 as MD5 +import Data.Word +import Data.Bits.Utils +import qualified Data.ByteString.Lazy as L +#ifdef mingw32_HOST_OS +import qualified Data.ByteString.Lazy.UTF8 as L8 +#endif + +{- Sets a Handle to use the filesystem encoding. This causes data + - written or read from it to be encoded/decoded the same + - as ghc 7.4 does to filenames etc. This special encoding + - allows "arbitrary undecodable bytes to be round-tripped through it". + -} +fileEncoding :: Handle -> IO () +#ifndef mingw32_HOST_OS +fileEncoding h = hSetEncoding h =<< Encoding.getFileSystemEncoding +#else +{- The file system encoding does not work well on Windows, + - and Windows only has utf FilePaths anyway. -} +fileEncoding h = hSetEncoding h Encoding.utf8 +#endif + +{- Marshal a Haskell FilePath into a NUL terminated C string using temporary + - storage. The FilePath is encoded using the filesystem encoding, + - reversing the decoding that should have been done when the FilePath + - was obtained. -} +withFilePath :: FilePath -> (CString -> IO a) -> IO a +withFilePath fp f = Encoding.getFileSystemEncoding + >>= \enc -> GHC.withCString enc fp f + +{- Encodes a FilePath into a String, applying the filesystem encoding. + - + - There are very few things it makes sense to do with such an encoded + - string. It's not a legal filename; it should not be displayed. + - So this function is not exported, but instead used by the few functions + - that can usefully consume it. + - + - This use of unsafePerformIO is belived to be safe; GHC's interface + - only allows doing this conversion with CStrings, and the CString buffer + - is allocated, used, and deallocated within the call, with no side + - effects. + -} +{-# NOINLINE _encodeFilePath #-} +_encodeFilePath :: FilePath -> String +_encodeFilePath fp = unsafePerformIO $ do + enc <- Encoding.getFileSystemEncoding + GHC.withCString enc fp $ GHC.peekCString Encoding.char8 + +{- Encodes a FilePath into a Md5.Str, applying the filesystem encoding. -} +md5FilePath :: FilePath -> MD5.Str +md5FilePath = MD5.Str . _encodeFilePath + +{- Decodes a ByteString into a FilePath, applying the filesystem encoding. -} +decodeBS :: L.ByteString -> FilePath +#ifndef mingw32_HOST_OS +decodeBS = encodeW8 . L.unpack +#else +{- On Windows, we assume that the ByteString is utf-8, since Windows + - only uses unicode for filenames. -} +decodeBS = L8.toString +#endif + +{- Converts a [Word8] to a FilePath, encoding using the filesystem encoding. + - + - w82c produces a String, which may contain Chars that are invalid + - unicode. From there, this is really a simple matter of applying the + - file system encoding, only complicated by GHC's interface to doing so. + -} +{-# NOINLINE encodeW8 #-} +encodeW8 :: [Word8] -> FilePath +encodeW8 w8 = unsafePerformIO $ do + enc <- Encoding.getFileSystemEncoding + GHC.withCString Encoding.char8 (w82s w8) $ GHC.peekCString enc + +{- Useful when you want the actual number of bytes that will be used to + - represent the FilePath on disk. -} +decodeW8 :: FilePath -> [Word8] +decodeW8 = s2w8 . _encodeFilePath + +{- Truncates a FilePath to the given number of bytes (or less), + - as represented on disk. + - + - Avoids returning an invalid part of a unicode byte sequence, at the + - cost of efficiency when running on a large FilePath. + -} +truncateFilePath :: Int -> FilePath -> FilePath +#ifndef mingw32_HOST_OS +truncateFilePath n = go . reverse + where + go f = + let bytes = decodeW8 f + in if length bytes <= n + then reverse f + else go (drop 1 f) +#else +{- On Windows, count the number of bytes used by each utf8 character. -} +truncateFilePath n = reverse . go [] n . L8.fromString + where + go coll cnt bs + | cnt <= 0 = coll + | otherwise = case L8.decode bs of + Just (c, x) | c /= L8.replacement_char -> + let x' = fromIntegral x + in if cnt - x' < 0 + then coll + else go (c:coll) (cnt - x') (L8.drop 1 bs) + _ -> coll +#endif diff --git a/Utility/Format.hs b/Utility/Format.hs new file mode 100644 index 000000000..2a5ae5c34 --- /dev/null +++ b/Utility/Format.hs @@ -0,0 +1,178 @@ +{- Formatted string handling. + - + - Copyright 2010, 2011 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Format ( + Format, + gen, + format, + decode_c, + encode_c, + prop_idempotent_deencode +) where + +import Text.Printf (printf) +import Data.Char (isAlphaNum, isOctDigit, isHexDigit, isSpace, chr, ord) +import Data.Maybe (fromMaybe) +import Data.Word (Word8) +import Data.List (isPrefixOf) +import qualified Codec.Binary.UTF8.String +import qualified Data.Map as M + +import Utility.PartialPrelude + +type FormatString = String + +{- A format consists of a list of fragments. -} +type Format = [Frag] + +{- A fragment is either a constant string, + - or a variable, with a justification. -} +data Frag = Const String | Var String Justify + deriving (Show) + +data Justify = LeftJustified Int | RightJustified Int | UnJustified + deriving (Show) + +type Variables = M.Map String String + +{- Expands a Format using some variables, generating a formatted string. + - This can be repeatedly called, efficiently. -} +format :: Format -> Variables -> String +format f vars = concatMap expand f + where + expand (Const s) = s + expand (Var name j) + | "escaped_" `isPrefixOf` name = + justify j $ encode_c_strict $ + getvar $ drop (length "escaped_") name + | otherwise = justify j $ getvar name + getvar name = fromMaybe "" $ M.lookup name vars + justify UnJustified s = s + justify (LeftJustified i) s = s ++ pad i s + justify (RightJustified i) s = pad i s ++ s + pad i s = take (i - length s) spaces + spaces = repeat ' ' + +{- Generates a Format that can be used to expand variables in a + - format string, such as "${foo} ${bar;10} ${baz;-10}\n" + - + - (This is the same type of format string used by dpkg-query.) + -} +gen :: FormatString -> Format +gen = filter (not . empty) . fuse [] . scan [] . decode_c + where + -- The Format is built up in reverse, for efficiency, + -- and can have many adjacent Consts. Fusing it fixes both + -- problems. + fuse f [] = f + fuse f (Const c1:Const c2:vs) = fuse f $ Const (c2++c1) : vs + fuse f (v:vs) = fuse (v:f) vs + + scan f (a:b:cs) + | a == '$' && b == '{' = invar f [] cs + | otherwise = scan (Const [a] : f ) (b:cs) + scan f v = Const v : f + + invar f var [] = Const (novar var) : f + invar f var (c:cs) + | c == '}' = foundvar f var UnJustified cs + | isAlphaNum c || c == '_' = invar f (c:var) cs + | c == ';' = inpad "" f var cs + | otherwise = scan ((Const $ novar $ c:var):f) cs + + inpad p f var (c:cs) + | c == '}' = foundvar f var (readjustify $ reverse p) cs + | otherwise = inpad (c:p) f var cs + inpad p f var [] = Const (novar $ p++";"++var) : f + readjustify = getjustify . fromMaybe 0 . readish + getjustify i + | i == 0 = UnJustified + | i < 0 = LeftJustified (-1 * i) + | otherwise = RightJustified i + novar v = "${" ++ reverse v + foundvar f v p = scan (Var (reverse v) p : f) + +empty :: Frag -> Bool +empty (Const "") = True +empty _ = False + +{- Decodes a C-style encoding, where \n is a newline, \NNN is an octal + - encoded character, and \xNN is a hex encoded character. + -} +decode_c :: FormatString -> FormatString +decode_c [] = [] +decode_c s = unescape ("", s) + where + e = '\\' + unescape (b, []) = b + -- look for escapes starting with '\' + unescape (b, v) = b ++ fst pair ++ unescape (handle $ snd pair) + where + pair = span (/= e) v + isescape x = x == e + handle (x:'x':n1:n2:rest) + | isescape x && allhex = (fromhex, rest) + where + allhex = isHexDigit n1 && isHexDigit n2 + fromhex = [chr $ readhex [n1, n2]] + readhex h = Prelude.read $ "0x" ++ h :: Int + handle (x:n1:n2:n3:rest) + | isescape x && alloctal = (fromoctal, rest) + where + alloctal = isOctDigit n1 && isOctDigit n2 && isOctDigit n3 + fromoctal = [chr $ readoctal [n1, n2, n3]] + readoctal o = Prelude.read $ "0o" ++ o :: Int + -- \C is used for a few special characters + handle (x:nc:rest) + | isescape x = ([echar nc], rest) + where + echar 'a' = '\a' + echar 'b' = '\b' + echar 'f' = '\f' + echar 'n' = '\n' + echar 'r' = '\r' + echar 't' = '\t' + echar 'v' = '\v' + echar a = a + handle n = ("", n) + +{- Inverse of decode_c. -} +encode_c :: FormatString -> FormatString +encode_c = encode_c' (const False) + +{- Encodes more strictly, including whitespace. -} +encode_c_strict :: FormatString -> FormatString +encode_c_strict = encode_c' isSpace + +encode_c' :: (Char -> Bool) -> FormatString -> FormatString +encode_c' p = concatMap echar + where + e c = '\\' : [c] + echar '\a' = e 'a' + echar '\b' = e 'b' + echar '\f' = e 'f' + echar '\n' = e 'n' + echar '\r' = e 'r' + echar '\t' = e 't' + echar '\v' = e 'v' + echar '\\' = e '\\' + echar '"' = e '"' + echar c + | ord c < 0x20 = e_asc c -- low ascii + | ord c >= 256 = e_utf c -- unicode + | ord c > 0x7E = e_asc c -- high ascii + | p c = e_asc c -- unprintable ascii + | otherwise = [c] -- printable ascii + -- unicode character is decomposed to individual Word8s, + -- and each is shown in octal + e_utf c = showoctal =<< (Codec.Binary.UTF8.String.encode [c] :: [Word8]) + e_asc c = showoctal $ ord c + showoctal i = '\\' : printf "%03o" i + +{- for quickcheck -} +prop_idempotent_deencode :: String -> Bool +prop_idempotent_deencode s = s == decode_c (encode_c s) diff --git a/Utility/FreeDesktop.hs b/Utility/FreeDesktop.hs new file mode 100644 index 000000000..c1f042ce8 --- /dev/null +++ b/Utility/FreeDesktop.hs @@ -0,0 +1,144 @@ +{- Freedesktop.org specifications + - + - http://standards.freedesktop.org/basedir-spec/latest/ + - http://standards.freedesktop.org/desktop-entry-spec/latest/ + - http://standards.freedesktop.org/menu-spec/latest/ + - http://standards.freedesktop.org/icon-theme-spec/latest/ + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.FreeDesktop ( + DesktopEntry, + genDesktopEntry, + buildDesktopMenuFile, + writeDesktopMenuFile, + desktopMenuFilePath, + autoStartPath, + iconDir, + iconFilePath, + systemDataDir, + systemConfigDir, + userDataDir, + userConfigDir, + userDesktopDir +) where + +import Utility.Exception +import Utility.Path +import Utility.UserInfo +import Utility.Process +import Utility.PartialPrelude + +import System.Environment +import System.Directory +import System.FilePath +import Data.List +import Data.String.Utils +import Data.Maybe +import Control.Applicative + +type DesktopEntry = [(Key, Value)] + +type Key = String + +data Value = StringV String | BoolV Bool | NumericV Float | ListV [Value] + +toString :: Value -> String +toString (StringV s) = s +toString (BoolV b) + | b = "true" + | otherwise = "false" +toString(NumericV f) = show f +toString (ListV l) + | null l = "" + | otherwise = (intercalate ";" $ map (escapesemi . toString) l) ++ ";" + where + escapesemi = join "\\;" . split ";" + +genDesktopEntry :: String -> String -> Bool -> FilePath -> Maybe String -> [String] -> DesktopEntry +genDesktopEntry name comment terminal program icon categories = catMaybes + [ item "Type" StringV "Application" + , item "Version" NumericV 1.0 + , item "Name" StringV name + , item "Comment" StringV comment + , item "Terminal" BoolV terminal + , item "Exec" StringV program + , maybe Nothing (item "Icon" StringV) icon + , item "Categories" ListV (map StringV categories) + ] + where + item x c y = Just (x, c y) + +buildDesktopMenuFile :: DesktopEntry -> String +buildDesktopMenuFile d = unlines ("[Desktop Entry]" : map keyvalue d) ++ "\n" + where + keyvalue (k, v) = k ++ "=" ++ toString v + +writeDesktopMenuFile :: DesktopEntry -> String -> IO () +writeDesktopMenuFile d file = do + createDirectoryIfMissing True (parentDir file) + writeFile file $ buildDesktopMenuFile d + +{- Path to use for a desktop menu file, in either the systemDataDir or + - the userDataDir -} +desktopMenuFilePath :: String -> FilePath -> FilePath +desktopMenuFilePath basename datadir = + datadir "applications" desktopfile basename + +{- Path to use for a desktop autostart file, in either the systemDataDir + - or the userDataDir -} +autoStartPath :: String -> FilePath -> FilePath +autoStartPath basename configdir = + configdir "autostart" desktopfile basename + +{- Base directory to install an icon file, in either the systemDataDir + - or the userDatadir. -} +iconDir :: FilePath -> FilePath +iconDir datadir = datadir "icons" "hicolor" + +{- Filename of an icon, given the iconDir to use. + - + - The resolution is something like "48x48" or "scalable". -} +iconFilePath :: FilePath -> String -> FilePath -> FilePath +iconFilePath file resolution icondir = + icondir resolution "apps" file + +desktopfile :: FilePath -> FilePath +desktopfile f = f ++ ".desktop" + +{- Directory used for installation of system wide data files.. -} +systemDataDir :: FilePath +systemDataDir = "/usr/share" + +{- Directory used for installation of system wide config files. -} +systemConfigDir :: FilePath +systemConfigDir = "/etc/xdg" + +{- Directory for user data files. -} +userDataDir :: IO FilePath +userDataDir = xdgEnvHome "DATA_HOME" ".local/share" + +{- Directory for user config files. -} +userConfigDir :: IO FilePath +userConfigDir = xdgEnvHome "CONFIG_HOME" ".config" + +{- Directory for the user's Desktop, may be localized. + - + - This is not looked up very fast; the config file is in a shell format + - that is best parsed by shell, so xdg-user-dir is used, with a fallback + - to ~/Desktop. -} +userDesktopDir :: IO FilePath +userDesktopDir = maybe fallback return =<< (parse <$> xdg_user_dir) + where + parse = maybe Nothing (headMaybe . lines) + xdg_user_dir = catchMaybeIO $ readProcess "xdg-user-dir" ["DESKTOP"] + fallback = xdgEnvHome "DESKTOP_DIR" "Desktop" + +xdgEnvHome :: String -> String -> IO String +xdgEnvHome envbase homedef = do + home <- myHomeDir + catchDefaultIO (home homedef) $ + getEnv $ "XDG_" ++ envbase diff --git a/Utility/Glob.hs b/Utility/Glob.hs new file mode 100644 index 000000000..373f3fdbf --- /dev/null +++ b/Utility/Glob.hs @@ -0,0 +1,58 @@ +{- file globbing + - + - This uses TDFA when available, with a fallback to regex-compat. + - TDFA is less buggy in its support for non-unicode characters. + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Glob ( + Glob, + GlobCase(..), + compileGlob, + matchGlob +) where + +import System.Path.WildMatch + +#ifdef WITH_TDFA +import Text.Regex.TDFA +import Text.Regex.TDFA.String +#else +import Text.Regex +import Data.Maybe +#endif + +newtype Glob = Glob Regex + +data GlobCase = CaseSensative | CaseInsensative + +{- Compiles a glob to a regex, that can be repeatedly used. -} +compileGlob :: String -> GlobCase -> Glob +compileGlob glob globcase = Glob $ +#ifdef WITH_TDFA + case compile (defaultCompOpt {caseSensitive = casesentitive}) defaultExecOpt regex of + Right r -> r + Left _ -> error $ "failed to compile regex: " ++ regex +#else + mkRegexWithOpts regex casesentitive True +#endif + where + regex = '^':wildToRegex glob + casesentitive = case globcase of + CaseSensative -> True + CaseInsensative -> False + +matchGlob :: Glob -> String -> Bool +matchGlob (Glob regex) val = +#ifdef WITH_TDFA + case execute regex val of + Right (Just _) -> True + _ -> False +#else + isJust $ matchRegex regex val +#endif diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs new file mode 100644 index 000000000..a00bf99da --- /dev/null +++ b/Utility/Gpg.hs @@ -0,0 +1,381 @@ +{- gpg interface + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Gpg where + +import Control.Applicative +import Control.Concurrent +import qualified Data.Map as M + +import Common +import qualified Build.SysConfig as SysConfig + +#ifndef mingw32_HOST_OS +import System.Posix.Types +import Control.Exception (bracket) +import System.Path +import Utility.Env +#else +import Utility.Tmp +#endif +import Utility.Format (decode_c) + +type KeyId = String + +newtype KeyIds = KeyIds { keyIds :: [KeyId] } + deriving (Ord, Eq) + +{- If a specific gpg command was found at configure time, use it. + - Otherwise, try to run gpg. -} +gpgcmd :: FilePath +gpgcmd = fromMaybe "gpg" SysConfig.gpg + +-- Generate an argument list to asymetrically encrypt to the given recipients. +pkEncTo :: [String] -> [CommandParam] +pkEncTo = concatMap (\r -> [Param "--recipient", Param r]) + +stdParams :: [CommandParam] -> IO [String] +stdParams params = do +#ifndef mingw32_HOST_OS + -- Enable batch mode if GPG_AGENT_INFO is set, to avoid extraneous + -- gpg output about password prompts. GPG_BATCH is set by the test + -- suite for a similar reason. + e <- getEnv "GPG_AGENT_INFO" + b <- getEnv "GPG_BATCH" + let batch = if isNothing e && isNothing b + then [] + else ["--batch", "--no-tty", "--use-agent"] + return $ batch ++ defaults ++ toCommand params +#else + return $ defaults ++ toCommand params +#endif + where + -- Be quiet, even about checking the trustdb. + defaults = ["--quiet", "--trust-model", "always"] + +{- Usual options for symmetric / public-key encryption. -} +stdEncryptionParams :: Bool -> [CommandParam] +stdEncryptionParams symmetric = + [ enc symmetric + , Param "--force-mdc" + , Param "--no-textmode" + ] + where + enc True = Param "--symmetric" + -- Force gpg to only encrypt to the specified recipients, not + -- configured defaults. Recipients are assumed to be specified in + -- elsewhere. + enc False = Params "--encrypt --no-encrypt-to --no-default-recipient" + +{- Runs gpg with some params and returns its stdout, strictly. -} +readStrict :: [CommandParam] -> IO String +readStrict params = do + params' <- stdParams params + withHandle StdoutHandle createProcessSuccess (proc gpgcmd params') $ \h -> do + hSetBinaryMode h True + hGetContentsStrict h + +{- Runs gpg, piping an input value to it, and returning its stdout, + - strictly. -} +pipeStrict :: [CommandParam] -> String -> IO String +pipeStrict params input = do + params' <- stdParams params + withBothHandles createProcessSuccess (proc gpgcmd params') $ \(to, from) -> do + hSetBinaryMode to True + hSetBinaryMode from True + hPutStr to input + hClose to + hGetContentsStrict from + +{- Runs gpg with some parameters. First sends it a passphrase (unless it + - is empty) via '--passphrase-fd'. Then runs a feeder action that is + - passed a handle and should write to it all the data to input to gpg. + - Finally, runs a reader action that is passed a handle to gpg's + - output. + - + - Runs gpg in batch mode; this is necessary to avoid gpg 2.x prompting for + - the passphrase. + - + - Note that to avoid deadlock with the cleanup stage, + - the reader must fully consume gpg's input before returning. -} +feedRead :: [CommandParam] -> String -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a +feedRead params passphrase feeder reader = do +#ifndef mingw32_HOST_OS + -- pipe the passphrase into gpg on a fd + (frompipe, topipe) <- createPipe + void $ forkIO $ do + toh <- fdToHandle topipe + hPutStrLn toh passphrase + hClose toh + let Fd pfd = frompipe + let passphrasefd = [Param "--passphrase-fd", Param $ show pfd] + closeFd frompipe `after` go (passphrasefd ++ params) +#else + -- store the passphrase in a temp file for gpg + withTmpFile "gpg" $ \tmpfile h -> do + hPutStr h passphrase + hClose h + let passphrasefile = [Param "--passphrase-file", File tmpfile] + go $ passphrasefile ++ params +#endif + where + go params' = pipeLazy params' feeder reader + +{- Like feedRead, but without passphrase. -} +pipeLazy :: [CommandParam] -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a +pipeLazy params feeder reader = do + params' <- stdParams $ Param "--batch" : params + withBothHandles createProcessSuccess (proc gpgcmd params') + $ \(to, from) -> do + void $ forkIO $ do + feeder to + hClose to + reader from + +{- Finds gpg public keys matching some string. (Could be an email address, + - a key id, or a name; See the section 'HOW TO SPECIFY A USER ID' of + - GnuPG's manpage.) -} +findPubKeys :: String -> IO KeyIds +findPubKeys for = KeyIds . parse . lines <$> readStrict params + where + params = [Params "--with-colons --list-public-keys", Param for] + parse = mapMaybe (keyIdField . split ":") + keyIdField ("pub":_:_:_:f:_) = Just f + keyIdField _ = Nothing + +type UserId = String + +{- All of the user's secret keys, with their UserIds. + - Note that the UserId may be empty. -} +secretKeys :: IO (M.Map KeyId UserId) +secretKeys = M.fromList . parse . lines <$> readStrict params + where + params = [Params "--with-colons --list-secret-keys --fixed-list-mode"] + parse = extract [] Nothing . map (split ":") + extract c (Just keyid) (("uid":_:_:_:_:_:_:_:_:userid:_):rest) = + extract ((keyid, decode_c userid):c) Nothing rest + extract c (Just keyid) rest = + extract ((keyid, ""):c) Nothing rest + extract c _ [] = c + extract c _ (("sec":_:_:_:keyid:_):rest) = + extract c (Just keyid) rest + extract c k (_:rest) = + extract c k rest + +type Passphrase = String +type Size = Int +data KeyType = Algo Int | DSA | RSA + +{- The maximum key size that gpg currently offers in its UI when + - making keys. -} +maxRecommendedKeySize :: Size +maxRecommendedKeySize = 4096 + +{- Generates a secret key using the experimental batch mode. + - The key is added to the secret key ring. + - Can take a very long time, depending on system entropy levels. + -} +genSecretKey :: KeyType -> Passphrase -> UserId -> Size -> IO () +genSecretKey keytype passphrase userid keysize = + withHandle StdinHandle createProcessSuccess (proc gpgcmd params) feeder + where + params = ["--batch", "--gen-key"] + feeder h = do + hPutStr h $ unlines $ catMaybes + [ Just $ "Key-Type: " ++ + case keytype of + DSA -> "DSA" + RSA -> "RSA" + Algo n -> show n + , Just $ "Key-Length: " ++ show keysize + , Just $ "Name-Real: " ++ userid + , Just "Expire-Date: 0" + , if null passphrase + then Nothing + else Just $ "Passphrase: " ++ passphrase + ] + hClose h + +{- Creates a block of high-quality random data suitable to use as a cipher. + - It is armored, to avoid newlines, since gpg only reads ciphers up to the + - first newline. -} +genRandom :: Bool -> Size -> IO String +genRandom highQuality size = checksize <$> readStrict + [ Params params + , Param $ show randomquality + , Param $ show size + ] + where + params = "--gen-random --armor" + + -- See http://www.gnupg.org/documentation/manuals/gcrypt/Quality-of-random-numbers.html + -- for the meaning of random quality levels. + -- The highest available is 2, which is the default for OpenPGP + -- key generation; Note that it uses the blocking PRNG /dev/random + -- on the Linux kernel, hence the running time may take a while. + randomquality :: Int + randomquality = if highQuality then 2 else 1 + + {- The size is the number of bytes of entropy desired; the data is + - base64 encoded, so needs 8 bits to represent every 6 bytes of + - entropy. -} + expectedlength = size * 8 `div` 6 + + checksize s = let len = length s in + if len >= expectedlength + then s + else shortread len + + shortread got = error $ unwords + [ "Not enough bytes returned from gpg", params + , "(got", show got, "; expected", show expectedlength, ")" + ] + +{- A test key. This is provided pre-generated since generating a new gpg + - key is too much work (requires too much entropy) for a test suite to + - do. + - + - This key was generated with no exipiration date, and a small keysize. + - It has an empty passphrase. -} +testKeyId :: String +testKeyId = "129D6E0AC537B9C7" +testKey :: String +testKey = keyBlock True + [ "mI0ETvFAZgEEAKnqwWgZqznMhi1RQExem2H8t3OyKDxaNN3rBN8T6LWGGqAYV4wT" + , "r8In5tfsnz64bKpE1Qi68JURFwYmthgUL9N48tbODU8t3xzijdjLOSaTyqkH1ik6" + , "EyulfKN63xLne9i4F9XqNwpiZzukXYbNfHkDA2yb0M6g4UFKLY/fNzGXABEBAAG0" + , "W2luc2VjdXJlIHRlc3Qga2V5ICh0aGlzIGlzIGEgdGVzdCBrZXksIGRvIG5vdCB1" + , "c2UgZm9yIGFjdHVhbCBlbmNyeXB0aW9uKSA8dGVzdEBleGFtcGxlLmNvbT6IuAQT" + , "AQgAIgUCTvFAZgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQEp1uCsU3" + , "uceQ9wP/YMd1f0+/eLLcwGXNBvGqyVhUOfAKknO1bMzGbqTsq9g60qegy/cldqee" + , "xVxNfy0VN//JeMfgdcb8+RgJYLoaMrTy9CcsUcFPxtwN9tcLmsM0V2/fNmmFBO9t" + , "v75iH+zeFbNg0/FbPkHiN6Mjw7P2gXYKQXgTvQZBWaphk8oQlBm4jQRO8UBmAQQA" + , "vdi50M/WRCkOLt2RsUve8V8brMWYTJBJTTWoHUeRr82v4NCdX7OE1BsoVK8cy/1Q" + , "Y+gLOH9PqinuGGNWRmPV2Ju/RYn5H7sdewXA8E80xWhc4phHRMJ8Jjhg/GVPamkJ" + , "8B5zeKF0jcLFl7cuVdOyQakhoeDWJd0CyfW837nmPtMAEQEAAYifBBgBCAAJBQJO" + , "8UBmAhsMAAoJEBKdbgrFN7nHclAEAKBShuP/toH03atDUQTbGE34CA4yEC9BVghi" + , "7kviOZlOz2s8xAfp/8AYsrECx1kgbXcA7JD902eNyp7NzXsdJX0zJwHqiuZW0XlD" + , "T8ZJu4qrYRYgl/790WPESZ+ValvHD/fqkR38RF4tfxvyoMhhp0roGmJY33GASIG/" + , "+gQkDF9/" + , "=1k11" + ] +testSecretKey :: String +testSecretKey = keyBlock False + [ "lQHYBE7xQGYBBACp6sFoGas5zIYtUUBMXpth/Ldzsig8WjTd6wTfE+i1hhqgGFeM" + , "E6/CJ+bX7J8+uGyqRNUIuvCVERcGJrYYFC/TePLWzg1PLd8c4o3Yyzkmk8qpB9Yp" + , "OhMrpXyjet8S53vYuBfV6jcKYmc7pF2GzXx5AwNsm9DOoOFBSi2P3zcxlwARAQAB" + , "AAP+PlRboxy7Z0XjuG70N6+CrzSddQbW5KCwgPFrxYsPk7sAPFcBkmRMVlv9vZpS" + , "phbP4bvDK+MrSntM51g+9uE802yhPhSWdmEbImiWfV2ucEhlLjD8gw7JDex9XZ0a" + , "EbTOV56wOsILuedX/jF/6i6IQzy5YmuMeo+ip1XQIsIN+80CAMyXepOBJgHw/gBD" + , "VdXh/l//vUkQQlhInQYwgkKbr0POCTdr8DM1qdKLcUD9Q1khgNRp0vZGGz+5xsrc" + , "KaODUlMCANSczLJcYWa8yPqB3S14yTe7qmtDiOS362+SeVUwQA7eQ06PcHLPsN+p" + , "NtWoHRfYazxrs+g0JvmoQOYdj4xSQy0CAMq7H/l6aeG1n8tpyMxqE7OvBOsvzdu5" + , "XS7I1AnwllVFgvTadVvqgf7b+hdYd91doeHDUGqSYO78UG1GgaBHJdylqrRbaW5z" + , "ZWN1cmUgdGVzdCBrZXkgKHRoaXMgaXMgYSB0ZXN0IGtleSwgZG8gbm90IHVzZSBm" + , "b3IgYWN0dWFsIGVuY3J5cHRpb24pIDx0ZXN0QGV4YW1wbGUuY29tPoi4BBMBCAAi" + , "BQJO8UBmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRASnW4KxTe5x5D3" + , "A/9gx3V/T794stzAZc0G8arJWFQ58AqSc7VszMZupOyr2DrSp6DL9yV2p57FXE1/" + , "LRU3/8l4x+B1xvz5GAlguhoytPL0JyxRwU/G3A321wuawzRXb982aYUE722/vmIf" + , "7N4Vs2DT8Vs+QeI3oyPDs/aBdgpBeBO9BkFZqmGTyhCUGZ0B2ARO8UBmAQQAvdi5" + , "0M/WRCkOLt2RsUve8V8brMWYTJBJTTWoHUeRr82v4NCdX7OE1BsoVK8cy/1QY+gL" + , "OH9PqinuGGNWRmPV2Ju/RYn5H7sdewXA8E80xWhc4phHRMJ8Jjhg/GVPamkJ8B5z" + , "eKF0jcLFl7cuVdOyQakhoeDWJd0CyfW837nmPtMAEQEAAQAD/RaVtFFTkF1udun7" + , "YOwzJvQXCO9OWHZvSdEeG4BUNdAwy4YWu0oZzKkBDBS6+lWILqqb/c28U4leUJ1l" + , "H+viz5svN9BWWyj/UpI00uwUo9JaIqalemwfLx6vsh69b54L1B4exLZHYGLvy/B3" + , "5T6bT0gpOE+53BRtKcJaOh/McQeJAgDTOCBU5weWOf6Bhqnw3Vr/gRfxntAz2okN" + , "gqz/h79mWbCc/lHKoYQSsrCdMiwziHSjXwvehUrdWE/AcomtW0vbAgDmGJqJ2fNr" + , "HvdsGx4Ld/BxyiZbCURJLUQ5CwzfHGIvBu9PMT8zM26NOSncaXRjxDna2Ggh8Uum" + , "ANEwbnhxFwZpAf9L9RLYIMTtAqwBjfXJg/lHcc2R+VP0hL5c8zFz+S+w7bRqINwL" + , "ff1JstKuHT2nJnu0ustK66by8YI3T0hDFFahnNCInwQYAQgACQUCTvFAZgIbDAAK" + , "CRASnW4KxTe5x3JQBACgUobj/7aB9N2rQ1EE2xhN+AgOMhAvQVYIYu5L4jmZTs9r" + , "PMQH6f/AGLKxAsdZIG13AOyQ/dNnjcqezc17HSV9MycB6ormVtF5Q0/GSbuKq2EW" + , "IJf+/dFjxEmflWpbxw/36pEd/EReLX8b8qDIYadK6BpiWN9xgEiBv/oEJAxffw==" + , "=LDsg" + ] +keyBlock :: Bool -> [String] -> String +keyBlock public ls = unlines + [ "-----BEGIN PGP "++t++" KEY BLOCK-----" + , "Version: GnuPG v1.4.11 (GNU/Linux)" + , "" + , unlines ls + , "-----END PGP "++t++" KEY BLOCK-----" + ] + where + t + | public = "PUBLIC" + | otherwise = "PRIVATE" + +#ifndef mingw32_HOST_OS +{- Runs an action using gpg in a test harness, in which gpg does + - not use ~/.gpg/, but a directory with the test key set up to be used. -} +testHarness :: IO a -> IO a +testHarness a = do + orig <- getEnv var + bracket setup (cleanup orig) (const a) + where + var = "GNUPGHOME" + + setup = do + base <- getTemporaryDirectory + dir <- mktmpdir $ base "gpgtmpXXXXXX" + void $ setEnv var dir True + -- For some reason, recent gpg needs a trustdb to be set up. + _ <- pipeStrict [Params "--trust-model auto --update-trustdb"] [] + _ <- pipeStrict [Params "--import -q"] $ unlines + [testSecretKey, testKey] + return dir + + cleanup orig tmpdir = removeDirectoryRecursive tmpdir >> reset orig + reset (Just v) = setEnv var v True + reset _ = unsetEnv var + +{- Tests the test harness. -} +testTestHarness :: IO Bool +testTestHarness = do + keys <- testHarness $ findPubKeys testKeyId + return $ KeyIds [testKeyId] == keys +#endif + +#ifndef mingw32_HOST_OS +checkEncryptionFile :: FilePath -> Maybe KeyIds -> IO Bool +checkEncryptionFile filename keys = + checkGpgPackets keys =<< readStrict params + where + params = [Params "--list-packets --list-only", File filename] + +checkEncryptionStream :: String -> Maybe KeyIds -> IO Bool +checkEncryptionStream stream keys = + checkGpgPackets keys =<< pipeStrict params stream + where + params = [Params "--list-packets --list-only"] + +{- Parses an OpenPGP packet list, and checks whether data is + - symmetrically encrypted (keys is Nothing), or encrypted to some + - public key(s). + - /!\ The key needs to be in the keyring! -} +checkGpgPackets :: Maybe KeyIds -> String -> IO Bool +checkGpgPackets keys str = do + let (asym,sym) = partition (pubkeyEncPacket `isPrefixOf`) $ + filter (\l' -> pubkeyEncPacket `isPrefixOf` l' || + symkeyEncPacket `isPrefixOf` l') $ + takeWhile (/= ":encrypted data packet:") $ + lines str + case (keys,asym,sym) of + (Nothing, [], [_]) -> return True + (Just (KeyIds ks), ls, []) -> do + -- Find the master key associated with the + -- encryption subkey. + ks' <- concat <$> mapM (keyIds <$$> findPubKeys) + [ k | k:"keyid":_ <- map (reverse . words) ls ] + return $ sort (nub ks) == sort (nub ks') + _ -> return False + where + pubkeyEncPacket = ":pubkey enc packet: " + symkeyEncPacket = ":symkey enc packet: " +#endif diff --git a/Utility/Hash.hs b/Utility/Hash.hs new file mode 100644 index 000000000..1c5450a9b --- /dev/null +++ b/Utility/Hash.hs @@ -0,0 +1,70 @@ +{- Convenience wrapper around cryptohash. + - Falls back to SHA if it's not available. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Hash ( + sha1, + sha224, + sha256, + sha384, + sha512, +#ifdef WITH_CRYPTOHASH + skein256, + skein512, +#endif + prop_hashes_stable +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Text as T +import qualified Data.Text.Encoding as T + +#ifndef WITH_CRYPTOHASH +import Data.Digest.Pure.SHA +#else +import Crypto.Hash + +sha1 :: L.ByteString -> Digest SHA1 +sha1 = hashlazy + +sha224 :: L.ByteString -> Digest SHA224 +sha224 = hashlazy + +sha256 :: L.ByteString -> Digest SHA256 +sha256 = hashlazy + +sha384 :: L.ByteString -> Digest SHA384 +sha384 = hashlazy + +sha512 :: L.ByteString -> Digest SHA512 +sha512 = hashlazy + +-- sha3 is not yet fully standardized +--sha3 :: L.ByteString -> Digest SHA3 +--sha3 = hashlazy + +skein256 :: L.ByteString -> Digest Skein256_256 +skein256 = hashlazy + +skein512 :: L.ByteString -> Digest Skein512_512 +skein512 = hashlazy + +#endif + +{- Check that all the hashes continue to hash the same. -} +prop_hashes_stable :: Bool +prop_hashes_stable = all (\(hasher, result) -> hasher foo == result) + [ (show . sha1, "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") + , (show . sha224, "0808f64e60d58979fcb676c96ec938270dea42445aeefcd3a4e6f8db") + , (show . sha256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae") + , (show . sha384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb") + , (show . sha512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7") +#ifdef WITH_CRYPTOHASH + , (show . skein256, "a04efd9a0aeed6ede40fe5ce0d9361ae7b7d88b524aa19917b9315f1ecf00d33") + , (show . skein512, "fd8956898113510180aa4658e6c0ac85bd74fb47f4a4ba264a6b705d7a8e8526756e75aecda12cff4f1aca1a4c2830fbf57f458012a66b2b15a3dd7d251690a7") +#endif + ] + where + foo = L.fromChunks [T.encodeUtf8 $ T.pack "foo"] diff --git a/Utility/HumanNumber.hs b/Utility/HumanNumber.hs new file mode 100644 index 000000000..8783f8152 --- /dev/null +++ b/Utility/HumanNumber.hs @@ -0,0 +1,21 @@ +{- numbers for humans + - + - Copyright 2012-2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.HumanNumber where + +{- Displays a fractional value as a string with a limited number + - of decimal digits. -} +showImprecise :: RealFrac a => Int -> a -> String +showImprecise precision n + | precision == 0 || remainder == 0 = show (round n :: Integer) + | otherwise = show int ++ "." ++ striptrailing0s (pad0s $ show remainder) + where + int :: Integer + (int, frac) = properFraction n + remainder = round (frac * 10 ^ precision) :: Integer + pad0s s = replicate (precision - length s) '0' ++ s + striptrailing0s = reverse . dropWhile (== '0') . reverse diff --git a/Utility/HumanTime.hs b/Utility/HumanTime.hs new file mode 100644 index 000000000..2aef1b09c --- /dev/null +++ b/Utility/HumanTime.hs @@ -0,0 +1,101 @@ +{- Time for humans. + - + - Copyright 2012-2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.HumanTime ( + Duration(..), + durationSince, + durationToPOSIXTime, + durationToDays, + daysToDuration, + parseDuration, + fromDuration, + prop_duration_roundtrips +) where + +import Utility.PartialPrelude +import Utility.Applicative +import Utility.QuickCheck + +import Data.Time.Clock +import Data.Time.Clock.POSIX (POSIXTime) +import Data.Char +import Control.Applicative +import qualified Data.Map as M + +newtype Duration = Duration { durationSeconds :: Integer } + deriving (Eq, Ord, Read, Show) + +durationSince :: UTCTime -> IO Duration +durationSince pasttime = do + now <- getCurrentTime + return $ Duration $ round $ diffUTCTime now pasttime + +durationToPOSIXTime :: Duration -> POSIXTime +durationToPOSIXTime = fromIntegral . durationSeconds + +durationToDays :: Duration -> Integer +durationToDays d = durationSeconds d `div` dsecs + +daysToDuration :: Integer -> Duration +daysToDuration i = Duration $ i * dsecs + +{- Parses a human-input time duration, of the form "5h", "1m", "5h1m", etc -} +parseDuration :: String -> Maybe Duration +parseDuration = Duration <$$> go 0 + where + go n [] = return n + go n s = do + num <- readish s :: Maybe Integer + case dropWhile isDigit s of + (c:rest) -> do + u <- M.lookup c unitmap + go (n + num * u) rest + _ -> return $ n + num + +fromDuration :: Duration -> String +fromDuration Duration { durationSeconds = d } + | d == 0 = "0s" + | otherwise = concatMap showunit $ go [] units d + where + showunit (u, n) + | n > 0 = show n ++ [u] + | otherwise = "" + go c [] _ = reverse c + go c ((u, n):us) v = + let (q,r) = v `quotRem` n + in go ((u, q):c) us r + +units :: [(Char, Integer)] +units = + [ ('y', ysecs) + , ('d', dsecs) + , ('h', hsecs) + , ('m', msecs) + , ('s', 1) + ] + +unitmap :: M.Map Char Integer +unitmap = M.fromList units + +ysecs :: Integer +ysecs = dsecs * 365 + +dsecs :: Integer +dsecs = hsecs * 24 + +hsecs :: Integer +hsecs = msecs * 60 + +msecs :: Integer +msecs = 60 + +-- Durations cannot be negative. +instance Arbitrary Duration where + arbitrary = Duration <$> nonNegative arbitrary + +prop_duration_roundtrips :: Duration -> Bool +prop_duration_roundtrips d = parseDuration (fromDuration d) == Just d diff --git a/Utility/InodeCache.hs b/Utility/InodeCache.hs new file mode 100644 index 000000000..b3534487d --- /dev/null +++ b/Utility/InodeCache.hs @@ -0,0 +1,210 @@ +{- Caching a file's inode, size, and modification time + - to see when it's changed. + - + - Copyright 2013, 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.InodeCache ( + InodeCache, + InodeComparisonType(..), + + compareStrong, + compareWeak, + compareBy, + + readInodeCache, + showInodeCache, + genInodeCache, + toInodeCache, + + InodeCacheKey, + inodeCacheToKey, + inodeCacheToMtime, + + SentinalFile(..), + SentinalStatus(..), + TSDelta, + noTSDelta, + writeSentinalFile, + checkSentinalFile, + sentinalFileExists, + + prop_read_show_inodecache +) where + +import Common +import System.PosixCompat.Types +import Utility.QuickCheck + +data InodeCachePrim = InodeCachePrim FileID FileOffset EpochTime + deriving (Show, Eq, Ord) + +newtype InodeCache = InodeCache InodeCachePrim + deriving (Show) + +{- Inode caches can be compared in two different ways, either weakly + - or strongly. -} +data InodeComparisonType = Weakly | Strongly + deriving (Eq, Ord) + +{- Strong comparison, including inodes. -} +compareStrong :: InodeCache -> InodeCache -> Bool +compareStrong (InodeCache x) (InodeCache y) = x == y + +{- Weak comparison of the inode caches, comparing the size and mtime, + - but not the actual inode. Useful when inodes have changed, perhaps + - due to some filesystems being remounted. + - + - The weak mtime comparison treats any mtimes that are within 2 seconds + - of one-anther as the same. This is because FAT has only a 2 second + - resolution. When a FAT filesystem is used on Linux, higher resolution + - timestamps are cached and used by Linux, but this is lost on unmount, + - so after a remount, the timestamp can appear to have changed. + -} +compareWeak :: InodeCache -> InodeCache -> Bool +compareWeak (InodeCache (InodeCachePrim _ size1 mtime1)) (InodeCache (InodeCachePrim _ size2 mtime2)) = + size1 == size2 && (abs (mtime1 - mtime2) < 2) + +compareBy :: InodeComparisonType -> InodeCache -> InodeCache -> Bool +compareBy Strongly = compareStrong +compareBy Weakly = compareWeak + +{- For use in a Map; it's determined at creation time whether this + - uses strong or weak comparison for Eq. -} +data InodeCacheKey = InodeCacheKey InodeComparisonType InodeCachePrim + deriving (Ord) + +instance Eq InodeCacheKey where + (InodeCacheKey ctx x) == (InodeCacheKey cty y) = + compareBy (maximum [ctx,cty]) (InodeCache x ) (InodeCache y) + +inodeCacheToKey :: InodeComparisonType -> InodeCache -> InodeCacheKey +inodeCacheToKey ct (InodeCache prim) = InodeCacheKey ct prim + +inodeCacheToMtime :: InodeCache -> EpochTime +inodeCacheToMtime (InodeCache (InodeCachePrim _ _ mtime)) = mtime + +showInodeCache :: InodeCache -> String +showInodeCache (InodeCache (InodeCachePrim inode size mtime)) = unwords + [ show inode + , show size + , show mtime + ] + +readInodeCache :: String -> Maybe InodeCache +readInodeCache s = case words s of + (inode:size:mtime:_) -> + let prim = InodeCachePrim + <$> readish inode + <*> readish size + <*> readish mtime + in InodeCache <$> prim + _ -> Nothing + +genInodeCache :: FilePath -> TSDelta -> IO (Maybe InodeCache) +genInodeCache f delta = catchDefaultIO Nothing $ + toInodeCache delta =<< getFileStatus f + +toInodeCache :: TSDelta -> FileStatus -> IO (Maybe InodeCache) +toInodeCache (TSDelta getdelta) s + | isRegularFile s = do + delta <- getdelta + return $ Just $ InodeCache $ InodeCachePrim + (fileID s) + (fileSize s) + (modificationTime s + delta) + | otherwise = pure Nothing + +{- Some filesystem get new random inodes each time they are mounted. + - To detect this and other problems, a sentinal file can be created. + - Its InodeCache at the time of its creation is written to the cache file, + - so changes can later be detected. -} +data SentinalFile = SentinalFile + { sentinalFile :: FilePath + , sentinalCacheFile :: FilePath + } + deriving (Show) + +{- On Windows, the mtime of a file appears to change when the time zone is + - changed. To deal with this, a TSDelta can be used; the delta is added to + - the mtime when generating an InodeCache. The current delta can be found + - by looking at the SentinalFile. Effectively, this makes all InodeCaches + - use the same time zone that was in use when the sential file was + - originally written. -} +newtype TSDelta = TSDelta (IO EpochTime) + +noTSDelta :: TSDelta +noTSDelta = TSDelta (pure 0) + +writeSentinalFile :: SentinalFile -> IO () +writeSentinalFile s = do + writeFile (sentinalFile s) "" + maybe noop (writeFile (sentinalCacheFile s) . showInodeCache) + =<< genInodeCache (sentinalFile s) noTSDelta + +data SentinalStatus = SentinalStatus + { sentinalInodesChanged :: Bool + , sentinalTSDelta :: TSDelta + } + +{- Checks if the InodeCache of the sentinal file is the same + - as it was when it was originally created. + - + - On Windows, time stamp differences are ignored, since they change + - with the timezone. + - + - When the sential file does not exist, InodeCaches canot reliably be + - compared, so the assumption is that there is has been a change. + -} +checkSentinalFile :: SentinalFile -> IO SentinalStatus +checkSentinalFile s = do + mold <- loadoldcache + case mold of + Nothing -> return dummy + (Just old) -> do + mnew <- gennewcache + case mnew of + Nothing -> return dummy + Just new -> return $ calc old new + where + loadoldcache = catchDefaultIO Nothing $ + readInodeCache <$> readFile (sentinalCacheFile s) + gennewcache = genInodeCache (sentinalFile s) noTSDelta + calc (InodeCache (InodeCachePrim oldinode oldsize oldmtime)) (InodeCache (InodeCachePrim newinode newsize newmtime)) = + SentinalStatus (not unchanged) tsdelta + where +#ifdef mingw32_HOST_OS + unchanged = oldinode == newinode && oldsize == newsize + tsdelta = TSDelta $ do + -- Run when generating an InodeCache, + -- to get the current delta. + mnew <- gennewcache + return $ case mnew of + Just (InodeCache (InodeCachePrim _ _ currmtime)) -> + oldmtime - currmtime + Nothing -> 0 +#else + unchanged = oldinode == newinode && oldsize == newsize && oldmtime == newmtime + tsdelta = noTSDelta +#endif + dummy = SentinalStatus True noTSDelta + +sentinalFileExists :: SentinalFile -> IO Bool +sentinalFileExists s = allM doesFileExist [sentinalCacheFile s, sentinalFile s] + +instance Arbitrary InodeCache where + arbitrary = + let prim = InodeCachePrim + <$> arbitrary + <*> arbitrary + <*> arbitrary + in InodeCache <$> prim + +prop_read_show_inodecache :: InodeCache -> Bool +prop_read_show_inodecache c = case readInodeCache (showInodeCache c) of + Nothing -> False + Just c' -> compareStrong c c' diff --git a/Utility/JSONStream.hs b/Utility/JSONStream.hs new file mode 100644 index 000000000..b28646268 --- /dev/null +++ b/Utility/JSONStream.hs @@ -0,0 +1,44 @@ +{- Streaming JSON output. + - + - Copyright 2011 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.JSONStream ( + start, + add, + end +) where + +import Text.JSON + +{- Text.JSON does not support building up a larger JSON document piece by + - piece as a stream. To support streaming, a hack. The JSObject is converted + - to a string with its final "}" is left off, allowing it to be added to + - later. -} +start :: JSON a => [(String, a)] -> String +start l + | last s == endchar = init s + | otherwise = bad s + where + s = encodeStrict $ toJSObject l + +add :: JSON a => [(String, a)] -> String +add l + | head s == startchar = ',' : drop 1 s + | otherwise = bad s + where + s = start l + +end :: String +end = [endchar, '\n'] + +startchar :: Char +startchar = '{' + +endchar :: Char +endchar = '}' + +bad :: String -> a +bad s = error $ "Text.JSON returned unexpected string: " ++ s diff --git a/Utility/LinuxMkLibs.hs b/Utility/LinuxMkLibs.hs new file mode 100644 index 000000000..1dc4e1ea3 --- /dev/null +++ b/Utility/LinuxMkLibs.hs @@ -0,0 +1,61 @@ +{- Linux library copier and binary shimmer + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.LinuxMkLibs where + +import Control.Applicative +import Data.Maybe +import System.Directory +import Data.List.Utils +import System.Posix.Files +import Data.Char +import Control.Monad.IfElse + +import Utility.PartialPrelude +import Utility.Directory +import Utility.Process +import Utility.Monad +import Utility.Path + +{- Installs a library. If the library is a symlink to another file, + - install the file it links to, and update the symlink to be relative. -} +installLib :: (FilePath -> FilePath -> IO ()) -> FilePath -> FilePath -> IO (Maybe FilePath) +installLib installfile top lib = ifM (doesFileExist lib) + ( do + installfile top lib + checksymlink lib + return $ Just $ parentDir lib + , return Nothing + ) + where + checksymlink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus (inTop top f)) $ do + l <- readSymbolicLink (inTop top f) + let absl = absPathFrom (parentDir f) l + let target = relPathDirToFile (parentDir f) absl + installfile top absl + nukeFile (top ++ f) + createSymbolicLink target (inTop top f) + checksymlink absl + +-- Note that f is not relative, so cannot use +inTop :: FilePath -> FilePath -> FilePath +inTop top f = top ++ f + +{- Parse ldd output, getting all the libraries that the input files + - link to. Note that some of the libraries may not exist + - (eg, linux-vdso.so) -} +parseLdd :: String -> [FilePath] +parseLdd = mapMaybe (getlib . dropWhile isSpace) . lines + where + getlib l = headMaybe . words =<< lastMaybe (split " => " l) + +{- Get all glibc libs and other support files, including gconv files + - + - XXX Debian specific. -} +glibcLibs :: IO [FilePath] +glibcLibs = lines <$> readProcess "sh" + ["-c", "dpkg -L libc6:$(dpkg --print-architecture) libgcc1:$(dpkg --print-architecture) | egrep '\\.so|gconv'"] diff --git a/Utility/LogFile.hs b/Utility/LogFile.hs new file mode 100644 index 000000000..e4f90d418 --- /dev/null +++ b/Utility/LogFile.hs @@ -0,0 +1,59 @@ +{- log files + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.LogFile where + +import Common + +#ifndef mingw32_HOST_OS +import System.Posix.Types +#endif + +openLog :: FilePath -> IO Handle +openLog logfile = do + rotateLog logfile + openFile logfile AppendMode + +rotateLog :: FilePath -> IO () +rotateLog logfile = go 0 + where + go num + | num > maxLogs = return () + | otherwise = whenM (doesFileExist currfile) $ do + go (num + 1) + rename currfile nextfile + where + currfile = filename num + nextfile = filename (num + 1) + filename n + | n == 0 = logfile + | otherwise = rotatedLog logfile n + +rotatedLog :: FilePath -> Int -> FilePath +rotatedLog logfile n = logfile ++ "." ++ show n + +{- Lists most recent logs last. -} +listLogs :: FilePath -> IO [FilePath] +listLogs logfile = filterM doesFileExist $ reverse $ + logfile : map (rotatedLog logfile) [1..maxLogs] + +maxLogs :: Int +maxLogs = 9 + +#ifndef mingw32_HOST_OS +redirLog :: Fd -> IO () +redirLog logfd = do + mapM_ (redir logfd) [stdOutput, stdError] + closeFd logfd + +redir :: Fd -> Fd -> IO () +redir newh h = do + closeFd h + void $ dupTo newh h +#endif diff --git a/Utility/Lsof.hs b/Utility/Lsof.hs new file mode 100644 index 000000000..ee4036b16 --- /dev/null +++ b/Utility/Lsof.hs @@ -0,0 +1,120 @@ +{- lsof interface + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Lsof where + +import Common +import Build.SysConfig as SysConfig +import Utility.Env + +import System.Posix.Types + +data LsofOpenMode = OpenReadWrite | OpenReadOnly | OpenWriteOnly | OpenUnknown + deriving (Show, Eq) + +type CmdLine = String + +data ProcessInfo = ProcessInfo ProcessID CmdLine + deriving (Show) + +{- lsof is not in PATH on all systems, so SysConfig may have the absolute + - path where the program was found. Make sure at runtime that lsof is + - available, and if it's not in PATH, adjust PATH to contain it. -} +setup :: IO () +setup = do + let cmd = fromMaybe "lsof" SysConfig.lsof + when (isAbsolute cmd) $ do + path <- getSearchPath + let path' = takeDirectory cmd : path + void $ setEnv "PATH" (intercalate [searchPathSeparator] path') True + +{- Checks each of the files in a directory to find open files. + - Note that this will find hard links to files elsewhere that are open. -} +queryDir :: FilePath -> IO [(FilePath, LsofOpenMode, ProcessInfo)] +queryDir path = query ["+d", path] + +{- Runs lsof with some parameters. + - + - Ignores nonzero exit code; lsof returns that when no files are open. + - + - Note: If lsof is not available, this always returns [] ! + -} +query :: [String] -> IO [(FilePath, LsofOpenMode, ProcessInfo)] +query opts = + withHandle StdoutHandle (createProcessChecked checkSuccessProcess) p $ \h -> do + fileEncoding h + parse <$> hGetContentsStrict h + where + p = proc "lsof" ("-F0can" : opts) + +type LsofParser = String -> [(FilePath, LsofOpenMode, ProcessInfo)] + +parse :: LsofParser +#ifdef __ANDROID__ +parse = parseDefault +#else +parse = parseFormatted +#endif + +{- Parsing null-delimited output like: + - + - pPID\0cCMDLINE\0 + - aMODE\0nFILE\0 + - aMODE\0nFILE\0 + - pPID\0[...] + - + - Where each new process block is started by a pid, and a process can + - have multiple files open. + -} +parseFormatted :: LsofParser +parseFormatted s = bundle $ go [] $ lines s + where + bundle = concatMap (\(fs, p) -> map (\(f, m) -> (f, m, p)) fs) + + go c [] = c + go c ((t:r):ls) + | t == 'p' = + let (fs, ls') = parsefiles [] ls + in go ((fs, parseprocess r):c) ls' + | otherwise = parsefail + go _ _ = parsefail + + parseprocess l = case splitnull l of + [pid, 'c':cmdline, ""] -> + case readish pid of + (Just n) -> ProcessInfo n cmdline + Nothing -> parsefail + _ -> parsefail + + parsefiles c [] = (c, []) + parsefiles c (l:ls) = case splitnull l of + ['a':mode, 'n':file, ""] -> + parsefiles ((file, parsemode mode):c) ls + (('p':_):_) -> (c, l:ls) + _ -> parsefail + + parsemode ('r':_) = OpenReadOnly + parsemode ('w':_) = OpenWriteOnly + parsemode ('u':_) = OpenReadWrite + parsemode _ = OpenUnknown + + splitnull = split "\0" + + parsefail = error $ "failed to parse lsof output: " ++ show s + +{- Parses lsof's default output format. -} +parseDefault :: LsofParser +parseDefault = mapMaybe parseline . drop 1 . lines + where + parseline l = case words l of + (command : spid : _user : _fd : _type : _device : _size : _node : rest) -> + case readish spid of + Nothing -> Nothing + Just pid -> Just (unwords rest, OpenUnknown, ProcessInfo pid command) + _ -> Nothing diff --git a/Utility/Matcher.hs b/Utility/Matcher.hs new file mode 100644 index 000000000..1ee224ffc --- /dev/null +++ b/Utility/Matcher.hs @@ -0,0 +1,169 @@ +{- A generic matcher. + - + - Can be used to check if a user-supplied condition, + - like "foo and ( bar or not baz )" matches. The condition must already + - be tokenized, and can contain arbitrary operations. + - + - If operations are not separated by and/or, they are defaulted to being + - anded together, so "foo bar baz" all must match. + - + - Is forgiving about misplaced closing parens, so "foo and (bar or baz" + - will be handled, as will "foo and ( bar or baz ) )" + - + - Copyright 2011-2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE Rank2Types, KindSignatures #-} + +module Utility.Matcher ( + Token(..), + Matcher(..), + token, + tokens, + generate, + match, + matchM, + matchMrun, + isEmpty, + + prop_matcher_sane +) where + +import Common + +{- A Token can be an Operation of an arbitrary type, or one of a few + - predefined peices of syntax. -} +data Token op = Operation op | And | Or | Not | Open | Close + deriving (Show, Eq) + +data Matcher op = MAny + | MAnd (Matcher op) (Matcher op) + | MOr (Matcher op) (Matcher op) + | MNot (Matcher op) + | MOp op + deriving (Show, Eq) + +{- Converts a word of syntax into a token. Doesn't handle operations. -} +token :: String -> Token op +token "and" = And +token "or" = Or +token "not" = Not +token "(" = Open +token ")" = Close +token t = error $ "unknown token " ++ t + +tokens :: [String] +tokens = words "and or not ( )" + +{- Converts a list of Tokens into a Matcher. -} +generate :: [Token op] -> Matcher op +generate = simplify . process MAny . tokenGroups + where + process m [] = m + process m ts = uncurry process $ consume m ts + + consume m (One And:rest) = term (m `MAnd`) rest + consume m (One Or:rest) = term (m `MOr`) rest + consume m (One Not:rest) = term (\p -> m `MAnd` (MNot p)) rest + consume m (One (Operation o):rest) = (m `MAnd` MOp o, rest) + consume m (Group g:rest) = (process m g, rest) + consume m (_:rest) = consume m rest + consume m [] = (m, []) + + term a l = + let (p, l') = consume MAny l + in (a p, l') + + simplify (MAnd MAny x) = simplify x + simplify (MAnd x MAny) = simplify x + simplify (MAnd x y) = MAnd (simplify x) (simplify y) + simplify (MOr x y) = MOr (simplify x) (simplify y) + simplify (MNot x) = MNot (simplify x) + simplify x = x + +data TokenGroup op = One (Token op) | Group [TokenGroup op] + deriving (Show, Eq) + +tokenGroups :: [Token op] -> [TokenGroup op] +tokenGroups [] = [] +tokenGroups (t:ts) = go t + where + go Open = + let (gr, rest) = findClose ts + in gr : tokenGroups rest + go Close = tokenGroups ts -- not picky about missing Close + go _ = One t : tokenGroups ts + +findClose :: [Token op] -> (TokenGroup op, [Token op]) +findClose l = + let (g, rest) = go [] l + in (Group (reverse g), rest) + where + go c [] = (c, []) -- not picky about extra Close + go c (t:ts) = handle t + where + handle Close = (c, ts) + handle Open = + let (c', ts') = go [] ts + in go (Group (reverse c') : c) ts' + handle _ = go (One t:c) ts + +{- Checks if a Matcher matches, using a supplied function to check + - the value of Operations. -} +match :: (op -> v -> Bool) -> Matcher op -> v -> Bool +match a m v = go m + where + go MAny = True + go (MAnd m1 m2) = go m1 && go m2 + go (MOr m1 m2) = go m1 || go m2 + go (MNot m1) = not $ go m1 + go (MOp o) = a o v + +{- Runs a monadic Matcher, where Operations are actions in the monad. -} +matchM :: Monad m => Matcher (v -> m Bool) -> v -> m Bool +matchM m v = matchMrun m $ \o -> o v + +{- More generic running of a monadic Matcher, with full control over running + - of Operations. Mostly useful in order to match on more than one + - parameter. -} +matchMrun :: forall o (m :: * -> *). Monad m => Matcher o -> (o -> m Bool) -> m Bool +matchMrun m run = go m + where + go MAny = return True + go (MAnd m1 m2) = go m1 <&&> go m2 + go (MOr m1 m2) = go m1 <||> go m2 + go (MNot m1) = liftM not (go m1) + go (MOp o) = run o + +{- Checks if a matcher contains no limits. -} +isEmpty :: Matcher a -> Bool +isEmpty MAny = True +isEmpty _ = False + +prop_matcher_sane :: Bool +prop_matcher_sane = all (\m -> match dummy m ()) $ map generate + [ [Operation True] + , [] + , [Operation False, Or, Operation True, Or, Operation False] + , [Operation True, Or, Operation True] + , [Operation True, And, Operation True] + , [Not, Open, Operation True, And, Operation False, Close] + , [Not, Open, Not, Open, Not, Operation False, Close, Close] + , [Not, Open, Not, Open, Not, Open, Not, Operation True, Close, Close] + , [Operation True, And, Not, Operation False] + , [Operation True, Not, Operation False] + , [Operation True, Not, Not, Not, Operation False] + , [Operation True, Not, Not, Not, Operation False, And, Operation True] + , [Operation True, Not, Not, Not, Operation False, Operation True] + , [Not, Open, Operation True, And, Operation False, Close, + And, Open, + Open, Operation True, And, Operation False, Close, + Or, + Open, Operation True, And, Open, Not, Operation False, Close, Close, + Close, And, + Open, Not, Operation False, Close] + ] + where + dummy b _ = b diff --git a/Utility/Metered.hs b/Utility/Metered.hs new file mode 100644 index 000000000..0d94c1c5c --- /dev/null +++ b/Utility/Metered.hs @@ -0,0 +1,116 @@ +{- Metered IO + - + - Copyright 2012, 2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE TypeSynonymInstances #-} + +module Utility.Metered where + +import Common + +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString as S +import System.IO.Unsafe +import Foreign.Storable (Storable(sizeOf)) +import System.Posix.Types + +{- An action that can be run repeatedly, updating it on the bytes processed. + - + - Note that each call receives the total number of bytes processed, so + - far, *not* an incremental amount since the last call. -} +type MeterUpdate = (BytesProcessed -> IO ()) + +{- Total number of bytes processed so far. -} +newtype BytesProcessed = BytesProcessed Integer + deriving (Eq, Ord, Show) + +class AsBytesProcessed a where + toBytesProcessed :: a -> BytesProcessed + fromBytesProcessed :: BytesProcessed -> a + +instance AsBytesProcessed Integer where + toBytesProcessed i = BytesProcessed i + fromBytesProcessed (BytesProcessed i) = i + +instance AsBytesProcessed Int where + toBytesProcessed i = BytesProcessed $ toInteger i + fromBytesProcessed (BytesProcessed i) = fromInteger i + +instance AsBytesProcessed FileOffset where + toBytesProcessed sz = BytesProcessed $ toInteger sz + fromBytesProcessed (BytesProcessed sz) = fromInteger sz + +addBytesProcessed :: AsBytesProcessed v => BytesProcessed -> v -> BytesProcessed +addBytesProcessed (BytesProcessed i) v = + let (BytesProcessed n) = toBytesProcessed v + in BytesProcessed $! i + n + +zeroBytesProcessed :: BytesProcessed +zeroBytesProcessed = BytesProcessed 0 + +{- Sends the content of a file to an action, updating the meter as it's + - consumed. -} +withMeteredFile :: FilePath -> MeterUpdate -> (L.ByteString -> IO a) -> IO a +withMeteredFile f meterupdate a = withBinaryFile f ReadMode $ \h -> + hGetContentsMetered h meterupdate >>= a + +{- Sends the content of a file to a Handle, updating the meter as it's + - written. -} +streamMeteredFile :: FilePath -> MeterUpdate -> Handle -> IO () +streamMeteredFile f meterupdate h = withMeteredFile f meterupdate $ L.hPut h + +{- Writes a ByteString to a Handle, updating a meter as it's written. -} +meteredWrite :: MeterUpdate -> Handle -> L.ByteString -> IO () +meteredWrite meterupdate h = go zeroBytesProcessed . L.toChunks + where + go _ [] = return () + go sofar (c:cs) = do + S.hPut h c + let sofar' = addBytesProcessed sofar $ S.length c + meterupdate sofar' + go sofar' cs + +meteredWriteFile :: MeterUpdate -> FilePath -> L.ByteString -> IO () +meteredWriteFile meterupdate f b = withBinaryFile f WriteMode $ \h -> + meteredWrite meterupdate h b + +{- This is like L.hGetContents, but after each chunk is read, a meter + - is updated based on the size of the chunk. + - + - Note that the meter update is run in unsafeInterleaveIO, which means that + - it can be run at any time. It's even possible for updates to run out + - of order, as different parts of the ByteString are consumed. + - + - All the usual caveats about using unsafeInterleaveIO apply to the + - meter updates, so use caution. + -} +hGetContentsMetered :: Handle -> MeterUpdate -> IO L.ByteString +hGetContentsMetered h meterupdate = lazyRead zeroBytesProcessed + where + lazyRead sofar = unsafeInterleaveIO $ loop sofar + + loop sofar = do + c <- S.hGetSome h defaultChunkSize + if S.null c + then do + hClose h + return $ L.empty + else do + let sofar' = addBytesProcessed sofar $ + S.length c + meterupdate sofar' + {- unsafeInterleaveIO causes this to be + - deferred until the data is read from the + - ByteString. -} + cs <- lazyRead sofar' + return $ L.append (L.fromChunks [c]) cs + +{- Same default chunk size Lazy ByteStrings use. -} +defaultChunkSize :: Int +defaultChunkSize = 32 * k - chunkOverhead + where + k = 1024 + chunkOverhead = 2 * sizeOf (undefined :: Int) -- GHC specific diff --git a/Utility/Misc.hs b/Utility/Misc.hs new file mode 100644 index 000000000..949f41e7b --- /dev/null +++ b/Utility/Misc.hs @@ -0,0 +1,148 @@ +{- misc utility functions + - + - Copyright 2010-2011 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Misc where + +import System.IO +import Control.Monad +import Foreign +import Data.Char +import Data.List +import Control.Applicative +import System.Exit +#ifndef mingw32_HOST_OS +import System.Posix.Process (getAnyProcessStatus) +import Utility.Exception +#endif + +import Utility.FileSystemEncoding +import Utility.Monad + +{- A version of hgetContents that is not lazy. Ensures file is + - all read before it gets closed. -} +hGetContentsStrict :: Handle -> IO String +hGetContentsStrict = hGetContents >=> \s -> length s `seq` return s + +{- A version of readFile that is not lazy. -} +readFileStrict :: FilePath -> IO String +readFileStrict = readFile >=> \s -> length s `seq` return s + +{- Reads a file strictly, and using the FileSystemEncoding, so it will + - never crash on a badly encoded file. -} +readFileStrictAnyEncoding :: FilePath -> IO String +readFileStrictAnyEncoding f = withFile f ReadMode $ \h -> do + fileEncoding h + hClose h `after` hGetContentsStrict h + +{- Writes a file, using the FileSystemEncoding so it will never crash + - on a badly encoded content string. -} +writeFileAnyEncoding :: FilePath -> String -> IO () +writeFileAnyEncoding f content = withFile f WriteMode $ \h -> do + fileEncoding h + hPutStr h content + +{- Like break, but the item matching the condition is not included + - in the second result list. + - + - separate (== ':') "foo:bar" = ("foo", "bar") + - separate (== ':') "foobar" = ("foobar", "") + -} +separate :: (a -> Bool) -> [a] -> ([a], [a]) +separate c l = unbreak $ break c l + where + unbreak r@(a, b) + | null b = r + | otherwise = (a, tail b) + +{- Breaks out the first line. -} +firstLine :: String -> String +firstLine = takeWhile (/= '\n') + +{- Splits a list into segments that are delimited by items matching + - a predicate. (The delimiters are not included in the segments.) + - Segments may be empty. -} +segment :: (a -> Bool) -> [a] -> [[a]] +segment p l = map reverse $ go [] [] l + where + go c r [] = reverse $ c:r + go c r (i:is) + | p i = go [] (c:r) is + | otherwise = go (i:c) r is + +prop_segment_regressionTest :: Bool +prop_segment_regressionTest = all id + -- Even an empty list is a segment. + [ segment (== "--") [] == [[]] + -- There are two segements in this list, even though the first is empty. + , segment (== "--") ["--", "foo", "bar"] == [[],["foo","bar"]] + ] + +{- Includes the delimiters as segments of their own. -} +segmentDelim :: (a -> Bool) -> [a] -> [[a]] +segmentDelim p l = map reverse $ go [] [] l + where + go c r [] = reverse $ c:r + go c r (i:is) + | p i = go [] ([i]:c:r) is + | otherwise = go (i:c) r is + +{- Replaces multiple values in a string. + - + - Takes care to skip over just-replaced values, so that they are not + - mangled. For example, massReplace [("foo", "new foo")] does not + - replace the "new foo" with "new new foo". + -} +massReplace :: [(String, String)] -> String -> String +massReplace vs = go [] vs + where + + go acc _ [] = concat $ reverse acc + go acc [] (c:cs) = go ([c]:acc) vs cs + go acc ((val, replacement):rest) s + | val `isPrefixOf` s = + go (replacement:acc) vs (drop (length val) s) + | otherwise = go acc rest s + +{- Wrapper around hGetBufSome that returns a String. + - + - The null string is returned on eof, otherwise returns whatever + - data is currently available to read from the handle, or waits for + - data to be written to it if none is currently available. + - + - Note on encodings: The normal encoding of the Handle is ignored; + - each byte is converted to a Char. Not unicode clean! + -} +hGetSomeString :: Handle -> Int -> IO String +hGetSomeString h sz = do + fp <- mallocForeignPtrBytes sz + len <- withForeignPtr fp $ \buf -> hGetBufSome h buf sz + map (chr . fromIntegral) <$> withForeignPtr fp (peekbytes len) + where + peekbytes :: Int -> Ptr Word8 -> IO [Word8] + peekbytes len buf = mapM (peekElemOff buf) [0..pred len] + +{- Reaps any zombie git processes. + - + - Warning: Not thread safe. Anything that was expecting to wait + - on a process and get back an exit status is going to be confused + - if this reap gets there first. -} +reapZombies :: IO () +#ifndef mingw32_HOST_OS +reapZombies = do + -- throws an exception when there are no child processes + catchDefaultIO Nothing (getAnyProcessStatus False True) + >>= maybe (return ()) (const reapZombies) + +#else +reapZombies = return () +#endif + +exitBool :: Bool -> IO a +exitBool False = exitFailure +exitBool True = exitSuccess diff --git a/Utility/Monad.hs b/Utility/Monad.hs new file mode 100644 index 000000000..eba3c4283 --- /dev/null +++ b/Utility/Monad.hs @@ -0,0 +1,69 @@ +{- monadic stuff + - + - Copyright 2010-2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Monad where + +import Data.Maybe +import Control.Monad + +{- Return the first value from a list, if any, satisfying the given + - predicate -} +firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a) +firstM _ [] = return Nothing +firstM p (x:xs) = ifM (p x) (return $ Just x , firstM p xs) + +{- Runs the action on values from the list until it succeeds, returning + - its result. -} +getM :: Monad m => (a -> m (Maybe b)) -> [a] -> m (Maybe b) +getM _ [] = return Nothing +getM p (x:xs) = maybe (getM p xs) (return . Just) =<< p x + +{- Returns true if any value in the list satisfies the predicate, + - stopping once one is found. -} +anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool +anyM p = liftM isJust . firstM p + +allM :: Monad m => (a -> m Bool) -> [a] -> m Bool +allM _ [] = return True +allM p (x:xs) = p x <&&> allM p xs + +{- Runs an action on values from a list until it succeeds. -} +untilTrue :: Monad m => [a] -> (a -> m Bool) -> m Bool +untilTrue = flip anyM + +{- if with a monadic conditional. -} +ifM :: Monad m => m Bool -> (m a, m a) -> m a +ifM cond (thenclause, elseclause) = do + c <- cond + if c then thenclause else elseclause + +{- short-circuiting monadic || -} +(<||>) :: Monad m => m Bool -> m Bool -> m Bool +ma <||> mb = ifM ma ( return True , mb ) + +{- short-circuiting monadic && -} +(<&&>) :: Monad m => m Bool -> m Bool -> m Bool +ma <&&> mb = ifM ma ( mb , return False ) + +{- Same fixity as && and || -} +infixr 3 <&&> +infixr 2 <||> + +{- Runs an action, passing its value to an observer before returning it. -} +observe :: Monad m => (a -> m b) -> m a -> m a +observe observer a = do + r <- a + _ <- observer r + return r + +{- b `after` a runs first a, then b, and returns the value of a -} +after :: Monad m => m b -> m a -> m a +after = observe . const + +{- do nothing -} +noop :: Monad m => m () +noop = return () diff --git a/Utility/Mounts.hsc b/Utility/Mounts.hsc new file mode 100644 index 000000000..b6defda43 --- /dev/null +++ b/Utility/Mounts.hsc @@ -0,0 +1,93 @@ +{- Interface to mtab (and fstab) + - + - Derived from hsshellscript, originally written by + - Volker Wysk + - + - Modified to support BSD, Mac OS X, and Android by + - Joey Hess + - + - Licensed under the GNU LGPL version 2.1 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.Mounts ( + Mntent(..), + getMounts +) where + +#ifndef __ANDROID__ +import Control.Monad +import Foreign +import Foreign.C +#include "libmounts.h" +#else +import Utility.Exception +import Data.Maybe +import Control.Applicative +#endif + +{- This is a stripped down mntent, containing only + - fields available everywhere. -} +data Mntent = Mntent + { mnt_fsname :: String + , mnt_dir :: FilePath + , mnt_type :: String + } deriving (Read, Show, Eq, Ord) + +#ifndef __ANDROID__ + +getMounts :: IO [Mntent] +getMounts = do + h <- c_mounts_start + when (h == nullPtr) $ + throwErrno "getMounts" + mntent <- getmntent h [] + _ <- c_mounts_end h + return mntent + + where + getmntent h c = do + ptr <- c_mounts_next h + if (ptr == nullPtr) + then return $ reverse c + else do + mnt_fsname_str <- #{peek struct mntent, mnt_fsname} ptr >>= peekCString + mnt_dir_str <- #{peek struct mntent, mnt_dir} ptr >>= peekCString + mnt_type_str <- #{peek struct mntent, mnt_type} ptr >>= peekCString + let ent = Mntent + { mnt_fsname = mnt_fsname_str + , mnt_dir = mnt_dir_str + , mnt_type = mnt_type_str + } + getmntent h (ent:c) + +{- Using unsafe imports because the C functions are belived to never block. + - Note that getmntinfo is called with MNT_NOWAIT to avoid possibly blocking; + - while getmntent only accesses a file in /etc (or /proc) that should not + - block. -} +foreign import ccall unsafe "libmounts.h mounts_start" c_mounts_start + :: IO (Ptr ()) +foreign import ccall unsafe "libmounts.h mounts_next" c_mounts_next + :: Ptr () -> IO (Ptr ()) +foreign import ccall unsafe "libmounts.h mounts_end" c_mounts_end + :: Ptr () -> IO CInt + +#else + +{- Android does not support getmntent (well, it's a no-op stub in Bionic). + - + - But, the linux kernel's /proc/mounts is available to be parsed. + -} +getMounts :: IO [Mntent] +getMounts = catchDefaultIO [] $ + mapMaybe (parse . words) . lines <$> readFile "/proc/mounts" + where + parse (device:mountpoint:fstype:_rest) = Just $ Mntent + { mnt_fsname = device + , mnt_dir = mountpoint + , mnt_type = fstype + } + parse _ = Nothing + +#endif diff --git a/Utility/Network.hs b/Utility/Network.hs new file mode 100644 index 000000000..9c6980261 --- /dev/null +++ b/Utility/Network.hs @@ -0,0 +1,21 @@ +{- network functions + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Network where + +import Utility.Process +import Utility.Exception + +import Control.Applicative + +{- Haskell lacks uname(2) bindings, except in the + - Bindings.Uname addon. Rather than depend on that, + - use uname -n when available. -} +getHostname :: IO (Maybe String) +getHostname = catchMaybeIO uname_node + where + uname_node = takeWhile (/= '\n') <$> readProcess "uname" ["-n"] diff --git a/Utility/NotificationBroadcaster.hs b/Utility/NotificationBroadcaster.hs new file mode 100644 index 000000000..8a6e09f92 --- /dev/null +++ b/Utility/NotificationBroadcaster.hs @@ -0,0 +1,96 @@ +{- notification broadcaster + - + - This is used to allow clients to block until there is a new notification + - that some thing occurred. It does not communicate what the change is, + - it only provides blocking reads to wait on notifications. + - + - Multiple clients are supported. Each has a unique id. + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.NotificationBroadcaster ( + NotificationBroadcaster, + NotificationHandle, + NotificationId, + newNotificationBroadcaster, + newNotificationHandle, + notificationHandleToId, + notificationHandleFromId, + sendNotification, + waitNotification, + checkNotification, +) where + +import Common + +import Control.Concurrent.STM + +{- One TMVar per client, which are empty when no notification is pending, + - and full when a notification has been sent but not yet seen by the + - client. The list TMVar is never empty, so never blocks. -} +type NotificationBroadcaster = TMVar [TMVar ()] + +newtype NotificationId = NotificationId Int + deriving (Read, Show, Eq, Ord) + +{- Handle given out to an individual client. -} +data NotificationHandle = NotificationHandle NotificationBroadcaster NotificationId + +newNotificationBroadcaster :: IO NotificationBroadcaster +newNotificationBroadcaster = atomically $ newTMVar [] + +{- Allocates a notification handle for a client to use. + - + - An immediate notification can be forced the first time waitNotification + - is called on the handle. This is useful in cases where a notification + - may be sent while the new handle is being constructed. Normally, + - such a notification would be missed. Forcing causes extra work, + - but ensures such notifications get seen. + -} +newNotificationHandle :: Bool -> NotificationBroadcaster -> IO NotificationHandle +newNotificationHandle force b = NotificationHandle + <$> pure b + <*> addclient + where + addclient = atomically $ do + s <- if force + then newTMVar () + else newEmptyTMVar + l <- takeTMVar b + putTMVar b $ l ++ [s] + return $ NotificationId $ length l + +{- Extracts the identifier from a notification handle. + - This can be used to eg, pass the identifier through to a WebApp. -} +notificationHandleToId :: NotificationHandle -> NotificationId +notificationHandleToId (NotificationHandle _ i) = i + +notificationHandleFromId :: NotificationBroadcaster -> NotificationId -> NotificationHandle +notificationHandleFromId = NotificationHandle + +{- Sends a notification to all clients. -} +sendNotification :: NotificationBroadcaster -> IO () +sendNotification b = do + l <- atomically $ readTMVar b + mapM_ notify l + where + notify s = atomically $ + whenM (isEmptyTMVar s) $ + putTMVar s () + +{- Used by a client to block until a new notification is available since + - the last time it tried. -} +waitNotification :: NotificationHandle -> IO () +waitNotification (NotificationHandle b (NotificationId i)) = do + l <- atomically $ readTMVar b + atomically $ takeTMVar (l !! i) + +{- Used by a client to check if there has been a new notification since the + - last time it checked, without blocking. -} +checkNotification :: NotificationHandle -> IO Bool +checkNotification (NotificationHandle b (NotificationId i)) = do + l <- atomically $ readTMVar b + maybe False (const True) <$> atomically (tryTakeTMVar (l !! i)) diff --git a/Utility/OSX.hs b/Utility/OSX.hs new file mode 100644 index 000000000..4c930f2f8 --- /dev/null +++ b/Utility/OSX.hs @@ -0,0 +1,44 @@ +{- OSX stuff + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.OSX where + +import Utility.UserInfo + +import System.FilePath + +autoStartBase :: String -> FilePath +autoStartBase label = "Library" "LaunchAgents" label ++ ".plist" + +systemAutoStart :: String -> FilePath +systemAutoStart label = "/" autoStartBase label + +userAutoStart :: String -> IO FilePath +userAutoStart label = do + home <- myHomeDir + return $ home autoStartBase label + +{- Generates an OSX autostart plist file with a given label, command, and + - params to run at boot or login. -} +genOSXAutoStartFile :: String -> String -> [String] -> String +genOSXAutoStartFile label command params = unlines + [ "" + , "" + , "" + , "" + , "Label" + , "" ++ label ++ "" + , "ProgramArguments" + , "" + , unlines $ map (\v -> "" ++ v ++ "") (command:params) + , "" + , "RunAtLoad" + , "" + , "" + , "" + ] + diff --git a/Utility/PID.hs b/Utility/PID.hs new file mode 100644 index 000000000..a70a4e2a4 --- /dev/null +++ b/Utility/PID.hs @@ -0,0 +1,31 @@ +{- process ids + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.PID where + +#ifndef mingw32_HOST_OS +import System.Posix.Types (ProcessID) +import System.Posix.Process (getProcessID) +#else +import System.Win32.Process (ProcessId) +import System.Win32.Process.Current (getCurrentProcessId) +#endif + +#ifndef mingw32_HOST_OS +type PID = ProcessID +#else +type PID = ProcessId +#endif + +getPID :: IO PID +#ifndef mingw32_HOST_OS +getPID = getProcessID +#else +getPID = getCurrentProcessId +#endif diff --git a/Utility/Parallel.hs b/Utility/Parallel.hs new file mode 100644 index 000000000..239c81e7b --- /dev/null +++ b/Utility/Parallel.hs @@ -0,0 +1,35 @@ +{- parallel processing via threads + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Parallel where + +import Common + +import Control.Concurrent +import Control.Exception + +{- Runs an action in parallel with a set of values, in a set of threads. + - In order for the actions to truely run in parallel, requires GHC's + - threaded runtime, + - + - Returns the values partitioned into ones with which the action succeeded, + - and ones with which it failed. -} +inParallel :: (v -> IO Bool) -> [v] -> IO ([v], [v]) +inParallel a l = do + mvars <- mapM thread l + statuses <- mapM takeMVar mvars + return $ reduce $ partition snd $ zip l statuses + where + reduce (x,y) = (map fst x, map fst y) + thread v = do + mvar <- newEmptyMVar + _ <- forkIO $ do + r <- try (a v) :: IO (Either SomeException Bool) + case r of + Left _ -> putMVar mvar False + Right b -> putMVar mvar b + return mvar diff --git a/Utility/PartialPrelude.hs b/Utility/PartialPrelude.hs new file mode 100644 index 000000000..6efa093fd --- /dev/null +++ b/Utility/PartialPrelude.hs @@ -0,0 +1,68 @@ +{- Parts of the Prelude are partial functions, which are a common source of + - bugs. + - + - This exports functions that conflict with the prelude, which avoids + - them being accidentially used. + -} + +module Utility.PartialPrelude where + +import qualified Data.Maybe + +{- read should be avoided, as it throws an error + - Instead, use: readish -} +read :: Read a => String -> a +read = Prelude.read + +{- head is a partial function; head [] is an error + - Instead, use: take 1 or headMaybe -} +head :: [a] -> a +head = Prelude.head + +{- tail is also partial + - Instead, use: drop 1 -} +tail :: [a] -> [a] +tail = Prelude.tail + +{- init too + - Instead, use: beginning -} +init :: [a] -> [a] +init = Prelude.init + +{- last too + - Instead, use: end or lastMaybe -} +last :: [a] -> a +last = Prelude.last + +{- Attempts to read a value from a String. + - + - Ignores leading/trailing whitespace, and throws away any trailing + - text after the part that can be read. + - + - readMaybe is available in Text.Read in new versions of GHC, + - but that one requires the entire string to be consumed. + -} +readish :: Read a => String -> Maybe a +readish s = case reads s of + ((x,_):_) -> Just x + _ -> Nothing + +{- Like head but Nothing on empty list. -} +headMaybe :: [a] -> Maybe a +headMaybe = Data.Maybe.listToMaybe + +{- Like last but Nothing on empty list. -} +lastMaybe :: [a] -> Maybe a +lastMaybe [] = Nothing +lastMaybe v = Just $ Prelude.last v + +{- All but the last element of a list. + - (Like init, but no error on an empty list.) -} +beginning :: [a] -> [a] +beginning [] = [] +beginning l = Prelude.init l + +{- Like last, but no error on an empty list. -} +end :: [a] -> [a] +end [] = [] +end l = [Prelude.last l] diff --git a/Utility/Path.hs b/Utility/Path.hs new file mode 100644 index 000000000..99c9438bf --- /dev/null +++ b/Utility/Path.hs @@ -0,0 +1,293 @@ +{- path manipulation + - + - Copyright 2010-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE PackageImports, CPP #-} + +module Utility.Path where + +import Data.String.Utils +import System.FilePath +import System.Directory +import Data.List +import Data.Maybe +import Data.Char +import Control.Applicative + +#ifdef mingw32_HOST_OS +import qualified System.FilePath.Posix as Posix +#else +import System.Posix.Files +#endif + +import qualified "MissingH" System.Path as MissingH +import Utility.Monad +import Utility.UserInfo + +{- Simplifies a path, removing any ".." or ".", and removing the trailing + - path separator. + - + - On Windows, preserves whichever style of path separator might be used in + - the input FilePaths. This is done because some programs in Windows + - demand a particular path separator -- and which one actually varies! + - + - This does not guarantee that two paths that refer to the same location, + - and are both relative to the same location (or both absolute) will + - yeild the same result. Run both through normalise from System.FilePath + - to ensure that. + -} +simplifyPath :: FilePath -> FilePath +simplifyPath path = dropTrailingPathSeparator $ + joinDrive drive $ joinPath $ norm [] $ splitPath path' + where + (drive, path') = splitDrive path + + norm c [] = reverse c + norm c (p:ps) + | p' == ".." = norm (drop 1 c) ps + | p' == "." = norm c ps + | otherwise = norm (p:c) ps + where + p' = dropTrailingPathSeparator p + +{- Makes a path absolute. + - + - The first parameter is a base directory (ie, the cwd) to use if the path + - is not already absolute. + - + - Does not attempt to deal with edge cases or ensure security with + - untrusted inputs. + -} +absPathFrom :: FilePath -> FilePath -> FilePath +absPathFrom dir path = simplifyPath (combine dir path) + +{- On Windows, this converts the paths to unix-style, in order to run + - MissingH's absNormPath on them. Resulting path will use / separators. -} +absNormPathUnix :: FilePath -> FilePath -> Maybe FilePath +#ifndef mingw32_HOST_OS +absNormPathUnix dir path = MissingH.absNormPath dir path +#else +absNormPathUnix dir path = todos <$> MissingH.absNormPath (fromdos dir) (fromdos path) + where + fromdos = replace "\\" "/" + todos = replace "/" "\\" +#endif + +{- Returns the parent directory of a path. + - + - To allow this to be easily used in loops, which terminate upon reaching the + - top, the parent of / is "" -} +parentDir :: FilePath -> FilePath +parentDir dir + | null dirs = "" + | otherwise = joinDrive drive (join s $ init dirs) + where + -- on Unix, the drive will be "/" when the dir is absolute, otherwise "" + (drive, path) = splitDrive dir + dirs = filter (not . null) $ split s path + s = [pathSeparator] + +prop_parentDir_basics :: FilePath -> Bool +prop_parentDir_basics dir + | null dir = True + | dir == "/" = parentDir dir == "" + | otherwise = p /= dir + where + p = parentDir dir + +{- Checks if the first FilePath is, or could be said to contain the second. + - For example, "foo/" contains "foo/bar". Also, "foo", "./foo", "foo/" etc + - are all equivilant. + -} +dirContains :: FilePath -> FilePath -> Bool +dirContains a b = a == b || a' == b' || (addTrailingPathSeparator a') `isPrefixOf` b' + where + a' = norm a + b' = norm b + norm = normalise . simplifyPath + +{- Converts a filename into an absolute path. + - + - Unlike Directory.canonicalizePath, this does not require the path + - already exists. -} +absPath :: FilePath -> IO FilePath +absPath file = do + cwd <- getCurrentDirectory + return $ absPathFrom cwd file + +{- Constructs a relative path from the CWD to a file. + - + - For example, assuming CWD is /tmp/foo/bar: + - relPathCwdToFile "/tmp/foo" == ".." + - relPathCwdToFile "/tmp/foo/bar" == "" + -} +relPathCwdToFile :: FilePath -> IO FilePath +relPathCwdToFile f = relPathDirToFile <$> getCurrentDirectory <*> absPath f + +{- Constructs a relative path from a directory to a file. + - + - Both must be absolute, and cannot contain .. etc. (eg use absPath first). + -} +relPathDirToFile :: FilePath -> FilePath -> FilePath +relPathDirToFile from to = join s $ dotdots ++ uncommon + where + s = [pathSeparator] + pfrom = split s from + pto = split s to + common = map fst $ takeWhile same $ zip pfrom pto + same (c,d) = c == d + uncommon = drop numcommon pto + dotdots = replicate (length pfrom - numcommon) ".." + numcommon = length common + +prop_relPathDirToFile_basics :: FilePath -> FilePath -> Bool +prop_relPathDirToFile_basics from to + | from == to = null r + | otherwise = not (null r) + where + r = relPathDirToFile from to + +prop_relPathDirToFile_regressionTest :: Bool +prop_relPathDirToFile_regressionTest = same_dir_shortcurcuits_at_difference + where + {- Two paths have the same directory component at the same + - location, but it's not really the same directory. + - Code used to get this wrong. -} + same_dir_shortcurcuits_at_difference = + relPathDirToFile (joinPath [pathSeparator : "tmp", "r", "lll", "xxx", "yyy", "18"]) + (joinPath [pathSeparator : "tmp", "r", ".git", "annex", "objects", "18", "gk", "SHA256-foo", "SHA256-foo"]) + == joinPath ["..", "..", "..", "..", ".git", "annex", "objects", "18", "gk", "SHA256-foo", "SHA256-foo"] + +{- Given an original list of paths, and an expanded list derived from it, + - generates a list of lists, where each sublist corresponds to one of the + - original paths. When the original path is a directory, any items + - in the expanded list that are contained in that directory will appear in + - its segment. + -} +segmentPaths :: [FilePath] -> [FilePath] -> [[FilePath]] +segmentPaths [] new = [new] +segmentPaths [_] new = [new] -- optimisation +segmentPaths (l:ls) new = [found] ++ segmentPaths ls rest + where + (found, rest)=partition (l `dirContains`) new + +{- This assumes that it's cheaper to call segmentPaths on the result, + - than it would be to run the action separately with each path. In + - the case of git file list commands, that assumption tends to hold. + -} +runSegmentPaths :: ([FilePath] -> IO [FilePath]) -> [FilePath] -> IO [[FilePath]] +runSegmentPaths a paths = segmentPaths paths <$> a paths + +{- Converts paths in the home directory to use ~/ -} +relHome :: FilePath -> IO String +relHome path = do + home <- myHomeDir + return $ if dirContains home path + then "~/" ++ relPathDirToFile home path + else path + +{- Checks if a command is available in PATH. + - + - The command may be fully-qualified, in which case, this succeeds as + - long as it exists. -} +inPath :: String -> IO Bool +inPath command = isJust <$> searchPath command + +{- Finds a command in PATH and returns the full path to it. + - + - The command may be fully qualified already, in which case it will + - be returned if it exists. + -} +searchPath :: String -> IO (Maybe FilePath) +searchPath command + | isAbsolute command = check command + | otherwise = getSearchPath >>= getM indir + where + indir d = check $ d command + check f = firstM doesFileExist +#ifdef mingw32_HOST_OS + [f, f ++ ".exe"] +#else + [f] +#endif + +{- Checks if a filename is a unix dotfile. All files inside dotdirs + - count as dotfiles. -} +dotfile :: FilePath -> Bool +dotfile file + | f == "." = False + | f == ".." = False + | f == "" = False + | otherwise = "." `isPrefixOf` f || dotfile (takeDirectory file) + where + f = takeFileName file + +{- Converts a DOS style path to a Cygwin style path. Only on Windows. + - Any trailing '\' is preserved as a trailing '/' -} +toCygPath :: FilePath -> FilePath +#ifndef mingw32_HOST_OS +toCygPath = id +#else +toCygPath p + | null drive = recombine parts + | otherwise = recombine $ "/cygdrive" : driveletter drive : parts + where + (drive, p') = splitDrive p + parts = splitDirectories p' + driveletter = map toLower . takeWhile (/= ':') + recombine = fixtrailing . Posix.joinPath + fixtrailing s + | hasTrailingPathSeparator p = Posix.addTrailingPathSeparator s + | otherwise = s +#endif + +{- Maximum size to use for a file in a specified directory. + - + - Many systems have a 255 byte limit to the name of a file, + - so that's taken as the max if the system has a larger limit, or has no + - limit. + -} +fileNameLengthLimit :: FilePath -> IO Int +#ifdef mingw32_HOST_OS +fileNameLengthLimit _ = return 255 +#else +fileNameLengthLimit dir = do + l <- fromIntegral <$> getPathVar dir FileNameLimit + if l <= 0 + then return 255 + else return $ minimum [l, 255] + where +#endif + +{- Given a string that we'd like to use as the basis for FilePath, but that + - was provided by a third party and is not to be trusted, returns the closest + - sane FilePath. + - + - All spaces and punctuation and other wacky stuff are replaced + - with '_', except for '.' "../" will thus turn into ".._", which is safe. + -} +sanitizeFilePath :: String -> FilePath +sanitizeFilePath = map sanitize + where + sanitize c + | c == '.' = c + | isSpace c || isPunctuation c || isSymbol c || isControl c || c == '/' = '_' + | otherwise = c + +{- Similar to splitExtensions, but knows that some things in FilePaths + - after a dot are too long to be extensions. -} +splitShortExtensions :: FilePath -> (FilePath, [String]) +splitShortExtensions = splitShortExtensions' 5 -- enough for ".jpeg" +splitShortExtensions' :: Int -> FilePath -> (FilePath, [String]) +splitShortExtensions' maxextension = go [] + where + go c f + | len > 0 && len <= maxextension && not (null base) = + go (ext:c) base + | otherwise = (f, c) + where + (base, ext) = splitExtension f + len = length ext diff --git a/Utility/Percentage.hs b/Utility/Percentage.hs new file mode 100644 index 000000000..f2fb45762 --- /dev/null +++ b/Utility/Percentage.hs @@ -0,0 +1,33 @@ +{- percentages + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Percentage ( + Percentage, + percentage, + showPercentage +) where + +import Data.Ratio + +import Utility.HumanNumber + +newtype Percentage = Percentage (Ratio Integer) + +instance Show Percentage where + show = showPercentage 0 + +{- Normally the big number comes first. But 110% is allowed if desired. :) -} +percentage :: Integer -> Integer -> Percentage +percentage 0 _ = Percentage 0 +percentage full have = Percentage $ have * 100 % full + +{- Pretty-print a Percentage, with a specified level of precision. -} +showPercentage :: Int -> Percentage -> String +showPercentage precision (Percentage p) = v ++ "%" + where + v = showImprecise precision n + n = fromRational p :: Double diff --git a/Utility/PosixFiles.hs b/Utility/PosixFiles.hs new file mode 100644 index 000000000..5abbb5785 --- /dev/null +++ b/Utility/PosixFiles.hs @@ -0,0 +1,33 @@ +{- POSIX files (and compatablity wrappers). + - + - This is like System.PosixCompat.Files, except with a fixed rename. + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.PosixFiles ( + module X, + rename +) where + +import System.PosixCompat.Files as X hiding (rename) + +#ifndef mingw32_HOST_OS +import System.Posix.Files (rename) +#else +import qualified System.Win32.File as Win32 +#endif + +{- System.PosixCompat.Files.rename on Windows calls renameFile, + - so cannot rename directories. + - + - Instead, use Win32 moveFile, which can. It needs to be told to overwrite + - any existing file. -} +#ifdef mingw32_HOST_OS +rename :: FilePath -> FilePath -> IO () +rename src dest = Win32.moveFileEx src dest Win32.mOVEFILE_REPLACE_EXISTING +#endif diff --git a/Utility/Process.hs b/Utility/Process.hs new file mode 100644 index 000000000..1f722af81 --- /dev/null +++ b/Utility/Process.hs @@ -0,0 +1,353 @@ +{- System.Process enhancements, including additional ways of running + - processes, and logging. + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP, Rank2Types #-} + +module Utility.Process ( + module X, + CreateProcess(..), + StdHandle(..), + readProcess, + readProcessEnv, + writeReadProcessEnv, + forceSuccessProcess, + checkSuccessProcess, + ignoreFailureProcess, + createProcessSuccess, + createProcessChecked, + createBackgroundProcess, + processTranscript, + processTranscript', + withHandle, + withBothHandles, + withQuietOutput, + createProcess, + startInteractiveProcess, + stdinHandle, + stdoutHandle, + stderrHandle, + processHandle, + devNull, +) where + +import qualified System.Process +import System.Process as X hiding (CreateProcess(..), createProcess, runInteractiveProcess, readProcess, readProcessWithExitCode, system, rawSystem, runInteractiveCommand, runProcess) +import System.Process hiding (createProcess, readProcess) +import System.Exit +import System.IO +import System.Log.Logger +import Control.Concurrent +import qualified Control.Exception as E +import Control.Monad +#ifndef mingw32_HOST_OS +import System.Posix.IO +#else +import Control.Applicative +#endif +import Data.Maybe + +import Utility.Misc +import Utility.Exception + +type CreateProcessRunner = forall a. CreateProcess -> ((Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> IO a) -> IO a + +data StdHandle = StdinHandle | StdoutHandle | StderrHandle + deriving (Eq) + +{- Normally, when reading from a process, it does not need to be fed any + - standard input. -} +readProcess :: FilePath -> [String] -> IO String +readProcess cmd args = readProcessEnv cmd args Nothing + +readProcessEnv :: FilePath -> [String] -> Maybe [(String, String)] -> IO String +readProcessEnv cmd args environ = + withHandle StdoutHandle createProcessSuccess p $ \h -> do + output <- hGetContentsStrict h + hClose h + return output + where + p = (proc cmd args) + { std_out = CreatePipe + , env = environ + } + +{- Runs an action to write to a process on its stdin, + - returns its output, and also allows specifying the environment. + -} +writeReadProcessEnv + :: FilePath + -> [String] + -> Maybe [(String, String)] + -> (Maybe (Handle -> IO ())) + -> (Maybe (Handle -> IO ())) + -> IO String +writeReadProcessEnv cmd args environ writestdin adjusthandle = do + (Just inh, Just outh, _, pid) <- createProcess p + + maybe (return ()) (\a -> a inh) adjusthandle + maybe (return ()) (\a -> a outh) adjusthandle + + -- fork off a thread to start consuming the output + output <- hGetContents outh + outMVar <- newEmptyMVar + _ <- forkIO $ E.evaluate (length output) >> putMVar outMVar () + + -- now write and flush any input + maybe (return ()) (\a -> a inh >> hFlush inh) writestdin + hClose inh -- done with stdin + + -- wait on the output + takeMVar outMVar + hClose outh + + -- wait on the process + forceSuccessProcess p pid + + return output + + where + p = (proc cmd args) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + , env = environ + } + +{- Waits for a ProcessHandle, and throws an IOError if the process + - did not exit successfully. -} +forceSuccessProcess :: CreateProcess -> ProcessHandle -> IO () +forceSuccessProcess p pid = do + code <- waitForProcess pid + case code of + ExitSuccess -> return () + ExitFailure n -> fail $ showCmd p ++ " exited " ++ show n + +{- Waits for a ProcessHandle and returns True if it exited successfully. + - Note that using this with createProcessChecked will throw away + - the Bool, and is only useful to ignore the exit code of a process, + - while still waiting for it. -} +checkSuccessProcess :: ProcessHandle -> IO Bool +checkSuccessProcess pid = do + code <- waitForProcess pid + return $ code == ExitSuccess + +ignoreFailureProcess :: ProcessHandle -> IO Bool +ignoreFailureProcess pid = do + void $ waitForProcess pid + return True + +{- Runs createProcess, then an action on its handles, and then + - forceSuccessProcess. -} +createProcessSuccess :: CreateProcessRunner +createProcessSuccess p a = createProcessChecked (forceSuccessProcess p) p a + +{- Runs createProcess, then an action on its handles, and then + - a checker action on its exit code, which must wait for the process. -} +createProcessChecked :: (ProcessHandle -> IO b) -> CreateProcessRunner +createProcessChecked checker p a = do + t@(_, _, _, pid) <- createProcess p + r <- tryNonAsync $ a t + _ <- checker pid + either E.throw return r + +{- Leaves the process running, suitable for lazy streaming. + - Note: Zombies will result, and must be waited on. -} +createBackgroundProcess :: CreateProcessRunner +createBackgroundProcess p a = a =<< createProcess p + +{- Runs a process, optionally feeding it some input, and + - returns a transcript combining its stdout and stderr, and + - whether it succeeded or failed. -} +processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool) +processTranscript cmd opts input = processTranscript' cmd opts Nothing input + +processTranscript' :: String -> [String] -> Maybe [(String, String)] -> (Maybe String) -> IO (String, Bool) +processTranscript' cmd opts environ input = do +#ifndef mingw32_HOST_OS +{- This implementation interleves stdout and stderr in exactly the order + - the process writes them. -} + (readf, writef) <- createPipe + readh <- fdToHandle readf + writeh <- fdToHandle writef + p@(_, _, _, pid) <- createProcess $ + (proc cmd opts) + { std_in = if isJust input then CreatePipe else Inherit + , std_out = UseHandle writeh + , std_err = UseHandle writeh + , env = environ + } + hClose writeh + + get <- mkreader readh + writeinput input p + transcript <- get + + ok <- checkSuccessProcess pid + return (transcript, ok) +#else +{- This implementation for Windows puts stderr after stdout. -} + p@(_, _, _, pid) <- createProcess $ + (proc cmd opts) + { std_in = if isJust input then CreatePipe else Inherit + , std_out = CreatePipe + , std_err = CreatePipe + , env = environ + } + + getout <- mkreader (stdoutHandle p) + geterr <- mkreader (stderrHandle p) + writeinput input p + transcript <- (++) <$> getout <*> geterr + + ok <- checkSuccessProcess pid + return (transcript, ok) +#endif + where + mkreader h = do + s <- hGetContents h + v <- newEmptyMVar + void $ forkIO $ do + void $ E.evaluate (length s) + putMVar v () + return $ do + takeMVar v + return s + + writeinput (Just s) p = do + let inh = stdinHandle p + unless (null s) $ do + hPutStr inh s + hFlush inh + hClose inh + writeinput Nothing _ = return () + +{- Runs a CreateProcessRunner, on a CreateProcess structure, that + - is adjusted to pipe only from/to a single StdHandle, and passes + - the resulting Handle to an action. -} +withHandle + :: StdHandle + -> CreateProcessRunner + -> CreateProcess + -> (Handle -> IO a) + -> IO a +withHandle h creator p a = creator p' $ a . select + where + base = p + { std_in = Inherit + , std_out = Inherit + , std_err = Inherit + } + (select, p') + | h == StdinHandle = + (stdinHandle, base { std_in = CreatePipe }) + | h == StdoutHandle = + (stdoutHandle, base { std_out = CreatePipe }) + | h == StderrHandle = + (stderrHandle, base { std_err = CreatePipe }) + +{- Like withHandle, but passes (stdin, stdout) handles to the action. -} +withBothHandles + :: CreateProcessRunner + -> CreateProcess + -> ((Handle, Handle) -> IO a) + -> IO a +withBothHandles creator p a = creator p' $ a . bothHandles + where + p' = p + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + +{- Forces the CreateProcessRunner to run quietly; + - both stdout and stderr are discarded. -} +withQuietOutput + :: CreateProcessRunner + -> CreateProcess + -> IO () +withQuietOutput creator p = withFile devNull WriteMode $ \nullh -> do + let p' = p + { std_out = UseHandle nullh + , std_err = UseHandle nullh + } + creator p' $ const $ return () + +devNull :: FilePath +#ifndef mingw32_HOST_OS +devNull = "/dev/null" +#else +devNull = "NUL" +#endif + +{- Extract a desired handle from createProcess's tuple. + - These partial functions are safe as long as createProcess is run + - with appropriate parameters to set up the desired handle. + - Get it wrong and the runtime crash will always happen, so should be + - easily noticed. -} +type HandleExtractor = (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> Handle +stdinHandle :: HandleExtractor +stdinHandle (Just h, _, _, _) = h +stdinHandle _ = error "expected stdinHandle" +stdoutHandle :: HandleExtractor +stdoutHandle (_, Just h, _, _) = h +stdoutHandle _ = error "expected stdoutHandle" +stderrHandle :: HandleExtractor +stderrHandle (_, _, Just h, _) = h +stderrHandle _ = error "expected stderrHandle" +bothHandles :: (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> (Handle, Handle) +bothHandles (Just hin, Just hout, _, _) = (hin, hout) +bothHandles _ = error "expected bothHandles" + +processHandle :: (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> ProcessHandle +processHandle (_, _, _, pid) = pid + +{- Debugging trace for a CreateProcess. -} +debugProcess :: CreateProcess -> IO () +debugProcess p = do + debugM "Utility.Process" $ unwords + [ action ++ ":" + , showCmd p + ] + where + action + | piped (std_in p) && piped (std_out p) = "chat" + | piped (std_in p) = "feed" + | piped (std_out p) = "read" + | otherwise = "call" + piped Inherit = False + piped _ = True + +{- Shows the command that a CreateProcess will run. -} +showCmd :: CreateProcess -> String +showCmd = go . cmdspec + where + go (ShellCommand s) = s + go (RawCommand c ps) = c ++ " " ++ show ps + +{- Starts an interactive process. Unlike runInteractiveProcess in + - System.Process, stderr is inherited. -} +startInteractiveProcess + :: FilePath + -> [String] + -> Maybe [(String, String)] + -> IO (ProcessHandle, Handle, Handle) +startInteractiveProcess cmd args environ = do + let p = (proc cmd args) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + , env = environ + } + (Just from, Just to, _, pid) <- createProcess p + return (pid, to, from) + +{- Wrapper around System.Process function that does debug logging. -} +createProcess :: CreateProcess -> IO (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) +createProcess p = do + debugProcess p + System.Process.createProcess p diff --git a/Utility/QuickCheck.hs b/Utility/QuickCheck.hs new file mode 100644 index 000000000..a498ee619 --- /dev/null +++ b/Utility/QuickCheck.hs @@ -0,0 +1,52 @@ +{- QuickCheck with additional instances + - + - Copyright 2012-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE TypeSynonymInstances #-} + +module Utility.QuickCheck + ( module X + , module Utility.QuickCheck + ) where + +import Test.QuickCheck as X +import Data.Time.Clock.POSIX +import System.Posix.Types +import qualified Data.Map as M +import qualified Data.Set as S +import Control.Applicative + +instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (M.Map k v) where + arbitrary = M.fromList <$> arbitrary + +instance (Arbitrary v, Eq v, Ord v) => Arbitrary (S.Set v) where + arbitrary = S.fromList <$> arbitrary + +{- Times before the epoch are excluded. -} +instance Arbitrary POSIXTime where + arbitrary = fromInteger <$> nonNegative arbitrarySizedIntegral + +instance Arbitrary EpochTime where + arbitrary = fromInteger <$> nonNegative arbitrarySizedIntegral + +{- Pids are never negative, or 0. -} +instance Arbitrary ProcessID where + arbitrary = arbitrarySizedBoundedIntegral `suchThat` (> 0) + +{- Inodes are never negative. -} +instance Arbitrary FileID where + arbitrary = nonNegative arbitrarySizedIntegral + +{- File sizes are never negative. -} +instance Arbitrary FileOffset where + arbitrary = nonNegative arbitrarySizedIntegral + +nonNegative :: (Num a, Ord a) => Gen a -> Gen a +nonNegative g = g `suchThat` (>= 0) + +positive :: (Num a, Ord a) => Gen a -> Gen a +positive g = g `suchThat` (> 0) diff --git a/Utility/Quvi.hs b/Utility/Quvi.hs new file mode 100644 index 000000000..228ff7809 --- /dev/null +++ b/Utility/Quvi.hs @@ -0,0 +1,148 @@ +{- querying quvi (import qualified) + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Utility.Quvi where + +import Common +import Utility.Url + +import Data.Aeson +import Data.ByteString.Lazy.UTF8 (fromString) +import qualified Data.Map as M +import Network.URI (uriAuthority, uriRegName) +import Data.Char + +data QuviVersion + = Quvi04 + | Quvi09 + | NoQuvi + +data Page = Page + { pageTitle :: String + , pageLinks :: [Link] + } deriving (Show) + +data Link = Link + { linkSuffix :: String + , linkUrl :: URLString + } deriving (Show) + +{- JSON instances for quvi 0.4. -} +instance FromJSON Page where + parseJSON (Object v) = Page + <$> v .: "page_title" + <*> v .: "link" + parseJSON _ = mzero + +instance FromJSON Link where + parseJSON (Object v) = Link + <$> v .: "file_suffix" + <*> v .: "url" + parseJSON _ = mzero + +{- "enum" format used by quvi 0.9 -} +parseEnum :: String -> Maybe Page +parseEnum s = Page + <$> get "QUVI_MEDIA_PROPERTY_TITLE" + <*> ((:[]) <$> + ( Link + <$> get "QUVI_MEDIA_STREAM_PROPERTY_CONTAINER" + <*> get "QUVI_MEDIA_STREAM_PROPERTY_URL" + ) + ) + where + get = flip M.lookup m + m = M.fromList $ map (separate (== '=')) $ lines s + +probeVersion :: IO QuviVersion +probeVersion = examine <$> processTranscript "quvi" ["--version"] Nothing + where + examine (s, True) + | "quvi v0.4" `isInfixOf` s = Quvi04 + | otherwise = Quvi09 + examine _ = NoQuvi + +type Query a = QuviVersion -> [CommandParam] -> URLString -> IO a + +{- Throws an error when quvi is not installed. -} +forceQuery :: Query (Maybe Page) +forceQuery v ps url = query' v ps url `catchNonAsync` onerr + where + onerr _ = ifM (inPath "quvi") + ( error "quvi failed" + , error "quvi is not installed" + ) + +{- Returns Nothing if the page is not a video page, or quvi is not + - installed. -} +query :: Query (Maybe Page) +query v ps url = flip catchNonAsync (const $ return Nothing) (query' v ps url) + +query' :: Query (Maybe Page) +query' Quvi09 ps url = parseEnum + <$> readProcess "quvi" (toCommand $ [Param "dump", Param "-p", Param "enum"] ++ ps ++ [Param url]) +query' Quvi04 ps url = decode . fromString + <$> readProcess "quvi" (toCommand $ ps ++ [Param url]) +query' NoQuvi _ _ = return Nothing + +queryLinks :: Query [URLString] +queryLinks v ps url = maybe [] (map linkUrl . pageLinks) <$> query v ps url + +{- Checks if quvi can still find a download link for an url. + - If quvi is not installed, returns False. -} +check :: Query Bool +check v ps url = maybe False (not . null . pageLinks) <$> query v ps url + +{- Checks if an url is supported by quvi, as quickly as possible + - (without hitting it if possible), and without outputting + - anything. Also returns False if quvi is not installed. -} +supported :: QuviVersion -> URLString -> IO Bool +supported NoQuvi _ = return False +supported Quvi04 url = boolSystem "quvi" + [ Params "--verbosity mute --support" + , Param url + ] +{- Use quvi-info to see if the url's domain is supported. + - If so, have to do a online verification of the url. -} +supported Quvi09 url = (firstlevel <&&> secondlevel) + `catchNonAsync` (\_ -> return False) + where + firstlevel = case uriAuthority =<< parseURIRelaxed url of + Nothing -> return False + Just auth -> do + let domain = map toLower $ uriRegName auth + let basedomain = intercalate "." $ reverse $ take 2 $ reverse $ split "." domain + any (\h -> domain `isSuffixOf` h || basedomain `isSuffixOf` h) + . map (map toLower) <$> listdomains Quvi09 + secondlevel = snd <$> processTranscript "quvi" + (toCommand [Param "dump", Param "-o", Param url]) Nothing + +listdomains :: QuviVersion -> IO [String] +listdomains Quvi09 = concatMap (split ",") + . concatMap (drop 1 . words) + . filter ("domains: " `isPrefixOf`) . lines + <$> readProcess "quvi" + (toCommand [Param "info", Param "-p", Param "domains"]) +listdomains _ = return [] + +type QuviParam = QuviVersion -> CommandParam + +{- Disables progress, but not information output. -} +quiet :: QuviParam +-- Cannot use quiet as it now disables informational output. +-- No way to disable progress. +quiet Quvi09 = Params "--verbosity verbose" +quiet Quvi04 = Params "--verbosity quiet" +quiet NoQuvi = Params "" + +{- Only return http results, not streaming protocols. -} +httponly :: QuviParam +-- No way to do it with 0.9? +httponly Quvi04 = Params "-c http" +httponly _ = Params "" -- No way to do it with 0.9? diff --git a/Utility/Rsync.hs b/Utility/Rsync.hs new file mode 100644 index 000000000..60381264e --- /dev/null +++ b/Utility/Rsync.hs @@ -0,0 +1,156 @@ +{- various rsync stuff + - + - Copyright 2010-2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Rsync where + +import Common +import Utility.Metered + +import Data.Char +import System.Console.GetOpt +import Data.Tuple.Utils + +{- Generates parameters to make rsync use a specified command as its remote + - shell. -} +rsyncShell :: [CommandParam] -> [CommandParam] +rsyncShell command = [Param "-e", Param $ unwords $ map escape (toCommand command)] + where + {- rsync requires some weird, non-shell like quoting in + - here. A doubled single quote inside the single quoted + - string is a single quote. -} + escape s = "'" ++ intercalate "''" (split "'" s) ++ "'" + +{- Runs rsync in server mode to send a file. -} +rsyncServerSend :: [CommandParam] -> FilePath -> IO Bool +rsyncServerSend options file = rsync $ + rsyncServerParams ++ Param "--sender" : options ++ [File file] + +{- Runs rsync in server mode to receive a file. -} +rsyncServerReceive :: [CommandParam] -> FilePath -> IO Bool +rsyncServerReceive options file = rsync $ + rsyncServerParams ++ options ++ [File file] + +rsyncServerParams :: [CommandParam] +rsyncServerParams = + [ Param "--server" + -- preserve timestamps + , Param "-t" + -- allow resuming of transfers of big files + , Param "--inplace" + -- other options rsync normally uses in server mode + , Params "-e.Lsf ." + ] + +rsyncUseDestinationPermissions :: CommandParam +rsyncUseDestinationPermissions = Param "--chmod=ugo=rwX" + +rsync :: [CommandParam] -> IO Bool +rsync = boolSystem "rsync" . rsyncParamsFixup + +{- On Windows, rsync is from Cygwin, and expects to get Cygwin formatted + - paths to files. (It thinks that C:foo refers to a host named "C"). + - Fix up all Files in the Params appropriately. -} +rsyncParamsFixup :: [CommandParam] -> [CommandParam] +rsyncParamsFixup = map fixup + where + fixup (File f) = File (toCygPath f) + fixup p = p + +{- Runs rsync, but intercepts its progress output and updates a meter. + - The progress output is also output to stdout. + - + - The params must enable rsync's --progress mode for this to work. + -} +rsyncProgress :: MeterUpdate -> [CommandParam] -> IO Bool +rsyncProgress meterupdate params = do + r <- catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p (feedprogress 0 []) + {- For an unknown reason, piping rsync's output like this does + - causes it to run a second ssh process, which it neglects to wait + - on. Reap the resulting zombie. -} + reapZombies + return r + where + p = proc "rsync" (toCommand $ rsyncParamsFixup params) + feedprogress prev buf h = do + s <- hGetSomeString h 80 + if null s + then return True + else do + putStr s + hFlush stdout + let (mbytes, buf') = parseRsyncProgress (buf++s) + case mbytes of + Nothing -> feedprogress prev buf' h + (Just bytes) -> do + when (bytes /= prev) $ + meterupdate $ toBytesProcessed bytes + feedprogress bytes buf' h + +{- Checks if an rsync url involves the remote shell (ssh or rsh). + - Use of such urls with rsync requires additional shell + - escaping. -} +rsyncUrlIsShell :: String -> Bool +rsyncUrlIsShell s + | "rsync://" `isPrefixOf` s = False + | otherwise = go s + where + -- host::dir is rsync protocol, while host:dir is ssh/rsh + go [] = False + go (c:cs) + | c == '/' = False -- got to directory with no colon + | c == ':' = not $ ":" `isPrefixOf` cs + | otherwise = go cs + +{- Checks if a rsync url is really just a local path. -} +rsyncUrlIsPath :: String -> Bool +rsyncUrlIsPath s + | rsyncUrlIsShell s = False + | otherwise = ':' `notElem` s + +{- Parses the String looking for rsync progress output, and returns + - Maybe the number of bytes rsynced so far, and any any remainder of the + - string that could be an incomplete progress output. That remainder + - should be prepended to future output, and fed back in. This interface + - allows the output to be read in any desired size chunk, or even one + - character at a time. + - + - Strategy: Look for chunks prefixed with \r (rsync writes a \r before + - the first progress output, and each thereafter). The first number + - after the \r is the number of bytes processed. After the number, + - there must appear some whitespace, or we didn't get the whole number, + - and return the \r and part we did get, for later processing. + - + - In some locales, the number will have one or more commas in the middle + - of it. + -} +parseRsyncProgress :: String -> (Maybe Integer, String) +parseRsyncProgress = go [] . reverse . progresschunks + where + go remainder [] = (Nothing, remainder) + go remainder (x:xs) = case parsebytes (findbytesstart x) of + Nothing -> go (delim:x++remainder) xs + Just b -> (Just b, remainder) + + delim = '\r' + {- Find chunks that each start with delim. + - The first chunk doesn't start with it + - (it's empty when delim is at the start of the string). -} + progresschunks = drop 1 . split [delim] + findbytesstart s = dropWhile isSpace s + parsebytes s = case break isSpace s of + ([], _) -> Nothing + (_, []) -> Nothing + (b, _) -> readish $ filter (/= ',') b + +{- Filters options to those that are safe to pass to rsync in server mode, + - without causing it to eg, expose files. -} +filterRsyncSafeOptions :: [String] -> [String] +filterRsyncSafeOptions = fst3 . getOpt Permute + [ Option [] ["bwlimit"] (reqArgLong "bwlimit") "" ] + where + reqArgLong x = ReqArg (\v -> "--" ++ x ++ "=" ++ v) "" diff --git a/Utility/SRV.hs b/Utility/SRV.hs new file mode 100644 index 000000000..f1671758e --- /dev/null +++ b/Utility/SRV.hs @@ -0,0 +1,112 @@ +{- SRV record lookup + - + - Uses either the ADNS Haskell library, or the standalone Haskell DNS + - package, or the host command. + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.SRV ( + mkSRVTcp, + mkSRV, + lookupSRV, + lookupSRVHost, + HostPort, +) where + +import Utility.Process +import Utility.Exception +import Utility.PartialPrelude + +import Network +import Data.Function +import Data.List +import Control.Applicative +import Data.Maybe + +#ifdef WITH_ADNS +import ADNS.Resolver +import Data.Either +#else +#ifdef WITH_DNS +import qualified Network.DNS.Lookup as DNS +import Network.DNS.Resolver +import qualified Data.ByteString.UTF8 as B8 +#endif +#endif + +newtype SRV = SRV String + deriving (Show, Eq) + +type HostPort = (HostName, PortID) + +type PriorityWeight = (Int, Int) -- sort by priority first, then weight + +mkSRV :: String -> String -> HostName -> SRV +mkSRV transport protocol host = SRV $ concat + ["_", protocol, "._", transport, ".", host] + +mkSRVTcp :: String -> HostName -> SRV +mkSRVTcp = mkSRV "tcp" + +{- Returns an ordered list, with highest priority hosts first. + - + - On error, returns an empty list. -} +lookupSRV :: SRV -> IO [HostPort] +#ifdef WITH_ADNS +lookupSRV (SRV srv) = initResolver [] $ \resolver -> do + r <- catchDefaultIO (Right []) $ + resolveSRV resolver srv + return $ either (\_ -> []) id r +#else +#ifdef WITH_DNS +lookupSRV (SRV srv) = do + seed <- makeResolvSeed defaultResolvConf + r <- withResolver seed $ flip DNS.lookupSRV $ B8.fromString srv + return $ +#if MIN_VERSION_dns(1,0,0) + either (const []) use r +#else + maybe [] use r +#endif + where + use = orderHosts . map tohosts + tohosts (priority, weight, port, hostname) = + ( (priority, weight) + , (B8.toString hostname, PortNumber $ fromIntegral port) + ) +#else +lookupSRV = lookupSRVHost +#endif +#endif + +lookupSRVHost :: SRV -> IO [HostPort] +lookupSRVHost (SRV srv) = catchDefaultIO [] $ + parseSrvHost <$> readProcessEnv "host" ["-t", "SRV", "--", srv] + -- clear environment, to avoid LANG affecting output + (Just []) + +parseSrvHost :: String -> [HostPort] +parseSrvHost = orderHosts . catMaybes . map parse . lines + where + parse l = case words l of + [_, _, _, _, spriority, sweight, sport, hostname] -> do + let v = + ( readish sport :: Maybe Int + , readish spriority :: Maybe Int + , readish sweight :: Maybe Int + ) + case v of + (Just port, Just priority, Just weight) -> Just + ( (priority, weight) + , (hostname, PortNumber $ fromIntegral port) + ) + _ -> Nothing + _ -> Nothing + +orderHosts :: [(PriorityWeight, HostPort)] -> [HostPort] +orderHosts = map snd . sortBy (compare `on` fst) diff --git a/Utility/SafeCommand.hs b/Utility/SafeCommand.hs new file mode 100644 index 000000000..86e60db0e --- /dev/null +++ b/Utility/SafeCommand.hs @@ -0,0 +1,119 @@ +{- safely running shell commands + - + - Copyright 2010-2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.SafeCommand where + +import System.Exit +import Utility.Process +import Data.String.Utils +import Control.Applicative +import System.FilePath +import Data.Char + +{- A type for parameters passed to a shell command. A command can + - be passed either some Params (multiple parameters can be included, + - whitespace-separated, or a single Param (for when parameters contain + - whitespace), or a File. + -} +data CommandParam = Params String | Param String | File FilePath + deriving (Eq, Show, Ord) + +{- Used to pass a list of CommandParams to a function that runs + - a command and expects Strings. -} +toCommand :: [CommandParam] -> [String] +toCommand = concatMap unwrap + where + unwrap (Param s) = [s] + unwrap (Params s) = filter (not . null) (split " " s) + -- Files that start with a non-alphanumeric that is not a path + -- separator are modified to avoid the command interpreting them as + -- options or other special constructs. + unwrap (File s@(h:_)) + | isAlphaNum h || h `elem` pathseps = [s] + | otherwise = ["./" ++ s] + unwrap (File s) = [s] + -- '/' is explicitly included because it's an alternative + -- path separator on Windows. + pathseps = pathSeparator:"./" + +{- Run a system command, and returns True or False + - if it succeeded or failed. + -} +boolSystem :: FilePath -> [CommandParam] -> IO Bool +boolSystem command params = boolSystemEnv command params Nothing + +boolSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO Bool +boolSystemEnv command params environ = dispatch <$> safeSystemEnv command params environ + where + dispatch ExitSuccess = True + dispatch _ = False + +{- Runs a system command, returning the exit status. -} +safeSystem :: FilePath -> [CommandParam] -> IO ExitCode +safeSystem command params = safeSystemEnv command params Nothing + +safeSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO ExitCode +safeSystemEnv command params environ = do + (_, _, _, pid) <- createProcess (proc command $ toCommand params) + { env = environ } + waitForProcess pid + +{- Wraps a shell command line inside sh -c, allowing it to be run in a + - login shell that may not support POSIX shell, eg csh. -} +shellWrap :: String -> String +shellWrap cmdline = "sh -c " ++ shellEscape cmdline + +{- Escapes a filename or other parameter to be safely able to be exposed to + - the shell. + - + - This method works for POSIX shells, as well as other shells like csh. + -} +shellEscape :: String -> String +shellEscape f = "'" ++ escaped ++ "'" + where + -- replace ' with '"'"' + escaped = join "'\"'\"'" $ split "'" f + +{- Unescapes a set of shellEscaped words or filenames. -} +shellUnEscape :: String -> [String] +shellUnEscape [] = [] +shellUnEscape s = word : shellUnEscape rest + where + (word, rest) = findword "" s + findword w [] = (w, "") + findword w (c:cs) + | c == ' ' = (w, cs) + | c == '\'' = inquote c w cs + | c == '"' = inquote c w cs + | otherwise = findword (w++[c]) cs + inquote _ w [] = (w, "") + inquote q w (c:cs) + | c == q = findword w cs + | otherwise = inquote q (w++[c]) cs + +{- For quickcheck. -} +prop_idempotent_shellEscape :: String -> Bool +prop_idempotent_shellEscape s = [s] == (shellUnEscape . shellEscape) s +prop_idempotent_shellEscape_multiword :: [String] -> Bool +prop_idempotent_shellEscape_multiword s = s == (shellUnEscape . unwords . map shellEscape) s + +{- Segements a list of filenames into groups that are all below the manximum + - command-line length limit. Does not preserve order. -} +segmentXargs :: [FilePath] -> [[FilePath]] +segmentXargs l = go l [] 0 [] + where + go [] c _ r = c:r + go (f:fs) c accumlen r + | len < maxlen && newlen > maxlen = go (f:fs) [] 0 (c:r) + | otherwise = go fs (f:c) newlen r + where + len = length f + newlen = accumlen + len + + {- 10k of filenames per command, well under Linux's 20k limit; + - allows room for other parameters etc. -} + maxlen = 10240 diff --git a/Utility/Scheduled.hs b/Utility/Scheduled.hs new file mode 100644 index 000000000..305410c54 --- /dev/null +++ b/Utility/Scheduled.hs @@ -0,0 +1,396 @@ +{- scheduled activities + - + - Copyright 2013-2014 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Scheduled ( + Schedule(..), + Recurrance(..), + ScheduledTime(..), + NextTime(..), + WeekDay, + MonthDay, + YearDay, + nextTime, + calcNextTime, + startTime, + fromSchedule, + fromScheduledTime, + toScheduledTime, + fromRecurrance, + toRecurrance, + toSchedule, + parseSchedule, + prop_schedule_roundtrips, + prop_past_sane, +) where + +import Utility.Data +import Utility.QuickCheck +import Utility.PartialPrelude +import Utility.Misc + +import Control.Applicative +import Data.List +import Data.Time.Clock +import Data.Time.LocalTime +import Data.Time.Calendar +import Data.Time.Calendar.WeekDate +import Data.Time.Calendar.OrdinalDate +import Data.Tuple.Utils +import Data.Char + +{- Some sort of scheduled event. -} +data Schedule = Schedule Recurrance ScheduledTime + deriving (Eq, Read, Show, Ord) + +data Recurrance + = Daily + | Weekly (Maybe WeekDay) + | Monthly (Maybe MonthDay) + | Yearly (Maybe YearDay) + | Divisible Int Recurrance + -- ^ Days, Weeks, or Months of the year evenly divisible by a number. + -- (Divisible Year is years evenly divisible by a number.) + deriving (Eq, Read, Show, Ord) + +type WeekDay = Int +type MonthDay = Int +type YearDay = Int + +data ScheduledTime + = AnyTime + | SpecificTime Hour Minute + deriving (Eq, Read, Show, Ord) + +type Hour = Int +type Minute = Int + +-- | Next time a Schedule should take effect. The NextTimeWindow is used +-- when a Schedule is allowed to start at some point within the window. +data NextTime + = NextTimeExactly LocalTime + | NextTimeWindow LocalTime LocalTime + deriving (Eq, Read, Show) + +startTime :: NextTime -> LocalTime +startTime (NextTimeExactly t) = t +startTime (NextTimeWindow t _) = t + +nextTime :: Schedule -> Maybe LocalTime -> IO (Maybe NextTime) +nextTime schedule lasttime = do + now <- getCurrentTime + tz <- getTimeZone now + return $ calcNextTime schedule lasttime $ utcToLocalTime tz now + +-- | Calculate the next time that fits a Schedule, based on the +-- last time it occurred, and the current time. +calcNextTime :: Schedule -> Maybe LocalTime -> LocalTime -> Maybe NextTime +calcNextTime schedule@(Schedule recurrance scheduledtime) lasttime currenttime + | scheduledtime == AnyTime = do + next <- findfromtoday True + return $ case next of + NextTimeWindow _ _ -> next + NextTimeExactly t -> window (localDay t) (localDay t) + | otherwise = NextTimeExactly . startTime <$> findfromtoday False + where + findfromtoday anytime = findfrom recurrance afterday today + where + today = localDay currenttime + afterday = sameaslastrun || toolatetoday + toolatetoday = not anytime && localTimeOfDay currenttime >= nexttime + sameaslastrun = lastrun == Just today + lastrun = localDay <$> lasttime + nexttime = case scheduledtime of + AnyTime -> TimeOfDay 0 0 0 + SpecificTime h m -> TimeOfDay h m 0 + exactly d = NextTimeExactly $ LocalTime d nexttime + window startd endd = NextTimeWindow + (LocalTime startd nexttime) + (LocalTime endd (TimeOfDay 23 59 0)) + findfrom r afterday candidate + | ynum candidate > (ynum (localDay currenttime)) + 100 = + -- avoid possible infinite recusion + error $ "bug: calcNextTime did not find a time within 100 years to run " ++ + show (schedule, lasttime, currenttime) + | otherwise = findfromChecked r afterday candidate + findfromChecked r afterday candidate = case r of + Daily + | afterday -> Just $ exactly $ addDays 1 candidate + | otherwise -> Just $ exactly candidate + Weekly Nothing + | afterday -> skip 1 + | otherwise -> case (wday <$> lastrun, wday candidate) of + (Nothing, _) -> Just $ window candidate (addDays 6 candidate) + (Just old, curr) + | old == curr -> Just $ window candidate (addDays 6 candidate) + | otherwise -> skip 1 + Monthly Nothing + | afterday -> skip 1 + | maybe True (candidate `oneMonthPast`) lastrun -> + Just $ window candidate (endOfMonth candidate) + | otherwise -> skip 1 + Yearly Nothing + | afterday -> skip 1 + | maybe True (candidate `oneYearPast`) lastrun -> + Just $ window candidate (endOfYear candidate) + | otherwise -> skip 1 + Weekly (Just w) + | w < 0 || w > maxwday -> Nothing + | w == wday candidate -> if afterday + then Just $ exactly $ addDays 7 candidate + else Just $ exactly candidate + | otherwise -> Just $ exactly $ + addDays (fromIntegral $ (w - wday candidate) `mod` 7) candidate + Monthly (Just m) + | m < 0 || m > maxmday -> Nothing + -- TODO can be done more efficiently than recursing + | m == mday candidate -> if afterday + then skip 1 + else Just $ exactly candidate + | otherwise -> skip 1 + Yearly (Just y) + | y < 0 || y > maxyday -> Nothing + | y == yday candidate -> if afterday + then skip 365 + else Just $ exactly candidate + | otherwise -> skip 1 + Divisible n r'@Daily -> handlediv n r' yday (Just maxyday) + Divisible n r'@(Weekly _) -> handlediv n r' wnum (Just maxwnum) + Divisible n r'@(Monthly _) -> handlediv n r' mnum (Just maxmnum) + Divisible n r'@(Yearly _) -> handlediv n r' ynum Nothing + Divisible _ r'@(Divisible _ _) -> findfrom r' afterday candidate + where + skip n = findfrom r False (addDays n candidate) + handlediv n r' getval mmax + | n > 0 && maybe True (n <=) mmax = + findfromwhere r' (divisible n . getval) afterday candidate + | otherwise = Nothing + findfromwhere r p afterday candidate + | maybe True (p . getday) next = next + | otherwise = maybe Nothing (findfromwhere r p True . getday) next + where + next = findfrom r afterday candidate + getday = localDay . startTime + divisible n v = v `rem` n == 0 + +-- Check if the new Day occurs one month or more past the old Day. +oneMonthPast :: Day -> Day -> Bool +new `oneMonthPast` old = fromGregorian y (m+1) d <= new + where + (y,m,d) = toGregorian old + +-- Check if the new Day occurs one year or more past the old Day. +oneYearPast :: Day -> Day -> Bool +new `oneYearPast` old = fromGregorian (y+1) m d <= new + where + (y,m,d) = toGregorian old + +endOfMonth :: Day -> Day +endOfMonth day = + let (y,m,_d) = toGregorian day + in fromGregorian y m (gregorianMonthLength y m) + +endOfYear :: Day -> Day +endOfYear day = + let (y,_m,_d) = toGregorian day + in endOfMonth (fromGregorian y maxmnum 1) + +-- extracting various quantities from a Day +wday :: Day -> Int +wday = thd3 . toWeekDate +wnum :: Day -> Int +wnum = snd3 . toWeekDate +mday :: Day -> Int +mday = thd3 . toGregorian +mnum :: Day -> Int +mnum = snd3 . toGregorian +yday :: Day -> Int +yday = snd . toOrdinalDate +ynum :: Day -> Int +ynum = fromIntegral . fst . toOrdinalDate + +-- Calendar max values. +maxyday :: Int +maxyday = 366 -- with leap days +maxwnum :: Int +maxwnum = 53 -- some years have more than 52 +maxmday :: Int +maxmday = 31 +maxmnum :: Int +maxmnum = 12 +maxwday :: Int +maxwday = 7 + +fromRecurrance :: Recurrance -> String +fromRecurrance (Divisible n r) = + fromRecurrance' (++ "s divisible by " ++ show n) r +fromRecurrance r = fromRecurrance' ("every " ++) r + +fromRecurrance' :: (String -> String) -> Recurrance -> String +fromRecurrance' a Daily = a "day" +fromRecurrance' a (Weekly n) = onday n (a "week") +fromRecurrance' a (Monthly n) = onday n (a "month") +fromRecurrance' a (Yearly n) = onday n (a "year") +fromRecurrance' a (Divisible _n r) = fromRecurrance' a r -- not used + +onday :: Maybe Int -> String -> String +onday (Just n) s = "on day " ++ show n ++ " of " ++ s +onday Nothing s = s + +toRecurrance :: String -> Maybe Recurrance +toRecurrance s = case words s of + ("every":"day":[]) -> Just Daily + ("on":"day":sd:"of":"every":something:[]) -> withday sd something + ("every":something:[]) -> noday something + ("days":"divisible":"by":sn:[]) -> + Divisible <$> getdivisor sn <*> pure Daily + ("on":"day":sd:"of":something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> withday sd something + ("every":something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> noday something + (something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> noday something + _ -> Nothing + where + constructor "week" = Just Weekly + constructor "month" = Just Monthly + constructor "year" = Just Yearly + constructor u + | "s" `isSuffixOf` u = constructor $ reverse $ drop 1 $ reverse u + | otherwise = Nothing + withday sd u = do + c <- constructor u + d <- readish sd + Just $ c (Just d) + noday u = do + c <- constructor u + Just $ c Nothing + getdivisor sn = do + n <- readish sn + if n > 0 + then Just n + else Nothing + +fromScheduledTime :: ScheduledTime -> String +fromScheduledTime AnyTime = "any time" +fromScheduledTime (SpecificTime h m) = + show h' ++ (if m > 0 then ":" ++ pad 2 (show m) else "") ++ " " ++ ampm + where + pad n s = take (n - length s) (repeat '0') ++ s + (h', ampm) + | h == 0 = (12, "AM") + | h < 12 = (h, "AM") + | h == 12 = (h, "PM") + | otherwise = (h - 12, "PM") + +toScheduledTime :: String -> Maybe ScheduledTime +toScheduledTime "any time" = Just AnyTime +toScheduledTime v = case words v of + (s:ampm:[]) + | map toUpper ampm == "AM" -> + go s h0 + | map toUpper ampm == "PM" -> + go s (\h -> (h0 h) + 12) + | otherwise -> Nothing + (s:[]) -> go s id + _ -> Nothing + where + h0 h + | h == 12 = 0 + | otherwise = h + go :: String -> (Int -> Int) -> Maybe ScheduledTime + go s adjust = + let (h, m) = separate (== ':') s + in SpecificTime + <$> (adjust <$> readish h) + <*> if null m then Just 0 else readish m + +fromSchedule :: Schedule -> String +fromSchedule (Schedule recurrance scheduledtime) = unwords + [ fromRecurrance recurrance + , "at" + , fromScheduledTime scheduledtime + ] + +toSchedule :: String -> Maybe Schedule +toSchedule = eitherToMaybe . parseSchedule + +parseSchedule :: String -> Either String Schedule +parseSchedule s = do + r <- maybe (Left $ "bad recurrance: " ++ recurrance) Right + (toRecurrance recurrance) + t <- maybe (Left $ "bad time of day: " ++ scheduledtime) Right + (toScheduledTime scheduledtime) + Right $ Schedule r t + where + (rws, tws) = separate (== "at") (words s) + recurrance = unwords rws + scheduledtime = unwords tws + +instance Arbitrary Schedule where + arbitrary = Schedule <$> arbitrary <*> arbitrary + +instance Arbitrary ScheduledTime where + arbitrary = oneof + [ pure AnyTime + , SpecificTime + <$> choose (0, 23) + <*> choose (1, 59) + ] + +instance Arbitrary Recurrance where + arbitrary = oneof + [ pure Daily + , Weekly <$> arbday + , Monthly <$> arbday + , Yearly <$> arbday + , Divisible + <$> positive arbitrary + <*> oneof -- no nested Divisibles + [ pure Daily + , Weekly <$> arbday + , Monthly <$> arbday + , Yearly <$> arbday + ] + ] + where + arbday = oneof + [ Just <$> nonNegative arbitrary + , pure Nothing + ] + +prop_schedule_roundtrips :: Schedule -> Bool +prop_schedule_roundtrips s = toSchedule (fromSchedule s) == Just s + +prop_past_sane :: Bool +prop_past_sane = and + [ all (checksout oneMonthPast) (mplus1 ++ yplus1) + , all (not . (checksout oneMonthPast)) (map swap (mplus1 ++ yplus1)) + , all (checksout oneYearPast) yplus1 + , all (not . (checksout oneYearPast)) (map swap yplus1) + ] + where + mplus1 = -- new date old date, 1+ months before it + [ (fromGregorian 2014 01 15, fromGregorian 2013 12 15) + , (fromGregorian 2014 01 15, fromGregorian 2013 02 15) + , (fromGregorian 2014 02 15, fromGregorian 2013 01 15) + , (fromGregorian 2014 03 01, fromGregorian 2013 01 15) + , (fromGregorian 2014 03 01, fromGregorian 2013 12 15) + , (fromGregorian 2015 01 01, fromGregorian 2010 01 01) + ] + yplus1 = -- new date old date, 1+ years before it + [ (fromGregorian 2014 01 15, fromGregorian 2012 01 16) + , (fromGregorian 2014 01 15, fromGregorian 2013 01 14) + , (fromGregorian 2022 12 31, fromGregorian 2000 01 01) + ] + checksout cmp (new, old) = new `cmp` old + swap (a,b) = (b,a) diff --git a/Utility/Shell.hs b/Utility/Shell.hs new file mode 100644 index 000000000..00f60d09f --- /dev/null +++ b/Utility/Shell.hs @@ -0,0 +1,26 @@ +{- /bin/sh handling + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Shell where + +shellPath_portable :: FilePath +shellPath_portable = "/bin/sh" + +shellPath_local :: FilePath +#ifndef __ANDROID__ +shellPath_local = shellPath_portable +#else +shellPath_local = "/system/bin/sh" +#endif + +shebang_portable :: String +shebang_portable = "#!" ++ shellPath_portable + +shebang_local :: String +shebang_local = "#!" ++ shellPath_local diff --git a/Utility/SimpleProtocol.hs b/Utility/SimpleProtocol.hs new file mode 100644 index 000000000..0ac0be4cc --- /dev/null +++ b/Utility/SimpleProtocol.hs @@ -0,0 +1,90 @@ +{- Simple line-based protocols. + - + - Copyright 2013-2014 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.SimpleProtocol ( + Sendable(..), + Receivable(..), + parseMessage, + Serializable(..), + Parser, + parseFail, + parse0, + parse1, + parse2, + parse3, + ioHandles, +) where + +import Data.Char +import GHC.IO.Handle + +import Common + +-- Messages that can be sent. +class Sendable m where + formatMessage :: m -> [String] + +-- Messages that can be received. +class Receivable m where + -- Passed the first word of the message, returns + -- a Parser that can be be fed the rest of the message to generate + -- the value. + parseCommand :: String -> Parser m + +parseMessage :: (Receivable m) => String -> Maybe m +parseMessage s = parseCommand command rest + where + (command, rest) = splitWord s + +class Serializable a where + serialize :: a -> String + deserialize :: String -> Maybe a + +{- Parsing the parameters of messages. Using the right parseN ensures + - that the string is split into exactly the requested number of words, + - which allows the last parameter of a message to contain arbitrary + - whitespace, etc, without needing any special quoting. + -} +type Parser a = String -> Maybe a + +parseFail :: Parser a +parseFail _ = Nothing + +parse0 :: a -> Parser a +parse0 mk "" = Just mk +parse0 _ _ = Nothing + +parse1 :: Serializable p1 => (p1 -> a) -> Parser a +parse1 mk p1 = mk <$> deserialize p1 + +parse2 :: (Serializable p1, Serializable p2) => (p1 -> p2 -> a) -> Parser a +parse2 mk s = mk <$> deserialize p1 <*> deserialize p2 + where + (p1, p2) = splitWord s + +parse3 :: (Serializable p1, Serializable p2, Serializable p3) => (p1 -> p2 -> p3 -> a) -> Parser a +parse3 mk s = mk <$> deserialize p1 <*> deserialize p2 <*> deserialize p3 + where + (p1, rest) = splitWord s + (p2, p3) = splitWord rest + +splitWord :: String -> (String, String) +splitWord = separate isSpace + +{- When a program speaks a simple protocol over stdio, any other output + - to stdout (or anything that attempts to read from stdin) + - will mess up the protocol. To avoid that, close stdin, and + - and duplicate stderr to stdout. Return two new handles + - that are duplicates of the original (stdin, stdout). -} +ioHandles :: IO (Handle, Handle) +ioHandles = do + readh <- hDuplicate stdin + writeh <- hDuplicate stdout + nullh <- openFile devNull ReadMode + nullh `hDuplicateTo` stdin + stderr `hDuplicateTo` stdout + return (readh, writeh) diff --git a/Utility/SshConfig.hs b/Utility/SshConfig.hs new file mode 100644 index 000000000..529e5c990 --- /dev/null +++ b/Utility/SshConfig.hs @@ -0,0 +1,142 @@ +{- ssh config file parsing and modification + - + - Copyright 2013 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.SshConfig where + +import Common +import Utility.UserInfo +import Utility.Tmp +import Utility.FileMode + +import Data.Char +import Data.Ord +import Data.Either + +data SshConfig + = GlobalConfig SshSetting + | HostConfig Host [Either Comment SshSetting] + | CommentLine Comment + deriving (Show) + +data Comment = Comment Indent String + deriving (Show) + +data SshSetting = SshSetting Indent Key Value + deriving (Show) + +type Indent = String +type Host = String +type Key = String +type Value = String + +{- Parses ~/.ssh/config. Comments and indentation are preserved. + - + - Note that there is no parse failure. If a line cannot be parsed, it will + - be taken to be a SshSetting that contains the whole line as the key, + - and has no value. -} +parseSshConfig :: String -> [SshConfig] +parseSshConfig = go [] . lines + where + go c [] = reverse c + go c (l:ls) + | iscomment l = collect $ CommentLine $ mkcomment l + | otherwise = case splitline l of + (indent, k, v) + | isHost k -> hoststanza v c [] ls + | otherwise -> collect $ GlobalConfig $ SshSetting indent k v + where + collect v = go (v:c) ls + + hoststanza host c hc [] = go (HostConfig host (reverse hc):c) [] + hoststanza host c hc (l:ls) + | iscomment l = hoststanza host c ((Left $ mkcomment l):hc) ls + | otherwise = case splitline l of + (indent, k, v) + | isHost k -> hoststanza v + (HostConfig host (reverse hc):c) [] ls + | otherwise -> hoststanza host c + ((Right $ SshSetting indent k v):hc) ls + + iscomment l = all isSpace l || "#" `isPrefixOf` (dropWhile isSpace l) + + splitline l = (indent, k, v) + where + (indent, rest) = span isSpace l + (k, v) = separate isSpace rest + + mkcomment l = Comment indent c + where + (indent, c) = span isSpace l + + isHost v = map toLower v == "host" + +genSshConfig :: [SshConfig] -> String +genSshConfig = unlines . concatMap gen + where + gen (CommentLine c) = [comment c] + gen (GlobalConfig s) = [setting s] + gen (HostConfig h cs) = ("Host " ++ h) : map (either comment setting) cs + + setting (SshSetting indent k v) = indent ++ k ++ " " ++ v + comment (Comment indent c) = indent ++ c + +findHostConfigKey :: SshConfig -> Key -> Maybe Value +findHostConfigKey (HostConfig _ cs) wantk = go (rights cs) (map toLower wantk) + where + go [] _ = Nothing + go ((SshSetting _ k v):rest) wantk' + | map toLower k == wantk' = Just v + | otherwise = go rest wantk' +findHostConfigKey _ _ = Nothing + +{- Adds a particular Key and Value to a HostConfig. -} +addToHostConfig :: SshConfig -> Key -> Value -> SshConfig +addToHostConfig (HostConfig host cs) k v = + HostConfig host $ Right (SshSetting indent k v) : cs + where + {- The indent is taken from any existing SshSetting + - in the HostConfig (largest indent wins). -} + indent = fromMaybe "\t" $ headMaybe $ reverse $ + sortBy (comparing length) $ map getindent cs + getindent (Right (SshSetting i _ _)) = i + getindent (Left (Comment i _)) = i +addToHostConfig other _ _ = other + +modifyUserSshConfig :: ([SshConfig] -> [SshConfig]) -> IO () +modifyUserSshConfig modifier = changeUserSshConfig $ + genSshConfig . modifier . parseSshConfig + +changeUserSshConfig :: (String -> String) -> IO () +changeUserSshConfig modifier = do + sshdir <- sshDir + let configfile = sshdir "config" + whenM (doesFileExist configfile) $ do + c <- readFileStrict configfile + let c' = modifier c + when (c /= c') $ + viaTmp writeSshConfig configfile c' + +writeSshConfig :: FilePath -> String -> IO () +writeSshConfig f s = do + writeFile f s + setSshConfigMode f + +{- Ensure that the ssh config file lacks any group or other write bits, + - since ssh is paranoid about not working if other users can write + - to one of its config files (.ssh/config and .ssh/authorized_keys). + - + - If the chmod fails, ignore the failure, as it might be a filesystem like + - Android's that does not support file modes. + -} +setSshConfigMode :: FilePath -> IO () +setSshConfigMode f = void $ tryIO $ modifyFileMode f $ + removeModes [groupWriteMode, otherWriteMode] + +sshDir :: IO FilePath +sshDir = do + home <- myHomeDir + return $ home ".ssh" diff --git a/Utility/TList.hs b/Utility/TList.hs new file mode 100644 index 000000000..4b91b767f --- /dev/null +++ b/Utility/TList.hs @@ -0,0 +1,69 @@ +{- Transactional lists + - + - Based on DLists, a transactional list can quickly and efficiently + - have items inserted at either end, or a whole list appended to it. + - + - Unlike a TQueue, the entire contents of a TList can be efficiently + - read without modifying it. + - + - Copyright 2013 Joey Hess + -} + +{-# LANGUAGE BangPatterns #-} + +module Utility.TList where + +import Common + +import Control.Concurrent.STM +import qualified Data.DList as D + +type TList a = TMVar (D.DList a) + +newTList :: STM (TList a) +newTList = newEmptyTMVar + +{- Gets the contents of the TList. Blocks when empty. + - TList is left empty. -} +getTList :: TList a -> STM [a] +getTList tlist = D.toList <$> getTDList tlist + +getTDList :: TList a -> STM (D.DList a) +getTDList = takeTMVar + +{- Replaces the contents of the TList. -} +setTList :: TList a -> [a] -> STM () +setTList tlist = setTDList tlist . D.fromList + +setTDList :: TList a -> D.DList a -> STM () +setTDList tlist = modifyTList tlist . const + +{- Takes anything currently in the TList, without blocking. + - TList is left empty. -} +takeTList :: TList a -> STM [a] +takeTList tlist = maybe [] D.toList <$> tryTakeTMVar tlist + +{- Reads anything in the list, without modifying it, or blocking. -} +readTList :: TList a -> STM [a] +readTList tlist = maybe [] D.toList <$> tryReadTMVar tlist + +{- Mutates a TList. -} +modifyTList :: TList a -> (D.DList a -> D.DList a) -> STM () +modifyTList tlist a = do + dl <- fromMaybe D.empty <$> tryTakeTMVar tlist + let !dl' = a dl + {- The TMVar is left empty when the list is empty. + - Thus attempts to read it automatically block. -} + unless (emptyDList dl') $ + putTMVar tlist dl' + where + emptyDList = D.list True (\_ _ -> False) + +consTList :: TList a -> a -> STM () +consTList tlist v = modifyTList tlist $ \dl -> D.cons v dl + +snocTList :: TList a -> a -> STM () +snocTList tlist v = modifyTList tlist $ \dl -> D.snoc dl v + +appendTList :: TList a -> [a] -> STM () +appendTList tlist l = modifyTList tlist $ \dl -> D.append dl (D.fromList l) diff --git a/Utility/Tense.hs b/Utility/Tense.hs new file mode 100644 index 000000000..0392ba500 --- /dev/null +++ b/Utility/Tense.hs @@ -0,0 +1,57 @@ +{- Past and present tense text. + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Utility.Tense where + +import qualified Data.Text as T +import Data.Text (Text) +import GHC.Exts( IsString(..) ) + +data Tense = Present | Past + deriving (Eq) + +data TenseChunk = Tensed Text Text | UnTensed Text + deriving (Eq, Ord, Show) + +newtype TenseText = TenseText [TenseChunk] + deriving (Eq, Ord) + +{- Allows OverloadedStrings to be used, to build UnTensed chunks. -} +instance IsString TenseChunk where + fromString = UnTensed . T.pack + +{- Allows OverloadedStrings to be used, to provide UnTensed TenseText. -} +instance IsString TenseText where + fromString s = TenseText [fromString s] + +renderTense :: Tense -> TenseText -> Text +renderTense tense (TenseText chunks) = T.concat $ map render chunks + where + render (Tensed present past) + | tense == Present = present + | otherwise = past + render (UnTensed s) = s + +{- Builds up a TenseText, separating chunks with spaces. + - + - However, rather than just intersperse new chunks for the spaces, + - the spaces are appended to the end of the chunks. + -} +tenseWords :: [TenseChunk] -> TenseText +tenseWords = TenseText . go [] + where + go c [] = reverse c + go c (w:[]) = reverse (w:c) + go c ((UnTensed w):ws) = go (UnTensed (addspace w) : c) ws + go c ((Tensed w1 w2):ws) = + go (Tensed (addspace w1) (addspace w2) : c) ws + addspace w = T.append w " " + +unTensed :: Text -> TenseText +unTensed t = TenseText [UnTensed t] diff --git a/Utility/ThreadLock.hs b/Utility/ThreadLock.hs new file mode 100644 index 000000000..548d524e1 --- /dev/null +++ b/Utility/ThreadLock.hs @@ -0,0 +1,19 @@ +{- locking between threads + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.ThreadLock where + +import Control.Concurrent.MVar + +type Lock = MVar () + +newLock :: IO Lock +newLock = newMVar () + +{- Runs an action with a lock held, so only one thread at a time can run it. -} +withLock :: Lock -> IO a -> IO a +withLock lock = withMVar lock . const diff --git a/Utility/ThreadScheduler.hs b/Utility/ThreadScheduler.hs new file mode 100644 index 000000000..e6a81aebd --- /dev/null +++ b/Utility/ThreadScheduler.hs @@ -0,0 +1,74 @@ +{- thread scheduling + - + - Copyright 2012, 2013 Joey Hess + - Copyright 2011 Bas van Dijk & Roel van Dijk + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.ThreadScheduler where + +import Control.Monad +import Control.Concurrent +#ifndef mingw32_HOST_OS +import Control.Monad.IfElse +import System.Posix.IO +#endif +#ifndef mingw32_HOST_OS +import System.Posix.Signals +#ifndef __ANDROID__ +import System.Posix.Terminal +#endif +#endif + +newtype Seconds = Seconds { fromSeconds :: Int } + deriving (Eq, Ord, Show) + +type Microseconds = Integer + +{- Runs an action repeatedly forever, sleeping at least the specified number + - of seconds in between. -} +runEvery :: Seconds -> IO a -> IO a +runEvery n a = forever $ do + threadDelaySeconds n + a + +threadDelaySeconds :: Seconds -> IO () +threadDelaySeconds (Seconds n) = unboundDelay (fromIntegral n * oneSecond) + +{- Like threadDelay, but not bounded by an Int. + - + - There is no guarantee that the thread will be rescheduled promptly when the + - delay has expired, but the thread will never continue to run earlier than + - specified. + - + - Taken from the unbounded-delay package to avoid a dependency for 4 lines + - of code. + -} +unboundDelay :: Microseconds -> IO () +unboundDelay time = do + let maxWait = min time $ toInteger (maxBound :: Int) + threadDelay $ fromInteger maxWait + when (maxWait /= time) $ unboundDelay (time - maxWait) + +{- Pauses the main thread, letting children run until program termination. -} +waitForTermination :: IO () +waitForTermination = do +#ifdef mingw32_HOST_OS + forever $ threadDelaySeconds (Seconds 6000) +#else + lock <- newEmptyMVar + let check sig = void $ + installHandler sig (CatchOnce $ putMVar lock ()) Nothing + check softwareTermination +#ifndef __ANDROID__ + whenM (queryTerminal stdInput) $ + check keyboardSignal +#endif + takeMVar lock +#endif + +oneSecond :: Microseconds +oneSecond = 1000000 diff --git a/Utility/Tmp.hs b/Utility/Tmp.hs new file mode 100644 index 000000000..bed30bb4d --- /dev/null +++ b/Utility/Tmp.hs @@ -0,0 +1,107 @@ +{- Temporary files and directories. + - + - Copyright 2010-2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Tmp where + +import Control.Exception (bracket) +import System.IO +import System.Directory +import Control.Monad.IfElse +import System.FilePath + +import Utility.Exception +import Utility.FileSystemEncoding +import Utility.PosixFiles + +type Template = String + +{- Runs an action like writeFile, writing to a temp file first and + - then moving it into place. The temp file is stored in the same + - directory as the final file to avoid cross-device renames. -} +viaTmp :: (FilePath -> String -> IO ()) -> FilePath -> String -> IO () +viaTmp a file content = bracket setup cleanup use + where + (dir, base) = splitFileName file + template = base ++ ".tmp" + setup = do + createDirectoryIfMissing True dir + openTempFile dir template + cleanup (tmpfile, handle) = do + _ <- tryIO $ hClose handle + tryIO $ removeFile tmpfile + use (tmpfile, handle) = do + hClose handle + a tmpfile content + rename tmpfile file + +{- Runs an action with a tmp file located in the system's tmp directory + - (or in "." if there is none) then removes the file. -} +withTmpFile :: Template -> (FilePath -> Handle -> IO a) -> IO a +withTmpFile template a = do + tmpdir <- catchDefaultIO "." getTemporaryDirectory + withTmpFileIn tmpdir template a + +{- Runs an action with a tmp file located in the specified directory, + - then removes the file. -} +withTmpFileIn :: FilePath -> Template -> (FilePath -> Handle -> IO a) -> IO a +withTmpFileIn tmpdir template a = bracket create remove use + where + create = openTempFile tmpdir template + remove (name, handle) = do + hClose handle + catchBoolIO (removeFile name >> return True) + use (name, handle) = a name handle + +{- Runs an action with a tmp directory located within the system's tmp + - directory (or within "." if there is none), then removes the tmp + - directory and all its contents. -} +withTmpDir :: Template -> (FilePath -> IO a) -> IO a +withTmpDir template a = do + tmpdir <- catchDefaultIO "." getTemporaryDirectory + withTmpDirIn tmpdir template a + +{- Runs an action with a tmp directory located within a specified directory, + - then removes the tmp directory and all its contents. -} +withTmpDirIn :: FilePath -> Template -> (FilePath -> IO a) -> IO a +withTmpDirIn tmpdir template = bracket create remove + where + remove d = whenM (doesDirectoryExist d) $ do +#if mingw32_HOST_OS + -- Windows will often refuse to delete a file + -- after a process has just written to it and exited. + -- Because it's crap, presumably. So, ignore failure + -- to delete the temp directory. + _ <- tryIO $ removeDirectoryRecursive d + return () +#else + removeDirectoryRecursive d +#endif + create = do + createDirectoryIfMissing True tmpdir + makenewdir (tmpdir template) (0 :: Int) + makenewdir t n = do + let dir = t ++ "." ++ show n + either (const $ makenewdir t $ n + 1) (const $ return dir) + =<< tryIO (createDirectory dir) + +{- It's not safe to use a FilePath of an existing file as the template + - for openTempFile, because if the FilePath is really long, the tmpfile + - will be longer, and may exceed the maximum filename length. + - + - This generates a template that is never too long. + - (Well, it allocates 20 characters for use in making a unique temp file, + - anyway, which is enough for the current implementation and any + - likely implementation.) + -} +relatedTemplate :: FilePath -> FilePath +relatedTemplate f + | len > 20 = truncateFilePath (len - 20) f + | otherwise = f + where + len = length f diff --git a/Utility/Touch.hsc b/Utility/Touch.hsc new file mode 100644 index 000000000..61276c523 --- /dev/null +++ b/Utility/Touch.hsc @@ -0,0 +1,120 @@ +{- More control over touching a file. + - + - Copyright 2011 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.Touch ( + TimeSpec(..), + touchBoth, + touch +) where + +import Utility.FileSystemEncoding + +import Foreign +import Foreign.C +import Control.Monad (when) + +newtype TimeSpec = TimeSpec CTime + +{- Changes the access and modification times of an existing file. + Can follow symlinks, or not. Throws IO error on failure. -} +touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO () + +touch :: FilePath -> TimeSpec -> Bool -> IO () +touch file mtime = touchBoth file mtime mtime + +#include +#include +#include +#include + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif + +#if (defined UTIME_OMIT && defined UTIME_NOW && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW) + +at_fdcwd :: CInt +at_fdcwd = #const AT_FDCWD + +at_symlink_nofollow :: CInt +at_symlink_nofollow = #const AT_SYMLINK_NOFOLLOW + +instance Storable TimeSpec where + -- use the larger alignment of the two types in the struct + alignment _ = max sec_alignment nsec_alignment + where + sec_alignment = alignment (undefined::CTime) + nsec_alignment = alignment (undefined::CLong) + sizeOf _ = #{size struct timespec} + peek ptr = do + sec <- #{peek struct timespec, tv_sec} ptr + return $ TimeSpec sec + poke ptr (TimeSpec sec) = do + #{poke struct timespec, tv_sec} ptr sec + #{poke struct timespec, tv_nsec} ptr (0 :: CLong) + +{- While its interface is beastly, utimensat is in recent + POSIX standards, unlike lutimes. -} +foreign import ccall "utimensat" + c_utimensat :: CInt -> CString -> Ptr TimeSpec -> CInt -> IO CInt + +touchBoth file atime mtime follow = + allocaArray 2 $ \ptr -> + withFilePath file $ \f -> do + pokeArray ptr [atime, mtime] + r <- c_utimensat at_fdcwd f ptr flags + when (r /= 0) $ throwErrno "touchBoth" + where + flags + | follow = 0 + | otherwise = at_symlink_nofollow + +#else +#if 0 +{- Using lutimes is needed for BSD. + - + - TODO: test if lutimes is available. May have to do it in configure. + - TODO: TimeSpec uses a CTime, while tv_sec is a CLong. It is implementation + - dependent whether these are the same; need to find a cast that works. + - (Without the cast it works on linux i386, but + - maybe not elsewhere.) + -} + +instance Storable TimeSpec where + alignment _ = alignment (undefined::CLong) + sizeOf _ = #{size struct timeval} + peek ptr = do + sec <- #{peek struct timeval, tv_sec} ptr + return $ TimeSpec sec + poke ptr (TimeSpec sec) = do + #{poke struct timeval, tv_sec} ptr sec + #{poke struct timeval, tv_usec} ptr (0 :: CLong) + +foreign import ccall "utimes" + c_utimes :: CString -> Ptr TimeSpec -> IO CInt +foreign import ccall "lutimes" + c_lutimes :: CString -> Ptr TimeSpec -> IO CInt + +touchBoth file atime mtime follow = + allocaArray 2 $ \ptr -> + withFilePath file $ \f -> do + pokeArray ptr [atime, mtime] + r <- syscall f ptr + when (r /= 0) $ + throwErrno "touchBoth" + where + syscall + | follow = c_lutimes + | otherwise = c_utimes + +#else +#warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +touchBoth _ _ _ _ = return () +#endif +#endif diff --git a/Utility/URI.hs b/Utility/URI.hs new file mode 100644 index 000000000..30c6be3db --- /dev/null +++ b/Utility/URI.hs @@ -0,0 +1,18 @@ +{- Network.URI + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.URI where + +-- Old versions of network lacked an Ord for URI +#if ! MIN_VERSION_network(2,4,0) +import Network.URI + +instance Ord URI where + a `compare` b = show a `compare` show b +#endif diff --git a/Utility/Url.hs b/Utility/Url.hs new file mode 100644 index 000000000..bf2d3859c --- /dev/null +++ b/Utility/Url.hs @@ -0,0 +1,212 @@ +{- Url downloading. + - + - Copyright 2011,2013 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.Url ( + URLString, + UserAgent, + UrlOptions(..), + check, + checkBoth, + exists, + download, + downloadQuiet, + parseURIRelaxed +) where + +import Common +import Network.URI +import qualified Network.Browser as Browser +import Network.HTTP +import Data.Either +import Data.Default + +import qualified Build.SysConfig + +type URLString = String + +type Headers = [String] + +type UserAgent = String + +data UrlOptions = UrlOptions + { userAgent :: Maybe UserAgent + , reqHeaders :: Headers + , reqParams :: [CommandParam] + } + +instance Default UrlOptions + where + def = UrlOptions Nothing [] [] + +{- Checks that an url exists and could be successfully downloaded, + - also checking that its size, if available, matches a specified size. -} +checkBoth :: URLString -> Maybe Integer -> UrlOptions -> IO Bool +checkBoth url expected_size uo = do + v <- check url expected_size uo + return (fst v && snd v) +check :: URLString -> Maybe Integer -> UrlOptions -> IO (Bool, Bool) +check url expected_size = handle <$$> exists url + where + handle (False, _) = (False, False) + handle (True, Nothing) = (True, True) + handle (True, s) = case expected_size of + Just _ -> (True, expected_size == s) + Nothing -> (True, True) + +{- Checks that an url exists and could be successfully downloaded, + - also returning its size if available. + - + - For a file: url, check it directly. + - + - Uses curl otherwise, when available, since curl handles https better + - than does Haskell's Network.Browser. + -} +exists :: URLString -> UrlOptions -> IO (Bool, Maybe Integer) +exists url uo = case parseURIRelaxed url of + Just u + | uriScheme u == "file:" -> do + s <- catchMaybeIO $ getFileStatus (unEscapeString $ uriPath u) + case s of + Just stat -> return (True, Just $ fromIntegral $ fileSize stat) + Nothing -> dne + | otherwise -> if Build.SysConfig.curl + then do + output <- catchDefaultIO "" $ + readProcess "curl" $ toCommand curlparams + case lastMaybe (lines output) of + Just ('2':_:_) -> return (True, extractsize output) + _ -> dne + else do + r <- request u HEAD uo + case rspCode r of + (2,_,_) -> return (True, size r) + _ -> return (False, Nothing) + Nothing -> dne + where + dne = return (False, Nothing) + + curlparams = addUserAgent uo $ + [ Param "-s" + , Param "--head" + , Param "-L", Param url + , Param "-w", Param "%{http_code}" + ] ++ concatMap (\h -> [Param "-H", Param h]) (reqHeaders uo) ++ (reqParams uo) + + extractsize s = case lastMaybe $ filter ("Content-Length:" `isPrefixOf`) (lines s) of + Just l -> case lastMaybe $ words l of + Just sz -> readish sz + _ -> Nothing + _ -> Nothing + + size = liftM Prelude.read . lookupHeader HdrContentLength . rspHeaders + +-- works for both wget and curl commands +addUserAgent :: UrlOptions -> [CommandParam] -> [CommandParam] +addUserAgent uo ps = case userAgent uo of + Nothing -> ps + Just ua -> ps ++ [Param "--user-agent", Param ua] + +{- Used to download large files, such as the contents of keys. + - + - Uses wget or curl program for its progress bar. (Wget has a better one, + - so is preferred.) Which program to use is determined at run time; it + - would not be appropriate to test at configure time and build support + - for only one in. + -} +download :: URLString -> FilePath -> UrlOptions -> IO Bool +download = download' False + +{- No output, even on error. -} +downloadQuiet :: URLString -> FilePath -> UrlOptions -> IO Bool +downloadQuiet = download' True + +download' :: Bool -> URLString -> FilePath -> UrlOptions -> IO Bool +download' quiet url file uo = + case parseURIRelaxed url of + Just u + | uriScheme u == "file:" -> do + -- curl does not create destination file + -- for an empty file:// url, so pre-create + writeFile file "" + curl + | otherwise -> ifM (inPath "wget") (wget , curl) + _ -> return False + where + headerparams = map (\h -> Param $ "--header=" ++ h) (reqHeaders uo) + wget = go "wget" $ headerparams ++ quietopt "-q" ++ wgetparams + {- Regular wget needs --clobber to continue downloading an existing + - file. On Android, busybox wget is used, which does not + - support, or need that option. -} +#ifndef __ANDROID__ + wgetparams = [Params "--clobber -c -O"] +#else + wgetparams = [Params "-c -O"] +#endif + {- Uses the -# progress display, because the normal + - one is very confusing when resuming, showing + - the remainder to download as the whole file, + - and not indicating how much percent was + - downloaded before the resume. -} + curl = go "curl" $ headerparams ++ quietopt "-s" ++ + [Params "-f -L -C - -# -o"] + go cmd opts = boolSystem cmd $ + addUserAgent uo $ reqParams uo++opts++[File file, File url] + quietopt s + | quiet = [Param s] + | otherwise = [] + +{- Uses Network.Browser to make a http request of an url. + - For example, HEAD can be used to check if the url exists, + - or GET used to get the url content (best for small urls). + - + - This does its own redirect following because Browser's is buggy for HEAD + - requests. + - + - Unfortunately, does not handle https, so should only be used + - when curl is not available. + -} +request :: URI -> RequestMethod -> UrlOptions -> IO (Response String) +request url requesttype uo = go 5 url + where + go :: Int -> URI -> IO (Response String) + go 0 _ = error "Too many redirects " + go n u = do + rsp <- Browser.browse $ do + maybe noop Browser.setUserAgent (userAgent uo) + Browser.setErrHandler ignore + Browser.setOutHandler ignore + Browser.setAllowRedirects False + let req = mkRequest requesttype u :: Request_String + snd <$> Browser.request (addheaders req) + case rspCode rsp of + (3,0,x) | x /= 5 -> redir (n - 1) u rsp + _ -> return rsp + addheaders req = setHeaders req (rqHeaders req ++ userheaders) + userheaders = rights $ map parseHeader (reqHeaders uo) + ignore = const noop + redir n u rsp = case retrieveHeaders HdrLocation rsp of + [] -> return rsp + (Header _ newu:_) -> + case parseURIReference newu of + Nothing -> return rsp + Just newURI -> go n $ +#if defined VERSION_network +#if ! MIN_VERSION_network(2,4,0) +#define WITH_OLD_URI +#endif +#endif +#ifdef WITH_OLD_URI + fromMaybe newURI (newURI `relativeTo` u) +#else + newURI `relativeTo` u +#endif + +{- Allows for spaces and other stuff in urls, properly escaping them. -} +parseURIRelaxed :: URLString -> Maybe URI +parseURIRelaxed = parseURI . escapeURIString isAllowedInURI diff --git a/Utility/UserInfo.hs b/Utility/UserInfo.hs new file mode 100644 index 000000000..617c3e945 --- /dev/null +++ b/Utility/UserInfo.hs @@ -0,0 +1,55 @@ +{- user info + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE CPP #-} + +module Utility.UserInfo ( + myHomeDir, + myUserName, + myUserGecos, +) where + +import Control.Applicative +import System.PosixCompat + +import Utility.Env + +{- Current user's home directory. + - + - getpwent will fail on LDAP or NIS, so use HOME if set. -} +myHomeDir :: IO FilePath +myHomeDir = myVal env homeDirectory + where +#ifndef mingw32_HOST_OS + env = ["HOME"] +#else + env = ["USERPROFILE", "HOME"] -- HOME is used in Cygwin +#endif + +{- Current user's user name. -} +myUserName :: IO String +myUserName = myVal env userName + where +#ifndef mingw32_HOST_OS + env = ["USER", "LOGNAME"] +#else + env = ["USERNAME", "USER", "LOGNAME"] +#endif + +myUserGecos :: IO String +#ifdef __ANDROID__ +myUserGecos = return "" -- userGecos crashes on Android +#else +myUserGecos = myVal [] userGecos +#endif + +myVal :: [String] -> (UserEntry -> String) -> IO String +myVal envvars extract = maybe (extract <$> getpwent) return =<< check envvars + where + check [] = return Nothing + check (v:vs) = maybe (check vs) (return . Just) =<< getEnv v + getpwent = getUserEntryForID =<< getEffectiveUserID diff --git a/Utility/Verifiable.hs b/Utility/Verifiable.hs new file mode 100644 index 000000000..a62213074 --- /dev/null +++ b/Utility/Verifiable.hs @@ -0,0 +1,37 @@ +{- values verified using a shared secret + - + - Copyright 2012 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.Verifiable where + +import Data.Digest.Pure.SHA +import Data.ByteString.Lazy.UTF8 (fromString) +import qualified Data.ByteString.Lazy as L + +type Secret = L.ByteString +type HMACDigest = String + +{- A value, verifiable using a HMAC digest and a secret. -} +data Verifiable a = Verifiable + { verifiableVal :: a + , verifiableDigest :: HMACDigest + } + deriving (Eq, Read, Show) + +mkVerifiable :: Show a => a -> Secret -> Verifiable a +mkVerifiable a secret = Verifiable a (calcDigest (show a) secret) + +verify :: (Eq a, Show a) => Verifiable a -> Secret -> Bool +verify v secret = v == mkVerifiable (verifiableVal v) secret + +calcDigest :: String -> Secret -> HMACDigest +calcDigest v secret = showDigest $ hmacSha1 secret $ fromString v + +{- for quickcheck -} +prop_verifiable_sane :: String -> String -> Bool +prop_verifiable_sane a s = verify (mkVerifiable a secret) secret + where + secret = fromString s diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs new file mode 100644 index 000000000..0f3378a15 --- /dev/null +++ b/Utility/WebApp.hs @@ -0,0 +1,282 @@ +{- Yesod webapp + - + - Copyright 2012-2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE OverloadedStrings, CPP, RankNTypes #-} + +module Utility.WebApp where + +import Common +import Utility.Tmp +import Utility.FileMode +import Utility.Hash + +import qualified Yesod +import qualified Network.Wai as Wai +import Network.Wai.Handler.Warp +import Network.Wai.Handler.WarpTLS +import Network.HTTP.Types +import qualified Data.CaseInsensitive as CI +import Network.Socket +import "crypto-api" Crypto.Random +import qualified Web.ClientSession as CS +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString as B +import qualified Data.Text as T +import qualified Data.Text.Encoding as TE +import Blaze.ByteString.Builder.Char.Utf8 (fromText) +import Blaze.ByteString.Builder (Builder) +import Control.Arrow ((***)) +import Control.Concurrent +#ifdef WITH_WEBAPP_SECURE +import Data.SecureMem +import Data.Byteable +#endif +#ifdef __ANDROID__ +import Data.Endian +#endif +#if defined(__ANDROID__) || defined (mingw32_HOST_OS) +#else +import Control.Exception (bracketOnError) +#endif + +localhost :: HostName +localhost = "localhost" + +{- Builds a command to use to start or open a web browser showing an url. -} +browserProc :: String -> CreateProcess +#ifdef darwin_HOST_OS +browserProc url = proc "open" [url] +#else +#ifdef __ANDROID__ +-- Warning: The `am` command does not work very reliably on Android. +browserProc url = proc "am" + ["start", "-a", "android.intent.action.VIEW", "-d", url] +#else +#ifdef mingw32_HOST_OS +-- Warning: On Windows, no quoting or escaping of the url seems possible, +-- so spaces in it will cause problems. One approach is to make the url +-- be a relative filename, and adjust the returned CreateProcess to change +-- to the directory it's in. +browserProc url = proc "cmd" ["/c start " ++ url] +#else +browserProc url = proc "xdg-open" [url] +#endif +#endif +#endif + +{- Binds to a socket on localhost, or possibly a different specified + - hostname or address, and runs a webapp on it. + - + - An IO action can also be run, to do something with the address, + - such as start a web browser to view the webapp. + -} +runWebApp :: Maybe TLSSettings -> Maybe HostName -> Wai.Application -> (SockAddr -> IO ()) -> IO () +runWebApp tlssettings h app observer = withSocketsDo $ do + sock <- getSocket h + void $ forkIO $ go webAppSettings sock app + sockaddr <- fixSockAddr <$> getSocketName sock + observer sockaddr + where +#ifdef WITH_WEBAPP_SECURE + go = (maybe runSettingsSocket (\ts -> runTLSSocket ts) tlssettings) +#else + go = runSettingsSocket +#endif + +fixSockAddr :: SockAddr -> SockAddr +#ifdef __ANDROID__ +{- On Android, the port is currently incorrectly returned in network + - byte order, which is wrong on little endian systems. -} +fixSockAddr (SockAddrInet (PortNum port) addr) = SockAddrInet (PortNum $ swapEndian port) addr +#endif +fixSockAddr addr = addr + +-- disable buggy sloworis attack prevention code +webAppSettings :: Settings + +#if MIN_VERSION_warp(2,1,0) +webAppSettings = setTimeout halfhour defaultSettings +#else +webAppSettings = defaultSettings { settingsTimeout = halfhour } +#endif + where + halfhour = 30 * 60 + +{- Binds to a local socket, or if specified, to a socket on the specified + - hostname or address. Selects any free port, unless the hostname ends with + - ":port" + - + - Prefers to bind to the ipv4 address rather than the ipv6 address + - of localhost, if it's available. + -} +getSocket :: Maybe HostName -> IO Socket +getSocket h = do +#if defined(__ANDROID__) || defined (mingw32_HOST_OS) + -- getAddrInfo currently segfaults on Android. + -- The HostName is ignored by this code. + when (isJust h) $ + error "getSocket with HostName not supported on this OS" + addr <- inet_addr "127.0.0.1" + sock <- socket AF_INET Stream defaultProtocol + preparesocket sock + bindSocket sock (SockAddrInet aNY_PORT addr) + use sock + where +#else + addrs <- getAddrInfo (Just hints) (Just hostname) Nothing + case (partition (\a -> addrFamily a == AF_INET) addrs) of + (v4addr:_, _) -> go v4addr + (_, v6addr:_) -> go v6addr + _ -> error "unable to bind to a local socket" + where + hostname = fromMaybe localhost h + hints = defaultHints { addrSocketType = Stream } + {- Repeated attempts because bind sometimes fails for an + - unknown reason on OSX. -} + go addr = go' 100 addr + go' :: Int -> AddrInfo -> IO Socket + go' 0 _ = error "unable to bind to local socket" + go' n addr = do + r <- tryIO $ bracketOnError (open addr) sClose (useaddr addr) + either (const $ go' (pred n) addr) return r + open addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) + useaddr addr sock = do + preparesocket sock + bindSocket sock (addrAddress addr) + use sock +#endif + preparesocket sock = setSocketOption sock ReuseAddr 1 + use sock = do + listen sock maxListenQueue + return sock + +lookupRequestField :: CI.CI B.ByteString -> Wai.Request -> B.ByteString +lookupRequestField k req = fromMaybe "" . lookup k $ Wai.requestHeaders req + +{- Rather than storing a session key on disk, use a random key + - that will only be valid for this run of the webapp. -} +#if MIN_VERSION_yesod(1,2,0) +webAppSessionBackend :: Yesod.Yesod y => y -> IO (Maybe Yesod.SessionBackend) +#else +webAppSessionBackend :: Yesod.Yesod y => y -> IO (Maybe (Yesod.SessionBackend y)) +#endif +webAppSessionBackend _ = do + g <- newGenIO :: IO SystemRandom + case genBytes 96 g of + Left e -> error $ "failed to generate random key: " ++ show e + Right (s, _) -> case CS.initKey s of + Left e -> error $ "failed to initialize key: " ++ show e + Right key -> use key + where + timeout = 120 * 60 -- 120 minutes + use key = +#if MIN_VERSION_yesod(1,2,0) + Just . Yesod.clientSessionBackend key . fst + <$> Yesod.clientSessionDateCacher timeout +#else +#if MIN_VERSION_yesod(1,1,7) + Just . Yesod.clientSessionBackend2 key . fst + <$> Yesod.clientSessionDateCacher timeout +#else + return $ Just $ + Yesod.clientSessionBackend key timeout +#endif +#endif + +#ifdef WITH_WEBAPP_SECURE +type AuthToken = SecureMem +#else +type AuthToken = T.Text +#endif + +toAuthToken :: T.Text -> AuthToken +#ifdef WITH_WEBAPP_SECURE +toAuthToken = secureMemFromByteString . TE.encodeUtf8 +#else +toAuthToken = id +#endif + +fromAuthToken :: AuthToken -> T.Text +#ifdef WITH_WEBAPP_SECURE +fromAuthToken = TE.decodeLatin1 . toBytes +#else +fromAuthToken = id +#endif + +{- Generates a random sha512 string, encapsulated in a SecureMem, + - suitable to be used for an authentication secret. -} +genAuthToken :: IO AuthToken +genAuthToken = do + g <- newGenIO :: IO SystemRandom + return $ + case genBytes 512 g of + Left e -> error $ "failed to generate auth token: " ++ show e + Right (s, _) -> toAuthToken $ T.pack $ show $ sha512 $ L.fromChunks [s] + +{- A Yesod isAuthorized method, which checks the auth cgi parameter + - against a token extracted from the Yesod application. + - + - Note that the usual Yesod error page is bypassed on error, to avoid + - possibly leaking the auth token in urls on that page! + -} +#if MIN_VERSION_yesod(1,2,0) +checkAuthToken :: (Monad m, Yesod.MonadHandler m) => (Yesod.HandlerSite m -> AuthToken) -> m Yesod.AuthResult +#else +checkAuthToken :: forall t sub. (t -> AuthToken) -> Yesod.GHandler sub t Yesod.AuthResult +#endif +checkAuthToken extractAuthToken = do + webapp <- Yesod.getYesod + req <- Yesod.getRequest + let params = Yesod.reqGetParams req + if (toAuthToken <$> lookup "auth" params) == Just (extractAuthToken webapp) + then return Yesod.Authorized + else Yesod.sendResponseStatus unauthorized401 () + +{- A Yesod joinPath method, which adds an auth cgi parameter to every + - url matching a predicate, containing a token extracted from the + - Yesod application. + - + - A typical predicate would exclude files under /static. + -} +insertAuthToken :: forall y. (y -> AuthToken) + -> ([T.Text] -> Bool) + -> y + -> T.Text + -> [T.Text] + -> [(T.Text, T.Text)] + -> Builder +insertAuthToken extractAuthToken predicate webapp root pathbits params = + fromText root `mappend` encodePath pathbits' encodedparams + where + pathbits' = if null pathbits then [T.empty] else pathbits + encodedparams = map (TE.encodeUtf8 *** go) params' + go "" = Nothing + go x = Just $ TE.encodeUtf8 x + authparam = (T.pack "auth", fromAuthToken (extractAuthToken webapp)) + params' + | predicate pathbits = authparam:params + | otherwise = params + +{- Creates a html shim file that's used to redirect into the webapp, + - to avoid exposing the secret token when launching the web browser. -} +writeHtmlShim :: String -> String -> FilePath -> IO () +writeHtmlShim title url file = viaTmp writeFileProtected file $ genHtmlShim title url + +{- TODO: generate this static file using Yesod. -} +genHtmlShim :: String -> String -> String +genHtmlShim title url = unlines + [ "" + , "" + , ""++ title ++ "" + , "" + , "" + , "

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

" + , "" + , "" + ] diff --git a/Utility/WinLock.hs b/Utility/WinLock.hs new file mode 100644 index 000000000..369da6782 --- /dev/null +++ b/Utility/WinLock.hs @@ -0,0 +1,69 @@ +{- Windows lock files + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +module Utility.WinLock ( + lockShared, + lockExclusive, + dropLock, + waitToLock, + LockHandle +) where + +import System.Win32.Types +import System.Win32.File +import Control.Concurrent + +{- Locking is exclusive, and prevents the file from being opened for read + - or write by any other process. So for advisory locking of a file, a + - different LockFile should be used. -} +type LockFile = FilePath + +type LockHandle = HANDLE + +{- Tries to lock a file with a shared lock, which allows other processes to + - also lock it shared. Fails is the file is exclusively locked. -} +lockShared :: LockFile -> IO (Maybe LockHandle) +lockShared = openLock fILE_SHARE_READ + +{- Tries to take an exclusive lock on a file. Fails if another process has + - a shared or exclusive lock. -} +lockExclusive :: LockFile -> IO (Maybe LockHandle) +lockExclusive = openLock fILE_SHARE_NONE + +{- Windows considers just opening a file enough to lock it. This will + - create the LockFile if it does not already exist. + - + - Will fail if the file is already open with an incompatable ShareMode. + - Note that this may happen if an unrelated process, such as a virus + - scanner, even looks at the file. See http://support.microsoft.com/kb/316609 + - + - Note that createFile busy-waits to try to avoid failing when some other + - process briefly has a file open. But that would make checking locks + - much more expensive, so is not done here. Thus, the use of c_CreateFile. + -} +openLock :: ShareMode -> LockFile -> IO (Maybe LockHandle) +openLock sharemode f = do + h <- withTString f $ \c_f -> + c_CreateFile c_f gENERIC_READ sharemode (maybePtr Nothing) + oPEN_ALWAYS fILE_ATTRIBUTE_NORMAL (maybePtr Nothing) + return $ if h == iNVALID_HANDLE_VALUE + then Nothing + else Just h + +dropLock :: LockHandle -> IO () +dropLock = closeHandle + +{- If the initial lock fails, this is a BUSY wait, and does not + - guarentee FIFO order of waiters. In other news, Windows is a POS. -} +waitToLock :: IO (Maybe LockHandle) -> IO LockHandle +waitToLock locker = takelock + where + takelock = go =<< locker + go (Just lck) = return lck + go Nothing = do + threadDelay (500000) -- half a second + takelock diff --git a/Utility/WinProcess.hs b/Utility/WinProcess.hs new file mode 100644 index 000000000..4621b4fa6 --- /dev/null +++ b/Utility/WinProcess.hs @@ -0,0 +1,15 @@ +{- Windows processes + - + - Copyright 2014 Joey Hess + - + - License: BSD-2-clause + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.WinProcess where + +import Utility.PID + +foreign import ccall unsafe "terminatepid" + terminatePID :: PID -> IO () diff --git a/Utility/Yesod.hs b/Utility/Yesod.hs new file mode 100644 index 000000000..6d38ba4ed --- /dev/null +++ b/Utility/Yesod.hs @@ -0,0 +1,72 @@ +{- Yesod stuff, that's typically found in the scaffolded site. + - + - Also a bit of a compatability layer to make it easier to support yesod + - 1.1 and 1.2 in the same code base. + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, RankNTypes, FlexibleContexts #-} + +module Utility.Yesod + ( module Y + , liftH +#ifndef __NO_TH__ + , widgetFile + , hamletTemplate +#endif +#if ! MIN_VERSION_yesod(1,2,0) + , giveUrlRenderer + , Html +#endif + ) where + +#if MIN_VERSION_yesod(1,2,0) +import Yesod as Y +#else +import Yesod as Y hiding (Html) +#endif +import Assistant.WebApp.Bootstrap3 as Y hiding (bfs) +#ifndef __NO_TH__ +import Yesod.Default.Util +import Language.Haskell.TH.Syntax (Q, Exp) +#if MIN_VERSION_yesod_default(1,1,0) +import Data.Default (def) +import Text.Hamlet hiding (Html) +#endif +#endif + +#ifndef __NO_TH__ +widgetFile :: String -> Q Exp +#if ! MIN_VERSION_yesod_default(1,1,0) +widgetFile = widgetFileNoReload +#else +widgetFile = widgetFileNoReload $ def + { wfsHamletSettings = defaultHamletSettings + { hamletNewlines = AlwaysNewlines + } + } +#endif + +hamletTemplate :: FilePath -> FilePath +hamletTemplate f = globFile "hamlet" f +#endif + +{- Lift Handler to Widget -} +#if MIN_VERSION_yesod(1,2,0) +liftH :: Monad m => HandlerT site m a -> WidgetT site m a +liftH = handlerToWidget +#else +liftH :: MonadLift base m => base a -> m a +liftH = lift +#endif + +{- Misc new names for stuff. -} +#if ! MIN_VERSION_yesod(1,2,0) +giveUrlRenderer :: forall master sub. HtmlUrl (Route master) -> GHandler sub master RepHtml +giveUrlRenderer = hamletToRepHtml + +type Html = RepHtml +#endif diff --git a/Utility/libdiskfree.c b/Utility/libdiskfree.c new file mode 100644 index 000000000..b531435df --- /dev/null +++ b/Utility/libdiskfree.c @@ -0,0 +1,92 @@ +/* disk free space checking, C mini-library + * + * Copyright 2012, 2014 Joey Hess + * + * License: BSD-2-clause + */ + +/* Include appropriate headers for the OS, and define what will be used to + * check the free space. */ +#if defined(__APPLE__) +# include +# include +/* In newer OSX versions, statfs64 is deprecated, in favor of statfs, + * which is 64 bit only with a build option -- but statfs64 still works, + * and this keeps older OSX also supported. */ +# define STATCALL statfs64 +# define STATSTRUCT statfs64 +#else +#if defined (__FreeBSD__) +# include +# include +# define STATCALL statfs /* statfs64 not yet tested on a real FreeBSD machine */ +# define STATSTRUCT statfs +#else +#if defined __ANDROID__ +# warning free space checking code not available for Android +# define UNKNOWN +#else +#if defined (__linux__) || defined (__FreeBSD_kernel__) +/* Linux or Debian kFreeBSD */ +/* This is a POSIX standard, so might also work elsewhere too. */ +# include +# define STATCALL statvfs +# define STATSTRUCT statvfs +#else +# warning free space checking code not available for this OS +# define UNKNOWN +#endif +#endif +#endif +#endif + +#include +#include + +unsigned long long int get(const char *path, int req) { +#ifdef UNKNOWN + errno = 1; + return 0; +#else + unsigned long long int v, blocksize; + struct STATSTRUCT buf; + + if (STATCALL(path, &buf) != 0) + return 0; /* errno is set */ + else + errno = 0; + + switch (req) { + case 0: + v = buf.f_blocks; + break; + case 1: + v = buf.f_bavail; + break; + default: + v = 0; + } + + blocksize = buf.f_bsize; + return v * blocksize; +#endif +} + +/* Checks the amount of disk that is available to regular (non-root) users. + * (If there's an error, or this is not supported, + * returns 0 and sets errno to nonzero.) + */ +unsigned long long int diskfree(const char *path) { + return get(path, 1); +} + +/* Gets the total size of the disk. */ +unsigned long long int disksize(const char *path) { + return get(path, 0); +} + +/* +main () { + printf("%lli\n", diskfree(".")); +} +*/ diff --git a/Utility/libdiskfree.h b/Utility/libdiskfree.h new file mode 100644 index 000000000..e5b84754f --- /dev/null +++ b/Utility/libdiskfree.h @@ -0,0 +1 @@ +unsigned long long int diskfree(const char *path); diff --git a/Utility/libkqueue.c b/Utility/libkqueue.c new file mode 100644 index 000000000..8e33d2885 --- /dev/null +++ b/Utility/libkqueue.c @@ -0,0 +1,74 @@ +/* kqueue interface, C mini-library + * + * Copyright 2012 Joey Hess + * + * License: BSD-2-clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* The specified fds are added to the set of fds being watched for changes. + * Fds passed to prior calls still take effect, so it's most efficient to + * not pass the same fds repeatedly. + * + * Returns the fd that changed, or -1 on error. + */ +signed int helper(const int kq, const int fdcnt, const int *fdlist, int nodelay) { + int i, nev; + struct kevent evlist[1]; + struct kevent chlist[fdcnt]; + struct timespec avoiddelay = {0, 0}; + struct timespec *timeout = nodelay ? &avoiddelay : NULL; + + for (i = 0; i < fdcnt; i++) { + EV_SET(&chlist[i], fdlist[i], EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_CLEAR, + NOTE_WRITE, + 0, 0); + } + + nev = kevent(kq, chlist, fdcnt, evlist, 1, timeout); + if (nev == 1) + return evlist[0].ident; + else + return -1; +} + +/* Initializes a new, empty kqueue. */ +int init_kqueue() { + int kq; + if ((kq = kqueue()) == -1) { + perror("kqueue"); + exit(1); + } + return kq; +} + +/* Adds fds to the set that should be watched. */ +void addfds_kqueue(const int kq, const int fdcnt, const int *fdlist) { + helper(kq, fdcnt, fdlist, 1); +} + +/* Waits for a change event on a kqueue. */ +signed int waitchange_kqueue(const int kq) { + return helper(kq, 0, NULL, 0); +} + +/* +main () { + int list[1]; + int kq; + list[0]=open(".", O_RDONLY); + kq = init_kqueue(); + addfds_kqueue(kq, 1, list) + printf("change: %i\n", waitchange_kqueue(kq)); +} +*/ diff --git a/Utility/libkqueue.h b/Utility/libkqueue.h new file mode 100644 index 000000000..692b47f14 --- /dev/null +++ b/Utility/libkqueue.h @@ -0,0 +1,3 @@ +int init_kqueue(); +void addfds_kqueue(const int kq, const int fdcnt, const int *fdlist); +signed int waitchange_kqueue(const int kq); diff --git a/Utility/libmounts.c b/Utility/libmounts.c new file mode 100644 index 000000000..8669f33ea --- /dev/null +++ b/Utility/libmounts.c @@ -0,0 +1,103 @@ +/* mounted filesystems, C mini-library + * + * Copyright (c) 1980, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2001 + * David Rufino + * Copyright 2012 + * Joey Hess + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "libmounts.h" + +#ifdef GETMNTENT +/* direct passthrough the getmntent */ +FILE *mounts_start (void) { + return setmntent("/etc/mtab", "r"); +} +int mounts_end (FILE *fp) { + return endmntent(fp); +} +struct mntent *mounts_next (FILE *fp) { + return getmntent(fp); +} +#endif + +#ifdef GETMNTINFO +/* getmntent emulation using getmntinfo */ +FILE *mounts_start (void) { + return ((FILE *)0x1); /* dummy non-NULL FILE pointer, not used */ +} +int mounts_end (FILE *fp) { + return 1; +} + +static struct mntent _mntent; + +static struct mntent *statfs_to_mntent (struct statfs *mntbuf) { + _mntent.mnt_fsname = mntbuf->f_mntfromname; + _mntent.mnt_dir = mntbuf->f_mntonname; + _mntent.mnt_type = mntbuf->f_fstypename; + + _mntent.mnt_opts = '\0'; + _mntent.mnt_freq = 0; + _mntent.mnt_passno = 0; + + return (&_mntent); +} + +static int pos = -1; +static int mntsize = -1; +struct statfs *mntbuf = NULL; + +struct mntent *mounts_next (FILE *fp) { + + if (pos == -1 || mntsize == -1) + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + ++pos; + if (pos == mntsize) { + pos = mntsize = -1; + mntbuf = NULL; + return NULL; + } + + return (statfs_to_mntent(&mntbuf[pos])); +} +#endif + +#ifdef UNKNOWN +/* dummy, do-nothing version */ +FILE *mounts_start (void) { + return ((FILE *)0x1); +} +int mounts_end (FILE *fp) { + return 1; +} +struct mntent *mounts_next (FILE *fp) { + return NULL; +} +#endif diff --git a/Utility/libmounts.h b/Utility/libmounts.h new file mode 100644 index 000000000..24df55f31 --- /dev/null +++ b/Utility/libmounts.h @@ -0,0 +1,38 @@ +/* Include appropriate headers for the OS, and define what will be used. */ +#if defined (__FreeBSD__) || defined (__APPLE__) +# include +# include +# include +# define GETMNTINFO +#else +#if defined __ANDROID__ +/* Android is handled by the Haskell code, not here. */ +# define UNKNOWN +#else +#if defined (__linux__) || defined (__FreeBSD_kernel__) +/* Linux or Debian kFreeBSD */ +#include +# define GETMNTENT +#else +# warning mounts listing code not available for this OS +# define UNKNOWN +#endif +#endif +#endif + +#include + +#ifndef GETMNTENT +struct mntent { + char *mnt_fsname; + char *mnt_dir; + char *mnt_type; + char *mnt_opts; /* not filled in */ + int mnt_freq; /* not filled in */ + int mnt_passno; /* not filled in */ +}; +#endif + +FILE *mounts_start (void); +int mounts_end (FILE *fp); +struct mntent *mounts_next (FILE *fp); diff --git a/Utility/winprocess.c b/Utility/winprocess.c new file mode 100644 index 000000000..b6e315573 --- /dev/null +++ b/Utility/winprocess.c @@ -0,0 +1,10 @@ +#include + +void terminatepid (DWORD pid) { + HANDLE h; + h = OpenProcess(PROCESS_TERMINATE, 0, pid); + if (h != NULL) { + TerminateProcess(h, 1); + } + CloseHandle(h); +} diff --git a/build.bat b/build.bat new file mode 100644 index 000000000..66a7e1f06 --- /dev/null +++ b/build.bat @@ -0,0 +1 @@ +C:\MINGW\MSYS\1.0\BIN\SH.EXE standalone/windows/build-simple.sh diff --git a/configure.hs b/configure.hs new file mode 100644 index 000000000..15833e62a --- /dev/null +++ b/configure.hs @@ -0,0 +1,6 @@ +{- configure program -} + +import Build.Configure + +main :: IO () +main = run tests diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 000000000..1266bae20 --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,44 @@ +git-annex (4.20131002) unstable; urgency=low + + The layout of gcrypt repositories has changed, and + if you created one you must manually upgrade it. + See /usr/share/doc/git-annex/html/upgrades/gcrypt.html + + -- Joey Hess Tue, 24 Sep 2013 13:55:23 -0400 + +git-annex (3.20120123) unstable; urgency=low + + There was a bug in the handling of directory special remotes that + could cause partial file contents to be stored in them. If you use + a directory special remote, you should fsck it, to avoid potential + data loss. + + Example: git annex fsck --from mydirectory + + -- Joey Hess Thu, 19 Jan 2012 15:24:23 -0400 + +git-annex (3.20110624) experimental; urgency=low + + There has been another change to the git-annex data store. + Use `git annex upgrade` to migrate your repositories to the new + layout. See or + /usr/share/doc/git-annex/html/upgrades.html + + The significant change this time is that the .git-annex/ directory + is gone; instead there is a git-annex branch that is automatically + maintained by git-annex, and encapsulates all its state nicely out + of your way. + + You should make sure you include the git-annex branch when + git pushing and pulling. + + -- Joey Hess Tue, 21 Jun 2011 20:18:00 -0400 + +git-annex (0.20110316) experimental; urgency=low + + This version reorganises the layout of git-annex's files in your repository. + There is an upgrade process to convert a repository from the old git-annex + to this version. See or + /usr/share/doc/git-annex/html/upgrades.html + + -- Joey Hess Wed, 16 Mar 2011 15:49:15 -0400 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 000000000..81d222d07 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,3200 @@ +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). + + -- Joey Hess Thu, 17 Jul 2014 11:27:25 -0400 + +git-annex (5.20140709) unstable; urgency=medium + + * Fix race in direct mode merge code that could cause all files in the + repository to be removed. It should be able to recover repositories + experiencing this bug without data loss. See: + http://git-annex.branchable.com/bugs/bad_merge_commit_deleting_all_files/ + * Fix git version that supported --no-gpg-sign. + * Fix bug in automatic merge conflict resolution, when one side is an + annexed symlink, and the other side is a non-annexed symlink. + * Really fix bug that caused the assistant to make many unncessary + empty merge commits. + + -- Joey Hess Wed, 09 Jul 2014 15:28:03 -0400 + +git-annex (5.20140707) unstable; urgency=medium + + * assistant: Fix bug, introduced in last release, that caused the assistant + to make many unncessary empty merge commits. + * assistant: Fix one-way assistant->assistant sync in direct mode. + * Fix bug in annex.queuesize calculation that caused much more + queue flushing than necessary. + * importfeed: When annex.genmetadata is set, metadata from the feed + is added to files that are imported from it. + * Support users who have set commit.gpgsign, by disabling gpg signatures + for git-annex branch commits and commits made by the assistant. + * Fix memory leak when committing millions of changes to the git-annex + branch, eg after git-annex add has run on 2 million files in one go. + * Support building with bloomfilter 2.0.0. + * Run standalone install process when the assistant is started + (was only being run when the webapp was opened). + * Android: patch git to avoid fchmod, which fails on /sdcard. + * Windows: Got rid of that pesky DOS box when starting the webapp. + * Windows: Added Startup menu item so assistant starts automatically + on login. + * Windows: Fix opening file browser from webapp when repo is in a + directory with spaces. + * Windows: Assistant now logs to daemon.log. + + -- Joey Hess Mon, 07 Jul 2014 12:24:13 -0400 + +git-annex (5.20140613) unstable; urgency=medium + + * Ignore setsid failures. + * Avoid leaving behind .tmp files when failing in some cases, including + importing files to a disk that is full. + * Avoid bad commits after interrupted direct mode sync (or merge). + * Fix build with wai 0.3.0. + * Deal with FAT's low resolution timestamps, which in combination with + Linux's caching of higher res timestamps while a FAT is mounted, caused + direct mode repositories on FAT to seem to have modified files after + they were unmounted and remounted. + * Windows: Fix opening webapp when repository is in a directory with + spaces in the path. + * Detect when Windows has lost its mind in a timezone change, and + automatically apply a delta to the timestamps it returns, to get back to + sane values. + + -- Joey Hess Fri, 13 Jun 2014 09:58:07 -0400 + +git-annex (5.20140606) unstable; urgency=medium + + * webapp: When adding a new local repository, fix bug that caused its + group and preferred content to be set in the current repository, + even when not combining. + * webapp: Avoid stomping on existing description, group and + preferred content settings when enabling or combining with + an already existing remote. + * assistant: Make sanity checker tmp dir cleanup code more robust. + * unused: Avoid checking view branches for unused files. + * webapp: Include ssh port in mangled hostname. + * Windows: Fix bug introduced in last release that caused files + in the git-annex branch to have lines teminated with \r. + * Windows: Fix retrieving of files from local bare git repositories. + + -- Joey Hess Fri, 06 Jun 2014 12:54:06 -0400 + +git-annex (5.20140529) unstable; urgency=medium + + * Fix encoding of data written to git-annex branch. Avoid truncating + unicode characters to 8 bits. Allow any encoding to be used, as with + filenames (but utf8 is the sane choice). Affects metadata and repository + descriptions, and preferred content expressions. + * assistant: When there are multiple remotes giving different ways + to access the same repository, honor remote cost settings and use + the cheapest available. + * webapp: More robust startup when annex directory is not a git repo. + * initremote/enableremote: Basic support for using with regular git remotes; + initremote stores the location of an already existing git remote, + and enableremote setups up a remote using its stored location. + * webapp: Support for enabling known git repositories on ssh servers. + The repository must have been added using initremote. + * webapp: When setting up a ssh remote, record it using initremote, + so that it can be easily enabled elsewhere. + * webapp: When setting up a ssh remote, if the user inputs ~/foo, + normalize that to foo, since it's in the home directory by default. + * Use exceptions in place of deprecated MonadCatchIO-transformers + Thanks, Ben Gamari. + * android: Run busybox install with -s, since some versions of Android + prohibit making hard links. + * Android webapp: Fix EvilSplicer bugs that mangled the css files, + preventing icons from displaying, and also slightly broke the js files. + + -- Joey Hess Thu, 29 May 2014 14:41:56 -0400 + +git-annex (5.20140517) unstable; urgency=medium + + * webapp: Switched to bootstrap 3. + Thanks, Sören Brunk. + * Standalone builds now check gpg signatures before upgrading. + * Simplified repository description line format. The remote name, + if any, is always in square brackets after the description. + * assistant: Clean up stale tmp files on startup. + * webapp: Better ssh password prompting. + * Depend on git-remote-gcrypt 0.20130908-6. Older versions + fail when the assistant is run with no controlling tty. + * Added ddar special remote. + Thanks, Robie Basak. + * webapp: Fixed drag and drop to reorder the list of remotes. + * group: When no groups are specified to set, lists the current groups + of a repository. + * Add remote.$name.annex-shell configuration. + Thanks, Fraser Tweedale + * Support symlinking git-annex and git-annex-shell + from the Linux standalone bundle into PATH. + Thanks, jlebar. + + -- Joey Hess Sat, 17 May 2014 13:30:39 -0400 + +git-annex (5.20140421) unstable; urgency=medium + + * assistant: Now detects immediately when other repositories push + changes to a ssh remote, and pulls. + ** XMPP is no longer needed in this configuration! ** + This requires the remote server have git-annex-shell with + notifychanges support (>= 5.20140405) + * webapp: Show a network signal icon next to ssh and xmpp remotes that + it's currently connected with. + * webapp: Rework xmpp nudge to prompt for either xmpp or a ssh remote + to be set up. + * sync, assistant, remotedaemon: Use ssh connection caching for git pushes + and pulls. + * remotedaemon: When network connection is lost, close all cached ssh + connections. + * Improve handling of monthly/yearly scheduling. + * Avoid depending on shakespeare except for when building the webapp. + * uninit: Avoid making unncessary copies of files. + * info: Allow use in a repository where annex.uuid is not set. + * reinit: New command that can initialize a new repository using + the configuration of a previously known repository. + Useful if a repository got deleted and you want + to clone it back the way it was. + * drop --from: When local repository is untrusted, its copy of a file does + not count. + * Bring back rsync -p, but only when git-annex is running on a non-crippled + file system. This is a better approach to fix #700282 while not + unncessarily losing file permissions on non-crippled systems. + * webapp: Start even if the current directory is listed in + ~/.config/git-annex/autostart but no longer has a git repository in it. + * findref: New command, like find but shows files in a specified git ref. + * webapp: Fix UI for removing XMPP connection. + * When init detects that git is not configured to commit, and sets + user.email to work around the problem, also make it set user.name. + * webapp: Support using git-annex on a remote server, which was installed + from the standalone tarball or OSX app, and so does not have + git-annex in PATH (and may also not have git or rsync in PATH). + * standalone tarball, OSX app: Install a ~/.ssh/git-annex-wrapper, which + can be used to run git-annex, git, rsync, etc. + + -- Joey Hess Sun, 20 Apr 2014 19:43:14 -0400 + +git-annex (5.20140412) unstable; urgency=high + + * Last release didn't quite fix the high cpu issue in all cases, this should. + + -- Joey Hess Fri, 11 Apr 2014 17:14:38 -0400 + +git-annex (5.20140411) unstable; urgency=high + + * importfeed: Filename template can now contain an itempubdate variable. + Needs feed 0.3.9.2. + * Fix rsync progress parsing in locales that use comma in number display. + Closes: #744148 + * assistant: Fix high CPU usage triggered when a monthly fsck is scheduled, + and the last time the job ran was a day of the month > 12. This caused a + runaway loop. Thanks to Anarcat for his assistance, and to Maximiliano + Curia for identifying the cause of this bug. + * Remove wget from OSX dmg, due to issues with cert paths that broke + git-annex automatic upgrading. Instead, curl is used, unless the + OSX system has wget installed, which will then be used. + + -- Joey Hess Fri, 11 Apr 2014 14:59:49 -0400 + +git-annex (5.20140405) unstable; urgency=medium + + * git-annex-shell: Added notifychanges command. + * Improve display of dbus notifications. Thanks, Johan Kiviniemi. + * Fix nautilus script installation to not crash when the nautilus script dir + does not exist. Instead, only install scripts when the directory already + exists. + + -- Joey Hess Sat, 05 Apr 2014 16:54:33 -0400 + +git-annex (5.20140402) unstable; urgency=medium + + * unannex, uninit: Avoid committing after every file is unannexed, + for massive speedup. + * --notify-finish switch will cause desktop notifications after each + file upload/download/drop completes + (using the dbus Desktop Notifications Specification) + * --notify-start switch will show desktop notifications when each + file upload/download starts. + * webapp: Automatically install Nautilus integration scripts + to get and drop files. + * tahoe: Pass -d parameter before subcommand; putting it after + the subcommand no longer works with tahoe-lafs version 1.10. + (Thanks, Alberto Berti) + * forget --drop-dead: Avoid removing the dead remote from the trust.log, + so that if git remotes for it still exist anywhere, git annex info + will still know it's dead and not show it. + * git-annex-shell: Make configlist automatically initialize + a remote git repository, as long as a git-annex branch has + been pushed to it, to simplify setup of remote git repositories, + including via gitolite. + * add --include-dotfiles: New option, perhaps useful for backups. + * Version 5.20140227 broke creation of glacier repositories, + not including the datacenter and vault in their configuration. + This bug is fixed, but glacier repositories set up with the broken + version of git-annex need to have the datacenter and vault set + in order to be usable. This can be done using git annex enableremote + to add the missing settings. For details, see + http://git-annex.branchable.com/bugs/problems_with_glacier/ + * Added required content configuration. + * assistant: Improve ssh authorized keys line generated in local pairing + or for a remote ssh server to set environment variables in an + alternative way that works with the non-POSIX fish shell, as well + as POSIX shells. + + -- Joey Hess Wed, 02 Apr 2014 16:42:53 -0400 + +git-annex (5.20140320) unstable; urgency=medium + + * Fix zombie leak and general inneficiency when copying files to a + local git repo. + * Fix ssh connection caching stop method to work with openssh 6.5p1, + which broke the old method. + * webapp: Added a "Sync now" item to each repository's menu. + * webapp: Use securemem for constant time auth token comparisons. + * copy --fast --to remote: Avoid printing anything for files that + are already believed to be present on the remote. + * Commands that allow specifying which repository to act on using + the repository's description will now fail when multiple repositories + match, rather than picking a repository at random. + (So will --in=) + * Better workaround for problem umasks when eg, setting up ssh keys. + * "standard" can now be used as a first-class keyword in preferred content + expressions. For example "standard or (include=otherdir/*)" + * groupwanted can be used in preferred content expressions. + * vicfg: Allows editing preferred content expressions for groups. + * Improve behavior when unable to parse a preferred content expression + (thanks, ion). + * metadata: Add --get + * metadata: Support --key option (and some other ones like --all) + * For each metadata field, there's now an automatically maintained + "$field-lastchanged" that gives the date of the last change to that + field. Also the "lastchanged" field for the date of the last change + to any of a file's metadata. + * unused: In direct mode, files that are deleted from the work tree + and so have no content present are no longer incorrectly detected as + unused. + * Avoid encoding errors when using the unused log file. + * map: Fix crash when one of the remotes of a repo is a local directory + that does not exist, or is not a git repo. + * repair: Improve memory usage when git fsck finds a great many broken + objects. + * Windows: Fix some filename encoding bugs. + * rsync special remote: Fix slashes when used on Windows. + + -- Joey Hess Thu, 20 Mar 2014 13:21:12 -0400 + +git-annex (5.20140306) unstable; urgency=high + + * sync: Fix bug in direct mode that caused a file that was not + checked into git to be deleted when there was a conflicting + merge with a remote. + * webapp: Now supports HTTPS. + * webapp: No longer supports a port specified after --listen, since + it was buggy, and that use case is better supported by setting up HTTPS. + * annex.listen can be configured, instead of using --listen + * annex.startupscan can be set to false to disable the assistant's startup + scan. + * Probe for quvi version at run time. + * webapp: Filter out from Switch Repository list any + repositories listed in autostart file that don't have a + git directory anymore. (Or are bare) + * webapp: Refuse to start in a bare git repository. + * assistant --autostart: Refuse to start in a bare git repository. + * webapp: Don't list the public repository group when editing a + git repository; it only makes sense for special remotes. + * view, vfilter: Add support for filtering tags and values out of a view, + using !tag and field!=value. + * vadd: Allow listing multiple desired values for a field. + * view: Refuse to enter a view when no branch is currently checked out. + * metadata: To only set a field when it's not already got a value, use + -s field?=value + * Run .git/hooks/pre-commit-annex whenever a commit is made. + * sync: Automatically resolve merge conflict between and annexed file + and a regular git file. + * glacier: Pass --region to glacier checkpresent. + * webdav: When built with a new enough haskell DAV (0.6), disable + the http response timeout, which was only 5 seconds. + * webapp: Include no-pty in ssh authorized_keys lines. + * assistant: Smarter log file rotation, which takes free disk space + into account. + + -- Joey Hess Thu, 06 Mar 2014 12:28:04 -0400 + +git-annex (5.20140227) unstable; urgency=medium + + * metadata: Field names limited to alphanumerics and a few whitelisted + punctuation characters to avoid issues with views, etc. + * metadata: Field names are now case insensative. + * When constructing views, metadata is available about the location of the + file in the view's reference branch. Allows incorporating parts of the + directory hierarchy in a view. + For example `git annex view tag=* podcasts/=*` makes a view in the form + tag/showname. + * --metadata field=value can now use globs to match, and matches + case insensatively, the same as git annex view field=value does. + * annex.genmetadata can be set to make git-annex automatically set + metadata (year and month) when adding files. + * Make annex.web-options be used in several places that call curl. + * Fix handling of rsync remote urls containing a username, + including rsync.net. + * Preserve metadata when staging a new version of an annexed file. + * metadata: Support --json + * webapp: Fix creation of box.com and Amazon S3 and Glacier + repositories, broken in 5.20140221. + * webdav: When built with DAV 0.6.0, use the new DAV monad to avoid + locking files, which is not needed by git-annex's use of webdav, and + does not work on Box.com. + * webdav: Fix path separator bug when used on Windows. + * repair: Optimise unpacking of pack files, and avoid repeated error + messages about corrupt pack files. + * Add build dep on regex-compat to fix build on mipsel, which lacks + regex-tdfa. + * Disable test suite on sparc, which is missing optparse-applicative. + * Put non-object tmp files in .git/annex/misctmp, leaving .git/annex/tmp + for only partially transferred objects. + + -- Joey Hess Thu, 27 Feb 2014 11:34:19 -0400 + +git-annex (5.20140221) unstable; urgency=medium + + * metadata: New command that can attach metadata to files. + * --metadata can be used to limit commands to acting on files + that have particular metadata. + * Preferred content expressions can use metadata=field=value + to limit them to acting on files that have particular metadata. + * view: New command that creates and checks out a branch that provides + a structured view of selected metadata. + * vfilter, vadd, vpop, vcycle: New commands for operating within views. + * pre-commit: Update metadata when committing changes to locations + of annexed files within a view. + * Add progress display for transfers to/from external special remotes. + * unused: Fix to actually detect unused keys when in direct mode. + * fsck: When run with --all or --unused, while .gitattributes + annex.numcopies cannot be honored since it's operating on keys + instead of files, make it honor the global numcopies setting, + and the annex.numcopies git config setting. + * trust, untrust, semitrust, dead: Warn when the trust level is + overridden in .git/config. + * glacier: Do not try to run glacier value create when an existing glacier + remote is enabled. + * fsck: Refuse to do anything if more than one of --incremental, --more, + and --incremental-schedule are given, since it's not clear which option + should win. + * Windows webapp: Can set up box.com, Amazon S3, and rsync.net remotes + * Windows webapp: Can create repos on removable drives. + * Windows: Ensure HOME is set, as needed by bundled cygwin utilities. + + -- Joey Hess Fri, 21 Feb 2014 11:23:59 -0400 + +git-annex (5.20140210) unstable; urgency=medium + + * --in can now refer to files that were located in a repository at + some past date. For example, --in="here@{yesterday}" + * Fixed direct mode annexed content locking code, which is used to + guard against recursive file drops. + * This is the first beta-level release of the Windows port with important + fixes (see below). + (The webapp and assistant are still alpha-level on Windows.) + * sync --content: Honor annex-ignore configuration. + * sync: Don't try to sync with xmpp remotes, which are only currently + supported when using the assistant. + * sync --content: Re-pull from remotes after downloading content, + since that can take a while and other changes may be pushed in the + meantime. + * sync --content: Reuse smart copy code from copy command, including + handling and repairing out of date location tracking info. + Closes: #737480 + * sync --content: Drop files from remotes that don't want them after + getting them. + * sync: Fix bug in automatic merge conflict resolution code when used + on a filesystem not supporting symlinks, which resulted in it losing + track of the symlink bit of annexed files. + * Added ways to configure rsync options to be used only when uploading + or downloading from a remote. Useful to eg limit upload bandwidth. + * Fix initremote with encryption=pubkey to work with S3, glacier, webdav, + and external special remotes. + * Avoid building with DAV 0.6 which is badly broken (see #737902). + * Fix dropping of unused keys with spaces in their name. + * Fix build on platforms not supporting the webapp. + * Document in man page that sshcaching uses ssh ControlMaster. + Closes: #737476 + * Windows: It's now safe to run multiple git-annex processes concurrently + on Windows; the lock files have been sorted out. + * Windows: Avoid using unix-compat's rename, which refuses to rename + directories. + * Windows: Fix deletion of repositories by test suite and webapp. + * Windows: Test suite 100% passes again. + * Windows: Fix bug in symlink calculation code. + * Windows: Fix handling of absolute unix-style git repository paths. + * Android: Avoid crashing when unable to set file mode for ssh config file + due to Android filesystem horribleness. + + -- Joey Hess Mon, 10 Feb 2014 12:54:57 -0400 + +git-annex (5.20140127) unstable; urgency=medium + + * sync --content: New option that makes the content of annexed files be + transferred. Similar to the assistant, this honors any configured + preferred content expressions. + * Remove --json option from commands not supporting it. + * status: Support --json. + * list: Fix specifying of files to list. + * Allow --all to be mixed with matching options like --copies and --in + (but not --include and --exclude). + * numcopies: New command, sets global numcopies value that is seen by all + clones of a repository. + * The annex.numcopies git config setting is deprecated. Once the numcopies + command is used to set the global number of copies, any annex.numcopies + git configs will be ignored. + * assistant: Make the prefs page set the global numcopies. + * Add lackingcopies, approxlackingcopies, and unused to + preferred content expressions. + * Client, transfer, incremental backup, and archive repositories + now want to get content that does not yet have enough copies. + * Client, transfer, and source repositories now do not want to retain + unused file contents. + * assistant: Checks daily for unused file contents, and when possible + moves them to a repository (such as a backup repository) that + wants to retain them. + * assistant: annex.expireunused can be configured to cause unused + file contents to be deleted after some period of time. + * webapp: Nudge user to see if they want to expire old unused file + contents when a lot of them seem to be piling up in the repository. + * repair: Check git version at run time. + * assistant: Run the periodic git gc in batch mode. + * added annex.secure-erase-command config option. + * test suite: Use tasty-rerun, and expose tasty command-line options. + * Optimise non-bare http remotes; no longer does a 404 to the wrong + url every time before trying the right url. Needs annex-bare to be + set to false, which is done when initially probing the uuid of a + http remote. + * webapp: After upgrading a git repository to git-annex, fix + bug that made it temporarily not be synced with. + * whereis: Support --all. + * All commands that support --all also support a --key option, + which limits them to acting on a single key. + + -- Joey Hess Mon, 27 Jan 2014 13:43:28 -0400 + +git-annex (5.20140117) unstable; urgency=medium + + * Really fix FTBFS on mipsel and sparc due to test suite not being available + on those architectures. + + -- Joey Hess Fri, 17 Jan 2014 14:46:27 -0400 + +git-annex (5.20140116) unstable; urgency=medium + + * Added tahoe special remote. + * external special remote protocol: Added GETGITDIR, and GETAVAILABILITY. + * Refuse to build with git older than 1.7.1.1, which is needed for + git checkout -B + * map: Fix display of v5 direct mode repos. + * repair: Support old git versions from before git fsck --no-dangling was + implemented. + * Fix a long-standing bug that could cause the wrong index file to be used + when committing to the git-annex branch, if GIT_INDEX_FILE is set in the + environment. This typically resulted in git-annex branch log files being + committed to the master branch and later showing up in the work tree. + (These log files can be safely removed.) + * assistant: Detect if .git/annex/index is corrupt at startup, and + recover. + * repair: Fix bug in packed refs file exploding code that caused a .gitrefs + directory to be created instead of .git/refs + * Fix FTBFS on mipsel and sparc due to test suite not being available + on those architectures. + * Android: Avoid passing --clobber to busybox wget. + + -- Joey Hess Thu, 16 Jan 2014 11:34:54 -0400 + +git-annex (5.20140107) unstable; urgency=medium + + * mirror: Support --all (and --unused). + * external special remote protocol: Added GETUUID, GETWANTED, SETWANTED, + SETSTATE, GETSTATE, DEBUG. + * Windows: Fix bug in direct mode merge code that could cause files + in subdirectories to go missing. + * Windows: Avoid eating stdin when running ssh to add a authorized key, + since this is used for password prompting. + * Avoid looping if long-running git cat-file or git hash-object crashes + and keeps crashing when restarted. + * Assistant: Remove stale MERGE_HEAD files in lockfile cleanup. + * Remotes can now be made read-only, by setting remote..annex-readonly + * wanted, schedule: Avoid printing "ok" after requested value. + * assistant: Ensure that .ssh/config and .ssh/authorized_keys are not + group or world writable when writing to those files, as that can make + ssh refuse to use them, if it allows another user to write to them. + * addurl, importfeed: Honor annex.diskreserve as long as the size of the + url can be checked. + * add: Fix rollback when disk is completely full. + * assistant: Fixed several minor memory leaks that manifested when + adding a large number of files. + * assistant: Start a new git-annex transferkeys process + after a network connection change, so that remotes that use a persistent + network connection are restarted. + * Adjust Debian build deps to match current state of sparc, mipsel. + + -- Joey Hess Tue, 07 Jan 2014 12:22:18 -0400 + +git-annex (5.20131230) unstable; urgency=medium + + * Added new external special remote interface. + * importfeed: Support youtube playlists. + * Add tasty to build-depends, so that test suite builds again. + (tasty was stuck in incoming.) + * Fix typo in test suite. + * Fix bug in Linux standalone build's shimming that broke git-annex-shell. + * Include git-receive-pack, git-upload-pack, git, and git-shell wrappers + in the Linux standalone build, and OSX app, so they will be available + when it's added to PATH. + * addurl, importfeed: Sanitize | and some other symbols and special + characters. + * Auto-upgrade v3 indirect repos to v5 with no changes. + This also fixes a problem when a direct mode repo was somehow set to v3 + rather than v4, and so the automatic direct mode upgrade to v5 was not + done. + * Android: Avoid trying to use Android's own ionice, which does not + allow specifying a command to run. Fixes transferring files to/from + android and probably a few other things. + + -- Joey Hess Mon, 30 Dec 2013 14:13:40 -0400 + +git-annex (5.20131221) unstable; urgency=low + + * assistant: Fix OSX-specific bug that caused the startup scan to try to + follow symlinks to other directories, and add their contents to the annex. + * assistant: Set StrictHostKeyChecking yes when creating ssh remotes, + and add it to the configuration for any ssh remotes previously created + by the assistant. This avoids repeated prompts by ssh if the host key + changes, instead syncing with such a remote will fail. Closes: #732602 + * Fix test suite to cover lock --force change. + * Add plumbing-level lookupkey and examinekey commands. + * find --format: Added hashdirlower, hashdirmixed, keyname, and mtime + format variables. + * assistant: Always batch changes found in startup scan. + * An armel Linux standalone build is now available, which includes the + webapp. + * Programs from Linux and OSX standalone builds can now be symlinked + into a directory in PATH as an alternative installation method, and will + use readlink to find where the build was unpacked. + * Include man pages in Linux and OSX standalone builds. + * Linux standalone build now includes its own glibc and forces the linker to + use it, to remove dependence on the host glibc. + + -- Joey Hess Sat, 21 Dec 2013 12:00:17 -0400 + +git-annex (5.20131213) unstable; urgency=low + + * Avoid using git commit in direct mode, since in some situations + it will read the full contents of files in the tree. + * assistant: Batch jobs are now run with ionice and nocache, when + those commands are available. + * assistant: Run transferkeys as batch jobs. + * Automatically fix up bad bare repositories created by + versions 5.20131118 through 5.20131127. + * rsync special remote: Fix fallback mode for rsync remotes that + use hashDirMixed. Closes: #731142 + * copy --from, get --from: When --force is used, ignore the + location log and always try to get the file from the remote. + * Deal with box.com changing the url of their webdav endpoint. + * Android: Fix SRV record lookups for XMPP to use android getprop + command to find DNS server, since there is no resolv.conf. + * import: Add --skip-duplicates option. + * lock: Require --force. Closes: #731606 + * import: better handling of overwriting an existing file/directory/broken + link when importing + * Windows: assistant and webapp work! (very experimental) + * Windows: Support annex.diskreserve. + * Fix bad behavior in Firefox, which was caused by an earlier fix to + bad behavior in Chromium. + * repair: Improve repair of git-annex index file. + * repair: Remove damaged git-annex sync branches. + * status: Ignore new files that are gitignored. + * Fix direct mode's handling when modifications to non-annexed files + are pulled from a remote. A bug prevented the files from being updated + in the work tree, and this caused the modification to be reverted. + * OSX: Remove ssh and ssh-keygen from dmg as they're included in OSX by + default. + + -- Joey Hess Fri, 13 Dec 2013 14:20:32 -0400 + +git-annex (5.20131130) unstable; urgency=low + + * init: Fix a bug that caused git annex init, when run in a bare + repository, to set core.bare=false. + + -- Joey Hess Sat, 30 Nov 2013 16:32:35 -0400 + +git-annex (5.20131127.1) unstable; urgency=low + + * Rebuild that does not try to use quvi 0.9 from experimental. + + -- Joey Hess Thu, 28 Nov 2013 07:57:36 -0400 + +git-annex (5.20131127) unstable; urgency=low + + * webapp: Detect when upgrades are available, and upgrade if the user + desires. + (Only when git-annex is installed using the prebuilt binaries + from git-annex upstream, not from eg Debian.) + * assistant: Detect when the git-annex binary is modified or replaced, + and either prompt the user to restart the program, or automatically + restart it. + * annex.autoupgrade configures both the above upgrade behaviors. + * Added support for quvi 0.9. Slightly suboptimal due to limitations in its + interface compared with the old version. + * Bug fix: annex.version did not get set on automatic upgrade to v5 direct + mode repo, so the upgrade was performed repeatedly, slowing commands down. + * webapp: Fix bug that broke switching between local repositories + that use the new guarded direct mode. + * Android: Fix stripping of the git-annex binary. + * Android: Make terminal app show git-annex version number. + * Android: Re-enable XMPP support. + * reinject: Allow to be used in direct mode. + * Futher improvements to git repo repair. Has now been tested in tens + of thousands of intentionally damaged repos, and successfully + repaired them all. + * Allow use of --unused in bare repository. + + -- Joey Hess Wed, 27 Nov 2013 18:41:44 -0400 + +git-annex (5.20131120) unstable; urgency=low + + * Fix Debian package to not try to run test suite, since haskell-tasty + is not out of new or in Build-Depends yet. + * dropunused, addunused: Allow "all" instead of a range to + act on all unused data. + * Ensure execute bit is set on directories when core.sharedrepository is set. + * Ensure that core.sharedrepository is honored when creating the .git/annex + directory. + * Improve repair code in the case where the index file is corrupt, + and this hides other problems from git fsck. + + -- Joey Hess Wed, 20 Nov 2013 12:54:18 -0400 + +git-annex (5.20131118) unstable; urgency=low + + * Direct mode repositories now have core.bare=true set, to prevent + accidentally running git commands that try to operate on the work tree, + and so do the wrong thing in direct mode. + * annex.version is now set to 5 for direct mode repositories. + This upgrade is handled fully automatically, no need to run + git annex upgrade + * The "status" command has been renamed to "info", to allow + "git annex status" to be used in direct mode repositories, now that + "git status" won't work in them. + * The -c option now not only modifies the git configuration seen by + git-annex, but it is passed along to every git command git-annex runs. + * watcher: Avoid loop when adding a file owned by someone else fails + in indirect mode because its permissions cannot be modified. + * webapp: Avoid encoding problems when displaying the daemon log file. + * webapp: Improve UI around remote that have no annex.uuid set, + either because setup of them is incomplete, or because the remote + git repository is not a git-annex repository. + * Include ssh-keygen in standalone bundle. + * Allow optionally configuring git-annex with -fEKG to enable awesome + remote monitoring interfaceat http://localhost:4242/ + * Fix bug that caused bad information to be written to the git-annex branch + when running describe or other commands with a remote that has no uuid. + * Work around Android linker problem that had prevented git-annex from + running on Android 4.3 and 4.4. + * repair: Handle case where index file is corrupt, but all objects are ok. + * assistant: Notice on startup when the index file is corrupt, and + auto-repair. + * Fix direct mode merge bug when a direct mode file was deleted and replaced + with a directory. An ordering problem caused the directory to not get + created in this case. + Thanks to Tim for the test case. + * Direct mode .git/annex/objects directories are no longer left writable, + because that allowed writing to symlinks of files that are not present, + which followed the link and put bad content in an object location. + Thanks to Tim for the test case. + * fsck: Fix up .git/annex/object directory permissions. + * Switched to the tasty test framework. + * Android: Adjust default .gitignore to ignore .thumbnails at any location + in the tree, not just at its top. + * webapp: Check annex.version. + + -- Joey Hess Mon, 18 Nov 2013 10:45:43 -0400 + +git-annex (4.20131106) unstable; urgency=low + + * Improve local pairing behavior when two computers both try to start + the pairing process separately. + * sync: Work even when the local git repository is new and empty, + with no master branch. + * gcrypt, bup: Fix bug that prevented using these special remotes + with encryption=pubkey. + * Fix enabling of gcrypt repository accessed over ssh; + git-annex-shell gcryptsetup had a bug that caused it to fail + with permission denied. + * Fix zombie process that occurred when switching between repository + views in the webapp. + * map: Work when there are gcrypt remotes. + * Fix build w/o webapp. + * Fix exception handling bug that could cause .git/annex/index to be used + for git commits outside the git-annex branch. Known to affect git-annex + when used with the git shipped with Ubuntu 13.10. + + -- Joey Hess Wed, 06 Nov 2013 11:17:47 -0400 + +git-annex (4.20131101) unstable; urgency=low + + * The "git annex content" command is renamed to "git annex wanted". + * New --want-get and --want-drop options which can be used to + test preferred content settings. + For example, "git annex find --in . --want-drop" + * assistant: When autostarted, wait 5 seconds before running the startup + scan, to avoid contending with the user's desktop login process. + * webapp: When setting up a bare shared repository, enable non-fast-forward + pushes. + * sync: Show a hint about receive.denyNonFastForwards when a push fails. + * directory, webdav: Fix bug introduced in version 4.20131002 that + caused the chunkcount file to not be written. Work around repositories + without such a file, so files can still be retreived from them. + * assistant: Automatically repair damanged git repository, if it can + be done without losing data. + * assistant: Support repairing git remotes that are locally accessible + (eg, on removable drives). + * add: Fix reversion in 4.20130827 when adding unlocked files that have + not yet been committed. + * unannex: New, much slower, but more safe behavior: Copies files out of + the annex. This avoids an unannex of one file breaking other files that + link to the same content. Also, it means that the content + remains in the annex using up space until cleaned up with + "git annex unused". + (The behavior of unannex --fast has not changed; it still hard links + to content in the annex. --fast was not made the default because it is + potentially unsafe; editing such a hard linked file can unexpectedly + change content stored in the annex.) + + -- Joey Hess Fri, 01 Nov 2013 11:34:27 -0400 + +git-annex (4.20131024) unstable; urgency=low + + * webapp: Fix bug when adding a remote and git-remote-gcrypt + is not installed. + * The assitant can now run scheduled incremental fsck jobs on the local + repository and remotes. These can be configured using vicfg or with the + webapp. + * repair: New command, which can repair damaged git repositories + (even ones not using git-annex). + * webapp: When git repository damange is detected, repairs can be + done using the webapp UI. + * Automatically and safely detect and recover from dangling + .git/annex/index.lock files, which would prevent git from + committing to the git-annex branch, eg after a crash. + * assistant: Detect stale git lock files at startup time, and remove them. + * addurl: Better sanitization of generated filenames. + * Better sanitization of problem characters when generating URL and WORM + keys. + * The control socket path passed to ssh needs to be 17 characters + shorter than the maximum unix domain socket length, because ssh + appends stuff to it to make a temporary filename. Closes: #725512 + * status: Fix space leak in local mode, introduced in version 4.20130920. + * import: Skip .git directories. + * Remove bogus runshell loop check. + * addurl: Improve message when adding url with wrong size to existing file. + * Fixed handling of URL keys that have no recorded size. + * status: Fix a crash if a temp file went away while its size was + being checked for status. + * Deal with git check-attr -z output format change in git 1.8.5. + * Work around sed output difference that led to version containing a newline + on OSX. + * sync: Fix automatic resolution of merge conflicts where one side is an + annexed file, and the other side is a non-annexed file, or a directory. + * S3: Try to ensure bucket name is valid for archive.org. + * assistant: Bug fix: When run in a subdirectory, files from incoming merges + were wrongly added to that subdirectory, and removed from their original + locations. + * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding + DOS formatted paths for --git-dir and --work-tree. + * Removed workaround for bug in git 1.8.4r0. + * Added git-recover-repository command to git-annex source + (not built by default; this needs to move to someplace else). + * webapp: Move sidebar to the right hand side of the screen. + + -- Joey Hess Thu, 24 Oct 2013 12:59:55 -0400 + +git-annex (4.20131002) unstable; urgency=low + + * Note that the layout of gcrypt repositories has changed, and + if you created one you must manually upgrade it. + See http://git-annex.branchable.com/upgrades/gcrypt/ + * webapp: Support setting up and using encrypted git repositories on + any ssh server, as well as on rsync.net. + * git-annex-shell: Added support for operating inside gcrypt repositories. + * Disable receive.denyNonFastForwards when setting up a gcrypt special + remote, since gcrypt needs to be able to fast-forward the master branch. + * import: Preserve top-level directory structure. + * Use cryptohash rather than SHA for hashing when no external hash program + is available. This is a significant speedup for SHA256 on OSX, for + example. + * Added SKEIN256 and SKEIN512 backends. + * Android build redone from scratch, many dependencies updated, + and entire build can now be done using provided scripts. + * assistant: Clear the list of failed transfers when doing a full transfer + scan. This prevents repeated retries to download files that are not + available, or are not referenced by the current git tree. + * indirect, direct: Better behavior when a file is not owned by + the user running the conversion. + * add, import, assistant: Better preserve the mtime of symlinks, + when when adding content that gets deduplicated. + * Send a git-annex user-agent when downloading urls. + Overridable with --user-agent option. + (Not yet done for S3 or WebDAV due to limitations of libraries used.) + * webapp: Fixed a bug where when a new remote is added, one file + may fail to sync to or from it due to the transferrer process not + yet knowing about the new remote. + * OSX: Bundled gpg upgraded, now compatible with config files + written by MacGPG. + * assistant: More robust inotify handling; avoid crashing if a directory + cannot be read. + * Moved list of backends and remote types from status to version + command. + + -- Joey Hess Wed, 02 Oct 2013 16:00:39 -0400 + +git-annex (4.20130920) unstable; urgency=low + + * webapp: Initial support for setting up encrypted removable drives. + * Recommend using my patched gcrypt, which fixes some bugs: + https://github.com/joeyh/git-remote-gcrypt + * Support hot-swapping of removable drives containing gcrypt repositories. + * list: New command, displays a compact table of remotes that + contain files. + (Thanks, anarcat for display code and mastensg for inspiration.) + * fsck: Fix detection and fixing of present direct mode files that are + wrongly represented as standin symlinks on crippled filesystems. + * sync: Fix bug that caused direct mode mappings to not be updated + when merging files into the tree on Windows. + * sync: Don't fail if the directory it is run in gets removed by the + sync. + * addurl: Fix quvi audodetection, broken in last release. + * status: In local mode, displays information about variance from configured + numcopies levels. (--fast avoids calculating these) + * gcrypt: Ensure that signing key is set to one of the participants keys. + * webapp: Show encryption information when editing a remote. + * Avoid unnecessarily catting non-symlink files from git, which can be + so large it runs out of memory. + + -- Joey Hess Fri, 20 Sep 2013 10:34:51 -0400 + +git-annex (4.20130911) unstable; urgency=low + + * Fix problem with test suite in non-unicode locale. + + -- Joey Hess Wed, 11 Sep 2013 12:14:16 -0400 + +git-annex (4.20130909) unstable; urgency=low + + * initremote: Syntax change when setting up an encrypted special remote. + Now use keyid=$KEYID rather than the old encryption=$KEYID + * forget: New command, causes git-annex branch history to be forgotten + in a way that will spread to other clones of the repository. + (As long as they're running this version or newer of git-annex.) + * forget --drop-dead: Completely removes mentions of repositories that + have been marked as dead from the git-annex branch. + * sync, assistant: Force push of the git-annex branch. Necessary + to ensure it gets pushed to remotes after being rewritten by forget. + * Added gcrypt support. This combines a fully encrypted git + repository (using git-remote-gcrypt) with an encrypted git-annex special + remote. + * sync: Support syncing with gcrypt remotes. + * importfeed: Also ignore transient problems with downloading content + from feeds. + * Honor core.sharedrepository when receiving and adding files in direct + mode. + * enableremote: gpg keys can be removed from those a remote encrypts + to by passing "keyid-=$KEYID". keyid+= is also provided. + (Thanks, guilhem for the patch.) + * Added encryption=pubkey scheme, which encrypts to public keys directly + rather than the hybrid approach. See documentation for advantages + and disadvantages, but encryption=hybrid is the recommended scheme still. + (Thanks, guilhem for the patch.) + * Fix Feeds display in build flags. + * Remind user when annex-ignore is set for some remotes, if unable to + get or drop a file, possibly because it's on an ignored remote. + * gpg: Force --no-textmode in case the user has it turned on in config. + * webapp: Improve javascript's handling of longpolling connection + failures, by reloading the current page in this case. + Works around chromium behavior where ajax connections to urls + that were already accessed are denied after navigating back to + a previous page. + * Allow building without quvi support. + + -- Joey Hess Mon, 09 Sep 2013 09:47:02 -0400 + +git-annex (4.20130827) unstable; urgency=low + + * Youtube support! (And 53 other video hosts). When quvi is installed, + git-annex addurl automatically uses it to detect when an page is + a video, and downloads the video file. + * web special remote: Also support using quvi, for getting files, + or checking if files exist in the web. + * unused: Is now a minimum of 30 times faster, and typically many + more times than that (when a repository has several branches). + (Thanks, guilhem for the patch.) + * unused: Fix bugs in two edge cases involving manually staged changes. + (Thanks, guilhem for the patch.) + * Android: Fix bug in terminal app that caused it to spin using much + CPU and battery. This problem was introduced in version 4.20130601. + * sync, merge: Bug fix: Don't try to merge into master when in a bare repo. + * import: Add options to control handling of duplicate files: + --duplicate, --deduplicate, and --clean-duplicates + * mirror: New command, makes two repositories contain the same set of files. + * Set --clobber when running wget to ensure resuming works properly. + * Unescape characters in 'file://...' URIs. (Thanks, guilhem for the patch.) + * Better error message when trying to use a git remote that has annex.ignore + set. + * Fix bug that caused typechanged symlinks to be assumed to be unlocked + files, so they were added to the annex by the pre-commit hook. + * Debian: Run the builtin test suite as an autopkgtest. + * Debian: Recommend ssh-askpass, which ssh will use when the assistant + is run w/o a tty. Closes: #719832 + + -- Joey Hess Tue, 27 Aug 2013 11:03:00 -0400 + +git-annex (4.20130815) unstable; urgency=low + + * assistant, watcher: .gitignore files and other git ignores are now + honored, when git 1.8.4 or newer is installed. + (Thanks, Adam Spiers, for getting the necessary support into git for this.) + * importfeed: Ignores transient problems with feeds. Only exits nonzero + when a feed has repeatedly had a problems for at least 1 day. + * importfeed: Fix handling of dots in extensions. + * Windows: Added support for encrypted special remotes. + * Windows: Fixed permissions problem that prevented removing files + from directory special remote. Directory special remotes now fully usable. + + -- Joey Hess Thu, 15 Aug 2013 10:14:33 +0200 + +git-annex (4.20130802) unstable; urgency=low + + * dropunused behavior change: Now refuses to drop the last copy of a + file, unless you use the --force. + This was the last place in git-annex that could remove data referred + to by the git history, without being forced. + Like drop, dropunused checks remotes, and honors the global + annex.numcopies setting. (However, .gitattributes settings cannot + apply to unused files.) + * Fix inverted logic in last release's fix for data loss bug, + that caused git-annex sync on FAT or other crippled filesystems to add + symlink standin files to the annex. + * importfeed can be used to import files from podcast feeds. + * webapp: When setting up a dedicated ssh key to access the annex + on a host, set IdentitiesOnly to prevent the ssh-agent from forcing + use of a different ssh key. That could result in unncessary password + prompts, or prevent git-annex-shell from being run on the remote host. + * webapp: Improve handling of remotes whose setup has stalled. + * Add status message to XMPP presence tag, to identify to others that + the client is a git-annex client. Closes: #717652 + * webapp: When creating a repository on a removable drive, set + core.fsyncobjectfiles, to help prevent data loss when the drive is yanked. + * Always build with -threaded, to avoid a deadlock when communicating with + gpg. + * unused: No longer shows as unused tmp files that are actively being + transferred. + * assistant: Fix NetWatcher to not sync with remotes that have + remote..annex-sync set to false. + * assistant: Fix deadlock that could occur when adding a lot of files + at once in indirect mode. + * assistant: Fix bug that caused it to stall when adding a very large + number of files at once (around 5 thousand). + * OSX: Make git-annex-webapp run in the background, so that the app icon + can be clicked on the open a new webapp when the assistant is already + running. + * Improve test suite on Windows; now tests git annex sync. + * Fix a few bugs involving filenames that are at or near the filesystem's + maximum filename length limit. + * find: Avoid polluting stdout with progress messages. Closes: #718186 + * Escape ':' in file/directory names to avoid it being treated + as a pathspec by some git commands. Closes: #718185 + * Slow and ugly work around for bug #718517 in git 1.8.4~rc0, which broke + git-cat-file --batch for filenames containing spaces. + (Will be reverted after next git pre-release fixes the problem.) + + -- Joey Hess Fri, 02 Aug 2013 11:35:16 -0400 + +git-annex (4.20130723) unstable; urgency=low + + * Fix data loss bug when adding an (uncompressed) tarball of a + git-annex repository, or other file that begins with something + that can be mistaken for a git-annex link. Closes: #717456 + * New improved version of the git-annex logo, contributed by + John Lawrence. + * Rsync.net have committed to support git-annex and offer a special + discounted rate for git-annex users. Updated the webapp to reflect this. + http://www.rsync.net/products/git-annex-pricing.html + * Install XDG desktop icon files. + * Support unannex and uninit in direct mode. + * Support import in direct mode. + * webapp: Better display of added files. + * fix: Preserve the original mtime of fixed symlinks. + * uninit: Preserve .git/annex/objects at the end, if it still + has content, so that old versions of files and deleted files + are not deleted. Print a message with some suggested actions. + * When a transfer is already being run by another process, + proceed on to the next file, rather than dying. + * Fix checking when content is present in a non-bare repository + accessed via http. + * Display byte sizes with more precision. + * watcher: Fixed a crash that could occur when a directory was renamed + or deleted before it could be scanned. + * watcher: Partially worked around a bug in hinotify, no longer crashes + if hinotify cannot process a directory (but can't detect changes in it) + * directory special remote: Fix checking that there is enough disk space + to hold an object, was broken when using encryption. + * webapp: Differentiate between creating a new S3/Glacier/WebDav remote, + and initializing an existing remote. When creating a new remote, avoid + conflicts with other existing (or deleted) remotes with the same name. + * When an XMPP server has SRV records, try them, but don't then fall + back to the regular host if they all fail. + * For long hostnames, use a hash of the hostname to generate the socket + file for ssh connection caching. + + -- Joey Hess Tue, 23 Jul 2013 10:46:05 -0400 + +git-annex (4.20130709) unstable; urgency=low + + * --all: New switch that makes git-annex operate on all data stored + in the git annex, including old versions of files. Supported by + fsck, get, move, copy. + * --unused: New switch that makes git-annex operate on all data found + by the last run of git annex unused. Supported by fsck, move, copy. + * get, move, copy: Can now be run in a bare repository, + like fsck already could. --all is enabled automatically in this case. + * merge: Now also merges synced/master or similar branches, which + makes it useful to put in a post-receive hook to make a repository + automatically update its working copy when git annex sync or the assistant + sync with it. + * webapp: Fix ssh setup with nonstandard port, broken in last release. + * init: Detect systems on which git commit fails due to not being able to + determine the FQDN, and put in a workaround so committing to the git-annex + branch works. + * addurl --pathdepth: Fix failure when the pathdepth specified is deeper + than the urls's path. + * Windows: Look for .exe extension when searching for a command in path. + * Pass -f to curl when downloading a file with it, so it propigates failure. + * Windows: Fix url to object when using a http remote. + * webapp: Fix authorized_keys line added when setting up a rsync remote + on a server that also supports git-annex, to not force running + git-annex-shell. + * OSX Mountain Lion: Fixed gpg bundled in dmg to not fail due to a missing + gpg-agent. + * Android: gpg is built without --enable-minimal, so it interoperates + better with other gpg builds that may default to using other algorithms + for encryption. + * dropunused, addunused: Complain when asked to operate on a number that + does not correspond to any unused key. + * fsck: Don't claim to fix direct mode when run on a symlink whose content + is not present. + * Make --numcopies override annex.numcopies set in .gitattributes. + + -- Joey Hess Tue, 09 Jul 2013 13:55:39 -0400 + +git-annex (4.20130627) unstable; urgency=low + + * assistant --autostart: Automatically ionices the daemons it starts. + * assistant: Daily sanity check thread is run niced. + * bup: Handle /~/ in bup remote paths. + Thanks, Oliver Matthews + * fsck: Ensures that direct mode is used for files when it's enabled. + * webapp: Fix bug when setting up a remote ssh repo repeatedly on the same + server. + * webapp: Ensure that ssh keys generated for different directories + on a server are always different. + * webapp: Fix bug setting up ssh repo if the user enters "~/" at the start + of the path. + * assistant: Fix bug that prevented adding files written by gnucash, + and more generally support adding hard links to files. However, + other operations on hard links are still unsupported. + * webapp: Fix bug that caused the webapp to hang when built with yesod 1.2. + + -- Joey Hess Thu, 27 Jun 2013 14:21:55 -0400 + +git-annex (4.20130621) unstable; urgency=low + + * Supports indirect mode on encfs in paranoia mode, and other + filesystems that do not support hard links, but do support + symlinks and other POSIX filesystem features. + * Android: Add .thumbnails to .gitignore when setting up a camera + repository. + * Android: Make the "Open webapp" menu item open the just created + repository when a new repo is made. + * webapp: When the user switches to display a different repository, + that repository becomes the default repository to be displayed next time + the webapp gets started. + * glacier: Better handling of the glacier inventory, which avoids + duplicate uploads to the same glacier repository by `git annex copy`. + * Direct mode: No longer temporarily remove write permission bit of files + when adding them. + * sync: Better support for bare git remotes. Now pushes directly to the + master branch on such a remote, instead of to synced/master. This + makes it easier to clone from a bare git remote that has been populated + with git annex sync or by the assistant. + * Android: Fix use of cp command to not try to use features present + only on build system. + * Windows: Fix hang when adding several files at once. + * assistant: In direct mode, objects are now only dropped when all + associated files are unwanted. This avoids a repreated drop/get loop + of a file that has a copy in an archive directory, and a copy not in an + archive directory. (Indirect mode still has some buggy behavior in this + area, since it does not keep track of associated files.) + Closes: #712060 + * status: No longer shows dead repositories. + * annex.debug can now be set to enable debug logging by default. + The webapp's debugging check box does this. + * fsck: Avoid getting confused by Windows path separators + * Windows: Multiple bug fixes, including fixing the data written to the + git-annex branch. + * Windows: The test suite now passes on Windows (a few broken parts are + disabled). + * assistant: On Linux, the expensive transfer scan is run niced. + * Enable assistant and WebDAV support on powerpc and sparc architectures, + which now have the necessary dependencies built. + + -- Joey Hess Fri, 21 Jun 2013 10:18:41 -0400 + +git-annex (4.20130601) unstable; urgency=medium + + * XMPP: Git push over xmpp made much more robust. + * XMPP: Avoid redundant and unncessary pushes. Note that this breaks + compatibility with previous versions of git-annex, which will refuse + to accept any XMPP pushes from this version. + * XMPP: Send pings and use them to detect when contact with the server + is lost. + * hook special remote: Added combined hook program support. + * Android app: Avoid using hard links to app's lib directory, which + is sometimes on a different filesystem than the data directory. + * Fix bug in parsing of parens in some preferred content expressions. + This fixes the behavior of the manual mode group. + * assistant: Work around git-cat-file's not reloading the index after files + are staged. + * Improve error handling when getting uuid of http remotes to auto-ignore, + like with ssh remotes. + * content: New command line way to view and configure a repository's + preferred content settings. + * sync: Fix double merge conflict resolution handling. + * XMPP: Fix a file descriptor leak. + * Android: Added an "Open WebApp" item to the terminal's menu. + * Android: Work around Android devices where the `am` command doesn't work. + * Can now restart certain long-running git processes if they crash, and + continue working. + + -- Joey Hess Sat, 01 Jun 2013 19:16:04 -0400 + +git-annex (4.20130521) unstable; urgency=low + + * Sanitize debian changelog version before putting it into cabal file. + Closes: #708619 + * Switch to MonadCatchIO-transformers for better handling of state while + catching exceptions. + * Fix a zombie that could result when running a process like gpg to + read and write to it. + * Allow building with gpg2. + * Disable building with the haskell threaded runtime when the webapp + is not built. This may fix builds on mips, s390x and sparc, which are + failing to link -lHSrts_thr + * Temporarily build without webapp on kfreebsd-i386, until yesod is + installable there again. + * Direct mode bug fix: After a conflicted merge was automatically resolved, + the content of a file that was already present could incorrectly + be replaced with a symlink. + * Fix a bug in the git-annex branch handling code that could + cause info from a remote to not be merged and take effect immediately. + * Direct mode is now fully tested by the test suite. + * Detect bad content in ~/.config/git-annex/program and look in PATH instead. + * OSX: Fixed gpg included in dmg. + * Linux standalone: Back to being built with glibc 2.13 for maximum + portability. + + -- Joey Hess Tue, 21 May 2013 13:10:26 -0400 + +git-annex (4.20130516) unstable; urgency=low + + * Android: The webapp is ported and working. + * Windows: There is a very rough Windows port. Do not trust it with + important data. + * git-annex-shell: Ensure that received files can be read. Files + transferred from some Android devices may have very broken permissions + as received. + * direct mode: Direct mode commands now work on files staged in the index, + they do not need to be committed to git. + * Temporarily add an upper bound to the version of yesod that can be built + with, since yesod 1.2 has a great many changes that will require extensive + work on the webapp. + * Disable building with the haskell threaded runtime when the assistant + is not built. This may fix builds on s390x and sparc, which are failing + to link -lHSrts_thr + * Avoid depending on regex-tdfa on mips, mipsel, and s390, where it fails + to build. + * direct: Fix a bug that could cause some files to be left in indirect mode. + * When initializing a directory special remote with a relative path, + the path is made absolute. + * SHA: Add a runtime sanity check that sha commands output something + that appears to be a real sha. + * configure: Better checking that sha commands output in the desired format. + * rsync special remotes: When sending from a crippled filesystem, use + the destination's default file permissions, as the local ones can + be arbitrarily broken. (Ie, ----rwxr-x for files on Android) + * migrate: Detect if a file gets corrupted while it's being migrated. + * Debian: Add a menu file. + + -- Joey Hess Thu, 16 May 2013 11:03:35 -0400 + +git-annex (4.20130501) unstable; urgency=low + + * sync, assistant: Behavior changes: Sync with remotes that have + annex-ignore set, so that git remotes on servers without git-annex + installed can be used to keep clients' git repos in sync. + * assistant: Work around misfeature in git 1.8.2 that makes + `git commit --alow-empty -m ""` run an editor. + * sync: Bug fix, avoid adding to the annex the + dummy symlinks used on crippled filesystems. + * Add public repository group. + (And inpreferreddir to preferred content expressions.) + * webapp: Can now set up Internet Archive repositories. + * S3: Dropping content from the Internet Archive doesn't work, but + their API indicates it does. Always refuse to drop from there. + * Automatically register public urls for files uploaded to the + Internet Archive. + * To enable an existing special remote, the new enableremote command + must be used. The initremote command now is used only to create + new special remotes. + * initremote: If two existing remotes have the same name, + prefer the one with a higher trust level. + * assistant: Improved XMPP protocol to better support multiple repositories + using the same XMPP account. Fixes bad behavior when sharing with a friend + when you or the friend have multiple reposotories on an XMPP account. + Note that XMPP pairing with your own devices still pairs with all + repositories using your XMPP account. + * assistant: Fix bug that could cause incoming pushes to not get + merged into the local tree. Particularly affected XMPP pushes. + * webapp: Display some additional information about a repository on + its edit page. + * webapp: Install FDO desktop menu file when started in standalone mode. + * webapp: Don't default to making repository in cwd when started + from within a directory containing a git-annex file (eg, standalone + tarball directory). + * Detect systems that have no user name set in GECOS, and also + don't have user.name set in git config, and put in a workaround + so that commits to the git-annex branch (and the assistant) + will still succeed despite git not liking the system configuration. + * webapp: When told to add a git repository on a remote server, and + the repository already exists as a non-bare repository, use it, + rather than initializing a bare repository in the same directory. + * direct, indirect: Refuse to do anything when the assistant + or git-annex watch daemon is running. + * assistant: When built with git before 1.8.0, use `git remote rm` + to delete a remote. Newer git uses `git remote remove`. + * rmurl: New command, removes one of the recorded urls for a file. + * Detect when the remote is broken like bitbucket is, and exits 0 when + it fails to run git-annex-shell. + * assistant: Several improvements to performance and behavior when + performing bulk adds of a large number of files (tens to hundreds + of thousands). + * assistant: Sanitize XMPP presence information logged for debugging. + * webapp: Now automatically fills in any creds used by an existing remote + when creating a new remote of the same type. Done for Internet Archive, + S3, Glacier, and Box.com remotes. + * Store an annex-uuid file in the bucket when setting up a new S3 remote. + * Support building with DAV 0.4. + + -- Joey Hess Wed, 01 May 2013 01:42:46 -0400 + +git-annex (4.20130417) unstable; urgency=low + + * initremote: Generates encryption keys with high quality entropy. + This can be disabled using --fast to get the old behavior. + The assistant still uses low-quality entropy when creating encrypted + remotes, to avoid delays. (Thanks, guilhem for the patch.) + * Bugfix: Direct mode no longer repeatedly checksums duplicated files. + * assistant: Work around horrible, terrible, very bad behavior of + gnome-keyring, by not storing special-purpose ssh keys in ~/.ssh/*.pub. + Apparently gnome-keyring apparently will load and indiscriminately use + such keys in some cases, even if they are not using any of the standard + ssh key names. Instead store the keys in ~/.ssh/annex/, + which gnome-keyring will not check. + * addurl: Bugfix: Did not properly add file in direct mode. + * assistant: Bug fix to avoid annexing the files that git uses + to stand in for symlinks on FAT and other filesystem not supporting + symlinks. + * Adjust preferred content expressions so that content in archive + directories is preferred until it has reached an archive or smallarchive + repository. + * webapp: New --listen= option allows running the webapp on one computer + and connecting to it from another. (Note: Does not yet use HTTPS.) + * Added annex.web-download-command setting. + * Added per-remote annex-rsync-transport option. (guilhem again) + * Ssh connection caching is now also used by rsync special remotes. + (guilhem yet again) + * The version number is now derived from git, unless built with + VERSION_FROM_CHANGELOG. + * assistant: Stop any transfers the assistant initiated on shutdown. + * assistant: Added sequence numbers to XMPP git push packets. (Not yet used.) + * addurl: Register transfer so the webapp can see it. + * addurl: Automatically retry downloads that fail, as long as some + additional content was downloaded. + * webapp: Much improved progress bar display for downloads from encrypted + remotes. + * Avoid using runghc, as that needs ghci. + * webapp: When a repository's group is changed, rescan for transfers. + * webapp: Added animations. + * webapp: Include the repository directory in the mangled hostname and + ssh key name, so that a locked down ssh key for one repository is not + re-used when setting up additional repositories on the same server. + * Fall back to internal url downloader when built without curl. + * fsck: Check content of direct mode files (only when the inode cache + thinks they are unmodified). + + -- Joey Hess Wed, 17 Apr 2013 09:07:38 -0400 + +git-annex (4.20130405) unstable; urgency=low + + * Group subcommands into sections in usage. Closes: #703797 + * Per-command usage messages. + * webapp: Fix a race that sometimes caused alerts or other notifications + to be missed if they occurred while a page was loading. + * webapp: Progess bar fixes for many types of special remotes. + * Build debian package without using cabal, which writes to HOME. + Closes: #704205 + * webapp: Run ssh server probes in a way that will work when the + login shell is a monstrosity that should have died 25 years ago, + such as csh. + * New annex.largefiles setting, which configures which files + `git annex add` and the assistant add to the annex. + * assistant: Check small files into git directly. + * Remotes can be configured to use other MAC algorithms than HMACSHA1 + to encrypt filenames. + Thanks, guilhem for the patch. + * git-annex-shell: Passes rsync --bwlimit options on rsync. + Thanks, guilhem for the patch. + * webapp: Added UI to delete repositories. Closes: #689847 + * Adjust built-in preferred content expressions to make most types + of repositories want content that is only located on untrusted, dead, + and unwanted repositories. + * drop --auto: Fix bug that prevented dropping files from untrusted + repositories. + * assistant: Fix bug that could cause direct mode files to be unstaged + from git. + * Update working tree files fully atomically. + * webapp: Improved transfer queue management. + * init: Probe whether the filesystem supports fifos, and if not, + disable ssh connection caching. + * Use lower case hash directories for storing files on crippled filesystems, + same as is already done for bare repositories. + + -- Joey Hess Fri, 05 Apr 2013 10:42:18 -0400 + +git-annex (4.20130323) unstable; urgency=low + + * webapp: Repository list is now included in the dashboard, and other + UI tweaks. + * webapp: Improved UI for pairing your own devices together using XMPP. + * webapp: Display an alert when there are XMPP remotes, and a cloud + transfer repository needs to be configured. + * Add incrementalbackup repository group. + * webapp: Encourage user to install git-annex on a server when adding + a ssh server, rather than just funneling them through to rsync. + * xmpp: --debug now enables a sanitized dump of the XMPP protocol + * xmpp: Try harder to detect presence of clients when there's a git push + to send. + * xmpp: Re-enable XA flag, since disabling it did not turn out to help + with the problems Google Talk has with not always sending presence + messages to clients. + * map: Combine duplicate repositories, for a nicer looking map. + * Fix several bugs caused by a bad Ord instance for Remote. + * webapp: Switch all forms to POST. + * assistant: Avoid syncing with annex-ignored remotes when reconnecting + to the network, or connecting a drive. + * assistant: Fix OSX bug that prevented committing changed files to a + repository when in indirect mode. + * webapp: Improved alerts displayed when syncing with remotes, and + when syncing with a remote fails. + * webapp: Force wrap long filenames in transfer display. + * assistant: The ConfigMonitor left one zombie behind each time + it checked for changes, now fixed. + * get, copy, move: Display an error message when an identical transfer + is already in progress, rather than failing with no indication why. + * assistant: Several optimisations to file transfers. + * OSX app and standalone Linux tarball now both support being added to + PATH; no need to use runshell to start git-annex. + * webapp: When adding a removable drive, you can now specify the + directory inside it to use. + * webapp: Confirm whether user wants to combine repositories when + adding a removable drive that already has a repository on it. + + -- Joey Hess Fri, 22 Mar 2013 18:54:05 -0400 + +git-annex (4.20130314) unstable; urgency=low + + * Bugfix: git annex add, when ran without any file or directory specified, + should add files in the current directory, but not act on unlocked files + elsewhere in the tree. + * Bugfix: drop --from an unavailable remote no longer updates the location + log, incorrectly, to say the remote does not have the key. + * Bugfix: If the UUID of a remote is not known, prevent --from, --to, + and other ways of specifying remotes by name from selecting it, + since it is not possible to sanely use it. + * Bugfix: Fix bug in inode cache sentinal check, which broke + copying to local repos if the repo being copied from had moved + to a different filesystem or otherwise changed all its inodes + + * Switch from using regex-compat to regex-tdfa, as the C regex library + is rather buggy. + * status: Can now be run with a directory path to show only the + status of that directory, rather than the whole annex. + * Added remote..annex-gnupg-options setting. + Thanks, guilhem for the patch. + * addurl: Add --relaxed option. + * addurl: Escape invalid characters in urls, rather than failing to + use an invalid url. + * addurl: Properly handle url-escaped characters in file:// urls. + + * assistant: Fix dropping content when a file is moved to an archive + directory, and getting contennt when a file is moved back out. + * assistant: Fix bug in direct mode that could occur when a symlink is + moved out of an archive directory, and resulted in the file not being + set to direct mode when it was transferred. + * assistant: Generate better commits for renames. + * assistant: Logs are rotated to avoid them using too much disk space. + * assistant: Avoid noise in logs from git commit about typechanged + files in direct mode repositories. + * assistant: Set gc.auto=0 when creating repositories to prevent + automatic commits from causing git-gc runs. + * assistant: If gc.auto=0, run git-gc once a day, packing loose objects + very non-aggressively. + * assistant: XMPP git pull and push requests are cached and sent when + presence of a new client is detected. + * assistant: Sync with all git remotes on startup. + * assistant: Get back in sync with XMPP remotes after network reconnection, + and on startup. + * assistant: Fix syncing after XMPP pairing. + * assistant: Optimised handling of renamed files in direct mode, + avoiding re-checksumming. + * assistant: Detects most renames, including directory renames, and + combines all their changes into a single commit. + * assistant: Fix ~/.ssh/git-annex-shell wrapper to work when the + ssh key does not force a command. + * assistant: Be smarter about avoiding unncessary transfers. + + * webapp: Work around bug in Warp's slowloris attack prevention code, + that caused regular browsers to stall when they reuse a connection + after leaving it idle for 30 seconds. + (See https://github.com/yesodweb/wai/issues/146) + * webapp: New preferences page allows enabling/disabling debug logging + at runtime, as well as configuring numcopies and diskreserve. + * webapp: Repository costs can be configured by dragging repositories around + in the repository list. + * webapp: Proceed automatically on from "Configure jabber account" + to pairing. + * webapp: Only show up to 10 queued transfers. + * webapp: DTRT when told to create a git repo that already exists. + * webapp: Set locally paired repositories to a lower cost than other + network remotes. + + * Run ssh with -T to avoid tty allocation and any login scripts that + may do undesired things with it. + * Several improvements to Makefile and cabal file. Thanks, Peter Simmons + * Stop depending on testpack. + * Android: Enable test suite. + + -- Joey Hess Thu, 14 Mar 2013 15:29:20 -0400 + +git-annex (4.20130227) unstable; urgency=low + + * annex.version is now set to 4 for direct mode repositories. + * Should now fully support git repositories with core.symlinks=false; + always using git's pseudosymlink files in such repositories. + * webapp: Allow creating repositories on filesystems that lack support for + symlinks. + * webapp: Can now add a new local repository, and make it sync with + the main local repository. + * Android: Bundle now includes openssh. + * Android: Support ssh connection caching. + * Android: Assistant is fully working. (But no webapp yet.) + * Direct mode: Support filesystems like FAT which can change their inodes + each time they are mounted. + * Direct mode: Fix support for adding a modified file. + * Avoid passing -p to rsync, to interoperate with crippled filesystems. + Closes: #700282 + * Additional GIT_DIR support bugfixes. May actually work now. + * webapp: Display any error message from git init if it fails to create + a repository. + * Fix a reversion in matching globs introduced in the last release, + where "*" did not match files inside subdirectories. No longer uses + the Glob library. + * copy: Update location log when no copy was performed, if the location + log was out of date. + * Makefile now builds using cabal, taking advantage of cabal's automatic + detection of appropriate build flags. + * test: The test suite is now built into the git-annex binary, and can + be run at any time. + + -- Joey Hess Wed, 27 Feb 2013 14:07:24 -0400 + +git-annex (3.20130216) unstable; urgency=low + + * Now uses the Haskell uuid library, rather than needing a uuid program. + * Now uses the Haskell Glob library, rather than pcre-light, avoiding + the need to install libpcre. Currently done only for Cabal or when + the Makefile is made to use -DWITH_GLOB + * Android port now available (command-line only). + * New annex.crippledfilesystem setting, allows use of git-annex + repositories on FAT and even worse filesystems; avoiding use of + hard links and locked down permissions settings. (Support is incomplete.) + * init: Detect when the repository is on a filesystem that does not + support hard links, or symlinks, or unix permissions, and set + annex.crippledfilesystem, as well as annex.direct. + * add: Improved detection of files that are modified while being added. + * Fix a bug in direct mode, introduced in the previous release, where + if a file was dropped and then got back, it would be stored in indirect + mode. + + -- Joey Hess Sat, 16 Feb 2013 10:03:26 -0400 + +git-annex (3.20130207) unstable; urgency=low + + * webapp: Now allows restarting any threads that crash. + * Adjust debian package to only build-depend on DAV on architectures + where it is available. + * addurl --fast: Use curl, rather than haskell HTTP library, to support https. + * annex.autocommit: New setting, can be used to disable autocommit + of changed files by the assistant, while it still does data syncing + and other tasks. + * assistant: Ignore .DS_Store on OSX. + * assistant: Fix location log when adding new file in direct mode. + * Deal with stale mappings for deleted file in direct mode. + * pre-commit: Update direct mode mappings. + * uninit, unannex --fast: If hard link creation fails, fall back to slow + mode. + * Clean up direct mode cache and mapping info when dropping keys. + * dropunused: Clean up stale direct mode cache and mapping info not + removed before. + + -- Joey Hess Thu, 07 Feb 2013 12:45:25 -0400 + +git-annex (3.20130124) unstable; urgency=low + + * Added source repository group, that only retains files until they've + been transferred to another repository. Useful for things like + repositories on cameras. + * Added manual repository group. Use to prevent the assistant from + downloading any file contents to keep things in sync. Instead + `git annex get`, `git annex drop` etc can be used manually as desired. + * webapp: More adjustments to longpoll code to deal with changes in + variable quoting in different versions of shakespeare-js. + * webapp: Avoid an error if a transfer is stopped just as it finishes. + Closes: #698184 + * webapp: Now always logs to .git/annex/daemon.log + * webapp: Has a page to view the log, accessed from the control menu. + * webapp: Fix crash adding removable drive that has an annex directory + in it that is not a git repository. + * Deal with incompatability in gpg2, which caused prompts for encryption + passphrases rather than using the supplied --passphrase-fd. + * bugfix: Union merges involving two or more repositories could sometimes + result in data from one repository getting lost. This could result + in the location log data becoming wrong, and fsck being needed to fix it. + * sync: Automatic merge conflict resolution now stages deleted files. + * Depend on git 1.7.7.6 for --no-edit. Closes: #698399 + * Fix direct mode mapping code to always store direct mode filenames + relative to the top of the repository, even when operating inside a + subdirectory. + * fsck: Detect and fix consistency errors in direct mode mapping files. + * Avoid filename encoding errors when writing direct mode mappings. + + -- Joey Hess Tue, 22 Jan 2013 07:11:59 +1100 + +git-annex (3.20130114) unstable; urgency=low + + * Now handles the case where a file that's being transferred to a remote + is modified in place, which direct mode allows. When this + happens, the transfer now fails, rather than allow possibly corrupt + data into the remote. + * fsck: Better checking of file content in direct mode. + * drop: Suggest using git annex move when numcopies prevents dropping a file. + * webapp: Repo switcher filters out repos that do not exist any more + (or are on a drive that's not mounted). + * webapp: Use IP address, rather than localhost, since some systems may + have configuration problems or other issues that prevent web browsers + from connecting to the right localhost IP for the webapp. + * webapp: Adjust longpoll code to work with recent versions of + shakespeare-js. + * assistant: Support new gvfs dbus names used in Gnome 3.6. + * In direct mode, files with the same key are no longer hardlinked, as + that would cause a surprising behavior if modifying one, where the other + would also change. + * webapp: Avoid illegal characters in hostname when creating S3 or + Glacier remote. + * assistant: Avoid committer crashing if a file is deleted at the wrong + instant. + + -- Joey Hess Mon, 14 Jan 2013 15:25:18 -0400 + +git-annex (3.20130107) unstable; urgency=low + + * webapp: Add UI to stop and restart assistant. + * committer: Fix a file handle leak. + * assistant: Make expensive transfer scan work fully in direct mode. + * More commands work in direct mode repositories: find, whereis, move, copy, + drop, log, fsck, add, addurl. + * sync: No longer automatically adds files in direct mode. + * assistant: Detect when system is not configured with a user name, + and set environment to prevent git from failing. + * direct: Avoid hardlinking symlinks that point to the same content + when the content is not present. + * Fix transferring files to special remotes in direct mode. + + -- Joey Hess Mon, 07 Jan 2013 01:01:41 -0400 + +git-annex (3.20130102) unstable; urgency=low + + * direct, indirect: New commands, that switch a repository to and from + direct mode. In direct mode, files are accessed directly, rather than + via symlinks. Note that direct mode is currently experimental. Many + git-annex commands do not work in direct mode. Some git commands can + cause data loss when used in direct mode repositories. + * assistant: Now uses direct mode by default when setting up a new + local repository. + * OSX assistant: Uses the FSEvents API to detect file changes. + This avoids issues with running out of file descriptors on large trees, + as well as allowing detection of modification of files in direct mode. + Other BSD systems still use kqueue. + * kqueue: Fix bug that made broken symlinks not be noticed. + * vicfg: Quote filename. Closes: #696193 + * Bugfix: Fixed bug parsing transfer info files, where the newline after + the filename was included in it. This was generally benign, but in + the assistant, it caused unexpected dropping of preferred content. + * Bugfix: Remove leading \ from checksums output by sha*sum commands, + when the filename contains \ or a newline. Closes: #696384 + * fsck: Still accept checksums with a leading \ as valid, now that + above bug is fixed. + * SHA*E backends: Exclude non-alphanumeric characters from extensions. + * migrate: Remove leading \ in SHA* checksums, and non-alphanumerics + from extensions of SHA*E keys. + + -- Joey Hess Wed, 02 Jan 2013 13:21:34 -0400 + +git-annex (3.20121211) unstable; urgency=low + + * webapp: Defaults to sharing box.com account info with friends, allowing + one-click enabling of the repository. + * Fix broken .config/git-annex/program installed by standalone tarball. + * assistant: Retrival from glacier now handled. + * Include ssh in standalone tarball and OSX app. + * watch: Avoid leaving hard links to files behind in .git/annex/tmp + if a file is deleted or moved while it's being quarantined in preparation + to being added to the annex. + * Allow `git annex drop --from web`; of course this does not remove + any file from the web, but it does make git-annex remove all urls + associated with a file. + * webapp: S3 and Glacier forms now have a select list of all + currently-supported AWS regions. + * webdav: Avoid trying to set props, avoiding incompatability with + livedrive.com. Needs DAV version 0.3. + * webapp: Prettify error display. + * webapp: Fix bad interaction between required fields and modals. + * webapp: Added help buttons and links next to fields that require + explanations. + * webapp: Encryption can be disabled when setting up remotes. + * assistant: Avoid trying to drop content from remotes that don't have it. + * assistant: Allow periods in ssh key comments. + * get/copy --auto: Transfer data even if it would exceed numcopies, + when preferred content settings want it. + * drop --auto: Fix dropping content when there are no preferred content + settings. + * webapp: Allow user to specify the port when setting up a ssh or rsync + remote. + * assistant: Fix syncing to just created ssh remotes. + * Enable WebDAV support in Debian package. Closes: #695532 + + -- Joey Hess Tue, 11 Dec 2012 11:25:03 -0400 + +git-annex (3.20121127) unstable; urgency=low + + * Fix dirContentsRecursive, which had missed some files in deeply nested + subdirectories. Could affect various parts of git-annex. + * rsync: Fix bug introduced in last release that broke encrypted rsync + special remotes. + * The standalone builds now unset their special path and library path + variables before running the system web browser. + + -- Joey Hess Tue, 27 Nov 2012 17:07:32 -0400 + +git-annex (3.20121126) unstable; urgency=low + + * New webdav and Amazon glacier special remotes. + * Display a warning when a non-existing file or directory is specified. + * webapp: Added configurator for Box.com. + * webapp: Show error messages to user when testing XMPP creds. + * Fix build of assistant without yesod. + * webapp: The list of repositiories refreshes when new repositories are + added, including when new repository configurations are pushed in from + remotes. + * OSX: Fix RunAtLoad value in plist file. + * Getting a file from chunked directory special remotes no longer buffers + it all in memory. + * S3: Added progress display for uploading and downloading. + * directory special remote: Made more efficient and robust. + * Bugfix: directory special remote could loop forever storing a key + when a too small chunksize was configured. + * Allow controlling whether login credentials for S3 and webdav are + committed to the repository, by setting embedcreds=yes|no when running + initremote. + * Added smallarchive repository group, that only archives files that are + in archive directories. Used by default for glacier when set up in the + webapp. + * assistant: Fixed handling of toplevel archive directory and + client repository group. + * assistant: Apply preferred content settings when a new symlink + is created, or a symlink gets renamed. Made archive directories work. + + -- Joey Hess Mon, 26 Nov 2012 11:37:49 -0400 + +git-annex (3.20121112) unstable; urgency=low + + * assistant: Can use XMPP to notify other nodes about pushes made to other + repositories, as well as pushing to them directly over XMPP. + * wepapp: Added an XMPP configuration interface. + * webapp: Supports pairing over XMPP, with both friends, and other repos + using the same account. + * assistant: Drops non-preferred content when possible. + * assistant: Notices, and applies config changes as they are made to + the git-annex branch, including config changes pushed in from remotes. + * git-annex-shell: GIT_ANNEX_SHELL_DIRECTORY can be set to limit it + to operating on a specified directory. + * webapp: When setting up authorized_keys, use GIT_ANNEX_SHELL_DIRECTORY. + * Preferred content path matching bugfix. + * Preferred content expressions cannot use "in=". + * Preferred content expressions can use "present". + * Fix handling of GIT_DIR when it refers to a git submodule. + * Depend on and use the Haskell SafeSemaphore library, which provides + exception-safe versions of SampleVar and QSemN. + Thanks, Ben Gamari for an excellent patch set. + * file:/// URLs can now be used with the web special remote. + * webapp: Allow dashes in ssh key comments when pairing. + * uninit: Check and abort if there are symlinks to annexed content that + are not checked into git. + * webapp: Switched to using the same multicast IP address that avahi uses. + * bup: Don't pass - to bup-split to make it read stdin; bup 0.25 + does not accept that. + * bugfix: Don't fail transferring content from read-only repos. + Closes: #691341 + * configure: Check that checksum programs produce correct checksums. + * Re-enable dbus, using a new version of the library that fixes the memory + leak. + * NetWatcher: When dbus connection is lost, try to reconnect. + * Use USER and HOME environment when set, and only fall back to getpwent, + which doesn't work with LDAP or NIS. + * rsync special remote: Include annex-rsync-options when running rsync + to test a key's presence. + * The standalone tarball's runshell now takes care of installing a + ~/.ssh/git-annex-shell wrapper the first time it's run. + * webapp: Make an initial, empty commit so there is a master branch + * assistant: Fix syncing local drives. + * webapp: Fix creation of rsync.net repositories. + * webapp: Fix renaming of special remotes. + * webapp: Generate better git remote names. + * webapp: Ensure that rsync special remotes are enabled using the same + name they were originally created using. + * Bugfix: Fix hang in webapp when setting up a ssh remote with an absolute + path. + + -- Joey Hess Mon, 12 Nov 2012 10:39:47 -0400 + +git-annex (3.20121017) unstable; urgency=low + + * Fix zombie cleanup reversion introduced in 3.20121009. + * Additional fix to support git submodules. + + -- Joey Hess Tue, 16 Oct 2012 21:10:14 -0400 + +git-annex (3.20121016) unstable; urgency=low + + * vicfg: New file format, avoids ambiguity with repos that have the same + description, or no description. + * Bug fix: A recent change caused git-annex-shell to crash. + * Better preferred content expression for transfer repos. + * webapp: Repository edit form can now edit the name of a repository. + * webapp: Make bare repositories on removable drives, as there is nothing + to ensure non-bare repos get updated when syncing. + * webapp: Better behavior when pausing syncing to a remote when a transfer + scan is running and queueing new transfers for that remote. + * The standalone binaries are now built to not use ssh connection caching, + in order to work with old versions of ssh. + * A relative core.worktree is relative to the gitdir. Now that this is + handled correctly, git-annex can be used in git submodules. + * Temporarily disable use of dbus, as the haskell dbus library blows up + when losing connection, which will need to be fixed upstream. + + -- Joey Hess Tue, 16 Oct 2012 15:25:22 -0400 + +git-annex (3.20121010) unstable; urgency=low + + * Renamed --ingroup to --inallgroup. + * Standard groups changed to client, transfer, archive, and backup. + Each of these has its own standard preferred content setting. + * dead: Remove dead repository from all groups. + * Avoid unsetting HOME when running certian git commands. Closes: #690193 + * test: Fix threaded runtime hang. + * Makefile: Avoid building with -threaded if the ghc threaded runtime does + not exist. + * webapp: Improve wording of intro display. Closes: #689848 + * webapp: Repositories can now be configured, to change their description, + their group, or even to disable syncing to them. + * git config remote.name.annex-sync can be used to control whether + a remote gets synced. + * Fix a crash when merging files in the git-annex branch that contain + invalid utf8. + * Automatically detect when a ssh remote does not have git-annex-shell + installed, and set annex-ignore. + + -- Joey Hess Fri, 12 Oct 2012 13:45:21 -0400 + +git-annex (3.20121009) unstable; urgency=low + + * watch, assistant: It's now safe to git annex unlock files while + the watcher is running, as well as modify files checked into git + as normal files. Additionally, .gitignore settings are now honored. + Closes: #689979 + * group, ungroup: New commands to indicate groups of repositories. + * webapp: Adds newly created repositories to one of these groups: + clients, drives, servers + * vicfg: New command, allows editing (or simply viewing) most + of the repository configuration settings stored in the git-annex branch. + * Added preferred content expressions, configurable using vicfg. + * get --auto: If the local repository has preferred content + configured, only get that content. + * drop --auto: If the repository the content is dropped from has + preferred content configured, drop only content that is not preferred. + * copy --auto: Only transfer content that the destination repository prefers. + * assistant: Now honors preferred content settings when deciding what to + transfer. + * --copies=group:number can now be used to match files that are present + in a specified number of repositories in a group. + * Added --smallerthan, --largerthan, and --inall limits. + * Only build-depend on libghc-clientsession-dev on arches that will have + the webapp. + * uninit: Unset annex.version. Closes: #689852 + + -- Joey Hess Tue, 09 Oct 2012 15:13:23 -0400 + +git-annex (3.20121001) unstable; urgency=low + + * fsck: Now has an incremental mode. Start a new incremental fsck pass + with git annex fsck --incremental. Now the fsck can be interrupted + as desired, and resumed with git annex fsck --more. + Thanks, Justin Azoff + * New --time-limit option, makes long git-annex commands stop after + a specified amount of time. + * fsck: New --incremental-schedule option which is nice for scheduling + eg, monthly incremental fsck runs in cron jobs. + * Fix fallback to ~/Desktop when xdg-user-dir is not available. + Closes: #688833 + * S3: When using a shared cipher, S3 credentials are not stored encrypted + in the git repository, as that would allow anyone with access to + the repository access to the S3 account. Instead, they're stored + in a 600 mode file in the local git repo. + * webapp: Avoid crashing when ssh-keygen -F chokes on an invalid known_hosts + file. + * Always do a system wide installation when DESTDIR is set. Closes: #689052 + * The Makefile now builds with the new yesod by default. + Systems like Debian that have the old yesod 1.0.1 should set + GIT_ANNEX_LOCAL_FEATURES=-DWITH_OLD_YESOD + * copy: Avoid updating the location log when no copy is performed. + * configure: Test that uuid -m works, falling back to plain uuid if not. + * Avoid building the webapp on Debian architectures that do not yet + have template haskell and thus yesod. (Should be available for arm soonish + I hope). + + -- Joey Hess Mon, 01 Oct 2012 13:56:55 -0400 + +git-annex (3.20120924) unstable; urgency=low + + * assistant: New command, a daemon which does everything watch does, + as well as automatically syncing file contents between repositories. + * webapp: An interface for managing and configuring the assistant. + * The default backend used when adding files to the annex is changed + from SHA256 to SHA256E, to simplify interoperability with OSX, media + players, and various programs that needlessly look at symlink targets. + To get old behavior, add a .gitattributes containing: * annex.backend=SHA256 + * init: If no description is provided for a new repository, one will + automatically be generated, like "joey@gnu:~/foo" + * test: Set a lot of git environment variables so testing works in strange + environments that normally need git config to set names, etc. + Closes: #682351 Thanks, gregor herrmann + * Disable ssh connection caching if the path to the control socket would be + too long (and use relative path to minimise path to the control socket). + * migrate: Check content before generating the new key, to avoid generating + a key for corrupt data. + * Support repositories created with --separate-git-dir. Closes: #684405 + * reinject: When the provided file doesn't match, leave it where it is, + rather than moving to .git/annex/bad/ + * Avoid crashing on encoding errors in filenames when writing transfer info + files and reading from checksum commands. + * sync: Pushes the git-annex branch to remote/synced/git-annex, rather + than directly to remote/git-annex. + * Now supports matching files that are present on a number of remotes + with a specified trust level. Example: --copies=trusted:2 + Thanks, Nicolas Pouillard + + -- Joey Hess Mon, 24 Sep 2012 13:47:48 -0400 + +git-annex (3.20120825) unstable; urgency=low + + * S3: Add fileprefix setting. + * Pass --use-agent to gpg when in no tty mode. Thanks, Eskild Hustvedt. + * Bugfix: Fix fsck in SHA*E backends, when the key contains composite + extensions, as added in 3.20120721. + + -- Joey Hess Sat, 25 Aug 2012 10:00:10 -0400 + +git-annex (3.20120807) unstable; urgency=low + + * initremote: Avoid recording remote's description before checking + that its config is valid. + * unused, status: Avoid crashing when ran in bare repo. + * Avoid crashing when "git annex get" fails to download from one + location, and falls back to downloading from a second location. + + -- Joey Hess Tue, 07 Aug 2012 13:35:07 -0400 + +git-annex (3.20120721) unstable; urgency=low + + * get, move, copy: Now refuse to do anything when the requested file + transfer is already in progress by another process. + * status: Lists transfers that are currently in progress. + * Fix passing --uuid to git-annex-shell. + * When shaNsum commands cannot be found, use the Haskell SHA library + (already a dependency) to do the checksumming. This may be slower, + but avoids portability problems. + * Use SHA library for files less than 50 kb in size, at which point it's + faster than forking the more optimised external program. + * SHAnE backends are now smarter about composite extensions, such as + .tar.gz Closes: #680450 + * map: Write map.dot to .git/annex, which avoids watch trying to annex it. + + -- Joey Hess Sat, 21 Jul 2012 16:52:48 -0400 + +git-annex (3.20120629) unstable; urgency=low + + * cabal: Only try to use inotify on Linux. + * Version build dependency on STM, and allow building without it, + which disables the watch command. + * Avoid ugly failure mode when moving content from a local repository + that is not available. + * Got rid of the last place that did utf8 decoding. + * Accept arbitrarily encoded repository filepaths etc when reading + git config output. This fixes support for remotes with unusual characters + in their names. + * sync: Automatically resolves merge conflicts. + + -- Joey Hess Fri, 29 Jun 2012 10:17:49 -0400 + +git-annex (3.20120624) unstable; urgency=low + + * watch: New subcommand, a daemon which notices changes to + files and automatically annexes new files, etc, so you don't + need to manually run git commands when manipulating files. + Available on Linux, BSDs, and OSX! + * Enable diskfree on kfreebsd, using kqueue. + * unused: Fix crash when key names contain invalid utf8. + * sync: Avoid recent git's interactive merge. + + -- Joey Hess Sun, 24 Jun 2012 12:36:50 -0400 + +git-annex (3.20120614) unstable; urgency=medium + + * addurl: Was broken by a typo introduced 2 released ago, now fixed. + Closes: #677576 + * Install man page when run by cabal, in a location where man will + find it, even when installing under $HOME. Thanks, Nathan Collins + + -- Joey Hess Thu, 14 Jun 2012 20:21:29 -0400 + +git-annex (3.20120611) unstable; urgency=medium + + * add: Prevent (most) modifications from being made to a file while it + is being added to the annex. + * initremote: Automatically describe a remote when creating it. + * uninit: Refuse to run in a subdirectory. Closes: #677076 + + -- Joey Hess Mon, 11 Jun 2012 10:32:01 -0400 + +git-annex (3.20120605) unstable; urgency=low + + * sync: Show a nicer message if a user tries to sync to a special remote. + * lock: Reset unlocked file to index, rather than to branch head. + * import: New subcommand, pulls files from a directory outside the annex + and adds them. + * Fix display of warning message when encountering a file that uses an + unsupported backend. + * Require that the SHA256 backend can be used when building, since it's the + default. + * Preserve parent environment when running hooks of the hook special remote. + + -- Joey Hess Tue, 05 Jun 2012 14:03:39 -0400 + +git-annex (3.20120522) unstable; urgency=low + + * Pass -a to cp even when it supports --reflink=auto, to preserve + permissions. + * Clean up handling of git directory and git worktree. + * Add support for core.worktree, and fix support for GIT_WORK_TREE and + GIT_DIR. + + -- Joey Hess Tue, 22 May 2012 11:16:13 -0400 + +git-annex (3.20120511) unstable; urgency=low + + * Rsync special remotes can be configured with shellescape=no + to avoid shell quoting that is normally done when using rsync over ssh. + This is known to be needed for certian rsync hosting providers + (specificially hidrive.strato.com) that use rsync over ssh but do not + pass it through the shell. + * dropunused: Allow specifying ranges to drop. + * addunused: New command, the opposite of dropunused, it relinks unused + content into the git repository. + * Fix use of several config settings: annex.ssh-options, + annex.rsync-options, annex.bup-split-options. (And adjust types to avoid + the bugs that broke several config settings.) + + -- Joey Hess Fri, 11 May 2012 12:29:30 -0400 + +git-annex (3.20120430) unstable; urgency=low + + * Fix use of annex.diskreserve config setting. + * Directory special remotes now check annex.diskreserve. + * Support git's core.sharedRepository configuration. + * Add annex.http-headers and annex.http-headers-command config + settings, to allow custom headers to be sent with all HTTP requests. + (Requested by the Internet Archive) + * uninit: Clear annex.uuid from .git/config. Closes: #670639 + * Added shared cipher mode to encryptable special remotes. This option + avoids gpg key distribution, at the expense of flexability, and with + the requirement that all clones of the git repository be equally trusted. + + -- Joey Hess Mon, 30 Apr 2012 13:16:10 -0400 + +git-annex (3.20120418) unstable; urgency=low + + * bugfix: Adding a dotfile also caused all non-dotfiles to be added. + * bup: Properly handle key names with spaces or other things that are + not legal git refs. + * git-annex (but not git-annex-shell) supports the git help.autocorrect + configuration setting, doing fuzzy matching using the restricted + Damerau-Levenshtein edit distance, just as git does. This adds a build + dependency on the haskell edit-distance library. + * Renamed diskfree.c to avoid OSX case insensativity bug. + * cabal now installs git-annex-shell as a symlink to git-annex. + * cabal file now autodetects whether S3 support is available. + + -- Joey Hess Wed, 18 Apr 2012 12:11:32 -0400 + +git-annex (3.20120406) unstable; urgency=low + + * Disable diskfree on kfreebsd, as I have a build failure on kfreebsd-i386 + that is quite likely caused by it. + + -- Joey Hess Sat, 07 Apr 2012 15:50:36 -0400 + +git-annex (3.20120405) unstable; urgency=low + + * Rewrote free disk space checking code, moving the portability + handling into a small C library. + * status: Display amount of free disk space. + + -- Joey Hess Thu, 05 Apr 2012 16:19:10 -0400 + +git-annex (3.20120315) unstable; urgency=low + + * fsck: Fix up any broken links and misplaced content caused by the + directory hash calculation bug fixed in the last release. + * sync: Sync to lower cost remotes first. + * status: Fixed to run in constant space. + * status: More accurate display of sizes of tmp and bad keys. + * unused: Now uses a bloom filter, and runs in constant space. + Use of a bloom filter does mean it will not notice a small + number of unused keys. For repos with up to half a million keys, + it will miss one key in 1000. + * Added annex.bloomcapacity and annex.bloomaccuracy, which can be + adjusted as desired to tune the bloom filter. + * status: Display amount of memory used by bloom filter, and + detect when it's too small for the number of keys in a repository. + * git-annex-shell: Runs hooks/annex-content after content is received + or dropped. + * Work around a bug in rsync (IMHO) introduced by openSUSE's SIP patch. + * git-annex now behaves as git-annex-shell if symlinked to and run by that + name. The Makefile sets this up, saving some 8 mb of installed size. + * git-union-merge is a demo program, so it is no longer built by default. + + -- Joey Hess Thu, 15 Mar 2012 11:05:28 -0400 + +git-annex (3.20120309) unstable; urgency=low + + * Fix key directory hash calculation code to behave as it did before + version 3.20120227 when a key contains non-ascii characters (only + WORM backend is likely to have been affected). + + -- Joey Hess Fri, 09 Mar 2012 20:05:09 -0400 + +git-annex (3.20120230) unstable; urgency=low + + * "here" can be used to refer to the current repository, + which can read better than the old "." (which still works too). + * Directory special remotes now support chunking files written to them, + avoiding writing files larger than a specified size. + * Add progress bar display to the directory special remote. + * Add configurable hooks that are run when git-annex starts and stops + using a remote: remote.name.annex-start-command and + remote.name.annex-stop-command + * Fix a bug in symlink calculation code, that triggered in rare + cases where an annexed file is in a subdirectory that nearly + matched to the .git/annex/object/xx/yy subdirectories. + + -- Joey Hess Mon, 05 Mar 2012 13:38:13 -0400 + +git-annex (3.20120229) unstable; urgency=low + + * Fix test suite to not require a unicode locale. + * Fix cabal build failure. Thanks, Sergei Trofimovich + + -- Joey Hess Wed, 29 Feb 2012 02:31:31 -0400 + +git-annex (3.20120227) unstable; urgency=low + + * Modifications to support ghc 7.4's handling of filenames. + This version can only be built with ghc 7.4 or newer. See the ghc7.0 + branch for older ghcs. + * S3: Fix irrefutable pattern failure when accessing encrypted S3 + credentials. + * Use the haskell IfElse library. + * Fix teardown of stale cached ssh connections. + * Fixed to use the strict state monad, to avoid leaking all kinds of memory + due to lazy state update thunks when adding/fixing many files. + * Fixed some memory leaks that occurred when committing journal files. + * Added a annex.queuesize setting, useful when adding hundreds of thousands + of files on a system with plenty of memory. + * whereis: Prints the urls of files that the web special remote knows about. + * addurl --fast: Verifies that the url can be downloaded (only getting + its head), and records the size in the key. + * When checking that an url has a key, verify that the Content-Length, + if available, matches the size of the key. + * addurl: Added a --file option, which can be used to specify what + file the url is added to. This can be used to override the default + filename that is used when adding an url, which is based on the url. + Or, when the file already exists, the url is recorded as another + location of the file. + * addurl: Normalize badly encoded urls. + * addurl: Add --pathdepth option. + * rekey: New plumbing level command, can be used to change the keys used + for files en masse. + * Store web special remote url info in a more efficient location. + (Urls stored with this version will not be visible to older versions.) + * Deal with NFS problem that caused a failure to remove a directory + when removing content from the annex. + * Make a single location log commit after a remote has received or + dropped files. Uses a new "git-annex-shell commit" command when available. + * To avoid commits of data to the git-annex branch after each command + is run, set annex.alwayscommit=false. Its data will then be committed + less frequently, when a merge or sync is done. + * configure: Check if ssh connection caching is supported by the installed + version of ssh and default annex.sshcaching accordingly. + * move --from, copy --from: Now 10 times faster when scanning to find + files in a remote on a local disk; rather than go through the location log + to see which files are present on the remote, it simply looks at the + disk contents directly. + + -- Joey Hess Mon, 27 Feb 2012 12:58:21 -0400 + +git-annex (3.20120123) unstable; urgency=low + + * fsck --from: Fscking a remote is now supported. It's done by retrieving + the contents of the specified files from the remote, and checking them, + so can be an expensive operation. Still, if the remote is a special + remote, or a git repository that you cannot run fsck in locally, it's + nice to have the ability to fsck it. + * If you have any directory special remotes, now would be a good time to + fsck them, in case you were hit by the data loss bug fixed in the + previous release! + * fsck --from remote --fast: Avoids expensive file transfers, at the + expense of not checking file size and/or contents. + * Ssh connection caching is now enabled automatically by git-annex. + Only one ssh connection is made to each host per git-annex run, which + can speed some things up a lot, as well as avoiding repeated password + prompts. Concurrent git-annex processes also share ssh connections. + Cached ssh connections are shut down when git-annex exits. + * To disable the ssh caching (if for example you have your own broader + ssh caching configuration), set annex.sshcaching=false. + + -- Joey Hess Mon, 23 Jan 2012 13:48:48 -0400 + +git-annex (3.20120116) unstable; urgency=medium + + * Fix data loss bug in directory special remote, when moving a file + to the remote failed, and partially transferred content was left + behind in the directory, re-running the same move would think it + succeeded and delete the local copy. + + -- Joey Hess Mon, 16 Jan 2012 16:43:45 -0400 + +git-annex (3.20120115) unstable; urgency=low + + * Add a sanity check for bad StatFS results. On architectures + where StatFS does not currently work (s390, mips, powerpc, sparc), + this disables the diskreserve checking code, and attempting to + configure an annex.diskreserve will result in an error. + * Fix QuickCheck dependency in cabal file. + * Minor optimisations. + + -- Joey Hess Sun, 15 Jan 2012 13:54:20 -0400 + +git-annex (3.20120113) unstable; urgency=low + + * log: Add --gource mode, which generates output usable by gource. + * map: Fix display of remote repos + * Add annex-trustlevel configuration settings, which can be used to + override the trust level of a remote. + * git-annex, git-union-merge: Support GIT_DIR and GIT_WORK_TREE. + * Add libghc-testpack-dev to build depends on all arches. + + -- Joey Hess Fri, 13 Jan 2012 15:35:17 -0400 + +git-annex (3.20120106) unstable; urgency=low + + * Support unescaped repository urls, like git does. + * log: New command that displays the location log for files, + showing each repository they were added to and removed from. + * Fix overbroad gpg --no-tty fix from last release. + + -- Joey Hess Sat, 07 Jan 2012 13:16:23 -0400 + +git-annex (3.20120105) unstable; urgency=low + + * Added annex-web-options configuration settings, which can be + used to provide parameters to whichever of wget or curl git-annex uses + (depends on which is available, but most of their important options + suitable for use here are the same). + * Dotfiles, and files inside dotdirs are not added by "git annex add" + unless the dotfile or directory is explicitly listed. So "git annex add ." + will add all untracked files in the current directory except for those in + dotdirs. + * Added quickcheck to build dependencies, and fail if test suite cannot be + built. + * fsck: Do backend-specific check before checking numcopies is satisfied. + * Run gpg with --no-tty. Closes: #654721 + + -- Joey Hess Thu, 05 Jan 2012 13:44:12 -0400 + +git-annex (3.20111231) unstable; urgency=low + + * sync: Improved to work well without a central bare repository. + Thanks to Joachim Breitner. + * Rather than manually committing, pushing, pulling, merging, and git annex + merging, we encourage you to give "git annex sync" a try. + * sync --fast: Selects some of the remotes with the lowest annex.cost + and syncs those, in addition to any specified at the command line. + * Union merge now finds the least expensive way to represent the merge. + * reinject: Add a sanity check for using an annexed file as the source file. + * Properly handle multiline git config values. + * Fix the hook special remote, which bitrotted a while ago. + * map: --fast disables use of dot to display map + * Test suite improvements. Current top-level test coverage: 75% + * Improve deletion of files from rsync special remotes. Closes: #652849 + * Add --include, which is the same as --not --exclude. + * Format strings can be specified using the new --format option, to control + what is output by git annex find. + * Support git annex find --json + * Fixed behavior when multiple insteadOf configs are provided for the + same url base. + * Can now be built with older git versions (before 1.7.7); the resulting + binary should only be used with old git. + * Updated to build with monad-control 0.3. + + -- Joey Hess Sat, 31 Dec 2011 14:55:29 -0400 + +git-annex (3.20111211) unstable; urgency=medium + + * Fix bug in last version in getting contents from bare repositories. + * Ensure that git-annex branch changes are merged into git-annex's index, + which fixes a bug that could cause changes that were pushed to the + git-annex branch to get reverted. As a side effect, it's now safe + for users to check out and commit changes directly to the git-annex + branch. + * map: Fix a failure to detect a loop when both repositories are local + and refer to each other with relative paths. + * Prevent key names from containing newlines. + * add: If interrupted, add can leave files converted to symlinks but not + yet added to git. Running the add again will now clean up this situtation. + * Fix caching of decrypted ciphers, which failed when drop had to check + multiple different encrypted special remotes. + * unannex: Can be run on files that have been added to the annex, but not + yet committed. + * sync: New command that synchronises the local repository and default + remote, by running git commit, pull, and push for you. + * Version monad-control dependency in cabal file. + + -- Joey Hess Sun, 11 Dec 2011 21:24:39 -0400 + +git-annex (3.20111203) unstable; urgency=low + + * The VFAT filesystem on recent versions of Linux, when mounted with + shortname=mixed, does not get along well with git-annex's mixed case + .git/annex/objects hash directories. To avoid this problem, new content + is now stored in all-lowercase hash directories. Except for non-bare + repositories which would be a pain to transition and cannot be put on FAT. + (Old mixed-case hash directories are still tried for backwards + compatibility.) + * Flush json output, avoiding a buffering problem that could result in + doubled output. + * Avoid needing haskell98 and other fixes for new ghc. Thanks, Mark Wright. + * Bugfix: dropunused did not drop keys with two spaces in their name. + * Support for storing .git/annex on a different device than the rest of the + git repository. + * --inbackend can be used to make git-annex only operate on files + whose content is stored using a specified key-value backend. + * dead: A command which says that a repository is gone for good + and you don't want git-annex to mention it again. + + -- Joey Hess Sat, 03 Dec 2011 21:01:45 -0400 + +git-annex (3.20111122) unstable; urgency=low + + * merge: Improve commit messages to mention what was merged. + * Avoid doing auto-merging in commands that don't need fully current + information from the git-annex branch. In particular, git annex add + no longer needs to auto-merge. + * init: When run in an already initalized repository, and without + a description specified, don't delete the old description. + * Optimised union merging; now only runs git cat-file once, and runs + in constant space. + * status: Now displays trusted, untrusted, and semitrusted repositories + separately. + * status: Include all special remotes in the list of repositories. + * status: Fix --json mode. + * status: --fast is back + * Fix support for insteadOf url remapping. Closes: #644278 + * When not run in a git repository, git-annex can still display a usage + message, and "git annex version" even works. + * migrate: Don't fall over a stale temp file. + * Avoid excessive escaping for rsync special remotes that are not accessed + over ssh. + * find: Support --print0 + + -- Joey Hess Tue, 22 Nov 2011 14:31:45 -0400 + +git-annex (3.20111111) unstable; urgency=low + + * Handle a case where an annexed file is moved into a gitignored directory, + by having fix --force add its change. + * Avoid cyclic drop problems. + * Optimized copy --from and get --from to avoid checking the location log + for files that are already present. + * Automatically fix up badly formatted uuid.log entries produced by + 3.20111105, whenever the uuid.log is changed (ie, by init or describe). + * map: Support remotes with /~/ and /~user/ + + -- Joey Hess Fri, 11 Nov 2011 13:44:18 -0400 + +git-annex (3.20111107) unstable; urgency=low + + * merge: Use fast-forward merges when possible. + Thanks Valentin Haenel for a test case showing how non-fast-forward + merges could result in an ongoing pull/merge/push cycle. + * Don't try to read config from repos with annex-ignore set. + * Bugfix: In the past two releases, git-annex init has written the uuid.log + in the wrong format, with the UUID and description flipped. + + -- Joey Hess Mon, 07 Nov 2011 12:47:44 -0400 + +git-annex (3.20111105) unstable; urgency=low + + * The default backend used when adding files to the annex is changed + from WORM to SHA256. + To get old behavior, add a .gitattributes containing: * annex.backend=WORM + * Sped up some operations on remotes that are on the same host. + * copy --to: Fixed leak when copying many files to a remote on the same + host. + * uninit: Add guard against being run with the git-annex branch checked out. + * Fail if --from or --to is passed to commands that do not support them. + * drop --from is now supported to remove file content from a remote. + * status: Now always shows the current repository, even when it does not + appear in uuid.log. + * fsck: Now works in bare repositories. Checks location log information, + and file contents. Does not check that numcopies is satisfied, as + .gitattributes information about numcopies is not available in a bare + repository. + * unused, dropunused: Now work in bare repositories. + * Removed the setkey command, and added a reinject command with a more + useful interface. + * The fromkey command now takes the key as its first parameter. The --key + option is no longer used. + * Built without any filename containing .git being excluded. Closes: #647215 + * Record uuid when auto-initializing a remote so it shows in status. + * Bugfix: Fixed git-annex init crash in a bare repository when there was + already an existing git-annex branch. + * Pass -t to rsync to preserve timestamps. + + -- Joey Hess Sat, 05 Nov 2011 15:47:52 -0400 + +git-annex (3.20111025) unstable; urgency=low + + * A remote can have a annexUrl configured, that is used by git-annex + instead of its usual url. (Similar to pushUrl.) + * migrate: Copy url logs for keys when migrating. + * git-annex-shell: GIT_ANNEX_SHELL_READONLY and GIT_ANNEX_SHELL_LIMITED + environment variables can be set to limit what commands can be run. + This is used by gitolite's new git-annex support! + + -- Joey Hess Tue, 25 Oct 2011 13:03:08 -0700 + +git-annex (3.20111011) unstable; urgency=low + + * This version of git-annex only works with git 1.7.7 and newer. + The breakage with old versions is subtle, and affects the + annex.numcopies settings in .gitattributes, so be sure to upgrade git + to 1.7.7. (Debian package now depends on that version.) + * Don't pass absolute paths to git show-attr, as it started following + symlinks when that's done in 1.7.7. Instead, use relative paths, + which show-attr only handles 100% correctly in 1.7.7. Closes: #645046 + * Fix referring to remotes by uuid. + * New or changed repository descriptions in uuid.log now have a timestamp, + which is used to ensure the newest description is used when the uuid.log + has been merged. + * Note that older versions of git-annex will display the timestamp as part + of the repository description, which is ugly but otherwise harmless. + * Add timestamps to trust.log and remote.log too. + * git-annex-shell: Added the --uuid option. + * git-annex now asks git-annex-shell to verify that it's operating in + the expected repository. + * Note that this git-annex will not interoperate with remotes using + older versions of git-annex-shell. + * Now supports git's insteadOf configuration, to modify the url + used to access a remote. Note that pushInsteadOf is not used; + that and pushurl are reserved for actual git pushes. Closes: #644278 + * status: List all known repositories. + * When displaying a list of repositories, show git remote names + in addition to their descriptions. + * Add locking to avoid races when changing the git-annex branch. + * Various speed improvements gained by using ByteStrings. + * Contain the zombie hordes. + + -- Joey Hess Tue, 11 Oct 2011 23:00:02 -0400 + +git-annex (3.20110928) unstable; urgency=low + + * --in can be used to make git-annex only operate on files + believed to be present in a given repository. + * Arbitrarily complex expressions can be built to limit the files git-annex + operates on, by combining the options --not --and --or -( and -) + Example: git annex get --exclude '*.mp3' --and --not -( --in usbdrive --or --in archive -) + * --copies=N can be used to make git-annex only operate on files with + the specified number of copies. (And --not --copies=N for the inverse.) + * find: Rather than only showing files whose contents are present, + when used with --exclude --copies or --in, displays all files that + match the specified conditions. + * Note that this is a behavior change for git-annex find! Old behavior + can be gotten by using: git-annex find --in . + * status: Massively sped up; remove --fast mode. + * unused: File contents used by branches and tags are no longer + considered unused, even when not used by the current branch. This is + the final piece of the puzzle needed for git-annex to to play nicely + with branches. + + -- Joey Hess Wed, 28 Sep 2011 18:14:02 -0400 + +git-annex (3.20110915) unstable; urgency=low + + * whereis: Show untrusted locations separately and do not include in + location count. + * Fix build without S3. + * addurl: Always use whole url as destination filename, rather than + only its file component. + * get, drop, copy: Added --auto option, which decides whether + to get/drop content as needed to work toward the configured numcopies. + * bugfix: drop and fsck did not honor --exclude + + -- Joey Hess Thu, 15 Sep 2011 22:25:46 -0400 + +git-annex (3.20110906) unstable; urgency=low + + * Improve display of newlines around error and warning messages. + * Fix Makefile to work with cabal again. + + -- Joey Hess Tue, 06 Sep 2011 13:45:16 -0400 + +git-annex (3.20110902) unstable; urgency=low + + * Set EMAIL when running test suite so that git does not need to be + configured first. Closes: #638998 + * The wget command will now be used in preference to curl, if available. + * init: Make description an optional parameter. + * unused, status: Sped up by avoiding unnecessary stats of annexed files. + * unused --remote: Reduced memory use to 1/4th what was used before. + * Add --json switch, to produce machine-consumable output. + + -- Joey Hess Fri, 02 Sep 2011 21:20:37 -0400 + +git-annex (3.20110819) unstable; urgency=low + + * Now "git annex init" only has to be run once, when a git repository + is first being created. Clones will automatically notice that git-annex + is in use and automatically perform a basic initalization. It's + still recommended to run "git annex init" in any clones, to describe them. + * Added annex-cost-command configuration, which can be used to vary the + cost of a remote based on the output of a shell command. + * Fix broken upgrade from V1 repository. Closes: #638584 + + -- Joey Hess Fri, 19 Aug 2011 20:34:09 -0400 + +git-annex (3.20110817) unstable; urgency=low + + * Fix shell escaping in rsync special remote. + * addurl: --fast can be used to avoid immediately downloading the url. + * Added support for getting content from git remotes using http (and https). + * Added curl to Debian package dependencies. + + -- Joey Hess Wed, 17 Aug 2011 01:29:02 -0400 + +git-annex (3.20110719) unstable; urgency=low + + * add: Be even more robust to avoid ever leaving the file seemingly deleted. + Closes: #634233 + * Bugfix: Make add ../ work. + * Support the standard git -c name=value + * unannex: Clean up use of git commit -a. + + -- Joey Hess Tue, 19 Jul 2011 23:39:53 -0400 + +git-annex (3.20110707) unstable; urgency=low + + * Fix sign bug in disk free space checking. + * Bugfix: Forgot to de-escape keys when upgrading. Could result in + bad location log data for keys that contain [&:%] in their names. + (A workaround for this problem is to run git annex fsck.) + * add: Avoid a failure mode that resulted in the file seemingly being + deleted (content put in the annex but no symlink present). + + -- Joey Hess Thu, 07 Jul 2011 19:29:39 -0400 + +git-annex (3.20110705) unstable; urgency=low + + * uninit: Delete the git-annex branch and .git/annex/ + * unannex: In --fast mode, file content is left in the annex, and a + hard link made to it. + * uninit: Use unannex in --fast mode, to support unannexing multiple + files that link to the same content. + * Drop the dependency on the haskell curl bindings, use regular haskell HTTP. + * Fix a pipeline stall when upgrading (caused by #624389). + + -- Joey Hess Tue, 05 Jul 2011 14:37:39 -0400 + +git-annex (3.20110702) unstable; urgency=low + + * Now the web can be used as a special remote. + This feature replaces the old URL backend. + * addurl: New command to download an url and store it in the annex. + * Sped back up fsck, copy --from, and other commands that often + have to read a lot of information from the git-annex branch. Such + commands are now faster than they were before introduction of the + git-annex branch. + * Always ensure git-annex branch exists. + * Modify location log parser to allow future expansion. + * --force will cause add, etc, to operate on ignored files. + * Avoid mangling encoding when storing the description of repository + and other content. + * cabal can now be used to build git-annex. This is substantially + slower than using make, does not build or install documentation, + does not run the test suite, and is not particularly recommended, + but could be useful to some. + + -- Joey Hess Sat, 02 Jul 2011 15:00:18 -0400 + +git-annex (3.20110624) experimental; urgency=low + + * New repository format, annex.version=3. Use `git annex upgrade` to migrate. + * git-annex now stores its logs in a git-annex branch. + * merge: New subcommand. Auto-merges the new git-annex branch. + * Improved handling of bare git repos with annexes. Many more commands will + work in them. + * git-annex is now more robust; it will never leave state files + uncommitted when some other git process comes along and locks the index + at an inconvenient time. + * rsync is now used when copying files from repos on other filesystems. + cp is still used when copying file from repos on the same filesystem, + since --reflink=auto can make it significantly faster on filesystems + such as btrfs. + * Allow --trust etc to specify a repository by name, for temporarily + trusting repositories that are not configured remotes. + * unlock: Made atomic. + * git-union-merge: New git subcommand, that does a generic union merge + operation, and operates efficiently without touching the working tree. + + -- Joey Hess Fri, 24 Jun 2011 14:32:18 -0400 + +git-annex (0.20110610) unstable; urgency=low + + * Add --numcopies option. + * Add --trust, --untrust, and --semitrust options. + * get --from is the same as copy --from + * Bugfix: Fix fsck to not think all SHAnE keys are bad. + + -- Joey Hess Fri, 10 Jun 2011 11:48:40 -0400 + +git-annex (0.20110601) unstable; urgency=low + + * Minor bugfixes and error message improvements. + * Massively sped up `git annex lock` by avoiding use of the uber-slow + `git reset`, and only running `git checkout` once, even when many files + are being locked. + * Fix locking of files with staged changes. + * Somewhat sped up `git commit` of modifications to unlocked files. + * Build fix for older ghc. + + -- Joey Hess Wed, 01 Jun 2011 11:50:47 -0400 + +git-annex (0.20110522) unstable; urgency=low + + * Closer emulation of git's behavior when told to use "foo/.git" as a + git repository instead of just "foo". Closes: #627563 + * Fix bug in --exclude introduced in 0.20110516. + + -- Joey Hess Fri, 27 May 2011 20:20:41 -0400 + +git-annex (0.20110521) unstable; urgency=low + + * status: New subcommand to show info about an annex, including its size. + * --backend now overrides any backend configured in .gitattributes files. + * Add --debug option. Closes: #627499 + + -- Joey Hess Sat, 21 May 2011 11:52:53 -0400 + +git-annex (0.20110516) unstable; urgency=low + + * Add a few tweaks to make it easy to use the Internet Archive's variant + of S3. In particular, munge key filenames to comply with the IA's filename + limits, disable encryption, support their nonstandard way of creating + buckets, and allow x-archive-* headers to be specified in initremote to + set item metadata. + * Added filename extension preserving variant backends SHA1E, SHA256E, etc. + * migrate: Use current filename when generating new key, for backends + where the filename affects the key name. + * Work around a bug in Network.URI's handling of bracketed ipv6 addresses. + + -- Joey Hess Mon, 16 May 2011 14:16:52 -0400 + +git-annex (0.20110503) unstable; urgency=low + + * Fix hasKeyCheap setting for bup and rsync special remotes. + * Add hook special remotes. + * Avoid crashing when an existing key is readded to the annex. + * unused: Now also lists files fsck places in .git/annex/bad/ + * S3: When encryption is enabled, the Amazon S3 login credentials + are stored, encrypted, in .git-annex/remotes.log, so environment + variables need not be set after the remote is initialized. + + -- Joey Hess Tue, 03 May 2011 20:56:01 -0400 + +git-annex (0.20110427) unstable; urgency=low + + * Switch back to haskell SHA library, so git-annex remains buildable on + Debian stable. + * Added rsync special remotes. This could be used, for example, to + store annexed content on rsync.net (encrypted naturally). Or anywhere else. + * Bugfix: Avoid pipeline stall when running git annex drop or fsck on a + lot of files. Possibly only occured with ghc 7. + + -- Joey Hess Wed, 27 Apr 2011 22:50:26 -0400 + +git-annex (0.20110425) unstable; urgency=low + + * Use haskell Crypto library instead of haskell SHA library. + * Remove testpack from build depends for non x86 architectures where it + is not available. The test suite will not be run if it cannot be compiled. + * Avoid using absolute paths when staging location log, as that can + confuse git when a remote's path contains a symlink. Closes: #621386 + + -- Joey Hess Mon, 25 Apr 2011 15:47:00 -0400 + +git-annex (0.20110420) unstable; urgency=low + + * Update Debian build dependencies for ghc 7. + * Debian package is now built with S3 support. + Thanks Joachim Breitner for making this possible. + * Somewhat improved memory usage of S3, still work to do. + Thanks Greg Heartsfield for ongoing work to improve the hS3 library + for git-annex. + + -- Joey Hess Thu, 21 Apr 2011 15:00:48 -0400 + +git-annex (0.20110419) unstable; urgency=low + + * Don't run gpg in batch mode, so it can prompt for passphrase when + there is no agent. + * Add missing build dep on dataenc. + * S3: Fix stalls when transferring encrypted data. + * bup: Avoid memory leak when transferring encrypted data. + + -- Joey Hess Tue, 19 Apr 2011 21:26:51 -0400 + +git-annex (0.20110417) unstable; urgency=low + + * bup is now supported as a special type of remote. + * The data sent to special remotes (Amazon S3, bup, etc) can be encrypted + using GPG for privacy. + * Use lowercase hash directories for locationlog files, to avoid + some issues with git on OSX with the mixed-case directories. + No migration is needed; the old mixed case hash directories are still + read; new information is written to the new directories. + * Unused files on remotes, particulary special remotes, can now be + identified and dropped, by using "--from remote" with git annex unused + and git annex dropunused. + * Clear up short option confusion between --from and --force (-f is now + --from, and there is no short option for --force). + * Add build depend on perlmagick so docs are consistently built. + Closes: #621410 + * Add doc-base file. Closes: #621408 + * Periodically flush git command queue, to avoid boating memory usage + too much. + * Support "sha1" and "sha512" commands on FreeBSD, and allow building + if any/all SHA commands are not available. Thanks, Fraser Tweedale + + -- Joey Hess Sun, 17 Apr 2011 12:00:24 -0400 + +git-annex (0.20110401) experimental; urgency=low + + * Amazon S3 is now supported as a special type of remote. + Warning: Encrypting data before sending it to S3 is not yet supported. + * Note that Amazon S3 support is not built in by default on Debian yet, + as hS3 is not packaged. + * fsck: Ensure that files and directories in .git/annex/objects + have proper permissions. + * Added a special type of remote called a directory remote, which + simply stores files in an arbitrary local directory. + * Bugfix: copy --to --fast never really copied, fixed. + + -- Joey Hess Fri, 01 Apr 2011 21:27:22 -0400 + +git-annex (0.20110328) experimental; urgency=low + + * annex.diskreserve can be given in arbitrary units (ie "0.5 gigabytes") + * Generalized remotes handling, laying groundwork for remotes that are + not regular git remotes. (Think Amazon S3.) + * Provide a less expensive version of `git annex copy --to`, enabled + via --fast. This assumes that location tracking information is correct, + rather than contacting the remote for every file. + * Bugfix: Keys could be received into v1 annexes from v2 annexes, via + v1 git-annex-shell. This results in some oddly named keys in the v1 + annex. Recognise and fix those keys when upgrading, instead of crashing. + + -- Joey Hess Mon, 28 Mar 2011 10:47:29 -0400 + +git-annex (0.20110325) experimental; urgency=low + + * Free space checking is now done, for transfers of data for keys + that have free space metadata. (Notably, not for SHA* keys generated + with git-annex 0.2x or earlier.) The code is believed to work on + Linux, FreeBSD, and OSX; check compile-time messages to see if it + is not enabled for your OS. + * Add annex.diskreserve config setting, to control how much free space + to reserve for other purposes and avoid using (defaults to 1 mb). + * Add --fast flag, that can enable less expensive, but also less thorough + versions of some commands. + * fsck: In fast mode, avoid checking checksums. + * unused: In fast mode, just show all existing temp files as unused, + and avoid expensive scan for other unused content. + * migrate: Support migrating v1 SHA keys to v2 SHA keys with + size information that can be used for free space checking. + * Fix space leak in fsck and drop commands. + * migrate: Bugfix for case when migrating a file results in a key that + is already present in .git/annex/objects. + * dropunused: Significantly sped up; only read unused log file once. + + -- Joey Hess Fri, 25 Mar 2011 00:47:37 -0400 + +git-annex (0.20110320) experimental; urgency=low + + * Fix dropping of files using the URL backend. + * Fix support for remotes with '.' in their names. + * Add version command to show git-annex version as well as repository + version information. + * No longer auto-upgrade to repository format 2, to avoid accidental + upgrades, etc. Use git-annex upgrade when you're ready to run this + version. + + -- Joey Hess Sun, 20 Mar 2011 16:36:33 -0400 + +git-annex (0.20110316) experimental; urgency=low + + * New repository format, annex.version=2. + * The first time git-annex is run in an old format repository, it + will automatically upgrade it to the new format, staging all + necessary changes to git. Also added a "git annex upgrade" command. + * Colons are now avoided in filenames, so bare clones of git repos + can be put on USB thumb drives formatted with vFAT or similar + filesystems. + * Added two levels of hashing to object directory and .git-annex logs, + to improve scalability with enormous numbers of annexed + objects. (With one hundred million annexed objects, each + directory would contain fewer than 1024 files.) + * The setkey, fromkey, and dropkey subcommands have changed how + the key is specified. --backend is no longer used with these. + + -- Joey Hess Wed, 16 Mar 2011 16:20:23 -0400 + +git-annex (0.24) unstable; urgency=low + + Branched the 0.24 series, which will be maintained for a while to + support v1 git-annex repos, while main development moves to the 0.2011 + series, with v2 git-annex repos. + + * Add Suggests on graphviz. Closes: #618039 + * When adding files to the annex, the symlinks pointing at the annexed + content are made to have the same mtime as the original file. + While git does not preserve that information, this allows a tool + like metastore to be used with annexed files. + (Currently this is only done on systems supporting POSIX 200809.) + + -- Joey Hess Wed, 16 Mar 2011 18:35:13 -0400 + +git-annex (0.23) unstable; urgency=low + + * Support ssh remotes with a port specified. + * whereis: New subcommand to show where a file's content has gotten to. + * Rethink filename encoding handling for display. Since filename encoding + may or may not match locale settings, any attempt to decode filenames + will fail for some files. So instead, do all output in binary mode. + + -- Joey Hess Sat, 12 Mar 2011 15:02:49 -0400 + +git-annex (0.22) unstable; urgency=low + + * Git annexes can now be attached to bare git repositories. + (Both the local and remote host must have this version of git-annex + installed for it to work.) + * Support filenames that start with a dash; when such a file is passed + to a utility it will be escaped to avoid it being interpreted as an + option. (I went a little overboard and got the type checker involved + in this, so such files are rather comprehensively supported now.) + * New backends: SHA512 SHA384 SHA256 SHA224 + (Supported on systems where corresponding shaNsum commands are available.) + * describe: New subcommand that can set or change the description of + a repository. + * Fix test suite to reap zombies. + (Zombies can be particularly annoying on OSX; thanks to Jimmy Tang + for his help eliminating the infestation... for now.) + * Make test suite not rely on a working cp -pr. + (The Unix wars are still ON!) + * Look for dir.git directories the same as git does. + * Support remote urls specified as relative paths. + * Support non-ssh remote paths that contain tilde expansions. + * fsck: Check for and repair location log damage. + * Bugfix: When fsck detected and moved away corrupt file content, it did + not update the location log. + + -- Joey Hess Fri, 04 Mar 2011 15:10:57 -0400 + +git-annex (0.21) unstable; urgency=low + + * test: Don't rely on chmod -R working. + * unannex: Fix recently introduced bug when attempting to unannex more + than one file at a time. + * test: Set git user name and email in case git can't guess values. + * Fix display of unicode filenames. + + -- Joey Hess Fri, 11 Feb 2011 23:21:08 -0400 + +git-annex (0.20) unstable; urgency=low + + * Preserve specified file ordering when instructed to act on multiple + files or directories. For example, "git annex get a b" will now always + get "a" before "b". Previously it could operate in either order. + * unannex: Commit staged changes at end, to avoid some confusing behavior + with the pre-commit hook, which would see some types of commits after + an unannex as checking in of an unlocked file. + * map: New subcommand that uses graphviz to display a nice map of + the git repository network. + * Deal with the mtl/monads-fd conflict. + * configure: Check for sha1sum. + + -- Joey Hess Tue, 08 Feb 2011 18:57:24 -0400 + +git-annex (0.19) unstable; urgency=low + + * configure: Support using the uuidgen command if the uuid command is + not available. + * Allow --exclude to be specified more than once. + * There are now three levels of repository trust. + * untrust: Now marks the current repository as untrusted. + * semitrust: Now restores the default trust level. (What untrust used to do.) + * fsck, drop: Take untrusted repositories into account. + * Bugfix: Files were copied from trusted remotes first even if their + annex.cost was higher than other remotes. + * Improved temp file handling. Transfers of content can now be resumed + from temp files later; the resume does not have to be the immediate + next git-annex run. + * unused: Include partially transferred content in the list. + * Bugfix: Running a second git-annex while a first has a transfer in + progress no longer deletes the first processes's temp file. + + -- Joey Hess Fri, 28 Jan 2011 14:31:37 -0400 + +git-annex (0.18) unstable; urgency=low + + * Bugfix: `copy --to` and `move --to` forgot to stage location log changes + after transferring the file to the remote repository. + (Did not affect ssh remotes.) + * fsck: Fix bug in moving of corrupted files to .git/annex/bad/ + * migrate: Fix support for --backend option. + * unlock: Fix behavior when file content is not present. + * Test suite improvements. Current top-level test coverage: 80% + + -- Joey Hess Fri, 14 Jan 2011 14:17:44 -0400 + +git-annex (0.17) unstable; urgency=low + + * unannex: Now skips files whose content is not present, rather than + it being an error. + * New migrate subcommand can be used to switch files to using a different + backend, safely and with no duplication of content. + * bugfix: Fix crash caused by empty key name. (Thanks Henrik for reporting.) + + -- Joey Hess Sun, 09 Jan 2011 10:04:11 -0400 + +git-annex (0.16) unstable; urgency=low + + * git-annex-shell: Avoid exposing any git repo config except for the + annex.uuid when doing configlist. + * bugfix: Running `move --to` with a remote whose UUID was not yet known + could result in git-annex not recording on the local side where the + file was moved to. This could not result in data loss, or even a + significant problem, since the remote *did* record that it had the file. + * Also, add a general guard to detect attempts to record information + about repositories with missing UUIDs. + * bugfix: Running `move --to` with a non-ssh remote failed. + * bugfix: Running `copy --to` with a non-ssh remote actually did a move. + * Many test suite improvements. Current top-level test coverage: 65% + + -- Joey Hess Fri, 07 Jan 2011 14:33:13 -0400 + +git-annex (0.15) unstable; urgency=low + + * Support scp-style urls for remotes (host:path). + * Support ssh urls containing "~". + * Add trust and untrust subcommands, to allow configuring repositories + that are trusted to retain files without explicit checking. + * Fix bug in numcopies handling when multiple remotes pointed to the + same repository. + * Introduce the git-annex-shell command. It's now possible to make + a user have it as a restricted login shell, similar to git-shell. + * Note that git-annex will always use git-annex-shell when accessing + a ssh remote, so all of your remotes need to be upgraded to this + version of git-annex at the same time. + * Now rsync is exclusively used for copying files to and from remotes. + scp is not longer supported. + + -- Joey Hess Fri, 31 Dec 2010 22:00:52 -0400 + +git-annex (0.14) unstable; urgency=low + + * Bugfix to git annex unused in a repository with nothing yet annexed. + * Support upgrading from a v0 annex with nothing in it. + * Avoid multiple calls to git ls-files when passed eg, "*". + + -- Joey Hess Fri, 24 Dec 2010 17:38:48 -0400 + +git-annex (0.13) unstable; urgency=low + + * Makefile: Install man page and html (when built). + * Makefile: Add GHCFLAGS variable. + * Fix upgrade from 0.03. + * Support remotes using git+ssh and ssh+git as protocol. + Closes: #607056 + + -- Joey Hess Tue, 14 Dec 2010 13:05:10 -0400 + +git-annex (0.12) unstable; urgency=low + + * Add --exclude option to exclude files from processing. + * mwdn2man: Fix a bug in newline supression. Closes: #606578 + * Bugfix to git annex add of an unlocked file in a subdir. Closes: #606579 + * Makefile: Add PREFIX variable. + + -- Joey Hess Sat, 11 Dec 2010 17:32:00 -0400 + +git-annex (0.11) unstable; urgency=low + + * If available, rsync will be used for file transfers from remote + repositories. This allows resuming interrupted transfers. + * Added remote.annex-rsync-options. + * Avoid deleting temp files when rsync fails. + * Improve detection of version 0 repos. + * Add uninit subcommand. Closes: #605749 + + -- Joey Hess Sat, 04 Dec 2010 17:27:42 -0400 + +git-annex (0.10) unstable; urgency=low + + * In .gitattributes, the annex.numcopies attribute can be used + to control the number of copies to retain of different types of files. + * Bugfix: Always correctly handle gitattributes when in a subdirectory of + the repository. (Had worked ok for ones like "*.mp3", but failed for + ones like "dir/*".) + * fsck: Fix warning about not enough copies of a file, when locations + are known, but are not available in currently configured remotes. + * precommit: Optimise to avoid calling git-check-attr more than once. + * The git-annex-backend attribute has been renamed to annex.backend. + + -- Joey Hess Sun, 28 Nov 2010 19:28:05 -0400 + +git-annex (0.09) unstable; urgency=low + + * Add copy subcommand. + * Fix bug in setkey subcommand triggered by move --to. + + -- Joey Hess Sat, 27 Nov 2010 17:14:59 -0400 + +git-annex (0.08) unstable; urgency=low + + * Fix `git annex add ../foo` (when ran in a subdir of the repo). + * Add configure step to build process. + * Only use cp -a if it is supported, falling back to cp -p or plain cp + as needed for portability. + * cp --reflink=auto is used if supported, and will make git annex unlock + much faster on filesystems like btrfs that support copy on write. + + -- Joey Hess Sun, 21 Nov 2010 13:45:44 -0400 + +git-annex (0.07) unstable; urgency=low + + * find: New subcommand. + * unused: New subcommand, finds unused data. (Split out from fsck.) + * dropunused: New subcommand, provides for easy dropping of unused keys + by number, as listed by the unused subcommand. + * fsck: Print warnings to stderr; --quiet can now be used to only see + problems. + + -- Joey Hess Mon, 15 Nov 2010 18:41:50 -0400 + +git-annex (0.06) unstable; urgency=low + + * fsck: Check if annex.numcopies is satisfied. + * fsck: Verify the sha1 of files when the SHA1 backend is used. + * fsck: Verify the size of files when the WORM backend is used. + * fsck: Allow specifying individual files if fscking everything + is not desired. + * fsck: Fix bug, introduced in 0.04, in detection of unused data. + + -- Joey Hess Sat, 13 Nov 2010 16:24:29 -0400 + +git-annex (0.05) unstable; urgency=low + + * Optimize both pre-commit and lock subcommands to not call git diff + on every file being committed/locked. + (This actually also works around a bug in ghc, that caused + git-annex 0.04 pre-commit to sometimes corrupt filename being read + from git ls-files and fail. + See + The excessive number of calls made by pre-commit exposed the ghc bug. + Thanks Josh Triplett for the debugging.) + * Build with -O2. + + -- Joey Hess Thu, 11 Nov 2010 18:31:09 -0400 + +git-annex (0.04) unstable; urgency=low + + * Add unlock subcommand, which replaces the symlink with a copy of + the file's content in preparation of changing it. The "edit" subcommand + is an alias for unlock. + * Add lock subcommand. + * Unlocked files will now automatically be added back into the annex when + committed (and the updated symlink committed), by some magic in the + pre-commit hook. + * The SHA1 backend is now fully usable. + * Add annex.version, which will be used to automate upgrades + between incompatible versions. + * Reorganised the layout of .git/annex/ + * The new layout will be automatically upgraded to the first time + git-annex is used in a repository with the old layout. + * Note that git-annex 0.04 cannot transfer content from old repositories + that have not yet been upgraded. + * Annexed file contents are now made unwritable and put in unwriteable + directories, to avoid them accidentially being removed or modified. + (Thanks Josh Triplett for the idea.) + * Add build dep on libghc6-testpack-dev. Closes: #603016 + * Avoid using runghc to run test suite as it is not available on all + architectures. Closes: #603006 + + -- Joey Hess Wed, 10 Nov 2010 14:23:23 -0400 + +git-annex (0.03) unstable; urgency=low + + * Fix support for file:// remotes. + * Add --verbose + * Fix SIGINT handling. + * Fix handling of files with unusual characters in their name. + * Fixed memory leak; git-annex no longer reads the whole file list + from git before starting, and will be much faster with large repos. + * Fix crash on unknown symlinks. + * Added remote.annex-scp-options and remote.annex-ssh-options. + * The backends to use when adding different sets of files can be configured + via gitattributes. + * In .gitattributes, the git-annex-backend attribute can be set to the + names of backends to use when adding different types of files. + * Add fsck subcommand. (For now it only finds unused key contents in the + annex.) + + -- Joey Hess Sun, 07 Nov 2010 18:26:04 -0400 + +git-annex (0.02) unstable; urgency=low + + * Can scp annexed files from remote hosts, and check remote hosts for + file content when dropping files. + * New move subcommand, that makes it easy to move file contents from + or to a remote. + * New fromkey subcommand, for registering urls, etc. + * git-annex init will now set up a pre-commit hook that fixes up symlinks + before they are committed, to ensure that moving symlinks around does not + break them. + * More intelligent and fast staging of modified files; git add coalescing. + * Add remote.annex-ignore git config setting to allow completly disabling + a given remote. + * --from/--to can be used to control the remote repository that git-annex + uses. + * --quiet can be used to avoid verbose output + * New plumbing-level dropkey and addkey subcommands. + * Lots of bug fixes. + + -- Joey Hess Wed, 27 Oct 2010 16:39:29 -0400 + +git-annex (0.01) unstable; urgency=low + + * First prerelease. + + -- Joey Hess Wed, 20 Oct 2010 12:54:24 -0400 diff --git a/debian/compat b/debian/compat new file mode 100644 index 000000000..ec635144f --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 000000000..e37f7d05e --- /dev/null +++ b/debian/control @@ -0,0 +1,115 @@ +Source: git-annex +Section: utils +Priority: optional +Build-Depends: + debhelper (>= 9), + ghc (>= 7.4), + libghc-mtl-dev (>= 2.1.1), + libghc-missingh-dev, + libghc-data-default-dev, + libghc-hslogger-dev, + libghc-pcre-light-dev, + libghc-sha-dev, + libghc-cryptohash-dev, + libghc-dataenc-dev, + libghc-utf8-string-dev, + libghc-hs3-dev (>= 0.5.6), + libghc-dav-dev (>= 0.6.1) [amd64 i386 kfreebsd-amd64 kfreebsd-i386 powerpc], + libghc-quickcheck2-dev, + libghc-monad-control-dev (>= 0.3), + libghc-exceptions-dev, + libghc-unix-compat-dev, + libghc-dlist-dev, + libghc-uuid-dev, + libghc-json-dev, + libghc-aeson-dev, + libghc-ifelse-dev, + libghc-bloomfilter-dev, + libghc-edit-distance-dev, + libghc-extensible-exceptions-dev, + libghc-hinotify-dev [linux-any], + libghc-stm-dev (>= 2.3), + libghc-dbus-dev (>= 0.10.3) [linux-any], + libghc-fdo-notify-dev (>= 0.3) [linux-any], + libghc-yesod-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-yesod-static-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-yesod-default-dev [i386 amd64 kfreebsd-amd64 powerpc sparc], + libghc-hamlet-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-shakespeare-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-clientsession-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-warp-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-warp-tls-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-wai-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-wai-extra-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-securemem-dev, + libghc-byteable-dev, + libghc-dns-dev, + libghc-case-insensitive-dev, + libghc-http-types-dev, + libghc-blaze-builder-dev, + libghc-crypto-api-dev, + libghc-network-multicast-dev, + libghc-network-info-dev [linux-any kfreebsd-any], + libghc-safesemaphore-dev, + libghc-network-protocol-xmpp-dev (>= 0.4.3-1+b1), + libghc-gnutls-dev (>= 0.1.4), + libghc-xml-types-dev, + libghc-async-dev, + libghc-http-dev, + libghc-feed-dev (>= 0.3.9.2), + libghc-regex-tdfa-dev [!mipsel !s390], + libghc-regex-compat-dev [mipsel s390], + libghc-tasty-dev (>= 0.7) [!mipsel !sparc], + libghc-tasty-hunit-dev [!mipsel !sparc], + libghc-tasty-quickcheck-dev [!mipsel !sparc], + libghc-tasty-rerun-dev [!mipsel !sparc], + libghc-optparse-applicative-dev [!sparc], + lsof [!kfreebsd-i386 !kfreebsd-amd64], + ikiwiki, + perlmagick, + git (>= 1:1.8.4), + rsync, + wget, + curl, + openssh-client, + git-remote-gcrypt (>= 0.20130908-6), +Maintainer: Joey Hess +Standards-Version: 3.9.5 +Vcs-Git: git://git.kitenet.net/git-annex +Homepage: http://git-annex.branchable.com/ +XS-Testsuite: autopkgtest + +Package: git-annex +Architecture: any +Section: utils +Depends: ${misc:Depends}, ${shlibs:Depends}, + git (>= 1:1.8.4), + rsync, + wget, + curl, + openssh-client (>= 1:5.6p1) +Recommends: + lsof, + gnupg, + bind9-host, + quvi, + git-remote-gcrypt (>= 0.20130908-6), + nocache, +Suggests: + graphviz, + bup, + tahoe-lafs, + libnss-mdns, +Description: manage files with git, without checking their contents into git + git-annex allows managing files with git, without checking the file + contents into git. While that may seem paradoxical, it is useful when + dealing with files larger than git can currently easily handle, whether due + to limitations in memory, time, or disk space. + . + Even without file content tracking, being able to manage files with git, + move files around and delete files with versioned directory trees, and use + branches and distributed clones, are all very handy reasons to use git. And + annexed files can co-exist in the same git repository with regularly + versioned files, which is convenient for maintaining documents, Makefiles, + etc that are associated with annexed files but that benefit from full + revision control. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 000000000..19d61f228 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,821 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Source: native package + +Files: * +Copyright: © 2010-2014 Joey Hess +License: GPL-3+ + +Files: Assistant/WebApp.hs Assistant/WebApp/* templates/* static/* +Copyright: © 2012-2014 Joey Hess + © 2014 Sören Brunk +License: AGPL-3+ + +Files: Remote/Ddar.hs +Copyright: © 2011 Joey Hess + © 2014 Robie Basak +License: GPL-3+ + +Files: Utility/ThreadScheduler.hs +Copyright: 2011 Bas van Dijk & Roel van Dijk + 2012, 2013 Joey Hess +License: BSD-2-clause + +Files: Utility/* +Copyright: 2012-2014 Joey Hess +License: BSD-2-clause + +Files: Utility/Gpg.hs Utility/DirWatcher* +Copyright: © 2010-2014 Joey Hess +License: GPL-3+ + +Files: doc/logo* */favicon.ico standalone/osx/git-annex.app/Contents/Resources/git-annex.icns standalone/android/icons/* +Copyright: 2007 Henrik Nyh + 2010 Joey Hess + 2013 John Lawrence +License: other + Free to modify and redistribute with due credit, and obviously free to use. + +Files: Utility/Mounts.hsc +Copyright: Volker Wysk +License: LGPL-2.1+ + +Files: Utility/libmounts.c +Copyright: 1980, 1989, 1993, 1994 The Regents of the University of California + 2001 David Rufino + 2012 Joey Hess +License: BSD-3-clause + * Copyright (c) 1980, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2001 + * David Rufino + * Copyright 2012 + * Joey Hess + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +Files: static/jquery* +Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer + © 2011 The Dojo Foundation +License: MIT or GPL-2 + The full text of version 2 of the GPL is distributed in + /usr/share/common-licenses/GPL-2 on Debian systems. The text of the MIT + license follows: + . + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Files: static/*/bootstrap* static/*/glyphicons-halflings* +Copyright: 2012-2014 Twitter, Inc. +License: MIT + Copyright (c) 2011-2014 Twitter, Inc + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +License: GPL-3+ + The full text of version 3 of the GPL is distributed as doc/license/GPL in + this package's source, or in /usr/share/common-licenses/GPL-3 on + Debian systems. + +License: LGPL-2.1+ + The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL + in this package's source, or in /usr/share/common-licenses/LGPL-2.1 + on Debian systems. + +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY AUTHORS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +License: AGPL-3+ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + . + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + . + Preamble + . + The GNU Affero General Public License is a free, copyleft license for + software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software. + . + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + our General Public Licenses are intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains free + software for all its users. + . + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things. + . + Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer + you this License which gives you legal permission to copy, distribute + and/or modify the software. + . + A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they + receive widespread use, become available for other developers to + incorporate. Many developers of free software are heartened and + encouraged by the resulting cooperation. However, in the case of + software used on network servers, this result may fail to come about. + The GNU General Public License permits making a modified version and + letting the public access it on a server without ever releasing its + source code to the public. + . + The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version. + . + An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing under + this license. + . + The precise terms and conditions for copying, distribution and + modification follow. + . + TERMS AND CONDITIONS + . + 0. Definitions. + . + "This License" refers to version 3 of the GNU Affero General Public License. + . + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + . + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + . + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work. + . + A "covered work" means either the unmodified Program or a work based + on the Program. + . + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + . + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying. + . + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion. + . + 1. Source Code. + . + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + . + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language. + . + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + . + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + . + The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source. + . + The Corresponding Source for a work in source code form is that + same work. + . + 2. Basic Permissions. + . + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + . + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you. + . + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary. + . + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + . + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures. + . + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + . + 4. Conveying Verbatim Copies. + . + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + . + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + . + 5. Conveying Modified Source Versions. + . + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions: + . + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + . + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + . + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + . + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + . + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate. + . + 6. Conveying Non-Source Forms. + . + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways: + . + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + . + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + . + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + . + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + . + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + . + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work. + . + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product. + . + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made. + . + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM). + . + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + . + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + . + 7. Additional Terms. + . + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + . + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + . + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms: + . + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + . + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + . + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + . + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + . + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + . + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + . + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + . + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + . + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way. + . + 8. Termination. + . + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + . + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation. + . + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + . + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + . + 9. Acceptance Not Required for Having Copies. + . + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so. + . + 10. Automatic Licensing of Downstream Recipients. + . + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + . + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts. + . + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + . + 11. Patents. + . + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + . + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License. + . + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + . + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + . + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + . + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + . + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007. + . + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + . + 12. No Surrender of Others' Freedom. + . + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + . + 13. Remote Network Interaction; Use with the GNU General Public License. + . + Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your version + supports such interaction) an opportunity to receive the Corresponding + Source of your version by providing access to the Corresponding Source + from a network server at no charge, through some standard or customary + means of facilitating copying of software. This Corresponding Source + shall include the Corresponding Source for any work covered by version 3 + of the GNU General Public License that is incorporated pursuant to the + following paragraph. + . + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the work with which it is combined will remain governed by version + 3 of the GNU General Public License. + . + 14. Revised Versions of this License. + . + The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + . + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU Affero General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU Affero General Public License, you may choose any version ever published + by the Free Software Foundation. + . + If the Program specifies that a proxy can decide which future + versions of the GNU Affero General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + . + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + . + 15. Disclaimer of Warranty. + . + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + . + 16. Limitation of Liability. + . + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + . + 17. Interpretation of Sections 15 and 16. + . + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + . + END OF TERMS AND CONDITIONS + . + How to Apply These Terms to Your New Programs + . + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + . + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + . + + Copyright (C) + . + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + . + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + . + Also add information on how to contact you by electronic and paper mail. + . + If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements. + . + You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU AGPL, see + . diff --git a/debian/doc-base b/debian/doc-base new file mode 100644 index 000000000..f71a23333 --- /dev/null +++ b/debian/doc-base @@ -0,0 +1,9 @@ +Document: git-annex +Title: git-annex documentation +Author: Joey Hess +Abstract: All the documentation from git-annex's website. +Section: File Management + +Format: HTML +Index: /usr/share/doc/git-annex/html/index.html +Files: /usr/share/doc/git-annex/html/*.html diff --git a/debian/menu b/debian/menu new file mode 100644 index 000000000..20790a94c --- /dev/null +++ b/debian/menu @@ -0,0 +1,2 @@ +?package(git-annex):needs="X11" section="Applications/Network/File Transfer" \ + title="git-annex assistant" command="git-annex webapp" diff --git a/debian/rules b/debian/rules new file mode 100755 index 000000000..3a0511fa6 --- /dev/null +++ b/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +# Avoid using cabal, as it writes to $HOME +export CABAL=./Setup + +# Do use the changelog's version number, rather than making one up. +export RELEASE_BUILD=1 + +%: + dh $@ + +# Not intended for use by anyone except the author. +announcedir: + @echo ${HOME}/src/git-annex/doc/news diff --git a/debian/tests/basics b/debian/tests/basics new file mode 100644 index 000000000..2e4ea43fc --- /dev/null +++ b/debian/tests/basics @@ -0,0 +1,4 @@ +#!/bin/sh +testdir="$(mktemp -d)" +cd "$testdir" +exec git-annex test diff --git a/debian/tests/control b/debian/tests/control new file mode 100644 index 000000000..928caf8e3 --- /dev/null +++ b/debian/tests/control @@ -0,0 +1,4 @@ +Tests: basics +Depends: @, git, rsync, gnupg +Restrictions: allow-stderr + diff --git a/doc/Android.mdwn b/doc/Android.mdwn new file mode 100644 index 000000000..71263ea8d --- /dev/null +++ b/doc/Android.mdwn @@ -0,0 +1,53 @@ +git-annex is now available for Android. This includes the +[[git-annex assistant|/assistant]], for easy syncing between your Android +and other devices. You do not need to root your Android to use git-annex. + +[[Android installation instructions|/install/android]] + +When you run the git-annex Android app, two windows will open. The first is +a terminal window, and the second is a web browser showing the git-annex +webapp. + +[[!img apps.png alt="two windows"]] + +[[!toc ]] + +## closing and reopening the webapp + +The webapp does not need to be left open after you've set up your +repository. As long as the terminal window is left open, git-annex will +remain running and sync your files. To re-open the webapp after closing it, +use the [[!img newwindow.png alt="New Window"]] icon in the terminal window. + +## starting git-annex + +The app is not currently automatically started on boot, so you will need to +manually open it to keep your files in sync. You do not need to leave the +app running all the time, though. It will sync back up automatically when +started. + +## stopping git-annex + +Simply close the terminal window to stop git-annex from running. + +## using the command line + +[[!img terminal.png alt="Android terminal"]] + +If you prefer to use `git-annex` at the command line, you can do so using the +terminal. A fairly full set of tools is provided, including `git`, `ssh`, +`rsync`, and `gpg`. + +To prevent the webapp from being automatically started +when a terminal window opens, go into the terminal preferences, to "Inital +Command", and clear out the default `git annex webapp` setting. + +Or, if you'd like to run the assistant automatically, but not open the +webapp, change the "Initial Command" to: `git annex assistant --autostart` + +## using from adb shell + +To set up the git-annex environment from within `adb shell`, run: +`/data/data/ga.androidterm/runshell` + +This will launch a shell that has git-annex, git, etc in PATH. diff --git a/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment b/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment new file mode 100644 index 000000000..009ada003 --- /dev/null +++ b/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="SSH Keys?" + date="2013-07-17T16:50:46Z" + content=""" +Is there a way I can use an SSH Key to connect to a remote server? What would be really cool, though maybe not feasible, would be to use connectbot as an ssh-agent. +"""]] diff --git a/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment b/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment new file mode 100644 index 000000000..56a4bb632 --- /dev/null +++ b/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 20" + date="2013-07-17T19:06:31Z" + content=""" +@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. + +The openssh included in the git-annex app fully supports everything you can usually do with ssh keys, so you can also set this up by hand. +"""]] diff --git a/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment b/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment new file mode 100644 index 000000000..448050d12 --- /dev/null +++ b/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 29" + date="2013-07-30T17:45:27Z" + content=""" +If you are experiencing a problem using git-annex on Android, please examine the list of [[bugs]] and add a new, detailed bug report if no-one has reported the problem. If you are not sure if you have a bug, or need help in filing a good bug report, ask for help in the [[forum]]. + +I have moved to [[oldcomments]] a lot of old comments about problems that may be fixed or +not (hard to tell without a bug report!) " This page cannot +scale to handle every bug report that someone wants to paste into it. +"""]] diff --git a/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment b/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment new file mode 100644 index 000000000..54053b43d --- /dev/null +++ b/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://mebus.myopenid.com/" + ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3" + subject="comment 5" + date="2013-10-19T18:05:52Z" + content=""" +Hallo, + +how can I use the app with public/private keys for SSH. Where can I add them? + +Thanks + +Mebus + + +"""]] diff --git a/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment b/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment new file mode 100644 index 000000000..39c44a8fb --- /dev/null +++ b/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk2BFMjJW081uX4aJdhStmSFPBUGzL92ZU" + nickname="Frédéric" + subject="where do I put the SSH keys on Android" + date="2014-02-26T20:26:38Z" + content=""" +@mebus : +You can put your SSH keys here : + +/sdcard/git-annex.home/.ssh/id_rsa + +/sdcard/git-annex.home/.ssh/id_rsa.pub +"""]] diff --git a/doc/Android/oldcomments.mdwn b/doc/Android/oldcomments.mdwn new file mode 100644 index 000000000..3566712cd --- /dev/null +++ b/doc/Android/oldcomments.mdwn @@ -0,0 +1,2 @@ +If one of these comments is yours, and you are still experiencing the +problem, please file a proper [[bug_report|bugs]]. --[[Joey]] diff --git a/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment new file mode 100644 index 000000000..cf7a4fdb5 --- /dev/null +++ b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 10" + date="2013-05-24T03:11:50Z" + content=""" +>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused. + +;-) Sorry for confusion, here are the details: + +\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so . +Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here. + +I will try fresh build now +Cheers, +"""]] diff --git a/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment new file mode 100644 index 000000000..2e1ba6560 --- /dev/null +++ b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="fresh build" + date="2013-05-24T03:21:29Z" + content=""" +With fresh build got: + +u0_a39@android:/ $ git annex webapp +/system/bin/sh: git: not found + +the PATH is /sbin:/system/bin:/system/xbin + +where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39) +"""]] diff --git a/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment new file mode 100644 index 000000000..39ce3e058 --- /dev/null +++ b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-05-24T03:26:33Z" + content=""" +You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH + +However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen. +"""]] diff --git a/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment new file mode 100644 index 000000000..dae84414b --- /dev/null +++ b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="Still problems with my old N1/CM7" + date="2013-05-24T06:01:18Z" + content=""" +Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed. +"""]] diff --git a/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment new file mode 100644 index 000000000..a6f4598f6 --- /dev/null +++ b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="It starts after uninstall/install" + date="2013-05-24T23:29:52Z" + content=""" +Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned). So I have removed previous installation and reinstalled it again -- it starts now! Thanks ;) +"""]] diff --git a/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment b/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment new file mode 100644 index 000000000..0ecd59fe6 --- /dev/null +++ b/doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="asking for ssh password in the terminal (not in web ui)" + date="2013-05-24T23:49:40Z" + content=""" +not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise +"""]] diff --git a/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment new file mode 100644 index 000000000..07923c172 --- /dev/null +++ b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Few other issues" + date="2013-05-25T15:35:46Z" + content=""" +Hi again. + +talking about 4.20130523-gcfe07a2 version: + +- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup? I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable. I had to switch to \"full backup\" (or whatever that name) to finally get directory synced + +- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname onerussian.com: No address associated with hostname +fatal: Could not read from remote repository. + +IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity + +- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed. Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there): + +error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory +fatal: unable to fork + +"""]] diff --git a/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment new file mode 100644 index 000000000..bc4a64810 --- /dev/null +++ b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 17" + date="2013-05-29T02:43:29Z" + content=""" +joey -- any additional information could I provide to troubleshoot the issue? original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it... +"""]] diff --git a/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment new file mode 100644 index 000000000..bf9d79060 --- /dev/null +++ b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://aap.liquidid.net/" + nickname="AAP" + subject="comment 18" + date="2013-05-30T11:23:58Z" + content=""" +I too get the 'link busybox: Read-only file system' message. Here is my phone info: + +Phone: Samsung Galaxy Y GT-S5360 (rooted) +Android: 2.3.6 Gingerbread +BusyBox path: /system/xbin/ + + +Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns + + drwxr-x--x 1 app_97 app_97 0 May 30 12:57 /data/data/ga.androidterm/ +"""]] diff --git a/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment new file mode 100644 index 000000000..44b1a5d70 --- /dev/null +++ b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Does it require the device to be rooted?" + date="2013-05-16T20:55:45Z" + content=""" +Following your news on kickstarter downloaded the .apk, and installed it. Upn start I just got a terminal window with + + link busybox: Read-only file system + + [Terminal session finished] + +That is on Galaxy Note + +"""]] diff --git a/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment new file mode 100644 index 000000000..1e247b96a --- /dev/null +++ b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="SSH Keys - 2" + date="2013-07-17T22:56:37Z" + content=""" +@joey should I be using the nightlies to see that? Under \"Adding a remote server using ssh\" I only see Host name, user name, directory, and port. Will it only be an option after I type in a password? +"""]] diff --git a/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment new file mode 100644 index 000000000..e5b5f964a --- /dev/null +++ b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 22" + date="2013-07-17T23:25:21Z" + content=""" +@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server. +"""]] diff --git a/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment new file mode 100644 index 000000000..1f34a775e --- /dev/null +++ b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="comment 23" + date="2013-07-18T02:01:28Z" + content=""" +@joey: ok, I got it to connect and it indeed sent over a key etc. For some reason now though git-annex (on android) \"crashes\" shortly after starting. To be clear, the web app says that the program crashed, the console is still there. I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell. Any ideas what I should do next? (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :) +"""]] diff --git a/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment new file mode 100644 index 000000000..fdec15ac6 --- /dev/null +++ b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="comment 24" + date="2013-07-18T11:35:06Z" + content=""" +ok, it eventually got the details from the remote server, but now I'm getting some other oddities. here is some of my log that shows what I am running into + +Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) +"""]] diff --git a/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment new file mode 100644 index 000000000..aa74230dc --- /dev/null +++ b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU" + nickname="Frew" + subject="comment 25" + date="2013-07-18T13:14:46Z" + content=""" +frioux here (something messed up with myopenid or something) + +So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP. It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again. It looks like it's about a 4s repeat loop. Any ideas what I should do next? +"""]] diff --git a/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment new file mode 100644 index 000000000..c7c0e623f --- /dev/null +++ b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 26" + date="2013-07-18T17:07:27Z" + content=""" +@Frew, you should file bug reports when you have a bug. + +One problem you mentioned had already had a bug report filed by someone +else: + So you can post your details there. +"""]] diff --git a/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment new file mode 100644 index 000000000..b77e0873f --- /dev/null +++ b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Watcher crashed in Android on /storage/sdcard1 - bug?" + date="2013-07-29T11:50:46Z" + content=""" +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +!warning + +Watcher crashed: addWatch: + +permission denied (Permission denied) + +[Restart Thread] + +:Performing startup scan + + +In terminal Window 1: + +nex webapp < + + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + +Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723 +"""]] diff --git a/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment new file mode 100644 index 000000000..cf315c0d9 --- /dev/null +++ b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Jonathan" + ip="63.131.117.194" + subject="link busybox: Read-only file system" + date="2013-07-29T20:08:12Z" + content=""" +Phone: HTC EVO 3d 4g +Model Number: pg86100 +Android Version: 4.0.3 +"""]] diff --git a/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment new file mode 100644 index 000000000..bfa4decc4 --- /dev/null +++ b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-17T22:28:34Z" + content=""" +The Android app works on many non-rooted Android systems. + +The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number. +"""]] diff --git a/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment new file mode 100644 index 000000000..fdbfac1c6 --- /dev/null +++ b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Follow-up information on my system" + date="2013-05-18T01:23:28Z" + content=""" +Sorry for the delay: my android is stock Samsung-tuned Jelly beans. +Android 4.1.2 +Baseband version N7000XXLSO + +not sure if that would be of any use :-/ nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by? + + +"""]] diff --git a/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment new file mode 100644 index 000000000..ad46a26be --- /dev/null +++ b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs" + nickname="Chris" + subject="Not starting browser on Nexus 7, Android 4.2.2" + date="2013-05-19T14:04:28Z" + content=""" +I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: + +In spite of that, though, the URL provided still worked. +"""]] diff --git a/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment new file mode 100644 index 000000000..d29a59036 --- /dev/null +++ b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-19T19:46:14Z" + content=""" +@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]] +"""]] diff --git a/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment new file mode 100644 index 000000000..1c4aceaef --- /dev/null +++ b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-19T20:06:56Z" + content=""" +@yarikoptic, there is a process you can perform that will help me determine what's going on. + +You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\" + +Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run: + +ls -ld /data/data/ga.androidterm + +I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`. + +My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself. +"""]] diff --git a/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment new file mode 100644 index 000000000..df0c0a2de --- /dev/null +++ b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="Link issue" + date="2013-05-22T12:01:38Z" + content=""" +Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests. +"""]] diff --git a/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment new file mode 100644 index 000000000..43ff8d64b --- /dev/null +++ b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="why ln failed" + date="2013-05-23T13:27:39Z" + content=""" +Finally got to check it out: so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\" that lib is -> /mnt/asec/ga.androidterm-1/lib which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10) +"""]] diff --git a/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment new file mode 100644 index 000000000..0970412a4 --- /dev/null +++ b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-05-23T18:44:46Z" + content=""" +@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused. + +I've reworked the android app to not need any hard links. Try the current autobuild: +"""]] diff --git a/doc/android/DCIM.png b/doc/android/DCIM.png new file mode 100644 index 000000000..3ac093323 Binary files /dev/null and b/doc/android/DCIM.png differ diff --git a/doc/android/appinstalled.png b/doc/android/appinstalled.png new file mode 100644 index 000000000..166120d48 Binary files /dev/null and b/doc/android/appinstalled.png differ diff --git a/doc/android/apps.png b/doc/android/apps.png new file mode 100644 index 000000000..310757f1e Binary files /dev/null and b/doc/android/apps.png differ diff --git a/doc/android/install.png b/doc/android/install.png new file mode 100644 index 000000000..882455df1 Binary files /dev/null and b/doc/android/install.png differ diff --git a/doc/android/newwindow.png b/doc/android/newwindow.png new file mode 100644 index 000000000..4cca6ae09 Binary files /dev/null and b/doc/android/newwindow.png differ diff --git a/doc/android/terminal.png b/doc/android/terminal.png new file mode 100644 index 000000000..9afa2720f Binary files /dev/null and b/doc/android/terminal.png differ diff --git a/doc/android/webapp.png b/doc/android/webapp.png new file mode 100644 index 000000000..edb5c5ccd Binary files /dev/null and b/doc/android/webapp.png differ diff --git a/doc/assistant.mdwn b/doc/assistant.mdwn new file mode 100644 index 000000000..2ed35d6df --- /dev/null +++ b/doc/assistant.mdwn @@ -0,0 +1,41 @@ +The git-annex assistant creates a synchronised folder on each of your +OSX and Linux computers, Android devices, removable drives, NAS appliances, +and cloud services. The contents of the folder are the same everywhere. +It's very easy to use, and has all the power of git and git-annex. + +## installation + +The git-annex assistant comes as part of git-annex. +See [[install]] to get it installed. + +See the [[release_notes]] for an overview of the status, and upgrade +instructions. + +## intro screencast + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_lan]] + +## documentation + +* [[Basic usage|quickstart]] +* [[Android documentation|/Android]] +* Want to make two nearby computers share the same synchronised folder? + Follow the [[local_pairing_walkthrough]]. +* Or perhaps you want to share files between computers in different + locations, like home and work? + Follow the [[remote_sharing_walkthrough]]. +* Want to share a synchronised folder with a friend? + Follow the [[share_with_a_friend_walkthrough]]. +* Want to archive data to a drive or the cloud? + Follow the [[archival_walkthrough]]. + +## colophon + +The git-annex assistant was [crowd funded on +Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/). +[[/Thanks]] to all my backers. + +I blog about my work on git-annex and the assistant on a daily basis +in [[this_blog|/devblog]]. Follow along! + +See also: The [[design|/design/assistant]] pages. diff --git a/doc/assistant/addsshserver.png b/doc/assistant/addsshserver.png new file mode 100644 index 000000000..80f5d5617 Binary files /dev/null and b/doc/assistant/addsshserver.png differ diff --git a/doc/assistant/archival_walkthrough.mdwn b/doc/assistant/archival_walkthrough.mdwn new file mode 100644 index 000000000..925e34944 --- /dev/null +++ b/doc/assistant/archival_walkthrough.mdwn @@ -0,0 +1,32 @@ +Normally, the git-annex assistant makes your files be available +wherever you use it, and so a copy of each file is stored in each repository. +That's perfect for files you're using right now, but what about files you're +not using any more? + +You could just delete those files, but it's better to archive them, so +you can access them later. All you need to get started archiving your old +files is a USB drive, or an [Amazon Glacier](http://aws.amazon.com/glacier/) +account. + +The webapp makes it easy to make a repository on either a USB drive, +or on Amazon Glacier. Once the repository is created, be sure to +put it in either the small archive, or full archive repository group. + +[[!img repogroups.png]] + +Now when you're done with a file, just move it into a directory named +"archive". The assistant will notice you put it there, and next time it +has the opportunity (when you plug in the USB drive, or when it can +talk to Amazon Glacier over the network), will move the file's +content to your archive repository. + +You'll no longer be able to open the file once it's been archived. +If you later want to access it, you can just copy or move it out +of the archive directory, and the assistant will retrieve its +content from the archive. + +Note that retrieving data from Amazon Glacier takes 4 to 5 hours. + +### screencast + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_archiving]] diff --git a/doc/assistant/brokenrepositoryalert.png b/doc/assistant/brokenrepositoryalert.png new file mode 100644 index 000000000..ea001aec0 Binary files /dev/null and b/doc/assistant/brokenrepositoryalert.png differ diff --git a/doc/assistant/buddylist.png b/doc/assistant/buddylist.png new file mode 100644 index 000000000..40b5a9238 Binary files /dev/null and b/doc/assistant/buddylist.png differ diff --git a/doc/assistant/cloudnudge.png b/doc/assistant/cloudnudge.png new file mode 100644 index 000000000..b6f9a657e Binary files /dev/null and b/doc/assistant/cloudnudge.png differ diff --git a/doc/assistant/combinerepos.png b/doc/assistant/combinerepos.png new file mode 100644 index 000000000..7beea71bc Binary files /dev/null and b/doc/assistant/combinerepos.png differ diff --git a/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment b/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment new file mode 100644 index 000000000..1ed185e48 --- /dev/null +++ b/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYrMBMTCEFUKskhWGD-1pzcw2ITshsi_8" + nickname="Robert" + subject="Annex on OS X 10.6" + date="2013-06-04T23:10:03Z" + content=""" +I really hope they can get annex working on os x 10.6. This is a great effort. Thanks +"""]] diff --git a/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment b/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment new file mode 100644 index 000000000..cbc955b07 --- /dev/null +++ b/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9smfyJFgp3f2WjqqZWY6b7vo5eZv7GGQ" + nickname="Bryan" + subject="Ooh. Do want on Windows" + date="2013-07-03T20:44:05Z" + content=""" +Sadly, I didn't know about this when the Kickstarter was underway - I'd be happy to chip in $100 if it means I can get annex assistant on Windows earlier. + +"""]] diff --git a/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment b/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment new file mode 100644 index 000000000..996c6e606 --- /dev/null +++ b/doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnov5q9_Cl4Ps5NoYE08yE01NLSvBANnY8" + nickname="Eric" + subject="Does it not work in Direct Mode?" + date="2014-04-26T09:41:20Z" + content=""" +Looks great, but I got the impression that Assistant would mirror the files from my computer to my external hard drive, and I can't seem to get it to do that. +"""]] diff --git a/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment b/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment new file mode 100644 index 000000000..82be4c193 --- /dev/null +++ b/doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlr2Bj0Mzqwzl28cbrotcQUbOFoaPB3B_Y" + nickname="Tomasz" + subject="how to disable assistant" + date="2014-04-28T10:21:59Z" + content=""" +assistant daemon now starts at boot and pushes all annexed files to other repos... I'd like to do it on my own. I can stop daemon from webapp, but it starts again on boot - how Do I disable it from autostarting ? +"""]] diff --git a/doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment b/doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment new file mode 100644 index 000000000..27d343021 --- /dev/null +++ b/doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 5" + date="2014-05-16T18:55:22Z" + content=""" +If you have a question about using the assistant, please ask it in the [[forum]], not here. +"""]] diff --git a/doc/assistant/connection.png b/doc/assistant/connection.png new file mode 100644 index 000000000..3cd6bef86 Binary files /dev/null and b/doc/assistant/connection.png differ diff --git a/doc/assistant/controlmenu.png b/doc/assistant/controlmenu.png new file mode 100644 index 000000000..c1dac197b Binary files /dev/null and b/doc/assistant/controlmenu.png differ diff --git a/doc/assistant/crashrecovery.png b/doc/assistant/crashrecovery.png new file mode 100644 index 000000000..fce3805d0 Binary files /dev/null and b/doc/assistant/crashrecovery.png differ diff --git a/doc/assistant/dashboard.png b/doc/assistant/dashboard.png new file mode 100644 index 000000000..c71558d79 Binary files /dev/null and b/doc/assistant/dashboard.png differ diff --git a/doc/assistant/deleterepository.png b/doc/assistant/deleterepository.png new file mode 100644 index 000000000..20db674ca Binary files /dev/null and b/doc/assistant/deleterepository.png differ diff --git a/doc/assistant/downloadnotification.png b/doc/assistant/downloadnotification.png new file mode 100644 index 000000000..32b04f122 Binary files /dev/null and b/doc/assistant/downloadnotification.png differ diff --git a/doc/assistant/downloadupgrade.png b/doc/assistant/downloadupgrade.png new file mode 100644 index 000000000..157eaddc7 Binary files /dev/null and b/doc/assistant/downloadupgrade.png differ diff --git a/doc/assistant/encryptdrive.png b/doc/assistant/encryptdrive.png new file mode 100644 index 000000000..1cb041dda Binary files /dev/null and b/doc/assistant/encryptdrive.png differ diff --git a/doc/assistant/example.png b/doc/assistant/example.png new file mode 100644 index 000000000..bfcb9afa6 Binary files /dev/null and b/doc/assistant/example.png differ diff --git a/doc/assistant/fsckconfig.png b/doc/assistant/fsckconfig.png new file mode 100644 index 000000000..81ae755cf Binary files /dev/null and b/doc/assistant/fsckconfig.png differ diff --git a/doc/assistant/genkey.png b/doc/assistant/genkey.png new file mode 100644 index 000000000..6c1e50971 Binary files /dev/null and b/doc/assistant/genkey.png differ diff --git a/doc/assistant/iaitem.png b/doc/assistant/iaitem.png new file mode 100644 index 000000000..2fcc1b4c8 Binary files /dev/null and b/doc/assistant/iaitem.png differ diff --git a/doc/assistant/inotify_max_limit_alert.png b/doc/assistant/inotify_max_limit_alert.png new file mode 100644 index 000000000..d8d334152 Binary files /dev/null and b/doc/assistant/inotify_max_limit_alert.png differ diff --git a/doc/assistant/local_pairing_walkthrough.mdwn b/doc/assistant/local_pairing_walkthrough.mdwn new file mode 100644 index 000000000..f6282ec28 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough.mdwn @@ -0,0 +1,90 @@ +So you have two computers in the same building, and you want them to share +the same synchronised folder, communicating directly with each other. + +This is incredibly easy to set up with the git annex assistant. + +Let's say the two computers are your computer and your friend's computer. +We'll start on your computer, where you open up your git annex dashboard. + +[[!img addrepository.png alt="Add another repository button"]] + +`*click*` + +[[!img pairing.png alt="Pair with another computer"]] + +`*click*` + +Now the hard bit. You have to think up a secret phrase, and type it in, +(and perhaps get the spelling correct). + +[[!img secret.png alt="Enter secret phrase"]] + +Now your computer is in pairing mode. When your friend looks at her git +annex dashboard, she sees something like this. + +[[!img pairrequest.png alt="Pair request"]] + +`*click*` + +[[!img secretempty.png alt="Enter same secret phrase"]] + +Now it's up to you to let her know what the secret is. As soon as she +enters it, both your computers will be paired, and will begin to sync their +git-annex folders. Just like that you can share files. + +---- + +## Requirements + +For local pairing to work, you must have sshd (ssh server daemon) installed and working on all machines involved. That means you must allow at least local connections to sshd. On most Linux distributions, sshd is packaged in either openssh (openSUSE) or openssh-server (Debian). + +It is highly recommended that you disable root login, disable password login to sshd and just enable key based authentication instead. No one will be able to login without your key. + +To disable root, after installing sshd, edit the sshd config (usually /etc/ssh/sshd_config file) and disable root login by adding: + + PermitRootLogin no + +Restart sshd. See man sshd_config for details. + +To disable password login and enable key based authentication, edit the sshd config (just like above) by uncommenting and changing the following options: + + ChallengeResponseAuthentication no + PasswordAuthentication no + UsePAM no + + PubkeyAuthentication yes + +Restart sshd. See man sshd_config for details. + +You can also restrict login to your local network only (not allow internet users from trying to log into your computer). Edit the hosts.deny file (usually /etc/hosts.deny) by adding the following: + + sshd : ALL EXCEPT LOCAL + +Do note that restricting login to your local network may or may not block git-annex. Also note that this will not work on Mac OSX because Apple decided to disable this feature and replace it with a crippled version made by Apple. + +## Tips + +Something to keep in mind, especially if pairing doesn't seem to be +working, is that the two computers need to be on the same network for this +pairing process to work. Sometimes a building will have more than one +network inside it, and you'll need to connect them both to the same one. +Make sure the wireless network name is the same, or that they're both +plugged into the same router. + +Also, the file sharing set up by this pairing only works when both +computers are on the same network. If you go on a trip, any files you +edit will not be visible to your friend until you get back. + +To get around this, you'll often also want to set up +[[jabber_pairing|share_with_a_friend_walkthrough]], and a server +in the cloud, which they can use to exchange files while away. + +And also, you can pair with as many other computers as you like, not just +one! + +## What does pairing actually do behind the scenes? + +It ensures that both repositories have correctly configured +[[remotes|walkthrough/adding_a_remote]] pointing to each other. +If you have already configured this manually, you do not need to +perform pairing. diff --git a/doc/assistant/local_pairing_walkthrough/addrepository.png b/doc/assistant/local_pairing_walkthrough/addrepository.png new file mode 100644 index 000000000..b82efdbea Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/addrepository.png differ diff --git a/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment b/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment new file mode 100644 index 000000000..52bdc7f4e --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~mattharrison" + ip="69.193.72.98" + subject="Pairing" + date="2012-10-29T17:56:06Z" + content=""" +Is there a way to do this pairing with one machine being a desktop machine and one a headless machine? +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment b/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment new file mode 100644 index 000000000..32d56c907 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="easy peasy" + date="2012-10-29T19:09:43Z" + content=""" +A headless machine is probably a server. On the same page that has the \"local computer\" link, there's a \"remote server\" link that'll get you set up. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment b/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment new file mode 100644 index 000000000..6edaadb75 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Ports to open on the firewall?" + date="2013-05-04T03:56:55Z" + content=""" +I'm trying to get local pairing working between two local machines (same switch, both connected via cat5 cables) and they're not seeing each other, though I can happily ssh from one box to the other. + +In order to eliminate possible sources of problems, I tried these insecure settings: + +* add a `-A INPUT -j ACCEPT` to the top of my firewall rules +* use `password` as the shared secret + +but I still can't get past \"pairing in progress\" when pairing with a \"Local computer\". + +Is there any way to get information as to where the two machines are failing to see one another? +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment b/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment new file mode 100644 index 000000000..6a9637481 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-04T16:39:23Z" + content=""" +Local pairing uses UDP port 55556. This is sent to multicast address 224.0.0.251 (same used by Avahi). + +(You also need TCP port 22 open for ssh.) +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment b/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment new file mode 100644 index 000000000..989e80d8a --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Still stuck at "pairing in progress"" + date="2013-05-05T00:26:16Z" + content=""" +I hadn't thought of ssh. So here's what I've got now: + +* both laptop and desktop have `-A INPUT -d 224.0.0.251/32 -p udp --dport 55556 -j ACCEPT` +* `git annex webapp` is running as user `francois` on both machines +* laptop has `openssh-server` running on port 22 and its firewall allows desktop to connect +* desktop has `openssh-server` running on port 22 and its firewall allows the whole internal network to connect +* laptop's ssh pubkey is in francois' `~/.ssh/authorized_keys` on desktop and ssh'ing works +* deskop's ssh pubkey is **not** in francois' `~/.ssh/authorized_keys` on laptop (is that required?) +* (as mentioned before) both desktop and laptop are on the same switch and connected over CAT5 +* I'm using `password` as a pairing key just to rule out any typos there + +I don't see anything in the git-annex log on both of these machines. There's just a bunch of key generation stuff and then the last line is \"Pairing in progress\". +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment b/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment new file mode 100644 index 000000000..1b2f66bd9 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-06T15:14:06Z" + content=""" +It's quite possible that your router doesn't handle multicast traffic to 224.0.0.251. The best way to check is to a) see if avahi/zeroconf works, since it's sending similar traffic and b) run tcpdump on both machines and see if the packets being sent on port 55556 by one are seen by the other. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment b/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment new file mode 100644 index 000000000..84a921eab --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Make sure your network is correctly set up in the first place!" + date="2013-05-12T08:37:38Z" + content=""" +It turns out that my internal network had badly broken IPv6 configs between the boxes. That was interfering with the multicast packets but not with anything else since all of my other internal traffic is over IPv4. + +Getting rid of these static IPv6 addresses has solved my problem. Local pairing is now working as advertised :) +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment b/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment new file mode 100644 index 000000000..31a0f9674 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-05-13T17:22:17Z" + content=""" +I don't understand how IPv6 could affect local pairing. The assistant does not currently do pairing over ipv6 due to a limitation in the multicast library it's using. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/pairing.png b/doc/assistant/local_pairing_walkthrough/pairing.png new file mode 100644 index 000000000..dfbbf0641 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/pairing.png differ diff --git a/doc/assistant/local_pairing_walkthrough/pairrequest.png b/doc/assistant/local_pairing_walkthrough/pairrequest.png new file mode 100644 index 000000000..8d3f603bf Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/pairrequest.png differ diff --git a/doc/assistant/local_pairing_walkthrough/secret.png b/doc/assistant/local_pairing_walkthrough/secret.png new file mode 100644 index 000000000..1eb805122 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/secret.png differ diff --git a/doc/assistant/local_pairing_walkthrough/secretempty.png b/doc/assistant/local_pairing_walkthrough/secretempty.png new file mode 100644 index 000000000..491878784 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/secretempty.png differ diff --git a/doc/assistant/logs.png b/doc/assistant/logs.png new file mode 100644 index 000000000..8e9e5b1ec Binary files /dev/null and b/doc/assistant/logs.png differ diff --git a/doc/assistant/makerepo.png b/doc/assistant/makerepo.png new file mode 100644 index 000000000..e8f1b2621 Binary files /dev/null and b/doc/assistant/makerepo.png differ diff --git a/doc/assistant/menu.png b/doc/assistant/menu.png new file mode 100644 index 000000000..29a7c9d0f Binary files /dev/null and b/doc/assistant/menu.png differ diff --git a/doc/assistant/nautilusmenu.png b/doc/assistant/nautilusmenu.png new file mode 100644 index 000000000..d7926e34f Binary files /dev/null and b/doc/assistant/nautilusmenu.png differ diff --git a/doc/assistant/osx-app.png b/doc/assistant/osx-app.png new file mode 100644 index 000000000..386fb832d Binary files /dev/null and b/doc/assistant/osx-app.png differ diff --git a/doc/assistant/preferences.png b/doc/assistant/preferences.png new file mode 100644 index 000000000..74fb81418 Binary files /dev/null and b/doc/assistant/preferences.png differ diff --git a/doc/assistant/quickstart.mdwn b/doc/assistant/quickstart.mdwn new file mode 100644 index 000000000..0472ba48b --- /dev/null +++ b/doc/assistant/quickstart.mdwn @@ -0,0 +1,30 @@ +## first run + +To get started with the git-annex assistant, just pick it from +your system's list of applications. + +[[!img assistant/menu.png]] +[[!img assistant/osx-app.png]] + +It'll prompt you to set up a folder: + +[[!img assistant/makerepo.png]] + +Then any changes you make to its folder will automatically be committed to +git, and synced to repositories on other computers. You can use the +interface to add repositories and control the git-annex assistant. + +[[!img assistant/running.png]] + +## starting on boot + +The git-annex assistant will automatically be started when you log in to +desktop environments like Mac OS X, Gnome, XFCE, and KDE, and the menu item +shown above can be used to open the webapp. On other systems, you may need +to start it by hand. + +To start the webapp, run `git annex webapp` at the command line. + +To start the assistant without opening the webapp, +you can run the command "git annex assistant --autostart". This is a +good thing to configure your system to run automatically when you log in. diff --git a/doc/assistant/release_notes.mdwn b/doc/assistant/release_notes.mdwn new file mode 100644 index 000000000..52749dda7 --- /dev/null +++ b/doc/assistant/release_notes.mdwn @@ -0,0 +1,414 @@ +## version 5.20140421 + +This release begins to deprecate XMPP support. In particular, if you use +the assistant with a ssh remote that has this version of git-annex +installed, you don't need XMPP any longer to get immediate syncing of +changes. + +## version 5.20140411 + +This release fixes a bug that could cause the assistant to use a *lot* of +CPU, when monthly fscking was set up. + +Automatic upgrading was broken on OSX for previous versions. This has been +fixed, but you'll need to manually upgrade to this version to get it going +again. Workaround: Remove the wget bundled inside the git-annex dmg. + +## version 5.20140221 + +The Windows port of the assistant and webapp is now considered to be beta +quality. There are important missing features (notably Jabber), documented +on [[todo/windows_support]], but the webapp is broadly usable on Windows +now. + +## version 5.20131221 + +There is now a arm [[install/linux_standalone]] build of git-annex, +including the assistant and webapp, +which can be installed on a variety of systems including Raspberry Pi, +Synology NAS, and Google Chromebooks. Details in +[[this forum thread|forum/new_linux_arm_tarball_build]]. + +## version 5.20131213 + +The assistant can now be used on Windows! However, it has known problems, +described in [[todo/windows_support]], and should be considered an +alpha-level preview. + +## version 5.20131127 + +Starting with this version, when git-annex is installed from a build on +this website, it will detect when new versions are available, and allow +easily upgrading. Automatic upgrades can also be configured if desired, +or automatic upgrade checking can be disabled in the preferences page. + +git-annex builds from distributions, like Debian will not automatically +upgrade; use the distribution's package manager for that. However, the +git-annex webapp will also detect when a distribution has upgraded +git-annex and offer to restart the assistant. + +## version 4.20131024 + +This version fixes several different bugs that could cause the webapp to +refuse to create a repository. Several other bugs are also fixed, including +a bug that caused it to not add files on Android. + +New in this release is the ability to use the webapp to set up scheduled +consistency checks of your repositories. Many problems with repositories +are now automatically corrected, and it can even repair damaged git +repositories. + +This is a recommended upgrade. + +## version 4.20131002 + +Now you can use the webapp to set up an encrypted git repository on a +remote ssh server, or on rsync.net, and use it as a live cloud backup. Or, +use the webapp to make an encrypted git repository on a removable drive, +and store it offsite as a secure backup. + +## version 4.20130920 + +This release is the first to support fully encrypted git repositories +stored on removable drives. This can be set up easily using the webapp. + +## version 4.20130909 + +This release fixes a crash that could occur when using XMPP with the +assitant. It has only been seen on OS X so far. The bug is not believed to +be explitable, but upgrading is still recommended. + +## version 4.20130802 + +This release fixes several bugs, including a reversion introduced in the last +version that broke direct mode on Windows, Android, and other crippled +filesystems. It contains a workaround for a bug in recent git pre-releases +that broke handling of filenames containing spaces. +It is a highly recommended upgrade. + +The webapp can now detect repositories that did not finish getting properly set +up, and can recover from one common bug that broke local pairing and remote +ssh server setups on systems using `ssh-agent`. + +## version 4.20130723 + +This release fixes some bugs. Notably it fixes a bug that could result in data +loss when adding a tarball of a git-annex repository to your git-annex +repository. + +Rsync.net have committed to support git-annex and offer a special +discounted rate for git-annex users. + + +## version 4.20130709 + +This release is mostly bug fixes. + +One of the bugs involved setting up rsync remotes on servers other than +rsync.net. The wrong `.ssh/authorized_keys` line was deployed to the +remote server. If you set up a rsync remote with a past release, and it does +not work, you will need to manually edit the `.ssh/authorized_keys` file, +and remove the `command=` forced command. + +## version 4.20130621, 4.20130627 + +These releases mostly consist of bug fixes. + +## version 4.20130601 + +This is a bugfix release, featuring significant XMPP improvements and +more robustness thanks to automated fuzz testing. Recommended upgrade. + +This version changes its XMPP protocol, so it will fail to sync with older +git-annex versions over XMPP. + +## version 4.20130521 + +This is a bugfix release. Recommended upgrade. + +## version 4.20130516 + +This version contains numerous bug fixes, and improvements. + +This is the first release with a fully usable Android app. No command-line +typing needed to set up syncing to your Android phone or tablet! +A few of the more advanced features may not work (or not work reliably) +on Android. The Android app is still beta quality. + +This is also the first release with a Windows port! The Windows port +is in an alpha quality state, and is missing many features. +It does not yet include the assistant. + +## version 4.20130501 + +This version contains numerous bug fixes, and improvements. + +## version 4.20130417 + +This version contains numerous bug fixes, and improvements. + +One bug that was fixed can affect users of gnome-keyring who +have set up remote repositories on ssh servers using the webapp. +The gnome-keyring may load the restricted key that is set up +for that, and make it be used for regular logins to the server; +with the result that you'll get an error message about "git-annex-shell" +when sshing to the server. + +If you experience this problem you can fix it by +moving `.ssh/key.git-annex*` to `.ssh/git-annex/` (creating +that directory first), and edit `.ssh/config` to reflect the new +location of the key. You will also need to restart gnome-keyring. + +Another change relates to files in `archive/` directories. Client repositories +now sync these files between themselves like any other files, until +the files reach an archive repository. Only then are they removed from +the client repositories. So you need to ensure you have at least one +archive repository if you want to use the `archive/` directory feature. + +## version 4.20130323, 4.20130405 + +These versions continue fixing bugs and adding features. + +## version 4.20130314 + +This version makes a great many improvements and bugfixes, and is +a recommended upgrade. + +If you have already used the webapp to locally pair two computers, +a bug caused the paired repository to not be given an appropriate cost. +To fix this, go into the Repositories page in the webapp, and drag the +repository for the locally paired computer to come before any repositories +that it's more expensive to transfer data to. + +## version 4.20130227 + +This release fixes a bug with globbing that broke preferred content expressions. +So, it is a recommended upgrade from the previous release, which introduced +that bug. + +In this release, the assistant is fully working on Android, although +it must be set up using the command line. + +Repositories can now be placed on filesystems that lack support for symbolic +links; FAT support is complete. + +## version 3.20130216 + +This adds a port to Android. Only usable at the command line so far; +beta qualitty. + +Also a bugfix release, and improves support for FAT. + +The following are known limitations of this release of the git-annex +assistant: + +* No Android app yet. +* On BSD operating systems (but not on OS X), the assistant uses kqueue to + watch files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[this_bug|bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* Also on systems with kqueue, modifications to existing files in direct + mode will not be noticed. + +## version 3.20130107, 3.20130114, 3.20130124, 3.20130207 + +These are bugfix releases. + +## version 3.20130102 + +This release makes several significant improvements to the git-annex +assistant, which is still in beta. + +The main improvement is direct mode. This allows you to directly edit files +in the repository, and the assistant will automatically commit and sync +your changes. Direct mode is the default for new repositories created +by the assistant. To convert your existing repository to use direct mode, +manually run `git annex direct` inside the repository. + +## version 3.20121211 + +This release of the git-annex assistant (which is still in beta) +consists of mostly bugfixes, user interface improvements, and improvements +to existing features. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* Using Box.com's 5 gigabytes of free storage space as a cloud transfer + point between between repositories that cannot directly contact + one-another. (Many other cloud providers are also supported, from Rsync.net + to Amazon S3, to your own ssh server.) +* Archiving or backing up files to Amazon Glacier. See [[archival_walkthrough]]. +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following are known limitations of this release of the git-annex +assistant: + +* The Max OSX standalone app may not work on all versions of Max OSX. + Please test! +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. + +## version 3.20121126 + +This adds several features to the git-annex assistant, which is still in beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* Using Box.com's 5 gigabytes of free storage space as a cloud transfer + point between between repositories that cannot directly contact + one-another. (Many other cloud providers are also supported, from Rsync.net + to Amazon S3, to your own ssh server.) +* Archiving or backing up files to Amazon Glacier. +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following are known limitations of this release of the git-annex +assistant: + +* The Max OSX standalone app does not work on all versions of Max OSX. +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* Retrieval of files from Amazon Glacier is not fully automated; the + assistant does not automatically retry in the 4 to 5 hours period + when Glacier makes the files available. + +## version 3.20121112 + +This is a major upgrade of the git-annex assistant, which is still in beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* Setting up cloud repositories, that are used as backups, archives, + or transfer points between repositories that cannot directly contact + one-another. +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following upgrade notes apply if you're upgrading from a previous version: + +* For best results, edit the configuration of repositories you set + up with older versions, and place them in a repository group. + This lets the assistant know how you want to use the repository; for backup, + archival, as a transfer point for clients, etc. Go to Configuration -> + Manage Repositories, and click in the "configure" link to edit a repository's + configuration. +* If you set up a cloud repository with an older version, and have multiple + clients using it, you are recommended to configure an Jabber account, + so that clients can use it to communicate when sending data to the + cloud repository. Configure Jabber by opening the webapp, and going to + Configuration -> Configure jabber account +* When setting up local pairing, the assistant did not limit the paired + computer to accessing a single git repository. This new version does, + by setting GIT_ANNEX_SHELL_DIRECTORY in `~/.ssh/authorized_keys`. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. + +## version 3.20121009 + +This is a maintenance release of the git-annex assistant, which is still in +beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. +* Cloning your repository to a remote server, running ssh, and uploading + changes made to your files to the server. There is special support + for using the rsync.net cloud provider this way, or any shell account + on a typical unix server, such as a Linode VPS can be used. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* In order to ensure that all multiple repositories are kept in sync, + each computer with a repository must be running the git-annex assistant. +* The assistant does not yet always manage to keep repositories in sync + when some are hidden from others behind firewalls. + +## version 3.20120924 + +This is the first beta release of the git-annex assistant. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. +* Cloning your repository to a remote server, running ssh, and uploading + changes made to your files to the server. There is special support + for using the rsync.net cloud provider this way, or any shell account + on a typical unix server, such as a Linode VPS can be used. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* In order to ensure that all multiple repositories are kept in sync, + each computer with a repository must be running the git-annex assistant. +* The assistant does not yet always manage to keep repositories in sync + when some are hidden from others behind firewalls. +* If a file is checked into git as a normal file and gets modified + (or merged, etc), it will be converted into an annexed file. So you + should not mix use of the assistant with normal git files in the same + repository yet. +* If you `git annex unlock` a file, it will immediately be re-locked. + See [[bugs/watcher_commits_unlocked_files]]. diff --git a/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment b/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment new file mode 100644 index 000000000..04cdf4039 --- /dev/null +++ b/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="OSX 10.8's gatekeeper does not like git-annex" + date="2012-11-13T14:47:52Z" + content=""" +Trying to run this release on OSX results in an error message from Gatekeeper: + +> \"git-annex\" can't be opened because it is from an unidentified developer. +> +> Your security preferences allow installation of only apps from the Mac App Store and identified developers. + +It would be nice if the binary could be signed to make Gatekeeper happy. Until then a note in the installation instructions might be useful. +"""]] diff --git a/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment b/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment new file mode 100644 index 000000000..9033b1af6 --- /dev/null +++ b/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="git-annex not runnable on OSX 10.8" + date="2012-11-13T14:49:35Z" + content=""" +After telling Gatekeeper that I really want to run git-annex it still fails: + +[fog;~]-131> open Applications/git-annex.app +LSOpenURLsWithRole() failed with error -10810 for the file /Users/wichert/Applications/git-annex.app. + +"""]] diff --git a/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment b/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment new file mode 100644 index 000000000..73377c714 --- /dev/null +++ b/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T17:11:51Z" + content=""" +This has been previously reported: [[bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole()]] + +No clue what that error is supposed to mean. +"""]] diff --git a/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment b/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment new file mode 100644 index 000000000..1ebaf504f --- /dev/null +++ b/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-11-16T13:02:40Z" + content=""" +sadly i only have a 10.7 machine to create the builds, so I have no experience with 10.8. I haven't had a 10.6 machine in a while to create the builds. Anyone else want to work together in setting up another 10.6 or 10.8 builder for others? +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough.mdwn b/doc/assistant/remote_sharing_walkthrough.mdwn new file mode 100644 index 000000000..ec8f39d53 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough.mdwn @@ -0,0 +1,12 @@ +So you have two computers that are not in the same place, and you want them +to share the same synchronised folder, communicating directly with each other. + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_remote_sharing]] + +You can add even more computers using the same method shown here. + +---- + +If you have a laptop that is sometimes near another computer, you can +speed up file transfers when it is by also connecting it using the +[[local_pairing_walkthrough]]. diff --git a/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment b/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment new file mode 100644 index 000000000..cac5295a7 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmG4rlD9k1ezNkYZ8jDbITrycUmHV-P8Qs" + nickname="Jeroen" + subject="Synced vs. unsynced" + date="2013-07-29T18:07:45Z" + content=""" +I've noticed that it is also possible to add an existing annex folder on a remote server without using syncing. Are there any dangers in doing this? + +Could you explain what syncing does and when it is needed? Thanks. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment b/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment new file mode 100644 index 000000000..b99d9e22b --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T18:08:38Z" + content=""" +I'm afraid I don't quite understand the question. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment b/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment new file mode 100644 index 000000000..ab0b19160 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 4" + date="2013-11-12T18:18:16Z" + content=""" +You can easily use a removable drive as a transfer repository to sync two computers that have no network connection. Just use the webapp to add the drive on one computer. The drive will be set up as a transfer repository by default. The webapp will automatically start copying all your files to it. Then you can disconnect the drive, bring it to the other computer, and repeat the process. Everything from the first computer will then sync over from the drive to the second computer. And repeat moving the drive back and forth to keep things in sync. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment b/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment new file mode 100644 index 000000000..71f57e9b3 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Using a portable drive as another transfer device?" + date="2013-11-12T16:52:12Z" + content=""" +I try to understand how to setup git-annex for the following use case: + +Two computers, that are paired via remote sharing, using some cloud repository for transfer, and a local NAS for backups. + +These two computers are sometimes in the same network, sometimes in different networks, and sometimes even without network at all. From what I read, it should be possible to bypass the cloud when these two machines are on the same network, which sounds great. + +Would it be possible to use a portable drive as \"another link\" between these two computers that can be used to sync them even if there is no network between them? + +And as you write, if the pairing has been set up manually, then everything is fine - so could it be that it is really easy and only necessary to setup the git-annex on the local drive as an additional remote on both (or only one?) machine? + +thanks for any insight! +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment b/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment new file mode 100644 index 000000000..a66fcd098 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Using a portable drive as another transfer device? – cool." + date="2013-11-14T19:05:56Z" + content=""" +Thanks - I was hoping that it is that easy. I'll try that as soon as I have a working version of the latest git-annex (trying to build with brew for Mac OS X 10.9, but without success so far). +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment b/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment new file mode 100644 index 000000000..69ae139b2 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="severo" + ip="88.182.182.135" + subject="git-assistant and transfer repository" + date="2014-03-16T17:05:43Z" + content=""" +In your comment http://git-annex.branchable.com/assistant/remote_sharing_walkthrough/#comment-f97efe1d05c0101232684b4e4edc4866, you describe a way to synchronize two devices using an intermediate USB drive configured as a \"transfer repository\". + +I understand that in that case, the USB drive can only be used as a \"transmitter\", in a git repository form, not as a copy of the files structure. This means the files contained by the USB drive cannot be accessed without git/git-annnex. + +Is there a way to use the USB drive as a \"client repository\" in order to allow synchronization, as described earlier, but also as a simple copy of the files, in order to access them from any device (opening them with windows in a cyber coffee for example). + +Thanks +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment b/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment new file mode 100644 index 000000000..e34a462da --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 7" + date="2014-03-17T19:50:48Z" + content=""" +@severo the web app does not support setting up that use case. However, you can make a non-bare clone of your repository onto a removable drive, and if you do the assistant will use it just the same as if you'd set up a removable drive using the webapp. Note that you will need to run `git annex sync` inside that repository in order to update the tree it displays. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment b/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment new file mode 100644 index 000000000..994d969e6 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="severo" + ip="95.152.107.168" + subject="comment 8" + date="2014-03-18T10:06:50Z" + content=""" +Thansk @joeyh.name for your answer. Do you think this feature could be integrated into the git-annex assistant ? +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment b/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment new file mode 100644 index 000000000..1766fcf63 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="severo" + ip="95.152.107.168" + subject="comment 9" + date="2014-03-18T11:16:19Z" + content=""" +Some explanations in French on how to do: http://seenthis.net/messages/237648#message238202 +"""]] diff --git a/doc/assistant/repairrepository.png b/doc/assistant/repairrepository.png new file mode 100644 index 000000000..d49ea9d95 Binary files /dev/null and b/doc/assistant/repairrepository.png differ diff --git a/doc/assistant/repogroups.png b/doc/assistant/repogroups.png new file mode 100644 index 000000000..06300ce66 Binary files /dev/null and b/doc/assistant/repogroups.png differ diff --git a/doc/assistant/repoinfo.png b/doc/assistant/repoinfo.png new file mode 100644 index 000000000..d43ffc9f9 Binary files /dev/null and b/doc/assistant/repoinfo.png differ diff --git a/doc/assistant/repositories.png b/doc/assistant/repositories.png new file mode 100644 index 000000000..2853683dc Binary files /dev/null and b/doc/assistant/repositories.png differ diff --git a/doc/assistant/rsync.net.encryption.png b/doc/assistant/rsync.net.encryption.png new file mode 100644 index 000000000..ec751d10d Binary files /dev/null and b/doc/assistant/rsync.net.encryption.png differ diff --git a/doc/assistant/rsync.net.png b/doc/assistant/rsync.net.png new file mode 100644 index 000000000..0e0940703 Binary files /dev/null and b/doc/assistant/rsync.net.png differ diff --git a/doc/assistant/running.png b/doc/assistant/running.png new file mode 100644 index 000000000..8c3b0eaf2 Binary files /dev/null and b/doc/assistant/running.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough.mdwn b/doc/assistant/share_with_a_friend_walkthrough.mdwn new file mode 100644 index 000000000..38544d111 --- /dev/null +++ b/doc/assistant/share_with_a_friend_walkthrough.mdwn @@ -0,0 +1,58 @@ +Want to share all the files in your repository with a friend? + +Let's suppose you use Google Mail, and so does your friend, and you +sometimes also chat in Google Talk. The git-annex assistant will +use your Google account to share with your friend. (This actually +works with any Jabber account you use, not just Google Talk.) + +Start by opening up your git annex dashboard. + +[[!img local_pairing_walkthrough/addrepository.png alt="Add another repository button"]] + +`*click*` + +[[!img pairing.png alt="Share with a friend"]] + +`*click*` + +[[!img xmpp.png alt="Configuring Jabber account"]] + +Fill that out, and git-annex will be able to show you a list of your +friends. + +[[!img buddylist.png alt="Buddy list"]] + +This list will refresh as friends log on and off, so you can +leave it open in a tab until a friend is available to start pairing. + +(If your friend is not using git-annex yet, now's a great time to spread +the word!) + +Once you click on "Start Pairing", your friend will see this pop up +on their git annex dashboard. + +[[!img xmppalert.png alt="Pair request"]] + +Once your friend clicks on that, your repositories will be paired. + +### But, wait, there's one more step... + +Despite the repositories being paired now, you and your friend can't yet +quite share files. You'll start to see your friend's files show up in your +git-annex folder, but you won't be able to open them yet. + +What you need to do now is set up a repository out there in the cloud, +that both you and your friend can access. This will be used to transfer +files between the two of you. + +At the end of the pairing process, a number of cloud providers are +suggested, and the git-annex assistant makes it easy to configure one of +them. Once you or your friend sets it up, it'll show up in the other +one's list of repositories: + +[[!img repolist.png alt="Repository list"]] + +The final step is to share the login information for the cloud repository +with your friend, so they can enable it too. + +With that complete, you'll be able to open your friend's files! diff --git a/doc/assistant/share_with_a_friend_walkthrough/buddylist.png b/doc/assistant/share_with_a_friend_walkthrough/buddylist.png new file mode 100644 index 000000000..ce3d61a96 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/buddylist.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/comment_1_c87889721e3a7e52ac1ed3752fa7db46._comment b/doc/assistant/share_with_a_friend_walkthrough/comment_1_c87889721e3a7e52ac1ed3752fa7db46._comment new file mode 100644 index 000000000..527ac9ce8 --- /dev/null +++ b/doc/assistant/share_with_a_friend_walkthrough/comment_1_c87889721e3a7e52ac1ed3752fa7db46._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl6RDLuI2b2fHkTRseVQGUNjcQ2qUrOaE0" + nickname="Фёдор" + subject="comment 1" + date="2014-05-25T15:10:34Z" + content=""" +Do we need a cloud repository just to bypass NAT? I understand it can't share files within Jabber, but it just looks unpolished. Maybe some punching techniques might be handy, pwnat for example. +"""]] diff --git a/doc/assistant/share_with_a_friend_walkthrough/pairing.png b/doc/assistant/share_with_a_friend_walkthrough/pairing.png new file mode 100644 index 000000000..533f4aef5 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/pairing.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/repolist.png b/doc/assistant/share_with_a_friend_walkthrough/repolist.png new file mode 100644 index 000000000..409da4aa4 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/repolist.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png b/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png new file mode 100644 index 000000000..5e2d56289 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png differ diff --git a/doc/assistant/thanks.mdwn b/doc/assistant/thanks.mdwn new file mode 100644 index 000000000..2b9c8279d --- /dev/null +++ b/doc/assistant/thanks.mdwn @@ -0,0 +1 @@ +[[!meta redir="/thanks#kickstarter"]] diff --git a/doc/assistant/thumbnail.png b/doc/assistant/thumbnail.png new file mode 100644 index 000000000..346c22f02 Binary files /dev/null and b/doc/assistant/thumbnail.png differ diff --git a/doc/assistant/unused.png b/doc/assistant/unused.png new file mode 100644 index 000000000..b0ace763c Binary files /dev/null and b/doc/assistant/unused.png differ diff --git a/doc/assistant/upgradecomplete.png b/doc/assistant/upgradecomplete.png new file mode 100644 index 000000000..3f8c7f3c2 Binary files /dev/null and b/doc/assistant/upgradecomplete.png differ diff --git a/doc/assistant/xmpp.png b/doc/assistant/xmpp.png new file mode 100644 index 000000000..c3cc53ebf Binary files /dev/null and b/doc/assistant/xmpp.png differ diff --git a/doc/assistant/xmppnudge.png b/doc/assistant/xmppnudge.png new file mode 100644 index 000000000..b3a0658cb Binary files /dev/null and b/doc/assistant/xmppnudge.png differ diff --git a/doc/assistant/xmpppairingend.png b/doc/assistant/xmpppairingend.png new file mode 100644 index 000000000..f0c9e765d Binary files /dev/null and b/doc/assistant/xmpppairingend.png differ diff --git a/doc/automatic_conflict_resolution.mdwn b/doc/automatic_conflict_resolution.mdwn new file mode 100644 index 000000000..f20138b19 --- /dev/null +++ b/doc/automatic_conflict_resolution.mdwn @@ -0,0 +1,23 @@ +Running `git annex sync` or using the [[assistant]] involves merging +changes from elsewhere into your repository's currently checked out branch. +This could lead to a merge conflict, perhaps because the same file +got changed in two different ways. A nice feature is that these +merge conflicts are automatically resolved, rather than leaving +git in the middle of a conflicted merge, which would prevent further +syncing from happening. + +When a conflict occurs, there will be several messages printed about the merge +conflict, and the file that has the merge conflict will be renamed, with +".variant-XXX" tacked onto it. So if there are two versions of file foo, +you might end up with "foo.variant-AAA" and "foo.variant-BBB". It's then +up to you to decide what to do with these two files. Perhaps you can +manually combine them back into a single file. Or perhaps you choose to +rename them to better names and keep two versions, or delete one version +you don't want. + +The "AAA" and "BBB" in the above example are essentially arbitrary +(technically they are the MD5 checksum of the key). The automatic merge +conflict resoltuion is designed so that if two or more repositories both get +a merge conflict, and resolve it, the resolved repositories will not +themselves conflict. This is why it doesn't use something nicer, like +perhaps the name of the remote that the file came from. diff --git a/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment b/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment new file mode 100644 index 000000000..57a8c45f8 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnJTqmRu1YCKS2Hsm4vtOflLhP4fU-k98w" + nickname="Ahmed" + subject="Customise conflict resolution behaviour" + date="2014-02-25T11:42:08Z" + content=""" +How to customise git-annex conflict resolution behaviour, such that for example: change naming convention of conflicted files with suffix or prefix, move conflicted files to another directory structure, overwrite conflicted files from preferred content ... + + +"""]] diff --git a/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment b/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment new file mode 100644 index 000000000..8c50ec4e2 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="Use automatic merge without syncing" + date="2014-03-20T10:03:41Z" + content=""" +Is there a possibility to use the automatic merge logic without using \"git annex sync\"? I don't want to have the \"synced\"-branches, but the auto-conflict-resolution is very nice. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment b/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment new file mode 100644 index 000000000..58bdc5631 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 3" + date="2014-03-20T16:10:10Z" + content=""" +@Matthias `git annex merge` will do what you want, as long as you have git-annex 4.20130709 or newer. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment b/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment new file mode 100644 index 000000000..d67514452 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="merge for master branch?" + date="2014-03-23T23:02:23Z" + content=""" +As far as I observed, \"git annex merge\" only merges the \"git-annex\" branch. My wish is to have the conflict resolution from \"git annex sync\" in the \"master\" branch, but no automatic commit, such that the user can verify and possibly correct the merge. The proposed merge could go to the index. Consider the following scenario: + +1. We have repo A, B, and CENTRAL +2. All three start with a root commit in \"master\" branch +3. Then A commits a file \"test.txt\" with content \"a\" and syncs with CENTRAL +4. Meanwhile, B commits \"test.txt\" with content \"b\" +5. When B tries to sync with CENTRAL, the proposed conflict resolution having two files \"test.txt-variantXXXX\" and \"test.txt-variantYYYY\" should be staged in the index, but not committed yet. +6. B can now commit a custom merge, e.g. with file content \"ab\". + +The point is that I really like the conflict resolution, but still want to force the user to check the result. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment b/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment new file mode 100644 index 000000000..4d1e7c4bc --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 5" + date="2014-03-26T18:56:30Z" + content=""" +@Matthias you need to install git-annex 4.20130709 or newer. Then `git-annex merge` will do what you want. As I said before. + +As for committing the merge, you can always adjust the result after the fact and use `git commit --amend`. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_6_8a0860fee88f5954918305f055a39d8d._comment b/doc/automatic_conflict_resolution/comment_6_8a0860fee88f5954918305f055a39d8d._comment new file mode 100644 index 000000000..4e9493d12 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_6_8a0860fee88f5954918305f055a39d8d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="auto conflict resolution master branch" + date="2014-04-13T17:48:19Z" + content=""" +@joeyh: This must be a misunderstanding of what I want. I use version 5.20140320. I can't find a workflow where \"git annex merge\" changes my master branch, it only updates the git-annex branch. + +Thinking again of it after some time, I am basically fine with \"git annex sync\". The only thing I am uncomfortable with is that the automatic merge is pushed without review. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_7_3d2250cc26036b8532faa980065e20d0._comment b/doc/automatic_conflict_resolution/comment_7_3d2250cc26036b8532faa980065e20d0._comment new file mode 100644 index 000000000..9f49021da --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_7_3d2250cc26036b8532faa980065e20d0._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 7" + date="2014-04-17T20:00:22Z" + content=""" +@Matthias, here is an example of git-annex merge updating the master branch from the synced/master branch that was pushed to it earlier: + +
+joey@darkstar:~/tmp/test/2>git annex merge
+merge git-annex (merging synced/git-annex into git-annex...)
+ok
+merge synced/master 
+Updating 7942eee..1f3422e
+Fast-forward
+ new_file | 1 +
+ 1 file changed, 1 insertion(+)
+ create mode 120000 new_file
+ok
+
+ +If you are having trouble with it somehow, I'd suggest filing a bug report. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_8_ef474c258ce8e0ebc6485c1366ae6315._comment b/doc/automatic_conflict_resolution/comment_8_ef474c258ce8e0ebc6485c1366ae6315._comment new file mode 100644 index 000000000..81f089b11 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_8_ef474c258ce8e0ebc6485c1366ae6315._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="auto conflict resolution" + date="2014-04-19T17:26:11Z" + content=""" +Thanks Joey, I could construct a scenario where the auto-conflict-resolution was applied in the master branch. +"""]] diff --git a/doc/backends.mdwn b/doc/backends.mdwn new file mode 100644 index 000000000..baa96c149 --- /dev/null +++ b/doc/backends.mdwn @@ -0,0 +1,43 @@ +When a file is annexed, a key is generated from its content and/or metadata. +The file checked into git symlinks to the key. This key can later be used +to retrieve the file's content (its value). + +Multiple pluggable key-value backends are supported, and a single repository +can use different ones for different files. + +* `SHA256E` -- The default backend for new files, combines a 256 bit SHA-2 + hash of the file's content with the file's extension. This allows + verifying that the file content is right, and can avoid duplicates of + files with the same content. Its need to generate checksums + can make it slower for large files. +* `SHA256` -- Does not include the file extension in the key, which can + lead to better deduplication but can confuse some programs. +* `WORM` ("Write Once, Read Many") This assumes that any file with + the same basename, size, and modification time has the same content. + This is the least expensive backend, recommended for really large + files or slow systems. +* `SHA512`, `SHA512E` -- Best SHA-2 hash, for the very paranoid. +* `SHA1`, `SHA1E` -- Smaller hash than `SHA256` for those who want a checksum + but are not concerned about security. +* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- Hashes for people who like + unusual sizes. +* `SKEIN512`, `SKEIN512E`, `SKEIN256`, `SKEIN256E` + -- [Skein hash](http://en.wikipedia.org/wiki/Skein_hash), + a well-regarded SHA3 hash competition finalist. + +The `annex.backends` git-config setting can be used to list the backends +git-annex should use. The first one listed will be used by default when +new files are added. + +For finer control of what backend is used when adding different types of +files, the `.gitattributes` file can be used. The `annex.backend` +attribute can be set to the name of the backend to use for matching files. + +For example, to use the SHA256E backend for sound files, which tend to be +smallish and might be modified or copied over time, +while using the WORM backend for everything else, you could set +in `.gitattributes`: + + * annex.backend=WORM + *.mp3 annex.backend=SHA256E + *.ogg annex.backend=SHA256E diff --git a/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment b/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment new file mode 100644 index 000000000..dc178a6fe --- /dev/null +++ b/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://nanotech.nanotechcorp.net/" + nickname="NanoTech" + subject="SHA performance" + date="2012-08-10T04:37:32Z" + content=""" +It turns out that (at least on x86-64 machines) `SHA512` [is faster than][1] `SHA256`. In some benchmarks I performed1 `SHA256` was 1.8–2.2x slower than `SHA1` while `SHA512` was only 1.5–1.6x slower. + +`SHA224` and `SHA384` are effectively just truncated versions of `SHA256` and `SHA512` so their performance characteristics are identical. + +[1]: https://community.emc.com/community/edn/rsashare/blog/2010/11/01/sha-2-algorithms-when-sha-512-is-more-secure-and-faster +1 `time head -c 100000000 /dev/zero | shasum -a 512` +"""]] diff --git a/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment b/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment new file mode 100644 index 000000000..030887303 --- /dev/null +++ b/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="Tracking remote copies not even stored locally / URL backend turned into a "special remote"." + date="2013-01-03T10:59:35Z" + content=""" +In case you came here looking for the URL backend. + +## The URL backend + +Several documents on the web refer to a special \"URL backend\", e.g. [Large file management with git-annex [LWN.net]](http://lwn.net/Articles/419241/). Historical content will never be updated yet it drives people to living places. + +## Why a URL backend ? + +It is interesting because you can: + +* let `git-annex` rest on the fact that some documents are available as extra copies available at any time (but from something that is not a git repository). +* track these documents like your own with all git features, which opens up some truly marvelous combinations, which this margin is too narrow to contain (Pierre d.F. wouldn't disapprove ;-). + +## How/Where now ? + +`git-annex` used to have a URL backend. It seems that the design changed into a \"special remote\" feature, not limited to the web. You can now track files available through plain directories, rsync, webdav, some cloud storage, etc, even clay tablets. For details see [[special remotes]]. + +"""]] diff --git a/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment b/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment new file mode 100644 index 000000000..6f8b1ad7a --- /dev/null +++ b/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="Please be more specific about what information goes into the key" + date="2013-07-31T11:55:09Z" + content=""" +It's a bit confusing to read that SHA256 does not include the file extension from which I can deduct that SHA256E does include it. What else does it include? I used to \"seed\" my git-annex with localy available data by \"git-annex add\"-ing it in a temporary folder without doing a commit and than to initiate a copy from the slow remote annex repo. My theory was that remote copy sees the pre-seeded files and does not need to copy them again. + +But does this theory hold true for different file names, extensions, modification date, full path? Maybe you could also link to the code that implements the different backends so that curious readers can check for themselves. + +Thank you! +"""]] diff --git a/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment b/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment new file mode 100644 index 000000000..94f25e996 --- /dev/null +++ b/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTho3mActvetF1iQdmui6gH1t6WE6c284" + nickname="Michael" + subject="SHA256e" + date="2013-10-30T02:00:45Z" + content=""" +I'd really like to have a SHA256e backend -- same as SHA256E but making sure that extensions of the files in .git/annex are converted to lower case. I normally try to convert filenames from cameras etc to lower case, but not all people that I share annex with do so consistently. +In my use case, I need to be able to find duplicates among files and .jpg vs .JPG throws git annex dedup off. Otherwise E backends are superior to non-E for me. Thanks, Michael. +"""]] diff --git a/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment b/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment new file mode 100644 index 000000000..2a205604c --- /dev/null +++ b/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWBvsZvSsAL8P2ye3F0OBStjFCVnOImzM" + nickname="Jarno" + subject="Non-E backend drawbacks?" + date="2013-10-30T21:25:00Z" + content=""" +The page states \"[non-E backends] can confuse some programs\". I like the ideal simplicity and recoverability of pure checksum backends but \"confusion\" sounds a bit worrying. Any practical examples of these problems to help me choose? +"""]] diff --git a/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment b/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment new file mode 100644 index 000000000..cbd4682ab --- /dev/null +++ b/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-01T15:47:26Z" + content=""" +Some examples of problems with the raw SHA backends include, IIRC, calibre, and many programs on OSX. These programs look at the extension of the filename the symlink points at. +"""]] diff --git a/doc/bare_repositories.mdwn b/doc/bare_repositories.mdwn new file mode 100644 index 000000000..975a638b8 --- /dev/null +++ b/doc/bare_repositories.mdwn @@ -0,0 +1,48 @@ +Due to popular demand, git-annex can now be used with bare repositories. + +So, for example, you can stash a file away in the origin: +`git annex move mybigfile --to origin` + +Of course, for that to work, the bare repository has to be on a system with +[[git-annex-shell]] installed. If "origin" is on GitWeb, you still can't +use git-annex to store stuff there. + +It took a while, but bare repositories are now supported exactly as well +as non-bare repositories. Except for these caveats: + +* `git annex fsck` works in a bare repository, but does not display + warnings about insufficient + [[copies]]. To get those warnings, just run it in one of the non-bare + checkouts. +* `git annex unused` in a bare repository only knows about keys used in + branches that have been pushed to the bare repository. So use it with care.. +* Commands that need a work tree, like `git annex add` won't work in a bare + repository, of course. +* However, you can (with recent versions of git-annex) run `git annex copy`, + `git annex get`, and `git annex move` in a bare repository. These behave + as if the `--all` option were used, and just operate on every single + version of every single file that is present in the git repository + history. + +*** + +Here is a quick example of how to set this up, using `origin` as the remote name, and assuming `~/annex` contains an annex: + +On the server: + + git init --bare bare-annex.git + cd bare-annex.git && git annex init origin + +Now configure the remote and do the initial push: + + cd ~/annex + git remote add origin example.com:bare-annex.git + git push origin master git-annex + +Now `git annex info` should show the configured bare remote. If it does not, you may have to pull from the remote first (older versions of `git-annex`) + +If you wish to configure git such that you can push/pull without arguments, set the upstream branch: + + git branch master --set-upstream origin/master + + diff --git a/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment b/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment new file mode 100644 index 000000000..c1ba9f2f4 --- /dev/null +++ b/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmraN_ldJplGunVGmnjjLN6jL9s9TrVMGE" + nickname="Ævar Arnfjörð" + subject="How to convert bare repositories to non-bare" + date="2012-11-11T20:14:44Z" + content=""" +I made a repository bare and later wanted to convert it, this would have worked with just plain git: + + cd bare-repo.git + mkdir .git + mv .??* * .git/ + git config --unset core.bare + git reset --hard + +But because git-annex uses different hashing directories under bare repositories all the files in the repo will point to files you don't have. Here's how you can fix that up assuming you're using a backend that assigns unique hashes based on file content (e.g. the SHA256 backend): + + mv .git/annex/objects from-bare-repo + git annex add from-bare-repo + git rm -f from-bare-repo + + +"""]] diff --git a/doc/bugs.mdwn b/doc/bugs.mdwn new file mode 100644 index 000000000..d1a0b07e9 --- /dev/null +++ b/doc/bugs.mdwn @@ -0,0 +1,7 @@ +This is git-annex's bug list. Closed bugs are moved to [[done]]. + +[[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done) +and !./bugs/moreinfo and !./bugs/confirmed and !./bugs/forwarded and !*/Discussion" +actions=yes postform=yes show=0 archive=yes template=buglist]] + +[[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]] diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn new file mode 100644 index 000000000..3420c03af --- /dev/null +++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +Some time in may 2014, git-annex stopped working with previous versions of git-annex. + +### What steps will reproduce the problem? + +Trying to sync with the server fails with: + + git-annex-shell: Not a git-annex or gcrypt repository. + +With older versions (e.g. 5.20140412), it's even worse: + + Remote marcos does not have git-annex installed; setting annex-ignore + This could be a problem with the git-annex installation on the remote. Please make sure that git-annex-shell is available in PATH when you ssh into the remote. Once you have fixed the git-annex installation, run: git config remote.marcos.annex-ignore false + +Basically, if git-annex-shell is missing, newer versions of git-annex just crash and burn instead of going the more gentle, backward-compatible way... + +### What version of git-annex are you using? On what operating system? + +git-annex from debian sid (5.20140517) on the "client" side and from jessie (5.20140421) on the "server". + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +ssh server +git init books +exit +git remote add server server:books +git annex sync server +# End of transcript or log. +"""]] + +If this is intended behavior, it seems to me the major version of git annex should be bumped, at the very least... -- [[anarcat]] + +[[!tag moreinfo]] diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_1_323262a080daed9cebd4caee4c887210._comment b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_1_323262a080daed9cebd4caee4c887210._comment new file mode 100644 index 000000000..f54eb1769 --- /dev/null +++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_1_323262a080daed9cebd4caee4c887210._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 1" + date="2014-05-23T14:25:04Z" + content=""" +git-annex has always required the remote have git-annex-shell installed in order to store files on it. Nothing has changed in this area. + +So, you seem to be very confused about something, but I cannot tell what from this bug report, and I certianly see no evidence of any bug in the information provided so far. You need to install git-annex on your server and then it should work, assuming the server actually has a git-annex repository set up on it. +"""]] diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_2_6172dcd7db2322084483a18d4f3cc2d6._comment b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_2_6172dcd7db2322084483a18d4f3cc2d6._comment new file mode 100644 index 000000000..98b297868 --- /dev/null +++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_2_6172dcd7db2322084483a18d4f3cc2d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 2" + date="2014-05-27T03:00:48Z" + content=""" +marcos has had git-annex installed ever since i started using git-annex, which is around version 4.x. furthermore, i have assumed that the procedure i detailed in the last part were enough to reproduce the bug, but i may be mistaken. +"""]] diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_3_5ae2178863709230ddb995905c629c4e._comment b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_3_5ae2178863709230ddb995905c629c4e._comment new file mode 100644 index 000000000..3234ff75b --- /dev/null +++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_3_5ae2178863709230ddb995905c629c4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 3" + date="2014-05-27T17:54:06Z" + content=""" +Well, your transcript shows you init a git repository. But you have not run `git annex init` in it, so git-annex-shell won't use it. + + +"""]] diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_4_19d32634789a09c1b04e9d3fcde364f7._comment b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_4_19d32634789a09c1b04e9d3fcde364f7._comment new file mode 100644 index 000000000..66d3c07f8 --- /dev/null +++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes/comment_4_19d32634789a09c1b04e9d3fcde364f7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 4" + date="2014-06-04T04:53:36Z" + content=""" +ah. i see. certainly an operator error then. feels like a usability issue now, or i just feel stupid, not sure which. :) +"""]] diff --git a/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn b/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn new file mode 100644 index 000000000..7038fe2e6 --- /dev/null +++ b/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn @@ -0,0 +1,74 @@ +What steps will reproduce the problem? + +Example below illustrates downloading a podcast with git annex addurl: + +list directory before... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls +folder.jpg tuxradar_s04e24.ogg +tuxradar_s04e09.ogg tuxradar_s05e01.ogg +tuxradar_s04e11.ogg tuxradar_s05e02.ogg +tuxradar_s04e13.ogg tuxradar_s05e03.ogg +tuxradar_s04e15.ogg tuxradar_s05e04.ogg +tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg +tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg +tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg +tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg +tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg +tuxradar_s04e23.ogg + +download file... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ git annex addurl http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg +addurl www.tuxradar.com_files_podcast_tuxradar_s05e05.ogg (downloading http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg ...) --2013-04-10 21:18:12-- http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg +Resolving www.tuxradar.com (www.tuxradar.com)... 80.244.178.150 +Connecting to www.tuxradar.com (www.tuxradar.com)|80.244.178.150|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 33249291 (32M) [application/ogg] +Saving to: `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' + +100%[===============================>] 33,249,291 404K/s in 81s + +2013-04-10 21:19:35 (399 KB/s) - `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' saved [33249291/33249291] + +(checksum...) ok +(Recording state in git...) + +file appears to have been downloaded, but isn't there... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls +folder.jpg tuxradar_s04e24.ogg +tuxradar_s04e09.ogg tuxradar_s05e01.ogg +tuxradar_s04e11.ogg tuxradar_s05e02.ogg +tuxradar_s04e13.ogg tuxradar_s05e03.ogg +tuxradar_s04e15.ogg tuxradar_s05e04.ogg +tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg +tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg +tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg +tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg +tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg +tuxradar_s04e23.ogg + +What is the expected output? What do you see instead? + +File should exist in current directory. As you can see from above output, this has worked in the past (with older versions). + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130405 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +OS: Debian Testing/Unstable + +Please provide any additional information below. + +The repository in question was created by the assistant and I tried the above with the assistant both running and not running, with no difference. I have also tried downloading other files. + +EDIT: formatting + +> Bug only affected direct mode. I think it used to work but I broke +> it when fixing another bug in direct mode. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn new file mode 100644 index 000000000..4b88656a2 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +When entering Jabber account data, the assistant responds with: + + Internal Server Error: /etc/resolv.conf does not exist (No such file or directory). + +### What steps will reproduce the problem? + +Get a jabber account at http://jit.si. Enter your jabber name and password on Android assistant, and click "Use This Account". The dark overlay and progress message appears. After about 30 seconds the browser forwards to the "Internal Server Error: /etc/resolv.conf does not exist (No such file or directory)" page. + +### What version of git-annex are you using? On what operating system? + +Android 4.2 on Lenovo 780p. This model is only for sale in China and India and has been rooted, but the original ROM is still on. Often this makes no difference but you might want to confirm with another device. + +git-annex version 5.20131127-g736ce5e + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment new file mode 100644 index 000000000..95583cdf7 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="Same on CyaogenMod 10.2" + date="2013-11-29T11:00:58Z" + content=""" +CM10.2 Nightly Build for Sony Experia Mini Pro does show the same behaviour. Creating the resolv.conf does not solve the problem: + + 1|root@mango:/etc # touch resolv.conf; ls resolv.conf + touch resolv.conf; ls resolv.conf + resolv.conf: No such file or directory + +"""]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment new file mode 100644 index 000000000..79554ee50 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknsDuoV1R2hz6QoCJmMFWLmWgdZfULjMI" + nickname="Jakob" + subject="Moto G" + date="2013-12-02T13:53:55Z" + content=""" +Same proplem on a Moto G - Android 4.3 - not rooted / Stock + +running git-annex version 5.20131202-g5b9eb74 + +Error Message: + + /etc/resolv.conf: openFile: does not exist (No such file or directory) + +command-line output: + + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + git annex webapp + ex webapp +"""]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment new file mode 100644 index 000000000..0bfe15340 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-03T17:35:11Z" + content=""" +The dns library used only for srv lookups was trying to use /etc/resolv.conf. I've patched it to use the android getprop command instead to discover the DNS server. + +The daily build has already been updated with this fix. I have not tested it completely myself. +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn new file mode 100644 index 000000000..ed0eb1469 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +On Andorid adding a respository on a remote server (ssh) to an exisiting repository does not work. After selecting "Make unencrypted repository" in the webapp the following error message is displayed: + +Internal Server Error +/sdcard/git-annex.home/.ssh/config: setFileMode: permission denied (Operation not permitted) + +The file "/sdcard/git-annex.home/.ssh/config" is created and its content seems to be fine. I could not find anything related to file mode in logcat / daemon.log. + +### What steps will reproduce the problem? + +Add a repository on a remote server to an existing repository. After selecting "Make unencrypted repository" the error messages is displayed. + +### What version of git-annex are you using? On what operating system? + +git-annex version 5.20140116-g2d9ec29 +Android version 4.4 (running on a Nexus 5) + +> I have made this failure to set the file mode not be a fatal error. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment new file mode 100644 index 000000000..d1a5bf0c1 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkViAynw-AW5kjf3w_QDwCVwhPc3k7gY5E" + nickname="Thomas" + subject="I see the same fail" + date="2014-01-29T21:52:18Z" + content=""" +I se the same failure at both my android devices: +Nexus 7, Android 4.4.2, git-annex 5.20140128 and +Xperia phone, Android 4.1.2, git-annex 5.20140108 +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment new file mode 100644 index 000000000..55a368cc3 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx07B9weuZowXqh--1BDvGw8VM25aXsRw" + nickname="Matthew" + subject="comment 2" + date="2014-02-01T02:44:47Z" + content=""" +Same here, any workarounds? +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn new file mode 100644 index 000000000..35e751cce --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn @@ -0,0 +1,84 @@ +### Please describe the problem. + +Seems to not upload files from Android client (set to "Manual mode: only stores files you...") to servers configured to get the files despite "syncing enabled" + +Even when I chose "File source:" mode -- it just dropped all locally stored ones and didn't transfer those I have added. + +### What steps will reproduce the problem? + +Add file to the sdcard (vfat), and see it added to git (annex) but not uploaded + +### What version of git-annex are you using? On what operating system? + +Android build as now of Dec 13 I believe + +### Please provide any additional information below. + +First it just said that nothing to be transfered, I have switched that remote to "Full backup", web dashboard had "Scanning for files to transfer" for a while, then refreshed with "Synced with" and no file transfers running. Below is an excerpt from the log + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add pics/20131217_125740.jpg ok +add pics/20131217_125740.jpg [2013-12-17 16:19:25 EST] Committer: Committing changes to git +[2013-12-17 16:19:25 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Invalid pid specified +Invalid pid specified +warning: no threads support, ignoring --threads +Already up-to-date. +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + bcb7ed7..3672b38 git-annex -> synced/git-annex + e8cc37f..052b758 annex/direct/master -> synced/master +Already up-to-date. +[2013-12-17 16:19:29 EST] Committer: Adding 20131217_125726.jpg +ok +(Recording state in git...) +(Recording state in git...) + + +add pics/20131217_125726.jpg ok +add pics/20131217_125726.jpg [2013-12-17 16:19:30 EST] Committer: Committing changes to git +Invalid pid specified +[2013-12-17 16:19:32 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Already up-to-date. +warning: no threads support, ignoring --threads +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + 3672b38..f914fed git-annex -> synced/git-annex + 052b758..859d3c6 annex/direct/master -> synced/master +Already up-to-date. +Invalid pid specified +Invalid pid specified +Invalid pid specified + + +# End of transcript or log. +"""]] + +previous runs experienced different problems, so may be those could lead to unreported problem here? +e.g. from previous run: + +[[!format sh """ +[2013-12-17 16:04:44 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Already up-to-date. +warning: no threads support, ignoring --threads +warning: no threads support, ignoring --threads +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + a889d7b..c9a7466 git-annex -> synced/git-annex +error: Ref refs/heads/synced/git-annex is at c9a74663dc863eb95d316deac4657173c92653df but expected a889d7b335738ef1c4f85da18d1bea337cd36522 +remote: error: failed to lock refs/heads/synced/git-annex^[[K +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to 'ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/' +Everything up-to-date +Invalid pid specified +[2013-12-17 16:08:34 EST] main: Syncing with vagus.cns.dartmouth.edu_annex +Everything up-to-date +Invalid pid specified +~ +]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment new file mode 100644 index 000000000..60ac15781 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-17T23:51:32Z" + content=""" +The \"Invalid pid specified\" seems to point at the problem. (Or it's a nice red herring.) I cannot find this error message in either git-annex or in git. + +Enabling debug logging and restarting the assistant should produce a nice log that will both tell us what command it was running when that message showed up, and show some details about its preferred content decisions. +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment new file mode 100644 index 000000000..4711c2d1c --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="comment 2" + date="2013-12-18T02:07:46Z" + content=""" +enabled debug logging in the preferences of webapp, clicked on 'restart daemon', fetched log: + + $> grep -B 1 pid daemon.log + [2013-12-17 20:51:49 EST] chat: nice [\"ionice\",\"-c3\",\"git-annex\",\"transferkeys\"] + Invalid pid specified + +entire log http://www.onerussian.com/tmp/daemon.log.gz + +in the webbrowser page got stuck white without updating, refreshed it and got + + \"Internal Server Error\" + git-annex: createProcess: runInteractive + Process: pipe: resource exhausted (Too many open files) + +went to terminal, ctrl-c, started again -- seems have managed to start: + + $> grep -B 3 pid daemon.log + (scanning...) [2013-12-17 20:57:36 EST] Watcher: Performing startup scan + Already up-to-date. + Everything up-to-date + Invalid pid specified + +disabled, and then reenabled syncing with vagus, refetched daemon.log to see similar to above message. + +New experiment -- added locally yet another file pics/test.jpg which according to whereis was quickly pushed out from my laptop. + +Then realized that daemon.log is no longer verbose! (i.e. changes in preferences within webapp didn't persist) By now on phone it synced git, but didn't download the load (rightfully since I have instructed not to). + +ok -- went to enable debug logging again in webapp -- it was already selected. + +in the log now found following + +``` + (started...) [2013-12-17 20:59:10 EST] main: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date + Invalid pid specified + [2013-12-17 21:02:37 EST] main: Syncing with vagus.cns.dartmouth.edu_annex + From ssh://git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex + c3a5fd6..29b6694 master -> vagus.cns.dartmouth.edu_annex/master + d9a09e2..0c3e966 synced/git-annex -> vagus.cns.dartmouth.edu_annex/synced/git-annex + c3a5fd6..29b6694 synced/master -> vagus.cns.dartmouth.edu_annex/synced/master + error: Ref refs/heads/annex/direct/master is at 29b6694ee483c4563955bc5ae1ee1664daed7f19 but expected c3a5fd6b7cee1cbd43fbeb5aa4a445a5407067bd + fatal: Cannot lock the ref 'HEAD'. + Updating c3a5fd6..29b6694 + Fast-forward + + (merging vagus.cns.dartmouth.edu_annex/synced/git-annex into git-annex...) + + git-annex: /storage/extSdCard/annex/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory) + Already up-to-date. + Already up-to-date. + [2013-12-17 21:02:41 EST] Committer: Committing changes to git + [2013-12-17 21:02:42 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date + [2013-12-17 21:02:43 EST] Committer: Committing changes to git + [2013-12-17 21:02:45 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date +``` +I guess I will just try now to enable debug logging in .git/config while in the terminal on the phone +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment new file mode 100644 index 000000000..b920df4a9 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="comment 3" + date="2013-12-18T02:21:17Z" + content=""" +ah -- may be that was debug log, but nothing exciting was happening? .git/config does have annex.debug true + +ok -- went to \"switch repositories\", showed the list of my only repository, clicking on it didn't go anywhere... ok - restarted the beast in the terminal, added a new file to the pics/ directory, again -- registered, added to git, synced, did not 'push' the load, and no informative debug messages: + + add pics/earth-daynight.jpg [2013-12-17 21:17:26 EST] Committer: Committing changes to git + [2013-12-17 21:17:26 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Invalid pid specified + Already up-to-date. + warning: no threads support, ignoring --threads + To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + 0c3e966..6d94fd4 git-annex -> synced/git-annex + 29b6694..bbd3fa3 annex/direct/master -> synced/master + [2013-12-17 21:17:28 EST] Committer: Adding earth-daynight.jpg + Already up-to-date. + ok + (Recording state in git...) + (Recording state in git...) + + +so again that pid msg but no debug logging seems to be done. Is there some other way to enable debug logging? ;) +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment new file mode 100644 index 000000000..7453e7cea --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="etset" + ip="188.83.111.161" + subject="comment 4" + date="2013-12-29T15:12:43Z" + content=""" +I also can't transfer from and to an Android tablet with the git-annex assistant. The `daemon.log` shows the same error, `Invalid pid specified`, repeated several times. + +Enabling the debug log mode always shows lines similar to this one before each \"Invalid pid\" line: `[2013-12-29 14:50:49 WET] chat: nice [\"ionice\", \"-c3\", \"git-annex\", \"transferkeys\"]`. + +However, using the `git annex get` and `git annex copy` commands to fetch and send the files from the same tablet work as expected. + +I can post the full log later, if needed. +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment new file mode 100644 index 000000000..a96ebd551 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="reproduced bug" + date="2013-12-29T21:06:30Z" + content=""" +Debug logs shows that the problem is it tries to run ionice. So fix should be trivial. +"""]] diff --git a/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn new file mode 100644 index 000000000..a52857d1f --- /dev/null +++ b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +In order to handle the fact that the directory where pictures are saved is not configurable on my phone, I set up a second git annex repository with the Repository group "file source". + +### What version of git-annex are you using? On what operating system? + +5.20140108-gce9652 + +### Please provide any additional information below. + +In the log, there are many "too many open files" errors like these : + +git:createProcess: runInteractiveProcess: pipe: resource exhausted (Too many open files) + +[[!tag moreinfo]] +[[!meta title="too many open files on android"]] diff --git a/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment new file mode 100644 index 000000000..eea1f2094 --- /dev/null +++ b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T18:59:29Z" + content=""" +I guess that this bug report is not about the DCIM/Camera location not being configurable, since that is up to Android, not git-annex. + +So, it seems to be a bug report about a file descriptor leak. It would be helpful, if you can reproduce the leak, to look at /proc/$pid/fd/ to see what files git-annex has open. +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__.mdwn b/doc/bugs/Android___91__Terminal_session_finished__93__.mdwn new file mode 100644 index 000000000..17ed66381 --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +Launching the Git Annex app on Android, the shell just reads: +[[!format sh """ +[Terminal session finished] +"""]] + +Attempting to launch /data/data/ga.androidterm/runshell via the adb shell does also not work: +[[!format sh """ +/system/bin/sh: /data/data/ga.androidterm/runshell: not found +"""]] + +Listing the contents of that directory from the git annex terminal appears to confirm this: +[[!format sh """ +u0_a172@android:/data/data/ga.androidterm $ ls +cache +lib +shared_prefs +"""]] + +Following the instructions for the similar issue here [[http://git-annex.branchable.com/Android/oldcomments/#comment-4c5a944c1288ddd46108969a4c664584]]: +[[!format sh """ +u0_a172@android:/ $ ls -ld /data/data/ga.androidterm +drwxr-x--x u0_a172 u0_a172 2014-04-20 11:12 ga.androidterm +"""]] + +### What version of git-annex are you using? On what operating system? + +version 5.20140413 of the Git Annex app (tested using the daily build and regular build). + +Samsung Galaxy Tab 3 (GT-P5210) running Android 4.2.2 (without root access). + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_1_31af3e5226430a4e94de58c0e33bd22b._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_1_31af3e5226430a4e94de58c0e33bd22b._comment new file mode 100644 index 000000000..73f7b05ca --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_1_31af3e5226430a4e94de58c0e33bd22b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-20T17:16:50Z" + content=""" +From the git-annex terminal, try to run: + +/data/data/ga.androidterm/lib/lib.start.so + +Paste me any output.. +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_2_a5bcbd2f85283e29e237e9850cd8109a._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_2_a5bcbd2f85283e29e237e9850cd8109a._comment new file mode 100644 index 000000000..01cc33730 --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_2_a5bcbd2f85283e29e237e9850cd8109a._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="cbaines" + ip="86.166.14.171" + subject="comment 2" + date="2014-04-20T19:40:11Z" + content=""" +When I run that, I get: +[[!format sh \"\"\" +/system/bin/sh: /data/data/ga.androidterm/lib/lib.start.so: not found +\"\"\"]] + +Which makes some sense, as the file is not there. The following files can be found under /data/data/ga.androidterm: +[[!format sh \"\"\" +/data/data/ga.androidterm/cache/com.android.renderscript.cache/ <- empty directory +/data/data/ga.androidterm/lib/libga-androidterm4.so +/data/data/ga.androidterm/shared_prefs/ga.androidterm_preferences.xml +\"\"\"]] + +I tried running libga-androidterm4.so, but I just got Segmentation fault back. + +I also tried using logcat to see if I could see anything obvious going wrong when running the app for the first time after installation, but I could not see anything obvious in the logs (there was a lot of noise, so I might of missed something), will anything useful appear with the use of a filter? +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_3_965efa6736dcff4d7010ea5533f31a59._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_3_965efa6736dcff4d7010ea5533f31a59._comment new file mode 100644 index 000000000..ed3d36908 --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_3_965efa6736dcff4d7010ea5533f31a59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="cbaines" + ip="86.166.14.171" + subject="comment 3" + date="2014-04-20T19:50:12Z" + content=""" +Looking at the contents of the apk for the x86 architecture (which this tablet is), would you expect that file to be there? That file only appears in the /lib/armeabi and not /lib/x86 ? +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_4_90a0be2296b4a1d8c1708423666c9619._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_4_90a0be2296b4a1d8c1708423666c9619._comment new file mode 100644 index 000000000..12fd901bc --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_4_90a0be2296b4a1d8c1708423666c9619._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 4" + date="2014-04-20T19:55:59Z" + content=""" +Ok, so the git-annex.apk ships several libraries (and pseudo-libraries), and it seems your version of Android only installed the one that is really an Android java application. I don't know why. + +Here's the full list of files that are supposed to be installed in the lib dir. If you can find something about them in the logs, that might help. + +I suppose it's possible they were installed to some other location in the android file system (which might be hard to find w/o root.. You could check if git-annex in the app list has a larger installed size than the size of libga-androidterm4.so, that might give a hint. + +
+lib.busybox.so
+lib.git-annex.so
+lib.git-shell.so
+lib.git-upload-pack.so
+lib.git.so
+lib.git.tar.gz.so
+lib.gpg.so
+lib.rsync.so
+lib.runshell.so
+lib.ssh-keygen.so
+lib.ssh.so
+lib.start.so
+lib.version.so
+libga-androidterm4.so
+
+ +(I just installed the 5.20140414-gb70cd37 autobuild on an android device and it worked ok.) +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_5_be4b720293992f75b9cc3e8f6687fb87._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_5_be4b720293992f75b9cc3e8f6687fb87._comment new file mode 100644 index 000000000..2d82bb7b5 --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_5_be4b720293992f75b9cc3e8f6687fb87._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="cbaines" + ip="86.166.14.171" + subject="comment 5" + date="2014-04-20T20:20:55Z" + content=""" +I'm guessing you missed my last comment regarding the architecture. Sorry I did not pick this up earlier, but it only came to mind when I had a poke around in the apk? +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_6_8e439138c97b8853ab2b6f96f6111568._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_6_8e439138c97b8853ab2b6f96f6111568._comment new file mode 100644 index 000000000..40404029e --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_6_8e439138c97b8853ab2b6f96f6111568._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 6" + date="2014-04-20T20:58:22Z" + content=""" +Yes, that fully explains it. git-annex is a native program and for android it's only built for arm. +"""]] diff --git a/doc/bugs/Android___91__Terminal_session_finished__93__/comment_7_6142516d816f78c724e22737aa3bca53._comment b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_7_6142516d816f78c724e22737aa3bca53._comment new file mode 100644 index 000000000..d6ce0fe3a --- /dev/null +++ b/doc/bugs/Android___91__Terminal_session_finished__93__/comment_7_6142516d816f78c724e22737aa3bca53._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 7" + date="2014-04-20T20:59:35Z" + content=""" +So, this is a dup of [[todo/Not_working_on_Android-x86]] +"""]] diff --git a/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names.mdwn b/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names.mdwn new file mode 100644 index 000000000..b8f45e4d1 --- /dev/null +++ b/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. +I have a repo where some files have utf-8 characters in their names. They are copied without problems between linux-running pcs, but on Android I only get a small, 206 bytes files with the hash data. + +### What steps will reproduce the problem? +Add some files with utf-8 characters in names, try to sync to Android + +### What version of git-annex are you using? On what operating system? +PC side: tried 5.20140412ubuntu1 from ubuntu repo and standalone tarball 5.20140517-gee56d21, both on Ubuntu Trusy +Android side: Android 4.4.2 on Nexus 7 + +### Please provide any additional information below. +Part of daemon.log I believe is related to this. Lines starting with Number followed by dot are the filenames, but truncated at first non-ascii character. +I suspect empty lines before the "rsync failed" represent files with names that start with non-ascii character. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + + rsync failed -- run git annex again to resume file transfer + + + rsync failed -- run git annex again to resume file transfer + + + rsync failed -- run git annex again to resume file transfer + +02. Wyspa W + rsync failed -- run git annex again to resume file transfer + +05. Ponad Krain + rsync failed -- run git annex again to resume file transfer + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names/comment_1_bcc3ce19cf26731057a7f3189fcbae19._comment b/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names/comment_1_bcc3ce19cf26731057a7f3189fcbae19._comment new file mode 100644 index 000000000..130e4a420 --- /dev/null +++ b/doc/bugs/Android_can__39__t_sync_files_with_utf-8_characters_in_names/comment_1_bcc3ce19cf26731057a7f3189fcbae19._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniXLhO9mLn-7EDfawdENZ2fQwlGy5w_oc" + nickname="Michał" + subject="Update - 20140529" + date="2014-06-01T01:36:16Z" + content=""" +Tried with the new 20140529 on Android, same behavior. + +One more note: I managed to spot the attempted update in the webapp. The filename that shows up there has all the non-ascii characters replaced by ��� (not truncated as in logs), ex: old/������������.pdf +"""]] diff --git a/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean.mdwn b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean.mdwn new file mode 100644 index 000000000..c7f5e582c --- /dev/null +++ b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean.mdwn @@ -0,0 +1,166 @@ +### Please describe the problem. + +Install seems to die because /data/app-lib not found. Sorry, I did not copy. Git-annex log is below. + +I tried To run git-annex second time, here's what terminal says. + + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +u0_a36@manta:/sdcard/git-annex.home $ git annex webapp +WARNING: linker: git-annex has text relocations. This is wasting memory and is a security risk. Please fix. +error: fchmod on /sdcard/mediashare/.git/config.lock failed: Operation not permitted +error: fchmod on /sdcard/mediashare/.git/config.lock failed: Operation not permitted + +From git terminal, can start web viewer, it offers to make repo. I chose /sdcard/mediashare, result is browser fail: + +git [Param "config",Param "annex.uuid",Param "380f6ec2-a7b0-43db-9447-f0de1b5a1b5b"] failed + +The install did create /sdcard/mediashare. I did have the sdcard directory all along. + +I can't say for sure what else is in file system. ES File manager shows /data exists, but it is empty. But tablet not easy to diagnose + +### What steps will reproduce the problem? + +Install git-annex.apk from website. I downloaded 20140620. + +### What version of git-annex are you using? On what operating system? + +Android 4.4.2 on Nexus tablet. + +### Please provide any additional information below. + +Git-anex-install.log. it is only file in /sdcard/git-annex.home. note it says it is installing to /data/data/. I may manually create that structure and see if a reinstall ends differently. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Installation starting to /data/data/ga.androidterm +1bebb0d66f3f7c5ac4889b86669cab04ebee9bba +installing busybox +installing git-annex +installing git-shell +installing git-upload-pack +installing git +installing gpg +installing rsync +installing ssh +installing ssh-keygen +linking ./bin/git-upload-archive to git +linking ./bin/git-receive-pack to git +linking ./libexec/git-core/git-help to git +linking ./libexec/git-core/git-fsck to git +linking ./libexec/git-core/git-cat-file to git +linking ./libexec/git-core/git-init to git +linking ./libexec/git-core/git-checkout-index to git +linking ./libexec/git-core/git-notes to git +linking ./libexec/git-core/git-grep to git +linking ./libexec/git-core/git-blame to git +linking ./libexec/git-core/git-verify-tag to git +linking ./libexec/git-core/git-write-tree to git +linking ./libexec/git-core/git-log to git +linking ./libexec/git-core/git-stage to git +linking ./libexec/git-core/git-update-ref to git +linking ./libexec/git-core/git-status to git +linking ./libexec/git-core/git-show-branch to git +linking ./libexec/git-core/git-merge-file to git +linking ./libexec/git-core/git-for-each-ref to git +linking ./libexec/git-core/git to git +linking ./libexec/git-core/git-replace to git +linking ./libexec/git-core/git-update-index to git +linking ./libexec/git-core/git-annotate to git +linking ./libexec/git-core/git-patch-id to git +linking ./libexec/git-core/git-merge-recursive to git +linking ./libexec/git-core/git-rm to git +linking ./libexec/git-core/git-ls-tree to git +linking ./libexec/git-core/git-update-server-info to git +linking ./libexec/git-core/git-diff-tree to git +linking ./libexec/git-core/git-merge-tree to git +linking ./libexec/git-core/git-mktag to git +linking ./libexec/git-core/git-rev-list to git +linking ./libexec/git-core/git-column to git +linking ./libexec/git-core/git-apply to git +linking ./libexec/git-core/git-var to git +linking ./libexec/git-core/git-rev-parse to git +linking ./libexec/git-core/git-archive to git +linking ./libexec/git-core/git-verify-pack to git +linking ./libexec/git-core/git-push to git +linking ./libexec/git-core/git-commit to git +linking ./libexec/git-core/git-tag to git +linking ./libexec/git-core/git-pack-refs to git +linking ./libexec/git-core/git-fmt-merge-msg to git +linking ./libexec/git-core/git-fast-export to git +linking ./libexec/git-core/git-remote-ext to git +linking ./libexec/git-core/git-mailsplit to git +linking ./libexec/git-core/git-send-pack to git +linking ./libexec/git-core/git-diff-index to git +linking ./libexec/git-core/git-mailinfo to git +linking ./libexec/git-core/git-revert to git +linking ./libexec/git-core/git-diff-files to git +linking ./libexec/git-core/git-merge-ours to git +linking ./libexec/git-core/git-show-ref to git +linking ./libexec/git-core/git-diff to git +linking ./libexec/git-core/git-clean to git +linking ./libexec/git-core/git-bundle to git +linking ./libexec/git-core/git-check-mailmap to git +linking ./libexec/git-core/git-describe to git +linking ./libexec/git-core/git-branch to git +linking ./libexec/git-core/git-checkout to git +linking ./libexec/git-core/git-name-rev to git +linking ./libexec/git-core/git-gc to git +linking ./libexec/git-core/git-fetch to git +linking ./libexec/git-core/git-whatchanged to git +linking ./libexec/git-core/git-cherry to git +linking ./libexec/git-core/git-reflog to git +linking ./libexec/git-core/git-hash-object to git +linking ./libexec/git-core/git-init-db to git +linking ./libexec/git-core/git-rerere to git +linking ./libexec/git-core/git-reset to git +linking ./libexec/git-core/git-stripspace to git +linking ./libexec/git-core/git-prune to git +linking ./libexec/git-core/git-mktree to git +linking ./libexec/git-core/git-unpack-file to git +linking ./libexec/git-core/git-remote to git +linking ./libexec/git-core/git-commit-tree to git +linking ./libexec/git-core/git-symbolic-ref to git +linking ./libexec/git-core/git-credential to git +linking ./libexec/git-core/git-check-ignore to git +linking ./libexec/git-core/git-shortlog to git +linking ./libexec/git-core/git-fetch-pack to git +linking ./libexec/git-core/git-clone to git +linking ./libexec/git-core/git-mv to git +linking ./libexec/git-core/git-read-tree to git +linking ./libexec/git-core/git-merge-subtree to git +linking ./libexec/git-core/git-ls-remote to git +linking ./libexec/git-core/git-config to git +linking ./libexec/git-core/git-cherry-pick to git +linking ./libexec/git-core/git-merge to git +linking ./libexec/git-core/git-prune-packed to git +linking ./libexec/git-core/git-count-objects to git +linking ./libexec/git-core/git-merge-base to git +linking ./libexec/git-core/git-index-pack to git +linking ./libexec/git-core/git-repack to git +linking ./libexec/git-core/git-show to git +linking ./libexec/git-core/git-fsck-objects to git +linking ./libexec/git-core/git-format-patch to git +linking ./libexec/git-core/git-bisect--helper to git +linking ./libexec/git-core/git-upload-archive to git +linking ./libexec/git-core/git-ls-files to git +linking ./libexec/git-core/git-check-attr to git +linking ./libexec/git-core/git-get-tar-commit-id to git +linking ./libexec/git-core/git-remote-fd to git +linking ./libexec/git-core/git-unpack-objects to git +linking ./libexec/git-core/git-add to git +linking ./libexec/git-core/git-check-ref-format to git +linking ./libexec/git-core/git-merge-index to git +linking ./libexec/git-core/git-pack-objects to git +linking ./libexec/git-core/git-receive-pack to git +linking ./libexec/git-core/git-pack-redundant to git +linking ./libexec/git-core/git-shell to git-shell +linking ./libexec/git-core/git-upload-pack to git-upload-pack +Installation complete + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_1_b41666c032aeb2d0de35023328391edb._comment b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_1_b41666c032aeb2d0de35023328391edb._comment new file mode 100644 index 000000000..cc0fcf30e --- /dev/null +++ b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_1_b41666c032aeb2d0de35023328391edb._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-03T20:10:41Z" + content=""" +This is not an installation problem; the /data/app-lib message is a red herring. + +Is /sdcard/mediashare a directory that already existed? If so, perhaps it's some \"mediashare\" thing that has a even more crippled filesystem than usual. Seems possible, but I don't know. Want to rule it out.. + +The actual failure seems to be when git tries to write to its config.lock file, and changes its permissions. This is a recent change in git, commit daa22c6f8da466bd7a438f1bc27375fd737ffcf3, \"config: preserve config file permissions on edits\". + +[[!language C \"\"\" ++ if (fchmod(fd, st.st_mode & 07777) < 0) { ++ error(\"fchmod on %s failed: %s\", ++ lock->filename, strerror(errno)); ++ ret = CONFIG_NO_WRITE; ++ goto out_free; ++ } +\"\"\"]] + +This seems utterly innocuous; the config file has some mode, and this just sets that same mode back (excluding some high bit flags). But Android goes out of its way to make /sdcard the most craptacular filesystem in use on any Linux system, so I'm not really surprised that it might just refuse all fchmod even when it's a no-op. (This is the only fchmod call currently in git.) + +I've patched the bundled git to work around this. Will be a while until there is an updated autobuild.. +"""]] diff --git a/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_2_95ebed938df3db2b6d4ebe4c666c08f8._comment b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_2_95ebed938df3db2b6d4ebe4c666c08f8._comment new file mode 100644 index 000000000..392f7007f --- /dev/null +++ b/doc/bugs/Android_fails_on_Google_Nexus_10_Jellybean/comment_2_95ebed938df3db2b6d4ebe4c666c08f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-04T17:52:35Z" + content=""" +This problem should be fixed in the most recent daily build of git-annex for android. Testing appreciated. +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn new file mode 100644 index 000000000..24b2af22a --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +The armel daily build linked from https://git-annex.branchable.com/install/Linux_standalone/ doesn't seem to work. + +When runshell is run as root, it hangs with no output and trying to run git directly from the bin directory gives + +"/git: exec: line 2: : Permission denied:." + +When run as an ordinary user, it gives + +"./runshell: line 40: can't create /root/.ssh/git-annex-shell: Permission denied +chmod: /root/.ssh/git-annex-shell: Permission denied" + +### What steps will reproduce the problem? + +- Login in to NAS as root via SSH +- Download latest daily build via curl +- Untar, chown -R root:root, and CD in to git-annex.linux +- ./runshell or 'cd bin; ./git" + +### What version of git-annex are you using? On what operating system? + +Synology DSM 4.3-3810 and latest nightly build of git-annex. + +> The shimming was broken, causing the hang. [[fixed|done]] +> +> (It looks like you somehow forgot to set HOME when becoming the non-root +> user.) --[[Joey]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment new file mode 100644 index 000000000..897b588b3 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Same hang when added to $PATH" + date="2013-12-21T03:28:07Z" + content=""" +DiskStation> echo $PATH + +/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin:/root/git-annex.linux + +DiskStation> git-annex-shell + +[...hangs...] +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment new file mode 100644 index 000000000..16d282470 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2013-12-21T06:27:49Z" + content=""" +Try not as root, see how far that gets you. +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment new file mode 100644 index 000000000..2c78250b5 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 3" + date="2013-12-21T08:22:28Z" + content=""" +Hi Greg, I tried that and got a permissions error. + +\"./runshell: line 40: can't create /root/.ssh/git-annex-shell: Permission denied chmod: /root/.ssh/git-annex-shell: Permission denied\" +"""]] diff --git a/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp.mdwn b/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp.mdwn new file mode 100644 index 000000000..256bc1e7f --- /dev/null +++ b/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp.mdwn @@ -0,0 +1,9 @@ +The assistant web UI says: `SanityCheckerStartup crashed: /home/zerodogg/Delt/.git/annex/tmp/Sak_7.pdf: getFileStatus: does not exist (No such file or directory)` with a «Restart thread»-button. Clicking said button merely makes the error re-appear. The file in question is a broken symlink. Deleting the symlink and then restarting the thread fixes the problem. + +I'm not sure what causes said symlink to appear (which has the name of a file that does exist in the annex), but it has done so on several systems accross different distributions here (Fedora 20, Ubuntu 14.04, Archlinux). Perhaps an rsync copies over a symlink instead of a file? + +git-annex version: 5.20140517-gee56d21 + +[[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp/comment_1_659e0c5127c92b1c7643823d0c240543._comment b/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp/comment_1_659e0c5127c92b1c7643823d0c240543._comment new file mode 100644 index 000000000..22e7b66f4 --- /dev/null +++ b/doc/bugs/Assistant_breaks_when_broken_symlinks_are_in_.git__47__annex__47__tmp/comment_1_659e0c5127c92b1c7643823d0c240543._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-30T18:58:56Z" + content=""" +Well, Sak7.pdf is not a git-annex object filename. And .git/annex/tmp used to be used as a general-purpose temp directory, but in recent versions we're moving away from that; it's only supposed to contain git-annex objects. + +So, this must be a leftover file from an old version of git-annex. I don't know offhand what would create a symlink in the temp directory. However, the crash is from the code that was added to the assistant to clean up such left behind files. So, I'll fix that code. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files.mdwn b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files.mdwn new file mode 100644 index 000000000..ebf238072 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files.mdwn @@ -0,0 +1,64 @@ +### Please describe the problem. + +The assistant/webapp doesn't drop files from the local (source) repository after transferring it to the 2 backup repositories (numcopies 2), but they are listed with: + + git annex find --want-drop + +### What steps will reproduce the problem? + +#### mintcream #### + + git init annex + cd ~/annex + git commit -m "create" --allow-empty + git annex init mintcream + git annex numcopies 2 + git annex group here source + git config annex.autocommit false + git annex webapp + +#### liquorice #### + + git init annex + cd ~/annex + git annex init liquorice + git annex group here backup + +#### candyfloss #### + + git init annex + cd ~/annex + git annex init candyfloss + git annex group here backup + +#### mintcream #### + + (add both backup repositories in webapp as "remote repositories") + (copy files into ~/annex directory) + git annex add + git commit -m "add some files" + (use "sync now" to prod assistant into noticing the commit) + +### What was I expecting to happen? ### + +The assistant to transfer the files to liquorice and candyfloss, then for the assistant to drop the files from mintcream. + +### What actually happened? ### + +The assistant transfers the files to liquorice and candyfloss. No files are dropped from mintcream. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140707-g923b436 + +Arch Linux (git-annex-bin from AUR) + +### Please provide any additional information below. + +I wish to retain control of the commits on "master" (annex.autocommit false) but want the assistant to handle moving/dropping the files as required in the background. + + git annex drop --auto + +works as expected. + +> [[done]]; user misconfiguration. --[[Joey]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_1_f32fbae29e4db039804c0853256c238c._comment b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_1_f32fbae29e4db039804c0853256c238c._comment new file mode 100644 index 000000000..61c62703c --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_1_f32fbae29e4db039804c0853256c238c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T18:48:17Z" + content=""" +Reproduced. `git annex sync --content` has the same problem. + +Of course, both it and the assistant *do* check if files can be dropped. For some reason, it is deciding it is not safe to drop the file. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_2_405bfa00dfd433352c263afe75e94b2c._comment b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_2_405bfa00dfd433352c263afe75e94b2c._comment new file mode 100644 index 000000000..d7d288b39 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_2_405bfa00dfd433352c263afe75e94b2c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="user misconfiguration" + date="2014-07-10T19:02:00Z" + content=""" +Reason is simple: You manually put the repository into the source group, but its preferred content is not set to \"standard\". No matter what group a repository is in, you have to set its preferred content to something, or git-annex will default to assuming you want the repo to retain all files. + +So, `git annex wanted mintcream standard` and away you go. You'll also want to set that for the other 2 repos probably.. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_3_c8cac8d800199ca4d8a65ba72abf678e._comment b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_3_c8cac8d800199ca4d8a65ba72abf678e._comment new file mode 100644 index 000000000..81b25c8f0 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_3_c8cac8d800199ca4d8a65ba72abf678e._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="CandyAngel" + ip="81.111.193.130" + subject="comment 3" + date="2014-07-11T10:41:23Z" + content=""" +Ohhh I see! + +I was expecting \"standard\" to be the default because of what vicfg shows.. + + # Repository preferred contents + # (for web) + #wanted 00000000-0000-0000-0000-000000000001 = standard + # (for test) + #wanted 025d4d21-7648-426c-a406-bb7f27688afe = standard + + # Group preferred contents + # (Used by repositories with \"groupwanted\" in their preferred contents) + #groupwanted archive = standard + #groupwanted backup = standard + #groupwanted client = standard + #groupwanted incrementalbackup = standard + #groupwanted manual = standard + #groupwanted public = standard + #groupwanted smallarchive = standard + #groupwanted source = standard + #groupwanted transfer = standard + +In my experience with configuration files, a commented out line like this: + + #wanted 025d4d21-7648-426c-a406-bb7f27688afe = standard + +without any \"this is an example\" text above it means \"this is the default setting\". Everything in vicfg looks like it is the current settings, rather than just placeholders.. + +I understand why you need to set the wanted explicitly (at least from the command line), but the way information is shown in vicfg led me to interact with it incorrectly. Would it be worth adding a disclaimer that commented lines are examples, not defaults? As far as I am aware, the logic I explained above (commented line == default) is the \"norm\" in *nix configuration files, which would make vicfg non-intuitive. + +All I need to do now is not be so bothered by how messy the git-annex branch looks when the assistant is running things! :D + +Thankies +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_4_ee5fa8a22d1571b0040aa97c4979ef92._comment b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_4_ee5fa8a22d1571b0040aa97c4979ef92._comment new file mode 100644 index 000000000..237182879 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_4_ee5fa8a22d1571b0040aa97c4979ef92._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="CandyAngel" + ip="81.111.193.130" + subject="comment 4" + date="2014-07-11T10:57:58Z" + content=""" +Actually, I'm still a little confused. + +If git-annex was presuming I wanted to keep all the files as you say, why were they listed in `git annex find --want-drop` and dropped by `git annex drop --auto`? + +Shouldn't they have been empty and a no-op respectively? + +There seems to be a difference in the behaviour between the command line (wanting to and actually dropping the files) and the assistant (wanting to keep them) for the same settings. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_5_eef448b9e3dd1a717430a60d1001a7ee._comment b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_5_eef448b9e3dd1a717430a60d1001a7ee._comment new file mode 100644 index 000000000..11c690cb7 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_check_if_it_can_drop_files/comment_5_eef448b9e3dd1a717430a60d1001a7ee._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 5" + date="2014-07-11T18:27:44Z" + content=""" +The assistant defaults to assuming all files are wanted if there's no preferred content settings, while command-line dropping stuff defaults to assuming no files are wanted (or more accurately, that you'll drop anything you don't want and get anything you do) when there's no preferred content settings. So the default differs, but this only matters when not setting preferred contents. + +I agree that the vicfg could be misread, so have changed it. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate.mdwn b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate.mdwn new file mode 100644 index 000000000..0ad0f1eb3 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate.mdwn @@ -0,0 +1,435 @@ +### Please describe the problem. + +On two hosts, I've configured two separate local repositories (~/foo and ~/bar) with the assistant and added a transfer repository to ~/foo. + +While files are kept separate, the configuration seems to get mixed up. This results in all files beeing uploaded to the configured transfer repository. + +The reason might be, that informations about ~/bar are included in the configuration of ~/foo (see below). + +### What steps will reproduce the problem? + +* Create local repository ~/foo on both hosts +* Add transfer repository to ~/foo on both hosts +* Add some files to ~/foo and let it sync +* Create local repository ~/bar and select keep the repositories separate on both hosts +* All files of ~/foo will now be uploaded again to the transfer repository + +### What version of git-annex are you using? On what operating system? + +5.20140421~bpo70+1 on Debian 7.5 amd64 + +### Please provide any additional information below. + +*trh@czc4142wfz:~/foo$ git-annex info* +
repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 4
+	00000000-0000-0000-0000-000000000001 -- web
+ 	bd23a5ed-af6e-466d-ac8c-9ea38a220c62 -- trh@r9-y3pll:~/foo
+ 	cc888105-b6c3-4926-8396-e3870f6bfc05 -- transfer_foo
+ 	f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 -- here (trh@czc4142wfz:~/foo)
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 356.11 gigabytes (+1 megabyte reserved)
+local annex keys: 2
+local annex size: 2.99 gigabytes
+annexed files in working tree: 2
+size of annexed files in working tree: 2.99 gigabytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+	SHA256E: 4
+
+ +*trh@czc4142wfz:~/bar$ git-annex info* +
repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 2
+	00000000-0000-0000-0000-000000000001 -- web
+ 	f1478436-cf7b-4a05-91a6-91157ae5e9c4 -- here (trh@czc4142wfz:~/bar)
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 356.11 gigabytes (+1 megabyte reserved)
+local annex keys: 0
+local annex size: 0 bytes
+annexed files in working tree: 0
+size of annexed files in working tree: 0 bytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+
+ +*trh@czc4142wfz:~/foo$ git-annex vicfg* +
# git-annex configuration
+#
+# Changes saved to this file will be recorded in the git-annex branch.
+#
+# Lines in this file have the format:
+#   setting field = value
+
+# Repository trust configuration
+# (Valid trust levels: trusted semitrusted untrusted dead)
+# (for web)
+#trust 00000000-0000-0000-0000-000000000001 = semitrusted
+# (for trh@r9-y3pll:~/foo)
+#trust bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = semitrusted
+# (for transfer_foo)
+#trust cc888105-b6c3-4926-8396-e3870f6bfc05 = semitrusted
+# (for trh@czc4142wfz:~/foo)
+#trust f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = semitrusted
+
+# Repository groups
+# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)
+# (Separate group names with spaces)
+# (for )
+group 357eaef4-af1b-491a-a003-01c2d583056e = client
+# (for trh@r9-y3pll:~/foo)
+group bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = client
+# (for )
+group f1478436-cf7b-4a05-91a6-91157ae5e9c4 = client
+# (for trh@czc4142wfz:~/foo)
+group f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = client
+# (for transfer_foo)
+group cc888105-b6c3-4926-8396-e3870f6bfc05 = transfer
+# (for web)
+#group 00000000-0000-0000-0000-000000000001 =
+
+# Repository preferred contents
+# (for )
+wanted 357eaef4-af1b-491a-a003-01c2d583056e = standard
+# (for trh@r9-y3pll:~/foo)
+wanted bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = standard
+# (for transfer_foo)
+wanted cc888105-b6c3-4926-8396-e3870f6bfc05 = standard
+# (for )
+wanted f1478436-cf7b-4a05-91a6-91157ae5e9c4 = standard
+# (for trh@czc4142wfz:~/foo)
+wanted f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = standard
+# (for web)
+#wanted 00000000-0000-0000-0000-000000000001 = standard
+
+# Group preferred contents
+# (Used by repositories with "groupwanted" in their preferred contents)
+#groupwanted archive = standard
+#groupwanted backup = standard
+#groupwanted client = standard
+#groupwanted incrementalbackup = standard
+#groupwanted manual = standard
+#groupwanted public = standard
+#groupwanted smallarchive = standard
+#groupwanted source = standard
+#groupwanted transfer = standard
+#groupwanted unwanted = standard
+
+# Standard preferred contents
+# (Used by wanted or groupwanted expressions containing "standard")
+# (For reference only; built-in and cannot be changed!)
+# standard client = (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1
+# standard transfer = (not (inallgroup=client and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard backup = include=* or unused
+# standard incrementalbackup = ((include=* or unused) and (not copies=incrementalbackup:1)) or approxlackingcopies=1
+# standard smallarchive = ((include=*/archive/* or include=archive/*) and ((not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard archive = (not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1
+# standard source = not (copies=1)
+# standard manual = present and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# standard public = inpreferreddir
+# standard unwanted = exclude=*
+
+# Repository required contents
+# (for web)
+#required 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/foo)
+#required bd23a5ed-af6e-466d-ac8c-9ea38a220c62 =
+# (for transfer_foo)
+#required cc888105-b6c3-4926-8396-e3870f6bfc05 =
+# (for trh@czc4142wfz:~/foo)
+#required f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 =
+
+# Scheduled activities
+# (Separate multiple activities with "; ")
+# (for web)
+#schedule 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/foo)
+#schedule bd23a5ed-af6e-466d-ac8c-9ea38a220c62 =
+# (for transfer_foo)
+#schedule cc888105-b6c3-4926-8396-e3870f6bfc05 =
+# (for trh@czc4142wfz:~/foo)
+#schedule f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 =
+
+ +**Note: f1478436-cf7b-4a05-91a6-91157ae5e9c4 is id of ~/bar on local host (see below) / 357eaef4-af1b-491a-a003-01c2d583056e is id of ~/bar on r9-y3pll** + +*trh@czc4142wfz:~/bar$ git-annex vicfg* +
# git-annex configuration
+#
+# Changes saved to this file will be recorded in the git-annex branch.
+#
+# Lines in this file have the format:
+#   setting field = value
+
+# Repository trust configuration
+# (Valid trust levels: trusted semitrusted untrusted dead)
+# (for web)
+#trust 00000000-0000-0000-0000-000000000001 = semitrusted
+# (for trh@czc4142wfz:~/bar)
+#trust f1478436-cf7b-4a05-91a6-91157ae5e9c4 = semitrusted
+
+# Repository groups
+# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)
+# (Separate group names with spaces)
+# (for web)
+#group 00000000-0000-0000-0000-000000000001 =
+# (for trh@czc4142wfz:~/bar)
+#group f1478436-cf7b-4a05-91a6-91157ae5e9c4 =
+
+# Repository preferred contents
+# (for web)
+#wanted 00000000-0000-0000-0000-000000000001 = standard
+# (for trh@czc4142wfz:~/bar)
+#wanted f1478436-cf7b-4a05-91a6-91157ae5e9c4 = standard
+
+# Group preferred contents
+# (Used by repositories with "groupwanted" in their preferred contents)
+#groupwanted archive = standard
+#groupwanted backup = standard
+#groupwanted client = standard
+#groupwanted incrementalbackup = standard
+#groupwanted manual = standard
+#groupwanted public = standard
+#groupwanted smallarchive = standard
+#groupwanted source = standard
+#groupwanted transfer = standard
+#groupwanted unwanted = standard
+
+# Standard preferred contents
+# (Used by wanted or groupwanted expressions containing "standard")
+# (For reference only; built-in and cannot be changed!)
+# standard client = (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1
+# standard transfer = (not (inallgroup=client and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard backup = include=* or unused
+# standard incrementalbackup = ((include=* or unused) and (not copies=incrementalbackup:1)) or approxlackingcopies=1
+# standard smallarchive = ((include=*/archive/* or include=archive/*) and ((not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard archive = (not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1
+# standard source = not (copies=1)
+# standard manual = present and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# standard public = inpreferreddir
+# standard unwanted = exclude=*
+
+# Repository required contents
+# (for web)
+#required 00000000-0000-0000-0000-000000000001 =
+# (for trh@czc4142wfz:~/bar)
+#required f1478436-cf7b-4a05-91a6-91157ae5e9c4 =
+
+# Scheduled activities
+# (Separate multiple activities with "; ")
+# (for web)
+#schedule 00000000-0000-0000-0000-000000000001 =
+# (for trh@czc4142wfz:~/bar)
+#schedule f1478436-cf7b-4a05-91a6-91157ae5e9c4 =
+
+ +*trh@r9-y3pll:~/foo$ git-annex info* +
repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 4
+	00000000-0000-0000-0000-000000000001 -- web
+ 	bd23a5ed-af6e-466d-ac8c-9ea38a220c62 -- here (trh@r9-y3pll:~/foo)
+ 	cc888105-b6c3-4926-8396-e3870f6bfc05 -- transfer_foo
+ 	f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 -- trh@czc4142wfz:~/foo
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 280.24 gigabytes (+1 megabyte reserved)
+local annex keys: 2
+local annex size: 2.99 gigabytes
+annexed files in working tree: 2
+size of annexed files in working tree: 2.99 gigabytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+	SHA256E: 4
+
+ +*trh@r9-y3pll:~/bar$ git-annex info* +
repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 2
+	00000000-0000-0000-0000-000000000001 -- web
+ 	357eaef4-af1b-491a-a003-01c2d583056e -- here (trh@r9-y3pll:~/bar)
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 280.24 gigabytes (+1 megabyte reserved)
+local annex keys: 0
+local annex size: 0 bytes
+annexed files in working tree: 0
+size of annexed files in working tree: 0 bytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+
+ +*trh@r9-y3pll:~/foo$ git-annex vicfg* +
# git-annex configuration
+#
+# Changes saved to this file will be recorded in the git-annex branch.
+#
+# Lines in this file have the format:
+#   setting field = value
+
+# Repository trust configuration
+# (Valid trust levels: trusted semitrusted untrusted dead)
+# (for web)
+#trust 00000000-0000-0000-0000-000000000001 = semitrusted
+# (for trh@r9-y3pll:~/foo)
+#trust bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = semitrusted
+# (for transfer_foo)
+#trust cc888105-b6c3-4926-8396-e3870f6bfc05 = semitrusted
+# (for trh@czc4142wfz:~/foo)
+#trust f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = semitrusted
+
+# Repository groups
+# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)
+# (Separate group names with spaces)
+# (for )
+group 357eaef4-af1b-491a-a003-01c2d583056e = client
+# (for trh@r9-y3pll:~/foo)
+group bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = client
+# (for )
+group f1478436-cf7b-4a05-91a6-91157ae5e9c4 = client
+# (for trh@czc4142wfz:~/foo)
+group f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = client
+# (for transfer_foo)
+group cc888105-b6c3-4926-8396-e3870f6bfc05 = transfer
+# (for web)
+#group 00000000-0000-0000-0000-000000000001 =
+
+# Repository preferred contents
+# (for )
+wanted 357eaef4-af1b-491a-a003-01c2d583056e = standard
+# (for trh@r9-y3pll:~/foo)
+wanted bd23a5ed-af6e-466d-ac8c-9ea38a220c62 = standard
+# (for transfer_foo)
+wanted cc888105-b6c3-4926-8396-e3870f6bfc05 = standard
+# (for )
+wanted f1478436-cf7b-4a05-91a6-91157ae5e9c4 = standard
+# (for trh@czc4142wfz:~/foo)
+wanted f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 = standard
+# (for web)
+#wanted 00000000-0000-0000-0000-000000000001 = standard
+
+# Group preferred contents
+# (Used by repositories with "groupwanted" in their preferred contents)
+#groupwanted archive = standard
+#groupwanted backup = standard
+#groupwanted client = standard
+#groupwanted incrementalbackup = standard
+#groupwanted manual = standard
+#groupwanted public = standard
+#groupwanted smallarchive = standard
+#groupwanted source = standard
+#groupwanted transfer = standard
+#groupwanted unwanted = standard
+
+# Standard preferred contents
+# (Used by wanted or groupwanted expressions containing "standard")
+# (For reference only; built-in and cannot be changed!)
+# standard client = (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1
+# standard transfer = (not (inallgroup=client and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard backup = include=* or unused
+# standard incrementalbackup = ((include=* or unused) and (not copies=incrementalbackup:1)) or approxlackingcopies=1
+# standard smallarchive = ((include=*/archive/* or include=archive/*) and ((not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard archive = (not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1
+# standard source = not (copies=1)
+# standard manual = present and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# standard public = inpreferreddir
+# standard unwanted = exclude=*
+
+# Repository required contents
+# (for web)
+#required 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/foo)
+#required bd23a5ed-af6e-466d-ac8c-9ea38a220c62 =
+# (for transfer_foo)
+#required cc888105-b6c3-4926-8396-e3870f6bfc05 =
+# (for trh@czc4142wfz:~/foo)
+#required f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 =
+
+# Scheduled activities
+# (Separate multiple activities with "; ")
+# (for web)
+#schedule 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/foo)
+#schedule bd23a5ed-af6e-466d-ac8c-9ea38a220c62 =
+# (for transfer_foo)
+#schedule cc888105-b6c3-4926-8396-e3870f6bfc05 =
+# (for trh@czc4142wfz:~/foo)
+#schedule f3b332fd-4b7a-4a5b-b077-8f13d3d9a407 =
+
+ +*trh@r9-y3pll:~/bar$ git-annex vicfg* +
# git-annex configuration
+#
+# Changes saved to this file will be recorded in the git-annex branch.
+#
+# Lines in this file have the format:
+#   setting field = value
+
+# Repository trust configuration
+# (Valid trust levels: trusted semitrusted untrusted dead)
+# (for web)
+#trust 00000000-0000-0000-0000-000000000001 = semitrusted
+# (for trh@r9-y3pll:~/bar)
+#trust 357eaef4-af1b-491a-a003-01c2d583056e = semitrusted
+
+# Repository groups
+# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted)
+# (Separate group names with spaces)
+# (for web)
+#group 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/bar)
+#group 357eaef4-af1b-491a-a003-01c2d583056e =
+
+# Repository preferred contents
+# (for web)
+#wanted 00000000-0000-0000-0000-000000000001 = standard
+# (for trh@r9-y3pll:~/bar)
+#wanted 357eaef4-af1b-491a-a003-01c2d583056e = standard
+
+# Group preferred contents
+# (Used by repositories with "groupwanted" in their preferred contents)
+#groupwanted archive = standard
+#groupwanted backup = standard
+#groupwanted client = standard
+#groupwanted incrementalbackup = standard
+#groupwanted manual = standard
+#groupwanted public = standard
+#groupwanted smallarchive = standard
+#groupwanted source = standard
+#groupwanted transfer = standard
+#groupwanted unwanted = standard
+
+# Standard preferred contents
+# (Used by wanted or groupwanted expressions containing "standard")
+# (For reference only; built-in and cannot be changed!)
+# standard client = (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1
+# standard transfer = (not (inallgroup=client and copies=client:2) and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard backup = include=* or unused
+# standard incrementalbackup = ((include=* or unused) and (not copies=incrementalbackup:1)) or approxlackingcopies=1
+# standard smallarchive = ((include=*/archive/* or include=archive/*) and ((not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1)) or approxlackingcopies=1
+# standard archive = (not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1
+# standard source = not (copies=1)
+# standard manual = present and ((((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1)
+# standard public = inpreferreddir
+# standard unwanted = exclude=*
+
+# Repository required contents
+# (for web)
+#required 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/bar)
+#required 357eaef4-af1b-491a-a003-01c2d583056e =
+
+# Scheduled activities
+# (Separate multiple activities with "; ")
+# (for web)
+#schedule 00000000-0000-0000-0000-000000000001 =
+# (for trh@r9-y3pll:~/bar)
+#schedule 357eaef4-af1b-491a-a003-01c2d583056e =
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_1_418103046e296a43cfe0f0cf69e729d5._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_1_418103046e296a43cfe0f0cf69e729d5._comment new file mode 100644 index 000000000..7a21b52ce --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_1_418103046e296a43cfe0f0cf69e729d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-29T18:21:30Z" + content=""" +As far as I can understand the description (which has an lot of different \"foo\"'s in it that seem to refer to different things?) -- This is the assistant behaving as designed: Any time two repositories are pointed at the same transfer repository, or removable drive repository, etc, they will unify and share all their files. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_2_9405804842bb23e8040ec85b271b18af._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_2_9405804842bb23e8040ec85b271b18af._comment new file mode 100644 index 000000000..f6a37583a --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_2_9405804842bb23e8040ec85b271b18af._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmi0jblSiI4c5-EswqKw4PXkx5M4fuVvdk" + nickname="Henry" + subject="comment 2" + date="2014-05-29T19:10:08Z" + content=""" +I'm using the same folder name on different hosts. So yes, ~/foo exists 3 times. Let me try to clarify it: + +
+Client        Transfer           Client
+r9-y3pll      edhp-transfer      czc4142wfz
+~/foo     <-> ~/foo          <-> ~/foo
+~/bar                            ~/bar
+
+ +So, I have two clients and one transfer server. Both clients have two local repositories ~/foo and ~/bar. + +The transfer repository has only be configured to the ~/foo client repositories, but not to the ~/bar repositories. + +But for some reason, the ~/foo repositories know about the ~/bar repositories (see the id's of the git-annex vicfg output for ~/foo repositories above) and keep uploading files to the transfer repository, even I did select keep the repositories separate on both hosts. + + +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_3_01fc26e443ea3a8a351174b45f25dc2a._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_3_01fc26e443ea3a8a351174b45f25dc2a._comment new file mode 100644 index 000000000..acbc51c8e --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_3_01fc26e443ea3a8a351174b45f25dc2a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 3" + date="2014-05-29T19:14:51Z" + content=""" +Are you using XMPP? + +There's no way for the foo repositories to learn about the bar repositories unless one of the foo repositories has a remote that is either one of the bar repositories, or that one of the bar repositories points to. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_4_6e8f0889359bb2f3e3438658c9776f76._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_4_6e8f0889359bb2f3e3438658c9776f76._comment new file mode 100644 index 000000000..58804fccf --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_4_6e8f0889359bb2f3e3438658c9776f76._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmi0jblSiI4c5-EswqKw4PXkx5M4fuVvdk" + nickname="Henry" + subject="comment 4" + date="2014-05-29T20:10:15Z" + content=""" +No, I haven't configured XMPP yet. + +I just tried something else: + +Within assistant I've switched to repository ~bar and then added another repository ~/foobar and again selected keep the repositories separate. + +The result is, ~/bar knows (vicfg) about ~/foobar, but ~/foo doesn't. It seems to me, that when adding another local repository, the new repository gets known to the currently selected repository. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_5_902fe9ff295453461b66d84463205fc3._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_5_902fe9ff295453461b66d84463205fc3._comment new file mode 100644 index 000000000..9954f7b01 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_5_902fe9ff295453461b66d84463205fc3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 5" + date="2014-05-29T20:46:47Z" + content=""" +Ok, reproduced that. + +Webapp seems to be setting up the newly created repository's group and preferred content settings inside the current repository. The 2 repositories are not otherwise linked or sharing data in any way, so this the impact is limited to 2 lines that won't affect anything being committed to the git-annex branch, and to the newly created repository not defaulting to being in the client group or having the standard preferred content setting (which can easily be fixed with the webapp). +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_6_ce01656b191d2bb13a3ddc29794e1e7a._comment b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_6_ce01656b191d2bb13a3ddc29794e1e7a._comment new file mode 100644 index 000000000..fd589eb18 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_keep_separate_local_repositories_100__37___separate/comment_6_ce01656b191d2bb13a3ddc29794e1e7a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmi0jblSiI4c5-EswqKw4PXkx5M4fuVvdk" + nickname="Henry" + subject="comment 6" + date="2014-06-11T16:31:09Z" + content=""" +I've just installed 5.20140606 from sid and the problem is gone :-) + +Now hoping that this or one of the next release will make it into wheezy backports ;-) + +Thank you for your great work and support and sorry for my late feedback. +"""]] diff --git a/doc/bugs/Assistant_dropping_from_backup_repo.mdwn b/doc/bugs/Assistant_dropping_from_backup_repo.mdwn new file mode 100644 index 000000000..0e0fd5909 --- /dev/null +++ b/doc/bugs/Assistant_dropping_from_backup_repo.mdwn @@ -0,0 +1,28 @@ +Setup: + +* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable + +Steps: + +* clone existing repository and activate assistant +* Have USB drive, U, with repository group `backup` and preferred content string `standard` + +Expected: + +* Assistant never ever tries to drop anything from U + +Actual: + +* Assistant immediately tries to drop files from U; fortunately I didn't have the USB drive plugged in +* Changing the preferred content string of U to `present or include=*` stops the dropping, but this was never required before + +Additional information: + +* The files that the Assistant started trying to drop were, I believe, the first (alphabetically) files in my repository to contain non-ascii characters in their file names (some French accented letters) + +Thanks. + +> The non-ascii characters are the giveaway: For 1 version, git-annex used +> a regex library that failed to ever match non-ascii characters. So it +> thought backup repos, which match "*" with a regex, wanted no such files. +> This is [[fixed|done]]. --[[Joey]] diff --git a/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment b/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment new file mode 100644 index 000000000..5e69655e0 --- /dev/null +++ b/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-03-12T14:25:16Z" + content=""" +This sounds very similar to [[http://git-annex.branchable.com/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/]]; my client was pulling in content prior to dropping it from a \"backup\" repo on a USB drive. +"""]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn new file mode 100644 index 000000000..fc87672c4 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn @@ -0,0 +1,31 @@ +The assistant from the standalone 64bit build crashes upon startup. + +### Version information + + [0 zerodogg@firefly annexed]$ git annex version + git-annex version: 5.20131230-g4aa88d8 + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + [0 zerodogg@firefly annexed]$ uname -a + Linux firefly 3.12.5-302.fc20.x86_64 #1 SMP Tue Dec 17 20:42:32 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + [0 zerodogg@firefly annexed]$ cat /etc/fedora-release + Fedora release 20 (Heisenbug) + [0 zerodogg@firefly annexed]$ + +### Error + + [0 zerodogg@firefly annexed]$ git annex webapp + Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html + + (process:6045): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed + libgcc_s.so.1 must be installed for pthread_cancel to work + error: git-annex died of signal 6 + [134 zerodogg@firefly annexed]$ ls -l /usr/lib64/libgcc_s.so.1 + lrwxrwxrwx. 1 root root 28 2013-12-18 10:54 /usr/lib64/libgcc_s.so.1 -> libgcc_s-4.8.2-20131212.so.1 + [0 zerodogg@firefly annexed]$ + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment new file mode 100644 index 000000000..951d2687a --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-31T18:55:36Z" + content=""" +You seem to show `git-annex version` being run without crashing, so it does not seem to crash on startup generally. + +Also, this build of git-annex is not linked to libgcc at all. + +Also, git-annex seems to start your web browser. + +So, it seems more likely that your web browser is crashing than that git-annex is crashing. The web browser crash may be taking out git-annex in some way. +"""]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment new file mode 100644 index 000000000..ef1beb973 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2013-12-31T19:11:16Z" + content=""" +I've verified that git-annex runs the web browser in a cleaned up environment, that does not, for example, have the `LD_LIBRARY_PATH` used by the bundle set. + +I checked this by making a ~/dumpenv script: + +[[!format sh \"\"\" +#!/bin/sh +set +echo \"$@\" +\"\"\"]] + +Then `chmod +x ~/dumpenv; git config web.browser ~/dumpenv` and `git annex webapp` to run it. + +I did notice that it set `GCONV_PATH=''`, rather than unsetting that variable, and have made a commit fixing that. But I doubt that caused this problem. + +The \"g_slice_set_config: assertion 'sys_page_size == 0\" seems to be a Mozilla bug: , and does not seem to be related, probably firefox is printing that well before crashing. + +It looks like libc can somehow demand-load libgcc_s.so, so I have force included that into the bundle. Don't know if that will help. Will be available in autobuilds in an hour. +"""]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment new file mode 100644 index 000000000..dd1239733 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.213.197" + subject="comment 3" + date="2014-01-01T02:36:47Z" + content=""" +The browser doesn't crash, it stays up, though the git annex page disappears (replaced by the usual \"connection refused\" page from firefox) after a few seconds (ie. \"git annex webapp\" starts the browser, the git-annex page appears for a few seconds, and then it disappears as git-annex crashes, leaving the browser still running). + +The latest daily build appears to work now though: git-annex version: 5.20140101-gf9e5218, so that seems to have done the trick. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn b/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn new file mode 100644 index 000000000..b1caf530d --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn @@ -0,0 +1,191 @@ +### Please describe the problem. +git annex status reports 160 semitrusted repositories. Four of them are the ones I created (only via webapp, I think I never edited any git-annex config file). One is 00000000-0000-0000-0000-000000000001 -- web + and although I do not know what it is, it is not something new. The remaining 155 appeared spontaneously after several Gb of data (mostly many small files) were added to an Annex (in an 'archive' directory) operated in direct mode by the assistant. + + + +### What steps will reproduce the problem? +Add several Gb of files was enough to trigger this problem, but I did not try to reproduce it. It happened the day I installed the 4.20131106~bpo70+1 version. + +### What version of git-annex are you using? On what operating system? + +4.20131106~bpo70+1 on debian squeeze (7.2), with git 1.8.4.rc3. + + +### Please provide any additional information below. +May be related or not: at some point the webapp displayed two warning boxes. One of them held a message that I did not wirte down and proposed to "Restart the thread". This apparently worked since the box disappeared. The other warning box indicated "NetWatcherFallback crashed: unknown response from git cat-file" and proposed to restart the thread. Trying to "restart the thread" via the provided button just did not trigger any response of the webapp which seemed dead at that point. + +In spite of the git annex status shown below, the webapp still shows only the expected four repositories. + +Output of git annex status (hostname and xmpp account name were edited away): +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +repository mode: direct +trusted repositories: +0 +semitrusted repositories: 160 + 00000000-0000-0000-0000-000000000001 -- web + 0ab193eb-0c76-4559-a93c-2e30ed8630a8 -- someMachineIown_datadir (archive) + 1384784127.91222s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784164.437824s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784176.944372s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784179.254498s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384785147.558938s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785147.717223s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785159.041203s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785159.199504s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785185.79485s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785187.318128s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785215.236504s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785215.389096s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785313.539843s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785313.701305s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785315.596206s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785344.184461s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785348.192805s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785402.70316s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785406.524044s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785446.074236s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384873605.313126s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873697.029999s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873761.687234s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873774.608376s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926279.456728s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926368.736s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926454.99433s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926494.152645s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926504.438232s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934790.89717s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934848.757067s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934899.087168s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934908.238587s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948772.14552s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948805.441196s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948813.397132s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948921.45481s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948924.855852s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949073.988946s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949082.298976s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949399.608138s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949581.12213s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949583.9923s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949700.22807s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949765.484768s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955202.85962s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955230.953995s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955402.534938s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955457.1885s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955524.603709s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955611.891061s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955677.84592s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955689.293082s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955894.057476s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955910.723021s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955914.732132s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955968.717875s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955969.634658s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956004.284925s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956029.567195s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956188.628995s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956379.844701s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956381.613833s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956387.923418s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956395.418701s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956408.792928s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956504.019733s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956519.578085s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956524.419783s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965891.562742s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965891.815119s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965903.355602s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965905.276128s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965978.806653s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965979.393089s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966097.495566s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966097.704474s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966154.97658s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966156.967406s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966233.310488s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966233.522324s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966241.284523s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966241.475381s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966301.688497s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966303.427685s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966392.875983s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966393.38718s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966404.708568s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966406.441164s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966553.557387s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966555.752786s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966653.725847s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966654.23288s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966695.201885s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966695.689398s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966784.556877s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966786.574886s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966791.446852s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966793.218318s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966884.335685s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966886.147083s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967054.857465s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967055.158871s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967190.980027s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967193.176584s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967328.93796s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967330.428095s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967526.127311s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967526.588491s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967627.132549s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967627.685201s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967686.283694s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967686.728086s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967768.270887s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967768.58402s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967769.245615s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967771.122238s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967813.8197s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967814.168477s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967915.243469s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967917.020051s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968031.757775s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968032.190452s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968035.733635s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968036.03299s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968144.555556s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968144.714535s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968150.090148s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968150.820567s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968304.393177s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968304.613624s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968604.499519s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968604.813256s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968702.566939s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968704.427767s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968725.375289s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968725.939271s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968798.402904s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968798.659754s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969055.285004s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969055.715448s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969159.885115s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969162.382266s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969184.633052s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969185.413769s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969374.791849s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969377.497842s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969475.469111s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969489.697737s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969492.087023s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969492.58214s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969784.725195s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969786.49773s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969814.984624s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969815.397676s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 391b0557-dc68-4e40-b6d0-da3033588753 -- here (client) + 668ef9d8-68c6-484e-89e5-06634d590a11 -- rsync.net_datadir_annex (transfer) + b0d3c000-0ac9-4a05-aef4-47f826d5c759 -- user.name (client) + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment new file mode 100644 index 000000000..77f19b15b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 10" + date="2013-12-03T18:05:11Z" + content=""" +It's normal for the git-annex assistant to keep a couple of long-running git cat-file and git check-attr processes running at all times. So I'd not worry about that. + +I received the emailed tarball of uuid.log versions. (message-id CAL5AKQq9i4QwReWHZkKOm1Ggon66FqFkjbM832PP1drgiR3x5g@mail.gmail.com) + +Can you show the command you used to dump those files? Because the contents of them is really quite weird. + +Take file 0, which I'm guessing might be the first version of the uuid.log. It starts off with what I'd expect to see in a uuid.log, but then has a section of what looks like trust.log data, followed by what is certianly supposed to be remote.log data, followed by what looks like `git show 966ec7aaf408dffe0d6e6ce04aebc15dc5b26f5b`, a commit which apparently was made by \"Firstname.Lastname@somedomain.com\" (unless you anonymized that) and added a file `test` to the git repository. + +It gets worse, some of the versions of the uuid.log file appear to be megabytes in size, which is just insane, and these contain more such apparent `git show` of git commits adding files to the repository. + +The general pattern of uuid.log data +trust.log data + remote.log data + git show of a commit seems to repeat in each version of the uuid.log file. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment new file mode 100644 index 000000000..74a30886c --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 11" + date="2013-12-03T18:32:59Z" + content=""" +The files I sent you were collected with: + +```for i in $(seq 0 52); do git show git-annex:uuid.log @{$i} > ~/tmp/uuid.logs/$i; done``` + + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment new file mode 100644 index 000000000..4a92b1f8a --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 12" + date="2013-12-03T18:38:45Z" + content=""" +and yes: as I wrote in email my name and the domain of email address are private and were edited away (sed firstname, lastname, domain except gmail which is used for xmpp). So the \"Firstname.Lastname@somedomain.com\" has replaced my real professional email address. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment new file mode 100644 index 000000000..e4d552ad7 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 13" + date="2013-12-03T20:23:43Z" + content=""" +Ok, that explains the weird results, because I get the same crazy data dumped when I try eg `git show git-annex:uuid.log @{0}` in a repository that is completely ok. + +The @{0} causes git show to show some commit. Not the commit that changed uuid.log however. So it first shows the uuid.log (always the most recent version), and then some random commit. + +This will work: + +
+git clone myrepo myrepo.tmp
+cd myrepo.tmp
+git checkout git-annex
+mkdir logs
+for r in $(git log --pretty='%H' uuid.log); do git show $r > logs/$r; done
+git log uuid.log > logs/gitlog
+
+"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment new file mode 100644 index 000000000..b5b499669 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 14" + date="2013-12-04T08:47:15Z" + content=""" +I followed the procedure you suggested, please see email for how to transfer it to you. There are several points I would like to note: + +1. In the cloned repository created as you suggest above, the output of ```git annex status``` does not contain all the weird things that appear in the original repository (although it contains other stuff, see 3) +2. In the original repository (~/datadir/Annex), the output of ```git annex status``` still contains the 155 nonrepositories, plus some other stuff (see 3) +3. In the meantime, I created (always with the webapp) another annex for private stuff (~/private/Annex) on the same set of machines. Although I chose to \"keep repositories separated\", the few files that I put for testing into the new ~/private/Annex have appeared as broken symlinks in the work annex ~/datadir/Annex. The transfer repositories used for the work and private annexes are different and are not even hosted on the same machines. The jabber account on the contrary is the same for all annexes. +4. In the webapp (client1) in ~/private/Annex, only the correct repositories appear. +5. In the webapp (client1) in ~/datadir/Annex the correct repositories appear, plus the private repository of client 2 and twice the transfer repository of the ~/private/Annex +6. ```git annex status``` on client1 in ~/datadir/Annex shows the repositories of ~/private/Annex in addition to the 155 nonrepositories and its own repositories +7. Because of 3), you will find at the end of the logs some new stuff that is in principle not related to the original bug report. + +In the end the situation is now the following: + +* 3 annexes (~/Annex for initial testing, ~/datadir/Annex for work, ~/private/Annex for private stuff), all created via webapp and handled by the assistant +* files which were added on client 1 into ~/private/Annex also appear as broken links in ~/datadir/Annex on client 1 but nowhere in client 2 +* files which were added on client 2 into ~/private/Annex also appear as broken links in ~/datadir/Annex on client 1 and in client 2 +* The first created annex still seems to work as expected + +I am sorry that the situation is that messy. Is there a way to separate these repositories that have somehow become entangled? + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment new file mode 100644 index 000000000..99bb737e4 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-22T16:54:53Z" + content=""" +Please post the output of `git show git-annex:uuid.log` run in the repository. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment new file mode 100644 index 000000000..6db2a8fca --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment @@ -0,0 +1,183 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 2" + date="2013-11-22T17:23:19Z" + content=""" +Here it is (user name edited): + +[[!format sh \"\"\" + + +0ab193eb-0c76-4559-a93c-2e30ed8630a8 archive timestamp=1384664310.014349s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 datadir on st08 timestamp=1384522780.868451s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384540428.076617s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384541057.852874s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384548609.891111s +1384784127.91222s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784164.437824s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784176.944372s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784179.254498s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384785147.558938s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785147.717223s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785159.041203s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785159.199504s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785185.79485s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785187.318128s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785215.236504s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785215.389096s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785313.539843s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785313.701305s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785315.596206s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785344.184461s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785348.192805s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785402.70316s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785406.524044s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785446.074236s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384873605.313126s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873697.029999s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873761.687234s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873774.608376s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926279.456728s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384926368.736s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926454.99433s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926494.152645s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926504.438232s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934790.89717s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934848.757067s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934899.087168s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934908.238587s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948772.14552s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948805.441196s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948813.397132s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948921.45481s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948924.855852s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949073.988946s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949082.298976s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949399.608138s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949581.12213s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949583.9923s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949700.22807s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949765.484768s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955202.85962s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955230.953995s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955402.534938s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955457.1885s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955524.603709s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955611.891061s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955677.84592s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955689.293082s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955894.057476s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955910.723021s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955914.732132s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955968.717875s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955969.634658s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956004.284925s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956029.567195s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956188.628995s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956379.844701s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956381.613833s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956387.923418s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956395.418701s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956408.792928s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956504.019733s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956519.578085s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956524.419783s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384965891.562742s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965891.815119s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384965903.355602s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965905.276128s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384965978.806653s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965979.393089s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966097.495566s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966097.704474s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966154.97658s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966156.967406s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966233.310488s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966233.522324s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966241.284523s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966241.475381s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966301.688497s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966303.427685s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966392.875983s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966393.38718s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966404.708568s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966406.441164s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966553.557387s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966555.752786s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966653.725847s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966654.23288s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966695.201885s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966695.689398s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966784.556877s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966786.574886s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966791.446852s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966793.218318s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966884.335685s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966886.147083s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967054.857465s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967055.158871s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967190.980027s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967193.176584s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967328.93796s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967330.428095s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967526.127311s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967526.588491s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967627.132549s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967627.685201s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967686.283694s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967686.728086s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967768.270887s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967768.58402s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967769.245615s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967771.122238s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967813.8197s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967814.168477s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967915.243469s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967917.020051s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968031.757775s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968032.190452s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968035.733635s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968036.03299s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968144.555556s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968144.714535s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968150.090148s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968150.820567s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968304.393177s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968304.613624s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968604.499519s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968604.813256s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968702.566939s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968704.427767s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968725.375289s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968725.939271s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968798.402904s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968798.659754s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969055.285004s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969055.715448s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969159.885115s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969162.382266s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969184.633052s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969185.413769s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969374.791849s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969377.497842s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969475.469111s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969489.697737s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969492.087023s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969492.58214s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969784.725195s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969786.49773s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969814.984624s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969815.397676s 0 391b0557-dc68-4e40-b6d0-da3033588753 +391b0557-dc68-4e40-b6d0-da3033588753 client timestamp=1384528843.958836s +391b0557-dc68-4e40-b6d0-da3033588753 username@big:~/datadir/Annex timestamp=1384521164.194035s +668ef9d8-68c6-484e-89e5-06634d590a11 cipher=dFpZLzI4M3ZqVUl1S0p3ajl5N25vUUJyTFJXand5T2pNSGliOGo5WXBkN2NNY3ZqR3pvNmN0L2tLOFFKZW1aWDdHYUpCMGF1UGxybk9zeUdQOEpsMGZ5RzgwTVo1S2N6Rlo1eTVnNXFGYjJmblV0bzRjT3lTb29uZnY1QmpwMVVwYlZEOGVlaVlNR0R5dTcxNW50TFcrU1dSVi9PUXk5RkR6Zm14UFJzZEEvOHB5MTZXbkp5TW13Qm5UZ2FkUEsrUTdVZ2cxVWZnai9mbGRDYWVXYlpDVzFQL2tzanNTMU16aGxuVktETXpOY04vR1lSZnEzNVdJSkpDUEtMV1pPWXczVUVNTEJCNGtmUldiTVZoWWdlYm9NTTN4T2c1RXRvTXEzTytXazNaaFNKeUtsSlNmOUFXdTIrYnZLbkgvSFljSFVPOVlid0lCSHFlSDk0ZVQ3M3E4eHR6ckM1SjdIbjF0dmRSTGVibFFSdzUrdnVMM3p6UDl5R0JOUWNhL3Q4MXVVVGF0RjFjNGoyditZUGRzOUEraHZ5Z29hNkk0SDNiaVdYVnJFQmxTRTdTd3hOcjR3amJzRkd3d1VEUXFFZDhLNTBhWGF6bUY5LzZCZ2F5U1lOZEFDdXdSU2pMOU9qVGJWM29wVGNhNEt1Z09jU1JXRnQ0QUhoZXMxZlpvN1Qzc1o4WTQ3S1dUNVdJM3FjK05aQm5kUk10Nm8zSG1Ccys3cFdDUWVaUGJCbUhwK2ozdGw0cmxhK3FydkF5b3ZOM0xmbEJKdVBpTHNxd3JSUEpXdndkSENzQjlteHovZW9JOUtWUGJKNGxoRExSRVloNDUrNFZ6YmFZQVNZdkcxV2JxSzZTc2ZING90cmRBREZtTFRlRnc3OW92ZXBxQ0pPa21UMFFuR0ZJNG89Cg== encryption=shared name=rsync.net_datadir_annex rsyncurl=rsusername@git-annex-ch-s011.rsync.net-rsusername_datadir_annex.2F:datadir_annex/ type=rsync timestamp=1384948273.302009s +668ef9d8-68c6-484e-89e5-06634d590a11 cipher=dFpZLzI4M3ZqVUl1S0p3ajl5N25vUUJyTFJXand5T2pNSGliOGo5WXBkN2NNY3ZqR3pvNmN0L2tLOFFKZW1aWDdHYUpCMGF1UGxybk9zeUdQOEpsMGZ5RzgwTVo1S2N6Rlo1eTVnNXFGYjJmblV0bzRjT3lTb29uZnY1QmpwMVVwYlZEOGVlaVlNR0R5dTcxNW50TFcrU1dSVi9PUXk5RkR6Zm14UFJzZEEvOHB5MTZXbkp5TW13Qm5UZ2FkUEsrUTdVZ2cxVWZnai9mbGRDYWVXYlpDVzFQL2tzanNTMU16aGxuVktETXpOY04vR1lSZnEzNVdJSkpDUEtMV1pPWXczVUVNTEJCNGtmUldiTVZoWWdlYm9NTTN4T2c1RXRvTXEzTytXazNaaFNKeUtsSlNmOUFXdTIrYnZLbkgvSFljSFVPOVlid0lCSHFlSDk0ZVQ3M3E4eHR6ckM1SjdIbjF0dmRSTGVibFFSdzUrdnVMM3p6UDl5R0JOUWNhL3Q4MXVVVGF0RjFjNGoyditZUGRzOUEraHZ5Z29hNkk0SDNiaVdYVnJFQmxTRTdTd3hOcjR3amJzRkd3d1VEUXFFZDhLNTBhWGF6bUY5LzZCZ2F5U1lOZEFDdXdSU2pMOU9qVGJWM29wVGNhNEt1Z09jU1JXRnQ0QUhoZXMxZlpvN1Qzc1o4WTQ3S1dUNVdJM3FjK05aQm5kUk10Nm8zSG1Ccys3cFdDUWVaUGJCbUhwK2ozdGw0cmxhK3FydkF5b3ZOM0xmbEJKdVBpTHNxd3JSUEpXdndkSENzQjlteHovZW9JOUtWUGJKNGxoRExSRVloNDUrNFZ6YmFZQVNZdkcxV2JxSzZTc2ZING90cmRBREZtTFRlRnc3OW92ZXBxQ0pPa21UMFFuR0ZJNG89Cg== encryption=shared name=rsync.net_datadir_annex rsyncurl=rsusername@git-annex-ch-s011.rsync.net-rsusername_datadir_annex:datadir_annex/ type=rsync timestamp=1384547300.727425s +668ef9d8-68c6-484e-89e5-06634d590a11 rsync.net_datadir_annex timestamp=1384547300.725734s +668ef9d8-68c6-484e-89e5-06634d590a11 rsync.net_datadir_annex timestamp=1384948273.280063s +668ef9d8-68c6-484e-89e5-06634d590a11 transfer timestamp=1384948273.352386s +b0d3c000-0ac9-4a05-aef4-47f826d5c759 client timestamp=1384575989.965159s +b0d3c000-0ac9-4a05-aef4-47f826d5c759 username@mezzo:~/datadir/Annex timestamp=1384547220.353298s + +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment new file mode 100644 index 000000000..2d31d1a7a --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-11-22T17:47:30Z" + content=""" +Any chance I could get a copy of this git repository? (Excluding the .git/annex part) + +Feel free to email me id@joeyh.name to arrange a secure transfer. + +Otherwise, I need to see what the git-annex:uuid.log file looked like before this happened to it. The corruption may have occurred progressively in several commits, or all at once. + +You might also still have some logs in `.git/annex/daemon.log*`, and sending those might help, assuming the strange messages you mentioned are logged in there. + +> 1384785215.389096s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + +This is pretty weird thing to be in the uuid.log. The \"1\" makes me think this might be a scrambled version of what's normally stored in the trust.log: + +> 511f4722-63d5-11e1-8b26-1bb951ea9f7b 1 timestamp=1330630786.417597s + +This seems to be the same bug as [[bugs/non-repos in repositories list (+ other weird output) from git annex status]] +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment new file mode 100644 index 000000000..dd037bcc0 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 4" + date="2013-11-22T17:48:37Z" + content=""" +What hardware are you running git-annex on? +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment new file mode 100644 index 000000000..de9d4fd71 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 5" + date="2013-11-22T18:22:55Z" + content=""" +One client is a thinkpad 121e, the other one a hp Z420 workstation. The archive is a basic Dell desktop. All of them run wheezy with git-annex and git from official backports. The transfer repository is at rsync.net. + +The daemon.log file was empty at the time I noticed the situation. Now git-annex has been scanning this repository for some time and the log has information again but it looks a bit too long to be posted here. I will email about the repository copy and the log. + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment new file mode 100644 index 000000000..8b5c80f6b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 6" + date="2013-11-22T19:29:08Z" + content=""" +Some additional information (useful at least from user's point of view): the data that was in the annex but outside of the archive is still accessible from both clients. Part of the data that was in the archive does not seem to be accessible on one client: ```git annex get``` says it gets data in an amount which seems correct but the link to the data remains broken. Fortunately I can still access the data on the other client. Some of the data in the archive is still accessible in both clients. The part that is still accessible was put in the annex a few days ago, only the last directory which was added and seems to have triggered the problem is \"broken\" on one client. It is possible (not sure, sorry) that this directory was first added in the annex, and then moved to the archive shortly after, before the first addition had propagated to the other client. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment new file mode 100644 index 000000000..00abc500b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 7" + date="2013-11-23T13:16:10Z" + content=""" +OK, sorry but it will be difficult to provide you with a copy of this repository. I hope I can still help in spite of being only a very novice git user. I checked that the git-annex:uuid.log file at the first commit was identical to the one above. The only difference is that in this first commit file there is a mention at the bottom of who created the file (me@somedomain.com) with the mention \"created repository\". + +So it is very possible that these nonexisting remotes are present since day 1. It is possible that I did not notice it earlier (I am not sure I had ever run git annex status in this repository since I am looking for a dropbox-like experience). What triggered my curiosity was the difficulty I had to get some data. At that point it might be that there are two independent problems. One with these nonexisting repositories, and another one with the fact that I cannot get some data in this client. + +Would it be useful to you to have the full history (52 revisions) of the git-annex:uuid.log file? +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment new file mode 100644 index 000000000..d50964f64 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 8" + date="2013-11-26T16:34:13Z" + content=""" +Yes, it would be helpful to have the full history of the file. + +You might try running `git annex fsck` on the file in the client that it says it has gotten but that you cannot access. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment new file mode 100644 index 000000000..863c5b53d --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 9" + date="2013-12-02T20:49:14Z" + content=""" +I had already tried ```git annex fsck``` and for all files the command returned ```ok```. Nevertheless, it was still not possible to get the data. Now after a few days it seems I can get all the data I tried from both clients. Maybe because the repository contains many files (about 1.5e6) the daily sanity check spawns git processes which do not seem to terminate even when the delay has expired but other than that the repository does not seem to be in a bad state, the only weirdness being the 155 nonrepositories in the status. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn new file mode 100644 index 000000000..954d26ec2 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn @@ -0,0 +1,520 @@ +I have a git annex assistant process using 1.2 gigabytes of RAM and a git cat-file --batch child consuming CPU time constantly. I am running 5.20140320 on Ubuntu 12.04. + +[[!format sh """ + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +11775 ion 20 0 1350m 1.2g 12m S 48 62.4 425:56.85 git-annex +11787 ion 20 0 9856 1484 1232 R 54 0.1 366:16.14 git +"""]] + +The assistant UI looks perfectly normal and does not indicate it is doing anything. daemon.log is empty and the assistant process seems to be logging into a rotated and deleted log file. + +[[!format sh """ +COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME +git-annex 11775 ion 1w REG 9,127 80841 55181369 /storage/ion/media/video/.git/annex/daemon.log.10 (deleted) +git-annex 11775 ion 2w REG 9,127 80841 55181369 /storage/ion/media/video/.git/annex/daemon.log.10 (deleted) +"""]] + +strace -s10000 -e trace=read,write -p 11787 indicates that the assistant is having the cat-file process cat same objects over and over again. + +[[!format sh """ +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment new file mode 100644 index 000000000..d5f7ce363 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_10_edb2428552cf98bfb1735c2d6daf2b20._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 10" + date="2014-05-01T01:33:10Z" + content=""" +Note to self: I experienced this bug with the standalone tarball release (5.20140421) as well, so it’s not caused by something that is different on my system wrt. git-annex’s dependencies etc. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment new file mode 100644 index 000000000..e9c5d3fff --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T18:48:51Z" + content=""" +All I can tell from the strace is that it's looking at location logs, and it's looking at the same few keys, but not a single on in a tight loop. + +It would probably help a lot to run the assistant with --debug and get a debug log while this is going on. We need to pinpoint the part of the assistant that is affected, and there may be other activity too. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_2_b2941bf7901a1b2237b7210c8f0af2a5._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_2_b2941bf7901a1b2237b7210c8f0af2a5._comment new file mode 100644 index 000000000..c9e798c28 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_2_b2941bf7901a1b2237b7210c8f0af2a5._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 2" + date="2014-04-07T21:07:35Z" + content=""" +Except of log when this apparently happened. Note the 6 minute time discontinuity when it was apparently looping: + +
+[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"write-tree\"]
+[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"rev-parse\",\"84068090af4bcd3d24f16d865ac07b0478f20ada:\"]
+[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"symbolic-ref\",\"HEAD\"]
+[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"refs/heads/master\"]
+[2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"]
+[2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..214ed317536695b91c8dd5bed059c46c11ad00be\",\"--oneline\",\"-n1\"]
+
+ +Also probably relevant, the network topology AIUI was: `client --> server` where both nodes ran the assistant. This happened on the server shortly after the client dropped off a refs/heads/synced/master. + +(Also, the \"logging to a deleted file\" appears to have been a local misconfiguration; a cron job that repeatedly tried to start the assistant. Only one will start, but later ones will rotate the logs before noticing it's running and giving up.) +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_3_1429ca784a03bc424b3537cbe0449421._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_3_1429ca784a03bc424b3537cbe0449421._comment new file mode 100644 index 000000000..fd9fa8971 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_3_1429ca784a03bc424b3537cbe0449421._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 3" + date="2014-04-07T21:55:19Z" + content=""" +Unfortunately all I have been able to tell for sure from this log is that it seems that the expensive transfer scan is not running, and this is unlikely to be a repository auto-repair. + +My best guess as to what might be going on is an update of the git-annex branch. + +[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"write-tree\"] + +This is prep for an index file commit, probably to the git-annex branch. + +[2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"rev-parse\",\"84068090af4bcd3d24f16d865ac07b0478f20ada:\"] + +This is a getting the parent commit's tree. + +The git-cat-file churn could then be a union merge reading the contents of the git-annex branch to union-merge it into the `.git/annex/index` (in `mergeIndex`). This would reuse the main git cat-file process. + +That does not explain why it would need to read eg, SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log 28 times. +Normally, during a union merge only files listed by `diff-index` need to be read, and it lists each file only once. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_4_f9e65cf5598b4b14eeee1f41f46d4084._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_4_f9e65cf5598b4b14eeee1f41f46d4084._comment new file mode 100644 index 000000000..148920c23 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_4_f9e65cf5598b4b14eeee1f41f46d4084._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 4" + date="2014-04-07T21:57:32Z" + content=""" +Does `git log git-annex` show a commit that was made at 23:30? + +Does it show a commit 84068090af4bcd3d24f16d865ac07b0478f20ada? + +Is 84068090af4bcd3d24f16d865ac07b0478f20ada the parent of the 23:30 commit? +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_5_044ecac2d2e670e1ef69809c944093d1._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_5_044ecac2d2e670e1ef69809c944093d1._comment new file mode 100644 index 000000000..601365004 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_5_044ecac2d2e670e1ef69809c944093d1._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 5" + date="2014-04-07T22:12:14Z" + content=""" +Is the repository using direct mode? + +Another theory is that: + +* test/hello appears +* watcher sees new symlink, tries to make a commit with it +* master branch already has that symlink +* this is why the write-tree is not followed by a commit-tree. The commit would have been empty. + +If this is the case, then 84068090af4bcd3d24f16d865ac07b0478f20ada will be a ref on the master branch. + +And all of the above is normal operation. But it does suggest, that if this repo is in direct mode, it might be running a direct mode work tree update around then. Which requires a lot of cat-file queries of the git-annex branch. And would certainly make repeated queries at least if the repository has duplicate copies of some files.. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_6_6f4f51e1583bed5e7e601e4f30f4207b._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_6_6f4f51e1583bed5e7e601e4f30f4207b._comment new file mode 100644 index 000000000..0b5f90489 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_6_6f4f51e1583bed5e7e601e4f30f4207b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 6" + date="2014-04-07T22:17:16Z" + content=""" +Does the git log have any recent commits that were \"git-annex automatic merge conflict fix\" ? +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_7_683a0a3d4caea0ee625e41ae8a6c7c06._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_7_683a0a3d4caea0ee625e41ae8a6c7c06._comment new file mode 100644 index 000000000..1705e738c --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_7_683a0a3d4caea0ee625e41ae8a6c7c06._comment @@ -0,0 +1,81 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 7" + date="2014-04-07T22:44:33Z" + content=""" +In the git-annex branch, there is + +* [[!toggle id=\"4deec8203e0baf7bb5b7d5d868d82439261ab3bc\" text=\"a commit at 23:21:51\"]] from my desktop box where I added `test/hello` + +[[!toggleable id=\"4deec8203e0baf7bb5b7d5d868d82439261ab3bc\" text=\"\"\" + commit 4deec8203e0baf7bb5b7d5d868d82439261ab3bc + Author: Johan Kiviniemi + Date: Mon Apr 7 23:21:51 2014 +0300 + + update + + diff --git a/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03.log b/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03.log + new file mode 100644 + index 0000000..1cf060c + --- /dev/null + +++ b/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03.log + @@ -0,0 +1 @@ + +1396902111.893785s 1 86e07a59-8bba-4878-8d0b-5dfe8c6366c4 +\"\"\"]] + +* [[!toggle id=\"2e0884d9c8859339855ceee396b9ea9ae05865b4\" text=\"a commit at 23:21:54\"]] when the desktop box synced to the server (from which the log excerpt came) + +[[!toggleable id=\"2e0884d9c8859339855ceee396b9ea9ae05865b4\" text=\"\"\" + commit 2e0884d9c8859339855ceee396b9ea9ae05865b4 + Author: Johan Kiviniemi + Date: Mon Apr 7 23:21:54 2014 +0300 + + update + + diff --git a/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e84 + 6f6be03.log b/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e8 + 46f6be03.log + index 1cf060c..cd0bccc 100644 + --- a/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 + .log + +++ b/992/280/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 + .log + @@ -1 +1,2 @@ + +1396902112.657779s 1 09ada430-8802-47da-bbfa-f5256a3c55d2 + 1396902111.893785s 1 86e07a59-8bba-4878-8d0b-5dfe8c6366c4 +\"\"\"]] + +* [[!toggle id=\"214ed317536695b91c8dd5bed059c46c11ad00be\" text=\"a commit at 23:24:24\"]] (2.5 minutes later!) when the assistant on the server finally merged `synced/git-annex` into `git-annex` (`test/hello` became visible in the working tree at that time). + +[[!toggleable id=\"214ed317536695b91c8dd5bed059c46c11ad00be\" text=\"\"\" + commit 214ed317536695b91c8dd5bed059c46c11ad00be + Merge: 4deec82 2e0884d + Author: sarjat + Date: Mon Apr 7 23:24:24 2014 +0300 + + merging synced/git-annex into git-annex +\"\"\"]] + +There is no commit in the `git-annex` branch at 23:30. The next commit is from unrelated changes at 00:06. + +[[!toggle id=\"84068090af4bcd3d24f16d865ac07b0478f20ada\" text=\"84068090af4bcd3d24f16d865ac07b0478f20ada\"]] is the commit in `master` which added `test/hello` at 23:21:51. + +[[!toggleable id=\"84068090af4bcd3d24f16d865ac07b0478f20ada\" text=\"\"\" + commit 84068090af4bcd3d24f16d865ac07b0478f20ada + Author: Johan Kiviniemi + Date: Mon Apr 7 23:21:51 2014 +0300 + + diff --git a/test/hello b/test/hello + new file mode 120000 + index 0000000..8c2678f + --- /dev/null + +++ b/test/hello + @@ -0,0 +1 @@ + +../.git/annex/objects/zK/02/SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08 + \ No newline at end of file +\"\"\"]] + +The repository on the server is in indirect mode. + +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_8_03dd76b01f46a7cc66eddac3e054c8ad._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_8_03dd76b01f46a7cc66eddac3e054c8ad._comment new file mode 100644 index 000000000..d6aa43da0 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_8_03dd76b01f46a7cc66eddac3e054c8ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 8" + date="2014-04-07T22:48:18Z" + content=""" +There are no commits in `master` or `git-annex` that have the word conflict in the description. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_9_5f4444f03cbebaa44628288095383679._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_9_5f4444f03cbebaa44628288095383679._comment new file mode 100644 index 000000000..09383141e --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_9_5f4444f03cbebaa44628288095383679._comment @@ -0,0 +1,89 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 9" + date="2014-04-07T22:55:12Z" + content=""" +[[!toggle id=\"excerpt\" text=\"The full log excerpt\"]] which includes the sync from the client and the final messages after the cat-file loop ended and things stabilized (but a memory leak of 30 MB in the git-annex assistant process remained). + +[[!toggleable id=\"excerpt\" text=\"\"\" + [2014-04-04 10:55:00 EEST] main: starting assistant version 5.20140402 + + + + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"] + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..20d1f5538f6aa430f29ef938f6db045f5a69425d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..b402a6e7b9268e25dbd9c6a027f4a5258993980d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..7b18a191d58d779aab5789b923adb09863938ffe\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + [2014-04-07 23:21:52 EEST] TransferWatcher: transfer starting: Download UUID \"86e07a59-8bba-4878-8d0b-5dfe8c6366c4\" SHA256E-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 Nothing + [2014-04-07 23:21:52 EEST] read: git [\"config\",\"--null\",\"--list\"] + [2014-04-07 23:21:52 EEST] TransferWatcher: transfer starting: Download UUID \"86e07a59-8bba-4878-8d0b-5dfe8c6366c4\" test/hello Nothing + [2014-04-07 23:21:52 EEST] read: git [\"config\",\"--null\",\"--list\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..20d1f5538f6aa430f29ef938f6db045f5a69425d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..4deec8203e0baf7bb5b7d5d868d82439261ab3bc\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..b402a6e7b9268e25dbd9c6a027f4a5258993980d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..7b18a191d58d779aab5789b923adb09863938ffe\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:52 EEST] feed: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-index\",\"-z\",\"--index-info\"] + [2014-04-07 23:21:52 EEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID \"86e07a59-8bba-4878-8d0b-5dfe8c6366c4\", transferKey = Key {keyName = \"5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03\", keyBackendName = \"SHA256E\", keySize = Just 6, keyMtime = Nothing}} + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"4deec8203e0baf7bb5b7d5d868d82439261ab3bc\"] + [2014-04-07 23:21:52 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"4deec8203e0baf7bb5b7d5d868d82439261ab3bc..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + [2014-04-07 23:21:52 EEST] call: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-ref\",\"refs/heads/git-annex\",\"4deec8203e0baf7bb5b7d5d868d82439261ab3bc\"] + [2014-04-07 23:22:08 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"symbolic-ref\",\"HEAD\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"refs/heads/master\"] + [2014-04-07 23:24:24 EEST] Merger: merging refs/heads/synced/master into refs/heads/master + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2014-04-07 23:24:24 EEST] call: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"merge\",\"--no-edit\",\"refs/heads/synced/master\"] + Updating 645e474..8406809 + Fast-forward + test/hello | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 test/hello + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..4deec8203e0baf7bb5b7d5d868d82439261ab3bc\",\"--oneline\",\"-n1\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..2e0884d9c8859339855ceee396b9ea9ae05865b4\",\"--oneline\",\"-n1\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..b402a6e7b9268e25dbd9c6a027f4a5258993980d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..7b18a191d58d779aab5789b923adb09863938ffe\",\"--oneline\",\"-n1\"] + [2014-04-07 23:24:24 EEST] chat: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] + [2014-04-07 23:24:24 EEST] feed: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-index\",\"-z\",\"--index-info\"] + [2014-04-07 23:24:24 EEST] feed: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-index\",\"-z\",\"--index-info\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"2e0884d9c8859339855ceee396b9ea9ae05865b4\"] + [2014-04-07 23:24:24 EEST] chat: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] + [2014-04-07 23:24:24 EEST] feed: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-index\",\"-z\",\"--index-info\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"write-tree\"] + [2014-04-07 23:24:24 EEST] chat: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"commit-tree\",\"0bd4352b4008165d356bc9b1250bdb456c675175\",\"-p\",\"refs/heads/git-annex\",\"-p\",\"2e0884d9c8859339855ceee396b9ea9ae05865b4\"] + [2014-04-07 23:24:24 EEST] call: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-ref\",\"refs/heads/git-annex\",\"214ed317536695b91c8dd5bed059c46c11ad00be\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + [2014-04-07 23:24:24 EEST] Watcher: add symlink test/hello + [2014-04-07 23:24:24 EEST] chat: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] + [2014-04-07 23:24:24 EEST] Committer: committing 1 changes + [2014-04-07 23:24:24 EEST] Committer: Committing changes to git + [2014-04-07 23:24:24 EEST] feed: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"update-index\",\"-z\",\"--index-info\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"symbolic-ref\",\"HEAD\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"write-tree\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"rev-parse\",\"84068090af4bcd3d24f16d865ac07b0478f20ada:\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"symbolic-ref\",\"HEAD\"] + [2014-04-07 23:24:24 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"refs/heads/master\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..214ed317536695b91c8dd5bed059c46c11ad00be\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..2e0884d9c8859339855ceee396b9ea9ae05865b4\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..b402a6e7b9268e25dbd9c6a027f4a5258993980d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..7b18a191d58d779aab5789b923adb09863938ffe\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"git-annex\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..214ed317536695b91c8dd5bed059c46c11ad00be\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..2e0884d9c8859339855ceee396b9ea9ae05865b4\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..b402a6e7b9268e25dbd9c6a027f4a5258993980d\",\"--oneline\",\"-n1\"] + [2014-04-07 23:30:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"log\",\"refs/heads/git-annex..7b18a191d58d779aab5789b923adb09863938ffe\",\"--oneline\",\"-n1\"] + [2014-04-07 23:31:13 EEST] read: git [\"--git-dir=/storage/sarjat/annex-sarjat/.git\",\"--work-tree=/storage/sarjat/annex-sarjat\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_merge_loop.mdwn b/doc/bugs/Assistant_merge_loop.mdwn new file mode 100644 index 000000000..edff5e4b3 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop.mdwn @@ -0,0 +1,19 @@ +The assistant appears to be in a merge loop with at least two of my repos. It's creating thousands of merge commits without any changes. One repository that contains around 600 files that change very very rarely now has 63528 commits. + +Here's a screenshot from tig: [[https://ssl.zerodogg.org/~zerodogg/private/tmp/Skjermdump_fra_2014-07-05_07:09:22-2014-07-05.png]] + +I can privately provide a copy of the git repo itself if needed. + +Using the standalone build, 64bit, on ArchLinux, Fedora 20 and Ubuntu 14.04. + + $ git annex version + git-annex version: 5.20140610-g5ec8bcf + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +> [[fixed|done]]. Note that 5.20140708 contained an incomplete fix for this +> bug. --[[Joey]] diff --git a/doc/bugs/Assistant_merge_loop/comment_10_8fe176691f0f61c15085d3c38f0ea50f._comment b/doc/bugs/Assistant_merge_loop/comment_10_8fe176691f0f61c15085d3c38f0ea50f._comment new file mode 100644 index 000000000..1826e313a --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_10_8fe176691f0f61c15085d3c38f0ea50f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 10" + date="2014-07-16T20:32:57Z" + content=""" +I have two computers with Debian testing (5.20140529) that aren't having the issue, and one with Debian Sid (5.20140709) that is still creating the empty merge commits +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_11_6e3a78327c0b813415ebf85e298813d4._comment b/doc/bugs/Assistant_merge_loop/comment_11_6e3a78327c0b813415ebf85e298813d4._comment new file mode 100644 index 000000000..7823176ef --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_11_6e3a78327c0b813415ebf85e298813d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 11" + date="2014-07-16T20:36:32Z" + content=""" +Has the assistant been restarted since git-annex was upgraded to the fixed version? + +Can you post a debug.log? +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_1_ccf46511b924f86b488dba25060baa06._comment b/doc/bugs/Assistant_merge_loop/comment_1_ccf46511b924f86b488dba25060baa06._comment new file mode 100644 index 000000000..c5f9c2187 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_1_ccf46511b924f86b488dba25060baa06._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-05T20:34:39Z" + content=""" +I am seeing some evidence of this in my own family's repo, where one node updated to 5.20140613 and started making series of empty commits with message \"merge refs/heads/synced/master\" and only 1 parent (so not really a merge). + +Quite likely [[!commit d6711800ad261fb4c37fc361bc84918d1e296bc4]] is at fault. Probably the fastForwardable check isn't quite right. + +This should only affect direct mode repositories. When only one node has the problem, it won't be bad, but if multiple nodes are doing this, their repos never converge and keep growing. + +Hmm, I think I have partially reproduced it with 2 direct mode repos, each having the other as a remote. `git annex sync` repeatedly in each does not add unncessary commits, but running the assistant in each does. In this particular case, it manages to converge eventually after several commits. +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_2_afcbf3f8575e1a967c79693b94ef055c._comment b/doc/bugs/Assistant_merge_loop/comment_2_afcbf3f8575e1a967c79693b94ef055c._comment new file mode 100644 index 000000000..eb3deb2ee --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_2_afcbf3f8575e1a967c79693b94ef055c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-05T21:17:17Z" + content=""" +Well, it looks like this is as simple as the assistant trying to merge refs/remotes/$foo/synced/master into the current branch, when that ref is behind or the same as the current branch. Nothing to merge, so it does some pointless work and then the fastForwardable check runs -- and that check looks for refs between the \"old\" and \"new\" refs. Since the \"new\" is behind the \"old\", there are no such commits, and the unnecessary empty commit results. + +The reason only the assistant is affected is because `git-annex sync` already checked Git.Branch.changed before trying to do any merging, which avoids the problem. + +Fix committed. +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_3_07341221b2839fdc1c43634e011451d2._comment b/doc/bugs/Assistant_merge_loop/comment_3_07341221b2839fdc1c43634e011451d2._comment new file mode 100644 index 000000000..1b6956483 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_3_07341221b2839fdc1c43634e011451d2._comment @@ -0,0 +1,62 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 3" + date="2014-07-08T08:13:40Z" + content=""" +I'm still seeing this problem in 5.20140707-g923b436 + + [0 zerodogg@firefly annexed]$ git annex version + git-annex version: 5.20140707-g923b436 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + [0 zerodogg@firefly annexed]$ git graph | head -n20 + * d4bf68f - (HEAD, annex/direct/master) merge refs/remotes/serenity/synced/master (3 minutes ago) + |\ + * | d03f280 - merge refs/remotes/browncoats/synced/master (3 minutes ago) + |/ + * e6863b8 - (serenity/synced/master, browncoats/synced/master) merge refs/remotes/serenity/synced/master (3 minutes ago) + |\ + * \ 616d985 - merge refs/remotes/browncoats/synced/master (3 minutes ago) + |\ \ + | |/ + * | 3b39706 - merge refs/remotes/serenity/synced/master (3 minutes ago) + |\ \ + | |/ + * | 6d354cc - merge refs/remotes/browncoats/synced/master (4 minutes ago) + |\ \ + | |/ + * | 710c3c1 - merge refs/remotes/serenity/synced/master (4 minutes ago) + |\ \ + | |/ + * | 763930f - merge refs/remotes/browncoats/synced/master (4 minutes ago) + |/ + [0 zerodogg@firefly annexed]$ git annex assistant --stop + [0 zerodogg@firefly annexed]$ git annex assistant + [0 zerodogg@firefly annexed]$ git graph | head -n20 + * 947f1a2 - (HEAD, annex/direct/master) merge refs/remotes/serenity/synced/master (15 seconds ago) + |\ + * | 19c6043 - merge refs/remotes/browncoats/synced/master (18 seconds ago) + |/ + * b453741 - (serenity/synced/master, browncoats/synced/master) merge refs/remotes/serenity/synced/master (18 seconds ago) + |\ + * \ 6baaebd - merge refs/remotes/browncoats/synced/master (18 seconds ago) + |\ \ + | |/ + * | 03e4fa2 - merge refs/remotes/serenity/synced/master (24 seconds ago) + |\ \ + | |/ + * | 33302d8 - merge refs/remotes/browncoats/synced/master (24 seconds ago) + |\ \ + | |/ + * | d4bf68f - merge refs/remotes/serenity/synced/master (4 minutes ago) + |\ \ + | |/ + * | d03f280 - merge refs/remotes/browncoats/synced/master (4 minutes ago) + |/ + [0 zerodogg@firefly annexed]$ +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_4_7ae215b478843d2a8c705cac385fcf22._comment b/doc/bugs/Assistant_merge_loop/comment_4_7ae215b478843d2a8c705cac385fcf22._comment new file mode 100644 index 000000000..32468557b --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_4_7ae215b478843d2a8c705cac385fcf22._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 4" + date="2014-07-09T00:24:36Z" + content=""" +As far as I can see in my repo, the empty merges started on 2014-05-27, but then appear to resolve themselves after 40-50 commits on that day. They reappear again on 2014-06-03, and appears to have kept going daily ever since. +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_5_11873461f093a266f0bb7e129bc21cde._comment b/doc/bugs/Assistant_merge_loop/comment_5_11873461f093a266f0bb7e129bc21cde._comment new file mode 100644 index 000000000..188317bb8 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_5_11873461f093a266f0bb7e129bc21cde._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 5" + date="2014-07-09T19:00:35Z" + content=""" +I have confirmed this is still happening, though I had certianly thought I had reproduced and fixed it. +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_6_e7b6ecdd7e2b0222ea0baa0ed770e66d._comment b/doc/bugs/Assistant_merge_loop/comment_6_e7b6ecdd7e2b0222ea0baa0ed770e66d._comment new file mode 100644 index 000000000..e408643ca --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_6_e7b6ecdd7e2b0222ea0baa0ed770e66d._comment @@ -0,0 +1,80 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmN5jDf53oRJZsTo8Ahj2uXzCzq6HcvEro" + nickname="Gregory" + subject="confirmed?" + date="2014-07-15T01:29:00Z" + content=""" +I seem to be getting this behavior, in tandem with the [bad merge commit deleting all files](http://git-annex.branchable.com/bugs/bad_merge_commit_deleting_all_files/) on + + git-annex version: 5.20140709-gf15d2aa + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: unknown + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +Here is my log over the past couple weeks when I basically made no changes to the filesystem. + +git log --oneline --decorate --color --graph + +
+* b304ad7 (HEAD, origin/synced/master, origin/master, origin/HEAD, master) 
+* 568cf6c merge refs/remotes/diskb/synced/master
+* 5e426d0 merge refs/remotes/diskb/synced/master
+* b2fa076 merge refs/remotes/diskb/synced/master
+*   b66a37d merge refs/remotes/diskb/synced/master
+|\  
+* | 910cba5 merge refs/remotes/diskb/synced/master
+|/  
+* 60736c3 merge refs/remotes/diskb/synced/master
+*   a957439 merge refs/remotes/diskb/synced/master
+|\  
+* \   5c135c0 merge refs/remotes/diskb/synced/master
+|\ \  
+| |/  
+* |   52d8b66 merge refs/heads/synced/master
+|\ \  
+* | | d77f3a2 merge refs/remotes/diskb/synced/master
+| |/  
+|/|   
+* |   03bb56a merge refs/remotes/diskb/synced/master
+|\ \  
+* \ \   bb000db merge refs/heads/synced/master
+|\ \ \  
+| |/ /  
+|/| /   
+| |/    
+* | 3bc8520 merge refs/heads/synced/master
+|/  
+* 1c3ee7e 
+*   d3b096a merge refs/remotes/diskb/synced/master
+|\  
+* \   0fa0f6d merge refs/heads/synced/master
+|\ \  
+| |/  
+* |   173592c merge refs/remotes/diskb/synced/master
+|\ \  
+| |/  
+* |   3dd8086 merge refs/remotes/diskb/synced/master
+|\ \  
+| |/  
+* |   68be2a1 merge refs/heads/synced/master
+|\ \  
+| |/  
+* |   bb304f4 merge refs/remotes/diskb/synced/master
+|\ \  
+| |/  
+|/|   
+* | 1c9a2cd 
+* | 298b362 merge refs/heads/synced/master
+|/  
+*   4c23257 merge refs/remotes/diskb/synced/master
+|\  
+* | b709997 merge refs/remotes/diskb/synced/master
+|/  
+*   215f061 merge refs/remotes/diskb/synced/master
+|\  
+* \   e0f75b4 merge refs/heads/synced/master
+
+"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_7_7717d074611943b831f00ad10918b515._comment b/doc/bugs/Assistant_merge_loop/comment_7_7717d074611943b831f00ad10918b515._comment new file mode 100644 index 000000000..9c70f2646 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_7_7717d074611943b831f00ad10918b515._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 7" + date="2014-07-15T19:15:13Z" + content=""" +This bug and the other one are fixed in 5.20140709. I assume that your `git log` dates from an earlier version. +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_8_5ce91ac76498539ada344d1639984302._comment b/doc/bugs/Assistant_merge_loop/comment_8_5ce91ac76498539ada344d1639984302._comment new file mode 100644 index 000000000..c12c84264 --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_8_5ce91ac76498539ada344d1639984302._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 8" + date="2014-07-16T13:42:16Z" + content=""" +I'm still having this issue in 5.20140709 +"""]] diff --git a/doc/bugs/Assistant_merge_loop/comment_9_b09a5eaa2588559e19b3549bd3c8b496._comment b/doc/bugs/Assistant_merge_loop/comment_9_b09a5eaa2588559e19b3549bd3c8b496._comment new file mode 100644 index 000000000..b6bfc68eb --- /dev/null +++ b/doc/bugs/Assistant_merge_loop/comment_9_b09a5eaa2588559e19b3549bd3c8b496._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 9" + date="2014-07-16T18:08:26Z" + content=""" +Are you sure that you have upgraded git-annex on every machine that uses that repository? You could have one old un-upgraded one still causing commits that would of course be visible on the rest. + +Also, what version exactly does `git-annex version` show? +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn new file mode 100644 index 000000000..6c1420e54 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. + +The assistant regulary ends up trying to perform repair (I don't know why, it happens fairly often, once a week or so). When it does so, it ends up creating a huge (2.4G) .git/objects directory, and a git prune-packed process uses so much I/O the machine really slows down. + +### What steps will reproduce the problem? + +I don't have any reliable way to reproduce it. The repository ends up being attempted to be repaired around once a week. This week the repair (and the slowdown) also happened on a second computer. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140221-gbdfc8e1 (using the standalone 64bit builds) + +This is on an up-to-date Arch Linux. It also happened on Fedora 20. + +### Please provide any additional information below. + +The daemon.log is fairly long, but not particulary interesting: [[https://ssl.zerodogg.org/~zerodogg/private/tmp/daemon.log-2014-02-25.1]] + +The «resource vanished (Broken pipe)» at the end is the result of me killing the prune-packed in order to be able to use the machine again. + +[[!tag moreinfo]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_10_d46c6314bff75a0ae679bc2358b28c2b._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_10_d46c6314bff75a0ae679bc2358b28c2b._comment new file mode 100644 index 000000000..5fb031e25 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_10_d46c6314bff75a0ae679bc2358b28c2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 10" + date="2014-06-07T05:47:25Z" + content=""" +Given that it's ususally the same repo, I'm going to try to create a completely fresh repository instead and see if the frequent auto-repairs are stopped by that. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_11_1c2c3adfbccd2b14a7d1c4618800e735._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_11_1c2c3adfbccd2b14a7d1c4618800e735._comment new file mode 100644 index 000000000..904ec92f5 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_11_1c2c3adfbccd2b14a7d1c4618800e735._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-06-10T19:31:38Z" + content=""" +Disable consistency checks for the repo in the webapp UI, wait until long enough that you're sure the assistant would be wanting to repair it again if you hadn't disabled that, and run `git annex repair` at the console so I can see what's going on. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment new file mode 100644 index 000000000..b50a0cfb8 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-02-26T17:38:05Z" + content=""" +Auto repair is not intended to be a common occurrance. It means something went badly, horribly wrong on your machine, and it lost data that git wrote to disk. It's more important in such a scenraio to get back to a working system eventually than to do something fast or inexpensively. + +If you're seeing the need for auto repair on a weekly basis, your computer is failing in a horrible way horribly frequently, and the thing to do is to find out why, and fix that. Perhaps you need to start cleanly shutting down the system. Perhaps something is causing your computer to crash, and you need to fix that. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment new file mode 100644 index 000000000..6cbd58f2f --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.213.223" + subject="comment 2" + date="2014-02-27T14:16:11Z" + content=""" +That's the thing. The drive is fine, I've fscked it, and the machine is always shut down cleanly (and it is very stable, can't remember the last time it crashed). So there's no reason why this should be happening, and since git-annex doesn't say anything about why it started the auto-repair, I'm unable to track it down further. + +It's also always this repository. I have several assistant managed repos on the same machine, and this is the only one that git-annex regulary starts repairing (and the only one that it has auto-repaired on another box as well). No files in the repository itself has ever been noticed as corrupt, nor has there been any indications anywhere else about problems, hardware or filesystem (nothing wrong in the 40 or so git repos on the machine, no problems with software installed on the drive, never seen anything in dmesg). + +It's happening often enough for me to have to consider dropping use of the assistant. It could still be a problem with the machine (though it seems unlikely, given that it's consistently the same repo, and that it has done it with the same repo on other machines), but git-annex doesn't provide any information about it. + +Could you add some more information about what it thinks is wrong to the logging? + +Funnily enough, git-annex started repairing it again as I was writing this. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment new file mode 100644 index 000000000..edf7c781b --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 3" + date="2014-03-05T11:47:06Z" + content=""" +I observe something similar. Today git-annex started to repair a repository. CPU is at 100%, I can still work because I have a multikernel system, so I'll wait and see if it comes to an end. + +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment new file mode 100644 index 000000000..3a43c9260 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 4" + date="2014-03-06T06:21:59Z" + content=""" +Just for the records. I just shutdown the daemon because it ran all night long with 100%. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment new file mode 100644 index 000000000..4683165c3 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-06T18:14:37Z" + content=""" +auto-repair is only done if git fsck detects a problem. You can run git fsck yourself to see. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment new file mode 100644 index 000000000..05935b034 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 6" + date="2014-03-10T14:14:06Z" + content=""" +I manually ran git fsck without problems but git-annex still wants to repair something. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_7_4649fa11745ff668e43833209811d005._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_7_4649fa11745ff668e43833209811d005._comment new file mode 100644 index 000000000..58499da8b --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_7_4649fa11745ff668e43833209811d005._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 7" + date="2014-05-21T18:31:54Z" + content=""" +It seems to me that if you don't want to repair your repository, you can just go into the webapp and disable all scheduled consistency check jobs. + +If someone with this problem would like to run \"git annex repair\" at the console, and paste the output, perhaps I could then see why it thinks it needs to repair the repository. So far, I have nothing to go on, and no proof that this is a bug at all, and not just people with actually corrupted repositories that really do need to be repaired. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_8_6138a48f0b7e8be2bb66430397afdf5a._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_8_6138a48f0b7e8be2bb66430397afdf5a._comment new file mode 100644 index 000000000..33944ac27 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_8_6138a48f0b7e8be2bb66430397afdf5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 8" + date="2014-05-21T19:19:30Z" + content=""" +The trouble with providing more information (outside of the logfile above) is that by the time I realize that there is a problem it is because git-annex has started to repair. Perhaps an option that makes git-annex write a ~/.git/annex/repair-reason.log file with the reason (ie. git fsck output etc.) for starting the repair could help? +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_9_3da5940bb2e9689b00239eec9a073f1c._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_9_3da5940bb2e9689b00239eec9a073f1c._comment new file mode 100644 index 000000000..8bea236ed --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_9_3da5940bb2e9689b00239eec9a073f1c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 9" + date="2014-06-06T16:13:55Z" + content=""" +Any chance of any progress on this? Either a way to disable it, or some additional logging to track down the problem? git-annex is currently repairing one particular repository several times a month accross different machines, rendering git-annex practically unusable. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android.mdwn b/doc/bugs/Bootstrap3_icons_missing_on_Android.mdwn new file mode 100644 index 000000000..480825bc9 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android.mdwn @@ -0,0 +1,7 @@ +I’m running git-annex 5.20140517-gee56d21 on Android 4.3. + +A number of icons seem to be missing since the bootstrap3 update: + +git-annex missing icons + +[[!tag confirmed done]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_10_da4e26c77376a8171493a815bdb51ff1._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_10_da4e26c77376a8171493a815bdb51ff1._comment new file mode 100644 index 000000000..78732490f --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_10_da4e26c77376a8171493a815bdb51ff1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 10" + date="2014-05-28T15:03:26Z" + content=""" +Seems to work! The icons show up on android now. + +But JavaScript seems to be broken instead, dropdown menus don't work. Maybe more unwanted evil splicing in other files? +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_11_506e26de284a6429366def33b007bc0c._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_11_506e26de284a6429366def33b007bc0c._comment new file mode 100644 index 000000000..ba3fff801 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_11_506e26de284a6429366def33b007bc0c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 11" + date="2014-05-28T17:30:43Z" + content=""" +Ok it seems like the linebreak at the end of each javascript file (0x0a) is replaced by a null byte on android. This probably causes the browser not to accept it as javascript so it's not executed. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_12_a77477951576fc657d693811f11f9975._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_12_a77477951576fc657d693811f11f9975._comment new file mode 100644 index 000000000..23b523bbe --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_12_a77477951576fc657d693811f11f9975._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 12" + date="2014-05-28T22:31:21Z" + content=""" +The evilspliced data for eg, bootstrap.js omits that last byte. So presumably we overflow one byte and find a null (if we're lucky..). + +I checked the -ddump-splices output, and it omits that last newline! + +
+              \});\
+              \\
+              \})( jQuery );\"#),
+
+ +Indeed, ghc omits any number of trailing newlines in this display. + +This is probably only recently a problem because of the wacky use of a unsafe bytestring + length that file-embed has started to do. Before, the newline was not included, but that's still valid JS. + +So, one fix would be to have the EvilSplicer rewrite the unsafePackAddressLen back to a regular bytestring construction. But this would need some tricky parsing (need to find the end of the string to remove the # from it). Alternatively, could remove trailing newlines from all the static js and css files. (Luckily none of the other static files end in a newline, and ghc is careful to preserve ending NULs etc). + +For now, I've removed the trailing newlines from the files. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_13_c3ef67bded8ed3c511a8ea85b8bd81a5._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_13_c3ef67bded8ed3c511a8ea85b8bd81a5._comment new file mode 100644 index 000000000..dc8b24ba1 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_13_c3ef67bded8ed3c511a8ea85b8bd81a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 13" + date="2014-05-29T16:48:18Z" + content=""" +Works fine now (tested on android 4.4). +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_1_97cf233d8401d642337d5fe9dd525e2b._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_1_97cf233d8401d642337d5fe9dd525e2b._comment new file mode 100644 index 000000000..15b6018b5 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_1_97cf233d8401d642337d5fe9dd525e2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 1" + date="2014-05-21T17:10:24Z" + content=""" +reproduced this with android 4.0 +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_2_4981a0a894b77e94a3bffec82b0f6e51._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_2_4981a0a894b77e94a3bffec82b0f6e51._comment new file mode 100644 index 000000000..5404fbe49 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_2_4981a0a894b77e94a3bffec82b0f6e51._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 2" + date="2014-05-21T18:06:09Z" + content=""" +I've verified that the assistant is serving up the files, such as http://127.0.0.1:$port/static/fonts/glyphicons-halflings-regular.svg + +I've verified that the files it's serving have the right content. + +This seems to only leave the likely explanation that the android web browser doesn't support the technology bootstrap 3 is using for its icons. This is svg, plus ttf, plus Embedded OpenType and Web Open Font Format. (I suppose it uses different ones on different browsers.) + +I'm surprised that bootstrap would be using web fonts technology if it's not supported on Android, or wouldn't have a fallback to the plain old image method old versions of bootstrap used. + +I have found some bootstrap bugs about icons not showing up on Android, like this one ... but those are about specific icons not showing up due to unicode issues. Not about all icons failing to show up. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_3_dbe960392aaa0839886381820754814a._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_3_dbe960392aaa0839886381820754814a._comment new file mode 100644 index 000000000..f6f4e4879 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_3_dbe960392aaa0839886381820754814a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 3" + date="2014-05-21T18:47:42Z" + content=""" +I don't think it's an issue with the Android browser. It happens with Chrome and Firefox on Android as well. Moreover, the icons still don't show up if open the Webapp running on Android over network from a desktop browser. Firebug doesn't even show the request that should load the font file (compare to the desktop version where it loads the woff file in Firefox). So I suspect the Web server behaves different somehow. Some weird blocking issue maybe? + +Not sure if this is related but I noticed a strange behavior: If I try to download the font file in a new tab, it blocks until I refresh the tab running the webapp. Only seen on desktop Firefox. Doesn't happen in Chromium. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_4_cdf9621fe3e9f8eb8b7af88f779a7116._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_4_cdf9621fe3e9f8eb8b7af88f779a7116._comment new file mode 100644 index 000000000..dabc21cce --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_4_cdf9621fe3e9f8eb8b7af88f779a7116._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 4" + date="2014-05-21T19:19:45Z" + content=""" +I forgot to mention that the --listen argument doesn't seem to work on Android so I used ssh -R in order to access the webapp from my desktop. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_5_a2318f094b30f58fefc072807896c099._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_5_a2318f094b30f58fefc072807896c099._comment new file mode 100644 index 000000000..9f18e604e --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_5_a2318f094b30f58fefc072807896c099._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 5" + date="2014-05-27T19:58:37Z" + content=""" +On Android, the webserver returns a broken bootstrap.css. It seems like some binary garbage is appended to the end of the css file that looks suspiciously like the content or some fragment of the font file \"glyphicons-halflings-regular.eot\". Reason unknown. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_6_7c2f1d914793798708ca13b6ac3dd474._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_6_7c2f1d914793798708ca13b6ac3dd474._comment new file mode 100644 index 000000000..8806de16f --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_6_7c2f1d914793798708ca13b6ac3dd474._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 6" + date="2014-05-27T20:23:03Z" + content=""" +I checked the evilspliced tmp/androidtree/Assistant/WebApp/Types.hs, and the bootstrap.css there ends correctly, nothing weird appended. + +The TH generated for this: + +
+       (\"css/bootstrap.css\", 
+        GHC.IO.unsafePerformIO
+          (Data.ByteString.Unsafe.unsafePackAddressLen
+             121220
+             file_content_omitted)
+
+ +That looks right, in particular the size is the same as the number of bytes in the file. + +Hmm.. To double-check, I edited the file so that the string containing the content of this file was defined in foo. + +
+*Main> length foo
+113023
+
+ +This might be innocuous; there are some unicode characters in the string that encode to multiple bytes. OTOH, if you see exactly 8197 bytes of extra garbage appended, I think we have our culprit. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_7_a24b5165590b5d58919da1003cd20c54._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_7_a24b5165590b5d58919da1003cd20c54._comment new file mode 100644 index 000000000..194d1c831 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_7_a24b5165590b5d58919da1003cd20c54._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 7" + date="2014-05-28T00:02:42Z" + content=""" +The string is indeed truncated; it seems that something, probably the EvilSplicer is doing effectively a s/\w+:// on the string. +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_8_71ed14b8e5a898b1643d5e37591c2476._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_8_71ed14b8e5a898b1643d5e37591c2476._comment new file mode 100644 index 000000000..f5bc22ec7 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_8_71ed14b8e5a898b1643d5e37591c2476._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 8" + date="2014-05-28T00:04:58Z" + content=""" +Almost certinaly the EvilSplicer; it contains a hack to remove package-version qualifications from symbols. (s/package-version:symbol/symbol/) +"""]] diff --git a/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_9_15357e33c2431080d45f7cef5f4f1209._comment b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_9_15357e33c2431080d45f7cef5f4f1209._comment new file mode 100644 index 000000000..65db84556 --- /dev/null +++ b/doc/bugs/Bootstrap3_icons_missing_on_Android/comment_9_15357e33c2431080d45f7cef5f4f1209._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 9" + date="2014-05-28T00:37:30Z" + content=""" +[[!commit 37da3d7b5dcfd328aee6a7a91508b02edf720bca]] should fix this problem. I've verified the truncation is not present in the spliced source; lack bandwidh to test the binary right now. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout.mdwn b/doc/bugs/Box.com_ReposnseTimeout.mdwn new file mode 100644 index 000000000..4beb6999c --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout.mdwn @@ -0,0 +1,12 @@ +Box.com is still not working properly in version 5.20140227 (I'm using it in Debian testing and sid). + +I created a new clean repository and configured Box.com (everything from the webapp). At first it seamed to work, files where being uploaded and the logs where fine. Then I created another clean repository in another computer and started syncing. Downloading files worked properly, but when trying to upload a file from the second computer I got this: + + copy my_file (gpg) (checking box.com...) (to box.com...) + 100% 0.0 B/s 0sResponseTimeout + failed + git-annex: copy: 1 failed + +When I got back to the first computer I saw the same behavior, uploading files wasn't working any more. + +> [[duplicate|done]] --[[Joey]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment new file mode 100644 index 000000000..062fbfac6 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 1" + date="2014-03-01T11:23:05Z" + content=""" +I have another error log: + + 29% 653.2KB/s 1m49sgpg: [stdout]: write error: Broken pipe + gpg: DBG: deflate: iobuf_write failed + gpg: build_packet failed: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: symmetric encryption of `[stdin]' failed: file write error + ResponseTimeout + git-annex: fd:96: hPutBuf: resource vanished (Broken pipe) + ResponseTimeout + +Some files (very few) are being uploaded properly, so the error is not always reproducible. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment new file mode 100644 index 000000000..864731a47 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-05T03:15:43Z" + content=""" +I suspect this is just box.com's webdav support being flakey. + +It's possible there's a timeout that's too aggressive in the http library. I have had some trouble with that when trying to use DAV over a slow connection. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment new file mode 100644 index 000000000..e6585b6a2 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 3" + date="2014-03-05T08:10:25Z" + content=""" +My connection is pretty fast, I've just copied a 77MB folder through Box's webdav with my file manager in ~90sec and I have never seen a timeout when using my file manager, all uploads finish properly. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment new file mode 100644 index 000000000..c95d3ceb4 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 4" + date="2014-03-05T17:11:40Z" + content=""" +Previous bug report about this with much more information, please do any followup there: +[[bugs/box.com_never_stops_syncing.]] +"""]] diff --git a/doc/bugs/Bug_Report_doesn__39__t_work.mdwn b/doc/bugs/Bug_Report_doesn__39__t_work.mdwn new file mode 100644 index 000000000..cbf4a481d --- /dev/null +++ b/doc/bugs/Bug_Report_doesn__39__t_work.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +Bug Report doesn't work + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn b/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn new file mode 100644 index 000000000..ba87b1191 --- /dev/null +++ b/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn @@ -0,0 +1,45 @@ +Applying this + +
+laplace:git-annex jtang$ git diff
+diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs
+index b9630b1..bf36e59 100644
+--- a/Assistant/WebApp/Configurators.hs
++++ b/Assistant/WebApp/Configurators.hs
+@@ -101,7 +101,7 @@ checkRepositoryPath p = do
+  -
+  - If run in another directory, the user probably wants to put it there. -}
+ defaultRepositoryPath :: Bool -> IO FilePath
+-defaultRepositoryPath firstrun = do
++defaultRepositoryPath firstRun = do
+        cwd <- liftIO $ getCurrentDirectory
+        home <- myHomeDir
+        if home == cwd && firstRun
+
+ +Causes this to occur, + +
+Assistant/WebApp/Configurators.hs:114:17:
+    Couldn't match expected type `Control.Monad.Trans.RWS.Lazy.RWST
+                                    (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])
+                                    Enctype
+                                    Ints
+                                    (GHandler WebApp WebApp)
+                                    t0'
+                with actual type `Text'
+    Expected type: String
+                   -> Control.Monad.Trans.RWS.Lazy.RWST
+                        (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])
+                        Enctype
+                        Ints
+                        (GHandler WebApp WebApp)
+                        t0
+      Actual type: String -> Text
+    In the first argument of `(.)', namely `T.pack'
+    In the first argument of `(<$>)', namely
+      `T.pack . addTrailingPathSeparator'
+make: *** [git-annex] Error 1
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn b/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn new file mode 100644 index 000000000..e1d2da4ce --- /dev/null +++ b/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn @@ -0,0 +1,56 @@ +What steps will reproduce the problem? + +Building of the current github HEAD fails with a strange error message regarding OSX. I'm not using OSX but Ubuntu 12.10, why is cabal trying to build these files? + +
+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git
+Cloning into 'git-annex'...
+remote: Counting objects: 40243, done.
+remote: Compressing objects: 100% (10568/10568), done.
+remote: Total 40243 (delta 29647), reused 40044 (delta 29449)
+Receiving objects: 100% (40243/40243), 9.12 MiB | 184 KiB/s, done.
+Resolving deltas: 100% (29647/29647), done.
+dominik@Atlantis:/var/tmp$ cd git-annex/
+dominik@Atlantis:/var/tmp/git-annex$ cabal update
+Downloading the latest package list from hackage.haskell.org
+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+dominik@Atlantis:/var/tmp/git-annex$ cabal configure
+Resolving dependencies...
+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )
+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )
+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )
+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )
+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )
+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )
+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )
+
+Utility/OSX.hs:22:17: Not in scope: `myHomeDir'
+
+ +What is the expected output? What do you see instead? + +I expect cabal to build git-annex. + +What version of git-annex are you using? On what operating system? + +github HEAD on Ubuntu 12.10 + +Please provide any additional information below. + +
+$ cabal --version
+cabal-install version 0.14.0
+using version 1.14.0 of the Cabal library 
+
+$ ghc --version
+The Glorious Glasgow Haskell Compilation System, version 7.4.2
+
+$ uname -a
+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
+
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn new file mode 100644 index 000000000..6c7444afd --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn @@ -0,0 +1,37 @@ +I have some git repositories I don't edit often that I'd like to back up. I'd like to add these to my git annex, so I don't have to resort to a time-consuming hack (such as setting up a proper submodule, or bundling the repositories). + +But when I try to add a .git directory to git annex, I get a bunch of errors of the form + + git-annex: user error (xargs ["-0","git","--git-dir=/tmp/tmp.LhGN3nT9uM/annex/.git","--work-tree=/tmp/tmp.LhGN3nT9uM/annex","add","--"] exited 123) + failed + git-annex: add: 1 failed + add repo/.git/hooks/pre-push.sample ok + (Recording state in git...) + error: Invalid path 'repo/.git/hooks/pre-push.sample' + error: unable to add repo/.git/hooks/pre-push.sample to index + fatal: adding files failed + +STR: + + $ mkdir annex + $ cd annex + annex$ git init + annex$ git annex init + annex$ cd .. + + $ mkdir repo + $ cd repo + repo$ git init + repo$ cd .. + + $ mv repo annex + $ cd annex + annex$ find repo | xargs -n1 git annex add + # Lots of errors of the form above. + +You can't simply do `git annex add repo` because that will ignore the .git directory. Similarly,` git annex add .git` (which I'd think really should try to add the contents of the .git directory) ignores everything. + +I don't know what this error means. Is there a right way to work around this? + +> [[!meta title="cannot add .git/ to a git repository. even when using git-annex."]] +> [[!taglink confirmed]] (but may be out of scope for git-annex) --[[Joey]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment new file mode 100644 index 000000000..45eebe10f --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T17:36:31Z" + content=""" +It's a fairly fundamental limitation of git that you cannot check `.git` directories into a git repository. + +For backups and sneakernet transfers, `git bundle` is easy to use.. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment new file mode 100644 index 000000000..c3be9b722 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 2" + date="2013-05-13T17:53:06Z" + content=""" +Be that as it may, the whole reason git-annex exists is to work around fundamental limitations of git! + +The issue is that I don't want to treat a folder which I happen to have applied version control to differently than a folder which happens not to be version controlled (aside from committing to the version-controlled folder, of course!). Both folders are in my git annex; I shouldn't have to worry about it. (My whole \"documents\" folder is in git annex, and it contains many small git repositories.) + +I guess I could write a script to unbundle and re-bundle on command. In fact, one could imagine integrating these scripts into git annex somehow. + +Is that something you'd consider taking upstream? +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment new file mode 100644 index 000000000..f7b07d3b6 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-13T18:08:36Z" + content=""" +Well, git-annex is all about working around *1* limitation of git. There are several other limitations that it would be nice to have tools to deal with better, including storing metadata, and this one. I can't take everything on. + +I mostly worry about these limitations in the context of naive users using the git-annex assistant for file sync. I have heard that some people put their git repositories in dropbox. + +You don't sound at all naive, so I'll suggest another tool I wrote, mr . With mr you can run a single command and operate on all repositories at or under a directory. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment new file mode 100644 index 000000000..6b7c9f33b --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 4" + date="2013-05-28T19:21:57Z" + content=""" +This \"git is afraid of .git\" issue is the main blocker for finally getting rid of unison. My use case is as follows. Among other things, I have a `~/work` directory infested with little projects versioned by git. I want to sync it between my 3 machines and a cloud server. My current setup involves star-shaped unison syncs to the server. That's not bad, but it has its problems: + + * unison keeps a file index for every pair of machines (laptop-server, office-server, etc). This means that I end up with 3 identical indexes on the server, indexing the same data. Every time I sync a pair, the server rechecks what has changed to update the corresponding index. + * also, every time I add a machine, or my disk explodes and I have to setup a new unison sync from scratch, the server has to reindex everything, which is slow. + * unison does not know about the entire history, only the current state of the replicas. This may lead to data loss if I delete something I shouldn't delete and propagate. Only in special cases, for instance when I delete everything in one replica, unison asks before throwing it all out the window. + * I sometimes want to sync laptop and desktop through the local network, instead of going through the server. Then I have to be very careful in which order I do the syncs + it adds a couple of new redundant indices. + +Now, git annex is not a sync tool. But as a side effect of its `git annex sync` feature, it happens to solve those issues in an elegant way, making it an extremely flexible sync tool, far superior to unison in many aspects! + +Still, my `~/work` directory is infested with little git repos, so I can't use git annex on `~/work`. Also, I treat my little git projects as things carrying their own history arround. Sometimes I move them, etc. I don't want to use mr in them, nor keep remotes for all my machines on all my little projects. That removes a lot of the flexibility I'd gain by moving to git annex. + +The thing is, I don't understand why this git limitation is fairly fundamental. I've been playing around nesting git repos. When I change the inner `.git` directory to `.bar`, the outer git swallows it all right, and after some playing around with commits and checkouts on the inner and outer repos, the internal repo survived the process. Also, I don't think versioning content inside `.git` may disorient git in any way. Every git call knows on which `.git` directory it operates, just go up through the path looking for the first `.git` dir which is NOT a part of the actual path. Is there anything else I am missing? Would it be feasible to patch git adding a config option that makes it treat `.git` dirs as regular dirs? I'd be willing to mess with git's source when I get the time to do it. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment new file mode 100644 index 000000000..28299c372 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="sources" + date="2013-11-21T18:41:12Z" + content=""" +I tried to find a canonical source for why (or if?) git ignores any \".git\" directory, and it turns out it also ignores .git *files*, according to [this stackoverflow thread](http://stackoverflow.com/questions/6839781/what-happens-when-you-run-git-add-git-in-a-git-repository). It's hardcoded in the source code and \"will likely not change\". + +I guess this should therefore be taken upstream, but I am not sure how this could justified there. + +I do think git-annex should support that. It's turning more and more as a \"generic backup solution\" or \"i want my files in the cloud\" kind of solution, which is awesome, but small things like this are making it harder to use... --[[anarcat]] +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment new file mode 100644 index 000000000..da52be691 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 6" + date="2013-11-21T20:04:22Z" + content=""" +After I wrote my last post in this thread I did write a patch for git doing two things: + +* make git ignore .git only at the root of the working tree, but not '.git' files or directories nested deeper into the working tree. +* add config option to prevent git from converting directories containing .git into gitlinks. It turns out that git already has an internal setting for this, it only needed to be exposed in the config files! + +It kind of worked, but I've never used nor completed this, though (if I recall correctly, something had to be done regarding the default gitingores, which contains .git). I don't think upstream would accept these changes, though. It is a potentially risky change that does not gives them any benefit. Plus commiting a git repo inside an other is kind of crazy. I'm not convinced this is a good solution anymore. + +Being able to put a git repo inside an assistant-controled directory would be nice, though. Additionally, letting the outermost git repo recognize the internal git repo as a git repo, instead of moving files blindly, would also be nice, and probably more reasonable. And that leads to submodules... + +My particular problem is: I want to syncing a directory with lots of little git repos across several machines, without having to configure remotes for every single one of them (so no mr) and having someone take care of the files which are ignored by the little git repos, possibly as annexed files. Currently I just sync that folder containing the little git repos with unison. + +Now, instead of commiting git repos inside git repos, I'm more inclined to a potential solution using git-annex + submodules. Ideally I'd like something like this: + +1. A git-annex repo at ~/work +2. All my little git repos inside ~/work are automatically recognized as submodules by git-annex +3. The outermost git-annex takes care of the .gitignored files for the inner git repos +4. git pull/push --recursive on the outermost annex repo pulls/pushes submodules (I think [something like this](https://github.com/jlehmann/git-submod-enhancements/wiki/Recursive-submodule-checkout) is written by Jens Lehmann) +5. The urls in .gitmodules are relative paths from the outermost annex working tree. Then a git fetch --recursive from the outermost annex can use an outermost remote + the submodule relative path. No need to manually configure remotes for every machine on every submodule! + +The problem with this approach, is that 2,4,5 are science-fiction for now, and probably 3 too. Realizing this would imply a lot of work, and commiting a lot of submodule stuff to upstream git. But probably stuff that makes sense and they would accept. Anyway, I'd like to know what Joey thinks about all this... +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment new file mode 100644 index 000000000..374d193c0 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 7" + date="2013-11-22T16:50:31Z" + content=""" +I appreciate the investigation. + +Now that there's a direct mode guard, it would be possible to have git-annex translate .git directories to some other name when adding files to git. This seems more likely than getting git changed. + +However, I am not convinced *at all* that it makes any sense to try to sync git repositories in this way. I realize that some people drop git checkouts into dropbox and use that, but it's a fundamentally unsound thing to do, and those people are just lucky if they manage to avoid running into problems doing that. + +If you have two clones of a repo, and a git repository is checked into both, and they become partitioned for a while and larger re-merge, then there can be conflicts in the files that make up the git repository. Which git-annex would auto-resolve, with the effect that the checked-in git repository would appear to be broken. + +Also, this feature would only be used by a small number of users, on the border between people who can use git the Correct Way, and people who don't use git other than with the assistant. + +It would make sense to make git-annex refuse to add files inside nested git repositories though. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment new file mode 100644 index 000000000..df97625f7 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 8" + date="2013-11-22T18:44:35Z" + content=""" +> I am not convinced at all that it makes any sense to try to sync git repositories in this way + +I agree this is not a good solution. + + +> I realize that some people drop git checkouts into dropbox and use that, but it's a fundamentally unsound thing to do, and those people are just lucky if they manage to avoid running into problems doing that. + +Well, I don't use dropbox (nor annex assistant) but I sync a lot of git repos with unison. It is not luck, it is being careful not to create conflicts. I agree this is not ideal, and I'm looking for a better way to deal with this. + + +> Also, this feature would only be used by a small number of users + +I'm not convinced of that. If done right, nested git repos inside annex could have value. + +Let's say you work with 40 git repos some private of yours, others tracking upstream, and you want to sync them across 4 machines (home, work, cloud server, backup). I imagine your preferred solution would be to configure the 4 machines as remotes on every git repo and use mr, am I right? + +This has its problems: + +1. The set of files you want in the project git repo may not be the same as the set of files you want synced across machines. For instance, I use a large software project that I compile from sources. I want to sync binaries across machines (it takes forever to compile!), but of course I don't want them commited into the project, not even as annexed files. +2. Configuring remotes for every project is tedious. What if some remote changes url? what if I want to change the path of some of the git projects? Every time I add a new repo I need to configure all the 4 remotes. This can be scripted of course, but is not my ideal solution. + +What do you think about the submodules route I proposed? I don't like submodules very much, but in this case, I think it could become a good solution. In particular it would solve 1, 2 above and be able to merge conflicting changes on the nested repos. + +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment new file mode 100644 index 000000000..36993859a --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk11IeWrsbRKPqxl0_Fp5B119mrzpMIkz8" + nickname="Roland" + subject="comment 9" + date="2013-12-08T21:50:31Z" + content=""" +Same use case here. Hey, I even also use ~/work. + +I've burned my fingers on git repositories synched via Dropbox, so I share the reservations against it. But in my case the trouble came from lack of caution when sharing the given Dropbox folders. I'm not sure what the risks are when I'm in control of all the copies. Synching between my own computers should not pose a problem, I know how to create branches for experimental stuff etc. + +I'd love to use git-annex is to maintain dispersed repositories while synching and archiving effectively. The issue with .git directories is a real blocker and I'd really appreciate a workable solution. It doesn't have to be perfect, but manually invoking submodule or the need to configure lots of remotes is not exactly practical. + +I don't know enough to fully understand everything above. So what follows may be hopelessly naive. But it occurred to me there may be a simpler solution: what if git-annex changed the name of its repo to .annex (or so) instead of .git? And maybe similarly .gitignore to .annexignore etc. Wouldn't the nested git repositories then \"just work\"? Because of the hardcoded ignore rules, this approach would require a tweaked git for annex... but overall, wouldn't it be cleaner and more minimal? + +I'm probably overlooking something, but maybe this idea can lead somewhere? + +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn new file mode 100644 index 000000000..c3da3f5c1 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +Some filenames in doc have a colon `(:)` in them and it seems it's not allowed on Windows. + +There's no hurry with this since I was able to clone the repo by doing a fork on Github and removing `doc/`. + +### What steps will reproduce the problem? + +[[!format sh """ +D:\tmp> git clone git://git-annex.branchable.com/ +Cloning into 'git-annex.branchable.com'... +remote: Counting objects: 72064, done. +remote: Compressing objects: 100% (18759/18759), done. +remote: Total 72064 (delta 52959), reused 72032 (delta 52944) +Receiving objects: 100% (72064/72064), 18.05 MiB | 2.39 MiB/s, done. +Resolving deltas: 100% (52959/52959), done. +fatal: cannot create directory at 'doc/bugs/3.20121112:_build_error_in_assistant': Invalid argument +D:\tmp> +"""]] + +> [[wontfix|done]] --[[Joey]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment new file mode 100644 index 000000000..59bfd629b --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-10T16:22:00Z" + content=""" +IMHO this is a bug in msysgit. It should support git repositories containing any legal filenames. + +Luckily, there is another git for Windows that does. It comes with Cygwin. You need Cygwin to build git-annex on Windows, anyway. + +So, I do not plan to do anything in git-annex to address this. +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment new file mode 100644 index 000000000..fa9bd3dd3 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXm4VZC7ekVOXHGKjBObojiHB2E1kmMgA" + nickname="Leonardo" + subject="comment 2" + date="2013-08-11T21:21:56Z" + content=""" +Files with colon are not allowed in windows, they are interpreted as absolute path. The fact that you can checkout them \"fine\" (actually, their name get truncated to whatever was before the colon) using cygwin's GIT implementation is to be interpreted as a bug in cygwin's GIT in my opinion. I suggest renaming them before cygwin get fixed. +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment new file mode 100644 index 000000000..14cfa2686 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 3" + date="2013-08-24T19:27:57Z" + content=""" +Leonardo, you made me boot up my windows machine just to check if cygwin git truncated files at the colon. It does not. + +AFAIK, Cygwin transliterates colons to another unicode character or something like that. I would be highly surprised if the Cygwin people consider this feature to be a bug. + +Since you need Cygwin to build git-annex on Windows anyway (though not to run it!), this remains WONTFIX. +"""]] diff --git a/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn b/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn new file mode 100644 index 000000000..c28794622 --- /dev/null +++ b/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn @@ -0,0 +1,158 @@ +### Please describe the problem. +The android app won't start on Cyanogenmod 10.2. Not sure if this is cyanogenmod specific or if it is because the underlying android is now version 4.3 + +### What steps will reproduce the problem? +Install the apk and start the program + +### What version of git-annex are you using? On what operating system? +A 7 day old nightly as of this post(can't get specific number since it won't run) + +### Please provide any additional information below. + +Tested this on both a samsung galaxy S and a samsung galaxy note 2. With different nightlies of cyanogenmod 10.2 + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +u0_a115@android:/sdcard/git-annex.home $ git annex webapp +CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) +1|u0_a115@android:/sdcard/git-annex.home $ + +--- + + +cat git-annex-install.log + +Installation starting to /data/data/ga.androidterm +34c88243533e9b0a725ebe33533d990e628dc44b +installing busybox +installing git-annex +installing git-shell +installing git-upload-pack +installing git +installing gpg +installing rsync +installing ssh +installing ssh-keygen +linking ./libexec/git-core/git-config to git +linking ./libexec/git-core/git-fetch to git +linking ./libexec/git-core/git-fsck to git +linking ./libexec/git-core/git-unpack-file to git +linking ./libexec/git-core/git-get-tar-commit-id to git +linking ./libexec/git-core/git-fmt-merge-msg to git +linking ./libexec/git-core/git-push to git +linking ./libexec/git-core/git-for-each-ref to git +linking ./libexec/git-core/git-pack-redundant to git +linking ./libexec/git-core/git-mv to git +linking ./libexec/git-core/git-ls-remote to git +linking ./libexec/git-core/git-prune-packed to git +linking ./libexec/git-core/git-apply to git +linking ./libexec/git-core/git-check-ignore to git +linking ./libexec/git-core/git-log to git +linking ./libexec/git-core/git-cherry-pick to git +linking ./libexec/git-core/git-diff-files to git +linking ./libexec/git-core/git-commit-tree to git +linking ./libexec/git-core/git-index-pack to git +linking ./libexec/git-core/git-reflog to git +linking ./libexec/git-core/git-merge-index to git +linking ./libexec/git-core/git-column to git +linking ./libexec/git-core/git-checkout-index to git +linking ./libexec/git-core/git-diff-index to git +linking ./libexec/git-core/git-count-objects to git +linking ./libexec/git-core/git-fast-export to git +linking ./libexec/git-core/git-fetch-pack to git +linking ./libexec/git-core/git-merge-file to git +linking ./libexec/git-core/git-init to git +linking ./libexec/git-core/git-remote to git +linking ./libexec/git-core/git-init-db to git +linking ./libexec/git-core/git-ls-tree to git +linking ./libexec/git-core/git-merge-subtree to git +linking ./libexec/git-core/git-rev-parse to git +linking ./libexec/git-core/git-bundle to git +linking ./libexec/git-core/git-prune to git +linking ./libexec/git-core/git-peek-remote to git +linking ./libexec/git-core/git-tar-tree to git +linking ./libexec/git-core/git-describe to git +linking ./libexec/git-core/git-update-index to git +linking ./libexec/git-core/git to git +linking ./libexec/git-core/git-revert to git +linking ./libexec/git-core/git-show-ref to git +linking ./libexec/git-core/git-upload-archive to git +linking ./libexec/git-core/git-add to git +linking ./libexec/git-core/git-verify-tag to git +linking ./libexec/git-core/git-format-patch to git +linking ./libexec/git-core/git-show-branch to git +linking ./libexec/git-core/git-remote-fd to git +linking ./libexec/git-core/git-pack-refs to git +linking ./libexec/git-core/git-replace to git +linking ./libexec/git-core/git-pack-objects to git +linking ./libexec/git-core/git-notes to git +linking ./libexec/git-core/git-tag to git +linking ./libexec/git-core/git-var to git +linking ./libexec/git-core/git-help to git +linking ./libexec/git-core/git-gc to git +linking ./libexec/git-core/git-check-ref-format to git +linking ./libexec/git-core/git-shortlog to git +linking ./libexec/git-core/git-stage to git +linking ./libexec/git-core/git-mktree to git +linking ./libexec/git-core/git-merge-recursive to git +linking ./libexec/git-core/git-grep to git +linking ./libexec/git-core/git-clean to git +linking ./libexec/git-core/git-merge-base to git +linking ./libexec/git-core/git-repo-config to git +linking ./libexec/git-core/git-hash-object to git +linking ./libexec/git-core/git-read-tree to git +linking ./libexec/git-core/git-rm to git +linking ./libexec/git-core/git-fsck-objects to git +linking ./libexec/git-core/git-ls-files to git +linking ./libexec/git-core/git-mktag to git +linking ./libexec/git-core/git-stripspace to git +linking ./libexec/git-core/git-mailsplit to git +linking ./libexec/git-core/git-diff-tree to git +linking ./libexec/git-core/git-merge-ours to git +linking ./libexec/git-core/git-cherry to git +linking ./libexec/git-core/git-checkout to git +linking ./libexec/git-core/git-rev-list to git +linking ./libexec/git-core/git-write-tree to git +linking ./libexec/git-core/git-update-ref to git +linking ./libexec/git-core/git-blame to git +linking ./libexec/git-core/git-archive to git +linking ./libexec/git-core/git-update-server-info to git +linking ./libexec/git-core/git-merge-tree to git +linking ./libexec/git-core/git-show to git +linking ./libexec/git-core/git-remote-ext to git +linking ./libexec/git-core/git-merge to git +linking ./libexec/git-core/git-name-rev to git +linking ./libexec/git-core/git-bisect--helper to git +linking ./libexec/git-core/git-clone to git +linking ./libexec/git-core/git-symbolic-ref to git +linking ./libexec/git-core/git-send-pack to git +linking ./libexec/git-core/git-commit to git +linking ./libexec/git-core/git-mailinfo to git +linking ./libexec/git-core/git-credential to git +linking ./libexec/git-core/git-diff to git +linking ./libexec/git-core/git-patch-id to git +linking ./libexec/git-core/git-rerere to git +linking ./libexec/git-core/git-branch to git +linking ./libexec/git-core/git-reset to git +linking ./libexec/git-core/git-receive-pack to git +linking ./libexec/git-core/git-verify-pack to git +linking ./libexec/git-core/git-unpack-objects to git +linking ./libexec/git-core/git-check-attr to git +linking ./libexec/git-core/git-whatchanged to git +linking ./libexec/git-core/git-status to git +linking ./libexec/git-core/git-cat-file to git +linking ./libexec/git-core/git-annotate to git +linking ./bin/git-upload-archive to git +linking ./bin/git-receive-pack to git +linking ./libexec/git-core/git-shell to git-shell +linking ./libexec/git-core/git-upload-pack to git-upload-pack +Installation complete + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn new file mode 100644 index 000000000..c40a90feb --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn @@ -0,0 +1,22 @@ +I have a repository at rsync.net, even though following files are shown as unused I can not drop them. + +Running unused, + + git annex unused --from cloud + unused cloud (checking for unused data...) (checking annex/direct/master...) + Some annexed data on cloud is not used by any files: + NUMBER KEY + 1 SHA256E-s4189547--43aef42540e7f50fc454ab3a2ce4aa28a13b57cccff725359cea0470eb88704b. Bir.mp3 + 2 SHA256E-s853765--c0964d3af493d78b7b8393a2aefdd8c290390a03c8cb5cccdcac4647c0fc52a0. 1.jpg + 3 SHA256E-s8706267--e34988b70048a512ad0f431a2a91fa7dd553f96c2bd6caca0bcef928bdfafb93. 3.mp3 + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused --from cloud NUMBER + +show these then running, + + git annex dropunused 1-3 --force + +reports ok for each drop operation but rerunning git annex unused --from cloud still shows these three files as unused. I am using git-annex on mac os x (current dmg) on a direct repo. I have similar problems dropping files on the current repo even though I drop unused they still show up as unused. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment new file mode 100644 index 000000000..fa41b59a7 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="doubt this has anything to do with spaces" + date="2014-02-08T17:44:45Z" + content=""" +If you want to drop the files from the remote, you need to also pass the --from option to dropunused. Otherwise, it defaults to dropping any of the unused files that are present in the local repository. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment new file mode 100644 index 000000000..5f5694c00 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-02-08T18:30:47Z" + content=""" +I tried with/without --from still does not drop the files. + + git annex dropunused --from cloud 1-3 --force + dropunused 1 (from cloud...) (gpg) ok + dropunused 2 (from cloud...) ok + dropunused 3 (from cloud...) ok + (Recording state in git...) + +still running unused shows the files as unused. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment new file mode 100644 index 000000000..86e3bd2c1 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 3" + date="2014-02-08T19:17:46Z" + content=""" +Ok, you're right and this *does* involve spaces. Some bug in the unused log parser. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment new file mode 100644 index 000000000..6459ee8d7 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 4" + date="2014-02-08T19:28:18Z" + content=""" +Fixed in git. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment new file mode 100644 index 000000000..4ad4d6f8b --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 5" + date="2014-02-08T19:46:49Z" + content=""" +Are the files dropped on the rsync repo? Or are they gonna be dropped when fix propagates to dmg build? +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment new file mode 100644 index 000000000..fbd9ed55c --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 6" + date="2014-02-08T19:49:11Z" + content=""" +You will need to upgrade git-annex to the next autobuild or an upcoming release to get the fix. +"""]] diff --git a/doc/bugs/Cannot_clone_an_annex.mdwn b/doc/bugs/Cannot_clone_an_annex.mdwn new file mode 100644 index 000000000..77989ecb6 --- /dev/null +++ b/doc/bugs/Cannot_clone_an_annex.mdwn @@ -0,0 +1,69 @@ +I have an annex that I use to store my digital photos. I had a few false +starts creating this annex, but now it's looking good on my server: + + root@titan.local:/tank/Media/Pictures# git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + be88bc5a-17e2-11e2-a99b-d388d4437350 -- here (titan) + untrusted repositories: 0 + dead repositories: 5 + 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan + 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan + 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan + D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes + EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes + transfers in progress: none + available local disk space: unknown + local annex keys: 20064 + local annex size: 217 gigabytes + known annex keys: 21496 + known annex size: 217 gigabytes + bloom filter size: 16 mebibytes (4% full) + backend usage: + SHA256E: 41560 + root@titan.local:/tank/Media/Pictures# git annex unused + unused . (checking for unused data...) ok + +It passes `git annex fsck` without any problems. However, when I "git clone" +this annex to my desktop machine and then do a `git annex sync`, I see this: + + Vulcan /Volumes/tank/Media/Pictures (master) $ git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan + 274D3474-7A25-44CD-8368-CF11C451014F -- here (vulcan) + EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes + be88bc5a-17e2-11e2-a99b-d388d4437350 -- titan + untrusted repositories: 0 + dead repositories: 3 + 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan + 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan + D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes + transfers in progress: none + available local disk space: 1 terabyte (+1 megabyte reserved) + local annex keys: 0 + local annex size: 0 bytes + known annex keys: 21025 + known annex size: 217 gigabytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256: 18707 + SHA256E: 2318 + +Where did all these `SHA256` keys come from? + +Why doesn't the known annex keys size match? + +Further, I cannot `git annex get` on most of the files, because it says that +the `SHA256` key is not present. + +It looks like I'll have to rollback my ZFS snapshots and start over, but I'm +wondering: how was I even able to create this situation? + +> [[Done]]; user error. --[[Joey]] diff --git a/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment b/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment new file mode 100644 index 000000000..44b93b1c2 --- /dev/null +++ b/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-22T13:53:06Z" + content=""" +The SHA256 keys are symlinks in your git repository with \"SHA256-\" as the prefix on the file linked to. You should be able to determine the rest by looking at the history of those files in git. +"""]] diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn new file mode 100644 index 000000000..f780ace7c --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn @@ -0,0 +1,8 @@ +### Please describe the problem. +The webapp does not offer me the option to delete a remote repository that it did not succeed to synchronize with. Status of the repository is sync enabled (metadata only) but in settings I may only edit the repo, but cannot delete it. + +### What steps will reproduce the problem? +Set up git-annex on a new computer. Forget to enable ssh on the machine. Perform a local pairing (success). The sync fails for obvious reasons. + +### What version of git-annex are you using? On what operating system? +System is ubuntu but I assume this is a general issue. Version of git-annex is 5.20140117 diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment new file mode 100644 index 000000000..c89d1cb0c --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.46" + subject="comment 1" + date="2014-01-26T17:57:25Z" + content=""" +If you go to Edit, it will let you upgrade the repository, which should fix your problem. +"""]] diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment new file mode 100644 index 000000000..0d2f2e99b --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmXtqLEfN6cGcF9gW_09QUDoRpsexSdRcM" + nickname="Thomas" + subject="comment 2" + date="2014-01-26T18:12:08Z" + content=""" +Unfortunately, upgrading did not fix it. I suppose, a restart of the remote server (ssh was just installed) would have been necessary. Instead, I just deleted the repository on the remote. + +Now my local repository was caught in a situation, where I couldn't upgrade the broken remote and I couldn't delete it either. + +By recreating the repository on the remote, I finally was able to get rid of the broken link, but I think the proper solution would be to have the ability to remove unsynced repositories. + +Thanks for the quick response! +"""]] diff --git a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn new file mode 100644 index 000000000..5ca73dd80 --- /dev/null +++ b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn @@ -0,0 +1,46 @@ +### Please describe the problem. + +Any file containing non ascii chars either won't get commited by the webapp or when clone of that repo is made they are shown as deleted in git status but the files are there. + +you can not commit them neither, + + git commit -m 'foo' + +or + + git annex sync + +will get them to commit trying to reset the state using, + + git checkout master + +or + + git clean -f + +won't fix the issue. till the issue is fixed sync does not work from the command line since there are changes. Temporarily running assistant in the directory does fix the problem but every now and then it pops again. + +Also moving any symlinks around containing non ascii chars also causes the same issue. git annex won't add the moved symlinks git annex fix or git annex add won't add them git annex sync also skips them again the only solution is to either run the assistant or restart it if it is running. + +### What steps will reproduce the problem? + +Adding any file with a non ascii char on OS X (10.9). + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140421-gc34a665 + +### Please provide any additional information below. + +Also another thing I noticed is that same file names same repo will clone fine on Linux no errors this only happens on OS X. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_1_81a4647a9b51bed8c230a2a16990915d._comment b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_1_81a4647a9b51bed8c230a2a16990915d._comment new file mode 100644 index 000000000..e60065737 --- /dev/null +++ b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_1_81a4647a9b51bed8c230a2a16990915d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.36" + subject="comment 1" + date="2014-05-24T19:23:08Z" + content=""" +I think you are going to need to provide more information: + +* Some actual file names that have the problem. \"non-ascii chars\" is a very wide description, you don't even say if you're using unicode or what. +* Some error messages or transcripts of what happens when you see the problem. +* What is your locale setting on OSX. + +I tried with some unicode filenames on OSX and they were committed without difficulty in the en_US.utf8 locale. +"""]] diff --git a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_2_f8e97dded9ba6d2305de1278025924fe._comment b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_2_f8e97dded9ba6d2305de1278025924fe._comment new file mode 100644 index 000000000..b404cc381 --- /dev/null +++ b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_2_f8e97dded9ba6d2305de1278025924fe._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-05-25T15:16:33Z" + content=""" +I file name I remember messing is the following, + + George's Café + +I experience this problem with any char that is not ascii. As for my locale, + +LANG=\"en_US.UTF-8\" +LC_COLLATE=\"en_US.UTF-8\" +LC_CTYPE=\"en_US.UTF-8\" +LC_MESSAGES=\"en_US.UTF-8\" +LC_MONETARY=\"en_US.UTF-8\" +LC_NUMERIC=\"en_US.UTF-8\" +LC_TIME=\"en_US.UTF-8\" +LC_ALL=\"en_US.UTF-8\" + +There no errors other than the behaviour I've described. +"""]] diff --git a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_3_eb34061429cb8c7d0b155825e84b657b._comment b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_3_eb34061429cb8c7d0b155825e84b657b._comment new file mode 100644 index 000000000..acd5775cd --- /dev/null +++ b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_/comment_3_eb34061429cb8c7d0b155825e84b657b._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 3" + date="2014-05-27T18:02:11Z" + content=""" +I tried with that filename, and had no difficulty committing it. + +
+oberon:repo joeyh$ git annex add George\'s\ Cafe\314\201 
+add George's Café ok
+(Recording state in git...)
+oberon:repo joeyh$ git commit -m foo
+[master (root-commit) 8acd5d4] foo
+ Committer: Joey Hess 
+Your name and email address were configured automatically based
+on your username and hostname. Please check that they are accurate.
+You can suppress this message by setting them explicitly:
+
+    git config --global user.name \"Your Name\"
+    git config --global user.email you@example.com
+
+After doing this, you may fix the identity used for this commit with:
+
+    git commit --amend --reset-author
+
+ 1 file changed, 1 insertion(+)
+ create mode 120000 \"George's Caf\303\251\"
+
+
+ +I even tried running the assistant with all locale settings set to C, and it still had no problem adding and committing that filename. + +So, I need help reproducing this, or I need to see the error message you see when the problem happens to you. +"""]] diff --git a/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox.mdwn b/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox.mdwn new file mode 100644 index 000000000..425831a12 --- /dev/null +++ b/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. +[[!format sh """ +cabal install -O2 -j1 -f-webdav -f-s3 git-annex +Resolving dependencies... +Configuring dns-1.2.0... +Building dns-1.2.0... +Preprocessing library dns-1.2.0... + +Network/DNS/Decode.hs:15:8: + Could not find module `Data.Conduit.Network' + It is a member of the hidden package `conduit-extra-1.1.0'. + Perhaps you need to add `conduit-extra' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +Failed to install dns-1.2.0 +cabal: Error: some packages failed to install: +dns-1.2.0 failed during the building phase. The exception was: +ExitFailure 1 +git-annex-5.20140402 depends on dns-1.2.0 which failed to install. +"""]] + +### What steps will reproduce the problem? + +[[!format sh """ +cabal update +mkdir -p ~/haskell/git-annex +cd ~/haskell/git-annex +cabal sandbox init +cabal install -O2 -j1 -f-webdav -f-s3 c2hs git-annex +"""]] +### What version of git-annex are you using? On what operating system? + +5.20140402, Gentoo Linux + +### Please provide any additional information below. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox/comment_1_bd830cadaeffda0366b3ae46b34c0c55._comment b/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox/comment_1_bd830cadaeffda0366b3ae46b34c0c55._comment new file mode 100644 index 000000000..8ac4f017f --- /dev/null +++ b/doc/bugs/Compilation_error_when_building_version_5.20140402_in_cabal_sandbox/comment_1_bd830cadaeffda0366b3ae46b34c0c55._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl1D_4vD5ueaDw8gRsIYPO3UHRKEpFfg9I" + nickname="Dmitry" + subject="comment 1" + date="2014-04-04T06:40:21Z" + content=""" +Author of \"dns\" library already fixed this issue. + +Next error is: +[[!format sh \"\"\" +Preprocessing executable 'git-annex' for git-annex-5.20140402... + +Utility/Yesod.hs:36:8: + Could not find module `Text.Hamlet' + It is a member of the hidden package `shakespeare-2.0.0.1'. + Perhaps you need to add `shakespeare' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +cabal: Error: some packages failed to install: +\"\"\"]] + +Here is the fix: + + +[[!format diff \"\"\" +Index: git-annex/git-annex.cabal +=================================================================== +--- git-annex.orig/git-annex.cabal ++++ git-annex/git-annex.cabal +@@ -101,7 +101,7 @@ Executable git-annex + base (>= 4.5 && < 4.9), monad-control, MonadCatchIO-transformers, + IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process, + SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3), +- data-default, case-insensitive ++ data-default, case-insensitive, shakespeare + CC-Options: -Wall + GHC-Options: -Wall + Extensions: PackageImports +\"\"\"]] +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn new file mode 100644 index 000000000..595b86c29 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +On my raspberry pi, an SSH remote was in /var/lib/store (symlinked with /home/carlo/store), which contained a LVM volume spanning several USB drives. One of the drives got corrupted, which lead to this: + +$ cd /home/carlo/store +$ ls +Input/Output Error + +On my desktop machine, I then had a lot of transfers. After transfer, the file was turned into a symlink. + +### What steps will reproduce the problem? + +* Create an annex and a remote ssh server. +* [Simulate a corrupted drive](http://stackoverflow.com/questions/1361518/how-can-i-simulate-a-failed-disk-during-testing) for the remote, creating an input output error. +* Wait until the annex starts syncing on the desktop machine. If there were no further unidentified causes on my side, the assistant will start transfers that revert files to symlinks. + +### What version of git-annex are you using? On what operating system? + +Ubuntu 12.04 64bit +git annex 3.20121017 ([from Ubuntu PPA](https://launchpad.net/~rubiojr/+archive/git-annex)) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Please see [all my daemon.log](http://capocasa.name/daemon.tgz) files. + +I noticed the problem yesterday afternoon (Thu 24 Oct). + +# End of transcript or log. +"""]] + +> [[!taglink moreinfo]]; either I don't have enough information to work on this, +> or it might have just been user error. --[[Joey]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment new file mode 100644 index 000000000..e47cbd327 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-26T19:22:57Z" + content=""" +It seems to me that if a subdirectory of the repository is on a corrupted drive, and so it's not possible to list the files on it, this is basically the same as if you'd 'rm -rf' that subdirectory. So when it starts up, the assistant will see that these files are not present, and commit a removal to git. + +Then when another machine syncs with that, it would delete the files from its repository too. However, it actually keeps the contents of the files stashed away in `.git/annex`. So to recover from this, all you have to do is `git annex indirect` and `git revert` the commit that deleted the files. All your files would then be available again. + +However, what you describe is instead that the assistant chose to drop the content associated with the files, but kept the symlinks for them checked into git. +I don't understand why it would do that. Can you show the output of running, on the desktop machine: + + git annex whereis $somefile + git annex get $somefile + +Where $somefile is one of the files that has been reduced to a symlink. + +Looking at your logs, they appear to be the logs from the server. The strange thing that appears in one of them is \"git-annex: Not in a git repository.\" +which was logged around 2013-10-24 20:07:25 CEST. I am not sure, but I think it might have been the rpi git-annex saying that, because there is also \"fatal: '~/store/annex/' does not appear to be a git repository\" +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment new file mode 100644 index 000000000..18959ed68 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 2" + date="2013-10-27T19:26:42Z" + content=""" +Thanks for looking into it and the recover instructions, will recover and post back when I'm back at work. I also have an another indirect mode repo on my home desktop as an extra backup so nothing real bad happened, but it's reassuring data's still there at work. + +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment new file mode 100644 index 000000000..a254b31a8 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 5" + date="2013-10-30T15:05:37Z" + content=""" +The assistant autorecovered my work repo before I noticed, so it looks like I can't provide the necessary info. There were a bunch of files missing that got re-synced from my home PC. + +For what it's worth, I noticed that on my phone, when cutting the internet connection while syncing, the assistant downloaded existing files into placeholder files, and then continued actually downloading files when the network connection was restored. + + +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment new file mode 100644 index 000000000..33e85c772 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-03T01:17:39Z" + content=""" +I don't understand what you mean by \"The assistant autorecovered my work repo before I noticed\". What repo is the work repo, and how could the assistant \"autorecover\" it, and what did it do? + +At this point, I am completely in the dark about whether you're reporting a problem, and what the problem is. +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment new file mode 100644 index 000000000..af31edcf8 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2013-10-31T10:03:01Z" + content=""" +Of course, the autorecovery wouldn't affect the daemon.log from the work machine... so here they are: http://capocasa.name/work-desktop-ubuntu-12.04-daemonlog.tgz +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment new file mode 100644 index 000000000..7e611cebd --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2013-11-19T09:48:26Z" + content=""" +Sorry, missed the comment. + +My work repo is the repository on my work laptop, where deletions got synced to. + +Git annex had then run repository repair automatically, so the odd symlinks where no longer there for me to check out. + +It is possible that I ran some git commands in direct mode I shouldn't have; I put the files back in and it's working nicely now. So this might have been a \"no direct mode guard\" issue. + +"""]] diff --git a/doc/bugs/Could_not_read_from_remote_repository.mdwn b/doc/bugs/Could_not_read_from_remote_repository.mdwn new file mode 100644 index 000000000..46391e660 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +I've been using git-annex for a few weeks now, and everything was working fine until today. Now, when git-annex goes to sync my files, it will hang for a while, and then display a red box on the left side, saying `! Synced with adam.liter`. So, basically, it doesn't really sync. The logs say that it cannot read from the remote repository, which is set up on box.com and was working just fine until today. + +I've tried reconfiguring my jabber account on all my devices with git-annex as well as deleting and remaking the box.com repository, and none of these steps have solved the problem. + +### What steps will reproduce the problem? + +Making changes to any file located in the repository. + +### What version of git-annex are you using? On what operating system? + +Mac OS X 10.8.4 and git-annex version 4.20130801-gc88bbc4. + +### Please provide any additional information below. + +[[!format sh """ +[2013-09-09 01:33:03 EDT] XMPPSendPack: Syncing with adam.liter +Already up-to-date. +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +"""]] + +[[!meta title="xmpp syncing sometimes fails"]] + +[[!tag confirmed]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment new file mode 100644 index 000000000..c236beacd --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T06:01:18Z" + content=""" +From the small bit of log posted, it seems to be failing to sync over XMPP. Perhaps the XMPP server is down or it cannot connect? You can turn on debugging to get a lot more debugging about XMPP sync attempts. +"""]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment new file mode 100644 index 000000000..8312bb3a3 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgH7oNEqNbh3g-N1-UHXuqleXaRYDgj1U" + nickname="Adam" + subject="comment 2" + date="2013-09-09T06:12:44Z" + content=""" +This is what is in the logs after I turned on debugging: + + [2013-09-09 02:04:22 EDT] XMPPSendPack: finished running push Pushing \"a29\" (PushRequest (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) True + [2013-09-09 02:04:22 EDT] XMPPSendPack: started running push Pushing \"a29\" (PushRequest (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) + [2013-09-09 02:04:22 EDT] read: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"symbolic-ref\",\"HEAD\"] + [2013-09-09 02:04:22 EDT] read: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"show-ref\",\"refs/heads/master\"] + [2013-09-09 02:04:22 EDT] call: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"branch\",\"-f\",\"synced/master\"] + [2013-09-09 02:04:22 EDT] XMPPSendPack: Syncing with adam.liter + [2013-09-09 02:04:22 EDT] call: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"push\",\"adam.liter\",\"git-annex:refs/synced/6258750b-9b0d-4f05-b443-61f4fb0a3f66/YWRhbS5saXRlckBnbWFpbC5jb20=/git-annex\",\"refs/heads/master:refs/synced/6258750b-9b0d-4f05-b443-61f4fb0a3f66/YWRhbS5saXRlckBnbWFpbC5jb20=/master\"] + [2013-09-09 02:04:22 EDT] XMPPClient: sending: Pushing \"a29\" (StartingPush (UUID \"6258750b-9b0d-4f05-b443-61f4fb0a3f66\")) + [2013-09-09 02:04:22 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPReceivePack: timeout waiting for git send-pack output via XMPP + fatal: The remote end hung up unexpectedly + [2013-09-09 02:04:23 EDT] XMPPReceivePack: finished running push Pushing \"a29\" (StartingPush (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) True + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackDone (ExitFailure 128)) + [2013-09-09 02:04:23 EDT] XMPPReceivePack: started running push Pushing \"a29\" (StartingPush (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPReceivePack: Syncing with adam.liter + [2013-09-09 02:04:23 EDT] chat: git [\"receive-pack\",\"/Users/adamliter/Library/texmf\"] + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackOutput 1 \"\") + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackOutput 2 \"\") + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPClient: received: [\"Pushing \\"a29\\" (StartingPush (UUID \\"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\\"))\"] + [2013-09-09 02:04:23 EDT] XMPPClient: received: [\"Unknown message\"] + + + + +"""]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment new file mode 100644 index 000000000..a8d2705a6 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" + nickname="Charl" + subject="Could it be gmail.com XMPP throttling?" + date="2014-03-23T19:26:08Z" + content=""" +I was seeing similar error messages, until I registered for a different XMPP account at jabber.de and started using that instead of my gmail.com account. + +My current suspicion is that it could be Google performing throttling on their XMPP service. See here: http://stackoverflow.com/questions/1843837/what-is-the-throttling-rate-that-gtalk-applies-to-xmpp-messages + +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn new file mode 100644 index 000000000..b239c0a40 --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. +The watcher crashes. + +I only need to restart the thread in the pop-up to get everything to work again, but I'm reporting just in case that this issue has any other implications. + + +### What steps will reproduce the problem? +I open the webapp and in the minutes before it starts syncing (syncing is enabled) I disable it (clicking in the 'syncing enabled' text). + +This produces a crash every time. + + +### What version of git-annex are you using? On what operating system? +5.20140320 in Debian sid and testing + + +### Please provide any additional information below. +This is all I can see in the logs + +[[!format sh """ +Watcher crashed: PauseWatcher +[2014-03-26 08:54:57 CET] Watcher: warning Watcher crashed: PauseWatcher +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment new file mode 100644 index 000000000..ce4af5caa --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:36:00Z" + content=""" +How did you install git-annex? Is this Debian Linux? + +I have not been able to reproduce a crash. It's indeed the case that a PauseWatcher exception is thrown, but the Watcher explicitly catches that exception. +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment new file mode 100644 index 000000000..07efa451d --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2014-04-01T08:04:51Z" + content=""" +Yes, this is Debian Linux and I've been able to reproduce it in i386 and amd64. git-annex is installed from the Debian repositories. + +I'll try to continue testing the issue and will report back if I can find any useful info. +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment new file mode 100644 index 000000000..60f82a5b3 --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 3" + date="2014-04-02T20:38:12Z" + content=""" +So we have the same version of git-annex from the same build, and only you see the problem. Hmm.. + +You mentioned that you see the problem if you disable syncing at a particular time. Does it only crash at that time, or at any time? + +If you create a brand new empty repository and run the webapp in it, can you reporoduce the problem there? Ie, \"mkdir test; cd test; git init; git annex init; git annex webapp\" +"""]] diff --git a/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn b/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn new file mode 100644 index 000000000..f82f914ff --- /dev/null +++ b/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn @@ -0,0 +1,53 @@ +### Please describe the problem. +When creating a https webdav repository under openbsd it complains that /etc/ssl/certs doesn't exist. This is true considering all certs are stored in /etc/ssl/cert.pem. +After /etc/ssl/certs is created it complains about that the certificate has an unknown CA, for obvious reasons. + +A workaround is to symlink /etc/ssl/cert.pem in /etc/ssl/certs + +### What steps will reproduce the problem? +See below + +### What version of git-annex are you using? On what operating system? +5.20140129 under OpenBSD 5.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +WEBDAV_USERNAME= WEBDAV_PASSWORD= git annex initremote box.com type=webdav url=https://dav.box.com/dav/Documents chunksize=100mb encryption=hybrid keyid= mac=HMACSHA512 +initremote box.com (encryption setup) (hybrid cipher with gpg key ) (testing WebDAV server...) + +git-annex: WebDAV failed to write file: /etc/ssl/certs/: getDirectoryContents: does not exist (No such file or directory): user error +failed +git-annex: initremote: 1 failed + + +# End of transcript or log. +"""]] + +> This needs to be fixed in the haskell certificate library. +> I have filed a bug there: +> +> +> Patch would probably be pretty simple. Based on description, something like +> this: + +[[!format patch """ +diff --git a/System/Certificate/X509/Unix.hs b/System/Certificate/X509/Unix.hs +index 8463465..74316e9 100644 +--- a/System/Certificate/X509/Unix.hs ++++ b/System/Certificate/X509/Unix.hs +@@ -50,7 +50,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) + + getSystemCertificateStore :: IO CertificateStore +-getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) ++getSystemCertificateStore = makeCertificateStore <$> readCertificates "/etc/ssl/cert.pem" + + getSystemPath :: IO FilePath + getSystemPath = E.catch (getEnv envPathOverride) inDefault +"""]] + +> +> [[closing|done]] as no changes to git-annex can fix this. --[[Joey]] diff --git a/doc/bugs/Creating_a_remote_located_in___34____126____47__wherever__34___works_incorrectly.mdwn b/doc/bugs/Creating_a_remote_located_in___34____126____47__wherever__34___works_incorrectly.mdwn new file mode 100644 index 000000000..7d100929d --- /dev/null +++ b/doc/bugs/Creating_a_remote_located_in___34____126____47__wherever__34___works_incorrectly.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +When creating a new remote with the webapp (on Windows) and setting the remote repository directory as "~/wherever", everything seems to be going well up until pressing the button to create an unencrypted repository. There is no output from either the terminal or error messages displayed in the browser. + +On the remote server, it turns out that it is creating a directory named ~ within $HOME so that there is a $HOME/~/wherever directory. + +Omitting the leading ~/ correctly creates $HOME/wherever and the setup proceeds as it should. + +### What steps will reproduce the problem? + +Try to create a remote repository with directory "~/wherever". + +### What version of git-annex are you using? On what operating system? + +OS: Windows 7 + +Output of git annex version: + +git-annex version: 5.20140517-gee56d21 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feed +s Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SH +A256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar ho +ok external + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn b/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn new file mode 100644 index 000000000..611e86d61 --- /dev/null +++ b/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? + +Don't have gpg installed/on your $PATH, and attempt to create an encrypted S3 remote via the web interface. + +What is the expected output? What do you see instead? + +Expected to be told to install GPG. Actual output was a Yesod error: + +Internal Server Error +user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127) + +What version of git-annex are you using? On what operating system? + +3.20130107 on Fedora 17 (64-bit). + +Please provide any additional information below. + +[[!tag /design/assistant]] +[[!tag confirmed]] diff --git a/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn b/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn new file mode 100644 index 000000000..28b74bd98 --- /dev/null +++ b/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. +Using the git-annex webapp in remote mode will forward to the wrong IP (localhost) when creating the second repository + +### What steps will reproduce the problem? +Needs two computers (C1, C2) + +- C1: run "git-annex webapp --listen=[IP of C1] +- C2: use a browser to go to the address you just got on C1 (should contain IP of C1) +- C2: create an repository as prompted (should work fine) +- C2: In the dropdown on the top right select "Add another repository", choose desired location, select keep separate +- C2: Browser forwards to new address, but instead of the IP of C1, 127.0.0.1 is used (which obviously fails) + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git-annex version +git-annex version: 4.20130802 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +$ lsb_release -d +Description: Ubuntu 13.04 +$ uname -a +Linux nas 3.8.0-27-generic #40-Ubuntu SMP Tue Jul 9 00:19:35 UTC 2013 i686 i686 i686 GNU/Linux +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> This is a different effect of the same bug in [[Hangs on creating repository when using --listen]]. Closing as [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn new file mode 100644 index 000000000..64ae859e2 --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. +If have a directory - mounted CIF share (windows server with domain). +If i run "git annex assistant" or "git annex watch" daemon starts fine and works at first, but then after some time stops doing anything: no messages in .git/annex/daemon.log, process hangs in ps aux. + +If i try to "cat .git/annex/daemon.pid" I get "permission denied". And permission is denied for everyone: root, from other windows machines, etc. + +If i then kill daemon process and start daemon again everything repeats. + +### What version of git-annex are you using? On what operating system? +Standalone git-annex 5.20140421-g515d251 on CentOS 6.5 + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_1_2a5fb522cbf6e2cefbee0a5fc48287d0._comment b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_1_2a5fb522cbf6e2cefbee0a5fc48287d0._comment new file mode 100644 index 000000000..d247667c4 --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_1_2a5fb522cbf6e2cefbee0a5fc48287d0._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaB2n9HFclAvyMyDzvTPaifh5OrlF51Co" + nickname="VS7" + subject="comment 1" + date="2014-05-21T07:17:44Z" + content=""" +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ ps aux | grep assistant +filesync 27036 0.0 0.0 103244 864 pts/0 S+ 11:13 0:00 grep assistant +\"\"\"]] +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ git annex assistant +\"\"\"]] +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ cat .git/annex/daemon.log +[2014-05-21 11:14:06 MSK] main: starting assistant version 5.20140421-g515d251 +[2014-05-21 11:14:07 MSK] Cronner: You should enable consistency checking to protect your data. +failed to add watch on directory /home/filesync/.config/git-annex (/home/filesync/.config/git-annex: getDirectoryContents: does not exist (No such file or directory)) + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = \"runClient: unable to determine DBUS address\", clientErrorFatal = True}) +p11-kit: couldn't load module: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-trust.so: cannot open shared object file: No such file or directory + + No known network monitor available through dbus; falling back to polling +[2014-05-21 11:14:09 MSK] Upgrader: An upgrade of git-annex is available. (version 5.20140517) + +Already up-to-date. +(scanning...) [2014-05-21 11:14:09 MSK] Watcher: Performing startup scan +\"\"\"]] +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ git annex assistant --stop + +git-annex: /home/filesync/manuals/.git/annex/daemon.pid: hGetContents: permission denied (Permission denied) +failed +git-annex: assistant: 1 failed +\"\"\"]] +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ cat .git/annex/daemon.pid +cat: .git/annex/daemon.pid: Permission denied +\"\"\"]] +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ ps aux | grep assistant +filesync 27060 6.2 0.5 566372 41808 ? Sl 11:14 0:04 /home/filesync/git-annex.linux//lib64/ld-linux-x86-64.so.2 --library-path /home/filesync/git-annex.linux//usr/lib/x86_64-linux-gnu/gconv:/home/filesync/git-annex.linux//usr/lib/x86_64-linux-gnu/audit:/home/filesync/git-annex.linux//etc/ld.so.conf.d:/home/filesync/git-annex.linux//usr/lib:/home/filesync/git-annex.linux//usr/lib/x86_64-linux-gnu:/home/filesync/git-annex.linux//lib64:/home/filesync/git-annex.linux//lib/x86_64-linux-gnu: /home/filesync/git-annex.linux/shimmed/git-annex/git-annex assistant +filesync 27115 0.0 0.0 103244 864 pts/0 S+ 11:15 0:00 grep assistant +\"\"\"]] +"""]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_2_6b8d35d464e248c29764e3adbc1c9bae._comment b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_2_6b8d35d464e248c29764e3adbc1c9bae._comment new file mode 100644 index 000000000..9f0687c62 --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_2_6b8d35d464e248c29764e3adbc1c9bae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 2" + date="2014-05-21T17:11:27Z" + content=""" +It seems to me that your filesystem is broken. +"""]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_3_e134ba74ec996a419d6f9903871b9b03._comment b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_3_e134ba74ec996a419d6f9903871b9b03._comment new file mode 100644 index 000000000..a4b6d8740 --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_3_e134ba74ec996a419d6f9903871b9b03._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaB2n9HFclAvyMyDzvTPaifh5OrlF51Co" + nickname="VS7" + subject="comment 3" + date="2014-05-22T07:23:23Z" + content=""" +*1. Windows Server 2012, deduplication is on.* +[[!format sh \"\"\" +[filesync@ServiceVM00001 manuals]$ ps aux | grep assist +filesync 1222 0.0 0.0 103244 860 pts/0 S+ 11:20 0:00 grep assist +[filesync@ServiceVM00001 manuals]$ git annex assistant +[filesync@ServiceVM00001 manuals]$ cat .git/annex/daemon.pid +1250[filesync@ServiceVM00001 manuals]$ git annex assistant + +git-annex: /home/filesync/manuals/.git/annex/daemon.pid: hGetContents: permission denied (Permission denied) +failed +git-annex: assistant: 1 failed +[filesync@ServiceVM00001 manuals]$ cat .git/annex/daemon.pid +cat: .git/annex/daemon.pid: Permission denied +\"\"\"]] + +*2. Windows 7 Pro, no deduplication.* +[[!format sh \"\"\" +[filesync@ServiceVM00001 test]$ ps aux | grep assistant +filesync 655 0.0 0.0 103244 856 pts/0 S+ 11:18 0:00 grep assistant +[filesync@ServiceVM00001 test]$ git annex assistant +[filesync@ServiceVM00001 test]$ cat .git/annex/daemon.pid +cat: .git/annex/daemon.pid: Permission denied +[filesync@ServiceVM00001 test]$ git annex assistant + +git-annex: /home/filesync/test/.git/annex/daemon.pid: hGetContents: permission denied (Permission denied) +failed +git-annex: assistant: 1 failed +\"\"\"]] + +*3. Local directory. Normal behavior* +[[!format sh \"\"\" +[filesync@ServiceVM00001 test1]$ ps aux | grep assist +filesync 1315 0.0 0.0 103244 856 pts/0 R+ 11:23 0:00 grep assist +[filesync@ServiceVM00001 test1]$ git annex assistant +[filesync@ServiceVM00001 test1]$ cat .git/annex/daemon.pid +1338[filesync@ServiceVM00001 test1]$ git annex assistant +git-annex: Daemon is already running. +[filesync@ServiceVM00001 test1]$ cat .git/annex/daemon.pid +1338 +\"\"\"]] +"""]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_4_2ad592d92dda2d1e78235bad5764f5d9._comment b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_4_2ad592d92dda2d1e78235bad5764f5d9._comment new file mode 100644 index 000000000..ad225a9a8 --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_4_2ad592d92dda2d1e78235bad5764f5d9._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaB2n9HFclAvyMyDzvTPaifh5OrlF51Co" + nickname="VS7" + subject="comment 4" + date="2014-05-22T09:44:33Z" + content=""" +Now i begin to suspect that daemon doesn't work with CIF mounted directories at all. + + mkdir ~/test-container + mkdir ~/test-container/test + mount -t cifs -o user=test_user,uid=502,gid=502 //srv/test ~/test-container/test + cd ~/test-container + git init + git annex init + git annex direct + git annex add + git annex sync + git annex assistant + +Then if i place any file in ~/test-container then git-annex sees changes and processes it almost immediately. But if i do anything inside mounted ~/test-container/test daemon ignores it. +\"git annex status\" says that yes there are changes inside \"~/test-container/test\" and i can commit them via \"git annex add\" & \"git annex sync\", but daemon ignores. +"""]] diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_5_42ad8c7944c210ac1be812e463e03d7c._comment b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_5_42ad8c7944c210ac1be812e463e03d7c._comment new file mode 100644 index 000000000..6061f7d7b --- /dev/null +++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share/comment_5_42ad8c7944c210ac1be812e463e03d7c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 5" + date="2014-05-23T14:34:34Z" + content=""" +My point is that if the filesystem is rejecting all attempts to access it with \"permission denied\", it's hardly surprising that git-annex doesn't work, since nothing works. If running the assistant somehow causes the filesystem to get into this strange broken state, then you have a nice repoducible bug to report on the filesystem, I suppose. I don't see how it could be a bug in git-annex, since it is using only standard posix filesystem system calls, plus inotify. + +Based on this, samba/CIFS does not support inotify: +Thus, the assistant won't work on it. + +If I were you, I'd set up git-annex repositories on local filesystems, and let it take care of the syncronosation, rather than using a networked filesystem. +"""]] diff --git a/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn new file mode 100644 index 000000000..0899ea467 --- /dev/null +++ b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +I created a remote repo on ssh server with the same git-annex version, no personal ssh keys for the repo (password authentication). But I put ~ in front of the repo name so it created in different place than I wanted. I deleted it from assistant and then deleted the remote repo dir. When I added it with the correct path again it always asks for server password (it has some old annex pub key in authorized_keys, but not the new one; it might have been prompted for the password also with the initial repo). During the whole thing it failed to connect a few times due to wrong password or me realizing too late that it asks for yet another one and it generated keys few times, but ultimately didn't put the last one in remote's authorized_keys. + +### What steps will reproduce the problem? +Create, delete and create again a new repo on remote ssh server with password auth. + +### What version of git-annex are you using? On what operating system? +git-annex 4.20130601 Gentoo amd64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment new file mode 100644 index 000000000..84686f1e4 --- /dev/null +++ b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T18:20:05Z" + content=""" +It's true that deleting a ssh repository in the webapp does not delete any ssh keys that the webapp configured to access that repository. I'm a bit reluctant to try to clean it up entirely automatically, because the ssh configuration might have been manually altered, or might be used by another local repository. Particularly, if another local repo is set up to use the same ssh remote, the webapp will reuse the ssh key. + +> Create, delete and create again a new repo on remote ssh server with password auth. + +I tried doing this, and did not encounter any problem. Since the new repo had a different path on the ssh server, I simply ended up with two ssh keys configured in `~/.ssh/config` for two different repositories. The presence or absence of the first key did not affect the second key. + +I think you need to go into more detail about exactly what you did, or show the files in .ssh that were set up, so I can see what the actual problem is. +"""]] diff --git a/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn b/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn new file mode 100644 index 000000000..10b25d774 --- /dev/null +++ b/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +When a repository is set in direct mode it will still replace files with symlinks when it becomes aware of a change but still hasn't been able to sync the file contents. This can create repositories that are temporarily unusable with files replaced with broken symlinks. + +### What steps will reproduce the problem? + +1. Create two repositories with each other as remotes +2. Run the assistant on both +3. Create some file changes in one and watch the directory in another. +4. For a brief (or sometimes long) time the destination repository will have it's old version of the file replaced by a broken symlink + +This is particularly noticeable when using XMPP as it can often be the case that the two repositories can't connect to each other directly but can talk through XMPP. This breaks using git-annex in direct mode for things like having a synced config directory across machines. Something like having "~/.bashrc" linked into "~/annex-repository/bashrc", doesn't work as there will be times when a machine is broken because .bashrc is linked to a broken symlink while it fetches a new version. + +The desired behavior would be to have git-annex in direct mode only replace older versions of files with newer versions of files. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + +[[!meta title="git-annex does not guarantee modified files are available when merging with a new version of a repository"]] + +[[!tag confirmed]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex.mdwn b/doc/bugs/Disconcerting_warning_from_git-annex.mdwn new file mode 100644 index 000000000..ef662441c --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex.mdwn @@ -0,0 +1,8 @@ +I did a "git annex add" of a bunch of files on a storage server with low IOPS, and saw this: + + git-annex: /tank/Media/Pictures/.git/annex/tmp/430_32b_SHA256E-s4464838--c1785a76ee1451f602e93c99c147e214705004e541de8256d74a3be3717d15e5.jpg.log: openBinaryFile: resource busy (file is locked) +failed + +How is that even possible, when the server is doing nothing else? + +[[!tag moreinfo]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment new file mode 100644 index 000000000..3076b38de --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-05T21:13:09Z" + content=""" +Is this a Solaris system? +"""]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment new file mode 100644 index 000000000..96d495e66 --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-01-20T03:38:43Z" + content=""" +No, it's CentOS 6.3 x86_64., +"""]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment new file mode 100644 index 000000000..142e6ecd1 --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="moreinfo" + date="2014-03-19T20:49:47Z" + content=""" +What I don't understand about this is, how does `open` fail due to a file being locked? This is Linux, it doesn't have mandatory locking that I know of, and git-annex certianly doesn't use such a thing. + +I really need a way to reproduce this and/or a strace. As it is, I've never seen this reported by anyone else and don't understand the failure mode at all. + +The relevant part of the code seems to be here: + +[[!format haskell \"\"\" +setJournalFile :: JournalLocked -> FilePath -> String -> Annex () +setJournalFile _jl file content = do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory =<< fromRepo gitAnnexJournalDir + createAnnexDirectory tmp + -- journal file is written atomically + jfile <- fromRepo $ journalFile file + let tmpfile = tmp takeFileName jfile + liftIO $ do + writeBinaryFile tmpfile content + moveFile tmpfile jfile +\"\"\"]] + +While there is some ctnl locking going on, it locks a special sentinal file, not the file it's writing to. +"""]] diff --git a/doc/bugs/Drop_--from_always_trusts_local_repository.mdwn b/doc/bugs/Drop_--from_always_trusts_local_repository.mdwn new file mode 100644 index 000000000..53bdda332 --- /dev/null +++ b/doc/bugs/Drop_--from_always_trusts_local_repository.mdwn @@ -0,0 +1,46 @@ +### Please describe the problem. + +The command `git annex drop --from` always trusts the local repository, even if +it is marked as untrusted. + + +### What steps will reproduce the problem? +[[!format sh """ +mkdir t u; cd t; git init; git commit --allow-empty -m "Initial commit"; git annex init "Trusted"; date > file; git annex add file; git commit -m "Add file"; cd ../u; git init; git remote add t ../t; git fetch t; git merge t/master; git annex init "Untrusted"; git annex untrust .; git annex get file; cd ../t; git remote add u ../u; git fetch u; cd .. +"""]] + +Create two repositories, *t* (trusted) and *u* (untrusted). A file is in both +repositories. When performing `git annex drop file` in repository *t*, `git +annex` will abort because there are not enough copies. But when performing `git +annex drop --from t file` in *u*, git annex will delete the copy. + + +### What version of git-annex are you using? On what operating system? + +Bug was introduced with 6c31e3a8 and still exists in current master (d955cfe7). + + +### Please provide any additional information below. + +The following change seems to solve the problem. (First time working with +Haskell, please excuse the crude code.) + +[[!format diff """ +diff --git a/Command/Drop.hs b/Command/Drop.hs +index 269c4c2..09ea99a 100644 +--- a/Command/Drop.hs ++++ b/Command/Drop.hs +@@ -82,8 +82,9 @@ performRemote key afile numcopies remote = lockContent key $ do + (remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key + present <- inAnnex key + u <- getUUID ++ level <- lookupTrust u + let have = filter (/= uuid) $ +- if present then u:trusteduuids else trusteduuids ++ if present && level <= SemiTrusted then u:trusteduuids else trusteduuids + untrusteduuids <- trustGet UnTrusted + let tocheck = filter (/= remote) $ + Remote.remotesWithoutUUID remotes (have++untrusteduuids) +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn b/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn new file mode 100644 index 000000000..8562f2339 --- /dev/null +++ b/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn @@ -0,0 +1,4 @@ +### Please describe the problem. +When you rename, move or delete a folder (with files in it) the old folder doesn't get deleted in the other clients + +[[!tag moreinfo]] diff --git a/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment b/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment new file mode 100644 index 000000000..e32059fb6 --- /dev/null +++ b/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T19:16:34Z" + content=""" +I can't reproduce this. Tested in direct mode (which I assume you're using, but you didn't say), using both command-line `git annex sync`, and using the assistant. In all cases, when the last file in a directory was removed, the directory was deleted. + +Please write back with a version number, and an example showing the problem happening. +"""]] diff --git a/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn new file mode 100644 index 000000000..823466f65 --- /dev/null +++ b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? + +Add two remote repositories to same server using ssh. Each directory is added to repositories list and starts syncing. +After both repositories are scanned click on "syncing enabled" to disable syncing for one of the two remote repositories. + +What is the expected output? What do you see instead? + +Only remote repository which i clicked should stop syncing, but both remote repos start to stop syncing. +Its also working the other way around (enable -> pause -> enable -> ..) + +What version of git-annex are you using? On what operating system? + +Version: 4.20130314, Debian + +Please provide any additional information below. + +I am an "webinterface only" user. + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment new file mode 100644 index 000000000..d25a46a98 --- /dev/null +++ b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-16T21:56:37Z" + content=""" +Hmm, I can't quite reproduce this, but I did just fix a bug that, among other manifestations, caused the display of whether syncing is enabled for a remote to be wrong sometimes. + +Can you send a copy of your repository's .git/config file to this bug report? (That's `annex/.git/config`) +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts.mdwn b/doc/bugs/Endless_SSH_password_prompts.mdwn new file mode 100644 index 000000000..fad730a1b --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +Yesterday I installed git-annex on two computers and paired their repos. Today I logged back in to one of them, and as soon as the webapp loaded (autostarted in the background), it popped up an OpenSSH prompt wanting my key's password. I typed it in, and it popped up another. This went on several times. When I hit Cancel instead, it popped up a prompt wanting the password for the user account on my other computer. Even with that, once wasn't enough. + +This is bad enough, but worse is that the password prompt captures the keyboard input so I can't even open my Yakuake console to kill git-annex. Well, it's difficult and requires hitting Escape rapidly over and over until I can squeeze in a keystroke to the rest of the system. + +I don't understand why this is happening. + +1. Shouldn't git-annex have installed a passwordless key on my paired system? It did that for my remote repo. + +2. The prompt it's using has no option to remember the pasword. I use ssh-agent, but usually by running ssh-add in a terminal. Maybe if it would use a prompt that works with the agent it wouldn't ask for the password multiple times. + +3. I think it's opening multiple SSH connections at once, before I've entered the password even once, so even after I enter the password, it will keep asking for it until I've entered it for every SSH process that was already started. + +### What version of git-annex are you using? On what operating system? +1 Nov 2013 Linux tarball on Ubuntu Raring 13.04 + +> [[fixed|done]]; assistant now sets `StrictHostKeyChecking yes` +> when creating ssh remotes. It also fixes up any ssh remotes it already +> created to have that setting (unless StrictHostKeyChecking is already +> being set). +> +> So, when the host key changes, syncing with the remote will now fail, +> rather than letting ssh prompt for the y/n response. In the local +> pairing case, this is completely right, when on a different lan +> and it tries to communicate with the wrong host there. OTOH, if the ssh +> key of a ssh server has really changed, the assistant does not currently +> help dealing with that. +> +> Any ssh remotes not set up by the assistant are left as-is, so this +> could still happen if the ssh host key of such a ssh remote changes. +> I'll assume that if someone can set up their ssh remotes at the command +> line, they can also read the dialog box ssh pops up, ignore the +> misleading "passphrase request" in the title, and see that it's actually +> prompting about a host key change. --[[Joey]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment b/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment new file mode 100644 index 000000000..b1ea71526 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T00:29:14Z" + content=""" +Pairing sets up the same kind of dedicated passwordless ssh key that is used when adding a ssh server. + +It's not clear from your description what program is asking for the password, or even if it's asking for the password for a ssh key. You need to provide more details. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment b/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment new file mode 100644 index 000000000..fec729ddb --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-03T00:39:38Z" + content=""" +I'm not sure which program is doing the asking either. The title bar says \"OpenSSH\". It is asking for the SSH key password, but if I dismiss the dialog without entering the password, it will open another dialog asking for the user account's password, e.g. me@laptop, indicating it's SSH falling back to password auth. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment b/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment new file mode 100644 index 000000000..aacf1cc01 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlHNJ7FpiXJNwSmojlwKwXhhF5QvwpNPmI" + nickname="Colin" + subject="Confirmed" + date="2013-11-14T17:57:23Z" + content=""" +I am seeing the same problem. It happened on a machine running git-annex on Debian Testing some weeks ago, and I eventually disabled the offending repository for my sanity (incidentally - it seems to have vanished so I don't know how to re-enable it apart from adding it again). + +It has just very recently (some days) started on this machine running Debian Unstable. + +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment b/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment new file mode 100644 index 000000000..0a182f310 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="similar" + date="2013-12-02T01:39:36Z" + content=""" +I am having a similar issue here. The problem is that the assistant is started along with my regular session, but the SSH keys required for the assistant to sync are prompted during my session startup. So I actually get lots of prompts, because the assistant is started before I have time to enter the password for my SSH key. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment b/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment new file mode 100644 index 000000000..7990d0ff2 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkdiXn5s1wX2Zncy1S7_h-yPTv2gt0bmmY" + nickname="Jacob" + subject="Same problem on ubuntu" + date="2013-12-15T14:22:55Z" + content=""" +Same problem, I even manually setup ssh keys between the two servers but it just loops and keeps asking for a password every sync. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment b/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment new file mode 100644 index 000000000..863756a00 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 6" + date="2013-12-19T16:36:55Z" + content=""" +Taking a screenshot, and running `ps -fax` to find what programs are +running, seem like the logical first steps to get anywhere on this +problem. + +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment b/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment new file mode 100644 index 000000000..c135989b0 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 7" + date="2013-12-19T17:54:33Z" + content=""" +Seems likely that this is ssh prompting that the host key has changed. The dialog box has \"password\" at the top, but if you actually read it, it's prompting for a yes/no response to a host key change. + +So, I probably need to turn on StrictHostKeyChecking. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn new file mode 100644 index 000000000..67dfae11d --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn @@ -0,0 +1,39 @@ +What steps will reproduce the problem? + +1. Click "Remote server: Set up a repository on a remote server using ssh." +2. Enter hostname and different username than currently logged in user +3. Click check this server + + +What is the expected output? + +> I expected to see the next step in the remote repo creration process. + +What do you see instead? + + +> Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied (publickey,password). + + +What version of git-annex are you using? + +> git-annex: Version: 3.20130114 + + +On what operating system? + +> OSX: 10.8.2 + + + +Please provide any additional information below. + +> I mentioned "with a different username" because the assistant will allow me to create a remote repository on the same target machine when I use my normal username. I think this is most likely because I have a ssh-key setup for the account on the remote machine. However I do not want to assume anything and send you down the wrong OSX rabbit hole. + +> After a little research it seems that OSX does not have a ssh-askpass + +[[!tag /design/assistant/OSX]] +[[!meta title="ssh-askpass not available on OSX"]] + +> [[fixed|done]]; the webapp now handles ssh password prompting on its own, +> ssh-askpass is not needed. --[[Joey]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment new file mode 100644 index 000000000..8b701250c --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-05T19:45:24Z" + content=""" +It should be possible to use SSHPassKey as described here: + +However, this all seems pretty crummy, and so perhaps it would be worth it for the webapp to do its own ssh password prompting when setting up a remote. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment new file mode 100644 index 000000000..f0d25d778 --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Peng" + ip="171.37.79.254" + subject="Found an easy solution" + date="2013-06-15T03:34:52Z" + content=""" +Just install this script on OS X, and you'll get the ssh-askpass command. + +https://github.com/markcarver/mac-ssh-askpass + +Tested working successfully on OS X 10.8.3. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment new file mode 100644 index 000000000..e22ca1ff9 --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnb4NsPsSSHTniueRuVnBzTLrDiDqBZIfY" + nickname="Doug" + subject="Same problem but still does not work with askpass installed" + date="2013-07-24T18:19:25Z" + content=""" +So, I got askpass installed and I'm still getting the same error as everybody else. It's a strange thing as I have my public key dumped on the remote server and I can log in fine manually. It's an empty passphrase so there shouldn't be any prompting going on. +"""]] diff --git a/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name.mdwn b/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name.mdwn new file mode 100644 index 000000000..1abe3e691 --- /dev/null +++ b/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. + +git-annex build on Windows does not complete when user name has a space in it + +### What steps will reproduce the problem? + +Build git-annex from scratch as described on the Windows page of the guide when running as user Joe Blogs + + +### What version of git-annex are you using? On what operating system? + +Windows 7 Prof, Cygwin install on 28/5/2014 + +### Please provide any additional information below. + +The problem arises in escapeDosPaths of EvilLinker: windows usernames can have spaces in them which also need escaping + +[[!tag confirmed]] diff --git a/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name/comment_1_6b289221a65a750444b1b5850df3386c._comment b/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name/comment_1_6b289221a65a750444b1b5850df3386c._comment new file mode 100644 index 000000000..db335239b --- /dev/null +++ b/doc/bugs/EvilLinker_needs_to_escape_spaces_in_user_name/comment_1_6b289221a65a750444b1b5850df3386c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-28T22:29:05Z" + content=""" +Unfortunately, this is fairly intractable. It would be more productive to fix the [ghc bug](https://ghc.haskell.org/trac/ghc/ticket/8596) that the EvilLinker works around. + +Recommend building in a different directory in the meantime. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications.mdwn b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications.mdwn new file mode 100644 index 000000000..d4dcc26e3 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications.mdwn @@ -0,0 +1,138 @@ +The Date resolution of the FAT filesystem is only 2 seconds for the "last modified time." +This leads to the strange behaviour, that after umount and remount of an usb drive (direct mode) git-annex thinks that suddenly approx. 50% of +the files are modified. (after remount the "seconds" appears to be rounded to even values - the inode cache before unmount had 1 second resolution) So git-annex is not real "guilty" but it would be fine to create a "workaround" for this problem... + +Possible the best solution for this is to set even values for the seconds in the filesystem and in annex internal tables direct after the `git annex get`. +Other solution would be to treat differences up to 1s in modification time as unmodified or create an new parameter like rsync's "modify-window" for this. To do an `git annex sync` or `git annex add` is in my opinion not a good option, because one could add so Bad file content by accident... + +Here's an konsole session to show this behaviour: + + $ mount /mnt/transfer/ + $ git clone source/ /mnt/transfer/transfer-repo + + Klone nach '/mnt/transfer/transfer-repo'... + Fertig. + + $ cd /mnt/transfer/transfer-repo/ + $ git annex init "test" + + init test + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + ok + (Recording state in git...) + + $ git annex group here transfer + + group here (merging origin/git-annex into git-annex...) + (Recording state in git...) + ok + (Recording state in git...) + + $ git annex wanted here standard + + wanted here ok + (Recording state in git...) + + $ git annex get --auto + + get n01.mp3 (from origin...) + SHA256E-s1159018--5674452792970dc03e9ba47d3a8af5ad7c8da6b3ca19e8e64b9a4cf462d4a92d.mp3 + 1159018 100% 82.62MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 1159308 bytes received 31 bytes 2318678.00 bytes/sec + total size is 1159018 speedup is 1.00 + ok + + get n02.mp3 (from origin...) + SHA256E-s1622113--03998dc10c4839d5ab9aeaceaa63f0363c9d728aaaca2a2707f025c7b9e920a3.mp3 + 1622113 100% 34.45MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 1622459 bytes received 31 bytes 3244980.00 bytes/sec + total size is 1622113 speedup is 1.00 + ok + + ... + ... + + –--> All 29 files (n01.mp3 to n29.mp3) successfully got + + (Recording state in git...) + + $ git annex status + $ stat * >../stat-before-umount + $ cd / + $ umount /mnt/transfer + $ mount /mnt/transfer + $ cd /mnt/transfer/transfer-repo + $ stat * >../stat-after-remount + $ git annex status + M n05.mp3 + M n10.mp3 + M n11.mp3 + M n13.mp3 + M n16.mp3 + M n17.mp3 + M n20.mp3 + M n22.mp3 + M n23.mp3 + M n24.mp3 + M n26.mp3 + M n27.mp3 + $ diff -u ../stat-before-umount ../stat-after-remount | grep -B8 "+Modifiziert" | grep -E "Datei:|Modifi" + + Datei: „n05.mp3“ + -Modifiziert: 2014-05-03 19:42:39.000000000 +0200 + +Modifiziert: 2014-05-03 19:42:38.000000000 +0200 + + Datei: „n10.mp3“ + -Modifiziert: 2014-05-03 19:43:05.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:04.000000000 +0200 + + Datei: „n11.mp3“ + -Modifiziert: 2014-05-03 19:43:07.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:06.000000000 +0200 + + Datei: „n13.mp3“ + -Modifiziert: 2014-05-03 19:43:15.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:14.000000000 +0200 + + Datei: „n16.mp3“ + -Modifiziert: 2014-05-03 19:43:21.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:20.000000000 +0200 + + Datei: „n17.mp3“ + -Modifiziert: 2014-05-03 19:43:29.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:28.000000000 +0200 + + Datei: „n20.mp3“ + -Modifiziert: 2014-05-03 19:43:53.000000000 +0200 + +Modifiziert: 2014-05-03 19:43:52.000000000 +0200 + + Datei: „n22.mp3“ + -Modifiziert: 2014-05-03 19:44:13.000000000 +0200 + +Modifiziert: 2014-05-03 19:44:12.000000000 +0200 + + Datei: „n23.mp3“ + -Modifiziert: 2014-05-03 19:44:23.000000000 +0200 + +Modifiziert: 2014-05-03 19:44:22.000000000 +0200 + + Datei: „n24.mp3“ + -Modifiziert: 2014-05-03 19:44:31.000000000 +0200 + +Modifiziert: 2014-05-03 19:44:30.000000000 +0200 + + Datei: „n26.mp3“ + -Modifiziert: 2014-05-03 19:44:35.000000000 +0200 + +Modifiziert: 2014-05-03 19:44:34.000000000 +0200 + + Datei: „n27.mp3“ + -Modifiziert: 2014-05-03 19:44:39.000000000 +0200 + +Modifiziert: 2014-05-03 19:44:38.000000000 +0200 + + +> fixed [[done]] --[[Joey]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_10_13a35801805ea3d2d4428b1539f96b16._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_10_13a35801805ea3d2d4428b1539f96b16._comment new file mode 100644 index 000000000..fdd123103 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_10_13a35801805ea3d2d4428b1539f96b16._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="martin" + ip="193.174.111.250" + subject="specification" + date="2014-06-11T05:43:02Z" + content=""" +What you suggested (to not add if exact 1s or exact 1h time difference and changed checksum) would do the trick but it's hard for the user to test if this really works as expected and it would be more secure and IMHO more clear to do it like this: + +If `git annex add` \"meets\" such files, `git annex add` should not really add / commit these pseudo-modified files but *only adapt the timestamps* (which make the software erroneously thinks the files were modified) to the vfat values. (if checksum is still correct) I guess the timestamps are in the annex branch. + +`git annex add` could - instead of write: \"add ok\" - only write: \"corrected timestamp ok - no need to add\" + +So the user sees whats really happen and after this these files appears again as what they are: unmodified. `git annex status` would say nothing (everything fine), and `git annex fsck` would checksum these files again. + +I suppose that the way i suggest is harder to code :-( Unfortunately I'm not a good coder and not experienced in haskell for sending a patch myself / the open source way... + + +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_11_632456a0a1d399ee2bbac76b7d63a5f1._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_11_632456a0a1d399ee2bbac76b7d63a5f1._comment new file mode 100644 index 000000000..2605d69ab --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_11_632456a0a1d399ee2bbac76b7d63a5f1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-06-11T17:22:12Z" + content=""" +@martin, to the best of my knowledge and testing, what you're proposing `git annex add` do in this case is identical to what it already happens to do, except for the message displayed. + +Do you have an example of it not doing that? + +We seem to be talking past one-another, since I've now said three times this is what it does. And I've tested it twice. + +I don't think that the current behavior of add, or your suggested behavior (which again, happens to be nearly identical) is sufficient to close this bug report with. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_12_e4d268f269cc1701736cc5a39719ac20._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_12_e4d268f269cc1701736cc5a39719ac20._comment new file mode 100644 index 000000000..8d06ee857 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_12_e4d268f269cc1701736cc5a39719ac20._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 12" + date="2014-06-11T18:05:48Z" + content=""" +The resolution problem does not seems to affect Windows, at least not on NTFS. In my tests, the mtime is fully preserved across reboots there. + +However, any change to the timezone on Windows does manage to mess up all the timestamps. Presumably this same flawed approach is used for DST adjustments. + +Example from inode cache after a 1 hour time zone change, which forced git-annex add to re-checksum: + +
+--1 2221 1395843799
++-1 2221 1395847399
+
+ +Of course, not all time zones are 1 hour offset, so as a heuristic, treating timestamps +- 60*60*Int as the same, would be pretty bad. Instead, it would probably make sense, on windows, to normalize the timestamp, using the current time zone, to get to the UTC timestamp. (Of course on unix, a file's timestamp is always given in UTC.) + +Unfortunately, Data.Time.LocalTime.getCurrentTimeZone doesn't seem to really work on windows. It always returns UTC+1 in my tests. + +Anyway, I'm now looking at this as two separate problems, the Windows Time Zone Sucks problem and the FAT Metadata Sucks problem. They will probably have different solutions.. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_13_962cd8d7280cbc1d61778d69f3a393f0._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_13_962cd8d7280cbc1d61778d69f3a393f0._comment new file mode 100644 index 000000000..0428fadbd --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_13_962cd8d7280cbc1d61778d69f3a393f0._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="FAT MetaData Sucks: an approach" + date="2014-06-11T18:15:59Z" + content=""" +git-annex already deals with FAT metadata sucking by using the inode sentinal file, to detect when a FAT filesystem has been remounted with new random inodes, and so ignore apparent inode changes. + +So, when a InodeCache is compared in weak mode due to that, it could just treat all mtimes within 2 seconds as the same. This would limit the brain-damange to FAT. + +One problem with this idea is that it's specific to linux's handling of FAT, with its random inodes. A FAT mounted on windows will have -1 for the inodes across remounts. So this method can't detect if a filesystem on windows is FAT, and has the problem, or NTFS and not. + +But, I think the FAT side of this problem is also linux-specific. Linux dummies up good metadata for FAT, and then has to throw it away/degrade on unmount. Windows presumably uses real timestamps, with low resolution on FAT from the beginning. + +I don't know how eg OSX handles this. If it used constant inodes but cached higher resolution mtimes for FAT, this approach would not work there. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_14_5b3bb068b62b12c7cc7504836a8acf32._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_14_5b3bb068b62b12c7cc7504836a8acf32._comment new file mode 100644 index 000000000..e3efdb6d0 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_14_5b3bb068b62b12c7cc7504836a8acf32._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 14" + date="2014-06-11T18:59:49Z" + content=""" +Opened a separate bug for [[Windows_file_timestamp_timezone_madness]]. + +Fixed FAT issue on Linux as discussed in my previous comment. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_15_5271ba4eed013adec8391ddfcc11eda8._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_15_5271ba4eed013adec8391ddfcc11eda8._comment new file mode 100644 index 000000000..cace00555 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_15_5271ba4eed013adec8391ddfcc11eda8._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="martin" + ip="89.183.21.108" + subject="In reply to comment 11" + date="2014-06-12T09:22:53Z" + content=""" +Dear joey, + +thanks a lot for fixing this! + +Only for this protocol (not to have the last word ;-) + +What `git annex add` already does now and what i suggested it could do better is indead the same (result) for uncorrupted files (the frequent case). +But i'am afraid, it could be slightly different if we deal with corrupted files. The preset behaviour would add this file, the suggested behaviour would not... + +But this discussion is history now - i'm lucky :-)) + +Now i do some tests with daylight savings time change - hopefully there are no problems! +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_1_7a536b79bae7d8f897f014d17dbb90b6._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_1_7a536b79bae7d8f897f014d17dbb90b6._comment new file mode 100644 index 000000000..0f23da162 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_1_7a536b79bae7d8f897f014d17dbb90b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 1" + date="2014-05-13T16:50:57Z" + content=""" +A related issue is that a change from/to daylight-saving time will make files appear to be one hour older/younger. A modify-window couldn’t acommodate that. VFAT is really a huge pain… +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_2_349959a6daa722c8350f73feb0b27162._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_2_349959a6daa722c8350f73feb0b27162._comment new file mode 100644 index 000000000..7a78362a3 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_2_349959a6daa722c8350f73feb0b27162._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="martin" + ip="89.183.46.169" + subject="Possible solution?" + date="2014-05-13T17:51:41Z" + content=""" +How about this quick'n dirty vfat compromise: + +For vfat only we do like this (at least for `git annex fsck` command, so that the user doesn't wonder about the strange effects of vfat and can repair this): + +if we have an exact time difference of 1s (probably \"inode problem\") or 1h (\"utc problem\") +we treat this file as likely unmodified and check this via the normal checksum algorithm. + +if checksum is ok, we give a message to the user, that the \"file has only a vfat timestamp problem\" but has correct checksum and if the user decides to do so git annex sets the timestamp in the filesystem to the value from annex' internal tables... + +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_3_923fc470727ecf21f0bb368b0486b15d._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_3_923fc470727ecf21f0bb368b0486b15d._comment new file mode 100644 index 000000000..599927cd2 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_3_923fc470727ecf21f0bb368b0486b15d._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-05T17:06:40Z" + content=""" +> if we have an exact time difference of 1s (probably \"inode problem\") or 1h (\"utc problem\") we treat this file as likely unmodified and check this via the normal checksum algorithm. + +That sort of makes sense, but when is git-annex supposed to do that? + +If `git annex add`, it already checksums the file, and already stages no change if the file's checksum is the same. And if the user has told git-annex to add the file and it's changed, the presumption is they know it's changed and want to add the new version. + +> To do an git annex sync or git annex add is in my opinion not a good option, because one could add so Bad file content by accident... + +If not in add or sync, then when? + +---- + +I am actually having a hard time coming up with a scenario where this problem results in any more than extra checksumming work by git-annex. + +The only scenario I see is: The drive is unmounted, gets corrupted, is remounted, and this timestamp nonsense causes git-annex to think a file (that has already gotten corrupted) has in fact changed, so it commits the corrupted version. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_4_68a8434018430a0d2671c4e23e9a3b12._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_4_68a8434018430a0d2671c4e23e9a3b12._comment new file mode 100644 index 000000000..32abc28c2 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_4_68a8434018430a0d2671c4e23e9a3b12._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="martin" + ip="193.174.111.250" + subject="It confuses users" + date="2014-06-05T19:05:12Z" + content=""" +Other scenario: User thinks, that his usb drive has a problem, because approx. 50% of the files are gone/changed without obvious reason. I spent several hours to find the reason for this... I think we should at least give kind of explanation/warning message to the user +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_5_0b7d69489b9f10bb5ed617b5b62ae063._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_5_0b7d69489b9f10bb5ed617b5b62ae063._comment new file mode 100644 index 000000000..dc27808bb --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_5_0b7d69489b9f10bb5ed617b5b62ae063._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="martin" + ip="193.174.111.250" + subject="another scenario" + date="2014-06-05T19:52:04Z" + content=""" +If a user uses such a crippled filesystem as a transfer repo and he does an `git-annex get --auto` on the target pc for getting the content he gets only 50% of the content. (user gets only a strange message that git-annex cannot access the repo or something like this) The user does not have the intuition to do an extra `git-annex add` to get the content because from his perspective he did not made any changes... (sorry for my bad english - i hope you know what i mean) +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_6_650d950da065eeac966c2498418c668d._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_6_650d950da065eeac966c2498418c668d._comment new file mode 100644 index 000000000..94cbad0e6 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_6_650d950da065eeac966c2498418c668d._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="martin" + ip="89.183.56.177" + subject="use case and answer to joey's question "...then when..."" + date="2014-06-08T04:59:42Z" + content=""" +Hi joey, + +i really think we should repair the timestamp instead of force the user to `git-annex add` possibly corrupted files/content (see your comment above) git-annex checksums are excellent for data integrity but they are useless if we bypass them in case of adding and propagating +potentially corrupted content with `git-annex add` + +So here's for example a useful use case: + +1. user fills his transfer repo in town A. He checks (`git annex fsck`) that everything is fine. He unmounts the drive and travels to town B. + +2. In town B user mounts the drive and sees, that he suddenly doesn't have \"access\" to those \"crippled files\" on his transfer repo (the files seems modified for the user without a reason - why should he `git-annex add` them again?? - he'd rather think about data corruption) . He wonders whats going on and thats why he does a + +3. `git-annex fsck` . `git annex fsck` should checksum also such crippled files, should report correct checksums if they are correct (so that the users knows their usb drive is working properly) and should give a message like this: \"checksum ok - crippled timestamp - repair with git-annex fsck --repair-timestamp or define a modify window \"- (to be implemented - in rsync the problem is already solved with this option \"--modify-window=NUM compare mod-times with reduced accuracy\") + +In my case distance between town B and town A was approx 400km and in town B i didnt know what was going on. So i went back to town A without success for further investigation of my usb drive... :-(( + +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_7_834c512e32ad5a157d8fa9fd472831b4._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_7_834c512e32ad5a157d8fa9fd472831b4._comment new file mode 100644 index 000000000..7a98be0a2 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_7_834c512e32ad5a157d8fa9fd472831b4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 7" + date="2014-06-09T19:29:09Z" + content=""" +A transfer repository is normally bare, so would not have this problem. +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_8_2500e6f9545b916dfa41549140c053fd._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_8_2500e6f9545b916dfa41549140c053fd._comment new file mode 100644 index 000000000..193038472 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_8_2500e6f9545b916dfa41549140c053fd._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="martin" + ip="89.183.78.73" + subject="`git-annex add` (called by sync) should do the job and bring the files back home (IMHO)" + date="2014-06-10T15:58:25Z" + content=""" +If one does an `git annex sync` these crippled-pseudo-modified-files are *automatically* `git annex add`ed + + git annex status + M datei1 + M datei5 + M datei6 + git annex sync + commit add datei1 ok + add datei5 ok + add datei6 ok + +To avoid the risk of adding and propagating potentially corrupted content `git-annex add` should +\"simply\" correct the timestamps (adjust to the new even inode values) for files with correct checksum but timestamp +difference of 1s or 1h + +With this procedure i would have better sleep with this personal second use case: + +repo1: on the computer (direct mode - client) +repo2: on usb stick - (direct mode - client - vfat - music for car) + +From time to time mp3 files are transferred to the stick. Then stick +goes to the car and after some days back to the computer to be +synchronized again. Everytime approx. 50% of the recently new added files are +added again (via sync) because of these nonsens timestamps. + +So i think, the clean solution is to correct only the timestamps instead +of adding again possibly corrupted files. If we dont do this users adapt to +add files again and again (they need not to be added) and one day they +add corrupted content. Like on windows (tm) you klick OK and OK again and +here you add again and again and one day one add once too much ;-) + +Excuse me for this long comment... + +P.S. git annex is an ingenious piece of software - thanks a lot for this joey! +"""]] diff --git a/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_9_e2dc3ff80bbd66837f00975b16e17126._comment b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_9_e2dc3ff80bbd66837f00975b16e17126._comment new file mode 100644 index 000000000..44ac459c0 --- /dev/null +++ b/doc/bugs/FAT:_Date_resolution_for_mtime_2s--__62___implications/comment_9_e2dc3ff80bbd66837f00975b16e17126._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 9" + date="2014-06-10T19:27:55Z" + content=""" +> To avoid the risk of adding and propagating potentially corrupted content git-annex add should \"simply\" correct the timestamps (adjust to the new even inode values) for files with correct checksum but timestamp difference of 1s or 1h + +Since git-annex add already does that in this case, I think what you're actually suggesting is that, if the timestamp has a 1s or 1h diff, but the checksum has changed, git-annex add should refuse to add the files, on the grounds that it appears to be corrupt. Which obviously fails badly in at least the 1h case, because someone could add a file, then wait 1 hour and git-annex add a modified version. +"""]] diff --git a/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn b/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn new file mode 100644 index 000000000..b794e6a3f --- /dev/null +++ b/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. +I've a repository with a prefered content of "exclude=cours/vieux/* and ( include=cours/* or include=Programmes/* or include=Stage/* )", but there is a repository that has a (identical) copy both in cours/vieux and in Stage/ so git annex sync --content will +- get the content in Stage/ +- then drop it because it is in cours/vieux/ + +And again, and again... + +### What version of git-annex are you using? On what operating system? +git-annex 5.20140127 in debian/sid + +> This is actually a duplicate of +> [[Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]]. +> As noted in that bug report, this should already be fixed in direct mode, +> but still happens in indirect mode when the full scan is done (at +> startup, and occasionally at other times). +> +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn new file mode 100644 index 000000000..16109fb23 --- /dev/null +++ b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn @@ -0,0 +1,36 @@ +**What steps will reproduce the problem?** + +Create two annexes from the command line on two separate machines: + + mkdir ~/Files.annex + cd ~/Files.annex + git init + git annex init + git annex untrust . + git annex direct + +Add remote to each one pointing to the other: + + git remote add [remote] [remote hostname]:Files.annex + +Start assistant on both repos: + + git annex assistant + +Fill one repository with a few text files, and wait for them to propagate. + +Edit one of the text files using vim, and save. + +**What is the expected output? What do you see instead?** + +Edited file should remain in the repo, but a significant portion of the time, the file disappeared from the repo in which it was edited (the file is present and properly synced on the other repo). + +**What version of git-annex are you using? On what operating system?** + +git-annex 4.20130323, Mac OS X on the repo where the file was edited, Arch Linux for the other paired repo. + +**Please provide any additional information below.** + +I have observed this problem setting up the repos through the webapp as well, so I don't think it is related to setting up the repos manually. I think the way vim is writing the files seems to be tickling a race condition (both command-line vim and MacVim produce the behavior). I started trying to work around it by switching to emacs to edit those files, and the files haven't disappeared from the edited repo (so far at least). + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment new file mode 100644 index 000000000..46b333271 --- /dev/null +++ b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-08T17:14:23Z" + content=""" +When you say that the file \"disappeared from the repo\", do you mean that the actual file is no longer present on disk, or that the file is present on disk, but is no longer staged in the git repository? + +Version 4.20130405 fixes a bug that can result in the latter behavior. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn new file mode 100644 index 000000000..d66196acd --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +Using the webapp to generate a new (local) repository instantly takes it to the following state: +[[!format sh """ +user@local:~/Annex$ git status +# On branch master +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) +# +# deleted: uuid.log +# +user@local:~/Annex$ git branch + git-annex +* master +user@local:~/Annex$ git log +commit 90bfcaf17b0576d8ecdc48ae44dda22d41464acc +Author: local +Date: Sun Nov 3 15:30:17 2013 +0100 + + created repository +user@local:~/Annex$ git show HEAD +commit 90bfcaf17b0576d8ecdc48ae44dda22d41464acc +Author: local +Date: Sun Nov 3 15:30:17 2013 +0100 + + created repository + +diff --git a/uuid.log b/uuid.log +new file mode 100644 +index 0000000..9df3670 +--- /dev/null ++++ b/uuid.log +@@ -0,0 +1 @@ ++987e7b9a-aa9d-41db-ae92-23fcae7f6187 user@local:~/Annex timestamp=1383489017.181 +user@local:~/Annex$ +"""]] + +I'm new to git-annex, so I'm not quite sure, but looking at [[internals]] this file should only exist in the git-annex branch, not in master. Furthermore, from this state it seems impossible to get "sync with your other devices" to work, because of a merge conflict on this change. + +Perhaps some sort of a race-condition with the annex-assistant picking up the uuid.log file while the repository is being initialized? + +### What version of git-annex are you using? On what operating system? +Ubuntu 13.10 with git-annex 4.20130815 + +> [[fixed|done]]; see comments. (This fix needs to be backported to Ubuntu.) --[[Joey]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment new file mode 100644 index 000000000..6080e88e4 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T16:48:25Z" + content=""" +I can't reproduce this at all. What version of git do you have installed? Did you install git-annex from ubuntu's repository? Does the same thing happen if you install the standalone linux tarball and use it to make a new repository? + +git-annex never creates a file named uuid.log on disk, so it's quite strange that it shows up in the initial commit to the master branch. It sort of looks like somehow git-annex's normal use of a separate index file to stage the uuid.log to the git-annex branch is failing. Since I have never seen any problem with that, I have to suspect that the ubuntu build is somehow badly broken. Or that the git in Ubuntu is for some reason ignoring `GIT_INDEX_FILE`. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment new file mode 100644 index 000000000..50bff5f41 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 2" + date="2013-11-03T17:02:47Z" + content=""" +I made an Ubuntu saucy chroot, apt-get installed git-annex from universe, and ran the webapp in there. I did not reproduce this problem. + +The cause of the problem, it seems, must be something local to your system. Perhaps you have an environment variable set that is messing up git. Or perhaps you have a different, broken version of git installed. + +Can you \"git show git-annex\" in the repository? It should show a commit made to the git-annex branch that adds the uuid.log there. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment new file mode 100644 index 000000000..7acab1c37 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 3" + date="2013-11-03T17:35:00Z" + content=""" +Very strange: this is on a machine that I wiped and reinstalled just a few hours ago, it's a completely fresh Ubuntu 13.10 install with barely anything installed but the defaults. Git version is 1.8.3.2-1 + +I initially just pulled git-annex from the Ubuntu repo. After that I grabbed a more recent version from https://launchpad.net/ubuntu/+source/git-annex/4.20131101/+build/5189754 which is showing the same behavior. + +\"git show git-annex\" indeed shows the commit creating the uuid.log file on the git-annex branch. master has just one commit, with description \"created repository\" and creates a \"uuid.log\" file. The contents of the master uuid.log are identical to the one in the git-annex branch. + +I'm currently in the middle of trying out a git-annex setup so I can't switch versions again right now, but given the above I imagine a fresh 13.10 VM should show the same behavior. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment new file mode 100644 index 000000000..c020fc3a8 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-11-06T15:09:19Z" + content=""" +Intriguing -- I was able to reproduce this bug after installing the Ubuntu server ISO in a VM. + +Which is really strange, the only difference between this and my debootstrapped chroot should be the kernel.. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment new file mode 100644 index 000000000..a323d7835 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment @@ -0,0 +1,53 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-06T16:27:49Z" + content=""" +Running the prebuilt tarball build of git-annex, the bug does not occur. + +However, if I remove the git shipped with the prebuilt tarball, so it uses the system git, I do see the bug. So, it's apparently git version dependent. + +Also, I was able to reproduce it in a amd64 chroot. My other chroot was i386. Somehow architecture specific bug? + +--- + +Instrumenting all calls to git to be logged with the full environment and command, I found this: + +
+GIT_INDEX_FILE='/home/foo/annex/.git/annex/index'
+--git-dir=/home/foo/annex/.git --work-tree=/home/foo/annex commit --quiet --allow-empty -m created repository
+
+ +This certainly looks like the index file setting for the git-annex branch is somehow leaking out past the branch commit operations. It continued setting that while setting up `gc.auto`; the next call to git after that stopped setting the index file. + +The only way I can see offhand this could possibly happen is due to an exception. It may be that on ubuntu an exception is thrown by code that runs a git command with the index file set, for whatever reason, and this causes the code that normally resets it back to not run. + +---- + +Ok, found it! + +
+\"withIndex entered\"
+
+*** Please tell me who you are.
+
+Run
+
+  git config --global user.email \"you@example.com\"
+  git config --global user.name \"Your Name\"
+
+to set your account's default identity.
+Omit --global to set the identity only in this repository.
+
+fatal: unable to auto-detect email address (got 'foo@darkstar.(none)')
+\"withIndex entered\"
+\"withIndex cleaned up\"
+
+ +Note lack of clean up after the first withIndex call. Thus leaving the environment passed to git polluted for further calls. + +This also explains why it's only happening on some systems, or with some versions of git. git's got all kinds of complexity around its username and email handling code. + +I have fixed this in git. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment new file mode 100644 index 000000000..ea3e97e8e --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-06T16:40:57Z" + content=""" +Ubuntu bug report about this: + +It should be pretty easy to backport the fix to the version in Ubuntu. The relevant git commits are ee23be55fd3e7e202bc721c124f78b79d1aba6df and 81117e8a9d19d4739d3773d0515006e1ea41c266 +"""]] diff --git a/doc/bugs/GIT_DIR_support_incomplete.mdwn b/doc/bugs/GIT_DIR_support_incomplete.mdwn new file mode 100644 index 000000000..1b9738c4f --- /dev/null +++ b/doc/bugs/GIT_DIR_support_incomplete.mdwn @@ -0,0 +1,17 @@ +`GIT_DIR` support isn't right. Git does not look for `GIT_DIR/.git`; +git-annex does. + +Also, to support this scenario, support for core.worktree needs to be added +as well: + + mkdir repo workdir + git --work-tree=$PWD/workdir --git-dir=$PWD/repo init + export GIT_DIR=$PWD/repo + git status + # ok + git annex init "new repo" + # fail + +--[[Joey]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn new file mode 100644 index 000000000..bf7f4f391 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +When I try to create a megaannex remote with pubkey encryption GPG complains about not finding the public key. + +### What steps will reproduce the problem? +See below + + +### What version of git-annex are you using? On what operating system? +5.20140129 under OSX. + + +### Please provide any additional information below. + +[[!format sh """ +% USERNAME="" PASSWORD='' git annex -vd initremote mega type=external externaltype=mega encryption=pubkey keyid=X folder=Documents mac=HMACSHA512 +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","show-ref","git-annex"] +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","show-ref","--hash","refs/heads/git-annex"] +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","log","refs/heads/git-annex..62dc22cced06268fa5adcf54992eb1169c6ca1aa","--oneline","-n1"] +[2014-02-06 11:39:14 CET] chat: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","cat-file","--batch"] +initremote mega (encryption setup) [2014-02-06 11:39:14 CET] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-public-keys","46726B9A"] +[2014-02-06 11:39:14 CET] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","2","256"] +[2014-02-06 11:39:14 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--recipient","X","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] +(pubkey crypto with gpg key X) [2014-02-06 11:39:15 CET] chat: git-annex-remote-mega [] +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> VERSION 1 +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- INITREMOTE +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> GETCONFIG encryption +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- VALUE pubkey +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> GETCONFIG folder +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- VALUE Documents +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> SETCREDS mycreds +(gpg) [2014-02-06 11:39:15 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"] +[2014-02-06 11:39:15 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] +gpg: no valid addressees +gpg: [stdin]: encryption failed: no such user id + +git-annex: user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] exited 2) +failed +git-annex: initremote: 1 failed + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment new file mode 100644 index 000000000..1d71eebf4 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 1" + date="2014-02-06T11:00:49Z" + content=""" +I just confirmed it works with encryption=hybrid +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment new file mode 100644 index 000000000..2c5bdc120 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 3" + date="2014-02-06T21:53:23Z" + content=""" +I can reproduce this, but only when using the hook special remote, so it's some problem with it. +directory special remote works ok. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment new file mode 100644 index 000000000..b5e9c3c21 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 3" + date="2014-02-06T22:07:55Z" + content=""" +Actually, it seems to affect also S3 and other remotes that call setCreds. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment new file mode 100644 index 000000000..b61b0626a --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2014-02-07T11:11:23Z" + content=""" +Could it be some general issue with setCreds? + +The reason I'm wondering is that megaannex isn't really working. It doesn't seem to (properly) get the credentials so it's acting funny and getting an Invalid Argument exception where, according to what I understand from the documentation, it shouldn't be possible to get an Invalid Argument exception. + +Ofcourse I have contacted the maintainer of megaannex (TobiasTheViking on github) too. I've also started looking in to it myself. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment new file mode 100644 index 000000000..b5495e454 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 5" + date="2014-02-07T11:12:24Z" + content=""" +Oh, sorry. I didn't see that you had already fixed it. +"""]] diff --git a/doc/bugs/GPG_passphrase_repeated_prompt.mdwn b/doc/bugs/GPG_passphrase_repeated_prompt.mdwn new file mode 100644 index 000000000..56b2bba4e --- /dev/null +++ b/doc/bugs/GPG_passphrase_repeated_prompt.mdwn @@ -0,0 +1,25 @@ +#### What steps will reproduce the problem? + +1. Create a new repository with a directory +2. Add files +3. Select "Store your data in the cloud" with the "Remote server" option +4. Enter host, user, directory +5. Select "Use an encrypted rsync repository on the server" (Will there be an option for unencrypted later?) +6. GPG Passphrase prompt comes up for every file + +#### What is the expected output? What do you see instead? + +I expect to enter a passphase once and then it will sync all files with the remote server. + +Instead, it begins syncing the files to the server but prompts for a GPG passphase for every single file. + +#### What version of git-annex are you using? On what operating system? + +3.20121017 precompiled binary on Arch Linux + +#### Please provide any additional information below. + +Not sure if I'm just missing a setting for GPG, but I would think I should only need to use the web app to configure the remote server. + +[[!tag /design/assistant]] +[[!tag confirmed]] diff --git a/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment b/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment new file mode 100644 index 000000000..016ecb994 --- /dev/null +++ b/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="you should install a gpg agent" + date="2012-10-31T17:39:53Z" + content=""" +A gpg agent will cache your passphrase. It is beyond the scope of the git-annex package to provide one (though it does bundle gpg), but it should be easy to install gpg-agent on your distribution. + +That's all that's needed for normal git-annex use, but the assistant does seem to have a larger problem in this area, since it can need to unlock a remote's key at any time to sync files from it. Since a separate +process is spawned for each transfer, this defeats git-annex's normal in-process caching of encryption keys of remotes. So I think it needs to unlock any encrypted special remotes at startup, or when first accessing them, and pass the cached keys to the transfer processes it spawns. This is now on my todo list. + +However, none of the special remotes set up by the assistant will use +password protected gpg keys, even when it's using encryption it's using a +non-password protected shared key. So only encrypted special remotes set up +at the command line cause this problem. +"""]] diff --git a/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn b/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn new file mode 100644 index 000000000..7087247f5 --- /dev/null +++ b/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn @@ -0,0 +1,3 @@ +I recently had my git-annex repository die and it needed to be repaired. Two of my repositories are external hard drives. When I tried to use git-annex repair, it would churn for some hours, then error because the external hard drives were not plugged in. When I brought the two hard drives home from the various places that they are (safely) stored, it all worked fine, but it would have been great if git-annex repair could somehow do what it could with what was connected and do the rest as and when the other drives are plugged in. This must only become more of a problem as git-annex is used for longer, as one may have a handful of USB keys storing a little on each. + +[[!taglink moreinfo]] diff --git a/doc/bugs/Git-Annex_requires_all_repositories_to_repair/comment_1_dff1424e48835d7d3eb8653fc59de18a._comment b/doc/bugs/Git-Annex_requires_all_repositories_to_repair/comment_1_dff1424e48835d7d3eb8653fc59de18a._comment new file mode 100644 index 000000000..d44c30f32 --- /dev/null +++ b/doc/bugs/Git-Annex_requires_all_repositories_to_repair/comment_1_dff1424e48835d7d3eb8653fc59de18a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-07T19:25:25Z" + content=""" +Repair does not require access to remotes, but it will certianly yield a better result to have one remote available. Otherwise, information that cannot be repaired will be missing from the repository. Repair will still successfully complete in this situation though. + +If you have an error message, please paste it. +"""]] diff --git a/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn new file mode 100644 index 000000000..9443a4fbd --- /dev/null +++ b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn @@ -0,0 +1,58 @@ +### Please describe the problem. + +I was playing around thinking to try out git-annex, and bup + +I sucessfully added 6GB of images in subdirectories in ~/Pictures, so decided to push over another dir full - + +more than 30GB more... + +sven@quad:~/Pictures$ git annex add . +.... +add 2012/01/10/20120110-024457/IMG_1830.JPG +git-annex: : hFlush: resource vanished (Broken pipe) +failed +add 2012/01/10/20120110-024457/IMG_1831.JPG +git-annex: : hFlush: resource vanis +sven@quad:~/Pictures$ +sven@quad:~/Pictures$ git annex add . +Stack space overflow: current size 8388608 bytes. +Use `+RTS -Ksize -RTS' to increase it. +sven@quad:~/Pictures$ git git commit -a -m added +git: 'git' is not a git command. See 'git --help'. + +Did you mean this? + init +sven@quad:~/Pictures$ git commit -a -m added +Bus error (core dumped) + + + +### What steps will reproduce the problem? +see above + +### What version of git-annex are you using? On what operating system? +sven@quad:~/Pictures$ git annex version +git-annex version: 3.20120406 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +sven@quad:~/Pictures$ uname -a +Linux quad 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + + +### Please provide any additional information below. + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Ancient git-annex version. Doubt it affects current version. [[!tag moreinfo]] --[[Joey]] + +>> Actually, this is a dup of [[runs_of_of_memory_adding_2_million_files]] so [[done]] --[[Joey]] diff --git a/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment new file mode 100644 index 000000000..de4928b3a --- /dev/null +++ b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-13T19:22:12Z" + content=""" +It looks like git-annex was leaking memory, and so ran out and died. + +But, you're using an ancient version of git-annex from 2012. Upgrade to a current version and write back if it still has a memory leak. I doubt it does. +"""]] diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn new file mode 100644 index 000000000..f7bae3b4b --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn @@ -0,0 +1,65 @@ +Hi, +I already have told about that in a comment here , but I am not sure it will be seen. + +Then here is an official bug report. +### Please describe the problem. + +I have a problem with submodules when the git repository is not a submodule everywhere. + +For instance, if A is a git annexed repository and B another git repository. If B adds A as submodules. The symlinks added in A as submodule won't work in the original A. + +### What steps will reproduce the problem? + + # creating the master repository + mkdir annex_master + cd annex_master/ + git init + # hack: adding a file to create the master branch + touch start + git add start + git commit -m "start" + cd .. + # create another repository + mkdir annex_sub + cd annex_sub/ + git init + # hack: adding a file to create the master branch + touch start + git add start + git commit -m "start" + # it is a annexed repository + git annex init sub + # add the other repository as submodule of the master one + cd ../annex_master/ + git submodule add ../annex_sub/ module + cd module/ + git annex init sub_module + git annex sync origin + # add an annexed file + echo test > test + git annex add + git annex sync + # go back to the origin repository + cd ../../annex_sub/ + git annex sync + ls -l +This returns test -> ../.git/modules/module/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2 + +Actually, the file committed is correct. But the fact it points to '../.git/modules/module/...' makes the link work only if the repository is also a submodule and if this submodule is also located in the modules folder in the parent git repository. + +I tried playing with making the repository direct and then indirect, hoping that would fix the symlinks, but it did not work. +### What version of git-annex are you using? On what operating system? + + $ git-annex version + git-annex version: 4.20130802 + ... + + $ git --version + git version 1.8.3.2 + + $ uname -a + Linux konixwork 3.9-1-amd64 #1 SMP Debian 3.9.8-1 x86_64 GNU/Linux + +### Please provide any additional information below. + +[[!tag confirmed]] diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment new file mode 100644 index 000000000..8ff232159 --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T18:49:18Z" + content=""" +git-annex assumes that it can make a stable symlink from a file in the working tree to a file in the .git directory. There are several ways to break this. One, as noted, is sometimes using a repository as a submodule, and sometimes not. Another would be to play around with `GIT_DIR`. + +I don't see a way git-annex can support those use cases, at least in indirect mode. + +It does seem like, in direct mode, it should just work. git-annex will commit various symlinks to git, but these symlinks will never be followed to get at the content of a file, since direct mode arranges for the content to be directly present in the working tree. +"""]] diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment new file mode 100644 index 000000000..b7aa61f17 --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="konubinix" + ip="82.243.233.186" + subject="Thanks" + date="2013-08-26T06:25:19Z" + content=""" +Thanks for the reply. + +Also thanks for this great tool (Though I am not sure I truelly realize the true power of git annex yet). +"""]] diff --git a/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn b/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn new file mode 100644 index 000000000..7756db866 --- /dev/null +++ b/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. +hasKey check fails when using a Glacier special remote with a non-default region setting. + +### What steps will reproduce the problem? +1. Configure a Glacier special remote with a region other than us-east-1 +2. Move some files to the remote +3. Somehow let galcier-cli cache expire. In my case this was waiting for more than 60 hours. +4. Try to copy the file to the glacier remote again. + +### What version of git-annex are you using? On what operating system? +5.20140227 on Ubuntu 12.04 + +### Please provide any additional information below. + +[[!format sh """ +user@server:$ git annex copy my_file.txt --to glacier +copy my_file.txt (checking glacier...) Traceback (most recent call last): + File "/bin/glacier", line 730, in + App().main() + File "/bin/glacier", line 716, in main + self.args.func() + File "/bin/glacier", line 620, in archive_checkpresent + wait=self.args.wait) + File "/bin/glacier", line 442, in _vault_sync + vault = self.connection.get_vault(vault_name) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer2.py", line 82, in get_vault + response_data = self.layer1.describe_vault(name) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer1.py", line 195, in describe_vault + return self.make_request('GET', uri) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer1.py", line 118, in make_request + raise UnexpectedHTTPResponseError(ok_responses, response) +boto.glacier.exceptions.UnexpectedHTTPResponseError: Expected 200, got (404, code=ResourceNotFoundException, message=Vault not found for ARN: arn:aws:glacier:us-east-1:111111111111:vaults/myvault) +(user error (glacier ["archive","checkpresent","myvault","--quiet","SHA256E-s1111111--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.JPG"] exited 1)) failed +git-annex: copy: 1 failed +"""]] + +> [[fixed|done]]; made it use the same glacierParams as everything else. +> --[[Joey]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates.mdwn b/doc/bugs/Glacier_remote_uploads_duplicates.mdwn new file mode 100644 index 000000000..75014a5e0 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +Other references: + +https://github.com/basak/glacier-cli/pull/19 +http://git-annex.branchable.com/special_remotes/glacier/#comment-a2b05b8dc2d640ee498d90398f02931c + +#### Background + + * Glacier doesn't support keys that the client selects, unlike S3. If you upload to Glacier, Glacier assigns a unique ID, not the client. + * Glacier does support an "archive description" which is immutable. It also provides this "archive description" in an inventory listing, together with the unique IDs. + * An "archive description" is not a unique key. It's perfectly possible to upload multiple archives to Glacier with the same "archive description". + * glacier-cli uses the "archive description" field as an upload identifier, since the unique IDs are unfriendly to users. However, since they are potentially ambiguous identifiers, it also supports disambiguation using the ID itself. See "Addressing Archives" in README.md for details. + +#### The Problem + +This what I believe is happening in the two reports referenced above. When git-annex is used without `--trust-glacier`, it can end up uploading the same data multiple times. From git-annex's point of view, it cannot verify that the data is already in Glacier, so it uploads again, expecting an overwrite operation if the key is already in Glacier. Since glacier-cli maps the key to an "archive description" that can be duplicated, this is not what happens. Instead, a second archive is uploaded. + +When git-annex later does a "checkpresent" operation, glacier-cli fails. This is because the request is ambiguous, since there are two archives in Glacier with the same "key". The error message could be better here, but I believe that the behaviour is correct. + +#### Discussion + +glacier-cli can find out what data Glacier claims to have using an inventory retrieval. However, this retrieval takes about four hours and can be out of date (eg. if someone else recently deleted the archive from another client). Thus, I can understand git-annex's desire not to trust this data or a cache of it. + +However, whatever we do, it is impossible to map an "upload or overwrite on key X" type command to Glacier. We'll always end up with duplicates. Even if git-annex stored the Glacier archive IDs, there is no API to replace an existing archive with the same ID, and inventories are out of date even before we retrieve them. + +#### Workaround + +If the problem is as I think it is, always applying `--trust-glacier` should prevent the problem from occurring in most cases, since git-annex will run "checkpresent" and glacier-cli will confirm that the archive exists. + +To fix the problem after it has occurred, it should be sufficient to delete duplicates using glacier-cli, since they _should_ be identical to each other. Some enhancement of the `glacier-cli archive list` command would help here. + +Update 10 June 2013: I've pushed a `glacier-cli` update and helper script in commit `b68835`. This adds a `--force-ids` option to `glacier archive list`, with which the helper script `glacier-list-duplicates.sh` uses to identify duplicates that can be removed. If you're affected by this issue, I suggest that you use this helper to identify and fix your problem by removing the duplicates. Please do so carefully by checking that the output of the helper is correct before you use it to delete the duplicates. See the comments at the top of the helper script for usage information. + +> [[fixed|done]], at least for the only well-working case for glacier, where +> only one repository can access glacier directly. --[[Joey]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment new file mode 100644 index 000000000..9e42d4cae --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-23T15:55:16Z" + content=""" +Please beware of the warning on the man page when using --trust-glacier-inventory: + +> Be careful using this, especially if you or someone else might +> have recently removed a file from Glacier. If you try to drop +> the only other copy of the file, and this switch is enabled, you +> could lose data! + +While I'm inclined to want git-annex to store the necessary mappings from keys to glacier IDs in the git-annex branch, which would allow uploads/downloads from multiple repositories to the same glacier repository, it will not help with this problem. The git-annex branch can be out of date too. + +It seems that what's needed is a separate form of the checkpresent hook, that's used when deciding whether to copy data to glacier. +We want this to trust the glacier inventory. But we don't want to trust the glacier inventory when moving data to glacier, or when running `git annex drop`! (unless --trust-glacier-inventory is specified). I think this would be easy to add. If you're up for testing a patch, I could do it today. + +BTW, there does seem to be a workaround that avoids duplicate copies to glacier: + + git annex copy --to glacier --not --in glacier + +While normally copy checks the inventory to see if a key has been sent to glacier, and so will re-send, the `--not --in glacier` +trusts the location tracking information, so if git-annex has sent the key before, it will skip the copy. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment new file mode 100644 index 000000000..859377308 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-23T15:57:08Z" + content=""" +I suppose another way to fix it along similar lines would be to make `git annex copy` always trust location tracking information when deciding whether to copy. I'm not sure how I feel about this though -- it might make things less robust in situations where `git annex copy` is run as a backup, and location tracking could have gotten out of date. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment new file mode 100644 index 000000000..4091e258c --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-23T15:59:37Z" + content=""" +It's also worth noting that the assistant always trusts the location log when deciding whether to send a key to a remote. So I think it will not trigger this bug. It seems only `git annex copy` will. (Well, maybe `git annex move` too in an edge case.) +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment new file mode 100644 index 000000000..415103a01 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 4" + date="2013-05-27T22:24:44Z" + content=""" +> If you're up for testing a patch, I could do it today. + +I'm happy to test a patch. I haven't successfully compiled git-annex on my Mac, which is the only computer I have for the next month or so, but it wasn't too hard to get it to work on my Linux box. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment new file mode 100644 index 000000000..1d4bbf1fd --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-29T17:54:11Z" + content=""" +I started to make a branch with the change I suggested, but then I had another idea. + +The checkpresent hook can return either True or, False, or fail with a message if it cannot successfully check the remote. Currently for glacier, when --trust-glacier is not set, it always returns False. Crucially, in the case when a file is in glacier, this is telling git-annex it's not there, so copy re-uploads it. What if it instead, when the glacier inventory is missing a file, it returns False. And when the glacier inventory has a file, unless --trust-glacier is set, it *fails*. + +The result would be: + +* `git annex copy --to glacier` would only send things not listed in inventory. If a file is listed in the inventory, `copy` + would complain that --trust-glacier` is not set, and not re-upload the file. +* `git annex drop` would only trust that glacier has a file when --trust-glacier is set. Behavior unchanged. +* `git annex move --to glacier`, when the file is not listed in inventory, would send the file, and delete it locally. Behavior unchanged. +* `git annex move --to glacier`, when the file is listed in inventory, would only trust that glacier has the file when --trust-glacier is set +* `git annex copy --from glacier` / `git annex get`, when the file is located in glacier, would trust the location log, and attempt to get the file from glacier. + +This seems like it should do the right thing in all cases, but I have not tested it. I've pushed a `glacier` branch with this change. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment new file mode 100644 index 000000000..2a140eb49 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkexhIpGcYa22aPQtLm-StpHiF-MHYPh5w" + nickname="Robie" + subject="comment 6" + date="2013-06-10T17:24:34Z" + content=""" +This seems reasonable to me. + +One other possibility that you could end up with a duplicate: if `glacier-cli`'s cache is not up to date. For example: hosts A and B both have (the same) annex with the same Glacier special remote defined. Host A copies a file to Glacier. On host B, the `glacier-cli` cache doesn't know about the file, and so a copy to Glacier on host B also succeeds. When the cache is later brought up to date `glacier vault sync`, then the duplicate appears. + +I'm not sure what we can do about this. Perhaps we need to accept that duplicates will occur, and handle them more gracefully. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment new file mode 100644 index 000000000..26cbb5a47 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-06-11T14:38:19Z" + content=""" +Ok, I've merged the glacier branch into master. I would still be happy to see some testing of this before my next release (in a week). + +I guess I'll close this bug report. There are certainly still problems that can happen if there are multiple repositories all writing to glacier independently. Seems to me that one good way to deal with this is to set up a single remote that is configured to be a gateway to glacier. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment new file mode 100644 index 000000000..67fd5354b --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="For those on Mac OS X" + date="2013-11-18T00:00:32Z" + content=""" +The duplicates script fails because the BSD/MacOS version of uniq doesn't support the -D option. + +You can work around this by installing the GNU version using Homebrew ('brew install coreutils') and then replacing the 'uniq' in the script with 'guniq' (Homebrew prefixes the coreutils with \"g\" by default). + +I seem to still be running in to this bug using git annex version 4.20131106 and 'git annex copy --to glacier' without the '--not --in glacier' flags. It's not a problem to use the extra flags but I wasn't originally aware of this issue and the duplicates don't seem to always occur. I'll do some more testing and see whether I can reliably predict what will create duplicates and what won't. +"""]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn new file mode 100644 index 000000000..9532d0fd0 --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn @@ -0,0 +1,18 @@ +Hi, + +some time ago, I accidentially copied some files from the archive to the non-archive part of my (indirect, type 'client') repository (instead of moving), with the effect that assistant always kept downloading and afterwards immediately dropping the files. Now this was not really suprising once I found the duplicate folder, but maybe git annex could detect this case and refuse to run in circles or at least complain about it. + +Best +Karsten + +[[!tag /design/assistant]] + +> Update: Current status is this is fixed for direct mode. +> +> In indirect mode, the startup scan will still download and then drop +> content if a file outside and inside the archive directory has the +> same content. It doesn't loop like it did in direct mode, only +> happens once (or once per duplicate file, really). Is still potentially +> annoying and a bug. --[[Joey]] + +[[!tag confirmed]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment new file mode 100644 index 000000000..0606fdffb --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T16:32:43Z" + content=""" +This is a known problem. + +It seems possible to fix it for direct mode. After all, direct mode tracks all files associated with a key, so it could expose this to preferred content expressions, and the expression check if any of the associated files was in an archive directory. + +Unsure how to deal with it in indirect mode. Short of making indirect mode do all the same tracking direct mode does, or otherwise build a key to file lookup table. +"""]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment new file mode 100644 index 000000000..2be39d451 --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-15T17:52:36Z" + content=""" +This turns out to be much worse in direct mode than in indirect mode. + +In indirect mode, it only does extra work during the full startup scan. Suppose there are 3 files with the same content, 1, archive/2, and 3. It will download 1, and then will drop archive/2, and then will download 3. This certainly is not ideal, especially when the file content is large. + +In indirect mode, it continally and repeatedly downloads the drops the files, as long as it's running. Which is beyond unacceptable. + +What seems to be going on is that when archive/2 gets dropped, it necessary needs to convert 1 and 3 to broken symlinks. But the watcher than sees those file changes, thinks these are new or renamed files that have appeared, and promptly re-downloads them. That, in turn triggers an update of archive/2, to convert it back from symlink to direct mode file, and that in turn is noticed by the watcher. Round and round we go! +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn new file mode 100644 index 000000000..2c8bd3588 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn @@ -0,0 +1,126 @@ +### Please describe the problem. + +Direct mode repositories seem to initially ignore hard linked files and then when changes are done to them sync them as separate files. However, changes to one file are only propagated to that file and not to any of the others that are hardlinked to it. + +### What steps will reproduce the problem? + +Inside a direct mode repository linked to a ssh remote: + +[[!format sh """ +$ ls -l +total 0 +$ echo "something" > foo +$ ln foo bar +$ ls -l +total 8 +-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 bar +-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 foo +$ tail .git/annex/daemon.log + 6c0fbd7..0bb8ef9 git-annex -> synced/git-annex + 0bae1b4..bfedc45 master -> synced/master + +sent 77 bytes received 31 bytes 72.00 bytes/sec +total size is 10 speedup is 0.09 +[2013-05-29 12:08:03 WEST] Transferrer: Uploaded foo +Already up-to-date. +[2013-05-29 12:08:05 WEST] Pusher: Syncing with golias +To ssh://golias.git-annex/home/pedrocr/testsync + 0bb8ef9..2ce5013 git-annex -> synced/git-annex +$ git status +# On branch master +# Changes not staged for commit: +# (use "git add ..." to update what will be committed) +# (use "git checkout -- ..." to discard changes in working directory) +# +# typechange: foo +# +# Untracked files: +# (use "git add ..." to include in what will be committed) +# +# bar +no changes added to commit (use "git add" and/or "git commit -a") +"""]] + +On the remote repository: + +[[!format sh """ +$ ls -l +total 4 +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo +"""]] + +If I now just touch the linked file on the repository: + +[[!format sh """ +$ touch bar +$ tail .git/annex/daemon.log + +(merging synced/git-annex into git-annex...) +(Recording state in git...) +add bar (checksum...) [2013-05-29 12:12:49 WEST] Committer: Committing changes to git +[2013-05-29 12:12:49 WEST] Pusher: Syncing with golias +Already up-to-date. +To ssh://golias.git-annex/home/pedrocr/testsync + 2ce5013..d36166b git-annex -> synced/git-annex + bfedc45..ee3a7a1 master -> synced/master +Already up-to-date. +"""]] + +On the remote repository: + +[[!format sh """ +$ ls -l +total 8 +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 bar +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo +"""]] + +Note that now bar has been synced as a new file and not a hardlink as it should be (the 1's after the permissions). + +The sync also isn't acting properly on the linked files. For example. + +First in the origin repository: + +[[!format sh """ +$ cat bar +something +$ cat foo +something +$ echo "someotherthing" > bar +$ cat bar +someotherthing +$ cat foo +someotherthing +"""]] + +The result in the destination: + +[[!format sh """ +$ cat bar +someotherthing +$ cat foo +something +"""]] + +So even if the intended behavior is for hardlinked files to be synced as two separate files the sync isn't correct because the two files changed in the origin and only one of them changed in the destination. This probably needs to be fixed with actual hard links for real filesystems and with some copying for crippled filesystems. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + + +> [[!taglink confirmed]] (but may be out of scope for git-annex) --[[Joey]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment new file mode 100644 index 000000000..5d7422c08 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 1" + date="2013-05-29T11:33:05Z" + content=""" +Implementing hard links will probably also require handling the edge case where the user has setup two repositories where one of them spans filesystems. So: + +- Repository A is all in a single filesystem +- Repository B has it's root in one filesystem and them /someotherdirectory/ is another filesystem. + +If the user in repository A does a \"ln /somefile /someotherdirectory/otherfile\" you'd need to treat this as in the crippled case as repository B can't do the hardlink spanning filesystems. + +Another edge case may also be that OSX supports hardlinked directories for use with their TimeMachine feature. The feature isn't exposed through the normal ln command but users may sometimes hack around that[1]. Also, any TimeMachine backups will naturally have hardlinked directories. + +[1] http://stackoverflow.com/questions/1432540/creating-directory-hard-links-in-macos-x +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment new file mode 100644 index 000000000..39d601dba --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-29T15:39:48Z" + content=""" +git does not support hard linked files, so neither can git-annex. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment new file mode 100644 index 000000000..179d80b21 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-29T16:11:46Z" + content=""" +It would be possible to make the assistant use the inotify CREATE event (which it currently ignores) to add a file to the repository when a hard link is created. However, when a hard linked file is modified, inotify only sends an event for the file that was changed, not for other hard links to it. So, without keeping track of all hard links that exist on my own, there's no way for the assistant to automatically handle that case. And even if it tried to, hard links to files in the repository from outside the repository would still allow modifying them without the assistant being able to detect it. + +Since hard links cannot be propigated over git anyway, I don't want to get into this mess. It's best to wontfix this I think. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment new file mode 100644 index 000000000..8e8acd9cb --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 4" + date="2013-05-29T18:48:10Z" + content=""" +I agree with your assessment for the traditional git-annex, as it's an extension of git. For the assistant (in direct mode at least) it seems like broken behavior, there will be files that exist on one side but not the other and files that have the same content on one side but not the other. + +I just had a look and unfortunately there doesn't seem to be a general way to do inode to path lookup in UNIX, so an inode cache would really be needed. It would look something like: + +* On inotify CREATE detect that the file has other hardlinked instances, find out if they are in the repository by keeping a inode->path cache of all files +* When the file is a hardlink to another file already in the repository commit some kind of special file to git that states \"hardlink to /path/to/otherfile\" and add metadata to the original file saying what files are hardlinks to it +* When a remote gets a special file after a sync it will itself run a \"ln /path/to/otherfile /path/to/newfile\" or alteratively a copy when the two paths span filesystems or the filesystem is crippled +* When a crippled remote gets a write to a file with hardlinks, it will replicate those writes to the other files (this is where the metadata is needed) +* When a crippled remote does a write to a file with hardlinks that file becomes independent in the remotes with hardlinks since the content is now different between the two (or more) files. + +This does get pretty hairy with the corner cases. Right now the simple case of \"sync between two non-crippled filesystems\" shows pretty surprising results though so I'd argue something needs to change. I think that for direct mode to really be a \"transparent folder sync\" kind of solution this should be fixed. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment new file mode 100644 index 000000000..52f3e30f7 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 5" + date="2013-06-26T16:34:23Z" + content=""" +To fix [[Problems_with_syncing_gnucash]], I have made some changes to how hard links are dealt with. + +Assistant will now notice when a hard link is created, and add the same thing to git it would add for any other file. The hard link is not propigated to other repositories. + +Files remain hard linked locally. This means that a change to one will affect the contents of the other. The assistant, lacking a hard link cache, will not notice this, and so will commit the change to the file that was written to, but not commit its hard link. Running `git annex add` manually (or restarting the assistant) will make it finally notice the other file has changed. + +So, the assistant still does not keep hard links in sync on an ongoing basis. This bug is still unsolved. +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn new file mode 100644 index 000000000..07d6f3eb3 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn @@ -0,0 +1,69 @@ +### Please describe the problem. + +[[!tag moreinfo]] + +I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error. + +### What steps will reproduce the problem? + +I am not really sure, I added a lot of files to the annex, almost 3TB. +Then either git-annex status or git-annex indirect cause a similar error (see below). + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130501-g4a5bfb3 +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Ubuntu precise +3.2.0-26-generic + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log +git-annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git S3 bup directory rsync web webdav glacier hook +repository mode: direct +trusted repositories: 0 +semitrusted repositories: 7 + 00000000-0000-0000-0000-000000000001 -- web + 0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex + 65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.) + 96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier + b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData + c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop + fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- . +untrusted repositories: 0 +dead repositories: 0 +transfers in progress: none +available local disk space: 81 gigabytes (+1 megabyte reserved) +temporary directory size: 9 megabytes (clean up with git-annex unused) +local annex keys: 61396 +local annex size: 3 terabytes +known annex keys: git-annex: out of memory (requested 985661440 bytes) + +OR + +git-annex indirect +commit git-annex: out of memory (requested 985661440 bytes) + + + + + +# End of transcript or log. +"""]] + +> [[fixed|done]]. However, if you saw this behavior, +> you have large files checked directly into git. You may +> want to examine your repository and use git filter-branch to clean +> it up. +> --[[Joey]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment new file mode 100644 index 000000000..06b56c47f --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="Marek" + subject="comment 1" + date="2013-05-03T21:12:39Z" + content=""" +I have not yet commited after git-annex add. +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment new file mode 100644 index 000000000..b0e5bb5c2 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-06T15:59:00Z" + content=""" +Looks like you have around 61396 files, which is not really very many. Is that guess accurate? + +I have repositories with that many files, that do not run out of memory, or even use much memory at all when running `git annex status`. Just tried and it needed 15 mb, not 900. + +Since you're using Ubuntu precise with a current version of git-annex, I'll bet you installed from fmarier's PPA. Is that right? + +In case this is a problem only with the build in the PPA, can you please download the [[/install/Linux_standalone]] tarball, and try the same command using the git-annex from there? +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment new file mode 100644 index 000000000..e4795e5a8 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 3" + date="2013-09-19T18:59:42Z" + content=""" +It turns out that if you are using direct mode and you manually `git commit some-file` that is really big, that file is checked directly into git. Which is why direct mode's docs say not to do that. + +Once you've got an enormous file in git, either on purpose on by mistake, it turns out that git-annex tries to buffer the whole file content in some situations. I am in the process of fixing those memory leaks. +"""]] diff --git a/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn new file mode 100644 index 000000000..d9bae5019 --- /dev/null +++ b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +As described earlier in [[tips/fully_encrypted_git_repositories_with_gcrypt]] + +### What steps will reproduce the problem? +- A: use the webapp to create a new repository +- A: add a remote server to the repository using the 'gcrypt' method +- A: add a jabber account + +- B: use the webapp to create a new repository +- B: add the jabber account +- B: see the previously created 'cloud repository' with status 'not enabled' +- B: click enable, see that the stored credentials are correct, and press "verify this server" +- B: enter the ssh password twice +- B: get redirected to a blank screen (on the url /config/repository/enable/gcrypt/UUID "x"?auth=y) + +The assistent logfiles show nothing after the "Your public key has been saved in", the server shows that no public key for B was added to the account. + +This is with git-annex installed on the remote server; without it the process gets stuck after clicking "encrypt repository" in step 2, it will just indefinitely keep prompting for the SSH password. + +### What version of git-annex are you using? On what operating system? +Latest nightly build on ubuntu 13.10 + +[[!tag moreinfo]] diff --git a/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment new file mode 100644 index 000000000..5bd45d686 --- /dev/null +++ b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-13T16:51:40Z" + content=""" +I've tried to reproduce this, and cannot; it enabled the repository without trouble. + +Also, I have never seen the webapp fail with a blank screen, so that's strange. + +I think you need to show your `~/annex/.git/annex/daemon.log` from B. +"""]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn new file mode 100644 index 000000000..9b5d52220 --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +Incorrect merge of direct repos. + +### What steps will reproduce the problem? + +[[!format sh """ +# setting up stuff +test/a$ git init +test/a$ git annex init +test/a$ git annex direct +test/a$ touch firstfile +test/a$ git annex add firstfile +$ git clone test/a +$ mv a test/b +test/b$ git annex direct + +# actual scenario +test/b$ echo bbbb > f +test/b$ git annex add f +test/b$ git annex sync +test/a$ mkdir f +test/a$ echo aaaa > f/f +test/a$ git annex add f/f +test/a$ git annex sync +test/b$ git annex sync +test/b$ rm f +test/b$ git annex sync +test/b$ ls +test/b$ firstfile +test/b$ f.variant-SHA256E-s5--4551db5fd4d56e27be71a8a943070cfaa4342b8e960a326e2d6427b3aa0a5a48.variant-43f5 +test/a$ git annex sync # A's f/f is no longer to be found +"""]] + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 4.20131031-g7d99d14 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +Linux ceilingcat 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment new file mode 100644 index 000000000..53c9f7915 --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-14T17:06:50Z" + content=""" +I verify this bug. And it's specific to direct mode as you say. Here is a shell script which automates the proccess: + +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true +cd .. +cd a +mkdir f +echo aaaa > f/f +git annex add f/f +git annex sync || true +cd .. +cd b +git annex sync +echo \"after merge:\" +ls +\"\"\"]] + +At this point, b only has the file version of f; the directory form has been removed. (Syncing to a of course then does the same thing there.) + +And from the trascript, we can see what's going on: + +
+Adding f/f
+CONFLICT (directory/file): There is a directory with name f in HEAD. Adding f as f~refs_heads_synced_master
+Automatic merge failed; fix conflicts and then commit the result.
+(Recording state in git...)
+f: needs merge
+[master 0600854] git-annex automatic merge conflict fix
+
+  Merge conflict was automatically resolved; you may want to examine the result.
+
+ +The problem seems to be that direct mode merge does not find the `f~refs_heads_synced_master` created by the merge, so fails to copy it from the temp merge tree into the work tree. + +`Command.Sync.cleanConflictCruft` is relevant, but was only made to work in indirect mode, it seems. + +---- + +Obviously, if someone runs into this bug and seems to lose data, they can get the data back by reverting the changes from the automatic merge. Direct mode does preserve file contents when removing them from the work tree in a merge. +"""]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment new file mode 100644 index 000000000..f9d3c7ffe --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 2" + date="2013-11-15T17:39:37Z" + content=""" +My initial guess was wrong.. This is not actually a bug in conflicted merge resolution at all. + +The bug is that in direct mode, it diffs the old and new tree when doing a normal merge, so see what files in the work tree need to be changed. This was written to go through the diff and replay the deletes and adds. In this case, since f/f and f are different items, they can appear in either order in the diff But the code only worked when f was first deleted, and f/f was then added. And it turns out that in this case, the diff had the two items the other way around. + +So, I think it needs to do 2 passes, first deleting and then adding. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn b/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn new file mode 100644 index 000000000..8e25ed6cb --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn @@ -0,0 +1,48 @@ +### Please describe the problem. +(Minor issue.) + +Incorrect merge of direct repos in the special case where at repo A a symlink to a file whose contents aren't yet available, are overwritten, while at repo B the file is deleted. + +Result: file is deleted on both side. + +Expected: B.f is gone, A.f is still present + +### What steps will reproduce the problem? + +[[!format sh """ +# setting up stuff +test/a$ git init +test/a$ git annex init +test/a$ git annex direct +test/a$ touch firstfile +test/a$ git annex add firstfile +$ git clone test/a +$ mv a test/b +test/b$ git annex direct + +# actual scenario +test/b$ echo bbbb > f +test/b$ git annex add f +test/b$ git annex sync +test/a$ git annex sync +test/a$ echo aaaa > f +test/a$ git annex add f +test/a$ git annex sync +test/b$ rm f +test/b$ git annex sync +test/a$ git annex sync +# test/a/f is now gone, lost +"""]] + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 4.20131031-g7d99d14 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +Linux ceilingcat 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux +"""]] + +> [[fixed|done]]; direct mode now freezes the content directory as indirect +> mode already did. fsck will fix up the permissions too. --[[Joey]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment new file mode 100644 index 000000000..0594ddabe --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-14T17:10:55Z" + content=""" +I suspect this might be the same underlying problem as [[bugs/Incorrect merge, direct repos (2)]]. However, I cannot reproduce it using the recipe given.. perhaps something was left out? + +I wrote this shell script to try to codify the recipe in a runnable form: + +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true +cd .. +cd a +echo aaaa > f +git annex add f +git annex sync +\"\"\"]] + +At this point, a has 2 variants of f, and no amount of syncing in either repo will cause either variant to go away. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment new file mode 100644 index 000000000..39bb90877 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 2" + date="2013-11-14T18:06:55Z" + content=""" +You were missing a: test/a$ git annex sync + +This did the trick on my system +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe # indeed it was + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true # why add a || true? +cd ../a +git annex sync +echo aaaa > f +git annex add f +git annex sync +cd ../b +rm f +git annex sync +ls +cd ../a +git annex sync +ls +\"\"\"]] +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment new file mode 100644 index 000000000..ce5c144e1 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-15T17:48:42Z" + content=""" +Hmm. In your script, when you run `git annex sync` in a and then `echo aaaa > f`, f already exists at that point as a symlink. This actually ends up following the link and writing to .git/annex/objects. (fsck will detect that junk has been written there) + +That's a bug on its own; seems like direct mode is neglecting to lock down the .git/annex/objects directories to prevent writing to them like this. + +---- + +However, this means that your script does not demonstrate the bug you originally reported. +You remove b/f and sync, and since a/f has not been changed, the deleting is correctly synced to a, removing a/f. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment new file mode 100644 index 000000000..c7bb02765 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 4" + date="2013-11-15T17:52:38Z" + content=""" +Looking back at the original bug description: + +\"repo A a symlink to a file whose contents aren't yet available, are overwritten, while at repo B the file is deleted.\" + +I think the \"overwritten\" is key. I suspect you were always doing echo > f where f was a symlink, and this does not actually overwrite the symlink, it just puts data (that fsck will reject) into the annex. + +So, proceeding as if the real bug here is the ability to write through symlink in direct mode, unless told otherwise.. +"""]] diff --git a/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn b/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn new file mode 100644 index 000000000..95db65e25 --- /dev/null +++ b/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +Git Annex is listed as of version 1.0.52 if you check out its entry in the list of applications in the Android configuration. I guess that one is of the terminal app which kickstarts the annex. + +### What steps will reproduce the problem? + +install apk + +### What version of git-annex are you using? On what operating system? + +android +5.2013whatever + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Installation_fails:___34__Duplicate_instance_declarations__34__.mdwn b/doc/bugs/Installation_fails:___34__Duplicate_instance_declarations__34__.mdwn new file mode 100644 index 000000000..db02036f4 --- /dev/null +++ b/doc/bugs/Installation_fails:___34__Duplicate_instance_declarations__34__.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +[380 of 462] Compiling Assistant.WebApp.Types ( Assistant/WebApp/Types.hs, dist/build/git-annex/git-annex-tmp/Assistant/WebApp/Types.o ) + +Assistant/WebApp/Types.hs:157:10: + Duplicate instance declarations: + instance PathPiece Bool + -- Defined at Assistant/WebApp/Types.hs:157:10 + instance PathPiece Bool + -- Defined in `path-pieces-0.1.4:Web.PathPieces' +cabal: Error: some packages failed to install: +git-annex-5.20140709 failed during the building phase. The exception was: +ExitFailure 1 + + +### What steps will reproduce the problem? + +cabal install git-annex --bindir=$HOME/bin + + +### What version of git-annex are you using? On what operating system? +git-annex-5.20140709, Fedora 20 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Already fixed in git yesterday. [[done]] --[[Joey]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn b/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn new file mode 100644 index 000000000..e8e802455 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +One of my repositories has no name: +http://screencast.com/t/3OjxFzpz + +And when I try to disable it I get this error: + + Internal Server Error + Unknown UUID + +When I try to delete it I get this error: + + Internal Server Error + unknown UUID; cannot modify + +I think this was the result of adding a Local Computer Repo, and then that computer signed off. Maybe. + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20130601-g2b6c3f2 +Mac OS 10.7.5 + +### Please provide any additional information below. + +Maybe it's a glitch that only will happen this once, the problem is I can't get rid of it! Are there anyways of manually getting rid of a repo with uid? + +> Also reported here: +> [[Missing_repo_uuid_after_local_pairing_with_older_annex]] and +> [[Internal_Server_Error_unknown_UUID;_cannot_modify]] +> and [[Local_network___40__ssh__41___fails_to_pair__47__sync]] +> and [[Internal_Server_Error:_Unknown_UUID]] +> --[[Joey]] + +[[!meta title="local pairing leads to unknown UUID"]] + +> This bug is [[fixed|done]]. The webapp will detect the problem and +> provides an interface to correct it. --[[Joey]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment new file mode 100644 index 000000000..e8494ab17 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="carlo" + ip="118.208.1.126" + subject="comment 1" + date="2013-07-06T22:52:18Z" + content=""" +I got the same error. Local repo has no name but in the logs I can see that it's trying to make a local connection: + + [2013-07-07 08:29:51 EST] main: starting assistant version 4.20130627 + [2013-07-07 08:29:51 EST] TransferScanner: Syncing with arkham.local_annex + +(snip) + + 07/Jul/2013:08:41:56 +1000 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + 07/Jul/2013:08:42:32 +1000 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + +When I turn on arkham (the other laptop) I see transfers start up: + + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment new file mode 100644 index 000000000..46fcc0898 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkeyfC88gIU4fsEqqkvhzVlSKDUxbtZaTE" + nickname="Selem" + subject="comment 2" + date="2013-07-10T01:41:24Z" + content=""" +I got the same problem (Mac OS X 10.8.4, whatever the latest download package, local computers same network repos) + +To get rid of the noname repo, I just removed git remote in the annex dir. + + # List remote + $ git remote -v + # Remove remote grabbed from running the previous command + $ git remote rm your_remote + +After that, I added the second computer repo successfully. + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment new file mode 100644 index 000000000..3bdba306d --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="I can't reproduce this problem, but I see several people have reported it." + date="2013-07-27T22:11:15Z" + content=""" +It would be helpful for anyone who can reproduce this problem to do so with debugging enabled on both sides + (run with --debug or turn it on in the Configuration page in webapp), and then send the `.git/annex/daemon.log` +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment new file mode 100644 index 000000000..87da8dc31 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Same here for SSH remotes" + date="2013-07-29T19:05:55Z" + content=""" +I get the problem while only adding an SSH remote. After deciding I want a git-repo on my server, it says \"Unknown UUID\" and created a remote with no name. I was unable to add any SSH remote (tried with two different servers and a couple different dirs - some completly unknown to my annex) + +I used the Android webapp btw - latest Version. The same version works fine on my Debian maschines. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment new file mode 100644 index 000000000..1f42daf5f --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 5" + date="2013-07-30T16:59:50Z" + content=""" +@subito I have tried as hard as I can to reproduce this problem, and cannot. I need the debug information I asked for in my other comment to get any further on this bug report. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment new file mode 100644 index 000000000..9e28682b4 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="finally!" + date="2013-07-31T16:47:39Z" + content=""" +I've finally been clued in to the cause of this. If a ssh-agent is running, and has been configured to use a ssh key (by running `ssh-add`), this apparently prevents git-annex from using the key it sets up during local pairing. I have reproduced the described bug by this method. + +Something similar might also affect adding a remote ssh server, I'm not sure about that yet. + + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment new file mode 100644 index 000000000..136bca8f4 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="workaround" + date="2013-07-31T17:19:01Z" + content=""" +Looks like the fix is to edit ~/.ssh/config and in each stanza added by git-annex, add this line: + + IdentitiesOnly yes + +This prevents the ssh-agent from using the normal key, and allows the git-annex key to be used instead. + +People experiencing this bug can manually make that change. Then if you edit your git-annex repository's `.git/config` and delete the `annex-ignore` line, the assistant should finally learn the UUID and start syncing. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment new file mode 100644 index 000000000..54bd855cf --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 8" + date="2013-07-31T20:42:10Z" + content=""" +I've updated the webapp to display nicely when a repository has stalled being set up, rather than crashing. + +There's now an interface to check the status of such a stalled repository, and it will try to clean up after this bug too. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment new file mode 100644 index 000000000..4a99ee3ad --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Tilde did it for me" + date="2013-10-06T21:59:43Z" + content=""" +I had exactly the same error message, \"Internal Server Error: Unknown UUID\", when I used a path starting with a tilde. Absolute path for home directory worked. +"""]] diff --git a/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn b/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn new file mode 100644 index 000000000..7767b83e2 --- /dev/null +++ b/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +I was trying to use "Local Computer" option to sync up two machines on my local network. I was having some firewall issues and it failed on one machine. +It still created a repository without a name in the web ui and i get that Error unknown UUID when trying to edit or delete it. + +### What steps will reproduce the problem? +Machine A initiates pairing. Machine B accepts pairing. Machine A has a firewall blocking outgoing connections. +Machine B times out. Machine A accepts outgoing connections for vnetd. Machine A starts syncing with Machine B. +Machine B gets files but have a broken web ui. + + +### What version of git-annex are you using? On what operating system? + +4.20130601-g2b6c3f2 +OSX 10.7.5 on both Machine A and B + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[Internal_Server_Error:_Unknown_UUID]] --[[Joey]] diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn new file mode 100644 index 000000000..0e7d61b2f --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? + +Adding files to a local annex set up to sync to a remote S3 one + + +What is the expected output? What do you see instead? + +It syncs, but maxes out the uplink + + +What version of git-annex are you using? On what operating system? + +3.20121112 on Debian testing + + +Please provide any additional information below. + +The man page lists how to configure rate limiting for rsync, not sure how to do it for this + +[[!tag confirmed]] diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment new file mode 100644 index 000000000..67de2becf --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-11-13T15:10:45Z" + content=""" +There's always trickle.. + + trickle -u 50 git annex ... +"""]] diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment new file mode 100644 index 000000000..122bafbba --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 2" + date="2012-11-13T17:09:31Z" + content=""" +It's not there yet. I don't think it will be hard to add, most of the same things need to be done to support upload progress bars with S3. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn b/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn new file mode 100644 index 000000000..394213220 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn @@ -0,0 +1,27 @@ +I was dumping ~gigs of files of approximately 3-6megs a pop (my music collection) so I could track the files that I want to listen to when I'm on the go. I had the git watch command running from the assistant branch. + +I was getting something along the lines of... + + /Users/jtang/annex/.git/annex/tmp/: openTempFile: resource exhausted (Too many open files) + +and + + git-annex: createPipe: resource exhausted (Too many open files) + +I also noticed that I somehow ended up with 256 ssh-agent's running on one of my machines, I'm not sure if the two issues are related or not, I had not noticed this type of behaviour up until recently. + +Also this was appearing in the logs + + x00:annex jtang$ tail -f .git/annex/daemon.log + (scanning...) Already up-to-date. + kqueue: Too many open files + +To be precise, I suspect that the kqueue limit is 256, I had 325 files in the 'queue', I ended up doing a _git annex add_ manually and all was fine. + +[[!meta title="kqueue system limits"]] + +> This affects BSD systems that use Kqueue. It no longer affects OSX, +> since we use FSEvents there instead. --[[Joey]] + +[[!tag /design/assistant]] +[[!tag confirmed]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment new file mode 100644 index 000000000..d30cddca5 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 1" + date="2012-06-25T15:42:48Z" + content=""" +Yes, this is a known problem with kqueue, it has to keep every directory in the tree open. On [[design/assistant/inotify]] I have a note that it may need to fork off extra watcher processes to deal with this. Of course that adds significant complication. + +In the meantime, you may be able to increase your system's maximum allowed number of open files per process somehow. + +(I doubt that the ssh-agent is related; git-annex does not use ssh-agent directly anyway..) +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment new file mode 100644 index 000000000..17dcf7634 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-06-29T12:02:48Z" + content=""" +Doing, + + sudo sysctl -w kern.maxfilesperproc=400000 + +Somewhat works for me, git-annex watch at least starts up and takes a while to scan the directory, but it's not ideal. Also, creating files seems to work okay, when I remove a file the changes don't seem to get pushed across my other repos, running a sync on the remote repo fixes things. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment new file mode 100644 index 000000000..eb886acf6 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 3" + date="2012-07-04T12:32:44Z" + content=""" +Jimmy, sounds like I could use something like this to get the current limit: + + sysctl kern.maxfilesperproc + +Probably prints \"sysctl kern.maxfilesperproc = 256\" or such.. can you verify? +Once I have the limit, I can make the kqueue code use subset of it, and print out a message when it needs to be increased, like the inotify code does. + +(Also, the kqueue code only opens directories, not files, so unless you have 400000 directories, that's +a little high.) + +--- + +On file removal not propigating, does this still happen? When you remove a file does a git commit automatically happen, or is that broken with kqueue? +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment new file mode 100644 index 000000000..509752bf1 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 4" + date="2012-07-08T18:13:58Z" + content=""" +On kFreeBSD, I get this: + + $ sysctl kern.maxfilesperproc + kern.maxfilesperproc: 11095 + +But ulimit still has 1024 limit, so you'd need to adjust both, as root. Messy.. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment new file mode 100644 index 000000000..30ea6b310 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-07-04T13:17:05Z" + content=""" +In relation to the system limits, + + laplace:~ jtang$ sysctl kern.maxfilesperproc + kern.maxfilesperproc: 10240 + +Also, the maxfiles for the whole system is + + laplace:~ jtang$ sysctl kern.maxfiles + kern.maxfiles: 12288 + +the above was the defaults as far as I recall. What you probably would be interested is the ulimits that the user see + + laplace:~ jtang$ ulimit -a + core file size (blocks, -c) 0 + data seg size (kbytes, -d) unlimited + file size (blocks, -f) unlimited + max locked memory (kbytes, -l) unlimited + max memory size (kbytes, -m) unlimited + open files (-n) 256 + pipe size (512 bytes, -p) 1 + stack size (kbytes, -s) 8192 + cpu time (seconds, -t) unlimited + max user processes (-u) 709 + virtual memory (kbytes, -v) unlimited + +I would imagine the limit that you are looking for is 256. Hope this helps. + +---- + +On the point about deletions not being propagated, it does do a commit. I suspect that the kqueue code is just not picking up the changes and pushing the changes out. The watch command on a single annex with no remotes functions as expected. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment new file mode 100644 index 000000000..cd5c73a7a --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-06-25T22:36:39Z" + content=""" +On the system limits side, I think if you want to make it more approachable by more users then adjusting system limits might scare users away. On the note of the ssh-agents spawning like no tomorrow on my machine, it turned out that i had a symlink from my .bashrc to .bash_profile, I guess I should not be too lazy and have two seperate files. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment new file mode 100644 index 000000000..b65dc4dfc --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="Just encountered this today" + date="2012-11-29T19:21:50Z" + content=""" +& it's killing my assistant. + +Found a workaround here: https://github.com/mockko/livereload/issues/1 + +This fixes it for now: + +ulimit -n 4096 + +Just posting here in case anybody else runs into this issue and, like me, finds themselves here via search engine. + +"""]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn new file mode 100644 index 000000000..914825209 --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn @@ -0,0 +1,25 @@ +What steps will reproduce the problem? + +Run the git-annex assitant, and then "sudo kill" it. + +What is the expected output? What do you see instead? + +I expect it to die, instead I end up with: + + 14604 ?? S 0:00.64 ga assistant + 14623 ?? Z 0:00.00 (git) + 14624 ?? Z 0:00.00 (git) + 14936 ?? Z 0:00.00 (git-annex) + +The only way to clear these zombies is to reboot. Perhaps there is some resource not being correctly terminated under exceptional conditions? + +Note that on OpenIndiana the problem is even more severe: Aborting git-annex at the wrong time leaves behind both zombie processes and lock files which cause the machine to suddenly halt if I try to access them in any way (via mv, rsync, etc)! + +What version of git-annex are you using? On what operating system? + +4d1e0c9 on OS X 10.8.2. + +Please provide any additional information below. + +[[!meta title="strange OSX behavior when killed"]] +[[!tag /design/assistant/OSX moreinfo]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment new file mode 100644 index 000000000..8d7eea6c5 --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Correction" + date="2012-10-20T05:34:47Z" + content=""" +If I \"sudo kill -9\" all the processes in the above group after deleting the annex directories, then they do go away without needing to reboot. +"""]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment new file mode 100644 index 000000000..2b552c6aa --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 2" + date="2012-10-22T14:01:42Z" + content=""" +It's not at all clear to me from this what process you killed. + +(I can't comment on files that somehow crash a kernel on access.. That's not in any UNIX spec I'm aware of.) +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn new file mode 100644 index 000000000..ebb55543d --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn @@ -0,0 +1,18 @@ + [0 zerodogg@firefly git-annex]$ ls + bin/ favicon.png git-annex git-annex-shell git-core/ lib/ libdirs linker README shimmed/ uninstall + etc/ gconvdir git-annex.MANIFEST git-annex-webapp install-haskell-packages lib64/ LICENSE logo.svg runshell templates/ usr/ + [0 zerodogg@firefly git-annex]$ pwd + /home/zerodogg/.local/share/git-annex + [0 zerodogg@firefly git-annex]$ ./git-annex version + /home/zerodogg/.local/share/git-annex/bin/git-annex: line 2: /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2: No such file or directory + [127 zerodogg@firefly git-annex]$ ls -l /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 + lrwxrwxrwx. 1 zerodogg zerodogg 32 2012-12-30 16:35 /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.13.so + [0 zerodogg@firefly git-annex]$ ls /lib/x86_64-linux-gnu/ld-2.13.so + ls: cannot access /lib/x86_64-linux-gnu/ld-2.13.so: No such file or directory + +This is on Fedora 20, 64bit, installed from http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz as of Sun Dec 22 00:44:53 CET 2013. + +> [[fixed|done]]; converted ugly shell code to much nicer haskell code, +> which let me reuse relative symlink generation code from git-annex +> to fix this. Updated the amd64 build for the last release only. +> --[[Joey]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment new file mode 100644 index 000000000..60012d2cd --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.194.17" + subject="32 bit standalone works (on 64 bit) however" + date="2013-12-22T11:37:24Z" + content=""" +SSIA +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment new file mode 100644 index 000000000..b9cc82a7b --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTlfbCC37CAjhQrS107ZWRVA_sF4s3gLU" + nickname="Juergen" + subject="Same here broken " + date="2013-12-22T12:11:57Z" + content=""" +It's broken here too. Debian testing 64bit . + + +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment new file mode 100644 index 000000000..23ca8f72c --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="Workaround/Fix" + date="2013-12-22T14:23:09Z" + content=""" +Broken here on Linux Mint 13 Maya (Ubuntu 12.04 precise) too. The reason is a dangling symlink. Fix: + + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ./git-annex version + Segmentation fault + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ rm lib64/ld-linux-x86-64.so.2 + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ln -s ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 lib64/ + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ./git-annex version + git-annex version: 5.20131221-gf8c928d + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment new file mode 100644 index 000000000..3a5e1947b --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 4" + date="2013-12-23T16:45:23Z" + content=""" +clacke's workaround works for me, as well, on 5.20131223-gafb776f (ie: issue still present on 5.20131223-gafb776f) +"""]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn new file mode 100644 index 000000000..e4eef758a --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn @@ -0,0 +1,43 @@ +### Please describe the problem. +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by git-annex) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libidn.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgnutls.so.26) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libxml2.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libxml2.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgmp.so.10) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libffi.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libntlm.so.0) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.16' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libk5crypto.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libcom_err.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcrypt.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcrypt.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libtasn1.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libp11-kit.so.0) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libstdc++.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libstdc++.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcc_s.so.1) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5support.so.0) + +### What steps will reproduce the problem? +$git-annex + +### What version of git-annex are you using? On what operating system? +v20130723, 64-bit, Debian Stable + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +Also note, the last build 20130709 was compatible with glibc 2.13 + +> [[fixed|done]]; builds are back to using debian stable. +> also updated the autobuilds and last release's builds. --[[Joey]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment new file mode 100644 index 000000000..f50471ca0 --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-07-25T17:00:53Z" + content=""" +Thank you for reminding me why I was using debian stable chroots for the autobuilds. + +Unfortunately, I forgot about this problem and upgraded the chroots. Rebuilding them with all the stuff I need is going to take a while. +"""]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment new file mode 100644 index 000000000..1d7685bb1 --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://jamdev.myopenid.com/" + ip="117.195.168.15" + subject="well that was fast!" + date="2013-07-25T21:01:38Z" + content=""" +Hey Joey + +Confirming this as fixed, thanks. + +-have a nice weekend! +"""]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn new file mode 100644 index 000000000..bff665a5e --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn @@ -0,0 +1,177 @@ +### Please describe the problem. +I am trying to set out two computers on the same network to synchronise. + +### What steps will reproduce the problem? +Install Git-Annex. Start the webapp. Try to connect. Enter a secret phrase on both. The Mythbuntu machine shows "Failed to sync with Inspiron 14z" (the laptop). The laptop shows "Pairing in progress" forever. + +The machines can normally connect together passwordlessly through ssh with public key encryption. + +### What version of git-annex are you using? On what operating system? +Ubuntu Raring Version: 3.20121112ubuntu2 from the repos on my laptop. Install version 4.20130627 from the PPA on Mythbuntu Precise (which I use as a home server). + +### Please provide any additional information below. +From the the laptop, where I started the pairing: +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ git-annex webapp + +(process:3084): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed + +** (firefox:3084): WARNING **: Failed to find domain member of JSON manifest +Running global cleanup code from study base classes. +(Recording state in git...) + +Launching web browser on file:///tmp/webapp3075.html +(scanning...) + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided by any .service files", clientErrorFatal = False}) +(started...) Generating public/private rsa key pair. +Your identification has been saved in /tmp/git-annex-keygen3075.0/key. +Your public key has been saved in /tmp/git-annex-keygen3075.0/key.pub. +The key fingerprint is: +79:00:67:a4:f0:5f:62:26:78:ed:09:97:e4:c4:dd:56 aaron@Inspiron-14z +The key's randomart image is: ++--[ RSA 2048]----+ +| . .o*. . .E | +| + X... o | +| . * X .. | +| . O * | +| S . | +| . | +| | +| | +| | ++-----------------+ +Control socket connect(/home/shared/annex/.git/annex/ssh/mythbuntu@git-annex-mythbuntu-server.local-mythbuntu): Connection refused +Failed to connect to new control master +warning: no common commits + + Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore +Already up-to-date. +Counting objects: 13, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (9/9), done. +Writing objects: 100% (11/11), 1.06 KiB, done. +Total 11 (delta 2), reused 0 (delta 0) +To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/ + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +Already up-to-date! +Merge made by the 'recursive' strategy. +Already up-to-date. +Already up-to-date. +Counting objects: 2, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (2/2), done. +Writing objects: 100% (2/2), 326 bytes, done. +Total 2 (delta 1), reused 0 (delta 0) +To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/ + 82bf946..dfe0bd1 master -> synced/master +Already up-to-date. +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a1850) +SendMessage (0, 0x1204, (nil), 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a1850) +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a1810) +SendMessage (0, 0x1204, (nil), 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a1810) +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a2920) +SendMessage (0, 0x1204, (nil), 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a2920) +Redirection loop trying to set HTTPS on: + http://www.aol.com/favicon.ico +(falling back to HTTP) +SendMessage (77594652, 0x444, 0x1, 0x3652e00) +SendMessage (77594652, 0x444, 0x1, 0x3647de0) +SendMessage (77594652, 0x444, 0x1, 0x3667a80) +SendMessage (77594652, 0x444, 0x1, 0x3667a80) + +# End of transcript or log. +# End of transcript or log. +"""]] + +On the Mythbuntu machine: +[[!format sh """ +$ git-annex webapp +Launching web browser on file:///tmp/webapp8399.html +(Recording state in git...) +"""]] + +Unless I'm going mad, there doesn't seem to be a daemon.log on my laptop. + +Daemon.log on the Mythbuntu machine: +[[!format sh """ +[2013-07-14 10:38:56 BST] main: starting assistant version 4.20130627 +(scanning...) [2013-07-14 10:38:56 BST] Watcher: Performing startup scan +(started...) [2013-07-14 10:38:57 BST] PairListener: aaron@Inspiron-14z:/home/shared/annex is sending a pair request. +Generating public/private rsa key pair. +Your identification has been saved in /tmp/git-annex-keygen.0/key. +Your public key has been saved in /tmp/git-annex-keygen.0/key.pub. +The key fingerprint is: +bb:8c:66:05:22:8e:fa:e1:10:33:6d:cb:d6:57:e2:47 mythbuntu@mythbuntu-server +The key's randomart image is: ++--[ RSA 2048]----+ +| | +| | +| | +| .. . . | +|+oo. ...E | +|.*.o . +.. | +|o = . o.o | +|.+ . .o+ . | +| .o o. o | ++-----------------+ +[2013-07-14 10:39:13 BST] main: Pairing with aaron@Inspiron-14z:/home/shared/annex in progress +ssh: connect to host Inspiron-14z.local port 22: Connection refused +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +[2013-07-14 10:39:17 BST] PairListener: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +Already up-to-date. +Already up-to-date. +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +Updating 82bf946..dfe0bd1 +Fast-forward +[2013-07-14 10:39:56 BST] Pusher: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +"""]] + +[[!taglink moreinfo]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment new file mode 100644 index 000000000..272cf2684 --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="Some things working" + date="2013-07-14T10:06:13Z" + content=""" +Oh, that's odd... + +The Mythbuntu machine says it fails and the laptop screen still says pairing, but a new window on the laptop says that it synced with the Mythbuntu server. On the Mythbuntu server, it has a blank entry for the laptop, which if you click to edit says \"Internal Server Error\" \"Unknown UUID\". + +When I add things on the laptop, they immediately become shortcuts and an equivalent shortcut appears on the Mythbuntu machine, though updates to the content (in this case a text file) are not sychronised. + +Adding a file on the Mythbuntu machine does not turn into a shortcut and nothing appears on the laptop. +"""]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment new file mode 100644 index 000000000..09d7a6d59 --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 2" + date="2013-07-28T00:27:23Z" + content=""" +Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore + +So, how did you install git-annex on mythbuntuserver? What does the `.ssh/authorized_keys` on mythbuntuserver look like? (In particular the key that git-annex adds to it, which should be set to run git-annex-shell.) +"""]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn b/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn new file mode 100644 index 000000000..371b923cf --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Attempting to pair between a local repository and a repository on a remote computer on my LAN. Pairing is initiated from my local machine and I'm interacting with the webapp on the remote machine via firefox running over an ssh -X connection. Pairing appears to work up to a point: I enter the secret at one end, the pairing request shows up at the other end. I then enter the secret at that end. + +What is the expected output? What do you see instead? + +Pairing should complete successfully. Instead I get the error message "PairListener crashed: bad comment in public key", followed by the public key. The pairing process then does not move beyond the 'awaiting pairing' pages. + +What version of git-annex are you using? On what operating system? + +Local Machine: 3.20121127, Debian Wheezy/Sid (the only package from unstable is git-annex). +Remote Machine: 3.20121113, Arch Linux (I installed the version from: https://aur.archlinux.org/packages/git-annex-bin/, which is supposedly the same as above, but reports the version specified here). + +Please provide any additional information below. + +None as yet. Let me know if there are any log files, etc. that I can post. + +> So it was the period in the hostname! [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment new file mode 100644 index 000000000..4dd77f04d --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.72" + subject="comment 1" + date="2012-12-04T17:38:47Z" + content=""" +On the machine that didn't crash, run: + +ssh-keygen -P \"\" -f test; cat test.pub + +Probably the non-alphanumeric character is part of the machine's hostname, or perhaps your username. We'll see.. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment new file mode 100644 index 000000000..851dfe9f8 --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="robconnolly" + ip="118.90.115.19" + subject="comment 2" + date="2012-12-06T02:29:56Z" + content=""" +Hi Joey, + +Thanks for your response. Here is the output: + +[robert@laforge ~]$ ssh-keygen -P \"\" -f test; cat test.pub +Generating public/private rsa key pair. +Your identification has been saved in test. +Your public key has been saved in test.pub. +The key fingerprint is: +84:43:aa:f0:ba:a7:f0:11:41:55:3b:c4:63:6a:71:e1 robert@laforge.enterprise +The key's randomart image is: ++--[ RSA 2048]----+ +| ...o=. | +| . .==o | +|. . .=E.. | +| o oo + | +| +. S | +| . . | +|o . | +|.o.. | +|oo. | ++-----------------+ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIeitbarby1thLPEyVpeT/vDaWt0MJwLPvhT7TEZv0FedYalvz/mm3enULHiYdxkjWGBaO/EEzfmz5bjhoJx2tsqSLsUj/UZVv0LxsSfZwTrk0SPuUerzWvAJAXKvtPobDXJoAxsNvzSJN392BMOLKqcjAQTqPA3vd5+EjUVIgJxguz5poGrP0ZRMQD5LmsDrPGUWNJ/EHaVkrqGobAE4DVr8vhJTY41h5Gk2ipnzx+GD6CDZTSNFwl8RorjFAV3mYTTjHc2Cz7GxTLSmwF0+qFZ/UkiO2tD1M37Y4/cPLY7GpVfKvpPHTC8pJUpvj+B4uujHxvZkBJLLz9XhH9KsZ robert@laforge.enterprise + +Let me know if you need any more info. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn new file mode 100644 index 000000000..2875e63e4 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +Creating a USB repo fails with a GPG error. + +### What steps will reproduce the problem? + + * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127 + * Run git-annex app to launch web interface + * Create local repo using web interface + * Try to create USB repo using web interface + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20131105-g136b030 on Mac OS 10.9 Mavericks. + +### Please provide any additional information below. + +[[!format sh """ +07/Nov/2013:06:51:07 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] + +> [[fixed|done]]; it seems that this was a local build issue ad does not +> affect the autobuild. --[[Joey]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment new file mode 100644 index 000000000..34d8d94b1 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Updated version 4.20131105-g136b030 seems to work" + date="2013-11-07T20:28:55Z" + content=""" +I've updated to the latest version as of 12 hours ago and I was able to create a USB repo on two computers. 4.20131105-g136b030 showing on the web app but 20131106 on the command line. + +Is there an easy way of checking the repo is correctly encrypted? I didn't see anything about encrypting (now the previous error has disappeared) when creating the repo - is this what I should expect? +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment new file mode 100644 index 000000000..83e0b2317 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2013-11-08T17:36:53Z" + content=""" +USB repos are not set up encryption unless you explicitly request it. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment new file mode 100644 index 000000000..0b3a804b9 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Yes, I just figured that out" + date="2013-11-08T22:09:40Z" + content=""" +I figured it out a couple of hours ago when I was able to use the existing USB repo on a new computer that doesn't have any of my private keys on it. + +I didn't see an option in the web interface to use encryption - is it command line only? +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn new file mode 100644 index 000000000..5c70527fd --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +Creating a remote S3 repository using the git-annex assistant web interface fails with a GPG error. (I'm also getting a GPG error trying to create a USB repo but it's slightly different so I'll post a different bug.) + +### What steps will reproduce the problem? + + * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127 + * Run git-annex app to launch web interface + * Create local repo using web interface + * Try to create encrypted S3 remote repo using web interface + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20131105-g136b030 on MacOS 10.9 Mavericks. + +### Please provide any additional information below. + +[[!format sh """ + +(encryption setup) dyld: Library not loaded: @rpath/libz.1.2.8.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/gpg + Reason: image not found +07/Nov/2013:06:38:27 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) + +"""]] + +> [[fixed|done]]; it seems that this was a local build issue ad does not +> affect the autobuild. --[[Joey]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment new file mode 100644 index 000000000..0f1e34e31 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="S3 works without encryption" + date="2013-11-06T21:09:26Z" + content=""" +Not surprisingly, S3 repos work without encryption. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment new file mode 100644 index 000000000..6b3ca2a0b --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Still fails with git-annex version 4.20131105-g136b030" + date="2013-11-07T20:32:09Z" + content=""" +Updating seems to have fixed my other problem with creating a USB repo but still fails when trying to create an encrypted S3 repo. + + (encryption setup) dyld: Library not loaded: @rpath/libz.1.2.8.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/gpg + Reason: image not found + 08/Nov/2013:07:30:11 +1100 [Error#yesod-core] user error (gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment new file mode 100644 index 000000000..e2ae9c3dc --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2013-11-08T17:38:40Z" + content=""" +Looks like it failed to include libz.1.2.8.dylib in the bundle for some reason despite gpg needing it. + +I don't really see the point in building an app bundle if you're going to install it back to the same machine you built it on. It's much easier to just `cabal install git-annex` in this case. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment new file mode 100644 index 000000000..8c7450ca6 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Maybe I'm missing something..." + date="2013-11-08T22:12:04Z" + content=""" +But does cabal install git-annex install the assistant? On the Mac, I use the app bundle to launch the web interface from my applications folder. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment new file mode 100644 index 000000000..f94f2d9c8 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="To answer my own question - "git annex webapp"" + date="2013-11-09T00:10:28Z" + content=""" +Will open the web app from the command line. + +But now I get a different error trying to create an encrypted S3 repo. + + (encryption setup) 09/Nov/2013:11:08:56 +1100 [Error#yesod-core] user error (gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 127) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment new file mode 100644 index 000000000..19313d9a7 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Works with git annex on command line" + date="2013-11-09T20:18:38Z" + content=""" +git annex initremote cloud type=S3 keyid=key correct creates an encrypted S3 repo and I'm able to upload files. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment new file mode 100644 index 000000000..a67c59451 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 7" + date="2013-11-15T19:00:25Z" + content=""" +It would be useful if you could test with the 10.9 build now available in [[install/OSX]]. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment new file mode 100644 index 000000000..cff7e9dee --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 8" + date="2013-11-15T21:31:40Z" + content=""" +Thanks Joey - I was able to create an encrypted S3 repo using the new Mavericks build. Files are transferring across and are encrypted. +"""]] diff --git a/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn new file mode 100644 index 000000000..7401d79fb --- /dev/null +++ b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn @@ -0,0 +1,12 @@ +Latest build for Mac OS X (both autobuild and release versions) does not contain webapp. + +git annex version for OS X, + + git-annex version: 5.20140306-g309a73c + build flags: Assistant Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN2 56 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +whereas on my Linux box build flags include webapp. On os x when I run git annex webapp it does nothing, just prints the help info. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment new file mode 100644 index 000000000..b13eab08f --- /dev/null +++ b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-07T15:17:16Z" + content=""" +I've fixed the missing warp-tls dep on the autobuilder and updated the builds. +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn new file mode 100644 index 000000000..5de6d2aa5 --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +Joey, it looks like the git version wasn't updated with the latest release as is still too old to respect .gitignore files. I'm hoping that I haven't just made a silly mistake but I don't think I have... + +See http://git-annex.branchable.com/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore/ for bug that was closed. + +### What steps will reproduce the problem? + +Install git-annex 5.20140209-g3a61dbe and try to use .gitignore file to exclude items from git annex. + +### What version of git-annex are you using? On what operating system? + +5.20140209-g3a61dbe on Mac OS 10.9.1. + +### Please provide any additional information below. + +[/Applications/git-annex.app/Contents/MacOS]# ./git annex version + +git-annex version: 5.20140209-g3a61dbe +build flags: Assistant Webapp Pairing S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +[/Applications/git-annex.app/Contents/MacOS]# ./git --version + +git version 1.8.3.4 (Apple Git-47) + +> Really [[fixed|done]] now. --[[Joey]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment new file mode 100644 index 000000000..afa6cc8f6 --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-20T18:59:44Z" + content=""" +I thought it got upgrades, perhaps it was downgraded again? I have prodded Kevin. +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment new file mode 100644 index 000000000..1bd1e037e --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 2" + date="2014-02-21T07:03:20Z" + content=""" +Thanks Joey and Kevin. Glad to have the bug really fixed and glad to know that I wasn't missing something obvious! +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment new file mode 100644 index 000000000..591d4e80f --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 3" + date="2014-02-21T22:05:06Z" + content=""" +And yep, it's fixed in 5.20140221-g1a47f5f. Thanks guys! +"""]] diff --git a/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn b/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn new file mode 100644 index 000000000..0cf61bb0f --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. + +Git annex assistant ignores .gitignore file due to packaged git version being too old. + +I have a locally installed version that is greater than the 1.8.4 needed to respect .gitignore but git annex doesn't use it. + +### What steps will reproduce the problem? + +- Create local repository using webapp +- Add .gitignore file to local repository +- Add files that match .gitignore patterns and watch git annex add them + +### What version of git-annex are you using? On what operating system? + +Git Annex assistant version 5.20140128-g0ac94c3 on Mac OS 10.9.1 + +### Please provide any additional information below. + +Log message is "The installed version of git is too old for .gitignores to be honored by git-annex." + +[[!format sh """ +# /Applications/git-annex.app/Contents/MacOS/git-annex version +git-annex version: 5.20140128-g0ac94c3 +build flags: Assistant Webapp Pairing S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +# /Applications/git-annex.app/Contents/MacOS/git --version +git version 1.8.3.4 (Apple Git-47) + +# which git +/usr/local/bin/git + +# /usr/local/bin/git --version +git version 1.8.5.3 +"""]] + +> [[fixed|done]]; it has been updated to 1.8.5.3 on the autobuilder. --[[Joey]] diff --git a/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn b/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn new file mode 100644 index 000000000..cb0247766 --- /dev/null +++ b/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn @@ -0,0 +1,89 @@ +### Please describe the problem. + +The `manual` content mode doesn't follow the description provided in the help page, instead it seems to collect content. + +### What steps will reproduce the problem? + +1. Create a new git annex repository using the webapp, set the content type to `client`. +2. Create another repository, and set the content type to `manual`. +3. Copy something into the `client` repository. +4. It will be pushed/pulled into the `manual` repository. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130521-g25dba9d + Ubuntu 13.04 x64. + +### Please provide any additional information below. + +I have also noticed very weird behaviour that I have been unable to replicate in testing, but I will describe the setup that it currently happens in: +I have 3x repositories, one a `client` repository, and the other two are set to `manual`. When put a new file into the `client` repository, it is pushed onto the two `manual` repositories. When these repositories have received it, the client drops the file and re-downloads it from one of the `manual` repositories. Once it's been pushed, deleted, and pulled, everything is happy... but the extra step makes no difference. + +[[!format sh """ +[2013-05-22 20:41:44 EST] main: starting assistant version 4.20130521-g25dba9d +[2013-05-22 20:41:44 EST] TransferScanner: Syncing with test3, test2 +Already up-to-date. + +(scanning...) [2013-05-22 20:41:44 EST] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. + + +(started...) From /home/valorin/workspace/tmp/test3 + f285dc2..406c20c git-annex -> test3/git-annex + cdf2ad3..508983c master -> test3/master +From /home/valorin/workspace/tmp/test2 + 1e04829..1c03533 git-annex -> test2/git-annex + 8ad4bd3..18a5408 master -> test2/master +Updating 508983c..18a5408 +Fast-forward +Already up-to-date. +To /home/valorin/workspace/tmp/test2 + 4e49293..a66ce5d git-annex -> synced/git-annex + 508983c..18a5408 master -> synced/master +To /home/valorin/workspace/tmp/test3 + 4e49293..a66ce5d git-annex -> synced/git-annex + 508983c..18a5408 master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-05-22 20:42:07 EST] Committer: Adding Firefly S..acked.m4v + +(merging test3/git-annex into git-annex...) +(merging test2/git-annex into git-annex...) +(Recording state in git...) + + + + +add Firefly S01E03 Bushwhacked.m4v (checksum...) [2013-05-22 20:42:15 EST] Committer: Committing changes to git +[2013-05-22 20:42:15 EST] Pusher: Syncing with test3, test2 +Already up-to-date. +To /home/valorin/workspace/tmp/test2 + a66ce5d..a6773dd git-annex -> synced/git-annex + 18a5408..f9e7692 master -> synced/master +To /home/valorin/workspace/tmp/test3 + a66ce5d..a6773dd git-annex -> synced/git-annex + 18a5408..f9e7692 master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-05-22 20:42:26 EST] Transferrer: Uploaded Firefly S..acked.m4v +[2013-05-22 20:42:26 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3 + a6773dd..c35f992 git-annex -> synced/git-annex +To /home/valorin/workspace/tmp/test2 + a6773dd..c35f992 git-annex -> synced/git-annex +[2013-05-22 20:42:35 EST] Transferrer: Uploaded Firefly S..acked.m4v +[2013-05-22 20:42:35 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3 + c35f992..9e47813 git-annex -> synced/git-annex +To /home/valorin/workspace/tmp/test2 + c35f992..9e47813 git-annex -> synced/git-annex +[2013-05-22 20:42:44 EST] Pusher: Syncing with test3, test2 +Everything up-to-date +Everything up-to-date +"""]] + +> It turns out there was a bug in the preferred content expression parser, +> that made it parse the expression for manual mode (but I think no other standard +> expression) quite wrong, as if it had parens in the wrong place. This explains +> the broken behavior. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results.mdwn b/doc/bugs/Merge_involving_symlink_yields_unexpected_results.mdwn new file mode 100644 index 000000000..1ebd4039b --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results.mdwn @@ -0,0 +1,51 @@ +### Please describe the problem. +When creating a symlink in repository A, and creating a regular file under the same name in repository B, syncing B will yield the result that the symlink is lost, and both the original filename and the .variant file will point to the same annex object containing the original content from B. + +Both A and B are indirect mode repos. + +### What steps will reproduce the problem? + +[[!format sh """ + +#Initial state: + +repo-A$ echo file1 +This is file 1. +repo-B$ echo file1 +This is file 1. + +#Make conflicting changes: + +repo-A$ ln -s file1 file2; git add file2; git commit -m "Add file2 as symlink." +repo-B$ echo "This is file 2." > file2; git annex add file2; git commit -m "Add file2 as regular file." + +#Sync it: + +repo-A$ git annex sync +repo-B$ git annex sync + +#Strange result in repo-B: + +repo-B$ ls -l file2* +file2 -> .git/annex/objects/$HASH1 +file2.variant1234 -> .git/annex/objects/$HASH1 +repo-B$ cat file2 file2.variantXXXX +This is file 2. +This is file 2. + +#Repo-A leaves the symlink change untouched and adds a .variant containing the new regular file data. + +repo-A$ ls -l file* +file2 -> file1 +file2.variant1234 -> .git/annex/objects/$HASH1 +repo-A$ cat file.variant1234 +This is file 2. +"""]] +### What version of git-annex are you using? On what operating system? +Linux 3.15.3 +git-annex 5.20140613 + + +[[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_1_e8a2ea1b8573bee45b70bcc7ef7e3bed._comment b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_1_e8a2ea1b8573bee45b70bcc7ef7e3bed._comment new file mode 100644 index 000000000..624b39a79 --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_1_e8a2ea1b8573bee45b70bcc7ef7e3bed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 1" + date="2014-07-07T14:09:33Z" + content=""" +Sorry, the initial «echos» should have been «cat» of course. +"""]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_2_b6182038292bd72dc4711e4575510172._comment b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_2_b6182038292bd72dc4711e4575510172._comment new file mode 100644 index 000000000..39f60f775 --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_2_b6182038292bd72dc4711e4575510172._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-07T17:17:49Z" + content=""" +Drat, so many bug fixes and test cases and this still got through? +"""]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_3_c6ca13d475b3f846c95606c20e1a3052._comment b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_3_c6ca13d475b3f846c95606c20e1a3052._comment new file mode 100644 index 000000000..292d11743 --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_3_c6ca13d475b3f846c95606c20e1a3052._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 3" + date="2014-07-07T17:19:03Z" + content=""" +Ah, I see, it's explicitly because the non-git-annex symlink is involved. Whew! +"""]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_4_13179e0f72026092e48c13082818ce68._comment b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_4_13179e0f72026092e48c13082818ce68._comment new file mode 100644 index 000000000..49210ee55 --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_4_13179e0f72026092e48c13082818ce68._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="analysis" + date="2014-07-08T17:52:59Z" + content=""" +When resolveMerge' calls graftin to add A's file2 symlink to B's tree, it actually stages the right symlink (the non-annexed one). + +However, the work tree is left as-is, so it still has the annexed symlink in it. So git status shows file2 as modified. Later syncs will commit that. + +This is why the sync in A doesn't have the problem, as there things are the other way around, and git-annex makes the git-annex symlink, leaving the non-annexed symlink as-is in the work tree. + +So, graftin needs to update the work tree. But it's tricky because graftin is called in 3 situations: non-symlink file, directory, and non-annexed symlink. +Interestingly, in the other 2 cases, git-merge already takes care of updating the work tree -- it deletes the annexed symlink and puts in place either the non-symlink file or the directory. It's only the the case of a merge conflict involving 2 symlinks that git merge doesn't update the tree in this way. It's nice to be able to rely on git-merge in the other 2 cases, especially the directory case (avoids having to manually check out the directory). +"""]] diff --git a/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_5_585c8a5a13bb17032bfe30818345f936._comment b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_5_585c8a5a13bb17032bfe30818345f936._comment new file mode 100644 index 000000000..566a0aad8 --- /dev/null +++ b/doc/bugs/Merge_involving_symlink_yields_unexpected_results/comment_5_585c8a5a13bb17032bfe30818345f936._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zardoz" + ip="78.49.247.112" + subject="comment 5" + date="2014-07-08T19:17:29Z" + content=""" +Thanks for the swift fix + analysis! If I’m ever around, I’ll lend you a hand on your next truckload of firewood! ;> + +Cheers! +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn new file mode 100644 index 000000000..dc24ee18d --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +I paired my repo running on Gentoo (git-annex 4.20130601) with Ubuntu 13.04 (git-annex 3.10121112ubuntu4). The repo on Ubuntu doesn't have uuid for the Gentoo remote, so: + +- There is no name in assistan's repo settings for it + +- Trying to access its settings gives Internal server error: Unknown UUID +15/Jun/2013:12:39:10 +0300 [Error#yesod-core] Unknown UUID @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + +- In dashboard on Ubuntu all changes stay queued forever (although the syncing seems to work) + +### What steps will reproduce the problem? +Pair local computers with different annex versions. + +### What version of git-annex are you using? On what operating system? +Gentoo (git-annex 4.20130601) +Ubuntu 13.04 (git-annex 3.10121112ubuntu4) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Others are reporting what seems to be the same problem here: +> [[Internal_Server_Error:_Unknown_UUID]]. +> +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment new file mode 100644 index 000000000..26881f17b --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T18:08:55Z" + content=""" +As far as I know, there have been no changes to the local pairing protocol that would cause a problem like this. 3.20121112 is a few months after local pairing was first developed. + +Have you tried upgrading and re-pairing? +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment new file mode 100644 index 000000000..d9ad17e79 --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 2" + date="2013-06-25T18:50:00Z" + content=""" +I have not tried to upgrade, but I fixed it using annex describe followed by assistant restart as hinted in /usr/share/doc/git-annex/html/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.html. + +From that document I understood that at worst it should use one of the two uuids (from Ubuntu or Gentoo repo), but it should not leave it without uuid and hence this report. + +I have tried it a couple of times and it is perfectly reproducible. +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment new file mode 100644 index 000000000..75fd81d46 --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 3" + date="2013-06-25T19:13:06Z" + content=""" +An old bug report that was fixed in 2011 seems very unlikely to have anything to do with your local pairing problem. + +Why don't you try upgrading? +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment new file mode 100644 index 000000000..8e895be5f --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 4" + date="2013-06-25T19:34:12Z" + content=""" +I was expecting the version in distribution which came out two months ago to be somewhat recent, probably unfounded expectation for non-rolling release distribution. I'll add PPA and try using that one. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD.mdwn b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn new file mode 100644 index 000000000..c11ffab38 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. +I have managed to get most things working under OpenBSD 5.4 now. + +One of the last hurdles is that if I enable XMPP the build fails on "Loading package gnuidn-0.2.1..." +See the error below. + +I suspect this is an error in git-annex because network-protocol-xmpp AND gnuidn compiles (and links) fine. + +I will gladly do anything I can to get this working, but I'm at a loss what to do right now. It's the last major piece of the puzzle before I get it properly functioning under OpenBSD. + +### What steps will reproduce the problem? +Building with XMPP support under OpenBSD 5.4 + +### What version of git-annex are you using? On what operating system? +5.20140129 under OpenBSD 5.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Loading package gnuidn-0.2.1 ... + +GHCi runtime linker: fatal error: I found a duplicate definition for symbol + c_isascii +whilst processing object file + /usr/local/lib/libidn.a +This could be caused by: + * Loading two different object files which export the same symbol + * Specifying the same object file twice on the GHCi command line + * An incorrect `package.conf' entry, causing some object to be + loaded twice. +GHCi cannot safely continue in this situation. Exiting now. Sorry. + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment new file mode 100644 index 000000000..e3871ea61 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 10" + date="2014-02-08T18:31:23Z" + content=""" +But you said that setSocketOption failed when you were using XMPP, not when starting the webapp, so I think it's more likely to be one of the setSocketOption calls in the network library, or possibly somewhere else. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment new file mode 100644 index 000000000..78c430533 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment @@ -0,0 +1,97 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 11" + date="2014-02-08T19:18:17Z" + content=""" +I honestly have no idea why that move works because + + % ls -lh /usr/lib|grep -E '(gsasl|xml2|gnutls|idn)' + +returns nothing. But couldn't those symbols already be in the other libraries considering, from what I've read at least, haskell stuff are statically compiled by default? + +Anyway, you are completely right that this happened when I try to use XMPP. The reason I was looking in the wrong place to begin with was because the webapp spit out the error messsage. I have redirected my attention to the network library and the xmpp library. + +But I might have found something interesting in the network library. Keep in mind that I just learned a little today, so do correct me if I'm wrong. + +Looking at http://hackage.haskell.org/package/network-2.2.1.8/docs/src/Network-Socket.html I found: + + setSocketOption :: Socket + -> SocketOption -- Option Name + -> Int -- Option Value + -> IO () + setSocketOption (MkSocket s _ _ _ _) so v = do + with (fromIntegral v) $ \ptr_v -> do + throwErrnoIfMinus1_ \"setSocketOption\" $ + c_setsockopt s (socketOptLevel so) (packSocketOption so) ptr_v + (fromIntegral (sizeOf v)) + return () + +Everything here looks good. So I decided to take a look at SocketOption, socketOptLevel and packSocketOption. + + data SocketOption + = DummySocketOption__ + | Debug {- SO_DEBUG -} + | ReuseAddr {- SO_REUSEADDR -} + | Type {- SO_TYPE -} + | SoError {- SO_ERROR -} + | DontRoute {- SO_DONTROUTE -} + | Broadcast {- SO_BROADCAST -} + | SendBuffer {- SO_SNDBUF -} + | RecvBuffer {- SO_RCVBUF -} + | KeepAlive {- SO_KEEPALIVE -} + | OOBInline {- SO_OOBINLINE -} + | TimeToLive {- IP_TTL -} + | MaxSegment {- TCP_MAXSEG -} + | NoDelay {- TCP_NODELAY -} + | Linger {- SO_LINGER -} + | RecvLowWater {- SO_RCVLOWAT -} + | SendLowWater {- SO_SNDLOWAT -} + | RecvTimeOut {- SO_RCVTIMEO -} + | SendTimeOut {- SO_SNDTIMEO -} + + socketOptLevel :: SocketOption -> CInt + socketOptLevel so = + case so of + TimeToLive -> 0 + MaxSegment -> 6 + NoDelay -> 6 + _ -> 1 + + packSocketOption :: SocketOption -> CInt + packSocketOption so = + case so of + Debug -> 1 + ReuseAddr -> 2 + Type -> 3 + SoError -> 4 + DontRoute -> 5 + Broadcast -> 6 + SendBuffer -> 7 + RecvBuffer -> 8 + KeepAlive -> 9 + OOBInline -> 10 + TimeToLive -> 2 + MaxSegment -> 2 + NoDelay -> 1 + Linger -> 13 + RecvLowWater -> 18 + SendLowWater -> 19 + RecvTimeOut -> 20 + SendTimeOut -> 21 + +Everything looks good so I thought long and hard about this. Then, by chance, I just looked at the man page for setsockopt() and it mentioned SOL_SOCKET and I was like \"Hmm...\" + + % grep -R SOL_SOCKET /usr/include + /usr/include/openssl/e_os.h:#define ioctlsocket(a,b,c) setsockopt((a),SOL_SOCKET,(b),(c),sizeof(*(c))) + /usr/include/sys/socket.h:#define SOL_SOCKET 0xffff /* options for socket level */ + /usr/include/sys/socket.h:/* Read using getsockopt() with SOL_SOCKET, SO_PEERCRED */ + +Wat? + + #define SOL_SOCKET 0xffff + +Going back to the Haskell code above I realized that SetSocketOption will NEVER feed 0xffff as level to setsockopt() because socketOptLevel returns 1 unless optname is TimeToLive, MaxSegment or NoDelay. + +Am I way off? +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment new file mode 100644 index 000000000..77c8edc68 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 12" + date="2014-02-08T20:03:30Z" + content=""" +WRT haskell static linking, AFAIK that only affects haskell libraries. If they in turn link with C libs, the linking is still dynamic. At least this is the case on both Linux and the limited BSDs I've used it on. Have no OpenBSD experience. + +`SOL_SOCKET` is 1 on linux, so you may have the culprit. + +However.. That's a really old version of network! 2.2.1.8 is from 2010. In a more current 2.4.x version, packSocketOption uses the `SOL_SOCKET` value and not 1, so should work AFAICS. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment new file mode 100644 index 000000000..3981d32bf --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 13" + date="2014-02-08T20:12:12Z" + content=""" +Does your binary end up dynamically linked to libxml2 etc? If not, it certianly seems plausible that the haskell libs statically linked with the C libs, and then at binary link time it tried to redundantly link with the libs again and failed. If this is the case, it seems it would probably be a bug in ghc. You can use `cabal build --ghc-options=-v` to get a look at how the linker is run. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment new file mode 100644 index 000000000..bb4d095a3 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 14" + date="2014-02-08T20:29:46Z" + content=""" +Sigh.. Ofcourse it was an old version. It never occurred to me to check that. I was just Googling around and stumbled over that page. +Do you have any pointers on how I would debug this further? + +Regarding the linking; I haven't checked it any further actually. I'm planning on investigating that further once I can get this error sorted out. But my hypothesis is that it's all statically linked all the way through, like I said. That would also explain those error messages I got during linking before. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment new file mode 100644 index 000000000..4aeda69eb --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 15" + date="2014-02-08T20:56:10Z" + content=""" +I think you need to find which calls to setSocketOption are failing and/or what value is causing the crash. It's a bit of a pain to get a backtrace on error (would need to build everything with profiling enabled and run git-annex with +RTS -xc options). Probably simplest to modify the setSocketOption code: + +[[!format patch \"\"\" +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 2fe62ee..0c66432 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -963,7 +963,7 @@ setSocketOption :: Socket + setSocketOption (MkSocket s _ _ _ _) so v = do + (level, opt) <- packSocketOption' \"setSocketOption\" so + with (fromIntegral v) $ \ptr_v -> do +- throwSocketErrorIfMinus1_ \"setSocketOption\" $ ++ throwSocketErrorIfMinus1_ (\"setSocketOption \" ++ show so ++ \" \" ++ show v) $ + c_setsockopt s level opt ptr_v + (fromIntegral (sizeOf (undefined :: CInt))) + return () +\"\"\"]] + +Which should make it print out a quite nice symbolic name of the option being used on failure, which will make it easy to find any call sites and more importantly, determine what's wrong with that option. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment new file mode 100644 index 000000000..def40653d --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 16" + date="2014-02-08T21:08:38Z" + content=""" +Thanks for that code snippet! I'll try it out within the next few minutes. + +Also, how would I go about rebuilding everything with profiling support? I'm doing this testing in a virtual machine so I can always start over from scratch. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment new file mode 100644 index 000000000..f36126841 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 17" + date="2014-02-08T21:23:02Z" + content=""" +Blow away ~/.ghc and ~/.cabal; cabal update; put `library-profiling: True` in ~/.cabal/config; and reinstall everything. + +Note that you may need to first build ghc's own bundled libraries with profiling support, if your ghc installation does not already include them. I don't know how to do that since on debian I can just `apt-get install ghc-prof`. If that's needed, ghc will tell you and refuse to build stuff with profiling. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment new file mode 100644 index 000000000..d8d73a0b7 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 18" + date="2014-02-08T23:25:29Z" + content=""" +I applied your patch and rebuilt. I even tried doing it from scratch just to get it right. + +I have three news: + +1) I got it completely working in a virtual machine + +2) On my actual (physical) openbsd machine it still isn't working, even though they're almost identical. The only difference is that the physical one also has IPv6 connectivity, while the virtual machine doesn't. Could that be it? I don't know yet, although I'm about to try it. + +3) Your patch did not help. It still didn't print out anything more useful, suggesting that it in fact isn't that function that is throwing the error. [This](http://i.imgur.com/tmBiseE.png) is what the actual error looks like and shows up after I enter the jabber account details. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment new file mode 100644 index 000000000..7ea52c150 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 19" + date="2014-02-09T02:13:20Z" + content=""" +I'll bet you didn't rebuild all the libraries that depend on network. (Which all that static linking makes necessary...) + +IPv6 was my first guess; see http://git-annex.branchable.com/bugs/More_build_oddities_under_OpenBSD/#comment-84ee81cd162d22283fcccc1a41c8f8b3 +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment new file mode 100644 index 000000000..f2ac7af8f --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T18:49:38Z" + content=""" +This is definitely not an issue in git-annex's code. Two C libraries are exporting the same symbol (gnulib might be the other one, or it could be part of the OpenBSD libc as it's some deprecated POSIX symbol, I don't know) and this is simply not apparent until the linker tries to make a binary linking with both. + +I have dealt with a similar issue on Android by modifying C libraries to not export colliding symbols. See: + +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment new file mode 100644 index 000000000..29e58e156 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 20" + date="2014-02-20T20:26:03Z" + content=""" +Any further luck on this? + +It would be nice if a page on openbsd could be added to the install page documenting what is needed to get it to build. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment new file mode 100644 index 000000000..248f7fb33 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 2" + date="2014-02-07T19:38:14Z" + content=""" +I do realize that it's not a fault in git-annex' code. I'm sorry if it was a stupid idea to post it here, but I was thinking if there exists some kind of workaround one could implement in the build system. I mean.. This isn't the first time someone compiles a program with libidn, gettext and/or gnutls (According to 'grep -R c_isascii /usr') +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment new file mode 100644 index 000000000..ee7c537d9 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 3" + date="2014-02-07T20:57:54Z" + content=""" +I have researched this a little more and I am not entirely convinced it is an actual conflict anywhere. I did, in fact, compile a patched version of libidn WITHOUT the c_isascii symbols and.. It suddenly started complaining about even MORE symbols (stringprep_utf8_to_unichar). +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment new file mode 100644 index 000000000..9677848d3 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2014-02-07T22:12:43Z" + content=""" +Couldn't it be possible that something is passed twice on the command line, like that message says could be the reason? Because I have inspected my systems and the only thing I can find that even contains such a string (stringprep_utf8_to_unichar) is libidn so there shouldn't be any conflicts. + +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment new file mode 100644 index 000000000..a2772452d --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 5" + date="2014-02-08T14:46:10Z" + content=""" +Okay, so I did work around this with an ugly hack (I'm not even sure it will work properly) so I now have XMPP support, according to git-annex. + +But.. When I try to play around with XMPP I get: + + setSocketOption: invalid argument (Invalid argument) +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment new file mode 100644 index 000000000..ff76fb3de --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 6" + date="2014-02-08T17:23:54Z" + content=""" +Googling around I found [this](http://lpaste.net/77947) codesnippet that suggests setSocketOption is broken under OpenBSD +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment new file mode 100644 index 000000000..72b427357 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 7" + date="2014-02-08T17:42:52Z" + content=""" +What was the ugly hack that got it to link? + +I've seen setSocketOption fail on other OS's for various portability reasons. The haskell library that is responsible for this is , and you can find several setSocketOption calls in it. I've had good luck ifdefing those out when they don't work. + +Here's a patch where I disable the IPv6Only setting on Android (amoung other unrelated porting) +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment new file mode 100644 index 000000000..f7f7e3429 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 8" + date="2014-02-08T18:13:33Z" + content=""" +What I did was to temporarily move away (or rename) the offending libs. What I essentially did was this: + + cabal configure + cabal build + sudo mv /usr/local/lib/lib{xml2,gnutls,gsasl,idn}.a /tmp + cabal install + sudo mv /tmp/lib{xml2,gnutls,gsasl,idn}.a /usr/local/lib + +but I've also had to patch network-info. I've contacted the maintainer of that package but I haven't received anything. I'm considering creating an actual fork with my changes but that would almost seem kind of silly as I don't know *ANY* haskell.. But I am looking at the Haskell wiki as I'm typing this so I can see what I'm looking at :). + +Won't break anything by not setting SO_REUSEADDR? I suspect you're setting it for a reason? +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment new file mode 100644 index 000000000..dee77a69f --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 9" + date="2014-02-08T18:29:41Z" + content=""" +So you moved away libs in /usr/local to expose usable ones in /usr? + +I've had luck before sending the network-info mantainer pull requests: + +git-annex does set ReuseAddr in one place; in Utility/Webapp.hs. The only time that would have a benefit would be when using `git annex webapp --listen=address:port` and starting and restarting the webapp. Normally the webapp chooses a random free port so it shouldn't need that. +"""]] diff --git a/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X.mdwn b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X.mdwn new file mode 100644 index 000000000..0a3815cb9 --- /dev/null +++ b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +On indirect repos on OS X, when a symlink is moved asisstant does not pick it up it. Even though assistant syncs after delete/move changes are not committed. git annex status returns ?? for the moved files. when I run git annex add on the files it says it added them but instead they still show up as ??. the only way to solve the problem is to manually restart the daemon which commits them. + +### What steps will reproduce the problem? + +Moving an annex file. + + +### What version of git-annex are you using? On what operating system? + +5.20140703 g3cfcd54 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_1_75c14b405929a8f771a7c261dcc4b7a2._comment b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_1_75c14b405929a8f771a7c261dcc4b7a2._comment new file mode 100644 index 000000000..5346cb949 --- /dev/null +++ b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_1_75c14b405929a8f771a7c261dcc4b7a2._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="unable to reproduce, please provide transcript" + date="2014-07-11T19:36:37Z" + content=""" +I have tried to reproduce this problem on OSX, but it seems to work fine: + +
+oberon:xx joeyh$ git annex assistant 
+oberon:xx joeyh$ date > foo
+oberon:xx joeyh$ git log --stat
+commit 93a208c6aa0080e70a636181606f53af5f2c4441
+Author: Joey Hess 
+Date:   Fri Jul 11 15:33:50 2014 -0400
+
+ foo | 1 +
+ 1 file changed, 1 insertion(+)
+oberon:xx joeyh$ mv foo bar
+oberon:xx joeyh$ git log --stat
+commit 495592b2977ee96029db99761d20396577ff3c51
+Author: Joey Hess 
+Date:   Fri Jul 11 15:33:54 2014 -0400
+
+ bar | 1 +
+ foo | 1 -
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 93a208c6aa0080e70a636181606f53af5f2c4441
+Author: Joey Hess 
+Date:   Fri Jul 11 15:33:50 2014 -0400
+
+ foo | 1 +
+ 1 file changed, 1 insertion(+)
+oberon:xx joeyh$ git annex status
+oberon:xx joeyh$ 
+
+ +> when I run git annex add on the files it says it added them but instead they still show up as ?? + +This must be the root of whatever the problem is, so please provide a transcript of you doing that. +"""]] diff --git a/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_2_f52483415c623ea0649c3805728ce761._comment b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_2_f52483415c623ea0649c3805728ce761._comment new file mode 100644 index 000000000..9b7f17789 --- /dev/null +++ b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_2_f52483415c623ea0649c3805728ce761._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-07-12T10:00:59Z" + content=""" +[[!format sh \"\"\" +host annex/(master) $ ls -a Staging/Rise* +Staging/Rise and Fall of the Berlin Wall - History Channel.mkv +host annex/(master) $ mv Staging/Rise\ and\ Fall\ of\ the\ Berlin\ Wall\ -\ History\ Channel.mkv Documentary/ +host annex/(master) $ git status +On branch master +Untracked files: + (use \"git add ...\" to include in what will be committed) + + Documentary/Rise and Fall of the Berlin Wall - History Channel.mkv + +nothing added to commit but untracked files present (use \"git add\" to track) +host annex/(master) $ ga status +D Documentary/Rise and Fall of the Berlin Wall - History Channel.mkv +host annex/(master) $ git annex add . +add Documentary/Rise and Fall of the Berlin Wall - History Channel.mkv ok +(Recording state in git...) +host annex/(master) $ ga status +D Documentary/Rise and Fall of the Berlin Wall - History Channel.mkv +host annex/(master) $ git annex sync +commit ok +pull server +ok +host annex/(master) $ ga status +D Documentary/Rise and Fall of the Berlin Wall - History Channel.mkv +host annex/(master) $ +\"\"\"]] + +"""]] diff --git a/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_3_fd73fbeef61df106f084ac235fca904a._comment b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_3_fd73fbeef61df106f084ac235fca904a._comment new file mode 100644 index 000000000..a659ad2c1 --- /dev/null +++ b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_3_fd73fbeef61df106f084ac235fca904a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 3" + date="2014-07-12T10:03:07Z" + content=""" +BTW the mv operation is picked up by the assistant it start syncing immediately after mv but the symlink link is left dangling. I've also waited for the assistant to sync before readding the file. +"""]] diff --git a/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_4_c5e9843a956984efd22bad629930f6bd._comment b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_4_c5e9843a956984efd22bad629930f6bd._comment new file mode 100644 index 000000000..a437142af --- /dev/null +++ b/doc/bugs/Moved_files_are_not_picked_up_by_the_assistant_on_OS_X/comment_4_c5e9843a956984efd22bad629930f6bd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-14T20:15:07Z" + content=""" +Well, I don't see the \"??\" that you were talking about before in your transcript. I do not understand why the file's status shows as \"D\" which means it's deleted. What does `git ls-files` say? Does this stange behavior persist if you stop the assistant from running and re-run the same git-annex commands? +"""]] diff --git a/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository.mdwn b/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository.mdwn new file mode 100644 index 000000000..3925b7c10 --- /dev/null +++ b/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. +Files transferred from one repository to a standard remote by the assistant do not retain the original mtime + +### What steps will reproduce the problem? +Create manually two repositories, in my case on two external drives directly connected to my box, with normal remotes pointing to each other. +Activate git annex assistant and synchronize some files from one to the other. + +### What version of git-annex are you using? On what operating system? +Git annex version 5.20140610-g5ec8bcf on Ubuntu Linux 12.04 + +### Please provide any additional information below. +I've noticed how files synchronized from one repository to another do not retain the original mtime information. +Perhaps it's intended, but in my view retaining the time of modification of the object is essential. + +> [[done]]; dup and/or out of scope, --[[Joey]] diff --git a/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository/comment_1_651965d8a9f0e0c07313c1a2916f77e5._comment b/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository/comment_1_651965d8a9f0e0c07313c1a2916f77e5._comment new file mode 100644 index 000000000..fcb5c4cc6 --- /dev/null +++ b/doc/bugs/Mtime_of_objects_reset_when_synchronized_to_a_different_repository/comment_1_651965d8a9f0e0c07313c1a2916f77e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-07-02T17:07:33Z" + content=""" +git makes no attempt to maintain mtimes etc, and neither does git-annex. There are open todo items. There is metastore, etc. +"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn new file mode 100644 index 000000000..8df3bde48 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn @@ -0,0 +1,12 @@ +My local git index got corrupted and I needed to clone and annex get all data from my main repo. + +Some files were never copied anywhere so I am stuck with symlinks to nowhere. + +I tried to copy over the symlink with a copy of the actual file, which did not work. Trying to unlock, copying over the symlink, and relock did not work, either. + +Then, I copied the annex object to the correct place in .git/annex/objects/..., set all modes, re-ran fsck and the file re-appeared. + + +Long story short, I think there should be a `git annex reinject $file` or similar which will take a file, either one replacing the symlink or with an arbitrary path, and put it into the correct place in the object store. Called normally, it should reject all reinjects where the checksum does not match. With --force, this should be overridden. For reasons of safety, WORM should always require --force. + +> [[closing|done]], seems addressed --[[Joey]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment new file mode 100644 index 000000000..9688012a4 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T01:46:16Z" + content=""" +Have you seen [[walkthrough/recover_data_from_lost+found]]? The method described there will also work in this scenario. +"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment new file mode 100644 index 000000000..c9b74d98f --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-03T09:00:17Z" + content=""" +I did not. Thanks :) + +This still means that you can't re-inject a new version of a file unless you have the old one if you are using a SHA* backend, but that might be a corner case anyway. +"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment new file mode 100644 index 000000000..9c56452e5 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-05-14T16:28:36Z" + content=""" +To re-inject new content for a file, you really want to get a new key for the file. Otherwise, other repos that have the old file will never get the new content. So: + +
+git rm file
+mv ~/newcontent file
+git annex add file
+
+"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment new file mode 100644 index 000000000..fcca0561d --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-05-14T16:29:35Z" + content=""" +Now available as `git-annex reinject`. +"""]] diff --git a/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn b/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn new file mode 100644 index 000000000..eeb96a197 --- /dev/null +++ b/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem, What steps will reproduce the problem? + + $ which git-annex + ~/.local/bin/git-annex + $ git help annex + No manual entry for git-annex + $ git annex --help + No manual entry for git-annex + +(either that or it display the manual of system-installed git-annex, not the locally installed one) + +### What version of git-annex are you using? On what operating system? + +Fedora 20 + +`git-annex --version` doesn't work and the webapp tells me Version: 5.20131130-gc25be33 + +> [[fixed|done]] (OSX too) --[[Joey]] diff --git a/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend.mdwn b/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend.mdwn new file mode 100644 index 000000000..e68f6610a --- /dev/null +++ b/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend.mdwn @@ -0,0 +1,61 @@ +### Please describe the problem. + +I get no such file errors when using WORM backend on files with a certain name. Doesn't like brackets? + +Default backend is fine (see output below). + +### What steps will reproduce the problem? + +See additional info + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140613-g5587055 +On Windows 8.1 +Tried with both Windows command prompt and Git Bash shell. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +git config --add annex.backends WORM +git annex add extras + +add extras/Extra Content - Reason Drum Takes/DT Key Map.pdf ok +add extras/Extra Content - Reason Drum Takes/DT Read Me.pdf ok +add extras/Extra Content - Reason Drum Takes/DT7 Rock - Love (136).reason ok +add extras/Extra Content - Reason Drum Takes/DT7 Rock - Peace (200).reason ok +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G06.aif +git-annex: C:\Studio\.git\annex\objects\b43\d6d\WORM-s178174-m1363015489--extras%Extra Content - Reason Drum Takes%Kit S +amples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G06.aif\WORM-s178174-m1363015489--extras%Extra Content - Reason Drum Tak +es%Kit Samples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G06.aif.cache: openFile: does not exist (No such file or directo +ry) +failed +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G09.aif +git-annex: C:\Studio\.git\annex\objects\e90\b5c\WORM-s199108-m1363015489--extras%Extra Content - Reason Drum Takes%Kit S +amples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G09.aif\WORM-s199108-m1363015489--extras%Extra Content - Reason Drum Tak +es%Kit Samples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G09.aif.cache: openFile: does not exist (No such file or directo +ry) +failed +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G14.aif +git-annex: C:\Studio\.git\annex\objects\995\4e7\WORM-s201570-m1363015489--extras%Extra Content - Reason Drum Takes%Kit S +amples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G14.aif\WORM-s201570-m1363015489--extras%Extra Content - Reason Drum Tak +es%Kit Samples%1. Bass Drum mic ,40BD,41%DT6_BD_Bd_RG_R_G14.aif.cache: openFile: does not exist (No such file or directo +ry) +failed + +git config --unset annex.backends +git annex add extras + +add extras/Extra Content - Reason Drum Takes/DT Key Map.pdf ok +add extras/Extra Content - Reason Drum Takes/DT Read Me.pdf ok +add extras/Extra Content - Reason Drum Takes/DT7 Rock - Love (136).reason ok +add extras/Extra Content - Reason Drum Takes/DT7 Rock - Peace (200).reason ok +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G06.aif ok +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G09.aif ok +add extras/Extra Content - Reason Drum Takes/Kit Samples/1. Bass Drum mic (BD)/DT6_BD_Bd_RG_R_G14.aif ok + +# End of transcript or log. +"""]] diff --git a/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend/comment_1_a1db4ff3e8517d7cbe649bca1ed275d0._comment b/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend/comment_1_a1db4ff3e8517d7cbe649bca1ed275d0._comment new file mode 100644 index 000000000..7136cabb0 --- /dev/null +++ b/doc/bugs/No_such_file_with_certain_filenames_using_WORM_backend/comment_1_a1db4ff3e8517d7cbe649bca1ed275d0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-05T21:55:46Z" + content=""" +Hmm, the filename `WORM-s178174-m1363015489--extras%Extra\ Content\ -\ Reason\ Drum\ Takes%Kit\ Samples%1.\ Bass\ Drum\ mic\ ,40BD,41%DT6_BD_Bd_RG_R_G06.aif.cach` is a legal filename on FAT at least, dunno about NTFS.. +"""]] diff --git a/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn b/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn new file mode 100644 index 000000000..e4a364195 --- /dev/null +++ b/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. +There are a lot of differences in the behaviour of usual commands and commans using --all. +The specific problem I found was that "git annex fsck --all" will only checksum it seems and not report back numcopies failures. +Checking if objects/old versions have propagated is not possible without it or do I miss something. + +(As additional note not sure if related. It seems that git annex fsck --all is running much faster in my tests 1/3 faster. Any reason for that? Bug related?) + + +### What steps will reproduce the problem? +compare "git annex fsck" vs "git annex fsck" (no numcopies check) + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> It's expected that --all (and --unused) make .gitattributes +> annex.numcopies settings be ignored, because with these options git-annex +> is operating on keys, it does not know or care what filename they're +> associated with, and so cannot look them up in .gitattributes. I have +> improved the documentation of .gitattributes files to mention this +> limitation. +> +> I also notice that fsck --all is not checking .git/config's +> annex.numcopies or the new global numcopies setting. It certianly makes +> sense for those numcopies settings to be paid attention to. +> [[fixed|done]] --[[Joey]] +> +> (--all is faster because it can quickly scan through .git/annex/objects +> to find everything, rather than looking at the symlink target of every +> file in the work tree.) diff --git a/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment b/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment new file mode 100644 index 000000000..c0cbe3907 --- /dev/null +++ b/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Some suggestions" + date="2014-02-20T21:22:21Z" + content=""" +So I think it should at least for --all look at the global numcopies setting. As this could be essential to prevent data-loss. +I agree that special working tree related numcopies don't need to be included. +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass.mdwn b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass.mdwn new file mode 100644 index 000000000..bb76e96e5 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass.mdwn @@ -0,0 +1,119 @@ +### Please describe the problem. + +git-annex assistant on Mac OSX 10.8.5 fails to download new repo files from SSH remote/rsync shared-encryption annex after initial startup. The assistant does sync with the repo and create symlinks for new files, and file contents can manually be retrieved using 'git annex get $file' once the file is in the repository. However, assistant makes no subsequent attempt to download the new files until assistant is restarted. Once restarted, assistant downloads all new files for which is previously only had symlinks. + +git-annex whereis $file does not indicate that the files represented as symlinks are located on the Mac OSX clients in question until after files are manually retrieved or assistant is retarted and files are automatically downloaded, replacing the symlinks. + +git-annex assistant on Mac OSX does not have problems uploading files to the remote as they are added. + +git-annex 5.20140517.4 on Ubuntu 12.04 behaves as expected and downloads new files (with content) properly as they are added to the repo. + +### What steps will reproduce the problem? + +(all using git-annex webapp) + +--create client repo on Mac OSX, direct mode (used two 10.8.5 machines) + +--create client repo on Ubuntu, direct mode (used several 12.04 VMs) + +--create repo (transfer mode) on VPS + +--create shared encryption repo (backup mode) on same VPS + +--add VPS transfer repo to each client (shared encryption repo appears and syncing is enabled for each client) + +--create file in Mac OSX annex - file gets distributed to VPS backup repo and each linux system. Symlink is created on 2nd Mac OS X machine. + +--create file in Ubuntu VM annex - file gets distributed to VPS backup repo and each linux system. Symlink is created on both Mac OSX machines. + + + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140421 (installed using brew), Mac OSX 10.8.5 + +I tested 5.20140613 (from brew) also and it appears to also not download new files automatically. + + + +### Please provide any additional information below. +I've tested a few things I thought might be related. Since restarting assistant seems to temporarily "fix" the problem, I thought there may be some SSH client caching problems... as in the existing connection not being reused properly. However, I disabled annex.sshcaching as described elsewhere and that did not have any affect. + +I've enabled XMPP and it only introduced more confusion as the XMPP messaging was not reliably consistent. + +daemon.log for Mac OS systems does not show the "Pusher" process getting initiated once new files are added to the repo if the assistant is currently running, however it is logged immediately after assistant is started if there are new files in the repo. + +daemon.log for Ubuntu systems does contain the Pusher process event following the repo sync that takes place once the file has been added to the repo. + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +MACOSX:user$git-annex assistant --autostart + +daemon.log: + +[2014-06-25 11:52:04 CDT] main: starting assistant version 5.20140421 +[2014-06-25 11:52:09 CDT] TransferScanner: Syncing with serverrepo + +Already up-to-date. +(scanning...) [2014-06-25 11:52:09 CDT] Watcher: Performing startup scan + +Already up-to-date. +(started...) +[2014-06-25 11:52:10 CDT] Committer: Committing changes to git +(Recording state in git...) +(gpg) +Already up-to-date. + +Already up-to-date. +[2014-06-25 11:52:11 CDT] Pusher: Syncing with serverrepo + +GPGHMACSHA1--3e18c6a4ee5aece84f4f00fc2e7fcb828d8fa7d8 +Everything up-to-date0.00kB/s 0:00:00 +Everything up-to-date4.56MB/s 0:00:00 + 8409197 100% 4.94MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 38 bytes received 8411383 bytes 2403263.14 bytes/sec +total size is 8409197 speedup is 1.00 +[2014-06-25 11:52:13 CDT] Transferrer: Downloaded 67-more-fromubuntu +[2014-06-25 11:52:14 CDT] Committer: Adding 67-more-fromubuntu +add /Users/user/computer_annex/67-more-fromubuntu ok +[2014-06-25 11:52:14 CDT] Committer: Committing changes to git +(Recording state in git...) +[2014-06-25 11:52:20 CDT] Pusher: Syncing with serverrepo +(Recording state in git...) +To ssh://user@git-annex-server.remotehost.net-user_.2Fhome.2Fuser.2Fserver_repo/home/user/server_repo/ + 7e375a8..1a64e4c git-annex -> synced/git-annex +[2014-06-25 11:52:36 CDT] RemoteControl: Syncing with serverrepo +From ssh://git-annex-server.remotehost.net-user_.2Fhome.2Fuser.2Fserver_repo/home/user/server_repo + 1a64e4c..dee9f84 synced/git-annex -> serverrepo/synced/git-annex + d424057..989003e synced/master -> serverrepo/synced/master +(merging serverrepo/synced/git-annex into git-annex...) + +<<>> + +Updating d424057..989003e +Fast-forward + 89-more-fromubuntu | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 89-more-fromubuntu +[2014-06-25 11:58:42 CDT] RemoteControl: Syncing with serverrepo +From ssh://git-annex-server.remotehost.net-user_.2Fhome.2Fuser.2Fserver_repo/home/user/server_repo + dee9f84..b24c8bf synced/git-annex -> serverrepo/synced/git-annex +(merging serverrepo/synced/git-annex into git-annex...) +[2014-06-25 11:58:47 CDT] RemoteControl: Syncing with serverrepo +From ssh://git-annex-server.remotehost.net-user_.2Fhome.2Fuser.2Fserver_repo/home/user/server_repo + b24c8bf..6488b45 synced/git-annex -> serverrepo/synced/git-annex +(merging serverrepo/synced/git-annex into git-annex...) +[2014-06-25 11:58:56 CDT] RemoteControl: Syncing with serverrepo +From ssh://git-annex-server.remotehost.net-user_.2Fhome.2Fuser.2Fserver_repo/home/user/server_repo + 6488b45..c73c180 synced/git-annex -> serverrepo/synced/git-annex +(merging serverrepo/synced/git-annex into git-annex...) + + + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_10_3feba4ba84efb77bd4f8f46b6b4600f1._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_10_3feba4ba84efb77bd4f8f46b6b4600f1._comment new file mode 100644 index 000000000..37aa47c37 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_10_3feba4ba84efb77bd4f8f46b6b4600f1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="Actions -> Sync Now in webapp does properly download new files" + date="2014-07-17T13:50:06Z" + content=""" +confirmed - your understanding is correct +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_1_a33fcd088e419d8e6c459e42f21f8bbe._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_1_a33fcd088e419d8e6c459e42f21f8bbe._comment new file mode 100644 index 000000000..b78fd5aa0 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_1_a33fcd088e419d8e6c459e42f21f8bbe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnu1NjsjNS3m0OxiYLKO-5SKNpSERxpi6k" + nickname="Matthew" + subject="comment 1" + date="2014-07-09T13:56:31Z" + content=""" +\"workaround\" is just a cron job that runs 'git annex sync --content' every N minutes... + +Is there any possible configuration error I've made that would cause the OSX clients to behave differently than the linux clients despite ostensibly being set up identically?? +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_2_47196f7e781137751ebd1a1d7083838a._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_2_47196f7e781137751ebd1a1d7083838a._comment new file mode 100644 index 000000000..ee5ad138e --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_2_47196f7e781137751ebd1a1d7083838a._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-10T19:19:36Z" + content=""" +Could you please go into some more detail about these two things: + +> --create repo (transfer mode) on VPS +> +> --create shared encryption repo (backup mode) on same VPS + +It's not clear to me what kind of repositories these are. Are they bare git repositories? What version of git-annex, if any, is installed on that VPS? + +> git-annex whereis $file does not indicate that the files represented as symlinks are located on the Mac OSX clients in question until after files are manually retrieved + +Well, I'd not expect whereis to say that the file is in a repository until it's retrieved into that repository. However, does whereis, on the OSX clients, ever say that the file has reached one of the repos on the VPS? +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_3_672d98ee06e051430f8e01faa93bb4cf._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_3_672d98ee06e051430f8e01faa93bb4cf._comment new file mode 100644 index 000000000..e26492dd7 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_3_672d98ee06e051430f8e01faa93bb4cf._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="comment 3" + date="2014-07-11T17:06:43Z" + content=""" +I created an local repository on each of 2 OS X (10.8.5) systems running git-annex version 5.20140421, and each of 2 Ubuntu 12.04 systems running version 5.20140517.4 + +I then created a remote SSH repository by selecting \"Make an unencrypted git repository on the server\" - this repo is in \"transfer\" mode. + +On the 2nd OSX client, I added a remote SSH repository, providing the same host and path information and elected to \"combine\" my local repo with the remote repo so that files would stay in sync. + +I did the same on each of the linux clients. + +git-annex indicates that local repos on each machine are in direct mode and show all expected semi trusted repos: web, SSH remote, other clients that have combined with the SSH remote. + +git-annex indicates that the SSH remote repo is in indirect mode + +git indicates that all repos are in bare mode + +git-annex version 5.20140412ubuntu1 is installed on the VPS, and 'git-annex shell notify changes' processes are running. + +Agreed on the behavior of git-annex whereis… just pointing out that the location info is accurate. + +The 2nd, encrypted repo may have no bearing at all because even when I remove it, the client behavior on OSX doesn't change. + +Thanks for taking the time to consider this! +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_4_06fb3031b838cd443326f4ecd689b600._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_4_06fb3031b838cd443326f4ecd689b600._comment new file mode 100644 index 000000000..0f77607a0 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_4_06fb3031b838cd443326f4ecd689b600._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="comment 4" + date="2014-07-11T17:11:41Z" + content=""" +I should add that in the web app on OSX, the behavior is consistent; syncing the local repository on an OSX client create a symlink (if that hasn't already been done in the background). resyncing \"here\" (local client) doesn't download the file. syncing the remote SSH repo, however does download the file content (as does git-annex sync --content) + +thanks! +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_5_42d447400c15acf6ca031d165b2c781c._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_5_42d447400c15acf6ca031d165b2c781c._comment new file mode 100644 index 000000000..04a5de75c --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_5_42d447400c15acf6ca031d165b2c781c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="comment 5" + date="2014-07-11T18:10:06Z" + content=""" +Sorry to miss this previously, but, yes, whereis does indicate that it has made it to both of the remotes. +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_6_edd7d5d5c761ff665840f0ef7bea50c9._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_6_edd7d5d5c761ff665840f0ef7bea50c9._comment new file mode 100644 index 000000000..9b2890986 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_6_edd7d5d5c761ff665840f0ef7bea50c9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 6" + date="2014-07-16T20:51:36Z" + content=""" +5.20140421 happens to be the very first version of git-annex to support notifychanges. I forget what bugs that first attempt may have had. Have you tried upgrading the macs to a newer version? + + +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_7_18e5334ab89efcf89ba8847436d55065._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_7_18e5334ab89efcf89ba8847436d55065._comment new file mode 100644 index 000000000..197fca67a --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_7_18e5334ab89efcf89ba8847436d55065._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="comment 7" + date="2014-07-16T21:23:00Z" + content=""" +git-annex version: 5.20140613 also behaves the same way, however it generates a new log message during the sync attempt: + +Automatic merge went well; stopped before committing as requested + + + +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_8_35b2bbdc24a7bd686527cd1839dee7d0._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_8_35b2bbdc24a7bd686527cd1839dee7d0._comment new file mode 100644 index 000000000..f551fe627 --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_8_35b2bbdc24a7bd686527cd1839dee7d0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 8" + date="2014-07-16T22:23:50Z" + content=""" +Hmm, it looks to me like the transfer scan may not be getting run after the git branches get pulled. I would expect to see \"starting scan of\" in the debug log when it does that scan. Do you see that in the log? + +AIUI, when you click on Actions -> Sync Now in the webapp for the repository that contains the content, it gets downloaded right? That does the same scan that should be automatically run after a branch is pulled. +"""]] diff --git a/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_9_a771c6b453e6a4b3895dd69a53093440._comment b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_9_a771c6b453e6a4b3895dd69a53093440._comment new file mode 100644 index 000000000..bf57b46be --- /dev/null +++ b/doc/bugs/OSX_assistant_fails_to_download_new_file_after_initial_pass/comment_9_a771c6b453e6a4b3895dd69a53093440._comment @@ -0,0 +1,246 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncukUQl56TwiBJb7dIyAqP1YirNg_wjR4" + nickname="Matthew" + subject="comment 9" + date="2014-07-17T01:58:29Z" + content=""" +Hi Joey, + +Thanks for taking the time to follow up on this - I sincerely appreciate it! + +Only immediately after I start the assistant does the \"starting scan of\" message get logged: + +[2014-07-16 20:38:07 CDT] TransferScanner: starting scan of [Remote { name =\"hostrepo\" }] + +and, at that point, new files are downloaded. + +If the assistant has been running for a while, I then create a new file in an annex on another machine, and the OS X assistant has synced and then created a symlink for new files, the following log is generated (NOTE the groovy scroodled first line if it's at all of interest...): + + +[2014-07-16 20:30:[312 0C1D4T-] 0c7a-ll1:6 g2i0t: 3[0\":--3g1i tC-DdTi]r =R/eUmsoetresC/omnhtirlotly:/ sShYiNnCiIeNrG_ asnsnhe:x///.mgaitte\"o,@\"g-i-tw-oarnkn-etxr-egeo=t/aU.sienrfsr/omnhtiiletrys/.snheitn-imeart_eaon_ngeoxt\"a,_\"r-ecp\"o,/\"~c/ogroet.ab_arreep=of/a +lse\",\"fetch\",\"hostrepo\"] + +[2014-07-16 20:30:31 CDT] RemoteControl: Syncing with hostrepo +From ssh://git-annex-host.vpshost.net-someuser_host_repo/~/host_repo + fdd1eff..e1057e0 synced/git-annex -> hostrepo/synced/git-annex + fa3cfb0..e4ba411 synced/master -> hostrepo/synced/master + +[2014-07-16 20:30:32 CDT] RemoteControl: DONESYNCING ssh://someuser@git-annex-host.vpshost.net-someuser_host_repo/~/host_repo/ 1 + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..fdd1effb8d2b8073e94725874e16056d6557f199\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..e1057e037f03ba804f021c8c39073b2efd1fad08\",\"--oneline\",\"-n1\"] +(merging hostrepo/synced/git-annex into git-annex...) + +[2014-07-16 20:30:32 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"e1057e037f03ba804f021c8c39073b2efd1fad08\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"e1057e037f03ba804f021c8c39073b2efd1fad08..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:32 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"e1057e037f03ba804f021c8c39073b2efd1fad08\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"HEAD\"] + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"] + +[2014-07-16 20:30:32 CDT] Merger: merging refs/remotes/hostrepo/synced/master into refs/heads/annex/direct/master + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/annex/direct/master\"] + +[2014-07-16 20:30:32 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex/.git/annex/merge/\",\"-c\",\"core.bare=false\",\"merge\",\"--no-edit\",\"refs/remotes/hostrepo/synced/master\"] + +Updating fa3cfb0..e4ba411 +Fast-forward + from-ubuntu | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 from-ubuntu + +[2014-07-16 20:30:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-tree\",\"-z\",\"--raw\",\"--no-renames\",\"-l0\",\"-r\",\"fa3cfb01cc4493ed8a7cf84dff38bbba1fc042f9\",\"HEAD\"] + +[2014-07-16 20:30:33 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:33 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:33 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..e1057e037f03ba804f021c8c39073b2efd1fad08\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:33 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:33 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:33 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:45 CDT][ cal2l0:1 4g-i0t7 -[16\" -2-0g:i3t0-:di4r5= /CUDsTe]r sR/emmhoitletCyo/nsthrionli:e rS_YaNnCnIeNxG/ .sgsiht:\"/,/\"m-a-tweoor@kg-ittr-eaen=n/eUxs-egrost/am.hiinlftryo/nsthiienrise.rn_eatn-nmeaxt\"e,o\"_-gco\"t,a\"_croerpeo./b~a/rgeo=tfaa_lrseep\"o,/\" +fetch\",\"hostrepo\"] + +[2014-07-16 20:30:45 CDT] RemoteControl: Syncing with hostrepo +From ssh://git-annex-host.vpshost.net-someuser_host_repo/~/host_repo + e1057e0..d44a67a synced/git-annex -> hostrepo/synced/git-annex + +[2014-07-16 20:30:47 CDT] RemoteControl: DONESYNCING ssh://someuser@git-annex-host.vpshost.net-someuser_host_repo/~/host_repo/ 1 + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..e1057e037f03ba804f021c8c39073b2efd1fad08\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..d44a67a5795c28e423a9ac018bead9dac793be5c\",\"--oneline\",\"-n1\"] +(merging hostrepo/synced/git-annex into git-annex...) + +[2014-07-16 20:30:47 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"d44a67a5795c28e423a9ac018bead9dac793be5c\"] + +[2014-07-16 20:30:47 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"d44a67a5795c28e423a9ac018bead9dac793be5c..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:47 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"d44a67a5795c28e423a9ac018bead9dac793be5c\"] + +[2014-07-16 20:30:48 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:48 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:48 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..d44a67a5795c28e423a9ac018bead9dac793be5c\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:48 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:48 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:48 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:51 CD[T]2 0c1a4l-l:0 7g-it1 6[ \"2-0-:g3i0t:-d5i1r =C/DUTs]e rRse/mmohtielCtoyn/tsrhoiln:i eSrY_NaCnInNeGx /s.sghi:t/\"/,m\"a-t-ewoo@rgki-tt-raenen=e/xU-sgeortsa/.mihniflrtoyn/tsiheirnsi.enre_ta-nmnaetxe\"o,_\"g-oct\"a,_\"rceoproe/.~b/agroet=af_arlespeo\"/, +\"fetch\",\"hostrepo\"] + +[2014-07-16 20:30:51 CDT] RemoteControl: Syncing with hostrepo +From ssh://git-annex-host.vpshost.net-someuser_host_repo/~/host_repo + d44a67a..660d71a synced/git-annex -> hostrepo/synced/git-annex + +[2014-07-16 20:30:51 CDT] RemoteControl: DONESYNCING ssh://someuser@git-annex-host.vpshost.net-someuser_host_repo/~/host_repo/ 1 + +[2014-07-16 20:30:51 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:51 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:51 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..d44a67a5795c28e423a9ac018bead9dac793be5c\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:51 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..660d71ac55b47061c531e5c8fa2af7910f2e13aa\",\"--oneline\",\"-n1\"] +(merging hostrepo/synced/git-annex into git-annex...) + +[2014-07-16 20:30:52 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"660d71ac55b47061c531e5c8fa2af7910f2e13aa\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"660d71ac55b47061c531e5c8fa2af7910f2e13aa..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:52 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"660d71ac55b47061c531e5c8fa2af7910f2e13aa\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:30:52 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..660d71ac55b47061c531e5c8fa2af7910f2e13aa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:53 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:30:53 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:30:53 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + +[2014-07-16 20[:32101:4-007-71 6 C2D0T:]3 1:ca0l7l :C DgTi]t Re[m\"ot-e-Cognitrtol-: dSiYNrCI=NG/ Usssh:e/r/msa/tmeoh@giitl-tayn/nesx-hgoitan.iinefrron_tiaerns.nneetx-/m.agtieto\"_,g\"o-t-a_wroepro/k~/-gottar_reepeo/= +/Users/someuser/local_ann[ex\"2,0\"1-4c-\",0\"7c-o1r6e .2b0a:r3e1=:fa0l7s eC\"D,T\"]f eRtecmho\"t,e\"Cgoonttarroelp:o \"] +Syncing with hostrepo +From ssh://git-annex-host.vpshost.net-someuser_host_repo/~/host_repo + 660d71a..273bc7f synced/git-annex -> hostrepo/synced/git-annex + +[2014-07-16 20:31:09 CDT] RemoteControl: DONESYNCING ssh://someuser@git-annex-host.vpshost.net-someuser_host_repo/~/host_repo/ 1 + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git- +annex\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..660d71ac55b47061c531e5c8fa2af7910f2e13aa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..273bc7f261a79539abcc237f1f0bbf5cd4f57add\",\"--oneline\",\"-n1\"] +(merging hostrepo/synced/git-annex into git-annex...) + +[2014-07-16 20:31:09 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"273bc7f261a79539abcc237f1f0bbf5cd4f57add\"] + +[2014-07-16 20:31:09 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"273bc7f261a79539abcc237f1f0bbf5cd4f57add..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:09 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"273bc7f261a79539abcc237f1f0bbf5cd4f57add\"] + +[2014-07-16 20:31:10 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:31:10 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:10 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..273bc7f261a79539abcc237f1f0bbf5cd4f57add\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:10 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:10 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:31:10 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:11 CDT] Watcher: directory deleted /Users/someuser/local_annex/local_annex-test + +[2014-07-16 20:31:11 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"ls-files\",\"--deleted\",\"-z\",\"--\",\"/Users/someuser/local_annex/local_annex-test\"] + +[2014-07-16 20:31[:1270 1C4D-T]0 7c-al1l6: 2g0i:t3 1[:\"-1-7g iCtD-Td]i rR=e/mUosteerCso/nmthriollt:y /SsYhNiCnIiNeGr _sasnhn:e/x//m.agtieto\"@,g\"i-t--waonrnke-xt-rgeoet=a/.Uisnefrrso/nmthiielrtsy./nsehti-nmiaetre_oa_ngnoetxa\"_r,e\"po-/c~\"/g,o\"tcao_rreep.ob/a +re=false\",\"fetch\",\"g[ot2a0r1e4p-o0\"7]- +16 20:31:17 CDT] RemoteControl: Syncing with hostrepo +From ssh://git-annex-host.vpshost.net-someuser_host_repo/~/host_repo + 273bc7f..ce6dd68 synced/git-annex -> hostrepo/synced/git-annex + +[2014-07-16 20:31:18 CDT] RemoteControl: DONESYNCING ssh://someuser@git-annex-host.vpshost.net-someuser_host_repo/~/host_repo/ 1 + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..273bc7f261a79539abcc237f1f0bbf5cd4f57add\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..ce6dd68adec97bbf73f5da408c17511aca8840c5\",\"--oneline\",\"-n1\"] +(merging hostrepo/synced/git-annex into git-annex...) + +[2014-07-16 20:31:18 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"ce6dd68adec97bbf73f5da408c17511aca8840c5\"] + +[2014-07-16 20:31:18 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"ce6dd68adec97bbf73f5da408c17511aca8840c5..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:18 CDT] call: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"ce6dd68adec97bbf73f5da408c17511aca8840c5\"] + +[2014-07-16 20:31:19 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + +[2014-07-16 20:31:19 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:19 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..ce6dd68adec97bbf73f5da408c17511aca8840c5\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:19 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..bfef6b84186d59431377343ab968e255db8c76fa\",\"--oneline\",\"-n1\"] + +[2014-07-16 20:31:19 CDT] feed: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + +[2014-07-16 20:31:19 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + +[2014-07-16 20:31:32 CDT] read: git [\"--git-dir=/Users/someuser/local_annex/.git\",\"--work-tree=/Users/someuser/local_annex\",\"-c\",\"core.bare=false\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"] + +"""]] diff --git a/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn new file mode 100644 index 000000000..3860456d2 --- /dev/null +++ b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn @@ -0,0 +1,54 @@ +### Please describe the problem. + +(small) identical files fail to unannex, leaving broken symlinks, except for the first copy. + +### What steps will reproduce the problem? + +* Have multiple identical files. For example, run this, which creates four 6-byte files: + +> echo Hello>file1.txt && cp file1.txt file2.txt && cp file1.txt file3.txt && cp file1.txt file4.txt + +* Run this (git init needs credentials to have been specified though) + +> git init && git-annex init && git-annex add + +Now there are 4 symlinks, pointing to the same object: + +> lrwxrwxrwx 1 186 Aug 16 15:54 file1.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + +* Optionally run "git commit -a". It doesn't affect the outcome. + +* Run git-annex unannex + +> $ git annex unannex +> unannex file1.txt ok +> (Recording state in git...) +> $ + +Now file1.txt is a normal 6-byte file again, but 2, 3, and 4 are broken symlinks: + + -rw-r----- 1 6 Aug 16 15:54 file1.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file2.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file3.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file4.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + + $ git-annex fsck + fsck file2.txt + ** No known copies exist of file2.txt + failed + fsck file3.txt + ** No known copies exist of file3.txt + failed + fsck file4.txt + ** No known copies exist of file4.txt + failed + git-annex: fsck: 3 failed + + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130802 package + +on Debian GNU/Linux jessie/sid (testing), amd64. + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment new file mode 100644 index 000000000..ca3ad1229 --- /dev/null +++ b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://openid.yandex.ru/deletesoftware/" + nickname="deletesoftware" + subject="duplicate" + date="2013-08-16T14:52:23Z" + content=""" +It's the same as these: + +* [Large unannex operations result in stale symlinks and data loss](http://git-annex.branchable.com/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/) +* [unannex removes object even if referred to by others](http://git-annex.branchable.com/bugs/unannex_removes_object_even_if_referred_to_by_others/) +* [annex unannex/uninit should handle copies](http://git-annex.branchable.com/bugs/annex_unannex__47__uninit_should_handle_copies/) + +and (as gernot mentioned) according to those, has a workaround of \"git annex unannex --fast\". Of course, it's not convenient to need to find a workaround, and to notice a potential dataloss issue… + +"""]] diff --git a/doc/bugs/Old_repository_stuck.mdwn b/doc/bugs/Old_repository_stuck.mdwn new file mode 100644 index 000000000..73903763d --- /dev/null +++ b/doc/bugs/Old_repository_stuck.mdwn @@ -0,0 +1,9 @@ +I had created a test repository a time ago with an old version of git-annex. I didn't really used it so I simply deleted the directory by hand. Now I've installed a new version of git-annex and the old repository stills appears on the webapp, but there is no interface to delete it. + +* Old git-annex version: don't remember +* New git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102 +* OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux + +> This is [[fixed|done]] in git; assuming the repo was showing up +> in the upper-right menu for switching among local repositories. +> --[[Joey]] diff --git a/doc/bugs/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 b/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 new file mode 100644 index 000000000..d7788fa93 --- /dev/null +++ b/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 @@ -0,0 +1,93 @@ +### Please describe the problem. + +Following steps from http://git-annex.branchable.com/assistant/quickstart/ does not get past the first screen. + +### What steps will reproduce the problem? + +* On a nearly fresh Lubuntu system, nearly fresh account, Lubuntu session, run `git-annex` from the start menu. +* Opens firefox, in `Create a git-annex repository` select my `~/Documents` folder, press `Make Repository`. + +* Expected: a new, different page opens. +* Observed: the same page opens, only difference the path displayed is `/home/mylogin/Documents`. Pressing `Make Repository` again shows the same page again. + +I couldn't find any logs at the time. Now I see that they are in .git/annex/daemon.log but content from that time is already gone. + +### What version of git-annex are you using? On what operating system? + +A fresh Ubuntu 14.04 (actually Lubuntu but this shouldn't change anything, right ?), create a user, login. + + + LC_ALL=C apt-cache policy git-annex + git-annex: + Installed: 5.20140412ubuntu1 + Candidate: 5.20140412ubuntu1 + Version table: + *** 5.20140412ubuntu1 0 + 500 http://fr.archive.ubuntu.com/ubuntu/ trusty/universe i386 Packages + 100 /var/lib/dpkg/status + + +### Please provide any additional information below. + +[[!format sh """ +# No command line in bug occurrence. This is the transcript of the workaround I found. +# Actually, the PC was rebooted then I went command line. +cd ~/Documents +git status +fatal: This operation must be run in a work tree +# oh I see it's a bare repo +git annex add . +add (my file names... one line for each) ok +(Recording state in git...) + +Now the webapp seems to run okay, I can see many pages, schedule checks, etc. + +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +-> Ok but log shows only events after I manually dit git annex add. + +[2014-06-08 14:28:46 CEST] main: starting assistant version 5.20140412ubuntu1 +[2014-06-08 14:28:46 CEST] Cronner: You should enable consistency checking to protect your data. + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True}) +(scanning...) [2014-06-08 14:28:46 CEST] Watcher: Performing startup scan +(started...) [2014-06-08 14:28:47 CEST] Committer: Adding (myfiles) + +add (my files...) ok +[2014-06-08 14:32:51 CEST] Committer: Committing changes to git +[2014-06-08 14:34:12 CEST] Committer: Committing changes to git +[2014-06-08 14:34:13 CEST] Committer: Adding (myfiles) +ok +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add (myfile) ok +add (myfile) [2014-06-08 14:34:13 CEST] Committer: Committing changes to git +[2014-06-08 14:42:48 CEST] Cronner: Consistency check in progress +fsck (myfile) (checksum...) +ok + +# End of transcript or log. +"""]] + + + +# Question: + + cat /etc/xdg/autostart/git-annex.desktop + [Desktop Entry] + Type=Application + Version=1.0 + Name=Git Annex Assistant + Comment=Autostart + Terminal=false + Exec=/usr/bin/git-annex assistant --autostart + Categories= + +Should there be a git-annex process whenever I log in even if I don't launch the webapp ? +I can check that on next login. + +At the moment there is "git-annex webapp" and several child processes. + +[[!tag moreinfo]] diff --git a/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 b/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 new file mode 100644 index 000000000..e92e1b100 --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-09T18:57:25Z" + content=""" +It sounds rather like the webapp is failing to create the repository. Although I would expect for it to show an error message in red beneath the repository path. OTOH, it also sounds like something (either the webapp or eg a manual git-annex run) set up a git-annex repository in ~/Documents. + +git-annex will be started automatically on login as long as `~/.config/git-annex/autostart` lists a repository to use. If that file exists and contains ~/Documents then we'll know that the webapp successfully set up the repository. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..a94d0c13a --- /dev/null +++ b/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 @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="comment 2" + date="2014-06-09T20:34:55Z" + content=""" +> It sounds rather like the webapp is failing to create the repository. Although I would expect for it to show an error message in red beneath the repository path. + +No message in red at any time. + +> OTOH, it also sounds like something (either the webapp or eg a manual git-annex run) set up a git-annex repository in ~/Documents. + +There was none before the webapp. +After the webapp failure, there was one, but without any file. +Only after I manually did git annex add, it looked \"unlocked\". + +> git-annex will be started automatically on login as long as ~/.config/git-annex/autostart lists a repository to use. If that file exists and contains ~/Documents then we'll know that the webapp successfully set up the repository. + +Can't check now, the machine is off. Should check soon. Thanks. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..4e497e240 --- /dev/null +++ b/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 @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="No git-annex process." + date="2014-06-11T17:55:56Z" + content=""" +> It sounds rather like the webapp is failing to create the repository. Although I would expect for it to show an error message in red beneath the repository path. OTOH, it also sounds like something (either the webapp or eg a manual git-annex run) set up a git-annex repository in ~/Documents. + +As told before, there was definitely no git repository there before the webapp tried to create one. + +> git-annex will be started automatically on login as long as ~/.config/git-annex/autostart lists a repository to use. If that file exists and contains ~/Documents then we'll know that the webapp successfully set up the repository. + +There exists a ~/.config/git-annex/autostart containing one line, the correct /home/mylogin/Documents path to the folder. + +There is no process with git or annex in its name when user logs on his desktop session. + + + $ grep . $(dpkg -L git-annex | grep -i desktop) + /usr/share/applications/git-annex.desktop:[Desktop Entry] + /usr/share/applications/git-annex.desktop:Type=Application + /usr/share/applications/git-annex.desktop:Version=1.0 + /usr/share/applications/git-annex.desktop:Name=Git Annex + /usr/share/applications/git-annex.desktop:Comment=Track and sync the files in your Git Annex + /usr/share/applications/git-annex.desktop:Terminal=false + /usr/share/applications/git-annex.desktop:Exec=/usr/bin/git-annex webapp + /usr/share/applications/git-annex.desktop:Icon=git-annex + /usr/share/applications/git-annex.desktop:Categories=Network;FileTransfer; + /etc/xdg/autostart/git-annex.desktop:[Desktop Entry] + /etc/xdg/autostart/git-annex.desktop:Type=Application + /etc/xdg/autostart/git-annex.desktop:Version=1.0 + /etc/xdg/autostart/git-annex.desktop:Name=Git Annex Assistant + /etc/xdg/autostart/git-annex.desktop:Comment=Autostart + /etc/xdg/autostart/git-annex.desktop:Terminal=false + /etc/xdg/autostart/git-annex.desktop:Exec=/usr/bin/git-annex assistant --autostart + /etc/xdg/autostart/git-annex.desktop:Categories= + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..748b57df5 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-11T20:09:14Z" + content=""" +What happens if you run `git-annex assistant --autostart` ? +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..50b6e5dfa --- /dev/null +++ b/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 @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="Can't reproduce" + date="2014-06-30T20:06:30Z" + content=""" +I tried to reproduce the bug on another account on the same machine, same LXDE environment. +The bug did not occur again. + +> What happens if you run `git-annex assistant --autostart` ? + +To answer that, I went back to the first account. Just logging in. +The following git-related processes are automatically launched without running `git-annex assistant --autostart`. + + git-annex assistant --startdelay=5s + git --git-dir=/home/somelogin/Documents/.git --work-tree=/home/somelogin/Documents -c core.bare=false cat-file --batch + git --git-dir=/home/somelogin/Documents/.git --work-tree=/home/somelogin/Documents -c core.bare=false cat-file --batch + git --git-dir=/home/somelogin/Documents/.git --work-tree=/home/somelogin/Documents -c core.bare=false check-ignore -z --stdin --verbose --non-matching + git --git-dir=/home/somelogin/Documents/.git --work-tree=/home/somelogin/Documents -c core.bare=false check-attr -z --stdin annex.backend annex.numcopies -- + +So, somehow things went back in order by themselves ? + +There were quite a bunch of software upgrades from Ubuntu, including `lxsession`. Perhaps something was wrong in handling autostart desktop files ? + +Since things appear to work now, should we close the bug ? + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..6349de01e --- /dev/null +++ b/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 @@ -0,0 +1,72 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="Cconfirmed it was a LXDE issue, now fixed." + date="2014-07-03T09:58:24Z" + content=""" +Since this is a little strange, I just looked again at the machine. +Your software attracts archivist kind of git-annex user, so don't be surprise that I kept logs of the machine. + +Short answer: **confirmed it was a LXDE issue, now fixed**. + +## From what date has git-annex started to work ? + + git log | grep Date: + + (many other lines...) + Date: Mon Jun 30 21:43:49 2014 +0200 + Date: Mon Jun 30 21:42:07 2014 +0200 + Date: Mon Jun 30 21:38:22 2014 +0200 + Date: Sun Jun 8 14:34:13 2014 +0200 + Date: Sun Jun 8 14:28:48 2014 +0200 + Date: Sat Jun 7 16:21:06 2014 +0200 + +So I tried to enable it on June 7, reported bug on June 8. +The the machine was used on a regular basis but git-annex assistant was ineffective. +Then it started working as expected from June 30th. + +## Any package install near June 30th ? + +Updates installed regularly. + + cd /var/log ; zgrep -h \" installed.*\" dpkg.log* | grep '2014-0[67]-..' -o | sort | uniq -c + + 2 2014-06-02 + 3 2014-06-03 + 3 2014-06-04 + 3 2014-06-06 + 49 2014-06-07 + 3 2014-06-10 + 8 2014-06-11 + 45 2014-06-12 + 7 2014-06-13 + 2 2014-06-16 + 42 2014-06-21 + 20 2014-06-25 + 3 2014-06-26 + 23 2014-06-27 + 13 2014-06-28 + 6 2014-06-30 + 15 2014-07-02 + 3 2014-07-03 + +Which packages were installed on 2014-06-30 ? + + cd /var/log ; zgrep -h \" installed.*\" dpkg.log* | grep '2014-06-(29|30)' -E + + 2014-06-30 17:29:15 status installed lxsession-data:all 0.4.9.2+git20140410-0ubuntu1.1 + 2014-06-30 17:29:29 status installed desktop-file-utils:i386 0.22-1ubuntu1 + 2014-06-30 17:29:30 status installed mime-support:all 3.54ubuntu1 + 2014-06-30 17:29:30 status installed lxsession-default-apps:i386 0.4.9.2+git20140410-0ubuntu1.1 + 2014-06-30 17:29:44 status installed lxsession-logout:i386 0.4.9.2+git20140410-0ubuntu1.1 + 2014-06-30 17:29:58 status installed lxsession:i386 0.4.9.2+git20140410-0ubuntu1.1 + +And indeed [0.4.9.2+git20140410-0ubuntu1.1 : “lxsession” package : Ubuntu](https://launchpad.net/ubuntu/+source/lxsession/0.4.9.2+git20140410-0ubuntu1.1) + +So it was indeed a lxde bug. + +[Diff text](http://launchpadlibrarian.net/177201602/lxsession_0.4.9.2%2Bgit20140410-0ubuntu1_0.4.9.2%2Bgit20140410-0ubuntu1.1.diff.gz) + +I added a comment there (#69) which may serve as a hint to other people having not updated their system. [Bug #1308348 “network settings indicator missing from panel” : Bugs : “lxsession” package : Ubuntu](https://bugs.launchpad.net/ubuntu/+source/lxsession/+bug/1308348) + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..4ae545407 --- /dev/null +++ b/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 @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 7" + date="2014-07-03T19:03:52Z" + content=""" +That lubuntu bug explains why git-annex would not autostart on login. + +However, that does not explain the original problem description, which was that the `Make Repository` button seemed to make a repository but not switch to the webapp running in that repository. In the case of making a new repository, the webapp is started in it by git-annex, not by the desktop autostart mechanism. + +Can you reproduce the original problem? + + +"""]] diff --git a/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn b/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn new file mode 100644 index 000000000..08bc76ed1 --- /dev/null +++ b/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn @@ -0,0 +1,186 @@ +### Please describe the problem. +On Windows, attempting to annex get from a remote over HTTP fails. URLs which are nearly correct, but have incorrect slashes, are sent. + +### What steps will reproduce the problem? +1. Create an annex on Linux. +2. Configure repository for HTTP access +3. Clone annex on Windows. +4. "git annex get ." +5. git annex makes requests for urls like the following: http://host/repo/.git/annex/objects\<3-char-hash>\<3-char-hash>\SHA + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +placing a wrapper script in front of wget which replaces '\' with '/' works around the issue, and allows git annex get to complete. + + +###Full Transcript + +#### 1. setup of linux repo +[[!format sh """ +test-git-annex@linux_host:~/test_annex$ git version +git version 1.7.10.4 +test-git-annex@linux_host:~/test_annex$ git annex version +git-annex version: 3.20120629 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ mkdir test_annex +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ cd test_annex/ +test-git-annex@linux_host:~/test_annex$ git init . +Initialized empty Git repository in /home/test-git-annex/test_annex/.git/ +test-git-annex@linux_host:~/test_annex$ annex init laptop +init laptop ok +(Recording state in git...) +~/test_annextest-git-annex@linux_host:~/test_annex$ echo "this is some content" > file1.txt +test-git-annex@linux_host:~/test_annex$ git annex add file1.txt +add file1.txt (checksum...) ok +(Recording state in git...) +test-git-annex@linux_host:~/test_annex$ git commit -a -m "initial commit" +[master (root-commit) 821c6c1] initial commit + 1 file changed, 1 insertion(+) + create mode 120000 file1.txt +test-git-annex@linux_host:~/test_annex$ ls -l +total 4 +lrwxrwxrwx 1 test-git-annex test-git-annex 178 Jul 6 11:33 file1.txt -> .git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +test-git-annex@linux_host:~/test_annex$ cat file1.txt +this is some content +"""]] + +#### 2. set up and run http server +[[!format sh """ +test-git-annex@MrLinuxTablet:~/test_annex$ git update-server-info +cd .. +test-git-annex@MrLinuxTablet:~$ python -m SimpleHTTPServer +Serving HTTP on 0.0.0.0 port 8000 ... + +"""]] + +#### 3. Set up Windows, clone repo, init annex + +[[!format sh """ + +#Windows 7 +#download and install git from git-scm.com/download/win +#Git-1.8.3-preview20130601.exe +#on install, selecting "Run Git from the Windows Command Prompt" +#on install, selecting "checkout as-is, commit as-is" +#installs to C:\Program Files (x86)\Git +#download and install git-annex from http://git-annex.branchable.com/install/ +#git-annex-installer.exe +#need to right-click 'run as administrator', per reported bug (link here) +#installs to C:\Program Files (x86)\Git\cmd +#also installs some utilities, including wget.exe + +C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git +Cloning into 'test_annex'... + +C:\Users\test-git-annex>cd test_annex + +C:\Users\test-git-annex\test_annex>dir + Volume in drive C has no label. + + Directory of C:\Users\test-git-annex\test_annex + + . + .. + 178 file1.txt + 1 File(s) 178 bytes + +C:\Users\test-git-annex\test_annex>type file1.txt +.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + +C:\Users\test-git-annex\test_annex>git annex init windows +init windows + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +"""]] + +####4. annex get + +[[!format sh """ +#create empty file named 'wget' in Git\cmd, and install cygwin, add to path, to provide necessary DLLs +C:\Users\test-git-annex\test_annex> git annex get file.txt + +C:\Users\test-git-annex\test_annex>git annex -vd get file1.txt +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","ls-files","--cached","-z","--","file1.txt"] +get file1.txt [] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..98d1182bcee688b06307963dfea81aa70a3c8336","--oneline","-n1"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..304263841906c0b4dda39d0fdbe54e4af4307cb8","--oneline","-n1"] +(merging origin/git-annex into git-annex...) +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","cat-file","--batch"] +[] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","304263841906c0b4dda39d0fdbe54e4af4307cb8..refs/heads/git-annex","--oneline","-n1"] +(Recording state in git...) +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","838284a4dbc1c57bea2595ac7636c32a7a86b745","-p","refs/heads/git-annex","-p","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","c594efcf08bd4de8963cc3fb6890275f623aee12"] +[] call: wget ["-q","-c","-O","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex4860.tmp","http://192.168.0.8:8000/test_annex/.git/config"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\AppData\Local\Temp\git-annex4860.tmp + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/AppData/Local/Temp/git-annex4860.tmp + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +[] read: git ["config","--null","--list","--file","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex4860.tmp"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","config","remote.origin.annex-uuid","64000156-e66a-11e2-aa76-131bb0a453f3"] +[] read: git ["config","--null","--list"] +(from origin...) [] call: wget ["-c","-O","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96\\53e\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\test_annex\.git\annex\tmp\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/test_annex/.git/annex/tmp/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +----6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +Connecting to 192.168.0.8:8000... connected. +HTTP request sent, awaiting response... 404 File not found + ERROR 404: File not found. + +[] call: wget ["-c","-O","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\J9\\m6\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\test_annex\.git\annex\tmp\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/test_annex/.git/annex/tmp/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +----6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +Connecting to 192.168.0.8:8000... connected. +HTTP request sent, awaiting response... 404 File not found + ERROR 404: File not found. + + + Unable to access these remotes: origin + + Try making some of these repositories available: + 64000156-e66a-11e2-aa76-131bb0a453f3 -- origin (laptop) +failed +git-annex: get: 1 failed + +"""]] + +#### http server output from above + +[[!format sh """ +192.168.0.2 - - [] code 404, message File not found +192.168.0.2 - - [] "GET /test_annex/.git/annex%5Cobjects%5Cc96%5C53e%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 - +192.168.0.2 - - [] code 404, message File not found +192.168.0.2 - - [] "GET /test_annex/.git/annex%5Cobjects%5CJ9%5Cm6%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 - +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn new file mode 100644 index 000000000..b997a8c72 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +On Windows, git-annex is unable to 'annex get' from a repository hosted on an external USB disk. + +### What steps will reproduce the problem? +1. Create an annex (A1) on a Linux system +2. Clone A1 to a new annex (A2) to an external USB drive. add A1 as a remote, "annex get ." +3. Mount the USB drive to a windows system. Clone A2 to a new annex (A3). +4. add A2 as a remote to A3 +5. "git annex get ." +6. annex get will fail with file not found errors. This appears to be due to case sensitivity on Windows. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +[[!tag moreinfo]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment new file mode 100644 index 000000000..403c9a1b9 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:50:40Z" + content=""" +Is A2 a bare or a non-bare git repository? + +What filesystem is used on the USB drive? + +Why do you think it has to do with case sensativity? +"""]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn new file mode 100644 index 000000000..92de1dce3 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +On Windows, I try to "annex get" from a Linux based repository, but it fails with no useful error message. + +### What steps will reproduce the problem? +1. Create annex (A1) on a Linux system. +2. clone A1 to another annex (A2) on the same file tree (on a mounted USB drive, for example) +3. add A2 as a remote to A1. +4. clone A1 to an annex (A3) on a Windows 7 system. +5. attempt to "git annex get ." +6. annex reports that it can find no repositories, and asks to make one available. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +I experienced this bug several times with a plain git-annex install, and the only workaround was removing the unix-style remotes from remote repos. + +After other hackery to get git-annex working on Windows, I can't currently reproduce the issue. + +[[!tag moreinfo]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment new file mode 100644 index 000000000..d727bcafc --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T19:14:55Z" + content=""" +I don't understand what is meant by a \"unix-style\" remote. + +Generally it helps to provide some commands I can run on Windows to replicate the problem. +"""]] diff --git a/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn b/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn new file mode 100644 index 000000000..3ea44f857 --- /dev/null +++ b/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn @@ -0,0 +1,102 @@ +### Please describe the problem. +On Windows 7, the committed symlink files are always relative to the repo's .git root; they are not prefixed with the correct number of ../ for the given level of directing nesting. + +Trying to correct this with `git annex fix` returns "You cannot run this command in a direct mode repository." + +I believe that this is also the source of a pathological case I'm seeing on Windows. After adding a lot of content, commands like `git annex sync` and `git annex status` appear to re-checksum the entire annex. After syncing the repo to a Linux machine, fixing the symlinks there, and syncing back, these commands become snappy again. + +### What steps will reproduce the problem? + +[[!format sh """ +git init +git annex init +mkdir -p one/two/three/four/five/six + +# drop files into the dir structure +git annex add . +git annex sync +git log -p +"""]] + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140203-g83e6fb7 + +on Windows 7 Pro + +### Please provide any additional information below. + +The output of `git log -p` for me: + + commit f4d88b6bc99cc94a0b0154da41d06bad3f23cc1e + Author: Justin Geibel <...> + Date: Tue Feb 4 20:56:32 2014 -0500 + + git-annex automatic sync + + diff --git a/git-annex-installer.exe b/git-annex-installer.exe + new file mode 120000 + index 0000000..64f7d83 + --- /dev/null + +++ b/git-annex-installer.exe + @@ -0,0 +1 @@ + +.git/annex/objects/GW/Wk/SHA256E-s14413167--ea3a1e4c09ad12fdb2993a157b77b246a058f7f0ca2cd174d8cc675d1495ec4d.exe/SHA256E-s14413167--ea3a1e4c09ad12fdb2993a157b77b246a058f7f0ca2cd174d8cc675d1495ec4d.exe + \ No newline at end of file + diff --git a/one/git-annex-installer(1).exe b/one/git-annex-installer(1).exe + new file mode 120000 + index 0000000..5b37a29 + --- /dev/null + +++ b/one/git-annex-installer(1).exe + @@ -0,0 +1 @@ + +.git/annex/objects/6k/8K/SHA256E-s19286321--add3e1ac7ceabce7aa1ed1907895ae527fc095610d1e21127e99814728b24f11.exe/SHA256E-s19286321--add3e1ac7ceabce7aa1ed1907895ae527fc095610d1e21127e99814728b24f11.exe + \ No newline at end of file + diff --git a/one/two/git-annex-installer(2).exe b/one/two/git-annex-installer(2).exe + new file mode 120000 + index 0000000..f89508f + --- /dev/null + +++ b/one/two/git-annex-installer(2).exe + @@ -0,0 +1 @@ + +.git/annex/objects/Zm/6K/SHA256E-s19573485--4f2a22c5b96308cf694c85564940d3cba22b5e8b3b714b242116c91369be75ee.exe/SHA256E-s19573485--4f2a22c5b96308cf694c85564940d3cba22b5e8b3b714b242116c91369be75ee.exe + \ No newline at end of file + diff --git a/one/two/three/four/five/git-annex-installer(5).exe b/one/two/three/four/five/git-annex-installer(5).exe + new file mode 120000 + index 0000000..34565f9 + --- /dev/null + +++ b/one/two/three/four/five/git-annex-installer(5).exe + @@ -0,0 +1 @@ + +.git/annex/objects/p3/Xq/SHA256E-s19956630--ec421bfc6cb0b4df2b5195d9229cbcc27a2e5505e0b879bf07e1be38dcc64a42.exe/SHA256E-s19956630--ec421bfc6cb0b4df2b5195d9229cbcc27a2e5505e0b879bf07e1be38dcc64a42.exe + \ No newline at end of file + diff --git a/one/two/three/four/five/six/git-annex-installer(6).exe b/one/two/three/four/five/six/git-annex-installer(6).exe + new file mode 120000 + index 0000000..d6f97d9 + --- /dev/null + +++ b/one/two/three/four/five/six/git-annex-installer(6).exe + @@ -0,0 +1 @@ + +.git/annex/objects/9G/5g/SHA256E-s19967171--c9e33dff779a43e76089ec3bee3411299d5b8abfa67ae1b459cee5a812c5194d.exe/SHA256E-s19967171--c9e33dff779a43e76089ec3bee3411299d5b8abfa67ae1b459cee5a812c5194d.exe + \ No newline at end of file + diff --git a/one/two/three/four/git-annex-installer(4).exe b/one/two/three/four/git-annex-installer(4).exe + new file mode 120000 + index 0000000..a4f791c + --- /dev/null + +++ b/one/two/three/four/git-annex-installer(4).exe + @@ -0,0 +1 @@ + +.git/annex/objects/8J/pM/SHA256E-s19959961--7e4521036f891bba97f4c04527946e26ef43b14576d874c666e73dee405c18cf.exe/SHA256E-s19959961--7e4521036f891bba97f4c04527946e26ef43b14576d874c666e73dee405c18cf.exe + \ No newline at end of file + diff --git a/one/two/three/git-annex-installer(3).exe b/one/two/three/git-annex-installer(3).exe + new file mode 120000 + index 0000000..dda7284 + --- /dev/null + +++ b/one/two/three/git-annex-installer(3).exe + @@ -0,0 +1 @@ + +.git/annex/objects/5X/qQ/SHA256E-s19915186--c6dc288ec8a77404c0ebc22cbe9b4ec911103fd022c3ca74eec582604dff80a7.exe/SHA256E-s19915186--c6dc288ec8a77404c0ebc22cbe9b4ec911103fd022c3ca74eec582604dff80a7.exe + \ No newline at end of file + +> [[fixed|done]] -- I didn't notice this before because it happened to do +> the right thing if you cd'd into the subdir before adding the file there. +> +> WRT the slow down issue, I don't see how it could matter to git-annex on +> Windows whether the symlinks point to the right place. It only looks at +> the basename of the symlink target to get the key. If you have a +> repository that behaves poorly, you can probably use --debug to see if +> git-annex is calling some expensive series of git commands somehow. +> --[[Joey]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn new file mode 100644 index 000000000..0d442437d --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn @@ -0,0 +1,240 @@ +### Please describe the problem. + +I had set up git-annex on a mac; I had created an initial repository at ~/annex; I had created a second repository on an external drive, at /Volumes/Biblio/annex; I had paired with three other machines on the same network, (two linux, one other mac) and set up a remote server as a backup-type repository. All seemed well. It had finally finished syncing everything to the remote server (my upload speeds are slow). + +I closed the firefox window showing the dashboard. I wanted to reopen it, so I ran the git-annex.app again, presuming on a running instance that that just opens the browser back at the webapp. Firefox window opened, but the only repository was the second one I'd made on the external drive. + +I restarted, as best as I could work out: git-annex assistant --stop, then because that left behind a process, killall git-annex. Then restarted the app. + +Firefox opened on the webapp. I had two repositories: The one on the external drive (now the "Here" repo) and the one on ~/annex but only as if it was paired from a different machine. + +ie: I see only "celestia.local (rachel@celestia.local~/annex)". This machine *is* celestia.local. + +That's it. Startup scan took a couple of minutes but didn't add anything. Then it decided to sync to celestia.local, which it took a little time over but didn't apparently do anything. + +If I drop files into ~/annex they are not synced anywhere. ~/annex still has a .git directory, populated with git files, it looks intact. It's just not being seen. + +Is it possible because the user is prompted to create their initial repo at ~/Desktop/annex it will by default only look there, then start looking in external drives for it? So the fact I didn't want it on my desktop, but put it directly in home, meant it got lost on restart? + +git-annex vicfg in ~/annex shows me this: + +[[!format sh """ +# git-annex configuration +# +# Changes saved to this file will be recorded in the git-annex branch. +# +# Lines in this file have the format: +# setting uuid = value + +# Repository trust configuration +# (Valid trust levels: trusted semitrusted untrusted dead) +# (for web) +#trust 00000000-0000-0000-0000-000000000001 = semitrusted +# (for rachel@octavia:~/annex) +#trust 161dec38-e8be-43b8-86c5-555d35ce3416 = semitrusted +# (for rachel@celestia.local:~/annex) +#trust 179fcddf-e247-4577-804b-267feed8abb1 = semitrusted +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +#trust 256d5762-150d-4d5d-9340-517de298c874 = semitrusted +# (for twilight.local_annex (rachel@twilight:~/annex)) +#trust aeef7490-ce27-4255-b800-1947706c4a06 = semitrusted +# (for rachel@octavia:~/annex) +#trust c469fbce-f3b4-4e27-a54f-0b747797a7d5 = semitrusted +# (for annex (Biblio's Copy)) +#trust c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = semitrusted +# (for luna.strangenoises.org_annex) +#trust f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = semitrusted +# (for octavia.local_annex (rachel@octavia:~/annex)) +#trust f748a5ed-d870-48fb-b3ec-811488eb2faa = semitrusted +# (for rachel@twilight:~/annex) +#trust fcaba03e-1ba5-11e3-90f1-57fe1467e006 = semitrusted + +# Repository groups +# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted) +# (Separate group names with spaces) +# (for rachel@octavia:~/annex) +group 161dec38-e8be-43b8-86c5-555d35ce3416 = client +# (for rachel@celestia.local:~/annex) +group 179fcddf-e247-4577-804b-267feed8abb1 = client +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +group 256d5762-150d-4d5d-9340-517de298c874 = client +# (for twilight.local_annex (rachel@twilight:~/annex)) +group aeef7490-ce27-4255-b800-1947706c4a06 = client +# (for rachel@octavia:~/annex) +group c469fbce-f3b4-4e27-a54f-0b747797a7d5 = client +# (for annex (Biblio's Copy)) +group c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = client +# (for octavia.local_annex (rachel@octavia:~/annex)) +group f748a5ed-d870-48fb-b3ec-811488eb2faa = client +# (for rachel@twilight:~/annex) +group fcaba03e-1ba5-11e3-90f1-57fe1467e006 = client +# (for luna.strangenoises.org_annex) +group f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = transfer +# (for web) +#group 00000000-0000-0000-0000-000000000001 = + +# Repository preferred contents +# (for rachel@octavia:~/annex) +content 161dec38-e8be-43b8-86c5-555d35ce3416 = standard +# (for rachel@celestia.local:~/annex) +content 179fcddf-e247-4577-804b-267feed8abb1 = standard +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +content 256d5762-150d-4d5d-9340-517de298c874 = standard +# (for twilight.local_annex (rachel@twilight:~/annex)) +content aeef7490-ce27-4255-b800-1947706c4a06 = standard +# (for rachel@octavia:~/annex) +content c469fbce-f3b4-4e27-a54f-0b747797a7d5 = standard +# (for annex (Biblio's Copy)) +content c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = standard +# (for luna.strangenoises.org_annex) +content f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = standard +# (for octavia.local_annex (rachel@octavia:~/annex)) +content f748a5ed-d870-48fb-b3ec-811488eb2faa = standard +# (for rachel@twilight:~/annex) +content fcaba03e-1ba5-11e3-90f1-57fe1467e006 = standard +# (for web) +#content 00000000-0000-0000-0000-000000000001 = +"""]] + +while the same command in /Volumes/Biblio/annex gives: + +[[!format sh """ +# git-annex configuration +# +# Changes saved to this file will be recorded in the git-annex branch. +# +# Lines in this file have the format: +# setting uuid = value + +# Repository trust configuration +# (Valid trust levels: trusted semitrusted untrusted dead) +# (for web) +#trust 00000000-0000-0000-0000-000000000001 = semitrusted +# (for rachel@octavia:~/annex) +#trust 161dec38-e8be-43b8-86c5-555d35ce3416 = semitrusted +# (for celestia.local (rachel@celestia.local:~/annex)) +#trust 179fcddf-e247-4577-804b-267feed8abb1 = semitrusted +# (for rachel@rainbow.local:~/annex) +#trust 256d5762-150d-4d5d-9340-517de298c874 = semitrusted +# (for rachel@twilight:~/annex) +#trust aeef7490-ce27-4255-b800-1947706c4a06 = semitrusted +# (for rachel@octavia:~/annex) +#trust c469fbce-f3b4-4e27-a54f-0b747797a7d5 = semitrusted +# (for Biblio's Copy) +#trust c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = semitrusted +# (for ) +#trust f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = semitrusted +# (for rachel@octavia:~/annex) +#trust f748a5ed-d870-48fb-b3ec-811488eb2faa = semitrusted +# (for rachel@twilight:~/annex) +#trust fcaba03e-1ba5-11e3-90f1-57fe1467e006 = semitrusted + +# Repository groups +# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted) +# (Separate group names with spaces) +# (for rachel@octavia:~/annex) +group 161dec38-e8be-43b8-86c5-555d35ce3416 = client +# (for celestia.local (rachel@celestia.local:~/annex)) +group 179fcddf-e247-4577-804b-267feed8abb1 = client +# (for rachel@rainbow.local:~/annex) +group 256d5762-150d-4d5d-9340-517de298c874 = client +# (for rachel@twilight:~/annex) +group aeef7490-ce27-4255-b800-1947706c4a06 = client +# (for rachel@octavia:~/annex) +group c469fbce-f3b4-4e27-a54f-0b747797a7d5 = client +# (for Biblio's Copy) +group c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = client +# (for rachel@octavia:~/annex) +group f748a5ed-d870-48fb-b3ec-811488eb2faa = client +# (for rachel@twilight:~/annex) +group fcaba03e-1ba5-11e3-90f1-57fe1467e006 = client +# (for ) +group f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = transfer +# (for web) +#group 00000000-0000-0000-0000-000000000001 = + +# Repository preferred contents +# (for rachel@octavia:~/annex) +content 161dec38-e8be-43b8-86c5-555d35ce3416 = standard +# (for celestia.local (rachel@celestia.local:~/annex)) +content 179fcddf-e247-4577-804b-267feed8abb1 = standard +# (for rachel@rainbow.local:~/annex) +content 256d5762-150d-4d5d-9340-517de298c874 = standard +# (for rachel@twilight:~/annex) +content aeef7490-ce27-4255-b800-1947706c4a06 = standard +# (for rachel@octavia:~/annex) +content c469fbce-f3b4-4e27-a54f-0b747797a7d5 = standard +# (for Biblio's Copy) +content c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = standard +# (for ) +content f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = standard +# (for rachel@octavia:~/annex) +content f748a5ed-d870-48fb-b3ec-811488eb2faa = standard +# (for rachel@twilight:~/annex) +content fcaba03e-1ba5-11e3-90f1-57fe1467e006 = standard +# (for web) +#content 00000000-0000-0000-0000-000000000001 = +"""]] + +### What steps will reproduce the problem? + +As above. I have no idea what just happened, but apart from git-annex assistant --stop and having to mop up leftover processes, I didn't use the git-annex commandline for anything. + +### What version of git-annex are you using? On what operating system? + +Mac OS X 10.8.4 + + Version: 4.20130909-ga29f960 + Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi + +### Please provide any additional information below. + +The log on ~/annex/.git/annex/daemon.log is huge and full of transfers of files with my personal filenames. I'd rather not. It appears to end normally. + +Now there is a short log in /Volumes/Biblio/annex/.git/annex/daemon.log from, I guess, the time I tried to restart. For some reason therefore, after the successful session finished, on restart it only looks here. This log is appended. + +[[!format sh """ +[2013-09-12 21:35:39 BST] main: starting assistant version 4.20130909-ga29f960 + +[2013-09-12 21:35:39 BST] TransferScanner: Syncing with celestia.local +Already up-to-date. + +(scanning...) [2013-09-12 21:35:39 BST] Watcher: Performing startup scan +From /Users/rachel/annex + * [new branch] git-annex -> celestia.local/git-annex + * [new branch] master -> celestia.local/master + * [new branch] synced/git-annex -> celestia.local/synced/git-annex + * [new branch] synced/master -> celestia.local/synced/master +Updating 4f974a8..74770d9 +Fast-forward +Already up-to-date. +Already up-to-date. +Already up-to-date. +[2013-09-12 21:36:39 BST] Pusher: Syncing with celestia.local +(merging celestia.local/git-annex celestia.local/synced/git-annex into git-annex...) +(Recording state in git...) + + + + +(started...) error: Ref refs/heads/synced/git-annex is at 5b4ed9b3098e936d60b61a1d3915fa29e8c823d0 but expected 792d2a5c14b0b6327d2089e174063c474ba5a764 +remote: error: failed to lock refs/heads/synced/git-annex +To /Users/rachel/annex + 792d2a5..5b4ed9b git-annex -> synced/git-annex +To /Users/rachel/annex + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to '/Users/rachel/annex' +Everything up-to-date +"""]] + +Well, I see that thing about "failed to lock". I can imagine that my 'killall git-annex' to kill a leftover process that was hanging around after I'd done git-annex assistant --stop might have left stale lock files, somewhere... but of course I only got as far as doing that because I was already encountering problems, just trying to return to the webapp. + +> The original bug report seems to be a case of user confusion, +> and not a bug. (Although perhaps the UI is confusing?) +> +> The "resource exhausted" that came up later is quite likely the problem +> fixed in [[!commit 4d06037fdd44ba38fcd4c118d1e6330f06e22366]], +> which affected local git remotes. +> +> [[closing|done]]; I don't see any value keeping this open, I'm afraid. +> --[[Joey]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment new file mode 100644 index 000000000..a26db0870 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T21:29:39Z" + content=""" +The git-annex webapp displays a view from \"inside\" one git repsitory at a time. It seems to me that you have two or more local git repositories; one in ~/annex and one on a removable drive. The webapp is coming up viewing from inside your removable drive's repository. You can change the repository that the webapp views by going to the Repository menu in the upper-right corner and selecting Switch repository. The webapp will remember which repository it viewed last, and come back up showing that same repository. + +It's BTW an unusual configuration to have the git-annex assistant directly running on a removable drive as you seem to have done. You must have previously went to the Repository menu and selected \"Add another local repository\", and then added the removable drive, and then connected that repository up to your ~/annex repository. Which would explain why the webapp was last showing the repository on the removable drive. The more usual way to add a removable drive is to use the \"Add another repository\" button and select \"Removable drive\". + +I think, but am not sure, that the error \"Ref refs/heads/synced/git-annex is at 5b4ed9b3098e936d60b61a1d3915fa29e8c823d0 but expected 792d2a5c14b0b6327d2089e174063c474ba5a764\" is due to having two git-annex assistants running in these two different repositories and both updating them both at the same time. You might want to stop all git-annex processes, edit `~/.config/git-annex/autostart` and remove the removable drive repository from that list, leaving only `~/annex` in the list. +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment new file mode 100644 index 000000000..10fad2252 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="I don't know whether I've fixed it or confused things further" + date="2013-09-12T21:30:44Z" + content=""" +I shut down the daemon that was running from the webapp itself. + +Instead of launching by using the app, I did: + +[[!format txt \"\"\" +celestia:~ rachel$ cd annex/ +celestia:annex rachel$ git-annex assistant +(merging synced/git-annex into git-annex...) +celestia:annex rachel$ git-annex webapp +Launching web browser on file:///Users/rachel/annex/.git/annex/webapp.html +celestia:annex rachel$ +\"\"\"]] + +It opened the webapp. I could see all the repos back again. + +It also seems to be syncing to everything else, sending the files all over again, even though they haven't changed. + +It's just about possible it's completing the job, as I'm not sure I saw the files syncing now, being synced earlier. But... in that earlier session it had run the queue dry, *it* thought it had completed syncing. + +What's going on? +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment new file mode 100644 index 000000000..4d44aaf5c --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 3" + date="2013-09-12T21:33:18Z" + content=""" +See my explanation above. By manually starting the webapp inside your ~/annex repository you forced it to view that repository. + +It's not unusual for the webapp to display it syncing some files that have been synced before. This repository may not be up-to-date on which files have been sent where, and it will quickly notice the file has already been transferred and skip doing anything for that file. +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment new file mode 100644 index 000000000..16a5a351f --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="Last night's comment" + date="2013-09-13T10:28:02Z" + content=""" +> It's BTW an unusual configuration to have the git-annex assistant directly running on a removable drive as you seem to have done. You must have previously went to the Repository menu and selected \"Add another local repository\", and then added the removable drive, and then connected that repository up to your ~/annex repository. Which would explain why the webapp was last showing the repository on the removable drive. The more usual way to add a removable drive is to use the \"Add another repository\" button and select \"Removable drive\". + +That is exactly how I'd added that repository, yes. I didn't notice the dedicated \"removable drive\" option until later. :-) I thought it possibly appropriate to leave it that way because, while Biblio is an external drive and remov*able*, in practice I never remove it; it's a permanent fixture. + +After all, this is a mac mini server, originally (no longer running Server) so it has a second *internal* drive. It would have been even more logical for me to have added a second repo on there in the same manner, as it's most definitely not removable without extreme effort; but it still mounts inside /Volumes, and presumably if I'd added it as a non-removable repo, I'd have had the same problem? + +> It's not unusual for the webapp to display it syncing some files that have been synced before. This repository may not be up-to-date on which files have been sent where, and it will quickly notice the file has already been transferred and skip doing anything for that file. + +Yes, that's probably what happened. It finished pretty quickly, about a minute after sending my previous comment. + +Going to bed now, but tomorrow I'll follow the remaining suggestions; basically I'll remove the repo on the external drive then, if I still want it there, I'll add it back in the other way, so it thinks of it as removable. + +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment new file mode 100644 index 000000000..685d1b024 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment @@ -0,0 +1,50 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="And this morning..." + date="2013-09-13T10:38:35Z" + content=""" +I tried removing the second repo, by deleting it, it seemed to begin normally. Then it just hung, and hung. + +Looking at logs, it seemed to be hung on dropping one file - a very small file in fact, but it was probably the most recent file to be added. So the end of the log just looked like: + +[[!format txt \"\"\" +drop annex old stuff/renegade/issue7back.pdf ok +drop annex old stuff/renegade/issue7fiction.pdf ok +drop annex postgresql 9.0->9.1 upgrade process +\"\"\"]] + +After a while I started getting problems in other terminal shells where I was doing stuff unrelated to git annex. eg: on trying to open a new terminal window, it would open, then shut immediately, or it would open with just: + +[[!format txt \"\"\" +forkpty: Resource temporarily unavailable +Could not create a new process and open a pseudo-tty. +\"\"\"]] + +Various other commands that would have resulted in a fork were failing too. In the end I shut down git annex (using the shutdown daemon open in the menu in the webapp), and everything went back to normal. + +This is the end of the daemon.log from this morning. I don't want to paste the whole thing, as essentially it lists all my private filenames, and there's a lot. In fact I wonder if the quantity of files may be a factor: + +[[!format txt \"\"\" +drop annex old stuff/renegade/index.html ok +drop annex old stuff/renegade/issue1.pdf ok +drop annex old stuff/renegade/issue2.pdf ok +drop annex old stuff/renegade/issue3.pdf ok +drop annex old stuff/renegade/issue4.pdf ok +drop annex old stuff/renegade/issue4coverpic.pdf ok +drop annex old stuff/renegade/issue6articles.pdf ok +drop annex old stuff/renegade/issue6cover.pdf ok +drop annex old stuff/renegade/issue6fiction.pdf ok +drop annex old stuff/renegade/issue7articles.pdf ok +drop annex old stuff/renegade/issue7back.pdf ok +drop annex old stuff/renegade/issue7fiction.pdf ok +drop annex postgresql 9.0->9.1 upgrade process [2013-09-13 11:25:07 BST] NetWatcherFallback: Syncing with twilight.local_annex, octavia.local_annex, 192.168.1.103_annex, luna.strangenoises.org_annex +NetWatcherFallback crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) +[2013-09-13 11:25:07 BST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) +recv: resource vanisrhreeecdcv v:(: C rorenesnsoeoucurtrciceoe n v varanenisiseshthe edbd y ( (CpCoeonennrne)ec +cttiioonn rreesseett bbyy ppeeeerr)) + +[2013-09-13 11:26:32 BST] main: warning git-annex has been shut down +\"\"\"]] + +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment new file mode 100644 index 000000000..c0923b22a --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="comment 6" + date="2013-09-13T10:52:07Z" + content=""" +FYI, if there's any relevance to the number of files in the annex, there are 1899 files in the annex at the moment, so that many in the one being deleted. The one it hung on, \"postgresql 9.0->9.1 upgrade process\" was indeed the last one that comes up in a find command, which I think means the most recently added to this dir. + +Creating too many threads? +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment new file mode 100644 index 000000000..c11630ef7 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="comment 7" + date="2013-09-13T10:54:37Z" + content=""" +... and resolved for myself by just deleting (dropping in the trash for now) the annex on the external volume, restarting git-annex assistant and *disabling* that repo from the menu rather than deleting it. + +"""]] diff --git a/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn new file mode 100644 index 000000000..8d1d3e8ec --- /dev/null +++ b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. +On the first run it seems "Open Webapp" always use the URL used to configure a new repo. + +### What steps will reproduce the problem? +I'm using a /sdcard/DCIM annex. + +1. close the tabs in the git annex terminal to close git annex +2. force close the application in the settings and delete data (not sure if it's needed) +3. delete /sdcard/DCIM/.git/ and /sdcard/git-annex.home/ (I'm not sure I'm deleting everything, maybe I missed some dirs) +4. start git annex + +(WebApp opens and ask to create a repo) see: [http://i.imgur.com/v0EUuir.png](http://i.imgur.com/v0EUuir.png) + +5. Click "Make Camera Repository" + +(WebApp scans and commits the files) see: [http://i.imgur.com/97rYfXa.png](http://i.imgur.com/97rYfXa.png) (note that the port changed) + +6. Return to the terminal. see: [http://i.imgur.com/edL5and.png](http://i.imgur.com/edL5and.png) +7. Open WebApp using the menu + +(Git annex opens the URL to configure a new repo (the webapp is still accessible with the other url). see: [http://i.imgur.com/T8A5NTD.png](http://i.imgur.com/T8A5NTD.png) + +If I close and reopen the terminal, the good url is used when I use "open webapp" + +### What version of git-annex are you using? On what operating system? +4.20130601-g7483ca4 + +### Please provide any additional information below. + +[[!format sh """ +[2013-06-01 17:13:34 EDT] main: starting assistant version 4.20130601-g7483ca4 +(scanning...) [2013-06-01 17:13:34 EDT] Watcher: Performing startup scan +(started...) [2013-06-01 17:13:42 EDT] Committer: Adding 123 files + +add Camera/IMG_20130223_111411.jpg (checksum...) ok +[...] +[2013-06-01 17:14:17 EDT] Committer: Committing changes to git +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment new file mode 100644 index 000000000..9ed036f84 --- /dev/null +++ b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-01T23:39:39Z" + content=""" +Ah yes, I see what's going on. It's not updating the url in the special file added for Android. + +Should be an easy fix one I return from vacation. + +Workaround: Open a new terminal tab and it will open the web browser viewing the repo you set up. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn new file mode 100644 index 000000000..c127bac15 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn @@ -0,0 +1,84 @@ +Before I start on what's gone wrong, many thanks for a great program: finally a way of finding out where I've put all those files, and I enjoyed your talk in Australia. Not quite to New Zealand, but a good start :-) + +To play with git-annex, I decided to convert my ~/Downloads directory to a git-annex repository, as there were a wide variety of files in it, mostly easily replaceable, and also handy to have on multiple machines. In hindsight, probably wasn't a great idea, as I'd regularly forget it was a git-annex repo and move files and directories out manually, which caused all sorts of fun trying to sort out the dead symlinks. Then I after one update, the repository format changed, from WORM to xxx256 format which meant there were now both sorts in the GA object store. + +More recently I'd tried converting the repo to direct mode, you get the idea: lots of playing with git-annex commands, and now that I think about it, possibly some git commands too trying to repair missing files. + +Anyway I've ended up with a 27GB git-annex repo that now manages to kill git-annex whenever I try to check it using "git-annex fsck". + +Not only does the fsck subcommand cause it to die, but also "find", "whereis" and "status". It dies on the same file (for find/whereis/fsck). + +e.g. + + ... lots of stuff deleted ... + whereis 1wolf14.zip (2 copies) + 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop + 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads) + ok + git-annex: out of memory (requested 2097152 bytes) + +Now "git status" for some repo data: + + myPC:~/Downloads$ git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: direct + trusted repositories: 0 + semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop + 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads) + 48fbe52a-a1b3-11e1-bb80-ebc15118871d -- netbk + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 100 gigabytes (+1 megabyte reserved) + local annex keys: 1719 + local annex size: 27 gigabytes + known annex keys: git-annex: out of memory (requested 2097152 bytes) + +It always seems to die at about 3.5GB memory usage. This is running on Ubuntu 12.04, using the latest GA release built using cabal: + + git-annex version: 4.20130227 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +There are also dead symlinks that point to directories that have meta-data but not the symlink target (manually line-wrapped): + + myPC:~/Downloads$ ls -l precise* + lrwxrwxrwx 1 nino nino 194 Oct 21 12:48 precise-dvd-i386.iso -> + .git/annex/objects/0x/Xz/SHA256-s3590631424-- + b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0/ + SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0 + +But looking in the symlink destination directory, there's no corresponding object, only metadata: + + myPC:~/Downloads/.git/annex/objects/0x/Xz/SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0$ ls -l + total 8 + -rw-rw-r-- 1 nino nino 30 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.cache + -rw-rw-r-- 1 nino nino 49 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.map + +But there is another version somewhere else. + + -r--r--r-- 1 nino nino 3590631424 Mar 18 2012 ./.git/annex/objects/Kj/wM/WORM-s3590631424-m1331991509 + --precise-dvd-i386.iso/WORM-s3590631424-m1331991509--precise-dvd-i386.iso + +This actual file does exist in the "Used" directory: + + -rw-r--r-- 1 nino nino 3.4G May 27 2012 precise-dvd-i386.iso + +I'm not so worried about the mangled repo - it's quite possibly because of clueless git/git-annex command usage - but the inability to use the fsck command is concerning + +I could just uninit everything, but as it dies prematurely, I'm not certain that all the contents would be restored. +Any thoughts on how I can get git-annex (esp. fsck) to complete would be appreciated. + +Thanks +Giovanni + +> [[fixed|done]]. However, if you saw this behavior, +> you have large files checked directly into git. You may +> want to examine your repository and use git filter-branch to clean +> it up. +> --[[Joey]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment new file mode 100644 index 000000000..d410f960b --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-03T18:34:41Z" + content=""" +git-annex is designed to run in constant memory. It should never use a lot of memory. + +What file causes the problem? You show git-annex whereis successfully processing 1wolf14.zip, so that file is apparently not the problem. It's probably the *next* file you told whereis to run on. You can get a file list with `git ls-files` + +Apparently something bad is happening when it tries to calculate the key used by the problem file. + +What does the file look like? You're using direct mode so it may or may not be a symlink. If it's a symlink, show it. If not, show the output of: `echo HEAD:./$filename | git cat-file --batch` + +---- + +The stuff about \"dead symlinks\" etc is all a distraction AFAICS. git-annex allows you to remove content from your repository in multiple ways. That content could be present in another repository (git annex whereis would tell you), or the last copy of it could have been deleted. You can run \"git annex log\" on a file to show where the content was located historically. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment new file mode 100644 index 000000000..937e9cf8e --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-18T23:25:24Z" + content=""" +This is an important bug. Could you please get back to me so I can debug it? +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment new file mode 100644 index 000000000..3e851faa4 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 3" + date="2013-03-22T11:18:53Z" + content=""" +I may have a bug along the same lines of this but I think it is in git, rather than git-annex. + +I've been using git-annex to sort and consolidate ~2TB files that have been spread across several machines. I probably failed to do an important step (such as committing to git, I'm not sure) while moving a lot of these files around which renders me unable to use the repository. + +For example, if I run any command that uses something like 'git status' in the background, it gradually consumes all available memory. I've not had an OOM error yet (8GB RAM, 2GB swap) but it also never seems to complete. + +I just did a quick test on this and running 'git status' in the annex results in, after a few minutes, a growing number of 'git status --porcelain' processes (quickly reaches 70+, currently at 94) and nearly all memory consumed. This would normally be triggered with 'git annex sync' or some other command which uses 'git status' to do some work. + +Hope this information is of some use. If I can help further, please let me know. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment new file mode 100644 index 000000000..272d2a759 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-03-27T16:38:07Z" + content=""" +@Xyem, sounds like an unrelated bug. Also, no git-annex commands run `git status`. You can find other git commands that may be using a lot of memory by passing the --debug flag to git-annex. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment new file mode 100644 index 000000000..958eb7733 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 5" + date="2013-03-27T16:50:58Z" + content=""" +@joey: Hm.. I'm sure it was 'git annex sync' that initially consumed all RAM by spawning a lot of 'git status' processes. However, I can't replicate it anymore as I found a way to make the repository useable again. + +I went low into the directory structure and added/committed from there. Now I can 'git annex sync' and 'git status' from the annex root without any problems. + +Sorry for cluttering this bug report up, thought it might be related/of some help. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment new file mode 100644 index 000000000..b648eb9a4 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://churchkey.org/author/ian/" + ip="2001:470:8a52:67:a800:4ff:fe00:a04" + subject="Same problem, different user" + date="2013-09-18T22:20:09Z" + content=""" +@joey I appear to have run into this same problem through a similar series of repository operations. I began with the assistant, which caused some trouble while trying to set up on multiple machines, so I started using the git-annex commands directly, switched the client to direct mode, and at some point along the way I started getting the \"git-annex: out of memory (requested 1048576 bytes)\" error on my home client any time I try to run a find, whereis, status, or sync operation. On my work client I instead run into a \"fatal: write error: Invalid argument\" error. Both clients are in direct mode and both stop on the same files. I have tried to drop these files and the ones that follow them sequentially to try and clear out the grit from the machine, but to no avail. I'm available for diagnostics to help resolve this. The files in question are not symlinks and running \"echo HEAD:./$filename | git cat-file --batch\" simply produces binary blobs the same size as the original files. Running \"git ls-tree -r git-annex | wc -l\" gives \"41262\" for the client with the \"Out of memory\" error and \"41260\" for the \"write error\" client. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment new file mode 100644 index 000000000..c7832477c --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 7" + date="2013-09-19T19:07:03Z" + content=""" +[[Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status]] is a duplicate of this bug. +"""]] diff --git a/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn b/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn new file mode 100644 index 000000000..6999d714c --- /dev/null +++ b/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn @@ -0,0 +1,23 @@ +Open two webapp sessions (in two different *screen* windows or whatever) + + name@name-Computermodel-1000:~/test/annex1$ git-annex webapp + name@name-Computermodel-1000:~/test/annex2$ git-annex webapp + +In annex1's web UI, choose *Configuration* -> *Manage repositories* -> *Local computer*. + +Fill in the secret phrase and press *Start pairing*. + +In annex2's web UI, a pairing request will show on the left notifications bar. Choose *Respond*, fill in the phrase field and press *Finish pairing*. + +I was expecting a pairing between the two running session. But I got this after pressing *Finish pairing* in annex2's web UI: + +**start of output** +# Internal Server Error + +bad comment in ssh public key ssh-rsa [very long GPG key jibber jabber] name@name-Computermodel-1000 + +**end of output** + +git-annex version: 3.20121017, Ubuntu 12.04 + +> [[Done]], allowed dash and underscore in there now. diff --git a/doc/bugs/Prevent_accidental_merges.mdwn b/doc/bugs/Prevent_accidental_merges.mdwn new file mode 100644 index 000000000..9947f7373 --- /dev/null +++ b/doc/bugs/Prevent_accidental_merges.mdwn @@ -0,0 +1,16 @@ +With the storage layout v3, pulling the git-annex branch into the master branch is... less than ideal. + +The fact that the two branches contain totally different data make an accidental merge worse, arguably. + +Adding a tiny binary file called .gitnomerge to both branches would solve that without any noticeable overhead. + +Yes, there is an argument to be made that this is too much hand-holding, but I still think it's worth it. + +-- Richard + +> It should be as easy to undo such an accidential merge +> as it is to undo any other git commit, right? I quite like that git-annex +> no longer adds any clutter to the master branch, and would be reluctant +> to change that. --[[Joey]] + +[[wontfix|done]] --[[Joey]] diff --git a/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment b/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment new file mode 100644 index 000000000..3e28a28cb --- /dev/null +++ b/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-10-23T15:00:48Z" + content=""" +Having run into the same issue again, I still think git-annex should ensure no merges take place. The clutter introduced by a .gitnomerge is neglible, imo. +"""]] diff --git a/doc/bugs/Proxy_support.mdwn b/doc/bugs/Proxy_support.mdwn new file mode 100644 index 000000000..ae6eaf689 --- /dev/null +++ b/doc/bugs/Proxy_support.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? + +Adding a e.g box.com repository from behind a http proxy via webapp. + +What is the expected output? What do you see instead? + +Connection should be made. But there is an error message: + +"Internal Server Error +connect: does not exist (Connection refused): user error" + +What version of git-annex are you using? On what operating system? + +3.20121127 on Archlinux + +Please provide any additional information below. + +I don't use networkmanager if proxy information is obtained from it. There should be a fallback to environment variables. +[[!tag confirmed]] diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn new file mode 100644 index 000000000..1fee43928 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn @@ -0,0 +1,195 @@ +Addurl can fail due to an apparent race condition when watch or assistant is running and the repository is in direct mode. The following stress test script encounters the bug consistently on my system. I am running git-annex 5.20140320 on on Ubuntu 13.10. + +[[!format sh """ +#!/bin/sh +set -eu + +cleanup() { + local dir + dir="$1"; shift + if [ -d "$dir" ]; then + ( + set -x + fuser -k -w "$dir/annex/.git/annex/daemon.log" || : + find "$dir" -type d -exec chmod 700 '{}' '+' + find "$dir" -type f -exec chmod 600 '{}' '+' + rm -fr "$dir" + ) + fi +} + +go() { + local dir + dir="$(mktemp -d "${TMP:-/tmp}/stress-annex.XXXXXXXXXX")" + trap "cleanup '$dir'" 0 1 2 13 15 + + ( + cd "$dir" + mkdir annex + cd annex + set -x + + git init + git annex init + git annex direct + git annex watch + + for n in $(seq 100); do + git annex addurl --file=foo http://heh.fi/robots.txt + git annex sync + rm -f foo + git annex sync + done + + git annex watch --stop + git annex uninit + ) + + cleanup "$dir" + trap - 0 1 2 13 14 +} + +go +"""]] + +Script output: + +[[!format sh """ +% ./stress-annex ++ git init +Initialized empty Git repository in /tmp/stress-annex.OKj6D8kVmV/annex/.git/ ++ git annex init +init ok +(Recording state in git...) ++ git annex direct +commit +On branch master + +Initial commit + +nothing to commit +ok +direct ok ++ git annex watch ++ seq 100 ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + + +git-annex: /tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/: openTempFile: permission denied (Permission denied) +failed +git-annex: addurl: 1 failed ++ fuser -k -w /tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/daemon.log +/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/daemon.log: 30704 30709 30735 30738 30778 ++ find /tmp/stress-annex.OKj6D8kVmV -type d -exec chmod 700 {} + ++ find /tmp/stress-annex.OKj6D8kVmV -type f -exec chmod 600 {} + ++ rm -fr /tmp/stress-annex.OKj6D8kVmV +"""]] + +The script also seems to encounter another issue. The output when seq 100 is changed to seq 1 and addurl happens to succeed: + +[[!format sh """ ++ git init +Initialized empty Git repository in /tmp/stress-annex.QEs0pNyS9z/annex/.git/ ++ git annex init +init ok +(Recording state in git...) ++ git annex direct +commit +On branch master + +Initial commit + +nothing to commit +ok +direct ok ++ git annex watch ++ seq 1 ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:17:20-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:17:20 (0.00 B/s) - ‘/tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex watch --stop ++ git annex uninit +git-annex: /tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.map: removeLink: permission denied (Permission denied) ++ fuser -k -w /tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/daemon.log ++ : ++ find /tmp/stress-annex.QEs0pNyS9z -type d -exec chmod 700 {} + ++ find /tmp/stress-annex.QEs0pNyS9z -type f -exec chmod 600 {} + ++ rm -fr /tmp/stress-annex.QEs0pNyS9z +"""]] diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment new file mode 100644 index 000000000..cf010cd25 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment @@ -0,0 +1,55 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="Another race condition" + date="2014-03-31T03:42:42Z" + content=""" +Here’s another race condition which seems related: + +[[!format sh \"\"\" +% git annex addurl 'quvi:http://youtu.be/-CbFj9K9AQg' +addurl David_Raymond_Christiansen___Dependently_Typed_Programming_in_Idris___A_Demo.webm +--2014-03-31 05:45:49-- http://r4---sn-oxc0a5-ixae.googlevideo.com/videoplayback? +Resolving r4---sn-oxc0a5-ixae.googlevideo.com (r4---sn-oxc0a5-ixae.googlevideo.com)... 83.145.196.143, 2001:1bc8:100:1b::f +Connecting to r4---sn-oxc0a5-ixae.googlevideo.com (r4---sn-oxc0a5-ixae.googlevideo.com)|83.145.196.143|:80... connected. +HTTP request sent, awaiting response... 302 Found +Location: http://r13---sn-5go7dn7s.googlevideo.com/videoplayback? [following] +--2014-03-31 05:45:49-- http://r13---sn-5go7dn7s.googlevideo.com/videoplayback? +Resolving r13---sn-5go7dn7s.googlevideo.com (r13---sn-5go7dn7s.googlevideo.com)... 173.194.48.18, 2a00:1450:400f::12 +Connecting to r13---sn-5go7dn7s.googlevideo.com (r13---sn-5go7dn7s.googlevideo.com)|173.194.48.18|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 320557466 (306M) [video/webm] +Saving to: ‘/home/ion/nobackup/media/video/.git/annex/tmp/URL--quvi&chttp&c%%youtu.be%-CbFj9K9AQg’ + +100%[======================================>] 320,557,466 895KB/s in 6m 14s + +2014-03-31 05:52:04 (837 KB/s) - ‘/home/ion/nobackup/media/video/.git/annex/tmp/URL--quvi&chttp&c%%youtu.be%-CbFj9K9AQg’ saved [320557466/320557466] + +(Recording state in git...) +fatal: Unable to create '/home/ion/nobackup/media/video/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/ion/nobackup/media/video/.git\",\"--work-tree=/home/ion/nobackup/media/video\",\"-c\",\"core.bare=false\",\"add\",\"--\"] exited 123) +failed +git-annex: addurl: 1 failed + +% ls -l /home/ion/nobackup/media/video/.git/index.lock +ls: cannot access /home/ion/nobackup/media/video/.git/index.lock: No such file or directory +\"\"\"]] + +The only lines in daemon.log from that time: + +[[!format sh \"\"\" +[2014-03-31 05:52:04 EEST] Committer: Committing changes to git +[2014-03-31 05:52:04 EEST] Pusher: Syncing with heh.fi +Already up-to-date. +To heh.fi:/storage/ion/media/video + 3df241b..095d6c3 git-annex -> synced/git-annex + 10b3166..98074c1 annex/direct/master -> synced/master +Already up-to-date. +\"\"\"]] + +"""]] diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment new file mode 100644 index 000000000..ec3c974d9 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 2" + date="2014-04-02T20:17:19Z" + content=""" +These races look beniegn, as far as I can see it doesn't cause any data to be lost, or indeed anything to happen that wouldn't have happened if addurl had been run without the assistant running. + +The first race probably has addurl and the assistant both trying to move the file object into the annex at the same time. One wins and moves it; the other loses and sulks. + +The second race has addurl trying to `git add` the file, while the assistant has already noticed the file appeared, `git add`ed it, and committed the add. + +The only way to really avoid these races would be to add a lot of lock checking. Or just make `git annex addurl` and presumably also `git annex add` and maybe several other commands refuse to run when the assistant is running. +"""]] diff --git a/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn b/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn new file mode 100644 index 000000000..58003f624 --- /dev/null +++ b/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +My remote repository's annex was lost. In the webapp, I can now click to recreate it, that fails half-way. + +### What steps will reproduce the problem? +Create a remote repo, delete the annex directory. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140517-g0aed6d9 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: unknown +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. + +[[!format sh """ +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Repository not found: ssh://lhunath@satura.lyndir.com/~/annex/ +gcrypt: Setting up new repository +gcrypt: Remote ID is :id:ROTs3SImZEdvdO2yCMku +gcrypt: Encrypting to: -R 0EF21226F43EA6BC +gcrypt: Requesting manifest signature +Warning: remote port forwarding failed for listen port 2222 +Warning: remote port forwarding failed for listen port 37218 +fatal: '~/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Recreating_remote_repository__39__s_annex/comment_1_9fffb1329a4a06111cf2afd8552aea62._comment b/doc/bugs/Recreating_remote_repository__39__s_annex/comment_1_9fffb1329a4a06111cf2afd8552aea62._comment new file mode 100644 index 000000000..94404fca3 --- /dev/null +++ b/doc/bugs/Recreating_remote_repository__39__s_annex/comment_1_9fffb1329a4a06111cf2afd8552aea62._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 1" + date="2014-05-21T22:21:37Z" + content=""" +I'd delete the repo and recreate it but I can't do that either - deleting works from webapp but when recreating it says there is already a repo by that name. enableing that repo leads me to this situation again. +"""]] diff --git a/doc/bugs/Recreating_remote_repository__39__s_annex/comment_2_b7f5634e136294ea1a3d4ce6de58fc5d._comment b/doc/bugs/Recreating_remote_repository__39__s_annex/comment_2_b7f5634e136294ea1a3d4ce6de58fc5d._comment new file mode 100644 index 000000000..887fca94a --- /dev/null +++ b/doc/bugs/Recreating_remote_repository__39__s_annex/comment_2_b7f5634e136294ea1a3d4ce6de58fc5d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 2" + date="2014-05-23T14:27:01Z" + content=""" +What are you clicking on in the webapp? + +What kind of repository did the remote have before it got deleted? Was it a repository encrypted with git-remote-gcrypt? + +Show the contents of ~/annex/.git/config on your local system. +"""]] diff --git a/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn new file mode 100644 index 000000000..bcac962ee --- /dev/null +++ b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn @@ -0,0 +1,28 @@ +What steps will reproduce the problem? + +Create a new remote repository in the webapp. Get to the final phase of the setup where it asks you if you want to encrypt it, yet no other option is given to continue. + +What is the expected output? What do you see instead? + +At least two options: + +1. Use an encrypted rsync repository on the server (the existing one) +2. Use an unencrypted rsync repository on the server + +What version of git-annex are you using? On what operating system? + + $ ./git-annex version + git-annex version: 3.20130102 + + $ uname -a + Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux + + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 12.04.1 LTS + Release: 12.04 + Codename: precise + +[[!meta title="webapp does not allow disabling encryption on rsync special remotes"]] +[[!tag /design/assistant]] +[[!tag confirmed]] diff --git a/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment new file mode 100644 index 000000000..f54b4626b --- /dev/null +++ b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-03T18:02:21Z" + content=""" +Specifically, this affects only rsync special remotes. All the other ones have a check box that allows enabling encryption or not. I didn't get around to adding that for rsync due to some complications in the code. Of course, you can use `git annex initremote` at the command line to set up non-encrypted rsync remotes. +"""]] diff --git a/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn b/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn new file mode 100644 index 000000000..ccf6ef1ca --- /dev/null +++ b/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn @@ -0,0 +1,30 @@ +Setup: + +* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable +* clone existing repository and activate assistant +* repository has encrypted rsync remote originally setup with the name `metaarray` +* this remote was renamed to `ma` a long time ago, using the webapp +* had to perform this rename on each client + +Steps: + +* attempt to reactivate special remote using webapp repositories page, on reinstalled machine + +Expected: + +* special remote starts working +* renaming special remotes ought to survive clones + +Actual: + +* firstly, special remote activation page has blank hostname box and the hostname of the machine is in the username box +* form gives error "cannot change encryption type of existing remote" + +Workaround: + +* execute `git annex initremote metaarray` +* rename `metaarray` to `ma` again using the webapp + +Perhaps the renaming of the remote not surviving clones is unavoidable, but the webapp should be able to cope with the situation. Thanks. + +[[!tag /design/assistant]] diff --git a/doc/bugs/Repository_Information_Is_Lost.mdwn b/doc/bugs/Repository_Information_Is_Lost.mdwn new file mode 100644 index 000000000..7b11ac4cf --- /dev/null +++ b/doc/bugs/Repository_Information_Is_Lost.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +Clone of a repository does not contain the names of other repositories. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +Mac OS X + +git-annex version: 5.20140308-g06fb279 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Qu +vi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 + SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook extern +al + + +### Please provide any additional information below. + +Clones of my repositories lost all track of other repositories they only seem to know about them selfs attempting to remove other repositories (git annex dead name-of-an-existing-repo) fails, telling me that the repository with the name is not found. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Repository_Information_Is_Lost/comment_1_bae0ed4c0a6baf1675f8de1663042f43._comment b/doc/bugs/Repository_Information_Is_Lost/comment_1_bae0ed4c0a6baf1675f8de1663042f43._comment new file mode 100644 index 000000000..8534442b6 --- /dev/null +++ b/doc/bugs/Repository_Information_Is_Lost/comment_1_bae0ed4c0a6baf1675f8de1663042f43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-07T19:24:12Z" + content=""" +Have you run `git-annex repair` or used the assistant to repair this repository? This can result in data going missing until the repository is able to pull the data from one of its remotes. +"""]] diff --git a/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn new file mode 100644 index 000000000..3626f2024 --- /dev/null +++ b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +trying to add a remote host using its avahi local name : nas.local (for example). + +### What steps will reproduce the problem? + +add remote server, use nas.local > cannot resolve nas.local + +### What version of git-annex are you using? On what operating system? + +Version: 5.20140116-g2d9ec29 +Ubuntu + +### Please provide any additional information below. + +> [[closing|done]] --[[Joey]] diff --git a/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment new file mode 100644 index 000000000..17fae5a3b --- /dev/null +++ b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 1" + date="2014-01-19T22:43:10Z" + content=""" +AFAIK, this will work fine if your OS is able to resolve those addresses using its regular resolver. Works fine here. Is `libnss-mdns` installed? +"""]] diff --git a/doc/bugs/Resource_exhausted.mdwn b/doc/bugs/Resource_exhausted.mdwn new file mode 100644 index 000000000..3f125b08a --- /dev/null +++ b/doc/bugs/Resource_exhausted.mdwn @@ -0,0 +1,45 @@ +What steps will reproduce the problem? +My annex dir has 23459 files and uses 749MB disk space. +Just create a repository put this dir inside, and git-annex will crash. + +What is the expected output? What do you see instead? +I expect git-annex handles large number of files, and does not watch every single file of it. + +What version of git-annex are you using? On what operating system? +I'm using git-annex linux build, version 2013.04.17. + +Please provide any additional information below. + + [2013-04-17 23:52:35 CEST] Transferrer: Downloaded pappas_hu..di_44.jpg + git-annex: runInteractiveProcess: pipe: Too many open files + Committer crashed: lsof: createProcess: resource exhausted (Too many open files) + [2013-04-17 23:53:52 CEST] Committer: warning Committer crashed: lsof: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git: createProcess: resource exhausted (Too many open files) + DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files) + [2013-04-17 23:57:24 CEST] DaemonStatus: warning DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) + [2013-04-18 00:27:17 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git-annex: git: createProcess: resource exhausted (Too many open files) + git-annex: accept: resource exhausted (Too many open files) + +Instead of raising system's limit (which is a neverending story), can we make git-annex only watch a directory and not every file of it? + +Or could the user specify some directory which he knows it is rarely change, to not be watched only check it once a day? + +The best would be if git annex could automatically adapt itself. +Ie. it watches eg. 200 files, and if some of it does not change for three days, then it drops from the watching basket, and those who changed (noticed while sanity checked) it adds to the basket. + +I don't really want to raise the ulimit, because my ultimate goal is to have git-annex on multiple raspberry pi with external harddrive (one at my home, one at my mom's home, one at my friends home, etc, etc). And raspberry is fairly low on resource. + +I'm interested in your thoughts. + +Best, + Laszlo + +[[!tag /design/assistant]] +[[!meta title="assistant can try to add too many files at once in batch add mode"]] diff --git a/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment b/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment new file mode 100644 index 000000000..da2a15ba2 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 10" + date="2013-08-26T18:33:40Z" + content=""" +@Joey: it was a \"pretty large\" transfer, several hundred gigabytes in perhaps ~100000 files. The copying was going to a GPG-encrypted directory remote. +The error only happened once or twice so far. Point taken about find in /proc; I'll do that if it happens next time. + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment b/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment new file mode 100644 index 000000000..9cf8d04e0 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 11" + date="2013-12-16T17:20:34Z" + content=""" +I now understand the problem described in comment 6, where once it started failing, it would leak one file descriptor per failure. + +I think that failure mode was fixed by accident in the changes in [[!commit 2fd63f3cfac705f0a18f4bcbe0489ce8ea1800d7]]. + +This doesn't explain what would open so many files to get it into that failure mode, however. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment b/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment new file mode 100644 index 000000000..a2b82023d --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Having "too many open files" message show up" + date="2014-01-13T14:57:11Z" + content=""" +This is happening to me now about twice per day. I've got a repo that is completely synced already and I'm working on a project in IntelliJ. When I check git-annex I often see this message when it is doing a startup scan or consistency check. + +The message can be seen here: http://imgur.com/Xb4LA73 + +Are there logs somewhere that I can gather and supply to you to help track this down? I'm using the 2014-01-07 release of git-annex for Mac OS. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment b/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment new file mode 100644 index 000000000..5e8ca65f1 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Happened four times yesterday" + date="2014-01-14T14:33:02Z" + content=""" +Maybe you can e-mail me and we can discuss this? +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment b/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment new file mode 100644 index 000000000..9bd4b0779 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2013-04-18T06:20:13Z" + content=""" +Once resource exhausted git-annex has git [defunct] process too. + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment b/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment new file mode 100644 index 000000000..fb0f4c16b --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-23T19:44:04Z" + content=""" +I have tried repeatedly to reproduce this problem, and I cannot. + +git-annex does *not* keep every file open. It tends to have less than 10 open file descriptors at any one time. + +I thought perhaps `lsof` opened every file, but it does not seem to, either. + +So far, I have no indication that the problem had to do with git-annex at all. If some other program on the system opened a great many files, it could cause this to happen to git-annex. + +You pasted a debug log that shows that the problem persisted for several minutes. So you should make it happen again, and in that time period, investigate what program has so many files open. You can do this with lsof, or, if lsof won't run, by looking in /proc/$pid/fd/ + +Or, of course, give me enough information to reproduce the problem. \"I have 23459 files\" isn't much help.. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment b/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment new file mode 100644 index 000000000..07badd83a --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="I just reproduced this" + date="2013-07-26T23:37:26Z" + content=""" +On openSUSE 12.3 with this version (which I'm sure is horribly old): + + git-annex version: 4.20130314 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +I ran 'git annex get' on a large repository, and got this: + + [snipped] + git-annex: /home/adam/music/.git/annex/transfer/failed/download/9c930baf-6b25-4294-b1f9-a90ba9663fb7/SHA1-s7227476--49d203960b062ec00c0d1d7042c4b6aa6720b976: openFile: resource exhausted (Too many open files) + failed + git-annex: runInteractiveProcess: pipe: Too many open files + + git-annex: git: runInteractiveProcess: resource exhausted (Too many open files) + failed + git-annex: get: 1207 failed + +Then I ran it again and saw that after every file retrieved, git-annex leaks another lockfile. lsof shows an ever increasing number of files like this: + + [snipped] + git-annex 32498 adam 86rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 87rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 88rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 89rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 90rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 91rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 92rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 93r FIFO 0,8 0t0 28752703 pipe + git-annex 32498 adam 94r FIFO 0,8 0t0 28765910 pipe +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment b/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment new file mode 100644 index 000000000..eee206168 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-28T00:23:08Z" + content=""" +Hmm, Adam your version is older than the bug reporter's version. OTOH, while there were several FD leak fixes after your version, none of them were to Annex.LockPool, which is what's used for the ssh lock files. + +I can't reproduce it with `git annex get` and the current release.. can you? +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment b/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment new file mode 100644 index 000000000..19bcdb376 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment @@ -0,0 +1,64 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="I just reproduced this with the latest version" + date="2013-08-11T03:17:11Z" + content=""" +At some point during a large copy, there's an ever increasing number of pipes in /proc/git-annex-pid/fd +As soon as it hits the limit (1023 in my case), copies start failing + + etc + r-x------ 1 michael michael 64 Aug 10 20:14 851 -> pipe:[2250609] + l-wx------ 1 michael michael 64 Aug 10 20:14 852 -> pipe:[2251549] + lr-x------ 1 michael michael 64 Aug 10 20:14 853 -> pipe:[2251550] + l-wx------ 1 michael michael 64 Aug 10 20:14 854 -> pipe:[2250612] + lr-x------ 1 michael michael 64 Aug 10 20:14 855 -> pipe:[2250613] + l-wx------ 1 michael michael 64 Aug 10 20:14 856 -> pipe:[2246639] + lr-x------ 1 michael michael 64 Aug 10 20:14 857 -> pipe:[2246640] + l-wx------ 1 michael michael 64 Aug 10 20:14 858 -> pipe:[2246642] + lr-x------ 1 michael michael 64 Aug 10 20:14 859 -> pipe:[2246643] + l-wx------ 1 michael michael 64 Aug 10 20:13 86 -> pipe:[2241378] + l-wx------ 1 michael michael 64 Aug 10 20:14 860 -> pipe:[2246645] + lr-x------ 1 michael michael 64 Aug 10 20:14 861 -> pipe:[2246646] + l-wx------ 1 michael michael 64 Aug 10 20:14 862 -> pipe:[2246648] + lr-x------ 1 michael michael 64 Aug 10 20:14 863 -> pipe:[2246649] + l-wx------ 1 michael michael 64 Aug 10 20:14 864 -> pipe:[2246653] + lr-x------ 1 michael michael 64 Aug 10 20:14 865 -> pipe:[2246654] + lr-x------ 1 michael michael 64 Aug 10 20:14 866 -> pipe:[2249407] + l-wx------ 1 michael michael 64 Aug 10 20:14 867 -> pipe:[2251789] + l-wx------ 1 michael michael 64 Aug 10 20:14 868 -> pipe:[2250627] + lr-x------ 1 michael michael 64 Aug 10 20:14 869 -> pipe:[2250628] + lr-x------ 1 michael michael 64 Aug 10 20:13 87 -> pipe:[2241379] + l-wx------ 1 michael michael 64 Aug 10 20:14 870 -> pipe:[2251778] + lr-x------ 1 michael michael 64 Aug 10 20:14 871 -> pipe:[2251779] + l-wx------ 1 michael michael 64 Aug 10 20:14 872 -> pipe:[2251781] + lr-x------ 1 michael michael 64 Aug 10 20:14 873 -> pipe:[2251782] + l-wx------ 1 michael michael 64 Aug 10 20:14 874 -> pipe:[2250635] + lr-x------ 1 michael michael 64 Aug 10 20:14 875 -> pipe:[2250636] + l-wx------ 1 michael michael 64 Aug 10 20:14 876 -> pipe:[2251575] + lr-x------ 1 michael michael 64 Aug 10 20:14 877 -> pipe:[2251576] + l-wx------ 1 michael michael 64 Aug 10 20:14 878 -> pipe:[2251785] + lr-x------ 1 michael michael 64 Aug 10 20:14 879 -> pipe:[2251786] + l-wx------ 1 michael michael 64 Aug 10 20:13 88 -> pipe:[2247853] + l-wx------ 1 michael michael 64 Aug 10 20:14 880 -> pipe:[2249430] + lr-x------ 1 michael michael 64 Aug 10 20:14 881 -> pipe:[2249431] + l-wx------ 1 michael michael 64 Aug 10 20:14 882 -> pipe:[2251581] + lr-x------ 1 michael michael 64 Aug 10 20:14 883 -> pipe:[2251582] + l-wx------ 1 michael michael 64 Aug 10 20:14 884 -> pipe:[2250653] + lr-x------ 1 michael michael 64 Aug 10 20:14 885 -> pipe:[2250654] + lr-x------ 1 michael michael 64 Aug 10 20:14 886 -> pipe:[2251790] + l-wx------ 1 michael michael 64 Aug 10 20:14 887 -> pipe:[2250670] + l-wx------ 1 michael michael 64 Aug 10 20:14 888 -> pipe:[2250663] + lr-x------ 1 michael michael 64 Aug 10 20:14 889 -> pipe:[2250664] + lr-x------ 1 michael michael 64 Aug 10 20:13 89 -> pipe:[2247854] + l-wx------ 1 michael michael 64 Aug 10 20:14 890 -> pipe:[2250668] + lr-x------ 1 michael michael 64 Aug 10 20:14 891 -> pipe:[2250669] + lr-x------ 1 michael michael 64 Aug 10 20:14 892 -> pipe:[2250671] + l-wx------ 1 michael michael 64 Aug 10 20:14 894 -> pipe:[2251601] + lr-x------ 1 michael michael 64 Aug 10 20:14 895 -> pipe:[2251602] + lr-x------ 1 michael michael 64 Aug 10 20:13 9 -> pipe:[2241268] + lr-x------ 1 michael michael 64 Aug 10 20:13 90 -> pipe:[2242273] + l-wx------ 1 michael michael 64 Aug 10 20:13 91 -> pipe:[2245776] + etc + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment b/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment new file mode 100644 index 000000000..b95b6cfa2 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 6" + date="2013-08-11T03:20:37Z" + content=""" +with every + + git annex + copy blah/blah/blah (to testremote...) + git-annex: runInteractiveProcess: pipe: Too many open files + failed + +The number of open fd's by git-annex increases by 1. + +4.20130802 built with cabal on Ubuntu 13.04 + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment b/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment new file mode 100644 index 000000000..1b050aa33 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 7" + date="2013-08-11T03:21:45Z" + content=""" +...increases in the failing case, that is. This doesn't happen all the time. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment b/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment new file mode 100644 index 000000000..2135211cd --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 8" + date="2013-08-11T20:44:19Z" + content=""" +It also looks like the location log has got corrupted (files are actually present, but not recorded in the location log) somewhere along the lines as I was trying to get/drop to figure out what's going on. +Explicitly dropping files then getting files fixes the location log issue. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment b/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment new file mode 100644 index 000000000..0e06f5af9 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 9" + date="2013-08-24T19:10:21Z" + content=""" +@Michael how large a copy are you doing? And what kind of remote are you copying the files to? +It would be helpful if you could be more specific about something I could do to reproduce the problem. Without a test case, I am unlikely to fix the bug. With a test case, I'd be surprised if it took long to fix it. + +If you have a process running that is experiencing the problem, you can also narrow it down a *lot* by looking at what these leaking pipe file descriptors are pipes to. For example, if you have: + +lr-x------ 1 michael michael 64 Aug 10 20:14 895 -> pipe:[2251602] + +You can run `find /proc/ -ls 2251602` and find the process at other end of the pipe, and look its pid up in ps to see what command it is. +"""]] diff --git a/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn new file mode 100644 index 000000000..38eb9e28c --- /dev/null +++ b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +Somewhere on the forums you advised that in order to revert to an old +version of a file in a direct-mode annex, one should briefly switch to +indirect mode and check out an earlier revision. + +This won’t work though if the direct-mode repo is on a VFAT +file-system, which does not support indirect mode. + +If I didn’t overlook an alternative way, would it make sense to expose +this functionality in «git annex get $file»? Like «git annex get $file +--from $repo/$revision»? + +Specifying revisions to get from might also be convenient for +alternative use-cases, I suppose. + +Best regards, +T. + +### What version of git-annex are you using? On what operating system? + +git-annex 5.20140421 +Linux 3.14.3 + +> VFAT is a crippled file system. I am not going to reimplenent all of git +> to support it. The suggested method won't work; git-annex would need +> to add a git-annex revert, etc, etc, etc ad infinitum. [[wontfix|done]] --[[Joey]] diff --git a/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_1_7e512732f1d24300dd13bb093f28122d._comment b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_1_7e512732f1d24300dd13bb093f28122d._comment new file mode 100644 index 000000000..69c33813a --- /dev/null +++ b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_1_7e512732f1d24300dd13bb093f28122d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 1" + date="2014-05-13T20:43:38Z" + content=""" +Crosslink to related wishlist item. +http://git-annex.branchable.com/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/ +"""]] diff --git a/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_2_0ede40e0d68bfb9c6dbc1777f944ed06._comment b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_2_0ede40e0d68bfb9c6dbc1777f944ed06._comment new file mode 100644 index 000000000..066fefa0c --- /dev/null +++ b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_2_0ede40e0d68bfb9c6dbc1777f944ed06._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 2" + date="2014-05-17T14:16:12Z" + content=""" +One follow-up comment, because it occurred to me I might have phrased +the bug inadequately. By «revert» I didn’t mean a revert in the +git-sense, but merely «checking out» a file from a selected commit. + +But I think I can achieve this in direct mode on VFAT by doing «git +show upstream/branch~X:file > file», right? «git annex get file» then +gets the correct content, only that it will not place the content into +the indicated file until I do «git annex fsck». Maybe «git annex get» +could take this into account and have the content immediately stored +there. + +"""]] diff --git a/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_3_4ce1601f5dbd8fb769d3c5bb429c3bc5._comment b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_3_4ce1601f5dbd8fb769d3c5bb429c3bc5._comment new file mode 100644 index 000000000..6e5db42d0 --- /dev/null +++ b/doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/comment_3_4ce1601f5dbd8fb769d3c5bb429c3bc5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 3" + date="2014-05-17T14:21:30Z" + content=""" +Plus it seems that the file can’t be dropped normally afterwards. +"""]] diff --git a/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn new file mode 100644 index 000000000..e961bd521 --- /dev/null +++ b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn @@ -0,0 +1,138 @@ +### Please describe the problem. +The remote server, connected with rsync and with encryption enabled doesn't fill with files. + +### What steps will reproduce the problem? +* Add remote server via webapp +* Supply password when asked +* both buttons turn green ('ready to add remote server') +* Select encrypted rsync repository +* When done, files will be queued for transfer, and the queue empties quickly. Afterwards, no files have actually been transferred, but a green message appears and says something like 'synced with xxx'. +* Also, on the remote an empty directory (~/annex) is created. + +### What version of git-annex are you using? On what operating system? +local: kubuntu 12.10, git-annex 4.20130621-g36258de +remote: debian (linux 3.8.0-25), git-annex 4.20130621-g36258de +Both are installed from tarball and PATH is set at the top of .bashrc. + +### Please provide any additional information below. + +[[!format sh """ + +Here is what is put in the logs when the button is toggled from 'syncing disabled' to 'syncing enabled'. +daemon.log: + +[2013-07-03 13:43:07 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","true"] +[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:07 CEST] main: Syncing with mybox +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","git-annex"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..4cc51b410f5257f60e4ea187ab0c29783effcc88","--oneline","-n1"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..6728d4d49ef97365eea0e2d379951acee9a9ded8","--oneline","-n1"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"] +[2013-07-03 13:43:07 CEST] TransferScanner: starting scan of [Remote { name ="mybox" }] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","ls-files","--cached","-z","--"] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/uren.xls Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/eldo_ur.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/ A 65J-Conversion-Step 0-to-50MS 0-to-0.7mW 9b Charge-Sharing SAR ADC in 90nm Digital CMOS.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/.directory Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/2009SOVC_A_0.92mW_10-bit_50-MSs_SAR_ADC_in_0.13um_CMOS_Process.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 8-bit 500-KSs Low Power SAR ADC for Biomedical Applications.pdf Nothing : expensive scan found missing object +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "ea86501fb0db033a103ed2c0806a1bddc145224afc4eb5e17fceb70bf1f674da.png", keyBackendName = "SHA256E", keySize = Just 11004, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 9.2b 47fJ SAR with input range prediction DAC switching.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "23b9a2be728c8af402ededb3eef7e9238b38d54c0ca50a05cbdf4aeea8f03c76.db", keyBackendName = "SHA256E", keySize = Just 12800, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +: +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A Low-Power Static Dual Edge-Triggered Flip-Flop.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "f27ac57481c9eb0bf7bf1f6c99666aca5c8282137effa33791241b3d36b12de2.odt", keyBackendName = "SHA256E", keySize = Just 22041, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/An Energy-Efficient Charge Recycling Approach for a SAR Converter With Capacitive DAC.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "a261cb3835ed869c6ad2347d303ed10e94efa8a50cc9ff053d772c2158097244.pdf", keyBackendName = "SHA256E", keySize = Just 667666, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/Calibration Technique for SAR Analog-to-Digital Converters.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cb69f2f4ae313277acd163b9bba19392ce50d3c5205ba8bbd90bf9c453088176.doc", keyBackendName = "SHA256E", keySize = Just 34304, keyMtime = Nothing}} +[2013-07-03 13:43:08 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","false"] +[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"] +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cea054d80cb5ca572b7055c0132ec2d13125534566ed4a79ab2514c9a60d8ee4.pdf", keyBackendName = "SHA256E", keySize = Just 19802, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] + + + +# End of transcript or log. +"""]] + +> [[fixed|done]], corrected logic error that caused `authorized_keys` +> to incorrectly force the git-annex-shell command for rsync remotes. --[[Joey]] diff --git a/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment new file mode 100644 index 000000000..480a16243 --- /dev/null +++ b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-08T16:55:09Z" + content=""" +Finally got a chance to look into this. + +The ~/.ssh/authorized_keys file on the server has been set up wrong by the webapp. If you look at it, it'll contain a part like: command=\"GIT_ANNEX_SHELL_DIRECTORY=... ~/.ssh/git-annex-shell\" + +That can't be used for rsync. If you delete that command= part, your remote should start working. +"""]] diff --git a/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn b/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn new file mode 100644 index 000000000..9a67db0c6 --- /dev/null +++ b/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +As described in [[tips/Internet_Archive_via_S3]], there is a problem using S3 with buckets that have capital letters. The bug lies either in the hS3 library or in archive.org itself. + +### What steps will reproduce the problem? + +Try to add an [[special_remotes/S3]] remote with capital letters in the bucket name. + +### What version of git-annex are you using? On what operating system? + +[[!format txt """ +git-annex version: 4.20130921-g434dc22 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +anarcat@angela:video$ git annex initremote archive-moglenrepublica type=S3 host=s3.us.archive.org bucket=Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia +initremote archive-moglenrepublica (Internet Archive mode) git-annex: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details. +# End of transcript or log. +"""]] + +Just thought it would be better to have a separate thread for this bug. :) + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/S3_memory_leaks.mdwn b/doc/bugs/S3_memory_leaks.mdwn new file mode 100644 index 000000000..94bbdc398 --- /dev/null +++ b/doc/bugs/S3_memory_leaks.mdwn @@ -0,0 +1,15 @@ +S3 has memory leaks + +Sending a file to S3 causes a slow memory increase toward the file size. + +Copying the file back from S3 causes a slow memory increase toward the +file size. + +The author of hS3 is aware of the problem, and working on it. I think I +have identified the root cause of the buffering; it's done by hS3 so it can +resend the data if S3 sends it a 307 redirect. --[[Joey]] + +At least the send leak should be fixed by the patch in the s3-memory-leak +branch in git. That needs a patch to hS3, which I have sent to its author. +--[[Joey]] +[[!tag confirmed]] diff --git a/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment new file mode 100644 index 000000000..0523fd473 --- /dev/null +++ b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 1" + date="2013-10-18T08:36:45Z" + content=""" +Hi Joey, + +It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS). + +Would it be possible to include this fix in your standalone builds and Debian packages? + +Thanks! +"""]] diff --git a/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment new file mode 100644 index 000000000..d4648b9c4 --- /dev/null +++ b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 2" + date="2014-01-29T01:19:27Z" + content=""" +Any news about this? +"""]] diff --git a/doc/bugs/S3_upload_not_using_multipart.mdwn b/doc/bugs/S3_upload_not_using_multipart.mdwn new file mode 100644 index 000000000..5e5d97c6a --- /dev/null +++ b/doc/bugs/S3_upload_not_using_multipart.mdwn @@ -0,0 +1,54 @@ +What steps will reproduce the problem? + +> Try to copy/move a file greater than 5G to S3. + + git annex copy large_file.tgz --to cloud + +What is the expected output? What do you see instead? + +> Looks like git-annex may not be using the Multipart Upload API: http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html + +> Expected transfer to succeed, instead this error is output: + + copy large-file.tgz (gpg) (checking cloud...) (to cloud...) Reading passphrase from file descriptor 12 + + + Your proposed upload exceeds the maximum allowed size + failed + git-annex: copy: 1 failed + +What version of git-annex are you using? On what operating system? + +> OSX 10.8.2 + +Please provide any additional information below. + + annex [master●] % git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: indirect + trusted repositories: 0 + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + BE1D8EC7-C64B-47DE-AD4E-2A50437532B4 -- cloud + E84568BA-6A4B-4AA1-B622-605B9248EDB1 -- here (eric laptop) + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 169 gigabytes (+1 megabyte reserved) + temporary directory size: 218 megabytes (clean up with git-annex unused) + local annex keys: 24 + local annex size: 8 gigabytes + known annex keys: 25 + known annex size: 8 gigabytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256E: 49 + annex [master●] % git annex version + git-annex version: 3.20130114 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +[[!tag confirmed]] diff --git a/doc/bugs/S3_upload_not_using_multipart/comment_1_5bed9faafc43b535f7820749510aaa14._comment b/doc/bugs/S3_upload_not_using_multipart/comment_1_5bed9faafc43b535f7820749510aaa14._comment new file mode 100644 index 000000000..117055e3f --- /dev/null +++ b/doc/bugs/S3_upload_not_using_multipart/comment_1_5bed9faafc43b535f7820749510aaa14._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2014-05-13T15:09:42Z" + content=""" +JFTR, this is impacting DebConf's video storage as well. + +Richard +"""]] diff --git a/doc/bugs/S3_upload_not_using_multipart/comment_2_d82952cf324e769e45f4d90f200210f4._comment b/doc/bugs/S3_upload_not_using_multipart/comment_2_d82952cf324e769e45f4d90f200210f4._comment new file mode 100644 index 000000000..7ee3c1167 --- /dev/null +++ b/doc/bugs/S3_upload_not_using_multipart/comment_2_d82952cf324e769e45f4d90f200210f4._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="annexuser" + ip="64.71.7.82" + subject="comment 2" + date="2014-07-14T18:21:00Z" + content=""" +I'm having the same problem. Is there a fix for this yet? + + $ git annex version + git-annex version: 5.20140709-gc75193e + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 +"""]] diff --git a/doc/bugs/SanityCheckerStartup_crashed.mdwn b/doc/bugs/SanityCheckerStartup_crashed.mdwn new file mode 100644 index 000000000..65a9beb65 --- /dev/null +++ b/doc/bugs/SanityCheckerStartup_crashed.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +On startup, the webapp shows the following warning in a box to the upper right of the screen, with an offer to "Restart thread": + + SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory) + +Restarting it causes it to crash again immediately. The log shows the same: + + SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory) + [2014-06-02 23:31:13 CEST] SanityCheckerStartup: warning SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory) + +/home/anton/Halvhemligt/.git/annex/misctmp/ contains the following: + + lrwxrwxrwx 2 anton anton 199 15 maj 21.08 IMG_32978856.JPG -> ../.git/annex/objects/z3/K2/SHA256E-s728022--12de1f194042af3f8c4dbee15c317de0511bbb8b9e8a0463fffb07e7bbc58bb5.JPG/SHA256E-s728022--12de1f194042af3f8c4dbee15c317de0511bbb8b9e8a0463fffb07e7bbc58bb5.JPG + lrwxrwxrwx 2 anton anton 199 15 maj 21.09 IMG_32988856.JPG -> ../.git/annex/objects/vw/30/SHA256E-s688301--8bb6d636163b443705c9a333194116da3937d8272b70613ca6345eaf6bba1255.JPG/SHA256E-s688301--8bb6d636163b443705c9a333194116da3937d8272b70613ca6345eaf6bba1255.JPG + lrwxrwxrwx 2 anton anton 199 15 maj 21.17 IMG_33198856.JPG -> ../.git/annex/objects/p3/WG/SHA256E-s754900--224e6489370527156293912e11390af517ad4ef9374ee22c8324b5af5fac0dd7.JPG/SHA256E-s754900--224e6489370527156293912e11390af517ad4ef9374ee22c8324b5af5fac0dd7.JPG + +The symlinks are all broken. IMG_3297.JPG, IMG_3298.JPG and IMG_3319.JPG exist in the repository, but I do not recognize the appended numbers 8856. git log shows that these three files have not been modified since they were first added. + +### What steps will reproduce the problem? +No idea. I believe this repository was created in the webapp but most of the changes to it has been done in the CLI. + +### What version of git-annex are you using? On what operating system? +Precompiled 5.20140530 on Arch Linux x86_64 (git-annex-bin package from the AUR), but 5.20140518 had the same problem. + +### Please provide any additional information below. +The crash has not caused any real problem for me that I'm aware of. I'm just reporting it because the error message looks a little scary. + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/SanityCheckerStartup_crashed/comment_1_f30b69c11b487334ef02ce7bfcdeb36c._comment b/doc/bugs/SanityCheckerStartup_crashed/comment_1_f30b69c11b487334ef02ce7bfcdeb36c._comment new file mode 100644 index 000000000..52354d7dc --- /dev/null +++ b/doc/bugs/SanityCheckerStartup_crashed/comment_1_f30b69c11b487334ef02ce7bfcdeb36c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-04T18:07:11Z" + content=""" +This was already fixed in [[!commit 9c0f3ae7e13cc8ed43ac73fbab565e07c10d2c90]]. +"""]] diff --git a/doc/bugs/SanityCheckerStartup_crashed/comment_2_8b800bf7b54e487e82d0897c87967f22._comment b/doc/bugs/SanityCheckerStartup_crashed/comment_2_8b800bf7b54e487e82d0897c87967f22._comment new file mode 100644 index 000000000..fd08002d2 --- /dev/null +++ b/doc/bugs/SanityCheckerStartup_crashed/comment_2_8b800bf7b54e487e82d0897c87967f22._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eliasson" + nickname="eliasson" + subject="comment 2" + date="2014-06-05T17:15:32Z" + content=""" +Great. I will patiently await the next release. +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn new file mode 100644 index 000000000..a6c258332 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +Entering a jabber address which's server got a selfsigned certificate, the process just fails, without asking for acceptance for that certificate. This is quite a showstopper. +(for example: jabber.ccc.de) + + +### What steps will reproduce the problem? +Try with an account from e.g. jabber.ccc.de + + +### What version of git-annex are you using? On what operating system? +Arch Linux, aur/git-annex-standalone 4.20130709-1 + +### Please provide any additional information below. +There is no logoutput to add... I'm sorry. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!meta title="XMPP does not work with jabber.ccc.de"]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment new file mode 100644 index 000000000..a591b51e1 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T17:33:23Z" + content=""" +Hmm, actually the XMPP library it's using does not fail on an invalid or self-signed cert. This is something that SSL using libraries sadly often get wrong, and yeah, I see I contacted the library author a while ago, and a \"sessionIsSecure\" has been added to it, which can be used to check if the cert was valid. + +This leaves open the question of what's happening with you on the CCC server. Did you get an error message? + + +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment new file mode 100644 index 000000000..9caee8a73 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-16T17:42:42Z" + content=""" +Actually, sessionIsSecure only tells me if it's using SSL at all; still waiting on the XMPP library to add cert checking.. +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment new file mode 100644 index 000000000..62d723c7b --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~psycojoker" + nickname="psycojoker" + subject="comment 3" + date="2013-11-25T09:54:33Z" + content=""" +Just to confirm that I'm also affected. Maybe you should add the possibility in the error message next to \"is the password correct?\". +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_4_a1948b7cd6ea990c8f1be5e483c835fa._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_4_a1948b7cd6ea990c8f1be5e483c835fa._comment new file mode 100644 index 000000000..6eec4ae9a --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_4_a1948b7cd6ea990c8f1be5e483c835fa._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://xlogon.net/yminus" + nickname="http://xlogon.net/yminus" + subject="comment 4" + date="2014-05-08T21:12:49Z" + content=""" +When will this issue be fixed? Currently my Jabber account is on jabber.ccc.de. + +This is the error message: + + Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: host jabberd.jabber.ccc.de.:5222 failed: AuthenticationFailure (Element {elementName = Name {nameLocalName = \"failure\", nameNamespace = Just \"urn:ietf:params:xml:ns:xmpp-sasl\", namePrefix = Nothing}, elementAttributes = [], elementNodes = [NodeElement (Element {elementName = Name {nameLocalName = \"bad-protocol\", nameNamespace = Just \"urn:ietf:params:xml:ns:xmpp-sasl\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})]}); host jabberd.jabber.ccc.de.:80 failed: AuthenticationFailure (Element {elementName = Name {nameLocalName = \"failure\", nameNamespace = Just \"urn:ietf:params:xml:ns:xmpp-sasl\", namePrefix = Nothing}, elementAttributes = [], elementNodes = [NodeElement (Element {elementName = Name {nameLocalName = \"bad-protocol\", nameNamespace = Just \"urn:ietf:params:xml:ns:xmpp-sasl\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})]})) + +Can you advise me another trustworthy non-profit and free (free as in free beer\" as well as \"free as in free speech\") jabber server? +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_5_293b333134c97dc666a825cc7a8b2b62._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_5_293b333134c97dc666a825cc7a8b2b62._comment new file mode 100644 index 000000000..37c86cc80 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_5_293b333134c97dc666a825cc7a8b2b62._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.36" + subject="comment 5" + date="2014-05-24T20:03:46Z" + content=""" +AFAIKS, this is not a failure from a self-signed certificate. git-annex contacted the jabber server, accepted its certificate, and tried to log in. The jabber server rejected the login. + +This kind of problem has in the past turned out to involve incompatabilities in SASL authentication using some newish authentication schemes. Often it's been a bug in the XMPP server that's tickled by the haksell TLS library. See for example + +So, what XMPP server is used by CCC? +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx.mdwn b/doc/bugs/Share_with_friends_crash_in_osx.mdwn new file mode 100644 index 000000000..d7ed801e7 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx.mdwn @@ -0,0 +1,370 @@ +### Please describe the problem. +Logging into Jabber (specifically with a google account) crashes on the OSX build of git-annex with a Illegal Instruction 4 error. + +### What steps will reproduce the problem? +The only things I have done to trigger the below crash is start the webapp up, navigate to the jabber login, and login with my gmail account. + +### What version of git-annex are you using? On what operating system? +Version: 5.20140107-g281cde8 OSX + +### Please provide any additional information below. + +There isn't much on the command line to go from: + + Launching web browser on file:///Volumes/Data/Annex/.git/annex/webapp.html + Illegal instruction: 4 + +And the log file isn't any better. + +[[!format sh """ +[2014-01-13 20:40:43 EST] main: starting assistant version 5.20140107-g281cde8 +(scanning...) [2014-01-13 20:40:43 EST] Watcher: Performing startup scan +(started...) +"""]] + +Here is the crash report osx creates +[[!format sh """ + Process: git-annex [11316] + Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + Identifier: git-annex + Version: 0 + Code Type: X86-64 (Native) + Parent Process: bash [10866] + Responsible: Terminal [212] + User ID: 501 + + Date/Time: 2014-01-13 20:12:59.807 -0500 + OS Version: Mac OS X 10.9.1 (13B42) + Report Version: 11 + Anonymous UUID: 43148BA1-3CAA-4C73-2971-CAC673D60B2B + + + Crashed Thread: 5 + + Exception Type: EXC_BAD_INSTRUCTION (SIGILL) + Exception Codes: 0x0000000000000001, 0x0000000000000000 + + Thread 0:: Dispatch queue: com.apple.main-thread + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf334 0x100e4f000 + 46662452 + 6 git-annex 0x0000000103ac9cce 0x100e4f000 + 46640334 + 7 git-annex 0x0000000103ac9dd6 0x100e4f000 + 46640598 + 8 git-annex 0x0000000101701708 0x100e4f000 + 9119496 + 9 libdyld.dylib 0x00007fff9a5695fd start + 1 + + Thread 1: + 0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 + 1 git-annex 0x0000000103a6e78a 0x100e4f000 + 46266250 + 2 git-annex 0x0000000103a6e828 0x100e4f000 + 46266408 + + Thread 2: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 3: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 4: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 5 Crashed: + 0 E 0x00000001045b10f3 xmlAllocParserInputBuffer + 32 + 1 E 0x000000010459f451 xmlCreatePushParserCtxt + 65 + 2 git-annex 0x00000001022369ca 0x100e4f000 + 20871626 + 3 git-annex 0x000000010222c9fd 0x100e4f000 + 20830717 + + Thread 6:: Dispatch queue: com.apple.libdispatch-manager + 0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 + 1 libdispatch.dylib 0x00007fff92f5243d _dispatch_mgr_invoke + 239 + 2 libdispatch.dylib 0x00007fff92f52152 _dispatch_mgr_thread + 52 + + Thread 7: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 8: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 9: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 10: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 5 crashed with X86 Thread State (64-bit): + rax: 0x00007fc563c0f6a0 rbx: 0x00007fc563c0f6a0 rcx: 0x0000000000000001 rdx: 0x0000000000000000 + rdi: 0x0000000104a01400 rsi: 0x00000000ffffc7ff rbp: 0x0000000104f7ccb0 rsp: 0x0000000104f7cca0 + r8: 0x0000000000000003 r9: 0x00007fc563c00000 r10: 0x000000010467f9f8 r11: 0x000000010459f410 + r12: 0x0000000104f7cd20 r13: 0x0000000000000000 r14: 0x0000000000000000 r15: 0x0000000104b840c0 + rip: 0x00000001045b10f3 rfl: 0x0000000000010206 cr2: 0x00000001045b10d3 + + Logical CPU: 1 + Error Code: 0x00000000 + Trap Number: 6 + + + Binary Images: + 0x100e4f000 - 0x103c68fef +git-annex (0) <05D25108-337E-3F98-837F-33A4E68BA8A4> /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + 0x104582000 - 0x10466bff7 +E (0) <602E5717-D4D7-314D-A1E9-02AFBFBB7966> /Applications/git-annex.app/Contents/MacOs/bundle/E + 0x10469f000 - 0x1046b3fff +F (0) /Applications/git-annex.app/Contents/MacOs/bundle/F + 0x1046ba000 - 0x1046e7fff +G (0) <9FFF37C3-8153-345F-9B71-913B95B07511> /Applications/git-annex.app/Contents/MacOs/bundle/G + 0x1046ee000 - 0x1047a7fdf +H (0) <49EC1EB8-F352-303D-8E68-C95171D096CF> /Applications/git-annex.app/Contents/MacOs/bundle/H + 0x1047de000 - 0x1047efff7 +B (53) <42E0C8C6-CA38-3CA4-8619-D24ED5DD492E> /Applications/git-annex.app/Contents/MacOs/bundle/B + 0x1047f6000 - 0x1048e7ff9 +D (41) /Applications/git-annex.app/Contents/MacOs/bundle/D + 0x1048fe000 - 0x104918ff7 +O (0) <18FCF32F-BAB0-323A-BCAC-D4CE4272B754> /Applications/git-annex.app/Contents/MacOs/bundle/O + 0x10491f000 - 0x104930fff +P (0) /Applications/git-annex.app/Contents/MacOs/bundle/P + 0x10493f000 - 0x10494cff7 +Q (0) /Applications/git-annex.app/Contents/MacOs/bundle/Q + 0x104957000 - 0x104978fff +R (0) /Applications/git-annex.app/Contents/MacOs/bundle/R + 0x104985000 - 0x104991fff +S (0) <9082AF89-3370-3858-B015-CB919CB3EBB0> /Applications/git-annex.app/Contents/MacOs/bundle/S + 0x104998000 - 0x1049f1fcf +T (0) <3AADCBFB-48C4-320D-8CF1-1E8FDAC30276> /Applications/git-annex.app/Contents/MacOs/bundle/T + 0x7fff69dff000 - 0x7fff69e32817 dyld (239.3) /usr/lib/dyld + 0x7fff8d3b0000 - 0x7fff8d43cff7 com.apple.ink.framework (10.9 - 207) <8A50B893-AD03-3826-8555-A54FEAF08F47> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff8d44b000 - 0x7fff8d4a3ff7 com.apple.Symbolication (1.4 - 129) <16D42516-7B5E-357C-898A-FAA9EE7642B3> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff8d515000 - 0x7fff8d516fff libunc.dylib (28) <62682455-1862-36FE-8A04-7A6B91256438> /usr/lib/system/libunc.dylib + 0x7fff8d51c000 - 0x7fff8d522ff7 libsystem_platform.dylib (24.1.4) <331BA4A5-55CE-3B95-99EB-44E0C89D7FB8> /usr/lib/system/libsystem_platform.dylib + 0x7fff8d523000 - 0x7fff8d904ffe libLAPACK.dylib (1094.5) <7E7A9B8D-1638-3914-BAE0-663B69865986> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8d952000 - 0x7fff8d959fff com.apple.NetFS (6.0 - 4.0) <8E26C099-CE9D-3819-91A2-64EA929C6137> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff8d98a000 - 0x7fff8d9c8ff7 libGLImage.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff8da8d000 - 0x7fff8dd8cfff com.apple.Foundation (6.9 - 1056) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8dfac000 - 0x7fff8dfb0ff7 libheimdal-asn1.dylib (323.12) <063A01C2-E547-39D9-BB42-4CC8E64ADE70> /usr/lib/libheimdal-asn1.dylib + 0x7fff8dfb1000 - 0x7fff8dfb6fff libmacho.dylib (845) <1D2910DF-C036-3A82-A3FD-44FF73B5FF9B> /usr/lib/system/libmacho.dylib + 0x7fff8e022000 - 0x7fff8e024ff3 libsystem_configuration.dylib (596.12) /usr/lib/system/libsystem_configuration.dylib + 0x7fff8e35c000 - 0x7fff8e4afff7 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff8e4ee000 - 0x7fff8f062ff7 com.apple.AppKit (6.9 - 1265) <0E9FC8BF-DA3C-34C5-91CC-12BC922B5F01> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff8f063000 - 0x7fff8f067ff7 libcache.dylib (62) /usr/lib/system/libcache.dylib + 0x7fff8f068000 - 0x7fff8f0a1ff7 com.apple.QD (3.50 - 298) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8f0a2000 - 0x7fff8f0adfff libGL.dylib (9.0.83) <984A960A-C159-3AE5-8B40-E2B451F6C712> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8f0d7000 - 0x7fff8f0d8ff7 libDiagnosticMessagesClient.dylib (100) <4CDB0F7B-C0AF-3424-BC39-495696F0DB1E> /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8f120000 - 0x7fff8f121fff liblangid.dylib (117) <9546E641-F730-3AB0-B3CD-E0E2FDD173D9> /usr/lib/liblangid.dylib + 0x7fff8f122000 - 0x7fff8f169ff7 libcups.2.dylib (372) <348EED62-6C20-35D6-8EFB-E80943965100> /usr/lib/libcups.2.dylib + 0x7fff8f551000 - 0x7fff8f5e0fff com.apple.Metadata (10.7.0 - 800.12.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff8f843000 - 0x7fff8f850ff0 libbz2.1.0.dylib (29) <0B98AC35-B138-349C-8063-2B987A75D24C> /usr/lib/libbz2.1.0.dylib + 0x7fff8fa7e000 - 0x7fff8fa86ffc libGFXShared.dylib (9.0.83) <11A621C3-37A0-39CE-A69B-8739021BD79D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff8fab1000 - 0x7fff8fc5ef27 libobjc.A.dylib (551.1) /usr/lib/libobjc.A.dylib + 0x7fff8fc5f000 - 0x7fff8fc68fff com.apple.speech.synthesis.framework (4.6.2 - 4.6.2) <0AAE45F0-FC6E-36B6-A6A7-73E6950A74AC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff90002000 - 0x7fff9000ffff com.apple.Sharing (132.2 - 132.2) /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff90042000 - 0x7fff90071ff5 com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff90072000 - 0x7fff90072fff com.apple.CoreServices (59 - 59) <7A697B5E-F179-30DF-93F2-8B503CEEEFD5> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff90073000 - 0x7fff900c5fff libc++.1.dylib (120) <4F68DFC5-2077-39A8-A449-CAC5FDEE7BDE> /usr/lib/libc++.1.dylib + 0x7fff90646000 - 0x7fff90646fff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff90647000 - 0x7fff90710fff com.apple.LaunchServices (572.23 - 572.23) <8D955BDE-2C4C-3DD4-B4D7-2D916174FE1D> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff90711000 - 0x7fff90762ff3 com.apple.audio.CoreAudio (4.2.0 - 4.2.0) /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff90795000 - 0x7fff90858ff7 com.apple.backup.framework (1.5.1 - 1.5.1) /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff9085f000 - 0x7fff9117b05f com.apple.CoreGraphics (1.600.0 - 599.7) <7D0FD5A7-A061-39BA-8E00-723825D2C4DD> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff9117c000 - 0x7fff911bbfff libGLU.dylib (9.0.83) <8B457205-513B-3477-AE9C-3AD979D5FE11> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff91291000 - 0x7fff912acff7 libPng.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff912b0000 - 0x7fff912bbff7 com.apple.NetAuth (5.0 - 5.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff912bc000 - 0x7fff912e3ff7 libsystem_network.dylib (241.3) <8B1E1F1D-A5CC-3BAE-8B1E-ABC84337A364> /usr/lib/system/libsystem_network.dylib + 0x7fff912e4000 - 0x7fff912e4ffd libOpenScriptingUtil.dylib (157) <19F0E769-0989-3062-9AFB-8976E90E9759> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff91426000 - 0x7fff9144aff7 libJPEG.dylib (1038) <86F349A8-882D-3326-A0B0-63257F68B1A7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff916fe000 - 0x7fff91700fff libCVMSPluginSupport.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff91701000 - 0x7fff91701fff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff9172a000 - 0x7fff9172fff7 libunwind.dylib (35.3) <78DCC358-2FC1-302E-B395-0155B47CB547> /usr/lib/system/libunwind.dylib + 0x7fff91ff7000 - 0x7fff9201effb libsystem_info.dylib (449.1.3) <7D41A156-D285-3849-A2C3-C04ADE797D98> /usr/lib/system/libsystem_info.dylib + 0x7fff920c3000 - 0x7fff92130fff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff92131000 - 0x7fff92389ff1 com.apple.security (7.0 - 55471) <233831C5-C457-3AD5-AFE7-E3E2DE6929C9> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff92397000 - 0x7fff9266bfc7 com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff92f4f000 - 0x7fff92f69fff libdispatch.dylib (339.1.9) <46878A5B-4248-3057-962C-6D4A235EEF31> /usr/lib/system/libdispatch.dylib + 0x7fff92f6a000 - 0x7fff92f92ffb libxslt.1.dylib (13) /usr/lib/libxslt.1.dylib + 0x7fff93591000 - 0x7fff935d3ff7 libauto.dylib (185.5) /usr/lib/libauto.dylib + 0x7fff935d4000 - 0x7fff93604fff com.apple.IconServices (25 - 25.17) <4751127E-FBD5-3ED5-8510-08D4E4166EFE> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff937e6000 - 0x7fff93820ff3 com.apple.bom (12.0 - 192) <989690DB-B9CC-3DB5-89AE-B5D33EDC474E> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff9397e000 - 0x7fff93aecff7 libBLAS.dylib (1094.5) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff93b18000 - 0x7fff93b1bfff com.apple.TCC (1.0 - 1) <32A075D9-47FD-3E71-95BC-BFB0D583F41C> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff93b1c000 - 0x7fff93b20fff libpam.2.dylib (20) /usr/lib/libpam.2.dylib + 0x7fff93c44000 - 0x7fff94077ffb com.apple.vision.FaceCore (3.0.0 - 3.0.0) /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff94101000 - 0x7fff94174ffb com.apple.securityfoundation (6.0 - 55122) <119D1C53-B292-3378-AEE1-A3B1FB02F43F> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff94180000 - 0x7fff9418dff7 libxar.1.dylib (202) <5572AA71-E98D-3FE1-9402-BB4A84E0E71E> /usr/lib/libxar.1.dylib + 0x7fff941a2000 - 0x7fff941a4fff libRadiance.dylib (1038) <55F99274-5074-3C73-BAC5-AF234E71CF38> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff9420c000 - 0x7fff94259ff2 com.apple.print.framework.PrintCore (9.0 - 428) <8D8253E3-302F-3DB2-9C5C-572CB974E8B3> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff9425a000 - 0x7fff9425ffff com.apple.DiskArbitration (2.6 - 2.6) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff94260000 - 0x7fff94270fff libbsm.0.dylib (33) <2CAC00A2-1352-302A-88FA-C567D4D69179> /usr/lib/libbsm.0.dylib + 0x7fff942c5000 - 0x7fff942cfff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <2D27B498-BB9C-3D88-B05A-76908A8A26F3> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff942d0000 - 0x7fff942f5ff7 com.apple.CoreVideo (1.8 - 117.2) <4674339E-26D0-35FA-9958-422832B39B12> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff942f8000 - 0x7fff94346fff libcorecrypto.dylib (161.1) /usr/lib/system/libcorecrypto.dylib + 0x7fff94347000 - 0x7fff9434affc com.apple.IOSurface (91 - 91) <07CA8A59-1E32-3FB6-B506-18DAF58A8CE0> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9434b000 - 0x7fff94354ff3 libsystem_notify.dylib (121) <52571EC3-6894-37E4-946E-064B021ED44E> /usr/lib/system/libsystem_notify.dylib + 0x7fff943ae000 - 0x7fff943c0ff7 com.apple.MultitouchSupport.framework (245.13 - 245.13) /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff943c1000 - 0x7fff9455dff7 com.apple.QuartzCore (1.8 - 332.0) <994D1E0A-64B6-398C-B9A2-C362F02DE943> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff94953000 - 0x7fff94a42fff libFontParser.dylib (111.1) <835A8253-6AB9-3AAB-9CBF-171440DEC486> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff94a44000 - 0x7fff94a68fff libxpc.dylib (300.1.17) <4554927A-9467-365C-91F1-5A116989DD7F> /usr/lib/system/libxpc.dylib + 0x7fff94a69000 - 0x7fff94ab0fff libFontRegistry.dylib (127) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff94b00000 - 0x7fff94b53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff94b5e000 - 0x7fff94b6cfff com.apple.opengl (9.0.83 - 9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff94b8a000 - 0x7fff94b91ff7 liblaunch.dylib (842.1.4) /usr/lib/system/liblaunch.dylib + 0x7fff94b92000 - 0x7fff94b9dfff libkxld.dylib (2422.1.72) /usr/lib/system/libkxld.dylib + 0x7fff94ec9000 - 0x7fff94ec9ff7 libkeymgr.dylib (28) <3AA8D85D-CF00-3BD3-A5A0-E28E1A32A6D8> /usr/lib/system/libkeymgr.dylib + 0x7fff94eca000 - 0x7fff94f23fff libTIFF.dylib (1038) <5CBFE0C2-9DD8-340B-BA63-A94CE2E476F2> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff94f24000 - 0x7fff94f3fff7 libsystem_malloc.dylib (23.1.10) /usr/lib/system/libsystem_malloc.dylib + 0x7fff950ab000 - 0x7fff950dafd2 libsystem_m.dylib (3047.16) /usr/lib/system/libsystem_m.dylib + 0x7fff950db000 - 0x7fff950e3ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <98BBB3E4-6239-3EF1-90B2-84EA0D3B8D61> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff950e6000 - 0x7fff950e7ff7 libsystem_blocks.dylib (63) /usr/lib/system/libsystem_blocks.dylib + 0x7fff950ef000 - 0x7fff952d4ff7 com.apple.CoreFoundation (6.9 - 855.11) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff952d5000 - 0x7fff952ecfff com.apple.CFOpenDirectory (10.9 - 173.1.1) <3FB4D5FE-860B-3BDE-BAE2-3531D919EF10> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff953a1000 - 0x7fff953a5ff7 libGIF.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff958d8000 - 0x7fff958e2ff7 com.apple.CrashReporterSupport (10.9 - 538) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff958e3000 - 0x7fff95bb1ff4 com.apple.CoreImage (9.0.54) <74BB8685-69A9-3A45-8DED-EA26BD39D710> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff95e9a000 - 0x7fff95e9bfff com.apple.TrustEvaluationAgent (2.0 - 25) <334A82F4-4AE4-3719-A511-86D0B0723E2B> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff95e9c000 - 0x7fff95f4cff7 libvMisc.dylib (423.32) <049C0735-1808-39B9-943F-76CB8021744F> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff95fa5000 - 0x7fff95faefff com.apple.CommonAuth (4.0 - 2.0) <1D263127-5F27-3128-996D-7397660D0C6E> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x7fff95fd9000 - 0x7fff96283ffd com.apple.HIToolbox (2.1 - 696) <1CFFF37B-C392-3088-B0A4-C08C55B2AF8F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff962bc000 - 0x7fff962fdfff com.apple.PerformanceAnalysis (1.47 - 47) <784ED7B8-FAE4-36CE-8C76-B7D300316C9F> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff96478000 - 0x7fff96482fff libcommonCrypto.dylib (60049) <8C4F0CA0-389C-3EDC-B155-E62DD2187E1D> /usr/lib/system/libcommonCrypto.dylib + 0x7fff96483000 - 0x7fff9648afff libcompiler_rt.dylib (35) <4CD916B2-1B17-362A-B403-EF24A1DAC141> /usr/lib/system/libcompiler_rt.dylib + 0x7fff965c3000 - 0x7fff965c4ff7 libsystem_sandbox.dylib (278.10) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff9752f000 - 0x7fff97777fff com.apple.CoreData (107 - 481) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff97849000 - 0x7fff97930ff7 libxml2.2.dylib (26) /usr/lib/libxml2.2.dylib + 0x7fff97958000 - 0x7fff97974ff7 libsystem_kernel.dylib (2422.1.72) /usr/lib/system/libsystem_kernel.dylib + 0x7fff97a67000 - 0x7fff97ae7fff com.apple.CoreSymbolication (3.0 - 141) /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff97ae8000 - 0x7fff97bedfff com.apple.ImageIO.framework (3.3.0 - 1038) <2C058216-C6D8-3380-A7EA-92A3F04520C1> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff97ca5000 - 0x7fff97d2eff7 libsystem_c.dylib (997.1.1) <61833FAA-7281-3FF9-937F-686B6F20427C> /usr/lib/system/libsystem_c.dylib + 0x7fff97d45000 - 0x7fff97d5eff7 com.apple.Ubiquity (1.3 - 289) /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff97d64000 - 0x7fff97e94ff7 com.apple.desktopservices (1.8 - 1.8) <09DC9BB8-432F-3C7A-BB08-956A2DDFC2DE> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff97f05000 - 0x7fff98075ff6 com.apple.CFNetwork (673.0.3 - 673.0.3) <42CFC3DB-35C8-3652-AF37-4BCC73D8BDEF> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff98076000 - 0x7fff980e0ff7 com.apple.framework.IOKit (2.0.1 - 907.1.13) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff9877f000 - 0x7fff987e2ff7 com.apple.SystemConfiguration (1.13 - 1.13) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff988e8000 - 0x7fff9894cff9 com.apple.Heimdal (4.0 - 2.0) /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff9894d000 - 0x7fff98a18fff libvDSP.dylib (423.32) <3BF732BE-DDE0-38EB-8C54-E4E3C64F77A7> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff98ba3000 - 0x7fff98babfff libsystem_dnssd.dylib (522.1.11) <270DCF6C-502D-389A-AA9F-DE4624A36FF7> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff98bac000 - 0x7fff98baffff libCoreVMClient.dylib (58.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff98bb0000 - 0x7fff98c72ff1 com.apple.CoreText (352.0 - 367.15) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff98c73000 - 0x7fff98c7fff7 com.apple.OpenDirectory (10.9 - 173.1.1) <6B78BD7B-5622-38E6-8FC6-86A117E3ACCA> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff98c80000 - 0x7fff98caffff com.apple.DebugSymbols (106 - 106) /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff98cb0000 - 0x7fff98d9efff libJP2.dylib (1038) <6C8179F5-8063-3ED6-A7C2-D5603DECDF28> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff98e1f000 - 0x7fff98f03fff com.apple.coreui (2.1 - 231) <432DB40C-6B7E-39C8-9FB5-B95917930056> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff98f6f000 - 0x7fff98f73fff libsystem_stats.dylib (93.1.26) /usr/lib/system/libsystem_stats.dylib + 0x7fff98f74000 - 0x7fff98ffdfff com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff99029000 - 0x7fff9908dff3 com.apple.datadetectorscore (5.0 - 354.0) <9ACF24B8-3268-3134-A5BC-D72C9371A195> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff993e4000 - 0x7fff993ebff3 libcopyfile.dylib (103) <5A881779-D0D6-3029-B371-E3021C2DDA5E> /usr/lib/system/libcopyfile.dylib + 0x7fff994a3000 - 0x7fff99512ff1 com.apple.ApplicationServices.ATS (360 - 363.1) <88976B22-A9B8-3E7B-9AE6-0B8E09A968FC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff99513000 - 0x7fff9952ffff libresolv.9.dylib (54) <11C2C826-F1C6-39C6-B4E8-6E0C41D4FA95> /usr/lib/libresolv.9.dylib + 0x7fff99530000 - 0x7fff9953fff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) <8FE131B6-1180-3892-98F5-C9C9B79072D4> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff99656000 - 0x7fff9966fff7 com.apple.Kerberos (3.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff99673000 - 0x7fff99674ffb libremovefile.dylib (33) <3543F917-928E-3DB2-A2F4-7AB73B4970EF> /usr/lib/system/libremovefile.dylib + 0x7fff99675000 - 0x7fff99676ff7 libSystem.B.dylib (1197.1.1) /usr/lib/libSystem.B.dylib + 0x7fff99c76000 - 0x7fff99c87ff7 libsystem_asl.dylib (217.1.4) <655FB343-52CF-3E2F-B14D-BEBF5AAEF94D> /usr/lib/system/libsystem_asl.dylib + 0x7fff99c88000 - 0x7fff99f72fff com.apple.CoreServices.CarbonCore (1077.14 - 1077.14) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff99f73000 - 0x7fff99feafff com.apple.CoreServices.OSServices (600.4 - 600.4) <36B2B009-C35E-3F21-824E-E0D00E7808C7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff99feb000 - 0x7fff9a014ff7 libc++abi.dylib (48) <8C16158F-CBF8-3BD7-BEF4-022704B2A326> /usr/lib/libc++abi.dylib + 0x7fff9a076000 - 0x7fff9a0aeff7 com.apple.RemoteViewServices (2.0 - 94) <3F34D630-3DDB-3411-BC28-A56A9B55EBDA> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff9a0ca000 - 0x7fff9a0d1ff7 libsystem_pthread.dylib (53.1.4) /usr/lib/system/libsystem_pthread.dylib + 0x7fff9a0d2000 - 0x7fff9a0d2fff com.apple.Accelerate (1.9 - Accelerate 1.9) <509BB27A-AE62-366D-86D8-0B06D217CF56> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff9a0d3000 - 0x7fff9a1bdfff libsqlite3.dylib (158) <00269BF9-43BE-39E0-9C85-24585B9923C8> /usr/lib/libsqlite3.dylib + 0x7fff9a248000 - 0x7fff9a2a3ffb com.apple.AE (665.5 - 665.5) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff9a517000 - 0x7fff9a565fff com.apple.opencl (2.3.57 - 2.3.57) /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff9a566000 - 0x7fff9a569ff7 libdyld.dylib (239.3) <62F4D752-4089-31A8-8B73-B95A68893B3C> /usr/lib/system/libdyld.dylib + 0x7fff9a571000 - 0x7fff9a729ff3 libicucore.A.dylib (511.27) <003B6C21-CBD1-3486-9A1D-030ADF5FA061> /usr/lib/libicucore.A.dylib + 0x7fff9a72a000 - 0x7fff9a753fff com.apple.DictionaryServices (1.2 - 208) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff9a75a000 - 0x7fff9a766ff3 com.apple.AppleFSCompression (56 - 1.0) <5652B0D0-EB08-381F-B23A-6DCF96991FB5> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff9a8f5000 - 0x7fff9a90dff7 com.apple.GenerationalStorage (2.0 - 160.2) <79629AC7-896F-3302-8AC1-4939020F08C3> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff9a939000 - 0x7fff9a954ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff9ab57000 - 0x7fff9ab59ff7 libquarantine.dylib (71) <7A1A2BCB-C03D-3A25-BFA4-3E569B2D2C38> /usr/lib/system/libquarantine.dylib + 0x7fff9ab5a000 - 0x7fff9ab5affd com.apple.audio.units.AudioUnit (1.9 - 1.9) <6E89F3CB-CC41-3728-9F9A-FDFC151E8261> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff9ac14000 - 0x7fff9ac59ff6 com.apple.HIServices (1.22 - 466) <21807AF8-3BC7-32BB-AB96-7C35CB59D7F6> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff9ac5a000 - 0x7fff9ac5afff com.apple.ApplicationServices (48 - 48) <3E3F01A8-314D-378F-835E-9CC4F8820031> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff9adc0000 - 0x7fff9ade5ff7 com.apple.ChunkingLibrary (2.0 - 155.1) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + + External Modification Summary: + Calls made by other processes targeting this process: + task_for_pid: 1 + thread_create: 0 + thread_set_state: 0 + Calls made by this process: + task_for_pid: 0 + thread_create: 0 + thread_set_state: 0 + Calls made by all processes on this machine: + task_for_pid: 210855 + thread_create: 1 + thread_set_state: 0 + + VM Region Summary: + ReadOnly portion of Libraries: Total=206.9M resident=76.3M(37%) swapped_out_or_unallocated=130.6M(63%) + Writable regions: Total=51.2M written=15.3M(30%) resident=16.2M(32%) swapped_out=0K(0%) unallocated=35.0M(68%) + + REGION TYPE VIRTUAL + =========== ======= + Dispatch continuations 4096K + Kernel Alloc Once 4K + MALLOC 18.3M + MALLOC (admin) 32K + STACK GUARD 56.0M + Stack 12.6M + VM_ALLOCATE 12.3M + VM_ALLOCATE (reserved) 12K reserved VM address space (unallocated) + __DATA 22.9M + __IMAGE 528K + __LINKEDIT 71.2M + __TEXT 135.6M + __UNICODE 544K + shared memory 4K + =========== ======= + TOTAL 334.2M + TOTAL, minus reserved VM space 334.2M + +# End of transcript or log. +"""]] + +> Apparently this is [[fixed|done]] in the latest release. --[[Joey]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment new file mode 100644 index 000000000..ef7579c46 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 10" + date="2014-01-20T16:28:43Z" + content=""" +I have updated the autobuild again, now nettle is built with more optimisations disabled. I hope this fixes it because I'm running out of things to try. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment new file mode 100644 index 000000000..5b5b94a40 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Past the SHA issues" + date="2014-01-20T23:14:53Z" + content=""" +Now we still have an issue with nettle, but now it's part of urandom. I'm not sure what to suggest... + +[[!format sh \"\"\" +Thread 1 Crashed: +0 H 0x00000001075d9756 do_device_source_urandom + 108 +1 H 0x00000001075d9686 do_device_source + 46 +2 H 0x00000001075d92b9 wrap_nettle_rnd_init + 74 +3 H 0x000000010755d585 _gnutls_rnd_init + 32 +4 H 0x0000000107551dae gnutls_global_init + 262 +5 git-annex 0x00000001054a28c3 0x103c83000 + 25295043 +6 git-annex 0x000000010692ab28 0x103c83000 + 46824232 +\"\"\"]] +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment new file mode 100644 index 000000000..cd2047a93 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Seems to be working now" + date="2014-03-12T02:36:59Z" + content=""" +Just tried again off of the most recent osx release build and it appears to be working without crashing. Not sure what else you did but thanks! +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment new file mode 100644 index 000000000..3a02f2f8c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 13" + date="2014-03-12T17:01:12Z" + content=""" +Well that's good and unexpected news! + +I did make some changes on the OSX autobuilder recently. For one thing, I updated and rebuilt all the homebrew stuff, and remembered to pass --build-bottle when doing so. Which I think I had always done before.. Homebrew also removed some dependencies on gnutls in wget, and perhaps they also made other changes -- I'd not be surprised if a change to homebrew made --build-bottle start disabling some optimisations. + +In any case, I suppose I can close this bug now.. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment new file mode 100644 index 000000000..f8c36c1fd --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-14T20:54:52Z" + content=""" +This must be more stuff on the OSX build machine that is using processor-specific optimisations. Similar to previously fixed problems with wget etc being built with those optimisations. + +This time, it must be one of the several libraries git-annex links with, and only one that is used when using XMPP. So, one of libxml2, libidn, libgsasl, libgnutls. + +I have replaced all of those libraries with unoptimised ones built with `brew install --build-bottle`. This is available in the daily built app now. Since I cannot test it myself, please download that and let me know how it goes. + + +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment new file mode 100644 index 000000000..1131f74a1 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Different Crash on startup" + date="2014-01-14T22:40:26Z" + content=""" +dyld: Library not loaded: /usr/local/opt/libxml2/lib/libxml2.2.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + Reason: Incompatible library version: git-annex requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0 + +I think the problem at this point is I don't have brew installed though. I'll try to do that later tonight. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment new file mode 100644 index 000000000..d11cf6b77 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Partly fixed?" + date="2014-01-15T01:35:19Z" + content=""" +The new build fixed it for me on Mac OS 10.8.5 but not on 10.9.1 +Using the app, it won't start anything on 10.9.1 now. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment new file mode 100644 index 000000000..e76fecc3c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="comment 4" + date="2014-01-15T02:21:38Z" + content=""" +The problem on 10.9.1 appears to be related to the version of libxml2 thats being used. There is a console message on startup that shows this: + + dyld: Library not loaded: /usr/local/opt/libxml2/lib/libxml2.2.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + Reason: Incompatible library version: git-annex requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0 + + I have actually been unable to build the newest version of libxml2 which I guess will have a library version 12 on mavericks so far tonight via Brew. I keep getting errors like: + + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/sys/_types.h:132:9: error: unknown type name '__int32_t' + typedef __int32_t __darwin_suseconds_t; /* [???] microseconds */ + +So far the interwebs are failing me and I don't have a solution. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment new file mode 100644 index 000000000..f8cb706e5 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 5" + date="2014-01-15T17:28:56Z" + content=""" +It's not supposed to use the system version of libxml2 etc. I have updated the build with the problem that was causing it to do so fixed, please re-test. + +BTW, I am surprised that you report the Mavericks build works on 10.8.5 -- isn't that snow leopard? +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment new file mode 100644 index 000000000..f8d04af92 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment @@ -0,0 +1,356 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Still crashing " + date="2014-01-15T22:36:15Z" + content=""" +But it's a different crash now. Previously the thread that crashed was doing xml related things. Now the crash is doing what looks like hash related things. + +[[!format sh \"\"\" + +Process: git-annex [27419] +Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex +Identifier: git-annex +Version: 0 +Code Type: X86-64 (Native) +Parent Process: ??? [1] +Responsible: git-annex [27419] +User ID: 501 + +Date/Time: 2014-01-15 17:31:49.406 -0500 +OS Version: Mac OS X 10.9.1 (13B42) +Report Version: 11 +Anonymous UUID: 43148BA1-3CAA-4C73-2971-CAC673D60B2B + + +Crashed Thread: 1 + +Exception Type: EXC_BAD_INSTRUCTION (SIGILL) +Exception Codes: 0x0000000000000001, 0x0000000000000000 + +Thread 0:: Dispatch queue: com.apple.main-thread +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feedd4 0x107364000 + 46706132 +6 git-annex 0x0000000109fe976e 0x107364000 + 46684014 +7 git-annex 0x0000000109fe9876 0x107364000 + 46684278 +8 git-annex 0x0000000107c211e8 0x107364000 + 9163240 +9 libdyld.dylib 0x00007fff9a5695fd start + 1 + +Thread 1 Crashed: +0 V 0x000000010aeb2b9d nettle_sha256_init + 4 +1 V 0x000000010aeb9e60 nettle_yarrow256_init + 24 +2 H 0x000000010acb3293 wrap_nettle_rnd_init + 52 +3 H 0x000000010ac378cf _gnutls_rnd_init + 32 +4 H 0x000000010ac2bfba gnutls_global_init + 262 +5 git-annex 0x0000000108b80873 0x107364000 + 25282675 +6 git-annex 0x000000010a008c08 0x107364000 + 46812168 + +Thread 2: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 3: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 4: +0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 +1 git-annex 0x0000000109f8e23a 0x107364000 + 46309946 + +Thread 5: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 6:: Dispatch queue: com.apple.libdispatch-manager +0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 +1 libdispatch.dylib 0x00007fff92f5243d _dispatch_mgr_invoke + 239 +2 libdispatch.dylib 0x00007fff92f52152 _dispatch_mgr_thread + 52 + +Thread 7: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 8: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 9: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 10: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 1 crashed with X86 Thread State (64-bit): + rax: 0x0000000000000000 rbx: 0x000000010acd31d0 rcx: 0x0000000000000000 rdx: 0x000000010acd31d0 + rdi: 0x000000010acd2f20 rsi: 0x0000000000000002 rbp: 0x000000010b17cda0 rsp: 0x000000010b17cda0 + r8: 0x0000000000000003 r9: 0x00007fcdbbc00000 r10: 0x000000010aec7208 r11: 0x000000010aeb9e48 + r12: 0x000000010b073d50 r13: 0x000000010a554598 r14: 0x0000000000000002 r15: 0x000000010acd2f20 + rip: 0x000000010aeb2b9d rfl: 0x0000000000010206 cr2: 0x000000010aeb2b99 + +Logical CPU: 1 +Error Code: 0x00000000 +Trap Number: 6 + + +Binary Images: + 0x107364000 - 0x10a188fef +git-annex (0) <81FF250D-D672-3822-B1EB-7AE0378499F6> /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + 0x10aaa5000 - 0x10ab8fff7 +E (0) <6ABB8037-E5D8-31BE-AC66-66C1F9ACB39E> /Applications/git-annex.app/Contents/MacOS/bundle/E + 0x10abc1000 - 0x10abd5fff +F (0) <69078CE7-B622-3D03-A100-6438C3D523F9> /Applications/git-annex.app/Contents/MacOS/bundle/F + 0x10abdc000 - 0x10ac09fff +G (0) <4DF43DFC-832F-3C44-A990-BD3328CE6E2B> /Applications/git-annex.app/Contents/MacOS/bundle/G + 0x10ac10000 - 0x10acc9fe7 +H (0) <70CFD2E5-AE2E-3CA8-A398-B90FBBA66F02> /Applications/git-annex.app/Contents/MacOS/bundle/H + 0x10acf9000 - 0x10ad0aff7 +B (53) <42E0C8C6-CA38-3CA4-8619-D24ED5DD492E> /Applications/git-annex.app/Contents/MacOS/bundle/B + 0x10ad16000 - 0x10ae07ff9 +D (41) /Applications/git-annex.app/Contents/MacOS/bundle/D + 0x10ae18000 - 0x10ae32ff7 +P (0) <18FCF32F-BAB0-323A-BCAC-D4CE4272B754> /Applications/git-annex.app/Contents/MacOS/bundle/P + 0x10ae71000 - 0x10ae82fff +T (0) /Applications/git-annex.app/Contents/MacOS/bundle/T + 0x10ae8f000 - 0x10ae9cfff +U (0) <22B05EAF-3BFB-3CC8-AE46-35F548CD7194> /Applications/git-annex.app/Contents/MacOS/bundle/U + 0x10aea3000 - 0x10aec4fff +V (0) /Applications/git-annex.app/Contents/MacOS/bundle/V + 0x10aece000 - 0x10aedafff +W (0) /Applications/git-annex.app/Contents/MacOS/bundle/W + 0x10aee3000 - 0x10af44fff +X (0) /Applications/git-annex.app/Contents/MacOS/bundle/X + 0x7fff69636000 - 0x7fff69669817 dyld (239.3) /usr/lib/dyld + 0x7fff8d3b0000 - 0x7fff8d43cff7 com.apple.ink.framework (10.9 - 207) <8A50B893-AD03-3826-8555-A54FEAF08F47> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff8d44b000 - 0x7fff8d4a3ff7 com.apple.Symbolication (1.4 - 129) <16D42516-7B5E-357C-898A-FAA9EE7642B3> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff8d515000 - 0x7fff8d516fff libunc.dylib (28) <62682455-1862-36FE-8A04-7A6B91256438> /usr/lib/system/libunc.dylib + 0x7fff8d51c000 - 0x7fff8d522ff7 libsystem_platform.dylib (24.1.4) <331BA4A5-55CE-3B95-99EB-44E0C89D7FB8> /usr/lib/system/libsystem_platform.dylib + 0x7fff8d523000 - 0x7fff8d904ffe libLAPACK.dylib (1094.5) <7E7A9B8D-1638-3914-BAE0-663B69865986> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8d952000 - 0x7fff8d959fff com.apple.NetFS (6.0 - 4.0) <8E26C099-CE9D-3819-91A2-64EA929C6137> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff8d98a000 - 0x7fff8d9c8ff7 libGLImage.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff8da8d000 - 0x7fff8dd8cfff com.apple.Foundation (6.9 - 1056) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8dfac000 - 0x7fff8dfb0ff7 libheimdal-asn1.dylib (323.12) <063A01C2-E547-39D9-BB42-4CC8E64ADE70> /usr/lib/libheimdal-asn1.dylib + 0x7fff8dfb1000 - 0x7fff8dfb6fff libmacho.dylib (845) <1D2910DF-C036-3A82-A3FD-44FF73B5FF9B> /usr/lib/system/libmacho.dylib + 0x7fff8e022000 - 0x7fff8e024ff3 libsystem_configuration.dylib (596.12) /usr/lib/system/libsystem_configuration.dylib + 0x7fff8e35c000 - 0x7fff8e4afff7 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff8e4ee000 - 0x7fff8f062ff7 com.apple.AppKit (6.9 - 1265) <0E9FC8BF-DA3C-34C5-91CC-12BC922B5F01> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff8f063000 - 0x7fff8f067ff7 libcache.dylib (62) /usr/lib/system/libcache.dylib + 0x7fff8f068000 - 0x7fff8f0a1ff7 com.apple.QD (3.50 - 298) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8f0a2000 - 0x7fff8f0adfff libGL.dylib (9.0.83) <984A960A-C159-3AE5-8B40-E2B451F6C712> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8f0d7000 - 0x7fff8f0d8ff7 libDiagnosticMessagesClient.dylib (100) <4CDB0F7B-C0AF-3424-BC39-495696F0DB1E> /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8f120000 - 0x7fff8f121fff liblangid.dylib (117) <9546E641-F730-3AB0-B3CD-E0E2FDD173D9> /usr/lib/liblangid.dylib + 0x7fff8f122000 - 0x7fff8f169ff7 libcups.2.dylib (372) <348EED62-6C20-35D6-8EFB-E80943965100> /usr/lib/libcups.2.dylib + 0x7fff8f551000 - 0x7fff8f5e0fff com.apple.Metadata (10.7.0 - 800.12.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff8f843000 - 0x7fff8f850ff0 libbz2.1.0.dylib (29) <0B98AC35-B138-349C-8063-2B987A75D24C> /usr/lib/libbz2.1.0.dylib + 0x7fff8fa7e000 - 0x7fff8fa86ffc libGFXShared.dylib (9.0.83) <11A621C3-37A0-39CE-A69B-8739021BD79D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff8fab1000 - 0x7fff8fc5ef27 libobjc.A.dylib (551.1) /usr/lib/libobjc.A.dylib + 0x7fff8fc5f000 - 0x7fff8fc68fff com.apple.speech.synthesis.framework (4.6.2 - 4.6.2) <0AAE45F0-FC6E-36B6-A6A7-73E6950A74AC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff90002000 - 0x7fff9000ffff com.apple.Sharing (132.2 - 132.2) /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff90042000 - 0x7fff90071ff5 com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff90072000 - 0x7fff90072fff com.apple.CoreServices (59 - 59) <7A697B5E-F179-30DF-93F2-8B503CEEEFD5> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff90073000 - 0x7fff900c5fff libc++.1.dylib (120) <4F68DFC5-2077-39A8-A449-CAC5FDEE7BDE> /usr/lib/libc++.1.dylib + 0x7fff90646000 - 0x7fff90646fff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff90647000 - 0x7fff90710fff com.apple.LaunchServices (572.23 - 572.23) <8D955BDE-2C4C-3DD4-B4D7-2D916174FE1D> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff90711000 - 0x7fff90762ff3 com.apple.audio.CoreAudio (4.2.0 - 4.2.0) /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff90795000 - 0x7fff90858ff7 com.apple.backup.framework (1.5.1 - 1.5.1) /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff9085f000 - 0x7fff9117b05f com.apple.CoreGraphics (1.600.0 - 599.7) <7D0FD5A7-A061-39BA-8E00-723825D2C4DD> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff9117c000 - 0x7fff911bbfff libGLU.dylib (9.0.83) <8B457205-513B-3477-AE9C-3AD979D5FE11> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff91291000 - 0x7fff912acff7 libPng.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff912b0000 - 0x7fff912bbff7 com.apple.NetAuth (5.0 - 5.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff912bc000 - 0x7fff912e3ff7 libsystem_network.dylib (241.3) <8B1E1F1D-A5CC-3BAE-8B1E-ABC84337A364> /usr/lib/system/libsystem_network.dylib + 0x7fff912e4000 - 0x7fff912e4ffd libOpenScriptingUtil.dylib (157) <19F0E769-0989-3062-9AFB-8976E90E9759> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff91426000 - 0x7fff9144aff7 libJPEG.dylib (1038) <86F349A8-882D-3326-A0B0-63257F68B1A7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff916fe000 - 0x7fff91700fff libCVMSPluginSupport.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff91701000 - 0x7fff91701fff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff9172a000 - 0x7fff9172fff7 libunwind.dylib (35.3) <78DCC358-2FC1-302E-B395-0155B47CB547> /usr/lib/system/libunwind.dylib + 0x7fff91ff7000 - 0x7fff9201effb libsystem_info.dylib (449.1.3) <7D41A156-D285-3849-A2C3-C04ADE797D98> /usr/lib/system/libsystem_info.dylib + 0x7fff920c3000 - 0x7fff92130fff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff92131000 - 0x7fff92389ff1 com.apple.security (7.0 - 55471) <233831C5-C457-3AD5-AFE7-E3E2DE6929C9> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff92397000 - 0x7fff9266bfc7 com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff92f4f000 - 0x7fff92f69fff libdispatch.dylib (339.1.9) <46878A5B-4248-3057-962C-6D4A235EEF31> /usr/lib/system/libdispatch.dylib + 0x7fff92f6a000 - 0x7fff92f92ffb libxslt.1.dylib (13) /usr/lib/libxslt.1.dylib + 0x7fff93591000 - 0x7fff935d3ff7 libauto.dylib (185.5) /usr/lib/libauto.dylib + 0x7fff935d4000 - 0x7fff93604fff com.apple.IconServices (25 - 25.17) <4751127E-FBD5-3ED5-8510-08D4E4166EFE> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff937e6000 - 0x7fff93820ff3 com.apple.bom (12.0 - 192) <989690DB-B9CC-3DB5-89AE-B5D33EDC474E> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff9397e000 - 0x7fff93aecff7 libBLAS.dylib (1094.5) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff93b18000 - 0x7fff93b1bfff com.apple.TCC (1.0 - 1) <32A075D9-47FD-3E71-95BC-BFB0D583F41C> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff93b1c000 - 0x7fff93b20fff libpam.2.dylib (20) /usr/lib/libpam.2.dylib + 0x7fff93c44000 - 0x7fff94077ffb com.apple.vision.FaceCore (3.0.0 - 3.0.0) /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff94101000 - 0x7fff94174ffb com.apple.securityfoundation (6.0 - 55122) <119D1C53-B292-3378-AEE1-A3B1FB02F43F> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff94180000 - 0x7fff9418dff7 libxar.1.dylib (202) <5572AA71-E98D-3FE1-9402-BB4A84E0E71E> /usr/lib/libxar.1.dylib + 0x7fff941a2000 - 0x7fff941a4fff libRadiance.dylib (1038) <55F99274-5074-3C73-BAC5-AF234E71CF38> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff9420c000 - 0x7fff94259ff2 com.apple.print.framework.PrintCore (9.0 - 428) <8D8253E3-302F-3DB2-9C5C-572CB974E8B3> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff9425a000 - 0x7fff9425ffff com.apple.DiskArbitration (2.6 - 2.6) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff94260000 - 0x7fff94270fff libbsm.0.dylib (33) <2CAC00A2-1352-302A-88FA-C567D4D69179> /usr/lib/libbsm.0.dylib + 0x7fff942c5000 - 0x7fff942cfff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <2D27B498-BB9C-3D88-B05A-76908A8A26F3> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff942d0000 - 0x7fff942f5ff7 com.apple.CoreVideo (1.8 - 117.2) <4674339E-26D0-35FA-9958-422832B39B12> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff942f8000 - 0x7fff94346fff libcorecrypto.dylib (161.1) /usr/lib/system/libcorecrypto.dylib + 0x7fff94347000 - 0x7fff9434affc com.apple.IOSurface (91 - 91) <07CA8A59-1E32-3FB6-B506-18DAF58A8CE0> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9434b000 - 0x7fff94354ff3 libsystem_notify.dylib (121) <52571EC3-6894-37E4-946E-064B021ED44E> /usr/lib/system/libsystem_notify.dylib + 0x7fff943ae000 - 0x7fff943c0ff7 com.apple.MultitouchSupport.framework (245.13 - 245.13) /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff943c1000 - 0x7fff9455dff7 com.apple.QuartzCore (1.8 - 332.0) <994D1E0A-64B6-398C-B9A2-C362F02DE943> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff94953000 - 0x7fff94a42fff libFontParser.dylib (111.1) <835A8253-6AB9-3AAB-9CBF-171440DEC486> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff94a44000 - 0x7fff94a68fff libxpc.dylib (300.1.17) <4554927A-9467-365C-91F1-5A116989DD7F> /usr/lib/system/libxpc.dylib + 0x7fff94a69000 - 0x7fff94ab0fff libFontRegistry.dylib (127) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff94b00000 - 0x7fff94b53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff94b5e000 - 0x7fff94b6cfff com.apple.opengl (9.0.83 - 9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff94b8a000 - 0x7fff94b91ff7 liblaunch.dylib (842.1.4) /usr/lib/system/liblaunch.dylib + 0x7fff94b92000 - 0x7fff94b9dfff libkxld.dylib (2422.1.72) /usr/lib/system/libkxld.dylib + 0x7fff94ec9000 - 0x7fff94ec9ff7 libkeymgr.dylib (28) <3AA8D85D-CF00-3BD3-A5A0-E28E1A32A6D8> /usr/lib/system/libkeymgr.dylib + 0x7fff94eca000 - 0x7fff94f23fff libTIFF.dylib (1038) <5CBFE0C2-9DD8-340B-BA63-A94CE2E476F2> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff94f24000 - 0x7fff94f3fff7 libsystem_malloc.dylib (23.1.10) /usr/lib/system/libsystem_malloc.dylib + 0x7fff950ab000 - 0x7fff950dafd2 libsystem_m.dylib (3047.16) /usr/lib/system/libsystem_m.dylib + 0x7fff950db000 - 0x7fff950e3ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <98BBB3E4-6239-3EF1-90B2-84EA0D3B8D61> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff950e6000 - 0x7fff950e7ff7 libsystem_blocks.dylib (63) /usr/lib/system/libsystem_blocks.dylib + 0x7fff950ef000 - 0x7fff952d4ff7 com.apple.CoreFoundation (6.9 - 855.11) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff952d5000 - 0x7fff952ecfff com.apple.CFOpenDirectory (10.9 - 173.1.1) <3FB4D5FE-860B-3BDE-BAE2-3531D919EF10> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff953a1000 - 0x7fff953a5ff7 libGIF.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff958d8000 - 0x7fff958e2ff7 com.apple.CrashReporterSupport (10.9 - 538) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff958e3000 - 0x7fff95bb1ff4 com.apple.CoreImage (9.0.54) <74BB8685-69A9-3A45-8DED-EA26BD39D710> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff95e9a000 - 0x7fff95e9bfff com.apple.TrustEvaluationAgent (2.0 - 25) <334A82F4-4AE4-3719-A511-86D0B0723E2B> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff95e9c000 - 0x7fff95f4cff7 libvMisc.dylib (423.32) <049C0735-1808-39B9-943F-76CB8021744F> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff95fa5000 - 0x7fff95faefff com.apple.CommonAuth (4.0 - 2.0) <1D263127-5F27-3128-996D-7397660D0C6E> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x7fff95fd9000 - 0x7fff96283ffd com.apple.HIToolbox (2.1 - 696) <1CFFF37B-C392-3088-B0A4-C08C55B2AF8F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff962bc000 - 0x7fff962fdfff com.apple.PerformanceAnalysis (1.47 - 47) <784ED7B8-FAE4-36CE-8C76-B7D300316C9F> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff96478000 - 0x7fff96482fff libcommonCrypto.dylib (60049) <8C4F0CA0-389C-3EDC-B155-E62DD2187E1D> /usr/lib/system/libcommonCrypto.dylib + 0x7fff96483000 - 0x7fff9648afff libcompiler_rt.dylib (35) <4CD916B2-1B17-362A-B403-EF24A1DAC141> /usr/lib/system/libcompiler_rt.dylib + 0x7fff965c3000 - 0x7fff965c4ff7 libsystem_sandbox.dylib (278.10) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff9752f000 - 0x7fff97777fff com.apple.CoreData (107 - 481) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff97849000 - 0x7fff97930ff7 libxml2.2.dylib (26) /usr/lib/libxml2.2.dylib + 0x7fff97958000 - 0x7fff97974ff7 libsystem_kernel.dylib (2422.1.72) /usr/lib/system/libsystem_kernel.dylib + 0x7fff97a67000 - 0x7fff97ae7fff com.apple.CoreSymbolication (3.0 - 141) /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff97ae8000 - 0x7fff97bedfff com.apple.ImageIO.framework (3.3.0 - 1038) <2C058216-C6D8-3380-A7EA-92A3F04520C1> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff97ca5000 - 0x7fff97d2eff7 libsystem_c.dylib (997.1.1) <61833FAA-7281-3FF9-937F-686B6F20427C> /usr/lib/system/libsystem_c.dylib + 0x7fff97d45000 - 0x7fff97d5eff7 com.apple.Ubiquity (1.3 - 289) /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff97d64000 - 0x7fff97e94ff7 com.apple.desktopservices (1.8 - 1.8) <09DC9BB8-432F-3C7A-BB08-956A2DDFC2DE> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff97f05000 - 0x7fff98075ff6 com.apple.CFNetwork (673.0.3 - 673.0.3) <42CFC3DB-35C8-3652-AF37-4BCC73D8BDEF> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff98076000 - 0x7fff980e0ff7 com.apple.framework.IOKit (2.0.1 - 907.1.13) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff9877f000 - 0x7fff987e2ff7 com.apple.SystemConfiguration (1.13 - 1.13) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff988e8000 - 0x7fff9894cff9 com.apple.Heimdal (4.0 - 2.0) /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff9894d000 - 0x7fff98a18fff libvDSP.dylib (423.32) <3BF732BE-DDE0-38EB-8C54-E4E3C64F77A7> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff98ba3000 - 0x7fff98babfff libsystem_dnssd.dylib (522.1.11) <270DCF6C-502D-389A-AA9F-DE4624A36FF7> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff98bac000 - 0x7fff98baffff libCoreVMClient.dylib (58.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff98bb0000 - 0x7fff98c72ff1 com.apple.CoreText (352.0 - 367.15) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff98c73000 - 0x7fff98c7fff7 com.apple.OpenDirectory (10.9 - 173.1.1) <6B78BD7B-5622-38E6-8FC6-86A117E3ACCA> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff98c80000 - 0x7fff98caffff com.apple.DebugSymbols (106 - 106) /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff98cb0000 - 0x7fff98d9efff libJP2.dylib (1038) <6C8179F5-8063-3ED6-A7C2-D5603DECDF28> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff98e1f000 - 0x7fff98f03fff com.apple.coreui (2.1 - 231) <432DB40C-6B7E-39C8-9FB5-B95917930056> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff98f6f000 - 0x7fff98f73fff libsystem_stats.dylib (93.1.26) /usr/lib/system/libsystem_stats.dylib + 0x7fff98f74000 - 0x7fff98ffdfff com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff99029000 - 0x7fff9908dff3 com.apple.datadetectorscore (5.0 - 354.0) <9ACF24B8-3268-3134-A5BC-D72C9371A195> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff993e4000 - 0x7fff993ebff3 libcopyfile.dylib (103) <5A881779-D0D6-3029-B371-E3021C2DDA5E> /usr/lib/system/libcopyfile.dylib + 0x7fff994a3000 - 0x7fff99512ff1 com.apple.ApplicationServices.ATS (360 - 363.1) <88976B22-A9B8-3E7B-9AE6-0B8E09A968FC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff99513000 - 0x7fff9952ffff libresolv.9.dylib (54) <11C2C826-F1C6-39C6-B4E8-6E0C41D4FA95> /usr/lib/libresolv.9.dylib + 0x7fff99530000 - 0x7fff9953fff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) <8FE131B6-1180-3892-98F5-C9C9B79072D4> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff99656000 - 0x7fff9966fff7 com.apple.Kerberos (3.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff99673000 - 0x7fff99674ffb libremovefile.dylib (33) <3543F917-928E-3DB2-A2F4-7AB73B4970EF> /usr/lib/system/libremovefile.dylib + 0x7fff99675000 - 0x7fff99676ff7 libSystem.B.dylib (1197.1.1) /usr/lib/libSystem.B.dylib + 0x7fff99c76000 - 0x7fff99c87ff7 libsystem_asl.dylib (217.1.4) <655FB343-52CF-3E2F-B14D-BEBF5AAEF94D> /usr/lib/system/libsystem_asl.dylib + 0x7fff99c88000 - 0x7fff99f72fff com.apple.CoreServices.CarbonCore (1077.14 - 1077.14) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff99f73000 - 0x7fff99feafff com.apple.CoreServices.OSServices (600.4 - 600.4) <36B2B009-C35E-3F21-824E-E0D00E7808C7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff99feb000 - 0x7fff9a014ff7 libc++abi.dylib (48) <8C16158F-CBF8-3BD7-BEF4-022704B2A326> /usr/lib/libc++abi.dylib + 0x7fff9a076000 - 0x7fff9a0aeff7 com.apple.RemoteViewServices (2.0 - 94) <3F34D630-3DDB-3411-BC28-A56A9B55EBDA> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff9a0ca000 - 0x7fff9a0d1ff7 libsystem_pthread.dylib (53.1.4) /usr/lib/system/libsystem_pthread.dylib + 0x7fff9a0d2000 - 0x7fff9a0d2fff com.apple.Accelerate (1.9 - Accelerate 1.9) <509BB27A-AE62-366D-86D8-0B06D217CF56> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff9a0d3000 - 0x7fff9a1bdfff libsqlite3.dylib (158) <00269BF9-43BE-39E0-9C85-24585B9923C8> /usr/lib/libsqlite3.dylib + 0x7fff9a248000 - 0x7fff9a2a3ffb com.apple.AE (665.5 - 665.5) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff9a517000 - 0x7fff9a565fff com.apple.opencl (2.3.57 - 2.3.57) /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff9a566000 - 0x7fff9a569ff7 libdyld.dylib (239.3) <62F4D752-4089-31A8-8B73-B95A68893B3C> /usr/lib/system/libdyld.dylib + 0x7fff9a571000 - 0x7fff9a729ff3 libicucore.A.dylib (511.27) <003B6C21-CBD1-3486-9A1D-030ADF5FA061> /usr/lib/libicucore.A.dylib + 0x7fff9a72a000 - 0x7fff9a753fff com.apple.DictionaryServices (1.2 - 208) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff9a75a000 - 0x7fff9a766ff3 com.apple.AppleFSCompression (56 - 1.0) <5652B0D0-EB08-381F-B23A-6DCF96991FB5> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff9a8f5000 - 0x7fff9a90dff7 com.apple.GenerationalStorage (2.0 - 160.2) <79629AC7-896F-3302-8AC1-4939020F08C3> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff9a939000 - 0x7fff9a954ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff9ab57000 - 0x7fff9ab59ff7 libquarantine.dylib (71) <7A1A2BCB-C03D-3A25-BFA4-3E569B2D2C38> /usr/lib/system/libquarantine.dylib + 0x7fff9ab5a000 - 0x7fff9ab5affd com.apple.audio.units.AudioUnit (1.9 - 1.9) <6E89F3CB-CC41-3728-9F9A-FDFC151E8261> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff9ac14000 - 0x7fff9ac59ff6 com.apple.HIServices (1.22 - 466) <21807AF8-3BC7-32BB-AB96-7C35CB59D7F6> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff9ac5a000 - 0x7fff9ac5afff com.apple.ApplicationServices (48 - 48) <3E3F01A8-314D-378F-835E-9CC4F8820031> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff9adc0000 - 0x7fff9ade5ff7 com.apple.ChunkingLibrary (2.0 - 155.1) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + +External Modification Summary: + Calls made by other processes targeting this process: + task_for_pid: 19 + thread_create: 0 + thread_set_state: 0 + Calls made by this process: + task_for_pid: 0 + thread_create: 0 + thread_set_state: 0 + Calls made by all processes on this machine: + task_for_pid: 3885694 + thread_create: 1 + thread_set_state: 0 + +VM Region Summary: +ReadOnly portion of Libraries: Total=206.9M resident=102.5M(50%) swapped_out_or_unallocated=104.5M(50%) +Writable regions: Total=51.2M written=13.9M(27%) resident=16.1M(31%) swapped_out=0K(0%) unallocated=35.1M(69%) + +REGION TYPE VIRTUAL +=========== ======= +Dispatch continuations 4096K +Kernel Alloc Once 4K +MALLOC 18.3M +MALLOC (admin) 32K +STACK GUARD 56.0M +Stack 12.6M +VM_ALLOCATE 12.3M +VM_ALLOCATE (reserved) 12K reserved VM address space (unallocated) +__DATA 23.0M +__IMAGE 528K +__LINKEDIT 71.2M +__TEXT 135.7M +__UNICODE 544K +shared memory 4K +=========== ======= +TOTAL 334.3M +TOTAL, minus reserved VM space 334.3M + + + +\"\"\"]] +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment new file mode 100644 index 000000000..ff4e1947c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 7" + date="2014-01-16T03:32:08Z" + content=""" +The new crash is in gnutls. + +I have removed the gnutls stuff that I asked homebrew to build a portable version of, since it seemed to fail to do so. Perhaps this will get us there. Autobuild is updated. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment new file mode 100644 index 000000000..0ea4b4953 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Same" + date="2014-01-16T05:45:34Z" + content=""" +Same problem for me here, although I would not know how to make a nice log like David does. + +versioning of osx is like this: + +10.6 -> Snow Leopard +10.7 -> Lion +10.8 -> Mountain Lion +10.9 -> Mavericks + +Thanks for the efforts. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment new file mode 100644 index 000000000..edc8f2af2 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Still crashing (again)" + date="2014-01-16T23:33:15Z" + content=""" +Here is the relevant section of the new crash. Looks like the same crash as yesterdays to me. + +[[!format sh \"\"\" +Thread 4 Crashed: +0 S 0x000000010cea0b9d nettle_sha256_init + 4 +1 S 0x000000010cea7e60 nettle_yarrow256_init + 24 +2 H 0x000000010cccf2a3 wrap_nettle_rnd_init + 52 +3 H 0x000000010cc53585 _gnutls_rnd_init + 32 +4 H 0x000000010cc47dae gnutls_global_init + 262 +5 git-annex 0x000000010ab95873 0x10937a000 + 25278579 +6 git-annex 0x000000010c01dc08 0x10937a000 + 46808072 +\"\"\"]] +"""]] diff --git a/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn new file mode 100644 index 000000000..988f986e5 --- /dev/null +++ b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +If you have a flaky connection big uploads and downloads will fail. git-annex should try again few times. + +This is an example of failed download. + +[[!format sh """ +$ git annex get --not --in here +get File1.bin (from s3...) (gpg) +You need a passphrase to unlock the secret key for +user: "Gioele" +4096-bit RSA key, .... + +gpg: gpg-agent is not available in this session + + ErrorMisc ": hGetBuf: resource vanished (Connection reset by peer)" + + Unable to access these remotes: s3 + + Try making some of these repositories available: + 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3 + c2a0cfa0-8871-9721-9b81-5649281fabdc -- other +failed +get File2.bin (from s3...) + + Unable to access these remotes: s3 + + Try making some of these repositories available: + 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3 + c2a0cfa0-8871-9721-9b81-5649281fabdc -- other +failed +git-annex: get: 2 failed +"""]] + +This is especially annoying when the DNS is out of order for a few seconds every now and then. In such cases, git-annex will complain, skip very fast to the next file, and repeat this process until it runs out of files. In the end it will have uploaded or downloaded very few files. + +Please not that it may not possible to write a simple shell loop to try again as the are GPG passwords to be entered. + +Git-annex should try again to upload or download a file in case something goes wrong. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130709.1 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: unknown + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +Ubuntu 12.04.2 LTS diff --git a/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment new file mode 100644 index 000000000..620f5e82e --- /dev/null +++ b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T18:54:47Z" + content=""" +Trying again one time does not seem like it would help, given the example you show. Trying multiple times by default would, I think, be annoying in lots of use cases where one just wants to get whatever is available, and having it get stuck retrying to download a file from a remote that is offline would not be desired when it could move on and get another file from a remote that is online. + +I'm willing to consider some kind of option to control how much it retries on error. But I'm not 100% sold on it being better than a simple loop. At least in most cases, using a gpg agent and a loop would work. I suppose the case it would not work as well is if enough time has elapsed for the gpg agent to re-lock the key. + +One approach that might work well is to add a --retry-failures-at-end option. It turns out that all failed downloads are already logged (the assistant uses this to automatically retry them), and so it would be easy to add. And rather than retrying immediately after a failure, when transferring multiple files, this puts some space in between, in which the problem may correct itself. +"""]] diff --git a/doc/bugs/Small_archive_behaving_like_archive.mdwn b/doc/bugs/Small_archive_behaving_like_archive.mdwn new file mode 100644 index 000000000..384a75baf --- /dev/null +++ b/doc/bugs/Small_archive_behaving_like_archive.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +repos of group smallarchive have started trying to accumulate all files. + +I have an archive repo (rsync) and a smallarchive repo (glacier). The assistant is now trying to transfer everything up to glacier. This is new behavior as of this version of annex. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +Mac OSX 10.8.3 (Build 12D78) + + git-annex version: 4.20130501-ged2fc6f + + local repository version: 4 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment b/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment new file mode 100644 index 000000000..dd509cdde --- /dev/null +++ b/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-06T21:09:00Z" + content=""" +I have tested smallarchive and do not see any bug with its operation. Files not in an `archive` directory are not sent to the smallarchive repository. Files in `archive` directories are, unless they have already been sent to some other archive repository. + +There has, however, been a recent change that could have led you to see a change in behavior, though not one that is really a bug: +Now smallarchive repositories will accept any content if it's only located on repositories that are untrusted or dead. So for example if your main client repo is for some reason marked as untrusted, the glacier repo would assume it's going away, and accept content from it. + +If that's not the explanation, you will need to provide more details.. +"""]] diff --git a/doc/bugs/Stress_test.mdwn b/doc/bugs/Stress_test.mdwn new file mode 100644 index 000000000..3bc701bbd --- /dev/null +++ b/doc/bugs/Stress_test.mdwn @@ -0,0 +1,45 @@ +What steps will reproduce the problem? + +mkdir annex_stress; cd annex_stress, +then execute the following script: + + #! /bin/sh + + # creating a directory, in which we dump all the files. + mkdir probes; cd probes + + for i in `seq -w 1 25769`; do + mkdir probe$i + echo "This is an important file, which saved also in backup ('back') directory too.\n Content changes: $i" > probe$i/probe$i.txt + echo "This is just an identical content file. Saved in each subdir." > probe$i/defaults.txt + echo "This is a variable ($i) content file, which is not backed up in 'back' directory." > probe$i/probe-nb$i.txt + mkdir probe$i/back + cp probe$i/probe$i.txt probe$i/back/probe$i.txt + done + + +It creates about 25000 directory and 3 files in each, two of them are identical. + +What is the expected output? What do you see instead? + +I expect git annex could import the directory within 12 hours. +Yet, it just crashes the gui (starting webapp, uses the cpu 100% and it does not finish after 28hours.) + + +What version of git-annex are you using? On what operating system? + +version 2013.04.17 + +Please provide any additional information below. + +I do hope git-annex can be fixed to handle large number of files. +This stress test models well enough my own directory structure, +relatively high number of files relatively low disk space usage +(my own directory structure: 750MB, this test creates 605MB). + + +Best, + Laszlo + +[[!meta title="assistant Stress test"]] +[[!tag /design/assistant]] diff --git a/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment b/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment new file mode 100644 index 000000000..ec50b58c5 --- /dev/null +++ b/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-05-06T16:54:36Z" + content=""" +My estimate was indeed slightly optimistic. While I did not run the whole import, it did run slower for the later batches of files. As far as I can see, that slowdown is just because git gets slower as it has more files. So nothing I can do about it. git-annex is now scaling well itself, though. + +Re checksumming on startup: There was a bug that caused the assistant to re-checksum all direct mode files on startup. This bug was fixed in version 4.20130417. If you're using that version and still see it re-checksumming files, please file a new bug report about it, as this is not intended behavior. + +You seem to be saying that the assistant is failing to add some files, and then when stopped and restarted it finds and adds them. I don't quite know how that would happen. If you can provide a test case that I can use to reproduce that behavior, I will try to debug it. +"""]] diff --git a/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment b/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment new file mode 100644 index 000000000..05c409a51 --- /dev/null +++ b/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 11" + date="2013-05-11T05:36:48Z" + content=""" +rechecksuming: it seem like it is indeed fixed in the newest (2013.05.01) version downloaded from here: +http://downloads.kitenet.net/git-annex/linux/ + +I tried to add the big stress test dir as a secondary repository into git-annex (along with my real data dir), but +seems like some library is not matching on my system, so some curl is complaining: + + curl: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.12' not found (required by /home/user/Desktop/down/git-annex.linux//usr/lib/i386-linux-gnu/libldap_r-2.4.so.2) + +I'm on ubuntu 10.04. + +And the log file is starting to fill up, so maybe once a problem occur, it should only write into the log file once. + +I will redone this stress test next week, without combining with any repository. +Thank you very much for your response, I do appreciate you are bothering/dealing with my complains!:) + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment b/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment new file mode 100644 index 000000000..42750808b --- /dev/null +++ b/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T20:00:31Z" + content=""" +Is this related or unrelated to the bug you filed at [[Resource_exhausted]]? + +I tried this test, and noticed that it was taking the assistant rather a long time to get to the 10 thousand file threshhold where it makes a batch commit. A small change to a better data structure for its queue reduced that time from probably 10 minutes to 2.5. + +I was unable to reproduce any problem with the webapp. Please provide lots of details to back up \"it just crashes the GUI\". + +The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration. +So after it adds the first 8192 directories, it begins failing to watch any more, and printing a message about you needing to increase the inotify limits for each additional directory. I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. (It will also break file manager, dropbox, etc, which all use inotify in the same way.) + +The other main time sink is that git-annex needs to run `git hash-object` once per file to stage its symlink. That is a lot of processes to run, and perhaps it could be sped up by using `git fast-import`. +"""]] diff --git a/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment b/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment new file mode 100644 index 000000000..26ffe2d62 --- /dev/null +++ b/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 2" + date="2013-04-24T06:30:16Z" + content=""" +Hi, + +First of all thank you for your time looking into my bug. I try to research more from my side. + +The 'Resource exhausted' bugreport +(which lost its title, and could not click on it to add this testcase as a comment) +was tested on real data, my own working directory (a copy of it). +This bugreport is tested on the output of this small shell script. + +None of them succeeded to import, and I quickly assumed it is the exact same. + +So I will test again, raising the ulimit to 81920, and report. + + The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration + +I would be perfectly fine if I could configure git-annex to sync those directory only once a month or once a week +(ie. check for update once a week). So no need to watch it real time, those are my archived work files. + + I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. + +Well, it is not 25000 dir in a single a folder, but rather something like this: + + work_done/2009/workname/back9/back8/back7/back6/back5 + +Where each 'backX' contains a whole backup the work until it. +So the directory structure is a bit more deep, and no 25000 subdirectory in a single dir. +But the overall numbers are right. + +If I could somehow mark this **work_done** dir to not sync real time (or work_done/2008,work_done/2009,work_done/2010,work_done/2011,work_done/2012 subdir in them), +then my whole issue would vanish. + +I only want to use git-annex to have a backup of this directory. +In case of laptop theft, or misfunction I could have a backup. +I dont need live sync anywhere, I have directories which I know I will not touch for months. + +Best, + Laszlo + + + +"""]] diff --git a/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment b/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment new file mode 100644 index 000000000..8469f489f --- /dev/null +++ b/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 3" + date="2013-04-24T09:10:20Z" + content=""" + (It will also break file manager, dropbox, etc, which all use inotify in the same way.) + +I beg to differ: with dropbox I handle my scrapbook(1) folder, +which means 130 thousand files for over 2 years now without problem between three computers. + + ~/Dropbox/scrapbook$ ls -R -1 |wc -l + 130263 + +Don't get me wrong. I'm not complaining, I only give you a completely unrelated usecase, +which requires also high number of files handling. And in that case the 81 thousand ulimit would not help either. + +(1): https://addons.mozilla.org/hu/firefox/addon/scrapbook/ + +"""]] diff --git a/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment b/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment new file mode 100644 index 000000000..c7cdd4bfd --- /dev/null +++ b/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-24T15:05:33Z" + content=""" +You're confusing number of files (inotify doesn't care) with number of directories (inotify does care). + +Dropbox is on record about being limited in the number of directories it can watch without adjusting the inotify limit. + +"""]] diff --git a/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment b/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment new file mode 100644 index 000000000..820f04ba9 --- /dev/null +++ b/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-24T15:30:04Z" + content=""" +I found a bug in the webapp thanks to this stress test. When inotify goes over limit, it displays a message about how to fix it.. +But it displays that message over and over for each file. The result is a constantly updating very large web page. + +Unless you tell me differently, I'm going to assume that's what the GUI crash you referred to was, since it can make a web browser very slow. + +I've fixed this problem. Now when it goes over limit, the webapp will just display this: + +[[/assistant/inotify_max_limit_alert.png]] +"""]] diff --git a/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment b/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment new file mode 100644 index 000000000..26f14ef09 --- /dev/null +++ b/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-24T17:26:39Z" + content=""" +I put in a further change to reduce the number of alerts shown in the webapp when bulk adding files. This probably quadrupled the speed or more, even when the webapp was not running, as updating an alert every time a file was added was a lot of unnecessary work. + +After these changes, it adds the first 10 thousand files in 35 minutes, on my five year old netbook. It should scale linear +(aside from git's own scalability issues with a lot of files, which I don't think are very bad under 1 million files), +so adding all 100 thousand files should take 6 hours or so. + +I'm interested to see what results you get, compared with before.. +"""]] diff --git a/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment b/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment new file mode 100644 index 000000000..3d02a2718 --- /dev/null +++ b/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-24T21:02:55Z" + content=""" +A few more changes got the rate down to 21 minutes per 10 thousand files. Estimate 3.5 hours for all. +"""]] diff --git a/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment b/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment new file mode 100644 index 000000000..d12b7ebfe --- /dev/null +++ b/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment @@ -0,0 +1,57 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Definite improvement" + date="2013-05-03T06:27:12Z" + content=""" +Hi, + +I have just tried it out again with the latest (20130501) version. + +It is really nice to see you have been working on it, and it have improved tremendously! +The logging issue solved, and logrotates even, and it finished importing without crashing! + +Remaining polishing things: + +a) +The import time is not as good (as you write), it slowes itself down. +It is true the first 10000 files import in about an hour, but it finishes with everything +in 9 hours 20 minutes. +(on a normal laptop, the last 5000 file portion took more then 2 hours) + +b) +Every startup means rechecksuming everything, so it means the second start took also around 8-12 hours. +(I don't know exactly because it finished somewhere during the night, but it was longer then 8 hours) +I don't think rechecksuming is necessary at all, if the filename, size and date have not modified, +then why rechecksuming (sha) it? + + +c) +It is leaking. +At the second startup, it reported it successfully added: + Added 2375 files 5 files probe25366.txt + +I have not touched the directory. ls confirms leaking: + + After first start (importing): + annex_many/.git$ ls -lR |wc -l + 770199 + + After second startup: + annex_many/.git$ ls -lR |wc -l + 788351 + +d) Without ulimit raise, it does not work at all. +I think it could be solved by not watching each and every directory all the time. +Every users will likely have a working directory and some which he don't intend to touch/modify at all. +Some usecases: photo archiving, video archiving, finished work archiving, etc + +All the above results with the stress test script. +I would love to have a confirmation by a thirdparty. + +Overall I'm impressed with the work you have done. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment b/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment new file mode 100644 index 000000000..a82b98611 --- /dev/null +++ b/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment @@ -0,0 +1,52 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Maybe it is not leaking after all" + date="2013-05-03T18:37:48Z" + content=""" +I have been working the whole day zipping up (tar.gz) all the unused directories. +Now my real data dir looks like this: + + ./annex_real/work_done$ du -hs . + 1,1G . + Has 9088 files and 1608 directories in total: + ./annex_real/work_done$ ls -R1l |grep \\-r |wc -l + 9088 + ./annex_real/work_done$ ls -R1l |grep ^d |wc -l + 1608 + +When I first started git annex, it added 5492 files, then next time it added the missing 3596 files. Then it stopped adding files. +From the gui everything looked fine even at the first start (performed startup scan), even in the log files (daemon.log.x) was nothing suspicious. + + ./annex_real/work_done$ for i in ../.git/annex/daemon.log.*; do echo $i; cat $i |grep files; done + ../.git/annex/daemon.log.1 + ../.git/annex/daemon.log.2 + ../.git/annex/daemon.log.3 + ../.git/annex/daemon.log.4 + [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files + ../.git/annex/daemon.log.5 + [2013-05-03 19:15:22 CEST] Committer: Adding 5492 files + +As you can see, this case is not a stress test at all, +it is really the minimal test case, 1.1GB diskspace, 9088 files and a thousand dirs. +The real question is, why git-annex miss at the first startup 3492 files (ie. adding all the files). + +It would help tremendously, if it would display at startup how many files he found, +and when it adds, then how many left to be added. +Something like this: + + (scanning...) [2013-05-03 20:03:14 CEST] Watcher: Performing startup scan + (started...) + [2013-05-03 20:03:34 CEST] Committer: Found 9088 files + [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files of 9088 remaining files (9088 in total) + .... + [2013-05-03 20:05:04 CEST] Committer: Adding 1492 files of 5492 remaining files (9088 in total) + .... + [2013-05-03 20:06:02 CEST] Committer: Adding 4000 files of 4000 remaining files (9088 in total) + +So it is definietly a bug, and I stuck how to debug it further. Everything looks just fine. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn new file mode 100644 index 000000000..82141ce68 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +Symlinks get dereferenced. + +### What steps will reproduce the problem? +Include a symlink in the repo. Wait until another client syncs the repo. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131117-gbd514dc + +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +local repository version: unknown + +default repository version: 3 + +supported repository versions: 3 5 + +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. +I have a file `/Users/lhunath/annex/Library/Application Support/CrossOver/Bottles/Fallout 3/drive_c/users/crossover/My Documents` which is a symlink to `~/Documents` on the originating client. On the destination client, This turns into a directory, causing the whole content of `~/Documents` to get included in each bottle, which includes a bunch of VM images etc..... + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment new file mode 100644 index 000000000..01685d804 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="workaround?" + date="2013-12-05T14:17:57Z" + content=""" +Until this is fixed, how can I manually remove a file from git annex syncing? +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment new file mode 100644 index 000000000..40140c852 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-18T18:27:04Z" + content=""" +I don't quite understand how to reproduce this bug, and have tried a few things with symlinks and multiple syncing repositories without apparent difficulty. + +Can you pleaseexplain in more detail how I could reproduce the problem? +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment new file mode 100644 index 000000000..d01f64d27 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-18T19:31:04Z" + content=""" +I see that you're using OSX. I have replicated the bug there, and fixed it. (I think.) +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn new file mode 100644 index 000000000..590c86205 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn @@ -0,0 +1,134 @@ +### Please describe the problem. + +Since I last tested git-annex (version 4.20130516.1) my setup seems to no longer work in current versions (5.20131130) + +### What steps will reproduce the problem? + +[[!format sh """ +$ mkdir 1 2 +$ cd 1; git init; git-annex init; git annex direct; echo "file added to 1" > file_from_1; cd .. +Initialized empty Git repository in /home/pedrocr/testannexbug/1/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +ok +direct ok +$ cd 2; git init; git-annex init; git annex direct; echo "file added to 2" > file_from_2; cd .. +Initialized empty Git repository in /home/pedrocr/testannexbug/2/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +ok +direct ok +$ cd 1; git remote add 2 ssh://localhost/~pedrocr/Hacks/test-git-annex/2; git annex assistant; cd .. +$ cd 2; git remote add 1 ssh://localhost/~pedrocr/Hacks/test-git-annex/1; git annex assistant; cd .. +$ ls -la 1 +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 Dec 15 11:33 . +drwxrwxr-x 4 pedrocr pedrocr 4096 Dec 15 11:33 .. +-rw-rw-r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_1 +-rw-r--r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_2 +drwxrwxr-x 9 pedrocr pedrocr 4096 Dec 15 11:33 .git +$ ls -la 2 +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 Dec 15 11:33 . +drwxrwxr-x 4 pedrocr pedrocr 4096 Dec 15 11:33 .. +-rw-r--r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_1 +-rw-rw-r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_2 +drwxrwxr-x 9 pedrocr pedrocr 4096 Dec 15 11:33 .git +"""]] + +so far so good + +[[!format sh """ +$ date | tee 1/file_from_1 +Sun Dec 15 11:53:18 WET 2013 +$ date | tee 2/file_from_2 +Sun Dec 15 11:53:22 WET 2013 +$ cat 1/* +Sun Dec 15 11:53:18 WET 2013 +file added to 2 +$ cat 2/* +file added to 1 +Sun Dec 15 11:53:22 WET 2013 +$ +"""]] + +But then syncing doesn't work. There doesn't seem to be anything special in the logs + +[[!format sh """ +$ tail -n 20 1/.git/annex/daemon.log +(Recording state in git...) +add file_from_1 (checksum...) [2013-12-15 11:53:18 WET] Committer: Committing changes to git +[2013-12-15 11:53:18 WET] Pusher: Syncing with 2 + +file_from_1 + 29 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 104 bytes received 31 bytes 270.00 bytes/sec +total size is 29 speedup is 0.21 +[2013-12-15 11:53:18 WET] Transferrer: Uploaded file_from_1 +Already up-to-date. +To ssh://localhost/~pedrocr/Hacks/test-git-annex/2 + f025062..431ac37 git-annex -> synced/git-annex + d393bb3..fef60ca annex/direct/master -> synced/master +Already up-to-date. +[2013-12-15 11:53:21 WET] Pusher: Syncing with 2 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/2 + 431ac37..3cc7045 git-annex -> synced/git-annex + + +$ tail -n 20 2/.git/annex/daemon.log +(Recording state in git...) +add file_from_2 (checksum...) [2013-12-15 11:53:22 WET] Committer: Committing changes to git +[2013-12-15 11:53:22 WET] Pusher: Syncing with 1 + +file_from_2 + 29 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) +Already up-to-date. + +sent 104 bytes received 31 bytes 270.00 bytes/sec +total size is 29 speedup is 0.21 +[2013-12-15 11:53:22 WET] Transferrer: Uploaded file_from_2 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/1 + ebbcd4c..dae7a77 git-annex -> synced/git-annex + ffd5a90..67ad7c1 annex/direct/master -> synced/master +Already up-to-date. +[2013-12-15 11:53:25 WET] Pusher: Syncing with 1 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/1 + dae7a77..976c899 git-annex -> synced/git-annex +"""]] + + + +### What version of git-annex are you using? On what operating system? + +I'm running git-annex from the Ubuntu PPA on Ubuntu 12.04 LTS. + +[[!format sh """ +$ lsb_release -v +No LSB modules are available. +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.3 LTS +Release: 12.04 +Codename: precise +$ git annex version +git-annex version: 5.20131130 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] + +> [[!taglink moreinfo]] needed. --[[Joey]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment new file mode 100644 index 000000000..337bd12b0 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-16T20:48:12Z" + content=""" +Sounds to me like it could be a messed up direct mode mapping file due to bugs in version 4.20130516. But I am not sure I follow your transcript; you don't seem to show how things looked when it went wrong. If it was the mapping, `git annex fsck` would correct the problem. +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment new file mode 100644 index 000000000..db7c82fd3 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-12-16T23:00:48Z" + content=""" +What my transcript shows is that after the initial sync 1 doesn't get the changes from 2 and vice versa. This test is from scratch so it can't be something related to the old version. I'll try the fsck on my other machines to see if it fixes the issues there. +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment new file mode 100644 index 000000000..07d6eec3a --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 3" + date="2014-03-07T17:21:02Z" + content=""" +Any news on this? Does it happen with the current version? + +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn new file mode 100644 index 000000000..8dd74acc3 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn @@ -0,0 +1,1175 @@ +### Please describe the problem. + +On test fails when running "git annex test" on Windows. + +### What steps will reproduce the problem? + +Install Git-1.8.5.2-preview20131230 +Install git-annex-5.20131222 +Run "git annex test" in cmd + +### What version of git-annex are you using? On what operating system? + +git-annex-5.20131222 on Windows 7 Professional + +### Please provide any additional information below. + +The failed test is "test_mixed_conflict_resolution" with "conflictor directory missing". The problem can also be reproduced with the attached batch script. +(EDIT: I couldn't attach a file, so I pasted its contents below the log.) + +You can find the complete output of "git annex test" below. + +[[!format text """ +Tests + QuickCheck + prop_idempotent_deencode_git: OK + +++ OK, passed 100 tests. + prop_idempotent_deencode: OK + +++ OK, passed 100 tests. + prop_idempotent_fileKey: OK + +++ OK, passed 100 tests. + prop_idempotent_key_encode: OK + +++ OK, passed 100 tests. + prop_idempotent_key_decode: OK + +++ OK, passed 100 tests. + prop_idempotent_shellEscape: OK + +++ OK, passed 100 tests. + prop_idempotent_shellEscape_multiword: OK + +++ OK, passed 100 tests. + prop_logs_sane: OK + +++ OK, passed 100 tests. + prop_idempotent_configEscape: OK + +++ OK, passed 100 tests. + prop_parse_show_Config: OK + +++ OK, passed 100 tests. + prop_parentDir_basics: OK + +++ OK, passed 100 tests. + prop_relPathDirToFile_basics: OK + +++ OK, passed 100 tests. + prop_relPathDirToFile_regressionTest: OK + +++ OK, passed 100 tests. + prop_cost_sane: OK + +++ OK, passed 100 tests. + prop_matcher_sane: OK + +++ OK, passed 100 tests. + prop_HmacSha1WithCipher_sane: OK + +++ OK, passed 100 tests. + prop_TimeStamp_sane: OK + +++ OK, passed 100 tests. + prop_addLog_sane: OK + +++ OK, passed 100 tests. + prop_verifiable_sane: OK + +++ OK, passed 100 tests. + prop_segment_regressionTest: OK + +++ OK, passed 100 tests. + prop_read_write_transferinfo: OK + +++ OK, passed 100 tests. + prop_read_show_inodecache: OK + +++ OK, passed 100 tests. + prop_parse_show_log: OK + +++ OK, passed 100 tests. + prop_read_show_TrustLevel: OK + +++ OK, passed 100 tests. + prop_parse_show_TrustLog: OK + +++ OK, passed 100 tests. + prop_hashes_stable: OK + +++ OK, passed 100 tests. + prop_schedule_roundtrips: OK + +++ OK, passed 100 tests. + prop_duration_roundtrips: OK + +++ OK, passed 100 tests. + Unit Tests + init: init test repo + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. +ok +(Recording state in git...) +OK + add: add foo ok +(Recording state in git...) +add sha1foo ok +(Recording state in git...) +add apple ok +(Recording state in git...) +fatal: This operation must be run in a work tree +commit (Recording state in git...) +ok +(Recording state in git...) +OK + add sha1dup: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add sha1foodup cygwin warning: + MS-DOS style path detected: C:\Users\Tobias\testdir\t2\.t\tmprepo0\.git\annex\tmp\tmp5876 + Preferred POSIX equivalent is: /cygdrive/c/Users/Tobias/testdir/t2/.t/tmprepo0/.git/annex/tmp/tmp5876 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +ok +(Recording state in git...) +OK + add subdirs: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add dir/foo cygwin warning: + MS-DOS style path detected: C:\Users\Tobias\testdir\t2\.t\tmprepo1\.git\annex\tmp\tmp3396 + Preferred POSIX equivalent is: /cygdrive/c/Users/Tobias/testdir/t2/.t/tmprepo1/.git/annex/tmp/tmp3396 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +ok +(Recording state in git...) +OK + reinject: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + unannex (no copy): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + unannex (with copy): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +unannex foo ok +(Recording state in git...) +OK + drop (no remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Try making some of these repositories available: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- test repo + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +drop foo ok +(Recording state in git...) +OK + drop (with remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +OK + drop (untrusted remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +untrust origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Also these untrusted repositories may contain the file: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +OK + get: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +OK + move: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +move foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +move foo (to origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +OK + copy: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +copy foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +copy foo ok +move foo ok +(Recording state in git...) +OK + lock: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + edit (no pre-commit): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + edit (pre-commit): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + fix: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + trust: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +trust origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +trust origin ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +dead origin ok +(Recording state in git...) +dead origin ok +(Recording state in git...) +semitrust origin ok +(Recording state in git...) +semitrust origin ok +(Recording state in git...) +OK + fsck (basics): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +fsck foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +fsck sha1foo ok +fsck foo + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. +failed +fsck sha1foo + Only 1 of 2 trustworthy copies exist of sha1foo + Back it up with git-annex copy. +failed +git-annex: fsck: 2 failed +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +fsck foo ok +fsck sha1foo ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +fsck foo ok +fsck sha1foo ok +OK + fsck (bare): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +fsck SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77 ok +fsck WORM-s25-m1388499859--apple ok +fsck SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa ok +OK + fsck (local untrusted): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +untrust . ok +(Recording state in git...) +fsck foo + Only these untrusted locations may have copies of foo + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + 68deb80b-3a46-42f9-bb58-0f3b5a689d28 -- here (.t\tmprepo18) + Back it up to trusted locations with git-annex copy. +failed +fsck sha1foo + Only these untrusted locations may have copies of sha1foo + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + Back it up to trusted locations with git-annex copy. +failed +git-annex: fsck: 2 failed +trust . ok +(Recording state in git...) +fsck foo ok +OK + fsck (remote untrusted): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +untrust origin ok +(Recording state in git...) +fsck foo + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +fsck sha1foo + Only 1 of 2 trustworthy copies exist of sha1foo + Back it up with git-annex copy. + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +git-annex: fsck: 2 failed +OK + migrate: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + migrate (via gitattributes): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + unused: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + describe: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +describe . ok +(Recording state in git...) +describe origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +OK + find: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +foo +foo +sha1foo +sha1foo +add dir/subfile ok +(Recording state in git...) +dir/subfile +OK + merge: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +merge git-annex (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +OK + info: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +{"command":"info","repository mode":"direct","trusted repositories":[],"semitrusted repositories":[{"uuid":"00000000-0000-0000-0000-000000000001","description":"web","here":false},{"uuid":"3bbb68d2-9ef1-4126-bee5-f60569f8ad82","description":"origin (test repo)","here":false},{"uuid":"fe838913-724e-4fb1-a47f-4b3815b1aab5","description":".t\\tmprepo26","here":true}],"untrusted repositories":[],"available local disk space":"7.78 gigabytes (+1 megabyte reserved)","local annex keys":0,"local annex size":"0 bytes","annexed files in working tree":2,"size of annexed files in working tree":"45 bytes","bloom filter size":"16 mebibytes (0% full)","success":true} +OK + version: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +git-annex version: 5.20131230-g192d991 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 2 3 4 +OK + sync: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +(merging origin/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! + +ok +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + * [new branch] git-annex -> synced/git-annex + +ok +OK + union merge regression: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +commit ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo29 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + +ok +(merging r1/git-annex r2/git-annex into git-annex...) +(Recording state in git...) +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo30 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +push r1 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo29 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +(merging synced/git-annex into git-annex...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + * [new branch] annex/direct/master -> r3/annex/direct/master + * [new branch] git-annex -> r3/git-annex + * [new branch] master -> r3/master + * [new branch] synced/master -> r3/synced/master + +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo29 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + * [new branch] master -> r1/master + * [new branch] synced/git-annex -> r1/synced/git-annex + * [new branch] synced/master -> r1/synced/master + +ok +push r1 bash.exe: warning: could not find /tmp, please create! +Everything up-to-date + +ok +(merging synced/git-annex into git-annex...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + * [new branch] annex/direct/master -> r3/annex/direct/master + * [new branch] git-annex -> r3/git-annex + * [new branch] master -> r3/master + * [new branch] synced/master -> r3/synced/master + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/git-annex -> r2/synced/git-annex + * [new branch] synced/master -> r2/synced/master + +ok +drop foo ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + 55d5b14..3b6c15d git-annex -> r3/git-annex + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + 55d5b14..a4599c9 git-annex -> r2/git-annex + +ok +(merging r2/git-annex r3/git-annex into git-annex...) +(Recording state in git...) +push r3 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo31 + * [new branch] git-annex -> synced/git-annex + +ok +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo30 + 55d5b14..4ff2e44 git-annex -> synced/git-annex + +ok +OK + conflict resolution: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +commit add foo ok +(Recording state in git...) +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo33 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + +ok +(merging r2/git-annex into git-annex...) +(Recording state in git...) +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo33 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +(merging synced/git-annex into git-annex...) +commit add foo ok +(Recording state in git...) +ok +merge synced/master Auto-merging foo +CONFLICT (content): Merge conflict in foo +Automatic merge failed; fix conflicts and then commit the result. +foo: needs merge +[annex/direct/master ab51abe] git-annex automatic merge conflict fix + +(Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo32 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + * [new branch] master -> r1/master + * [new branch] synced/master -> r1/synced/master + +ok +(Recording state in git...) +push r1 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo32 + 0c0b4c1..ab51abe annex/direct/master -> synced/master + * [new branch] git-annex -> synced/git-annex + +ok +(merging synced/git-annex into git-annex...) +commit ok +merge synced/master Updating 0c0b4c1..ab51abe +Fast-forward + foo | 1 - + foo.variant-0b0e | 1 + + foo.variant-bc25 | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 foo + create mode 120000 foo.variant-0b0e + create mode 120000 foo.variant-bc25 + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo33 + 09047a9..ab51abe annex/direct/master -> r2/annex/direct/master + 6208675..2aef6c1 git-annex -> r2/git-annex + 0c0b4c1..ab51abe master -> r2/master + 0c0b4c1..ab51abe synced/master -> r2/synced/master + +ok +get foo.variant-bc25 (from r2...) +foo.variant-bc25 + 22 100% 0.00kB/s 0:00:00 + 22 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 102 bytes received 31 bytes 266.00 bytes/sec +total size is 22 speedup is 0.17 +ok +(Recording state in git...) +get foo.variant-0b0e (from r1...) +foo.variant-0b0e + 22 100% 0.00kB/s 0:00:00 + 22 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 102 bytes received 31 bytes 266.00 bytes/sec +total size is 22 speedup is 0.17 +ok +(Recording state in git...) +OK + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add conflictor ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! + +ok +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + 488868c..2ab23aa git-annex -> synced/git-annex + 09047a9..fdc68bf annex/direct/master -> synced/master + +ok +add conflictor/subfile ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! +From C:/Users/Tobias/testdir/t2/.t\repo + 09047a9..fdc68bf master -> origin/master + 488868c..2ab23aa synced/git-annex -> origin/synced/git-annex + 09047a9..fdc68bf synced/master -> origin/synced/master +Adding conflictor/subfile +CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~refs_remotes_origin_synced_master +Automatic merge failed; fix conflicts and then commit the result. +conflictor: needs merge +[annex/direct/master 77177a0] git-annex automatic merge conflict fix + + +(Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. +ok +(merging origin/synced/git-annex into git-annex...) +(Recording state in git...) +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + 2ab23aa..0ba8d35 git-annex -> synced/git-annex + fdc68bf..77177a0 annex/direct/master -> synced/master + +ok +commit ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo35 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master +Updating fdc68bf..77177a0 +Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile +Already up-to-date. + + + +ok +(merging r2/git-annex into git-annex...) +FAIL + .t\tmprepo34 conflictor directory missing + map: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +describe . ok +(Recording state in git...) +describe origin (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +map C:\Users\Tobias\testdir\t2\.t\tmprepo36 ok +map C:\Users\Tobias\testdir\t2\.t\repo ok +ok +OK + uninit: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +unannex foo ok +unannex sha1foo +git-annex: C:\Users\Tobias\testdir\t2\.t\tmprepo37\.git\annex\objects\ecb\0b5\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map4964.tmp: MoveFileEx "C:\\Users\\Tobias\\testdir\\t2\\.t\\tmprepo37\\.git\\annex\\objects\\ecb\\0b5\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map4964.tmp" "C:\\Users\\Tobias\\testdir\\t2\\.t\\tmprepo37\\.git\\annex\\objects\\ecb\\0b5\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map": permission denied (Access is denied.) +failed +git-annex: Not fully uninitialized +Some annexed data is still left in C:\Users\Tobias\testdir\t2\.t\tmprepo37\.git\annex\objects\ +This may include deleted files, or old versions of modified files. + +If you don't care about preserving the data, just delete the +directory. + +Or, you can move it to another location, in case it turns out +something in there is important. + +Or, you can run `git annex unused` followed by `git annex dropunused` +to remove data that is not used by any tag or branch, which might +take care of all the data. + +Then run `git annex uninit` again to finish. + +OK + uninit (in git-annex branch): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + upgrade: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +upgrade . ok +OK + whereis: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +whereis foo (1 copy) + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +ok +untrust origin ok +(Recording state in git...) +whereis foo (0 copies) + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +git-annex: whereis: 1 failed +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +whereis foo (1 copy) + 28bccded-ea59-4d64-bf20-d58540e72892 -- here (.t\tmprepo40) + + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +ok +OK + hook remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + directory remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +initremote foo ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +copy foo (to foo...) + +100% 0.0 B/s 0s + +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +move foo (from foo...) + +100% 0.0 B/s 0s + +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 1 out of 2 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +OK + rsync remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + bup remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OKg +pg t e sctriynpgt on:o t i m p l e m e n t e d o n W i n d o w s + OK + preferred content: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +wanted . ok +(Recording state in git...) +group . ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +ungroup . ok +(Recording state in git...) +wanted . ok +(Recording state in git...) +group . ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +ungroup . ok +(Recording state in git...) +wanted . ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +OK + global cleanup: OK + +1 out of 74 tests failed + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) +"""]] + +batch script to reproduce the problem in the cmd shell: +[[!format bat """ +mkdir repo +cd repo +git init +git annex init "main repo" +echo x > f1 +git annex add f1 +git annex sync +cd .. +git clone repo r1 +git clone repo r2 +cd r1 +echo xyz > conflictor +git annex add conflictor +git annex sync +cd ..\r2 +mkdir conflictor +echo abc > conflictor\subfile +git annex add conflictor\subfile +git annex sync +cd ..\r1 +git remote add r2 ..\r2 +git remote remove origin +cd ..\r2 +git remote add r1 ..\r1 +git remote remove origin +cd ..\r1 +git annex sync +cd ..\r2 +git annex sync +cd .. +dir repo r1 r2 +"""]] + +> Yet another wonderful case of \\ vs / confusion. [[fixed|done]]. +> +> That sucked, but I am rather stunned that the rest of the test +> suite passes for you. That's a lot better that it's ever done on windows +> before. Sadly I don't have as much luck on XP, still 9 failing tests +> there. +> +> --[[Joey]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment new file mode 100644 index 000000000..7ece79f42 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="This test is still failing on Windows" + date="2014-01-29T14:37:33Z" + content=""" +This 1 test is still failing for me on Windows 7 Pro with the latest release (git-annex version: 5.20140128-gddb2083). + +I also followed the manual steps provided in the initial bug report. This resulted in two cloned repos which appeared to have resolved the conflict differently. Upon further investigation, I see that the conflict was in fact resolved consistently, just that the file sizes in the working directories are different because the file contents has not been synced (so some files contain the \"symlink\" path rather than the actual contents). + +After running a sync in both repositories with the new --contents option, the two working directories appear to be resolved consistently. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment new file mode 100644 index 000000000..0a9e852f2 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 2" + date="2014-01-29T17:52:27Z" + content=""" +AFAICS, the test suite does not look at the contents of the files when testing this. Anyway, you said a lot about how it works when you try to reproduce the bug manually, but you didn't actually show how the test suite is failing. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment new file mode 100644 index 000000000..83c033aed --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment @@ -0,0 +1,142 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 3" + date="2014-01-29T18:43:07Z" + content=""" +Here is the relevant portion of the test output. Sorry for getting caught up in my manual troubleshooting and not providing this info earlier. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.62 KiB | 0 bytes/s, done. + Total 16 (delta 2), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 5a1abd2..b0de6d7 git-annex -> synced/git-annex + 4539cc8..af0b4de annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 2), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 4539cc8..af0b4de master -> origin/master + 5a1abd2..b0de6d7 synced/git-annex -> origin/synced/git-annex + 4539cc8..af0b4de synced/master -> origin/synced/master + + Adding conflictor/subfile + CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~ + refs_remotes_origin_synced_master + Automatic merge failed; fix conflicts and then commit the result. + (Recording state in git...) + conflictor: needs merge + [annex/direct/master 7b21326] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (19/19), done. + Writing objects: 100% (23/23), 2.18 KiB | 0 bytes/s, done. + Total 23 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + b0de6d7..b64838f git-annex -> synced/git-annex + af0b4de..7b21326 annex/direct/master -> synced/master + ok + commit ok + pull r2 + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (19/19), done. + remote: Total 23 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (23/23), done. + From ../../.t\tmprepo36 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master + + Updating af0b4de..7b21326 + Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile + + Already up-to-date. + ok + (merging r2/git-annex into git-annex...) + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + + Adding conflictor/subfile + CONFLICT (file/directory): There is a directory with name conflictor in refs/remotes/origin/synced/master. Add + ing conflictor as conflictor~HEAD + Automatic merge failed; fix conflicts and then commit the result. + conflictor: needs merge + + git-annex: c:\Users\geibeljt\annex\.t\tmprepo37\.git\annex\merge\conflictor: renameFile: inappropriate type (i + s a directory) + failed + push origin + Counting objects: 29, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (15/15), done. + Writing objects: 100% (19/19), 1.71 KiB | 0 bytes/s, done. + Total 19 (delta 5), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + b64838f..0c094c8 git-annex -> synced/git-annex + ! [rejected] annex/direct/master -> synced/master (non-fast-forward) + error: failed to push some refs to 'c:/Users/geibeljt/annex/.t\repo' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and integrate the remote changes + hint: (e.g. 'git pull ...') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + + Pushing to origin failed. + + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git + config) + failed + git-annex: sync: 2 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment new file mode 100644 index 000000000..9a33c64cc --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 4" + date="2014-01-29T19:48:51Z" + content=""" +Ok, what's happening is that code path calls System.PosixCompat.Files.rename, and on unix that maps to regular rename() which can rename files or directories, but on windows, it's a compatability stub that calls haskell's renameFile, which oddly refuses to rename directories. + +I remember testing my fix to the parent bug originally, but I don't know how. Possibly I changed something afterwards that exposed this new problem. + +Need to use System.Win32.File.moveFile, which actually can move directories too. Made this change in git, and you can download an windows autobuild of it already if you'd like. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment new file mode 100644 index 000000000..b6d338318 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment @@ -0,0 +1,86 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 5" + date="2014-01-29T20:26:15Z" + content=""" +This seems to have affected a lot of tests, I'm now getting \"20 out of 72 tests failed\". In particular, error messages similar to the following show up now in many tests (with different paths for each test). + + git-annex: MoveFile \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\\574\\4ca\\SHA256E-s7--6f + e7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d596 + 64989c3b1e80a980bac1cb352a2ba7.map25112.tmp\" \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\ + \574\\4ca\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dc + d1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7.map\": already exists (Cannot create a file when that f + ile already exists.) + + +--- +And here is the full output for the test that was originally failing. It now appears to fail much earlier than before. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.57 KiB | 0 bytes/s, done. + Total 16 (delta 3), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + a462941..43dcc49 git-annex -> synced/git-annex + 8268d47..3012c35 annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit + git-annex: MoveFile \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\\574\\4ca\\SHA256E-s7--6f + e7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d596 + 64989c3b1e80a980bac1cb352a2ba7.map25112.tmp\" \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\ + \574\\4ca\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dc + d1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7.map\": already exists (Cannot create a file when that f + ile already exists.) + failed + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 3), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 8268d47..3012c35 master -> origin/master + a462941..43dcc49 synced/git-annex -> origin/synced/git-annex + 8268d47..3012c35 synced/master -> origin/synced/master + + Updating 8268d47..3012c35 + Fast-forward + conflictor | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 conflictor + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 24, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.42 KiB | 0 bytes/s, done. + Total 16 (delta 6), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 43dcc49..c040cd6 git-annex -> synced/git-annex + ok + git-annex: sync: 1 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment new file mode 100644 index 000000000..3ba917fcb --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 6" + date="2014-01-29T21:24:34Z" + content=""" +I missed that moveFile refuses to overwrite existing files. This is fixed in git, and the autobuild is updating. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment new file mode 100644 index 000000000..a41cf40af --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment @@ -0,0 +1,174 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 7" + date="2014-01-30T16:02:08Z" + content=""" +Alright, I've grabbed the latest autobuild and have tested again with 5.20140130-gcb99900. Back to failing just this one test case. Compared to my last two comments, the test appears to be getting further along before failing. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.66 KiB | 0 bytes/s, done. + Total 16 (delta 1), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + dafdb0b..2d106aa git-annex -> synced/git-annex + 688224a..18c2edb annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 688224a..18c2edb master -> origin/master + dafdb0b..2d106aa synced/git-annex -> origin/synced/git-annex + 688224a..18c2edb synced/master -> origin/synced/master + + Adding conflictor/subfile + CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~ + refs_remotes_origin_synced_master + Automatic merge failed; fix conflicts and then commit the result. + (Recording state in git...) + conflictor: needs merge + [annex/direct/master 5026450] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (19/19), done. + Writing objects: 100% (23/23), 2.18 KiB | 0 bytes/s, done. + Total 23 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 2d106aa..aca0d04 git-annex -> synced/git-annex + 18c2edb..5026450 annex/direct/master -> synced/master + ok + commit ok + pull r2 + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (19/19), done. + remote: Total 23 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (23/23), done. + From ../../.t\tmprepo36 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master + + Updating 18c2edb..5026450 + Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile + + Already up-to-date. + ok + (merging r2/git-annex into git-annex...) + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + + Adding conflictor/subfile + CONFLICT (file/directory): There is a directory with name conflictor in refs/remotes/origin/synced/master. Add + ing conflictor as conflictor~HEAD + Automatic merge failed; fix conflicts and then commit the result. + conflictor: needs merge + (Recording state in git...) + [annex/direct/master 82abd2f] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (17/17), done. + Writing objects: 100% (22/22), 1.95 KiB | 0 bytes/s, done. + Total 22 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + aca0d04..9d475c9 git-annex -> synced/git-annex + 5026450..82abd2f annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (17/17), done. + remote: Total 22 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (22/22), done. + From c:/Users/geibeljt/annex/.t\repo + 5026450..82abd2f master -> origin/master + aca0d04..9d475c9 synced/git-annex -> origin/synced/git-annex + 5026450..82abd2f synced/master -> origin/synced/master + + Auto-merging conflictor/subfile + CONFLICT (add/add): Merge conflict in conflictor/subfile + Automatic merge failed; fix conflicts and then commit the result. + failed + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 34, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (17/17), done. + Writing objects: 100% (22/22), 2.05 KiB | 0 bytes/s, done. + Total 22 (delta 5), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 9d475c9..13a0faa git-annex -> synced/git-annex + ! [rejected] annex/direct/master -> synced/master (non-fast-forward) + error: failed to push some refs to 'c:/Users/geibeljt/annex/.t\repo' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and integrate the remote changes + hint: (e.g. 'git pull ...') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + + Pushing to origin failed. + + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git + config) + failed + git-annex: sync: 2 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment new file mode 100644 index 000000000..4db1b7786 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 8" + date="2014-02-04T02:05:36Z" + content=""" +With the changes pushed today, I confirm I also have all 72 tests passing on Windows 7 with 5.20140203-g83e6fb7. + +Thanks! +"""]] diff --git a/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn b/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn new file mode 100644 index 000000000..be6db378c --- /dev/null +++ b/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn @@ -0,0 +1,23 @@ +I only saw this just now, but the tests fail to link/build on OSX + +
+[181 of 181] Compiling Main ( git-annex.hs, tmp/Main.o )
+Linking git-annex ...
++ make -q test
++ '[' 1 = 1 ']'
++ ../maxtime 1800 make test
+[175 of 175] Compiling Main ( test.hs, tmp/Main.o )
+test.hs:175:17:
+Not in scope: data constructor `Types.Backend.KeySource'
+test.hs:175:43:
+`Types.Backend.keyFilename' is not a (visible) constructor field name
+test.hs:175:76:
+`Types.Backend.contentLocation' is not a (visible) constructor field name
+** failed to build the test suite
+make: *** [test] Error 1
++ exit 4
+
+ +this issue seems to got introduced at commit e0fdfb2e706da2cb1451193c658dc676b0530968 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file.mdwn b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file.mdwn new file mode 100644 index 000000000..40cd3ebb9 --- /dev/null +++ b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. +git-annex assistant reports a warning: +TransferScanner crashed: fd:59: hGetLine: end of file + +### What steps will reproduce the problem? +I don't know. Just run git-annex assistant and wait for this to happen. + +### What version of git-annex are you using? On what operating system? +Version: 5.20140709 +Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash + +Gentoo + +### Please provide any additional information below. + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +error: object file /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f is empty +fatal: loose object 973b57761ebe88b11e1d0d2c70c8d3b48530202f (stored in /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f) is corrupt +error: object file /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f is empty +fatal: loose object 973b57761ebe88b11e1d0d2c70c8d3b48530202f (stored in /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f) is corrupt +error: object file /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f is empty +fatal: loose object 973b57761ebe88b11e1d0d2c70c8d3b48530202f (stored in /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f) is corrupt +error: object file /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f is empty +fatal: loose object 973b57761ebe88b11e1d0d2c70c8d3b48530202f (stored in /home/crabman/annex/.git/objects/97/3b57761ebe88b11e1d0d2c70c8d3b48530202f) is corrupt +fd:31: hGetLine: end of file +fd:32: hGetLine: end of file +fd:33: hGetLine: end of file +fd:34: hGetLine: end of file +fd:38: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:43: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:41: hGetLine: end of file +fd:43: hGetLine: end of file + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_1_a1392b92efdff82783a4b0cc2c3c7f2f._comment b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_1_a1392b92efdff82783a4b0cc2c3c7f2f._comment new file mode 100644 index 000000000..101b23404 --- /dev/null +++ b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_1_a1392b92efdff82783a4b0cc2c3c7f2f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-14T18:47:21Z" + content=""" +You did not seem to paste the whole log, but it's clear that your git repository is corrupt. You might try running `git annex repair` inside it. + +This was probably caused by a disk corruption or if you're lucky just a hard shutdown that caused files to get truncated. + +The assistant tries to detect corrupt repositories on startup, but it's hard to detect when a repository has a few corrupt objects like this. This is why the webapp suggests you set up periodic repository consistency checks, which should eventually repair this kind of problem. + +Perhaps it would make sense for the webapp, when a thread crashes, to provide a button to run an consistency check immediately. +"""]] diff --git a/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_2_5e153b7c59c474988fe551a505e545bc._comment b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_2_5e153b7c59c474988fe551a505e545bc._comment new file mode 100644 index 000000000..c8d4a988a --- /dev/null +++ b/doc/bugs/TransferScanner_crashed:_fd:59:_hGetLine:_end_of_file/comment_2_5e153b7c59c474988fe551a505e545bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jg123h12jh3y12g3y" + ip="86.62.100.131" + subject="comment 2" + date="2014-07-15T07:58:15Z" + content=""" +But I do have periodice consistency checks turned on. I think git-annex assistant should tell the user what the heck is going on and maybe try to repair it automatically. +"""]] diff --git a/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn b/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn new file mode 100644 index 000000000..0d9b4f648 --- /dev/null +++ b/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn @@ -0,0 +1,5 @@ +After creating a new pairing, I stopped the daemon through the webapp while it was syncing. The webapp shut down and was no longer accessible, but git-annex continued running in the background, along with git-annex-shell, and they continued to run new transfers with new rsync processes. This continued until I killed them all. + +I expected that when I stopped the daemon in the webapp, all git-annex processes and all transfers would stop. + +Using the 20131101 tarball. diff --git a/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment b/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment new file mode 100644 index 000000000..9d504f743 --- /dev/null +++ b/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:01:14Z" + content=""" +I've checked, and shutting down the daemon does cause it to stop any transfers it is running. + +However, this does not stop other transfers initiated by the other paired computer. + +I'm ambivilant about whether local pairing should only allow transfers when both daemons are running. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn new file mode 100644 index 000000000..99055e7c5 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn @@ -0,0 +1,51 @@ +What steps will reproduce the problem? + +I added a (encrypted) ssh remote and everything worked fine. Now I marked the remote as dead, but git-annex still tries to upload to this remote. I recognize this because it asks for my ssh and gpg keys passwords. + +While transfering (or asking for the password), `git annex status` shows the following: +
+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+supported remote types: git S3 bup directory rsync web hook
+trusted repositories: 0
+semitrusted repositories: 2
+	00000000-0000-0000-0000-000000000001 -- web
+ 	cd16b9c6-f464-11e1-9845-8749687232d2 -- here (Dell)
+untrusted repositories: 0
+dead repositories: 7
+	11379fa0-ecd6-49e2-9bec-24fc19cc7b9f -- vserver.dbruhn.de_annex
+ 	2195e036-d2ef-4357-8c89-a9aaec23ebdc -- vserver-plain
+ 	4d066ea1-fb9f-45fd-990a-5c5c836f530e -- inTmp
+ 	bb276045-6ba6-488f-88d0-39a3c5f5134d -- vserver-enc
+ 	c49f3372-3fcf-49fc-b626-73ba4454c172 -- annexBare (bareAnnex)
+ 	e52645b3-bfb6-457d-b281-967353919e29 -- AnnexUSBFAT
+ 	ea3d6acc-716c-48e8-9b6b-993b90dcc1db -- vserver2
+transfers in progress: 
+	uploading Schmidt/somefile.m4a
+
+
+ to vserver2
+available local disk space: 43 gigabytes (+1 megabyte reserved)
+temporary directory size: 389 megabytes (clean up with git-annex unused)
+local annex keys: 23
+local annex size: 396 megabytes
+known annex keys: 19
+known annex size: 396 megabytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+	SHA256E: 42
+
+ +As you can see, the `vserver2` remote is marked as dead but git-annex still tries to upload. This problem keeps occuring even after restarts. + +What is the expected output? What do you see instead? + +If I do not get the `dead` status wrong, git-annex should not use these remotes. + + +What version of git-annex are you using? On what operating system? + +git-annex HEAD from yesterdays git. Ubuntu 12.10 + +Please provide any additional information below. + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment new file mode 100644 index 000000000..f8a85cb16 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 1" + date="2012-11-04T20:01:35Z" + content=""" +Are you using the git-annex assistant? It's supposed to have code in it to prevent it from using dead remotes. Perhaps that is not working. + +When not using the git-annex assistant, nothing prevents git-annex from trying to continue to use dead remotes. I think this is ok; maybe the dead remote is not 100% dead yet; if it is, the remote can be removed from git's configuration to prevent it being used of course. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment new file mode 100644 index 000000000..fd0d9d2ab --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.dbruhn.de/" + nickname="Dominik" + subject="comment 2" + date="2012-11-08T14:13:00Z" + content=""" +Actually this happens when using the assistant. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment new file mode 100644 index 000000000..e839e7a15 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T18:00:42Z" + content=""" +I've tried & failed to reproduce this using the assistant. When I mark a repo as dead, and go into Configuration -> Manage repositories, the repository is not shown in the list of repositories it'll sync to, and it certainly doesn't upload any files to it. + + +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3.mdwn b/doc/bugs/Truncated_file_transferred_via_S3.mdwn new file mode 100644 index 000000000..9261c8a05 --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3.mdwn @@ -0,0 +1,614 @@ +### Please describe the problem. + +I have two machines connected with annex assistant via XMPP and S3. I placed a file into the annex directory on one computer, and it fairly immediately transferred to the other, as expected. However the resulting file appears to be truncated. + +### What steps will reproduce the problem? + +Unknown, I haven't noticed this happen before. + +### What version of git-annex are you using? On what operating system? + +The sending end was from commit ef1fd09c5c1c3950727f0760df36075e45192b33 (Tue Jul 2 16:52:43 2013 +0000), the receiving end was at 1c16de8ebcef6c1920a8437af380f8aea5a2c535 (Wed Jun 12 20:31:43 2013 +0000). Both on Ubuntu 13.04. + +### Please provide any additional information below. + +Details of the file at the sending end: + +[[!format text """ +$ stat git-annex_4.20130627_amd64.deb + Bestand: ‘git-annex_4.20130627_amd64.deb’ + Grootte: 10140744 Blokken: 19808 IO-blok: 4096 normaal bestand +Apparaat: 801h/2049d Inode: 27394054 Koppelingen: 1 +Toegang: (0644/-rw-r--r--) UID: ( 1000/ robin) GID: ( 1000/ robin) +Toegang: 2013-07-03 21:57:26.774297184 +1200 +Gewijzigd: 2013-07-03 21:57:25.526306867 +1200 +Veranderd: 2013-07-03 21:57:26.770297214 +1200 +"""]] + +and at the receiving end: + +[[!format text """ + Bestand: ‘git-annex_4.20130627_amd64.deb’ + Grootte: 10105870 Blokken: 19760 IO-blok: 4096 normaal bestand +Apparaat: 16h/22d Inode: 6167474 Koppelingen: 1 +Toegang: (0664/-rw-rw-r--) UID: ( 1000/ robin) GID: ( 1000/ robin) +Toegang: 2013-07-03 10:58:02.653724449 +0100 +Gewijzigd: 2013-07-03 10:58:02.365724461 +0100 +Veranderd: 2013-07-03 10:58:02.369724461 +0100 +"""]] + +(it was coincidence I expect that it was a deb of git-annex I'd just made :) + +Some more poking indicates that it's not strictly a truncation, not too far into the file, the content changes: + +Sent: + +[[!format text """ +00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314 +00002b0 4a0d 2954 d6aa fb42 2699 7437 df7f 6a6d +00002c0 7f7f 4f1c bce5 5e0f 5cc3 d5b1 e896 2829 +00002d0 4ed2 8426 9496 a669 3dd1 d6ed 26dd 3b1d +00002e0 4c2a 4ef2 e29b 778c 4818 0e49 990e 314c +"""]] + +Received: + +[[!format text """ +00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314 +00002b0 544a aa29 42d6 99fb 3726 7f74 6ddf 7f6a +00002c0 1c7f e54f 0fbc c35e b15c 96d5 29e8 d228 +00002d0 264e 9684 6994 d1a6 ed3d ddd6 1d26 2a3b +00002e0 f24c 9b4e 8ce2 1877 4948 0e0e 4c99 1931 +"""]] + +Oddly, there seems to be a pattern in the difference of the first incorrect row, it looks like kind of like strange endian weirdness rearranging things. + +aabb ccdd eeff gghh + +becomes: + +bbdd ffcc hhee ..gg + +where the .. comes from further along the pattern. + +Deleting and re-adding the file doesn't cause the new version to appear, but that's presumably because it's addressing by SHA, so it doesn't see that as a change. + +[[!format text """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Sending machine: + +(started...) [2013-07-03 21:57:17 NZST] XMPPSendPack: Syncing with eythian +[2013-07-03 21:57:17 NZST] XMPPReceivePack: Syncing with eythian +Everything up-to-date +[2013-07-03 21:57:25 NZST] Committer: Adding git-annex..amd64.deb + +add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:25 NZST] Committer: Committing changes to git +[2013-07-03 21:57:25 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 2783051..69b3503 git-annex -> synced/git-annex + 0b10576..e1b6f29 master -> synced/master +(gpg) Already up-to-date. +Already up-to-date. +[2013-07-03 21:57:26 NZST] XMPPSendPack: Syncing with eythian +[2013-07-03 21:57:26 NZST] Committer: Adding git-annex..amd64.deb +ok +(Recording state in git...) +(Recording state in git...) + + +add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:26 NZST] Committer: Committing changes to git + +0% 96.0KB/s 1m42s[2013-07-03 21:57:27 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 69b3503..026ba8e git-annex -> synced/git-annex +To xmpp::eythian@jabber.kallisti.net.nz + 2783051..69b3503 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex + 0b10576..e1b6f29 master -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master +1% 127.9KB/s 1m16s[2013-07-03 21:57:27 NZST] XMPPSendPack: Syncing with eythian +25% 631.7KB/s 12sTo xmpp::eythian@jabber.kallisti.net.nz + 69b3503..35b3fd8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 21:57:30 NZST] XMPPSendPack: Syncing with eythian +51% 1.2MB/s 4sEverything up-to-date +[2013-07-03 21:57:34 NZST] Transferrer: Uploaded git-annex..amd64.deb +[2013-07-03 21:57:34 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 026ba8e..1eb67d8 git-annex -> synced/git-annex +[2013-07-03 21:57:35 NZST] XMPPSendPack: Syncing with eythian +To xmpp::eythian@jabber.kallisti.net.nz + 35b3fd8..1eb67d8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 21:57:36 NZST] XMPPSendPack: Syncing with eythian +Everything up-to-date +[2013-07-03 21:58:03 NZST] XMPPReceivePack: Syncing with eythian +Already up-to-date. +[2013-07-03 21:58:04 NZST] XMPPReceivePack: Syncing with eythian +[2013-07-03 22:09:44 NZST] XMPPSendPack: Syncing with eythian +To xmpp::eythian@jabber.kallisti.net.nz + 1eb67d8..822dbb1 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 22:09:45 NZST] XMPPSendPack: Syncing with eythian +Everything up-to-date + +Receiving machine: + +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a18/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from b24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c27/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c16/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d27/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from f21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l17/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m32/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m18/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from o20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s16/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])" +[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (PushRequest (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\"))" +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m9/Adium Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from p6/NEW_HOTNESS Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:17 BST] XMPPClient: push notification for +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"] +[2013-07-03 10:57:17 BST] XMPPClient: ignoring CanPush with known shas +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:17 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:57:17 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:17 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:57:17 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:18 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:18 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:18 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:18 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:57Everything up-to-date +:18 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:57:18 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:21 BST] XMPPClient: received: ["Presence from a15/android_talk53f054b9e972 Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:26 BST] XMPPClient: push notification for +[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:26 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:26 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:26 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:27 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..27830516f221de09f7906954ba0bcc6b3dd31680","--oneline","-n1"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "") +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","69b3503287d87c26989a755d0cc660c3c68f2c80"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","69b3503287d87c26989a755d0cc660c3c68f2c80..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","69b3503287d87c26989a755d0cc660c3c68f2c80"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:27 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:27 BST] Merger: merging refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master into refs/heads/master +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +Updating 0b10576..e1b6f29 +Fast-forward + git-annex_4.20130627_amd64.deb | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 git-annex_4.20130627_amd64.deb +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","0b10576100879220b2f50bf53f552befe2fda8de","e1b6f2944e7d082299cb1696c55d9064a11c4577"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:28 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb +[2013-07-03 10:57:28 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:57:28 BST] Committer: committing 1 changes +[2013-07-03 10:57:28 BST] Committer: Committing changes to git +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:28 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:28 BST] XMPPClient: push notification for +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80]) +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:28 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:57:28 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])" +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"] +[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:28 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:28 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"] +[2013-07-03 10:57:29 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:29 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:29 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:29 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:30 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:30 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","35b3fd81218834a29b9f516b64b4671c0b0902d3"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","35b3fd81218834a29b9f516b64b4671c0b0902d3..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:30 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","35b3fd81218834a29b9f516b64b4671c0b0902d3"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:30 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:30 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:30 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:31 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:31 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:31 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:31 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:31 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:31 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:31 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:32 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:34 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:34 BST] XMPPClient: push notification for +[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:35 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:35 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:35 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:36 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "") +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","1eb67d85f89c92345757805d83939d75e8ce54a0"] +[2013-07-03 10:57:36 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","1eb67d85f89c92345757805d83939d75e8ce54a0..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:36 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","1eb67d85f89c92345757805d83939d75e8ce54a0"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:36 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:37 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:37 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:37 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:37 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:37 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:37 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:37 BST] TransferScanner: queued Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing : expensive scan found missing object +[2013-07-03 10:57:37 BST] Transferrer: Transferring: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing +[2013-07-03 10:57:38 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:38 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:38 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 131008 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 262016 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 393024 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 524032 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 655040 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 786048 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 917056 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1048064 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1179072 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1310080 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1441088 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1572096 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1703104 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1834112 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1965120 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2096128 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2227136 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2358144 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2489152 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2620160 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2751168 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2882176 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3013184 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3144192 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3275200 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3406208 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3537216 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3668224 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3799232 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3930240 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4192256 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4323264 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4454272 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4585280 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4716288 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4847296 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5109312 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5240320 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5371328 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5502336 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5633344 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5764352 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5895360 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6157376 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6288384 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6419392 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6550400 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6681408 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6943424 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7074432 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7205440 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7336448 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7598464 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7729472 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7860480 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7991488 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8122496 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8253504 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8384512 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8515520 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8777536 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8908544 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9039552 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9170560 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9301568 +[2013-07-03 10:58:02 BST] XMPPClient: received: ["Unknown message"] +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9432576 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9563584 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9825600 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9956608 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 10087616 +[2013-07-03 10:58:02 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb +[2013-07-03 10:58:02 BST] Transferrer: Downloaded git-annex..amd64.deb +[2013-07-03 10:58:02 BST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "971c808b-ce67-4edb-b317-21c0da6b5462", transferKey = Key {keyName = "8514472fd7c4ea28b385b0335db408ee28f58911b5ad0ba9d2e2cbfd1b99c86d.deb", keyBackendName = "SHA256E", keySize = Just 10140744, keyMtime = Nothing}} +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-w","--stdin-paths"] +[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","write-tree"] +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit-tree","9b6f9b59c19650e25f11e2d50acb3bf25b631150","-p","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","822dbb101976fed8b775d04bba6da876c591a9f0"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:58:02 BST] Committer: committing 1 changes +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] Committer: Committing changes to git +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..822dbb101976fed8b775d04bba6da876c591a9f0","--oneline","-n1"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:58:02 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0]) +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-07-03 10:58:02 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:58:03 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:58:03 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] Merger: merging refs/heads/synced/master into refs/heads/master +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"] +Already up-to-date. +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","e1b6f2944e7d082299cb1696c55d9064a11c4577","e1b6f2944e7d082299cb1696c55d9064a11c4577"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 2 "") +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 6 \"\")"] +[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 6 "") in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 7 \"\")"] +[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 7 "") in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:58To xmpp::eythian@jabber.kallisti.net.nz +:0 2783051..822dbb1 4git-annex -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +BS 0b10576..e1b6f29 Tmaster -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master] + XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:58:04 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0]) +[2013-07-03 10:58:04 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:04 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:58:04 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:58:05 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])" +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:58:05 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:58:05 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:58:05 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:58:05 Everything up-to-date +BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:58:05 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:58:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment new file mode 100644 index 000000000..f3583d31b --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-05T16:49:33Z" + content=""" +Did you get a chance to run `git annex fsck` on the file? I'd hope it would detect this problem. + +It's certainly possible for data to get corrupted somehow in transit. git-annex does not check that it got the expected contents until a fsck happens. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment new file mode 100644 index 000000000..7eeb7ccaf --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 2" + date="2013-07-11T12:44:24Z" + content=""" +I did it just then: + + fsck git-annex_4.20130627_amd64.deb (checksum...) [2013-07-11 13:38:46 BST] read: sha256sum [\"git-annex_4.20130627_amd64.deb\"] + + Bad file content; left in place for you to examine + failed + +however, more concerningly, this happened to almost all the files in the repo: + + git-annex: fsck: 79 failed + +and they do seem to be a different size between the two computers. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment new file mode 100644 index 000000000..ecf3c4a1a --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 3" + date="2013-07-11T16:16:03Z" + content=""" +Would all these files that wrong size have been transferred to this computer via S3 too? And can you spot the same weird endinaness problem in them too? Are the files only getting corrupted on one computer, or on both? +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment new file mode 100644 index 000000000..b22380dc0 --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 4" + date="2013-07-12T10:14:16Z" + content=""" +Yes, they would have gone via S3 too. + +However, it seems that running git annex fsck assumed the files on disk were correct, and they got resynched. So now both the computers have the incorrect version. I'll have a go pulling them out of backups and take a look. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment new file mode 100644 index 000000000..742d22e2d --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 5" + date="2013-07-12T10:43:23Z" + content=""" +Good thing I set up obnam a while ago :) + +Anyway, yes, a very similar pattern of corruption can be seen here. It might be worth nothing that it starts in a different place in the file. The one I'm looking at now begins at byte 0x1C, whereas it was a little bit further into the file previously. + +I created a large file that'd make the issue really clear and synced it over, and of course, everything worked perfectly. + +Here is a pair of small files that shows the problem, from around the 0x4BC mark. + + +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_6_6aa9261c0cdb02c6dd66d25f5c71f622._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_6_6aa9261c0cdb02c6dd66d25f5c71f622._comment new file mode 100644 index 000000000..b5c27c5fd --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_6_6aa9261c0cdb02c6dd66d25f5c71f622._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 6" + date="2014-05-28T00:33:48Z" + content=""" +I've just noticed the the S3 backend used Char8 for reading/writing encrypted files. I don't know that this could result in this problem, but it at least seems possible. If you can still reproduce the bug, try getting the next daily build and see if perhaps it fixed it. +"""]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn new file mode 100644 index 000000000..560597632 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +I am receiving a weird error when trying to add a file into a git annex repo on Android. I can't explain how it got into this state, and I can't figure out how to fix it. + +### What steps will reproduce the problem? + +See the output below - I'm happy to run any debugging commands that are required. + +### What version of git-annex are you using? On what operating system? + +ASUS Transformer Infinity Android Tablet, Android 4.2.1. + +[[!format sh """ +git-annex version: 4.20130601-g7483ca4 +build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + + +### Please provide any additional information below. + +[[!format sh """ +u0_a141@android:/sdcard/git-annex.home/Documents $ git annex add Music/MobileSheets/The\ New\ Real\ Book\ 1/New\ Real\ Book\ 1\ Eb_19.pdf +add Music/MobileSheets/The New Real Book 1/New Real Book 1 Eb_19.pdf (checksum...) unknown option -- reflink=auto +git-annex: /storage/emulated/legacy/git-annex.home/Documents/.git/annex/tmp/New Real Book 1 Eb15137.pdf: rename: does not exist (No such file or directory) +failed +git-annex: add: 1 failed +1|u0_a141@android:/sdcard/git-annex.home/Documents $ ls -la .git/annex/tmp/ +drwxrwxr-x 2 root sdcard_r 4096 Jun 14 13:42 . +drwxrwxr-x 6 root sdcard_r 4096 Jun 14 13:35 .. +u0_a141@android:/sdcard/git-annex.home/Documents $ +"""]] + +> Should be [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment new file mode 100644 index 000000000..84a7498c4 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-14T16:20:57Z" + content=""" +I suspect you probably have another file already in the repository with the same content as the file you're trying to add. That, or something like it is why you're the lucky one who got to discover this bug in the build of the Android app! ;) The exact reason doesn't matter much -- It seems that it's trying to run `cp --reflink=auto`, which works on the build system, but not using the minimal busybox cp shipped with the Android app. + +I have put out a fix, and the Android daily build has been updated, so you can upgrade to that. +"""]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment new file mode 100644 index 000000000..52441b074 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknOATcOkmzX4jKuET5Z2RsaFUNnLKnQsU" + nickname="Stephen" + subject="comment 2" + date="2013-06-14T23:01:35Z" + content=""" +Yep, it's fixed in the latest. Thanks! +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn b/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn new file mode 100644 index 000000000..5d0b73b17 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +The "add" command silently ignores all files and directories with non-ascii characters. + +### What steps will reproduce the problem? + +I created empty repository (git init, git annex init). I created some files with ascii and nonascii file names (hacky.txt, háčky.txt). + +git annex add . correctly adds only hacky.txt. + +git annex add "háčky.txt" does nothing. + +### What version of git-annex are you using? On what operating system? + +git 1.9.0, +git-annex installer from 2014-03-06 + +Windows XP and 7 with czech localization. CP1250 is used for czech characters on windows. + +### Please provide any additional information below. + + $ ls + hacky.txt h????ky.txt + $ git annex add . + add hacky.txt ok + (Recording state in git...) + $ git annex status + D h├í─Źky.txt + +According to https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support ls prints junk, but only to console. + + D:\anntest>git annex add "háčky.txt" --debug + [2014-03-18 14:28:03 Central Europe Standard Time] read: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","ls-files","--others","--exclude-standard","-z","--","h\225\269ky.txt"] + [2014-03-18 14:28:03 Central Europe Standard Time] chat: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","cat-file","--batch"] + [2014-03-18 14:28:03 Central Europe Standard Time] read: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","ls-files","--modified","-z","--","h\225\269ky.txt"] + +I can provide additional information, just tell me what you need. + +> [[fixed|done]], although this is not the end of encoding issues +> on Windows. Updating [[todo/windows_support]] to discuss some other ones. +> --[[Joey]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment new file mode 100644 index 000000000..c1778db78 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="analysis" + date="2014-03-18T17:54:09Z" + content=""" +The `git ls-files --others -z output` is fine; the mojibake seems to occur in git-annex's reading of that output, which uses GHC's filesystem encoding. On Linux it reads \"h\225\269ky.txt\" but on Windows, \"h\195\161\196\56461ky.txt\". + +So, it's failing to compose the multibyte characters, and it seems to have escaped the last byte (which should be \"\141\" based on the other 3) out into the high code plane used for undecodable bytes. + +Note that on Linux with LANG=C, the add works, and it sees \"h\56515\56481\56516\56461ky.txt\" -- in this case, all 4 bytes are represented in the high code plane, and so round-trip through ok despite the locale not supporting the utf8 encoding. + +Interestingly, while both `[readFile \"h\225\269ky.txt\", readFile \"h\56515\56481\56516\56461ky.txt\"]` work on Linux, only the former does on Windows. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment new file mode 100644 index 000000000..97d7012a1 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-18T18:09:08Z" + content=""" +One approach might be to not use the GHC FileSystemEncoding on Windows, and assume that Windows filenames are always in a unicode encoding. After all, the FileSystemEncoding is only used by git-annex on Unix because Unix has no canonical encoding that will work for all filenames. + +Hmm, nope, I tried this and it just causes an \"invalid byte sequence\" crash when reading from git-ls-files. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment new file mode 100644 index 000000000..1f35dc9dd --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-18T18:14:57Z" + content=""" +ghc docs on FileSystemEncoding: \"On Windows, this encoding *should not* be used if possible because the use of code pages is deprecated: Strings should be retrieved via the wide W-family of UTF-16 APIs instead\" +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment new file mode 100644 index 000000000..e40a6ab33 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 4" + date="2014-03-18T18:42:57Z" + content=""" +As well as the default encoding, I've tried `utf8`, `utf16`, `utf16le`, and `utf16be` encodings, and none of them is able to successfully read the git ls-files output, all fail with encoding error. (I also tried `mkUTF16 RoundtripFailure` but it completely broke git-annex.) + +Unsure where to go from here.. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment new file mode 100644 index 000000000..ccafb635e --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info" + date="2014-03-18T23:46:08Z" + content=""" +On my windows 7 machine, ls-files does return something better + + c:\JSH\antest>git --work-tree=c:\JSH\antest ls-files --others + \"h\303\241\304\215ky.txt\" + +If I am correct, it is unicode 225 269, but as octal utf-8. ls-files -z return correct utf-8 (68 C3 A1 C4 8D 6B ...) + +I will test that tomorrow also on windows xp on my work pc. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment new file mode 100644 index 000000000..4f7ec51fa --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info 2" + date="2014-03-19T11:53:17Z" + content=""" +And on my windows xp computer, git ls-files returns valid utf-8 too. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment new file mode 100644 index 000000000..b5cf90ef0 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info 3" + date="2014-03-19T16:23:58Z" + content=""" +Also ghc doesn't seem to do any weird transformations with that string + + import System.Process + import qualified Data.ByteString as S + import qualified Data.ByteString.UTF8 as U + import GHC.IO.Handle + + files :: S.ByteString -> [S.ByteString] + files ps + | S.null ps = [] + | otherwise = case search ps of + Nothing -> [ps] + Just n -> S.take n ps : files (S.drop (n+1) ps) + where search = S.elemIndex 0 + + main = do + let prc = CreateProcess { + cmdspec = RawCommand \"git\" [\"--work-tree=D:\\antest\",\"ls-files\",\"--others\",\"-z\",\"--\",\"h\225\269ky.txt\"], + cwd = Nothing, + env = Nothing, + std_in = Inherit, + std_out = CreatePipe, + std_err = Inherit, + close_fds = False, + create_group = False } + (_,Just out,_,_) <- createProcess prc + hSetBinaryMode out True + str <- S.hGetContents out + print $ map U.toString $ files str + +prints correctly [\"h\225\269ky.txt\"] I don't think that FilesystemEncoding will do any good on windows, since git seems to use utf-8 instead of normal windows console encoding. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment new file mode 100644 index 000000000..2cd4b346e --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 8" + date="2014-03-19T19:57:00Z" + content=""" +Windows & haskell? I'd only be more surprised if spj wandered in here. ;) + +So, that works because you're using ByteStrings. But git-annex mostly does not use ByteStrings, and it would be a lot of work to switch to them everywhere it reads FilePaths from git. + +But it seems my test yesterday using `hSetEncoding h Encoding.utf8` went wrong somehow. That does work. git-annex can operate on the file with that change. +"""]] diff --git a/doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn b/doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn new file mode 100644 index 000000000..1fcaf80a9 --- /dev/null +++ b/doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +Every time git-annex launches (after a reboot). It prompts me to finish upgrade, even though the binary is not updated. (All my repos are set to not auto update and this happens on all my repos). + + +### What steps will reproduce the problem? + +Relaunching git-annex. + + +### What version of git-annex are you using? On what operating system? + +OS X 10.9 + +git-annex version: 5.20140419-g477c0c0 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> This seems to be a duplicate of this bug: [[Upgrade_impossible_om_Mac_OSX]]. Please follow up there with any details you can provide. --[[Joey]] +> [[dup|done]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn b/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn new file mode 100644 index 000000000..de0392eaa --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +When starting git-annex Version: 5.20140420-ga25b8bb Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash on My MBP running OSX 10.9.2 I get a notification about: An upgrade of git-annex is available. (version 5.20140421) + +I then click UPGRADE and then get this message: Internal Server Error Cannot find old distribution bundle; not upgrading. + +### What steps will reproduce the problem? +See problem description above, not sure what else to say. + +### What version of git-annex are you using? On what operating system? +See problem description above, not sure what else to say. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_10_8c1487635f724d017ebe2f8b7bc10e8d._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_10_8c1487635f724d017ebe2f8b7bc10e8d._comment new file mode 100644 index 000000000..13427f466 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_10_8c1487635f724d017ebe2f8b7bc10e8d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="OK" + date="2014-05-21T18:19:30Z" + content=""" +so I'll watch this behavior with future updates and reply if I have more info +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_1_84e52a4d1502fd622bdb25e04b459292._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_1_84e52a4d1502fd622bdb25e04b459292._comment new file mode 100644 index 000000000..6ddb5ef30 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_1_84e52a4d1502fd622bdb25e04b459292._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="fixed" + date="2014-05-09T13:12:59Z" + content=""" +re-downloaded the old version, re-isntalled and now it actually starts downlaoding the new version => http://screencast.com/t/id2Ng57Z9 + +NOT sure though, why it now uploads the new version to all repositories? i.e. box.com? IS there a reason for this? + +Transfers +git-annex.dmg (for upgrade)→box.com 42% of 22.52 MiB +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_2_f2b109f6cf92f101d7f0afeb91605240._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_2_f2b109f6cf92f101d7f0afeb91605240._comment new file mode 100644 index 000000000..9ed8dade9 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_2_f2b109f6cf92f101d7f0afeb91605240._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="spoke too soon" + date="2014-05-09T13:23:52Z" + content=""" +Stuck in a loop, now with every restart of git-annex it downloads the update and then uploads it to all my repositories again: +http://screencast.com/t/Ow7SlPVaS68 + +And then it says: + Finished upgrading git-annex to version 5.20140420-ga25b8bb +BUT that is the OLD version not the new one :-/ + +NEXT TRY: + +killed all processes of git and git-annex, restart. + +Was greeted by: + An upgrade of git-annex is available. +(version 5.20140421) + +Klicked the Upgrade button. +Nothing happens, except that the upgrade notice disappeared :-/ +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_3_df9b111aefea82b9d108495b79d7ffb4._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_3_df9b111aefea82b9d108495b79d7ffb4._comment new file mode 100644 index 000000000..32b067a97 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_3_df9b111aefea82b9d108495b79d7ffb4._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 3" + date="2014-05-09T13:28:38Z" + content=""" +here is what the log looks like: + +[2014-05-09 15:23:22 SAST] main: starting assistant version 5.20140420-ga25b8bb +(scanning...) [2014-05-09 15:23:23 SAST] Watcher: Performing startup scan +[2014-05-09 15:23:24 SAST] Upgrader: An upgrade of git-annex is available. (version 5.20140421) +(started...) [2014-05-09 15:25:10 SAST] main: warning git-annex has been shut down +[2014-05-09 15:25:31 SAST] main: starting assistant version 5.20140420-ga25b8bb +(scanning...) [2014-05-09 15:25:31 SAST] Watcher: Performing startup scan +[2014-05-09 15:25:32 SAST] Upgrader: An upgrade of git-annex is available. (version 5.20140421) +(started...) [2014-05-09 15:25:59 SAST] main: warning git-annex has been shut down + +[2014-05-09 15:27:14 SAST] main: starting assistant version 5.20140420-ga25b8bb +(scanning...) [2014-05-09 15:27:14 SAST] Watcher: Performing startup scan +[2014-05-09 15:27:15 SAST] Upgrader: An upgrade of git-annex is available. (version 5.20140421) +(started...) [2014-05-09 15:27:46 SAST] main: starting assistant version 5.20140420-ga25b8bb +(scanning...) [2014-05-09 15:27:46 SAST] Watcher: Performing startup scan +(started...) [2014-05-09 15:27:48 SAST] Upgrader: An upgrade of git-annex is available. (version 5.20140421) +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_4_e3b5bc815376383bbd1f312cc1c32a41._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_4_e3b5bc815376383bbd1f312cc1c32a41._comment new file mode 100644 index 000000000..e55d370d9 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_4_e3b5bc815376383bbd1f312cc1c32a41._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-05-16T17:36:10Z" + content=""" +\"Cannot find old distribution bundle; not upgrading\" + +This message means that git-annex was unable to find where the old version was installed, which it needs to do in order to replace it with the new version. It looks for a `git-annex.app` directory, and could not find one. How did you install the old version, and to what location? + +I think it might try to upload the dmg file to a repository if that repository is set as a full backup and so wants all files even ones not in the work tree. +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_5_cd9b77e6670840a9902f5be80e1e658a._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_5_cd9b77e6670840a9902f5be80e1e658a._comment new file mode 100644 index 000000000..8320e53a2 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_5_cd9b77e6670840a9902f5be80e1e658a._comment @@ -0,0 +1,87 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 5" + date="2014-05-16T17:45:48Z" + content=""" +I gave up on this. After doing this a few times, I stopped. Living in Africa, bandwidth is really expensive :-/ + +Initially I installed via the downloaded .dmg file. +After poking around a few times, I found a folder inside my Applications folder: + + ls -al /Applications/gi* + /Applications/git-annex.app: + total 0 + drwxr-xr-x@ 3 ovi admin 102 May 12 13:10 . + drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. + drwxr-xr-x 5 ovi admin 170 May 9 15:45 Contents + + /Applications/git-annex.app.5.20140421: + total 0 + drwxr-xr-x 2 ovi admin 68 May 11 11:26 . + drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. + +Every time I now open git-annex assistant I am greeted with: + + An upgrade of git-annex is available. + (version 5.20140421) + +I just did it again and it starts downloading again arrrghh! + + Transfers + git-annex.dmg (for upgrade)←web 12% of 22.52 MiB + +restarted the assistant and it now says: + + Finished upgrading git-annex to version 5.20140420-ga25b8bb + +Then I check and find this: + +ls -al /Applications/gi* +/Applications/git-annex.app: +total 0 +drwxr-xr-x@ 3 ovi admin 102 May 12 13:10 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. +drwxr-xr-x 5 ovi admin 170 May 9 15:45 Contents + +/Applications/git-annex.app.5.20140421: +total 0 +drwxr-xr-x 2 ovi admin 68 May 11 11:26 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. +shiny-2:~ ovi$ ls -al /Applications/gi* +/Applications/git-annex.app: +total 0 +drwxr-xr-x@ 3 ovi admin 102 May 12 13:10 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. +drwxr-xr-x 5 ovi admin 170 May 9 15:45 Contents + +/Applications/git-annex.app.5.20140421: +total 0 +drwxr-xr-x 2 ovi admin 68 May 11 11:26 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. + +LOL. restarting the assistant am greeted with click here to finish the upgrade. did so. + +now only 2 folders not 3 left: + +ls -al /Applications/gi* +/Applications/git-annex.app: +total 0 +drwxr-xr-x@ 3 ovi admin 102 May 12 13:10 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. +drwxr-xr-x 5 ovi admin 170 May 9 15:45 Contents + +/Applications/git-annex.app.5.20140421: +total 0 +drwxr-xr-x 2 ovi admin 68 May 11 11:26 . +drwxrwxr-x+ 155 root admin 5270 May 15 04:19 .. + +Started the asistant again, am greeted with: + + An upgrade of git-annex is available. +(version 5.20140421) + +Thank you very much... not going to downlaod it again... + +COULD YOU PLEASE JUST SHARE THE DOWNLOAD LINK TO THE NEWEST ONE? +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_6_4584393333d377532d8607b42319abd9._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_6_4584393333d377532d8607b42319abd9._comment new file mode 100644 index 000000000..023ccebfe --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_6_4584393333d377532d8607b42319abd9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="failed upgrade log file" + date="2014-05-16T17:55:34Z" + content=""" +Just in case it helps diagnose the problem: http://pastebin.com/PUpPRURb +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_7_d9d36ff62267dde98a27c5981951df7f._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_7_d9d36ff62267dde98a27c5981951df7f._comment new file mode 100644 index 000000000..b38502bf4 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_7_d9d36ff62267dde98a27c5981951df7f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 7" + date="2014-05-16T17:57:13Z" + content=""" +The repeated attempts to upgrade to 21 when it only downloads 20 are due to a different bug: [[bugs/git-annex_auto_upgrade_is_redundant]]. I've just put in a quick fix that should avoid that. + +However, for the purposes of this bug report, I'm interested in the original problem of \"Cannot find old distribution bundle; not upgrading\", and to fix that, I need to know how you originally installed git-annex. +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_8_5b26711c737eeb0b302060f098cb320b._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_8_5b26711c737eeb0b302060f098cb320b._comment new file mode 100644 index 000000000..b2cab6097 --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_8_5b26711c737eeb0b302060f098cb320b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 8" + date="2014-05-16T17:59:13Z" + content=""" +download 20.dmg, double clicked it, dragged it into my Applications folder. +"""]] diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_9_1bf050056dcac7c1e0f497ee6e87a95a._comment b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_9_1bf050056dcac7c1e0f497ee6e87a95a._comment new file mode 100644 index 000000000..245bdc56a --- /dev/null +++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX/comment_9_1bf050056dcac7c1e0f497ee6e87a95a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 9" + date="2014-05-21T17:28:16Z" + content=""" +I have adjusted the \"Cannot find old distribution bundle; not upgrading\" message to say where it looked, and failed to find the git-annex.app directory. + +I am going to have to moreinfo this, since without knowing where git-annex was installed to, I can't say why it failed to find a git-annex.app directory. +"""]] diff --git a/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn b/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn new file mode 100644 index 000000000..8c526ea62 --- /dev/null +++ b/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn @@ -0,0 +1,2 @@ +VFAT limits have been hit when the .git/annex/journal/ +directory gets a lot of stuff in it. See diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn new file mode 100644 index 000000000..270a69ecb --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. + +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +!warning + +Watcher crashed: addWatch: + +permission denied (Permission denied) + +[Restart Thread] + +:Performing startup scan + +In terminal Window 1: + +nex webapp < + +Detected a crippled filesystem. + +Enabling direct mode. + +Detected a filesystem without fifo support. + +Disabling ssh connection caching. + +### What steps will reproduce the problem? + +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +### What version of git-annex are you using? On what operating system? + +Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment new file mode 100644 index 000000000..0622a2439 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T18:42:32Z" + content=""" +You should have a `/storage/sdcard1/.git/annex/daemon.log` file. Please paste it here. +"""]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment new file mode 100644 index 000000000..0ea47dc40 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="/storage/sdcard1/.git/annex/daemon.log" + date="2013-07-30T23:11:29Z" + content=""" + [2013-07-30 23:17:43 BST] main: starting assistant version 4.20130723-ged05a63 + (scanning...) [2013-07-30 23:17:44 BST] Watcher: Performing startup scan + Watcher crashed: addWatch: permission denied (Permission denied) + [2013-07-30 23:17:45 BST] Watcher: warning Watcher crashed: addWatch: permission denied (Permission denied) + [2013-07-30 23:17:45 BST] Committer: Adding 229286 229381 + add LOST.DIR/229286 (checksum...) ok + add LOST.DIR/229381 (checksum...) [2013-07-30 23:17:47 BST] Committer: Committing changes to git + [2013-07-30 23:20:22 BST] Committer: Adding git-annex..stall.log + ok + (Recording state in git...) + (Recording state in git...) + add git-annex-install.log (checksum...) ok + add git-annex-install.log (checksum...) [2013-07-30 23:20:22 BST] Committer: Committing changes to git +"""]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment new file mode 100644 index 000000000..9bc0c90e6 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-10T18:18:09Z" + content=""" +Seems to me this was probably fixed in [[!commit 6b37fcffd872b62fb78047a77e4cee5ab0bb57f1]]. + +However, I don't know why permission problems would happen on Android, which typically uses a filesystem that does not have restricted permissions for the sdcard. + +If you upgrade, you should be able to see if it fixed the crash, and it will also mention any file or directory that it's unable to read in the log. +"""]] diff --git a/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn b/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn new file mode 100644 index 000000000..da9bb4627 --- /dev/null +++ b/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn @@ -0,0 +1,15 @@ +What steps will reproduce the problem? + +From the webapp, go to Configuration > Manage repositories > Remote server. Enter a hostname that only has an IPv6 hostname (e.g. ipv6.google.com). Click Check this server. + +What is the expected output? What do you see instead? + +Expect the application to attempt to check the server via SSH. Instead, it results in error "cannot resolve host name". + +What version of git-annex are you using? On what operating system? + +git-annex 3.20120924 on Debian testing (amd64). + +Please provide any additional information below. + +> Thanks, [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Weird_directories_appearing.mdwn b/doc/bugs/Weird_directories_appearing.mdwn new file mode 100644 index 000000000..ea85cead6 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing.mdwn @@ -0,0 +1,82 @@ +Hello! + +Can someone explain this behavior to me? System is ArchLinux with the newest prebuilt tarballs as of Jan 12th. + + ~ % mkdir GA1 + ~ % cd GA1 + ~/GA1 % git init + Initialized empty Git repository in /home/florian/GA1/.git/ + ~/GA1 (git)-[master] % git annex init + init ok + (Recording state in git...) + ~/GA1 (git)-[master] % echo "GA1" > testfile + ~/GA1 (git)-[master] % git annex add . + add testfile ok + (Recording state in git...) + ~/GA1 (git)-[master] % git annex sync + commit ok + ~/GA1 (git)-[master] % cd .. + + ~ % git clone GA1 GA2 + Cloning into 'GA2'... + done. + ~ % cd GA2 + ~/GA2 (git)-[master] % git annex init + init ok + (Recording state in git...) + ~/GA2 (git)-[master] % git annex get . + get testfile (merging origin/git-annex into git-annex...) + (Recording state in git...) + (from origin...) ok + (Recording state in git...) + ~/GA2 (git)-[master] % git annex unlock testfile + unlock testfile (copying...) ok + ~/GA2 (git)-[master] % echo "GA2" > testfile + commit ok + pull origin + ok + push origin + Counting objects: 27, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (16/16), done. + Writing objects: 100% (20/20), 1.88 KiB | 0 bytes/s, done. + Total 20 (delta 2), reused 0 (delta 0) + To /home/florian/GA1 + f0654aa..8d0bdf9 master -> synced/master + * [new branch] git-annex -> synced/git-annex + ok + ~/GA2 (git)-[master] % cd ../GA1 + + ~/GA1 (git)-[master] % git annex sync + (merging synced/git-annex into git-annex...) + commit ok + merge synced/master + Updating f0654aa..8d0bdf9 + Fast-forward + e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log | 1 + + testfile | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + create mode 100644 e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log + ok + + ~/GA1 (git)-[master] % ll + total 4 + drwxr-x--- 1 florian florian 6 Jan 12 13:59 e6a/ + lrwxrwxrwx 1 florian florian 178 Jan 12 13:59 testfile -> .git/annex/objects/V6/ZM/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c + + ~/GA1 (git)-[master] % cat e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log + 1389531554.951523s 1 dedf9799-0131-4773-8939-8f76294fa8e9 + +Where does the e6a directory comes from? I don't suspect a bug there, but in my conception of git-annex. + +Thanks! +Florian + +> [[fixed|done]] +> +> I know someone reported this a looong time ago (years), and I cannot find +> that bug report. Probably I closed it because I was unable to find a way +> to reproduce it. +> +> The spurious log files can be safely removed from your working tree. +> --[[Joey]] diff --git a/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment b/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment new file mode 100644 index 000000000..d578c46ef --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-13T18:57:48Z" + content=""" +The log file is supposed to be stored by git-annex in the git-annex branch of the git repository. I don't know how it could end up being committed to the master branch instead. + +Can you run these same commands again and reproduce the problem? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment b/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment new file mode 100644 index 000000000..adeb97d7b --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 2" + date="2014-01-14T12:12:52Z" + content=""" +Yes, I can always reproduce it with running \"sh test_ga.sh\" with test_ga.sh being: + + set -x + + mkdir GA1 + cd GA1 + git init + git annex init \"GA1\" + echo \"GA1\" > testfile + git annex add . + git annex sync + cd .. + + git clone GA1 GA2 + cd GA2 + git annex init \"GA2\" + git annex get . + cat testfile + git annex unlock testfile + echo \"GA2\" > testfile + git annex sync + cd ../GA1 + + git annex sync + cd .. + +which gives: + + florian@horus ~/test % ll GA1 + insgesamt 4 + drwxr-x--- 1 florian florian 6 14. Jan 13:07 e6a/ + lrwxrwxrwx 1 florian florian 178 14. Jan 13:07 testfile -> .git/annex/objects/V6/ZM/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c + +with testfile being a dead link. Complete output of the script is at http://pastebin.com/VktWAp2V + +I would be glad to help furthermore. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment b/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment new file mode 100644 index 000000000..fcc9a4ab1 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 3" + date="2014-01-14T18:55:11Z" + content=""" +This script does not produce the problem for me. How did you install git-annex from the tarball? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment b/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment new file mode 100644 index 000000000..9d99f91f5 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-14T19:00:33Z" + content=""" +Actually, I was able to reproduce this using the standalone tarball and runshell. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment b/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment new file mode 100644 index 000000000..f61b61155 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 5" + date="2014-01-14T19:14:35Z" + content=""" +Analysis: pre-commit hook is run with `GIT_INDEX_FILE=.git/index.lock`; this seems to be causing git-annex branch commits to land in that index file instead of where they are supposed to go. Also, commits of the files in the work tree also end up adding the symlinks to the git-annex branch when this happens. Apparantly because again it's using the wrong index file when committing to the git-annex branch. + +So, an easy workaround (disable pre-commit hook or make it `unset GIT_INDEX_FILE`, but I need to dig into why this env var is messing with git-annex like this.. I thought git-annex set the env var itself! +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment b/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment new file mode 100644 index 000000000..c7dc6c274 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 6" + date="2014-01-14T19:16:15Z" + content=""" +Problem is that git-annex prepends `GIT_INDEX_FILE` to the environment; it does not overwrite it. So environment ends up with 2 copies of the var, and which will be used is undefined. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment b/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment new file mode 100644 index 000000000..3ca131f5d --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 7" + date="2014-01-14T19:33:28Z" + content=""" +I have fixed this in git. I will be moving this thread from the forum to the bug report tracker. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment b/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment new file mode 100644 index 000000000..69a78cfca --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 8" + date="2014-01-14T21:15:51Z" + content=""" +Wow, thanks a lot! The fix will be included in the next release of the tarballs? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment b/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment new file mode 100644 index 000000000..a6aaf9517 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 9" + date="2014-01-14T21:17:16Z" + content=""" +It will be included in the next build of the daily built tarballs. Within an hour of now. +"""]] diff --git a/doc/bugs/Windows_build_test_failures.mdwn b/doc/bugs/Windows_build_test_failures.mdwn new file mode 100644 index 000000000..ac4dce13c --- /dev/null +++ b/doc/bugs/Windows_build_test_failures.mdwn @@ -0,0 +1,1232 @@ +Given that others can build+run OK I wonder if this is a build environment setup problem rather than a code issue. +This might be two bugs, but I rather suspect the fix to one is the fix to the other. + +### Please describe the problem. +Some tests fail with: +ssh: Could not resolve hostname C: no address associated with name + +then if you try and do a copy to/from an ssh remote then it fails with simply 'copy: 1 failed' + +### What steps will reproduce the problem? + +For the tests, simply sh standalone/windows/build.sh + +For the other, I'm using a modified version of the other windows user's script, the set -x'd output is: + +
++ git-annex version
+git-annex version: 4.20130621-g36258de^M
+build flags: Pairing Testsuite S3 WebDAV DNS^M
++ ssh gitremote sh testrepo.sh
+git-annex version: 4.20130621-g36258de
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS
+Initialized empty Git repository in /media/backup/git/repo.git/
+init origin ok
+(Recording state in git...)
+commit
+ok
+git-annex: no branch is checked out
++ rm -rf repo
++ git init repo
+Initialized empty Git repository in c:/Users/Oliver/repo/.git/
++ cd repo
++ git-annex init
+init  ^M
+  Detected a crippled filesystem.^M
+^M
+  Enabling direct mode.^M
+^M
+  Detected a filesystem without fifo support.^M
+^M
+  Disabling ssh connection caching.^M
+ok^M
+(Recording state in git...)^M
++ git remote add origin ssh://git@remote/~/repo.git
++ echo hello
++ git-annex add .
+add foo.txt (checksum...) ok^M
+(Recording state in git...)^M
++ git commit -m .
+[master (root-commit) f34a076] .
+ 1 file changed, 1 insertion(+)
+ create mode 120000 foo.txt
++ git-annex sync
+commit  ^M
+ok^M
+pull origin warning: no common commits
+From ssh://remote/~/repo
+ * [new branch]      git-annex  -> origin/git-annex
+^M
+ok^M
+(merging origin/git-annex into git-annex...)^M
+(Recording state in git...)^M
+push origin To ssh://git@remote/~/repo.git
+ * [new branch]      git-annex -> synced/git-annex
+ * [new branch]      master -> synced/master
+^M
+ok^M
++ git-annex copy --to origin
+copy foo.txt (checking origin...) (to origin...) ^M
+failed^M
+git-annex.exe: copy: 1 failed
+
+ + + + + +### What version of git-annex are you using? On what operating system? +Windows (8 x64): +git-annex version: 4.20130621-g36258de +build flags: Pairing Testsuite S3 WebDAV DNS +Linux (debian wheezy i386): +git-annex version: 4.20130621-g36258de +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +other versions +git-bash: git(1.8.0.msysgit.0),ssh(ssh 4.6p1, ssl 0.9.8e 23 feb 2007) +msys: git(none) ssh(ssh 5.4p1, ssl 1.0.0 29 Mar 2010) +cygwin: git(1.7.9) ssh(none) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +build.log: ++ set -e ++ HP='/c/Program Files (x86)/Haskell Platform/2012.4.0.0' ++ FLAGS='-Webapp -Assistant -XMPP' ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin' ++ rm -f git-annex-installer.exe ++ cabal update +Downloading the latest package list from hackage.haskell.org ++ rm -rf MissingH-1.2.0.0 ++ cabal unpack MissingH +Unpacking to MissingH-1.2.0.0\ ++ cd MissingH-1.2.0.0 ++ withcyg patch -p1 ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ patch -p1 +patching file src/System/IO/WindowsCompat.hs +Hunk #1 succeeded at 119 (offset -1 lines). +Hunk #2 succeeded at 132 (offset -1 lines). ++ cabal install +Resolving dependencies... +In order, the following would be installed: +MissingH-1.2.0.0 (reinstall) +cabal.exe: The following packages are likely to be broken by the reinstalls: +hS3-0.5.7 +Use --force-reinstalls if you want to install anyway. ++ true ++ cd .. ++ cabal install --only-dependencies '-f-Webapp -Assistant -XMPP' +Resolving dependencies... +All the requested packages are already installed: +Use --reinstall if you want to reinstall anyway. ++ '[' -e last-incremental-failed ']' ++ touch last-incremental-failed ++ withcyg cabal configure '-f-Webapp -Assistant -XMPP' ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ cabal configure '-f-Webapp -Assistant -XMPP' +Resolving dependencies... +[ 1 of 24] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\setup\Utility\Applicative.o ) +[ 2 of 24] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\setup\Utility\PartialPrelude.o ) +[ 3 of 24] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\setup\Utility\FileSystemEncoding.o ) +[ 4 of 24] Compiling Utility.Exception ( Utility\Exception.hs, dist\setup\Utility\Exception.o ) +[ 5 of 24] Compiling Utility.Misc ( Utility\Misc.hs, dist\setup\Utility\Misc.o ) +[ 6 of 24] Compiling Utility.Process ( Utility\Process.hs, dist\setup\Utility\Process.o ) +[ 7 of 24] Compiling Utility.Env ( Utility\Env.hs, dist\setup\Utility\Env.o ) +[ 8 of 24] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\setup\Utility\UserInfo.o ) +[ 9 of 24] Compiling Utility.OSX ( Utility\OSX.hs, dist\setup\Utility\OSX.o ) +[10 of 24] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\setup\Utility\Tmp.o ) +[11 of 24] Compiling Utility.Monad ( Utility\Monad.hs, dist\setup\Utility\Monad.o ) +[12 of 24] Compiling Utility.Path ( Utility\Path.hs, dist\setup\Utility\Path.o ) +[13 of 24] Compiling Utility.FreeDesktop ( Utility\FreeDesktop.hs, dist\setup\Utility\FreeDesktop.o ) +[16 of 24] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\setup\Utility\SafeCommand.o ) +[17 of 24] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\setup\Utility\ExternalSHA.o ) +[18 of 24] Compiling Utility.Directory ( Utility\Directory.hs, dist\setup\Utility\Directory.o ) +Linking .\dist\setup\setup.exe ... + checking version... 4.20130621-g36258de + checking git... yes + checking git version... 1.7.9 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... no + checking xargs -0... yes + checking rsync... yes + checking curl... no + checking wget... yes + checking bup... no + checking gpg... not available + checking lsof... not available + checking ssh connection caching... no + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum +Configuring git-annex-4.20130601... ++ withcyg cabal build ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ cabal build +Building git-annex-4.20130601... +Preprocessing executable 'git-annex' for git-annex-4.20130601... +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +Touch.hsc: In function 'main': +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +In file included from Mounts.hsc:23:0: +Utility/libmounts.h:17:3: warning: #warning mounts listing code not available for this OS + +Utility\libdiskfree.c:36:3: + warning: #warning free space checking code not available for this OS + +In file included from Utility\libmounts.c:35:0: + +Utility\libmounts.h:17:3: + warning: #warning mounts listing code not available for this OS +[ 1 of 217] Compiling Utility.Dot ( Utility\Dot.hs, dist\build\git-annex\git-annex-tmp\Utility\Dot.o ) +[ 2 of 217] Compiling BuildFlags ( BuildFlags.hs, dist\build\git-annex\git-annex-tmp\BuildFlags.o ) +[ 3 of 217] Compiling Utility.Percentage ( Utility\Percentage.hs, dist\build\git-annex\git-annex-tmp\Utility\Percentage.o ) +[ 4 of 217] Compiling Utility.Base64 ( Utility\Base64.hs, dist\build\git-annex\git-annex-tmp\Utility\Base64.o ) +[ 5 of 217] Compiling Utility.JSONStream ( Utility\JSONStream.hs, dist\build\git-annex\git-annex-tmp\Utility\JSONStream.o ) +[ 6 of 217] Compiling Git.Types ( Git\Types.hs, dist\build\git-annex\git-annex-tmp\Git\Types.o ) +[ 7 of 217] Compiling Utility.DataUnits ( Utility\DataUnits.hs, dist\build\git-annex\git-annex-tmp\Utility\DataUnits.o ) +[ 8 of 217] Compiling Types.FileMatcher ( Types\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Types\FileMatcher.o ) +[ 9 of 217] Compiling Types.BranchState ( Types\BranchState.hs, dist\build\git-annex\git-annex-tmp\Types\BranchState.o ) +[ 10 of 217] Compiling Messages.JSON ( Messages\JSON.hs, dist\build\git-annex\git-annex-tmp\Messages\JSON.o ) +[ 11 of 217] Compiling Types.UUID ( Types\UUID.hs, dist\build\git-annex\git-annex-tmp\Types\UUID.o ) +[ 12 of 217] Compiling Types.Group ( Types\Group.hs, dist\build\git-annex\git-annex-tmp\Types\Group.o ) +[ 13 of 217] Compiling Utility.Shell ( Utility\Shell.hs, dist\build\git-annex\git-annex-tmp\Utility\Shell.o ) +[ 14 of 217] Compiling Utility.QuickCheck ( Utility\QuickCheck.hs, dist\build\git-annex\git-annex-tmp\Utility\QuickCheck.o ) +[ 15 of 217] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\build\git-annex\git-annex-tmp\Utility\PartialPrelude.o ) +[ 16 of 217] Compiling Utility.HumanTime ( Utility\HumanTime.hs, dist\build\git-annex\git-annex-tmp\Utility\HumanTime.o ) +[ 17 of 217] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\build\git-annex\git-annex-tmp\Utility\FileSystemEncoding.o ) +[ 18 of 217] Compiling Utility.Touch ( dist\build\git-annex\git-annex-tmp\Utility\Touch.hs, dist\build\git-annex\git-annex-tmp\Utility\Touch.o ) + +UtilityTouch.hsc:17:1: Warning: + The import of `Utility.FileSystemEncoding' is redundant + except perhaps to import instances from `Utility.FileSystemEncoding' + To import instances alone, use: import Utility.FileSystemEncoding() + +UtilityTouch.hsc:19:1: Warning: + The import of `Foreign' is redundant + except perhaps to import instances from `Foreign' + To import instances alone, use: import Foreign() + +UtilityTouch.hsc:21:1: Warning: + The import of `Control.Monad' is redundant + except perhaps to import instances from `Control.Monad' + To import instances alone, use: import Control.Monad() +[ 19 of 217] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\build\git-annex\git-annex-tmp\Utility\Applicative.o ) +[ 20 of 217] Compiling Utility.Monad ( Utility\Monad.hs, dist\build\git-annex\git-annex-tmp\Utility\Monad.o ) +[ 21 of 217] Compiling Utility.Exception ( Utility\Exception.hs, dist\build\git-annex\git-annex-tmp\Utility\Exception.o ) +[ 22 of 217] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\build\git-annex\git-annex-tmp\Utility\Tmp.o ) +[ 23 of 217] Compiling Utility.Env ( Utility\Env.hs, dist\build\git-annex\git-annex-tmp\Utility\Env.o ) +[ 24 of 217] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\build\git-annex\git-annex-tmp\Utility\UserInfo.o ) +[ 25 of 217] Compiling Utility.Misc ( Utility\Misc.hs, dist\build\git-annex\git-annex-tmp\Utility\Misc.o ) + +Utility\Misc.hs:22:1: Warning: + The import of `Utility.Exception' is redundant + except perhaps to import instances from `Utility.Exception' + To import instances alone, use: import Utility.Exception() +[ 26 of 217] Compiling Utility.Process ( Utility\Process.hs, dist\build\git-annex\git-annex-tmp\Utility\Process.o ) + +Utility\Process.hs:44:1: Warning: + The import of `Data.Maybe' is redundant + except perhaps to import instances from `Data.Maybe' + To import instances alone, use: import Data.Maybe() +[ 27 of 217] Compiling Utility.Network ( Utility\Network.hs, dist\build\git-annex\git-annex-tmp\Utility\Network.o ) +[ 28 of 217] Compiling Utility.Verifiable ( Utility\Verifiable.hs, dist\build\git-annex\git-annex-tmp\Utility\Verifiable.o ) +[ 29 of 217] Compiling Utility.Format ( Utility\Format.hs, dist\build\git-annex\git-annex-tmp\Utility\Format.o ) +[ 30 of 217] Compiling Build.SysConfig ( Build\SysConfig.hs, dist\build\git-annex\git-annex-tmp\Build\SysConfig.o ) +[ 31 of 217] Compiling Utility.Path ( Utility\Path.hs, dist\build\git-annex\git-annex-tmp\Utility\Path.o ) +[ 32 of 217] Compiling Config.Cost ( Config\Cost.hs, dist\build\git-annex\git-annex-tmp\Config\Cost.o ) +[ 33 of 217] Compiling Types.Messages ( Types\Messages.hs, dist\build\git-annex\git-annex-tmp\Types\Messages.o ) +[ 34 of 217] Compiling Types.TrustLevel ( Types\TrustLevel.hs, dist\build\git-annex\git-annex-tmp\Types\TrustLevel.o ) +[ 35 of 217] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\build\git-annex\git-annex-tmp\Utility\SafeCommand.o ) +[ 36 of 217] Compiling Utility.Directory ( Utility\Directory.hs, dist\build\git-annex\git-annex-tmp\Utility\Directory.o ) +[ 37 of 217] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\build\git-annex\git-annex-tmp\Utility\ExternalSHA.o ) +[ 38 of 217] Compiling Common ( Common.hs, dist\build\git-annex\git-annex-tmp\Common.o ) +[ 39 of 217] Compiling Git.Filename ( Git\Filename.hs, dist\build\git-annex\git-annex-tmp\Git\Filename.o ) +[ 40 of 217] Compiling Logs.UUIDBased ( Logs\UUIDBased.hs, dist\build\git-annex\git-annex-tmp\Logs\UUIDBased.o ) +[ 41 of 217] Compiling Types.Key ( Types\Key.hs, dist\build\git-annex\git-annex-tmp\Types\Key.o ) +[ 42 of 217] Compiling Utility.FileMode ( Utility\FileMode.hs, dist\build\git-annex\git-annex-tmp\Utility\FileMode.o ) +[ 43 of 217] Compiling Git ( Git.hs, dist\build\git-annex\git-annex-tmp\Git.o ) + +Git.hs:41:1: Warning: + The import of `Utility.FileMode' is redundant + except perhaps to import instances from `Utility.FileMode' + To import instances alone, use: import Utility.FileMode() +[ 44 of 217] Compiling Utility.InodeCache ( Utility\InodeCache.hs, dist\build\git-annex\git-annex-tmp\Utility\InodeCache.o ) +[ 45 of 217] Compiling Types.KeySource ( Types\KeySource.hs, dist\build\git-annex\git-annex-tmp\Types\KeySource.o ) +[ 46 of 217] Compiling Types.Backend ( Types\Backend.hs, dist\build\git-annex\git-annex-tmp\Types\Backend.o ) +[ 47 of 217] Compiling Utility.Gpg ( Utility\Gpg.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg.o ) + +Utility\Gpg.hs:12:1: Warning: + The import of `System.Posix.Types' is redundant + except perhaps to import instances from `System.Posix.Types' + To import instances alone, use: import System.Posix.Types() + +Utility\Gpg.hs:14:1: Warning: + The import of `Control.Concurrent' is redundant + except perhaps to import instances from `Control.Concurrent' + To import instances alone, use: import Control.Concurrent() + +Utility\Gpg.hs:15:1: Warning: + The import of `Control.Exception' is redundant + except perhaps to import instances from `Control.Exception' + To import instances alone, use: import Control.Exception() + +Utility\Gpg.hs:16:1: Warning: + The import of `System.Path' is redundant + except perhaps to import instances from `System.Path' + To import instances alone, use: import System.Path() + +Utility\Gpg.hs:19:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() +[ 48 of 217] Compiling Types.Crypto ( Types\Crypto.hs, dist\build\git-annex\git-annex-tmp\Types\Crypto.o ) +[ 49 of 217] Compiling Utility.Matcher ( Utility\Matcher.hs, dist\build\git-annex\git-annex-tmp\Utility\Matcher.o ) +[ 50 of 217] Compiling Utility.Metered ( Utility\Metered.hs, dist\build\git-annex\git-annex-tmp\Utility\Metered.o ) +[ 51 of 217] Compiling Git.FilePath ( Git\FilePath.hs, dist\build\git-annex\git-annex-tmp\Git\FilePath.o ) +[ 52 of 217] Compiling Git.Url ( Git\Url.hs, dist\build\git-annex\git-annex-tmp\Git\Url.o ) +[ 53 of 217] Compiling Git.Construct ( Git\Construct.hs, dist\build\git-annex\git-annex-tmp\Git\Construct.o ) +[ 54 of 217] Compiling Git.Config ( Git\Config.hs, dist\build\git-annex\git-annex-tmp\Git\Config.o ) +[ 55 of 217] Compiling Git.CurrentRepo ( Git\CurrentRepo.hs, dist\build\git-annex\git-annex-tmp\Git\CurrentRepo.o ) + +Git\CurrentRepo.hs:16:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() + +Git\CurrentRepo.hs:43:17: Warning: Defined but not used: `s' +[ 56 of 217] Compiling Git.SharedRepository ( Git\SharedRepository.hs, dist\build\git-annex\git-annex-tmp\Git\SharedRepository.o ) +[ 57 of 217] Compiling Types.GitConfig ( Types\GitConfig.hs, dist\build\git-annex\git-annex-tmp\Types\GitConfig.o ) +[ 58 of 217] Compiling Types.Remote ( Types\Remote.hs, dist\build\git-annex\git-annex-tmp\Types\Remote.o ) +[ 59 of 217] Compiling Types.StandardGroups ( Types\StandardGroups.hs, dist\build\git-annex\git-annex-tmp\Types\StandardGroups.o ) +[ 60 of 217] Compiling Utility.Gpg.Types ( Utility\Gpg\Types.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg\Types.o ) +[ 61 of 217] Compiling Git.Sha ( Git\Sha.hs, dist\build\git-annex\git-annex-tmp\Git\Sha.o ) +[ 62 of 217] Compiling Utility.CoProcess ( Utility\CoProcess.hs, dist\build\git-annex\git-annex-tmp\Utility\CoProcess.o ) +[ 63 of 217] Compiling Git.Command ( Git\Command.hs, dist\build\git-annex\git-annex-tmp\Git\Command.o ) +[ 64 of 217] Compiling Git.LsFiles ( Git\LsFiles.hs, dist\build\git-annex\git-annex-tmp\Git\LsFiles.o ) +[ 65 of 217] Compiling Git.CatFile ( Git\CatFile.hs, dist\build\git-annex\git-annex-tmp\Git\CatFile.o ) +[ 66 of 217] Compiling Git.UpdateIndex ( Git\UpdateIndex.hs, dist\build\git-annex\git-annex-tmp\Git\UpdateIndex.o ) +[ 67 of 217] Compiling Git.Queue ( Git\Queue.hs, dist\build\git-annex\git-annex-tmp\Git\Queue.o ) +[ 68 of 217] Compiling Git.Version ( Git\Version.hs, dist\build\git-annex\git-annex-tmp\Git\Version.o ) +[ 69 of 217] Compiling Git.CheckAttr ( Git\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Git\CheckAttr.o ) +[ 70 of 217] Compiling Annex ( Annex.hs, dist\build\git-annex\git-annex-tmp\Annex.o ) +[ 71 of 217] Compiling Types.Option ( Types\Option.hs, dist\build\git-annex\git-annex-tmp\Types\Option.o ) +[ 72 of 217] Compiling Types ( Types.hs, dist\build\git-annex\git-annex-tmp\Types.o ) +[ 73 of 217] Compiling Locations ( Locations.hs, dist\build\git-annex\git-annex-tmp\Locations.o ) +[ 74 of 217] Compiling Messages ( Messages.hs, dist\build\git-annex\git-annex-tmp\Messages.o ) +[ 75 of 217] Compiling Common.Annex ( Common\Annex.hs, dist\build\git-annex\git-annex-tmp\Common\Annex.o ) +[ 76 of 217] Compiling Crypto ( Crypto.hs, dist\build\git-annex\git-annex-tmp\Crypto.o ) +[ 77 of 217] Compiling Annex.CatFile ( Annex\CatFile.hs, dist\build\git-annex\git-annex-tmp\Annex\CatFile.o ) +[ 78 of 217] Compiling Backend.SHA ( Backend\SHA.hs, dist\build\git-annex\git-annex-tmp\Backend\SHA.o ) +[ 79 of 217] Compiling Backend.WORM ( Backend\WORM.hs, dist\build\git-annex\git-annex-tmp\Backend\WORM.o ) +[ 80 of 217] Compiling Backend.URL ( Backend\URL.hs, dist\build\git-annex\git-annex-tmp\Backend\URL.o ) +[ 81 of 217] Compiling Annex.Exception ( Annex\Exception.hs, dist\build\git-annex\git-annex-tmp\Annex\Exception.o ) +[ 82 of 217] Compiling Remote.Helper.Special ( Remote\Helper\Special.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Special.o ) +[ 83 of 217] Compiling Remote.Helper.Chunked ( Remote\Helper\Chunked.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Chunked.o ) +[ 84 of 217] Compiling Annex.Environment ( Annex\Environment.hs, dist\build\git-annex\git-annex-tmp\Annex\Environment.o ) + +Annex\Environment.hs:13:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() + +Annex\Environment.hs:14:1: Warning: + The import of `Utility.UserInfo' is redundant + except perhaps to import instances from `Utility.UserInfo' + To import instances alone, use: import Utility.UserInfo() +[ 85 of 217] Compiling Types.Command ( Types\Command.hs, dist\build\git-annex\git-annex-tmp\Types\Command.o ) +[ 86 of 217] Compiling Usage ( Usage.hs, dist\build\git-annex\git-annex-tmp\Usage.o ) +[ 87 of 217] Compiling Annex.Queue ( Annex\Queue.hs, dist\build\git-annex\git-annex-tmp\Annex\Queue.o ) +[ 88 of 217] Compiling Annex.BranchState ( Annex\BranchState.hs, dist\build\git-annex\git-annex-tmp\Annex\BranchState.o ) +[ 89 of 217] Compiling Remote.Helper.Encryptable ( Remote\Helper\Encryptable.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Encryptable.o ) +[ 90 of 217] Compiling Fields ( Fields.hs, dist\build\git-annex\git-annex-tmp\Fields.o ) +[ 91 of 217] Compiling Annex.CheckAttr ( Annex\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Annex\CheckAttr.o ) +[ 92 of 217] Compiling Git.HashObject ( Git\HashObject.hs, dist\build\git-annex\git-annex-tmp\Git\HashObject.o ) +[ 93 of 217] Compiling Annex.Link ( Annex\Link.hs, dist\build\git-annex\git-annex-tmp\Annex\Link.o ) +[ 94 of 217] Compiling Utility.CopyFile ( Utility\CopyFile.hs, dist\build\git-annex\git-annex-tmp\Utility\CopyFile.o ) +[ 95 of 217] Compiling Git.Ref ( Git\Ref.hs, dist\build\git-annex\git-annex-tmp\Git\Ref.o ) +[ 96 of 217] Compiling Git.Branch ( Git\Branch.hs, dist\build\git-annex\git-annex-tmp\Git\Branch.o ) +[ 97 of 217] Compiling Git.UnionMerge ( Git\UnionMerge.hs, dist\build\git-annex\git-annex-tmp\Git\UnionMerge.o ) +[ 98 of 217] Compiling Git.Merge ( Git\Merge.hs, dist\build\git-annex\git-annex-tmp\Git\Merge.o ) +[ 99 of 217] Compiling Git.DiffTree ( Git\DiffTree.hs, dist\build\git-annex\git-annex-tmp\Git\DiffTree.o ) +[100 of 217] Compiling Utility.DiskFree ( Utility\DiskFree.hs, dist\build\git-annex\git-annex-tmp\Utility\DiskFree.o ) +[101 of 217] Compiling Utility.Url ( Utility\Url.hs, dist\build\git-annex\git-annex-tmp\Utility\Url.o ) +[102 of 217] Compiling Utility.Rsync ( Utility\Rsync.hs, dist\build\git-annex\git-annex-tmp\Utility\Rsync.o ) +[103 of 217] Compiling Utility.LogFile ( Utility\LogFile.hs, dist\build\git-annex\git-annex-tmp\Utility\LogFile.o ) + +Utility\LogFile.hs:67:1: Warning: + Top-level binding with no type signature: + redir :: forall t t1 t2. t -> t1 -> t2 +[104 of 217] Compiling Utility.Daemon ( Utility\Daemon.hs, dist\build\git-annex\git-annex-tmp\Utility\Daemon.o ) + +Utility\Daemon.hs:13:1: Warning: + The import of `Utility.LogFile' is redundant + except perhaps to import instances from `Utility.LogFile' + To import instances alone, use: import Utility.LogFile() + +Utility\Daemon.hs:19:1: Warning: + The import of `System.Posix.Types' is redundant + except perhaps to import instances from `System.Posix.Types' + To import instances alone, use: import System.Posix.Types() +[105 of 217] Compiling Git.AutoCorrect ( Git\AutoCorrect.hs, dist\build\git-annex\git-annex-tmp\Git\AutoCorrect.o ) +[106 of 217] Compiling Utility.ThreadScheduler ( Utility\ThreadScheduler.hs, dist\build\git-annex\git-annex-tmp\Utility\ThreadScheduler.o ) +[107 of 217] Compiling Git.LsTree ( Git\LsTree.hs, dist\build\git-annex\git-annex-tmp\Git\LsTree.o ) +[108 of 217] Compiling Config ( Config.hs, dist\build\git-annex\git-annex-tmp\Config.o ) +[109 of 217] Compiling Annex.UUID ( Annex\UUID.hs, dist\build\git-annex\git-annex-tmp\Annex\UUID.o ) +[110 of 217] Compiling Backend ( Backend.hs, dist\build\git-annex\git-annex-tmp\Backend.o ) +[111 of 217] Compiling Annex.Version ( Annex\Version.hs, dist\build\git-annex\git-annex-tmp\Annex\Version.o ) +[112 of 217] Compiling Annex.Perms ( Annex\Perms.hs, dist\build\git-annex\git-annex-tmp\Annex\Perms.o ) +[113 of 217] Compiling Logs.Transfer ( Logs\Transfer.hs, dist\build\git-annex\git-annex-tmp\Logs\Transfer.o ) + +Logs\Transfer.hs:126:20: Warning: Defined but not used: `mode' + +Logs\Transfer.hs:146:29: Warning: Defined but not used: `fd' +[114 of 217] Compiling Annex.ReplaceFile ( Annex\ReplaceFile.hs, dist\build\git-annex\git-annex-tmp\Annex\ReplaceFile.o ) +[115 of 217] Compiling Annex.Journal ( Annex\Journal.hs, dist\build\git-annex\git-annex-tmp\Annex\Journal.o ) + +Annex\Journal.hs:89:23: Warning: Defined but not used: `mode' +[116 of 217] Compiling Annex.Branch ( Annex\Branch.hs, dist\build\git-annex\git-annex-tmp\Annex\Branch.o ) +[117 of 217] Compiling Logs.Remote ( Logs\Remote.hs, dist\build\git-annex\git-annex-tmp\Logs\Remote.o ) +[118 of 217] Compiling Logs.Presence ( Logs\Presence.hs, dist\build\git-annex\git-annex-tmp\Logs\Presence.o ) +[119 of 217] Compiling Logs.UUID ( Logs\UUID.hs, dist\build\git-annex\git-annex-tmp\Logs\UUID.o ) +[120 of 217] Compiling Logs.Location ( Logs\Location.hs, dist\build\git-annex\git-annex-tmp\Logs\Location.o ) +[121 of 217] Compiling Annex.Content.Direct ( Annex\Content\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Content\Direct.o ) +[122 of 217] Compiling Annex.Content ( Annex\Content.hs, dist\build\git-annex\git-annex-tmp\Annex\Content.o ) + +Annex\Content.hs:50:1: Warning: + The import of `Annex.Exception' is redundant + except perhaps to import instances from `Annex.Exception' + To import instances alone, use: import Annex.Exception() + +Annex\Content.hs:89:21: Warning: Defined but not used: `f' + +Annex\Content.hs:96:21: Warning: Defined but not used: `h' + +Annex\Content.hs:106:9: Warning: Defined but not used: `is_locked' + +Annex\Content.hs:113:13: Warning: Defined but not used: `key' +[123 of 217] Compiling Annex.Direct ( Annex\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Direct.o ) +[124 of 217] Compiling Init ( Init.hs, dist\build\git-annex\git-annex-tmp\Init.o ) + +Init.hs:29:1: Warning: + The import of `Utility.UserInfo' is redundant + except perhaps to import instances from `Utility.UserInfo' + To import instances alone, use: import Utility.UserInfo() + +Init.hs:31:1: Warning: + The import of `Utility.FileMode' is redundant + except perhaps to import instances from `Utility.FileMode' + To import instances alone, use: import Utility.FileMode() +[125 of 217] Compiling Logs.Web ( Logs\Web.hs, dist\build\git-annex\git-annex-tmp\Logs\Web.o ) +[126 of 217] Compiling Logs.Group ( Logs\Group.hs, dist\build\git-annex\git-annex-tmp\Logs\Group.o ) +[127 of 217] Compiling Upgrade.V2 ( Upgrade\V2.hs, dist\build\git-annex\git-annex-tmp\Upgrade\V2.o ) +[128 of 217] Compiling Upgrade ( Upgrade.hs, dist\build\git-annex\git-annex-tmp\Upgrade.o ) +[129 of 217] Compiling Creds ( Creds.hs, dist\build\git-annex\git-annex-tmp\Creds.o ) + +Creds.hs:18:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() +[130 of 217] Compiling Remote.Helper.AWS ( Remote\Helper\AWS.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\AWS.o ) +[131 of 217] Compiling Annex.LockPool ( Annex\LockPool.hs, dist\build\git-annex\git-annex-tmp\Annex\LockPool.o ) + +Annex\LockPool.hs:17:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() + +Annex\LockPool.hs:39:12: Warning: Defined but not used: `fd' +[132 of 217] Compiling Remote.Helper.Hooks ( Remote\Helper\Hooks.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Hooks.o ) + +Remote\Helper\Hooks.hs:18:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() + +Remote\Helper\Hooks.hs:74:17: Warning: Defined but not used: `lck' +[133 of 217] Compiling Remote.S3 ( Remote\S3.hs, dist\build\git-annex\git-annex-tmp\Remote\S3.o ) +[134 of 217] Compiling Remote.Directory ( Remote\Directory.hs, dist\build\git-annex\git-annex-tmp\Remote\Directory.o ) +[135 of 217] Compiling Remote.Web ( Remote\Web.hs, dist\build\git-annex\git-annex-tmp\Remote\Web.o ) +[136 of 217] Compiling Remote.WebDAV ( Remote\WebDAV.hs, dist\build\git-annex\git-annex-tmp\Remote\WebDAV.o ) +[137 of 217] Compiling Remote.Glacier ( Remote\Glacier.hs, dist\build\git-annex\git-annex-tmp\Remote\Glacier.o ) +[138 of 217] Compiling Remote.Hook ( Remote\Hook.hs, dist\build\git-annex\git-annex-tmp\Remote\Hook.o ) +[139 of 217] Compiling Annex.Ssh ( Annex\Ssh.hs, dist\build\git-annex\git-annex-tmp\Annex\Ssh.o ) + +Annex\Ssh.hs:21:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() +[140 of 217] Compiling Remote.Rsync ( Remote\Rsync.hs, dist\build\git-annex\git-annex-tmp\Remote\Rsync.o ) +[141 of 217] Compiling Remote.Helper.Ssh ( Remote\Helper\Ssh.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Ssh.o ) +[142 of 217] Compiling Remote.Git ( Remote\Git.hs, dist\build\git-annex\git-annex-tmp\Remote\Git.o ) + +Remote\Git.hs:20:1: Warning: + The import of `Utility.CopyFile' is redundant + except perhaps to import instances from `Utility.CopyFile' + To import instances alone, use: import Utility.CopyFile() + +Remote\Git.hs:360:21: Warning: Defined but not used: `r' + +Remote\Git.hs:360:23: Warning: Defined but not used: `key' + +Remote\Git.hs:360:27: Warning: Defined but not used: `file' +[143 of 217] Compiling Remote.Bup ( Remote\Bup.hs, dist\build\git-annex\git-annex-tmp\Remote\Bup.o ) +[144 of 217] Compiling Remote.List ( Remote\List.hs, dist\build\git-annex\git-annex-tmp\Remote\List.o ) +[145 of 217] Compiling Logs.Trust ( Logs\Trust.hs, dist\build\git-annex\git-annex-tmp\Logs\Trust.o ) +[146 of 217] Compiling Remote ( Remote.hs, dist\build\git-annex\git-annex-tmp\Remote.o ) +[147 of 217] Compiling Limit ( Limit.hs, dist\build\git-annex\git-annex-tmp\Limit.o ) +[148 of 217] Compiling Option ( Option.hs, dist\build\git-annex\git-annex-tmp\Option.o ) +[149 of 217] Compiling Annex.FileMatcher ( Annex\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Annex\FileMatcher.o ) +[150 of 217] Compiling Logs.PreferredContent ( Logs\PreferredContent.hs, dist\build\git-annex\git-annex-tmp\Logs\PreferredContent.o ) +[151 of 217] Compiling Annex.Wanted ( Annex\Wanted.hs, dist\build\git-annex\git-annex-tmp\Annex\Wanted.o ) +[152 of 217] Compiling Seek ( Seek.hs, dist\build\git-annex\git-annex-tmp\Seek.o ) +[153 of 217] Compiling Checks ( Checks.hs, dist\build\git-annex\git-annex-tmp\Checks.o ) +[154 of 217] Compiling Command ( Command.hs, dist\build\git-annex\git-annex-tmp\Command.o ) +[155 of 217] Compiling Logs.Unused ( Logs\Unused.hs, dist\build\git-annex\git-annex-tmp\Logs\Unused.o ) +[156 of 217] Compiling CmdLine ( CmdLine.hs, dist\build\git-annex\git-annex-tmp\CmdLine.o ) +[157 of 217] Compiling Command.ConfigList ( Command\ConfigList.hs, dist\build\git-annex\git-annex-tmp\Command\ConfigList.o ) +[158 of 217] Compiling Command.InAnnex ( Command\InAnnex.hs, dist\build\git-annex\git-annex-tmp\Command\InAnnex.o ) +[159 of 217] Compiling Command.DropKey ( Command\DropKey.hs, dist\build\git-annex\git-annex-tmp\Command\DropKey.o ) +[160 of 217] Compiling Command.SendKey ( Command\SendKey.hs, dist\build\git-annex\git-annex-tmp\Command\SendKey.o ) +[161 of 217] Compiling Command.RecvKey ( Command\RecvKey.hs, dist\build\git-annex\git-annex-tmp\Command\RecvKey.o ) +[162 of 217] Compiling Command.TransferInfo ( Command\TransferInfo.hs, dist\build\git-annex\git-annex-tmp\Command\TransferInfo.o ) +[163 of 217] Compiling Command.Commit ( Command\Commit.hs, dist\build\git-annex\git-annex-tmp\Command\Commit.o ) +[164 of 217] Compiling GitAnnex.Options ( GitAnnex\Options.hs, dist\build\git-annex\git-annex-tmp\GitAnnex\Options.o ) +[165 of 217] Compiling Command.Unannex ( Command\Unannex.hs, dist\build\git-annex\git-annex-tmp\Command\Unannex.o ) +[166 of 217] Compiling Command.FromKey ( Command\FromKey.hs, dist\build\git-annex\git-annex-tmp\Command\FromKey.o ) +[167 of 217] Compiling Command.Fix ( Command\Fix.hs, dist\build\git-annex\git-annex-tmp\Command\Fix.o ) +[168 of 217] Compiling Command.Init ( Command\Init.hs, dist\build\git-annex\git-annex-tmp\Command\Init.o ) +[169 of 217] Compiling Command.Describe ( Command\Describe.hs, dist\build\git-annex\git-annex-tmp\Command\Describe.o ) +[170 of 217] Compiling Command.InitRemote ( Command\InitRemote.hs, dist\build\git-annex\git-annex-tmp\Command\InitRemote.o ) +[171 of 217] Compiling Command.EnableRemote ( Command\EnableRemote.hs, dist\build\git-annex\git-annex-tmp\Command\EnableRemote.o ) +[172 of 217] Compiling Command.Unused ( Command\Unused.hs, dist\build\git-annex\git-annex-tmp\Command\Unused.o ) +[173 of 217] Compiling Command.Unlock ( Command\Unlock.hs, dist\build\git-annex\git-annex-tmp\Command\Unlock.o ) +[174 of 217] Compiling Command.Lock ( Command\Lock.hs, dist\build\git-annex\git-annex-tmp\Command\Lock.o ) +[175 of 217] Compiling Command.Find ( Command\Find.hs, dist\build\git-annex\git-annex-tmp\Command\Find.o ) +[176 of 217] Compiling Command.Whereis ( Command\Whereis.hs, dist\build\git-annex\git-annex-tmp\Command\Whereis.o ) +[177 of 217] Compiling Command.Log ( Command\Log.hs, dist\build\git-annex\git-annex-tmp\Command\Log.o ) +[178 of 217] Compiling Command.Merge ( Command\Merge.hs, dist\build\git-annex\git-annex-tmp\Command\Merge.o ) +[179 of 217] Compiling Command.Uninit ( Command\Uninit.hs, dist\build\git-annex\git-annex-tmp\Command\Uninit.o ) +[180 of 217] Compiling Command.Trust ( Command\Trust.hs, dist\build\git-annex\git-annex-tmp\Command\Trust.o ) +[181 of 217] Compiling Command.Untrust ( Command\Untrust.hs, dist\build\git-annex\git-annex-tmp\Command\Untrust.o ) +[182 of 217] Compiling Command.Semitrust ( Command\Semitrust.hs, dist\build\git-annex\git-annex-tmp\Command\Semitrust.o ) +[183 of 217] Compiling Command.Dead ( Command\Dead.hs, dist\build\git-annex\git-annex-tmp\Command\Dead.o ) +[184 of 217] Compiling Command.Group ( Command\Group.hs, dist\build\git-annex\git-annex-tmp\Command\Group.o ) +[185 of 217] Compiling Command.Content ( Command\Content.hs, dist\build\git-annex\git-annex-tmp\Command\Content.o ) +[186 of 217] Compiling Command.Ungroup ( Command\Ungroup.hs, dist\build\git-annex\git-annex-tmp\Command\Ungroup.o ) +[187 of 217] Compiling Command.Vicfg ( Command\Vicfg.hs, dist\build\git-annex\git-annex-tmp\Command\Vicfg.o ) +[188 of 217] Compiling Command.RmUrl ( Command\RmUrl.hs, dist\build\git-annex\git-annex-tmp\Command\RmUrl.o ) +[189 of 217] Compiling Command.Map ( Command\Map.hs, dist\build\git-annex\git-annex-tmp\Command\Map.o ) +[190 of 217] Compiling Command.Upgrade ( Command\Upgrade.hs, dist\build\git-annex\git-annex-tmp\Command\Upgrade.o ) +[191 of 217] Compiling Command.Version ( Command\Version.hs, dist\build\git-annex\git-annex-tmp\Command\Version.o ) +[192 of 217] Compiling Command.Test ( Command\Test.hs, dist\build\git-annex\git-annex-tmp\Command\Test.o ) +[193 of 217] Compiling Command.Add ( Command\Add.hs, dist\build\git-annex\git-annex-tmp\Command\Add.o ) +[194 of 217] Compiling Command.ReKey ( Command\ReKey.hs, dist\build\git-annex\git-annex-tmp\Command\ReKey.o ) +[195 of 217] Compiling Command.AddUnused ( Command\AddUnused.hs, dist\build\git-annex\git-annex-tmp\Command\AddUnused.o ) +[196 of 217] Compiling Command.PreCommit ( Command\PreCommit.hs, dist\build\git-annex\git-annex-tmp\Command\PreCommit.o ) +[197 of 217] Compiling Command.Import ( Command\Import.hs, dist\build\git-annex\git-annex-tmp\Command\Import.o ) +[198 of 217] Compiling Command.Drop ( Command\Drop.hs, dist\build\git-annex\git-annex-tmp\Command\Drop.o ) +[199 of 217] Compiling Command.Move ( Command\Move.hs, dist\build\git-annex\git-annex-tmp\Command\Move.o ) +[200 of 217] Compiling Command.Copy ( Command\Copy.hs, dist\build\git-annex\git-annex-tmp\Command\Copy.o ) +[201 of 217] Compiling Command.Get ( Command\Get.hs, dist\build\git-annex\git-annex-tmp\Command\Get.o ) +[202 of 217] Compiling Command.TransferKey ( Command\TransferKey.hs, dist\build\git-annex\git-annex-tmp\Command\TransferKey.o ) +[203 of 217] Compiling Command.DropUnused ( Command\DropUnused.hs, dist\build\git-annex\git-annex-tmp\Command\DropUnused.o ) +[204 of 217] Compiling Command.Fsck ( Command\Fsck.hs, dist\build\git-annex\git-annex-tmp\Command\Fsck.o ) +[205 of 217] Compiling Command.Reinject ( Command\Reinject.hs, dist\build\git-annex\git-annex-tmp\Command\Reinject.o ) +[206 of 217] Compiling Command.Migrate ( Command\Migrate.hs, dist\build\git-annex\git-annex-tmp\Command\Migrate.o ) +[207 of 217] Compiling Command.Status ( Command\Status.hs, dist\build\git-annex\git-annex-tmp\Command\Status.o ) +[208 of 217] Compiling Command.Sync ( Command\Sync.hs, dist\build\git-annex\git-annex-tmp\Command\Sync.o ) +[209 of 217] Compiling Command.Help ( Command\Help.hs, dist\build\git-annex\git-annex-tmp\Command\Help.o ) +[210 of 217] Compiling Command.AddUrl ( Command\AddUrl.hs, dist\build\git-annex\git-annex-tmp\Command\AddUrl.o ) +[211 of 217] Compiling Command.Direct ( Command\Direct.hs, dist\build\git-annex\git-annex-tmp\Command\Direct.o ) +[212 of 217] Compiling Command.Indirect ( Command\Indirect.hs, dist\build\git-annex\git-annex-tmp\Command\Indirect.o ) +[213 of 217] Compiling Command.FuzzTest ( Command\FuzzTest.hs, dist\build\git-annex\git-annex-tmp\Command\FuzzTest.o ) +[214 of 217] Compiling Test ( Test.hs, dist\build\git-annex\git-annex-tmp\Test.o ) +[215 of 217] Compiling GitAnnexShell ( GitAnnexShell.hs, dist\build\git-annex\git-annex-tmp\GitAnnexShell.o ) +[216 of 217] Compiling GitAnnex ( GitAnnex.hs, dist\build\git-annex\git-annex-tmp\GitAnnex.o ) +[217 of 217] Compiling Main ( git-annex.hs, dist\build\git-annex\git-annex-tmp\Main.o ) +Linking dist\build\git-annex\git-annex.exe ... ++ cabal install nsis +Resolving dependencies... +All the requested packages are already installed: +nsis-0.2.2 +Use --reinstall if you want to reinstall anyway. ++ ghc --make Build/NullSoftInstaller.hs +[15 of 18] Compiling Build.SysConfig ( Build\SysConfig.hs, Build\SysConfig.o ) +Linking Build\NullSoftInstaller.exe ... ++ withcyg Build/NullSoftInstaller.exe ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ Build/NullSoftInstaller.exe +MakeNSIS v2.46 - Copyright 1995-2009 Contributors +See the file COPYING for license details. +Credits can be found in the Users Manual. + +Processing config: +Processing plugin dlls: "c:\Program Files (x86)\NSIS\Plugins\*.dll" + - AdvSplash::show + - Banner::destroy + - Banner::getWindow + - Banner::show + - BgImage::AddImage + - BgImage::AddText + - BgImage::Clear + - BgImage::Destroy + - BgImage::Redraw + - BgImage::SetBg + - BgImage::SetReturn + - BgImage::Sound + - Dialer::AttemptConnect + - Dialer::AutodialHangup + - Dialer::AutodialOnline + - Dialer::AutodialUnattended + - Dialer::GetConnectedState + - InstallOptions::dialog + - InstallOptions::initDialog + - InstallOptions::show + - LangDLL::LangDialog + - Math::Script + - NSISdl::download + - NSISdl::download_quiet + - Splash::show + - StartMenu::Init + - StartMenu::Select + - StartMenu::Show + - System::Alloc + - System::Call + - System::Copy + - System::Free + - System::Get + - System::Int64Op + - System::Store + - TypeLib::GetLibVersion + - TypeLib::Register + - TypeLib::UnRegister + - UserInfo::GetAccountType + - UserInfo::GetName + - UserInfo::GetOriginalAccountType + - VPatch::GetFileCRC32 + - VPatch::GetFileMD5 + - VPatch::vpatchfile + - nsDialogs::Create + - nsDialogs::CreateControl + - nsDialogs::CreateItem + - nsDialogs::CreateTimer + - nsDialogs::GetUserData + - nsDialogs::KillTimer + - nsDialogs::OnBack + - nsDialogs::OnChange + - nsDialogs::OnClick + - nsDialogs::OnNotify + - nsDialogs::SelectFileDialog + - nsDialogs::SelectFolderDialog + - nsDialogs::SetRTL + - nsDialogs::SetUserData + - nsDialogs::Show + - nsExec::Exec + - nsExec::ExecToLog + - nsExec::ExecToStack + +!define: "MUI_INSERT_NSISCONF"="" + +Changing directory to: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex" + +Processing script file: "git-annex.nsi" +!include: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh" +!include: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh" +NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg (c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh:8) +!define: "MUI_INCLUDED"="" +!define: "MUI_SYSVERSION"="2.0" +!define: "MUI_VERBOSE"="3" +!include: closed: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh" +!include: closed: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh" +Name: "git-annex" +OutFile: "git-annex-installer.exe" +InstallDir: "$PROGRAMFILES\Git\cmd" +!insertmacro: MUI_PAGE_DIRECTORY +!insertmacro: end of MUI_PAGE_DIRECTORY +!insertmacro: MUI_PAGE_LICENSE +!insertmacro: end of MUI_PAGEDECLARATION_LICENSE +!insertmacro: end of MUI_PAGE_LICENSE +!insertmacro: MUI_PAGE_INSTFILES +!insertmacro: end of MUI_PAGE_INSTFILES +!insertmacro: MUI_LANGUAGE +!insertmacro: end of MUI_LANGUAGE +Section: "main" ->(_sec10) +SetOutPath: "$INSTDIR" +File: "git-annex.exe" [compress] 7664822/31704766 bytes +File: "git-annex-licenses.txt" [compress] 60509/237415 bytes +File: "cp.exe" [compress] 62591/116736 bytes +File: "xargs.exe" [compress] 17002/33280 bytes +File: "rsync.exe" [compress] 188346/359424 bytes +File: "ssh.exe" [compress] 157190/320000 bytes +File: "wget.exe" [compress] 155666/349184 bytes +File: "sha1sum.exe" [compress] 20337/39424 bytes +File: "sha256sum.exe" [compress] 18279/37390 bytes +File: "sha512sum.exe" [compress] 30393/92174 bytes +File: "sha224sum.exe" [compress] 18279/37390 bytes +File: "sha384sum.exe" [compress] 30392/92174 bytes +File: "cygwin1.dll" [compress] 1036075/2874639 bytes +File: "cygasn1-8.dll" [compress] 154881/459293 bytes +File: "cygattr-1.dll" [compress] 5460/13838 bytes +File: "cygheimbase-1.dll" [compress] 4441/10781 bytes +File: "cygroken-18.dll" [compress] 26103/52253 bytes +File: "cygcom_err-2.dll" [compress] 3984/9757 bytes +File: "cygheimntlm-0.dll" [compress] 9018/20509 bytes +File: "cygsqlite3-0.dll" [compress] 334366/601629 bytes +File: "cygcrypt-0.dll" [compress] 3352/7182 bytes +File: "cyghx509-5.dll" [compress] 95839/216093 bytes +File: "cygssp-0.dll" [compress] 3377/8206 bytes +File: "cygcrypto-1.0.0.dll" [compress] 652766/1553920 bytes +File: "cygiconv-2.dll" [compress] 738899/1008654 bytes +File: "cyggcc_s-1.dll" [compress] 40241/80910 bytes +File: "cygintl-8.dll" [compress] 17737/35342 bytes +File: "cygwind-0.dll" [compress] 73172/160797 bytes +File: "cyggssapi-3.dll" [compress] 81662/183837 bytes +File: "cygkrb5-26.dll" [compress] 170204/381469 bytes +File: "cygz.dll" [compress] 42634/74269 bytes +WriteUninstaller: "git-annex-uninstall.exe" +SectionEnd +Section: "Uninstall" ->(_sec11) +Delete: /REBOOTOK "$INSTDIR\git-annex.exe" +Delete: /REBOOTOK "$INSTDIR\git-annex-licenses.txt" +Delete: /REBOOTOK "$INSTDIR\git-annex-uninstall.exe" +Delete: /REBOOTOK "$INSTDIR\cp.exe" +Delete: /REBOOTOK "$INSTDIR\xargs.exe" +Delete: /REBOOTOK "$INSTDIR\rsync.exe" +Delete: /REBOOTOK "$INSTDIR\ssh.exe" +Delete: /REBOOTOK "$INSTDIR\wget.exe" +Delete: /REBOOTOK "$INSTDIR\sha1sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha256sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha512sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha224sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha384sum.exe" +Delete: /REBOOTOK "$INSTDIR\cygwin1.dll" +Delete: /REBOOTOK "$INSTDIR\cygasn1-8.dll" +Delete: /REBOOTOK "$INSTDIR\cygattr-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygheimbase-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygroken-18.dll" +Delete: /REBOOTOK "$INSTDIR\cygcom_err-2.dll" +Delete: /REBOOTOK "$INSTDIR\cygheimntlm-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygsqlite3-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygcrypt-0.dll" +Delete: /REBOOTOK "$INSTDIR\cyghx509-5.dll" +Delete: /REBOOTOK "$INSTDIR\cygssp-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygcrypto-1.0.0.dll" +Delete: /REBOOTOK "$INSTDIR\cygiconv-2.dll" +Delete: /REBOOTOK "$INSTDIR\cyggcc_s-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygintl-8.dll" +Delete: /REBOOTOK "$INSTDIR\cygwind-0.dll" +Delete: /REBOOTOK "$INSTDIR\cyggssapi-3.dll" +Delete: /REBOOTOK "$INSTDIR\cygkrb5-26.dll" +Delete: /REBOOTOK "$INSTDIR\cygz.dll" +SectionEnd +Function: ".onInit" +IfFileExists: "$PROGRAMFILES\Git\cmd" ? _lbl3 : 0 +MessageBox: 48: "You need git installed to use git-annex. Looking at $PROGRAMFILES\Git\cmd , it seems to not be installed, or may be installed in another location. You can install git from http://git-scm.com/" (on IDOK goto 0) +FunctionEnd + +Processed 1 file, writing output: +Processing pages... Done! +Removing unused resources... Done! +Generating language tables... Done! +Generating uninstaller... Done! + +Output: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex\git-annex-installer.exe" +Install: 4 pages (256 bytes), 1 section (1048 bytes), 98 instructions (2744 bytes), 133 strings (239643 bytes), 1 language table (278 bytes). +Uninstall: 2 pages (128 bytes), +1 section (1048 bytes), 33 instructions (924 bytes), 72 strings (1154 bytes), 1 language table (194 bytes). + +Using zlib compression. + +EXE header size: 48640 / 35840 bytes +Install code: 63270 / 244345 bytes +Install data: 11918141 / 41172867 bytes +Uninstall code+data: 10537 / 14897 bytes +CRC (0x090A4FD3): 4 / 4 bytes + +Total size: 12040592 / 41467953 bytes (29.0%) ++ rm -f last-incremental-failed ++ rm -rf .t ++ withcyg dist/build/git-annex/git-annex.exe test ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ dist/build/git-annex/git-annex.exe test +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) ---------------------------------------------------------------------- +First, some automated quick checks of properties ... +---------------------------------------------------------------------- +prop_idempotent_deencode_git ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_deencode ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_fileKey ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_key_encode ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape_multiword ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_configEscape ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_Config ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parentDir_basics ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_relPathDirToFile_basics ++++ OK, passed 100 tests. +(0 tests) prop_relPathDirToFile_regressionTest ++++ OK, passed 1 tests. +(0 tests) prop_cost_sane ++++ OK, passed 1 tests. +(0 tests) prop_matcher_sane ++++ OK, passed 1 tests. +(0 tests) prop_HmacSha1WithCipher_sane ++++ OK, passed 1 tests. +(0 tests) prop_TimeStamp_sane ++++ OK, passed 1 tests. +(0 tests) prop_addLog_sane ++++ OK, passed 1 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_verifiable_sane ++++ OK, passed 100 tests. +(0 tests) prop_segment_regressionTest ++++ OK, passed 1 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_write_transferinfo ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_show_inodecache ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_log ++++ OK, passed 100 tests. +(0 tests) prop_read_show_TrustLevel ++++ OK, passed 1 tests. +(0 tests) prop_parse_show_TrustLog ++++ OK, passed 1 tests. + +Cases: 1 Tried: 0 Errors: 0 Failures: 0init test repo + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 + +Cases: 3 Tried: 0 Errors: 0 Failures: 0add foo (checksum...) ok +(Recording state in git...) +add sha1foo (checksum...) ok +(Recording state in git...) +add apple ok +(Recording state in git...) + +Cases: 3 Tried: 1 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex add:1 +git clone failed + +Cases: 3 Tried: 2 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex add:2 +git clone failed +Cases: 3 Tried: 3 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex reinject/fromkey +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unannex:0:no content +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unannex:1:with content +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 3 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:0:no remotes +git clone failed + +Cases: 3 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:1:with remote +git clone failed + +Cases: 3 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:2:untrusted remote +git clone failed +Cases: 3 Tried: 3 Errors: 0 Failures: 3 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex get +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex move +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex copy +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unlock/lock +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex edit/commit:0 +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex edit/commit:1 +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fix +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex trust/untrust/semitrust/dead +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 4 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:0 +git clone failed + +Cases: 4 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:1 +git clone failed + +Cases: 4 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:2 +git clone failed + +Cases: 4 Tried: 3 Errors: 0 Failures: 3ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:3 +git clone failed +Cases: 4 Tried: 4 Errors: 0 Failures: 4 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex migrate:0 +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex migrate:1 +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unused/dropunused +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex describe +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex find +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex merge +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex status +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex version +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex sync +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: union merge regression +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: automatic conflict resolution +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex map +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex uninit +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex upgrade +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex whereis +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex hook remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex directory remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex rsync remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex bup remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex crypto +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex preferred-content +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +Now, some broader checks ... + (Do not be alarmed by odd output here; it's normal. + wait for the last line to see how it went.) +---------------------------------------------------------------------- +init +---------------------------------------------------------------------- +add +---------------------------------------------------------------------- +reinject +---------------------------------------------------------------------- +unannex +---------------------------------------------------------------------- +drop +---------------------------------------------------------------------- +get +---------------------------------------------------------------------- +move +---------------------------------------------------------------------- +copy +---------------------------------------------------------------------- +lock +---------------------------------------------------------------------- +edit +---------------------------------------------------------------------- +fix +---------------------------------------------------------------------- +trust +---------------------------------------------------------------------- +fsck +---------------------------------------------------------------------- +migrate +---------------------------------------------------------------------- + unused +---------------------------------------------------------------------- +describe +---------------------------------------------------------------------- +find +---------------------------------------------------------------------- +merge +---------------------------------------------------------------------- +status +---------------------------------------------------------------------- +version +---------------------------------------------------------------------- +sync +---------------------------------------------------------------------- +union merge regression +---------------------------------------------------------------------- +conflict resolution +---------------------------------------------------------------------- +map +---------------------------------------------------------------------- +uninit +---------------------------------------------------------------------- +upgrade +---------------------------------------------------------------------- +whereis +---------------------------------------------------------------------- +hook remote +---------------------------------------------------------------------- +directory remote +---------------------------------------------------------------------- +rsync remote +---------------------------------------------------------------------- +bup remote +---------------------------------------------------------------------- +crypto +---------------------------------------------------------------------- +preferred content +---------------------------------------------------------------------- +Some tests failed! + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment b/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment new file mode 100644 index 000000000..dc09fb89b --- /dev/null +++ b/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T19:18:26Z" + content=""" +The Windows port has improved quite a lot since this bug was filed. Can you still reproduce it? + +If you install the pre-built git-annex for Windows, you can run `git annex test` to run the test suite. Does that work? It works for some others on Windows. +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies.mdwn b/doc/bugs/Windows_daemon_silently_dies.mdwn new file mode 100644 index 000000000..cbffc0083 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies.mdwn @@ -0,0 +1,132 @@ +### Please describe the problem. + +Using the latest build, when the agent is started, it works ... and works ... and works ... until it silently dies at some point. + +### What steps will reproduce the problem? + +I hope this will reproduce: + +* Create a remote with an invalid host which is not reachable +* Start git-annex-autostart.vbs +* Wait 5-30 minutes until no git.exe/git-annex.exe are visible any more in task manager (for my current test it took 10 minutes) +* Inspect the logs + +### What version of git-annex are you using? On what operating system? + + $ git annex version + git-annex version: 5.20140715-g622a376 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + +### Please provide any additional information below. + +I hope/think that this is also related to what I wrote in: +https://git-annex.branchable.com/forum/Restricting_SSH_+_supply_key + +Here the assistant apparently takes the wrong ssh.exe (from bin/ instead than cmd/ directory). This results in the fact that for some reason .ssh/config is not used. +In any case, the host alias can not be resolved. +At some point git annex assistant seems to die because of that, but I am not sure. +In any case, a non-reachable server should not be the cause that the assistant dies. +The last entries of daemon.log are always: + + git-annex: : hGetLine: invalid argument (Bad file descriptor) + failed + git-annex: assistant: 1 failed + +So I think this is the cause. + +[[!format sh """ +[2014-07-14 21:21:19 Pacific Daylight Time] main: starting assistant version 5.20140715-g622a376 +[2014-07-14 21:21:19 Pacific Daylight Time] Cronner: You should enable consistency checking to protect your data. +[2014-07-14 21:21:24 Pacific Daylight Time] TransferScanner: Syncing with 192.168.200.121 +(scanning...) [2014-07-14 21:21:25 Pacific Daylight Time] Watcher: Performing startup scan +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +sssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +sssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +(started...) [2014-07-14 21:21:43 Pacific Daylight Time] Committer: Committing changes to git +[2014-07-14 21:21:43 Pacific Daylight Time] Pusher: Syncing with 192.168.200.121 +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could notssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +[2014-07-14 21:22:03 Pacific Daylight Time] Committer: Committing changes to git +fatal: Unable to create 'c:\data\annex\.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: Unable to create 'c:\data\annex\.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +Committer crashed: failed to read sha from git write-tree +[2014-07-14 21:22:03 Pacific Daylight Time] Committer: warning Committer crashed: failed to read sha from git write-tree +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +Network.Socket.ByteString.send: does not exist (No such file or directory) +Network.Socket.ByteString.send: does not exist (No such file or directory) + +(Recording state in git...) +(Recording state in git...) + +git-annex: : hGetLine: invalid argument (Bad file descriptor) +failed +git-annex: assistant: 1 failed +"""]] + +[[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_1_b590aaeedec78c8540d549a8c773881e._comment b/doc/bugs/Windows_daemon_silently_dies/comment_1_b590aaeedec78c8540d549a8c773881e._comment new file mode 100644 index 000000000..e2c6cdecf --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_1_b590aaeedec78c8540d549a8c773881e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-15T17:36:22Z" + content=""" +I doubt that it has anything to do with a ssh remote. + +Please enable debug logging and see if you can get a more detailed log around when it dies. +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_2_472975d2bd9784ae40b35f11fc561231._comment b/doc/bugs/Windows_daemon_silently_dies/comment_2_472975d2bd9784ae40b35f11fc561231._comment new file mode 100644 index 000000000..dae862205 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_2_472975d2bd9784ae40b35f11fc561231._comment @@ -0,0 +1,72 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 2" + date="2014-07-15T20:51:07Z" + content=""" +Unfortunately not. I did that already. At least in my opinion nothing special. + +These are the latest lines: + +[[!format sh \"\"\" +Please make sure you have the correct access rights +and the repository exists. +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..8ea0bbec209e1ec1240aa94ba2d6975023d83ac5\",\"-n1\",\"--pretty=%H\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..528b6b61318d138db5df2262ee501d6895b859d0\",\"-n1\",\"--pretty=%H\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..45aff729d5c9e60d925fad4c7fd75497ff5301fa\",\"-n1\",\"--pretty=%H\"] +[2014-07-15 13:34:32 Pacific Daylight Time] call: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/server/annex/direct/master\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/annex/direct/master..refs/remotes/server/annex/direct/master\",\"-n1\",\"--pretty=%H\"] +[2014-07-15 13:34:32 Pacific Daylight Time] call: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/server/synced/master\"] +[2014-07-15 13:34:32 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/synced/master..refs/remotes/server/synced/master\",\"-n1\",\"--pretty=%H\"] +[2014-07-15 13:34:32 Pacific Daylight Time] Pusher: pushing to [Remote { name =\"server\" }] +[2014-07-15 13:34:32 Pacific Daylight Time] call: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"push\",\"server\",\"+git-annex:synced/git-annex\",\"annex/direct/master:synced/master\"] +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +[2014-07-15 13:34:34 Pacific Daylight Time] read: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"push\",\"server\",\"master\"] +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +[2014-07-15 13:34:35 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:34:35 Pacific Daylight Time] RemoteControl: fromList [] +[2014-07-15 13:34:36 Pacific Daylight Time] Pusher: fallback pushing to [Remote { name =\"server\" }] +[2014-07-15 13:34:36 Pacific Daylight Time] call: git [\"--git-dir=c:\\data\\annex\\.git\",\"--work-tree=c:\\data\\annex\",\"-c\",\"core.bare=false\",\"push\",\"server\",\"+git-annex:refs/synced/91347741-60cd-4bca-a64a-90adee8d1910/git-annex\",\"refs/heads/annex/direct/master:refs/synced/91347741-60cd-4bca-a64a-90adee8d1910/annex/direct/master\"] +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +[2014-07-15 13:34:51 Pacific Daylight Time] chat: ssh [\"-T\",\"test@annex\",\"git-annex-shell 'notifychanges' '/srv/data/Shared' --uuid df1c0b77-f9b6-4ed7-96f3-3e7f010c4fb6\"] +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +[2014-07-15 13:35:03 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:35:03 Pacific Daylight Time] RemoteControl: fromList [] +[2014-07-15 13:35:35 Pacific Daylight Time] chat: ssh [\"-T\",\"test@annex\",\"git-annex-shell 'notifychanges' '/srv/data/Shared' --uuid df1c0b77-f9b6-4ed7-96f3-3e7f010c4fb6\"] +ss[2014-07-15 13:35:47 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:35:47 Pacific Daylight Time] RemoteControl: fromList [] +[2014-07-15 13:36:51 Pacific Daylight Time] chat: ssh [\"-T\",\"test@annex\",\"git-annex-shell 'notifychanges' '/srv/data/Shared' --uuid df1c0b77-f9b6-4ed7-96f3-3e7f010c4fb6\"] +ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + +[2014-07-15 13:37:02 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:37:02 Pacific Daylight Time] RemoteControl: fromList [] +[2014-07-15 13:39:10 Pacific Daylight Time] chat: ssh [\"-T\",\"test@annex\",\"git-annex-shell 'notifychanges' '/srv/data/Shared' --uuid df1c0b77-f9b6-4ed7-96f3-3e7f010c4fb6\"] +ssh: Co[2014-07-15 13:39:21 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:39:21 Pacific Daylight Time] RemoteControl: fromList [] +[2014-07-15 13:43:37 Pacific Daylight Time] chat: ssh [\"-T\",\"test@annex\",\"git-annex-shell 'notifychanges' '/srv/data/Shared' --uuid df1c0b77-f9b6-4ed7-96f3-3e7f010c4fb6\"] +ssh: Could not resolve hostname an[2014-07-15 13:43:49 Pacific Daylight Time] RemoteControl: DISCONNECTED ssh://test@annex/srv/data/Shared +[2014-07-15 13:43:49 Pacific Daylight Time] RemoteControl: fromList [] + +(Recording state in git...) + +git-annex: : hGetLine: invalid argument (Bad file descriptor) +failed +git-annex: assistant: 1 failed +\"\"\"]] + +Maybe it's something different but what could it be? + + +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_3_48415a7251abffca998b8dccc5e0ba80._comment b/doc/bugs/Windows_daemon_silently_dies/comment_3_48415a7251abffca998b8dccc5e0ba80._comment new file mode 100644 index 000000000..3498cc88e --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_3_48415a7251abffca998b8dccc5e0ba80._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 3" + date="2014-07-15T22:02:41Z" + content=""" +Update: You are right. It has nothing to do with the connections. I created a new repository without any sync. Same here: + + [2014-07-15 13:53:33 Pacific Daylight Time] main: starting assistant version 5.20140715-g622a376 + [2014-07-15 13:53:33 Pacific Daylight Time] Cronner: You should enable consistency checking to protect your data. + (scanning...) [2014-07-15 13:53:38 Pacific Daylight Time] Watcher: Performing startup scan + (started...) + + git-annex: : hGetLine: invalid argument (Bad file descriptor) + failed + git-annex: assistant: 1 failed + +It always takes exactly 10 minutes until it dies (you see is started 13:53:33 and it died at 14:03:33 (=modification of daemon.log). +So this is reproduceable ... + + +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_4_1c0b0b2e7180425ff2d5e5316a138f7d._comment b/doc/bugs/Windows_daemon_silently_dies/comment_4_1c0b0b2e7180425ff2d5e5316a138f7d._comment new file mode 100644 index 000000000..63b37a7e1 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_4_1c0b0b2e7180425ff2d5e5316a138f7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-16T18:18:11Z" + content=""" +Hmm, there are two places where the assistant happens to hard code a 10 minute time period. But one is 10 minutes from starting to configure a ssh remote in the webapp, not from start. And the other is the watcher's afterLastDaemonRun check, which only happens when a symlink appears in the repository (which shouldn't happen on windows and wouldn't necessarily happen 10 minutes after start). + +Fabulous .. I just reproduced the crash! +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_5_0d14dd2c8d94a81ffd5aae07e927344f._comment b/doc/bugs/Windows_daemon_silently_dies/comment_5_0d14dd2c8d94a81ffd5aae07e927344f._comment new file mode 100644 index 000000000..2b2e81946 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_5_0d14dd2c8d94a81ffd5aae07e927344f._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 5" + date="2014-07-16T18:21:24Z" + content=""" +A full log in an empty repo of the crash: + +
+[2014-07-16 14:00:53 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..9c07d1385e80dbc6044814357e9097fd231b8c99\",\"-n1\",\"--pretty=%H\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] chat: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] logging to C:\WINDOWS\TT\.git\annex\daemon.log
+[2014-07-16 14:00:54 Atlantic Standard Time] main: starting assistant version 5.20140714-gf892329
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..9c07d1385e80dbc6044814357e9097fd231b8c99\",\"-n1\",\"--pretty=%H\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] chat: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"ls-files\",\"--stage\",\"-z\",\"--\",\"C:\\WINDOWS\\TT\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] Cronner: You should enable consistency checking to protect your data. 
+[2014-07-16 14:00:54 Atlantic Standard Time] SanityCheckerStartup: no index file; restaging
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"ls-files\",\"--stage\",\"-z\",\"--\",\"C:\\WINDOWS\\TT\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] chat: git-annex [\"remotedaemon\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"ls-tree\",\"--full-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"numcopies.log\",\"schedule.log\",\"preferred-content.log\",\"required-content.log\",\"group-preferred-content.log\"]
+[2014-07-16 14:00:54 Atlantic Standard Time] Merger: watching C:\WINDOWS\TT\.git\refs
+[2014-07-16 14:00:54 Atlantic Standard Time] TransferWatcher: watching for transfers
+(scanning...) [2014-07-16 14:00:54 Atlantic Standard Time] Watcher: Performing startup scan
+[2014-07-16 14:00:54 Atlantic Standard Time] read: git [\"--git-dir=C:\\WINDOWS\\TT\\.git\",\"--work-tree=C:\\WINDOWS\\TT\",\"-c\",\"core.bare=false\",\"ls-files\",\"--deleted\",\"-z\",\"--\",\"C:\\WINDOWS\\TT\"]
+(started...) [2014-07-16 14:00:54 Atlantic Standard Time] Watcher: watching .
+
+
+git-annex: : hGetLine: invalid argument (Bad file descriptor)
+failed
+git-annex: assistant: 1 failed
+
+ +The two blank lines just before the crash seem to be significant somehow; they are not output at the beginning, so must occur just before it crashes. + +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_6_20a420680058f84a8cbd43682957fe7b._comment b/doc/bugs/Windows_daemon_silently_dies/comment_6_20a420680058f84a8cbd43682957fe7b._comment new file mode 100644 index 000000000..4b596c762 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_6_20a420680058f84a8cbd43682957fe7b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 6" + date="2014-07-16T18:38:51Z" + content=""" +It appears to be the remoteResponderThread crashing (based on adding debugging around all hGetLine call sites). +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_7_1514739ba9885917d03597dcc6aa7bec._comment b/doc/bugs/Windows_daemon_silently_dies/comment_7_1514739ba9885917d03597dcc6aa7bec._comment new file mode 100644 index 000000000..3ce65580a --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_7_1514739ba9885917d03597dcc6aa7bec._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 7" + date="2014-07-16T20:18:50Z" + content=""" +Well, it seems not to be the RemoteControl thread after all. I made that thread start the remotedaemon and then not read from it at all, and the crash still happens. Also, the remotedaemon itself seems to run forever ok. + +(This is sort of a relief, because it should not be possible for a crash of a named thread like RemoteControl to take down the whole assistant!) + +The hGetLine must be being called by some other library function. + +Hmm... Could it perhaps be waitForTermination? On windows that ends up calling getLine in a loop. A 600 second loop! + +Update: Seems so. With a 60 second loop, it crashes after 60 seconds. With the 2 newlines happening just before. + +Also, it makes sense now why this is a new crash. Before the assistant ran with stdio connected to the terminal, but recently on windows it got hooked up to the debug log, and stdin is closed now. + +I still don't understand where the 2 newlines come from (possibly output by something while git-annex is crashing?).. But have confirmed I've fixed the problem now. +"""]] diff --git a/doc/bugs/Windows_daemon_silently_dies/comment_8_0210436870e6622a83c9b4788e31eef4._comment b/doc/bugs/Windows_daemon_silently_dies/comment_8_0210436870e6622a83c9b4788e31eef4._comment new file mode 100644 index 000000000..09e7eb867 --- /dev/null +++ b/doc/bugs/Windows_daemon_silently_dies/comment_8_0210436870e6622a83c9b4788e31eef4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="divB" + ip="204.17.143.10" + subject="comment 8" + date="2014-07-16T23:53:39Z" + content=""" +Really great, seems to be fixed in the current version (at least it's running for 1h now). Thank you!! +"""]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness.mdwn b/doc/bugs/Windows_file_timestamp_timezone_madness.mdwn new file mode 100644 index 000000000..69e9838f2 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness.mdwn @@ -0,0 +1,31 @@ +Windows has an unfortunate handling of time zones, which means that when +the time zone is changed (or DST changes), the timestamps of files also +appear to change. + +This means that after such a change, git-annex will see new mtimes, and +want to re-checksum every file in the repo. + +[[!tag confirmed]] + +> Update: Actually, I seem to have been getting confused by behavior of +> cygwin terminal setting TZ. That indeed led to timestamp changes when the +> time zone changed. I have made git-annex unset TZ to avoid this. +> +> Without TZ set, time stamps are actually stable across time zone changes. +> Ie, a simple program to read the time stamp of a file and print it +> always shows the same thing, before and after a timezone change. +> +> However, and here's where it gets truely ghastly: A program that stats a +> file in a loop will see its timestamp change when the timezone changes. +> I suspect this might be a bug in the Haskell RTS caching something it +> should not. Stopping and re-running the program gets back to the +> original timestamp. +> +> I have not tested DST changes, but it's hard to imagine it being any +> worse than the above behavior. +> +> So, that's insane then. We can't trust timestamps to be stable on windows +> when git-annex is running for a long period of time. --[[Joey]] +> +> > [[fixed|done]], using the inode sentinal file to detect when windows +> > has lost its mind, and calculating its delta from insanity. --[[Joey]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness/comment_1_9db59ab2242186a23a47337a1597f4e2._comment b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_1_9db59ab2242186a23a47337a1597f4e2._comment new file mode 100644 index 000000000..fbda5c285 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_1_9db59ab2242186a23a47337a1597f4e2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-11T19:09:17Z" + content=""" +Rather than getting the timezone, another approach might be to look at the inode sentinal file. Its timestamp will also appear to have changed. If the delta is exactly some number of hours, and the inode sential's other data is unchanged, a Windows-specific hack could apply that same delta to all inode cache timestamps. + +Except, time zones are not all actually on hour boundaries. Some are half hours, some may be 15 minutes, and next week some crazy country might legislate a 3 minute delta for all I know. + +Well, could just say if the inode sentinal's mtime has changed at all (delta < 3600 seconds), and it's otherwise unchanged, and we're on windows, assume this is a time zone change. When would that fail? Only if the repository is copied to someplace, and the mtime is not preserved. +"""]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness/comment_2_a6a3871747306913b69abcd73d13305e._comment b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_2_a6a3871747306913b69abcd73d13305e._comment new file mode 100644 index 000000000..c213aa0a9 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_2_a6a3871747306913b69abcd73d13305e._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-06-11T19:51:15Z" + content=""" +Note that multiple time zone changes complicate this. I think that means that the delta can't be simply applied when comparing inode caches. Instead, probably it needs to be applied when generating inode caches. + +A scenario: + +1. Time zone is at +1h when the inode sential is written. +2. Time zone changes to +2h +3. File F is added (with a current timestamp of T) +4. Time zone changes to +5h + +I am a little confused by which way windows moves the timestamps when the time zone changes. Let's assume I might get the sign wrong. + +Let F's timestamp after step 4, F4 = T+-3h. + +Let the delta after step 4, D4 = +-4h +And, let the delta after step 2, D2 = +-1h + +If step 3 writes the current timestamp to the inode cache, then the cache still has T in it after step 4. F4+D4 /= T (T +-3h +-4h /= T). So comparison doesn't work. + +If instead the current delta is applied when generating inode caches (both for storing on disk, and for immediate comparison), then the inode cache will have T+D2 in it. Then after step 4, generating a new inode cache for F will yield F4+D4. So, does F4+D4 == T+D2? T +-3h +-4h == T +-1h YES! +"""]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness/comment_3_7fe149bedb8ceab75953996ac8e20f0f._comment b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_3_7fe149bedb8ceab75953996ac8e20f0f._comment new file mode 100644 index 000000000..1a25d3c82 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_3_7fe149bedb8ceab75953996ac8e20f0f._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-11T22:11:38Z" + content=""" +I have implemented this on the loststamp git branch. It seems to work! + +However, it has a big problem: + + If the timezone changes while the assistant (or a long-running command) + runs, it won't notice, since it only checks the inode cache once, and + so will use the old delta for all new inode caches it generates for new + files it's added. Which will result in them seeming changed the next time + it runs. + +So, it would be really nice to be able to check the actual timezone instead. +But I suppose I can make the assistant poll the inode cache file, or check +it when adding a new file, or something like that. Bleagh. +"""]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness/comment_4_c9e8c9997b7c3a82c14fc34af319382d._comment b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_4_c9e8c9997b7c3a82c14fc34af319382d._comment new file mode 100644 index 000000000..d06df7b77 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_4_c9e8c9997b7c3a82c14fc34af319382d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-11T22:54:48Z" + content=""" +Getting the actual time zone on windows works better if you unset TZ first. + +But, a haskell program that polls the time zone fails to notice when it's changed. It only notices after being restarted. I have contacted the time library maintainer about this. +"""]] diff --git a/doc/bugs/Windows_file_timestamp_timezone_madness/comment_5_0739426403f5bf9954acbc86ca0d11ea._comment b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_5_0739426403f5bf9954acbc86ca0d11ea._comment new file mode 100644 index 000000000..ac1f090f5 --- /dev/null +++ b/doc/bugs/Windows_file_timestamp_timezone_madness/comment_5_0739426403f5bf9954acbc86ca0d11ea._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 5" + date="2014-06-11T23:02:28Z" + content=""" +I've developed a fix for the time library. This patch has been sent to the author, hopefully it will get applied and then I can use getCurrentTImeZone. Note that git-annex would need to unset TZ first, which might be hard on windows. + +
+diff --git a/cbits/HsTime.c b/cbits/HsTime.c
+index cfafb27..86ca92a 100644
+--- a/cbits/HsTime.c
++++ b/cbits/HsTime.c
+@@ -8,6 +8,7 @@ long int get_current_timezone_seconds (time_t t,int* pdst,char const* * pname)
+     tzset();
+     struct tm* ptm = localtime_r(&t,&tmd);
+ #else
++    tzset();
+     struct tm* ptm = localtime(&t);
+ #endif
+     if (ptm)
+
+"""]] diff --git a/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn new file mode 100644 index 000000000..a21813500 --- /dev/null +++ b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. +On a default, clean install on Windows, annex get over HTTP fails, as neither wget nor curl have all necessary DLLs. + +### What steps will reproduce the problem? +1. Install git from git-scm.org, and git-annex from git-annex.branchable.com. +2. Don't install, or remove if installed, Cygwin. +3. clone an annex over HTTP +4. attempt to 'annex get' a file +5. get dialog box, explaining missing DLLs. + +### What version of git-annex are you using? On what operating system? +Windows 7. + +### Please provide any additional information below. +Installing Cygwin and adding to path seems to fix issue. + +[[!tag moreinfo]] diff --git a/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment new file mode 100644 index 000000000..05639ef3a --- /dev/null +++ b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:47:54Z" + content=""" +The Windows installer includes numerous DLLs from Cygwin. I have tested it in a non-cygwin environment and it seems to work for me, and for other users. At least generally.. perhaps it *is* missing something used by wget or curl? + +Can you please provide the names of the DLLs that seem to be missing? +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn new file mode 100644 index 000000000..64e95ca1b --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn @@ -0,0 +1,131 @@ +[[!tag moreinfo]] + +### Please describe the problem. +git annex get on a clone of a repository created on Windows fails. + +### What steps will reproduce the problem? +On Windows: +1. Create an annex using git annex init + +2. git add files + +3. git annex sync (because I forgot about commit) + +On Linux: + +1. Mount the Windows annex via SMB (mine was read only, but probably won't matter) + +2. git clone the folder (works fine) + +3. git annex get (fails, due to Windows drive letter) + +### What version of git-annex are you using? On what operating system? + +*Windows:* + +git-annex version: 4.20130802-g0a52f02 + +build flags: Pairing Testsuite S3 WebDAV DNS + +*Linux: (Debian wheezy on ARMel)* + +git-annex version: 3.20120629 + +local repository version: 3 + +default repository version: 3 + +supported repository versions: 3 + +upgrade supported from repository versions: 0 1 2 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +#output of git annex get on the Linux side. + +get Purchased/Caravan Palace/Panic/01 Queens.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/02 Maniac.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/03 The Dirty Side of the Street.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/04 12 juin 3049.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/05 Rock It for Me.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/06 Clash.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/07 Newbop.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/08 Glory of Nelly.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/09 Dramophone.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/10 Cotton Heads.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/11 Panic.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/12 Pirates.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/13 Beatophone.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/14 Sydney.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/Thumbs.db (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music + + +And the (broken) symlinks: + +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 01 Queens.mp3 -> .git/annex/objects/5P/vq/SHA256E-s9886015--dfb8f452d47f997a9141de3f152de375fad1d5ccb4a20d5c022064a630eaba88.mp3/SHA256E-s9886015--dfb8f452d47f997a9141de3f152de375fad1d5ccb4a20d5c022064a630eaba88.mp3 +lrwxrwxrwx 1 voltagex voltagex 200 Aug 11 23:05 02 Maniac.mp3 -> .git/annex/objects/J0/WV/SHA256E-s10116938--7ce35f4a54c4f74bd2e3813445cb3a07fae76b2854df06ab00876cd0067f34a5.mp3/SHA256E-s10116938--7ce35f4a54c4f74bd2e3813445cb3a07fae76b2854df06ab00876cd0067f34a5.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 03 The Dirty Side of the Street.mp3 -> .git/annex/objects/xz/4F/SHA256E-s8812949--9e15761ae8c6231d11d1f5a67de8a89142e2e4017b43b8ffac1088fd71842ca7.mp3/SHA256E-s8812949--9e15761ae8c6231d11d1f5a67de8a89142e2e4017b43b8ffac1088fd71842ca7.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 04 12 juin 3049.mp3 -> .git/annex/objects/Kp/k6/SHA256E-s8236133--3a6465bea3272ae7a22b77b67e96a91ae389390cc95642fb1456ce80e3313033.mp3/SHA256E-s8236133--3a6465bea3272ae7a22b77b67e96a91ae389390cc95642fb1456ce80e3313033.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 05 Rock It for Me.mp3 -> .git/annex/objects/Wk/Qv/SHA256E-s7701150--8197e499408e64601157df95927ac6b09bd37834a41eceecc5d12667bd7c66a4.mp3/SHA256E-s7701150--8197e499408e64601157df95927ac6b09bd37834a41eceecc5d12667bd7c66a4.mp3 +lrwxrwxrwx 1 voltagex voltagex 200 Aug 11 23:05 06 Clash.mp3 -> .git/annex/objects/ZQ/P4/SHA256E-s10201572--c2a1a8892fcaaab1ed59ca7f5ab9d45f0c3bb3c6d6450b95228039b9e8d7a0b4.mp3/SHA256E-s10201572--c2a1a8892fcaaab1ed59ca7f5ab9d45f0c3bb3c6d6450b95228039b9e8d7a0b4.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 07 Newbop.mp3 -> .git/annex/objects/Fk/wV/SHA256E-s6850587--b5ba0347f6a09a7ff8bec2dd1fbe8076fdff645d4bc1909ddeadfc035bf19fda.mp3/SHA256E-s6850587--b5ba0347f6a09a7ff8bec2dd1fbe8076fdff645d4bc1909ddeadfc035bf19fda.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 08 Glory of Nelly.mp3 -> .git/annex/objects/Pm/K3/SHA256E-s9002048--18149581cbfc3b4e3e72b784777fe34c53f1580e78e97f66058be0b1eb40e809.mp3/SHA256E-s9002048--18149581cbfc3b4e3e72b784777fe34c53f1580e78e97f66058be0b1eb40e809.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 09 Dramophone.mp3 -> .git/annex/objects/k3/Jf/SHA256E-s8199558--925117d9fc47a65e8e5324f3d0638a3c24bf51fd6c0b5d8ac2f63951c893cc48.mp3/SHA256E-s8199558--925117d9fc47a65e8e5324f3d0638a3c24bf51fd6c0b5d8ac2f63951c893cc48.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 10 Cotton Heads.mp3 -> .git/annex/objects/9f/32/SHA256E-s8801425--c6926238c0b1a3bbea1a5d17841ceac591e53e223e4c4c45a2077cabffc85d81.mp3/SHA256E-s8801425--c6926238c0b1a3bbea1a5d17841ceac591e53e223e4c4c45a2077cabffc85d81.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 11 Panic.mp3 -> .git/annex/objects/XF/WF/SHA256E-s9833770--5e837c7fa3ec096f7c0507efbcf398067029749f8a0fc77a2badf864b9ffbb7c.mp3/SHA256E-s9833770--5e837c7fa3ec096f7c0507efbcf398067029749f8a0fc77a2badf864b9ffbb7c.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 12 Pirates.mp3 -> .git/annex/objects/7Z/jz/SHA256E-s8017742--5fd49b2d89577266d2fb740e7e7def9338475af90c2ca99f9d6d513465b2bfac.mp3/SHA256E-s8017742--5fd49b2d89577266d2fb740e7e7def9338475af90c2ca99f9d6d513465b2bfac.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 13 Beatophone.mp3 -> .git/annex/objects/81/xv/SHA256E-s9339544--a1eb8404ecf0503b9f635378fec4e2c95ec08bb1428c2cd4c0cedf492811577d.mp3/SHA256E-s9339544--a1eb8404ecf0503b9f635378fec4e2c95ec08bb1428c2cd4c0cedf492811577d.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 14 Sydney.mp3 -> .git/annex/objects/3K/99/SHA256E-s8459731--4ff44b25c912e914c79124ff9074c576c0024152442fc96c9bad65f5a50a40d9.mp3/SHA256E-s8459731--4ff44b25c912e914c79124ff9074c576c0024152442fc96c9bad65f5a50a40d9.mp3 +lrwxrwxrwx 1 voltagex voltagex 192 Aug 11 23:05 Thumbs.db -> .git/annex/objects/28/Zv/SHA256E-s85504--3604669cd3a55234516191eb4f19434829c1634d6dd69a9981185f095d2bbaba.db/SHA256E-s85504--3604669cd3a55234516191eb4f19434829c1634d6dd69a9981185f095d2bbaba.db + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment new file mode 100644 index 000000000..0577531b7 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlzWwnBfgJrkhPQakBo6DbPXutJIVDHkj0" + nickname="Adam" + subject="comment 1" + date="2013-08-11T14:15:40Z" + content=""" +Confirming the same errors happen with git-annex version: 4.20130802 from sid. + +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment new file mode 100644 index 000000000..d98e7976e --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="bad bug report title 101" + date="2013-08-24T19:17:29Z" + content=""" +I don't understand why you think the problem has something to do with Windows drive letters. There are no Windows drive letters in the symlinks you show. The only place I see any Windows drive letter is in the descripton of the remote that `git annex get` displays when it fails to get the file. That description is purely informative, it's not a path that git-annex is trying to use. + +I'd suggest that you run `git annex get --debug` to see if it is doing anything obviously wrong. The mostly likely culprit is your SMB setup, which I am not going to be able to replicate. +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment new file mode 100644 index 000000000..16f240cf2 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlzWwnBfgJrkhPQakBo6DbPXutJIVDHkj0" + nickname="Adam" + subject="comment 3" + date="2013-08-26T06:56:33Z" + content=""" +You're correct. I can see in .git/config that the remote references z:\ which of course will break on the Linux side. Maybe this is a case of the error messages not quite telling me the right thing? +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment new file mode 100644 index 000000000..31bc7c1a1 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 4" + date="2013-09-13T19:29:25Z" + content=""" +I'd suggest that you run git annex get --debug to see if it is doing anything obviously wrong. The mostly likely culprit is your SMB setup, which I am not going to be able to replicate. + +"""]] diff --git a/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn b/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn new file mode 100644 index 000000000..ec87cefbe --- /dev/null +++ b/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. +On a Windows machine, I try to drop some files from an annex. These files exist in the origin annex. However, the drop fails, claiming it can't verify the existence of the remote copies. + +### What steps will reproduce the problem? +1. Create annex, serve git repo over HTTP. +2. clone repo. "git annex get ." +3. "git annex drop ". This will fail. + + +### What version of git-annex are you using? On what operating system? +Windows: 4.20130709-gea6fdc7 +Debian: 3.20120629 + +### Please provide any additional information below. + +[[!format sh """ +git annex -vd drop file2.txt +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","ls-files","--cached","-z","--","file2.txt"] +[] chat: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"] +drop file2.txt [] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","show-ref","git-annex"] +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","show-ref","--hash","refs/heads/git-annex"] +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","log","refs/heads/git-annex..37bdd895d74131fddbdb8d2e6ae707ee2097598e","--oneline","-n1"] +[] read: git ["--git-dir=C:\\Users\\<>\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","log","refs/heads/git-annex..f0ba6f30c63a9d586642d828c37613894191931e","--oneline","-n1"] +[] chat: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","cat-file","--batch"] +[] read: curl ["-s","--head","-L","http://192.168.0.8:8000/test_annex_2/.git/annex/objects/738/e2a/SHA256-s27--4fc887746d7ea6c9574f6735bd3dfd9b0485b30acaaf0727658cd1796991dd2d/SHA256-s27--4fc887746d7ea6c9574f6735bd3dfd9b0485b30acaaf0727658cd1796991dd2d","-w","%{http_code}"] +(unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +"""]] + +the given curl command fails with a 404, because the remote annex isn't using the 3-character hash directory scheme, but the 2-character one, and it seems that 'annex drop' doesn't check both schemes (unlike annex get). + +> Ah, the http remote is a non-bare repository, that's why. +> Ok, [[fixed|done]]! --[[Joey]] diff --git a/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn b/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn new file mode 100644 index 000000000..561cad199 --- /dev/null +++ b/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +When the assistant connects the second time during adding a ssh remote, it assumes port 22 when different port is given. + +### What steps will reproduce the problem? + +Adding a ssh git remote with non-standard port. + +### What version of git-annex are you using? On what operating system? + +GNU/Linux, Ubuntu 12.10, amd64, git-annex 4.20130627-g728b27a + +Happens on android as well. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Error message (nothing related in daemon.log): + +Failed to make repository + +Something went wrong setting up the repository on the remote server. + +Transcript: + +ssh: connect to host xxxxx port 22: Connection refused + +# End of transcript or log. +"""]] + +> [[Fixed|done]]; this bug was introcuded in version +> 4.20130627 while making some other ssh fixes. --[[Joey]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn new file mode 100644 index 000000000..e7ff53723 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +git-annex assistant is currently running. Here is the output of **ps -A u | grep -i git**: + +[[!format sh """ +5457 pts/2 Z+ 0:00 [git-annex] +5510 ? Sl 0:05 git-annex assistant +5522 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +5573 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +5679 ? SN 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- +5680 ? Z 0:03 [git-annex] +5710 ? Z 0:00 [git-annex] +5732 pts/2 Z+ 0:00 [git-annex] +5752 pts/2 Z+ 0:00 [git-annex] +5785 ? Ss 0:00 ssh: .git/annex/ssh/example.net [mux] +5905 ? Z 0:00 [git-annex] +5923 ? Z 0:00 [git-annex] +6513 pts/2 Z+ 0:00 [git-annex] +6552 ? Z 0:00 [git-annex] +7797 ? Z 0:00 [git-annex] +7873 pts/2 Z 0:00 [git-annex] +8708 pts/2 Z+ 0:00 [git-annex] +9821 ? Z 0:00 [git-annex] +9841 pts/2 Z+ 0:00 [git-annex] +10462 ? Z 0:00 [git-annex] +10522 pts/2 Z 0:00 [git-annex] +12777 pts/2 Z+ 0:00 [git-annex] +13878 pts/2 Z+ 0:00 [git-annex] +14254 ? Z 0:00 [git-annex] +14276 pts/2 Z+ 0:00 [git-annex] +15932 ? Sl 0:00 git-annex transferkeys --readfd 37 --writefd 20 +16022 pts/2 Sl 0:00 git-annex transferkeys --readfd 28 --writefd 22 +16079 pts/2 S 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +16081 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +31565 pts/2 Sl+ 0:20 git-annex webapp +31580 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31590 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31618 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31635 ? Sl 9:26 /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +31689 pts/2 SN+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +31812 pts/2 Z 0:00 [git-annex] +31835 ? Ss 0:02 ssh: .git/annex/ssh/example.net [mux] +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment new file mode 100644 index 000000000..578fecb58 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T01:12:25Z" + content=""" +This is apparently the same repository where [[all_this_went_on|bugs/Unnecessary_remote_transfers]]. + +I don't know if this is indicative of a problem. I see more zombies than I would normally expect, but I don't know if the number is growing, or shrinking, or staying the same. You should at least look at ps -f to see which of the multiple git-annex assistant daemons you have configured to run on this machine (not a usual configuration) is the parent of the zombies. +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment new file mode 100644 index 000000000..ceb05ea0c --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment @@ -0,0 +1,52 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-03T01:19:42Z" + content=""" +Indeed. I've been looking forward to setting up git-annex assistant for a long time, waiting until I had more free time, and was finally pushed to do it when I had a weird problem with Dropbox. I'm not sure what I did wrong to make such a mess, haha. + +I see \"5510 git-annex assistant\" and \"31565 git-annex webapp\"--does the \"webapp\" one count as an assistant process too? +[[!format sh \"\"\"$ ps -ef | gi git +UID PID PPID C STIME TTY TIME CMD +me 3404 31565 0 17:44 pts/2 00:00:04 [git-annex] +me 5457 31565 0 17:59 pts/2 00:00:00 [git-annex] +me 5510 1 0 17:59 ? 00:00:06 git-annex assistant +me 5522 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 5573 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 5679 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- +me 5680 5510 0 17:59 ? 00:00:03 [git-annex] +me 5710 5510 0 18:00 ? 00:00:00 [git-annex] +me 5732 31565 0 18:00 pts/2 00:00:00 [git-annex] +me 5752 31565 0 18:00 pts/2 00:00:00 [git-annex] +me 5785 1 0 18:01 ? 00:00:00 ssh: .git/annex/ssh/example.net [mux] +me 5905 5510 0 18:02 ? 00:00:00 [git-annex] +me 5923 5510 0 18:02 ? 00:00:00 [git-annex] +me 6513 31565 0 18:05 pts/2 00:00:00 [git-annex] +me 6552 5510 0 18:06 ? 00:00:00 [git-annex] +me 7797 5510 0 18:09 ? 00:00:00 [git-annex] +me 7873 31565 0 18:09 pts/2 00:00:00 [git-annex] +me 8708 31565 0 18:10 pts/2 00:00:00 [git-annex] +me 9821 5510 0 18:12 ? 00:00:00 [git-annex] +me 9841 31565 0 18:14 pts/2 00:00:00 [git-annex] +me 10462 5510 0 18:23 ? 00:00:00 [git-annex] +me 10522 31565 0 18:24 pts/2 00:00:00 [git-annex] +me 12777 31565 0 18:34 pts/2 00:00:00 [git-annex] +me 13878 31565 0 18:35 pts/2 00:00:00 [git-annex] +me 14254 5510 0 18:36 ? 00:00:00 [git-annex] +me 14276 31565 0 18:36 pts/2 00:00:00 [git-annex] +me 15932 5510 0 18:55 ? 00:00:00 git-annex transferkeys --readfd 37 --writefd 20 +me 16022 31565 0 18:55 pts/2 00:00:00 git-annex transferkeys --readfd 28 --writefd 22 +me 16079 16022 0 18:55 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 16081 15932 0 18:55 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 25136 25135 0 20:15 pts/6 00:00:00 grep -i git +me 31565 31478 0 17:42 pts/2 00:00:21 git-annex webapp +me 31580 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31590 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31618 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31635 27578 8 17:42 ? 00:13:42 /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +me 31689 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +me 31812 31565 0 17:42 pts/2 00:00:00 [git-annex] +me 31835 1 0 17:42 ? 00:00:02 ssh: .git/annex/ssh/example.net [mux]\"\"\"]] + +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment new file mode 100644 index 000000000..78e816f06 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-03T01:31:26Z" + content=""" +`ps fax` is much easier to read + +Yes, the assistant can be started by either `git annex assistant` or, if it's not already running, `git annex webapp` +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment new file mode 100644 index 000000000..2bf32bd37 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment @@ -0,0 +1,49 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 4" + date="2013-11-03T01:35:32Z" + content=""" +Ah, thank you. I get lost in ps's man page. :) + +[[!format sh \"\"\" +31635 ? Rl 16:16 \_ /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +31565 pts/2 Sl+ 0:21 | \_ git-annex webapp +31580 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31590 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31618 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31689 pts/2 SN+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +31812 pts/2 Z 0:00 | \_ [git-annex] + 3404 pts/2 Z 0:04 | \_ [git-annex] + 5457 pts/2 Z+ 0:00 | \_ [git-annex] + 5732 pts/2 Z+ 0:00 | \_ [git-annex] + 5752 pts/2 Z+ 0:00 | \_ [git-annex] + 6513 pts/2 Z+ 0:00 | \_ [git-annex] + 7873 pts/2 Z 0:00 | \_ [git-annex] + 8708 pts/2 Z+ 0:00 | \_ [git-annex] + 9841 pts/2 Z+ 0:00 | \_ [git-annex] +10522 pts/2 Z 0:00 | \_ [git-annex] +12777 pts/2 Z+ 0:00 | \_ [git-annex] +13878 pts/2 Z+ 0:00 | \_ [git-annex] +14276 pts/2 Z+ 0:00 | \_ [git-annex] +16022 pts/2 Sl 0:00 | \_ git-annex transferkeys --readfd 28 --writefd 22 +16079 pts/2 S 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +26828 pts/6 S+ 0:00 | \_ grep -i git +31835 ? Ss 0:02 ssh: .git/annex/ssh/example.net [mux] + 5510 ? Sl 0:06 git-annex assistant + 5522 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5573 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5679 ? SN 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- + 5680 ? Z 0:03 \_ [git-annex] + 5710 ? Z 0:00 \_ [git-annex] + 5905 ? Z 0:00 \_ [git-annex] + 5923 ? Z 0:00 \_ [git-annex] + 6552 ? Z 0:00 \_ [git-annex] + 7797 ? Z 0:00 \_ [git-annex] + 9821 ? Z 0:00 \_ [git-annex] +10462 ? Z 0:00 \_ [git-annex] +14254 ? Z 0:00 \_ [git-annex] +15932 ? Sl 0:00 \_ git-annex transferkeys --readfd 37 --writefd 20 +16081 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5785 ? Ss 0:00 ssh: .git/annex/ssh/example.net [mux] \"\"\"]] +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment new file mode 100644 index 000000000..f8f223524 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-03T02:33:14Z" + content=""" +I believe that these zombies were all caused by switching between repository views in the webapp. I was able to reproduce 1 zombie per switch between repos. + +There are a few other places where git-annex execs itself, but not many, and most of them are often used and it would be noticed if they were crypts from which pour forth the living dead. (Oddly the TV show I was thinking about watching this evening.) + +
+joey@darkstar:~/src/git-annex>git grep readProgramFile
+Assistant/Repair.hs:		program <- readProgramFile
+Assistant/Threads/Cronner.hs:	program <- liftIO $ readProgramFile
+Assistant/Threads/Cronner.hs:			program <- readProgramFile
+Assistant/Threads/Transferrer.hs:	program <- liftIO readProgramFile
+Assistant/TransferSlots.hs:		program <- liftIO readProgramFile
+Assistant/WebApp/Control.hs:		program <- readProgramFile
+Assistant/WebApp/OtherRepos.hs:	program <- readProgramFile
+Assistant/XMPP/Git.hs:		program <- readProgramFile
+Command/Assistant.hs:	program <- readProgramFile
+Config/Files.hs:readProgramFile :: IO FilePath
+Config/Files.hs:readProgramFile = do
+Remote/Git.hs:		program <- readProgramFile
+
+"""]] diff --git a/doc/bugs/__171__transferkey__187___fails_for_bare_remotes.mdwn b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes.mdwn new file mode 100644 index 000000000..b8c583618 --- /dev/null +++ b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. + +I wanted to inspect the state of an object present in a bare remote +without touching the working copy. So I issued «transferkey $KEY --from +bare-remote»; however, even for keys that are definitely present on +the remote, this would fail with «requested key is not present». + +The same method, when using a non-bare repo in «--from», would succeed +under otherwise identical conditions. + +### What steps will reproduce the problem? + +Cf. above. + +### What version of git-annex are you using? On what operating system? + +git-annex 5.20140708 + +Linux 3.15.4 + +> [[done]] not a bug per comment. diff --git a/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_1_dd4538ab19a7f8e0f49aa0156aeaae43._comment b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_1_dd4538ab19a7f8e0f49aa0156aeaae43._comment new file mode 100644 index 000000000..c7760dc05 --- /dev/null +++ b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_1_dd4538ab19a7f8e0f49aa0156aeaae43._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 1" + date="2014-07-09T08:51:22Z" + content=""" +[[!format sh \"\"\" + +# Key present on remote. +seb@vserver [ /srv/git/seb/ebooks.git ]$ ls -l annex/objects/f15/e83/WORM-s55921664-m1404679753--calibre%metadata.db/WORM-s55921664-m1404679753--calibre%metadata.db +-r--r--r-- 1 seb users 54M 6. Jul 22:49 annex/objects/f15/e83/WORM-s55921664-m1404679753--calibre%metadata.db/WORM-s55921664-m1404679753--calibre%metadata.db + +# Trying to transfer key from remote. +seb [ ~/Ebooks ]$ git annex transferkey WORM-s55921664-m1404679753--calibre%metadata.db --from vserver -d +[2014-07-09 10:49:37 CEST] read: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] +[2014-07-09 10:49:37 CEST] read: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2014-07-09 10:49:37 CEST] read: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..d2ae02b03f8b87c3465c82f96a924ac7b913fed7\",\"-n1\",\"--pretty=%H\"] +[2014-07-09 10:49:37 CEST] read: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..fc2251ff897bdbc3152c98c4142dcdf77328404b\",\"-n1\",\"--pretty=%H\"] +[2014-07-09 10:49:37 CEST] read: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..717b07d139b3375cab8c0d54c5dc6379a6c5cb89\",\"-n1\",\"--pretty=%H\"] +[2014-07-09 10:49:37 CEST] chat: git [\"--git-dir=/home/seb/Ebooks/.git\",\"--work-tree=/home/seb/Ebooks\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] +[2014-07-09 10:49:37 CEST] read: ssh [\"-O\",\"stop\",\"-S\",\"wirrsal.net\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"localhost\"] + +[2014-07-09 10:49:37 CEST] read: rsync [\"--progress\",\"--inplace\",\"--perms\",\"-e\",\"'ssh' '-S' '.git/annex/ssh/wirrsal.net' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' '-T' 'wirrsal.net' 'git-annex-shell ''sendkey'' ''/srv/git/seb/ebooks.git'' ''WORM-s55921664-m1404679753--calibre%metadata.db'' --uuid 4316c3dc-5b6d-46eb-b780-948c717b7be5 ''--'' ''remoteuuid=a97ab0e5-320e-488b-b9e8-b9da57785b81'' ''direct=1'' ''--'''\",\"--\",\"dummy:\",\"/home/seb/Ebooks/.git/annex/tmp/WORM-s55921664-m1404679753--calibre&smetadata.db\"] + requested key is not present +rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] +rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1] + + rsync failed -- run git annex again to resume file transfer + + +\"\"\"]] +"""]] diff --git a/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_2_4276ff682d10c1d4be9728f9b649ebae._comment b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_2_4276ff682d10c1d4be9728f9b649ebae._comment new file mode 100644 index 000000000..ef593e5c1 --- /dev/null +++ b/doc/bugs/__171__transferkey__187___fails_for_bare_remotes/comment_2_4276ff682d10c1d4be9728f9b649ebae._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 2" + date="2014-07-09T09:02:59Z" + content=""" +Ah, sorry. I see. So, the «%» have to be unescaped into slashes, of course. My bad. + +[[!tag done]] +"""]] diff --git a/doc/bugs/__171__uninit__187___on_direct_mode_repo_gives___171__removeLink:_permission_denied___40__Permission_denied__41____187__.mdwn b/doc/bugs/__171__uninit__187___on_direct_mode_repo_gives___171__removeLink:_permission_denied___40__Permission_denied__41____187__.mdwn new file mode 100644 index 000000000..b7dcf29b7 --- /dev/null +++ b/doc/bugs/__171__uninit__187___on_direct_mode_repo_gives___171__removeLink:_permission_denied___40__Permission_denied__41____187__.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +I suppose that in a direct mode repo, one might as well just «chmod -R ++w .git/annex; rm -r .git/annex», but I noticed that, when using «git +annex uninit», this will fail to remove some files in .git/annex. + +### What steps will reproduce the problem? +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ mkdir /tmp/foo +$ cd /tmp/foo +$ git init +$ git annex init +$ echo quux > file +$ git annex add file +$ git annex sync +$ git annex uninit +unannex file ok +git-annex: /tmp/foo/.git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4.map: removeLink: permission denied (Permission denied) + +# End of transcript or log. +"""]] + + +### What version of git-annex are you using? On what operating system? +git-annex 5.20140709-1 + +linux 3.15.5 + +### Please provide any additional information below. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn b/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn new file mode 100644 index 000000000..5495662b9 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn @@ -0,0 +1,102 @@ +Wow, what a great archiving system. Thank you for all your work on git annex! + +### Please describe the problem. + +I was using 'git annex assistant' on a brand-new annex that I created today. I had previously added about 20GB of data and a couple thousand files, mostly MP4 videos and MP3 music. + +I then used regular 'mv' to add a folder containing about 20GB of music. This went well for a while—git annex assistant added two groups of files, containing roughly 700 and 1000 MP3s each. But the third group contained 4,923 files, and it's taking a really long time to import. + +CPU usage is pretty consistently near 100%. According to the log, the files are being processed slowly. + +### What steps will reproduce the problem? + +I don't want to try to reproduce this problem until the MP3s finish being imported. I can try again later with thousands of digital photos if that would help. + +### What version of git-annex are you using? On what operating system? + +Version: 4.20130709.1 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Ubuntu 12.04.2 LTS + +### Please provide any additional information below. + +Here's the 'top' output and a snippet of the log. Let me know if you need anything else. + +[[!format sh """ +# CPU usage + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 584 ...me... 20 0 776m 147m 16m S 100 0.9 181:16.87 git-annex + + +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[201ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-06 Words.mp3 3-0(checksum...) 7-22 14:52:14 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:52:34 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing +[2013-07-22 14:52:34 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-05 Our House.mp3 2013-0(checksum...) 7-22 14:52:34 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing +[2013-07-22 14:52:54 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:52:54 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-15 Never Gonna Give You Up.mp3 (checksum...) [2013-07-22 14:52:54 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-15 Never Gonna Give You Up584.mp3"] +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/3-09 Down Under.mp3 2013-07-(checksum...) 22 14:52:55 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing : expensive scan found missing object +[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/3-09 Down Under584.mp3"] +[2013-07-22 14:52:55 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-19 Right Here Waiting.mp3 2013(checksum...) -07-22 14:52:55 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing +[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-19 Right Here Waiting584.mp3"] +[2013-07-22 14:52:55 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._1-04 Another One Bites The Dust.mp3 (checksum...) [2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/2-08 Hold On Loosely.mp3 -07(checksum...) -22 14:53:15 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:53:15 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/2-08 Hold On Loosely584.mp3"] +[2013-07-22 14:53:15 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing +[2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._6-11 Kyrie.mp3 201(checksum...) 3-07-22 14:53:15 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing +[2013-07-22 14:53:36 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:53:36 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._5-03 I'm So Excited.mp3 (checksum...) [2013-07-22 14:53:56 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-20 Roam.mp3 -07-(checksum...) 22 14:53:56 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:53:56 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-20 Roam584.mp3"] +[2013-07-22 14:53:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing +[2013-07-22 14:53:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-20 Goodbye To You.mp3 013-07(checksum...) -22 14:53:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:54:17 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-18 Don't Worry Be Happy.mp3 (checksum...) [2013-07-22 14:54:37 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-04 Rock This Town.mp3 2013-(checksum...) 07-22 14:54:37 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:54:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing +[2013-07-22 14:54:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-13 Since You've Been Gone.mp3 [2013-(checksum...) 07-22 14:54:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "2cb6e7b6ee77f9f98e01e942185265dfe18868503e93d78201485672e6939ab7.mp3", keyBackendName = "SHA256E", keySize = Just 6354105, keyMtime = Nothing}} +[2013-07-22 14:55:18 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._2-09 Believe It Or Not (Theme From _Greatest American Hero_).mp3 (checksum...) [2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-14 Only In My Dreams.mp3 2013(checksum...) -07-22 14:55:38 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:55:38 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-14 Only In My Dreams584.mp3"] +[2013-07-22 14:55:38 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing +[2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013-ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-08 Talking In Your Sleep.mp3 07-2(checksum...) 2 14:55:38 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "7cd4b9aefb99f044c5f3b24e9890f45673a63ada3b71e7399e17eb1d710ea0f6.mp3", keyBackendName = "SHA256E", keySize = Just 7181660, keyMtime = Nothing}} + +# End of transcript or log. +"""]] + +[[!meta title="direct mode mappings scale badly with thousands of identical files"]] + +[[!tag confirmed]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment new file mode 100644 index 000000000..9030d73f7 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="Interesting speedup" + date="2013-07-22T19:45:58Z" + content=""" +I noticed that there were a lot of junk files with names of the form \"._*\" in the \"music\" directory I had added. These are created by older MacOS X systems storing Mac-related files on Unix file systems. (I think they're supposed to contain the old resource fork or something weird like that.) + +So while the endless import was running, I decided to live dangerous and delete the offending files: + + find music/ -name ._\* -print0 | xargs -0 rm + +A few seconds later, the 4,923 file import finished. + +If I discover anything else interesting, I'll mention it. Once again, many thanks! +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment new file mode 100644 index 000000000..8ad833ca9 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.10" + subject="comment 2" + date="2013-07-22T20:15:03Z" + content=""" +I doubt that removing the junk files did anything, unless perhaps it deleted all the files that it had not yet gotten around to adding, and so short-circuited the slow part of the process. + +Adding a lot of files in a repository in direct mode can be slowed down some because it has to run `git hash-object` once per file to stage the symlink. It may be possible to speed this up by changing the code to write the symlink to disk in a temporary location, which would then allow it to use the single `git hash-object --batch` it keeps running, and just tell it to hash that file. + +It seems likely to me though that the sha256sum it has to run on every file before adding it is responsible for more of the slowdown. After all, that has to read every file from disk (here apparently from `/mnt` which, if it's a USB device etc could be pretty slow.) You can benchmark this at home: First look at the debug log to find the start and finish times of it adding all those files. Then clear all disk caches. Then run sha256sum on every file and time that. Compare & post here. ;) + +Adding to the overhead, the assistant is uploading every file it adds to the remote with uuid 8dbe75a4-b065-46fd-99f7-22599b2eaf06. Which means yet another read of the file, and more work depending on what kind of remote that is and how expensive it is to transfer to it. + +So, in summary, hashing, recording in git, and backing up a lot of files is really slow. It would be good to work out which parts are the slow parts, so we can think about whether that speed is acceptable for that part. +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment new file mode 100644 index 000000000..f95c368d6 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="That particular "Adding 4923 files" was unusually slow" + date="2013-07-23T11:46:03Z" + content=""" +That particular add took most of an afternoon, and didn't complete until I deleted all the junk files. + +I later did \"adding ~10,000 files\" and \"adding ~15,000 files\", all of which ran in an hour or so at most, even though I had added a second remote. So this isn't solely a disk I/O bottleneck. + +One peculiar thing about the garbage files: There were 1,626 of them, and they were all tiny: + +``` +00000000 00 05 16 07 00 02 00 00 00 00 00 00 00 00 00 00 |................| +00000010 00 00 00 00 00 00 00 00 00 01 00 00 00 09 00 00 |................| +00000020 00 26 00 00 00 20 4d 50 47 33 68 6f 6f 6b 00 00 |.&... MPG3hook..| +00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +* +00000046 +``` + +1,581 of these files had the SHA1 hash code 5460c190ef495baf43e2cd001687be272cd6a9d2, and all but one of the rest had the hash code d4b1d36c67149c981ea4b3d8392050188673817c. So if there's anything weird about this repository, it was thousands of tiny identical files in the same 'git annex assistant' adding pass. Once I scrubbed those files on later imports, things were considerably faster even when the file count increased dramatically. + +You can go ahead and close this bug report if that seems reasonable—I just thought the weird behavior was worth reporting, in case somebody else runs it into again. + +And thank you for an awesome program! + +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment new file mode 100644 index 000000000..0971f1c34 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-26T22:28:37Z" + content=""" +Did some playing around, and I am seeing a progressive slowdown when adding lots of identical files in direct mode. +This does not happen when the files have different content, and thinking about it, it's pretty clear what's going on: + +When there are a ton of files with the same content, the map file that has to list all the files using this content +get larger and larger. Each file added has to read and re-write the map file, which is obviously not going to scale well to thousands of duplicate files. +"""]] diff --git a/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn b/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn new file mode 100644 index 000000000..baaa796db --- /dev/null +++ b/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn @@ -0,0 +1,14 @@ +### Please describe the problem. + +When running a command like `git annex copy --not --in bucket --to bucket`, I got: + +`fatal: bad config file line 1 in /home/jim/tmp/git-annex14898.tmp` + +I caught `git-annex14898.tmp` before it was deleted and it contained an HTML error page. +I have a remote `https://git.example.com/jim/annex.git`, and it appears that git-annex +is requesting `https://git.example.com/jim/annex.git/config`. My server returns a 401 +Forbidden and an error page for that URL, but git-annex tries to use the response as a config file anyway. + +Jim + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__34__git-annex:_direct:_1_failed__34___on_Windows.mdwn b/doc/bugs/__34__git-annex:_direct:_1_failed__34___on_Windows.mdwn new file mode 100644 index 000000000..f8c84b440 --- /dev/null +++ b/doc/bugs/__34__git-annex:_direct:_1_failed__34___on_Windows.mdwn @@ -0,0 +1,107 @@ +### Please describe the problem. + +When attempting to clone and use a git repository in a subdirectory several levels deep on Windows, I observe symptoms very similar to those described at http://git-annex.branchable.com/direct_mode/#comment-8feee726df4e287dd3751bc77fd1441f. By contrast, when I attempt the same operation in a subdirectory higher up, the operation is successful. Logs of both sessions are given below. + +My suspicion is that this has to do with exceeding the maximum path length limitation (MAX_PATH) of 260 characters on Windows, as described here: http://msdn.microsoft.com/en-us/library/aa365247.aspx. + + +### What steps will reproduce the problem? + +See above. + + +### What version of git-annex are you using? On what operating system? + +>git annex version +git-annex version: 5.20140517-gee56d21 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 2 3 4 + +>git version +git version 1.9.0.msysgit.0 + +Operating system: Windows 7 Professional (64-bit), Service Pack 1 + + +### Please provide any additional information below. + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +C:\Users\areeves\Documents\Work\MyDirectoryHere\git>git clone ssh://areeves@myserver:/home/work/git/sbv +Cloning into 'sbv'... +remote: Counting objects: 65, done. +remote: Compressing objects: 100% (57/57), done. +remote: Total 65 (delta 26), reused 0 (delta 0) +Receiving objects: 100% (65/65), 9.25 KiB | 0 bytes/s, done. +Resolving deltas: 100% (26/26), done. +Checking connectivity... done. + + +C:\Users\areeves\Documents\Work\MyDirectoryHere\git>cd sbv +C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>git annex get + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. +git-annex: C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv\.git\annex\objects\3de\5f4\SHA256-s765223180--c9e2eebd915b4ade9429b00a7a893df928389b3fb4ab759ea9f00b0e05e18de6\: openTempFile: does not exist (No such file or directory) + + +C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>git annex direct +commit +On branch master +Your branch is up-to-date with 'origin/master'. + +nothing to commit, working directory clean +ok + +git-annex: C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv\.git\annex\objects\3de\5f4\SHA256-s765223180--c9e2eebd915b4ade9429b00a7a893df928389b3fb4ab759ea9f00b0e05e18de6\: openTempFile: does not exist (No such file or directory) +failed +git-annex: direct: 1 failed + + +C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>cd c:\temp +c:\temp>git clone ssh://areeves@myserver:/home/work/git/sbv +Cloning into 'sbv'... +remote: Counting objects: 65, done. +remote: Compressing objects: 100% (57/57), done. +remote: Total 65 (delta 26), reused 0 (delta 0) +Receiving objects: 100% (65/65), 9.25 KiB | 0 bytes/s, done. +Resolving deltas: 100% (26/26), done. +Checking connectivity... done. + +c:\temp>cd sbv +c:\temp\sbv>git annex direct + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. +(Recording state in git...) + + +c:\temp\sbv>git annex get +get BigBinaryFile_Data_Package_2012-03-31.tar.bz2.gpg (merging origin/git-annex into git-annex...) +(Recording state in git...) +sent 30 bytes received 765316741 bytes 11011752.10 bytes/sec +total size is 765223180 speedup is 1.00 +ok +(Recording state in git...) + + +c:\temp\sbv> + +# End of transcript or log. +"""]] diff --git a/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn b/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn new file mode 100644 index 000000000..f129abf62 --- /dev/null +++ b/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn @@ -0,0 +1,15 @@ +The following commands show the failure: + +$ mkdir d && touch d/f + +$ mkdir g && cd g && git annex add ../d/f + +add ... ok + +error: Invalid path '.git/annex/objects/Jx/... + +... + +Then it seems it is enough to 'git add ../d/f' to complete the operation. + +> Thanks for reporting, [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn new file mode 100644 index 000000000..68ad05809 --- /dev/null +++ b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +Using assistant via xfce's "Internet -> Git annex" menu item, trying to connect to an ssh server fails + +### What steps will reproduce the problem? +Use xubuntu 13.04 and git-annex + +### What version of git-annex are you using? On what operating system? +git-annex version: 3.20121112ubuntu2 + +xubuntu 13.04 + +### Please provide any additional information below. +if I "sudo apt-get install ssh-askpass", this gets resolved. I think this should be fixed in the ubuntu repository's program dependencies. + +Also if I run "git-annex webapp" from the terminal, this doesn't happen because it will ask me for the password in the terminal. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory Received disconnect from xxx.xxx.xxx.xxx: 2: Too many authentication failures for + +# End of transcript or log. +"""]] + +> [[fixed|done]]; the assistant no longer recommends ssh-askpass, it does +> its own ssh password prompting and is its own ssh password agent. +> --[[Joey]] diff --git a/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment new file mode 100644 index 000000000..34a2ed325 --- /dev/null +++ b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T20:08:57Z" + content=""" +It's not a dependency. It's a recommends. + +apt does not install new recommends that get added to a package. Adding that recommends only causes it to be installed by default when new users install the package + +This seems to be the best I can do, short of adding a separate git-annex-assistant package, which could depend on ssh-askpass. +Might not be a bad idea.. +"""]] diff --git a/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn b/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn new file mode 100644 index 000000000..5f6d35fad --- /dev/null +++ b/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +Getting file from a linux rsync special remote from a windows machine is impossible. + +### What steps will reproduce the problem? +git annex get . + +### What version of git-annex are you using? On what operating system? +5.20140316-gbe47273 on windows 8. + +### Please provide any additional information below. + +Launching in debug mode, we see the wrong \\ used instead of / used. Syntax that rsync doesn't understand on a linux box. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +read: rsync ["-e","'ssh' '-l' 'git' '-T' +","--progress","--inplace","git@strasser-family.ch:~/files/G5\\jj\\'SHA256E-s675 +--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat\\SHA256E- +s675--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat'","/c +ygdrive/c/Users/pablo/Desktop/Nouveau dossier/InnerResult/.git/annex/tmp/SHA256E +-s675--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat"] + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn b/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn new file mode 100644 index 000000000..eba11aa2d --- /dev/null +++ b/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn @@ -0,0 +1,51 @@ +### Please describe the problem. + +When `git annex add` is run on dangling symlinks which point to the annex, the pre-commit hook `git annex pre-commit .` is run which, in turn, runs `git annex fix`. + +During this fix, the mtime of the symlink changes. I assume the symlink is actually deleted and re-created in the background which would explain this behavior. + +### What steps will reproduce the problem? + +[[!format sh """ +# manual import of annexed data into new annex +% mkdir repo1.annex +% cd !$ +% git init; git annex init +% echo hi > foo +% git annex add foo; git commit -m bar +% mkdir ../repo2 +% cd !$ +% git init; git annex init +% mkdir .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/ +% cp -ax ../repo1/.git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% mkdir subdirectory +% cd !$ +% cp -ax ../../repo1.annex/foo . +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 194 Jul 11 12:20 foo -> .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% git annex fix # this does nothing +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 194 Jul 11 12:20 foo -> ..git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% git annex add foo +add foo ok +(Recording state in git...) +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 197 Jul 11 12:23 foo -> ../.git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% + +"""]] + + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130709 on Debian unstable i386 and x64. + +### Please provide any additional information below. + +As noted in [[todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/#comment-e0ea68b5f84cf4130001ad34e9f3b2ff]], `git annex import` does not seem to work on other repos which is why I tried to build this by hand. This works fine and retains mtime as long as I don't need to change the relative depth the symlinks. +I think that the issue above should be fixed in and as of itself, though. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn new file mode 100644 index 000000000..ef0f85662 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn @@ -0,0 +1,88 @@ +As per topic, `git annex forget --drop-dead --force` does not behave as expected. Instead of getting rid of dead repositories, it actually revives them. + +I messed up the initial setup of the S3 special remote and instead of risking manual intervention, I figured it would be cleanest to nuke the old special remotes, using a new one instead. +And yes, I should have used a test repo :( + +As this is apu.debconf.org, you could get access to the repo if that helps. + + +[[!format sh """ +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex dead 070cff8a-6302-4aa7-a63c-3fdd34e598a2 +dead 070cff8a-6302-4aa7-a63c-3fdd34e598a2 ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex dead 0bae683f-bede-43dd-a815-c4f8fb6db32d +dead 0bae683f-bede-43dd-a815-c4f8fb6db32d ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex initremote amazon_aws_s3-us_east_1--SHA512E type=S3 encryption='none' embedcreds='no' fileprefix='SHA512E/' bucket='debian-video' +initremote amazon_aws_s3-us_east_1--SHA512E (checking bucket...) git-annex: This bucket is already in use by a different S3 special remote, with UUID: 0bae683f-bede-43dd-a815-c4f8fb6db32d +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex forget --drop-dead --force +forget git-annex (Recording state in git...) +ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex version +git-annex version: 5.20140117~bpo70+2 +build flags: Assistant Webapp Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +richih@apu (git)-[master] /srv/video/video.debian.net % cat /etc/issue +Debian GNU/Linux 7 \n \l + +richih@apu (git)-[master] /srv/video/video.debian.net % +"""]] + +> [[fixed|done]] via not removing from trust.log --[[Joey]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment new file mode 100644 index 000000000..05aa545ef --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:19:58Z" + content=""" +You still have git remotes configured with the uuid of the remote, so `git annex info` pulls that data in. Since --drop-dead removes all mention of the remote from the git-annex branch, including that its trust level is dead, the remaining info from the .git/config takes effect. + +--drop-dead could `git remote rm` but that won't help other clones of the repo that also have the dead remote. Instead, I think it may make sense for --drop-dead to avoid removing the uuid from trust.log, so it will still know this remote is dead. + +(Of course, you can easily deal with this locally by `git remote rm` yourself.) +"""]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment new file mode 100644 index 000000000..8bdde8972 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment @@ -0,0 +1,90 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2014-03-26T22:39:34Z" + content=""" +Sorry, I had to remove the fixed tag. + + +The bug makes sense, as does your fix. I didn't even consider that this may be the cause. Still, `git remote rm` and `git annex forget --drop-dead --force` does not seem to be enough to truly get rid of the repo (and its UUID & state): + +[[!format sh \"\"\" +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: git4392 +local annex size: 884.64 gigabytes +annexed files in working tree: am4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex dead amazon_s3_us_east--SHA512E +dead amazon_s3_us_east--SHA512E ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex dead aws_s3_us_east--SHA512E +dead aws_s3_us_east--SHA512E ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git remote rm amazon_s3_us_east--SHA512E +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git remote rm aws_s3_us_east--SHA512E +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex forget --drop-dead --force +forget git-annex (Recording state in git...) +ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex initremote amazon_aws_s3-us_east_1--SHA512E type=S3 encryption='none' embedcreds='no' fileprefix='SHA512E/' bucket='debian-video' +initremote amazon_aws_s3-us_east_1--SHA512E (checking bucket...) git-annex: This bucket is already in use by a different S3 special remote, with UUID: 0bae683f-bede-43dd-a815-c4f8fb6db32d +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % cat .git/annex +cat: .git/annex: Ist ein Verzeichnis +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % cat .git/config +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = 92e9fac9-97ec-401f-a421-33f6b4f43e47 + version = 5 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info 537 23:33:37 Mi 26.03.2014 +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % +\"\"\"]] +"""]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment new file mode 100644 index 000000000..5b5784012 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-27T17:40:51Z" + content=""" +git-annex stores the uuid of a S3 remote inside the bucket for various reasons. Now that you have removed all knowledge of the remote from the repository, when you attempt to reuse the same bucket for some reason, git-annex has no way to know that this is a remote it used to use with that bucket. + +I think this behavior is entirely reasonable. Also, it's not what you filed the original bug report about; I fixed that bug. I'm going to re-close this. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn b/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn new file mode 100644 index 000000000..7edebe584 --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. + +mtimes are clobbered with what I think is the time of the first time `git annex` saw a file in that directory on all files which are `git annex import`ed. + + +### What steps will reproduce the problem? + + richih@eudyptes (git)-[master] ~/killme/target % date; stat ../source/*; date; git annex import ../source/*; date; stat *; date + Tue Jul 30 01:41:43 CEST 2013 + File: ‘../source/foo’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 110095 Links: 1 + Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:03.860703428 +0200 + Modify: 2013-07-30 01:41:03.860703428 +0200 + Change: 2013-07-30 01:41:03.860703428 +0200 + Birth: - + File: ‘../source/foobar’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 110104 Links: 1 + Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:05.512703349 +0200 + Modify: 2013-07-30 01:41:05.512703349 +0200 + Change: 2013-07-30 01:41:05.512703349 +0200 + Birth: - + Tue Jul 30 01:41:43 CEST 2013 + import foo (checksum...) ok + import foobar (checksum...) ok + (Recording state in git...) + Tue Jul 30 01:41:43 CEST 2013 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:43.704701516 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:43.704701516 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + Tue Jul 30 01:41:43 CEST 2013 + richih@eudyptes (git)-[master] ~/killme/target % + + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130709 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +Debian unstable amd64 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment new file mode 100644 index 000000000..acb266abe --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-07-29T23:49:12Z" + content=""" +PS: Maybe adding tests that _all_ commands leave mtime in place would be an option? As it is, I keep (for some value of) finding places where mtimes are clobbered. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment new file mode 100644 index 000000000..842c713df --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T17:40:04Z" + content=""" +git-annex makes only a best-effort attempt to preserve mtime. There are multiple cases where it cannot: + +* filesystems that do not support changing the mtime of a symlink +* special remotes +* when 2 files with the same content get stored in the annex, the mtime of one must win over the other since we only have 1 inode + +This last seems to be what has happened in the example you show. Both `foo` and `foobar` are empty. I'm not sure where the 01:19:41 time came from -- perhaps you had a third empty file that was not shown? + +I've tested `git annex import` and it preserves mtimes otherwise. + + +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment new file mode 100644 index 000000000..f3cfcfd2d --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment @@ -0,0 +1,95 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2013-08-02T06:57:12Z" + content=""" +In this particular case + +* It's XFS +* It's a normal repo +* That the inode can have only one shared mtime is obvious, but the symlinks could have their own: + +Random line to make MarkDown happy + + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:20:11.915507749 +0200 + Modify: 2013-07-30 01:19:41.131509226 +0200 + Change: 2013-07-30 01:20:11.915507749 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % touch foo + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:54:34.464668766 +0200 + Modify: 2013-08-02 08:54:34.464668766 +0200 + Change: 2013-08-02 08:54:34.464668766 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % touch --no-dereference foo + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:55:07.796667610 +0200 + Modify: 2013-08-02 08:55:07.796667610 +0200 + Change: 2013-08-02 08:55:07.796667610 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:54:34.464668766 +0200 + Modify: 2013-08-02 08:54:34.464668766 +0200 + Change: 2013-08-02 08:54:34.464668766 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % + +As to where the initial time of 01:19:41 came from: Yes, those were earlier tests with other imports of empty files. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment new file mode 100644 index 000000000..8bc6274f9 --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-09-26T09:08:11Z" + content=""" +Fixed in http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=98fc7e8 +"""]] diff --git a/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn new file mode 100644 index 000000000..12a5e0c14 --- /dev/null +++ b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn @@ -0,0 +1,95 @@ +### Please describe the problem. + +Building a recent git-annex with cabal with the `minimal build' +options given in the installation instructions fails. It is probably +just a matter of fixing the dependencies in the cabal file. + +### What steps will reproduce the problem? +Compile with: + +cabal install git-annex-5.20140108 --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns" + +### What version of git-annex are you using? On what operating system? +Linux 2.6.32-5-686 i686 GNU/Linux + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Resolving dependencies... +[ 1 of 27] Compiling Utility.PartialPrelude ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/PartialPrelude.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/PartialPrelude.o ) +[ 2 of 27] Compiling Utility.FileSystemEncoding ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FileSystemEncoding.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FileSystemEncoding.o ) +[ 3 of 27] Compiling Utility.Applicative ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Applicative.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Applicative.o ) +[ 4 of 27] Compiling Utility.Data ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Data.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Data.o ) +[ 5 of 27] Compiling Utility.Exception ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Exception.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Exception.o ) +[ 6 of 27] Compiling Utility.Tmp ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Tmp.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Tmp.o ) +[ 7 of 27] Compiling Utility.Env ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Env.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Env.o ) +[ 8 of 27] Compiling Utility.UserInfo ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/UserInfo.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/UserInfo.o ) +[ 9 of 27] Compiling Utility.OSX ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/OSX.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/OSX.o ) +[10 of 27] Compiling Utility.Monad ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Monad.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Monad.o ) +[11 of 27] Compiling Utility.Misc ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Misc.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Misc.o ) +[12 of 27] Compiling Utility.Process ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Process.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Process.o ) +[13 of 27] Compiling Utility.Path ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Path.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Path.o ) +[14 of 27] Compiling Utility.FreeDesktop ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FreeDesktop.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FreeDesktop.o ) +[15 of 27] Compiling Assistant.Install.AutoStart ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/AutoStart.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/AutoStart.o ) +[16 of 27] Compiling Utility.SafeCommand ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/SafeCommand.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/SafeCommand.o ) +[17 of 27] Compiling Utility.ExternalSHA ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/ExternalSHA.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/ExternalSHA.o ) +[18 of 27] Compiling Utility.Directory ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Directory.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Directory.o ) +[19 of 27] Compiling Common ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Common.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Common.o ) +[20 of 27] Compiling Git.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Git/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Git/Version.o ) +[21 of 27] Compiling Config.Files ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Config/Files.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Config/Files.o ) +[22 of 27] Compiling Assistant.Install.Menu ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/Menu.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/Menu.o ) +[23 of 27] Compiling Build.TestConfig ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/TestConfig.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/TestConfig.o ) +[24 of 27] Compiling Build.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Version.o ) +[25 of 27] Compiling Build.Configure ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Configure.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Configure.o ) +[26 of 27] Compiling Build.DesktopFile ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/DesktopFile.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/DesktopFile.o ) +[27 of 27] Compiling Main ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Setup.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Main.o ) +Linking /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/setup ... + checking version...fatal: Not a git repository (or any of the parent directories): .git + 5.20140107 + checking UPGRADE_LOCATION... not available + checking git... yes + checking git version... 1.7.2.5 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking xargs -0... yes + checking rsync... yes + checking curl... no + checking wget... yes + checking bup... no + checking quvi... no + checking newquvi... no + checking nice... yes + checking ionice... yes + checking nocache... no + checking gpg... gpg + checking lsof... lsof + checking git-remote-gcrypt... not available + checking ssh connection caching... no + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum +Configuring git-annex-5.20140108... +Building git-annex-5.20140108... +Preprocessing executable 'git-annex' for git-annex-5.20140108... + +Remote/External.hs:29:8: + Could not find module `Control.Concurrent.STM' + It is a member of the hidden package `stm-2.4.2'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +Failed to install git-annex-5.20140108 +cabal: Error: some packages failed to install: +git-annex-5.20140108 failed during the building phase. The exception was: +ExitFailure 1 + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment new file mode 100644 index 000000000..a1f52dc5e --- /dev/null +++ b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnlotDRSLW2JVXY3SLSwhrcHteqUHhTtoY" + nickname="Péter" + subject="Not fixed." + date="2014-01-27T00:43:45Z" + content=""" +It's still failing for me, on both i386 and amd64. + +Where exactly is it fixed? + +How is it possible to install git-annex using Cabal? + +http://stackoverflow.com/questions/21371272/cabal-missing-dependency-error + +$ cabal install git-annex --force-reinstalls --bindir=$HOME/bin.local -f\"-assistant -webapp -webdav -pairing -xmpp -dns\" +... +Configuring git-annex-5.20140116... +Building git-annex-5.20140116... +Preprocessing executable 'git-annex' for git-annex-5.20140116... + +Remote/External.hs:29:8: + Could not find module `Control.Concurrent.STM' + It is a member of the hidden package `stm-2.4.2'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + It is a member of the hidden package `stm-2.2.0.1'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +cabal: Error: some packages failed to install: +git-annex-5.20140116 failed during the building phase. The exception was: ExitFailure 1 +$ cabal install stm --force-reinstalls --bindir=$HOME/bin.local +Resolving dependencies... +All the requested packages are already installed: +stm-2.4.2 +Use --reinstall if you want to reinstall anyway. + +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn new file mode 100644 index 000000000..21e7f7b9a --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. +I didn't spot this bugs page before so here is my report I have commented on android page + +In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it "Synced with onerussian.com_annex but not with Annex" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a "new" Repository: /storage/extSdCard/Annex which also listed the 1st local but with "Failed to sync with localhost" message -- no remote one listed. Whenever I try to "Switch repository" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there): + +error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory fatal: unable to fork +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? +android + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment new file mode 100644 index 000000000..aedeaabf3 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 1" + date="2013-07-28T11:21:42Z" + content=""" +I can confirm it's virtually impossible to change repository on Android (Stock Galaxy Nexus GSM). you click on the files link (which is hard to see on phone as it is in the notification blocks) and then click click \"Switch repository\", on the next page, select a different one. I think it does actually change, occasionally, you have to kill and restart the daemon at least and I think you also have to restart the phone. +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment new file mode 100644 index 000000000..0ee4e8166 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 2" + date="2013-07-28T11:46:30Z" + content=""" +For notification +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment new file mode 100644 index 000000000..b181a4fa1 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="yasin.zaehringer" + ip="90.218.200.128" + subject="comment 3" + date="2014-04-02T11:43:52Z" + content=""" +The bug still exists. It is not possible to change the repository in the WebApp. +"""]] diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn new file mode 100644 index 000000000..edc4e67d7 --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn @@ -0,0 +1,59 @@ +in a setup where an rsync(+gnupg) remote is shared among different users of the same git-annex repository (ie, the people copying to there use different accounts on the rsync server), acls are not honored under some circumstances. + +the error message reads as follows: + + copy …filename… (to prometheus...) Reading passphrase from file descriptor 11 + + sending incremental file list + rsync: recv_generator: mkdir "/home/shared/photos/encrypted_storage/9a6/0ff" failed: Permission denied (13) + *** Skipping any contents from this failed directory *** + 9a6/0ff/ + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.8] + + sent 185 bytes received 18 bytes 135.33 bytes/sec + total size is 2119419 speedup is 10440.49 + + This could have failed because --fast is enabled. + failed + +the acl used in my particular case is: + + # file: . + # owner: chrysn + # group: chrysn + user::rwx + group::rwx + group:family:rwx + mask::rwx + other::r-x + default:user::rwx + default:group::rwx + default:group:family:rwx + default:mask::rwx + default:other::r-x + +sub-directories are observed to have diverging permissions, though: + + # file: 794 + # owner: chrysn + # group: chrysn + user::rwx + group::rwx #effective:r-x + group:family:rwx #effective:r-x + mask::r-x + other::r-x + default:user::rwx + default:group::rwx + default:group:family:rwx + default:mask::rwx + default:other::r-x + +something seems to apply the umask (default 022) and revoke group write access from the files, overruling the acl. this is not what a umask is normally used for, and smells of [coreutils slavishly observing posix specs that don't consider all features](http://savannah.gnu.org/bugs/?19546) -- the observed effect is exactly what's described there. + +the git annex version used is 3.20121017 as in debian, the receiving site uses rsync 3.0.7; the affected directories come from a time when these very versions are known to have been used. + +this is probably not a bug of git-annex alone, but affects its operation and might be solvable by invoking rsync differently. + +(this is kind of a follow-up on [[forum/__34__permission_denied__34___in_fsck_on_shared_repo]]) + +[[!tag forwarded]] diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment new file mode 100644 index 000000000..c24b02157 --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-06T20:49:47Z" + content=""" +I don't know much about ACLs, but you might try setting `remote.prometheus.annex-rsync-options` with rsync options such as --acls or --no-acls +"""]] diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment new file mode 100644 index 000000000..96dbc6a2e --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="further tracking" + date="2012-11-11T01:15:41Z" + content=""" +the behavior is rooted in rsync, which behaves similar to `mkdir -p`. it can probably be worked around by configuring the rsync option `--chmod=775`, but that would add executability to files. + +i've opened a bug in rsync's bug tracker at , let's see what the developer says. +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn new file mode 100644 index 000000000..95751527b --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn @@ -0,0 +1,87 @@ +Creating additional branches in history seems to slow down the 'git annex unused' command quadratically, even if the location of the branches should be irrelevant as far as unused data goes. + +This was tested on: + + $ git annex version + git-annex version: 3.20130216 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +What steps will reproduce the problem? + + $ mkdir a + $ cd a + $ git init + $ git annex init + $ i=0 ; while test $i -lt 1000; do dd if=/dev/urandom of=$i.img bs=1M count=1; i=$(($i+1)); done + $ git annex add . + $ git commit -m"foo" + $ git rm 1* + $ git commit -m"bar" + $ git log --oneline --decorate + ffcca3a (HEAD, master) bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.76 + user 0.40 + sys 0.06 + git commit --allow-empty -m"baz" + $ git log --oneline --decorate + 4390c32 (HEAD, master) baz + ffcca3a bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.75 + user 0.38 + sys 0.07 + $ git branch boo HEAD^ + $ time -p git annex unused + unused . (checking for unused data...) (checking boo...) (checking master...) + (...) + real 1.29 + user 0.62 + sys 0.08 + arand@mas:~/tmp/more/a(master)$ git branch beeboo HEAD^ + 4390c32 (HEAD, master) baz + ffcca3a (boo, beeboo) bar + 3e7793d foo + arand@mas:~/tmp/more/a(master)$ time -p git annex unused + unused . (checking for unused data...) (checking beeboo...) (checking master...) + (...) + real 2.50 + user 1.12 + sys 0.14 + $ git branch -d boo beeboo + $ git log --oneline --decorate + 4390c32 (HEAD, master) baz + ffcca3a bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.77 + user 0.42 + sys 0.04 + +What is the expected output? What do you see instead? + +I would expect the time to be the same in all the above cases. + +What version of git-annex are you using? On what operating system? + + $ git annex version + git-annex version: 3.20130216 + +On current Debian sid/experimental + +> [[Done]], thanks to guilhem. We ended up using a different algorythm +> which is faster yet, basically it now does a diff-index between the +> index and each branch for its second stage bloom filter. +> Speedup is 30x with 0 (or 1?) branch, and then massive for each +> additional branch. --[[Joey]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment new file mode 100644 index 000000000..f8b7e789b --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 1" + date="2013-02-26T20:29:05Z" + content=""" +`git annex unused` finds content that is not used by the working tree or by *any* branch is unused. For the working tree, it can look at the symlinks on disk, which is the fastest option. + +For branches, it has to first use `git ls-tree` to find the files on the branch, and then use `git cat-file` to look up the key used by each file. It does this as fast as it can (eg, it runs a single `git cat-file --batch`, rather than one process per file). Still, this is pulling potentially a lot of data out of git, and it gets pretty slow. + +I've spent a lot of time optimising this as much as is possible with these constraints. One nice one is that, if it finds no unused keys after checking the working tree, it can stop, rather than checking any branches. Your example avoids this optimisation. + +Another optimisation is to only check each git ref once, even if multiple branches refer to it. You can see this optmisation firing in your transcript, when it only shows it's checking one branch of the two identical branches you've made. + +Indeed, if you go on and add 100 identical branches, you'll find it runs in just about the same time it ran with 2 branches. (There's a little overhead in getting the list of branches and throwing out the duplicates, but that's all.) + +What then explains your numbers? Well, I have no idea. I cannot replicate them; I tend to see about the same amount of time taken with two duplicate branches as with one branch. I suspect you just didn't get statistically valid results, which playing around with `time` at the command line often doesn't, +due to caching, other active processes, etc. +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment new file mode 100644 index 000000000..0954e8988 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 2" + date="2013-02-27T15:53:37Z" + content=""" +Hmm, indeed, after further testing it seems like the increased time due to the duplicate branch seems to have been a random quirk, bleh :( + +But shouldn't it theoretically be possible to optimize out much of the overhead of multiple very-similar (though not identical) branches though? + +I've experimented around with ls-tree and cat-file in a bash script[1], and in this primitive implementation the running time seems to be considerably lower (~0.3s vs ~4s), with much less overhead for extra very-similar branches (~0.7s vs ~37s) + +Am I missing some key element that's the reason for the time taken by git annex unused? + + +[1] primitive annex unused script: [https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-funused](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-funused) + +timing script: [https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-testunused](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-testunused) + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment new file mode 100644 index 000000000..9c1da8eea --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 3" + date="2013-08-10T17:00:21Z" + content=""" +So, if I've understood it correctly (please correct me if that's not the case :) ) + +Currently git-annex unused goes through this process + +* Look through all files in the index and find those which are git-annex keys (git ls-tree + git cat-file) +* Look through all files the current ref and find those which are git-annex keys (git ls-tree + git cat-file) +* For each ref in the repo + - Look through all files and find those which are git-annex keys (git ls-tree + git cat-file) +* Then at the end + - Compare this list of keys with what is stored in .git/annex/objects + - Print out any objects which does not match a key. + +If that's the case, it means if that if you have multiple refs, even is they only differ by single empty commits, git-annex will end up doing a cat-file for the same file multiple times (one per ref), which is expensive. + +Would it be possible to change the algorithm for git-annex unused into instead something like: + +* For the index, HEAD, and all refs + - Create a list all files and remove those which are duplicates based on their sha1 hash (git ls-tree | uniq) +* Then Look through this reduced list to find those which are git-annex keys (git cat-file) +* Then check as before + +Unless this bypasses some safety or case I've overlooked, I think it should be possible to speed up git-annex unused quite a bit. + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment new file mode 100644 index 000000000..3de85407e --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-08-11T12:48:47Z" + content=""" +I think that could work. It would probably tend to use more memory than the current method, but only a small constant multiplier more. And unused is already the one command that necessarily needs to hold information about the whole repository in memory. + +Note that git cat-file is only needed when dealing with branches other than the current working tree. In that special case, it can, and AFAIK does have the optimisation of looking directly at the symlink target instead. Your method may turn out to be both slower and use more memory in that case. It may make sense to special case handling of that case and keep the current code paths there (most of the necessary code for it is used by other stuff anyway). +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment new file mode 100644 index 000000000..21890a4e1 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment @@ -0,0 +1,114 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 5" + date="2013-08-11T20:43:22Z" + content=""" +I've compared my bash/coreutils implementation mentioned above [annex-funused](https://gitorious.org/arand-scripts/arand-scripts/blobs/918cc79b99e22cbdca01ea4de10e2ca64abfc27a/annex-funused) with `git annex unused` in various situations, and from what I've seen `annex-funused` is pretty much always faster. + +In the case of no unused files they seem to be about the same. + +In all other cases there is a very considerable difference, for example, in my current main annex I get: + + $ time git annex unused + unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking barracuda160G/master...) ok + + real 5m13.830s + user 2m0.444s + sys 0m28.344s + + +whereas + + $ time annex-funused + == WARNING == + This program should NOT be trusted to reliably find unused files in the + git annex. + + + real 0m1.569s + user 0m2.024s + sys 0m0.184s + +I tried to check memory usage via `/usr/bin/time -v` as well, and that showed (re-running in the same annex as above) + +annex-funused + + Maximum resident set size (kbytes): 13560 + +git annex unused + + Maximum resident set size (kbytes): 29120 + + +I've also written a comparison script [annex-testunused](https://gitorious.org/arand-scripts/arand-scripts/blobs/918cc79b99e22cbdca01ea4de10e2ca64abfc27a/annex-testunused) (needs annex-funused in $PATH) which creates an annex with a bunch of unused files and compares the running time for both versions: + +
+$ annex-testunused
+Initialized empty Git repository in /tmp/tmp.fmsAvsPTcd/.git/
+init  ok
+(Recording state in git...)
+###
+* b2840d7 (HEAD, master) delete ~1100 files
+* c4a1e3a add 3000 files
+* bc19777 (git-annex) update
+* b3e6539 update
+* bec2c8f branch created
+annex unused
+real 0m4.154s
+real 0m2.029s
+real 0m2.044s
+annex funused
+real 0m0.923s
+real 0m0.933s
+real 0m0.905s
+Initialized empty Git repository in /tmp/tmp.7qFoCRWzB3/.git/
+init  ok
+(Recording state in git...)
+###
+* a5ff392 (HEAD, master) empty
+* cca4810 (1) delete ~1100 files
+* 587c406 add 3000 files
+* de0afeb (git-annex) update
+* 37b7881 update
+* 1735062 branch created
+annex unused
+real 0m3.499s
+real 0m3.443s
+real 0m3.435s
+annex funused
+real 0m0.956s
+real 0m0.956s
+real 0m0.874s
+Initialized empty Git repository in /tmp/tmp.L5fjdAgnFv/.git/
+init  ok
+(Recording state in git...)
+###
+* 94463a0 (HEAD, master) empty
+* e115619 (10) empty
+* 20686d4 (9) empty
+* 2e01a3f (8) empty
+* 043289d (7) empty
+* 6a52966 (6) empty
+* 0dc866d (5) empty
+* 35db331 (4) empty
+* 48504bc (3) empty
+* e25cac7 (2) empty
+* 655d026 (1) delete ~1100 files
+* 91a07d1 add 3000 files
+* 3c9ac62 (git-annex) update
+* c5736e0 update
+* 862d5b8 branch created
+annex unused
+real 0m16.242s
+real 0m16.277s
+real 0m16.246s
+annex funused
+real 0m0.960s
+real 0m0.960s
+real 0m0.927s
+
+ +So, unless I've missed something fundamental (I keep thinking I might have...), it seems to be very consistently faster, and scale ok where `git annex unused` scales rather poorly. + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment new file mode 100644 index 000000000..a4fea313f --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 6" + date="2013-08-12T04:14:18Z" + content=""" +The memory usage is probably lower because `sort` and `comm` and bash's `<(command)` all have particularly well tuned memory usage with 37 years of history behind them. Particularly GNU `sort` will transparently use a temp file rather than storing too much data in memory, and does rather sophisticated stuff to make that work efficiently. It's rather harder to get that kind of behavior when not using the unix tools and instead using stock programming language primatives like sort() and hashes. + +I still suspect that `git cat-file` is slower than a direct readlink(2) of the symlink, when that can be done. +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment new file mode 100644 index 000000000..c2dbd1810 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 7" + date="2013-08-12T18:07:44Z" + content=""" +Hmm, probably, do you think this way of getting everything and then doing the filtering could work reasonably in git-annex? Assuming \"git cat-file --batch\" is the main bottleneck, reducing the amount of runs for it would still likely be an improvement? +"""]] diff --git a/doc/bugs/adding_a_remote_server_fails.mdwn b/doc/bugs/adding_a_remote_server_fails.mdwn new file mode 100644 index 000000000..06e6af4da --- /dev/null +++ b/doc/bugs/adding_a_remote_server_fails.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +I tried to add a remote server to my annex repo using the webapp. + +### What steps will reproduce the problem? +Configuration -> Repositories -> Remote server -> Fill in stuff, use public key auth -> click "check this server" -> enjoy + +### What version of git-annex are you using? On what operating system? +OpenSUSE Tumbleweed, git-annex 5.20140709-gc75193e + +### Please provide any additional information below. +Error message: `user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 2)` + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2014-07-11 12:03:52 CEST] main: starting assistant version 5.20140709-gc75193e +[2014-07-11 12:03:53 CEST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140709-gc75193e +(scanning...) [2014-07-11 12:03:53 CEST] Watcher: Performing startup scan +(started...) gpg: /home/zilti/.gnupg/gpg.conf:200: argument not expected +gpg: /home/zilti/.gnupg/gpg.conf:201: invalid option +gpg: /home/zilti/.gnupg/gpg.conf:200: argument not expected +gpg: /home/zilti/.gnupg/gpg.conf:201: invalid option + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/adding_a_remote_server_fails/comment_1_cf7ea9171f002c5793a882b42d33a77d._comment b/doc/bugs/adding_a_remote_server_fails/comment_1_cf7ea9171f002c5793a882b42d33a77d._comment new file mode 100644 index 000000000..1dc6d6954 --- /dev/null +++ b/doc/bugs/adding_a_remote_server_fails/comment_1_cf7ea9171f002c5793a882b42d33a77d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="obvious questions" + date="2014-07-11T18:12:44Z" + content=""" +From what source did you install git-annex? + +What version of gpg is installed on your system? What is the contents of line 200 and 201 of/home/zilti/.gnupg/gpg.conf? +"""]] diff --git a/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn b/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn new file mode 100644 index 000000000..37a9c2a2e --- /dev/null +++ b/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn @@ -0,0 +1,16 @@ +Adding eg a ssh remote when the remote repo already exists, in the webapp, +resets its group to transfer. It also clears any preferred content +settings. + +Adding existing local repositories or repositories from removable drives +may have the same problems. Didn't check yet. + +[[!tag confirmed]] --[[Joey]] + +> Fixed for local repos and repos on removable drives. Still open for +> ssh remotes (incl gcrypt). --[[Joey]] + +>> Fixed for ssh (including gcrypt) too. +>> +>> Also affected enabling existing special remotes, like webdav; that's +>> also fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn new file mode 100644 index 000000000..3383dd52a --- /dev/null +++ b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn @@ -0,0 +1,197 @@ +### Please describe the problem. + +"git annex --pathdepth=3 addurl URL" displays this error message and reports "failed", even though the operation succeeds when using --fast: + + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + +### What steps will reproduce the problem? + +I have lots of downloaded files I'd like to add an URL to, so I'm doing this: + + $ ga addurl --fast --pathdepth=3 $(for f in *.mp3; do echo http://traffic.libsyn.com/geologicpodcast/$f; done) + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + [... Delete 166 lines ...] + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 60 failed + $ + +This "ga" command is a wrapper around git-annex to make it work everywhere with the .tar.gz version: + + #!/bin/bash + + #======================================================================= + # ga + # File ID: e89047ce-29d1-11e2-bb6f-00c0a8deee11 + #======================================================================= + + if test "$1" = "sync"; then + stat_output="$(git status --porcelain | grep -v '^??')" + test -n "$stat_output" && { echo ga: Repo has modifications, will not git-annex sync >&2; exit 1; } + fi + /opt/git-annex/runshell /opt/git-annex/git-annex "$@" + +$PATH is also set up to include /opt/git-annex/bin/ , and all other operations work nicely. In my ~/bin/ directory I've also symlinked this script to "git-annex". + +When dropping "--fast", this happens: + + $ ga addurl --pathdepth=3 $(for f in *.mp3; do echo http://traffic.libsyn.com/geologicpodcast/$f; done | tail -20 | head -1) + addurl (downloading http://traffic.libsyn.com/geologicpodcast/GeologicPodcast302-Feb28-13.mp3 ...) --2013-07-04 14:08:01-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast302-Feb28-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://ec.libsyn.com/p/6/9/b/69b9837556ed5238/GeologicPodcast302-Feb28-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cd5c0f85&c_id=5440885 [following] + --2013-07-04 14:08:02-- http://ec.libsyn.com/p/6/9/b/69b9837556ed5238/GeologicPodcast302-Feb28-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cd5c0f85&c_id=5440885 + Resolving ec.libsyn.com (ec.libsyn.com)... 68.232.34.133 + Connecting to ec.libsyn.com (ec.libsyn.com)|68.232.34.133|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 53173384 (51M) [audio/mpeg] + Saving to: `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast302-Feb28-13.mp3' + + 100%[==================================================================================================================================================================>] 53,173,384 3.50M/s in 45s + + 2013-07-04 14:08:47 (1.13 MB/s) - `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast302-Feb28-13.mp3' saved [53173384/53173384] + + (checksum...) + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/3970: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 1 failed + $ + +git-annex now believes that the file is stored locally, but an fsck shows how things really are: + + $ ga fsck + fsck GeologicPodcast02-Feb21-07.mp3 ok + fsck GeologicPodcast03-Feb28-07.mp3 ok + [... Delete 35 lines ...] + fsck GeologicPodcast301-Feb22-13.mp3 ok + fsck GeologicPodcast302-Feb28-13.mp3 (fixing location log) + ** Based on the location log, GeologicPodcast302-Feb28-13.mp3 + ** was expected to be present, but its content is missing. + failed + fsck GeologicPodcast303-Mar07-13.mp3 ok + fsck GeologicPodcast303.1_Fancast6-Mar09-13.mp3 ok + [... Delete 16 lines ...] + fsck GeologicPodcast72-Jul03-08.mp3 ok + (Recording state in git...) + git-annex: fsck: 3 failed + $ + +After this fsck, everything is OK again; the location log is correct and "get" from this URL works. + +The file data didn't exist locally (it's stored on another disk) when doing this, but I also experimented what would happen if the file data did exist: + + $ rm GeologicPodcast297-Jan24-13.mp3 + $ wget http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + --2013-07-04 14:35:15-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://hwcdn.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?c_id=5341445&expiration=1372945406&hwt=476d03abba40d71119011bf7cb51f68a [following] + --2013-07-04 14:35:16-- http://hwcdn.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?c_id=5341445&expiration=1372945406&hwt=476d03abba40d71119011bf7cb51f68a + Resolving hwcdn.libsyn.com (hwcdn.libsyn.com)... 69.16.175.42, 69.16.175.10 + Connecting to hwcdn.libsyn.com (hwcdn.libsyn.com)|69.16.175.42|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 49299974 (47M) [audio/mpeg] + Saving to: ‘GeologicPodcast297-Jan24-13.mp3’ + + 100%[===========================================================================================================================================>] 49,299,974 5.88MB/s in 30s + + $ ga add + add GeologicPodcast297-Jan24-13.mp3 (checksum...) ok + (Recording state in git...) + $ ga addurl --pathdepth=3 http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + +At this stage, the data for this .mp3 file exist locally, but git-annex is either unaware of it, or it insists on verifying the data. Anyhow, it downloads the file: + + $ ga addurl --pathdepth=3 http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + addurl (downloading http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 ...) --2013-07-04 14:42:40-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://ec.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cc54b707&c_id=5341445 [following] + --2013-07-04 14:42:41-- http://ec.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cc54b707&c_id=5341445 + Resolving ec.libsyn.com (ec.libsyn.com)... 68.232.34.133 + Connecting to ec.libsyn.com (ec.libsyn.com)|68.232.34.133|:80... connected. + HTTP request sent, awaiting response... 206 Partial Content + Length: 49299974 (47M), 48727654 (46M) remaining [audio/mpeg] + Saving to: `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast297-Jan24-13.mp3' + + 100%[====================================================================================================================================================================>] 49,299,974 2.07M/s in 88s + + 2013-07-04 14:44:10 (538 KB/s) - `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast297-Jan24-13.mp3' saved [49299974/49299974] + + (checksum...) + git-annex: /media/usb32g-1/annex/musikk/.git/annex/objects/gp/7Z/SHA256-s49299974--ff6758202d7168a0548b004d0c6e79a095b7738f442aa14d2603665914bee7e0/SHA256-s49299974--ff6758202d7168a0548b004d0c6e79a095b7738f442aa14d2603665914bee7e0: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 1 failed + 2013-07-04 14:44:11 sunny@dg-vbox:/media/usb32g-1/annex/musikk/podcast/Geologic Podcast (master) + $ + +The error message appears again, but because the data did exist from before, git-annex fsck has nothing to complain about: + + $ ga fsck + [...] + fsck GeologicPodcast297-Jan24-13.mp3 (checksum...) ok + [...] + 2013-07-04 14:44:33 sunny@dg-vbox:/media/usb32g-1/annex/musikk/podcast/Geologic Podcast (master) + $ + +### What version of git-annex are you using? On what operating system? + +v4.20130627 Linux i386 and AMD64. Both versions behave the same way. Tested on two computers: + +Computer #1 (AMD64 version): + + $ uname -a + Linux dg-vbox 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:35:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + $ lsb_release -a + No LSB modules are available. + Distributor ID: LinuxMint + Description: Linux Mint 15 Olivia + Release: 15 + Codename: olivia + +Computer #2 (i386 version): + + $ uname -a + Linux linode 2.6.39.1-linode34 #1 SMP Tue Jun 21 10:29:24 EDT 2011 i686 GNU/Linux + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 10.04.4 LTS + Release: 10.04 + Codename: lucid + No LSB modules are available. + +Also tested with v4.20130601, same thing happens. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +All interesting transcripts are posted above with cruft removed. + +# End of transcript or log. +"""]] + +> The cause of this bug is using --pathdepth=3 when the url +> only has two components in its path. So, kinda GIGO, but +> let's fix this anyway. ;) +> +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment new file mode 100644 index 000000000..6ea844f2e --- /dev/null +++ b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 1" + date="2013-07-08T19:56:58Z" + content=""" +Aha, in other words, some kind of PEBCAC put in a polite way. :) I thought this should be correct, as the man page says + +> For example, --pathdepth=1 will use \"dir/subdir/bigfile\", while --pathdepth=3 will use \"bigfile\". + +This is how I thought it worked: + +* 0 = hostname, path, filename +* 1 = path, filename +* 2 = filename + +After reading your answer I first thought it was a typo in the documentation, but of course the number specify the level of subdirectories to use in the file name. D'oh! + +Thanks for the fix and information. +"""]] diff --git a/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn b/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn new file mode 100644 index 000000000..e5f1873f0 --- /dev/null +++ b/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. +The app fails to open after the install + +### What steps will reproduce the problem? +Downloaded, installed, chose open. + +### What version of git-annex are you using? On what operating system? +today's version. android 4.2.1 + +### Please provide any additional information below. + +I also sent this by email. + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +u0_a72@android:/sdcard/git-annex.home $ git annex webapp +Launching web browser on http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5 +Starting: Intent { act=android.intent.action.VIEW dat=http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5 } +java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL + at android.os.Parcel.readException(Parcel.java:1425) + at android.os.Parcel.readException(Parcel.java:1379) + at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1906) + at com.android.commands.am.Am.runStart(Am.java:494) + at com.android.commands.am.Am.run(Am.java:109) + at com.android.commands.am.Am.main(Am.java:82) + at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) + at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235) + at dalvik.system.NativeStart.main(Native Method) +failed to start web browser + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +This is a duplicate of [[Android_app_permission_denial_on_startup]] + +[[closing|done]] as dup. --[[Joey]] diff --git a/doc/bugs/android_4.3_install_failed_.mdwn b/doc/bugs/android_4.3_install_failed_.mdwn new file mode 100644 index 000000000..69749ea2a --- /dev/null +++ b/doc/bugs/android_4.3_install_failed_.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +Impossible installation on Android 4.3 + + +### What version of git-annex are you using? On what operating system? +The lastest version of git-annex, and Android 4.3, **without sdcard** (Wiko Wax) + +### Please provide any additional information below. + +The message given by git-annex: + + + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + mkdir: can't create directory '/sdcard/git-annex.home': Permission denied + mkdir of /sdcard/git-annex.home failed ! + lib/lib.runshell.so: line 133: can't create /sdcard/git-annex.home/git-annex-install.log: Permission denied + Installation failed ! Please report a but and attach /sdcard/git-annex.home/git-annex-install.log + +[[!meta title="android 4.3 install failed on android device without sdcard"]] +[[!tag moreinfo]] diff --git a/doc/bugs/android_4.3_install_failed_/comment_1_82447f1e24d7e8df8048464d1b7df117._comment b/doc/bugs/android_4.3_install_failed_/comment_1_82447f1e24d7e8df8048464d1b7df117._comment new file mode 100644 index 000000000..682780cb2 --- /dev/null +++ b/doc/bugs/android_4.3_install_failed_/comment_1_82447f1e24d7e8df8048464d1b7df117._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 1" + date="2014-06-02T16:28:42Z" + content=""" +git-annex needs a directory to use to store its repositories. If your android device does not have a /sdcard directory (which does not have to be a literal sd card, but just someplace you can write to), does it have any equivilant directory? +"""]] diff --git a/doc/bugs/android_4.3_install_failed_/comment_2_67ace7c454c7e962ca69e42178142e80._comment b/doc/bugs/android_4.3_install_failed_/comment_2_67ace7c454c7e962ca69e42178142e80._comment new file mode 100644 index 000000000..09374e8ee --- /dev/null +++ b/doc/bugs/android_4.3_install_failed_/comment_2_67ace7c454c7e962ca69e42178142e80._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkPSASwemBzccJmjkotESlbUSs5GPFiPCs" + nickname="Lin" + subject="Ok, but ?" + date="2014-06-02T18:22:24Z" + content=""" +You mean that I have to create the missed files ? +"""]] diff --git a/doc/bugs/android_4.3_install_failed_/comment_3_051e39129a38e439f24703385f503cf4._comment b/doc/bugs/android_4.3_install_failed_/comment_3_051e39129a38e439f24703385f503cf4._comment new file mode 100644 index 000000000..3f6e86ce4 --- /dev/null +++ b/doc/bugs/android_4.3_install_failed_/comment_3_051e39129a38e439f24703385f503cf4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-04T18:08:39Z" + content=""" +I asked if your Android device has an eqivilant directory to /sdcard that you can write to. If so, I can fix git-annex to use that directory. But you need to tell me what it is first! +"""]] diff --git a/doc/bugs/android_autobuild_broken.mdwn b/doc/bugs/android_autobuild_broken.mdwn new file mode 100644 index 000000000..6bbd1dfcd --- /dev/null +++ b/doc/bugs/android_autobuild_broken.mdwn @@ -0,0 +1,4 @@ +The android build is broken. Annoying evilsplicer failure in the new +bootstrap3 code. --[[Joey]] + +[[fixed|done]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn b/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn new file mode 100644 index 000000000..e830f1156 --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn @@ -0,0 +1,20 @@ +Just starting using v3, even more awesome, thanks! + +With git-annex, I take the habit to do copies of files without restriction, as they end up into (cheap) symlink copies. +However, if 2 copies are unannexed, only one is restored, the other becomes a broken symlink, so I kind of loose some information +(my use case: I have a repo on which I recently started using annex, but most of the files, which i would want to be annexed, are only in git, +so my plan is to unninit this repo, delete the .git dir, and then annex everything, as I don't mind the history). + +Rafaël + +> The only way for git-annex to support this in its current state would be +> for the unannex command to copy the file content from the annex, rather +> than moving it out. Then multiple links to the same content could be +> unannexed. +> +> But, this would be slower, and would depend on a later `unused` and +> `dropunused` to actually remove the content. While doable, by use case +> for unannex is more to quickly undo a mistaken add, and it's unlikely there +> are multiple symlinks to the same content in this situation. --[[Joey]] + +[[!tag done]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment new file mode 100644 index 000000000..839992477 --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 1" + date="2011-07-04T16:57:25Z" + content=""" +You convince me for unannex, but isn't the goal of uninit to revert all annex operations? In the current state, a clean revert is not possible (because of the broken symlinks after uninit). Instead of copying, using hard links is out of question? + +For my needs, is the command \"git annex unlock .\" (from the root of the repo) a correct workaround? +"""]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment new file mode 100644 index 000000000..21c0c449b --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmJfIszzreLNvCqzqzvTayA9_9L6gb9RtY" + nickname="Joey" + subject="comment 2" + date="2011-07-04T20:25:38Z" + content=""" +Indeed, uninit needed to be improved. I've done so. Also, unannex --fast can be used to make hard links to content left in the annex. +"""]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn new file mode 100644 index 000000000..dd544d7c7 --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +missing libselinux.so.1 ? + +### What steps will reproduce the problem? +[[!format sh """ +./runshell +cd ~ +$ git clone ssh://greg@host/path/to/annex/of/Photos Photos +Cloning into 'Photos'... +ssh: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +"""]] + +same command (copy/paste) works on my laptop running 4.20131106 + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +$ git annex version +git-annex version: 5.20131216-g604e6b8 +build flags: Assistant Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook +"""]] + +arm build (downloaded from [[install/Linux_standalone]]) + +> ssh was not shimmed. [[fixed|done]]; build will update in a few hours +> --[[Joey]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment new file mode 100644 index 000000000..3691b8a8a --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 1" + date="2013-12-19T19:05:04Z" + content=""" +Just tried again (redownloaded the build at ~11:50am Pacific on Dec 19th), same behavior: + +[[!format sh \"\"\" +$ git-annex version +git-annex version: 5.20131218-gc5767e2 +build flags: Assistant Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook +$ git clone greg@host:/path/to/Photos Photos +Cloning into 'Photos'... +ssh: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +$ which ssh +/volume1/downloads/git-annex.linux/bin/ssh +$ ldd /volume1/downloads/git-annex.linux/bin/ssh +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.15' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.8' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libcrypto.so.1.0.0: no version information available (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libcrypto.so.1.0.0: no version information available (required by /volume1/downloads/git-annex.linux/bin/ssh) + libselinux.so.1 => not found + libcrypto.so.1.0.0 => /lib/libcrypto.so.1.0.0 (0x40026000) + libdl.so.2 => /lib/libdl.so.2 (0x401ba000) + libz.so.1 => /lib/libz.so.1 (0x401c5000) + libresolv.so.2 => /lib/libresolv.so.2 (0x401e2000) + libgssapi_krb5.so.2 => /lib/libgssapi_krb5.so.2 (0x401fc000) + libc.so.6 => /lib/libc.so.6 (0x40235000) + /lib/ld-linux.so.3 (0x40000000) + libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40364000) + libkrb5.so.3 => /lib/libkrb5.so.3 (0x40378000) + libk5crypto.so.3 => /lib/libk5crypto.so.3 (0x40426000) + libcom_err.so.3 => /lib/libcom_err.so.3 (0x40458000) + libkrb5support.so.0 => /lib/libkrb5support.so.0 (0x40462000) +\"\"\"]] +"""]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment new file mode 100644 index 000000000..55e48f0e7 --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-19T19:55:33Z" + content=""" +Build took longer than I thought, but should finally be done in an hour or two. +"""]] diff --git a/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn new file mode 100644 index 000000000..317b9fcda --- /dev/null +++ b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +When syncing from server A (real server) to server B (a synology NAS) it fails on git-upload-pack and -receive-pack + +### What steps will reproduce the problem? +git-annex sync + + +### What version of git-annex are you using? On what operating system? +on server A: 3.20121017 (yeah, I should update) +on server B: 5.20131220-g73492b2 + +### Please provide any additional information below. + +On server B, after running ./runshell +[[!format sh """ +$ git-upload-pack +/volume1/downloads/git-annex.linux/shimmed/sh/sh: 19: git-upload-pack: not found +$ git-receive-pack +/volume1/downloads/git-annex.linux/shimmed/sh/sh: 20: git-receive-pack: not found +"""]] + +> [[fixed|done]]; added git, git-upload-pack, and git-receive-pack wrappers +> to git-annex.linux/. Also to equivilant place in OSX app. --[[Joey]] diff --git a/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment new file mode 100644 index 000000000..65d8d0667 --- /dev/null +++ b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-24T20:20:07Z" + content=""" +This has nothing to do with shimming at all AFACS. + +runshell does nothing to make git-upload-pack or git-receive-pack be in your PATH. They do not need to be, for `git upload-pack` and `git receive-pack` to work. At least `git-annex-shell`, and probably also `git-shell` both use the latter, rather than the former. + +But in the case that a git remote's ssh key is not set up to use git-annex-shell (ie, a git remote not configured using the assistant, or configured using the asistant but with a pre-existing passwordless ssh key), and git-annex was installed on the remote using the git-annex standalone bundle, and there is no other git installation, then yes, git will try to ssh to there and run `git-upload-pack` etc. +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision.mdwn b/doc/bugs/assistant_-_GTalk_collision.mdwn new file mode 100644 index 000000000..b814166ae --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision.mdwn @@ -0,0 +1,17 @@ +##What steps will reproduce the problem? + +Follow the [share with a friend walkthrough](http://git-annex.branchable.com/assistant/share_with_a_friend_walkthrough/). I use my Google Talk account to pair with myself. With the assistant running, log in to Google Talk on the web interface and set your status 'Invisible'. + +##What is the expected output? What do you see instead? + +I expect to remain invisible, but I get the following warning: "Oops! You are not invisible because you're logged into Google Talk from another client, device or location that doesn't support invisibility." + +##What version of git-annex are you using? On what operating system? + +4.20130314 on Linux. + +##Please provide any additional information below. + +Syncing between the repositories works ok. + +[[!tag /design/assistant]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment b/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment new file mode 100644 index 000000000..4e66052cf --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://smcv.pseudorandom.co.uk/" + nickname="smcv" + subject="GTalk wants you to implement its "shared status" protocol" + date="2013-03-16T11:59:22Z" + content=""" +For invisibility to work, GTalk demands that every connected resource implements its \"shared status\" extension. Given that git-annex sets negative priority, this seems like a GTalk bug - it should ignore negative-priority resources when deciding whether it can be invisible - but it seems unlikely to be fixed. + +We implement shared status in telepathy-gabble (mostly in src/conn-presence.c, tests in tests/twisted/presence/shared-status.py) if it's any help. + + +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment b/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment new file mode 100644 index 000000000..1fbbadb05 --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-16T15:39:14Z" + content=""" +Thanks for the link, that perhaps explains the continuing oddities I've seen with google talk and presence information sometimes not being sent. + +It's not clear to me if git-annex could use this extension at all. It seems to say that if I use it, my regular presence messages won't be sent. Which is a problem, since git-annex uses extended content in presence messages to indicate that they're coming from a git-annex client, which is important to make xmpp pairing work. (It's also used to send push notifications, but that's not essential.) + +Also, of course, I'm reluctant to implement a non-standard extension that may change at any time, especially when it's attached to a service that currently has the FSF unhappy . + +Perhaps the real solution is to make the assistant encourage use of some other XMPP server. +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment b/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment new file mode 100644 index 000000000..35f76bc5f --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-16T20:48:42Z" + content=""" +I don't know if it will help, but XA support was turned off in hope that it would alleviate the random presence message loss I keep seeing with Google Talk, and since it didn't seem to help solve that problem, I've turned it back on. +"""]] diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn new file mode 100644 index 000000000..23babd797 --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn @@ -0,0 +1,53 @@ +### Please describe the problem. +Tried adding a removable drive repository through git-annex assistant on Mac, asked to encrypt it, got Internal server error with explanation: unable to determine gcrypt-id of remote + +### What steps will reproduce the problem? +current (today's) version of git-annex build for Mountain Lion installed +app launched +default annex initialized, a couple file added +a removable 2GB USB drive (ExFAT) mounted in OS +click Add another repository +choose removable drive +choose to encrypt +a window explaining the need to wait for entropy shows +then we get the Internal server error: unable to determine gcrypt-id of remote + +### What version of git-annex are you using? On what operating system? +git-annex version 4.20130922-g7dc188a +Mac OS X 10.8.5 + +### Please provide any additional information below. + +looking at transcript below, it appears the root cause is the lack of initial git/gcrypt configuration. perhaps this needs to be caught/addressed somehow + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory +.......+++++ +.+++++ +gpg: key 71BFBC31 marked as ultimately trusted +ok +(Recording state in git...) +(Recording state in git...) +(encryption setup) (hybrid cipher with gpg key C4B2EA8D71BFBC31) gcrypt: Development version -- Repository format MAY CHANGE +gpg: checking the trustdb +gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model +gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u +gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31 +gcrypt: You have not configured any keys you can encrypt to for this repository +gcrypt: Use :: +gcrypt: git config gcrypt.participants YOURKEYID +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31 +gcrypt: You have not configured any keys you can encrypt to for this repository +gcrypt: Use :: +gcrypt: git config gcrypt.participants YOURKEYID +03/Oct/2013:00:05:24 +0400 [Error#yesod-core] unable to determine gcrypt-id of remote @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment new file mode 100644 index 000000000..2d0802cae --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2013-10-02T20:37:03Z" + content=""" +Can you take a look at ~/annex/.git/config and if there is an entry for this git remote, post it? (Or post the whole thing if unsure..) + +Also, can you get gpg to list your secret keys, and see if key 71BFBC31 is in the list? You can do so by running `gpg --list-secret-keys` ; if you don't have gpg in your path at the terminal, you can use the version from the git-annex DMG by first running `/Volumes/git-annex/git-annex.app/Contents/MacOS/runshell` +"""]] diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment new file mode 100644 index 000000000..2ba7a5984 --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnyMzZZLS1xGW1raqc_9Md6Ksdkvx5rUJU" + nickname="Michael" + subject="comment 2" + date="2013-10-04T10:59:30Z" + content=""" +Sorry Joey, I was tinkering around trying to get the assistant off the ground and have destroyed the evidence of the bug in the process. I will try to recreate it and post the details. (most of my problems are/were related to bundled git/gpg/other software, I posted a separate comment in OSX Install page) +"""]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn new file mode 100644 index 000000000..a35bc9c3d --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn @@ -0,0 +1,90 @@ +### Please describe the problem. +Setting up a git annex repo with the webapp. Adding a small archive removeable disk. +Adding a file to repo. Moving file to archive. The file seems to get copied to the removeable disk +but it is not removed (dropped)from my repo, as I would expect + +Before I add the file to the repo, the archive directory on the removeable drive looks like a bare repo. +After adding one file and moving it to the archive folder, a ".git" directory gets created inside the bare repo. +The .git directory contains an annex directory, and nothing else. + +Is this behaviour the expected one? As far as I have understood it, the files are supposed to "disapear" from my computer when I move them to the archive folder. + + +### What steps will reproduce the problem? +Se above + +### What version of git-annex are you using? On what operating system? +Version: 5.20131127-g736ce5e +Build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + +Chakra linux +Linux black 3.10.18-1-CHAKRA #1 SMP PREEMPT Sat Nov 9 20:18:15 UTC 2013 x86_64 GNU/Linux + +git annex installed from prebuilt tar. + +### Please provide any additional information below. + +[[!format sh """ +[2013-11-28 23:25:59 CET] main: starting assistant version 5.20131127-g736ce5e +[2013-11-28 23:25:59 CET] Cronner: You should enable consistency checking to protect your data. +(scanning...) [2013-11-28 23:25:59 CET] Watcher: Performing startup scan +(started...) gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Repository not found: /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +[2013-11-28 23:26:21 CET] main: Syncing with 7090f0c1abf947a1a186ba243c498172 +warning: no common commits +From /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + * [new branch] git-annex -> 7090f0c1abf947a1a186ba243c498172/git-annex + * [new branch] master -> 7090f0c1abf947a1a186ba243c498172/master +Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-11-28 23:26:59 CET] Pusher: Syncing with test_ark +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + 4d435e3..e548577 git-annex -> synced/git-annex +[2013-11-28 23:27:17 CET] Committer: Adding git-annex..64.tar.gz + +(Recording state in git...) +(merging 7090f0c1abf947a1a186ba243c498172/git-annex into git-annex...) +(Recording state in git...) + + + +(Recording state in git...) +add git-annex-standalone-amd64.tar.gz (checksum...) [2013-11-28 23:27:17 CET] Committer: Committing changes to git +[2013-11-28 23:27:17 CET] Pusher: Syncing with test_ark +Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + e548577..b86f41c git-annex -> synced/git-annex + 658b0f2..f32a646 annex/direct/master -> synced/master +Already up-to-date. +[2013-11-28 23:27:27 CET] Committer: Adding git-annex..64.tar.gz +[2013-11-28 23:27:27 CET] Committer: Committing changes to git +[2013-11-28 23:27:27 CET] Pusher: Syncing with test_ark + +git-annex-standalone-amd64.tar.gz + + 32768 0% 0.00kB/s 0:00:00 Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + b86f41c..806a2dd git-annex -> synced/git-annex + f32a646..5e254e7 annex/direct/master -> synced/master +Already up-to-date. + + 20143752 100% 85.24MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 20146306 bytes received 31 bytes 40292674.00 bytes/sec +total size is 20143752 speedup is 1.00 +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +[2013-11-28 23:27:59 CET] Pusher: Syncing with test_ark +Everything up-to-date + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment new file mode 100644 index 000000000..435d22903 --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-30T20:18:53Z" + content=""" +This bug, introduced in version 5.20131118, caused `git annex init`, when run in a bare repository, to set `core.bare` to false. + +I have fixed the bug. I may need to make git-annex detect and automatically fix up after the problem. + +To manually fix a bare repository created by the buggy version of git-annex, run `git config core.bare true` in the repository. Then if there's a .git/annex/objects inside the bare git repository, you can move it to annex/objects. +"""]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment new file mode 100644 index 000000000..338faa357 --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-12-02T16:35:41Z" + content=""" +I've now made git-annex automatically detect these problem repositories, and fix them up. You should not need to do anything to recover, just upgrade git-annex eventually, and use it. +"""]] diff --git a/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn new file mode 100644 index 000000000..8d2c3c996 --- /dev/null +++ b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn @@ -0,0 +1,10 @@ +The assistant does not allow adding an existing repo: I tried to add a "remote server", to enter the credits, and then I add to choose between "git-annex" or "rsync". Choosing "git-annex" tries to create a new repo and then fails. The repo on the server is a bare one, accessed via gitolite. Setting the remote manually ("git remote add origin git@example.org:my-annex.git" works (I can pull, push, ...)) + +Mac OS 10.7 version 2013-09-10 + + +[[!meta title="assistant does not interoperate with gitolite when adding a repository"]] + +[2013-09-13 17:00:55 CEST] chat: ssh ["-p","22","git@example.org","sh -c 'mkdir -p '\"'\"'my-annex.git'\"'\"'&&cd '\"'\"'my-annex.git'\"'\"'&&if [ ! -d .git ]; then git init --bare --shared; fi&&git annex init'"] + +[[!tag confirmed]] diff --git a/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment new file mode 100644 index 000000000..b260b8df5 --- /dev/null +++ b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T18:19:03Z" + content=""" +I suppose the assistant could try to add a git remote and pull from it, and only if this pull fails go try to run shell commands to create it. This might work with gitolite, gitosis, github, etc. Although only partially for ones that don't support running git-annex-shell.. +"""]] diff --git a/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn b/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn new file mode 100644 index 000000000..d7002a2f7 --- /dev/null +++ b/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn @@ -0,0 +1,18 @@ +git-annex has nice repository cost tracking, but the assistant doesn't +always use this when queuing downloads. + +For example, if a network comes up, it'll queue a lot of downloads from a +remote, perhaps expensive server. If a removable drive is then attached, +which has a lower cost, it'll queue downloads from there, but +only once it works through all the ones it's already queued from the +network. + +There is a workaround: Since the webapp allows disabling syncing to a +remote, the user can go in and disable syncing to the network remote +temporarily. + +[[!tag /design/assistant]] + +--[[Joey]] + +[[!tag confirmed]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn new file mode 100644 index 000000000..53ee5a105 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +The assistant seems to only sync files and not directories, so empty directories will not be synced. + +### What steps will reproduce the problem? + +- Create an empty directory on HostA +- See that nothing gets synced (daemon.log is silent) and the directory doesn't exist on the other HostB +- Create an empty file inside the empty directory on HostA +- See that now HostB has the empty file inside the directory + +I'm sure this comes directly from the git behavior but is at least surprising for a direct mode repository using the assistant. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + +> [[!taglink confirmed]] (but may be out of scope) --[[Joey]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment new file mode 100644 index 000000000..b31955ed3 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-31T21:14:11Z" + content=""" +Git does not have a concept of an empty directory. The typical workaround is to put a .gitignore file in the directory. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment new file mode 100644 index 000000000..a62cba1e3 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-31T21:48:24Z" + content=""" +Adding .gitignore files makes sense for a git standpoint but whatever workaround is needed to make the assistant works properly should be done by the assistant itself no? Maybe having direct mode commit a shaddow \".this_is_a_magic_empty_file\" in empty directories and then not actually writing that file into direct mode repositories on the other side. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment new file mode 100644 index 000000000..757a1c727 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 3" + date="2013-09-11T23:19:26Z" + content=""" +This behaviour is indeed very confusing when one attempts to use git-annex with the assistant only, without thinking about the underlying machinery. +Having the assistant automatically put a .gitignore file in empty directories is a possible solution, but maybe printing a warning in the log when the watcher sees an empty directory could be an unobtrusive and helpful solution? (At least it would have helped me) +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment new file mode 100644 index 000000000..f6be08ae4 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 4" + date="2013-09-11T23:24:58Z" + content=""" +Another problem with the current behaviour is that when deleting a directory and its contents on a repository, the contents are deleted on the other repositories but empty directories are left behind... +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment new file mode 100644 index 000000000..0d5f0aa29 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 5" + date="2013-11-01T22:12:04Z" + content=""" +I agree that this is very confusing. Also having to manually delete empty, renamed directories is...less than ideal. :) +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn new file mode 100644 index 000000000..48a99d7c2 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn @@ -0,0 +1,47 @@ +### Please describe the problem. + +The assistant does not sync file permissions so if you set something as executable it won't be set the same on the other repositories. + +### What steps will reproduce the problem? + +On the first host: + +[[!format sh """ +$ echo -e '#!/bin/sh\necho "Hello World!"' > testscript +$ chmod ugo+x testscript +$ ./testscript +Hello World! +$ ls -l +total 4 +-rwxr-xr-x 1 pedrocr pedrocr 30 May 31 20:00 testscript +"""]] + +And on the second host: + +[[!format sh """ +$ ls -l +total 4 +-rw-r--r-- 1 pedrocr pedrocr 30 May 31 20:00 testscript +$ ./testscript +bash: ./testscript: Permission denied +"""]] + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + +> [[!taglink confirmed]] (but may be out of scope) --[[Joey]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment new file mode 100644 index 000000000..9e1b801a4 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-31T21:17:17Z" + content=""" +More generally, symbolic links cannot have permissions of their own, and git in fact indicates a file is a symlink by setting the tree object's mode to a specific magic number. So there is no git metadata that git-annex can use to track whether a file is supposed to be executable. + +Therefore, this will only get fixed when there's some kind of full-fledged metadata storage for git. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment new file mode 100644 index 000000000..8585e309c --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-31T21:45:39Z" + content=""" +Note that the file I created wasn't a symlink. I assume you mention symlinks because git-annex itself checks in symlinks to git instead of actual files? +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment new file mode 100644 index 000000000..6bf189414 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 3" + date="2013-11-02T23:49:49Z" + content=""" +Dropbox handles permissions, e.g. if I \"chmod -x\" a file on one system, it does the same to my other systems. It would be a bit of a step backward if git-annex can't do this. :/ Just my two cents. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment new file mode 100644 index 000000000..4b287c9df --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="comment 4" + date="2014-01-12T19:16:07Z" + content=""" +Yeah, now i just hit this. kinda annoying. + +Couldn't this at least be solved for direct mode repositories? + +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment new file mode 100644 index 000000000..73f3d00d8 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="comment 5" + date="2014-01-14T08:33:21Z" + content=""" +@Pedro: What Joey is refering to is that git-annex uses sym-links behind the scenes to store even such a small file. (BTW, that can be changed with the large-file config option, IIRC.) + +@Joey: Even a \"full-fledged metadata storage for git\" wouldn't solve this problem since from git's POV it's still just a sym-link without permissions. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_6_13db3474113b157b7431eb1c835e5814._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_6_13db3474113b157b7431eb1c835e5814._comment new file mode 100644 index 000000000..6f7283be2 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_6_13db3474113b157b7431eb1c835e5814._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="Xyem" + ip="178.79.137.64" + subject="comment 6" + date="2014-06-24T10:05:26Z" + content=""" +Now that git-annex has a proper metadata system now, can this be handled? + +Perhaps doing this: + +git annex metadata -s __executable 001 + +could cause git-annex to set the executable bit (on get, fsck etc.) and that be set automatically on git annex add if the file has executable bit set (numbers are a bitmask for which execute bit to set..?). +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU.mdwn b/doc/bugs/assistant_eats_all_CPU.mdwn new file mode 100644 index 000000000..719fca425 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU.mdwn @@ -0,0 +1,529 @@ +[[!meta title="debian system runs assistant in tight loop, rather than using select"]] + +### Please describe the problem. + +After running for a while, the assistant maxes my CPU. I have evidence +here that it is just sitting there, doing apparently nothing (transfers +are finished), eating precious CPU. + +Nowadays, I do not let the assistant run on its own, otherwise it makes +my office noisy because the CPU fan starts. + +This makes the assistant and the webapp basically unuseable for me: +if i want to use its feature, I must remember to shut down the daemon +every time I am done with it, which seems contrary to the spirit of +the project. :) + +### What steps will reproduce the problem? + +It's a little unclear. There was a peculiar crash here (power cable +yanked out) during a `git annex copy`, which *was* eating up all CPU, +but mostly through I/O. + +That is the purple block in this graph: + +![CPU usage during the last 24 hours][cpu-day.png] + +Power was yanked out about right after that purple block was gone: + +![Uptime in the last 24 hours][uptime-day.png] + +Files were copied to an external drive at the time of the crash, +which explains the high iowait. The last lines in daemon.log are: + +[[!format txt """ +sent 184184937 bytes received 31 bytes 13643330.96 bytes/sec +total size is 184162304 speedup is 1.00 +[2013-12-31 23:56:47 EST] Transferrer: Uploaded American ..Queen.avi +[2013-12-31 23:56:47 EST] Pusher: Syncing with backup +To /backup/srv/video + 5155be4..7d904d5 git-annex -> synced/git-annex +"""]] + +And daemon.status: + +[[!format txt """ +lastRunning:1388569856.366405s +scanComplete:True +sanityCheckRunning:False +lastSanityCheck:1387169250.801117s +"""]] + +When the machine rebooted, I logged in, and resumed the transfer using +`git annex copy`. The assistant was also started automatically during +my session, but I wasn't aware of that until this morning (7AM) when i +came back to the terminal and noticed how noisy it was. + +At that point i did `killall git-annex` and CPU usage returned to +normal, as the frequency of the CPU: + +![CPU frequency scaling in the last 24 hours][cpuspeed-day.png] + +I am trying to see if I can reproduce this problem reliably - I +just started the assistant again now, and while the CPU usage is +already high, I will forgive it for now because it's doing its +initial scans... Let's see what happens in the afternoon! --[[anarcat]] + +Update: I seem to be able to reproduce. I just started the webapp and +the scans were performed. They are now finished, yet the CPU usage is +still high: + +[[!format txt """ +top - 14:10:20 up 1 day, 1:16, 7 users, load average: 5,51, 3,61, 2,53 +Tasks: 292 total, 2 running, 288 sleeping, 0 stopped, 2 zombie +%Cpu(s): 60,9 us, 7,8 sy, 0,6 ni, 29,5 id, 0,8 wa, 0,0 hi, 0,5 si, 0,0 st +KiB Mem: 8162960 total, 6943100 used, 1219860 free, 1065464 buffers +KiB Swap: 4022268 total, 15452 used, 4006816 free, 1983252 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +18364 anarcat 20 0 152m 27m 18m S 53,7 0,3 0:35.61 git-annex + 8388 anarcat 20 0 192m 54m 21m S 47,8 0,7 12:55.19 git-annex +18671 anarcat 20 0 157m 33m 18m S 29,9 0,4 0:22.65 git-annex +"""]] + +An strace on 18364 yields: + +[[!format txt """ +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 537245076}) = 0 +[pid 18364] <... futex resumed> ) = ? ERESTARTSYS (To be restarted) +[pid 18364] --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +[pid 18364] rt_sigreturn(0x1a) = 202 +[pid 18364] futex(0x3de703c, FUTEX_WAIT_PRIVATE, 51, NULL +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 256339453}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 537670797}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 256748972}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538079838}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 257202502}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538533443}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 257611085}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538941839}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258018398}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 539349100}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258433069}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 539763939}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258863864}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 540195885}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 259295204}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 540626505}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 259729523}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541060751}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260131616}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541463041}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260539761}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541871201}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260970889}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 542302047}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 261378036}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 542709166}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 261780507}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543111819}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 262194032}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543525143}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 262610040}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543941528}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 263042272}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 544374016}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 263532359}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 544864814}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18364] <... futex resumed> ) = ? ERESTARTSYS (To be restarted) +[pid 18364] --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +[pid 18364] rt_sigreturn(0x1a) = 202 +[pid 18364] futex(0x3de703c, FUTEX_WAIT_PRIVATE, 51, NULL +"""]] + + [cpu-day.png]: http://paste.anarc.at/cpu-day.png + [uptime-day.png]: http://paste.anarc.at/uptime-day.png + [cpuspeed-day.png]: http://paste.anarc.at/cpuspeed-day.png + +### What version of git-annex are you using? On what operating system? + +Debian wheezy. + +[[!format sh """ +anarcat@marcos:~$ git annex version +git-annex version: 5.20131109-gf2cb5b9 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] + +### Please provide any additional information below. + +This *may* be related to [[bugs/webapp_takes_100__37___of_the_cpu/]], +but I didn't observe both problems simultaneously so far - ie. the +webapp doesn't need to run for this bug to happen. + +Here's the output of top: + +[[!format sh """ +top - 04:55:01 up 16:01, 10 users, load average: 3,96, 3,72, 3,59 +Tasks: 293 total, 6 running, 284 sleeping, 0 stopped, 3 zombie +%Cpu(s): 87,4 us, 10,9 sy, 0,6 ni, 0,1 id, 0,3 wa, 0,0 hi, 0,7 si, 0,0 st +KiB Mem: 8162960 total, 6847120 used, 1315840 free, 1084756 buffers +KiB Swap: 4022268 total, 1320 used, 4020948 free, 2041108 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 8099 anarcat 20 0 144m 28m 18m S 34,0 0,4 460:10.96 git-annex + 6525 anarcat 20 0 436m 295m 18m S 28,4 3,7 448:50.71 git-annex +11146 munin 20 0 25376 6540 1896 R 28,4 0,1 0:00.05 munin-update + 8045 anarcat 20 0 165m 41m 18m S 22,7 0,5 455:14.41 git-annex +11142 root 20 0 32316 7356 2016 R 22,7 0,1 0:00.05 ikisite +11144 aegir 20 0 161m 16m 6608 R 22,7 0,2 0:00.05 php + 2649 liquidso 20 0 222m 54m 5516 S 5,7 0,7 40:40.61 liquidsoap +11149 anarcat 20 0 24448 1552 1072 R 5,7 0,0 0:00.01 top + 1 root 20 0 10644 784 652 S 0,0 0,0 0:01.10 init + 2 root 20 0 0 0 0 S 0,0 0,0 0:00.01 kthreadd + 3 root 20 0 0 0 0 S 0,0 0,0 2:10.09 ksoftirqd/0 + 6 root rt 0 0 0 0 S 0,0 0,0 0:00.22 migration/0 + 7 root rt 0 0 0 0 S 0,0 0,0 0:00.59 watchdog/0 + 8 root rt 0 0 0 0 S 0,0 0,0 0:00.25 migration/1 + 10 root 20 0 0 0 0 S 0,0 0,0 2:11.10 ksoftirqd/1 + 12 root rt 0 0 0 0 S 0,0 0,0 0:00.17 watchdog/1 + 13 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 cpuset + 14 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 khelper + 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kdevtmpfs + 16 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 netns + 17 root 20 0 0 0 0 S 0,0 0,0 0:00.17 sync_supers + 18 root 20 0 0 0 0 S 0,0 0,0 0:00.00 bdi-default + 19 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kintegrityd + 20 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kblockd + 22 root 20 0 0 0 0 S 0,0 0,0 0:00.06 khungtaskd + 23 root 20 0 0 0 0 S 0,0 0,0 3:04.23 kswapd0 + 24 root 25 5 0 0 0 S 0,0 0,0 0:00.00 ksmd + 25 root 39 19 0 0 0 S 0,0 0,0 0:00.00 khugepaged + 26 root 20 0 0 0 0 S 0,0 0,0 0:00.00 fsnotify_mark + 27 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 crypto + 113 root 20 0 0 0 0 S 0,0 0,0 0:00.01 khubd + 133 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ata_sff + 153 root 20 0 0 0 0 S 0,0 0,0 0:05.68 scsi_eh_0 + 158 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_1 + 160 root 20 0 0 0 0 S 0,0 0,0 0:00.09 kworker/u:2 + 161 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_2 + 162 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_3 + 163 root 20 0 0 0 0 S 0,0 0,0 0:01.43 kworker/u:3 + 294 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 295 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd_io + 296 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd + 305 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 307 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 311 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 313 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 341 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 342 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd_io + 343 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd + 352 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 354 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 356 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 358 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 361 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 400 root 20 0 0 0 0 S 0,0 0,0 0:00.00 jbd2/dm-1-8 + 401 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 468 root 20 0 0 0 0 S 0,0 0,0 0:02.19 kworker/1:2 + 538 root 20 0 21804 1804 796 S 0,0 0,0 0:00.10 udevd + 705 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kpsmoused + 878 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 hd-audio0 + 890 postfix 20 0 44216 2460 1912 S 0,0 0,0 0:00.00 pickup + 939 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kvm-irqfd-clean + 1150 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 firewire + 1719 root 20 0 0 0 0 S 0,0 0,0 0:03.40 flush-254:3 + 1786 root 20 0 0 0 0 S 0,0 0,0 0:00.17 jbd2/dm-2-8 + 1787 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1788 root 20 0 0 0 0 S 0,0 0,0 0:06.60 jbd2/dm-3-8 + 1789 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1790 root 20 0 0 0 0 S 0,0 0,0 0:02.56 jbd2/dm-4-8 + 1791 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1792 root 20 0 0 0 0 S 0,0 0,0 0:01.19 jbd2/dm-8-8 + 1793 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 2004 anarcat 20 0 0 0 0 Z 0,0 0,0 0:17.57 chromium + 2379 root 20 0 115m 1796 928 S 0,0 0,0 0:02.16 rsyslogd + 2435 icecast2 20 0 148m 4440 2780 S 0,0 0,1 0:56.15 icecast2 + 2488 root 20 0 4112 644 500 S 0,0 0,0 0:00.66 acpid + 2513 daemon 20 0 16668 156 0 S 0,0 0,0 0:00.00 atd + 2536 proxy 20 0 6884 344 196 S 0,0 0,0 0:00.00 polipo + 2573 messageb 20 0 31488 2548 884 S 0,0 0,0 0:00.79 dbus-daemon + 2626 bind 20 0 111m 15m 2276 S 0,0 0,2 0:00.46 named + 2694 root 20 0 82308 3112 2520 S 0,0 0,0 0:00.03 gdm3 + 2729 root 20 0 99,3m 4652 3608 S 0,0 0,1 0:00.02 gdm-simple-slav + 2731 root 20 0 178m 27m 9908 S 0,0 0,3 40:30.80 Xorg + 2738 root 20 0 282m 14m 6576 S 0,0 0,2 0:02.98 apache2 + 2763 root 20 0 0 0 0 S 0,0 0,0 0:00.92 flush-254:4 + 2779 root 20 0 21000 1164 904 S 0,0 0,0 0:00.00 bluetoothd + 2784 avahi 20 0 34236 1876 1460 S 0,0 0,0 0:00.15 avahi-daemon + 2786 avahi 20 0 34032 440 184 S 0,0 0,0 0:00.00 avahi-daemon + 2792 root 10 -10 0 0 0 S 0,0 0,0 0:00.00 krfcommd + 2829 bitlbee 20 0 45216 1136 712 S 0,0 0,0 0:00.00 bitlbee + 2973 root 20 0 136m 3572 2892 S 0,0 0,0 0:00.37 accounts-daemon + 2974 clamav 20 0 45432 2172 1260 S 0,0 0,0 0:26.77 freshclam + 2997 root 20 0 141m 4552 3072 S 0,0 0,1 0:00.21 polkitd + 3021 root 20 0 18876 984 740 S 0,0 0,0 0:00.48 cron + 3062 root 20 0 75948 3436 2304 S 0,0 0,0 0:00.03 cupsd + 3064 colord 20 0 152m 8672 3344 S 0,0 0,1 0:00.10 colord + 3069 root 20 0 126m 4116 2964 S 0,0 0,1 0:00.16 console-kit-dae + 3071 colord 20 0 300m 12m 7932 S 0,0 0,2 0:01.23 colord-sane + 3171 nobody 10 -10 44328 1672 1048 S 0,0 0,0 0:00.88 gpsd + 3178 root 20 0 9204 3508 380 S 0,0 0,0 0:39.47 haveged + 3192 ikiwiki- 20 0 13772 864 728 S 0,0 0,0 0:00.00 git-daemon + 3310 anarcat 20 0 91856 27m 2820 S 0,0 0,3 0:03.30 xterm + 3314 anarcat 20 0 24004 5452 1876 S 0,0 0,1 0:00.54 bash + 3336 root 20 0 152m 4172 3300 S 0,0 0,1 0:00.07 upowerd + 3437 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_6 + 3438 root 20 0 0 0 0 S 0,0 0,0 6:52.70 usb-storage + 3470 anarcat 20 0 61648 2516 1912 S 0,0 0,0 0:00.01 gvfs-gphoto2-vo + 3474 anarcat 20 0 78024 2564 2048 S 0,0 0,0 0:02.04 gvfs-afc-volume + 3530 root 20 0 52400 10m 2064 S 0,0 0,1 0:03.34 munin-node + 3599 rtkit 21 1 39632 1344 1112 S 0,0 0,0 0:00.30 rtkit-daemon + 3721 root 20 0 4176 700 560 S 0,0 0,0 0:00.01 mysqld_safe + 3899 anarcat 20 0 85216 21m 2872 S 0,0 0,3 0:00.76 xterm + 3903 anarcat 20 0 23216 4688 1804 S 0,0 0,1 0:00.58 bash + 4108 mysql 30 10 434m 137m 4396 S 0,0 1,7 1:53.14 mysqld + 4109 root 20 0 4084 628 524 S 0,0 0,0 0:00.00 logger + 4209 anarcat 20 0 129m 23m 18m S 0,0 0,3 1:06.16 git-annex + 4226 root 20 0 183m 4888 3504 S 0,0 0,1 0:00.08 gdm-session-wor + 4240 anarcat 20 0 21360 2572 2188 S 0,0 0,0 0:00.34 git + 4431 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kauditd + 4447 anarcat 20 0 4176 664 548 S 0,0 0,0 0:00.03 sh + 4530 ntp 20 0 41052 2284 1644 S 0,0 0,0 0:02.71 ntpd + 4593 postgres 20 0 102m 9008 7680 S 0,0 0,1 0:01.04 postgres + 4667 anarcat 20 0 12384 1072 704 S 0,0 0,0 0:00.11 ssh-agent + 4668 anarcat 20 0 20164 372 156 S 0,0 0,0 0:01.03 gpg-agent + 4671 anarcat 20 0 24184 552 304 S 0,0 0,0 0:00.00 dbus-launch + 4672 anarcat 20 0 30668 1592 736 S 0,0 0,0 0:01.10 dbus-daemon + 4704 anarcat 20 0 49456 2740 2216 S 0,0 0,0 0:00.13 xfconfd + 4711 anarcat 20 0 63740 3124 2312 S 0,0 0,0 0:02.61 xscreensaver + 4713 anarcat 20 0 156m 8232 5856 S 0,0 0,1 0:06.14 xfce4-session + 4714 postgres 20 0 102m 1952 616 S 0,0 0,0 0:06.79 postgres + 4715 postgres 20 0 102m 1704 376 S 0,0 0,0 0:04.95 postgres + 4716 postgres 20 0 102m 3068 1128 S 0,0 0,0 0:01.32 postgres + 4717 postgres 20 0 72884 1800 416 S 0,0 0,0 0:00.99 postgres + 4735 postgrey 20 0 66452 14m 3136 S 0,0 0,2 0:00.40 /usr/sbin/postg + 4753 anarcat 20 0 124m 4060 2916 S 0,0 0,0 0:00.02 xfsettingsd + 4754 anarcat 20 0 166m 6496 5204 S 0,0 0,1 0:00.07 Thunar + 4778 anarcat 20 0 63364 2564 2096 S 0,0 0,0 0:00.03 gvfsd + 4783 anarcat 20 0 305m 14m 9568 S 0,0 0,2 0:52.46 xfce4-panel + 4790 anarcat 20 0 156m 7968 6232 S 0,0 0,1 0:00.23 xfdesktop + 4791 root 20 0 21516 804 496 S 0,0 0,0 0:00.00 dovecot + 4837 anarcat 20 0 148m 4296 2768 S 0,0 0,1 0:11.87 xfce4-settings- + 4856 anarcat 20 0 26620 1248 988 S 0,0 0,0 1:19.60 xcompmgr + 4873 anarcat 20 0 115m 8004 3872 S 0,0 0,1 0:07.42 awesome + 4887 anarcat 20 0 267m 12m 8664 S 0,0 0,2 0:02.51 update-notifier + 4899 anarcat 20 0 183m 5868 4708 S 0,0 0,1 0:00.18 polkit-gnome-au + 4905 anarcat 20 0 56320 4180 2040 S 0,0 0,1 0:00.10 gconfd-2 + 4908 anarcat 9 -11 300m 6912 4184 S 0,0 0,1 0:08.00 pulseaudio + 4916 root 20 0 126m 4208 3056 S 0,0 0,1 0:02.46 udisks-daemon + 4917 root 20 0 47408 776 428 S 0,0 0,0 0:06.61 udisks-daemon + 4921 anarcat 20 0 113m 3200 2448 S 0,0 0,0 0:00.00 gconf-helper + 4972 anarcat 20 0 145m 7432 5880 S 0,0 0,1 0:00.09 panel-16-systra + 4974 anarcat 20 0 148m 9328 7348 S 0,0 0,1 2:40.37 xfce4-weather-p + 4975 anarcat 20 0 174m 11m 8312 S 0,0 0,1 0:42.26 xfce4-xkb-plugi + 4978 mpd 20 0 503m 29m 2920 S 0,0 0,4 1:24.97 mpd + 5029 mpd 20 0 256m 6412 4008 S 0,0 0,1 0:11.74 pulseaudio + 5030 dovecot 20 0 13044 768 592 S 0,0 0,0 0:00.00 anvil + 5031 root 20 0 13172 944 628 S 0,0 0,0 0:00.00 log + 5034 root 20 0 23156 2536 768 S 0,0 0,0 0:00.00 config + 5040 mpd 20 0 113m 3192 2448 S 0,0 0,0 0:00.00 gconf-helper + 5234 root 20 0 0 0 0 S 0,0 0,0 0:01.19 kworker/0:1 + 5745 root 20 0 37788 2472 1912 S 0,0 0,0 0:00.68 master + 5756 postfix 20 0 44368 2700 2100 S 0,0 0,0 0:00.27 qmgr + 5807 root 20 0 49848 1216 608 S 0,0 0,0 0:00.05 sshd + 5908 debian-t 20 0 56008 21m 2988 S 0,0 0,3 0:21.87 tor + 5928 debian-t 30 10 190m 31m 2560 S 0,0 0,4 7:35.56 transmission-da + 5948 anarcat 20 0 71776 8204 2860 S 0,0 0,1 0:05.76 xterm + 5954 anarcat 20 0 22956 4540 1772 S 0,0 0,1 0:00.10 bash + 6019 spampd 20 0 147m 62m 1844 S 0,0 0,8 0:00.55 spampd + 6049 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 iprt + 6085 root 20 0 3948 84 0 S 0,0 0,0 0:00.00 minissdpd + 6095 root 20 0 17404 908 744 S 0,0 0,0 0:00.00 getty + 6096 root 20 0 17404 908 744 S 0,0 0,0 0:00.00 getty + 6097 root 20 0 17404 904 744 S 0,0 0,0 0:00.00 getty + 6098 root 20 0 17404 896 744 S 0,0 0,0 0:00.00 getty + 6099 root 20 0 17404 900 744 S 0,0 0,0 0:00.00 getty + 6100 root 20 0 17404 904 744 S 0,0 0,0 0:00.00 getty + 6108 anarcat 20 0 24248 1040 816 S 0,0 0,0 0:00.08 screen + 6109 anarcat 20 0 25864 2640 796 S 0,0 0,0 0:05.37 screen + 6110 anarcat 20 0 22868 4220 1624 S 0,0 0,1 0:00.06 bash + 6153 root 20 0 0 0 0 S 0,0 0,0 0:00.00 flush-254:8 + 6174 anarcat 20 0 22872 4224 1624 S 0,0 0,1 0:00.07 bash + 6238 anarcat 20 0 103m 12m 5232 S 0,0 0,2 0:20.80 irssi + 6252 anarcat 20 0 212m 40m 13m S 0,0 0,5 1:09.74 emacs23 + 6534 anarcat 20 0 22876 4400 1716 S 0,0 0,1 0:00.07 bash + 6598 anarcat 20 0 302m 163m 3864 S 0,0 2,0 17:19.63 offlineimap + 6616 anarcat 20 0 22408 2648 2228 S 0,0 0,0 0:05.04 git + 6662 root 20 0 0 0 0 S 0,0 0,0 0:01.25 kworker/1:1 + 6666 root 20 0 0 0 0 S 0,0 0,0 0:00.00 flush-254:2 + 6897 anarcat 20 0 1011m 159m 47m S 0,0 2,0 4:54.69 chromium + 6902 postfix 20 0 46744 3396 2400 S 0,0 0,0 0:00.09 tlsmgr + 6903 anarcat 20 0 283m 7952 2788 S 0,0 0,1 0:05.03 chromium + 6904 anarcat 20 0 6240 356 272 S 0,0 0,0 0:00.00 chrome-sandbox + 6905 anarcat 20 0 304m 17m 12m S 0,0 0,2 0:00.02 chromium + 6908 anarcat 20 0 320m 5800 764 S 0,0 0,1 0:00.16 chromium + 6950 anarcat 20 0 955m 31m 16m S 0,0 0,4 0:01.68 chromium + 6955 anarcat 20 0 953m 33m 17m S 0,0 0,4 0:01.25 chromium + 6960 anarcat 20 0 959m 36m 15m S 0,0 0,5 0:08.32 chromium + 6965 anarcat 20 0 957m 34m 14m S 0,0 0,4 0:10.25 chromium + 6970 anarcat 20 0 1029m 114m 17m S 0,0 1,4 0:46.99 chromium + 6975 anarcat 20 0 953m 26m 14m S 0,0 0,3 0:00.53 chromium + 6980 anarcat 20 0 959m 35m 16m S 0,0 0,4 0:14.68 chromium + 6985 anarcat 20 0 963m 45m 17m S 0,0 0,6 0:22.59 chromium + 6990 anarcat 20 0 952m 25m 13m S 0,0 0,3 0:00.70 chromium + 6995 anarcat 20 0 960m 36m 18m S 0,0 0,5 0:27.21 chromium + 7040 anarcat 20 0 979m 69m 22m S 0,0 0,9 0:05.41 chromium + 7055 anarcat 20 0 966m 51m 20m S 0,0 0,6 0:04.88 chromium + 7063 anarcat 20 0 967m 42m 18m S 0,0 0,5 0:04.46 chromium + 7072 anarcat 20 0 967m 49m 19m S 0,0 0,6 0:05.17 chromium + 7078 anarcat 20 0 971m 53m 19m S 0,0 0,7 0:05.68 chromium + 7087 anarcat 20 0 963m 51m 19m S 0,0 0,7 0:04.75 chromium + 7096 anarcat 20 0 961m 48m 18m S 0,0 0,6 0:04.75 chromium + 7107 anarcat 20 0 161m 4440 3252 S 0,0 0,1 0:02.90 gvfs-gdu-volume + 7127 anarcat 20 0 967m 55m 22m S 0,0 0,7 1:07.92 chromium + 7183 anarcat 20 0 912m 55m 20m S 0,0 0,7 0:04.97 chromium + 7213 anarcat 20 0 964m 47m 19m S 0,0 0,6 0:04.69 chromium + 7235 anarcat 20 0 965m 65m 21m S 0,0 0,8 0:05.26 chromium + 7258 anarcat 20 0 961m 57m 20m S 0,0 0,7 0:05.39 chromium + 7285 anarcat 20 0 18652 2484 1000 S 0,0 0,0 0:01.25 git + 7434 anarcat 39 19 18124 1960 964 S 0,0 0,0 0:00.29 git + 7445 www-data 20 0 141m 24m 5620 S 0,0 0,3 0:00.71 munin-cgi-graph + 7452 anarcat 20 0 980m 63m 22m S 0,0 0,8 0:02.50 chromium + 7492 anarcat 20 0 978m 64m 21m S 0,0 0,8 0:03.74 chromium + 7498 anarcat 20 0 978m 61m 21m S 0,0 0,8 0:01.42 chromium + 7518 anarcat 20 0 984m 63m 22m S 0,0 0,8 0:04.38 chromium + 7532 anarcat 20 0 973m 56m 21m S 0,0 0,7 0:02.28 chromium + 7813 root 20 0 0 0 0 S 0,0 0,0 0:01.22 kworker/0:2 + 7899 root 20 0 0 0 0 S 0,0 0,0 0:00.96 kworker/1:0 + 8058 anarcat 20 0 24488 1460 1104 S 0,0 0,0 0:28.34 git + 8107 anarcat 20 0 17412 1384 1100 S 0,0 0,0 0:00.00 git + 8130 anarcat 20 0 23792 7572 1004 S 0,0 0,1 0:41.63 git + 8236 anarcat 39 19 21152 4940 964 S 0,0 0,1 0:00.71 git + 8405 anarcat 20 0 17368 1364 1108 S 0,0 0,0 0:00.54 git + 8407 anarcat 20 0 17464 1336 964 S 0,0 0,0 0:00.03 git + 8610 anarcat 20 0 78228 14m 2860 S 0,0 0,2 0:00.37 xterm + 8614 anarcat 20 0 23084 4548 1796 S 0,0 0,1 0:00.28 bash + 8689 anarcat 20 0 72992 9224 2860 S 0,0 0,1 0:00.38 xterm + 8693 anarcat 20 0 22876 4380 1696 S 0,0 0,1 0:00.07 bash + 8735 root 20 0 99,3m 4616 3576 S 0,0 0,1 0:00.02 gdm-simple-slav + 8736 root 20 0 142m 15m 6664 S 0,0 0,2 0:00.56 Xorg + 8755 Debian-g 20 0 30196 1184 736 S 0,0 0,0 0:00.01 dbus-daemon + 8756 root 20 0 119m 4548 3432 S 0,0 0,1 0:00.08 gdm-session-wor + 8757 root 20 0 55872 2116 1572 S 0,0 0,0 0:00.00 sudo + 8759 aegir 20 0 20640 2248 1660 S 0,0 0,0 0:00.07 bash + 8769 Debian-g 20 0 266m 10m 7720 S 0,0 0,1 0:00.07 gnome-session + 8773 Debian-g 20 0 502m 24m 10m S 0,0 0,3 0:00.85 gnome-settings- + 8780 Debian-g 20 0 51980 2236 1836 S 0,0 0,0 0:00.00 gvfsd + 8784 Debian-g 9 -11 237m 6044 3644 S 0,0 0,1 0:00.07 pulseaudio + 8785 Debian-g 20 0 113m 3196 2448 S 0,0 0,0 0:00.00 gconf-helper + 8787 Debian-g 20 0 52956 3756 1932 S 0,0 0,0 0:00.06 gconfd-2 + 8790 Debian-g 20 0 279m 9124 6632 S 0,0 0,1 0:00.12 metacity + 8795 Debian-g 20 0 171m 9328 7056 S 0,0 0,1 0:00.04 polkit-gnome-au + 8796 Debian-g 20 0 362m 16m 11m S 0,0 0,2 0:00.68 gdm-simple-gree + 8812 root 20 0 72360 3916 2948 S 0,0 0,0 0:00.08 gdm-session-wor + 9129 root 20 0 0 0 0 S 0,0 0,0 0:00.74 kworker/0:0 + 9311 www-data 20 0 288m 44m 33m S 0,0 0,6 0:07.55 apache2 +10405 www-data 20 0 287m 42m 32m S 0,0 0,5 0:06.75 apache2 +10406 www-data 20 0 287m 44m 34m S 0,0 0,6 0:07.02 apache2 +10409 www-data 20 0 287m 41m 31m S 0,0 0,5 0:06.51 apache2 +10412 www-data 20 0 287m 42m 32m S 0,0 0,5 0:06.82 apache2 +10413 www-data 20 0 291m 40m 27m S 0,0 0,5 0:06.52 apache2 +10415 www-data 20 0 287m 39m 29m S 0,0 0,5 0:06.67 apache2 +10416 www-data 20 0 288m 42m 31m S 0,0 0,5 0:06.28 apache2 +10417 www-data 20 0 290m 50m 38m S 0,0 0,6 0:07.43 apache2 +10878 root 20 0 0 0 0 S 0,0 0,0 0:00.02 kworker/0:3 +11037 anarcat 20 0 4180 584 488 S 0,0 0,0 0:00.00 sh +11038 anarcat 20 0 62760 4964 3244 S 0,0 0,1 0:00.48 notmuch +11040 anarcat 20 0 4180 652 544 S 0,0 0,0 0:00.00 post-new +11133 root 20 0 52576 1468 1052 S 0,0 0,0 0:00.00 cron +11134 root 20 0 52576 1464 1052 S 0,0 0,0 0:00.00 cron +11135 root 20 0 52576 1468 1052 S 0,0 0,0 0:00.00 cron +11138 aegir 20 0 4176 576 484 S 0,0 0,0 0:00.00 sh +11139 root 20 0 4176 580 484 S 0,0 0,0 0:00.00 sh +11141 munin 20 0 4176 576 480 S 0,0 0,0 0:00.00 sh +11143 root 20 0 4240 324 248 S 0,0 0,0 0:00.00 xargs +11145 munin 20 0 4176 576 484 S 0,0 0,0 0:00.00 munin-cron +11166 anarcat 20 0 61364 2988 2468 R 0,0 0,0 0:00.00 notmuch +11167 anarcat 20 0 61364 752 212 R 0,0 0,0 0:00.00 notmuch +12004 www-data 20 0 292m 52m 37m S 0,0 0,7 0:09.05 apache2 +12172 anarcat 20 0 4092 580 480 S 0,0 0,0 0:00.00 emacsclient +12465 spampd 20 0 149m 65m 2840 S 0,0 0,8 0:01.41 spampd +12468 spampd 20 0 150m 67m 2840 S 0,0 0,8 0:01.07 spampd +12895 anarcat 20 0 970m 51m 21m S 0,0 0,6 0:01.80 chromium +13761 anarcat 20 0 0 0 0 Z 0,0 0,0 0:00.00 git +16056 root 20 0 21800 1464 452 S 0,0 0,0 0:00.00 udevd +16057 root 20 0 21800 1340 332 S 0,0 0,0 0:00.00 udevd +16655 www-data 20 0 147m 8232 700 S 0,0 0,1 0:00.04 apache2 +17006 anarcat 20 0 526m 29m 17m S 0,0 0,4 0:19.95 gmpc +17959 www-data 20 0 70828 24m 2172 S 0,0 0,3 1:22.37 munin-cgi-html +18082 anarcat 20 0 71776 8164 2820 S 0,0 0,1 0:00.12 xterm +18086 anarcat 20 0 23048 4664 1804 S 0,0 0,1 0:00.18 bash +18571 anarcat 20 0 258m 11m 8296 S 0,0 0,1 0:00.11 xfrun4 +19692 spampd 20 0 148m 64m 2832 S 0,0 0,8 0:00.63 spampd +25574 anarcat 20 0 952m 31m 15m S 0,0 0,4 0:00.71 chromium +25590 anarcat 20 0 0 0 0 Z 0,0 0,0 0:41.75 chromium +"""]] + +And here's the process tree: + +[[!format sh """ +$ ps -O start xf | grep git-annex + 8610 13:03:21 S ? 00:00:00 xterm -class UXTerm -title uxterm -u8 + 8614 13:03:21 S pts/4 00:00:00 \_ bash +12172 13:13:15 S pts/4 00:00:00 \_ emacsclient --alternate-editor=vim -c install.hostmaster.inc + 8099 13:00:20 S ? 07:40:31 /usr/local/bin/git-annex assistant --startdelay=5s + 8107 13:00:20 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false cat-file --batch + 8405 13:00:28 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false cat-file --batch + 8407 13:00:28 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false check-ignore -z --stdin --verbose --non-matching + 8045 13:00:11 S ? 07:35:36 /usr/local/bin/git-annex assistant --startdelay=5s + 8058 13:00:11 S ? 00:00:28 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 cat-file --batch + 8130 13:00:21 S ? 00:00:41 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 check-ignore -z --stdin --verbose --non-matching + 8236 13:00:24 S ? 00:00:00 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 check-attr -z --stdin annex.backend annex.numcopies -- + 7107 12:58:40 S ? 00:00:02 /usr/lib/gvfs/gvfs-gdu-volume-monitor + 6525 12:57:25 S ? 07:29:13 /usr/local/bin/git-annex assistant --startdelay=5s + 6616 12:57:34 S ? 00:00:05 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video cat-file --batch + 7285 12:58:45 S ? 00:00:01 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video check-ignore -z --stdin --verbose --non-matching + 7434 12:58:51 S ? 00:00:00 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video check-attr -z --stdin annex.backend annex.numcopies -- + 4209 19:30:17 S ? 00:01:06 \_ /usr/local/bin/git-annex transferkeys --readfd 25 --writefd 24 + 4240 19:30:17 S ? 00:00:00 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video cat-file --batch +13761 23:56:38 Z ? 00:00:00 \_ [git] + 6252 12:56:59 S ? 00:01:09 /usr/bin/emacs23 +"""]] + +#### This bug is fixed + +> [[fixed|done]]. This was a Cronner bug, triggered when you had a +> scheduled fsck job that runs monthly at any time, and the last time it ran was on a day of a +> month > 12. Workaround: Disable scheduled fsck jobs, or change them to +> run on a specific day of the month. Or upgrade. --[[Joey]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment b/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment new file mode 100644 index 000000000..5b1675173 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 10" + date="2014-01-15T21:14:07Z" + content=""" +I was unable to reproduce the problem with a Debian stable VM running in virtualbox. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment b/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment new file mode 100644 index 000000000..2824a5905 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 11" + date="2014-01-15T21:30:36Z" + content=""" +In case the problem is fixed in a newer ghc than the 7.4.1 used to build the debian backport and the standalone builds, I have made a standalone build with 7.6.3, which is temporarily here: ff3e8a3c35301c8a625747f98435fe427be17f47345540f537ff47f6fc97bdb6 + +(That's a i386 build, which will also run on amd64. That could also be a difference as AFAICS it's only been reported happening with amd64 builds (although I was not able to reproduce the problem on amd64)) +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment b/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment new file mode 100644 index 000000000..cab94beef --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 12" + date="2014-01-16T17:04:42Z" + content=""" +Again, I can reproduce with the standalone build, so there's clearly something going on here... Oddly enough, git-annex doesn't appear in top, but I see: + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 21064 anarcat 20 0 111m 23m 14m S 83,0 0,3 9:59.91 ld-linux.so.2 + 20829 anarcat 20 0 133m 38m 15m S 76,4 0,5 8:54.88 ld-linux.so.2 + 21133 anarcat 20 0 130m 32m 14m S 14,9 0,4 5:00.55 ld-linux.so.2 + +ld-linux? +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment b/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment new file mode 100644 index 000000000..0fe6cdb94 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 13" + date="2014-01-16T17:07:05Z" + content=""" +It's not clear from your comment if you tried my ghc 7.6.3 build. + +The hacks used to make the standalone build run everywhere cause ugly process names. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment b/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment new file mode 100644 index 000000000..f2fa7634c --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 14" + date="2014-01-16T17:43:33Z" + content=""" +Sorry yes, I tried the 7.6.3 build: + + http://tmp.kitenet.net/git-annex-standalone-i386.tar.gz ff3e8a3c35301c8a625747f98435fe427be17f47345540f537ff47f6fc97bdb6 + + $ ps x -o user,pid,start,time,vsz,c,comm | grep ld + anarcat 20818 11:27:32 00:00:00 6640 0 ld-linux.so.2 + anarcat 20829 11:27:32 00:30:23 216608 40 ld-linux.so.2 + anarcat 20845 11:27:33 00:00:00 13804 0 ld-linux.so.2 + anarcat 20873 11:27:33 00:00:22 13804 0 ld-linux.so.2 + anarcat 20934 11:27:45 00:00:40 12060 0 ld-linux.so.2 + anarcat 20954 11:27:46 00:00:00 9944 0 ld-linux.so.2 + anarcat 20955 11:27:48 00:00:00 9948 0 ld-linux.so.2 + anarcat 21064 11:28:09 00:49:42 114204 67 ld-linux.so.2 + anarcat 21073 11:28:09 00:00:00 6772 0 ld-linux.so.2 + anarcat 21099 11:28:12 00:00:00 6684 0 ld-linux.so.2 + anarcat 21101 11:28:12 00:00:00 6780 0 ld-linux.so.2 + anarcat 21133 11:28:20 00:45:39 128544 62 ld-linux.so.2 + anarcat 21146 11:28:20 00:00:03 11172 0 ld-linux.so.2 + anarcat 21200 11:28:26 00:00:01 7704 0 ld-linux.so.2 + anarcat 21204 11:28:28 00:00:00 7308 0 ld-linux.so.2 + $ /home/anarcat/Downloads/git-annex.linux/git-annex version + git-annex version: 5.20140115-g7a86704 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: unknown + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment b/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment new file mode 100644 index 000000000..78f9104fd --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.209.7" + subject="Probably confirming this bug" + date="2014-01-16T19:59:56Z" + content=""" +I am trying around with the assistant and webapp for a few months now. +I have rather large git annex repos and even switched from direct ones to indirect repos to increase performance. + +The issue I'm seeing is that when using the assistant or webapp it does the initial startupscan, but only consumes 99-100% of one of my cores and doesn't use significant io. It's stuck in this state for hours (12+) or even days. The only thing standing out in the logs is that it puts a lot of files into the queue. (I suspected a not yet synced backup remote to be the issue) I stopped syncing with it, but that didn't speed up the startupScan at all. + +[2014-01-16 19:34:26 CET] TransferScanner: queued Upload NoUUID db/2012-07/1406469990005618750.meta Nothing : expensive scan found missing object +[2014-01-16 19:34:27 CET] TransferScanner: queued Upload NoUUID db/2012-07/1406471293790598760.eml.gz Nothing : expensive scan found missing object + + +Some additional information: +Total file count: ~100000 +Total size: ~500mb +SSD + i7 Quadcore running Ubuntu 13.10 +Latest build from 2014-01-16 as standalone built. + +Running git annex add && git annex sync from the cli returns within seconds 0.1s (no new files) and 10s (500-1000 new files). +Not understanding the main difference git annex add and git annex assistant (startupScan function) really have. + +Thanks for your help. + + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment b/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment new file mode 100644 index 000000000..66c2b2724 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 16" + date="2014-01-17T19:07:10Z" + content=""" +This bug is about cpu usage when git-annex assistant should be sitting idle, not about the statup scan. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment b/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment new file mode 100644 index 000000000..d44cb9ac9 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 17" + date="2014-01-30T04:57:24Z" + content=""" +@joeyh - any other ideas? I still can't really use the assistant... +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment b/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment new file mode 100644 index 000000000..6e9378154 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3ayIrWKe5SqLYomXiCL-l2CDpREvA-IE" + nickname="myownlittl" + subject="Seconding this Bug." + date="2014-02-19T02:04:34Z" + content=""" +Hi Joey, I have also experienced this bug. I put my \"~/my\" folder under gitannex's management, and I've since had gitannex's assistant consume a CPU (100% of one core) when starting my computer for 1 - 12 hours (at which point I get impatient and kill annex). If stack traces would help, I can email you those. Unfortunately, my \"my\" folder includes every important document I've created, coded, or needed, in the last six years. It has just under 30,000 files, and probably isn't using gitannex the way it's intended to be used. You can see the distribution of files and file sizes in the tables below. + +If gitannex isn't designed for this sort of use case, can you recommend any free software tools that might be able to help opportunistically keep files in sync at this sort of scale, like GA? + +Thanks for your time, + +Nick + +---- + +[[!table data=\"\"\" +Size<= | Bytes | Count | +0B | 0 | 1108 | +1B | 1 | 264 | +16B | 16 | 179 | +256B | 256 | 3414 | +4K | 4096 | 12771 | +65K | 65536 | 7402 | +1M | 1048576 | 2975 | +16M | 16777216 | 703 | +256M | 268435456 | 126 | +4G | 4294967296 | 5 | +\"\"\"]] + + | Size<= | Bytes | Count | + | 0B | 0 | 1108 | + | 1B | 1 | 264 | + | 16B | 16 | 179 | + | 256B | 256 | 3414 | + | 4K | 4096 | 12771 | + | 65K | 65536 | 7402 | + | 1M | 1048576 | 2975 | + | 16M | 16777216 | 703 | + | 256M | 268435456 | 126 | + | 4G | 4294967296 | 5 | +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment b/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment new file mode 100644 index 000000000..9c39baad2 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment @@ -0,0 +1,56 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawntVnR-Z5ghYInvsElbDeADPSuCsF18iTY" + nickname="Thomas" + subject="XMPP something to do with it?" + date="2014-03-02T13:48:22Z" + content=""" +High (between 30 and 100%) processor load in my case seems to be related to lots of these logfile entries: + + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 75 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 76 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: received: [\"Ignorable Presence from s6/941d024438f7cd11 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"5c0108dcad557ab48bfe335e533f13f29777ca7b\\"])\"] + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 77 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 78 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 79 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 80 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 81 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 82 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 83 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 84 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: received: [\"Presence from s6/a303a6cfb26b8e08 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"] + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 85 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"f43c777aed404e1e98dcbf9b6499f4d056b6662a\\"])\"] + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 86 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 87 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: received: [\"Ignorable Presence from s6/941d024438f7cd11 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"f43c777aed404e1e98dcbf9b6499f4d056b6662a\\"])\"] + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 88 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 89 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 90 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + +This is after everything is uploaded to a ssh server (in the cloud, used for transfer) and while another computer is downloading from there (?). + +git-annex version: 5.20140227 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +Debian testing using jabber.org for xmpp +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment b/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment new file mode 100644 index 000000000..cd14d9084 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T20:13:04Z" + content=""" +This strongly resembles ghc RTS bugs such as (except that one got fixed, and affected the non-threaded RTS, while this is using the threaded RTS). + +The assistant and the webapp are the same process. The only difference is whether a web browser is talking to it. Unless the other bug is regarding the CPU used by the web browser, that other bug is a duplicate of this one. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment b/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment new file mode 100644 index 000000000..c228560f2 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 20" + date="2014-03-02T16:33:57Z" + content=""" +This is still a problem in Debian jessie and version `5.20140210` from the debian packages. + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment b/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment new file mode 100644 index 000000000..2e74010df --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="strace or it didn't happen" + date="2014-03-05T21:02:17Z" + content=""" +This bug is about a particular sequence of system calls. It is not about every possible way that git-annex can use CPU! If you think you have reproduced this bug, you need to include a strace demonstrating the problem, or you're just adding noise. + +@Thomas your log shows git-annex doing a git pull over XMPP. This will take CPU, as will any git pull. It is not related to this bug. + +@myownlittl the assistant has to scan your repository when it's started to find any files you have modified since the last time it was run. That is not related to this bug. However, I will probably be adding a config knob to disable the startup scan. + +@Oliver, you said you had seen this same bug on Ubuntu, but did not show a strace, so I don't know if you are really experiencing the same bug. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment b/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment new file mode 100644 index 000000000..ccaf726b7 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 22" + date="2014-03-05T21:08:34Z" + content=""" +@anarcat, it seems to me that you need to find a minumal way to reproduce this. + +What architecture, what specfic model of CPU? + +Can you reproduce it by running the assistant in a new, empty git annex repository? If not, find the difference between that repository and the repository it happens in. If so, it would probably make sense to build git-annex from source with most features disabled to see if one of them causes it, and if not, try to get it down to a minimal test case suitable to being submitted as a GHC bug. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_23_48a4c8d9dcc6cec243c6072090f26b6d._comment b/doc/bugs/assistant_eats_all_CPU/comment_23_48a4c8d9dcc6cec243c6072090f26b6d._comment new file mode 100644 index 000000000..b6d2dec76 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_23_48a4c8d9dcc6cec243c6072090f26b6d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 23" + date="2014-04-11T16:32:47Z" + content=""" + the clock_gettime(0x2 and clock_gettime(0x3 are consistent with getCurrentTime and getTimeZone of nextTime + +So, that strongly points to the Cronner thread, and I doubt this is specific to stable at all. + +Please run git-annex vicfg, and paste all the \"schedule\" lines, from a repository that has the problem. That should allow me to reproduce and fix this bug. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment b/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment new file mode 100644 index 000000000..a11d9add8 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-01-01T20:29:59Z" + content=""" +Humm... it doesn't look like #677096 is fixed in wheezy, are you sure this isn't the problem I am seeing? + +I am considering upgrading this machine to jessie soon, would that help diagnosing the problem? + +Regarding the other bug, if you are refering to [[webapp takes 100% of the cpu]], i do believe it's a different issue because the CPU usage is lower in the assistant when it's *not* transfering lots of small files. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment b/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment new file mode 100644 index 000000000..47964aee3 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2014-01-01T20:45:19Z" + content=""" +Note that I have installed the backports and autobuilds on systems and run the assistant without seeing this problem, so it may be particular to the system's configuration in some way. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment b/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment new file mode 100644 index 000000000..3d4392c90 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 4" + date="2014-01-02T19:04:26Z" + content=""" +I've tested with the current release's Linux standalone amd64 build, and once the webapp shows no activity, strace shows it sitting there waiting for a futex, which causes no cpu load at all. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment b/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment new file mode 100644 index 000000000..a688bcdf3 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 5" + date="2014-01-02T22:21:34Z" + content=""" +I rebuilt using the current git head, i was expecting 20131230 but I got 5.20140102-gd93f946. The problem is still there: + +[[!format txt \"\"\" +anarcat@marcos:mp3$ top -b -n 1 | head +top - 17:18:23 up 2 days, 4:24, 9 users, load average: 4,01, 3,91, 3,80 +Tasks: 295 total, 1 running, 294 sleeping, 0 stopped, 0 zombie +%Cpu(s): 44,0 us, 4,9 sy, 0,6 ni, 49,7 id, 0,6 wa, 0,0 hi, 0,3 si, 0,0 st +KiB Mem: 8162960 total, 6778608 used, 1384352 free, 397144 buffers +KiB Swap: 4022268 total, 45752 used, 3976516 free, 2750720 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +28910 anarcat 20 0 158m 37m 21m S 90,2 0,5 42:49.44 git-annex +29550 anarcat 20 0 173m 44m 21m S 72,2 0,6 36:49.59 git-annex +29673 anarcat 20 0 304m 175m 21m S 12,0 2,2 34:09.70 git-annex +\"\"\"]] + +This doesn't seem to be proportional to the repository size or anything. pid 28910 is /srv/books, a moderately small repository. 29550 is my video repository and 29673 is my music. + +I suspect this is because I build git-annex myself. I am guessing that the ghc version I am using doesn't build with the proper thread patches and so on. I will try the backport to see if it fixes the issue. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment b/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment new file mode 100644 index 000000000..e1f750170 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 6" + date="2014-01-02T23:30:38Z" + content=""" +bad news: i can reproduce this with the backport: + +Version: 4.20131106~bpo70+1 +Build flags: Assistant Webapp Pairing Testsuite S3 Inotify DBus Feeds Quvi TDFA + +oddly enough, one of the repository saw some files be committed by the assistant during the startup scan that were not found by the 5.x version I was running earlier. + +but processor usage is still maxed out. + +i would be happy to provide you a shell here if you send me a OpenPGP-signed SSH public-key (or if you use monkeysphere). +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment b/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment new file mode 100644 index 000000000..bbd4c63dd --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 7" + date="2014-01-09T23:51:02Z" + content=""" +Okay, so the current situation is this: joey can't reproduce this, but I can reliably can, with the backport. So there has to be something different in our setups. + +We are suspecting the kernel, so I'm trying to upgrade to the backport, we'll see. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment b/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment new file mode 100644 index 000000000..e3a580bdb --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkmBRpgz-elUViGzECtWiO9cRLUpxIuMmg" + nickname="Oliver" + subject="comment 8" + date="2014-01-11T19:31:35Z" + content=""" +I have two Ubuntu 13.10 boxes, both running 5.20131221 from the fmarier PPA. They both have a repository with my XBMC library, and these repositories are synced together (they run on the same network). Interestingly, one machine exhibits this behaviour and one doesn't. The only obvious relevant difference is that the kernel versions are slightly different: the one that behaves properly is running + +3.11.0-15-generic #23-Ubuntu SMP Mon Dec 9 18:17:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + +The one where the assistant is running at full CPU is on + +3.11.0-14-generic #21-Ubuntu SMP Tue Nov 12 17:04:55 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + +I'm not sure if this is significant or why the kernels are different versions (both machines are fully updated). + +I would like to try and help debug this problem if possible. Please let me know if there is any diagnostic output I can provide that will help. + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment b/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment new file mode 100644 index 000000000..f5c5d2749 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 9" + date="2014-01-15T04:29:55Z" + content=""" +I have upgraded to the 3.10 backport, and there was no change in this behavior. I still see unreasonable CPU usage. + + Linux marcos 3.10-0.bpo.3-amd64 #1 SMP Debian 3.10.11-1~bpo70+1 (2013-09-24) x86_64 GNU/Linux + +"""]] diff --git a/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files.mdwn b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files.mdwn new file mode 100644 index 000000000..0196b7d7d --- /dev/null +++ b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files.mdwn @@ -0,0 +1,65 @@ +### Please describe the problem. +Summary: The assistant pulls files from remote repos although they are stored on trusted repos (remote machine may be up or down). + +After starting the assistant via "git annex webapp --listen #ip# --verbose --debug" it starts to check for pending tasks and starts to queue lots of files (could be all of them). I checked the daemon.log and found the following line: + +[[!format sh """ +[2014-06-03 21:39:04 CEST] TransferScanner: queued Download UUID "541d2f88-16c3-11e2-aa7e-8f1a2c8e14c5" apps/Apache_OpenOffice_4.0.0_MacOS_x86_install_en-US.dmg Nothing : expensive scan found missing object +"""]] + +The file is available in a remote repo: + +[[!format sh """ +$ git annex whereis apps/Apache_OpenOffice_4.0.0_MacOS_x86_install_en-US.dmg +whereis apps/Apache_OpenOffice_4.0.0_MacOS_x86_install_en-US.dmg (1 copy) + 541d2f88-16c3-11e2-aa7e-8f1a2c8e14c5 -- dump +ok +"""]] + +The remote "dump" is trusted and is configured as "backup" repo. The repo running the assistant is configured as "manual". The configuration settings for wanted, required and scheduled remained untouched. + +Num copies is unset and defaults to 1: + +[[!format sh """ +$ git annex numcopies +global numcopies is not set +(default is 1) +"""]] + +When calling "git annex find --want-get" no files are listed as in my case, all are stored in the "dump" repo which is trusted. + +[[!format sh """ +$ git annex find --want-get +$ +"""]] + +### What steps will reproduce the problem? +Start the assistant and wait for it to finish startup checking. The assistant adds lots (all?) of the files due to “expensive scan found missing object”. + +### What version of git-annex are you using? On what operating system? +Snapshot build from the annex branchable webpage running on an OSX 10.9.3 machine: +[[!format sh """ +$ git annex version +git-annex version: 5.20140411-g2503f43 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +"""]] + +Note: Updated to 5.20140529-g68a56a6 but same behavior is observed. + +### Please provide any additional information below. + +The backup node was down while the assistant starts up. However also files from another trusted node that is online 24/7 is pulled. Repo was upgraded from version 4 to 5. Is there a way to further check why a file was added e.g. to dump all variables of the evaluated term (approxlackingcopies, copies, etc)? + +[[!format sh """ +[2014-06-03 21:39:04 CEST] TransferScanner: starting scan of [Remote { name ="origin" },Remote { name ="dump" }] +[2014-06-03 21:39:04 CEST] read: git ["--git-dir=/Volumes/DATA/annex/images/.git","--work-tree=/Volumes/DATA/annex/images","ls-files","--cached","-z","--"] +[2014-06-03 21:39:04 CEST] chat: git ["--git-dir=/Volumes/DATA/annex/images/.git","--work-tree=/Volumes/DATA/annex/images","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"] +[2014-06-03 21:39:04 CEST] TransferScanner: queued Download UUID "541d2f88-16c3-11e2-aa7e-8f1a2c8e14c5" apps/Apache_OpenOffice_4.0.0_MacOS_x86_install_en-US.dmg Nothing : expensive scan found missing object +[2014-06-03 21:39:04 CEST] Transferrer: Transferring: Download UUID "541d2f88-16c3-11e2-aa7e-8f1a2c8e14c5" apps/Apache_OpenOffice_4.0.0_MacOS_x86_install_en-US.dmg Nothing +[2014-06-03 21:39:04 CEST] TransferScanner: queued Download UUID "541d2f88-16c3-11e2-aa7e-8f1a2c8e14c5" apps/Apache_OpenOffice_4.0.1_MacOS_x86_install_en-US.dmg Nothing : expensive scan found missing object +"""]] diff --git a/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_1_bc874e077009b81ab36a6d43d793030a._comment b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_1_bc874e077009b81ab36a6d43d793030a._comment new file mode 100644 index 000000000..91c8616c2 --- /dev/null +++ b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_1_bc874e077009b81ab36a6d43d793030a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-12T20:07:30Z" + content=""" +This seems to me to be likely to be some kind of configuration problem. In particular, what is the \"wanted\" setting for the repo running the assistant? If it's not \"standard\" then the fact that it's in the \"manual\" group won't affect the assistant's behavior. + +If that's not it, it would probably help to paste the entire vicfg display, so I can replicate the config (or share the repo). +"""]] diff --git a/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_2_a7e9d8ec500399dd6794e168f85e6a5c._comment b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_2_a7e9d8ec500399dd6794e168f85e6a5c._comment new file mode 100644 index 000000000..589086f6e --- /dev/null +++ b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_2_a7e9d8ec500399dd6794e168f85e6a5c._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmXSkgjC_ypUQafVwvHTLsStrkiXH8CfHU" + nickname="Matthias" + subject="comment 2" + date="2014-06-13T18:30:25Z" + content=""" +Thanks for your fast reply, Joey. I appended the shortened config below. Wanted and groupwanted were untouched and therefore still commented out. I removed the hash from wanted to explicitly set it standard. Now the assistant behaves as expected. However I’m wondering: + +* Shouldn’t ‘standard’ be the default rule to apply for wanted/groupwanted in case both are not explicitly set in the config? I assumed this to be the case. +* Shouldn’t “find --want-get” list the identical set of files that is also requested by the assistant? Especially this one confused me. + +[[!format sh \"\"\" +# Repository trust configuration +# (for macbook) +#trust 3938865a-ce40-4166-a918-2012078846c7 = semitrusted + +# Repository groups +# (for macbook) +group 3938865a-ce40-4166-a918-2012078846c7 = manual + +# Repository preferred contents +# (for macbook) +#wanted 3938865a-ce40-4166-a918-2012078846c7 = standard + +# Group preferred contents +# (Used by repositories with \"groupwanted\" in their preferred contents) +(config defaults - all commented out) + +# Standard preferred contents +(config defaults - all commented out) + +# Repository required contents +# (for macbook) +#required 3938865a-ce40-4166-a918-2012078846c7 = + +# Scheduled activities +# (for macbook) +#schedule 3938865a-ce40-4166-a918-2012078846c7 = +\"\"\"]] +"""]] diff --git a/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_3_a0824e00f04f95c39823f29d6c76e7fe._comment b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_3_a0824e00f04f95c39823f29d6c76e7fe._comment new file mode 100644 index 000000000..58f2069c1 --- /dev/null +++ b/doc/bugs/assistant_expensive_scan_unnecessarily_queues_files/comment_3_a0824e00f04f95c39823f29d6c76e7fe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-13T18:35:53Z" + content=""" +I need to look into why --want-get didn't behave as expected. + +It would probably make sense to make standard be the default. There could be upgrade concerns though. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit.mdwn b/doc/bugs/assistant_hangs_during_commit.mdwn new file mode 100644 index 000000000..12adf281d --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit.mdwn @@ -0,0 +1,27 @@ +What steps will reproduce the problem? + +Use git-annex and add file to repo. + + +What is the expected output? What do you see instead? + +File is committed and added to annex. + +Instead a command like this is run "git --git-dir=/home/jchu/annex/.git --work-tree=/home/jchu/annex commit --allow-empty-message -m --quiet" and for some reason git decides to open a COMMIT_EDITMSG file in my editor of choice "vim .git/COMMIT_EDITMSG". Since git annex doesn't give me access to the terminal, I don't see it. + +Depending on when it happens, the web interface could refuse to start (if the commit hang happens on startup) or if it happens during regular operation, then everything looks fine but the web interface doesn't update after that. + + +What version of git-annex are you using? On what operating system? + +git-annex (binary release) 4.20130405 +git 1.8.2.1 + +On Arch Linux. + + +Please provide any additional information below. + +I'm not sure if the git interface has changed, but I do see that --allow-empty-message does still exist. If I run the git commit command (with a '' after the -m), it does indeed start up vim for me. Would we benefit from just making a custom commit message ("Commit from date YYYYMMDDTHHMMSSZ")? + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment b/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment new file mode 100644 index 000000000..a2d78d703 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 1" + date="2013-04-15T15:58:04Z" + content=""" +Or if that solution isn't acceptable, it seems that git commit has a --no-edit option that will guarantee that an editor isn't started. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment b/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment new file mode 100644 index 000000000..4f0a20a02 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-16T19:04:34Z" + content=""" +Proving a commit message with -m, which git-annex already does, should be enough to prevent git opening an editor. You appear to have some broken version of git there if that is not the case. + +I see that you're using Arch. Where exactly did you download git-annex from? Have you tried the standalone tarball? +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment b/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment new file mode 100644 index 000000000..35377cbcf --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 3" + date="2013-04-17T02:19:02Z" + content=""" +I absolutely agree that the -m should stop git from requiring a commit message. I don't know if anything has changed in a newer version, but that's what I'm seeing. + +I'm using the git-annex-bin package from the AUR so it's already the standalone binary: https://aur.archlinux.org/packages/git-annex-bin/ + +As you can see by the PKGBUILD, it just copies the git-annex binary to /usr/bin/git-annex and creates a symlink for git-annex-shell. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment b/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment new file mode 100644 index 000000000..6bd85505e --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-17T05:09:42Z" + content=""" +AUR git-annex-bin is a very different thing from the standalone tarball. The tarball carefully puts together a program and a set of libraries and utilities it will work with. The git-annex-bin in AUR yanks that binary out and puts it in an entirely foreign system. + +So, try the standalone tarball. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment b/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment new file mode 100644 index 000000000..4c001c908 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 5" + date="2013-04-17T16:01:56Z" + content=""" +Using the git annex standalone binary has exactly the same action. It seems that the git annex standalone uses the system git instead of the one that's included. + +The git command \"git --git-dir=/home/jchu/annex/.git --work-tree=/home/jchu/annex commit --allow-empty-message -m --quiet\" hangs because it's waiting for a commit message \"vim .git/COMMIT_EDITMSG\". + +Having not looked too closely at the git source, I think I may have found what happened. The change happened in git 1.8.2 development. a24a41ea9a928ccde2db074ab0835c4817223c9d changed the code to only add \"\n\n\" to a commit message if it's entirely necessary, which means a completely blank commit message looks to the code on line 978 of commit.c \"if (logfile || message.len || use_message || fixup_message)\" as if it were actually empty instead of being considered \"\n\n\". + +Since this change only happened in 1.8.2, that's why when you run this code, it doesn't happen (any version before 1.8.2 shouldn't have this regression) but when I run it it does open the commit message editor. The --no-edit option has existed since 1.7.8 (ca1ba201). I don't know if you want to detect this case somehow or what, but I don't know if/when it's going to be fixed in git. + +As it stands, the git annex assistant is useless to me because it keeps hanging when trying to commit (the thing that I really wish I could trust it on!). +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment b/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment new file mode 100644 index 000000000..874d0a938 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-18T20:30:10Z" + content=""" +Thank you for that investigation. Have you confirmed that --no-edit actually fixes it? I've made it pass that parameter. + +(BTW, the standalone tarball contains a `runshell` script that you use to set up an environment before running git-annex. This includes putting its bundled version of git before the system one in PATH.) +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment b/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment new file mode 100644 index 000000000..407fbd589 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 7" + date="2013-04-18T23:22:51Z" + content=""" +Yes, in my initial testing, I found that --no-edit fixes the problem. +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore.mdwn b/doc/bugs/assistant_ignore_.gitignore.mdwn new file mode 100644 index 000000000..63d067e67 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore.mdwn @@ -0,0 +1,31 @@ +What steps will reproduce the problem? + +1. have an existing directory with a bunch of files +2. create a `.gitignore` file that matches some files (*.log *.aux *~ etc.) +3. `git init .` +4. `git annex init work` +5. `git remote add server server:Blabla` +6. `ssh server` +7. `@server $ mkdir Blabla` +8. `@server $ cd Blabla` +9. `@server $ git init .` +10. `@server $ git annex init server` +11. `@server $ exit` +12. `git annex webapp` + +What is the expected output? What do you see instead? + +I expect that ingored files stay ignored, +I see instead that all the files (including the ignored) are transfered to the server + +What version of git-annex are you using? On what operating system? + +3.20130124, debian sid (on both machines) + +> As noted in [[design/assistant/inotify]]'s TODO list, this +> needs an efficient gitignore query interface in git (DNE) +> or a gitignore parser. --[[Joey]] + +[[!tag /design/assistant]] + +> [[fixed|done]]; with git 1.8.4 the assistant honors .gitignore --[[Joey]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment b/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment new file mode 100644 index 000000000..83cb22ccc --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Johannes" + ip="153.109.130.54" + subject="comment 1" + date="2013-07-30T11:34:15Z" + content=""" +Any news on this or this or any other way to exclude unwanted files? (e.g. all the temporary files created by latex) +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment b/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment new file mode 100644 index 000000000..893be9055 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="git-annex from wheezy-backports should depend on a more recent git version on debian wheezy (7.2) " + date="2013-11-12T18:57:52Z" + content=""" +It is correct that the bug is solved on the git-annex package found on wheezy-backports, but this package does not force an update of git to a more recent version. Therefore the bug still affects wheezy users. The way to solve it is to install git also from wheezy-backports. + + +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment b/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment new file mode 100644 index 000000000..e58d46084 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-12T19:10:48Z" + content=""" +Agreed, I've made the changes so the next update of the backport will do so. +"""]] diff --git a/doc/bugs/assistant_locked_my_files.mdwn b/doc/bugs/assistant_locked_my_files.mdwn new file mode 100644 index 000000000..07bafd6cc --- /dev/null +++ b/doc/bugs/assistant_locked_my_files.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. + +When the assistant is running, using "git annex unlock" on the commandline may lead to unexpected results. + +### What steps will reproduce the problem? + +Make sure the assitant is running on a repository. + +`git annex unlock somefiles`, try to edit them, wait a while, try to edit. + +If you're not lucky, the assistant will notice the unlocked files as new and will add them back, locking them in the process, and you won't be able to save them. + +### What version of git-annex are you using? On what operating system? + +debian wheezy. + +[[!format sh """ +git-annex version: 5.20131109-gf2cb5b9 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 3 +default repository version: 3 +supported repository versions: 3 5 +upgrade supported from repository versions: 0 1 2 4 +"""]] + +### Please provide any additional information below. + +[[!tag confirmed]] diff --git a/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment b/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment new file mode 100644 index 000000000..fdf921c47 --- /dev/null +++ b/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-05T20:46:30Z" + content=""" +Right -- you can't use the assistant at the same time as git-annex commands that get/drop/unlock files, unless you set the assistant to run in manual mode (which prevents it undoing a get/drop) and/or disable syncing in the assistant entirely (which prevents it adding back unlocked files). +"""]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn new file mode 100644 index 000000000..d009b55cd --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn @@ -0,0 +1,68 @@ +What steps will reproduce the problem? + +In one terminal, I created a new annex and started the assistant watching it. + +In another, I added a file file1; assistant noticed it and added it to the annex. + +I moved file1 to a directory directory1; the link broke and assistant did not fix it. + +I created a file called file2 inside directory 2; assistant noticed it and added it to the annex. + +I moved file2 back up to the annex root directory; the link broke and assistant did not fix it. + +I created a file file3 in the annex root directory; assistant noticed it and added it to the annex. + +Here is the content of the first terminal, where I created the annex and ran assistant: + + + ~$ mkdir testannex + ~$ cd testannex/ + testannex$ git init . + Initialized empty Git repository in /Users/ed/testannex/.git/ + testannex$ git annex init "test annex" + init test annex ok + (Recording state in git...) + testannex$ git annex assistant --foreground + assistant . (scanning...) (started...) add file1 (checksum...) ok + (Recording state in git...) + (Recording state in git...) + add directory1/file2 (checksum...) ok + (Recording state in git...) + (Recording state in git...) + add file3 (checksum...) + +here is the content of the second terminal, where I created and moved files: + + ~$ cd testannex + testannex$ echo "file1 content" > file1 + testannex$ mkdir directory1 + testannex$ ls -l file1 + lrwxr-xr-x 1 ed staff 180 Dec 13 15:40 file1 -> .git/annex/objects/FX/51/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80 + testannex$ mv file1 directory1/ + testannex$ cd directory1/ + directory1$ cat file1 + cat: file1: No such file or directory + directory1$ echo "file2 content" > file2 + directory1$ cat file2 + file2 content + directory1$ cat file1 + cat: file1: No such file or directory + directory1$ mv file2 ../ + directory1$ cd .. + testannex$ echo "file3 content" > file3 + testannex$ + + +What is the expected output? What do you see instead? + +The links do not break when moved to another directory. + +What version of git-annex are you using? On what operating system? + +One compiled using cabal from checkout 739c937 + +Please provide any additional information below. + +> [[fixed|done]]; this turned out to be an kqueue specific bug, +> the kqueue code statted new files, but that files for a broken symlink. +> Using lstat instead fixed this. --[[Joey]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment new file mode 100644 index 000000000..fef95243b --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-13T20:50:18Z" + content=""" +(Operating system is OS X Lion) + +"""]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment new file mode 100644 index 000000000..6d93d7e61 --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2012-12-15T05:47:25Z" + content=""" +thanks, fix worked for me! Now the links are fixed virtually instantaneously when the file is moved. + +"""]] diff --git a/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn b/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn new file mode 100644 index 000000000..7e605ba7c --- /dev/null +++ b/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn @@ -0,0 +1,21 @@ +git remotes that have git-annex and git "installed" using the linux +standalone tarball (or the OSX dmg) may not have git-receive-pack in PATH. + +To make `git annex sync` and `git push` etc work on such a remote, +it needs to have a dedicated ssh key that runs git-annex-shell and uses it +to run the command. + +The assistant sets that up when it sets up a dedicated ssh key. However, if +the server can be sshed into without a password using an existing ssh key, +the assistant re-uses that key. + +The assistant should either always set up a dedicated ssh key, even when +not otherwise needed, or it should probe to see if git-receive-pack and +git-send-pack can be run as part of its probing, and set up a dedicated +ssh key when they cannot be. --[[Joey]] + +> After recent sshpassword changes, the webapp sets up a dedicated ssh key +> by default. If the user chooses to use an existing ssh key, it will be +> used. So this is less likely to be a problem. --[[Joey]] + +[[!tag confirmed]] diff --git a/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn b/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn new file mode 100644 index 000000000..959620ba6 --- /dev/null +++ b/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +I migrated a repo I set up by hand on my Android phone to use the assistant and webapp. That repo has two remotes, both full git-annex repos over SSH. I still want to control when I synchronize (cellular data is precious), so the vast majority of the time I disable syncing on both remotes. However, when I return to the webapp after it's been running for "a while," it shows a status message indicating it has synced with the remotes. + +It looks like it might be related to the NetWatcherFallback, because a NetWatcherFallback entry appears in the log approximately every hour, followed by the usual repo sync output. + +### What steps will reproduce the problem? + +1. Set up a repo with a git-annex over SSH remote, and set annex-sync on that remote to false. +2. Run the webapp. +3. Observe after a period of time that the webapp shows that the repo has been synced. + +### What version of git-annex are you using? On what operating system? + +git-annex 20130709 on Android (4.2) + +### Please provide any additional information below. + +[[!format sh """ +[2013-07-22 22:50:31 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +[2013-07-22 23:52:57 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +[2013-07-23 00:54:15 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +"""]] + +> Excellent bug report! Especially useful that you tracked it +> down to the NetWatcher. Indeed it was not honoring the +> annex-sync setting. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn b/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn new file mode 100644 index 000000000..b019d51b8 --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn @@ -0,0 +1,85 @@ +[[!meta title="windows assistant fails to set up rsync.net authorized keys"]] + +### Please describe the problem. +Having set up a key pair, the assistant is unable to use it to log in. The console only shows a single attempt to log in, when it's adding the key to the remote machine's authorized_keys file. This is evidently failing, as the key is not actually added to authorized_keys, possibly because the shell script it tries to execute is malformed (crazy quoting, I can't untangle it), or possibly because it failed to ask for a password (I expected it to, but it didn't prompt for one). Also, once I do add the key to authorized_keys, I can ssh in using it but asking the assistant to retry still fails. + +### What steps will reproduce the problem? +Set up a remote repository. + +### What version of git-annex are you using? On what operating system? +Windows 7, Version: 5.20131230-g192d991 + +### Please provide any additional information below. + + Failed to make repository + Something went wrong setting up the repository on the remote server. + Transcript: + Permission denied, please try again. + Permission denied, please try again. + Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). + +[[!format sh """ +[2014-01-01 03:28:05 Eastern Standard Time] call: ssh-keygen ["-P","","-f","C:\\ +Users\\FAMILY~1\\AppData\\Local\\Temp\\git-annex-keygen.5\\key"] +Generating public/private rsa key pair. +cygwin warning: + MS-DOS style path detected: C:\Users\FAMILY~1\AppData\Local\Temp\git-annex-key +gen.5\key + Preferred POSIX equivalent is: /cygdrive/c/Users/FAMILY~1/AppData/Local/Temp/g +it-annex-keygen.5/key + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +Your identification has been saved in C:\Users\FAMILY~1\AppData\Local\Temp\git-a +nnex-keygen.5\key. +Your public key has been saved in C:\Users\FAMILY~1\AppData\Local\Temp\git-annex +-keygen.5\key.pub. +The key fingerprint is: +c7:0f:81:19:c8:39:cc:e1:d3:6a:62:9a:d5:d2:9f:c1 Familyroom@Familyroom-PC +The key's randomart image is: ++--[ RSA 2048]----+ +| +.+. | +| .B. + | +| o.+ . | +| o + . . | +| = = E + | +| = + . + o | +| o o . | +| | +| | ++-----------------+ +[2014-01-01 03:28:07 Eastern Standard Time] chat: ssh ["-p","22","rlbrooks@celeb +dil.db48x.net","sh -c 'mkdir -p '\"'\"'annex/test'\"'\"'&&cd '\"'\"'annex/test'\ +"'\"'&&if [ ! -d .git ]; then git init --bare --shared && git config receive.den +yNonFastforwards false; fi&&git annex init&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/gi +t-annex-shell ]; then (echo '\"'\"'#!/bin/sh'\"'\"';echo '\"'\"'set -e'\"'\"';ec +ho '\"'\"'if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then'\"'\"';echo '\"'\"'ex +ec git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"'\"'\"';echo '\"'\"'else'\"'\"';e +cho '\"'\"'exec git-annex-shell -c \"$@\"'\"'\"';echo '\"'\"'fi'\"'\"') > ~/.ssh +/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_ +keys&&chmod 600 ~/.ssh/authorized_keys&&echo '\"'\"'command=\"GIT_ANNEX_SHELL_DI +RECTORY='\"'\"'\"'\"'\"'\"'\"'\"'annex/test'\"'\"'\"'\"'\"'\"'\"'\"' ~/.ssh/git- +annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa A +AAAB3NzaC1yc2EAAAADAQABAAABAQDeB64i+DhYBCq0mdet6sBr1JCtYR5zNc0E9NYaZbBVRBcpZDCRs +AS1z8mjyEnb49y7AnNgsx/f7xAWtyFHFr8AbrYnaHmJYicix0R6inDXZ42WJTusHVW47/1ysErHmEusZ +KWXNzN5bu8bOoz0FqCh4Ymo3QjgMzk6+PoWqSCmwewuX++RkB6q1IN1VTMqJguPtdQpTp3hCIV6GENf6 +HvnLUQ59JKg1sgt5UA88zDAMlXicmUeuHRSW7nVlVIBHFDJW8f5CyF66wiuGTLdhhMlaOqpUqIEHubPF +ZE4iTOC/uuOdWjGgySX681ub4seKyz7h8uDePPo0uz0BXJpt9vT Familyroom@Familyroom-PC\n'\ +"'\"' >>~/.ssh/authorized_keys'"] +"""]] + +[[!format sh """ +$ ssh rlbrooks@git-annex-celebdil.db48x.net-rlbrooks_annex +git-annex-shell: bad parameters + +Usage: git-annex-shell [-c] command [parameters ...] [option ..] + +Options: + --force allow actions that may lose annexed data + -F --fast avoid slow operations + -a --auto automatic mode + -q --quiet avoid verbose output +etc +"""]] + +> [[fixed|done]]; both for regular remote ssh servers, and for rsync.net --[[Joey]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment new file mode 100644 index 000000000..66827bf8d --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T19:56:32Z" + content=""" +I can reproduce this bug. Seems the problem is that sshTranscript is called with a string that is fed in on stdin. But I guess that on Windows, ssh password prompting is also done using stdin (on Linux it would use /dev/tty), and so this prevents it from prompting. + +I've fixed this for the remote ssh server setup in the webapp, which did not actually need to feed anything in on stdin. Confirmed ssh adding works! + +However, for rsync.net, the ssh pubkey is fed into dd using stdin, and so I was unable to fix it there yet. Since rsync.net does not support redirection to files in its shell, the only approach that would seem to work is to first download the authorized_keys file, add the line, and rsync in the new file. Until I get a chance to do that, I am leaving this bug report open. +"""]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment new file mode 100644 index 000000000..6998c2b2d --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2014-01-01T19:59:11Z" + content=""" +Also, fixing rsync.net that way would mean two ssh connections to set up authorized_keys, so 2 password prompts. suboptimal.. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn new file mode 100644 index 000000000..1ad800522 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. +The assistant (or rather the programs it's running) appears to be using unix-style paths instead of cygwin paths, causing several types of errors. A selection of items from the terminal: + +[[!format sh """ +Launching web browser on file://C:\Users\Familyroom\annex\.git\annex\webapp.html +[2013-12-31 01:14:05 Eastern Standard Time] read: ssh-keygen ["-F","celebdil.db4 +8x.net"] +ssh-keygen: /home/Familyroom/.ssh/known_hosts: No such file or directory +[2013-12-31 01:14:05 Eastern Standard Time] read: ssh ["-oNumberOfPasswordPrompt +s=0","-oStrictHostKeyChecking=no","-n","-p","22","rlbrooks@celebdil.db48x.net"," +sh -c 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-ann +ex-probe git-annex-shell; fi;if which git; then echo git-annex-probe git; fi;if +which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell +; then echo git-annex-probe ~/.ssh/git-annex-shell; fi;cd '\"'\"'annex'\"'\"' && + git config --list'"] +[2013-12-31 01:14:08 Eastern Standard Time] read: ssh-keygen ["-F","celebdil.db4 +8x.net"] +ssh-keygen: /home/Familyroom/.ssh/known_hosts: No such file or directory +[2013-12-31 01:14:08 Eastern Standard Time] read: ssh ["-oStrictHostKeyChecking= +no","-n","-p","22","rlbrooks@celebdil.db48x.net","sh -c 'echo git-annex-probe lo +ggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;i +f which git; then echo git-annex-probe git; fi;if which rsync; then echo git-ann +ex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/ +.ssh/git-annex-shell; fi;cd '\"'\"'annex'\"'\"' && git config --list'"] +rlbrooks@celebdil.db48x.net's password: +[2013-12-31 01:15:03 Eastern Standard Time] read: gpg ["--quiet","--trust-model" +,"always","--with-colons","--list-secret-keys","--fixed-list-mode"] +gpg: WARNING: using insecure memory! +gpg: please see http://www.gnupg.org/documentation/faqs.html for more informatio +n +gpg: fatal: can't create directory `/home/Familyroom/.gnupg': No such file or di +rectory +secmem usage: 0/0 bytes in 0/0 blocks of pool 0/65536 +"""]] + +Naturally, I don't have a /home/Familyroom, although I do have a /c/Users/Familyroom. + +### What steps will reproduce the problem? +Start creating a remote repository. + +### What version of git-annex are you using? On what operating system? +Windows 7, git-annex version 5.20131230-g192d991 + +> [[fixed|done]]; git-annex now ensures HOME is set when running cygwin +> commands that require it. --[[Joey]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment new file mode 100644 index 000000000..8e51d8509 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 1" + date="2013-12-31T20:48:03Z" + content=""" +I neglected to mention that the assistant is failing when gpg fails, and that it worked last week in 5.20131221-gf8c928d (or at least it got past this point). +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment new file mode 100644 index 000000000..a68338d2d --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2013-12-31T21:17:32Z" + content=""" +It seems that both ssh-keygen and gpg are for some reason acting as if HOME is set to /home/Familyroom. +git-annex does not do anything to override the default home directory these programs use, and AFAIK, nothing has changed in the Windows build between the working and broken versions that could have anything to do with this. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment new file mode 100644 index 000000000..49e040d5a --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 3" + date="2013-12-31T23:47:43Z" + content=""" +Yea, the only relevant change I noticed was 5c834daf5, and it's not particularly relevant. + +However, its occurred to me that I started the webapp differently this time than last; I used the start menu shortcut this time rather than typing git annex webapp in the git shell. It's not surprising that the environment variables would be quite different between the two. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment new file mode 100644 index 000000000..7debf8ea8 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 4" + date="2013-12-31T23:56:24Z" + content=""" +Yea, if I start it from the Git Bash command line, it continues past this to a completely different error. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn new file mode 100644 index 000000000..657a4dd3d --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn @@ -0,0 +1,5 @@ +I am running 3.20121112 and this bug appeared when I upgraded to that from 3.20121017. + +After performing the startup scan after I login, git-annex gets GPG to sends me a pinentry pop-up asking for my GPG passphrase. However, I know that there is nothing to be dropped or copied to the encrypted SSH remote that I am being asked to provide access to. So I can't see any good reason why I would be asked for the passphrase. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment new file mode 100644 index 000000000..548db2386 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-29T20:13:53Z" + content=""" +Hmm, is this an encrypted rsync remote? + +I have not been able to reproduce the problem so fat. + +If you start the assistant with --debug, and look in .git/annex/daemon.log, you should find where it runs gpg, and the lines showing what it's doing just before/after that should provide a hint what it's doing. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment new file mode 100644 index 000000000..ce57194c9 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 2" + date="2012-12-01T18:34:10Z" + content=""" +Thanks for the log advice. I looked and it wants to drop a file `ttmik/TTMIK-Lesson-L1L1.mp3` from the encrypted rsync remote ma. So I did `git annex whereis ttmik/TTMIK-Lesson-L1L1.mp3` and learnt that the file is not on ma. I tried `git annex drop --from ma ttmik` to be sure, and the command was successful, but it still tries to drop the file from ma on startup. Presumably it would try all the other files in the ttmik directory if I gave it the chance to try to drop this first one. The only thing special about the ttmik directory is that every file in there was added using addurl, so I guess the problem has something to do with that. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment new file mode 100644 index 000000000..9bfade666 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-12-01T18:59:45Z" + content=""" +How is this rsync remote configured? Is it configured as a transfer remote? If not, the assistant's default behavior is to sync all files to it, and since you say the file is not there, it'd make sense it would start transferring it to there on startup. + +OTOH, this could be a complete red herring. You haven't shown me the log file. Perhaps the drop you're seeing in the log is before the operation that is asking for the GPG passphrase. I can't tell until you show me the log. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment new file mode 100644 index 000000000..8f9f54610 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 4" + date="2012-12-02T18:27:09Z" + content=""" +The rsync remote is in the archive group but it has the preferred content string `exclude=video/* and exclude=ttmik/*`. So it ought to be dropping the files, but not over and over again. + +Here is the log file, showing me hitting Escape on the pinentry dialog: + + (scanning...) Already up-to-date. + Already up-to-date. + Already up-to-date. + drop ma ttmik/TTMIK-Lesson-L1L1.mp3 (gpg) gpg: cancelled by user + gpg: decryption failed: secret key not available + TransferScanner crashed: user error (gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"-- + quiet\",\"--trust-model\",\"always\",\"--decrypt\"] exited 2) + (started...) +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment new file mode 100644 index 000000000..89ef87c2a --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.72" + subject="comment 5" + date="2012-12-05T16:34:24Z" + content=""" +Aha, I see the bug now. It is indeed trying to drop from every remote, even ones without the data. + +(Also, the thread should not crash here if the drop fails.. I've fixed that.) +"""]] diff --git a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn new file mode 100644 index 000000000..530a8da5d --- /dev/null +++ b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn @@ -0,0 +1,5 @@ +Found this out the hard way. See the comment in the below post for what happens. + +[[/forum/git_annex_add_crash_and_subsequent_recovery/]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment new file mode 100644 index 000000000..7ff8f8e3d --- /dev/null +++ b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-06T16:49:32Z" + content=""" +This only happens with the WORM backend (or possibly with SHA1E if the file's extension has a newline). + +The problem is not the newline in the file, but the newline in the key generated for the file. It's probably best to just disallow such keys being created. +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files.mdwn b/doc/bugs/bad_merge_commit_deleting_all_files.mdwn new file mode 100644 index 000000000..affabdb02 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files.mdwn @@ -0,0 +1,78 @@ +In our family repository, we had an event where git-annex committed a bad +merge commit. This had the effect of seeming to delete all the files +in the repository. However, it is completely recoverable with no file loss. + +Other users have reported apparently the same problem. +--[[Joey]] + +> This appears to be a race, and I have put in a fix for that. +> It will be released in git-annex 5.20140709. +> +> It's a little bit difficult to say for sure that the bug is fixed, since +> I don't have a good way to reproduce it. However, everything I am seeing +> is consistent with my analysis, at least as far as the people who +> reported this happening with versions 5.20140613-5.20140707. +> Calling this [[done]]. --[[Joey]] + +## recovery + +Look through the git log for the bad commit. It will be the one +that deletes a lot of files. Since the bad commit is a merge commit, +you need to include the -c switch: + + git log -c --stat + +Once the bad commit sha is found, revert it. Since it's a merge commit, +you will need to pass -m 1 to git revert. If the repository you're working +is uses direct mode, you will first need to switch it to indirect mode. + + git annex indirect + git revert -m 1 a36077cf1234eeb755fec8f699d3cbaaee817bac + +(It's possible, but I think unlikely that this will pick the wrong +branch of the merge to revert. If it did, "git reset --hard HEAD@{1}" and +redo, passing `-m 2` instead.) + +Once the revert is done, all your files should be back. You can switch +the repository back to direct mode if desired (`git annex direct`) +and can `git annex sync` to push the fix out to all other clones. +Everywhere the fix lands should restore the deleted files. + +Note that it's possible that some repositories may have pruned the deleted +files as unused. This is most likely to happen in the repository that made +the bad merge commit in the first place. + +If you have any problems following these instructions, please contact + for support. + +[[!tag confirmed urgent]] + +## analysis + +In the one case I have of this happening, the commit was made by the +git-annex assistant, in direct mode. It was git-annex version 5.20140613. +This version had a bug that caused it to do unncessary merge commits. +That bug has been fixed in 5.20140707. +That is apparently related, in that it caused the assistant to do much more +work than normal. + +But, I don't think that bug is fully responsible for the +problem. I think a few users have run into this bug before, although I have +never succeeded in getting a full problem description from anyone who might +have. I think that the unncessary commit bug made it more likely to happen. +(This suggests a race may be involved.) + +The bad merge commit looked like this: + +
+commit a36077cf1234eeb755fec8f699d3cbaaee817bac
+Merge: 52ecff2 9d8bfd4
+Author: xxx
+Date:   Mon Jul 7 19:58:18 2014 -0400
+
+    merge refs/heads/synced/master
+
+ +Both parent trees were good and contained all files. In fact, the 2 +parent trees contained the same set of files. But the merge commit +"resolved" the merge by deleting all the files. diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_1_3503644244e39c65d531807769365f50._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_1_3503644244e39c65d531807769365f50._comment new file mode 100644 index 000000000..6b24ea958 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_1_3503644244e39c65d531807769365f50._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-09T18:20:13Z" + content=""" +mergeDirect locks .git/index, so no other git command should use it while the merge is in progress. + +However, if the index file is deleted, and stageMerge runs, it stages deletion of all files. So that looks likely to be part of the story. +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_2_9c4c950da0c07bf7c7edfcc7cc3b6011._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_2_9c4c950da0c07bf7c7edfcc7cc3b6011._comment new file mode 100644 index 000000000..19dcf1ca0 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_2_9c4c950da0c07bf7c7edfcc7cc3b6011._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-09T18:25:08Z" + content=""" +Also pointing in the direction of a race: The bad commit happened 3 seconds after another commit did. The other commit was an empty commit, so caused by the bug in 5.20140613. +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_3_be42de12faf15562265ad6cf8964f5db._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_3_be42de12faf15562265ad6cf8964f5db._comment new file mode 100644 index 000000000..dd689eae7 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_3_be42de12faf15562265ad6cf8964f5db._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="theory" + date="2014-07-09T18:31:07Z" + content=""" +Suppose we have 2 mergeDirect's A and B running at the same time somehow, with B around 3 seconds behind A, and this sequence of events occurs: + +1. A copies index file to index.lock +2. A stages an empty commit +3. B copies index file to index.lock +4. A finishes its commit, and so renames index.lock back to index. +5. B runs stageMerge + +So, B is now running stageMerge with `GIT_INDEX_FILE` pointing to an index.lock that DNE. As noted above, this causes a deletion of all files to get staged by B. + +If this is the problem, git-annex could fix it using a real lock file. (The index.lock only prevents other git commands from manipulating the index during the merge.) +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_4_d5cbd1440e4d6706eb14644a4ff1883b._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_4_d5cbd1440e4d6706eb14644a4ff1883b._comment new file mode 100644 index 000000000..1440ee46b --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_4_d5cbd1440e4d6706eb14644a4ff1883b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 4" + date="2014-07-09T18:36:36Z" + content=""" +The above race was first introduced in version 5.20140613. +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c532859deb682dff9e59037d08f66a51._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c532859deb682dff9e59037d08f66a51._comment new file mode 100644 index 000000000..b1a5d32a6 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c532859deb682dff9e59037d08f66a51._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 6" + date="2014-07-09T19:01:33Z" + content=""" +Note that [[Assistant_merge_loop]], which contributes to this bug, is not actually fixed in 5.20140707, it seems. +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c946d2793fe0354151c447ddd0e59fd7._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c946d2793fe0354151c447ddd0e59fd7._comment new file mode 100644 index 000000000..20006ff6c --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_6_c946d2793fe0354151c447ddd0e59fd7._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="http://jamesjustjames.wordpress.com/" + nickname="purpleidea" + subject="The guy with this bug." + date="2014-07-09T18:50:36Z" + content=""" +* Sure enough looking though the git log, I found one that removed 81 +files. It was useful to grep for 'deletions'. + +* It turned out there were actually two, one from each of the two +git-annex-assistant machines. I had to do the revert separately on each +machine for the corresponding commit that it had made. + +* I typically run the latest version that the webapp offers, within +about a week or so of it prompting me (unless I'm away for a while). +This means that maybe you can track down the approximate version where +this occured by looking at the two commit dates of the \"bad\" merges: + +commit bbe43fb638d101d5b9bfa65a4023e7f9d90e72e6 +Merge: 351cca8 95935ce +Author: James +Date: Tue Jul 8 02:15:57 2014 -0400 + +commit 1902a3af25b1ce3723c38877c7f25907885040e4 +Merge: 125b984 efcece7 +Author: James +Date: Tue Jul 8 02:15:27 2014 -0400 + +* I use the command line for pretty much most of what I do. Funny enough +though I only really use git-annex through the webapp. + +* Bug wise I don't know if this is relevant, but I have done the +following: +> added/changed/removed files to ~/annex on computer one while git-annex +wasn't running +> added/changed/removed files to ~/annex on computer two while it wasn't +running +> started git-annex on computer one +> started git-annex on computer two +> and similar combinations of the above... +"""]] diff --git a/doc/bugs/bad_merge_commit_deleting_all_files/comment_7_24dea380fcf470e0ea488dece0410f37._comment b/doc/bugs/bad_merge_commit_deleting_all_files/comment_7_24dea380fcf470e0ea488dece0410f37._comment new file mode 100644 index 000000000..0cb39e7c8 --- /dev/null +++ b/doc/bugs/bad_merge_commit_deleting_all_files/comment_7_24dea380fcf470e0ea488dece0410f37._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="more confirmation of race theory" + date="2014-07-09T19:26:55Z" + content=""" +@purpleidea showed me his git log, and as I had expected, there were previous empty commits immediately before the 2 commits that removes all of his files (which happened independenctly on 2 different machines running the assistant). This is consistent with my suspicion it's a race. Note that the assistant's git ref watcher can easily run multiple merges concurrently if multiple refs change. +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing..mdwn b/doc/bugs/box.com_never_stops_syncing..mdwn new file mode 100644 index 000000000..d8e5391b5 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing..mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. +Git-annex will constantly sync most(if not all) my files to box.com + +### What steps will reproduce the problem? +1 - Use git-annex instead of Dropbox at work +2 - Boot computer. +3 - Watch it sync everything to box.com (even files i believe it has transferred each and every day for the last few months) + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130827 + +But i have never seen it work satisfactory in any version. + +Also, i have seen this is 10+ different clean git-annexes. So it isn't annex specific. + +### Please provide any additional information below. + +I am going to add more debug to this bug constantly. (I intend to do a full 'git annex copy --to box.com --not --in box.com' daily, and see if the same files are transfered again and again) + + +For now, i see a few different issues already: + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +tou@DSK1049:~/work-annex$ git annex copy --to box.com --not --in box.com 2>&1 | tee ../work-annex-copy-to-box.com-not-in-box.com-run1.log +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","git-annex"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","--hash","refs/heads/git-annex"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..dbe8b1cfa5f84126c45a39fdc7c7f26e272c71cc","--oneline","-n1"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..45e279375897a2cd7f5b893402e0ec25c1b23436","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..c4921be4434f751493fce1c932ac759214abacd4","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..d591398dc1cac824a5fc5bdacdcb82301a9b15a3","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"] +[2013-09-11 09:24:54 CEST] read: git ["config","--null","--list"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","ls-files","--cached","-z","--"] +[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"] +copy Documents/Gamle catillo overførsler/Rapport b-bm.odt (gpg) (checking box.com...) ok +copy Documents/Gamle catillo overførsler/Rapport brandt skorstensfejeren.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/4a5/18e/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1.chunkcount) failed +copy Documents/Gamle catillo overførsler/Rapport teamkoege.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/98d/ae7/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44.chunkcount) failed +copy Documents/Gamle catillo overførsler/Rapport vikarborsen.odt (checking box.com...) ok +copy Documents/Gamle catillo overførsler/Rapport-terrariemesteren.odt (checking box.com...) ok +copy Documents/Gamle catillo overførsler/catillo-efhandel.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/9d9/aea/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52.chunkcount) failed +copy Documents/Nøgeordsanalyse catillo104.xlsx (checking box.com...) (ResponseTimeout) failed +copy Documents/Søgeordsliste.txt (checking box.com...) ok +copy Documents/catillo guide.odt (checking box.com...) ok +copy Documents/guide bruger oprettelse.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/49e/175/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c.chunkcount) failed +copy Documents/guide skift backup bånd.odt (checking box.com...) ok +copy Documents/lilletest.csv (checking box.com...) (failed to read https://www.box.com/dav/work-annex/915/373/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33.chunkcount) failed +copy Dropbox/adams-scraper/CommonFunctions.py (checking box.com...) (ResponseTimeout) failed +copy Dropbox/adams-scraper/__pycache__/CommonFunctions.cpython-33.pyc (checking box.com...) (to box.com...) [2013-09-11 09:28:30 CEST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--passphrase-fd","14","--symmetric","--force-mdc"] + +100% 0.0 B/s 0sResponseTimeout +ResponseTimeout +failed + + +# End of transcript or log. +"""]] + +More to come(full log) + +> This is [[fixed|done]] in git; when built with a new enough +> version of the haskell DAV library, git-annex disables the default 5 +> second timeout. +> +> It'll still be present in the Debian stable backports, which are +> built with an old version of DAV. Not much I can do about that; +> backporting DAV would be difficult. +> +> The daily builds are updated to use the new version. +> --[[Joey]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment b/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment new file mode 100644 index 000000000..ee1c88cc7 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T20:29:14Z" + content=""" +It seems you are getting a lot of timeouts from box.com, both when checking if content is present there and when uploading content that it does not have. + +I have heard some grumbles about box.com not being very reliable right now. +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment b/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment new file mode 100644 index 000000000..5a0cde548 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-09-12T20:54:33Z" + content=""" +The problem being. I've used box.com with one of my own hooks(owncloud), where it is completely stable! + +The instability is not a the box.com end. + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment b/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment new file mode 100644 index 000000000..5eab58b3f --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 3" + date="2013-09-12T20:56:44Z" + content=""" +git-annex is using box.com's WebDAV interface. Is owncloud? +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment b/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment new file mode 100644 index 000000000..eb9dc5134 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 4" + date="2013-09-12T21:33:29Z" + content=""" +It uses the following url https://www.box.com/dav + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment b/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment new file mode 100644 index 000000000..9d9c1329b --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 5" + date="2013-09-12T21:44:32Z" + content=""" +It may be that there is a timeout in the http library that I am using for webdav that is too low. See +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment b/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment new file mode 100644 index 000000000..5eaf4f4bb --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 6" + date="2013-09-12T21:49:05Z" + content=""" +That would probably do it. With other implementations(fuse mount) i've seen stalls and other bad behaviour with that DAV server. + +The owncloud hook doesn't have a timeout set. It probably should have one to prevent a total stall. +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment b/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment new file mode 100644 index 000000000..2ac3f360e --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="Logs" + date="2013-09-13T11:43:22Z" + content=""" +So have two days of logs now, and it doesn't look like it is retrying old files. + +http://paste.ubuntu.com/6101255/ <- day 1 + +http://paste.ubuntu.com/6101256/ <- day 2 + +Setting the computer to do the following loop over the weekend, lets see if everything is done come monday. + +for i in `seq 3 2000`; do git annex copy --to box.com --not --in box.com 2>&1 | tee ../work-annex-copy-to-box.com-not-in-box.com-run$i.log; done + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment b/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment new file mode 100644 index 000000000..8dfbd6944 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment @@ -0,0 +1,55 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="Update" + date="2013-09-18T11:17:33Z" + content=""" +Only just got back to work now. The script has done 10 iteration. This is the status: + + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run1.log |grep \" ok\"| wc -l +137 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run2.log |grep \" ok\"| wc -l +77 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run3.log |grep \" ok\"| wc -l +116 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run4.log |grep \" ok\"| wc -l +70 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run5.log |grep \" ok\"| wc -l +26 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run6.log |grep \" ok\"| wc -l +6 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run7.log |grep \" ok\"| wc -l +6 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run8.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run9.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run10.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run11.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run12.log |grep \" ok\"| wc -l +0 + +I have all the log files of course. + +tou@DSK1049:~/work-annex$ git annex find --not --in box.com| wc -l +1639 + +So, of the last 5 iteration 0 files of 1639 missing were transfered. Most of these files are <10kbyte + +http://paste.ubuntu.com/6123459/ <- pastebin of work-annex-copy-to-box.com-not-in-box.com-run11.log if it is of any use. + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment b/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment new file mode 100644 index 000000000..99a0eb9ae --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 9" + date="2013-09-28T19:34:42Z" + content=""" +Filed a bug on the DAV library about this: +"""]] diff --git a/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn b/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn new file mode 100644 index 000000000..40005a60a --- /dev/null +++ b/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn @@ -0,0 +1,58 @@ +### Please describe the problem. + +`git annex map` shows broken graph when direct mode is used + +### What steps will reproduce the problem? + +See transcript + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 5.20140107 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external + +$ LANG=C apt-cache policy git-annex +git-annex: + Installed: 5.20140107 + Candidate: 5.20140107 + Version table: + *** 5.20140107 0 + 50 http://http.debian.net/debian/ sid/main amd64 Packages + 100 /var/lib/dpkg/status +"""]] + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +git init a +cd a +git annex init + +cd .. +git clone a b +cd b +git annex init + + +# OK +git annex map + +cd ../a +git annex direct +cd ../b + +# NOT OK +git annex map + +# End of transcript or log. +"""]] + +> [[fixed|done]]; thanks for a good test case. --[[Joey]] diff --git a/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn b/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn new file mode 100644 index 000000000..172f28143 --- /dev/null +++ b/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn @@ -0,0 +1,57 @@ +### Please describe the problem. + +Building from git fails in Assistant/WebApp/Gpg.hs + +### What steps will reproduce the problem? + +Follow instructions at for building from git: + +[[!format sh """ +cabal update +PATH=$HOME/bin:$PATH +cabal install c2hs --bindir=$HOME/bin +cabal install --only-dependencies +cabal configure +cabal build +"""]] + +### What version of git-annex are you using? On what operating system? + +git master (7da58f3ebf8), openSUSE 12.3 + +### Please provide any additional information below. + +[[!format txt """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Assistant/WebApp/Configurators/Fsck.hs:69:35: + Warning: This binding for `u' shadows the existing binding + bound at Assistant/WebApp/Configurators/Fsck.hs:60:17 + +Assistant/WebApp/Configurators/Fsck.hs:126:11: + Warning: This binding for `check' shadows the existing binding + imported from `Assistant.WebApp.Common' at Assistant/WebApp/Configurators/Fsck.hs:16:1 +-30 + (and originally defined in `Yesod.Form.Functions') +[322 of 371] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, dist/build/git-annex/git +-annex-tmp/Assistant/TransferQueue.o ) +[323 of 371] Compiling Assistant.Threads.Glacier ( Assistant/Threads/Glacier.hs, dist/build/git-annex +/git-annex-tmp/Assistant/Threads/Glacier.o ) +[324 of 371] Compiling Assistant.Threads.Merger ( Assistant/Threads/Merger.hs, dist/build/git-annex/g +it-annex-tmp/Assistant/Threads/Merger.o ) +[325 of 371] Compiling Assistant.Threads.Cronner ( Assistant/Threads/Cronner.hs, dist/build/git-annex +/git-annex-tmp/Assistant/Threads/Cronner.o ) +[326 of 371] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, dist/build/git-annex/git-annex +-tmp/Assistant/MakeRemote.o ) +[327 of 371] Compiling Assistant.WebApp.Gpg ( Assistant/WebApp/Gpg.hs, dist/build/git-annex/git-annex +-tmp/Assistant/WebApp/Gpg.o ) + +Assistant/WebApp/Gpg.hs:88:40: + Not in scope: type constructor or class `MonadIO' + Perhaps you meant `Monad' (imported from Assistant.WebApp.Common) + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn b/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn new file mode 100644 index 000000000..d0551c151 --- /dev/null +++ b/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn @@ -0,0 +1,25 @@ +Here goes... + +
+laplace:git-annex jtang$ make
+ghc -O2 -threaded -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_KQUEUE -DOSX --make git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o
+
+Assistant/Threads/MountWatcher.hs:40:0:
+     warning: #warning Building without dbus support; will use mtab polling
+[165 of 208] Compiling Assistant.Alert  ( Assistant/Alert.hs, tmp/Assistant/Alert.o )
+[173 of 208] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o )
+[174 of 208] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, tmp/Assistant/TransferQueue.o )
+[175 of 208] Compiling Assistant.Threads.Watcher ( Assistant/Threads/Watcher.hs, tmp/Assistant/Threads/Watcher.o )
+
+Assistant/Threads/Watcher.hs:61:43:
+    Couldn't match expected type `Utility.Kqueue.Kqueue'
+                with actual type `()'
+    Expected type: IO Utility.Kqueue.Kqueue -> IO Utility.Kqueue.Kqueue
+      Actual type: IO Utility.Kqueue.Kqueue -> IO ()
+    In the fourth argument of `watchDir', namely `startup'
+    In the second argument of `($)', namely
+      `watchDir "." ignored hooks startup'
+make: *** [git-annex] Error 1
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn b/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn new file mode 100644 index 000000000..34c2eef5f --- /dev/null +++ b/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn @@ -0,0 +1,43 @@ +Building commit 8baff14054e65ecbe801eb66786a55fa5245cb30 yields this... + + +
+[164 of 189] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o )
+Command/Sync.hs:268:34:
+Not in scope: `vermarker'
+Perhaps you meant `varmarker' (line 267)
+make: *** [git-annex] Error 1
+
+ +Supplied fix... + +
+
+From a23a1af99c7a95c316a87f9c6f5f67a6f8ff6937 Mon Sep 17 00:00:00 2001
+From: Jimmy Tang 
+Date: Wed, 27 Jun 2012 21:55:22 +0100
+Subject: [PATCH 14/14] fix build issue introduced in
+ 8baff14054e65ecbe801eb66786a55fa5245cb30
+
+---
+ Command/Sync.hs | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Command/Sync.hs b/Command/Sync.hs
+index b2bf24d..dfaed59 100644
+--- a/Command/Sync.hs
++++ b/Command/Sync.hs
+@@ -265,7 +265,7 @@ mergeFile file key
+        | otherwise = go $ shortHash $ show key
+        where
+                varmarker = ".variant-"
+-               doubleconflict = vermarker `isSuffixOf` (dropExtension file)
++               doubleconflict = varmarker `isSuffixOf` (dropExtension file)
+                go v = takeDirectory file
+                         dropExtension (takeFileName file)
+                        ++ varmarker ++ v
+-- 
+1.7.11.1
+
+ +[[fixed|done]] diff --git a/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain.mdwn b/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain.mdwn new file mode 100644 index 000000000..b63f56ce8 --- /dev/null +++ b/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. +In "Configuring jabber account" custom domains through google apps don't connect properly. + +### What steps will reproduce the problem? +Try to use a google account that uses a non-gmail domain, e.g. user@domain.com + +### What version of git-annex are you using? On what operating system? +Newest, on Mac OS 10.9 + +### Please provide any additional information below. +The issue is because git-annex is trying to connect to @domain.com as the jabber server, but the server should be talk.google.com:5223. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain/comment_1_6537e928a0d6d5c41b55370f112f4afb._comment b/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain/comment_1_6537e928a0d6d5c41b55370f112f4afb._comment new file mode 100644 index 000000000..26a63f87f --- /dev/null +++ b/doc/bugs/can__39__t_connect_jabber_with_custom_google_apps_domain/comment_1_6537e928a0d6d5c41b55370f112f4afb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-07-02T17:28:01Z" + content=""" +This seems like the same problem as in [[bugs/googlemail]]. + +git-annex uses SRV records to find the jabber server for a domain. What is google doing that makes this not work? Do you have a sample domain? +"""]] diff --git a/doc/bugs/can__39__t_get.mdwn b/doc/bugs/can__39__t_get.mdwn new file mode 100644 index 000000000..d5a29a2ae --- /dev/null +++ b/doc/bugs/can__39__t_get.mdwn @@ -0,0 +1,81 @@ +### Please describe the problem. + + +### What steps will reproduce the problem? + +[[!format sh """ +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. +"""]] + +### What version of git-annex are you using? On what operating system? + + +[[!format sh """ +$> apt-cache policy git-annex +git-annex: + Installed: 5.20140116 + Candidate: 5.20140116 + Version table: + *** 5.20140116 0 + 600 http://debian.lcs.mit.edu/debian/ sid/main amd64 Packages + 100 /var/lib/dpkg/status +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. + +but seems to start fetching some load if I do not specify any path and just run 'git annex get'. + +There seems to be some screw up: + +I have plenty of objects under .git/annex/objects/ (seems largely from +the directory above), nothing is now reported by unused (with obscure +msg): + +$> du -scmL * 2>/dev/null | tail -1 +1 total + +$> du -scm .git/annex/objects +334 .git/annex/objects +334 total + +$> git annex dropunused all +git-annex: Map.findMin: empty map has no minimal element + +Here is some portion of the history which lead to such a state (there +was git annex unused somewhere before) + +25954 git annex move --unused --to onerussian.com_annex +25955 git annex dropunused +25956 git annex dropunused all +25962 git annex unused +25963 git log --stat -SSHA256E-s5639442--67691e57cb4d6c51afe838590ad265ba4bea9c291cf52d58ed24f05b70bf33bf.mp3 +25965 git log --stat -SSHA256E-s143042--b4012bf03ed0a387a9e714390efa75f1dd769162cca4c9b77e516732342be3f9.html +25968 git annex move --unused --to onerussian.com_annex +25969 git annex dropunused all +25976 git annex unused +25978 git br +25980 git log --stat -Ss741707--7c215090893f1f0c994e2a9ad3088016676464bbad26768841dd08c07295a2fe.pdf.map +25981 git annex unused +25982 git annex fsck +25983 git annex unused +25984 git annex dropkey +25985 git log --stat -SSHA256E-s14534131--20de680eedb3e1fb687c9b00c154d978333b61f4ea122c632bdb5bcdbb1553ff.pdf +25986 git show de3ccae8304efbae4a7a8add49de638f64b821fc +25991 git annex fsck + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] + +> Tagged moreinfo since I have a workable theory about how this happened, +> which would make it user configuration error and not a bug, but +> that has not been confirmed. --[[Joey]] diff --git a/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment new file mode 100644 index 000000000..6530ae3c8 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="git annex fix starts fixing but then spits bulk of errors" + date="2014-01-18T05:42:15Z" + content=""" +probably related: + +``` +fix books/Мои первые книжки/PDF/Благинина Е.А. - Лодочки (Мои первые книжки) - 1962.pdf ok +fix books/Мои первые книжки/PDF/Благинина Е.А. - Не мешайте мне трудиться (Мои первые книжки) - 1975.pdf fatal: This operation must be run in a work tree +ok +(Recording state in git...) + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123) +fatal: This operation must be run in a work tree +failed +(Recording state in git...) + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123) +fatal: This operation must be run in a work tree +failed +(Recording state in git...) + +.... +``` +"""]] diff --git a/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment new file mode 100644 index 000000000..456bd0342 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="repair seems to be also confused" + date="2014-01-18T05:47:02Z" + content=""" +[[[ +$> git annex repair +Running git fsck ... +No problems found. +fatal: '/home/yoh/annex/.git' is outside repository +Had to delete the .git/annex/index file as it was corrupt. +No data was lost. +ok + +$> ls +2enjoy/ 2read/ 2watch/ books/ hardware/ videos/ +2listen/ 2review/ abooks/ docs/ pics/ + +$> git annex repair +Running git fsck ... +No problems found. +fatal: '/home/yoh/annex/.git' is outside repository +Had to delete the .git/annex/index file as it was corrupt. +No data was lost. +ok + +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. + +]]] +"""]] diff --git a/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment new file mode 100644 index 000000000..b7a7f3bc4 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="could it be part/reason of the problem" + date="2014-01-18T06:05:50Z" + content=""" +not sure how that happened... definitely not me consciously! ;-) some commands are complaining that \"You cannot run this command in a bare repository\" which I thought is BS since it is not BARE! but then looked into .git/config and it does have core.bare = True ... yikes!.. + +This repository is also under assistant \"control\". + +changing to bare=False seems to start 'get'ing things, git annex repair doesn't produce obscure errors. + +git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink,,, but I guess that is a fluke after many upgrades -- just dropping everything locally and getting needed context after purging .git/annex/objects . + +So I guess issue is resolved by discovering that repository was set to 'bare' mode somehow although it was not and seemed like working but not quite +"""]] diff --git a/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment new file mode 100644 index 000000000..0d0422fd3 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-18T15:42:59Z" + content=""" +git-annex sets core.bare=true for direct mode, but it also then sets annex.direct=true and so does not treat it as a bare mode repository. If you had eg, manually tried to change annex.direct to false, and left it in bare mode, that would explain everything. + +> git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink + +That is completely normal behavior; git annex fix does not care if the content is locally present or not; it just checks that the symlinks would point to it if it were present. + +(Fixed the partial function in dropunused.) +"""]] diff --git a/doc/bugs/cannot_link_executable_on_android.mdwn b/doc/bugs/cannot_link_executable_on_android.mdwn new file mode 100644 index 000000000..cb660dd9c --- /dev/null +++ b/doc/bugs/cannot_link_executable_on_android.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +Then starting git-annex on my Galaxy Nexus Android device, in the terminal window I get: + +[[!format sh """ +Falling back to hardcoded app location: cannot find expected files in /data/app-lib +git annex webapp +u0_a123@maguro:/sdcad/git-annex.home $ git annex webapp +CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) +u0_a123@maguro:/sdcad/git-annex.home $ +"""]] + +### What steps will reproduce the problem? +Start git-annex. + +### What version of git-annex are you using? On what operating system? +Nightly build and release from a few days ago - 1.0.52 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]] diff --git a/doc/bugs/case-insensitive.mdwn b/doc/bugs/case-insensitive.mdwn new file mode 100644 index 000000000..a917f64c2 --- /dev/null +++ b/doc/bugs/case-insensitive.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? + +> Building git-annex on the ghc7.0 branch on a Mac with the default case-insensitive file system + +What is the expected output? What do you see instead? + +> Expected: build successfully; instead: + + ld: duplicate symbol _UtilityziDiskFree_zdwa_info in dist/build/git-annex/git-annex-tmp/Utility/diskfree.o and dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o for architecture x86_64 + +What version of git-annex are you using? On what operating system? + +> commit `0bd5c90ef0518f75d52f0c5889422d8233df847d` on a Mac OS 10.6 and 10.7, using the Haskell Platform 2012.04 + +Please provide any additional information below. + +> The problem is that since `DiskFree.hs` generates `DiskFree.o` and `diskfree.c` generates `diskfree.o`, a case-insensitive file system overwrites one object file with the other. Renaming `diskfree.c` to `diskfreec.c` and changing the corresponding filenames in `git-annex.cabal` fixes the problem. + +>> Man, not this again. The 80's called, they want their +>> unix portability wars back. [[fixed|done]]. --[[Joey]] diff --git a/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn b/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn new file mode 100644 index 000000000..027d22431 --- /dev/null +++ b/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn @@ -0,0 +1,228 @@ +What steps will reproduce the problem? + + $ git init a.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/ + $ cd a.git + $ git annex init a + init a ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Added Rene'." + [master (root-commit) a61b796] Added Rene'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ cd .. + $ git clone -o a a.git b.git + Cloning into b.git... + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (9/9), done. + remote: Total 13 (delta 1), reused 0 (delta 0) + Receiving objects: 100% (13/13), done. + Resolving deltas: 100% (1/1), done. + $ cd b.git + $ git annex copy --from=a --fast -v + (merging a/git-annex into git-annex...) + copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + +What is the expected output? What do you see instead? + +Expect that files will be copied, but they are not. + +What version of git-annex are you using? On what operating system? + + $ echo $LANG + en_US.UTF-8 + $ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 11.10 + Release: 11.10 + Codename: oneiric + $ uname -a + Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux + $ bash --version + GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) + Copyright (C) 2011 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + + This is free software; you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + $ ghc --version + The Glorious Glasgow Haskell Compilation System, version 7.4.2 + $ git annex version + git-annex version: 3.20120807 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +Please provide any additional information below. + +The problem is related to weird characters in file names. In the +above example, the "weird character" is an accented 'e' (entered with +$'\351' in bash and zsh). I am able to add the files with weird +characters in their name to one annex, but I cannot copy them to other +annexes using `git annex copy`. + +The above example is a simplification of a real problem I am +experiencing. In my real scenario, the file is not empty. See the +attachment for some variations, including with non-empty +files. UPDATE: I'm not allowed to add attachments. See below. + +May be related to these (long-ago fixed) bugs: +http://git-annex.branchable.com/todo/support-non-utf8-locales/ + + +"Attachment": Here are my notes, including more examples: + + Programs I'm using: + + $ echo $LANG + en_US.UTF-8 + $ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 11.10 + Release: 11.10 + Codename: oneiric + $ uname -a + Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux + $ bash --version + GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) + Copyright (C) 2011 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + + This is free software; you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + $ ghc --version + The Glorious Glasgow Haskell Compilation System, version 7.4.2 + $ git annex version + git-annex version: 3.20120807 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + + + Simplest way to see problem: one empty file with weird character + (accented e: $'\351') in name: + + $ git init a.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/ + $ cd a.git + $ git annex init a + init a ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Added Rene'." + [master (root-commit) a61b796] Added Rene'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ cd .. + $ git clone -o a a.git b.git + Cloning into b.git... + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (9/9), done. + remote: Total 13 (delta 1), reused 0 (delta 0) + Receiving objects: 100% (13/13), done. + Resolving deltas: 100% (1/1), done. + $ cd b.git + $ git annex copy --from=a --fast -v + (merging a/git-annex into git-annex...) + copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + + + Problem disappears with two empty files: + + $ cd .. + $ git init a2.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a2.git/.git/ + $ cd a2.git + $ git annex init a2 + init a2 ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Ren$'\351'." + [master (root-commit) 62ac1c8] Add Ren$'\351'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ touch Rene + $ git annex add Rene + add Rene (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Rene." + [master c455523] Add Rene. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 Rene + $ cd .. + $ git clone -o a2 a2.git b2.git + Cloning into b2.git... + done. + $ cd b2.git + $ git annex copy --from=a2 --fast -v + (merging a2/git-annex into git-annex...) + copy Rene (from a2...) ok + (Recording state in git...) + + + Problem returns with two non-empty files: + + $ cd .. + $ git init a4.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a4.git/.git/ + $ cd a4.git + $ git annex init a4 + init a4 ok + (Recording state in git...) + $ touch Ren$'\351' + $ rm Ren$'\351' + $ ls + $ echo "some content" > Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Ren$'\351'." + [master (root-commit) f090d90] Add Ren$'\351'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ echo "some other content" > Rene + $ git annex add Rene + add Rene (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Rene." + [master 97c20cd] Add Rene. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 Rene + $ cd .. + $ git clone -o a4 a4.git b4.git + Cloning into b4.git... + done. + $ cd b4.git + $ git annex copy --from=a4 --fast -v + (merging a4/git-annex into git-annex...) + copy Rene (from a4...) ok + copy René + git-annex: /var/tmp/git-annex-bug/b4.git/.git/annex/transfer/download/a5fcd0d4-e8c8-11e1-bb41-43ce1cb9a9f1/SHA256-s13--1c87b6727f523662df714f06a94ea27fa4d9050c38f4f7712bd4663ffbfdfa01: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + +> [[Fixed|done]]. Sorry this took so long, I was at a very busy point when +> you filed this and am only just getting caught up. --[[Joey]] diff --git a/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn b/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn new file mode 100644 index 000000000..2485e7b19 --- /dev/null +++ b/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn @@ -0,0 +1,53 @@ +When two git-annex processes are running and both modifying the git-annex +branch, it's possible one will fail due to git's locking. When this +happens, git-annex has already recorded its state in the journal (so no +data is lost), but git-annex does crash, which can be surprising. + +I feel that, in general, multiple git-annex processes should be able to run +concurrently. A big lock around all commands, or even all +repository-modifying commands is a bad idea. Also, it's probably best to +only worry about locking conflicts editing the git-annex branch. While `git +annex add` and a few other commands make changes to the main git repo, +and can have similar locking issues, so can any git commands that stage +changes (I think.. check). + +Probably should KISS. Just add a lock file that is taken before changes to +the git-annex branch, and if it's locked, wait. Changes to the git-annex +branch tend to happen quickly (unless it's committing an enormous set of +changes, and even that is relatively fast), so waiting seems ok. --[[Joey]] + +---- + +Commit 7981eb4cb512fbe3c49a3dd165c31be14ae4bc49 is more pessimistic, +describes some other potential issues. + +* The journal needs to be emptied (done) and kept locked (not done) during + a merge, since a merge operates at a level below the journal, and any + changes that are journaled during a merge can overwrite changes merged + in from another branch. + +* Two git-annex processes can be doing conflicting things and inconsistent + information be written to the journal. + + - One example would be concurrent get and drop of the same key. + But could this really race? If the key was already present, the get + would do nothing, so record no changes. If the key was not yet present, + the drop would do nothing, and record no changes. + + - Instead, consider two copys of a key to different locations. If the + slower copy starts first and ends last, it could cache the location + info, add the new location, and lose the other location it was copied to. + Tested it and the location is not cached during the whole copy (logChange + reads the current log immediatly before writing), so this + race's window is very small -- but does exist. + +---- + +## Updated plan + +Make Branch.change transactional, so it takes a lock, reads a file, +applies a function to it, and writes the changed file. + +Make Branch.update hold the same lock. + +> [[Done]]. diff --git a/doc/bugs/configurable_path_to_git-annex-shell.mdwn b/doc/bugs/configurable_path_to_git-annex-shell.mdwn new file mode 100644 index 000000000..af2474451 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell.mdwn @@ -0,0 +1,7 @@ +On one of my ssh remotes I had to install git-annex using cabal. No system-wide installation possible. Hence `git-annex` and `git-annex-shell` are not in the default `$PATH` but in `$HOME/.cabal/bin`. + +Right now the command run by git-annex when ssh'ing to a remote is hardcoded to "`git-annex-shell`", which doesn't work for me. It would be nice to be able to change this per remote, for example with an option named `annex..annex-shell-command`. Changing "`git-annex-shell`" in `Remote/Helper/Ssh.hs` to "`~/.cabal/bin/git-annex-shell`" worked for me, but it's obviously very ugly :) + +Could you do that please? I'll try to hack it myself and send you a patch in the next few days, but I'm pretty new to Haskell so it may take me a while... Thanks! + +> [[closing|done]], see comments --[[Joey]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment new file mode 100644 index 000000000..50349363b --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-22T22:26:02Z" + content=""" +It doesn't need to be installed into the system PATH; just the user PATH. Which you should be able to control. + +Exactly how to do this surely varies, but here I have a `~/.bashrc` containing `PATH=$HOME/bin:$PATH; export PATH` and I keep git-annex-shell in bin and it's available to eg \"ssh mybox git-annex-shell\" +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment new file mode 100644 index 000000000..adea95ecf --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 2" + date="2012-03-23T13:27:12Z" + content=""" +Hmm, ok, solved. I'm using zsh, which is a little different: `.zshrc` is only read for interactive shells, so `ssh mybox 'echo $PATH'` displayed `/usr/bin:/bin:/usr/sbin:/sbin`. Using `.zshenv`, which is used even for non-interactive shells, did the trick. Thanks! +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment new file mode 100644 index 000000000..399c46bc2 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="carlo" + ip="130.102.158.18" + subject="comment 3" + date="2013-07-01T04:20:22Z" + content=""" +For anyone who comes across this, make sure that you modify your $PATH before these lines in ~/.bashrc: + + # If not running interactively, don't do anything + [ -z \"$PS1\" ] && return + +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_5_178452f3c2671830d1a9f5e1d11accb4._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_5_178452f3c2671830d1a9f5e1d11accb4._comment new file mode 100644 index 000000000..cc4742587 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_5_178452f3c2671830d1a9f5e1d11accb4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 5" + date="2014-05-27T16:13:09Z" + content=""" +See [[devblog/day_166__catching_up]] +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_5_77b2269936f740cacbc955b95f9da51d._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_5_77b2269936f740cacbc955b95f9da51d._comment new file mode 100644 index 000000000..a30f2fff9 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_5_77b2269936f740cacbc955b95f9da51d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 5" + date="2014-05-26T11:52:27Z" + content=""" +when doing ssh host 'echo $PATH', the remote shell running the command is not an interactive shell and thus does NOT source .bashrc, neither is it a login shell and as such does not source .profile or .bash_profile. Which leaves me wondering: how does git annex log in to the remote machine to run git-annex-shell? Does it do so via an interactive shell, a login shell, or neither? Because if it does it via ssh host 'git-annex-shell', then neither .bashrc or .profile can configure its PATH. +"""]] diff --git a/doc/bugs/confirmed.mdwn b/doc/bugs/confirmed.mdwn new file mode 100644 index 000000000..1bb3c864f --- /dev/null +++ b/doc/bugs/confirmed.mdwn @@ -0,0 +1,5 @@ +This tag is for bugs that have been confirmed to be real bugs, and so are likely +to be the next bugs fixed. + +If your bug report is not tagged as confirmed, you probably need to provide more +information so that the bug can be reproduced. diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn b/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn new file mode 100644 index 000000000..f4489de27 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn @@ -0,0 +1,7 @@ +I have a large direct-mode repository whose files I'm trying to copy to a non-direct-mode repository. Both repositories live on an HDD attached to an rpi. + +When I do $ git annex copy --to pi dirs/to/copy, the copy starts out OK, but eventually many files fail to copy. The only diagnostic I get is "failed". Judging from the backscroll, I don't see a strong pattern to the files which fail to copy; they're kind of interspersed amongst files which were successfully copied. If I try to copy one of these failed files explicitly (git annex copy --to pi file/which/failed), this succeeds. I have plenty of free space on the disk. + +Is there a way to get more diagnostics out of git annex so I can see why these files are failing to copy? + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment new file mode 100644 index 000000000..b0127ed82 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 10" + date="2014-03-06T21:38:53Z" + content=""" +Thanks a lot, Joey. + +Compiling all of the dependencies for git-annex was taking forever on my pi, so I'll probably wait until the next release to test this out. But I'll report back here if I have any problems. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment new file mode 100644 index 000000000..09fabcf1c --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-03-10T19:20:42Z" + content=""" +Well you can always grab one of the daily builds, which include this fix. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment new file mode 100644 index 000000000..dba07bfd5 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2014-03-05T16:11:27Z" + content=""" +I tried git annex sync --content, and it failed to copy some files with + + git: createProcess: resource exhausted (Resource temporarily unavailable) + +So this sounds like fork is failing; I'm probably exhausting my poor pi's RAM. Maybe the same thing is happening for git annex copy. I'll run strace to see. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment new file mode 100644 index 000000000..5bcd0e92e --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-05T20:31:57Z" + content=""" +How many files copied are we talking about before it begins to fail? + +You can try passing --debug, which will make git-annex show every external command it runs, which includes `cp` for a copy to another repo on the same machine. + +Might also check memory usage in top during the run. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment new file mode 100644 index 000000000..297c28a40 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 3" + date="2014-03-06T18:21:53Z" + content=""" +> How many files copied are we talking about before it begins to fail? + +Tens of thousands of files processed, but many of them were already on the other remote so didn't invoke cp (or anything else). ~3300 invocations of cp. + +I saved a log of ps aux, and, while the memory used by git annex remains relatively constant, I do observe /tons/ of zombie processes. 3300, actually. + +I didn't check all of them, but all of the zombie pids I checked appear to have corresponded to this command: + + /home/pi/git-annex.linux/shimmed/git/git --git-dir=/home/pi/hdd/annex/.git --work-tree=/home/pi/hdd/annex cat-file --batch + +Perhaps git annex is forgetting to reap this processes? +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment new file mode 100644 index 000000000..537736a72 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 4" + date="2014-03-06T18:32:33Z" + content=""" +Old versions of git-annex have known bugs involving zombies. What version? +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment new file mode 100644 index 000000000..ad2b80d66 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 5" + date="2014-03-06T18:35:00Z" + content=""" +5.20140221-g1a47f5f -- I just downloaded it a week or two ago. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment new file mode 100644 index 000000000..a0554cd8a --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 6" + date="2014-03-06T18:38:43Z" + content=""" +Hmm, that version should only start git cat-file --batch a maximum of 10 times (if it is crashing for some reason), and appears to wait on the process if it does crash. And if not, should only start one. + +I think you need to post some git-annex --debug output , to show when it's running this command. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment new file mode 100644 index 000000000..f846e290d --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 7" + date="2014-03-06T18:40:26Z" + content=""" +Actually, NM, I have reproduced the bug. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment new file mode 100644 index 000000000..5ba7442dc --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 8" + date="2014-03-06T20:21:16Z" + content=""" +Analysis: Remote.Git's onLocal calls Annex.new to make a new AnnexState for the local remote. This state is not cached, and is regenerated for each file. Since it runs a Annex.Branch check of the location log on the remote, it needs to start catFile, and since the state is not reused, a new CatFileHandle is allocated each time. I'm not sure, but there may have been a recent-ish change that caused the location log to get checked and so catfile to be run; the general inneficiency of making a new AnnexState each time is not new. + +Fixing this by caching the AnnexState will not only fix the resource leak, but should speed up local to local copies significantly! +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment new file mode 100644 index 000000000..e6a23eed5 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 9" + date="2014-03-06T21:17:14Z" + content=""" +Fixed in git. Also reduced the non-data-transfer work done by `git-annex copy` by around 8%. + +I'm going to move this thread to [[bugs]] so I can close it. ;) +"""]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn new file mode 100644 index 000000000..81d84b300 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +When copying files to s3 using, + + git annex copy --quiet --to mys3 --fast + +No information whatsoever is printed during upload when ran without `--quite` it prints a line for each file in the repo creating page after page of output for repos with thousands of file basically no way to tell which files got uploaded. Is it possible to have a verbosity level between quite and verbose that only reports progress on actual copy/move operations. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!meta title="copy --fast --to remote should be quiet when nothing to do"]] + +> [[fixed|done]]; Avoided the unnecessary output in this situation. +> --[[Joey]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment new file mode 100644 index 000000000..07cb1b780 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-11T15:31:34Z" + content=""" +So, `git annex copy --to remote` currently does an active check that the remote has each file. This is a bit inneficient, and I have never been 100% sure that's the best thing, but from time to time I see a situation where trusting the location log when doing a `cp` would not be ideal. + +It would be easy to omit the output for files that the check finds on the remote, but I think it's good because it tells you git-annex is doing actual work. Otherwise, `git annex copy --to remote` might seem to take a long time for no reason. + +Anyway, you can disable the active check, with --fast. And I agree that in this case it would be better to not print anything. I looked at the code and it would be a little tricky to do it. + +There's a simple workaround: `git annex copy --to remote --not --in remote` +"""]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment new file mode 100644 index 000000000..cc86240f4 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2013-12-11T16:18:27Z" + content=""" +Joey thanks for tip. This actually made copy operation faster than `copy --fast`, and only provides the info that I need. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn b/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn new file mode 100644 index 000000000..3790a0edf --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn @@ -0,0 +1,50 @@ +[[!format sh """ +greg@x200s:~/Documents$ git-annex unused +unused . (checking for unused data...) (checking annex/direct/master...) (checking synced/annex/direct/master...) (checking synology/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s16367--0b00ef0154c42a0bf94e5be8d92d8af27455d59794f26c33dfc39c09178521c9.pdf + 2 SHA256E-s84--b08e1c831863bb43c02158bd5e8f3f5416c3a5203d89fa94a22149460142c273.odt + 3 SHA256E-s84--ec4caae451180a29721f2b6667eec8ec80eaa724f0727cf99d2bb21bf9218e9d.odt + ... + 88 SHA256E-s84--710d69bef61674b04974ac550d713e5928563b2a12b902b64fe451705b967452.doc + 89 SHA256E-s3830--1348d6248e35625da3e22f73d2a0017185bb5e1aa37f65bbca5dfcb3c7f53034 + 90 SHA256E-s119822--7c1b53ab6402b8835473f0b5c326f3cc300ac9372be79694942c1efa4bcdc621.pdf + 91 SHA256E-s84--63b6188696795885ff6570a76a3a74799396787f7058cbcfd4a2c40b22982420.odt + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + +ok +greg@x200s:~/Documents$ git-annex copy --unused --to synology +"""]] + +Is that correct behavior? I would assume the last command would at least run through the 91 files and check my synology remote that they are there. Like this repo did: + +[[!format sh """ +$ git-annex unused +unused . (checking for unused data...) (checking master...) (checking 60justin/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s9390266--7ed16c9423b331dbe63bb3b4278b8c94a6754a07177c53fceb3b24e9610e8054.NEF + 2 SHA256E-s10435713--49cbfe8466eada2c3787c9a7e158a7dfb9845a0aa8ef862ed2578b59c889dc4d.NEF + 3 SHA256E-s9442044--85c314e318f643237df5e3adf7559e9bf268ee28f1f92d4102161865323ddeb6.NEF + 4 SHA256E-s290672--c5822c3ef16bd62b5752b2dace81182ce00d64bd4d2d994ba93e3cb94e645708.JPG + 5 SHA256E-s293288--30f1367fc326f7b053012818863151206f9e3ddeab3c3fc5b5c1c573d120d50a.JPG + 6 SHA256E-s3672986--be960f6dc247df2496f634f7d788bd4a180fe556230e2dafc23ebc8fc1f10af3.JPG + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + +ok +$ git-annex copy --unused --to synology +copy SHA256E-s9390266--7ed16c9423b331dbe63bb3b4278b8c94a6754a07177c53fceb3b24e9610e8054.NEF (checking synology...) ok +copy SHA256E-s10435713--49cbfe8466eada2c3787c9a7e158a7dfb9845a0aa8ef862ed2578b59c889dc4d.NEF (checking synology...) ok +copy SHA256E-s9442044--85c314e318f643237df5e3adf7559e9bf268ee28f1f92d4102161865323ddeb6.NEF (checking synology...) ok +copy SHA256E-s290672--c5822c3ef16bd62b5752b2dace81182ce00d64bd4d2d994ba93e3cb94e645708.JPG (checking synology...) ok +copy SHA256E-s293288--30f1367fc326f7b053012818863151206f9e3ddeab3c3fc5b5c1c573d120d50a.JPG (checking synology...) ok +copy SHA256E-s3672986--be960f6dc247df2496f634f7d788bd4a180fe556230e2dafc23ebc8fc1f10af3.JPG (checking synology...) ok +$ +"""]] + +> [[fixed|done]] per my comment --[[Joey]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment new file mode 100644 index 000000000..cedc0f7f9 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="indirect vs direct" + date="2014-02-20T06:25:31Z" + content=""" +Aha! The issue is that the first repo (the one not copying unused files to synology) was in direct mode. I switched it to indirect and not only are there now a lot more files listed in unused, but copy --unused is working as expected. + +Should there be a warning in git-annex unused when in direct mode about this? I'm not exactly sure what is happening (not sure why the number of unused would go up from 91 to 296). +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment new file mode 100644 index 000000000..a3a3c119f --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="Could I get a "version", brethren?" + date="2014-02-20T17:58:32Z" + content=""" +I think there are two bugs here. I just reproduced and fixed a bug that would caused `git annex unused` to sometimes not notice certain unused keys when in direct mode. That's why the number you were finding in direct and indirect was different. + +That does not explain why `copy --unused` would not operate on unused files when in direct mode. A problem I have not managed to reproduce.. + +There was a recent change to the format of the .git/annex/unused.log, which temporarily broke reading it (fixed in 5.20140210). This could be some version skew problem, as while the new git-annex version can read the old log format, the old git-annex version will ignore the new log format. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment new file mode 100644 index 000000000..4fb2b3d39 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 3" + date="2014-02-20T19:31:56Z" + content=""" +heh, I *just* dist-upgraded this morning on the box that was showing the problem from git-annex_5.20140127_amd64.deb to git-annex_5.20140210_amd64.deb. So what you say is probably right (re unused.log). + +The only other annex I have in direct mode right now is one that I also am using the standalone build with (version 5.20131224-g6ca5271 right now). It has unused content in it (in fact, it's the synology annex, where I'm moving all the unused data to). I can do testing there if needed (and since it's a standalone build, it's easy for me to switch around git-annex versions with symlinks). The only problem is that it is dog slow when running git-annex unused. :) +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment new file mode 100644 index 000000000..9deb87d24 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 4" + date="2014-02-20T19:49:21Z" + content=""" +Well, if you had a newer git-annex than 5.20140127 temporarily in path, it would certianly explain it. I have tested --unused in direct mode and am not seeing any problems. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment new file mode 100644 index 000000000..d5e56151d --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 5" + date="2014-03-05T04:34:49Z" + content=""" +Still seeing it with version 5.20140227 + +git-annex unused shows 110 keys. + +git-annex copy --unused --to $anyremote just returns very quickly without doing anything. + +git-annex copy --all --to $anyremote does go through every key and checks. + +git-annex copy --key=$some_key_listed_in_unused --to $anyremote also just returns quickly without checking. + +I even untrusted the repository via vicfg and passing the --untrust=remote argument. + +Again, a direct mode repo that is also assistant'd. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment new file mode 100644 index 000000000..eae21f79d --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 6" + date="2014-03-05T04:38:26Z" + content=""" +Also, in another non-direct/non-assistant'd repo, things work as expected. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment new file mode 100644 index 000000000..52cfc575c --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 7" + date="2014-03-05T17:08:19Z" + content=""" +The only reason copy --key would do nothing is if the key is not locally present in your repository. + +Please check if the keys listed by `git annex unused` are present in `.git/annex/objects/` +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment new file mode 100644 index 000000000..3480ffa7e --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 8" + date="2014-03-06T18:54:08Z" + content=""" +The last key listed by unused (111 of 111): + +[[!format sh \"\"\" +greg@x200s:~/Documents/.git/annex/objects/q4/22/SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods$ ls +SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods.cache +SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods.map +greg@x200s:~/Documents/.git/annex/objects/q4/22/SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods$ +\"\"\"]] +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment new file mode 100644 index 000000000..25edfd5ed --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="analysis" + date="2014-03-06T21:37:15Z" + content=""" +[[!format haskell \"\"\" + {- In indirect mode, look for the key. In direct mode, + - the inode cache file is only present when a key's content + - is present, so can be used as a surrogate if the content + - is not located in the annex directory. -} +\"\"\"]] + +Seems that is wrong. + +I think that comment was based on removeAnnex calling removeInodeCache, which it does do. +And that is, afaik, the only point in git-annex where content files are removed from the annex. + +However, in direct mode, removeAnnex is not the only way to delete a key's content -- the user can simply delete the file! +(Or a disk error could put it in lost+found, or whatever.) + +That leaves the inode cache file present. unused will then behave as you describe. Also, uninit throws an ugly warning message +due to getKeysPresent giving it bad data. The only other caller of getKeysPresent is info, which will also operate on bad data and so generate slightly wrong stats. + +I'm leaning toward making getKeysPresent do a full check of the cache and map, checking that the work tree still contains a key's content. This will make it somewhat slower (by 2 file reads and a stat() per key). So it would make sense to make a variant that only lists keys with content present in .git/annex/objects/. That could be used by `unused`, since by definition unused keys cannot have their content located in the work tree, so must have it in the object directory. uninit could also use it, since it's only interested in cleaning out .git/annex/objects. Only `info` will be slowed down. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn new file mode 100644 index 000000000..05f3f5b7d --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. + +This is a one-off thing, not a reproducible bug. It was just so weird that I wanted to make a note of it in case somebody else had the same problem and it was reproducible. + +I have a remote on the a USB drive which I mount once in a while on /Volumes/TOSHIBAEXT which has a remote on /Volumes/TOSHIBAEXT/annex. It's a remote which I created by hand using "git clone" a long time ago, not something the assistant set up for me. + +Anyway, today the assistant kept reporting that it could not sync to it. I didn't know why, because I checked in my Finder sidebar and it showed a mounted drive called TOSHIBAEXT. It's only when I checked with the command line that I noticed something was up! There was now an ordinary directory at /Volumes/TOSHIBAEXT/annex. This had apparently been created at some point when the drive was unmounted, so when it re-mounted, because there was a directory in the way, it re-mounted at "/Volumes/TOSHIBAEXT 1". But it was displayed in the finder sidebar as just "TOSHIBAEXT" anyway because the finder hides this workaround from the user for whatever reason. + +Presumably git-annex assistant at some point, for some reason, created an ordinary directory where it expected to find the annex. + +I wonder if this may have to do with the fact that this is a non-bare, created-by-hand repo, from before I was using the assistant, not a normal bare remote that the assistant would have created for me if I'd been using the webapp. + +### What steps will reproduce the problem? + +I've only seen it once, and report the bug not as an outstanding issue but only as a heads-up that this has ever happened. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130501-gb61740e + +OS X lion (10.7) + +### Please provide any additional information below. + +I wasn't logging when this happened. + +Again, just a heads-up; I'll keep my eye open for this happening again and post more info if it does. + +[[!tag confirmed]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment new file mode 100644 index 000000000..a4d0a5895 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-05-05T20:55:19Z" + content=""" +Huh. This happened a second time today. I'll try and catch it in the act, and make a proper bug report, when I get a chance. + +Still not sure this is a bug rather than just a peculiarity of how I have things set up. + +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment new file mode 100644 index 000000000..1d9e09ef9 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-06T14:50:01Z" + content=""" +Hmm.. One way I can think that this could happen is if git-annex was running, and doing something in the repository on the drive that involved making a directory, and the drive was removed. There are several places in git-annex where it has code, like this: + +
+createAnnexDirectory
+-- some action here that expects to have the git-annex directory
+
+ +Is the repo you have on the drive a direct mode repo by any chance? This is the only obvious way I can see that would cause it to create just the top level directory of the repository, and not a deeper directory tree like `.git/annex/tmp/` + +The assistant also has a MountWatcher that detects when repositories that were not accessible get mounted, but it does not do anything to stop the repository being used when its drive gets unmounted. Even if it did, it couldn't go anything about code that is already running using the previously mounted repository. However, as things stand, it would probably also be possible for the drive to be removed, and some time to pass before an action was run that tried to do something to the no longer present repository. +So making the mountwatcher disable repositories when drives are unmounted would at least make this window narrower. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment new file mode 100644 index 000000000..d16392542 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-05-06T16:52:07Z" + content=""" +It's possible, even likely, that there were indeed more directories and I didn't notice because they were hidden and I just looked at them with a vanilla \"ls\" command with no flags like \"-a\". + +So it's probably exactly what you're thinking --t here was something going on, a transfer queued or something, that I didn't realize was happening and I removed it and it went and created the directory as if it were there. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment new file mode 100644 index 000000000..7b588ecc7 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment @@ -0,0 +1,56 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 4" + date="2013-07-24T14:19:01Z" + content=""" +I saw this too, today. The repo in my case was created via the webapp, using the 'usb key' option. +I was messing about with deleting repos and had turned off synchronisation for the repo on the key as I didn't have it inserted. + +I only just stumbled on this bug report after removing the repository from the key entirely, so it's difficult to define the reproduction steps. + +* create a 'usb key' repo via webapp, transfer type +* let it sync +* disable sync +* change a file in another repo, so there is something to sync +* unmount key, unplug key +* turn on sync again - should see 'failed ot sync with ...' in webapp dashboard +* reinsert key +* let it sync +* unplug key without properly unmounting +* change a file in another repo, so there is something to sync + +I just did this. The key was mounting at /Volumes/VERBATIM4. Just after unplugging without unmounting, that directory was gone. +When I made the change that could be synced, I got a /Volumes/VERBATIM4 directory. The directory tree structure is similar to but different +from the structure on the usb key, see below. + +Now when I try to plug it in again os/x will spot the potential conflict and mount the key at /Volumes/VERBATIM4\ 1. + +If I instead rm -rf /Volumes/VERBATIM4 and then replug the usb key, everything syncs as expected. + +Version: 4.20130723-ge023649 (os/x 10.8) + +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Tree structure of the phantom directory: + + /Volumes/VERBATIM4/annex/ + └── annex + ├── journal.lck + ├── objects + │   └── df3 + │   └── 043 + │   └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + │   └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + ├── tmp + └── transfer + ├── download + │   └── adf30a67-777a-45a6-a658-e2266770f01b + └── failed + └── download + └── adf30a67-777a-45a6-a658-e2266770f01b + └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + + 12 directories, 3 files + +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_5_64bf56f2b0ff206c3caf5cadebfd0cda._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_5_64bf56f2b0ff206c3caf5cadebfd0cda._comment new file mode 100644 index 000000000..49ab80ed4 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_5_64bf56f2b0ff206c3caf5cadebfd0cda._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="Same happening here" + date="2014-07-09T14:45:32Z" + content=""" +Any hint about how to stop this from happening again? This time I think I was careful and tried to stop git-annex, however I got ghosts. +Whats the correct way to unplug the drive? + +My scenario is the following, I have two repos on HDD synced with a USB drive. I want to sync them to the USB drive from time to time when I plug it. I want a safe way to unplug drive without getting these ghost directories. + +This time, I entered both directories in the HDD and made a git-annex assistant --stop, but after doing a ps aux | grep git-annex I still see many processes running so I'm not sure if I truly stopped it. +The webapp gives me the impression of working on a per-repo basis, so I miss having some sort of general feedback about git-annex. Something like: \"at the moment you are syncing repos A and B\" or \"idle\". +So I never have a clue about whats going on. +I'm trying to set up this since long time, and I'm a very capable unix guy, and I still have the feeling that I can't trust git-annex. +I really like the tool but I'm not sure how to use it properly. +Thanks in advance. + + +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository.mdwn b/doc/bugs/creating_a_remote_server_repository.mdwn new file mode 100644 index 000000000..07367d773 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository.mdwn @@ -0,0 +1,24 @@ +What steps will reproduce the problem? + +I was trying to add a remote server repository. Unfortunately, this didn't work. Enter Host name, user name, directory, port +(left most of them at their default), but there is no way, to specify a password.) Clicking check this server failed: + + Failed to ssh to the server. Transcript: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). + +(Problem was, I could never enter a password. Interestingly, on the konsole, I get a prompt for a password, but I can't enter anything there). + + +What is the expected output? What do you see instead? + +Successfully create a connection and use the remote server. + + +What version of git-annex are you using? On what operating system? +Version: 3.20130124 + + + +Please provide any additional information below. + +[[!tag /design/assistant done]] +[[!meta title="ssh password prompting issue with assistant"]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment b/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment new file mode 100644 index 000000000..aad008fd0 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-05T19:22:04Z" + content=""" +You're not really intended to start the git-annex assistant from a console. If you do, ssh will go ahead and prompt for passwords using that controlling console. + +When the assistant is not started from a console, ssh should use the `ssh-askpass` to prompt for the password. Assuming your system has that installed. +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment b/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment new file mode 100644 index 000000000..2370f7d47 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edward.myopenid.com/" + nickname="edward" + subject="Same problem on Android 4.3" + date="2013-12-01T08:47:06Z" + content=""" +I have the same error on Android. Is git-annex on Android meant to come with ssh-askpass? +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment b/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment new file mode 100644 index 000000000..ca56e7e3f --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-01T20:10:02Z" + content=""" +The bug your are commenting on is over a year old, and is closed, and does not involve Android. If you're having trouble with android, file a new bug report. + +On android, git-annex runs from a terminal app. The ssh password prompting is currently done inside that app. +"""]] diff --git a/doc/bugs/creds_directory_not_automatically_created.mdwn b/doc/bugs/creds_directory_not_automatically_created.mdwn new file mode 100644 index 000000000..d4e436da4 --- /dev/null +++ b/doc/bugs/creds_directory_not_automatically_created.mdwn @@ -0,0 +1,3 @@ +I just compiled ff7810eb83d8372e6206d487c63482d678e0b3d4 and created a new git-annex repository through the setup steps of "git-annex webapp". Then I tried configuring a Jabber account from the webapp. It then failed to create $REPO/.git/annex/creds/xmpp with a "No such file or directory" message because $REPO/.git/annex/creds did not get created. After doing a manual mkdir the Jabber setup went through fine. + +> [[Fixed|done]], thanks. --[[Joey]] diff --git a/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn new file mode 100644 index 000000000..a705e434f --- /dev/null +++ b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn @@ -0,0 +1,37 @@ +I ran the assistant in a subdir in direct mode, and it seemed to move files from other places outside that subdir +into it, and commit them there. These may have been files that needed to be committed, and it just staged them to the wrong place. + +I'm pretty sure this does not affect indirect mode. + +--[[Joey]] + +The relevant commit, in my family's annex is +22e694549d698922389deb017c39c2b40371cdf0 --[[Joey]] + +Was able to reproduce this as follows: + +1. Make 2 repositories A and B, with B in direct mode. +2. In A, touch topfile; git annex add topfile; git annex sync +3. In B: mkdir subdir; cd subdir; git annex assistant + +Result is a subdir/topfile appearing in B, which is wrong. + +
+ subdir/topfile | 1 +
+ topfile   | 1 -
+
+ +Note that manually doing a git-annex sync in B's subdir does not cause this +to happen. It's specific to the assistant somehow. + +--[[Joey]] + +Before 2407170eaf78d9aa38d73d1af68c20da9882779b, git-annex sync in a subdir +had the same problem. That made it always run from the top of the work +tree, which its code actually assumes is the case. + +The assistant, however, does not do that, and it's useful in general to +only run it in a subdir. + +> Made sync merge code handle this correctly. Conflicted merge handing code +> was already ok. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment b/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment new file mode 100644 index 000000000..aa134bd8e --- /dev/null +++ b/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 1" + date="2013-08-03T20:15:17Z" + content=""" +Only seems to affect initial startup scan; files added outside the subdir after it was started up were not committed (which is the desired behavior when running the webapp in a subdir). +"""]] diff --git a/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state.mdwn b/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state.mdwn new file mode 100644 index 000000000..664511b6c --- /dev/null +++ b/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state.mdwn @@ -0,0 +1,60 @@ +### Please describe the problem. + +Running `git annex direct` in a repository may results with the following error message: + + git-annex: /home/mildred/Music/.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.map898.tmp: rename: permission denied (Permission denied) +failed + git-annex: direct: 1 failed + + +The major problem is that git-annex doesn't roll back the changes it did for the files it could successfully put in direct mode. Running git status show many files with typechange. The solution was to run `git add` on those files (although the hashing backend changed, so a commit must be created) + +### What steps will reproduce the problem? + +Don't know yet why the rename failed, but the direct mode should be rolled back if there is a problem. Restarting `git-annex direct` didn't result in an error. + +### What version of git-annex are you using? On what operating system? + +git-annex 5.20140405-g8729abc +arch-linux Linux moiraine 3.15.3-1-ARCH #1 SMP PREEMPT Tue Jul 1 07:32:45 CEST 2014 x86_64 GNU/Linux + +### Please provide any additional information below. + +[[!format sh """ + +$ git annex direct +commit +(Recording state in git...) +On branch master +nothing to commit, working directory clean +ok +direct .gitrefs/heads/annex/direct/master ok +direct .gitrefs/heads/git-annex ok +direct .gitrefs/heads/master ok +direct .gitrefs/heads/synced/master ok +direct .gitrefs/remotes/ashley/git-annex ok +direct .gitrefs/remotes/ashley/master ok +direct .gitrefs/remotes/ashley/synced/git-annex ok +direct .gitrefs/remotes/ashley/synced/master ok +direct .gitrefs/remotes/kylae/git-annex ok +direct .gitrefs/remotes/kylae/master ok +direct .gitrefs/remotes/kylae/synced/git-annex ok +direct ... ok +direct ... ok +direct ... ok + /home/mildred/Music/.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.map897.tmp: rename: permission denied (Permission denied) + + leaving this file as-is; correct this problem and run git annex fsck on it +direct ... ok +direct ... ok +direct ... ok +direct ... ok +direct ... ok + +git-annex: /home/mildred/Music/.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.map898.tmp: rename: permission denied (Permission denied) +failed +git-annex: direct: 1 failed + +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state/comment_1_be1302a006a66e501fe543f3af191fea._comment b/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state/comment_1_be1302a006a66e501fe543f3af191fea._comment new file mode 100644 index 000000000..c0455b992 --- /dev/null +++ b/doc/bugs/direct_mode_fails__44___left_in_an_inconsistent_state/comment_1_be1302a006a66e501fe543f3af191fea._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T18:11:22Z" + content=""" +The most likely problem would be if your repository contained annexed objects owned by different user than the one running `git annex direct`. + +However, I cannot reproduce this problem: + +
+direct foo 
+  /home/joey/tmp/r/.git/annex/objects/pV/7j/SHA256E-s30--2754b7f82f6994005b97256273756f14d4abc17165c8819c06c07340d03351fa: setFileMode: permission denied (Operation not permitted)
+
+  leaving this file as-is; correct this problem and run git annex fsck on it
+direct  ok
+
+ +Since version 4.20130921, any exception when moving a file to direct mode should be caught like that. + +I will need more information to reproduce your bug. Or are you sure you wrote down the right version of git-annex? +"""]] diff --git a/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn new file mode 100644 index 000000000..081dd414b --- /dev/null +++ b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn @@ -0,0 +1,14 @@ +Direct mode merge handles the case where there's a conflict between local and remote files, that are checked into git. + +However, the the local file (or directory, or symlink, whatever) +is not checked into git, the merge will overwrite it with the remote file from git. + +> That's fixed; now this is detected and the local variant +> is renamed with ".variant-local", and possibly a number to make it +> unique. + +New problem: If the merge pulls in a directory, and a file exists with +the name of the directory, locally, not annexed, the file is left alone, +but the directory is thus not checked out, and will be deleted on commit. + +> [[fixed|done]]; regression test in place. --[[Joey]] diff --git a/doc/bugs/direct_mode_merge_interrupt.mdwn b/doc/bugs/direct_mode_merge_interrupt.mdwn new file mode 100644 index 000000000..7cbb44208 --- /dev/null +++ b/doc/bugs/direct_mode_merge_interrupt.mdwn @@ -0,0 +1,54 @@ +Seems to me there is a bug in how merges are done in direct mode. This is +done in two steps: + +1. Merge the remote branch into the local branch, with work tree directed + to a temp dir. +2. Use the temp dir and the newly merged branch to update the work tree. + +If this is interrupted between 1 and 2, by eg the user ctrl-Cing or power +being lost, the result is a repository that thinks the current branch has +been merged, but does not have an updated work tree. The next sync in that +repository will see the files as deleted (or as being an old version), and +commit the current work tree state to the branch. + +Result is files appear to be lost, although `git revert` in an indirect +mode repo can get them back. + +To fix this, direct mode merge would need to avoid updating the current +branch when merging the remote branch into it (how?). It should first +update the whole work tree, and only after it's updated should it update +the index and the current branch to reflect the merge. + +This way, if the merge is interrupted, the work tree may have uncommitted +changed -- but it's fine if they get accidentially committed, since when +the merge is re-done, those changes will by the same ones made by the +merge. (I assume this is how `git merge` normally works.) --[[Joey]] + +> Implemented that. And then realized that even updating the index +> as part of a merge results in the work tree being out of sync with the +> index. Which will cause the next sync to again delete any files that +> are in the index but not the work tree. Urgh. +> +> Seems that a direct mode +> merge also needs to use a different index file to stage its changes? +> (Ugh) +> > done --[[Joey]] + +> > > I had to revert the fix on FAT/Windows due to +> > > a git bug: +> > > Once that bug's fixed, I can revisit this. --[[Joey]] + +[[!meta title="direct mode merge interrupt (fixed for all except FAT, Windows)"]] + +## other options + +> Or could perhaps use `git-merge-tree` +> and avoid staging the merge in the index until the work-tree is updated. +> +> Alternatively, could use another strategy.. Add a lock file which is held while +> the merge is in progress and contains the pre-merge sha. +> If the lock file is present but not held, state is inconsistent. +> `git-annex sync` and the SanityChecker should +> then run mergeDirectCleanup to recover, before any commits can be made +> from the inconsistent state. This approach seems to get complicated +> quickly.. --[[Joey]] diff --git a/doc/bugs/direct_mode_should_refuse_to_merge_with_illegal_filenames.mdwn b/doc/bugs/direct_mode_should_refuse_to_merge_with_illegal_filenames.mdwn new file mode 100644 index 000000000..102404be4 --- /dev/null +++ b/doc/bugs/direct_mode_should_refuse_to_merge_with_illegal_filenames.mdwn @@ -0,0 +1,38 @@ +Some filesystems have stupid rules about characters not allowed in filenames. For example, FAT doesn't allow '?' '*' ':' etc. + +The direct mode merge code lets `git merge` update a temp directory with the new files from the merge, before doing its work tree update and committing. This can fail: + +
+error: unable to create file non-rus/Dance/Dream_Dance_Vol15/CD1/09-??.mp3 (Invalid argument)
+
+ +This leaves the work tree without the file, and the index knows about the file. Result is that the next time a commit is done, this file appears to have been deleted, and that is committed and propigates out. Which can be surprising. + +---- + +It would probably be better if, when the working tree cannot be updated, it left the repository in some state that would not make the next commit remove anything. + +Ie, direct mode should replicate this behavior: + +
+root@darkstar:/home/joey/mnt>git init
+root@darkstar:/home/joey/mnt>git merge FETCH_HEAD 
+error: unable to create file foo? (Invalid argument)
+fatal: read-tree failed
+root@darkstar:/home/joey/mnt>git status
+On branch master
+
+Initial commit
+
+nothing to commit (create/copy files and use "git add" to track)
+
+ +Problem is, the call to `git merge` can also fail due to a conflict. In that case, git-annex wants to continue with automatic conflict resolution. +So, how to detect when `git merge` has skipped creating illegal filenames? + +---- + +Alternatively, git-annex could learn/probe the full set of characters not allowed in filenames, and examine merges before performing them, and refuse to do anything if the merge added an illegal filename.a + +[[!tag confirmed]] + diff --git a/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn b/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn new file mode 100644 index 000000000..1afb9ac14 --- /dev/null +++ b/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +git-annex attempts to create files with question marks in them on my direct repository on a FAT32 drive. This fails. + +### What steps will reproduce the problem? + +git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3' + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ cat /etc/lsb-release +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=12.04 +DISTRIB_CODENAME=precise +DISTRIB_DESCRIPTION="Ubuntu 12.04.3 LTS" + +$ git annex version +git-annex version: 4.20130922-g7dc188a +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$ git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3' +addurl rf.proxycast.org_m_media_273073201426.mp3_c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 (downloading http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 ...) +/media/sixtyfour/audio/.git/annex/tmp/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: Argument invalide + +git-annex: /media/sixtyfour/audio/.git/annex/transfer/failed/download/00000000-0000-0000-0000-000000000001/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: openFile: invalid argument (Invalid argument) +failed +git-annex: addurl: 1 failed + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/done.mdwn b/doc/bugs/done.mdwn new file mode 100644 index 000000000..a35d42719 --- /dev/null +++ b/doc/bugs/done.mdwn @@ -0,0 +1,4 @@ +recently fixed [[bugs]] + +[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10 +archive=yes]] diff --git a/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn b/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn new file mode 100644 index 000000000..c6ef13f84 --- /dev/null +++ b/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn @@ -0,0 +1,13 @@ +I was trying out the example with the walkthrough using_the_URL_backend. I tried dropping files that I had after doing an "git annex get ." which have the URL backend associated with the files it fails with + + +
+[jtang@lenny gc]$ git annex drop -v curl-7.21.4.tar.gz
+drop curl-7.21.4.tar.gz
+failed
+git-annex: 1 failed
+
+ +At first I thought it was just my OSX machine not having the coreutils stuff load up before the BSD utils, but I then tried the same thing on my archlinux machine and it showed the same behaviour, that is I could not drop a file with the URL backend as shown in the walkthrough. + +> Whoops, got some logic backwards. [[fixed|done]]! --[[Joey]] diff --git a/doc/bugs/encfs_accused_of_being_crippled.mdwn b/doc/bugs/encfs_accused_of_being_crippled.mdwn new file mode 100644 index 000000000..617233670 --- /dev/null +++ b/doc/bugs/encfs_accused_of_being_crippled.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +I tried to create an annex (``git annex init foo``) inside a ``encfs`` mount, and git-annex says that it's crippled, and disables core.symlinks and goes into direct mode + +### What steps will reproduce the problem? + + apt-get install encfs + encfs -o kernel_cache empty_dir other_empty_dir + cd other_empty_dir + git init + git annex init foo + +### Expected results + + init foo ok + (Recording state in git...) + +### Actual results + + init foo + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. + ok + (Recording state in git...) + +### What version of git-annex are you using? On what operating system? + +4.20130601 on debian unstable + + +### P.S. + +This was particularly annoying when I tried this on a bare repository. I'm pretty sure bare repositories don't need symlinks, and should definitely not be in direct mode. Hopefully you can fix it before I have time to file another bug report :) + +Thank you! + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment b/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment new file mode 100644 index 000000000..aa6eb9345 --- /dev/null +++ b/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-10T17:22:11Z" + content=""" +encfs appears to not allow creation of hard links to files: + +[[!format sh \"\"\" +joey@gnu:~/tmp/other_empty_dir>ln me me2 +ln: failed to create hard link `me2' => `me': Operation not permitted +\"\"\"]] + +According to the documentation, this is a limitation when using External IV Chaining. And only a problem if you choose paranoia mode when setting up encfs. + +git-annex uses hard links in a limited number of code paths, most notably `git annex add` uses them when locking down files. + +encfs seems like something I'd like to interoperate well with git-annex. So, it seems worthwhile to break out lack of hard links support from the other limitations currently lumped into \"cripped file system\". I've done so. + +---- + +Also made it stop setting direct mode on bare repositories, although that configuration had no effect anyway. +"""]] diff --git a/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn b/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn new file mode 100644 index 000000000..ed269277c --- /dev/null +++ b/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn @@ -0,0 +1,42 @@ +### Please describe the problem. +Could not get ssh-askpass running on macosx. +Transfered the publich key with scp. +certificate based ssh from macosx to ssh server (debian testing) works. +After successfull login to ssh server git annex stops with the following errors: + +Browser Error Message: +user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) + +### What steps will reproduce the problem? +1. git annex on debian gnu linux +2. git annex on macosx +3. set up "share with a friend" +4. create rsa keys on macosx "ssh-kegen -t rsa" +5. scp public key to server with hosts encrypted ssh remote +6. configure the server use a encrypted ssh remote in tranport mode + +### What version of git-annex are you using? On what operating system? +current debian testing (20130827) +macosx 20130827 +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(scanning...) [2013-09-28 17:39:25 CEST] Watcher: Performing startup scan +(started...) [2013-09-28 17:39:26 CEST] XMPPSendPack: Syncing with jlueters +Everything up-to-date +[2013-09-28 17:39:30 CEST] XMPPSendPack: Unable to download files from jlueters. + +(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list +28/Sep/2013:17:40:06 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list +28/Sep/2013:17:40:48 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + + + +# End of transcript or log. +"""]] + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment b/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment new file mode 100644 index 000000000..948b2c110 --- /dev/null +++ b/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 1" + date="2013-09-29T19:13:59Z" + content=""" +This is a duplicate of this bug report: [[Error_creating_encrypted_cloud_repository: \"internal_server_error\"]] + +To work around, you need to edit ~/.gnupg/gpg.conf and remove or edit the `auto-key-locate` line. +"""]] diff --git a/doc/bugs/endless_loop_when_PWD_gone.mdwn b/doc/bugs/endless_loop_when_PWD_gone.mdwn new file mode 100644 index 000000000..2df9e9c14 --- /dev/null +++ b/doc/bugs/endless_loop_when_PWD_gone.mdwn @@ -0,0 +1,16 @@ +`git annex get` becomes very unhappy as soon as `$PWD` is gone. +The easiest way is to `git checkout git-annex` while you are getting in another tab. + +This results in git-annex entering an endless loop: + + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment b/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment new file mode 100644 index 000000000..734798cb8 --- /dev/null +++ b/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-02T01:11:15Z" + content=""" +This is due to the code that restarts git hash-object if it crashes (because it has been known to crash before). Utility.CoProcess needs to have a limit to the number of times it retries when something is failing. +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM.mdwn b/doc/bugs/enormous_fsck_output_OOM.mdwn new file mode 100644 index 000000000..b06655354 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM.mdwn @@ -0,0 +1,30 @@ +Hi, + +My Webapp isn't working: + + $ git-annex webapp error: refs/gcrypt/gitception+ does not point to a valid object! + error: refs/remotes/Beta/git-annex does not point to a valid object! + error: refs/remotes/Beta/master does not point to a valid object! + fatal: unable to read tree 656e7db5be172f01c0b6994d01f1a08d1273af12 + +So I tried to repair it: + + $ git-annex repair Running git fsck ... + Stack space overflow: current size 8388608 bytes. Use `+RTS -Ksize -RTS' to increase it. + +So I tried to follow your advice here and increase the stack: + + $ git-annex +RTS -K35000000 -RTS fsck + git-annex: Most RTS options are disabled. Link with -rtsopts to enable them. + +I wasn't sure what to do next, so any help would be appreciated. + +> Now only 20k problem shas max (more likely 10k) are collected from fsck, +> so it won't use much memory (60 mb or so). If it had to truncate +> shas from fsck, it will re-run fsck after the repair process, +> which should either find no problems left (common when eg when all missing shas +> were able to be fetched from remotes), or find a new set of problem +> shas, which it can feed back through the repair process. +> +> If the repository is very large, this means more work, but it shouldn't +> run out of memory now. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment b/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment new file mode 100644 index 000000000..73d218bac --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-23T18:51:45Z" + content=""" +I suspect that git fsck is outputting so many lines about problems that it's taking more memory than it's limited to using to hold them all. + +Can you paste the output of: git fsck --no-dangling --no-reflogs +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment b/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment new file mode 100644 index 000000000..f2028c91f --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-23T19:09:30Z" + content=""" +Erm, that output is liable to be big, I only care how many lines and characters of output there are! + + git fsck --no-dangling --no-reflogs |wc +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment b/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment new file mode 100644 index 000000000..96b1ac9cd --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-23T19:12:10Z" + content=""" +Also, you can build git-annex from source with the RTS options enabled by running `cabal install git-annex --ghc-options=-rtsopts` + +(or just build git-repair which has the repository repair parts of git-annex) +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment b/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment new file mode 100644 index 000000000..69774073d --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="Didn't work" + date="2014-03-01T22:40:36Z" + content=""" +Many thanks for your input, Joey. + +That didn't seem to work. + +$ git fsck --no-dangling --no-reflogs |wc +error: unknown option `no-dangling' +usage: git fsck [options] [...] + + -v, --verbose be verbose + --unreachable show unreachable objects + --tags report tags + --root report root nodes + --cache make index objects head nodes + --reflogs make reflogs head nodes (default) + --full also consider packs and alternate objects + --strict enable more strict checking + --lost-found write dangling objects in .git/lost-found + --progress show progress + + 0 0 0 + +$ git --version +git version 1.7.9.5 +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment b/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment new file mode 100644 index 000000000..923e1ccba --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-05T16:53:33Z" + content=""" +You have an older version of git, which does not support --no-dangling. + +git-annex will detect that, and omit the option. This does make it more likely that git fsck is outputing a ton of information, so I continue to think that's the most likely cause of the memory use. + +Please verify with: git fsck --no-reflogs |wc +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment b/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment new file mode 100644 index 000000000..ddf69f94b --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="comment 6" + date="2014-03-08T00:08:22Z" + content=""" +That seemed to work, thanks: + + $ git fsck --no-reflogs |wc + Checking object directories: 100% (256/256), done. + error: refs/gcrypt/gitception+ does not point to a valid object! + error: refs/remotes/Beta/git-annex does not point to a valid object! + error: refs/remotes/Beta/master does not point to a valid object! + Checking connectivity: 128728, done. + 369082 1165340 20898546 + +Thanks for your help! +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment b/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment new file mode 100644 index 000000000..14bdc17b8 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 7" + date="2014-03-10T18:02:46Z" + content=""" +Ok, that verifies my hypothesis that fsck is outputting a lot of lines. 369082 lines to be precise, comprising 20 mb of data in all. So it's not too surprising this ends up blowing up into a bad amount of memory use. + +I'm going to move this from a forum post over to a bug: +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment b/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment new file mode 100644 index 000000000..fa437311f --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 8" + date="2014-03-10T18:12:29Z" + content=""" +In a quick test with a 32 mb dummy fsck output, git-repair ballooned up to 1.7 gb. Clearly something not happy there, although in my case this did not cause it to crash. +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment b/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment new file mode 100644 index 000000000..a26e58c58 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 9" + date="2014-03-10T19:17:34Z" + content=""" +I've gotten this down to 900 mb used, in the case where every single line lists a different sha. Possibly more important, if lines repeat shas, or are extraneous, memory usage will be significantly lower. This might be enough to get it working in Aaron's repository, especially if the bulk of the git fsck output was about dangling objects, which are now ignored without buffering them all in memory. + +The memory usage is just about as low as is possible; it takes a fair amount of memory just to hold 300 thousand shas in memory. And the git repair process needs to keep track of every broken sha. (Maybe there's a way to stream them, but I don't immediately see one.) + +I hesitate to say this means the problem is truly fixed. I have some much larger repositories with eg, `git count-objects -v` reporting 2 million objects. If they all went corrupt, it would still use too much memory. + +One improvement would be to store Shas in packed memory, rather than as strings like they are now. That would probably half the memory used. It still does not seem like a full solution. +"""]] diff --git a/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn b/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn new file mode 100644 index 000000000..99f480e70 --- /dev/null +++ b/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. +I'm not sure if you'll consider this a bug, or if I'm just doing something wrong, but I'm having trouble compiling git-annex on OmniOS (a derivative of OpenSolaris). I've got GHC 7.6.3 built and installed (bootstrapped using the Solaris binaries for GHC 7.0.3). I used it to build haskell-platform (although I had to disable the OpenGL-related packages to do so), and now I'm trying to use cabal to build git-annex and its dependencies. I've started with a minimal build; this will end up as an archive remote so it should be sufficient. The instructions say to run + + cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns" + +This builds a bunch of stuff but then fails to compile the network-info package. As I understand it, the git-annex package only needs network-info if it's compiled with pairing supoort (I'm looking at ), and this command is telling it to disable pairing. + +Is there some other dependency that needs network-info? Is there a way to find out? + +Thanks + +> fowarded 2 ways; [[done]] --[[Joey]] diff --git a/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_1_1b5d236567123300924427624e0e48c8._comment b/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_1_1b5d236567123300924427624e0e48c8._comment new file mode 100644 index 000000000..8ee7885a6 --- /dev/null +++ b/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_1_1b5d236567123300924427624e0e48c8._comment @@ -0,0 +1,53 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-06T16:53:21Z" + content=""" +http://packdeps.haskellers.com/reverse/network-info + +It's uuid which needs network-info -- but not for the parts of uuid which git-annex uses. (git-annex does not use the uuids that include the MAC address). + +It's not hard to avoid that dependency. The attached patch will do. I've forwarded this to the author of uuid. + +
+diff --git a/uuid.cabal b/uuid.cabal
+index 0a53059..f00e887 100644
+--- a/uuid.cabal
++++ b/uuid.cabal
+@@ -24,6 +24,9 @@ Extra-Source-Files:
+      CHANGES
+      CONTRIBUTORS
+ 
++Flag NetworkInfo
++  Description: Enable UUIDs that need network-info
++  Default: True
+ 
+ Library
+  Build-Depends: base >=3 && < 5,
+@@ -32,17 +35,20 @@ Library
+                 cryptohash >= 0.7 && < 0.12,
+                 deepseq == 1.3.*,
+                 hashable (>= 1.1.1.0 && < 1.2.0) || (>= 1.2.1 && < 1.3),
+-                network-info == 0.2.*,
+                 random >= 1.0.1 && < 1.1,
+                 time >= 1.1 && < 1.5
++ if flag(NetworkInfo)
++   Build-Depends: network-info == 0.2.*
+ 
+  Exposed-Modules:
+    Data.UUID
+-   Data.UUID.Util
+-   Data.UUID.V1
+    Data.UUID.V3
+    Data.UUID.V4
+    Data.UUID.V5
++ if flag(NetworkInfo)
++   Exposed-Modules:
++     Data.UUID.Util
++     Data.UUID.V1
+ 
+  Other-Modules:
+    Data.UUID.Builder
+
+"""]] diff --git a/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_2_4e5ffd0d5b965b9429b937610b7998d5._comment b/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_2_4e5ffd0d5b965b9429b937610b7998d5._comment new file mode 100644 index 000000000..8e631a115 --- /dev/null +++ b/doc/bugs/error_compiling_network-info_when_compiling_git-annex/comment_2_4e5ffd0d5b965b9429b937610b7998d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="a different fix" + date="2014-06-07T04:27:47Z" + content=""" +Thanks. I also went back and took a closer look at the error; it looks like fixing network-info is pretty easy as well. +"""]] diff --git a/doc/bugs/error_on_only_repository_copy_deletion.mdwn b/doc/bugs/error_on_only_repository_copy_deletion.mdwn new file mode 100644 index 000000000..7c7be888e --- /dev/null +++ b/doc/bugs/error_on_only_repository_copy_deletion.mdwn @@ -0,0 +1,16 @@ +**What steps will reproduce the problem?**
+Delete the last repository in the current repository (where it says: warning type in "yes please do as i say"). +Then try running git annex webapp +

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

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

+**Please provide any additional information below.**
+See also +[[bugs/git-annex:_Not_in_a_git_repository._/]] +where the same error message occurs + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment b/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment new file mode 100644 index 000000000..a60eee137 --- /dev/null +++ b/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T16:39:08Z" + content=""" +Do you still have a `~/annex` or `~/Desktop/annex`? What's in there? + +Also, please show me the content of your `~/.config/git-annex/autostart` file. + +The only bug I have been able to track down is that it fails to remove the repository from the autostart file, and so if the repository directory still exists, this will happen. I've fixed it to properly remove the repository from the file, but hesitate to close this bug as I don't understand how the repository directory could still exist after it's supposed to be deleted. + +(When I try, it does get deleted, and starting the webapp again allows starting over with a new repository.) +"""]] diff --git a/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn b/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn new file mode 100644 index 000000000..c4ee8d5bd --- /dev/null +++ b/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn @@ -0,0 +1,15 @@ +When using `git annex get foo` where foo is available in a rsync remote with encryption I got an error saying that rsync cannot +find the required file but extra ' are here. + +I attached a patch for this. + +> But you didn't, sadly. :( +> +> I don't seem to see the problem, set up a rsync over ssh with encryption +> and sent over a file "foo", and then got it back from rsync, without +> trouble. +> +> Ah, you're not using rsync over ssh, but just to a local directory, +> right? --[[Joey]] + +>> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/failed_sync_with_direct_mode_repo.mdwn b/doc/bugs/failed_sync_with_direct_mode_repo.mdwn new file mode 100644 index 000000000..879146deb --- /dev/null +++ b/doc/bugs/failed_sync_with_direct_mode_repo.mdwn @@ -0,0 +1,9 @@ +Two clients, both in direct mode, both running assistant. + +When a change is made on A, the assistant commits it to annex/direct/master. But, the master branch is not changed. + +B notices there is a change, pulls from A. Gets annex/direct/master, but does not merge it into its local branch at all. + +[[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/failed_sync_with_direct_mode_repo/comment_1_fb4026cc81eb0ec1e656e4a81ffacc4f._comment b/doc/bugs/failed_sync_with_direct_mode_repo/comment_1_fb4026cc81eb0ec1e656e4a81ffacc4f._comment new file mode 100644 index 000000000..8b75fa67c --- /dev/null +++ b/doc/bugs/failed_sync_with_direct_mode_repo/comment_1_fb4026cc81eb0ec1e656e4a81ffacc4f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-16T15:10:42Z" + content=""" +Reproduced this as described. + +Only happens when using the assistant in the second repository, which is a ssh remote of the first, and when there is not also a remote going the other way (so does not affect pairing). + +As I thought, the problem is that the master branch is not updated by the assistant when in direct mode, and while annex/direct/master is pulled by the other assistant, it does not merge it. + +"""]] diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn new file mode 100644 index 000000000..b54cbb444 --- /dev/null +++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn @@ -0,0 +1,143 @@ +### Please describe the problem. + +I have a annex repo in external drive (a bare repo), usually synced with a macbook. When I'm trying to sync the drive over to a Windows machine, all contents fail to sync over. I managed to reproduce the problem with a set of instructions locally: + + C:\Temp\test>dir + Volume in drive C is Windows + Volume Serial Number is 6839-6E71 + + Directory of C:\Temp\test + + 2014/05/08 23:08 . + 2014/05/08 23:08 .. + 2014/05/08 23:08 14 file.txt + 1 File(s) 14 bytes + 2 Dir(s) 164,943,056,896 bytes free + + C:\Temp\test>git init + Initialized empty Git repository in C:/Temp/test/.git/ + + C:\Temp\test>git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + ok + (Recording state in git...) + + C:\Temp\test>git annex add . + add file.txt ok + (Recording state in git...) + + C:\Temp\test>cd .. + + C:\Temp>mkdir bare + + C:\Temp>cd bare + + C:\Temp\bare>git init --bare + Initialized empty Git repository in C:/Temp/bare/ + C:\Temp\bare>git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + ok + (Recording state in git...) + + C:\Temp\bare>cd ../test + + C:\Temp\test>git remote add mybare C:\Temp\bare + + C:\Temp\test>git annex sync --content mybare + commit ok + pull mybare + warning: no common commits + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 0), reused 0 (delta 0) + Unpacking objects: 100% (5/5), done. + From C:\Temp\bare + * [new branch] git-annex -> mybare/git-annex + ok + (merging mybare/git-annex into git-annex...) + (Recording state in git...) + copy file.txt copy file.txt (to mybare...) + file.txt + 14 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 86 bytes received 31 bytes 234.00 bytes/sec + total size is 14 speedup is 0.12 + ok + pull mybare + ok + (Recording state in git...) + push mybare + Counting objects: 23, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (16/16), done. + Writing objects: 100% (21/21), 1.94 KiB | 0 bytes/s, done. + Total 21 (delta 1), reused 0 (delta 0) + To C:\Temp\bare + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + ok + + C:\Temp\test>cd .. + + C:\Temp>git clone C:\Temp\bare test2 + Cloning into 'test2'... + done. + + C:\Temp>cd test2 + + C:\Temp\test2>ls -l + total 1 + ----------+ 1 Ruo None 188 May 8 23:10 file.txt + + C:\Temp\test2>git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + ok + (Recording state in git...) + + C:\Temp\test2>git annex get file.txt + get file.txt (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + + Unable to access these remotes: origin + + Try making some of these repositories available: + f2af6f52-18d5-4a54-ae5c-c4bef5fab00c -- origin (MY-PC:C:\Temp\bare) + fc00306a-157c-439b-a5c3-37aabf9d61fb -- MY-PC:C:\Temp\test + failed + git-annex: get: 1 failed + + + C:\Temp\test2>git version + git version 1.9.2.msysgit.0 + + C:\Temp\test2>git annex version + git-annex version: 5.20140421-g78d6aa1 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + +[[!tag confirmed]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_1_31cf32ef2d597573ed3c5f06a1b40a1c._comment b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_1_31cf32ef2d597573ed3c5f06a1b40a1c._comment new file mode 100644 index 000000000..b57af9b17 --- /dev/null +++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_1_31cf32ef2d597573ed3c5f06a1b40a1c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-05T17:37:08Z" + content=""" +I've reproduced this. + +More simply: git annex move --to mybare and then git annex get will fail +"""]] diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_2_7d64382c66555ec9c5531840aa19e809._comment b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_2_7d64382c66555ec9c5531840aa19e809._comment new file mode 100644 index 000000000..fc978e28d --- /dev/null +++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_2_7d64382c66555ec9c5531840aa19e809._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-06-05T18:29:15Z" + content=""" +Appears to be a corrupt uuid log issue. At least, the bug I am seeing is. When retriving the uuid of the remote that has the key from the location log, it seems to get a uuid with one or more \r appended to it. Which smells of windows. + +However, the bug I am seeing makes `git annex get` print out the uuids of the remotes without the description it normally shows (because these are not really the same uuids due to the \r). In the example above, this is not the case; the description is shown. I don't understand that. +"""]] diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_3_850a917a3d1ae50ba8f0e81a64168268._comment b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_3_850a917a3d1ae50ba8f0e81a64168268._comment new file mode 100644 index 000000000..d44825324 --- /dev/null +++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_3_850a917a3d1ae50ba8f0e81a64168268._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-05T19:06:36Z" + content=""" +The bug I was seeing with the \r was a recent reversion caused by [[!commit 95ca3bb02215744f3dbcaebd48844e1909c577f3]]. So, not related to original bug report. (And fixed now!) + +I can now reproduce the original bug, including seeing the description of the bare repo when it says it cannot get the file from it. +"""]] diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_4_7c4660ea44178cba7f7a4cc5f1bebae4._comment b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_4_7c4660ea44178cba7f7a4cc5f1bebae4._comment new file mode 100644 index 000000000..5d8b4d978 --- /dev/null +++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows/comment_4_7c4660ea44178cba7f7a4cc5f1bebae4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-05T19:20:20Z" + content=""" +Analysis: inAnnexSafe on Windows simply does not have indirect mode checking enabled. Bare repositories use indirect mode (essentially; same storage). So it fails. +"""]] diff --git a/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn b/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn new file mode 100644 index 000000000..7f1f26e04 --- /dev/null +++ b/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. +While attempting to create a remote repository, the assistant is trying to set up public key authentication, but fails when trying to delete the temporary files. Perhaps this doesn't need to be a fatal error; it could warn the user instead, or try again later. + +DeleteFile "C:\\Users\\FAMILY~1\\AppData\\Local\\Temp\\git-annex-keygen.1\\key.pub": permission denied (The process cannot access the file because it is being used by another process.) + +### What steps will reproduce the problem? +Create a remote repository + +### What version of git-annex are you using? On what operating system? +Windows 7, git-annex version 5.20131221-gf8c928d + +> [[fixed|done]].. thanks for testing the assistant on windows! --[[Joey]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn new file mode 100644 index 000000000..5718e5011 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +One of my remotes (a USB drive) actually did not have a large number of files that should have been there, according to git annex's records. When the assistant would try to fetch files from there, it would silently fail and go get them from another remote. I noticed this behavior and was very puzzled by it. I eventually went to the command line and started trying to fetch these files. If I remember correctly, "getting" them would also fail silently. "git annex whereis" said they were there on the drive. + +Finally I did a "git annex fsck --fast" which quickly revealed the problem (several hundred files were gone, all in "archives") + +I am not sure how this happened, though I have some vague ideas -- it could be relics of a time when an ordinary directory had been created where a mountpoint for the USB drive should have existed, and it was trying to copy files there. Or it could have been a side effect of the somewhat confused process where I migrated to a new macbook using OS X's migration assistant and so I suddenly had two copies of the same archive, and some time was spent fiddling around trying to fix that situation up. Maybe during that point I accidentally flipped that USB repo into being a client instead of a backup repo, and it started dropping archive content, and maybe I stopped it from recording that by impatiently killing what seemed to be a hung git-annex process.... In any case, I don't know how the situation came into existence, but once it existed, the silent failures made it difficult for me to realize that it was happening. I thought the content really was there (trusting git annex whereis) and it was refusing to transfer it for some reason. + +It would have been useful to get some feedback, either in the assistant or the commandline, to the effect that the files which were supposed to be there according to git-annex's information, were not in fact there, and a fsck was called for. + +### What steps will reproduce the problem? + +Create an annex, with content. Clone the annex. Sync. Delete the files by force from the .git/annex/objects directory in the original. Go to the clone, and try and "git annex get" the content. It fails silently. + + +### What version of git-annex are you using? On what operating system? + + [12:17:03 PM]$ git annex version + git-annex version: 4.20130709-ga2269ee + + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +My particular issue has probably existed through a few version upgrades though. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment new file mode 100644 index 000000000..64bc18b71 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 1" + date="2013-07-26T21:08:02Z" + content=""" +Tried to reproduce this, following your instructions. It did not seem to work: + +
+joey@gnu:~/tmp/mydir2>git annex get disk2
+get disk2 
+  Unable to access these remotes: origin
+
+  Try making some of these repositories available:
+  	21606444-98f9-4c40-aa60-3ebfba936758 -- origin (joey@gnu:~/tmp/mydir)
+failed
+git-annex: get: 1 failed
+- exit 1
+joey@gnu:~/tmp/mydir2>git annex whereis disk2
+whereis disk2 (1 copy) 
+  	21606444-98f9-4c40-aa60-3ebfba936758 -- origin (joey@gnu:~/tmp/mydir)
+ok
+joey@gnu:~/tmp/mydir2>
+
+ +So, not a silent failure. It is a little unclear about why it can't get the file (in this case because I moved .git/annex/objects out of the way), but it's pretty clear it can't. + +AFAIK, the only way `git annex get` can silently not do anything is if you already have the file locally. Perhaps you got confused? OTOH, if you can provide a better way to reproduce this, I'm curious to see it. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment new file mode 100644 index 000000000..2d500288f --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 2" + date="2013-07-27T06:03:55Z" + content=""" +I actually ran through the test I described to you and got the silent failure, but now I'm doing it again and getting the \"Try making some of these repositories available\" error. (Along with inaccurate \"whereis\" info, as you're seeing there.) I'm baffled. Unless something changed with respect to this behavior in the most recent version, which I've installed since then, I don't know what I was doing differently. Maybe I was confused. + +I can guarantee that I was getting silent failures in \"gets\" from my USB drive. I was \"getting\" \"--from\" my USB drive, nothing was showing up (the symlink was broken), and no error was printed to the console, including the \"try making it available\" one we're getting now. It's only when I went to the drive and did a \"git annex fsck\" that I realized that those files were actually missing from that remote, and it wasn't just a failure to \"get\" them. The behavior was alarming enough that I made sure of what was happening before I made the bug report. I wish I'd actually cut and pasted the demo, instead of just describing it! + +It'd still be nice to have some kind of feedback in the assistant (and maybe more understandable feedback in the command line) that something was amiss. What I would see in the assistant, because of this, is a bunch of queued downloads from the USB drive, but as each one was ready to execute, it would disappear (because it failed) and be replaced by a download from the (lower priority) SSH repo. This happened a number of times and I found it baffling. + +My first instinct in a situation like this is to say \"yeah, I must have been confused\" but I honestly did check this out pretty carefully before sending it in, so I wonder if a recent update improved matters, perhaps inadvertently? In any case, I'm glad there's some kind of error right now. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment new file mode 100644 index 000000000..5abbe99c3 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 3" + date="2013-07-27T22:39:12Z" + content=""" +The --from is the missing piece to reproduce: + +[[!format sh \"\"\" +joey@gnu:~/tmp/old/mydir2>git annex get disk2 --from origin +joey@gnu:~/tmp/old/mydir2> +\"\"\"]] + +What's going on here is that `get --from` is essentially an alias to `copy --from`, and that skips copying files that it knows are not present on the remote. Since the remote is a local directory, it's inexpensive for it to check if the file is really there, rather than relying on the location log. + +This seems suboptimal, but I'm not sure which part of the behavior it makes sense to change. It seems nice for `copy --from` to silently skip files that the remote does not have, to avoid much unnecessary output when processing a lot of files. Maybe `get --from` should behave differently? +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment new file mode 100644 index 000000000..18c9b6668 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-27T22:40:58Z" + content=""" +I should add that it also seems to make sense to stat the file to see if it's present, like it does now. The location log can be out of date, and when more accurate info is right there, it should use it. And nor is the location log being out of date something that it should complain about, because it can easily happen eg when `git annex sync` has not been run recently. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment new file mode 100644 index 000000000..6ba31d562 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 5" + date="2013-07-28T05:29:00Z" + content=""" +Oh yeah! That makes sense now. It's not exactly that it's failing, it's just that the command \"git annex get --from=bar foo\" means \"get any copies of foo which might exist in the bar remote.\" Not \"get the copy of foo which I happen to know exists in the bar remote.\" + +I'm not sure either exactly what \"better\" behavior would be. +"""]] diff --git a/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn b/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn new file mode 100644 index 000000000..f2a11eea8 --- /dev/null +++ b/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn @@ -0,0 +1,19 @@ +### Please describe the problem. +In a usb drive with a repository in direct mode, when I converted to indirect mode it fails + +### What steps will reproduce the problem? +cd /Volumes/usb +git annex indirect + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130627 + +### Please provide any additional information below. + +[[!format sh """ +openFile: resource busy (file is locked) +failed +git-annex: indirect: 1 failed +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment b/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment new file mode 100644 index 000000000..e0cf8ca84 --- /dev/null +++ b/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T16:38:14Z" + content=""" +What filesystem is in use on this USB drive? For example, is it a FAT filesystem? + +What operating system are you using? +"""]] diff --git a/doc/bugs/fat_support.mdwn b/doc/bugs/fat_support.mdwn new file mode 100644 index 000000000..70ee3b369 --- /dev/null +++ b/doc/bugs/fat_support.mdwn @@ -0,0 +1,13 @@ +Klaus pointed out that there are two problems that keep +git-annex from being used on USB keys, that would typically +be VFAT formatted: + +- Use of symlinks, which VFAT does not support. Very hard to fix. + Instead, just use [[/bare_repositories]] on the key, + they're supported now. +- Use of ":" in filenames of object files, also not supported. + Could easily be fixed by reorganizing the object directory. + +[[Done]]; in annex.version 2 repos, colons are entirely avoided in +filenames. So a bare git clone can be put on VFAT, and git-annex +used to move stuff --to and --from it, for sneakernet. diff --git a/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment b/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment new file mode 100644 index 000000000..510e44984 --- /dev/null +++ b/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="fmarier" + ip="121.73.248.43" + subject="Exporting to a FAT filesystem?" + date="2011-04-04T07:40:41Z" + content=""" +I'm using git-annex to keep my music in sync between all of my different machines. What I'd love to be able to do is to also keep it in sync with my iRiver player. Unfortunately, the firmware, Rockbox, doesn't support ext3, so I'm stuck with a FAT filesystem. + +I can see how the design of git-annex makes it rather difficult to get rid of the symlinks, so how about taking a different approach: something like a \"git annex export DEST\" which would take a destination (not a git remote) and rsync the content over to there as regular files. + +Maybe \"git annex sync DEST\" or \"git annex rsync DEST\" would be better names if we want to convey the idea that the destination will be made to look like the source repo, including performing the necessary deletions. +"""]] diff --git a/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment b/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment new file mode 100644 index 000000000..7618c9a7b --- /dev/null +++ b/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-04T18:20:45Z" + content=""" +Hey @fmarier. Well, this bug report is closed because you can already get rid of the symlinks. Just put a bare git repo on your fat filesystem, and use git-annex copy --to/--from there. + +Now, that puts all the files that are on the device in .git/annex/objects/xx/yy/blah.mp3 -- how well rockbox would support that I don't know. And if it tries to modify or delete those files, git annex also can't help you manage those changes. + +Another recent option is the [[special_remotes/directory]] special remote type, which again uses \"xx/yy/blah.mp3\" and can't track changes made to the files. This could perhaps be extended in the direction you suggest, although trying to fit this into the special remote infrastructure might not be a good fit really. + +The most likely way this has to get dealt with is really by using [[todo/smudge]] filters, which would eliminate the symlinks and allow copying a non-bare git repo onto vfat. +"""]] diff --git a/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment b/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment new file mode 100644 index 000000000..f3db75c2f --- /dev/null +++ b/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="fmarier" + subject="comment 3" + date="2011-04-05T10:00:21Z" + content=""" +Thanks for the reply @joey. + +While it would certainly be possible for a bare repo to exist on my iRiver, the problem is that the music player uses the filesystem to organize files into directories like \"Artist/Album/Track.ogg\". So replacing that with \"..../xx/yy/Track.ogg\" would make it fairly difficult to browse my music collection and select the album/track I want to listen to :) + +So unless I have the files physically organized like the symlinks, then it's probably not going to work very for that particular workflow. Smudge filters are interesting though. In the meantime, I'll look into rsyncing from another box which has the right filesystem layout onto my iRiver directly. +"""]] diff --git a/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment b/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment new file mode 100644 index 000000000..722cbdd9e --- /dev/null +++ b/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ethan.betacantrips.com/" + nickname="ethan.glasser.camp" + subject="no symlinks" + date="2011-06-08T20:59:38Z" + content=""" +If you try to clone a git repo that has a symlink over to a VFAT filesystem, you get (in its place) a regular file that contains the name of the symlink target. So why can't git-annex use that? I could still do git annex get on this file, git annex would still \"know\" that it's a symlink, and could replace it with a copy of the real file (instead of putting it in .git/annex). + +I know if it were that simple, someone would have done it already, so what am I missing? I guess trying to get the file FROM the repository would fail because it wouldn't find the file in .git/annex? Couldn't you store a reverse mapping? You wouldn't be able to move the file around, but you already lose that once you give up symlinks. It would also be a little harder to tell which symlinks were \"dangling\"; I don't see an easy way to get around that. It would still be better than a bare repo.. +"""]] diff --git a/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment b/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment new file mode 100644 index 000000000..1063b0f91 --- /dev/null +++ b/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-06-10T16:41:43Z" + content=""" +@ethan the reason that wouldn't work is because git would then see a file that was checked in and had its one line symlinkish content replaced with a huge binary blob. And git commit would try to commit that etc. The potential for foot-shooting is too high. +"""]] diff --git a/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment b/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment new file mode 100644 index 000000000..c7defd13e --- /dev/null +++ b/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZRoTRyW3tox-FD2DQWxskgI6_tkEtHL4" + nickname="Ben" + subject="comment 6" + date="2012-07-23T16:11:52Z" + content=""" +The above would work fine for me but the files in my annex (e.g. .git/annex/objects/xx/yy/blah.ogg) don't have extensions like that, so my media player doesn't recognize them as media files. How do I get the files under \"objects\" to keep the extensions of the original files like in Joey's example? +"""]] diff --git a/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment b/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment new file mode 100644 index 000000000..11668615e --- /dev/null +++ b/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 7" + date="2012-07-24T14:51:50Z" + content=""" +You can get the extensions by migrating to the SHA1E (or SHA256E) backend. +"""]] diff --git a/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment b/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment new file mode 100644 index 000000000..558e0ca10 --- /dev/null +++ b/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmcYryijvlF8bJvM_eZNSrUPEkMlxMDGTQ" + nickname="Thiago" + subject="POSIX layer on top of VFAT using FUSE" + date="2012-11-24T00:21:23Z" + content=""" +I just found out about this project and didn't try it, but it looks like it would allow using git-annex on an usb stick with a normal repository: + + +"""]] diff --git a/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn b/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn new file mode 100644 index 000000000..b8967eca5 --- /dev/null +++ b/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn @@ -0,0 +1,103 @@ +### Please describe the problem. +Not able to successfully git-annex sync with a remote due to a git fatal. Caused by masters diverging? + +### What steps will reproduce the problem? +git-annex sync, or, letting the assistant try. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131221+b1 on my laptop +git-annex version: 5.20131224-g6ca5271 on the remote server + +### Please provide any additional information below. + +Output of a manual git-annex sync in the directory: + +[[!format sh """ +greg@x200s:~/Documents$ git-annex sync +commit (Recording state in git...) +Copyright Office/Orphan Works/ARROW/170409_ARROW_Leaflet.pdf: unmerged (783afced6bc43138373fda43edfda0c33be36525) +Copyright Office/Orphan Works/ARROW/ARROWproject_results1.pdf: unmerged (b536e5f3d93e7905e05510f26db1f743e9eae16e) +Copyright Office/Orphan Works/ARROW/ARROWproject_results1.ppt: unmerged (5543049b8940cc5702d37aff18b03c67d9c8374d) +Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.pdf: unmerged (54d751bc98cb5da29d3d568856b74675e842072e) +Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.ppt: unmerged (efe0e94b51eccb9a6a0c352f4a210bd5a6105050) +Copyright Office/Orphan Works/ARROW/ARROWtrifoldMAR2011.pdf: unmerged (b52ff16178e29261fe00a518c23610a3b0826482) +Copyright Office/Orphan Works/Documentation/20110531/Documentation.doc.odt: unmerged (1348d5f42f7e34706407f7936f4fb0438e4b8ffa) +Copyright Office/Orphan Works/Documentation/AAPpublishers.pdf: unmerged (3f448a03d31a38adb095e3031e4ee13771d22d70) +Copyright Office/Orphan Works/Documentation/Documentation.doc: unmerged (265fdff7787f560e3ba20789a12e15ffb165ec7f) +Copyright Office/Orphan Works/Documentation/Documentation.pdf: unmerged (7a9ff92663ed42b42b9baaefaf4721499d18d82d) +... +fatal: git-write-tree: error building trees +git-annex: failed to read sha from git write-tree +"""]] + +See also: + +1. the [partial daemon log](http://paste.debian.net/73176/) from the assistant running in that directory on the laptop and +2. the output of [git fsck](http://paste.debian.net/73175/) on the remote. + +git-annex repair on the laptop and the server: +[[!format sh """ +greg@x200s:~/Documents$ git-annex repair +Running git fsck ... +No problems found. +ok +"""]] + + +### How I ended up fixing it: +[[!format sh """ +greg@x200s:~/Documents$ killall git-annex +greg@x200s:~/Documents$ git-annex indirect +blah............... +indirect ok +ok +greg@x200s:~/Documents$ git status +On branch master +Your branch and 'rose/master' have diverged, +and have 294 and 1 different commit each, respectively. + (use "git pull" to merge the remote branch into yours) + +Untracked files: + (use "git add ..." to include in what will be committed) + + .gitrefs/ + +nothing added to commit but untracked files present (use "git add" to track) +greg@x200s:~/Documents$ git pull +Merge made by the 'recursive' strategy. + Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 | 1 + + Copyright Office/Orphan Works/staging/reporting/with-title.xls | 1 + + Copyright Office/Orphan Works/staging/with-title.xls | 1 + + Copyright Office/Orphan Works/worker_emails.txt | 1 + + git.fsck.log | 1 + + 5 files changed, 5 insertions(+) + create mode 120000 Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 + create mode 120000 Copyright Office/Orphan Works/staging/reporting/with-title.xls + create mode 120000 Copyright Office/Orphan Works/staging/with-title.xls + create mode 120000 Copyright Office/Orphan Works/worker_emails.txt + create mode 120000 git.fsck.log +greg@x200s:~/Documents$ git-annex sync +commit ok +pull rose + +Already up-to-date. +ok +push rose +Counting objects: 1658, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (904/904), done. +Writing objects: 100% (1604/1604), 138.97 KiB | 0 bytes/s, done. +Total 1604 (delta 892), reused 1298 (delta 688) +To greg@rose.makesad.us:/home/greg/Documents/ + f1d206e..e836b9b master -> synced/master +ok +greg@x200s:~/Documents$ +"""]] + +I restarted the assistant and the daemon.log looks good. + +After sync'ing on the server, it appears that this has been the case for quite some time (based off of what symlinks were created). + +Lastly: Joey, this is probably what caused that weird behavior in the webapp where it showed the bad transfer each day after the fsck at noon. I never diagnosed that more but I bet I won't see it tomorrow. + +[[!tag moreinfo]] diff --git a/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment b/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment new file mode 100644 index 000000000..dabc1d4f3 --- /dev/null +++ b/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 2" + date="2014-01-06T16:14:29Z" + content=""" +As far as I can tell from git's code, this involves a \"cache-tree\" data structure stored in git's index file. git-annex has nothing to do with writing index files, beyond running git plumbing. So I don't see how this could be anything other than a corrupt index file (of a sort that git fsck doesn't detect), or a git bug. The best thing to do would be to send an example of a repository having this problem to the git developers for analysis. +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn new file mode 100644 index 000000000..dae654d13 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn @@ -0,0 +1,63 @@ +### What steps will reproduce the problem? +[[!format sh """ +C:\Users\Bruno>mkdir annex + +C:\Users\Bruno>cd annex + +C:\Users\Bruno\annex>git init +Initialized empty Git repository in C:/Users/Bruno/annex/.git/ + +C:\Users\Bruno\annex>git annex init +init + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +C:\Users\Bruno\annex>echo test > test + +C:\Users\Bruno\annex>git annex add . +add test (checksum...) ok +(Recording state in git...) + +C:\Users\Bruno\annex>git commit -a -m added +[master (root-commit) 2eea610] added + 1 file changed, 1 insertion(+) + create mode 120000 test + +C:\Users\Bruno\annex>git annex sync +(Recording state in git...) +fatal: unable to access '../../../../C:\Users\Bruno\annex\.git/config': Invalid argument + +git-annex: user error (xargs ["-0","git","--git-dir=C:\\Users\\Bruno\\annex\\.git","--work-tree=C:\\Users\\Bruno\\annex","add","-f"] exited 123) +failed +git-annex: sync: 1 failed +"""]] + +### What version of git-annex are you using? On what operating system? +Windows 8 (64 bits) + +git version 1.8.4.msysgit.0 + +[[!format sh """ +git-annex version: 4.20131008-ge115441 +build flags: Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 2 +"""]] + +### Please provide any additional information below. +C:\Users\Bruno\annex\.git\config exists + +> xargs was one problem; also msysgit seems to just not +> accept DOS style paths anymore in --git-dir or --git-work-tree. +> megaweird. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment new file mode 100644 index 000000000..cc616aae9 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-16T20:42:07Z" + content=""" +I don't know what to make of this bug report. You say that \"C:\Users\Bruno\annex.git\config\" exists, but you show the creation of a \"C:\Users\Bruno\annex\", and not the other repository. I cannot reproduce it, even if I first \"git init --bare annex.git\". +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment new file mode 100644 index 000000000..a40e9cbe5 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment @@ -0,0 +1,48 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 2" + date="2013-10-16T22:47:46Z" + content=""" +There's no other repo yet. I have the same problem when I try to sync between two repos but I simplified the instructions to reproduce the bug easily. + +Here's the instructions on Debian : +[[!format sh \"\"\" +bruno@debian:~$ mkdir annex +bruno@debian:~$ cd annex +bruno@debian:~/annex$ git init +Initialized empty Dépôt git dans /home/bruno/annex/.git/ +bruno@debian:~/annex$ git annex init +init ok +(Recording state in git...) +bruno@debian:~/annex$ echo test > test +bruno@debian:~/annex$ git annex add . +add test (checksum...) ok +(Recording state in git...) +bruno@debian:~/annex$ git commit -a -m added +[master (root-commit) 631049d] added + 1 file changed, 1 insertion(+) + create mode 120000 test +bruno@debian:~/annex$ git annex sync +commit +ok +bruno@debian:~/annex$\"\"\"]] + +It seems --git-dir wants 'c:/...' instead of 'c:\\...'. + +[[!format sh \"\"\" +C:\Users\Bruno\annex>git --git-dir=C:\\Users\\Bruno\\annex\\.git --work-tree=C:\\Users\\Bruno\\annex add -f test +fatal: unable to access '../../../../C:\\Users\\Bruno\\annex\\.git/config': Invalid argument + +C:\Users\Bruno\annex>git --git-dir=C:/Users/Bruno/annex/.git --work-tree=C:\\Users\\Bruno\\annex add -f test + +C:\Users\Bruno\annex>\"\"\"]] + +It's weird that I don't have any problem with the following command: +[[!format sh \"\"\"C:\Users\Bruno\annex>git --git-dir=C:\\Users\\Bruno\\annex\\.git --work-tree=C:\\Users\\Bruno\\annex config -l +core.symlinks=false +core.autocrlf=true +[...]\"\"\"]] + +Maybe there's a problem with `git version 1.8.4.msysgit.0`. +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment new file mode 100644 index 000000000..ac4a9e91a --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2013-10-17T21:49:10Z" + content=""" +So this is a problem with msysgit 1.8.4. I have been able to reproduce it with that version. 1.8.3 did not have the problem. + +Seems to perhaps be due to the cygwin xargs flipping git into cygwin path mode somehow. (How all this works is massively complex and confusing to me.) +All the other calls to git with identical parameters work fine. I can also reproduce the problem using some old git 1.7.x in the cygwin terminal. + +BTW, I noticed in your example that you ran \"git commit -a\". You should **never** do that in a [[direct mode]] repository. Read the direct mode documentation to understand why. +"""]] diff --git a/doc/bugs/files_lost_during_upgrade.mdwn b/doc/bugs/files_lost_during_upgrade.mdwn new file mode 100644 index 000000000..afab38d81 --- /dev/null +++ b/doc/bugs/files_lost_during_upgrade.mdwn @@ -0,0 +1,2191 @@ +### Please describe the problem. +I'm running git annex on two laptops sharing data with a shared server all running ubuntu and the binary distributions of git annex (different versions the server seems to be running 5.20140529-gb71f9bf right now). One of the laptops tried to upgrade to 5.20140613 (something) from 5.20140610-g5ec8bcf, which kind of fails since that version does not exist on the site, only the signature making it download and upgrade and then decide it still needs to upgrade, took a few times before I figured this out. + +During one of the upgrades I guess something died and it started to complain about an index.lock file that should be removed after all git instances were dead, so I killed git annex and removed the file (a few times maybe) just to get the upgrade through. After realizing it was trying to upgrade to the same version over and over again I realized it had somehow managed merge away all files and the git history looked like crazy. + +Had to "git annex indirect; git annex checkout GOODVERSION . ; git annex direct ; git annex assistant" to get the files back (I think that did it, I'm a little unsure what the best way to restore files are). + +### What steps will reproduce the problem? + +I don't know. Just posting this in case someone else can figure it out. + +Might be relevant that upgrade never works out of the box, it removes the old version of git annex and untars the new version in my home directory (which isn't on the path), so I can't use it from the command line. So I shut it down, copy it back to where it should go, and then update the .config/git-annex/program to point to the correct location. + +### What version of git-annex are you using? On what operating system? + +5.20140610-g5ec8bcf (maybe, I'm not sure if that was the one I upgraded from initially). + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +I think this is the log from before the files where removed + +[2014-06-18 13:41:14 CEST] main: starting assistant version 5.20140610-g5ec8bcf +[2014-06-18 13:41:14 CEST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140610-g5ec8bcf +[2014-06-18 13:41:14 CEST] TransferScanner: Syncing with born + +(scanning...) [2014-06-18 13:41:14 CEST] Watcher: Performing startup scan + +(started...) fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + f8f8217..ff8ecb1 git-annex -> synced/git-annex + bd2e43b..e88b148 annex/direct/master -> synced/master +fatal: pathspec 'music.txt' did not match any files +fatal: Unable to create '/home/jwiklund/Documents/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: Unable to create '/home/jwiklund/Documents/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files + +(Recording state in git...) + +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) + +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +ufatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +ser error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +[2014-06-18 13:41:16 CEST] Committer: Committing changesfatal: pathspec 'music.txt' did not match any files + to git +fatal: pathspec 'music.txt' did not match any files +[2014-06-18 13:41:16 CEST] Pusher: Syncing with born +fatal: Unable to create '/home/jwiklund/Documents/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +(Recording state in git...) +(Recording state in git...) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) + +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user error (xargs ["-0","git","--git-dir=/home/jwiklund/Documents/.git","--work-tree=/home/jwiklund/Documents","-c","core.bare=false","add","--force","--"] exited 123) +user errfatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +fatal: pathspec 'music.txt' did not match any files +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + ff8ecb1..c93e415 git-annex -> synced/git-annex + e88b148..220161f annex/direct/master -> synced/master + + +This is what it said when it wanted me to remove the index file after a failed upgrade + +[2014-06-18 13:38:31 CEST] main: starting assistant version 5.20140610-g5ec8bcf +[2014-06-18 13:38:31 CEST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140610-g5ec8bcf +[2014-06-18 13:38:31 CEST] TransferScanner: Syncing with born +error: duplicate parent 294b61a3dce1e87a62e4d675deac2a9130b819e6 ignored + +(scanning...) [2014-06-18 13:38:31 CEST] Watcher: Performing startup scan + +(started...) error: duplicate parent 76407052287ba54b350e56e36353a53a3dbc5d4f ignored +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + fdae080..cf9f2a9 git-annex -> synced/git-annex + 294b61a..7640705 annex/direct/master -> synced/master +fatal: Could not switch to '/home/jwiklund/Documents/.git/annex/merge/': No such file or directory +[2014-06-18 13:38:33 CEST] Committer: Committing changes to git +fatal: Unable to create '/home/jwiklund/Documents/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +[2014-06-18 13:38:33 CEST] Pusher: Syncing with born +fatal: Could not switch to '/home/jwiklund/Documents/.git/annex/merge/': No such file or directory +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + 7640705..6b9d33e annex/direct/master -> synced/master +fatal: Could not switch to '/home/jwiklund/Documents/.git/annex/merge/': No such file or directory +[2014-06-18 13:39:20 CEST] main: warning git-annex has been shut down + +Here is the upgrade + +error: duplicate parent 6b9d33ef3a16e6245f21f3948aa96691c2b8453b ignored +(scanning...) [2014 +-06-18 13:40:55 CEST] Watcher: Performing startup scan +(started...) + +error: duplicate parent 80254c9c048a35064ba42ae6a79610da6deac0ae ignored +gpg: WARNING: unsafe permissions on homedir `/tmp/git-annex-gpg.tmp.0' +gpg: Signature made fre 13 jun 2014 17:28:22 CEST using DSA key ID 89C809CB +gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created +gpg: Good signature from "git-annex distribution signing key (for Joey Hess) " +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB +[2014-06-18 13:40:56 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20140613) +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + 6b9d33e..80254c9 annex/direct/master -> synced/master + +[2014-06-18 13:40:57 CEST] Committer: Committing changes to git +(Recording state in git...) +[2014-06-18 13:40:57 CEST] Pusher: Syncing with born + +error: duplicate parent 6be6bb32164e7103c44077ce6fa450b7c0d36e0c ignored +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + 80254c9..6be6bb3 annex/direct/master -> synced/master + +--2014-06-18 13:41:07-- https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz +Resolving downloads.kitenet.net (downloads.kitenet.net)... 107.170.31.195 +Connecting to downloads.kitenet.net (downloads.kitenet.net)|107.170.31.195|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 42645638 (41M) [application/x-gzip] +Saving to: ‘/home/jwiklund/Documents/.git/annex/tmp/SHA256E-s42645638--4ae41fb29bd26339ea10f53ea2b7cf3132e53d5e8fbfde7b43b912aa52b3d319.tar.gz’ + + 0K .......... .......... .......... .......... .......... 0% 171K 4m3s + 50K .......... .......... .......... .......... .......... 0% 505K 2m43s + 100K .......... .......... .......... .......... .......... 0% 258K 2m42s + 150K .......... .......... .......... .......... .......... 0% 510K 2m22s + 200K .......... .......... .......... .......... .......... 0% 505K 2m10s + 250K .......... .......... .......... .......... .......... 0% 516K 2m1s + 300K .......... .......... .......... .......... .......... 0% 512K 1m55s + 350K .......... .......... .......... .......... .......... 0% 31,1M 1m41s + 400K .......... .......... .......... .......... .......... 1% 512K 99s + 450K .......... .......... .......... .......... .......... 1% 515K 97s + 500K .......... .......... .......... .......... .......... 1% 1,25M 91s + 550K .......... .......... .......... .......... .......... 1% 843K 87s + 600K .......... .......... .......... .......... .......... 1% 1,25M 83s + 650K .......... .......... .......... .......... .......... 1% 858K 80s + 700K .......... .......... .......... .......... .......... 1% 1,25M 77s + 750K .......... .......... .......... .......... .......... 1% 840K 75s + 800K .......... .......... .......... .......... .......... 2% 59,4M 70s + 850K .......... .......... .......... .......... .......... 2% 518K 71s + 900K .......... .......... .......... .......... .......... 2% 39,5M 67s + 950K .......... .......... .......... .......... .......... 2% 74,5M 64s + 1000K .......... .......... .......... .......... .......... 2% 520K 64s + 1050K .......... .......... .......... .......... .......... 2% 57,3M 61s + 1100K .......... .......... .......... .......... .......... 2% 1,31M 60s + 1150K .......... .......... .......... .......... .......... 2% 855K 59s + 1200K .......... .......... .......... .......... .......... 3% 22,5M 57s + 1250K .......... .......... .......... .......... .......... 3% 1,33M 56s + 1300K .......... .......... .......... .......... .......... 3% 848K 55s + 1350K .......... .......... .......... .......... .......... 3% 9,76M 54s + 1400K .......... .......... .......... .......... .......... 3% 48,8M 52s + 1450K .......... .......... .......... .......... .......... 3% 1,45M 51s + 1500K .......... .......... .......... .......... .......... 3% 837K 51s + 1550K .......... .......... .......... .......... .......... 3% 13,4M 49s + 1600K .......... .......... .......... .......... .......... 3% 1,47M 48s + 1650K .......... .......... .......... .......... .......... 4% 861K 48s + 1700K .......... .......... .......... .......... .......... 4% 14,3M 47s + 1750K .......... .......... .......... .......... .......... 4% 13,0M 46s + 1800K .......... .......... .......... .......... .......... 4% 1,49M 45s + 1850K .......... .......... .......... .......... .......... 4% 863K 45s + 1900K .......... .......... .......... .......... .......... 4% 62,3M 44s + 1950K .......... .......... .......... .......... .......... 4% 7,64M 43s + 2000K .......... .......... .......... .......... .......... 4% 10,3M 42s + 2050K .......... .......... .......... .......... .......... 5% 582K 42s + 2100K .......... .......... .......... .......... .......... 5% 8,34M 41s + 2150K .......... .......... .......... .......... .......... 5% 48,7M 40s + 2200K .......... .......... .......... .......... .......... 5% 61,6M 39s + 2250K .......... .......... .......... .......... .......... 5% 1,52M 39s + 2300K .......... .......... .......... .......... .......... 5% 860K 39s + 2350K .......... .......... .......... .......... .......... 5% 60,4M 38s + 2400K .......... .......... .......... .......... .......... 5% 8,20M 38s + 2450K .......... .......... .......... .......... .......... 6% 87,7M 37s + 2500K .......... .......... .......... .......... .......... 6% 1,54M 37s + 2550K .......... .......... .......... .......... .......... 6% 855K 37s + 2600K .......... .......... .......... .......... .......... 6% 89,2M 36s + 2650K .......... .......... .......... .......... .......... 6% 7,38M 35s + 2700K .......... .......... .......... .......... .......... 6% 168M 35s + 2750K .......... .......... .......... .......... .......... 6% 1,44M 34s + 2800K .......... .......... .......... .......... .......... 6% 1,37M 34s + 2850K .......... .......... .......... .......... .......... 6% 2,21M 34s + 2900K .......... .......... .......... .......... .......... 7% 6,19M 33s + 2950K .......... .......... .......... .......... .......... 7% 174M 33s + 3000K .......... .......... .......... .......... .......... 7% 174M 32s + 3050K .......... .......... .......... .......... .......... 7% 196M 32s + 3100K .......... .......... .......... .......... .......... 7% 1,57M 32s + 3150K .......... .......... .......... .......... .......... 7% 1,36M 31s + 3200K .......... .......... .......... .......... .......... 7% 1,67M 31s + 3250K .......... .......... .......... .......... .......... 7% 70,5M 31s + 3300K .......... .......... .......... .......... .......... 8% 109M 30s + 3350K .......... .......... .......... .......... .......... 8% 84,8M 30s + 3400K .......... .......... .......... .......... .......... 8% 1,61M 30s + 3450K .......... .......... .......... .......... .......... 8% 8,23M 29s + 3500K .......... .......... .......... .......... .......... 8% 1,47M 29s + 3550K .......... .......... .......... .......... .......... 8% 2,77M 29s + 3600K .......... .......... .......... .......... .......... 8% 5,14M 29s + 3650K .......... .......... .......... .......... .......... 8% 28,0M 28s + 3700K .......... .......... .......... .......... .......... 9% 169M 28s + 3750K .......... .......... .......... .......... .......... 9% 1,85M 28s + 3800K .......... .......... .......... .......... .......... 9% 86,5M 27s + 3850K .......... .......... .......... .......... .......... 9% 7,14M 27s + 3900K .......... .......... .......... .......... .......... 9% 1,55M 27s + 3950K .......... .......... .......... .......... .......... 9% 2,53M 27s + 4000K .......... .......... .......... .......... .......... 9% 5,08M 26s + 4050K .......... .......... .......... .......... .......... 9% 37,6M 26s + 4100K .......... .......... .......... .......... .......... 9% 45,6M 26s + 4150K .......... .......... .......... .......... .......... 10% 86,2M 25s + 4200K .......... .......... .......... .......... .......... 10% 1,80M 25s + 4250K .......... .......... .......... .......... .......... 10% 99,6M 25s + 4300K .......... .......... .......... .......... .......... 10% 171M 25s + 4350K .......... .......... .......... .......... .......... 10% 7,41M 24s + 4400K .......... .......... .......... .......... .......... 10% 1,55M 24s + 4450K .......... .......... .......... .......... .......... 10% 2,53M 24s + 4500K .......... .......... .......... .......... .......... 10% 59,5M 24s + 4550K .......... .......... .......... .......... .......... 11% 5,43M 24s + 4600K .......... .......... .......... .......... .......... 11% 25,3M 23s + 4650K .......... .......... .......... .......... .......... 11% 138M 23s + 4700K .......... .......... .......... .......... .......... 11% 90,7M 23s + 4750K .......... .......... .......... .......... .......... 11% 116M 23s + 4800K .......... .......... .......... .......... .......... 11% 1,81M 23s + 4850K .......... .......... .......... .......... .......... 11% 64,4M 22s + 4900K .......... .......... .......... .......... .......... 11% 7,76M 22s + 4950K .......... .......... .......... .......... .......... 12% 67,2M 22s + 5000K .......... .......... .......... .......... .......... 12% 1,60M 22s + 5050K .......... .......... .......... .......... .......... 12% 2,53M 22s + 5100K .......... .......... .......... .......... .......... 12% 5,14M 22s + 5150K .......... .......... .......... .......... .......... 12% 90,4M 21s + 5200K .......... .......... .......... .......... .......... 12% 27,7M 21s + 5250K .......... .......... .......... .......... .......... 12% 41,7M 21s + 5300K .......... .......... .......... .......... .......... 12% 91,5M 21s + 5350K .......... .......... .......... .......... .......... 12% 1,85M 21s + 5400K .......... .......... .......... .......... .......... 13% 109M 20s + 5450K .......... .......... .......... .......... .......... 13% 79,2M 20s + 5500K .......... .......... .......... .......... .......... 13% 6,84M 20s + 5550K .......... .......... .......... .......... .......... 13% 32,4M 20s + 5600K .......... .......... .......... .......... .......... 13% 5,70M 20s + 5650K .......... .......... .......... .......... .......... 13% 2,36M 20s + 5700K .......... .......... .......... .......... .......... 13% 2,53M 20s + 5750K .......... .......... .......... .......... .......... 13% 5,15M 19s + 5800K .......... .......... .......... .......... .......... 14% 31,1M 19s + 5850K .......... .......... .......... .......... .......... 14% 23,0M 19s + 5900K .......... .......... .......... .......... .......... 14% 45,3M 19s + 5950K .......... .......... .......... .......... .......... 14% 73,7M 19s + 6000K .......... .......... .......... .......... .......... 14% 1,96M 19s + 6050K .......... .......... .......... .......... .......... 14% 51,7M 18s + 6100K .......... .......... .......... .......... .......... 14% 8,10M 18s + 6150K .......... .......... .......... .......... .......... 14% 45,9M 18s + 6200K .......... .......... .......... .......... .......... 15% 23,5M 18s + 6250K .......... .......... .......... .......... .......... 15% 7,66M 18s + 6300K .......... .......... .......... .......... .......... 15% 2,29M 18s + 6350K .......... .......... .......... .......... .......... 15% 2,46M 18s + 6400K .......... .......... .......... .......... .......... 15% 46,8M 18s + 6450K .......... .......... .......... .......... .......... 15% 5,73M 17s + 6500K .......... .......... .......... .......... .......... 15% 23,0M 17s + 6550K .......... .......... .......... .......... .......... 15% 21,1M 17s + 6600K .......... .......... .......... .......... .......... 15% 48,4M 17s + 6650K .......... .......... .......... .......... .......... 16% 74,1M 17s + 6700K .......... .......... .......... .......... .......... 16% 2,07M 17s + 6750K .......... .......... .......... .......... .......... 16% 30,3M 17s + 6800K .......... .......... .......... .......... .......... 16% 7,81M 17s + 6850K .......... .......... .......... .......... .......... 16% 59,1M 16s + 6900K .......... .......... .......... .......... .......... 16% 24,6M 16s + 6950K .......... .......... .......... .......... .......... 16% 8,11M 16s + 7000K .......... .......... .......... .......... .......... 16% 7,57M 16s + 7050K .......... .......... .......... .......... .......... 17% 3,19M 16s + 7100K .......... .......... .......... .......... .......... 17% 2,35M 16s + 7150K .......... .......... .......... .......... .......... 17% 5,56M 16s + 7200K .......... .......... .......... .......... .......... 17% 51,4M 16s + 7250K .......... .......... .......... .......... .......... 17% 45,5M 16s + 7300K .......... .......... .......... .......... .......... 17% 61,6M 16s + 7350K .......... .......... .......... .......... .......... 17% 22,7M 15s + 7400K .......... .......... .......... .......... .......... 17% 53,6M 15s + 7450K .......... .......... .......... .......... .......... 18% 2,12M 15s + 7500K .......... .......... .......... .......... .......... 18% 32,2M 15s + 7550K .......... .......... .......... .......... .......... 18% 61,0M 15s + 7600K .......... .......... .......... .......... .......... 18% 7,22M 15s + 7650K .......... .......... .......... .......... .......... 18% 23,6M 15s + 7700K .......... .......... .......... .......... .......... 18% 7,39M 15s + 7750K .......... .......... .......... .......... .......... 18% 53,7M 15s + 7800K .......... .......... .......... .......... .......... 18% 8,51M 15s + 7850K .......... .......... .......... .......... .......... 18% 8,28M 14s + 7900K .......... .......... .......... .......... .......... 19% 1,26M 15s + 7950K .......... .......... .......... .......... .......... 19% 59,8M 14s + 8000K .......... .......... .......... .......... .......... 19% 58,8M 14s + 8050K .......... .......... .......... .......... .......... 19% 54,2M 14s + 8100K .......... .......... .......... .......... .......... 19% 70,3M 14s + 8150K .......... .......... .......... .......... .......... 19% 26,5M 14s + 8200K .......... .......... .......... .......... .......... 19% 54,8M 14s + 8250K .......... .......... .......... .......... .......... 19% 73,9M 14s + 8300K .......... .......... .......... .......... .......... 20% 2,11M 14s + 8350K .......... .......... .......... .......... .......... 20% 21,6M 14s + 8400K .......... .......... .......... .......... .......... 20% 8,29M 14s + 8450K .......... .......... .......... .......... .......... 20% 29,6M 14s + 8500K .......... .......... .......... .......... .......... 20% 59,6M 13s + 8550K .......... .......... .......... .......... .......... 20% 6,65M 13s + 8600K .......... .......... .......... .......... .......... 20% 8,50M 13s + 8650K .......... .......... .......... .......... .......... 20% 10,1M 13s + 8700K .......... .......... .......... .......... .......... 21% 44,0M 13s + 8750K .......... .......... .......... .......... .......... 21% 1,42M 13s + 8800K .......... .......... .......... .......... .......... 21% 11,1M 13s + 8850K .......... .......... .......... .......... .......... 21% 78,9M 13s + 8900K .......... .......... .......... .......... .......... 21% 50,5M 13s + 8950K .......... .......... .......... .......... .......... 21% 73,1M 13s + 9000K .......... .......... .......... .......... .......... 21% 77,6M 13s + 9050K .......... .......... .......... .......... .......... 21% 20,2M 13s + 9100K .......... .......... .......... .......... .......... 21% 25,2M 13s + 9150K .......... .......... .......... .......... .......... 22% 117M 12s + 9200K .......... .......... .......... .......... .......... 22% 2,23M 12s + 9250K .......... .......... .......... .......... .......... 22% 22,4M 12s + 9300K .......... .......... .......... .......... .......... 22% 8,59M 12s + 9350K .......... .......... .......... .......... .......... 22% 24,5M 12s + 9400K .......... .......... .......... .......... .......... 22% 79,6M 12s + 9450K .......... .......... .......... .......... .......... 22% 7,10M 12s + 9500K .......... .......... .......... .......... .......... 22% 8,02M 12s + 9550K .......... .......... .......... .......... .......... 23% 8,69M 12s + 9600K .......... .......... .......... .......... .......... 23% 8,16M 12s + 9650K .......... .......... .......... .......... .......... 23% 63,0M 12s + 9700K .......... .......... .......... .......... .......... 23% 1,72M 12s + 9750K .......... .......... .......... .......... .......... 23% 10,1M 12s + 9800K .......... .......... .......... .......... .......... 23% 60,2M 12s + 9850K .......... .......... .......... .......... .......... 23% 61,9M 12s + 9900K .......... .......... .......... .......... .......... 23% 62,9M 12s + 9950K .......... .......... .......... .......... .......... 24% 76,6M 11s + 10000K .......... .......... .......... .......... .......... 24% 23,8M 11s + 10050K .......... .......... .......... .......... .......... 24% 30,4M 11s + 10100K .......... .......... .......... .......... .......... 24% 3,50M 11s + 10150K .......... .......... .......... .......... .......... 24% 6,05M 11s + 10200K .......... .......... .......... .......... .......... 24% 14,9M 11s + 10250K .......... .......... .......... .......... .......... 24% 10,5M 11s + 10300K .......... .......... .......... .......... .......... 24% 21,5M 11s + 10350K .......... .......... .......... .......... .......... 24% 79,7M 11s + 10400K .......... .......... .......... .......... .......... 25% 8,60M 11s + 10450K .......... .......... .......... .......... .......... 25% 6,92M 11s + 10500K .......... .......... .......... .......... .......... 25% 11,0M 11s + 10550K .......... .......... .......... .......... .......... 25% 6,96M 11s + 10600K .......... .......... .......... .......... .......... 25% 66,9M 11s + 10650K .......... .......... .......... .......... .......... 25% 10,9M 11s + 10700K .......... .......... .......... .......... .......... 25% 1,71M 11s + 10750K .......... .......... .......... .......... .......... 25% 60,4M 11s + 10800K .......... .......... .......... .......... .......... 26% 39,6M 11s + 10850K .......... .......... .......... .......... .......... 26% 62,6M 11s + 10900K .......... .......... .......... .......... .......... 26% 65,0M 10s + 10950K .......... .......... .......... .......... .......... 26% 137M 10s + 11000K .......... .......... .......... .......... .......... 26% 37,8M 10s + 11050K .......... .......... .......... .......... .......... 26% 82,1M 10s + 11100K .......... .......... .......... .......... .......... 26% 36,9M 10s + 11150K .......... .......... .......... .......... .......... 26% 3,47M 10s + 11200K .......... .......... .......... .......... .......... 27% 4,59M 10s + 11250K .......... .......... .......... .......... .......... 27% 10,3M 10s + 11300K .......... .......... .......... .......... .......... 27% 105M 10s + 11350K .......... .......... .......... .......... .......... 27% 21,8M 10s + 11400K .......... .......... .......... .......... .......... 27% 8,57M 10s + 11450K .......... .......... .......... .......... .......... 27% 6,57M 10s + 11500K .......... .......... .......... .......... .......... 27% 60,3M 10s + 11550K .......... .......... .......... .......... .......... 27% 11,5M 10s + 11600K .......... .......... .......... .......... .......... 27% 7,50M 10s + 11650K .......... .......... .......... .......... .......... 28% 72,7M 10s + 11700K .......... .......... .......... .......... .......... 28% 7,61M 10s + 11750K .......... .......... .......... .......... .......... 28% 2,31M 10s + 11800K .......... .......... .......... .......... .......... 28% 6,77M 10s + 11850K .......... .......... .......... .......... .......... 28% 66,3M 10s + 11900K .......... .......... .......... .......... .......... 28% 69,9M 10s + 11950K .......... .......... .......... .......... .......... 28% 73,3M 9s + 12000K .......... .......... .......... .......... .......... 28% 59,8M 9s + 12050K .......... .......... .......... .......... .......... 29% 62,8M 9s + 12100K .......... .......... .......... .......... .......... 29% 72,4M 9s + 12150K .......... .......... .......... .......... .......... 29% 38,9M 9s + 12200K .......... .......... .......... .......... .......... 29% 8,31M 9s + 12250K .......... .......... .......... .......... .......... 29% 6,24M 9s + 12300K .......... .......... .......... .......... .......... 29% 4,90M 9s + 12350K .......... .......... .......... .......... .......... 29% 8,21M 9s + 12400K .......... .......... .......... .......... .......... 29% 20,0M 9s + 12450K .......... .......... .......... .......... .......... 30% 9,55M 9s + 12500K .......... .......... .......... .......... .......... 30% 49,5M 9s + 12550K .......... .......... .......... .......... .......... 30% 6,87M 9s + 12600K .......... .......... .......... .......... .......... 30% 60,8M 9s + 12650K .......... .......... .......... .......... .......... 30% 11,6M 9s + 12700K .......... .......... .......... .......... .......... 30% 68,3M 9s + 12750K .......... .......... .......... .......... .......... 30% 7,84M 9s + 12800K .......... .......... .......... .......... .......... 30% 41,8M 9s + 12850K .......... .......... .......... .......... .......... 30% 8,13M 9s + 12900K .......... .......... .......... .......... .......... 31% 2,43M 9s + 12950K .......... .......... .......... .......... .......... 31% 6,04M 9s + 13000K .......... .......... .......... .......... .......... 31% 47,7M 9s + 13050K .......... .......... .......... .......... .......... 31% 56,9M 9s + 13100K .......... .......... .......... .......... .......... 31% 59,0M 9s + 13150K .......... .......... .......... .......... .......... 31% 49,4M 8s + 13200K .......... .......... .......... .......... .......... 31% 61,2M 8s + 13250K .......... .......... .......... .......... .......... 31% 56,6M 8s + 13300K .......... .......... .......... .......... .......... 32% 69,6M 8s + 13350K .......... .......... .......... .......... .......... 32% 9,89M 8s + 13400K .......... .......... .......... .......... .......... 32% 51,2M 8s + 13450K .......... .......... .......... .......... .......... 32% 3,68M 8s + 13500K .......... .......... .......... .......... .......... 32% 10,9M 8s + 13550K .......... .......... .......... .......... .......... 32% 9,06M 8s + 13600K .......... .......... .......... .......... .......... 32% 22,0M 8s + 13650K .......... .......... .......... .......... .......... 32% 56,2M 8s + 13700K .......... .......... .......... .......... .......... 33% 8,24M 8s + 13750K .......... .......... .......... .......... .......... 33% 7,93M 8s + 13800K .......... .......... .......... .......... .......... 33% 46,0M 8s + 13850K .......... .......... .......... .......... .......... 33% 140M 8s + 13900K .......... .......... .......... .......... .......... 33% 12,6M 8s + 13950K .......... .......... .......... .......... .......... 33% 8,45M 8s + 14000K .......... .......... .......... .......... .......... 33% 25,4M 8s + 14050K .......... .......... .......... .......... .......... 33% 8,48M 8s + 14100K .......... .......... .......... .......... .......... 33% 115M 8s + 14150K .......... .......... .......... .......... .......... 34% 2,37M 8s + 14200K .......... .......... .......... .......... .......... 34% 6,80M 8s + 14250K .......... .......... .......... .......... .......... 34% 41,9M 8s + 14300K .......... .......... .......... .......... .......... 34% 59,1M 8s + 14350K .......... .......... .......... .......... .......... 34% 134M 8s + 14400K .......... .......... .......... .......... .......... 34% 181M 8s + 14450K .......... .......... .......... .......... .......... 34% 107M 8s + 14500K .......... .......... .......... .......... .......... 34% 61,9M 7s + 14550K .......... .......... .......... .......... .......... 35% 24,4M 7s + 14600K .......... .......... .......... .......... .......... 35% 148M 7s + 14650K .......... .......... .......... .......... .......... 35% 8,76M 7s + 14700K .......... .......... .......... .......... .......... 35% 8,29M 7s + 14750K .......... .......... .......... .......... .......... 35% 3,92M 7s + 14800K .......... .......... .......... .......... .......... 35% 9,53M 7s + 14850K .......... .......... .......... .......... .......... 35% 143M 7s + 14900K .......... .......... .......... .......... .......... 35% 19,0M 7s + 14950K .......... .......... .......... .......... .......... 36% 7,80M 7s + 15000K .......... .......... .......... .......... .......... 36% 7,87M 7s + 15050K .......... .......... .......... .......... .......... 36% 60,1M 7s + 15100K .......... .......... .......... .......... .......... 36% 55,7M 7s + 15150K .......... .......... .......... .......... .......... 36% 12,2M 7s + 15200K .......... .......... .......... .......... .......... 36% 11,5M 7s + 15250K .......... .......... .......... .......... .......... 36% 23,0M 7s + 15300K .......... .......... .......... .......... .......... 36% 50,4M 7s + 15350K .......... .......... .......... .......... .......... 36% 51,4M 7s + 15400K .......... .......... .......... .......... .......... 37% 9,26M 7s + 15450K .......... .......... .......... .......... .......... 37% 7,03M 7s + 15500K .......... .......... .......... .......... .......... 37% 3,39M 7s + 15550K .......... .......... .......... .......... .......... 37% 6,82M 7s + 15600K .......... .......... .......... .......... .......... 37% 33,2M 7s + 15650K .......... .......... .......... .......... .......... 37% 56,0M 7s + 15700K .......... .......... .......... .......... .......... 37% 52,0M 7s + 15750K .......... .......... .......... .......... .......... 37% 55,0M 7s + 15800K .......... .......... .......... .......... .......... 38% 66,8M 7s + 15850K .......... .......... .......... .......... .......... 38% 62,0M 7s + 15900K .......... .......... .......... .......... .......... 38% 62,8M 7s + 15950K .......... .......... .......... .......... .......... 38% 192M 7s + 16000K .......... .......... .......... .......... .......... 38% 164M 7s + 16050K .......... .......... .......... .......... .......... 38% 16,4M 7s + 16100K .......... .......... .......... .......... .......... 38% 28,9M 7s + 16150K .......... .......... .......... .......... .......... 38% 8,73M 6s + 16200K .......... .......... .......... .......... .......... 39% 51,7M 6s + 16250K .......... .......... .......... .......... .......... 39% 4,07M 6s + 16300K .......... .......... .......... .......... .......... 39% 8,88M 6s + 16350K .......... .......... .......... .......... .......... 39% 30,0M 6s + 16400K .......... .......... .......... .......... .......... 39% 10,2M 6s + 16450K .......... .......... .......... .......... .......... 39% 6,47M 6s + 16500K .......... .......... .......... .......... .......... 39% 49,7M 6s + 16550K .......... .......... .......... .......... .......... 39% 57,1M 6s + 16600K .......... .......... .......... .......... .......... 39% 5,99M 6s + 16650K .......... .......... .......... .......... .......... 40% 47,3M 6s + 16700K .......... .......... .......... .......... .......... 40% 50,5M 6s + 16750K .......... .......... .......... .......... .......... 40% 80,4M 6s + 16800K .......... .......... .......... .......... .......... 40% 49,6M 6s + 16850K .......... .......... .......... .......... .......... 40% 61,4M 6s + 16900K .......... .......... .......... .......... .......... 40% 9,92M 6s + 16950K .......... .......... .......... .......... .......... 40% 97,6M 6s + 17000K .......... .......... .......... .......... .......... 40% 2,35M 6s + 17050K .......... .......... .......... .......... .......... 41% 6,43M 6s + 17100K .......... .......... .......... .......... .......... 41% 41,0M 6s + 17150K .......... .......... .......... .......... .......... 41% 56,3M 6s + 17200K .......... .......... .......... .......... .......... 41% 46,3M 6s + 17250K .......... .......... .......... .......... .......... 41% 59,6M 6s + 17300K .......... .......... .......... .......... .......... 41% 51,6M 6s + 17350K .......... .......... .......... .......... .......... 41% 84,3M 6s + 17400K .......... .......... .......... .......... .......... 41% 62,6M 6s + 17450K .......... .......... .......... .......... .......... 42% 81,4M 6s + 17500K .......... .......... .......... .......... .......... 42% 80,4M 6s + 17550K .......... .......... .......... .......... .......... 42% 20,1M 6s + 17600K .......... .......... .......... .......... .......... 42% 26,4M 6s + 17650K .......... .......... .......... .......... .......... 42% 68,5M 6s + 17700K .......... .......... .......... .......... .......... 42% 12,3M 6s + 17750K .......... .......... .......... .......... .......... 42% 30,3M 6s + 17800K .......... .......... .......... .......... .......... 42% 3,98M 6s + 17850K .......... .......... .......... .......... .......... 42% 89,6M 6s + 17900K .......... .......... .......... .......... .......... 43% 9,68M 6s + 17950K .......... .......... .......... .......... .......... 43% 34,4M 6s + 18000K .......... .......... .......... .......... .......... 43% 7,09M 6s + 18050K .......... .......... .......... .......... .......... 43% 9,29M 6s + 18100K .......... .......... .......... .......... .......... 43% 88,7M 6s + 18150K .......... .......... .......... .......... .......... 43% 43,6M 5s + 18200K .......... .......... .......... .......... .......... 43% 10,3M 5s + 18250K .......... .......... .......... .......... .......... 43% 12,4M 5s + 18300K .......... .......... .......... .......... .......... 44% 113M 5s + 18350K .......... .......... .......... .......... .......... 44% 23,2M 5s + 18400K .......... .......... .......... .......... .......... 44% 96,5M 5s + 18450K .......... .......... .......... .......... .......... 44% 119M 5s + 18500K .......... .......... .......... .......... .......... 44% 70,8M 5s + 18550K .......... .......... .......... .......... .......... 44% 9,12M 5s + 18600K .......... .......... .......... .......... .......... 44% 66,7M 5s + 18650K .......... .......... .......... .......... .......... 44% 7,63M 5s + 18700K .......... .......... .......... .......... .......... 45% 2,25M 5s + 18750K .......... .......... .......... .......... .......... 45% 112M 5s + 18800K .......... .......... .......... .......... .......... 45% 61,9M 5s + 18850K .......... .......... .......... .......... .......... 45% 79,6M 5s + 18900K .......... .......... .......... .......... .......... 45% 60,4M 5s + 18950K .......... .......... .......... .......... .......... 45% 110M 5s + 19000K .......... .......... .......... .......... .......... 45% 81,0M 5s + 19050K .......... .......... .......... .......... .......... 45% 77,1M 5s + 19100K .......... .......... .......... .......... .......... 45% 107M 5s + 19150K .......... .......... .......... .......... .......... 46% 59,2M 5s + 19200K .......... .......... .......... .......... .......... 46% 12,9M 5s + 19250K .......... .......... .......... .......... .......... 46% 31,5M 5s + 19300K .......... .......... .......... .......... .......... 46% 59,1M 5s + 19350K .......... .......... .......... .......... .......... 46% 8,48M 5s + 19400K .......... .......... .......... .......... .......... 46% 70,5M 5s + 19450K .......... .......... .......... .......... .......... 46% 6,40M 5s + 19500K .......... .......... .......... .......... .......... 46% 47,7M 5s + 19550K .......... .......... .......... .......... .......... 47% 5,84M 5s + 19600K .......... .......... .......... .......... .......... 47% 54,2M 5s + 19650K .......... .......... .......... .......... .......... 47% 34,6M 5s + 19700K .......... .......... .......... .......... .......... 47% 8,77M 5s + 19750K .......... .......... .......... .......... .......... 47% 45,6M 5s + 19800K .......... .......... .......... .......... .......... 47% 8,46M 5s + 19850K .......... .......... .......... .......... .......... 47% 53,9M 5s + 19900K .......... .......... .......... .......... .......... 47% 10,0M 5s + 19950K .......... .......... .......... .......... .......... 48% 41,3M 5s + 20000K .......... .......... .......... .......... .......... 48% 15,0M 5s + 20050K .......... .......... .......... .......... .......... 48% 25,6M 5s + 20100K .......... .......... .......... .......... .......... 48% 75,2M 5s + 20150K .......... .......... .......... .......... .......... 48% 118M 5s + 20200K .......... .......... .......... .......... .......... 48% 106M 5s + 20250K .......... .......... .......... .......... .......... 48% 122M 5s + 20300K .......... .......... .......... .......... .......... 48% 9,40M 5s + 20350K .......... .......... .......... .......... .......... 48% 82,8M 5s + 20400K .......... .......... .......... .......... .......... 49% 2,31M 5s + 20450K .......... .......... .......... .......... .......... 49% 102M 5s + 20500K .......... .......... .......... .......... .......... 49% 7,52M 5s + 20550K .......... .......... .......... .......... .......... 49% 59,3M 5s + 20600K .......... .......... .......... .......... .......... 49% 108M 4s + 20650K .......... .......... .......... .......... .......... 49% 37,9M 4s + 20700K .......... .......... .......... .......... .......... 49% 120M 4s + 20750K .......... .......... .......... .......... .......... 49% 84,2M 4s + 20800K .......... .......... .......... .......... .......... 50% 67,8M 4s + 20850K .......... .......... .......... .......... .......... 50% 100M 4s + 20900K .......... .......... .......... .......... .......... 50% 71,7M 4s + 20950K .......... .......... .......... .......... .......... 50% 73,8M 4s + 21000K .......... .......... .......... .......... .......... 50% 15,5M 4s + 21050K .......... .......... .......... .......... .......... 50% 21,8M 4s + 21100K .......... .......... .......... .......... .......... 50% 11,0M 4s + 21150K .......... .......... .......... .......... .......... 50% 64,5M 4s + 21200K .......... .......... .......... .......... .......... 51% 29,8M 4s + 21250K .......... .......... .......... .......... .......... 51% 8,28M 4s + 21300K .......... .......... .......... .......... .......... 51% 9,12M 4s + 21350K .......... .......... .......... .......... .......... 51% 9,08M 4s + 21400K .......... .......... .......... .......... .......... 51% 42,5M 4s + 21450K .......... .......... .......... .......... .......... 51% 67,7M 4s + 21500K .......... .......... .......... .......... .......... 51% 37,9M 4s + 21550K .......... .......... .......... .......... .......... 51% 9,20M 4s + 21600K .......... .......... .......... .......... .......... 51% 11,2M 4s + 21650K .......... .......... .......... .......... .......... 52% 21,7M 4s + 21700K .......... .......... .......... .......... .......... 52% 71,1M 4s + 21750K .......... .......... .......... .......... .......... 52% 8,58M 4s + 21800K .......... .......... .......... .......... .......... 52% 15,8M 4s + 21850K .......... .......... .......... .......... .......... 52% 49,8M 4s + 21900K .......... .......... .......... .......... .......... 52% 26,0M 4s + 21950K .......... .......... .......... .......... .......... 52% 84,1M 4s + 22000K .......... .......... .......... .......... .......... 52% 75,1M 4s + 22050K .......... .......... .......... .......... .......... 53% 91,9M 4s + 22100K .......... .......... .......... .......... .......... 53% 90,4M 4s + 22150K .......... .......... .......... .......... .......... 53% 11,7M 4s + 22200K .......... .......... .......... .......... .......... 53% 40,0M 4s + 22250K .......... .......... .......... .......... .......... 53% 86,5M 4s + 22300K .......... .......... .......... .......... .......... 53% 80,8M 4s + 22350K .......... .......... .......... .......... .......... 53% 2,36M 4s + 22400K .......... .......... .......... .......... .......... 53% 8,03M 4s + 22450K .......... .......... .......... .......... .......... 54% 44,6M 4s + 22500K .......... .......... .......... .......... .......... 54% 44,3M 4s + 22550K .......... .......... .......... .......... .......... 54% 46,1M 4s + 22600K .......... .......... .......... .......... .......... 54% 59,6M 4s + 22650K .......... .......... .......... .......... .......... 54% 64,5M 4s + 22700K .......... .......... .......... .......... .......... 54% 52,4M 4s + 22750K .......... .......... .......... .......... .......... 54% 64,6M 4s + 22800K .......... .......... .......... .......... .......... 54% 56,7M 4s + 22850K .......... .......... .......... .......... .......... 54% 75,7M 4s + 22900K .......... .......... .......... .......... .......... 55% 35,7M 4s + 22950K .......... .......... .......... .......... .......... 55% 30,3M 4s + 23000K .......... .......... .......... .......... .......... 55% 11,0M 4s + 23050K .......... .......... .......... .......... .......... 55% 102M 4s + 23100K .......... .......... .......... .......... .......... 55% 25,4M 4s + 23150K .......... .......... .......... .......... .......... 55% 8,53M 4s + 23200K .......... .......... .......... .......... .......... 55% 29,8M 4s + 23250K .......... .......... .......... .......... .......... 55% 11,5M 4s + 23300K .......... .......... .......... .......... .......... 56% 93,9M 4s + 23350K .......... .......... .......... .......... .......... 56% 8,20M 4s + 23400K .......... .......... .......... .......... .......... 56% 83,3M 4s + 23450K .......... .......... .......... .......... .......... 56% 32,7M 4s + 23500K .......... .......... .......... .......... .......... 56% 103M 3s + 23550K .......... .......... .......... .......... .......... 56% 9,54M 3s + 23600K .......... .......... .......... .......... .......... 56% 8,14M 3s + 23650K .......... .......... .......... .......... .......... 56% 76,8M 3s + 23700K .......... .......... .......... .......... .......... 57% 8,68M 3s + 23750K .......... .......... .......... .......... .......... 57% 63,7M 3s + 23800K .......... .......... .......... .......... .......... 57% 13,3M 3s + 23850K .......... .......... .......... .......... .......... 57% 29,7M 3s + 23900K .......... .......... .......... .......... .......... 57% 61,6M 3s + 23950K .......... .......... .......... .......... .......... 57% 71,7M 3s + 24000K .......... .......... .......... .......... .......... 57% 62,1M 3s + 24050K .......... .......... .......... .......... .......... 57% 75,3M 3s + 24100K .......... .......... .......... .......... .......... 57% 14,1M 3s + 24150K .......... .......... .......... .......... .......... 58% 48,4M 3s + 24200K .......... .......... .......... .......... .......... 58% 43,5M 3s + 24250K .......... .......... .......... .......... .......... 58% 91,5M 3s + 24300K .......... .......... .......... .......... .......... 58% 117M 3s + 24350K .......... .......... .......... .......... .......... 58% 2,39M 3s + 24400K .......... .......... .......... .......... .......... 58% 8,97M 3s + 24450K .......... .......... .......... .......... .......... 58% 102M 3s + 24500K .......... .......... .......... .......... .......... 58% 42,4M 3s + 24550K .......... .......... .......... .......... .......... 59% 64,6M 3s + 24600K .......... .......... .......... .......... .......... 59% 35,3M 3s + 24650K .......... .......... .......... .......... .......... 59% 113M 3s + 24700K .......... .......... .......... .......... .......... 59% 120M 3s + 24750K .......... .......... .......... .......... .......... 59% 38,7M 3s + 24800K .......... .......... .......... .......... .......... 59% 58,8M 3s + 24850K .......... .......... .......... .......... .......... 59% 73,9M 3s + 24900K .......... .......... .......... .......... .......... 59% 24,8M 3s + 24950K .......... .......... .......... .......... .......... 60% 63,1M 3s + 25000K .......... .......... .......... .......... .......... 60% 32,9M 3s + 25050K .......... .......... .......... .......... .......... 60% 11,0M 3s + 25100K .......... .......... .......... .......... .......... 60% 24,1M 3s + 25150K .......... .......... .......... .......... .......... 60% 85,0M 3s + 25200K .......... .......... .......... .......... .......... 60% 9,09M 3s + 25250K .......... .......... .......... .......... .......... 60% 122M 3s + 25300K .......... .......... .......... .......... .......... 60% 30,1M 3s + 25350K .......... .......... .......... .......... .......... 60% 11,4M 3s + 25400K .......... .......... .......... .......... .......... 61% 95,0M 3s + 25450K .......... .......... .......... .......... .......... 61% 7,94M 3s + 25500K .......... .......... .......... .......... .......... 61% 125M 3s + 25550K .......... .......... .......... .......... .......... 61% 42,5M 3s + 25600K .......... .......... .......... .......... .......... 61% 9,23M 3s + 25650K .......... .......... .......... .......... .......... 61% 66,0M 3s + 25700K .......... .......... .......... .......... .......... 61% 8,38M 3s + 25750K .......... .......... .......... .......... .......... 61% 70,8M 3s + 25800K .......... .......... .......... .......... .......... 62% 8,71M 3s + 25850K .......... .......... .......... .......... .......... 62% 69,5M 3s + 25900K .......... .......... .......... .......... .......... 62% 15,6M 3s + 25950K .......... .......... .......... .......... .......... 62% 26,2M 3s + 26000K .......... .......... .......... .......... .......... 62% 60,0M 3s + 26050K .......... .......... .......... .......... .......... 62% 71,0M 3s + 26100K .......... .......... .......... .......... .......... 62% 73,0M 3s + 26150K .......... .......... .......... .......... .......... 62% 71,9M 3s + 26200K .......... .......... .......... .......... .......... 63% 64,3M 3s + 26250K .......... .......... .......... .......... .......... 63% 17,0M 3s + 26300K .......... .......... .......... .......... .......... 63% 67,3M 3s + 26350K .......... .......... .......... .......... .......... 63% 35,5M 3s + 26400K .......... .......... .......... .......... .......... 63% 80,0M 3s + 26450K .......... .......... .......... .......... .......... 63% 110M 3s + 26500K .......... .......... .......... .......... .......... 63% 10,7M 3s + 26550K .......... .......... .......... .......... .......... 63% 3,01M 3s + 26600K .......... .......... .......... .......... .......... 63% 8,05M 3s + 26650K .......... .......... .......... .......... .......... 64% 107M 3s + 26700K .......... .......... .......... .......... .......... 64% 70,1M 3s + 26750K .......... .......... .......... .......... .......... 64% 71,8M 3s + 26800K .......... .......... .......... .......... .......... 64% 30,4M 3s + 26850K .......... .......... .......... .......... .......... 64% 109M 3s + 26900K .......... .......... .......... .......... .......... 64% 57,8M 3s + 26950K .......... .......... .......... .......... .......... 64% 47,2M 3s + 27000K .......... .......... .......... .......... .......... 64% 81,2M 3s + 27050K .......... .......... .......... .......... .......... 65% 74,9M 3s + 27100K .......... .......... .......... .......... .......... 65% 72,4M 3s + 27150K .......... .......... .......... .......... .......... 65% 32,0M 3s + 27200K .......... .......... .......... .......... .......... 65% 34,8M 2s + 27250K .......... .......... .......... .......... .......... 65% 10,5M 2s + 27300K .......... .......... .......... .......... .......... 65% 65,5M 2s + 27350K .......... .......... .......... .......... .......... 65% 27,9M 2s + 27400K .......... .......... .......... .......... .......... 65% 9,96M 2s + 27450K .......... .......... .......... .......... .......... 66% 58,0M 2s + 27500K .......... .......... .......... .......... .......... 66% 97,2M 2s + 27550K .......... .......... .......... .......... .......... 66% 30,3M 2s + 27600K .......... .......... .......... .......... .......... 66% 11,2M 2s + 27650K .......... .......... .......... .......... .......... 66% 8,92M 2s + 27700K .......... .......... .......... .......... .......... 66% 49,0M 2s + 27750K .......... .......... .......... .......... .......... 66% 65,0M 2s + 27800K .......... .......... .......... .......... .......... 66% 65,9M 2s + 27850K .......... .......... .......... .......... .......... 66% 9,76M 2s + 27900K .......... .......... .......... .......... .......... 67% 8,10M 2s + 27950K .......... .......... .......... .......... .......... 67% 68,7M 2s + 28000K .......... .......... .......... .......... .......... 67% 60,7M 2s + 28050K .......... .......... .......... .......... .......... 67% 71,4M 2s + 28100K .......... .......... .......... .......... .......... 67% 9,13M 2s + 28150K .......... .......... .......... .......... .......... 67% 17,5M 2s + 28200K .......... .......... .......... .......... .......... 67% 59,7M 2s + 28250K .......... .......... .......... .......... .......... 67% 25,1M 2s + 28300K .......... .......... .......... .......... .......... 68% 67,3M 2s + 28350K .......... .......... .......... .......... .......... 68% 70,4M 2s + 28400K .......... .......... .......... .......... .......... 68% 60,6M 2s + 28450K .......... .......... .......... .......... .......... 68% 74,6M 2s + 28500K .......... .......... .......... .......... .......... 68% 74,9M 2s + 28550K .......... .......... .......... .......... .......... 68% 19,6M 2s + 28600K .......... .......... .......... .......... .......... 68% 29,3M 2s + 28650K .......... .......... .......... .......... .......... 68% 67,6M 2s + 28700K .......... .......... .......... .......... .......... 69% 93,7M 2s + 28750K .......... .......... .......... .......... .......... 69% 140M 2s + 28800K .......... .......... .......... .......... .......... 69% 11,5M 2s + 28850K .......... .......... .......... .......... .......... 69% 6,48M 2s + 28900K .......... .......... .......... .......... .......... 69% 3,54M 2s + 28950K .......... .......... .......... .......... .......... 69% 33,1M 2s + 29000K .......... .......... .......... .......... .......... 69% 83,1M 2s + 29050K .......... .......... .......... .......... .......... 69% 59,5M 2s + 29100K .......... .......... .......... .......... .......... 69% 31,8M 2s + 29150K .......... .......... .......... .......... .......... 70% 129M 2s + 29200K .......... .......... .......... .......... .......... 70% 117M 2s + 29250K .......... .......... .......... .......... .......... 70% 69,8M 2s + 29300K .......... .......... .......... .......... .......... 70% 56,8M 2s + 29350K .......... .......... .......... .......... .......... 70% 89,9M 2s + 29400K .......... .......... .......... .......... .......... 70% 81,7M 2s + 29450K .......... .......... .......... .......... .......... 70% 102M 2s + 29500K .......... .......... .......... .......... .......... 70% 32,2M 2s + 29550K .......... .......... .......... .......... .......... 71% 62,2M 2s + 29600K .......... .......... .......... .......... .......... 71% 9,95M 2s + 29650K .......... .......... .......... .......... .......... 71% 61,8M 2s + 29700K .......... .......... .......... .......... .......... 71% 27,6M 2s + 29750K .......... .......... .......... .......... .......... 71% 9,47M 2s + 29800K .......... .......... .......... .......... .......... 71% 49,6M 2s + 29850K .......... .......... .......... .......... .......... 71% 61,8M 2s + 29900K .......... .......... .......... .......... .......... 71% 79,8M 2s + 29950K .......... .......... .......... .......... .......... 72% 43,6M 2s + 30000K .......... .......... .......... .......... .......... 72% 12,1M 2s + 30050K .......... .......... .......... .......... .......... 72% 9,44M 2s + 30100K .......... .......... .......... .......... .......... 72% 62,0M 2s + 30150K .......... .......... .......... .......... .......... 72% 34,3M 2s + 30200K .......... .......... .......... .......... .......... 72% 85,1M 2s + 30250K .......... .......... .......... .......... .......... 72% 10,4M 2s + 30300K .......... .......... .......... .......... .......... 72% 60,9M 2s + 30350K .......... .......... .......... .......... .......... 72% 8,51M 2s + 30400K .......... .......... .......... .......... .......... 73% 52,0M 2s + 30450K .......... .......... .......... .......... .......... 73% 121M 2s + 30500K .......... .......... .......... .......... .......... 73% 9,72M 2s + 30550K .......... .......... .......... .......... .......... 73% 66,8M 2s + 30600K .......... .......... .......... .......... .......... 73% 15,5M 2s + 30650K .......... .......... .......... .......... .......... 73% 27,7M 2s + 30700K .......... .......... .......... .......... .......... 73% 43,3M 2s + 30750K .......... .......... .......... .......... .......... 73% 122M 2s + 30800K .......... .......... .......... .......... .......... 74% 95,3M 2s + 30850K .......... .......... .......... .......... .......... 74% 75,0M 2s + 30900K .......... .......... .......... .......... .......... 74% 137M 2s + 30950K .......... .......... .......... .......... .......... 74% 14,7M 2s + 31000K .......... .......... .......... .......... .......... 74% 78,5M 2s + 31050K .......... .......... .......... .......... .......... 74% 139M 2s + 31100K .......... .......... .......... .......... .......... 74% 27,4M 2s + 31150K .......... .......... .......... .......... .......... 74% 86,3M 2s + 31200K .......... .......... .......... .......... .......... 75% 106M 2s + 31250K .......... .......... .......... .......... .......... 75% 12,0M 2s + 31300K .......... .......... .......... .......... .......... 75% 61,8M 2s + 31350K .......... .......... .......... .......... .......... 75% 2,48M 2s + 31400K .......... .......... .......... .......... .......... 75% 19,5M 2s + 31450K .......... .......... .......... .......... .......... 75% 110M 2s + 31500K .......... .......... .......... .......... .......... 75% 122M 2s + 31550K .......... .......... .......... .......... .......... 75% 126M 2s + 31600K .......... .......... .......... .......... .......... 75% 28,2M 2s + 31650K .......... .......... .......... .......... .......... 76% 83,6M 2s + 31700K .......... .......... .......... .......... .......... 76% 81,5M 2s + 31750K .......... .......... .......... .......... .......... 76% 94,8M 2s + 31800K .......... .......... .......... .......... .......... 76% 83,4M 2s + 31850K .......... .......... .......... .......... .......... 76% 100M 1s + 31900K .......... .......... .......... .......... .......... 76% 70,2M 1s + 31950K .......... .......... .......... .......... .......... 76% 121M 1s + 32000K .......... .......... .......... .......... .......... 76% 61,4M 1s + 32050K .......... .......... .......... .......... .......... 77% 43,4M 1s + 32100K .......... .......... .......... .......... .......... 77% 37,1M 1s + 32150K .......... .......... .......... .......... .......... 77% 11,7M 1s + 32200K .......... .......... .......... .......... .......... 77% 83,8M 1s + 32250K .......... .......... .......... .......... .......... 77% 22,5M 1s + 32300K .......... .......... .......... .......... .......... 77% 9,99M 1s + 32350K .......... .......... .......... .......... .......... 77% 39,0M 1s + 32400K .......... .......... .......... .......... .......... 77% 62,6M 1s + 32450K .......... .......... .......... .......... .......... 78% 117M 1s + 32500K .......... .......... .......... .......... .......... 78% 44,7M 1s + 32550K .......... .......... .......... .......... .......... 78% 14,5M 1s + 32600K .......... .......... .......... .......... .......... 78% 8,11M 1s + 32650K .......... .......... .......... .......... .......... 78% 61,7M 1s + 32700K .......... .......... .......... .......... .......... 78% 31,2M 1s + 32750K .......... .......... .......... .......... .......... 78% 57,9M 1s + 32800K .......... .......... .......... .......... .......... 78% 54,3M 1s + 32850K .......... .......... .......... .......... .......... 78% 13,1M 1s + 32900K .......... .......... .......... .......... .......... 79% 54,3M 1s + 32950K .......... .......... .......... .......... .......... 79% 8,54M 1s + 33000K .......... .......... .......... .......... .......... 79% 46,9M 1s + 33050K .......... .......... .......... .......... .......... 79% 71,3M 1s + 33100K .......... .......... .......... .......... .......... 79% 94,1M 1s + 33150K .......... .......... .......... .......... .......... 79% 11,0M 1s + 33200K .......... .......... .......... .......... .......... 79% 14,1M 1s + 33250K .......... .......... .......... .......... .......... 79% 26,0M 1s + 33300K .......... .......... .......... .......... .......... 80% 71,5M 1s + 33350K .......... .......... .......... .......... .......... 80% 70,9M 1s + 33400K .......... .......... .......... .......... .......... 80% 66,6M 1s + 33450K .......... .......... .......... .......... .......... 80% 72,1M 1s + 33500K .......... .......... .......... .......... .......... 80% 88,0M 1s + 33550K .......... .......... .......... .......... .......... 80% 17,3M 1s + 33600K .......... .......... .......... .......... .......... 80% 52,4M 1s + 33650K .......... .......... .......... .......... .......... 80% 70,5M 1s + 33700K .......... .......... .......... .......... .......... 81% 81,7M 1s + 33750K .......... .......... .......... .......... .......... 81% 77,3M 1s + 33800K .......... .......... .......... .......... .......... 81% 67,6M 1s + 33850K .......... .......... .......... .......... .......... 81% 69,8M 1s + 33900K .......... .......... .......... .......... .......... 81% 91,4M 1s + 33950K .......... .......... .......... .......... .......... 81% 15,6M 1s + 34000K .......... .......... .......... .......... .......... 81% 3,40M 1s + 34050K .......... .......... .......... .......... .......... 81% 6,13M 1s + 34100K .......... .......... .......... .......... .......... 82% 73,9M 1s + 34150K .......... .......... .......... .......... .......... 82% 46,6M 1s + 34200K .......... .......... .......... .......... .......... 82% 51,9M 1s + 34250K .......... .......... .......... .......... .......... 82% 51,7M 1s + 34300K .......... .......... .......... .......... .......... 82% 53,6M 1s + 34350K .......... .......... .......... .......... .......... 82% 44,7M 1s + 34400K .......... .......... .......... .......... .......... 82% 41,9M 1s + 34450K .......... .......... .......... .......... .......... 82% 44,0M 1s + 34500K .......... .......... .......... .......... .......... 82% 43,0M 1s + 34550K .......... .......... .......... .......... .......... 83% 74,0M 1s + 34600K .......... .......... .......... .......... .......... 83% 51,1M 1s + 34650K .......... .......... .......... .......... .......... 83% 54,0M 1s + 34700K .......... .......... .......... .......... .......... 83% 62,2M 1s + 34750K .......... .......... .......... .......... .......... 83% 74,9M 1s + 34800K .......... .......... .......... .......... .......... 83% 119M 1s + 34850K .......... .......... .......... .......... .......... 83% 136M 1s + 34900K .......... .......... .......... .......... .......... 83% 62,2M 1s + 34950K .......... .......... .......... .......... .......... 84% 20,3M 1s + 35000K .......... .......... .......... .......... .......... 84% 54,3M 1s + 35050K .......... .......... .......... .......... .......... 84% 11,2M 1s + 35100K .......... .......... .......... .......... .......... 84% 28,9M 1s + 35150K .......... .......... .......... .......... .......... 84% 54,5M 1s + 35200K .......... .......... .......... .......... .......... 84% 99,8M 1s + 35250K .......... .......... .......... .......... .......... 84% 169M 1s + 35300K .......... .......... .......... .......... .......... 84% 13,1M 1s + 35350K .......... .......... .......... .......... .......... 85% 7,96M 1s + 35400K .......... .......... .......... .......... .......... 85% 50,9M 1s + 35450K .......... .......... .......... .......... .......... 85% 47,9M 1s + 35500K .......... .......... .......... .......... .......... 85% 52,4M 1s + 35550K .......... .......... .......... .......... .......... 85% 57,5M 1s + 35600K .......... .......... .......... .......... .......... 85% 70,1M 1s + 35650K .......... .......... .......... .......... .......... 85% 14,8M 1s + 35700K .......... .......... .......... .......... .......... 85% 11,2M 1s + 35750K .......... .......... .......... .......... .......... 85% 10,8M 1s + 35800K .......... .......... .......... .......... .......... 86% 90,7M 1s + 35850K .......... .......... .......... .......... .......... 86% 68,4M 1s + 35900K .......... .......... .......... .......... .......... 86% 22,4M 1s + 35950K .......... .......... .......... .......... .......... 86% 62,0M 1s + 36000K .......... .......... .......... .......... .......... 86% 15,4M 1s + 36050K .......... .......... .......... .......... .......... 86% 26,6M 1s + 36100K .......... .......... .......... .......... .......... 86% 86,4M 1s + 36150K .......... .......... .......... .......... .......... 86% 43,3M 1s + 36200K .......... .......... .......... .......... .......... 87% 89,9M 1s + 36250K .......... .......... .......... .......... .......... 87% 100M 1s + 36300K .......... .......... .......... .......... .......... 87% 84,9M 1s + 36350K .......... .......... .......... .......... .......... 87% 16,9M 1s + 36400K .......... .......... .......... .......... .......... 87% 75,4M 1s + 36450K .......... .......... .......... .......... .......... 87% 98,4M 1s + 36500K .......... .......... .......... .......... .......... 87% 94,8M 1s + 36550K .......... .......... .......... .......... .......... 87% 4,17M 1s + 36600K .......... .......... .......... .......... .......... 88% 236M 1s + 36650K .......... .......... .......... .......... .......... 88% 271M 1s + 36700K .......... .......... .......... .......... .......... 88% 263M 1s + 36750K .......... .......... .......... .......... .......... 88% 273M 1s + 36800K .......... .......... .......... .......... .......... 88% 220M 1s + 36850K .......... .......... .......... .......... .......... 88% 26,3M 1s + 36900K .......... .......... .......... .......... .......... 88% 4,03M 1s + 36950K .......... .......... .......... .......... .......... 88% 15,4M 1s + 37000K .......... .......... .......... .......... .......... 88% 87,5M 1s + 37050K .......... .......... .......... .......... .......... 89% 96,7M 1s + 37100K .......... .......... .......... .......... .......... 89% 103M 1s + 37150K .......... .......... .......... .......... .......... 89% 82,8M 1s + 37200K .......... .......... .......... .......... .......... 89% 76,2M 1s + 37250K .......... .......... .......... .......... .......... 89% 145M 1s + 37300K .......... .......... .......... .......... .......... 89% 36,0M 1s + 37350K .......... .......... .......... .......... .......... 89% 98,7M 1s + 37400K .......... .......... .......... .......... .......... 89% 90,8M 1s + 37450K .......... .......... .......... .......... .......... 90% 99,7M 1s + 37500K .......... .......... .......... .......... .......... 90% 145M 1s + 37550K .......... .......... .......... .......... .......... 90% 99,3M 1s + 37600K .......... .......... .......... .......... .......... 90% 30,2M 1s + 37650K .......... .......... .......... .......... .......... 90% 149M 1s + 37700K .......... .......... .......... .......... .......... 90% 69,9M 1s + 37750K .......... .......... .......... .......... .......... 90% 12,5M 1s + 37800K .......... .......... .......... .......... .......... 90% 66,3M 1s + 37850K .......... .......... .......... .......... .......... 91% 88,5M 1s + 37900K .......... .......... .......... .......... .......... 91% 24,3M 0s + 37950K .......... .......... .......... .......... .......... 91% 11,8M 0s + 38000K .......... .......... .......... .......... .......... 91% 20,9M 0s + 38050K .......... .......... .......... .......... .......... 91% 60,5M 0s + 38100K .......... .......... .......... .......... .......... 91% 118M 0s + 38150K .......... .......... .......... .......... .......... 91% 114M 0s + 38200K .......... .......... .......... .......... .......... 91% 17,3M 0s + 38250K .......... .......... .......... .......... .......... 91% 8,87M 0s + 38300K .......... .......... .......... .......... .......... 92% 70,9M 0s + 38350K .......... .......... .......... .......... .......... 92% 26,9M 0s + 38400K .......... .......... .......... .......... .......... 92% 94,6M 0s + 38450K .......... .......... .......... .......... .......... 92% 99,7M 0s + 38500K .......... .......... .......... .......... .......... 92% 97,3M 0s + 38550K .......... .......... .......... .......... .......... 92% 96,8M 0s + 38600K .......... .......... .......... .......... .......... 92% 12,2M 0s + 38650K .......... .......... .......... .......... .......... 92% 52,0M 0s + 38700K .......... .......... .......... .......... .......... 93% 6,15M 0s + 38750K .......... .......... .......... .......... .......... 93% 68,5M 0s + 38800K .......... .......... .......... .......... .......... 93% 82,7M 0s + 38850K .......... .......... .......... .......... .......... 93% 16,7M 0s + 38900K .......... .......... .......... .......... .......... 93% 117M 0s + 38950K .......... .......... .......... .......... .......... 93% 20,1M 0s + 39000K .......... .......... .......... .......... .......... 93% 71,4M 0s + 39050K .......... .......... .......... .......... .......... 93% 19,6M 0s + 39100K .......... .......... .......... .......... .......... 94% 131M 0s + 39150K .......... .......... .......... .......... .......... 94% 48,5M 0s + 39200K .......... .......... .......... .......... .......... 94% 36,2M 0s + 39250K .......... .......... .......... .......... .......... 94% 65,7M 0s + 39300K .......... .......... .......... .......... .......... 94% 136M 0s + 39350K .......... .......... .......... .......... .......... 94% 24,8M 0s + 39400K .......... .......... .......... .......... .......... 94% 63,1M 0s + 39450K .......... .......... .......... .......... .......... 94% 79,9M 0s + 39500K .......... .......... .......... .......... .......... 94% 123M 0s + 39550K .......... .......... .......... .......... .......... 95% 6,16M 0s + 39600K .......... .......... .......... .......... .......... 95% 14,5M 0s + 39650K .......... .......... .......... .......... .......... 95% 19,8M 0s + 39700K .......... .......... .......... .......... .......... 95% 103M 0s + 39750K .......... .......... .......... .......... .......... 95% 104M 0s + 39800K .......... .......... .......... .......... .......... 95% 98,2M 0s + 39850K .......... .......... .......... .......... .......... 95% 91,2M 0s + 39900K .......... .......... .......... .......... .......... 95% 4,90M 0s + 39950K .......... .......... .......... .......... .......... 96% 116M 0s + 40000K .......... .......... .......... .......... .......... 96% 9,96M 0s + 40050K .......... .......... .......... .......... .......... 96% 93,2M 0s + 40100K .......... .......... .......... .......... .......... 96% 100M 0s + 40150K .......... .......... .......... .......... .......... 96% 147M 0s + 40200K .......... .......... .......... .......... .......... 96% 114M 0s + 40250K .......... .......... .......... .......... .......... 96% 99,1M 0s + 40300K .......... .......... .......... .......... .......... 96% 92,2M 0s + 40350K .......... .......... .......... .......... .......... 97% 98,0M 0s + 40400K .......... .......... .......... .......... .......... 97% 71,4M 0s + 40450K .......... .......... .......... .......... .......... 97% 96,9M 0s + 40500K .......... .......... .......... .......... .......... 97% 96,5M 0s + 40550K .......... .......... .......... .......... .......... 97% 92,0M 0s + 40600K .......... .......... .......... .......... .......... 97% 88,5M 0s + 40650K .......... .......... .......... .......... .......... 97% 96,6M 0s + 40700K .......... .......... .......... .......... .......... 97% 43,2M 0s + 40750K .......... .......... .......... .......... .......... 97% 81,9M 0s + 40800K .......... .......... .......... .......... .......... 98% 11,4M 0s + 40850K .......... .......... .......... .......... .......... 98% 25,4M 0s + 40900K .......... .......... .......... .......... .......... 98% 79,8M 0s + 40950K .......... .......... .......... .......... .......... 98% 11,8M 0s + 41000K .......... .......... .......... .......... .......... 98% 25,7M 0s + 41050K .......... .......... .......... .......... .......... 98% 57,9M 0s + 41100K .......... .......... .......... .......... .......... 98% 103M 0s + 41150K .......... .......... .......... .......... .......... 98% 41,8M 0s + 41200K .......... .......... .......... .......... .......... 99% 50,4M 0s + 41250K .......... .......... .......... .......... .......... 99% 6,45M 0s + 41300K .......... .......... .......... .......... .......... 99% 43,8M 0s + 41350K .......... .......... .......... .......... .......... 99% 65,6M 0s + 41400K .......... .......... .......... .......... .......... 99% 39,4M 0s + 41450K .......... .......... .......... .......... .......... 99% 48,9M 0s + 41500K .......... .......... .......... .......... .......... 99% 64,9M 0s + 41550K .......... .......... .......... .......... .......... 99% 74,2M 0s + 41600K .......... .......... .......... .......... ...... 100% 69,8M=5,2s + +2014-06-18 13:41:12 (7,77 MB/s) - ‘/home/jwiklund/Documents/.git/annex/tmp/SHA256E-s42645638--4ae41fb29bd26339ea10f53ea2b7cf3132e53d5e8fbfde7b43b912aa52b3d319.tar.gz’ saved [42645638/42645638] + +[2014-06-18 13:41:12 CEST] main(checksum...) +: Downloaded git-annex.. upgrade) +[2014-06-18 13:41:12 CEST] Pusher: Syncing with born +(Recording state in git...) + +error: duplicate parent bd2e43b03fcc307166df1ab23cecb0eafe9ca3a5 ignored +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + cf9f2a9..f8f8217 git-annex -> synced/git-annex + 6be6bb3..bd2e43b annex/direct/master -> synced/master + +git-annex version: 5.20140610-g5ec8bcf +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +[2014-06-18 13:41:14 CEST] main: Upgrading git-annex +[2014-06-18 13:41:14 CEST] UpgradeWatcher: A new version of git-annex has been installed. + +error: duplicate parent e88b1485767e39ac05de700219d31011b7ac7022 ignored + + +error: duplicate parent 220161f6ad836cfc581a9dd575d76c0d9e814826 ignored + + +Another upgrade + +[2014-06-18 13:38:15 CEST] main: starting assistant version 5.20140606-g48793b6 +[2014-06-18 13:38:16 CEST] TransferScanner: Syncing with born + +Already up-to-date. +(scanning...) [20 +14-06-18 13:38:16 CEST] Watcher: Performing startup scan +Already up-to-date. +(started...) +gpg: WARNING: unsafe permissions on homedir `/tmp/git-annex-gpg.tmp.0' +gpg: Signature made fre 13 jun 2014 17:28:22 CEST using DSA key ID 89C809CB +gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created +gpg: Good signature from "git-annex distribution signing key (for Joey Hess) " +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB +[2014-06-18 13:38:17 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20140613) +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + 9537540..38006f5 git-annex -> synced/git-annex +[2014-06-18 13:38:18 CEST] Committer: Committing changes to git +(Recording state in git...) +[2014-06-18 13:38:18 CEST] Pusher: Syncing with born +Everything up-to-date +--2014-06-18 13:38:22-- https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz +Resolving downloads.kitenet.net (downloads.kitenet.net)... 107.170.31.195 +Connecting to downloads.kitenet.net (downloads.kitenet.net)|107.170.31.195|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 42645638 (41M) [application/x-gzip] +Saving to: ‘/home/jwiklund/Documents/.git/annex/tmp/SHA256E-s42645638--4ae41fb29bd26339ea10f53ea2b7cf3132e53d5e8fbfde7b43b912aa52b3d319.tar.gz’ + + 0K .......... .......... .......... .......... .......... 0% 165K 4m12s + 50K .......... .......... .......... .......... .......... 0% 165K 4m12s + 100K .......... .......... .......... .......... .......... 0% 248K 3m43s + 150K .......... .......... .......... .......... .......... 0% 247K 3m29s + 200K .......... .......... .......... .......... .......... 0% 493K 3m4s + 250K .......... .......... .......... .......... .......... 0% 248K 3m1s + 300K .......... .......... .......... .......... .......... 0% 493K 2m47s + 350K .......... .......... .......... .......... .......... 0% 495K 2m36s + 400K .......... .......... .......... .......... .......... 1% 248K 2m37s + 450K .......... .......... .......... .......... .......... 1% 494K 2m30s + 500K .......... .......... .......... .......... .......... 1% 147M 2m16s + 550K .......... .......... .......... .......... .......... 1% 493K 2m11s + 600K .......... .......... .......... .......... .......... 1% 495K 2m7s + 650K .......... .......... .......... .......... .......... 1% 494K 2m4s + 700K .......... .......... .......... .......... .......... 1% 495K 2m1s + 750K .......... .......... .......... .......... .......... 1% 1,30M 1m55s + 800K .......... .......... .......... .......... .......... 2% 497K 1m53s + 850K .......... .......... .......... .......... .......... 2% 779K 1m50s + 900K .......... .......... .......... .......... .......... 2% 1,32M 1m45s + 950K .......... .......... .......... .......... .......... 2% 495K 1m44s + 1000K .......... .......... .......... .......... .......... 2% 48,8M 99s + 1050K .......... .......... .......... .......... .......... 2% 497K 98s + 1100K .......... .......... .......... .......... .......... 2% 8,40M 94s + 1150K .......... .......... .......... .......... .......... 2% 524K 93s + 1200K .......... .......... .......... .......... .......... 3% 786K 91s + 1250K .......... .......... .......... .......... .......... 3% 1,31M 89s + 1300K .......... .......... .......... .......... .......... 3% 8,46M 86s + 1350K .......... .......... .......... .......... .......... 3% 526K 85s + 1400K .......... .......... .......... .......... .......... 3% 8,23M 82s + 1450K .......... .......... .......... .......... .......... 3% 53,9M 80s + 1500K .......... .......... .......... .......... .......... 3% 523K 79s + 1550K .......... .......... .......... .......... .......... 3% 10,7M 77s + 1600K .......... .......... .......... .......... .......... 3% 865K 76s + 1650K .......... .......... .......... .......... .......... 4% 1,12M 75s + 1700K .......... .......... .......... .......... .......... 4% 59,8M 72s + 1750K .......... .......... .......... .......... .......... 4% 875K 72s + 1800K .......... .......... .......... .......... .......... 4% 1,26M 70s + 1850K .......... .......... .......... .......... .......... 4% 5,14M 69s + 1900K .......... .......... .......... .......... .......... 4% 968K 68s + 1950K .......... .......... .......... .......... .......... 4% 1,24M 67s + 2000K .......... .......... .......... .......... .......... 4% 4,91M 65s + 2050K .......... .......... .......... .......... .......... 5% 969K 65s + 2100K .......... .......... .......... .......... .......... 5% 1,13M 64s + 2150K .......... .......... .......... .......... .......... 5% 38,0M 62s + 2200K .......... .......... .......... .......... .......... 5% 9,06M 61s + 2250K .......... .......... .......... .......... .......... 5% 525K 61s + 2300K .......... .......... .......... .......... .......... 5% 72,7M 60s + 2350K .......... .......... .......... .......... .......... 5% 70,4M 59s + 2400K .......... .......... .......... .......... .......... 5% 9,59M 57s + 2450K .......... .......... .......... .......... .......... 6% 528K 58s + 2500K .......... .......... .......... .......... .......... 6% 62,6M 56s + 2550K .......... .......... .......... .......... .......... 6% 10,0M 55s + 2600K .......... .......... .......... .......... .......... 6% 88,8M 54s + 2650K .......... .......... .......... .......... .......... 6% 521K 55s + 2700K .......... .......... .......... .......... .......... 6% 133M 54s + 2750K .......... .......... .......... .......... .......... 6% 11,6M 53s + 2800K .......... .......... .......... .......... .......... 6% 7,35M 52s + 2850K .......... .......... .......... .......... .......... 6% 554K 52s + 2900K .......... .......... .......... .......... .......... 7% 22,5M 51s + 2950K .......... .......... .......... .......... .......... 7% 18,7M 50s + 3000K .......... .......... .......... .......... .......... 7% 8,07M 49s + 3050K .......... .......... .......... .......... .......... 7% 548K 50s + 3100K .......... .......... .......... .......... .......... 7% 56,1M 49s + 3150K .......... .......... .......... .......... .......... 7% 38,2M 48s + 3200K .......... .......... .......... .......... .......... 7% 25,9M 47s + 3250K .......... .......... .......... .......... .......... 7% 8,37M 46s + 3300K .......... .......... .......... .......... .......... 8% 7,57M 46s + 3350K .......... .......... .......... .......... .......... 8% 585K 46s + 3400K .......... .......... .......... .......... .......... 8% 28,9M 45s + 3450K .......... .......... .......... .......... .......... 8% 35,6M 45s + 3500K .......... .......... .......... .......... .......... 8% 8,14M 44s + 3550K .......... .......... .......... .......... .......... 8% 72,0M 43s + 3600K .......... .......... .......... .......... .......... 8% 4,17M 43s + 3650K .......... .......... .......... .......... .......... 8% 619K 43s + 3700K .......... .......... .......... .......... .......... 9% 28,8M 42s + 3750K .......... .......... .......... .......... .......... 9% 8,04M 42s + 3800K .......... .......... .......... .......... .......... 9% 57,3M 41s + 3850K .......... .......... .......... .......... .......... 9% 12,1M 41s + 3900K .......... .......... .......... .......... .......... 9% 6,22M 40s + 3950K .......... .......... .......... .......... .......... 9% 620K 40s + 4000K .......... .......... .......... .......... .......... 9% 19,1M 40s + 4050K .......... .......... .......... .......... .......... 9% 55,1M 39s + 4100K .......... .......... .......... .......... .......... 9% 9,63M 39s + 4150K .......... .......... .......... .......... .......... 10% 12,0M 38s + 4200K .......... .......... .......... .......... .......... 10% 8,14M 38s + 4250K .......... .......... .......... .......... .......... 10% 15,8M 37s + 4300K .......... .......... .......... .......... .......... 10% 625K 38s + 4350K .......... .......... .......... .......... .......... 10% 24,5M 37s + 4400K .......... .......... .......... .......... .......... 10% 8,66M 37s + 4450K .......... .......... .......... .......... .......... 10% 13,0M 36s + 4500K .......... .......... .......... .......... .......... 10% 71,5M 36s + 4550K .......... .......... .......... .......... .......... 11% 8,28M 36s + 4600K .......... .......... .......... .......... .......... 11% 6,10M 35s + 4650K .......... .......... .......... .......... .......... 11% 653K 35s + 4700K .......... .......... .......... .......... .......... 11% 50,6M 35s + 4750K .......... .......... .......... .......... .......... 11% 8,95M 35s + 4800K .......... .......... .......... .......... .......... 11% 11,5M 34s + 4850K .......... .......... .......... .......... .......... 11% 8,84M 34s + 4900K .......... .......... .......... .......... .......... 11% 53,4M 33s + 4950K .......... .......... .......... .......... .......... 12% 7,17M 33s + 5000K .......... .......... .......... .......... .......... 12% 53,7M 33s + 5050K .......... .......... .......... .......... .......... 12% 649K 33s + 5100K .......... .......... .......... .......... .......... 12% 9,07M 33s + 5150K .......... .......... .......... .......... .......... 12% 10,7M 32s + 5200K .......... .......... .......... .......... .......... 12% 9,40M 32s + 5250K .......... .......... .......... .......... .......... 12% 47,5M 32s + 5300K .......... .......... .......... .......... .......... 12% 68,6M 31s + 5350K .......... .......... .......... .......... .......... 12% 7,06M 31s + 5400K .......... .......... .......... .......... .......... 13% 11,4M 31s + 5450K .......... .......... .......... .......... .......... 13% 688K 31s + 5500K .......... .......... .......... .......... .......... 13% 8,70M 31s + 5550K .......... .......... .......... .......... .......... 13% 11,1M 30s + 5600K .......... .......... .......... .......... .......... 13% 8,83M 30s + 5650K .......... .......... .......... .......... .......... 13% 58,9M 30s + 5700K .......... .......... .......... .......... .......... 13% 83,1M 29s + 5750K .......... .......... .......... .......... .......... 13% 7,21M 29s + 5800K .......... .......... .......... .......... .......... 14% 66,1M 29s + 5850K .......... .......... .......... .......... .......... 14% 4,65M 29s + 5900K .......... .......... .......... .......... .......... 14% 757K 29s + 5950K .......... .......... .......... .......... .......... 14% 7,62M 29s + 6000K .......... .......... .......... .......... .......... 14% 10,4M 28s + 6050K .......... .......... .......... .......... .......... 14% 8,59M 28s + 6100K .......... .......... .......... .......... .......... 14% 51,4M 28s + 6150K .......... .......... .......... .......... .......... 14% 74,5M 28s + 6200K .......... .......... .......... .......... .......... 15% 6,84M 27s + 6250K .......... .......... .......... .......... .......... 15% 67,2M 27s + 6300K .......... .......... .......... .......... .......... 15% 5,40M 27s + 6350K .......... .......... .......... .......... .......... 15% 63,4M 27s + 6400K .......... .......... .......... .......... .......... 15% 706K 27s + 6450K .......... .......... .......... .......... .......... 15% 9,08M 27s + 6500K .......... .......... .......... .......... .......... 15% 9,43M 26s + 6550K .......... .......... .......... .......... .......... 15% 70,0M 26s + 6600K .......... .......... .......... .......... .......... 15% 65,4M 26s + 6650K .......... .......... .......... .......... .......... 16% 67,7M 26s + 6700K .......... .......... .......... .......... .......... 16% 7,02M 25s + 6750K .......... .......... .......... .......... .......... 16% 65,8M 25s + 6800K .......... .......... .......... .......... .......... 16% 4,77M 25s + 6850K .......... .......... .......... .......... .......... 16% 64,7M 25s + 6900K .......... .......... .......... .......... .......... 16% 783K 25s + 6950K .......... .......... .......... .......... .......... 16% 4,63M 25s + 7000K .......... .......... .......... .......... .......... 16% 9,00M 25s + 7050K .......... .......... .......... .......... .......... 17% 69,7M 24s + 7100K .......... .......... .......... .......... .......... 17% 64,8M 24s + 7150K .......... .......... .......... .......... .......... 17% 53,1M 24s + 7200K .......... .......... .......... .......... .......... 17% 6,69M 24s + 7250K .......... .......... .......... .......... .......... 17% 70,3M 24s + 7300K .......... .......... .......... .......... .......... 17% 8,28M 23s + 7350K .......... .......... .......... .......... .......... 17% 12,7M 23s + 7400K .......... .......... .......... .......... .......... 17% 765K 23s + 7450K .......... .......... .......... .......... .......... 18% 9,09M 23s + 7500K .......... .......... .......... .......... .......... 18% 4,85M 23s + 7550K .......... .......... .......... .......... .......... 18% 61,3M 23s + 7600K .......... .......... .......... .......... .......... 18% 61,6M 23s + 7650K .......... .......... .......... .......... .......... 18% 74,1M 23s + 7700K .......... .......... .......... .......... .......... 18% 73,6M 22s + 7750K .......... .......... .......... .......... .......... 18% 7,79M 22s + 7800K .......... .......... .......... .......... .......... 18% 49,1M 22s + 7850K .......... .......... .......... .......... .......... 18% 72,2M 22s + 7900K .......... .......... .......... .......... .......... 19% 8,42M 22s + 7950K .......... .......... .......... .......... .......... 19% 732K 22s + 8000K .......... .......... .......... .......... .......... 19% 8,99M 22s + 8050K .......... .......... .......... .......... .......... 19% 50,7M 22s + 8100K .......... .......... .......... .......... .......... 19% 5,19M 21s + 8150K .......... .......... .......... .......... .......... 19% 47,4M 21s + 8200K .......... .......... .......... .......... .......... 19% 48,4M 21s + 8250K .......... .......... .......... .......... .......... 19% 52,5M 21s + 8300K .......... .......... .......... .......... .......... 20% 80,5M 21s + 8350K .......... .......... .......... .......... .......... 20% 8,32M 21s + 8400K .......... .......... .......... .......... .......... 20% 40,0M 21s + 8450K .......... .......... .......... .......... .......... 20% 8,81M 20s + 8500K .......... .......... .......... .......... .......... 20% 75,7M 20s + 8550K .......... .......... .......... .......... .......... 20% 718K 20s + 8600K .......... .......... .......... .......... .......... 20% 46,3M 20s + 8650K .......... .......... .......... .......... .......... 20% 15,7M 20s + 8700K .......... .......... .......... .......... .......... 21% 81,4M 20s + 8750K .......... .......... .......... .......... .......... 21% 4,92M 20s + 8800K .......... .......... .......... .......... .......... 21% 44,6M 20s + 8850K .......... .......... .......... .......... .......... 21% 32,6M 20s + 8900K .......... .......... .......... .......... .......... 21% 94,8M 19s + 8950K .......... .......... .......... .......... .......... 21% 104M 19s + 9000K .......... .......... .......... .......... .......... 21% 8,37M 19s + 9050K .......... .......... .......... .......... .......... 21% 77,8M 19s + 9100K .......... .......... .......... .......... .......... 21% 76,5M 19s + 9150K .......... .......... .......... .......... .......... 22% 88,5M 19s + 9200K .......... .......... .......... .......... .......... 22% 4,91M 19s + 9250K .......... .......... .......... .......... .......... 22% 762K 19s + 9300K .......... .......... .......... .......... .......... 22% 57,2M 19s + 9350K .......... .......... .......... .......... .......... 22% 15,2M 19s + 9400K .......... .......... .......... .......... .......... 22% 4,79M 18s + 9450K .......... .......... .......... .......... .......... 22% 69,4M 18s + 9500K .......... .......... .......... .......... .......... 22% 66,2M 18s + 9550K .......... .......... .......... .......... .......... 23% 29,9M 18s + 9600K .......... .......... .......... .......... .......... 23% 58,8M 18s + 9650K .......... .......... .......... .......... .......... 23% 9,77M 18s + 9700K .......... .......... .......... .......... .......... 23% 45,1M 18s + 9750K .......... .......... .......... .......... .......... 23% 64,3M 18s + 9800K .......... .......... .......... .......... .......... 23% 59,4M 18s + 9850K .......... .......... .......... .......... .......... 23% 10,2M 17s + 9900K .......... .......... .......... .......... .......... 23% 55,9M 17s + 9950K .......... .......... .......... .......... .......... 24% 93,7M 17s + 10000K .......... .......... .......... .......... .......... 24% 730K 17s + 10050K .......... .......... .......... .......... .......... 24% 66,3M 17s + 10100K .......... .......... .......... .......... .......... 24% 13,6M 17s + 10150K .......... .......... .......... .......... .......... 24% 86,6M 17s + 10200K .......... .......... .......... .......... .......... 24% 4,97M 17s + 10250K .......... .......... .......... .......... .......... 24% 33,2M 17s + 10300K .......... .......... .......... .......... .......... 24% 34,1M 17s + 10350K .......... .......... .......... .......... .......... 24% 158M 17s + 10400K .......... .......... .......... .......... .......... 25% 65,6M 16s + 10450K .......... .......... .......... .......... .......... 25% 9,12M 16s + 10500K .......... .......... .......... .......... .......... 25% 101M 16s + 10550K .......... .......... .......... .......... .......... 25% 65,6M 16s + 10600K .......... .......... .......... .......... .......... 25% 44,4M 16s + 10650K .......... .......... .......... .......... .......... 25% 8,78M 16s + 10700K .......... .......... .......... .......... .......... 25% 97,5M 16s + 10750K .......... .......... .......... .......... .......... 25% 7,92M 16s + 10800K .......... .......... .......... .......... .......... 26% 6,88M 16s + 10850K .......... .......... .......... .......... .......... 26% 886K 16s + 10900K .......... .......... .......... .......... .......... 26% 66,7M 16s + 10950K .......... .......... .......... .......... .......... 26% 12,5M 16s + 11000K .......... .......... .......... .......... .......... 26% 5,70M 16s + 11050K .......... .......... .......... .......... .......... 26% 65,8M 15s + 11100K .......... .......... .......... .......... .......... 26% 25,5M 15s + 11150K .......... .......... .......... .......... .......... 26% 35,3M 15s + 11200K .......... .......... .......... .......... .......... 27% 55,0M 15s + 11250K .......... .......... .......... .......... .......... 27% 9,19M 15s + 11300K .......... .......... .......... .......... .......... 27% 58,9M 15s + 11350K .......... .......... .......... .......... .......... 27% 64,1M 15s + 11400K .......... .......... .......... .......... .......... 27% 57,1M 15s + 11450K .......... .......... .......... .......... .......... 27% 9,39M 15s + 11500K .......... .......... .......... .......... .......... 27% 84,9M 15s + 11550K .......... .......... .......... .......... .......... 27% 89,1M 15s + 11600K .......... .......... .......... .......... .......... 27% 8,04M 15s + 11650K .......... .......... .......... .......... .......... 28% 85,4M 14s + 11700K .......... .......... .......... .......... .......... 28% 815K 15s + 11750K .......... .......... .......... .......... .......... 28% 44,9M 14s + 11800K .......... .......... .......... .......... .......... 28% 131M 14s + 11850K .......... .......... .......... .......... .......... 28% 12,7M 14s + 11900K .......... .......... .......... .......... .......... 28% 5,71M 14s + 11950K .......... .......... .......... .......... .......... 28% 19,3M 14s + 12000K .......... .......... .......... .......... .......... 28% 22,0M 14s + 12050K .......... .......... .......... .......... .......... 29% 111M 14s + 12100K .......... .......... .......... .......... .......... 29% 44,5M 14s + 12150K .......... .......... .......... .......... .......... 29% 10,8M 14s + 12200K .......... .......... .......... .......... .......... 29% 169M 14s + 12250K .......... .......... .......... .......... .......... 29% 102M 14s + 12300K .......... .......... .......... .......... .......... 29% 97,9M 14s + 12350K .......... .......... .......... .......... .......... 29% 8,70M 14s + 12400K .......... .......... .......... .......... .......... 29% 47,2M 13s + 12450K .......... .......... .......... .......... .......... 30% 9,37M 13s + 12500K .......... .......... .......... .......... .......... 30% 77,2M 13s + 12550K .......... .......... .......... .......... .......... 30% 44,6M 13s + 12600K .......... .......... .......... .......... .......... 30% 84,0M 13s + 12650K .......... .......... .......... .......... .......... 30% 2,51M 13s + 12700K .......... .......... .......... .......... .......... 30% 1,15M 13s + 12750K .......... .......... .......... .......... .......... 30% 60,1M 13s + 12800K .......... .......... .......... .......... .......... 30% 12,1M 13s + 12850K .......... .......... .......... .......... .......... 30% 5,66M 13s + 12900K .......... .......... .......... .......... .......... 31% 22,1M 13s + 12950K .......... .......... .......... .......... .......... 31% 56,1M 13s + 13000K .......... .......... .......... .......... .......... 31% 27,4M 13s + 13050K .......... .......... .......... .......... .......... 31% 45,7M 13s + 13100K .......... .......... .......... .......... .......... 31% 10,4M 13s + 13150K .......... .......... .......... .......... .......... 31% 69,7M 13s + 13200K .......... .......... .......... .......... .......... 31% 60,2M 13s + 13250K .......... .......... .......... .......... .......... 31% 39,8M 12s + 13300K .......... .......... .......... .......... .......... 32% 11,8M 12s + 13350K .......... .......... .......... .......... .......... 32% 66,0M 12s + 13400K .......... .......... .......... .......... .......... 32% 48,4M 12s + 13450K .......... .......... .......... .......... .......... 32% 9,81M 12s + 13500K .......... .......... .......... .......... .......... 32% 23,9M 12s + 13550K .......... .......... .......... .......... .......... 32% 54,2M 12s + 13600K .......... .......... .......... .......... .......... 32% 54,2M 12s + 13650K .......... .......... .......... .......... .......... 32% 10,8M 12s + 13700K .......... .......... .......... .......... .......... 33% 908K 12s + 13750K .......... .......... .......... .......... .......... 33% 34,0M 12s + 13800K .......... .......... .......... .......... .......... 33% 14,8M 12s + 13850K .......... .......... .......... .......... .......... 33% 5,88M 12s + 13900K .......... .......... .......... .......... .......... 33% 44,5M 12s + 13950K .......... .......... .......... .......... .......... 33% 22,8M 12s + 14000K .......... .......... .......... .......... .......... 33% 22,8M 12s + 14050K .......... .......... .......... .......... .......... 33% 60,0M 12s + 14100K .......... .......... .......... .......... .......... 33% 10,5M 12s + 14150K .......... .......... .......... .......... .......... 34% 66,9M 11s + 14200K .......... .......... .......... .......... .......... 34% 63,9M 11s + 14250K .......... .......... .......... .......... .......... 34% 68,9M 11s + 14300K .......... .......... .......... .......... .......... 34% 11,4M 11s + 14350K .......... .......... .......... .......... .......... 34% 50,6M 11s + 14400K .......... .......... .......... .......... .......... 34% 54,7M 11s + 14450K .......... .......... .......... .......... .......... 34% 74,5M 11s + 14500K .......... .......... .......... .......... .......... 34% 10,4M 11s + 14550K .......... .......... .......... .......... .......... 35% 33,4M 11s + 14600K .......... .......... .......... .......... .......... 35% 62,0M 11s + 14650K .......... .......... .......... .......... .......... 35% 35,2M 11s + 14700K .......... .......... .......... .......... .......... 35% 75,6M 11s + 14750K .......... .......... .......... .......... .......... 35% 11,9M 11s + 14800K .......... .......... .......... .......... .......... 35% 908K 11s + 14850K .......... .......... .......... .......... .......... 35% 37,1M 11s + 14900K .......... .......... .......... .......... .......... 35% 12,6M 11s + 14950K .......... .......... .......... .......... .......... 36% 7,11M 11s + 15000K .......... .......... .......... .......... .......... 36% 13,5M 11s + 15050K .......... .......... .......... .......... .......... 36% 71,6M 11s + 15100K .......... .......... .......... .......... .......... 36% 24,4M 11s + 15150K .......... .......... .......... .......... .......... 36% 69,1M 10s + 15200K .......... .......... .......... .......... .......... 36% 63,0M 10s + 15250K .......... .......... .......... .......... .......... 36% 10,1M 10s + 15300K .......... .......... .......... .......... .......... 36% 37,9M 10s + 15350K .......... .......... .......... .......... .......... 36% 69,2M 10s + 15400K .......... .......... .......... .......... .......... 37% 68,1M 10s + 15450K .......... .......... .......... .......... .......... 37% 10,4M 10s + 15500K .......... .......... .......... .......... .......... 37% 64,3M 10s + 15550K .......... .......... .......... .......... .......... 37% 81,2M 10s + 15600K .......... .......... .......... .......... .......... 37% 71,2M 10s + 15650K .......... .......... .......... .......... .......... 37% 13,3M 10s + 15700K .......... .......... .......... .......... .......... 37% 43,7M 10s + 15750K .......... .......... .......... .......... .......... 37% 28,3M 10s + 15800K .......... .......... .......... .......... .......... 38% 59,9M 10s + 15850K .......... .......... .......... .......... .......... 38% 84,3M 10s + 15900K .......... .......... .......... .......... .......... 38% 12,2M 10s + 15950K .......... .......... .......... .......... .......... 38% 8,59M 10s + 16000K .......... .......... .......... .......... .......... 38% 926K 10s + 16050K .......... .......... .......... .......... .......... 38% 65,0M 10s + 16100K .......... .......... .......... .......... .......... 38% 70,3M 10s + 16150K .......... .......... .......... .......... .......... 38% 7,79M 10s + 16200K .......... .......... .......... .......... .......... 39% 14,6M 10s + 16250K .......... .......... .......... .......... .......... 39% 71,5M 10s + 16300K .......... .......... .......... .......... .......... 39% 21,6M 9s + 16350K .......... .......... .......... .......... .......... 39% 73,9M 9s + 16400K .......... .......... .......... .......... .......... 39% 56,4M 9s + 16450K .......... .......... .......... .......... .......... 39% 9,36M 9s + 16500K .......... .......... .......... .......... .......... 39% 69,8M 9s + 16550K .......... .......... .......... .......... .......... 39% 67,0M 9s + 16600K .......... .......... .......... .......... .......... 39% 58,4M 9s + 16650K .......... .......... .......... .......... .......... 40% 9,56M 9s + 16700K .......... .......... .......... .......... .......... 40% 71,2M 9s + 16750K .......... .......... .......... .......... .......... 40% 74,3M 9s + 16800K .......... .......... .......... .......... .......... 40% 63,4M 9s + 16850K .......... .......... .......... .......... .......... 40% 17,3M 9s + 16900K .......... .......... .......... .......... .......... 40% 60,6M 9s + 16950K .......... .......... .......... .......... .......... 40% 67,8M 9s + 17000K .......... .......... .......... .......... .......... 40% 30,6M 9s + 17050K .......... .......... .......... .......... .......... 41% 44,2M 9s + 17100K .......... .......... .......... .......... .......... 41% 92,3M 9s + 17150K .......... .......... .......... .......... .......... 41% 87,8M 9s + 17200K .......... .......... .......... .......... .......... 41% 14,1M 9s + 17250K .......... .......... .......... .......... .......... 41% 1,92M 9s + 17300K .......... .......... .......... .......... .......... 41% 1,41M 9s + 17350K .......... .......... .......... .......... .......... 41% 72,0M 9s + 17400K .......... .......... .......... .......... .......... 41% 61,9M 9s + 17450K .......... .......... .......... .......... .......... 42% 7,98M 9s + 17500K .......... .......... .......... .......... .......... 42% 18,0M 9s + 17550K .......... .......... .......... .......... .......... 42% 18,5M 9s + 17600K .......... .......... .......... .......... .......... 42% 60,6M 8s + 17650K .......... .......... .......... .......... .......... 42% 74,3M 8s + 17700K .......... .......... .......... .......... .......... 42% 71,4M 8s + 17750K .......... .......... .......... .......... .......... 42% 9,08M 8s + 17800K .......... .......... .......... .......... .......... 42% 67,1M 8s + 17850K .......... .......... .......... .......... .......... 42% 88,4M 8s + 17900K .......... .......... .......... .......... .......... 43% 63,0M 8s + 17950K .......... .......... .......... .......... .......... 43% 90,2M 8s + 18000K .......... .......... .......... .......... .......... 43% 9,69M 8s + 18050K .......... .......... .......... .......... .......... 43% 90,6M 8s + 18100K .......... .......... .......... .......... .......... 43% 88,4M 8s + 18150K .......... .......... .......... .......... .......... 43% 83,2M 8s + 18200K .......... .......... .......... .......... .......... 43% 20,2M 8s + 18250K .......... .......... .......... .......... .......... 43% 55,5M 8s + 18300K .......... .......... .......... .......... .......... 44% 24,3M 8s + 18350K .......... .......... .......... .......... .......... 44% 100M 8s + 18400K .......... .......... .......... .......... .......... 44% 31,8M 8s + 18450K .......... .......... .......... .......... .......... 44% 90,8M 8s + 18500K .......... .......... .......... .......... .......... 44% 16,1M 8s + 18550K .......... .......... .......... .......... .......... 44% 4,01M 8s + 18600K .......... .......... .......... .......... .......... 44% 60,9M 8s + 18650K .......... .......... .......... .......... .......... 44% 3,78M 8s + 18700K .......... .......... .......... .......... .......... 45% 1,39M 8s + 18750K .......... .......... .......... .......... .......... 45% 8,10M 8s + 18800K .......... .......... .......... .......... .......... 45% 60,9M 8s + 18850K .......... .......... .......... .......... .......... 45% 69,6M 8s + 18900K .......... .......... .......... .......... .......... 45% 15,8M 8s + 18950K .......... .......... .......... .......... .......... 45% 22,2M 8s + 19000K .......... .......... .......... .......... .......... 45% 63,8M 8s + 19050K .......... .......... .......... .......... .......... 45% 73,8M 7s + 19100K .......... .......... .......... .......... .......... 45% 75,6M 7s + 19150K .......... .......... .......... .......... .......... 46% 10,4M 7s + 19200K .......... .......... .......... .......... .......... 46% 48,1M 7s + 19250K .......... .......... .......... .......... .......... 46% 34,6M 7s + 19300K .......... .......... .......... .......... .......... 46% 108M 7s + 19350K .......... .......... .......... .......... .......... 46% 121M 7s + 19400K .......... .......... .......... .......... .......... 46% 10,9M 7s + 19450K .......... .......... .......... .......... .......... 46% 42,3M 7s + 19500K .......... .......... .......... .......... .......... 46% 63,6M 7s + 19550K .......... .......... .......... .......... .......... 47% 73,5M 7s + 19600K .......... .......... .......... .......... .......... 47% 25,8M 7s + 19650K .......... .......... .......... .......... .......... 47% 56,0M 7s + 19700K .......... .......... .......... .......... .......... 47% 49,8M 7s + 19750K .......... .......... .......... .......... .......... 47% 52,2M 7s + 19800K .......... .......... .......... .......... .......... 47% 61,9M 7s + 19850K .......... .......... .......... .......... .......... 47% 34,3M 7s + 19900K .......... .......... .......... .......... .......... 47% 50,3M 7s + 19950K .......... .......... .......... .......... .......... 48% 25,2M 7s + 20000K .......... .......... .......... .......... .......... 48% 7,45M 7s + 20050K .......... .......... .......... .......... .......... 48% 8,22M 7s + 20100K .......... .......... .......... .......... .......... 48% 3,67M 7s + 20150K .......... .......... .......... .......... .......... 48% 3,41M 7s + 20200K .......... .......... .......... .......... .......... 48% 1,78M 7s + 20250K .......... .......... .......... .......... .......... 48% 66,9M 7s + 20300K .......... .......... .......... .......... .......... 48% 74,2M 7s + 20350K .......... .......... .......... .......... .......... 48% 12,8M 7s + 20400K .......... .......... .......... .......... .......... 49% 29,9M 7s + 20450K .......... .......... .......... .......... .......... 49% 50,4M 7s + 20500K .......... .......... .......... .......... .......... 49% 63,1M 7s + 20550K .......... .......... .......... .......... .......... 49% 63,9M 7s + 20600K .......... .......... .......... .......... .......... 49% 15,6M 7s + 20650K .......... .......... .......... .......... .......... 49% 21,4M 7s + 20700K .......... .......... .......... .......... .......... 49% 54,6M 6s + 20750K .......... .......... .......... .......... .......... 49% 78,0M 6s + 20800K .......... .......... .......... .......... .......... 50% 93,0M 6s + 20850K .......... .......... .......... .......... .......... 50% 115M 6s + 20900K .......... .......... .......... .......... .......... 50% 13,9M 6s + 20950K .......... .......... .......... .......... .......... 50% 91,8M 6s + 21000K .......... .......... .......... .......... .......... 50% 33,4M 6s + 21050K .......... .......... .......... .......... .......... 50% 116M 6s + 21100K .......... .......... .......... .......... .......... 50% 28,1M 6s + 21150K .......... .......... .......... .......... .......... 50% 113M 6s + 21200K .......... .......... .......... .......... .......... 51% 39,4M 6s + 21250K .......... .......... .......... .......... .......... 51% 108M 6s + 21300K .......... .......... .......... .......... .......... 51% 30,8M 6s + 21350K .......... .......... .......... .......... .......... 51% 64,5M 6s + 21400K .......... .......... .......... .......... .......... 51% 75,7M 6s + 21450K .......... .......... .......... .......... .......... 51% 81,5M 6s + 21500K .......... .......... .......... .......... .......... 51% 16,2M 6s + 21550K .......... .......... .......... .......... .......... 51% 107M 6s + 21600K .......... .......... .......... .......... .......... 51% 4,12M 6s + 21650K .......... .......... .......... .......... .......... 52% 80,1M 6s + 21700K .......... .......... .......... .......... .......... 52% 3,73M 6s + 21750K .......... .......... .......... .......... .......... 52% 5,47M 6s + 21800K .......... .......... .......... .......... .......... 52% 1,50M 6s + 21850K .......... .......... .......... .......... .......... 52% 48,4M 6s + 21900K .......... .......... .......... .......... .......... 52% 65,3M 6s + 21950K .......... .......... .......... .......... .......... 52% 12,9M 6s + 22000K .......... .......... .......... .......... .......... 52% 34,5M 6s + 22050K .......... .......... .......... .......... .......... 53% 79,9M 6s + 22100K .......... .......... .......... .......... .......... 53% 75,7M 6s + 22150K .......... .......... .......... .......... .......... 53% 92,5M 6s + 22200K .......... .......... .......... .......... .......... 53% 14,2M 6s + 22250K .......... .......... .......... .......... .......... 53% 78,3M 6s + 22300K .......... .......... .......... .......... .......... 53% 23,3M 6s + 22350K .......... .......... .......... .......... .......... 53% 51,2M 6s + 22400K .......... .......... .......... .......... .......... 53% 35,1M 6s + 22450K .......... .......... .......... .......... .......... 54% 59,3M 6s + 22500K .......... .......... .......... .......... .......... 54% 84,3M 6s + 22550K .......... .......... .......... .......... .......... 54% 22,4M 6s + 22600K .......... .......... .......... .......... .......... 54% 66,5M 5s + 22650K .......... .......... .......... .......... .......... 54% 37,8M 5s + 22700K .......... .......... .......... .......... .......... 54% 81,6M 5s + 22750K .......... .......... .......... .......... .......... 54% 68,9M 5s + 22800K .......... .......... .......... .......... .......... 54% 29,8M 5s + 22850K .......... .......... .......... .......... .......... 54% 49,7M 5s + 22900K .......... .......... .......... .......... .......... 55% 68,8M 5s + 22950K .......... .......... .......... .......... .......... 55% 44,2M 5s + 23000K .......... .......... .......... .......... .......... 55% 56,1M 5s + 23050K .......... .......... .......... .......... .......... 55% 88,3M 5s + 23100K .......... .......... .......... .......... .......... 55% 87,2M 5s + 23150K .......... .......... .......... .......... .......... 55% 75,9M 5s + 23200K .......... .......... .......... .......... .......... 55% 20,9M 5s + 23250K .......... .......... .......... .......... .......... 55% 65,3M 5s + 23300K .......... .......... .......... .......... .......... 56% 99,4M 5s + 23350K .......... .......... .......... .......... .......... 56% 4,19M 5s + 23400K .......... .......... .......... .......... .......... 56% 6,24M 5s + 23450K .......... .......... .......... .......... .......... 56% 2,81M 5s + 23500K .......... .......... .......... .......... .......... 56% 6,61M 5s + 23550K .......... .......... .......... .......... .......... 56% 2,22M 5s + 23600K .......... .......... .......... .......... .......... 56% 31,8M 5s + 23650K .......... .......... .......... .......... .......... 56% 13,2M 5s + 23700K .......... .......... .......... .......... .......... 57% 27,7M 5s + 23750K .......... .......... .......... .......... .......... 57% 38,7M 5s + 23800K .......... .......... .......... .......... .......... 57% 56,6M 5s + 23850K .......... .......... .......... .......... .......... 57% 71,8M 5s + 23900K .......... .......... .......... .......... .......... 57% 20,8M 5s + 23950K .......... .......... .......... .......... .......... 57% 42,8M 5s + 24000K .......... .......... .......... .......... .......... 57% 60,5M 5s + 24050K .......... .......... .......... .......... .......... 57% 58,8M 5s + 24100K .......... .......... .......... .......... .......... 57% 31,7M 5s + 24150K .......... .......... .......... .......... .......... 58% 56,4M 5s + 24200K .......... .......... .......... .......... .......... 58% 94,3M 5s + 24250K .......... .......... .......... .......... .......... 58% 154M 5s + 24300K .......... .......... .......... .......... .......... 58% 166M 5s + 24350K .......... .......... .......... .......... .......... 58% 21,3M 5s + 24400K .......... .......... .......... .......... .......... 58% 28,9M 5s + 24450K .......... .......... .......... .......... .......... 58% 60,2M 5s + 24500K .......... .......... .......... .......... .......... 58% 99,0M 5s + 24550K .......... .......... .......... .......... .......... 59% 51,9M 5s + 24600K .......... .......... .......... .......... .......... 59% 109M 5s + 24650K .......... .......... .......... .......... .......... 59% 24,6M 5s + 24700K .......... .......... .......... .......... .......... 59% 78,5M 5s + 24750K .......... .......... .......... .......... .......... 59% 150M 5s + 24800K .......... .......... .......... .......... .......... 59% 58,7M 5s + 24850K .......... .......... .......... .......... .......... 59% 60,5M 4s + 24900K .......... .......... .......... .......... .......... 59% 95,2M 4s + 24950K .......... .......... .......... .......... .......... 60% 98,6M 4s + 25000K .......... .......... .......... .......... .......... 60% 88,9M 4s + 25050K .......... .......... .......... .......... .......... 60% 23,0M 4s + 25100K .......... .......... .......... .......... .......... 60% 61,5M 4s + 25150K .......... .......... .......... .......... .......... 60% 105M 4s + 25200K .......... .......... .......... .......... .......... 60% 6,64M 4s + 25250K .......... .......... .......... .......... .......... 60% 7,11M 4s + 25300K .......... .......... .......... .......... .......... 60% 4,75M 4s + 25350K .......... .......... .......... .......... .......... 60% 2,81M 4s + 25400K .......... .......... .......... .......... .......... 61% 50,6M 4s + 25450K .......... .......... .......... .......... .......... 61% 2,10M 4s + 25500K .......... .......... .......... .......... .......... 61% 26,6M 4s + 25550K .......... .......... .......... .......... .......... 61% 13,6M 4s + 25600K .......... .......... .......... .......... .......... 61% 16,6M 4s + 25650K .......... .......... .......... .......... .......... 61% 37,4M 4s + 25700K .......... .......... .......... .......... .......... 61% 69,9M 4s + 25750K .......... .......... .......... .......... .......... 61% 75,8M 4s + 25800K .......... .......... .......... .......... .......... 62% 32,8M 4s + 25850K .......... .......... .......... .......... .......... 62% 92,0M 4s + 25900K .......... .......... .......... .......... .......... 62% 163M 4s + 25950K .......... .......... .......... .......... .......... 62% 30,3M 4s + 26000K .......... .......... .......... .......... .......... 62% 35,2M 4s + 26050K .......... .......... .......... .......... .......... 62% 95,9M 4s + 26100K .......... .......... .......... .......... .......... 62% 55,0M 4s + 26150K .......... .......... .......... .......... .......... 62% 105M 4s + 26200K .......... .......... .......... .......... .......... 63% 142M 4s + 26250K .......... .......... .......... .......... .......... 63% 111M 4s + 26300K .......... .......... .......... .......... .......... 63% 17,8M 4s + 26350K .......... .......... .......... .......... .......... 63% 150M 4s + 26400K .......... .......... .......... .......... .......... 63% 41,1M 4s + 26450K .......... .......... .......... .......... .......... 63% 40,0M 4s + 26500K .......... .......... .......... .......... .......... 63% 90,6M 4s + 26550K .......... .......... .......... .......... .......... 63% 91,6M 4s + 26600K .......... .......... .......... .......... .......... 63% 69,6M 4s + 26650K .......... .......... .......... .......... .......... 64% 24,8M 4s + 26700K .......... .......... .......... .......... .......... 64% 94,8M 4s + 26750K .......... .......... .......... .......... .......... 64% 83,2M 4s + 26800K .......... .......... .......... .......... .......... 64% 42,4M 4s + 26850K .......... .......... .......... .......... .......... 64% 88,3M 4s + 26900K .......... .......... .......... .......... .......... 64% 88,8M 4s + 26950K .......... .......... .......... .......... .......... 64% 91,1M 4s + 27000K .......... .......... .......... .......... .......... 64% 35,7M 4s + 27050K .......... .......... .......... .......... .......... 65% 88,5M 4s + 27100K .......... .......... .......... .......... .......... 65% 83,5M 4s + 27150K .......... .......... .......... .......... .......... 65% 84,8M 4s + 27200K .......... .......... .......... .......... .......... 65% 6,73M 4s + 27250K .......... .......... .......... .......... .......... 65% 9,14M 4s + 27300K .......... .......... .......... .......... .......... 65% 28,7M 4s + 27350K .......... .......... .......... .......... .......... 65% 4,70M 4s + 27400K .......... .......... .......... .......... .......... 65% 2,82M 4s + 27450K .......... .......... .......... .......... .......... 66% 6,37M 4s + 27500K .......... .......... .......... .......... .......... 66% 3,01M 3s + 27550K .......... .......... .......... .......... .......... 66% 21,2M 3s + 27600K .......... .......... .......... .......... .......... 66% 13,7M 3s + 27650K .......... .......... .......... .......... .......... 66% 14,9M 3s + 27700K .......... .......... .......... .......... .......... 66% 55,1M 3s + 27750K .......... .......... .......... .......... .......... 66% 55,6M 3s + 27800K .......... .......... .......... .......... .......... 66% 67,1M 3s + 27850K .......... .......... .......... .......... .......... 66% 88,1M 3s + 27900K .......... .......... .......... .......... .......... 67% 61,5M 3s + 27950K .......... .......... .......... .......... .......... 67% 78,6M 3s + 28000K .......... .......... .......... .......... .......... 67% 28,8M 3s + 28050K .......... .......... .......... .......... .......... 67% 42,3M 3s + 28100K .......... .......... .......... .......... .......... 67% 46,7M 3s + 28150K .......... .......... .......... .......... .......... 67% 97,7M 3s + 28200K .......... .......... .......... .......... .......... 67% 72,4M 3s + 28250K .......... .......... .......... .......... .......... 67% 101M 3s + 28300K .......... .......... .......... .......... .......... 68% 104M 3s + 28350K .......... .......... .......... .......... .......... 68% 121M 3s + 28400K .......... .......... .......... .......... .......... 68% 21,7M 3s + 28450K .......... .......... .......... .......... .......... 68% 92,8M 3s + 28500K .......... .......... .......... .......... .......... 68% 99,8M 3s + 28550K .......... .......... .......... .......... .......... 68% 33,8M 3s + 28600K .......... .......... .......... .......... .......... 68% 114M 3s + 28650K .......... .......... .......... .......... .......... 68% 83,6M 3s + 28700K .......... .......... .......... .......... .......... 69% 142M 3s + 28750K .......... .......... .......... .......... .......... 69% 126M 3s + 28800K .......... .......... .......... .......... .......... 69% 9,03M 3s + 28850K .......... .......... .......... .......... .......... 69% 115M 3s + 28900K .......... .......... .......... .......... .......... 69% 101M 3s + 28950K .......... .......... .......... .......... .......... 69% 83,4M 3s + 29000K .......... .......... .......... .......... .......... 69% 88,0M 3s + 29050K .......... .......... .......... .......... .......... 69% 94,5M 3s + 29100K .......... .......... .......... .......... .......... 69% 122M 3s + 29150K .......... .......... .......... .......... .......... 70% 97,3M 3s + 29200K .......... .......... .......... .......... .......... 70% 91,8M 3s + 29250K .......... .......... .......... .......... .......... 70% 113M 3s + 29300K .......... .......... .......... .......... .......... 70% 35,7M 3s + 29350K .......... .......... .......... .......... .......... 70% 19,6M 3s + 29400K .......... .......... .......... .......... .......... 70% 110M 3s + 29450K .......... .......... .......... .......... .......... 70% 22,9M 3s + 29500K .......... .......... .......... .......... .......... 70% 6,27M 3s + 29550K .......... .......... .......... .......... .......... 71% 5,42M 3s + 29600K .......... .......... .......... .......... .......... 71% 5,40M 3s + 29650K .......... .......... .......... .......... .......... 71% 5,61M 3s + 29700K .......... .......... .......... .......... .......... 71% 3,47M 3s + 29750K .......... .......... .......... .......... .......... 71% 3,94M 3s + 29800K .......... .......... .......... .......... .......... 71% 17,8M 3s + 29850K .......... .......... .......... .......... .......... 71% 50,3M 3s + 29900K .......... .......... .......... .......... .......... 71% 15,4M 3s + 29950K .......... .......... .......... .......... .......... 72% 56,6M 3s + 30000K .......... .......... .......... .......... .......... 72% 39,4M 3s + 30050K .......... .......... .......... .......... .......... 72% 62,8M 3s + 30100K .......... .......... .......... .......... .......... 72% 49,8M 3s + 30150K .......... .......... .......... .......... .......... 72% 75,4M 3s + 30200K .......... .......... .......... .......... .......... 72% 63,8M 3s + 30250K .......... .......... .......... .......... .......... 72% 102M 3s + 30300K .......... .......... .......... .......... .......... 72% 79,7M 3s + 30350K .......... .......... .......... .......... .......... 72% 58,3M 3s + 30400K .......... .......... .......... .......... .......... 73% 36,5M 3s + 30450K .......... .......... .......... .......... .......... 73% 123M 3s + 30500K .......... .......... .......... .......... .......... 73% 21,5M 3s + 30550K .......... .......... .......... .......... .......... 73% 122M 3s + 30600K .......... .......... .......... .......... .......... 73% 121M 2s + 30650K .......... .......... .......... .......... .......... 73% 83,1M 2s + 30700K .......... .......... .......... .......... .......... 73% 122M 2s + 30750K .......... .......... .......... .......... .......... 73% 71,4M 2s + 30800K .......... .......... .......... .......... .......... 74% 30,6M 2s + 30850K .......... .......... .......... .......... .......... 74% 132M 2s + 30900K .......... .......... .......... .......... .......... 74% 89,6M 2s + 30950K .......... .......... .......... .......... .......... 74% 115M 2s + 31000K .......... .......... .......... .......... .......... 74% 117M 2s + 31050K .......... .......... .......... .......... .......... 74% 90,4M 2s + 31100K .......... .......... .......... .......... .......... 74% 9,46M 2s + 31150K .......... .......... .......... .......... .......... 74% 108M 2s + 31200K .......... .......... .......... .......... .......... 75% 51,7M 2s + 31250K .......... .......... .......... .......... .......... 75% 74,9M 2s + 31300K .......... .......... .......... .......... .......... 75% 104M 2s + 31350K .......... .......... .......... .......... .......... 75% 111M 2s + 31400K .......... .......... .......... .......... .......... 75% 102M 2s + 31450K .......... .......... .......... .......... .......... 75% 77,7M 2s + 31500K .......... .......... .......... .......... .......... 75% 104M 2s + 31550K .......... .......... .......... .......... .......... 75% 92,5M 2s + 31600K .......... .......... .......... .......... .......... 75% 94,8M 2s + 31650K .......... .......... .......... .......... .......... 76% 112M 2s + 31700K .......... .......... .......... .......... .......... 76% 23,4M 2s + 31750K .......... .......... .......... .......... .......... 76% 95,5M 2s + 31800K .......... .......... .......... .......... .......... 76% 21,2M 2s + 31850K .......... .......... .......... .......... .......... 76% 7,00M 2s + 31900K .......... .......... .......... .......... .......... 76% 5,33M 2s + 31950K .......... .......... .......... .......... .......... 76% 98,7M 2s + 32000K .......... .......... .......... .......... .......... 76% 5,87M 2s + 32050K .......... .......... .......... .......... .......... 77% 3,46M 2s + 32100K .......... .......... .......... .......... .......... 77% 3,11M 2s + 32150K .......... .......... .......... .......... .......... 77% 8,76M 2s + 32200K .......... .......... .......... .......... .......... 77% 47,3M 2s + 32250K .......... .......... .......... .......... .......... 77% 17,2M 2s + 32300K .......... .......... .......... .......... .......... 77% 13,4M 2s + 32350K .......... .......... .......... .......... .......... 77% 80,2M 2s + 32400K .......... .......... .......... .......... .......... 77% 75,5M 2s + 32450K .......... .......... .......... .......... .......... 78% 96,5M 2s + 32500K .......... .......... .......... .......... .......... 78% 63,6M 2s + 32550K .......... .......... .......... .......... .......... 78% 100M 2s + 32600K .......... .......... .......... .......... .......... 78% 30,2M 2s + 32650K .......... .......... .......... .......... .......... 78% 79,5M 2s + 32700K .......... .......... .......... .......... .......... 78% 91,0M 2s + 32750K .......... .......... .......... .......... .......... 78% 44,3M 2s + 32800K .......... .......... .......... .......... .......... 78% 49,2M 2s + 32850K .......... .......... .......... .......... .......... 78% 86,4M 2s + 32900K .......... .......... .......... .......... .......... 79% 20,8M 2s + 32950K .......... .......... .......... .......... .......... 79% 50,1M 2s + 33000K .......... .......... .......... .......... .......... 79% 86,0M 2s + 33050K .......... .......... .......... .......... .......... 79% 118M 2s + 33100K .......... .......... .......... .......... .......... 79% 121M 2s + 33150K .......... .......... .......... .......... .......... 79% 128M 2s + 33200K .......... .......... .......... .......... .......... 79% 103M 2s + 33250K .......... .......... .......... .......... .......... 79% 121M 2s + 33300K .......... .......... .......... .......... .......... 80% 39,0M 2s + 33350K .......... .......... .......... .......... .......... 80% 114M 2s + 33400K .......... .......... .......... .......... .......... 80% 95,3M 2s + 33450K .......... .......... .......... .......... .......... 80% 86,6M 2s + 33500K .......... .......... .......... .......... .......... 80% 116M 2s + 33550K .......... .......... .......... .......... .......... 80% 11,0M 2s + 33600K .......... .......... .......... .......... .......... 80% 76,4M 2s + 33650K .......... .......... .......... .......... .......... 80% 124M 2s + 33700K .......... .......... .......... .......... .......... 81% 43,7M 2s + 33750K .......... .......... .......... .......... .......... 81% 103M 2s + 33800K .......... .......... .......... .......... .......... 81% 86,7M 2s + 33850K .......... .......... .......... .......... .......... 81% 90,0M 2s + 33900K .......... .......... .......... .......... .......... 81% 47,6M 2s + 33950K .......... .......... .......... .......... .......... 81% 98,9M 2s + 34000K .......... .......... .......... .......... .......... 81% 79,3M 2s + 34050K .......... .......... .......... .......... .......... 81% 93,2M 2s + 34100K .......... .......... .......... .......... .......... 82% 96,5M 2s + 34150K .......... .......... .......... .......... .......... 82% 95,0M 2s + 34200K .......... .......... .......... .......... .......... 82% 52,0M 2s + 34250K .......... .......... .......... .......... .......... 82% 104M 2s + 34300K .......... .......... .......... .......... .......... 82% 93,2M 2s + 34350K .......... .......... .......... .......... .......... 82% 25,0M 1s + 34400K .......... .......... .......... .......... .......... 82% 7,35M 1s + 34450K .......... .......... .......... .......... .......... 82% 5,23M 1s + 34500K .......... .......... .......... .......... .......... 82% 6,79M 1s + 34550K .......... .......... .......... .......... .......... 83% 99,1M 1s + 34600K .......... .......... .......... .......... .......... 83% 3,23M 1s + 34650K .......... .......... .......... .......... .......... 83% 3,34M 1s + 34700K .......... .......... .......... .......... .......... 83% 6,32M 1s + 34750K .......... .......... .......... .......... .......... 83% 18,3M 1s + 34800K .......... .......... .......... .......... .......... 83% 12,6M 1s + 34850K .......... .......... .......... .......... .......... 83% 40,4M 1s + 34900K .......... .......... .......... .......... .......... 83% 68,0M 1s + 34950K .......... .......... .......... .......... .......... 84% 58,3M 1s + 35000K .......... .......... .......... .......... .......... 84% 45,2M 1s + 35050K .......... .......... .......... .......... .......... 84% 63,1M 1s + 35100K .......... .......... .......... .......... .......... 84% 54,5M 1s + 35150K .......... .......... .......... .......... .......... 84% 64,2M 1s + 35200K .......... .......... .......... .......... .......... 84% 74,6M 1s + 35250K .......... .......... .......... .......... .......... 84% 120M 1s + 35300K .......... .......... .......... .......... .......... 84% 95,9M 1s + 35350K .......... .......... .......... .......... .......... 85% 102M 1s + 35400K .......... .......... .......... .......... .......... 85% 117M 1s + 35450K .......... .......... .......... .......... .......... 85% 124M 1s + 35500K .......... .......... .......... .......... .......... 85% 139M 1s + 35550K .......... .......... .......... .......... .......... 85% 18,0M 1s + 35600K .......... .......... .......... .......... .......... 85% 98,5M 1s + 35650K .......... .......... .......... .......... .......... 85% 91,6M 1s + 35700K .......... .......... .......... .......... .......... 85% 120M 1s + 35750K .......... .......... .......... .......... .......... 85% 120M 1s + 35800K .......... .......... .......... .......... .......... 86% 107M 1s + 35850K .......... .......... .......... .......... .......... 86% 118M 1s + 35900K .......... .......... .......... .......... .......... 86% 83,0M 1s + 35950K .......... .......... .......... .......... .......... 86% 94,1M 1s + 36000K .......... .......... .......... .......... .......... 86% 69,9M 1s + 36050K .......... .......... .......... .......... .......... 86% 81,4M 1s + 36100K .......... .......... .......... .......... .......... 86% 117M 1s + 36150K .......... .......... .......... .......... .......... 86% 89,9M 1s + 36200K .......... .......... .......... .......... .......... 87% 83,4M 1s + 36250K .......... .......... .......... .......... .......... 87% 14,0M 1s + 36300K .......... .......... .......... .......... .......... 87% 84,0M 1s + 36350K .......... .......... .......... .......... .......... 87% 27,5M 1s + 36400K .......... .......... .......... .......... .......... 87% 94,0M 1s + 36450K .......... .......... .......... .......... .......... 87% 91,9M 1s + 36500K .......... .......... .......... .......... .......... 87% 47,3M 1s + 36550K .......... .......... .......... .......... .......... 87% 98,3M 1s + 36600K .......... .......... .......... .......... .......... 88% 88,5M 1s + 36650K .......... .......... .......... .......... .......... 88% 102M 1s + 36700K .......... .......... .......... .......... .......... 88% 97,9M 1s + 36750K .......... .......... .......... .......... .......... 88% 127M 1s + 36800K .......... .......... .......... .......... .......... 88% 57,2M 1s + 36850K .......... .......... .......... .......... .......... 88% 95,7M 1s + 36900K .......... .......... .......... .......... .......... 88% 88,0M 1s + 36950K .......... .......... .......... .......... .......... 88% 84,0M 1s + 37000K .......... .......... .......... .......... .......... 88% 38,4M 1s + 37050K .......... .......... .......... .......... .......... 89% 96,2M 1s + 37100K .......... .......... .......... .......... .......... 89% 10,9M 1s + 37150K .......... .......... .......... .......... .......... 89% 19,7M 1s + 37200K .......... .......... .......... .......... .......... 89% 5,09M 1s + 37250K .......... .......... .......... .......... .......... 89% 7,41M 1s + 37300K .......... .......... .......... .......... .......... 89% 3,85M 1s + 37350K .......... .......... .......... .......... .......... 89% 4,88M 1s + 37400K .......... .......... .......... .......... .......... 89% 133M 1s + 37450K .......... .......... .......... .......... .......... 90% 3,40M 1s + 37500K .......... .......... .......... .......... .......... 90% 17,3M 1s + 37550K .......... .......... .......... .......... .......... 90% 11,2M 1s + 37600K .......... .......... .......... .......... .......... 90% 123M 1s + 37650K .......... .......... .......... .......... .......... 90% 92,4M 1s + 37700K .......... .......... .......... .......... .......... 90% 68,4M 1s + 37750K .......... .......... .......... .......... .......... 90% 62,4M 1s + 37800K .......... .......... .......... .......... .......... 90% 59,1M 1s + 37850K .......... .......... .......... .......... .......... 91% 65,5M 1s + 37900K .......... .......... .......... .......... .......... 91% 55,8M 1s + 37950K .......... .......... .......... .......... .......... 91% 66,4M 1s + 38000K .......... .......... .......... .......... .......... 91% 56,0M 1s + 38050K .......... .......... .......... .......... .......... 91% 61,3M 1s + 38100K .......... .......... .......... .......... .......... 91% 60,9M 1s + 38150K .......... .......... .......... .......... .......... 91% 65,8M 1s + 38200K .......... .......... .......... .......... .......... 91% 57,1M 1s + 38250K .......... .......... .......... .......... .......... 91% 67,8M 1s + 38300K .......... .......... .......... .......... .......... 92% 74,7M 1s + 38350K .......... .......... .......... .......... .......... 92% 26,4M 1s + 38400K .......... .......... .......... .......... .......... 92% 70,8M 1s + 38450K .......... .......... .......... .......... .......... 92% 177M 1s + 38500K .......... .......... .......... .......... .......... 92% 103M 1s + 38550K .......... .......... .......... .......... .......... 92% 96,5M 1s + 38600K .......... .......... .......... .......... .......... 92% 92,9M 1s + 38650K .......... .......... .......... .......... .......... 92% 179M 1s + 38700K .......... .......... .......... .......... .......... 93% 64,0M 1s + 38750K .......... .......... .......... .......... .......... 93% 95,7M 1s + 38800K .......... .......... .......... .......... .......... 93% 69,1M 1s + 38850K .......... .......... .......... .......... .......... 93% 92,3M 1s + 38900K .......... .......... .......... .......... .......... 93% 97,2M 1s + 38950K .......... .......... .......... .......... .......... 93% 80,6M 0s + 39000K .......... .......... .......... .......... .......... 93% 89,0M 0s + 39050K .......... .......... .......... .......... .......... 93% 118M 0s + 39100K .......... .......... .......... .......... .......... 94% 21,5M 0s + 39150K .......... .......... .......... .......... .......... 94% 98,3M 0s + 39200K .......... .......... .......... .......... .......... 94% 25,7M 0s + 39250K .......... .......... .......... .......... .......... 94% 111M 0s + 39300K .......... .......... .......... .......... .......... 94% 64,2M 0s + 39350K .......... .......... .......... .......... .......... 94% 75,8M 0s + 39400K .......... .......... .......... .......... .......... 94% 64,2M 0s + 39450K .......... .......... .......... .......... .......... 94% 72,3M 0s + 39500K .......... .......... .......... .......... .......... 94% 72,0M 0s + 39550K .......... .......... .......... .......... .......... 95% 69,6M 0s + 39600K .......... .......... .......... .......... .......... 95% 75,7M 0s + 39650K .......... .......... .......... .......... .......... 95% 72,5M 0s + 39700K .......... .......... .......... .......... .......... 95% 74,1M 0s + 39750K .......... .......... .......... .......... .......... 95% 69,4M 0s + 39800K .......... .......... .......... .......... .......... 95% 61,5M 0s + 39850K .......... .......... .......... .......... .......... 95% 70,3M 0s + 39900K .......... .......... .......... .......... .......... 95% 76,4M 0s + 39950K .......... .......... .......... .......... .......... 96% 93,7M 0s + 40000K .......... .......... .......... .......... .......... 96% 73,8M 0s + 40050K .......... .......... .......... .......... .......... 96% 11,3M 0s + 40100K .......... .......... .......... .......... .......... 96% 5,42M 0s + 40150K .......... .......... .......... .......... .......... 96% 6,38M 0s + 40200K .......... .......... .......... .......... .......... 96% 37,9M 0s + 40250K .......... .......... .......... .......... .......... 96% 4,09M 0s + 40300K .......... .......... .......... .......... .......... 96% 4,75M 0s + 40350K .......... .......... .......... .......... .......... 97% 3,60M 0s + 40400K .......... .......... .......... .......... .......... 97% 16,7M 0s + 40450K .......... .......... .......... .......... .......... 97% 78,3M 0s + 40500K .......... .......... .......... .......... .......... 97% 10,4M 0s + 40550K .......... .......... .......... .......... .......... 97% 50,6M 0s + 40600K .......... .......... .......... .......... .......... 97% 96,0M 0s + 40650K .......... .......... .......... .......... .......... 97% 101M 0s + 40700K .......... .......... .......... .......... .......... 97% 114M 0s + 40750K .......... .......... .......... .......... .......... 97% 125M 0s + 40800K .......... .......... .......... .......... .......... 98% 81,4M 0s + 40850K .......... .......... .......... .......... .......... 98% 107M 0s + 40900K .......... .......... .......... .......... .......... 98% 107M 0s + 40950K .......... .......... .......... .......... .......... 98% 75,1M 0s + 41000K .......... .......... .......... .......... .......... 98% 108M 0s + 41050K .......... .......... .......... .......... .......... 98% 62,9M 0s + 41100K .......... .......... .......... .......... .......... 98% 51,6M 0s + 41150K .......... .......... .......... .......... .......... 98% 73,4M 0s + 41200K .......... .......... .......... .......... .......... 99% 47,4M 0s + 41250K .......... .......... .......... .......... .......... 99% 87,9M 0s + 41300K .......... .......... .......... .......... .......... 99% 18,0M 0s + 41350K .......... .......... .......... .......... .......... 99% 78,5M 0s + 41400K .......... .......... .......... .......... .......... 99% 78,3M 0s + 41450K .......... .......... .......... .......... .......... 99% 107M 0s + 41500K .......... .......... .......... .......... .......... 99% 73,6M 0s + 41550K .......... .......... .......... .......... .......... 99% 50,9M 0s + 41600K .......... .......... .......... .......... ...... 100% 122M=7,4s + +2014-06-18 13:38:29 (5,52 MB/s) - ‘/home/jwiklund/Documents/.git/annex/tmp/SHA256E-s42645638--4ae41fb29bd26339ea10f53ea2b7cf3132e53d5e8fbfde7b43b912aa52b3d319.tar.gz’ saved [42645638/42645638] + +[2014-06-18 13:38:29 CEST] main: Downloaded git-annex.. upgrade) +(checksum...) +[2014-06-18 13:38:29 CEST] Pusher: Syncing with born +(Recording state in git...) +To ssh://jwiklund@born/store/backup/Documents.annex.1/ + 38006f5..fdae080 git-annex -> synced/git-annex +git-annex version: 5.20140610-g5ec8bcf +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +[2014-06-18 13:38:31 CEST] main: Upgrading git-annex +[2014-06-18 13:38:31 CEST] UpgradeWatcher: A new version of git-annex has been installed. + +Already up-to-date. + +Already up-to-date. + +Already up-to-date. + +Already up-to-date. +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data +channel 4: bad ext data + +# End of transcript or log. +"""]] + +> [[fixed|done]]; the merge race has been fixed. The upgrade loop has also +> been dealt with. --[[Joey]] diff --git a/doc/bugs/files_lost_during_upgrade/comment_1_3f779c4d0c9fb27532b2981bd3ad4eee._comment b/doc/bugs/files_lost_during_upgrade/comment_1_3f779c4d0c9fb27532b2981bd3ad4eee._comment new file mode 100644 index 000000000..b510d92c1 --- /dev/null +++ b/doc/bugs/files_lost_during_upgrade/comment_1_3f779c4d0c9fb27532b2981bd3ad4eee._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 1" + date="2014-06-18T18:12:47Z" + content=""" +So [[bugs/git-annex_auto_upgrade_is_redundant]] strikes again. I have fixed up the versions to avoid this upgrade loop again. I would rather discuss any problems with where the automatic upgrade code puts git-annex in a separate bug report than this one.. (If you're running git-annex as a user that is not allowed to write to the directory where you installed it in the first place then yes, it cannot write there and will instead unpack itself into the home directory.) + +There are many strange things in the log, but this is probably the strangest: + +> fatal: Could not switch to '/home/jwiklund/Documents/.git/annex/merge/': No such file or directory + +This is the gitAnnexMergeDir used for direct mode merges. Since git-annex always creates that directory before starting a merge, I don't know how it could fail to exist. + +Other strange things: + +* The assistant fixes stale index.lock files on startup. But the log shows the assistant starting up and shortly thereafter there's a stale index.lock file. All I can think is that perhaps two git processes are trying to commit at the same time. + +* \"fatal: pathspec 'music.txt' did not match any files\", apparently output by git-add. + +* \"error: duplicate parent 294b61a3dce1e87a62e4d675deac2a9130b819e6 ignored\", which would happen if git-commit-tree were passed duplicate parent refs. AFAICS, the only place in git-annex that might do that is when it commits the git-annex branch. (While this says it's an error, it really is ignored, and git-commit-tree continues and makes a valid commit.) +"""]] diff --git a/doc/bugs/files_lost_during_upgrade/comment_2_80ba8c217e83c9d44a9dc52f4028719d._comment b/doc/bugs/files_lost_during_upgrade/comment_2_80ba8c217e83c9d44a9dc52f4028719d._comment new file mode 100644 index 000000000..b09df4eeb --- /dev/null +++ b/doc/bugs/files_lost_during_upgrade/comment_2_80ba8c217e83c9d44a9dc52f4028719d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-10T19:10:15Z" + content=""" +Looking back at this bug, it's clearly the same race that I later +debugged and fixed in [[bad_merge_commit_deleting_all_files]]. There are instructions in that bug for recovering it. + +In particular, the \"fatal: Could not switch to '/home/jwiklund/Documents/.git/annex/merge/': No such file or directory\" is because of the race; the merge directory is being created and deleted by two contending threads. +"""]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex.mdwn b/doc/bugs/follows_symlinks_to_outside_annex.mdwn new file mode 100644 index 000000000..a58d755a7 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex.mdwn @@ -0,0 +1,3 @@ +I've had a bug report that the assistant follows directory symlinks to elsewhere. I thought it didn't. This needs to be avoided. + +[[fixed|done]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment b/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment new file mode 100644 index 000000000..e532e1b09 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-18T18:22:49Z" + content=""" +Tried to reproduce this, and so far no luck. I tried several symlinks to outside ~/annex, in both direct and indirect mode, and neither the assistant's startup scan nor its inotify handling followed the links and added the content of the directory symlinked to. + +I wonder if [[bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported]] is the same problem. That seems to suggest this happens when merging the symlink into another repository. I am not clear on the details of how to reproduce it yet. +"""]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment b/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment new file mode 100644 index 000000000..1e6d81107 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-18T19:32:06Z" + content=""" +This was the same as the other bug, and only happened on OSX, in the startup scan. +"""]] diff --git a/doc/bugs/forget_corrupts_non-ascii_chars.mdwn b/doc/bugs/forget_corrupts_non-ascii_chars.mdwn new file mode 100644 index 000000000..f4506c228 --- /dev/null +++ b/doc/bugs/forget_corrupts_non-ascii_chars.mdwn @@ -0,0 +1,78 @@ +### Please describe the problem. + +it seems that `git annex forget --drop-dead --force` will double-encode UTF-8 characters. + +### What steps will reproduce the problem? + +Have a remote with an accent in the description. + +### What version of git-annex are you using? On what operating system? + +5.20140412 on debian jessie amd64. + +### Please provide any additional information below. + +[[!format sh """ +anarcat@marcos:video$ git annex info +repository mode: indirect +trusted repositories: 1 + 5adbab10-0f7a-467b-b0d8-5d7af2223103 -- here (backup (anarcat@marcos:/srv/video)) +semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 2d594c02-9164-4ebd-ac47-f8cdc9c16e2f -- rachel@topcrapn:~/Vidéos/anarcat + 2f90b958-95e4-44e3-8d3b-e780b63936d1 -- portable (300GB drive labeled VHS) + 96365189-a0b9-4c33-865f-b573d98572dc -- trouneslo@ifuckinglovecumputers:~/video-anarcat + ae3d62e6-49be-4340-ba25-c8736a1637c4 -- anarcat@angela:~/video +untrusted repositories: 1 + f6a70cfe-0ee4-4762-9f1d-b7b545fbd856 -- External hard drive labeled VHS +transfers in progress: none +available local disk space: 14.29 gigabytes (+10 gigabytes reserved) +local annex keys: 4110 +local annex size: 991.85 gigabytes (+ 2 unknown size) +annexed files in working tree: 4108 +size of annexed files in working tree: 1.01 terabytes (+ 2 unknown size) +bloom filter size: 16 mebibytes (0.8% full) +backend usage: + SHA256E: 8214 + URL: 4 +anarcat@marcos:video$ git annex dead f6a70cfe-0ee4-4762-9f1d-b7b545fbd856 +dead f6a70cfe-0ee4-4762-9f1d-b7b545fbd856 ok +(Recording state in git...) +anarcat@marcos:video$ git annex unused +unused . (checking for unused data...) (checking HEAD...) (checking synced/master...) (checking backup/master...) (checking portable/annex/direct/master...) (checking portable/master...) (checking portable/synced/master...) (checking steph/master...) (checking steph/synced/master...) (checking video/synced/master...) ok +anarcat@marcos:video$ git annex forget --drop-dead --force +forget git-annex (Recording state in git...) +ok +(Recording state in git...) +anarcat@marcos:video$ git annex info +repository mode: indirect +trusted repositories: (merging synced/git-annex backup/git-annex backup/synced/git-annex portable/git-annex portable/synced/git-annex steph/git-annex video/synced/git-annex into git-annex...) +(Recording state in git...) +(Recording state in git...) +1 + 5adbab10-0f7a-467b-b0d8-5d7af2223103 -- here (backup (anarcat@marcos:/srv/video)) +semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 2d594c02-9164-4ebd-ac47-f8cdc9c16e2f -- rachel@topcrapn:~/Vidéos/anarcat + 2f90b958-95e4-44e3-8d3b-e780b63936d1 -- portable (300GB drive labeled VHS) + 96365189-a0b9-4c33-865f-b573d98572dc -- trouneslo@ifuckinglovecumputers:~/video-anarcat + ae3d62e6-49be-4340-ba25-c8736a1637c4 -- anarcat@angela:~/video +untrusted repositories: 0 +transfers in progress: none +available local disk space: 14.25 gigabytes (+10 gigabytes reserved) +local annex keys: 4110 +local annex size: 991.85 gigabytes (+ 2 unknown size) +annexed files in working tree: 4108 +size of annexed files in working tree: 1.01 terabytes (+ 2 unknown size) +bloom filter size: 16 mebibytes (0.8% full) +backend usage: + SHA256E: 8214 + URL: 4 +# End of transcript or log. +"""]] + +well that's interesting - the above paste is broken by ikiwiki as well... in the text area where i paste it, "rachel@topcrapn:~/Vidéos/anarcat" shows up as "rachel@topcrapn:~/Vidéos/anarcat" but when i preview, the character gets corrupted. and obviously, the second instance then gets *double* corrupted - wheepee. the original paste has "rachel@topcrapn:~/Vidéos/anarcat". --[[anarcat]] + +> [[fixed|done]]; writes to git-annex branch now preserve the original +> encoding, and I've tested that lots of interesting unicode is preserved +> across a forget run. --[[Joey]] diff --git a/doc/bugs/forget_corrupts_non-ascii_chars/comment_1_fc8a4a93be2c234567836a4acee90957._comment b/doc/bugs/forget_corrupts_non-ascii_chars/comment_1_fc8a4a93be2c234567836a4acee90957._comment new file mode 100644 index 000000000..1431f85bb --- /dev/null +++ b/doc/bugs/forget_corrupts_non-ascii_chars/comment_1_fc8a4a93be2c234567836a4acee90957._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 1" + date="2014-05-16T14:36:09Z" + content=""" +this eventually completely breaks with: + +[[!format txt \"\"\" +anarcat@marcos:video$ git annex info --fast +repository mode: indirect +trusted repositories: 2 + 31912b57-62a5-475c-87a7-582b5492a216 -- WD green 1.5TB backup drive + 5adbab10-0f7a-467b-b0d8-5d7af2223103 -- here (main (anarcat@marcos:/srv/video)) +semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 2d594c02-9164-4ebd-ac47-f8cdc9c16e2f -- rachel@topcrapn:~/Vid +git-annex: : commitBuffer: invalid argument (invalid character) +failed +git-annex: info: 1 failed +\"\"\"]] +"""]] diff --git a/doc/bugs/forget_corrupts_non-ascii_chars/comment_2_31f9362619dee0b8ebae80694ae1b2d0._comment b/doc/bugs/forget_corrupts_non-ascii_chars/comment_2_31f9362619dee0b8ebae80694ae1b2d0._comment new file mode 100644 index 000000000..6c62a91cb --- /dev/null +++ b/doc/bugs/forget_corrupts_non-ascii_chars/comment_2_31f9362619dee0b8ebae80694ae1b2d0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 2" + date="2014-05-27T17:58:35Z" + content=""" +Notice that the filename is corrupted from the beginning; all writes to the git-annex branch truncated characters to 8 bits. The rest just followed from that. +"""]] diff --git a/doc/bugs/forget_corrupts_non-ascii_chars/comment_3_6310ae21036582688881f1890a5c4643._comment b/doc/bugs/forget_corrupts_non-ascii_chars/comment_3_6310ae21036582688881f1890a5c4643._comment new file mode 100644 index 000000000..de949dc30 --- /dev/null +++ b/doc/bugs/forget_corrupts_non-ascii_chars/comment_3_6310ae21036582688881f1890a5c4643._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 3" + date="2014-05-29T16:09:38Z" + content=""" +awesome, thanks! +"""]] diff --git a/doc/bugs/forwarded.mdwn b/doc/bugs/forwarded.mdwn new file mode 100644 index 000000000..1a544a4f7 --- /dev/null +++ b/doc/bugs/forwarded.mdwn @@ -0,0 +1,2 @@ +This tag is for bugs that have been forwarded from git-annex to some other +software, such as a library it uses. diff --git a/doc/bugs/fsck_giving_false_checking_information.mdwn b/doc/bugs/fsck_giving_false_checking_information.mdwn new file mode 100644 index 000000000..b22ac1c66 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. +When a repository has no object of a given file and git annex fsck is run it still shows "fsck file ok", which is missleading in the sense, that it gives the impression that it checked the file is alright/checksummed. + +As a result of this it seems that incremental fscks are not incremental with non checkable objects. On each run (after the first one) with "git annex fsck --incremental --more --schedule-limit 1d" all files without objects are checked even so it should wait another day till it checks again. + +Probably best to say checksum couldn't be checked on x files (only give that as quiet output, not every check) + +Another thing, which came up as a problem was, that checksum fsck would not be wanted to run as often as numcopie checks. +When the incremental fsck is used to check for bad files "git annex fsck --incremental --more --limit 1m" after a fast numcopies check "git annex fsck --incremental --more --limit 1m fast" it messes up the actual bad files check. +As both are currently using the same incremental "lock"-file they are colliding. + +### What steps will reproduce the problem? +- + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment b/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment new file mode 100644 index 000000000..af198c722 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.207.34" + subject="Earlier version syntax was removed" + date="2014-02-17T16:05:34Z" + content=""" +In earlier versions I noticed that when checksumming it would give back \"fsck file (checksum...) ok\" instead of \"fsck file ok\", which is at least better than not differentiating. This should definitely be improved. Perhaps even clearer than the (checksum...) notice. + +But still the incremental run not being incremental and not taking into account the schedule-limit seems strange. +"""]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment b/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment new file mode 100644 index 000000000..838471598 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-20T20:11:36Z" + content=""" +You're only meant to use one of --incremental, or --more, or --incremental-schedule at a time. I have made fsck refuse to accept combinations of those options. + +What was happening is that, since you didn't understand the documentation (which is possibly not as clear as it could be; I have tried to improve it now), the --incremental option you passed dominated all the other options, and made it start a *new* incremental fsck each time. Which means it started from the beginning and fscked every file until you stopped it. + +I agree that it would be better if fsck --fast --incremental did not collide with fsck --incremental. There is already a bug about that: [[incremental fsck should not use sticky bit]]. + +Finally, I agree that losing the \"(checksum)\" made fsck output less informative. Although I don't think it is needed in the `git annex add` output. I have made it be shown in only the fsck output. +"""]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment b/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment new file mode 100644 index 000000000..27de72358 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Great improvements" + date="2014-02-20T21:20:15Z" + content=""" +Thanks for clearing it up. It is still a bit confusing that you have to differentiate on the second run. (using --more) I probably view it as inconvenient as it make me have to remember the first and second time of running a command. I think it would be cleaner to have \"--incremental\" always skipping files and \"--incremental restart\" start from the beginning. + +Ah great yeah they are different functions and should therefore not interfere. (fsck --fast --incremental) + +Great that the checksum is back in and yeah I agree that it isn't really needed in the add command. + + +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn new file mode 100644 index 000000000..260ab9981 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn @@ -0,0 +1,48 @@ +### Please describe the problem. +I followed the tip on [fully encrypted git repositories with gcrypt](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create encrypted git-annex repository on a ssh server. When I try to checkout the repository, things break as follows: + +`git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo` + +works as expected but when in the myrepo directory, + +`git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo` + +issues the following text (among normal messages): + +`git-annex-shell: gcryptsetup permission denied` + +Then while the links are there, + +`git annex get --from encryptedrepo` + +does nothing (in the sense that the content is not retrieved). + +This seems to have everything to do with git-annex-shell as the exact same manipulations but with a local repository work perfectly. Unfortunately, I don't know haskell so [this code](https://github.com/joeyh/git-annex/blob/master/Command/GCryptSetup.hs) is cryptic to me. I can guess there is a problem getting the uuid of the repository, but as far as I can tell the bare distant repo looks fine. + +### What steps will reproduce the problem? + +Create a standard git annex local repository and then follow the [fully encrypted git repositories with gcrypt tip](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create an encrypted git-annex repository on a ssh server. Then follow the instructions in the same tip to clone the remote repository. + +### What version of git-annex are you using? On what operating system? +Both computers run ubuntu 12.04 with all updates and the latest git annex from the ppa, that is: + +git-annex version: 4.20131024 + +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment new file mode 100644 index 000000000..6312a58a5 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T19:46:28Z" + content=""" +It seems to me that the `git-annex-shell` on the remote system must be too old a version to support the gcryptsetup command. You can check this by running `git-annex-shell` there and seeing if it lists gcryptsetup in its usage message. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment new file mode 100644 index 000000000..f2fb4f14f --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 2" + date="2013-11-02T21:53:37Z" + content=""" +The git-annex version on the remote server is the same as the one on the client, the latest one available from the ppa (4.20131024). When I run git-annex-shell on both computers, I obtain: +[[!format sh \"\"\" +git-annex-shell: bad parameters + +Usage: git-annex-shell [-c] command [parameters ...] [option ...] + +Plumbing commands: + +commit DIRECTORY commits any staged changes to the git-annex branch +configlist DIRECTORY outputs relevant git configuration +dropkey DIRECTORY KEY ... drops annexed content for specified keys +gcryptsetup DIRECTORY VALUE sets up gcrypt repository +inannex DIRECTORY KEY ... checks if keys are present in the annex +recvkey DIRECTORY KEY runs rsync in server mode to receive content +sendkey DIRECTORY KEY runs rsync in server mode to send content +transferinfo DIRECTORY KEY updates sender on number of bytes of content received +\"\"\"]] + +Both sides seem to understand the gcryptsetup action. Actually, the message gcryptsetup permission denied comes from git-annex-shell, as far as I understand (and from the haskell source linked in the report). +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment new file mode 100644 index 000000000..863f401ce --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T23:51:13Z" + content=""" +I should have looked at that error message more closely. The gcryptsetup command will print a permission denied if the repository it's being run in already has a annex.uuid or already has a gcrypt id. Probably that latter needs to be relaxed for enableremote to work. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment new file mode 100644 index 000000000..e1049ce60 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-11-03T00:15:30Z" + content=""" +While I've fixed this bug, in my testing the bug only caused git-annex to fall back to accessing the remote repository using rsync, rather than using git-annex-shell to talk to it, and so `git annex get --from encryptedrepo` was able to retrieve files that were stored in that remote despite the bug. That may have failed for you for some other reason. + +You can set git.encryptedrepo.annex-gcrypt to to \"true\" to make it use the degraded rsync mode, or to \"shell\" to make it use git-annex-shell. Setting it to shell should be all that you need to do to recover from (or indeed, work around this bug). +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment new file mode 100644 index 000000000..137638aa5 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 5" + date="2013-11-03T11:24:28Z" + content=""" +There is something very strange that I did not notice in my first report. When I try `git annex get --from encryptedrepo` nothing happens in the sense that git annex is not even trying to connect to the remote (no ssh connection attempt) while git.encryptedrepo.annex-gcrypt is set to true. When I set it to shell, nothing happens either. + +Another thing I did not report is that I tried the exact same manipulations with another server on which git annex is not installed. The `gcryptsetup permission denied` message was replaced by a `git-annex-shell not found` (or something similar), as expected. But the rest of the behavior was the same: no way to get the actual content with `git annex get --from`. Again, all of this is with 4.20131024, not with the ongoing version. + +I'll try got do more test with the new version. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment new file mode 100644 index 000000000..0ad9768f6 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-04T17:12:05Z" + content=""" +It's entirely normal for `git annex get --from remote` to skip files that it does not think are present on the remote. + +What does `git annex whereis` say? +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment new file mode 100644 index 000000000..3a24f4349 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 7" + date="2013-11-04T18:54:54Z" + content=""" +`git annex whereis` says the files are not on the remote git, while they are because of the copy. If I do _exactly_ what's on the tip, that is if I clone the encrypted git just after having done `git annex copy --to encryptedbackup`, the remotes seems to ignore that it has the data. To have it working, I had to call `git annex sync` (push will do, I guess) in the original remote after doing the `git annex copy`. Then I can `git pull` and `git annex whereis` knows where the files are (or I can clone the encrypted remote after doing the sync/pull). + +It seems a bit strange that the copy command does not record the propagation of the file to the encrypted git. I guess this is because gcrypt is the only special remote that stores also the git part, right? Would that be a good idea (and possible) to handle it in a special way? + +Thanks Joey for everything, by the way, both the software and the amazing support via email and the website. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment new file mode 100644 index 000000000..da2fef585 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 8" + date="2013-11-04T19:14:04Z" + content=""" +Right -- Normally a special remote doesn't include a git repository. And when using a regular git remote, `git-annex-shell` is used to receive files into the repository and it records immediately that the repo has the file so there's no need to sync in that case. So gcrypt is special in this way. + +For now, I have fixed the tip to show syncing after sending files to gcrypt. It might be the case that it would make sense to do a push of the git-annex branch automatically in that case, will have to think about that and see if people get tripped up on this. +"""]] diff --git a/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git.mdwn b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git.mdwn new file mode 100644 index 000000000..47ee6ed81 --- /dev/null +++ b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +When trying to create a repository—i.e., running it for the first time—I get this error message: + +> user error (git ["--git-dir=(path)/.git","--work-tree=(path)","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904","--no-gpg-sign"] exited 128) + +It _seems_ that it's because the bundled `git` executable isn't used, and instead `/usr/bin/git` is; and it's too old to support the `--no-gpg-sign` flag. + + +### What steps will reproduce the problem? + +Run `git-annex.app` for the first time and give it a path. + + +### What version of git-annex are you using? On what operating system? + + $ /Applications/Git-Annex.app/Contents/MacOS/git-annex version + git-annex version: 5.20140707-gf0c48e8 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + + +### Please provide any additional information below. + +`…/.git/annex/daemon.log` doesn't exist + + $ tree -a + . + ├── .DS_Store + └── .git + ├── HEAD + ├── annex + │   ├── index + │   ├── misctmp + │   ├── sentinal + │   └── sentinal.cache + ├── config + ├── hooks + │   └── pre-commit + ├── objects + │   ├── 4b + │   │   └── 825dc642cb6eb9a060e54bf8d69288fbee4904 + │   ├── info + │   └── pack + └── refs + ├── heads + └── tags + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_1_73924adc1c3c0dca5adce9a5e1740e48._comment b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_1_73924adc1c3c0dca5adce9a5e1740e48._comment new file mode 100644 index 000000000..888ef1e4a --- /dev/null +++ b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_1_73924adc1c3c0dca5adce9a5e1740e48._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-08T16:44:32Z" + content=""" +No, it's using it, it seems the version of git in the OSX build does not support that option. + +I am going to fix the version problem, and update yesterday's OSX release with the fix. +"""]] diff --git a/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_2_81c2896c9dfe5d96ad5a8f40cb312790._comment b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_2_81c2896c9dfe5d96ad5a8f40cb312790._comment new file mode 100644 index 000000000..fef971218 --- /dev/null +++ b/doc/bugs/git-annex.app_doesn__39__t_seem_to_use_the_bundled_git/comment_2_81c2896c9dfe5d96ad5a8f40cb312790._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn0aWOz5xMj5VuexPl55h7IasQnsh7sVwE" + nickname="Andy" + subject="It works now" + date="2014-07-08T22:47:07Z" + content=""" +You were right, it was an old git. I could have sworn it worked, but I must've got the versions mixed up because it didn't earlier. + +Anyway, after updating, everything works fine. Thankyou! +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn new file mode 100644 index 000000000..6374844a1 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +git-annex will randomly crash. + +### What steps will reproduce the problem? +Unknown. Keeping git-annex running for an extended period, failing to sync properly on XMPP(not sure if that is relevant, but given this haven't been found before it might be) + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130521-g20710d4 (And multiple prior versions) + +### Please provide any additional information below. + +.git/annex/daemon.log upload: http://paste.ubuntu.com/5694813/ + +I could find no debug.log? + +> [[!taglink moreinfo]] until it's reproduced with a current version.. --[[Joey]] + +>> Note that this seems like a similar untrappable crash as [[git_annex_daemon_crashes_when_authenticating_with_jabber.de]]. --[[Joey]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment new file mode 100644 index 000000000..3300f17b9 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-24T15:50:45Z" + content=""" +I have seen this once on a similar system (family computer; XMPP being used). Unfortunatly it could be coming from anywhere -- and it's not at all clear how a crash in one thread could take it all down, since there are global top-level per-thread exception handlers that should run and log which thread crashed -- and normally seem to do this quite well. + +I may need to make a management process that ensures the assistant stays alive. + +I have also seen this happen when a computer is shutting down. But presumably in that case it's not really a bug. + +One thing you might try is see what is using socket 16 when it's running, assuming the socket will be the same. (Also, if you've had repeated crashes, it would be good to know if it's 16 each time..). You could do this by looking at `/proc/$pid/fd/16` Also, check the old logs, `.git/annex/daemon.log.*` +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment new file mode 100644 index 000000000..b575ce977 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="It did it again." + date="2013-05-25T09:31:23Z" + content=""" +And this time it was socket 27. + +Sadly happened during the night and I didn't monitor the socket when it happened. + +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment new file mode 100644 index 000000000..bccfae0d9 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-27T05:03:05Z" + content=""" +I got a similar crash: + +
+fd:19: hGetLine: end of file
+fd:18: hFlush: resource vanished (Broken pipe)
+fd:18: hFlush: resource vanished (Broken pipe)
+
+ +I was able to determine that fd 18/19 is reliably used for one of the git cat-file processes on this system. It's quite likely that fd 16/17 would be similar. fd 27 less likely. (But could easily be some other less long running git command.) + +This would be consistent with git cat-file crashing as it's trying to write to it and read from it. + +This took down the transferscanner thread, but the assistant continued running. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment new file mode 100644 index 000000000..aa3a2a307 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-27T15:31:53Z" + content=""" +I tried, as an experiment, killing on of the `git cat-file` child processes of the assistant. As hypothesized, that led to the same thing I saw logged before. + +So, why might git commands be dying, and which commands? It would be pretty easy for git-annex to detect git cat-file dying, and restart it. Other commands would be more difficult. Still this might be a git bug which would best be fixed there. It would be good to get a core dump from git. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment new file mode 100644 index 000000000..2288b1d84 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-31T18:17:59Z" + content=""" +It will now detect if any of the long-running git processes crash, and automatically restart them. I don't know if this addresses the crash that was originally reported. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment new file mode 100644 index 000000000..447e9d80e --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-06-14T18:15:27Z" + content=""" +Tobias, have you seen this at all since the last release. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment new file mode 100644 index 000000000..5d567ae8e --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 7" + date="2013-06-14T21:26:25Z" + content=""" +I'm sure i can still provoke it on some of my machines. But this weekend is completely blocked for me. + +I'll update everything to latest and give you an updated log. But will probably not happen till the middle of next week. + + +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment new file mode 100644 index 000000000..b44164a89 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 8" + date="2013-06-29T09:34:02Z" + content=""" +I haven't been able to replicate this on two of my computers with the latest git-annex(as of this message). + +It seemed to happen more on my Mac OS X Lion though. And nightlies haven't been build for some time. + +So i'm waiting for a updated package for OS X. If you would rather clean up feel free to close this, I can just open it again if i hit it again. + +"""]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__.mdwn b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__.mdwn new file mode 100644 index 000000000..279ca3a3b --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. +git-annex crashes with "git-annex: createSession: permission denied (Operation not permitted)" when creating the first repository. Trying to start git-annex webapp after that crashes again. + +### What steps will reproduce the problem? +* Download standalone tarball +* Unpack +* Go to new folder, call "git-annex webapp" +* Click Make repository + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140606-g48793b6 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + +Ubuntu 14.04 LTS + +Linux eee 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:02:19 UTC 2014 i686 i686 i686 GNU/Linux + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ git-annex webapp +Launching web browser on file:///tmp/webapp3414.html +git-annex: createSession: permission denied (Operation not permitted) +WebApp crashed: createSession: permission denied (Operation not permitted) +$ +# End of transcript or log. +"""]] + +> provisionally fixed; [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_1_b7a327b668e2ca053713bec1dc4e6314._comment b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_1_b7a327b668e2ca053713bec1dc4e6314._comment new file mode 100644 index 000000000..abd79e0f7 --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_1_b7a327b668e2ca053713bec1dc4e6314._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-09T18:46:01Z" + content=""" +createSession just calls the unix `setsid` system call. + +I have not been able to reproduce this problem using git-annex here. I suspect setsid is probably failing because git-annex is already a process group leader due to the way it was run. In this case, it should just ignore the setsid failure, which I've made it do. + +This change will be available in the standalone tarball within an hour if you want to test it. + + +"""]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_2_8864149bd87f7956143109ab591afe4f._comment b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_2_8864149bd87f7956143109ab591afe4f._comment new file mode 100644 index 000000000..a4cdf367f --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_2_8864149bd87f7956143109ab591afe4f._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 2" + date="2014-06-09T21:16:36Z" + content=""" +Thanks for the fix. The new tarball does not show the issue anymore. + +Regarding \"due to the way it is run\": + +* I use Konsole as my terminal under xfce, inside of that is bash +* I made sure that I removed old stuff beforehand \"rm -rf .config/git-annex/ Desktop/annex/ .ssh/git-annex-*\" +* I went to the directory in the tarball \"git-annex.linux\" and called \"./git-annex webapp\" +* Browser used is firefox + +I guess I should setup the PATH properly. This was just meant as a test for the tarball given that there is no up to date package for ubuntu available anymore. + +Not sure if there is other information that would help you determine if I run this in a special way. +"""]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_3_1229d5ea8799f0a744b3f03f620df1ec._comment b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_3_1229d5ea8799f0a744b3f03f620df1ec._comment new file mode 100644 index 000000000..08e5d21e7 --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_3_1229d5ea8799f0a744b3f03f620df1ec._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9SYh6N-JUMkYkW4aOk55zC3Vr9KonDV4" + nickname="Florian" + subject="comment 3" + date="2014-06-11T18:29:38Z" + content=""" +I'm having the exact same issue on Arch. + +You said this fix was in the tarballs in one hour, which was almost two days ago. Are you refering to these downloads: http://downloads.kitenet.net/git-annex/linux/current/ I just wonder, because these show mtime of 5 days ago. + +Thx! +"""]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_4_975d2631faa17d257a6fce40e24a6e3b._comment b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_4_975d2631faa17d257a6fce40e24a6e3b._comment new file mode 100644 index 000000000..5048cad9b --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_4_975d2631faa17d257a6fce40e24a6e3b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 4" + date="2014-06-11T19:47:35Z" + content=""" +For me the autobuilt tarball works. Go to this page: http://git-annex.branchable.com/install/Linux_standalone/. Right before the comments start is a list of the different autobuilt tar balls. + +I assume that this fix will appear in the regular tarballs with the next release. + +Dirk + + +"""]] diff --git a/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_5_013be36151fc710ec30756b0f68f43dc._comment b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_5_013be36151fc710ec30756b0f68f43dc._comment new file mode 100644 index 000000000..358a820bf --- /dev/null +++ b/doc/bugs/git-annex:_createSession:_permission_denied___40__Operation_not_permitted__41__/comment_5_013be36151fc710ec30756b0f68f43dc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="package in debian backports shows the same error mesage" + date="2014-07-08T19:25:19Z" + content=""" +I upgraded recently (on wheezy) to package 5.20140529~bpo70+2 and when I to access the webapp I get: + + mezzo:~$ git-annex webapp + git-annex: createSession: permission denied (Operation not permitted) + +"""]] diff --git a/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn new file mode 100644 index 000000000..0d773b52c --- /dev/null +++ b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn @@ -0,0 +1,51 @@ +[[!tag moreinfo]] + +### Please describe the problem. + +git-annex webapp won't run + +### What steps will reproduce the problem? + +[[!format sh """ +arthur@machine:~/annex$ git-annex --debug webapp +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","git-annex"] +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..a2b8f10ef258dff1a91e0354b2e2a58241631c9a","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..8d4b8e04ccf0092d625f680b42e73d7bf15c6517","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..6b2665208c11c9ecf969294bf45baac31894d8a7","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..9d8429668f2148ea43760fb430e5950fbf42751e","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] chat: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","cat-file","--batch"] + +git-annex: fd:14: hGetLine: end of file +failed +[2013-07-29 15:02:15 CEST] read: ssh ["-O","stop","-S","/home/arthur/annex/.git/annex/ssh/arthur@git-annex-hostname-arthur_annex","-o","ControlMaster=auto","-o","ControlPersist=yes","arthur@git-annex-hostname-arthur_annex"] +git-annex: webapp: 1 failed +"""]] + + +### What version of git-annex are you using? On what operating system? + + +$ git-annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +$ git --version +git version 1.7.9.5 + + +### Please provide any additional information below. + + diff --git a/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment new file mode 100644 index 000000000..b7fc68ffd --- /dev/null +++ b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T19:00:43Z" + content=""" +You have a somewhat out of date version there. Can you please try again with a newer version? There have been several fixes to bugs that could present like this. +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn new file mode 100644 index 000000000..976109c79 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn @@ -0,0 +1,13 @@ +What steps will reproduce the problem? + Start "./git-annex-webapp" + +What is the expected output? What do you see instead? + The webapp should start, but I get the error "git-annex: getUserEntryForID: failed (Success)" + +What version of git-annex are you using? On what operating system? + 3.20121017 on "Ubuntu 10.04.4 LTS" 32-Bit + +Please provide any additional information below. + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment new file mode 100644 index 000000000..ef8800c21 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.118" + subject="comment 1" + date="2012-10-25T18:52:52Z" + content=""" +This means it has been unable to look up your home directory in /etc/passwd. I wonder, are you using NIS or a similar thing that keeps your user entry out of /etc/passwd? +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment new file mode 100644 index 000000000..dde7c0814 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 2" + date="2012-10-25T21:29:05Z" + content=""" +Yes, the system is using LDAP as user backend... Any idea how I can use git-annex with LDAP as user backend? +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment new file mode 100644 index 000000000..3b358b7ea --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.118" + subject="comment 3" + date="2012-10-25T22:18:55Z" + content=""" +Well, git-annex needs to know the user name, and the home directory. I've made it use +USER, and HOME, when set, and only fall back to getpwent otherwise. +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment new file mode 100644 index 000000000..63c3b474a --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 4" + date="2012-10-26T05:49:47Z" + content=""" +I think you mean the environment variables with \"use USER, and HOME\"? So I checked them I they are correct. +Reading man(3) getpwent says \"from the password database (e.g., the local password file /etc/passwd, NIS, and LDAP)\", so it should be no problem with the LDAP backend I'm using to log-in... +One other special thing: The home directory is on a NFS share. +"""]] diff --git a/doc/bugs/git-annex_annex_repo_not_found.mdwn b/doc/bugs/git-annex_annex_repo_not_found.mdwn new file mode 100644 index 000000000..1a2998f05 --- /dev/null +++ b/doc/bugs/git-annex_annex_repo_not_found.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +The git-annex annex repo at is not available. This is the address mentioned at . + +### What steps will reproduce the problem? + + $ git clone https://downloads.kitenet.net/.git/ + Cloning into 'downloads.kitenet.net'... + fatal: repository 'https://downloads.kitenet.net/.git/' not found + +### Please provide any additional information below. + +Have tried various combinations of the URL, but nothing works. It was like this a week ago too, but I didn't report it because I thought it was a temporary error due to some server reconfiguration or something. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn b/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn new file mode 100644 index 000000000..582a8edee --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. + +Hi, + +On OSX the web-app keeps notifying me of an upgrade, I choose to run it but nothing seems to happen. + +The debug logs show that the upgrade is skipped as it's redundant. + +### What steps will reproduce the problem? + +Have upgrades set to notify. + +### What version of git-annex are you using? On what operating system? + +Current. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2014-04-25 08:26:30 BST] Upgrader: An upgrade of git-annex is available. (version 5.20140421) +[2014-04-25 08:27:02 BST] main: Skipping redundant upgrade + +# End of transcript or log. +"""]] + +[[!meta title="upgrade loop when info file contains newer version than distributed version of git-annex"]] + +[[!tag confirmed]] + +> [[fixed|done]]; the release process now uses versions from build-version +> files that are created by the autobuilders, so should always be accurate. +> --[[Joey]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment new file mode 100644 index 000000000..be27aa0d9 --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_1_67cdbedc70695d1e4be81e59ab9b87bd._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2014-04-25T07:36:09Z" + content=""" +The upgrade notifications seem to appear when switching between repositories in the web-app - are repositories treated separately? Or perhaps notifications sent per repo? + +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment new file mode 100644 index 000000000..1b4c0505d --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_2_3a8041ce622b9288261fab57ecb87c28._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 2" + date="2014-04-25T13:25:43Z" + content=""" +i think this problem was quickly mentionned in [[devblog/day_157__upgrade_checking]], can you provide a full debug log? +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment new file mode 100644 index 000000000..22c8986b7 --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_3_2597b2008557b80f4b71630c5c4a4241._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 3" + date="2014-04-26T20:26:35Z" + content=""" +I'm pretty sure that was the sum total of the log (even with debug on). Only the brevity of it makes me doubt myself. +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment new file mode 100644 index 000000000..7bd1ec883 --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_4_5dc46103994f064f5b9e120a16317dbd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 4" + date="2014-04-27T00:02:41Z" + content=""" +What version of git-annex do you have running? + +I suspect that if you look around, you will find you have a git-annex-5.20140421 directory in either your home directory or next to where you installed the DMG. +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment new file mode 100644 index 000000000..65c6b05c6 --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_5_e26cf6fa6358c8d53c0b16206d0d0ca6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 5" + date="2014-04-27T11:10:49Z" + content=""" +Hi, + +Yes there is a git-annex.app.5.20140421 directory in $HOME. And it looks as though I'm running git-annex.app.5.20140420 - even though I manually tried to upgrade by downloading + +https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg + +Running `$HOME/git-annex.app.5.20140421/.../git-annex` gives me `5.20140420-ga25b8bb`. So the downloaded version even though labeled 5.20140421 contains 5.20140420. +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment new file mode 100644 index 000000000..3092626e6 --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_6_c2c7c071fc5b1d3a55254d01a287c9f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 6" + date="2014-04-27T11:14:40Z" + content=""" +And I still think there is a slight bug in there somewhere. If due to packaging errors an upgrade doesn't apply and the logs are smart enough to notice it's redundant then there shouldn't be continued notifications of an available upgrade... +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_7_85e8a286d6b1ec5212614c36bf54addb._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_7_85e8a286d6b1ec5212614c36bf54addb._comment new file mode 100644 index 000000000..3586aca7f --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_7_85e8a286d6b1ec5212614c36bf54addb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 7" + date="2014-05-16T17:54:38Z" + content=""" +I've temporarily worked around this by updating the .info file for OSX to have the right version number. + +I think that my release process generally manages to avoid version skew, but not always. And it's most likely to happen for OSX since that autobuilder only runs once per day. +"""]] diff --git a/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_8_2b2152844612d83f295a5de02f6ed3e7._comment b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_8_2b2152844612d83f295a5de02f6ed3e7._comment new file mode 100644 index 000000000..9dc7257fa --- /dev/null +++ b/doc/bugs/git-annex_auto_upgrade_is_redundant/comment_8_2b2152844612d83f295a5de02f6ed3e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 8" + date="2014-05-16T18:00:18Z" + content=""" +So what do we as end-users do to get the latest version now? Re-download? +"""]] diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn new file mode 100644 index 000000000..718170a98 --- /dev/null +++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. + +I have found a really weird commit in my git-annex branch: + + * a59dd1c update (il y a 8 heures) + * 57f887a update (recovery from race) (recovery from race) (recovery from race) [...] + +it repeats that for a looong time. about 12 000 times, to be more precise: + +[[!format sh """ +anarcat@marcos:video$ git show 57f887a | wc + 5 12686 88850 +"""]] + +### What steps will reproduce the problem? + +Now i have absolutely no idea how I managed that. I got through some pretty dark moments last night trying various levels of git-annex voodoo (including a duplicate repo which was rsync'd to a backup drive so the unique identifier applied to two distinct paths), so I have no idea exactly what happened here. + +### What version of git-annex are you using? On what operating system? + +debian jessie amd64 5.20140412 + +### Please provide any additional information below. + +[[!format sh """ +anarcat@marcos:video$ git show 57f887a | tail -c 100 +very from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) +anarcat@marcos:video$ git show 57f887a | head -c 512 +commit 57f887a9d766829d00832ad1ee23b2785212d055 +Author: Antoine Beaupré +Date: Sat Apr 19 01:48:18 2014 -0400 + + update (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery +"""]] + +that's 80KB for only one commit here - maybe that should be cleaned up? --[[anarcat]] + +Ah! more information: it seems that 01:48 was the moment i shutdown the assistant in yet another panic... + +[[!format sh """ +anarcat@marcos:video$ ls -al .git/annex/daemon.log* +-rw-r--r-- 1 anarcat anarcat 17075 avril 19 09:28 .git/annex/daemon.log +-rw-r--r-- 1 anarcat anarcat 128367 avril 19 01:48 .git/annex/daemon.log.1 +"""]] + +an extract from that second logfile: + +[[!format sh """ +19/Apr/2014:01:31:38 -0400 [Error#yesod-core] unknown response from git cat-file ("9a73bf01-ed01-450d-a0ab-f20fff47ed32 encryption=none name=stephc rsyncurl=192.168.0.104:video/ type=rsync timestamp=1397865844.925354s","refs/heads/git-annex:remote.log") @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) +19/Apr/2014:01:31:50 -0400 [Error#yesod-core] unknown response from git cat-file ("fe428a7a-25a2-4c2e-b01f-315c490cbe45 encryption=none name=myrsync rsyncurl=/home/anarcat/video/ type=rsync timestamp=1397868063.038898s","refs/heads/git-annex:remote.log") @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) +19/Apr/2014:01:31:57 -0400 [Error#yesod-core] unknown response from git cat-file ("","refs/heads/git-annex:remote.log") @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) +[2014-04-19 01:32:03 EDT] TransferScanner: Syncing with test, mnt +Depuis /mnt/video + * [nouvelle branche] synced/git-annex -> test/synced/git-annex + * [nouvelle branche] synced/master -> test/synced/master +fatal: 'mnt' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +Already up-to-date. +[2014-04-19 01:32:21 EDT] main: warning git-annex has been shut down + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +"""]] + +the last line repeats about 4000 times. + +i would love to paste the daemon.log.1 file, but it seems like it containts encryption credentials... which i have no idea how to get rid of or change. + +[[!tag moreinfo]] diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_1_b83888a98075125dd043f323c99da03b._comment b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_1_b83888a98075125dd043f323c99da03b._comment new file mode 100644 index 000000000..75bfd7368 --- /dev/null +++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_1_b83888a98075125dd043f323c99da03b._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-20T17:11:02Z" + content=""" +Is there one commit with this long message, or 12 thousand commits each adding another (recovery from race) to the pyramid? + +
+ - 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.
+
+ +If there is only one message, then it must have tried 12k times to commit to the git-annex branch and each time something else pushed or commited to the git-annex branch and overwrote its commit. This seems statistically unlikely. (Also there's locking to prevent multiple local git-annex processes from committing at the same time.) + +There have been a few other unexplained reports of this race detection code repeatedly triggering. + +> \"shutdown the assistant in yet another panic\" + +This implies some hasty, perhaps unusual shutdown method, and some unusual situation. I think you could tell me more about what was going on. +"""]] diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_2_4a7d824b6e75693cf47f6efbf2c99e2e._comment b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_2_4a7d824b6e75693cf47f6efbf2c99e2e._comment new file mode 100644 index 000000000..0eeabf070 --- /dev/null +++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog/comment_2_4a7d824b6e75693cf47f6efbf2c99e2e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 2" + date="2014-04-20T23:58:00Z" + content=""" +this was a single commit. + +i am not sure i can extract much more information from my memory: details are hazy as i was working late on a problem that night... sorry! +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3.mdwn b/doc/bugs/git-annex_broken_on_Android_4.3.mdwn new file mode 100644 index 000000000..4c1b356fb --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3.mdwn @@ -0,0 +1,7 @@ +As per [[install/Android/#comment-e218073735d67691a2c3f66cc53ca6ac]] and [[install/Android/#comment-29bd13ab9cb830ffcd7850b84fb111c8]] : + +git-annex is broken on Android 4.3; both on Nexus 4 and Nexus 7. + +> [[Fixed|done]]. A 4.3 build of the apk is now available. +> (Unfortunately the fix breaks support for older versions of Android, +> so two versions of the apk have to be built now.) --[[Joey]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment new file mode 100644 index 000000000..5d56dc84c --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7qEQF8yzbY0_PHq3QERHxUGuXmW6qw8o" + nickname="Anton" + subject="comment 10" + date="2013-11-10T22:10:49Z" + content=""" +I can confirm that the Hello World program works with the Nexus 7 2013, running Android 4.3. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment new file mode 100644 index 000000000..d84a59b76 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Hooray!" + date="2013-11-10T22:21:46Z" + content=""" +I have a Nexus 7 (2013) with 4.3 that I'll test it on---I expect that my test will be successful. + +I'll also run the test on my Nexus 5, running 4.4. + +Getting git-annex working on 4.3 was the last thing keeping me from being able to ditch Dropbox entirely. I'm so glad to hear there's some potential progress. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment new file mode 100644 index 000000000..3f520d7e4 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 12" + date="2013-11-10T22:23:49Z" + content=""" +Full rebuild in progress (takes about 6 hours +- manual fixing). +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment new file mode 100644 index 000000000..f2a57f731 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Oh, and if a 4.3 device would be helpful..." + date="2013-11-10T22:28:48Z" + content=""" +I have Samsung Epic 4G (epic_mtd) that I'm no longer using and would be quite happy to send you---it's older, and slow, but it is at least currently supported by CyanogenMod, so it should be possible to install 10.2 milestone builds on it and at least do basic testing. + +Hell, if it would really facilitate Android support, I'd happily pick up something like a B&N Nook HD+ and send it to you---that should be similarly amenable to CM installs and testing. + +Though I will also understand if you don't necessarily want to have a bunch of superfluous hardware laying around. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment new file mode 100644 index 000000000..6336a3bd4 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Works on KitKat" + date="2013-11-10T23:15:28Z" + content=""" +I skipped testing on my Nexus 7, figuring that would be duplicative, and instead ran it on my Nexus 5, and it worked great. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment new file mode 100644 index 000000000..6bca41b3a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 15" + date="2013-11-11T04:34:21Z" + content=""" +6 hours later, and: + +testing appreciated! +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment new file mode 100644 index 000000000..204845eb5 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Nexus 5 Android 4.4" + date="2013-11-11T10:07:07Z" + content=""" +Does not work for me. Same error as in the original Bug report. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment new file mode 100644 index 000000000..9712f5944 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Same error as before, Nexus 5 and 7" + date="2013-11-11T13:06:17Z" + content=""" +Unfortunately, my experience mirrors subito's---same error as before on both 4.3 and 4.4. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment new file mode 100644 index 000000000..2dc32cf15 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 18" + date="2013-11-11T13:27:49Z" + content=""" +Hmm, maybe the problem is caused by stripping the program? If so, this should fail the same way: +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment new file mode 100644 index 000000000..2f22ad21c --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Unfortunately, it would not appear that easy..." + date="2013-11-11T14:33:05Z" + content=""" +The stripped binary for hello worked fine. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment new file mode 100644 index 000000000..9b3b35c4b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T17:31:53Z" + content=""" +Given that the issue is it can't link against libc, it may need to be rebuilt with a newer version of the Android SDK and/or NDK. + +OTOH, for it to get as far as it does, the start.c has successfully run, using the system's libc. So perhaps this only affects Haskell binaries somehow? +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment new file mode 100644 index 000000000..2b547d9a7 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 20" + date="2013-11-11T16:23:11Z" + content=""" +To bisect the problem space further, in case the apk build machinery is at fault, here's a git-annex binary not included in an apk. (Run same as the hello world.) + + + +And here's a more minimal git-annex binary (trying to look identical to hello world from the linker's perspective, just a bit larger..). + + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment new file mode 100644 index 000000000..551334819 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="Galaxy S4 Android 4.3" + date="2013-11-11T18:47:23Z" + content=""" +hello and hello.stripped both work here but the git-annex binaries don't (still the same error as in the bug report). +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment new file mode 100644 index 000000000..e4937e0f8 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Both fail..." + date="2013-11-11T18:53:34Z" + content=""" +Same linking issue for both. + +I don't *think* it should make any difference at all, but to spare myself a little bit of typing on this soft keyboard, I'm using a small variation on your script; I'm sharing it so other testers can use it, too, and so someone can point out if I'm doing something wrong: + + D=/data/data/ga/androidterm/tmp/gatest + cp $D + chmod +x $D + $D + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment new file mode 100644 index 000000000..05cb634e6 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 23" + date="2013-11-11T19:14:59Z" + content=""" +Script variation is ok. + +So, it's looking like perhaps a problem with the way cabal links the executable, which I notice is a two stage process, vs the way ghc links it with --make. + +To narrow down, here is hello built using cabal: + + + +Here is git-annex built not using cabal: + + + +(For my own reference, it's also built without WITH_CLIBS.) +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment new file mode 100644 index 000000000..c8fea212b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 24" + date="2013-11-11T19:56:04Z" + content=""" +hello-cabal working, git-annex-byhand not. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment new file mode 100644 index 000000000..e28a9508b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="I got the same results as Sören." + date="2013-11-11T20:37:08Z" + content=""" +cabal doesn't seem to be the culprit. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment new file mode 100644 index 000000000..1c72cd27b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="finally getting debugger spun up" + date="2013-11-12T01:08:24Z" + content=""" + seems relevant (and the patches to fix it seem likely to have led to the linker rejecting this). + +So I can probably stop torturing your soft keyboards. I need a binary where `arm-linux-androideabi-4.8/bin/arm-linux-androideabi-readelf -r` does not contain `R_ARM_COPY`. Checking against the binaries so far, this consistently matches the test results, all the git-annex binaries have: + +
+ Offset     Info    Type            Sym.Value  Sym. Name
+011d05f0  00004e14 R_ARM_COPY        011d05f0   environ
+
+ +(Which is itself interesting; I've had to work around some problems with the haskell port not supporting getting the environment (Annex.Branch.withIndex). Possibly because it was copied and the linker screwed that up? ) + +Ok, here's a binary that meets those criteria. Obtained by passing -z nocopyreloc to the gold linker (ghc options -optl-z -optlnocopyreloc) + + + +Also, here's a hello world binary that *should* fail. It attempts to read and print the environment, and has the same `R_ARM_COPY` relocation. + + + +And, here's a hello world binary that *might* successfully print out the full environment (like `set` does). If it does, I can also remove the ugly hack in Annex.Branch.withIndex. Which would be an unexpected reward. + + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment new file mode 100644 index 000000000..dd911955a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="nocopy variants work!" + date="2013-11-12T03:17:09Z" + content=""" +I tested both the hello-env-nocopy and the git-annex-nocopy binaries successfully. hello-env-copy failed as you predicted. + +Yay! +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment new file mode 100644 index 000000000..6341aae80 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 28" + date="2013-11-12T03:58:56Z" + content=""" +This fix is now in place in the android autobuilds. + +Just to be sure, hello-env-nocopy managed to print out multiple environment variables? +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment new file mode 100644 index 000000000..1cd4c356f --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="APK now works too" + date="2013-11-12T09:10:49Z" + content=""" +I got the same results as Michael. The output of hello-nocopy is a longer list of environment variables. +Even better, the apk from the autobuilder now seems to work fine as well, including the webapp. +Great work! Thanks for digging into this. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment new file mode 100644 index 000000000..3d5003504 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2013-08-28T13:54:00Z" + content=""" +On a stock Nexus 7 running the latest OS (4.3), this is still the case as of release 4.20130827. + + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + git annex webapp + u0_a18@grouper:/sdcard/git-annex.home $ git annex webapp + CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) + 1|u0_a18@grouper:/sdcard/git-annex.home $ +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment new file mode 100644 index 000000000..3409b9c4a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Yep, the env was printed" + date="2013-11-12T10:18:56Z" + content=""" +I would recognize the output of a Show instance anywhere. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment new file mode 100644 index 000000000..14eed81c9 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgedYqmQb4dJU7UdVuRLwsQE-KlKVrFto" + nickname="Chungy" + subject="comment 3" + date="2013-09-01T00:25:15Z" + content=""" +Just confirming the bug on my Verizon Galaxy S 3 with CyanogenMod 10.2 (Android 4.3), it's not Nexus-specific. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment new file mode 100644 index 000000000..ab721064a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawntVnR-Z5ghYInvsElbDeADPSuCsF18iTY" + nickname="Thomas" + subject="comment 4" + date="2013-09-01T20:02:59Z" + content=""" +Yet another confirmation of the bug on a Samsung Galaxy Note running 4.3 via Cyanogenmod as well. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment new file mode 100644 index 000000000..cfb75bdd8 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2013-09-03T14:38:51Z" + content=""" +If there's anything we can do to help debug this, please let us know. Have just started using git-annex on android recently & would love to have it on all my devices. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment new file mode 100644 index 000000000..438e00454 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="Definitely broken Galaxy Nexus GSM 4.3" + date="2013-09-12T11:11:34Z" + content=""" +Definitely broken in 4.3, stock Galaxy Nexus GSM \"maguro\" release `2013-09-09 12:46` +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment new file mode 100644 index 000000000..4a3819472 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknwkXgi8SnK4QT32ANl3GMKvFLyQGeHqo" + nickname="Florian" + subject="comment 7" + date="2013-10-08T16:18:07Z" + content=""" +Any comment from on this from one of the maintainers would be great. Apparently this was not fixed in the latest (2013-10-02 18:46) build. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment new file mode 100644 index 000000000..52326b8e2 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA" + nickname="Joe" + subject="Samsung Galaxy S4 also affected" + date="2013-11-09T02:47:54Z" + content=""" +Verizon just pushed out 4.3 to Samsung Galaxy S4 devices. This issue is affecting me now too. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment new file mode 100644 index 000000000..015efd7ce --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 9" + date="2013-11-10T20:12:47Z" + content=""" +I have finally managed to get ghc to build with the newest version of the NDK. I hope this means it will make binaries that work with 4.3, but I don't have a device to test. + +Here is a hello world program built with it: + + +After downloading it to an Android device, you can test it by opening the +git-annex terminal, and running: `D=/data/data/ga.androidterm/tmp; cp hello $D; chmod +x $D/hello; $D/hello` + +Tested working on android 4.0.4 + +Also, I have filed a bug upstream about this at +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed.mdwn b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed.mdwn new file mode 100644 index 000000000..2e86f488d --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed.mdwn @@ -0,0 +1,47 @@ +### Please describe the problem. + +umask is 022 on both hosts +If one does ls -lL on source repo, the files are shown 644. + +Now, "git annex get" from a clone done over ssh generally preserves 644 ... except if the transfer (rsync) is interrupted, and then resumed. +In fact, looks like the temp files in .git/annex/tmp have the og+r bits cleared during the resumed transfer. + +So this is inconsistent: I don't see why permissions should be different, depending whether or not there was an interruption in the transfer. +Plus, og+r permissions can actually be important for setups like serving contents using Samba. + +### What steps will reproduce the problem? + + cd dir1 + git init + git annex init + touch a + truncate -s 10G b + git annex add . + git commit -m 'new' + + git clone localhost:/path/to/dir1 dir2 + cd dir2 + git annex get + ctrl^c + git annex get + ls -lL + ... see different perms + + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140411-gda795e0 +Linux + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]]; brought back -p on non-crippled file systems --[[Joey]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_1_0fc5c7251ead7a0fbbcd357a8bc53f05._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_1_0fc5c7251ead7a0fbbcd357a8bc53f05._comment new file mode 100644 index 000000000..48069eebd --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_1_0fc5c7251ead7a0fbbcd357a8bc53f05._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-17T18:32:40Z" + content=""" +(I think you forgot to mention you were using direct mode.) + +Like git, git-annex does not preserve file permissions. If you want to ensure that a group or everyone can read file in a git repository, you have to use the core.sharedRepository git configuration. git-annex will also honor that. + +git-annex will try to preserve the execute bit, since git does support that single permission bit. But even this cannot be guaranteed. (Eg, when using special remotes which have no concept of file permissions.) + +Interrupting rsync and resuming it does cause rsync to not transfer through permissions. This is rsync's normal behavior when not using -p. git-annex used to use rsync -p to preserve whatever file permissions there were. However, , and then [[!commit f92eaf631509d02491c1b0ebfbb15145f80df797]]. + +It looks like I could preserve the execute bit across interrupt and resume by using rsync's --executability option. + +Or, I could use the -p when git-annex is running in a non-crippled filesystem. +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_2_992c1a51d0300bd676cb431688efa524._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_2_992c1a51d0300bd676cb431688efa524._comment new file mode 100644 index 000000000..f32a4a70f --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_2_992c1a51d0300bd676cb431688efa524._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2014-04-17T21:19:10Z" + content=""" +Hi Joey, + +In fact, this is indirect mode on Linux, ext4. +I'm less worried about preserving +x mode (though I can see why it would be useful). Here I'm referring to plain \"group\" and \"other\" read permissions being cleared. + +And I just did a test with a standalone rsync, using rsync -P localhost:file file2 and interrupting it, the partial (and final after resume) file2 still is 644 (and not 600 like in git-annex case). +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_3_3001a11839eff6a4c3a9f12096b29704._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_3_3001a11839eff6a4c3a9f12096b29704._comment new file mode 100644 index 000000000..b365baa75 --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_3_3001a11839eff6a4c3a9f12096b29704._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 3" + date="2014-04-17T21:19:59Z" + content=""" +I think -p on non-crippled does make sense, and -E does too for crippled. +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_4_a13abb45b9a94d275177641db0538765._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_4_a13abb45b9a94d275177641db0538765._comment new file mode 100644 index 000000000..919adc2e7 --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_4_a13abb45b9a94d275177641db0538765._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 4" + date="2014-04-17T21:22:16Z" + content=""" +s/and not 600/and not 400/ + +In my ideal case I'd like to see indirect git-annex to set files to 444 (if umask in destination doesn't prevent that otherwise). +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_5_faac2d48950307ce245f0da501ace730._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_5_faac2d48950307ce245f0da501ace730._comment new file mode 100644 index 000000000..57db29c8a --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_5_faac2d48950307ce245f0da501ace730._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 5" + date="2014-04-17T21:32:35Z" + content=""" +core.sharedRepository does fix things here. Thanks Joey! +I'm all set for my use case. +"""]] diff --git a/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_6_7df03eee7d5dc5a7ed0c9abef5053788._comment b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_6_7df03eee7d5dc5a7ed0c9abef5053788._comment new file mode 100644 index 000000000..bfed27fb4 --- /dev/null +++ b/doc/bugs/git-annex_clears_files__39___og+r_permissions_when_rsync_transfer_is_interrupted_and_resumed/comment_6_7df03eee7d5dc5a7ed0c9abef5053788._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 6" + date="2014-04-18T18:32:22Z" + content=""" +One issue (bug) still remains: git annex does respect + +sharedRepository = world + +but not + +sharedRepository = 0644 + +In the later case, with indirect mode, files end up with 400 permissions. + +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn new file mode 100644 index 000000000..58b11deb3 --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +Installing on Windows requires installing git followed by git-annex. +Installing the former works without admin rights, but the latter cannot be +installed afterwards. + +### What steps will reproduce the problem? + +1. Create a Windows account without admin rights +2. Install git +3. Install git-annex + +### What version of git-annex are you using? On what operating system? + +Latest release on MS Windows. + +### Please provide any additional information below. + + +Installing git creates read-only directories that cannot be used by the +git-annex install afterwards. Without admin rights, the read-only flag of +the git dir cannot be altered. + +[[!tag confirmed]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment new file mode 100644 index 000000000..32fc0311e --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T16:19:41Z" + content=""" +Thanks, this had been reported in the forum before, but they did not point at the directory permissions as the problem. + +It would be possible to modify the installer to install git-annex somewhere else and add it to the PATH, but it seems this is a utter nightmare on windows and I'd have to pull in enormous NSIS scripts from their wiki, of unknown provenance. Which is why I am piggybacking on the git installation's PATH. +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment new file mode 100644 index 000000000..4bd5c2c0e --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 2" + date="2013-11-26T21:57:28Z" + content=""" +Just wondering how git succeeds in installing as non-admin user. The folder it goes in is also read-only. +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment new file mode 100644 index 000000000..ac5e77d08 --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-12T19:33:50Z" + content=""" +I've made the installer now request admin rights if run by a non-admin. Hopefully good enough. However, the NSIS docs say that only works on Vista or higher. The old XP I'm using (that will be completely EOLed soon IIRC) still has the problem. +"""]] diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn new file mode 100644 index 000000000..8e205e1e9 --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. + + +### What steps will reproduce the problem? + +$ git init +Initialized empty Git repository in /cygdrive/c/Temp/.git/ + +$ git-annex init +init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. +fatal: You are on a branch yet to be born +git-annex.exe: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed + +$ git checkout -B annex/direct/master +fatal: You are on a branch yet to be born + +### What version of git-annex are you using? On what operating system? + +Running under cygwin bash + +$ git --version +git version 1.7.9 + +$ git-annex version +git-annex version: 5.20140421-g78d6aa1 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +> [[fixed|done]]; documented the needed version of git on the windows +> install page. --[[Joey]] diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment new file mode 100644 index 000000000..8610061d5 --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_1_24d626923403b097f57bc3d3a8c5befa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-27T00:13:49Z" + content=""" +This looks similar to [[bugs/git-annex_fails_to_initialize_under_Windows]], which was solved by upgrading to a newer version of msysgit. + +git 1.7.9 is extremely old (years). Probably the empty commit that is done when switching to direct mode, precisely to avoid this problem, fails, because the pre-built git-annex for windows is targeting a modern version of git, from msysgit. +"""]] diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment new file mode 100644 index 000000000..bafaaa3fd --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin/comment_2_32a74f078f45ee069a7d386734e379e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYmMFDdf3GJ9Oba6NCVkzGc4JyB9WavMs" + nickname="Xinruo" + subject="comment 2" + date="2014-04-27T11:58:13Z" + content=""" +OK installing git 1.9.2 from msysgit solves the problem. I thought I have read somewhere that you used cygwin for Windows development and didn't know that git from cygwin is too old. Thanks for the help! +"""]] diff --git a/doc/bugs/git-annex_fails_to_start_when_nautilus_script_directory_is_missing.mdwn b/doc/bugs/git-annex_fails_to_start_when_nautilus_script_directory_is_missing.mdwn new file mode 100644 index 000000000..e3441489d --- /dev/null +++ b/doc/bugs/git-annex_fails_to_start_when_nautilus_script_directory_is_missing.mdwn @@ -0,0 +1,49 @@ +### Please describe the problem. +Starting the webapp fails if the Nautilus scripts directory doesn't exist. + +### What steps will reproduce the problem? + +[[!format sh """ +$ mv ~/.local/share/nautilus ~/.local/share/nautilus.bak +$ git-annex webapp + +git-annex: /home/brunksn/.local/share/nautilus/scripts/git-annex get: openFile: does not exist (No such file or directory) +failed +git-annex: webapp: 1 failed +"""]] + +### What version of git-annex are you using? On what operating system? +5.20140402, Debian testing + +### Please provide any additional information below. + +Workaround for users without Gnome/Nautilus: +[[!format sh """ +$ mkdir -p ~/.local/share/nautilus +"""]] + +It seems git-annex tries to create the scripts without checking if the actually directory exists. One solution would be to just create it if it doesn't exist or to only write the scripts if it exists already. Patch for the latter below. Works for me but my haskell knowledge is still very limited. + +By the way, what is the preferred way to contribute patches for git-annex? I couldn't find any information about that on the website. + +[[!format diff """ +diff --git a/Assistant/Install.hs b/Assistant/Install.hs +index 4d02c0e..883ca48 100644 +--- a/Assistant/Install.hs ++++ b/Assistant/Install.hs +@@ -87,8 +87,9 @@ installNautilus :: FilePath -> IO () + #ifdef linux_HOST_OS + installNautilus program = do + scriptdir <- (\d -> d "nautilus" "scripts") <$> userDataDir +- genscript scriptdir "get" +- genscript scriptdir "drop" ++ whenM (doesDirectoryExist scriptdir) $ do ++ genscript scriptdir "get" ++ genscript scriptdir "drop" + where + genscript scriptdir action = + installscript (scriptdir scriptname action) $ unlines +"""]] + +> [[applied|done]]. thanks! That's a fine way to send a small patch, or +> make a git branch somewhere for a larger one. --[[Joey]] diff --git a/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn new file mode 100644 index 000000000..5d8f863ec --- /dev/null +++ b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. + +Running `git annex group here manual` and `git annex group here client` results in the nonsensical group of "manual client". Should there be checking for the reserved "standard" group words? + +The intention from the webapp and docs reads as though these groups should be mutually exclusive. + +Also it would be nice if `git annex group here` returned the list of groups (I put this as a wishlist item but think it perhaps warrants a bug mention). + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]] per my comment. (Please comment if you disagree!) --[[Joey]] diff --git a/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups/comment_1_b3090201e90a78e049cf299fc322d60e._comment b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups/comment_1_b3090201e90a78e049cf299fc322d60e._comment new file mode 100644 index 000000000..154bcd12e --- /dev/null +++ b/doc/bugs/git-annex_group_remote_allows_bad_settings_with_standard_groups/comment_1_b3090201e90a78e049cf299fc322d60e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T18:34:49Z" + content=""" +You can get the same effect by running `git annex vicfg` in 2 repositories at the same time, and adding different groups. When the repositories sync and merge, things end up in 2 groups. + +So, this is something that git-annex has to deal with being done, even if the configuration does not make sense. It deals with it by treating such a configuration the same as if the repository was in no groups, as far as preferred content is concerned. + +So, I don't see much point in adding configuration time checks, since they'd not catch all ways this can happen. +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn new file mode 100644 index 000000000..db8abfdce --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn @@ -0,0 +1,58 @@ +### Please describe the problem. + +When cloning/syncing a repository (and probably doing some nono's in the process), +git annex will happily delete files. +This cost me several files, which just by coincidence were not totally important, still its *very* unsettling. + +### What steps will reproduce the problem? + +I did not try to exactly reproduce it yet (sorry, no time right now), but here is vaguley what I did (sorry its been a process spread over +several hours and i was doing lots of other things in parallel so I'm fuzzy about details): + + * have a repository in direct mode on your local harddrive, say ~/myannex + * git clone ~/myannex to /usbhd/myannex, git annex init. + The usbhd is a FAT, git annex recognizes it as "crippled filessytem". + * Git annex get all from ~/myannex. So far, so good. + * create several files on ~/myannex, git annex add them + * do a git annex add on them, abort it (realizing SHA256E takes forever, so changing to WORM), repeat add + (not sure wheter i did a git annex sync here) + * create several files on /usbhd/myannex, git annex add them + (not sure wheter i did a git annex sync here again) + +All repos are in direct mode. + +From here on i don't remember the exact order of events, one definite -- probably important -- nono i did, +was: +I executed a git annex sync/get on the usbhd in a sub-directory (i.e. not in the git base dir), say /usbhd/myannex/foo/bar/, +so it went on creating /usbhd/myannex/foo/bar/foo, which of course was not intended. +However /usbhd/myannex/foo/bar/foo contained FAT-crippled-symlinks to the new files in ~/myannex (good). + +In order to avoid a potential messy situation i just renamed /usbhd/myannex/foo to /usbhd/myannex/foo_bak +(which I just realize while writing this, saved me the hash values of my files, yay :)) + +However when I tried to repeat the procedure, it seems that the new files would not appear on the usbhd (for a reason i totally don't get, maybe I synced back before realizing my sub-foo mistake). +When I synced usbhd -> ~/myannex again, git-annex happily deleted my new files there which obviously quite upset me. + +Again, sorry for this horribly chaotic description, +I'll try and deliver a more reproducible description, but for the next 2 weeks at least I'm too busy for that. + + + +### What version of git-annex are you using? On what operating system? + +Archlinux, +3.9.2-1-ARCH #1 SMP PREEMPT Sat May 11 20:31:08 CEST 2013 x86_64 GNU/Linux + +aur/git-annex-bin 4.20131002-1 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment new file mode 100644 index 000000000..a8994ba9a --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://droggl.myopenid.com/" + ip="92.76.150.86" + subject="comment 1" + date="2013-10-08T07:46:35Z" + content=""" +Just in case you wonder: the most important (in the sense of not backupped elswhere) files where some scripts which i did hash with SHA256E and not with WORM. +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment new file mode 100644 index 000000000..8574d974b --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="git annex get/sync don't delete files" + date="2013-10-10T11:43:29Z" + content=""" +AFAIU it's impossible for the 'get' subcommand to delete anything because it only copies files to .git/annex/objects. + +'sync' should also never delete files because it only adds files to the annex (i.e. checksums them and sets up the links and directories in .git/annex), commits things to git and pulls/pushes the git-annex specific branches to/from other repos. + +So I think some other 'nono' must have messed up your files. + +If you ever used (maybe unintentionally) used indirect mode there seem to be a rather high chance that some of your otherwise lost content is still in .git/annex/objects. Did you check if there's are any files in .git/annex/objects ? +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment new file mode 100644 index 000000000..d5c08fb4f --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 3" + date="2013-10-16T20:45:25Z" + content=""" +At least part of this sounds like [[direct_mode_assistant_in_subdir_confusion]]. The report is too confused for me to tell if that's the whole of the problem. + +Note that git-annex stores files in git, so if it did something wrong, you can switch to indirect mode, and use regular git commands to check out a tree from before the problem occurred. +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment new file mode 100644 index 000000000..be972fa9a --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-10-26T19:26:22Z" + content=""" +I have moreinfoed this bug, until I hear back with a better problem description. + +Using `git log --stat` to investigate any commits where files were removed would probably be a useful way to get a handle on what happened. +"""]] diff --git a/doc/bugs/git-annex_merge_stalls.mdwn b/doc/bugs/git-annex_merge_stalls.mdwn new file mode 100644 index 000000000..80330a822 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. + +Running git-annex merge shows the output "git-annex merge ", followed by a blinking cursor. The command never seems to end. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +4.20130827-gd04d9bb on MacOS X Mountain Lion + +### Please provide any additional information below. + +dtruss output at https://www.dropbox.com/s/4b3yqn7ajfz5el2/annex-merge.log + +[[!meta title="no indication when git-annex is stuck waiting for a lock"]] + +[[!tag confirmed]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment b/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment new file mode 100644 index 000000000..123212d5d --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T15:45:17Z" + content=""" +The relevant part of the log is: + +
+65332/0x53591a:  open(\"/Users/gsolsberry/annex/.git/annex/journal.lck\0\", 0x601, 0x1B6)          = 8 0
+65332/0x53591a:  fcntl(0x8, 0x9, 0x107009D60)            = -1 Err#-1
+
+ +waitToSetLock thinks fcntl is failing to lock the file due to something else having it locked, and retries, leading to the hang. + +I'm told on irc that this was installed using the prebuilt image, and that a previous version of it didn't have the problem. +"""]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment b/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment new file mode 100644 index 000000000..2fe9b8ac0 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl8B4Ima-VCCJ4y32Gvfii8EmvTyN9tFGM" + nickname="Glendon" + subject="comment 2" + date="2013-09-09T15:54:59Z" + content=""" +With latest 20130909 version, the following log from git-annex merge: + +https://www.dropbox.com/s/3hklzfsflpxuk5s/annex-merge.log.1 +"""]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment b/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment new file mode 100644 index 000000000..382f8c835 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 3" + date="2013-09-09T19:35:25Z" + content=""" +This problem cleared up after a reboot (and a crash, apparently). + +
+joeyh so, my thought is that perhaps you had a git-annex process before that was holding the lock.
+joeyh for example, if you ran it and ctrl-z'd at just the right time, it could be suspended and holding the lock
+joeyh (or the kernel coud have gotten confused, which given you also had a crash, who knows..)
+dp sounds logical
+joeyh forcing locks is always a problimatic thing
+joeyh but git-annex could certainly notice if it seems to be stalled and print some useful messages
+joeyh and maybe have a way to run with locks forced
+
+"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files.mdwn b/doc/bugs/git-annex_opens_too_many_files.mdwn new file mode 100644 index 000000000..f439b383f --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files.mdwn @@ -0,0 +1,42 @@ +[[!meta title="network-muticast FD leak fix not deployed to Linux autobuilds yet"]] + +### Please describe the problem. +After running git-annex some minutes, the websites is not responsible any more and it even crashes eventually. + +### What steps will reproduce the problem? +Start the assistant. + +### What version of git-annex are you using? On what operating system? +it-annex version: 4.20130802-g1452ac3 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3 + +Already up-to-date. +(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan + +Already up-to-date. +(started...) +git-annex: accept: resource exhausted (Too many open files) +[2013-08-06 19:50:37 CEST] read: git ["--git-dir=/home/christian/git-annex/.git","--work-tree=/home/+christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgc+eihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/ +racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr eCosEpoSeuTnr] c feri eleaexdsh:+)a +ugsitte d[ "(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s +tian/git-annex/.git","--work-tree=/home/christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProces+s: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.gi+t/annex/: openTempFile: resource exhausted (Too many open files) + +(system was asleep from 14:00 until 19:50) + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment b/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment new file mode 100644 index 000000000..de5dde9b5 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="chrisbra" + ip="80.149.220.45" + subject="sorry, added some wrapping signs from vim." + date="2013-08-06T18:01:40Z" + content=""" +[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3 + +Already up-to-date. +(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan + +Already up-to-date. +(started...) +git-annex: accept: resource exhausted (Too many open files) +[2013-08-06 19:50:37 CEST] read: git [\"--git-dir=/home/christian/git-annex/.git\",\"--work-tree=/home/christian/git-annex\",\"symbolic-ref\",\"HEAD\"] +git-annex: runInteractiveProcess: pipe: Too many open files +[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgceihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/ +racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr eCosEpoSeuTnr] c feri eleaexdsh:)a +ugsitte d[ \"(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s +tian/git-annex/.git\",\"--work-tree=/home/christian/git-annex\",\"symbolic-ref\",\"HEAD\"] +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.git/annex/: openTempFile: resource exhausted (Too many open files) + +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment b/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment new file mode 100644 index 000000000..381d425fc --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-08-07T15:59:59Z" + content=""" +What operating system is this? + +Can you see which files the git-annex process has open? +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment b/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment new file mode 100644 index 000000000..fbd3bce8f --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="chrisbra" + ip="212.121.153.12" + subject="This is ubuntu 12.10" + date="2013-08-12T13:30:00Z" + content=""" +This is ubuntu 12.10 and seems to be the same problem which has been mentioned before (resource exhausted or similar) +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment b/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment new file mode 100644 index 000000000..b4c458706 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment @@ -0,0 +1,137 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlmRpGORNKWimtzqItvwm4I6cn16vx8OvU" + nickname="hayden" + subject="Many network sockets with associated fds hanging around" + date="2013-08-15T18:00:42Z" + content=""" +I see something similar in logs and after roughly 10 mins the web-apps dies. +So I think I hit the same as the above user. +Sometimes I get thread deaths and restart requests but the root cause appears to match the scenario mentioned over. +Often the webapp just hangs. But always when it hits the fd ulimit... 1024 on this system. + +git-annex version is 4.20130802-g1452ac3 and I used the static-linked linux tar.gz linux-binary download. + +Test setup is a from scratch assistant startup on Ubuntu 12.04. +Not exactly a clean ubuntu though, so maybe difficult to duplicate troubles at your end. + +I fired up the web-app with a cleaned out config. No signs of leaks until an annex is created. +On creation of an empty annex I get fd leaks a about 1 per second after a repository is created. +Strace'ing the main process only shows 8-bytes writes (see below) at the same rate as the leak. +Sometimes the fd-leak stops before the resource limit, sometimes not. +Creating a new annex on top of an existing directory tree with many files is pretty reliable trigger though. +Startup scan finishes and fds leak away until the ulimit is hit. + + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 6 8 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 5 7 9 + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 6 8 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 5 7 9 + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 5 7 9 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 46 6 8 + + hayden@orca:~/gamma$ ls /proc/26319/fd/43 + /proc/26319/fd/43 + + hayden@orca:~/gamma$ ls -l /proc/26319/fd/43 + ls -l /proc/26319/fd/43 + lrwx------ 1 hayden hayden 64 Aug 14 21:10 /proc/26319/fd/43 -> socket:[568994] + + hayden@orca:~/gamma$ lsof | grep 568994 + git-annex 26319 hayden 43u IPv4 568994 0t0 UDP 224.0.0.251:55556 + + hayden@orca:~/gamma$ uname -a + Linux orca 3.2.0-25-generic #40-Ubuntu SMP Wed May 23 20:30:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux + + hayden@orca:~/gamma$ cat /etc/issue + Ubuntu 12.04 LTS \n \l + + hayden@orca:~/gamma$ fuser 55556/udp -a + 55556/udp: 4415 26319 27080 27083 + + hayden@orca:~/gamma$ ps aux | grep 4415 + hayden 4415 0.0 0.0 66716 3036 ? S Aug12 0:03 curl -s --head -L http://127.0.0.1:38464/?auth=da9c4aba4cc2db9cf78574753f6e94d8031c6a7bdf8bfe100bde868f57b81fd751965cc9d68a9afac79f826d257a256a04ce62615a7f23cd7c925969dda1c7b8 -w %{http_code} + hayden 27458 0.0 0.0 10612 924 pts/0 S+ 21:50 0:00 grep --color=auto 4415 + + hayden@orca:~/gamma$ ps aux | grep 26319 + hayden 26319 0.1 0.7 497188 28560 pts/5 Sl 21:09 0:04 git-annex webapp + hayden 26338 3.4 3.4 1035572 137864 pts/5 Sl 21:09 1:25 /usr/lib/firefox/firefox /tmp/webapp26319.html + hayden 27460 0.0 0.0 10612 920 pts/0 S+ 21:50 0:00 grep --color=auto 26319 + + hayden@orca:~/gamma$ ps aux | grep 27080 + hayden 27080 0.0 0.0 16476 1288 pts/5 S 21:33 0:00 git --git-dir=/home/hayden/boo/.git --work-tree=/home/hayden/boo cat-file --batch + hayden 27462 0.0 0.0 10612 924 pts/0 S+ 21:50 0:00 grep --color=auto 27080 + + hayden@orca:~/gamma$ ps aux | grep 27083 + hayden 27083 0.0 0.0 16476 1060 pts/5 S 21:33 0:00 git --git-dir=/home/hayden/boo/.git --work-tree=/home/hayden/boo check-attr -z --stdin annex.backend annex.numcopies -- + hayden 27464 0.0 0.0 10612 920 pts/0 S+ 21:51 0:00 grep --color=auto 27083 + +----> has 579 open fds at this point but this number holds stable over 10 min +(copy in new tree to provoke) +(no change) +----> restart daemon in gui to provoke +(new process has open fds slowly climbing after startup scan) + +straces look like this repeating every second. (clipped down) + + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + write(6, \"\377\0\0\0\0\0\0\0\", 8) = 8 + rt_sigreturn(0x2) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL^C + Process 29803 detached + +Until after roughly 10 mins... + + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1017 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1023 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + + hayden@orca:~/boo$ ulimit -a + core file size (blocks, -c) 0 + data seg size (kbytes, -d) unlimited + scheduling priority (-e) 0 + file size (blocks, -f) unlimited + pending signals (-i) 31164 + max locked memory (kbytes, -l) 64 + max memory size (kbytes, -m) unlimited + open files (-n) 1024 + pipe size (512 bytes, -p) 8 + POSIX message queues (bytes, -q) 819200 + real-time priority (-r) 0 + stack size (kbytes, -s) 8192 + cpu time (seconds, -t) unlimited + max user processes (-u) 31164 + virtual memory (kbytes, -v) unlimited + file locks (-x) unlimited + hayden@orca:~/boo$ + +At this point the webapp hangs but a number of interesting crashes may occur. I've also seen the particular error in the previous users log (on a big tree). + + [2013-08-14 21:56:12 CEST] main: starting assistant version 4.20130802-g1452ac3 + (scanning...) [2013-08-14 21:56:12 CEST] Watcher: Performing startup scan + (started...) DaemonStatus crashed: /home/hayden/boo/.git/annex/: openTempFile: resource exhausted (Too many open files) + [2013-08-14 22:06:12 CEST] DaemonStatus: warning DaemonStatus crashed: /home/hayden/boo/.git/annex/: openTempFile: resource exhausted (Too many open files) + +Is any of the above helpful? Anything else useful to kick for testing that you'd like done? +I'd guess this is something weird with my ubuntu setup that provokes this as more users would see it otherwise. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment b/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment new file mode 100644 index 000000000..786672eb2 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 5" + date="2013-08-24T17:09:43Z" + content=""" +Thanks for an excellent amount of debug information. + +I can see what's leaking is UDP connections to 224.0.0.251. That address is used for the \"local pairing\" option in the webapp. + +I was able to reproduce the problem by disabling all network interfaces except `lo`. The PairListener then failed to open a multicast listening socket. When it fails that way, it retried every second, as you noticed. And there is a socket leak in that failure mode. + +I wonder if you're seeing this even when on the network? If so, perhaps your Ubuntu system has something going on that prevents opening a multicast listening socket on even `eth0` or `wlan0` or whatever. + +Unfortunately, the actual socket leak bug is in the [network-multicast](http://hackage.haskell.org/package/network-multicast) library, and not in git-annex. I have filed an upstream bug report: + +Hopefully that will be dealt with soon. There is a workaround I could do in git-annex: If it fails (leaking one socket), it could wait until the NetworkListener indicated a new network interface was opened, before trying again (possibly leaking one socket again). This would change it from a 1 per second leak to a 1 per change of network leak at worst, which is probably much less likely to cause problems. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment b/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment new file mode 100644 index 000000000..60c268fc0 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 6" + date="2013-08-24T18:38:56Z" + content=""" +My NetListener workaround turned out to not be portable enough. + +However, I have sent a patch to fix the FD leak: +Hopefully it gets applied soon. + +I have also made the PairListener only retry every 60 seconds. Which makes the leak 1/60th as bad, for whatever that's worth. + +Once a fix for this gets into Debian, I need to remember to backport it to stable, and update the autobuilders to use it. Also need to remember to update the Android autobuilder. Leaving this bug report open until that happens. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment b/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment new file mode 100644 index 000000000..8e1a18fda --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 7" + date="2014-01-01T17:29:03Z" + content=""" +OSX, Android, Windows all updated. Debian backport and linux autobuilds updated. +"""]] diff --git a/doc/bugs/git-annex_remotedeamon.mdwn b/doc/bugs/git-annex_remotedeamon.mdwn new file mode 100644 index 000000000..15f728362 --- /dev/null +++ b/doc/bugs/git-annex_remotedeamon.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +git-annex is back on the radar now that the jabber requirement has been dropped! :-) + +But, it seems as though when I create a remote repo via the webapp it always makes it a bare git repo. Even when I specify the "client usage grouping". + +If I manually create two repos on ssh enabled servers, manually link them, and fire up the assistant they are awesomely kept in sync (with no bare repo in sight). + +### What steps will reproduce the problem? + +Use the webapp to try to create a client usage remote repo. + +### What version of git-annex are you using? On what operating system? + +Latest as of post. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[notabug|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment b/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment new file mode 100644 index 000000000..47d85fc67 --- /dev/null +++ b/doc/bugs/git-annex_remotedeamon/comment_1_bf8aa639ddc7f51ed7b2b83e31694e85._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-24T18:00:52Z" + content=""" +Please use descriptive bug titles. + +The webapp configures some common use cases, not every possible use case. Running git-annex assistant on a remote server to keep a directory there updated is not a relatively common use case. You can do it if you want; and if someone provided a very complelling UI markup that made sense to regular users it might be added to the webap (but this seems unlikely. + +As it is, the webapp set up bare git repositories on remotes, because that is by far the most common useful way to use git on a remote server. And if the webapp's local pairing interface is used, two existing non-bare client repositories will be paired, and the new remotedaemon will help keep the in sync. +"""]] diff --git a/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment b/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment new file mode 100644 index 000000000..0228e2fbb --- /dev/null +++ b/doc/bugs/git-annex_remotedeamon/comment_2_82f71852df61d12333d08ba25af9d7be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2014-04-24T18:43:50Z" + content=""" +hmmm - I think that it's arguable that if in the repository group drop down I select \"client\" then the remote repo should *not* be bare. + +I would predict that this new functionality will supercede the existing use-cases in terms of popularity. It's very cool that all my machines can be kept in sync with just ssh - a walkthrough showing desktop, laptop, and phone all just syncing (i.e., without the cloud transfer repo and jabber complications) makes a much simpler and compelling advert for this cool code! But it won't happen unless the GUI supports it... +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn new file mode 100644 index 000000000..69383666c --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn @@ -0,0 +1,49 @@ +Hi. + +trying to manage my collection of digital music files using git-annex. The collection (113 gigs of flac files ripped from my CDs) should be stored on my three different machines and updated on all of them, if I add or change a file on only one of the machines. + +### Please describe the problem. + +Added a new external USB disk for sneaker transfer via web app, yesterday. + +Now for no apparent reason, after startup/login, git-annex would start and quickly suck up all available RAM. This is on a fairly well equipped machine (16G physical RAM, i5-2400), yet "top" tells me that there is one git process that sucks up more than 20G and climbing. It looked like this: + + git --git-dir=/home/user/Sync/Audio/.git --work-tree=/home/user/Sync/Audio -c core.bare=false log refs/heads git-annex..13d365f16ffdb5a393f66362b840d3f21bb4c59c --oneline -n1 + +The computer then slows down, grinds to halt, becomes unresponsive and it's difficult to even login on the console. + +Then, the OOM killer kicks in and kicks the git process, but git-annex quickly starts another which does the same. + +### What steps will reproduce the problem? + +I don't know what caused it. The symptoms remained after a reboot, "git annex watch --stop" didn't help either, since I'm a dumb web app user, I'm not sure if that's the right command to use anyway. + +For now, I have removed git-annex from the system. + +### What version of git-annex are you using? On what operating system? + +Last installed version: git-annex 5.20140127.1 on Ubuntu 13.10, amd64. + +### Please provide any additional information below. + +I'm fairly unsure where to look for the cause and what logs to provide you with to help fix this. Just guessing that it could be a symptom, but the daemon.log is full of entries like this: + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +("race detected",ca2cbdb84bcbd4aab895284b16fc72f693fbba90,[4a2e7c1d7d286a4da9e816b20368ce2f9b4177c4],"committing",(ca2cbdb84bcbd4aab895284b16fc72f693fbba90,[ca2cbdb84bcbd4aab895284b16fc72f693fbba90])) +(Recording state in git...) +("race detected",28c835634e65ced0e532c1a0e4f34dd0344193bc,[19597be0f49fb859fafa51e006459d5a95e3d005],"committing",(28c835634e65ced0e532c1a0e4f34dd0344193bc,[28c835634e65ced0e532c1a0e4f34dd0344193bc])) +(Recording state in git...) +("race detected",1f2b06c7001be38bd9595eb2205c91454597edaa,[398660279436246a698d6bd55eb06998999ed64f],"committing",(1f2b06c7001be38bd9595eb2205c91454597edaa,[1f2b06c7001be38bd9595eb2205c91454597edaa])) +(Recording state in git...) +("race detected",4c1510c3db41ff400526d5753c03bddc48f5c37e,[1989177cf24ec9151058ed99f05117e48c239001],"committing",(4c1510c3db41ff400526d5753c03bddc48f5c37e,[4c1510c3db41ff400526d5753c03bddc48f5c37e])) +(Recording state in git...) +("race detected",b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0,[799e4434447b18be63bd097120e1fbf56eac48ce],"committing",(b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0,[b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0])) +(Recording state in git...) + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment new file mode 100644 index 000000000..662141d64 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkVnM7Ol2kr_jfLg6h_oXpmNdxWHIiL9mk" + nickname="Hanno" + subject="comment 1" + date="2014-01-30T11:18:15Z" + content=""" +In case it helps: + + $ grep \"race detected\" daemon.log.5 | wc -l + 234986 + + + +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment new file mode 100644 index 000000000..dacaac942 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 2" + date="2014-01-30T17:39:47Z" + content=""" +How many files are in the repository? +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment new file mode 100644 index 000000000..90101155d --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Hanno" + ip="85.183.3.94" + subject="comment 3" + date="2014-01-31T10:39:47Z" + content=""" +The folder contains a bit more than 15000 files (counted with find -type f) +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment new file mode 100644 index 000000000..faaa7ed09 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkVnM7Ol2kr_jfLg6h_oXpmNdxWHIiL9mk" + nickname="Hanno" + subject="comment 4" + date="2014-01-31T23:17:49Z" + content=""" +I have no idea if it is related to this problem, but allow me to add that the \"Consistency check\" (that the web app specifically recommended me to activate) makes my computers unreasonably slow immediately after each bootup. This is both at the fairly fast computer at the office and the ok-ish old laptop at home. + +Also, the check will kick in and suck up the systems responsiveness right after connecting the external USB sneaker disk, making any regular file transfer to the disk extremely slow (more than once I was stung because I just wanted to quickly move a bigger file to the disk and walk home at the end of an office day but git-annex would go into its check after mounting). + +Thanks! +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment new file mode 100644 index 000000000..d94eda816 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="Hanno" + ip="85.183.3.94" + subject="comment 5" + date="2014-02-27T16:10:54Z" + content=""" +Is there anything I can do to help making progress on this issue? +Right now I'm afraid to reinstall git-annex on this machine. +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment new file mode 100644 index 000000000..bd6fcad6a --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 6" + date="2014-03-10T19:24:45Z" + content=""" +I suppose it would be useful to look at the output of `git log git-annex..13d365f16ffdb5a393f66362b840d3f21bb4c59c --oneline -n1` + +Either than command is outputting a huge amount of stuff, or it's actually causing git (not git-annex) to use a lot of memory. Not sure which it is from the description. +"""]] diff --git a/doc/bugs/git-annex_sync_does_not_push.mdwn b/doc/bugs/git-annex_sync_does_not_push.mdwn new file mode 100644 index 000000000..a5fbc1742 --- /dev/null +++ b/doc/bugs/git-annex_sync_does_not_push.mdwn @@ -0,0 +1,52 @@ +### Please describe the problem. + +From the description of `sync` in the man page I assume it should be able to push all the branches it needs: + +> The sync process involves first committing all local changes, then fetching and merging the `synced/master` and the `git-annex` branch from the remote repositories, and finally pushing the changes back to those branches on the remote repositories. You can use standard git commands to do each of those steps by hand, or if you don't want to worry about the details, you can use sync. + +However this does not seem to be the case if one starts from an empty repository. + +### What steps will reproduce the problem? + +The following script (from ) will reproduce this problem: + + #!/bin/sh -x + + set -e ; set -u + export LC_ALL=C + + d=$(pwd) + + # cleanup + chmod a+rwx -R REPO pc1 || true + rm -Rf REPO pc1 + + # create central git repo + mkdir -p REPO/Docs.git + cd REPO/Docs.git + git init --bare + cd $d + + # populate repo in PC1 + mkdir -p pc1/Docs + cd pc1/Docs + echo AAA > fileA + echo BBB > fileB + + git init + git remote add origin $d/REPO/Docs.git + git fetch --all + + git annex init "pc1" + git annex add . + git annex sync + + find $d/REPO/Docs.git/refs + + # there should be some branches inside refs + +### What version of git-annex are you using? On what operating system? + +5.20140412ubuntu1 from Ubuntu 14.04. + +> Documentation fixed, so provisionally [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_sync_does_not_push/comment_1_8b9b53163b012563b3e80f8eded76aaa._comment b/doc/bugs/git-annex_sync_does_not_push/comment_1_8b9b53163b012563b3e80f8eded76aaa._comment new file mode 100644 index 000000000..424d4db0d --- /dev/null +++ b/doc/bugs/git-annex_sync_does_not_push/comment_1_8b9b53163b012563b3e80f8eded76aaa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T18:09:51Z" + content=""" +git-annex sync only syncs with remotes that have an annex.uuid configured. So you can solve your problem by: `git annex sync origin`, which will sync to the remote and incidentially initialize it for git-annex use. + +I think this is merely a documentation problem, as the documentation says it syncs with all remotes. Although I don't have any strong feelings about whether sync should act on remotes that have not yet been initialized with git-annex. +"""]] diff --git a/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn b/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn new file mode 100644 index 000000000..7a2690be2 --- /dev/null +++ b/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. +While running git annex sync, it may failed if one did run it on some deep directory, and the sync remove this direcory. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130815 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +on Debian Gnu Linux sid + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_webapp_command_not_found.mdwn b/doc/bugs/git-annex_webapp_command_not_found.mdwn new file mode 100644 index 000000000..6854d541c --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found.mdwn @@ -0,0 +1,25 @@ +###What steps will reproduce the problem? + + greg@x220:~/Music$ git-annex version + git-annex version: 3.20121017 + + greg@x220:~/Documents$ git-annex watch + greg@x220:~/Documents$ git-annex: Daemon is already running. + + greg@x220:~/Documents$ git-annex assistant + greg@x220:~/Documents$ git-annex: Daemon is already running. + + greg@x220:~/Documents$ git-annex webapp + git-annex: unknown command webapp + +This is on an Ubuntu (12.10) machine, using git-annex from ubuntu+1 (13.04), which is just an autosync from sid: + +https://launchpad.net/ubuntu/+source/git-annex/3.20121017 + +###What is the expected output? What do you see instead? +I expect my browser to open the webapp. + + +(Also, it is odd how the output of "Daemon is already running" appears after my prompt is given back to me) + +> [[closing|done]]; forwarded upstream --[[Joey]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment new file mode 100644 index 000000000..d60432a8d --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-29T19:45:25Z" + content=""" +Ubuntu is apparently building git-annex without the webapp. + +(Message display fixed.) +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment new file mode 100644 index 000000000..eaf95ceb1 --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2012-11-29T19:55:25Z" + content=""" +Thanks, Joey. I've reported it [downstream in LP](https://bugs.launchpad.net/ubuntu/+source/git-annex/+bug/1084693). +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment new file mode 100644 index 000000000..531714d5c --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk4_47QIHYfGlI9aL04LXxOczcYABmmIfA" + nickname="Mike" + subject="On Opensuse 13.1 - I was able to run git-annex-webapp once. " + date="2014-02-01T15:34:50Z" + content=""" +As soon as I removed my single repository it never loaded again. I have re-booted. re-installed. I have the package installed it tries to load but doesn't. I have the stand-alone installed it does nothing. Only if I try to execute webapp as superuser does it launch the browser but doesn't execute properly. comes up to some url file://??? when it was working properly i noticed it was opening to locahost url 127.0.0.1/something + +Still seems to be running on my desktop machine though. But i did not try to remove the repository from that machine because git-annex does not provide a way to remove repository without actually deleting the files. Evidently Disable and Delete do exactly the same thing. + +Any ideas? thanks. Mike +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment new file mode 100644 index 000000000..bc804d98a --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk4_47QIHYfGlI9aL04LXxOczcYABmmIfA" + nickname="Mike" + subject="On Opensuse 13.1 - I was able to run git-annex-webapp once. " + date="2014-02-01T15:35:10Z" + content=""" +As soon as I removed my single repository it never loaded again. I have re-booted. re-installed. I have the package installed it tries to load but doesn't. I have the stand-alone installed it does nothing. Only if I try to execute webapp as superuser does it launch the browser but doesn't execute properly. comes up to some url file://??? when it was working properly i noticed it was opening to locahost url 127.0.0.1/something + +Still seems to be running on my desktop machine though. But i did not try to remove the repository from that machine because git-annex does not provide a way to remove repository without actually deleting the files. Evidently Disable and Delete do exactly the same thing. + +Any ideas? thanks. Mike +"""]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn new file mode 100644 index 000000000..13ac5a98f --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn @@ -0,0 +1,43 @@ +### Please describe the problem. + +Adding my 43GB Music Studio folder with 85K files causes out of memory or file not found errors. I subsequently tried on a very small folder but it still fails. --debug gives nothing useful that I can see. + + +### What steps will reproduce the problem? + +cd Studio +git init +git annex init +git annex add + + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140613-g5587055 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 2 3 4 + +Running on Windows 8.1 x64, Git Bash, Direct Mode, WORM backend + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +fatal: Out of memory? mmap failed: No such file or directory +git-annex: add: 8562 failed + +Phil@DESKTOP /c/Studio (annex/direct/master) +$ git annex add audacity +fatal: Out of memory? mmap failed: No such file or directory +(Recording state in git...) + + +# End of transcript or log. +"""]] + +[[!meta title="msysgit failure on Windows: mmap failed: No such file or directory "]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_984f75d8078f2809486f38ecb3b16be3._comment b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_984f75d8078f2809486f38ecb3b16be3._comment new file mode 100644 index 000000000..3662fe04f --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_984f75d8078f2809486f38ecb3b16be3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="comment 1" + date="2014-07-04T16:25:53Z" + content=""" +Looks like it might be related to msysGit: + +[bug on msysgit](http://osdir.com/ml/msysgit/2009-12/msg00007.html) +"""]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_c0f07e2d4bb142389629050479dd1465._comment b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_c0f07e2d4bb142389629050479dd1465._comment new file mode 100644 index 000000000..0601b0a7d --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_c0f07e2d4bb142389629050479dd1465._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-04T17:58:10Z" + content=""" +If you run git-annex with the --debug flag, you can see the git command that is presumably what is failing. You could then probably run the same git command manually and see if it fails that way too. + +Does your git repository have a large pack file (in `.git/objects/pack`) as mentioned in the msysgit bug report? +"""]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_7a58a884aaacedca9697b17cd5248214._comment b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_7a58a884aaacedca9697b17cd5248214._comment new file mode 100644 index 000000000..c6aa8360a --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_7a58a884aaacedca9697b17cd5248214._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="comment 3" + date="2014-07-04T22:28:27Z" + content=""" +I thought it might be related to using WORM but I've just hit it again on the default backend. + +--debug just seems to fail on the folder I tried to add: + +[[!format sh \"\"\" + +git annex --debug add samples + +[2014-07-04 23:24:42 GMT Summer Time] read: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"samples\"] +[2014-07-04 23:24:42 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] +add samples/cr_info.sh [2014-07-04 23:24:42 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] +[2014-07-04 23:24:42 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] +[2014-07-04 23:24:42 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] +ok +[2014-07-04 23:24:42 GMT Summer Time] read: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"ls-files\",\"--modified\",\"-z\",\"--\",\"samples\"] +fatal: Out of memory? mmap failed: No such file or directory +(Recording state in git...) +[2014-07-04 23:25:39 GMT Summer Time] feed: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] +[2014-07-04 23:25:39 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] +[2014-07-04 23:25:39 GMT Summer Time] feed: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] +[2014-07-04 23:25:39 GMT Summer Time] read: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2014-07-04 23:25:39 GMT Summer Time] read: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"write-tree\"] +[2014-07-04 23:25:39 GMT Summer Time] chat: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"commit-tree\",\"447be0c8a000f98e3c580c6dede7f0ba2208963d\",\"-p\",\"refs/heads/git-annex\"] +[2014-07-04 23:25:39 GMT Summer Time] call: git [\"--git-dir=c:\\Studio\\.git\",\"--work-tree=c:\\Studio\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"8551a4e2f5c4f42823f7da3169d1f630622359ef\"] + +\"\"\"]] +"""]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_aa4f1806207138115d2a95935bb0546b._comment b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_aa4f1806207138115d2a95935bb0546b._comment new file mode 100644 index 000000000..8e9815242 --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_aa4f1806207138115d2a95935bb0546b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="comment 4" + date="2014-07-04T22:30:45Z" + content=""" +There is no pack file, .git/objects/pack is empty. This is the first commit. I've queued up a load of files to commit, could this be it? +"""]] diff --git a/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_5_fa95f93416e3d6e66af557df6562f1e5._comment b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_5_fa95f93416e3d6e66af557df6562f1e5._comment new file mode 100644 index 000000000..749ee44ad --- /dev/null +++ b/doc/bugs/git_annex_add_out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_5_fa95f93416e3d6e66af557df6562f1e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 5" + date="2014-07-10T19:59:15Z" + content=""" +For some reason, this bug is also being discussed in the forum. This makes it hard for me to keep up with what's going on, and generally is not a good idea. Currently, the forum currently seems to have better information. +"""]] diff --git a/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn b/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn new file mode 100644 index 000000000..89f101498 --- /dev/null +++ b/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +git annex addurl will keep the »|« symbol in the filename generated from the video title when using quvi. This should be filtered out as the resulting file cannot copied to fat filesystems and may cause other problems. + +### What steps will reproduce the problem? + + kasimon@pc:~/annex/YouTube/Kids$ git annex addurl --fast https://www.youtube.com/watch?v=OmXd6l54O8M + addurl Reinhard_Mey_singt_Ernie_und_Bert__Über_den_Wolken__|_NDR.webm ok + (Recording state in git...) + +### What version of git-annex are you using? On what operating system? + + git-annex version: 5.20131221 + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + + Ubuntu 13.10 + +### Please provide any additional information below. + +> Ah, I see, pipe is not considered to be punctuation, but a math symbol. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn b/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn new file mode 100644 index 000000000..9b84c21fd --- /dev/null +++ b/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn @@ -0,0 +1,22 @@ +Workflow: + + % git annex add + # list new files + % git commit -a -m "foo" + # commit summary + % git annex copy . --to remote --fast + # all files listed with "ok" + % git annex copy . --to remote + # again, lists all files, _but the new ones are actually copied, this time_. + +This happens no matter if I + + % git push + +before copy or not. + +PS: Arguably, a copy should push automagically. + +> Whups, not supposed to be that fast! [[Fixed|done]], and +> you should run `git annex fsck --fast` on the repo you ran the +> copy in. --[[Joey]] diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn new file mode 100644 index 000000000..f3b124cf6 --- /dev/null +++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn @@ -0,0 +1,140 @@ +### Please describe the problem. + +Hi, + +I have a number of repos that I created both by hand and via the web-app. Some manual, some client and one backup groupings. + +When creating by hand I manually set the annex-cost to 100 (but I notice the webapp sets local costs to 175 - not 100 as per the man page). + +(I'm assuming the creation by hand is still just to `git add remote` on both sides). + +When I run `git-annex sync --content` I do seem to get the local remote (the cheapest cost) that I want. + +When I use the assistant I get every odd behaviour. It will quite happily choose from any of the available repos with no descernible pattern. + +Even more strangely sometimes it queues all the transfers to use the local connection but then at the actual transfer it switches to use the public connection (I have two remotes for one repo: when on the local network and when on the internet). This is reflected in the webapps UI. + +For the snippet of logs below I see the files queued as the remote "Dancingfrog" (on the internnal network) then for the transfer the web page switches to "Home" (the public network). I think the data is actually transferred over the public network as it's much slower than compared to explicit repo transfers from the cli. + +
+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing
+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing
+
+SHA256E-s6759929--a822e83c3448716e793fb9d1d1b1523c2492c84ba07f5c093899810fbdfe5621.mp3
+
+              0   0%    0.00kB/s    0:00:00  
+        163,840   2%  159.20kB/s    0:00:41  
+        360,448   5%  159.56kB/s    0:00:40  
+        524,288   7%  155.01kB/s    0:00:40  
+        688,128  10%  154.59kB/s    0:00:39  
+        851,968  12%  153.18kB/s    0:00:38  [2014-04-27 05:11:54 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","ls-tree","--full-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","numcopies.log","schedule.log","preferred-content.log","required-content.log","group-preferred-content.log"]
+
+      1,015,808  15%  149.92kB/s    0:00:38  To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+   617edaf..f016a03  git-annex -> synced/git-annex
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+      1,146,880  16%   98.64kB/s    0:00:56  
+      1,507,328  22%  129.55kB/s    0:00:40  
+      1,671,168  24%  126.84kB/s    0:00:40  [2014-04-27 05:12:00 BST] Pusher: Syncing with dancingfrog, rss, isilon 
+[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","hash-object","-w","--stdin-paths","--no-filters"]
+[2014-04-27 05:12:00 BST] feed: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-index","-z","--index-info"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+(Recording state in git...)
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","write-tree"]
+[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","commit-tree","86e5513adfc0d1f64cabd3ca3902738d45d809ad","-p","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-ref","refs/heads/git-annex","8808dc8effc3572ae1421461ff44574e900917bf"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","symbolic-ref","HEAD"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","refs/heads/master"]
+[2014-04-27 05:12:00 BST] Pusher: pushing to [Remote { name ="dancingfrog" },Remote { name ="rss" },Remote { name ="isilon" }]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","branch","-f","synced/master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","+git-annex:synced/git-annex","master:synced/master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110gcrypt: Development version -- Repository format MAY CHANGE
+ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+To ssh://10.23.33.19/Volumes/Media/iTunes Media/Music
+   f016a03..8808dc8  git-annex -> synced/git-annex
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","master"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+      1,835,008  27%  125.00kB/s    0:00:39  To rss:Music
+   f016a03..8808dc8  git-annex -> synced/git-annex
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","master"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]
+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+gcrypt: Decrypting manifest
+gpg: Signature made Sun 27 Apr 2014 05:11:41 BST using DSA key ID 29C42E01
+gpg: Good signature from "Matt Ford (Work) "
+gpg:                 aka "Matt Ford "
+gcrypt: Encrypting to:  -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+gpg: 68D8501429C42E01: skipped: public key already present
+
+      1,998,848  29%  180.87kB/s    0:00:26  
+      2,162,688  31%  135.56kB/s    0:00:33  To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+   f016a03..8808dc8  git-annex -> synced/git-annex
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]
+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]
+
+      2,326,528  34%  139.74kB/s    0:00:31  
+      3,637,248  53%  397.83kB/s    0:00:07  
+      4,423,680  65%  556.91kB/s    0:00:04  
+      5,079,040  75%  692.27kB/s    0:00:02  
+      5,636,096  83%  781.05kB/s    0:00:01  
+
+× Synced with dancingfrog, rss, isilon
+× Downloaded 11 Bad Be..viour.mp3 10 Holida..rome].mp3 09 Leisure.mp3 08 Money Money.mp3 07 Dirtee Cash.mp3 06 Chilli..n Dem.mp3 05 Can't .. More.mp3 04 Freaky..reaky.mp3 03 Dance ..rome].mp3 02 Road Rage.mp3 and 8 other files
+× Synced with rss
+× Performed startup scan
+× Synced with dancingfrog, isilon
+
+ +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!meta title="transferkeys protocol needs to include remote name to deal with multiple remotes with same UUID"]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment new file mode 100644 index 000000000..56d77a2d2 --- /dev/null +++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_1_ab82b880bd75a206e0717146e1b79aba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2014-04-27T04:25:58Z" + content=""" +By the way these are indirect repos if that would make a difference. +"""]] diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment new file mode 100644 index 000000000..ef70e0abd --- /dev/null +++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_2_460e78ea8603bd87203d8014bcc3eb9a._comment @@ -0,0 +1,55 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2014-04-27T11:48:18Z" + content=""" +Here's the `.git/config` + +
+[core]
+	repositoryformatversion = 0
+	filemode = true
+	bare = false
+	logallrefupdates = true
+[branch \"master\"]
+	remote = home
+	merge = refs/heads/master
+[annex]
+	uuid = 105776ba-bd78-4884-9126-aeb7c1e6da21
+	version = 5
+	diskreserve = 100 megabytes
+	autoupgrade = ask
+	debug = true
+	fscknudge = true
+[remote \"dancingfrog\"]
+	url = ssh://10.23.33.19/Volumes/Media/iTunes Media/Music
+	fetch = +refs/heads/*:refs/remotes/dancingfrog/*
+	annex-uuid = c3cec307-367b-4373-8cb9-a3da67cee745
+	annex-cost = 100
+        annex-sync = true
+[remote \"home\"]
+	url = home:/Volumes/Media/iTunes Media/Music
+	fetch = +refs/heads/*:refs/remotes/home/*
+	annex-uuid = c3cec307-367b-4373-8cb9-a3da67cee745
+	annex-sync = true
+        annex-cost = 200        
+[remote \"isilon\"]
+	url = gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus
+	fetch = +refs/heads/*:refs/remotes/isilon/*
+	gcrypt-participants = 68D8501429C42E01
+	gcrypt-signingkey = 68D8501429C42E01
+	gcrypt-id = :id:92R1j7+L9r5LuWDi2ZlW
+        annex-gcrypt = true 
+        annex-uuid = 949a8fc3-6334-5f5e-887d-b1e5725ea443
+	annex-sync = true
+        annex-cost = 250
+[remote \"rss\"]
+	url = rss:Music
+	fetch = +refs/heads/*:refs/remotes/rss/*
+	annex-uuid = 79ff3c20-fab3-44dd-88f7-cc1a41eb73d6
+	annex-sync = true
+        annex-cost = 200
+
+
+"""]] diff --git a/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_3_17e9c2d29ddadcabc30ce884ffe0f853._comment b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_3_17e9c2d29ddadcabc30ce884ffe0f853._comment new file mode 100644 index 000000000..1ff0f0b61 --- /dev/null +++ b/doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant/comment_3_17e9c2d29ddadcabc30ce884ffe0f853._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 3" + date="2014-05-19T16:44:19Z" + content=""" +When the assistant wants to download a file, it queues a transfer from all remotes that are known to have the file, with the lowest cost remotes first. If it fails to get the file from the lowest cost remote, it automatically falls back to the next lowest cost, and so on. + +If there's a bug here, I'd suspect strongly it's due to having 2 remotes with the same UUID. + +Yes, I think I've found it. Assistant.TransferSlots.genTransfer calls performTransfer, which is passed only the Transfer, not the Remote. So it then looks up a remote with the UUID from the Transfer. To fix this, I will need to adjust the transferkeys command's protocol to include the name of the remote that should be used. +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn new file mode 100644 index 000000000..cc3881355 --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +In the webapp, I enter my credentials for my jabber.de account. When I hit "use this account" the daemon and webapp crash. + +### What steps will reproduce the problem? +Presumably, authenticate with a jabber.de account. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140517-g0aed6d9 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. + +[[!format sh """ +[2014-05-25 18:11:02 EDT] 127.0.0.1 POST /config/xmpp Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 +git-annex: : hGetBuf: resource vanished (Connection reset by peer) +git-annex: interrupted +"""]] + +[[!tag confirmed forwarded]] + +[[!meta title="OSX xmpp crash with jabber.de"]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_1_5ba4f22bda2f5438fb08753cf149b649._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_1_5ba4f22bda2f5438fb08753cf149b649._comment new file mode 100644 index 000000000..003b60b9f --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_1_5ba4f22bda2f5438fb08753cf149b649._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-27T18:45:35Z" + content=""" +I was able to use that server from git-annex on Linux successfully. + +I also tried on OSX, which appears to be the OS you're using. The assistant didn't crash. I may not have exactly replicated what you did though. + +Can you enable debug logging in Configuration -> Preferences and try to do this again, and send any parts of the log that mention XMPP? +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_2_b096cfdf26bfedfff16d882d7b2e060d._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_2_b096cfdf26bfedfff16d882d7b2e060d._comment new file mode 100644 index 000000000..87e6b746e --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_2_b096cfdf26bfedfff16d882d7b2e060d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 2" + date="2014-05-27T18:59:08Z" + content=""" +This was debug logging enabled, it appeared to be the only relevant parts in the log but I can try again and post more verbosely. + +If nothing more comes up, what else could I do to get you diagnostic data? +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_3_210be77aabb0ef5b85865cd08c51861e._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_3_210be77aabb0ef5b85865cd08c51861e._comment new file mode 100644 index 000000000..c2db30db0 --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_3_210be77aabb0ef5b85865cd08c51861e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 3" + date="2014-05-27T19:03:20Z" + content=""" +Hmm, so it was.. There was so little logged that I missed it. + +Can you reproduce the crash? + +I think that OSX has some ways to get a dump of information about a crash, but I don't know details. +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_4_bb974d882fbb31aa54e6de38410a2318._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_4_bb974d882fbb31aa54e6de38410a2318._comment new file mode 100644 index 000000000..059eec050 --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_4_bb974d882fbb31aa54e6de38410a2318._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 4" + date="2014-05-27T19:07:45Z" + content=""" +I might attach wireshark but I don't know if it'll help much seeing as jabber.de as most XMPP services just went SSL only. +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_5_be655cbea27b6c87d298a75e1697a87d._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_5_be655cbea27b6c87d298a75e1697a87d._comment new file mode 100644 index 000000000..f6aa9d45b --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_5_be655cbea27b6c87d298a75e1697a87d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 5" + date="2014-05-30T19:09:31Z" + content=""" +If you can reproduce the crash, I can provide some debug program that will narrow down where the bug is.. +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_6_72d1dac6627bbe22d5bd140215d82c47._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_6_72d1dac6627bbe22d5bd140215d82c47._comment new file mode 100644 index 000000000..909fdd3ae --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_6_72d1dac6627bbe22d5bd140215d82c47._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 6" + date="2014-05-30T19:37:03Z" + content=""" +I can definitely reproduce it on my end +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_7_8a8dfb15684525e156d6334e9f67a55c._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_7_8a8dfb15684525e156d6334e9f67a55c._comment new file mode 100644 index 000000000..8e862d468 --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_7_8a8dfb15684525e156d6334e9f67a55c._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 7" + date="2014-05-30T20:47:02Z" + content=""" +I wrote a test program to try to connect to this server, using a test account, and dump some events. This works on linux. Then I tried it on mac, and I think I have reproduced the same failure! + +
+oberon:~ joeyh$ ./xmpp
+xmpp: : hGetBuf: resource vanished (Connection reset by peer)
+
+ +Note that this exception is unable to be caught, it seems. Which would explain why the whole git-annex assistant crashes. + +Also, the same program, when modified to use some other xmpp server, does not crash. + +At this point, I think I need to forward this bug to network-protocol-xmpp author John Millikin. Which I've now done. + +My advice for the bug submitter: git-annex is going to be deprecating XMPP in the not too distant future anyway. If you have your own server, a much nicer way to use git-annex is to install it on the server and use ssh remotes. Recent versions do not need xmpp to sync between clients in such a configuration. + +Test program: + +[[!format haskell \"\"\" +{-# LANGUAGE OverloadedStrings #-} + +import Network.Protocol.XMPP +import Data.Maybe +import Data.Either +import Network +import Control.Monad +import Control.Monad.IO.Class +import Control.Exception + +main = do + catch test + (\e -> do + let err = show (e :: IOException) + print (\"caught: \", err) + return (Right ()) + ) + print \"clean exit\" + +test :: IO (Either Error ()) +test = runClient server (getjid jid) username password $ do + liftIO $ print \"connected to server\" + jid <- bindJID (getjid jid) + liftIO $ print (\"bound to jid\", jid) + forever $ do + s <- getStanza + liftIO $ print (\"got\", s) + where + getjid t = fromMaybe (error \"jid parse error\") (parseJID t) + server = Server + (getjid serverjid) + servername + (PortNumber port) + + servername = \"jabber.de\" + serverjid = \"jabber.de\" + port = 5222 + jid = \"haskellxmpptest@jabber.de\" + username = \"haskellxmpptest\" + password = \"stupidpassword\" +\"\"\"]] +"""]] diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_8_f1a6e413756066659020e20147373a11._comment b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_8_f1a6e413756066659020e20147373a11._comment new file mode 100644 index 000000000..c4a874954 --- /dev/null +++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de/comment_8_f1a6e413756066659020e20147373a11._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 8" + date="2014-07-11T19:57:35Z" + content=""" +Unfortunately, this seems to be somewhat intermittent, so while I had a test case that worked once, John never saw it fail and has not been able to debug it. The test case has successfully connected every time I've tried it recently too. Perhaps jabber.de has changed whatever was causing the problem.. +"""]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn new file mode 100644 index 000000000..72a0c9cc3 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +Creating two repos with the same name causes git annex dead to randomly choose one. This is reasonable except that it can choose to mark an already dead remote dead (as long as it shares the name), causing it to actually do nothing. + +I think preferring to mark live repos dead and printing a warning when multiple repos could have been chosen (or if the repo is already marked dead) would be a good solution. + +### What steps will reproduce the problem? + +[[!format sh """ +# Create a new repo /somecopy +git clone /central /somecopy +cd /somecopy +git annex init somecopy +git annex sync +cd / + +# Now, git annex status shows somecopy as an existing repo. + +# Destroy the new repo +rm -rf /somecopy +cd /central +git annex dead somecopy + +# git annex status correctly hides somecopy, and it is properly dead. + +# create it again with the same name, but new UUID +git clone /central /somecopy +cd /somecopy +git annex init somecopy +git annex sync +cd / + +# Destroy the second repo +rm -rf /somecopy +cd /central +"""]] + +Now, git annex dead somecopy will randomly (based on the order of the UUIDs?) choose to mark dead the already dead old repo or the new repo, in both cases showing success to the user. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20131024 on linux. Also occurs on OSX. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment new file mode 100644 index 000000000..3875affb7 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-29T21:10:53Z" + content=""" +I don't think it's a good idea to give multiple repos the same description. + +You can use the uuid to refer to a repo unambiguously in this situation. + +I think it would add unncessary complication to make git-annex guess which repository you mean based on context +(ie, choosing repositories that are not already dead). This would make commands that are currently idempotent not be. + +Perhaps git-annex should abort when multiple repositories match the given description? (Relevant code is Remote.nameToUUID's bydescription) +"""]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment new file mode 100644 index 000000000..17191be04 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmGxww5ON3nilm7moGQCWJPnMEdRwNvb7U" + nickname="Chris" + subject="comment 2" + date="2013-10-29T22:01:04Z" + content=""" +I didn't think about idempotency. Erroring out seems like the best option now. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn new file mode 100644 index 000000000..2169372a2 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn @@ -0,0 +1,220 @@ +### Please describe the problem. +git-annex crashes on Max OS X 10.9 at startup + +### What steps will reproduce the problem? +- install Mac OS X 10.9 developer preview +- download and install the latest git-annex from here http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/ (I tried with the 10.8 version) +- attempt to start it, see it crashing + +### What version of git-annex are you using? On what operating system? +- latest version that is available for 10.8, on 10.9 DP 2 + +### Please provide any additional information below. + +I see the following in Console: + +15.07.2013 21:20:49,362 com.apple.launchd.peruser.501[259]: (com.branchable.git-annex.103872[67263]) Exited with code: 133 +15.07.2013 21:20:49,546 ReportCrash[67272]: Saved crash report for git-annex[67268] version ??? to /Users/stelianiancu/Library/Logs/DiagnosticReports/git-annex_2013-07-15-212049_poseidon-2.crash + +And the crash is as follows: + +Process: git-annex [67268] +Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex +Identifier: git-annex +Version: ??? +Code Type: X86-64 (Native) +Parent Process: sh [67263] +Responsible: sh [67263] +User ID: 501 + +Date/Time: 2013-07-15 21:20:48.946 +0200 +OS Version: Mac OS X 10.9 (13A497d) +Report Version: 11 +Anonymous UUID: 634E8812-1F1A-11E0-61DA-7527061A194C + +Sleep/Wake UUID: AFC18477-57D2-4B69-8B0F-AE26BC3D9D0C + +Crashed Thread: 0 + +Exception Type: EXC_BREAKPOINT (SIGTRAP) +Exception Codes: 0x0000000000000002, 0x0000000000000000 + +Application Specific Information: +dyld: launch, loading dependent libraries + +Dyld Error Message: + Symbol not found: _objc_debug_taggedpointer_mask + Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I + in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + +Binary Images: + 0x104412000 - 0x10450fff7 +E (22.3) <47B09CB2-C636-3024-8B55-6040F7829B4C> /Applications/git-annex.app/Contents/MacOS/bundle/E + 0x104547000 - 0x10455bfff +F (0) /Applications/git-annex.app/Contents/MacOS/bundle/F + 0x104567000 - 0x104594ff7 +G (0) /Applications/git-annex.app/Contents/MacOS/bundle/G + 0x10459c000 - 0x104669fdf +H (0) <29C3AFF5-8EFB-3A16-81F6-0DA6CF2675A6> /Applications/git-annex.app/Contents/MacOS/bundle/H + 0x104699000 - 0x1046abff7 +B (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /Applications/git-annex.app/Contents/MacOS/bundle/B + 0x1046b1000 - 0x1047a6fff +D (34) /Applications/git-annex.app/Contents/MacOS/bundle/D + 0x1047b7000 - 0x1048cf92f +I (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /Applications/git-annex.app/Contents/MacOS/bundle/I + 0x1048f6000 - 0x104af6fff +S (491.11.3) <5783D305-04E8-3D17-94F7-1CEAFA975240> /Applications/git-annex.app/Contents/MacOS/bundle/S + 0x104c06000 - 0x104c2bff7 +Z (26) /Applications/git-annex.app/Contents/MacOS/bundle/Z + 0x104c5e000 - 0x104cc6ff7 +0A (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /Applications/git-annex.app/Contents/MacOS/bundle/0A + 0x104d21000 - 0x104d8afff +0B (56) /Applications/git-annex.app/Contents/MacOS/bundle/0B + 0x104df3000 - 0x104e06fff +T (0) /Applications/git-annex.app/Contents/MacOS/bundle/T + 0x104e0e000 - 0x104e1bff7 +U (0) /Applications/git-annex.app/Contents/MacOS/bundle/U + 0x104e1f000 - 0x104e41ff7 +V (0) <51B317C7-94CC-3C58-B515-924BB3AF0BCC> /Applications/git-annex.app/Contents/MacOS/bundle/V + 0x104e4e000 - 0x104e5bff7 +W (0) <91CF16BE-027F-3FE6-B1EE-6B8BFD51FC1B> /Applications/git-annex.app/Contents/MacOS/bundle/W + 0x104e68000 - 0x104ec4fd7 +X (0) <84D934AF-A321-36C0-BBCF-CD3FDAEB0B95> /Applications/git-annex.app/Contents/MacOS/bundle/X + 0x7fff6ca9d000 - 0x7fff6cad04a7 dyld (237) /usr/lib/dyld + 0x7fff8ba5b000 - 0x7fff8ba5dfff libCVMSPluginSupport.dylib (9.0.74) <11FCA581-0FFD-37B1-966A-E47F4722D297> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff8c053000 - 0x7fff8c05affb liblaunch.dylib (842.1.1) <7055DF9E-52CE-3746-96EB-3718DDBF0BD0> /usr/lib/system/liblaunch.dylib + 0x7fff8c11d000 - 0x7fff8c41cff7 com.apple.Foundation (6.9 - 1042) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8c41d000 - 0x7fff8c444ff7 libsystem_network.dylib (241.3) /usr/lib/system/libsystem_network.dylib + 0x7fff8c445000 - 0x7fff8c47eff7 com.apple.QD (3.49 - 297) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8c483000 - 0x7fff8c864ffe libLAPACK.dylib (1094.4) <19E25957-74BA-3770-AAB5-B6A05F19BDC2> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8c8bc000 - 0x7fff8c8cbff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff8c8cc000 - 0x7fff8c8d9ff7 libxar.1.dylib (202) /usr/lib/libxar.1.dylib + 0x7fff8c8da000 - 0x7fff8cbaaff4 com.apple.CoreImage (9.0.33) <8BB17AEC-D09A-3173-8767-7DB5C982670E> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff8cbab000 - 0x7fff8cbabff7 libkeymgr.dylib (28) /usr/lib/system/libkeymgr.dylib + 0x7fff8d095000 - 0x7fff8d09eff7 com.apple.speech.synthesis.framework (4.5.3 - 4.5.3) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff8d21a000 - 0x7fff8d274ff8 com.apple.AE (665.2 - 665.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff8d2fb000 - 0x7fff8d342ff7 libcups.2.dylib (365) <49F3E642-D748-3A60-AF51-F9E90F65C543> /usr/lib/libcups.2.dylib + 0x7fff8d343000 - 0x7fff8d350ff0 libbz2.1.0.dylib (29) /usr/lib/libbz2.1.0.dylib + 0x7fff8d489000 - 0x7fff8d489fff com.apple.Accelerate (1.9 - Accelerate 1.9) <94C28250-6BDB-30AD-B157-995D9C34A6FA> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff8d75b000 - 0x7fff8d7a8fff com.apple.opencl (2.3.50 - 2.3.50) <33C1EC76-02A2-3474-BB9D-8F77B96E57CC> /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff8dd58000 - 0x7fff8dd5dff7 libunwind.dylib (35.3) <838CE69D-44F1-305C-8FA5-5E439D217F78> /usr/lib/system/libunwind.dylib + 0x7fff8dd5e000 - 0x7fff8dd61fff libCoreVMClient.dylib (58.1) <331C429A-3AE5-30B8-A4DE-1BF4EE4D8FA6> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff8de3e000 - 0x7fff8de3fff7 libDiagnosticMessagesClient.dylib (100) /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8de40000 - 0x7fff8de6ffff com.apple.DebugSymbols (106 - 106) <545E5A48-3516-3398-A33D-D6FB4FED4B7B> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff8e4b2000 - 0x7fff8e500fff libcorecrypto.dylib (161) <56048D2C-3668-3E15-AF02-5C5A377320F6> /usr/lib/system/libcorecrypto.dylib + 0x7fff8e501000 - 0x7fff8e5c7ff7 com.apple.LaunchServices (572.3 - 572.3.1) <39618733-CC97-3991-BD3B-485BD7247115> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff8e5ca000 - 0x7fff8e5caffd libOpenScriptingUtil.dylib (154) <9B8CECA0-360D-3C6D-A37D-95EE34AE2B16> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff8e9ac000 - 0x7fff8e9b4ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <1CE37DE8-BA4A-30CD-A802-18DAF42C328F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff8ea01000 - 0x7fff8ea65ff6 com.apple.Heimdal (4.0 - 2.0) <463F41AC-39FF-30FC-B03A-4198E7A9321F> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff8ea66000 - 0x7fff8ea6efff libsystem_dnssd.dylib (522.1.3) <29695A12-75FC-36EE-97AC-179F6E9DA419> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff8eb28000 - 0x7fff8eb33fff libGL.dylib (9.0.74) <2DB19533-5983-3F59-93F3-2761DA6EEDA5> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8eb37000 - 0x7fff8eb43ff3 com.apple.AppleFSCompression (56 - 1.0) /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff8eb44000 - 0x7fff8f44a043 com.apple.CoreGraphics (1.600.0 - 565) <81F84822-675E-3466-97A7-6FF69DF569E3> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff8f44b000 - 0x7fff8f461fff com.apple.CFOpenDirectory (10.9 - 171) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff9003c000 - 0x7fff900c5fe7 libsystem_c.dylib (997) <5BAB0B09-A39E-39B9-9552-48B540B3ABD0> /usr/lib/system/libsystem_c.dylib + 0x7fff9088e000 - 0x7fff908b2fff libJPEG.dylib (1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff908b3000 - 0x7fff908f7ffe com.apple.HIServices (1.22 - 454) <3625AF2C-1965-349D-B831-1FCC9084B675> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff908f8000 - 0x7fff90bc7fdf com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff90ce8000 - 0x7fff90d03ff7 libsystem_kernel.dylib (2422.1.26.0.1) <5F99677C-C760-3877-AFF7-F60B5ECE365E> /usr/lib/system/libsystem_kernel.dylib + 0x7fff90d04000 - 0x7fff90d77ffb com.apple.securityfoundation (6.0 - 55122) /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff90e98000 - 0x7fff91034fff com.apple.QuartzCore (1.8 - 329.0) <08CE1885-71E8-3A38-AEB6-4BBB1A43785F> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff91035000 - 0x7fff91050ff7 libPng.dylib (1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff910c3000 - 0x7fff9113aff7 com.apple.CoreServices.OSServices (600 - 600) <73820122-62D4-359C-9312-CD49FCEDFE09> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff9115a000 - 0x7fff911e5fff com.apple.Metadata (10.7.0 - 778.1) <93F05A4E-6581-3CD5-8697-84783CEBF764> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff9139d000 - 0x7fff913a4ff3 libcopyfile.dylib (103) <54DD5730-3F05-3F18-B55C-24EA9546286F> /usr/lib/system/libcopyfile.dylib + 0x7fff9152c000 - 0x7fff91530ff7 libheimdal-asn1.dylib (323.3) <90100758-0CC6-3D00-90AB-D3C7DC8CCE45> /usr/lib/libheimdal-asn1.dylib + 0x7fff9193c000 - 0x7fff91947fff libkxld.dylib (2422.1.26.0.1) /usr/lib/system/libkxld.dylib + 0x7fff9194e000 - 0x7fff91950ff7 libquarantine.dylib (69) <1776AABC-F1D7-3CB0-B698-B0C70D4E535B> /usr/lib/system/libquarantine.dylib + 0x7fff91951000 - 0x7fff9195efff com.apple.Sharing (112 - 112) <24BA2112-4FFB-318A-B881-93FEB4648371> /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff919fb000 - 0x7fff91a02ff7 libsystem_pthread.dylib (53) <2160EC74-26FC-32CE-8161-B1A72D2B09B0> /usr/lib/system/libsystem_pthread.dylib + 0x7fff91a03000 - 0x7fff91a2cfff com.apple.DictionaryServices (1.2 - 197) <862F498E-3CB7-3087-BB07-AC185D5D08F8> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff91a3c000 - 0x7fff91b04ff7 libvDSP.dylib (423.29) <72A38066-D6F5-38EC-A8B9-0D025AFC6E2B> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff91b05000 - 0x7fff91b43ff7 libGLImage.dylib (9.0.74) <0DD99DA1-A8E7-3309-8DED-A2AB410E59C8> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff92ade000 - 0x7fff92b00fff libxpc.dylib (300.1.4) <4F832032-9709-3E80-91C4-71914C67A32B> /usr/lib/system/libxpc.dylib + 0x7fff92b01000 - 0x7fff92b04ff7 libdyld.dylib (237) /usr/lib/system/libdyld.dylib + 0x7fff92b05000 - 0x7fff92b05fff com.apple.ApplicationServices (48 - 48) <21188B7D-50E8-3C28-A15E-5345AE7BAFBB> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff92b08000 - 0x7fff92b6cff7 com.apple.datadetectorscore (5.0 - 343.0) <7FE14856-0C85-3382-AD6C-1B9E21C276CB> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff92b6d000 - 0x7fff92b6fff3 libsystem_configuration.dylib (596.1) <1E0FDEA3-8822-3E80-AA0D-57D0F4E30E2E> /usr/lib/system/libsystem_configuration.dylib + 0x7fff92e00000 - 0x7fff92e53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff92e72000 - 0x7fff92e73fff libunc.dylib (28) <53C7CED6-55F5-3121-B00E-4339C29297C8> /usr/lib/system/libunc.dylib + 0x7fff92e91000 - 0x7fff92f53ff9 com.apple.CoreText (352.0 - 367.6) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff934c7000 - 0x7fff934e2ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff934e3000 - 0x7fff93508ffb com.apple.CoreVideo (1.8 - 117.0) <50587BF1-D111-3D49-9DAB-8F86B5E95808> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff93509000 - 0x7fff93522ff7 com.apple.Kerberos (3.0 - 1) <13DDC487-95C0-379F-BD7F-E0FC5F5922D3> /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff93523000 - 0x7fff935a2fff com.apple.CoreSymbolication (3.0 - 137) <85C4F6E2-5039-3E53-9AB2-6D65CAC9AAC5> /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff935a3000 - 0x7fff935bdfff libsystem_malloc.dylib (23.1.1) /usr/lib/system/libsystem_malloc.dylib + 0x7fff935bf000 - 0x7fff93600ff7 com.apple.PerformanceAnalysis (1.45 - 45) <6C498B15-45DB-362F-983B-764ECC9B8E21> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff9360f000 - 0x7fff93618ff3 libsystem_notify.dylib (121) /usr/lib/system/libsystem_notify.dylib + 0x7fff93619000 - 0x7fff9362bff7 com.apple.MultitouchSupport.framework (245.12 - 245.12) <06CAA8FB-BEC6-3EF1-96FA-3D8A1EEB0959> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff9367e000 - 0x7fff9368efff libbsm.0.dylib (33) <65C2FC5C-4B4B-3C1B-B935-D67A3BF96A79> /usr/lib/libbsm.0.dylib + 0x7fff937f6000 - 0x7fff937fafff libpam.2.dylib (20) <17E3DA0D-EE71-3398-BA30-BDD8514A6135> /usr/lib/libpam.2.dylib + 0x7fff93aea000 - 0x7fff93aedfff libsystem_stats.dylib (93.1.8.1.1) /usr/lib/system/libsystem_stats.dylib + 0x7fff93b96000 - 0x7fff93d79ff7 com.apple.CoreFoundation (6.9 - 842) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff93d7a000 - 0x7fff93db9fff libGLU.dylib (9.0.74) <294F4F86-E900-356C-9A47-0C47A929F2FB> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff93dba000 - 0x7fff93e9cff7 com.apple.backup.framework (1.5 - 1.5) <70E20485-EDB6-3225-8AF6-6D9494CB98B7> /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff93edb000 - 0x7fff93ee6ff7 com.apple.NetAuth (5.0 - 5.0) <64D42204-C075-3440-8C29-BBD68A99A771> /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff93ee7000 - 0x7fff93ef3fff com.apple.OpenDirectory (10.9 - 171) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff93f3a000 - 0x7fff93f48ff7 com.apple.opengl (9.0.74 - 9.0.74) <9BD0013A-E503-3DA2-9F94-C42A11D2E734> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff93f56000 - 0x7fff93f85ff5 com.apple.GSS (4.0 - 2.0) <6765C9D7-8AC9-3694-B5D4-5C26B119851D> /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff943f6000 - 0x7fff943fdfff libcompiler_rt.dylib (35) /usr/lib/system/libcompiler_rt.dylib + 0x7fff943fe000 - 0x7fff94404fef libsystem_platform.dylib (24) <5D8FE8C3-2A62-3705-AB7D-FBD7C284AFBD> /usr/lib/system/libsystem_platform.dylib + 0x7fff94405000 - 0x7fff9440fff7 com.apple.CrashReporterSupport (10.9 - 529) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff94428000 - 0x7fff9442bffc com.apple.IOSurface (91 - 91) <1B7746FC-3599-3BDB-A0DA-65795C999435> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9442c000 - 0x7fff944dbff7 libvMisc.dylib (423.29) <83CBEBB6-B9C2-3D83-A32A-CED47CDB65D6> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff9451b000 - 0x7fff9451cffb libremovefile.dylib (33) /usr/lib/system/libremovefile.dylib + 0x7fff9465b000 - 0x7fff94898fff com.apple.CoreData (107 - 468) <51F9B655-84D2-3E88-991B-914C9017BB08> /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff948ab000 - 0x7fff948acfff com.apple.TrustEvaluationAgent (2.0 - 25) <644D981B-A5A7-31F5-99A6-9F180B9A5DE3> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff948ad000 - 0x7fff948d0fff com.apple.IconServices (25 - 25.4) <525BAAE5-F45C-3A15-ACED-2AF4EFFED546> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff948f6000 - 0x7fff94be0ff7 com.apple.CoreServices.CarbonCore (1077.6 - 1077.6) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff94be1000 - 0x7fff94c09ffb libxslt.1.dylib (13) <33D39746-6FCD-3F32-AFAE-2E45232BF6FB> /usr/lib/libxslt.1.dylib + 0x7fff94c0a000 - 0x7fff94c14ff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <3E92DCA9-DA23-34E1-8C38-DA7488621FFB> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff94c15000 - 0x7fff94c1ffff libcommonCrypto.dylib (60049) /usr/lib/system/libcommonCrypto.dylib + 0x7fff94c94000 - 0x7fff94d82fff libJP2.dylib (1029) <720403F5-7863-30D6-AC09-F5A04F069E1B> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff94daf000 - 0x7fff94dc8ff3 com.apple.Ubiquity (1.3 - 280) <581DAEFC-B314-3F92-93CF-7B70BF22AEEF> /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff95037000 - 0x7fff9513cfff com.apple.ImageIO.framework (3.2.0 - 1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff9513d000 - 0x7fff9526aff7 com.apple.desktopservices (1.8 - 1.8) /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff9526b000 - 0x7fff95273ffc libGFXShared.dylib (9.0.74) <13A420C1-1B14-36F8-8F08-4698D423E52F> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff95274000 - 0x7fff9528cff7 com.apple.GenerationalStorage (2.0 - 158) <5BCFBEED-09D2-3BD3-8EE0-85E809C47380> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff952b3000 - 0x7fff9533cff7 com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff95361000 - 0x7fff953baff7 libTIFF.dylib (1029) <12303E45-734B-3D6C-A5C8-1495ECBC0344> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff9548c000 - 0x7fff954d9ff2 com.apple.print.framework.PrintCore (9.0 - 424) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff954e4000 - 0x7fff95547ff3 com.apple.SystemConfiguration (1.13 - 1.13) <73B50935-DFE8-31B8-8583-27A28B5A9D1E> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff955ac000 - 0x7fff955c6fff libdispatch.dylib (339.1.2) /usr/lib/system/libdispatch.dylib + 0x7fff95ca6000 - 0x7fff95ca7ff3 libSystem.B.dylib (1197) <7589D08E-9338-3E28-AA74-9734F0D51CE0> /usr/lib/libSystem.B.dylib + 0x7fff95cb3000 - 0x7fff95cfaff3 libFontRegistry.dylib (121.1) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff95cfb000 - 0x7fff95deafff libFontParser.dylib (106) <16B9215D-3244-365F-910F-FA033495E3F5> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff95deb000 - 0x7fff95debfff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff95e0f000 - 0x7fff95e10fff liblangid.dylib (117) <5146A22B-088F-3D8D-B245-F03DD3CDA2B0> /usr/lib/liblangid.dylib + 0x7fff95e11000 - 0x7fff9696ffff com.apple.AppKit (6.9 - 1240) <53CEC6E0-F928-32EC-919D-B34C0818C88C> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff96970000 - 0x7fff96977fff com.apple.NetFS (6.0 - 4.0) <553EA9F4-7B2C-371A-AF03-4B709A730582> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff96978000 - 0x7fff969c8ffa com.apple.audio.CoreAudio (4.2.0 - 4.2.0) <548AC059-62DD-3CF6-B083-CABE454AFA38> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff96a12000 - 0x7fff96a7cff7 com.apple.framework.IOKit (2.0.1 - 907.1.5) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff96add000 - 0x7fff96ae0fff com.apple.TCC (1.0 - 1) <1DF1D216-1355-3E4F-B4BE-3E3BA5A696EB> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff96ae1000 - 0x7fff96b06ff7 com.apple.ChunkingLibrary (2.0 - 154) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + 0x7fff96b07000 - 0x7fff96b0bff7 libGIF.dylib (1029) <000B8500-FC82-3016-8E59-9FA0D6395F04> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff96b58000 - 0x7fff96b59ff7 libsystem_blocks.dylib (63) <7836104E-39B9-31B6-A0C7-C02ACD401ADE> /usr/lib/system/libsystem_blocks.dylib + 0x7fff96db9000 - 0x7fff96db9ffd com.apple.audio.units.AudioUnit (1.9 - 1.9) /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff96df6000 - 0x7fff96e07fff libsystem_asl.dylib (217) /usr/lib/system/libsystem_asl.dylib + 0x7fff96e2d000 - 0x7fff96e5cfd2 libsystem_m.dylib (3047.15) <8A6B4EC2-BB25-342B-B3FE-9585175225B8> /usr/lib/system/libsystem_m.dylib + 0x7fff96e5d000 - 0x7fff96fb3ff3 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff96fb4000 - 0x7fff9709ffff libsqlite3.dylib (155) /usr/lib/libsqlite3.dylib + 0x7fff970a0000 - 0x7fff97348ff9 com.apple.HIToolbox (2.1 - 681) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff97349000 - 0x7fff97383ffb com.apple.bom (12.0 - 192) /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff97758000 - 0x7fff97759ff7 libsystem_sandbox.dylib (278.1) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff977fb000 - 0x7fff977fbfff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) <349BA8B4-1C72-30BE-B2BB-1898F51B9B5E> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff97939000 - 0x7fff97aa2ff3 com.apple.CFNetwork (657 - 657) <59A9476F-19A2-3F8B-A9B0-8531EA36A4AE> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff97ac9000 - 0x7fff97b20fff com.apple.Symbolication (1.4 - 125) /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff97b24000 - 0x7fff97b93ff1 com.apple.ApplicationServices.ATS (360 - 360) <8A3AD47D-2777-3019-80BB-4B17AA055E13> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff97c01000 - 0x7fff97c28ff3 libsystem_info.dylib (449) /usr/lib/system/libsystem_info.dylib + 0x7fff97d95000 - 0x7fff97e21ff7 com.apple.ink.framework (10.9 - 205) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff97e22000 - 0x7fff97f04fff com.apple.coreui (2.1 - 224) <9F8C1983-1795-34DA-A0C1-7F126ECA0D8E> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff97f4d000 - 0x7fff97fbafff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff98062000 - 0x7fff982b6ff0 com.apple.security (7.0 - 55377) <2F4EFC9E-DD86-32E5-A2CB-E83A5DF34F8F> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff982b7000 - 0x7fff982bbff7 libcache.dylib (61) /usr/lib/system/libcache.dylib + 0x7fff982bc000 - 0x7fff982c1fff com.apple.DiskArbitration (2.6 - 2.6) <4D7487BB-C4A7-32DB-BEE2-CE55EA7F40B2> /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff9838e000 - 0x7fff9838efff com.apple.CoreServices (59 - 59) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff983e0000 - 0x7fff98418ff7 com.apple.RemoteViewServices (2.0 - 94) <7E7B5F1F-9F0E-3DF7-B6B9-152DFD2DFFC7> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff987c8000 - 0x7fff987e4fff libresolv.9.dylib (54) <78D891A1-6F8B-34D4-8F0D-59DB6DF53411> /usr/lib/libresolv.9.dylib + 0x7fff987e5000 - 0x7fff987eafff libmacho.dylib (845) <0038681B-CEC4-348A-A7B8-4236C701F2F8> /usr/lib/system/libmacho.dylib + 0x7fff98802000 - 0x7fff98844ff7 libauto.dylib (185.4) <379FBDA3-DB2A-35A3-A637-3893C0F0E52F> /usr/lib/libauto.dylib + 0x7fff9890a000 - 0x7fff98d3dff7 com.apple.vision.FaceCore (3.0.0 - 3.0.0) <14255DCC-80BD-3690-9269-057D175A9FC5> /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff98d66000 - 0x7fff98ed4ff7 libBLAS.dylib (1094.4) <80E99B02-BD2D-3D88-97B6-0BE2D8973633> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff98f6b000 - 0x7fff98f6dfff libRadiance.dylib (1029) <4E13C7E9-9B17-33D3-9142-B645B5BBCCD6> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff98f6e000 - 0x7fff98f77ffe com.apple.CommonAuth (4.0 - 2.0) <3918EBA0-A124-37DC-9BA6-4D1370AF03A8> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment new file mode 100644 index 000000000..db4d3e269 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="calmyournerves" + ip="85.3.250.239" + subject="comment 10" + date="2013-10-24T20:47:19Z" + content=""" +I was able to successfully build git-annex on Mac OS X 10.9. + +See https://gist.github.com/calmyournerves/7144127 for instructions. +I tried to document every step I made, but I'm not sure if I forgot to write down anything. + +Let me know if it works for you. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment new file mode 100644 index 000000000..d166e8c67 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="warp" + ip="2001:4b98:dc0:45:216:3eff:fe83:3d9" + subject="comment 11" + date="2013-10-25T07:29:04Z" + content=""" +I was able to build git-annex on the work laptop with these steps: + +1. Make sure xcode is up-to-date. +2. Download and install \"Command Line Tools (OS X Mavericks) for Xcode - Late October 2013\" from https://developer.apple.com/downloads/ after logging in as a developer. +3. Follow the \"brew\" instructions at http://git-annex.branchable.com/install/OSX/ +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment new file mode 100644 index 000000000..b05d26c0b --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="imagejan" + ip="134.99.222.172" + subject="comment 12" + date="2013-10-25T13:37:13Z" + content=""" +I was able to build the git-annex.app OSX app using @calmyournerves instructions (see comment 10), but only after adding the 'async' dependency to the git-annex.cabal file. + +Command line works great now, but I wasn't able to run the git-annex-assistant :( + +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment new file mode 100644 index 000000000..94d962cd8 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Mac hardware" + date="2013-10-25T17:30:38Z" + content=""" +If someone had time to set up a campaign to buy you a Mac Mini, I'd chip in $20 :-) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment new file mode 100644 index 000000000..591123175 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="calmyournerves" + ip="85.3.250.239" + subject="comment 14" + date="2013-10-25T18:43:01Z" + content=""" +@imagejan: +What errors did you get before adding async to the cabal file? +What's the problem with the assistant? Running git-annex webapp as well as simply opening git-annex.app both worked for me. + +@Zellyn: +That's certainly a good idea and I would support it. But running multiple versions of OS X is tricky, Parallels allows this iirc (VM's). +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment new file mode 100644 index 000000000..07e76fcb8 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Remy" + ip="83.87.21.84" + subject="comment 15" + date="2013-10-25T18:51:32Z" + content=""" +I now got both the CLI and web app working but I had to switch to gcc-4.7 to work around a compiler preprocessing error and back to the default gcc to get fsevents to compile. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment new file mode 100644 index 000000000..96f379dcf --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Earmarked donations?" + date="2013-10-25T21:51:19Z" + content=""" +Joeyh, is it possible to earmark donations? We could set up a wiki page to track progress, and try to buy you a Mac Mini... +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment new file mode 100644 index 000000000..c67cc7add --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 17" + date="2013-10-26T16:58:27Z" + content=""" +I'm glad that it's been gotten to build. + +Now all we need is for someone like @calmyournerves or @warp or @remy to put \"git pull; make osxapp\" in a cron job. I can provide a rsync account for publishing the DMG file, and help with setting up [gitbuilder](https://github.com/apenwarr/gitbuilder) which is one good way to automate it. + +Or, if someone else with a Mavericks desktop machine wants to install ssh and make me an account, I'm sure I can follow the instructions and set up an autobuilder on it. + +To be clear, I don't have time or interest in maintaining hardware to run the builds, even if I had the hardware. It's much better to let people who are passionate about it do it. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment new file mode 100644 index 000000000..903a41364 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://jspk.clavid.com/" + nickname="flabbergast" + subject="comment 18" + date="2013-10-27T19:29:01Z" + content=""" +I've also just upgraded and had to compile git-annex (following @calmyournerves' instructions). I've made a dmg, so if anyone out there doesn't feel like compiling, you can get 4.20131027-g9230b07 for Mavericks temporarily [here (7z for saving bandwidth)](https://freeshell.de/~teatime/git-annex-4.20131027-g9230b07.dmg.7z). +(I've used my laptop, and I don't want to set it up for automatic building; I'll see if I can set up my work mac for that.) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment new file mode 100644 index 000000000..96356e047 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnt7phVzBQ0xO5rCO6sfmEmxQItmFMyqls" + nickname="Kevin" + subject="comment 19" + date="2013-11-02T00:58:31Z" + content=""" +I tried @flabbergast's dmg. It seems to work fine (including the web app) on my Air, but the web app fails on my iMac with + + $ git annex webapp + Launching web browser on file:///Users/kw/Desktop/annex/.git/annex/webapp.html + error: git-annex died of signal 4 + $ +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment new file mode 100644 index 000000000..d73e8cb06 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="I could help with this" + date="2013-07-15T19:29:26Z" + content=""" +I could help to track down this bug however I would need some assistance on where to start :) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment new file mode 100644 index 000000000..fca9ba58e --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnt7phVzBQ0xO5rCO6sfmEmxQItmFMyqls" + nickname="Kevin" + subject="comment 20" + date="2013-11-02T01:02:18Z" + content=""" +Also, to avoid hurt feelings etc., it might be best to make it clear on your home page and kickstarter that you do not intend to support OS X yourself. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment new file mode 100644 index 000000000..a0a175d30 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 21" + date="2013-11-08T19:22:17Z" + content=""" +Now that I can try running the 10.8 dmg on 10.9 myself, I get this failure: + +
+oberon:~ joeyh$ /Volumes/git-annex/git-annex.app/Contents/MacOS/git-annex
+dyld: Symbol not found: _objc_debug_taggedpointer_mask
+  Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
+  Expected in: /Volumes/git-annex/git-annex.app/Contents/MacOS/bundle/I
+ in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
+
+ +This makes me think that that adding back the OSX frameworks might possibly yield a dmg that can work on both versions. Although that's probably more likely to work if it's built on 10.8 and used on 10.9 than the other way around. Might be worth a try to revert commit 900351ab8585c171486cef853eff4a95ec151e6f and commit 9b663c7f8cf82cee523b75be1a8786fa7d34b428 to try that. + +Oh well, I should have a native 10.9 dmg autobuild set up before too long. 10.8 autobuilder has built its last image unfortunately, due to being upgraded to 10.9. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment new file mode 100644 index 000000000..e5942bfd4 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 22" + date="2013-11-14T18:55:54Z" + content=""" +Native 10.9 autobuilder is now running. + +Lacks XMPP support until I get libxml2 linked on the autobuilder. Only tested on the build machine so far. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment new file mode 100644 index 000000000..db8d835d2 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="comment 23" + date="2013-11-14T19:22:16Z" + content=""" +Seems to work on my Mavericks Macbook Air. Thank you! +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment new file mode 100644 index 000000000..c3a0d3bec --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="comment 24" + date="2013-11-17T17:01:14Z" + content=""" +Thanks Joey! It works great +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment new file mode 100644 index 000000000..6bf0a17f4 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-15T20:12:04Z" + content=""" +AIUI, the git-annex dmg bundles several libraries and things that are not portable between OSX versions. So, the fix is probably to build git-annex from source on OS X 10.9. + +Following the [[install/cabal]] instructions would be a good first step to see if that gets a working git-annex. + +It seems likely that an autobuilder machine will need to be added for OS X 10.9 eventually. Maybe the guy who's providing the Mtn Lion build machine plans to upgrade it, and I can use that. Otherwise, it'll probably depend on someone with a 10.9 machine either setting up an autobuilder, or giving me a ssh account so I can run one. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment new file mode 100644 index 000000000..cdff138ad --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="comment 3" + date="2013-07-16T07:18:35Z" + content=""" +I got some problems building gpm on 10.9, will have to dig a bit more and see what's going on. It might be my environment. But for now I can't build gpm, thus no gnutls. I could try to build and install git-annex only without the assistant and webapp. + +BTW, how is the .app file generated? Is there an Xcode project or something like that? +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment new file mode 100644 index 000000000..f613f296e --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 4" + date="2013-07-16T17:48:54Z" + content=""" +The dmg is built by running \"make osxapp\", once you've gotten git-annex to build. + +gnutls is only needed by the XMPP code. You can build without that, using `cabal configure -f-XMPP; cabal build` + +(If you're building from a git checkout, building w/o XMPP was broken the past couple days; make sure you update to current head.) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment new file mode 100644 index 000000000..33c1319b3 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="comment 5" + date="2013-07-16T19:52:28Z" + content=""" +Ok, I will try without XMPP. However I'm going to need it, because, if I understood correctly, it is needed to do remote pairings. But for now I can manage without as I can take the laptop with me to work and to syncing locally. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment new file mode 100644 index 000000000..fbb519bdd --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYsjf5dcZnzs0b9EPxnjVddx1rnrpZASs" + nickname="Duarte" + subject="Any news?" + date="2013-08-31T15:48:39Z" + content=""" +Has anyone made any progress on this? Just wondering... +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment new file mode 100644 index 000000000..db8e707cd --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBcKrChzs1mdF5pxnenPuMOaJBKfbeRVY" + nickname="Raffael" + subject="bump" + date="2013-10-24T07:03:56Z" + content=""" +As Mavericks is now the current version of Mac OS X, it would be cool to have a working DMG for it. Any news here? +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment new file mode 100644 index 000000000..708f21a79 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="67.223.1.203" + subject="comment 8" + date="2013-10-24T17:14:06Z" + content=""" +As I don't own any mac hardware, and don't plan to buy any, and I don't know of a way to just spin up a OSX VM in the cloud, I'm reliant on git-annex users for running builds for the various versions of OS X. + +I think there's a chance that one of the two people currently doing builds for older versions will upgrade their system. Although of course then we lose builds for that older version. Alternatively, I'm waiting for someone to either volenteer to set up a builder for 10.9, or give me ssh access to a machine were I can do it. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment new file mode 100644 index 000000000..d70d0a872 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="67.223.1.203" + subject="comment 9" + date="2013-10-24T17:27:04Z" + content=""" +Anyone trying to compile git-annex on OSX 10.9 will need to be aware of and work around this problem: + + +"""]] diff --git a/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn b/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn new file mode 100644 index 000000000..021d782de --- /dev/null +++ b/doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. + +Running `git-annex enableremote remote` without a suitable key available leaves a partially unconfigured git remote. + +Subsequently making the key available and running `git-annex enableremote remote` a second time fails as the remote now partially exists. + +Removing the remote with `git remote remove remote` and then re-running `git-annex enable remote` seems to do the trick. + +However, I notice that even after syncing my special remotes are missing some details in the git config file - namely the `annex-gcrypt` and `annex-uuid` (there may have been more). I fixed by adding the details from a working repo. + +Finally, when I initially created the gcrypt repo (by hand) I specified the remote as a local directory on the machine in question i.e. `gcrypt::/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus` I then decided to make it available and changed it (via `git remote rename` to `gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus`. Unfortunately on other machines when I `git enableremote` it recovers the original remote which obviously doesn't work - how can I update this setting? + +Phew! + + + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn b/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn new file mode 100644 index 000000000..c0e634872 --- /dev/null +++ b/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. +I'm attempting to set up an ssh remote on windows. I've configured a key pair for it and set GIT_SSH to use plink. git fetch works correctly, but git annex info shows this: + +[[!format sh """ +C:\Users\db48x\annex>git annex info +repository mode: direct +trusted repositories: "ssh": argonath: no address associated with name + + Remote argonath does not have git-annex installed; setting annex-ignore +"""]] + +etc. Apparently it's trying to use the included ssh binary instead of my GIT_SSH setting. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 5.20140529-gb71f9bf + build flags: Assistant Pairing Testsuite S3 DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + +> [[dup|done]] of [[todo/git-annex_ignores_GIT__95__SSH]] --[[Joey]] diff --git a/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn new file mode 100644 index 000000000..691591519 --- /dev/null +++ b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. + +I’m not sure whether this is a bug or a technical limitation, but here +you go: In direct mode, if a file is locally changed but unsynced, +«git annex whereis» and «git annex list» behave as if the file were +still unchanged. Any changes would only show after «git annex sync» or +«git annex add» (altough I’m not sure what the latter does if a file +is already annexed). + +Syncing prior to «whereis» is not viable since I might not want to +proliferate the changes to other remotes. Would it be reasonable making +sure that «whereis» considers uncommitted local changes? + +If doing so is too expensive to do implicitly, it would be useful +having an explicit means of seeing local changes in direct mode +repositories. Is «git annex add» the intended way of doing so? + +### What steps will reproduce the problem? + +1. Clone A to B. +2. Get file $f from A to B. +3. Switch B to direct mode. +4. Edit file $f. +5. «git annex list» reports that $f is on both A and B. + +### What version of git-annex are you using? On what operating system? +git-annex 5.20140421 +Linux 3.14.3 + +[[!tag confirmed]] diff --git a/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_1_99e8d2c1bbc23438f954d8ddc827078e._comment b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_1_99e8d2c1bbc23438f954d8ddc827078e._comment new file mode 100644 index 000000000..83663316c --- /dev/null +++ b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_1_99e8d2c1bbc23438f954d8ddc827078e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 1" + date="2014-05-13T20:41:48Z" + content=""" +Crosslink to related wishlist item +http://git-annex.branchable.com/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/ +"""]] diff --git a/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_2_7c8d91d78608d717164cb3e825654654._comment b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_2_7c8d91d78608d717164cb3e825654654._comment new file mode 100644 index 000000000..a2cf16cb8 --- /dev/null +++ b/doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/comment_2_7c8d91d78608d717164cb3e825654654._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 2" + date="2014-05-19T17:04:16Z" + content=""" +Direct mode and indirect mode behave the same here -- in indirect mode, if you unlock and modify a file, whereis will show the location of the annexed file, not the un-added version. In general all git-annex commands except of course `add` and `status` operate on the files that are staged in the index or committed, not un-staged files in the work tree. This is consistent with git's own behavior. + +It is true that in direct mode, whereis will say that a file that has been modified is present locally, even though the modification has changed the only local copy of the file -- so it's not actually present locally. However, I don't think it makes sense to make whereis check if the file is actually still locally present before showing it is. whereis shows location tracking information, which can be out of date for many reasons. +"""]] diff --git a/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn b/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn new file mode 100644 index 000000000..24f04eeb5 --- /dev/null +++ b/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn @@ -0,0 +1,46 @@ +I discovered a problem with `git annex map` and relative urls containing `~`. +In this case i have a remote `noam` configured with the the following urls: + + zsh» git remote show noam | head -3 + * remote noam + Fetch URL: noam:bare-annex + Push URL: noam:bare-annex + +If i try to run `git annex map` i get the following error: + + zsh» git annex map + map /home/esc/annex ok + map noam (sshing...) + bash: line 0: cd: /~/bare-annex/: No such file or directory + Command ssh ["noam","cd '/~/bare-annex/' && git config --list"] failed; exit code 1 + (sshing...) + ok + + running: dot -Tx11 map.dot + + ok + +If i run the failing command manually, i get: + + zsh» ssh noam "cd ~/bare-annex && git config --list" + core.repositoryformatversion=0 + core.filemode=true + core.bare=true + annex.uuid=f267f55c-0732-11e1-a93b-93119f9aaf54 + annex.version=3 + +Also i can change the remote url to an absolute one, in which case `git annex +map` works too: + + zsh» git remote set-url noam noam:/home/esc/bare-annex + zsh» git annex map + map /home/esc/annex ok + map noam (sshing...) + ok + + running: dot -Tx11 map.dot + + ok + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn b/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn new file mode 100644 index 000000000..27bdc3241 --- /dev/null +++ b/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn @@ -0,0 +1,18 @@ +Hello all! + +I'm doing tests with git annex to see how it works, and to start with it I'm trying to track my /home using some kind of a *white list* with .gitignore. + +So I have this .gitignore file: + + /* + !/web + + !/Desktop + /Desktop/* + !/Desktop/Work + +and when I do *git annex add .* it works as expected: It adds only ~/web and ~/Desktop/Work... but when I do *git annex status* it shows me the entire /home... it seems that *git annex status* doesn't use .gitignore... is this a bug or an intended behavior? + +Thanks for your time :) + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn new file mode 100644 index 000000000..1056e96ff --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. +When "git annex sync --content" is used only objects currently in the working tree are synced. It doesn't honor full archives, which should get all objects. +So only objects similar to "git annex find --want-get" are synced and not every available object "git annex get --all" + + +### What steps will reproduce the problem? +# mein repo: +git annex add file +git annex sync +git annex rm file +git annex sync + +# other repo: +git annex wanted here "not copies=backup:3" +git annex find --want-get # will be empty +git annex sync --content # nothing is synced even so all files should be backed up +git annex get --all # will sync the object from file + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag confirmed]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment new file mode 100644 index 000000000..e395eac0e --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-20T19:34:29Z" + content=""" +Yep, sync --content only looks at the work tree. + +I suppose that the assistant does a better job in this situation, since if it cannot access an archive repo, it will remember that it tried to send a file to it, and retry that transfer later -- even if in the meantime the file has gotten deleted out of the work tree (and still has content present, due to using indirect mode). I'm actually not 100% sure .. the assistant may give up on transferring a file if it's gotten removed from the work tree. It's worth considering this because I basically want sync --content to do the same syncing that the assistant does. + +Anyway, sync --content could certianly look at all keys present in the annex. This would require a separate pass, and it might then try to upload a key twice, once from work tree, and once from annex, and fail twice. + +Maybe it would be better to have this as a separate --content --all. It might also make sense to keep sync --content only looking at the work tree by default to support cases where there are multiple branches and you only want to sync one. + +I think this needs more thought. +"""]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment new file mode 100644 index 000000000..4560e10d9 --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Some ideas for content sync" + date="2014-02-20T21:18:30Z" + content=""" +I agree that it is a tricky situation. The main issue I have is that archive preferred content expressions indicates that all versions are transferred, but when you (worst case) migrate full archives to other disks and just use git annex sync --content, you would loose all objects. + +I like the idea of --content --all as this would be consistent with other commands such as fsck for example. +Still it seems with preferred content expressions only applying to working tree data that it would still miss \"copies=backup:2\" for example and only use working tree files. Which is misleading and could lead to dataloss in my opinion. + +So the best would probably be to let preferred content for number of copies at least work on all objects, either per default or when \"git annex sync --content --all\" is used. You wouldn't run that on usual repos, but definitely on backup, archive or similar repos. + +"""]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment new file mode 100644 index 000000000..34c2c4c16 --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Ídea" + date="2014-02-23T14:25:22Z" + content=""" +I thought about the implementation need for git annex sync --content --all. If preferred content expressions would work it would be needed. Everything else. could be done via a split usage. +Run \"git annex sync --content\" to satisfy the preferred content expressions on the working tree and the numcopies on the working tree and then loop through all backup/archive repositories with \"git annex get --auto\" this should at least prevent archives from getting objects numcopies is already satisfying and sync the objects not yet satisfied right? +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn new file mode 100644 index 000000000..619e8e5b8 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn @@ -0,0 +1,42 @@ +### Please describe the problem. + +I plugged in a usb drive, did git annex sync and it git fast-forward and deleted about 600 files that I had added on my laptop. + +### What steps will reproduce the problem? + +Obviously, I'm not sure really because I don't plug this usb drive every day to sync so I don't remember what I did last time. But I suppose I just finished with git annex sync and unplugged it. When the accident occured: + + 1. The usb drive was in direct mode whereas the laptop was in indirect mode at the time. + 2. I git annex sync the usb drive + 3. I git annex sync the laptop + +Anyway, the big mistake I did was syncing the laptop as well, naively thinking it would correct the usb drive; but instead it also deleted the files on the laptop. I had a back up of most of it so it was okay. + +--- + +So now I git reset --hard to a commit before I synced, so I still have my files. But how can I fix this situation? + +### What version of git-annex are you using? On what operating system? + +Arch Linux + +git-annex version: 5.20140128 +build flags: S3 DBus TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[closing|done]], not a bug based on the limited description. --[[Joey]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment new file mode 100644 index 000000000..f0abd4507 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment @@ -0,0 +1,72 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawno-jcsScu4CK6k2QLZqxMros1PQHf1NQY" + nickname="Hugo" + subject="Sync messed up" + date="2014-03-09T12:16:32Z" + content=""" +So, I have now reseted to a previous commit all the branches: git-annex, master, synced/git-annex and synced/master in other usb drives. i can git pull and git push, etc. But every time I try a git annex sync, it's deleting files again. + +For instance: + +``````````````` +(merging laptop/git-annex laptop/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull wdrouge +Depuis /run/media/hrd/WD-rouge/annex/hrd + * [nouvelle branche] git-annex -> wdrouge/git-annex + e5894a1..f5af709 master -> wdrouge/master + * [nouvelle branche] synced/git-annex -> wdrouge/synced/git-annex + * [nouvelle branche] synced/master -> wdrouge/synced/master +ok +pull origin +Depuis /home/hrd + + 93d883b...f5af709 git-annex -> origin/git-annex (mise à jour forcée) + e5894a1..f5af709 master -> origin/master + + c8c2481...f5af709 synced/git-annex -> origin/synced/git-annex (mise à jour forcée) + 1d2a028..ac708e3 synced/master -> origin/synced/master + * [nouvelle étiquette] should-be-fine-here -> should-be-fine-here + +Mise à jour f5af709..ac708e3 +Fast-forward + +→ a bunch of files + 621 files changed, 22 insertions(+), 599 deletions(-) + delete mode 120000 → the bunch of files…………… + … + delete mode 120000 org/gtd.org_archive +ok +pull laptop +Depuis /home/hrd + + 93d883b...f5af709 git-annex -> laptop/git-annex (mise à jour forcée) + + c8c2481...f5af709 synced/git-annex -> laptop/synced/git-annex (mise à jour forcée) + 1d2a028..ac708e3 synced/master -> laptop/synced/master + +Already up-to-date. +ok +push wdrouge +Counting objects: 6609, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (3057/3057), done. +Writing objects: 100% (3331/3331), 511.27 KiB | 0 bytes/s, done. +Total 3331 (delta 2091), reused 0 (delta 0) +To /run/media/hrd/WD-rouge/annex/hrd + f5af709..16f17bf git-annex -> synced/git-annex + f5af709..ac708e3 master -> synced/master +ok +push origin +Counting objects: 6569, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (3056/3056), done. +Writing objects: 100% (3330/3330), 511.05 KiB | 0 bytes/s, done. +Total 3330 (delta 2091), reused 0 (delta 0) +To /home/hrd/ + f5af709..16f17bf git-annex -> synced/git-annex +ok +push laptop +Everything up-to-date +ok +git annex sync 14.33s user 1.87s system 74% cpu 21.696 total +`````````````````` + +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment new file mode 100644 index 000000000..277a72b63 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-03-10T17:11:41Z" + content=""" +Your laptop is in indirect mode, so we know that the only way files can be deleted by a merge is if a commit was made to git that deletes the files. + +My conclusion is that some repository, perhaps the usb drive, made a commit that deleted those files. You should be able to find this commit with `git log --stat`, and can just `git revert` it if you want to. + +So far, I don't see evidence of a bug. For all I know, you actually did delete the files on the usb drive, and that change got committed.. +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment new file mode 100644 index 000000000..edf2b26a8 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawno-jcsScu4CK6k2QLZqxMros1PQHf1NQY" + nickname="Hugo" + subject="comment 3" + date="2014-03-13T14:36:20Z" + content=""" +> My conclusion is that some repository, perhaps the usb drive, made a commit that deleted those files. You should be able to find this commit with git log --stat, and can just git revert it if you want to. + +It would be surprising if I did that. + +Anyway, I was not able to find which commit deleted the ~600 files. I just decided to re-start completely with git annex :-/ + +The good thing is that I did not lose any file, so in that regard git annex is great ;^) + +However, one thing that is quite confusing to me is the way git annex [sync] works. Am I supposed to run git annex sync in every repository? Because if I just run it once in 1 repo, then I usually don't get all the syncing done. Maybe I just don't understand something. + +Thanks for replying, + +[sync]: http://git-annex.branchable.com/sync/ +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment new file mode 100644 index 000000000..6c519e632 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 4" + date="2014-03-13T15:54:28Z" + content=""" +Did you run `git log --stat` and look for a commit that deleted a lot of files? +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn new file mode 100644 index 000000000..fbe46ab2d --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +In a direct mode repo (crippled/uncrippled filesystem does not matter), when a symlink is marked using `git update-index --skip-worktree ` and removed, git annex sync still `git rm`s the symlink. This does not happen in indirect mode (git annex sync leaves the symlink in git intact). + +### What steps will reproduce the problem? + +[[!format sh """ +mkdir test-repo; cd test-repo +git init +git annex init +echo file1 >file1 +git annex add +git commit -m"update" +cd .. +git clone test-repo test-repo2; cd test-repo2 +git annex init +git annex direct +git update-index --skip-worktree file1 +rm file1 +git annex sync +"""]] + +Output of `git annex sync` indicates file has been removed from git. Repeating these steps without the `git annex direct` above to set the second repo to direct mode will succeed in retaining the symlink in git. + +### What version of git-annex are you using? On what operating system? + +4.20130521 using git-annex-standalone AUR build (uses Linux executable tarball) on Arch Linux + +### Please provide any additional information below. + +I'd like to use the skip-worktree scheme in order to be able to rm the symlink files (from the filesystem, not git), specifically for my Android devices. Syncing my music annex creates .mp3 symlinks that aren't actually MP3s, which gives the stock apps some fits. This would only be for clearing out symlinks; I fully understand that trying to doing this for downloaded content in a direct repo would be a Class A no-no. :-) + +I did a little digging in the code, and it looks like the source of this is the stageDirect step done specifically by `git annex sync` in direct repos (which makes sense, since indirect repos work). It does `git ls-files --others --exclude-standard --stage`. This list includes files marked skip-worktree, which means skip-worktree files would be treated like normal, and deleted because it's no longer there. There is an additional `-t` argument that could be added to ls-files that would provide the tag field to indicate if a file was marked skip-worktree, and they could be filtered out of processing. + +I wonder if this would have side effects, or if there are other places in the code where skip-worktree files would need to be handled, though. I'm particularly motivated to solve this, so let me know if it doesn't look like it would get looked at right away, and I'll have an excuse to get a Haskell dev environment setup again and shake the rust off. + +[[!tag confirmed]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment new file mode 100644 index 000000000..e7baee584 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-29T16:45:03Z" + content=""" +I'm a little worried about -t being \"semi-deprecated\". I don't know if it would be possible to use either of the other commands the man page suggests to get the info needed by `stageDirect`. (Particularly the Sha of their staged contents.) + +All of git-annex's access to the repository tree goes via Git.LsFiles and AFAICS, all the other git commands used there do respect skip-worktree. + +I encourage you to work on this, since you're motivated. +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment new file mode 100644 index 000000000..a252c5ea9 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="12.130.123.174" + subject="comment 2" + date="2013-05-31T13:38:43Z" + content=""" +I share the concerns about the semi-deprecated status, although it's probably safer than they make it sound in the man page. The git test suite for sparse checkouts uses the same command to find files with skip-worktree set, and there are other tools that use it as well (magit being one example). The git maintainers couldn't remove it, or even fully deprecate it for eventual removal. It's been semi-deprecated for almost 3 years. + +I have a patch that fixes `git annex sync` and `git annex get` (it retrieved files marked skip-worktree) and it passes `git annex test`, but I'm going to more rigorously test it out on my particular use case before calling it good. When it is ready, I didn't see instructions on how you would like patches submitted anywhere in the wiki. How would you like to receive it? +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment new file mode 100644 index 000000000..b92ec0f13 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-31T18:22:12Z" + content=""" +I accept patches by email, or pull requests. +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment new file mode 100644 index 000000000..c593d41e1 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="ping?" + date="2014-03-19T20:54:57Z" + content=""" +You had a patch, but never shared it. I'm curious to see it.. +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_5_cb98789c50c58f01055183dbaf7b4eba._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_5_cb98789c50c58f01055183dbaf7b4eba._comment new file mode 100644 index 000000000..d40d2d789 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_5_cb98789c50c58f01055183dbaf7b4eba._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="24.251.129.149" + subject="comment 5" + date="2014-04-09T03:28:24Z" + content=""" +I'm afraid I abandoned this patch. It worked, but was still fidgety for being able to ignore parts of the tree. I found another way to do what I wanted by loading an indirect repo into /data and taking advantage of a surprise side effect in how the /sdcard filesystem translated the symlinks from the ext4 filesystem. + +I can probably scare it up from my archives, but it hasn't been kept up to date. The good news is (as I recall) the patch was pretty small. + +"""]] diff --git a/doc/bugs/git_annex_unlock_is_not_atomic.mdwn b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn new file mode 100644 index 000000000..6d324ff50 --- /dev/null +++ b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn @@ -0,0 +1,7 @@ +Running a command like + +git annex unlock myfile + +is not atomic, that is if the execution is aborted you may end up with an incomplete version of myfile in the directory. If you don't notice this you may lock it again and then propagate this bad version of the file to your other repositories. A simple workaround is to simply name it something else while unlocking and then rename it to the correct filename once it's completely copied. I don't know Haskel yet so I can not fix this issue otherwise I would sure try. A part from this, I love git annex. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn b/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn new file mode 100644 index 000000000..05aa69572 --- /dev/null +++ b/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn @@ -0,0 +1,15 @@ +[[!meta title="`git annex unused` fails on empty repository"]] + +The ``git annex unused`` command fails on a git-annex repository, if there are no objects yet: + + $ git annex unused + unused (checking for unused data...) + git-annex: /tmp/annextest/other_annex/.git/annex/objects: getDirectoryContents: does not exist (No such file or directory) + git-annex: 1 failed + $ + +This can give a user (especially one that wants to try out simple commands with his newly created repo) the impression that something is wrong, while it is not. I'd expect the program either to show the same message ``git annex unused`` shows when everything is ok (since it is, or should be). + +This can be a bug in the ``unused`` subcommand (that fails to accept the absence of an objects directory) or in the ``init`` subcommand (that fails to create it). + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn new file mode 100644 index 000000000..9daf8a0cb --- /dev/null +++ b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn @@ -0,0 +1,33 @@ +"git annex upgrade" has lost track of some of my files. Most of them have "&" characters. The others contain "%" characters (I haven't tried the testcase below with "%" however). + +Testcase: + + # (With git annex v2) + mkdir ~/testannex1 + cd ~/testannex1 + git init + git annex init "testannex1" + touch '02 - Afternoons & Coffeespoons.mp3' + touch 'no ampersand.mp3' + git annex add '02 - Afternoons & Coffeespoons.mp3' + git annex add 'no ampersand.mp3' + git commit -m added + git annex whereis '02 - Afternoons & Coffeespoons.mp3' + git annex whereis 'no ampersand.mp3' + # (Upgrade git-annex binary to v3 and then...) + git annex upgrade + git annex whereis '02 - Afternoons & Coffeespoons.mp3' + git annex whereis 'no ampersand.mp3' + +This produces: + + 12:38:40 ~/testannex1 (master)$ git annex whereis '02 - Afternoons & Coffeespoons.mp3' + whereis 02 - Afternoons & Coffeespoons.mp3 (0 copies) + failed + git-annex: 1 failed + 12:38:40 ~/testannex1 (master)$ git annex whereis 'no ampersand.mp3' + whereis no ampersand.mp3 (1 copy) + a7b680fc-a8d0-11e0-b0fe-4f94e86d1fb7 -- testannex1 <-- here + ok + +[[!tag done]] diff --git a/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment new file mode 100644 index 000000000..194b36ac1 --- /dev/null +++ b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-07-07T21:04:23Z" + content=""" +What an evil little bug. In retrospect, this probably bit my own test upgrades, but I ran `git annex fsck` everywhere and so avoided the location log breakage. + +I've fixed the bug, which also involved files with other punctuation in their names [&:%] when using the WORM backend. + +The only way I have to recover repos that have already been upgraded is to run `git annex fsck --fast` in each clone of such a repo, which will let it rebuild the location log information. I think that is the best way to recover; ie I can't think of a way to recover that doesn't need to do everything fsck does anyway. +"""]] diff --git a/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn new file mode 100644 index 000000000..f40fabd74 --- /dev/null +++ b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +webapp needs to be killed and restarted to finish setting up a new repository + +### What steps will reproduce the problem? + +I run on a remote linux server + +git annex webapp --listen=10.222.0.1:4000 + +I get a url printed + +click the url, it opens in my browser +click make a repository, and it doesn't finish loading the web page +if I ctrl-c git on the remote server and start it up again, click +the url again, i can continue to set up the new repository + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130709 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +debian wheezy with git-annex pinned from sid + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-07-19 08:09:54 EST] main: starting assistant version 4.20130709 +WebApp crashed: unable to bind to local socket +[2013-07-19 08:09:54 EST] WebApp: warning WebApp crashed: unable to bind to local socket + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True}) + + No known network monitor available through dbus; falling back to polling +(scanning...) [2013-07-19 08:09:54 EST] Watcher: Performing startup scan +(started...) Merge made by the 'recursive' strategy. + ...book.azw | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 Books/book.azw +[2013-07-19 08:13:03 EST] Committer: Committing changes to git + + +# End of transcript or log. +"""]] + +> Duplicate; [[closed|done]]. --[[Joey]] diff --git a/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment new file mode 100644 index 000000000..11c4c181b --- /dev/null +++ b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-20T19:57:05Z" + content=""" +This is a known problem with using --listen with a forced port number. See [[Hangs_on_creating_repository_when_using_--listen]] +"""]] diff --git a/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn b/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn new file mode 100644 index 000000000..181b02b5c --- /dev/null +++ b/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn @@ -0,0 +1,15 @@ +This doesn't look right: + + simons 11148 0.0 0.0 15572 1268 pts/1 SN+ 04:00 0:00 | \_ git annex unannex stuff + simons 11150 0.5 0.0 130504 11212 pts/1 SN+ 04:00 3:40 | | \_ git-annex unannex stuff + simons 11152 0.0 0.1 39536 23932 pts/1 SN+ 04:00 0:00 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex ls-files --cached -z -- stuff + simons 11288 0.0 0.0 0 0 pts/1 ZN+ 04:01 0:00 | | \_ [git] + simons 11339 0.0 0.0 0 0 pts/1 ZN+ 04:02 0:00 | | \_ [git-annex] + simons 11442 0.0 0.0 0 0 pts/1 ZN+ 04:06 0:00 | | \_ [git] + simons 11443 0.0 0.0 0 0 pts/1 ZN+ 04:06 0:05 | | \_ [git] + simons 16541 0.0 0.0 0 0 pts/1 ZN+ 04:14 0:00 | | \_ [git] + simons 16543 0.3 0.0 15644 1744 pts/1 SN+ 04:14 2:13 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex cat-file --batch + simons 14224 0.0 0.0 100744 796 pts/1 SN+ 14:10 0:00 | | \_ xargs -0 git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex commit -a -m content removed from git annex + simons 14225 0.4 0.1 32684 18652 pts/1 DN+ 14:10 0:00 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex commit -a -m content removed from git annex -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a + +> [[Fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_mv_before_commit_breaks_symlinks.mdwn b/doc/bugs/git_mv_before_commit_breaks_symlinks.mdwn new file mode 100644 index 000000000..66a199e8c --- /dev/null +++ b/doc/bugs/git_mv_before_commit_breaks_symlinks.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +When I `git mv` a file that I just `git annex add`-ed without having `git commit`-ed it first, then the symlink will break. + +### What steps will reproduce the problem? + + $ mkdir foo + $ echo hello > foo/bar + $ git annex add foo/bar + $ git mv foo/bar . + +### What version of git-annex are you using? On what operating system? + +5.20140529 on Debian testing + +> This is fundamentally something git-annex cannot deal with, +> because there is no way to hook into git to fix the symlink when +> `git mv` moves the file. +> +> Instead, git-annex has several "good enough" fixes for the problem: +> +> * As soon as you `git commit`, the pre-commit hook will run `git annex +> fix` and this will fix the symlink before it gets committed. +> * You can run `git annex fix` yourself after `git mv`. +> * Even `git annex add $file` will fix the symlink if the file is already +> annexed. +> +> So, [[done]] --[[Joey]] diff --git a/doc/bugs/git_rename_detection_on_file_move.mdwn b/doc/bugs/git_rename_detection_on_file_move.mdwn new file mode 100644 index 000000000..306641cc2 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move.mdwn @@ -0,0 +1,14 @@ +It's unfortunate that git-annex sorta defeats git's rename detection. + +When an annexed file is moved to a different directory (specifically, a +directory that is shallower or deeper than the old directory), +the symlink often has to change. And so git log cannot --follow back +through the rename history, since all it has to go on is that symlink, +which it effectively sees as a one line file containing the symlink target. + +One way to fix this might be to do the `git annex fix` *after* the rename +is committed. This would mean that a commit would result in new staged +changes for another commit, which is perhaps startling behavior. + +The other way to fix it is to stop using symlinks, see [[todo/smudge]]. +[[!tag confirmed]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment b/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment new file mode 100644 index 000000000..6ea267728 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafael" + subject="comment 10" + date="2012-05-15T07:36:25Z" + content=""" +Won't git itself be fixed on this issue? It was on my plans to look into that, however I don't know how difficult it will be. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment b/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment new file mode 100644 index 000000000..8fec6bad7 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="use mini-branches" + date="2011-03-09T23:47:48Z" + content=""" +if you go for the two-commits version, small intermediate branches (or git-commit-tree) could be used to create a tree like this: + + + * commit 106eef2 + |\ Merge: 436e46f 9395665 + | | + | | the main commit + | | + | * commit 9395665 + |/ + | intermediate move + | + * commit 436e46f + | + | ... + +while the first commit (436e46f) has a \"`/subdir/foo → ../.git-annex/where_foo_is`\", the intermediate (9395665) has \"`/subdir/deeper/foo → ../.git-annex/where_foo_is`\", and the inal commit (106eef2) has \"`/subdir/deeper/foo → ../../.git-annex/where_foo_is`\". + +`--follow` uses the intermediate commit to find the history, but the intermediate commit would neither show up in `git log --first-parent` nor affect `git diff HEAD^..` & co. (there could still be confusion over `git show`, though). +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment b/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment new file mode 100644 index 000000000..7d50c58d1 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="praet" + ip="81.240.159.215" + subject="Use variable symlinks, relative to the repo's root ?" + date="2011-03-10T16:50:28Z" + content=""" +It all boils down to the fact that the path to a relative symlink's target is determined relative to the symlink itself. + +Now, if we define the symlink's target relative to the git repo's root (eg. using the $GIT_DIR environment variable, which can be a relative or absolute path itself), this unfortunately results in an absolute symlink, which would -for obvious reasons- only be usable locally: + + user@host:~$ mkdir -p tmp/{.git/annex,somefolder} + user@host:~$ export GIT_DIR=~/tmp + user@host:~$ touch $GIT_DIR/.git/annex/realfile + user@host:~$ ln -s $GIT_DIR/.git/annex/realfile $GIT_DIR/somefolder/file + user@host:~$ ls -al $GIT_DIR/somefolder/ + total 12 + drwxr-x--- 2 user group 4096 2011-03-10 16:54 . + drwxr-x--- 4 user group 4096 2011-03-10 16:53 .. + lrwxrwxrwx 1 user group 33 2011-03-10 16:54 file -> /home/user/tmp/.git/annex/realfile + user@host:~$ + +So, what we need is the ability to record the actual variable name (instead of it's value) in our symlinks. + +It *is* possible, using [variable/variant symlinks](http://en.wikipedia.org/wiki/Symbolic_link#Variable_symbolic_links), yet I'm unsure as to whether or not this is available on Linux systems, and even if it is, it would introduce compatibility issues in multi-OS environments. + +Thoughts on this? +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment b/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment new file mode 100644 index 000000000..534723254 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-16T03:03:19Z" + content=""" +Interesting, I had not heard of variable symlinks before. AFAIK linux does not have them. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment b/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment new file mode 100644 index 000000000..c265b5899 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="praet" + ip="81.240.27.89" + subject="Brainfart" + date="2011-03-20T20:11:27Z" + content=""" +Haven't given these any serious thought (which will become apparent in a moment) but hoping they will give birth to some less retarded ideas: + +--- + +### Bait'n'switch + +- pre-commit: Replace all staged symlinks (when pointing to annexed files) with plaintext files containing the key of their respective annexed content, re-stage, and add their paths (relative to repo root) to .gitignore. +- post-commit: Replace the plaintext files with (git annex fix'ed) symlinks. + +In doing so, the blobs to be committed can remain unaltered, irrespective of their related files' depth in the directory hierarchy. + +To prevent git from reporting ALL annexed files as unstaged changes after running post-commit hook, their paths would need to be added to .gitignore. + +This wouldn't cause any issues when adding files, very little when modifying files (would need some alterations to \"git annex unlock\"), BUT would make git totally oblivious to removals... + +--- + +### Manifest-based (re)population +- Keep a manifest of all annexed files (key + relative path) +- DON'T track the symlinks (.gitignore) +- Populate/update the directory structure using a post-commit hook. + +... thus circumventing the issue entirely, yet diffstats (et al.) would be rather uninformative. + +--- + +***Wide open to suggestions, criticism, mocking laughter and finger-pointing :)*** +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment b/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment new file mode 100644 index 000000000..93db97e70 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="praet" + ip="81.242.56.203" + subject="comment 5" + date="2011-03-21T19:58:34Z" + content=""" +In the meantime, would it be acceptable to split the pre-commit hook +into two discrete parts? + +This would allow to (if preferred) defer \"git annex fix\" until +post-commit while still keeping the safety net for unlocked files. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment b/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment new file mode 100644 index 000000000..7398ac561 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="extra level of indirection" + date="2011-12-19T12:45:18Z" + content=""" +Surely this could be handled with an extra layer of indirection? + +git-annex would ensure that every directory containing annexed data contains a new symlink `.git-annex` which points to `$git_root/.git/annex`. Then every symlink to an annexed object uses a relative symlink via this: `.git_annex/objects/xx/yy/ZZZZZZZZZZ`. Even though this symlink is relative, moving it to a different directory would not break anything: if the move destination directory already contained other annexed data, it would also already contain `.git-annex` so git-annex wouldn't need to do anything. And if it didn't, git-annex would simply create a new `.git-annex` symlink there. + +These `.git-annex` symlinks could either be added to `.gitignore`, or manually/automatically checked in to the current branch - I'm not sure which would be best. There's also the option of using multiple levels of indirection: + + foo/bar/baz/.git-annex -> ../.git-annex + foo/bar/.git-annex -> ../.git-annex + foo/.git-annex -> ../.git-annex + .git-annex -> .git/annex + +I'm not sure whether this would bring any advantages. It might bring a performance hit due to the kernel having to traverse more symlinks, but without benchmarking it's difficult to say how much. I'd expect it only to be an issue with a large number of deep directory trees. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment b/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment new file mode 100644 index 000000000..0a045feb6 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-12-19T18:22:25Z" + content=""" +That seems an excellent idea, also eliminating the need for git annex fix after moving. + +However, I think CVS and svn have taught us the pain associated with a version control system putting something in every subdirectory. Would this pain be worth avoiding the minor pain of needing git annex fix and sometimes being unable to follow renames? +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment b/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment new file mode 100644 index 000000000..d53022302 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 8" + date="2011-12-20T12:00:11Z" + content=""" +Personally I'd rather have working rename detection but I agree it's not 100% ideal to be littering multiple directories like this, so perhaps you could make it optional, e.g. based on a git config setting? + +Here are a few more considerations, some in defence of the approach, some against it: + +* `.git-annex` is hidden; `CVS/` is not. +* Unlike `CVS/` and `.svn/`, it's only a symlink, not a directory containing other files. +* It doesn't contain any data specific to that directory and could easily be regenerated if deleted accidentally or otherwise. +* If a whole directory containing `.git-annex` was moved within the repository: + * git-annex would need to fix up these symlinks if and only if it's moved to a different depth within the tree. + * However, if the multi-level indirection approach is used, `.git-annex` in any subdirectory is *always* a symlink to `../.git-annex` so instead you would need to check that all of the new ancestors contain this symlink too, and optionally remove any no longer needed symlinks. + * In either case, git-annex already goes to the trouble of fixing symlinks, and if anything, I *think* this approach would reduce the number of symlinks which need checking (right?) +* find `$git_root/foo -follow`, `diff -r` etc. would traverse into `$git_root/.git/annex` + +This last point is the only downside to this approach I can think of which gives me any noticeable cause for concern. However, people are already use to working around this from CVS and svn days, e.g. `diff -r -x .svn` so I don't think it's anywhere near bad enough to rule it out. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment b/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment new file mode 100644 index 000000000..919455bdc --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 9" + date="2011-12-20T14:56:12Z" + content=""" +Git can follow the rename fine if the file is committed before `git annex fix` (you can git commit -n to see this), so +making git-annex pre-commit generate a fixup commit before the staged commit would be one way. Or the other two ways I originally mentioned when writing down this minor issue. I like all those approaches better than .git-annex clutter. +"""]] diff --git a/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn new file mode 100644 index 000000000..449a99753 --- /dev/null +++ b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. + +When git-annex assistant on Android setups up the DCIM repo a .gitignore file is dropped into place which ignores .thumbnails/* . Unfortunately this doesn't match .thumbnails/.thumbdata* - I have a 700MB file which matches this pattern. + +I suspect that making the pattern in .gitignore just .thumbnails should resolve this. + +### What steps will reproduce the problem? + +Create a repo + +### What version of git-annex are you using? On what operating system? + +Nightly build for Android from yesterday (2013-11-16) + +### Please provide any additional information below. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment new file mode 100644 index 000000000..b90108bc4 --- /dev/null +++ b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-16T22:45:52Z" + content=""" +\".thumbnails/*\" in .gitignore makes git ignore dotfiles in the directory in my testing, and according to git's own documentation. + +However, it is the case that subdir/.thumbnails/* are not ignored by \".thumbnails/*\", but \".thumbnails\" will indeed ignore .thumbnails directories at any point in the tree. So, I've made the change you suggested. + +(I also tested on android, with 1.8.4.1.559 and the assistant was able to honor the .gitignore, and did not add any files from `.thumbnails/`.) +"""]] diff --git a/doc/bugs/glacier_from_multiple_repos.mdwn b/doc/bugs/glacier_from_multiple_repos.mdwn new file mode 100644 index 000000000..3b6bb57f7 --- /dev/null +++ b/doc/bugs/glacier_from_multiple_repos.mdwn @@ -0,0 +1,16 @@ +glacier-cli currently relies on a local cache of +inventory information, and so other git-annexes using the same glacier +repository are not able to access stuff in it, unless and until +`glacier vault sync` is run. + +An example of this causing trouble is with the assistant. When a file is +moved into archive/, the assistant that sends it to glacier is able to +trust that it's in glacier and remove the local copy. But other assistants +that also have a copy cannot trust that, and so don't remove their copies. + +I've discussed with glacier-cli's author making git-annex store enough info +in its branch to be able to bootstrap glacier-cli to know about a file. +This seems doable and he had a design; waiting on movement +on the glacier-cli side. + +[[!tag confirmed]] diff --git a/doc/bugs/googlemail.mdwn b/doc/bugs/googlemail.mdwn new file mode 100644 index 000000000..0995a9729 --- /dev/null +++ b/doc/bugs/googlemail.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. +Git-Annex crashes when configuring jabber account with foo.bar@googlemail.com + +### What steps will reproduce the problem? +Configure the Jabber Account with foo.bar@googlemail.com instead of foo.bar@gmail.com. The domain googlemail was used for a long time in germany because of a license issue. + +### What version of git-annex are you using? On what operating system? +Mac OS X - 10.8.3 Mountain Lion + +Version: 4.20130709-g18e5f43 + +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + + +[[!meta title="xmpp fails to work with googlemail domain"]] +[[!tag design/assistant]] diff --git a/doc/bugs/gpg-agent.mdwn b/doc/bugs/gpg-agent.mdwn new file mode 100644 index 000000000..df5106a8c --- /dev/null +++ b/doc/bugs/gpg-agent.mdwn @@ -0,0 +1,5049 @@ +### Please describe the problem. +I'm running git-annex on OSX 10.9.3. The problem is that during sync with an git-annex remote the system gets flooded with gpg-agent processes which are never stopped, eventually running out of user processes. + +[[!tag moreinfo]] + +### What steps will reproduce the problem? +Any synchronization of a lot of files with a git-annex remote. + +### What version of git-annex are you using? On what operating system? +5.20140517-g0aed6d9. + +The problem did not appear on any older version. + +### Please provide any additional information below. + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2014-05-25 18:15:53 CEST] main: starting assistant version 5.20140517-g0aed6d9 +[2014-05-25 18:16:02 CEST] main: Syncing with diskstation +Everything up-to-date +[2014-05-25 18:16:16 CEST] UpgradeWatcher: Finished upgrading git-annex to version 5.20140517-g0aed6d9 +[2014-05-25 18:16:16 CEST] TransferScanner: Syncing with diskstation +Already up-to-date. +Already up-to-date. +Everything up-to-date +[2014-05-25 18:16:36 CEST] main: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 95ae98a..16f51d5 git-annex -> synced/git-annex + +WORM-s196517551-m1400608062--An Introduction to d3.js - From Scattered to Scatterplot%01_introduction.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3670016 1% 3.40MB/s 0:00:55 + 6750208 3% 3.17MB/s 0:00:58 + 9830400 5% 3.09MB/s 0:00:59 + 12976128 6% 3.03MB/s 0:00:59 + 15990784 8% 2.90MB/s 0:01:00 + 18644992 9% 2.79MB/s 0:01:02 + 21528576 10% 2.75MB/s 0:01:02 + 24543232 12% 2.73MB/s 0:01:01 + 27557888 14% 2.72MB/s 0:01:00 + 30834688 15% 2.85MB/s 0:00:56 + 33980416 17% 2.89MB/s 0:00:55 + 36995072 18% 2.88MB/s 0:00:54 + 40108032 20% 2.91MB/s 0:00:52 + 42991616 21% 2.83MB/s 0:00:52 + 45875200 23% 2.79MB/s 0:00:52 + 48857088 24% 2.78MB/s 0:00:51 + 51740672 26% 2.72MB/s 0:00:51 + 54755328 27% 2.75MB/s 0:00:50 + 57638912 29% 2.74MB/s 0:00:49 + 59998208 30% 2.60MB/s 0:00:51 + 62947328 32% 2.61MB/s 0:00:49 + 65961984 33% 2.60MB/s 0:00:49 + 68845568 35% 2.60MB/s 0:00:48 + 71729152 36% 2.73MB/s 0:00:44 + 74743808 38% 2.74MB/s 0:00:43 + 77627392 39% 2.72MB/s 0:00:42 + 80642048 41% 2.76MB/s 0:00:41 + 83656704 42% 2.78MB/s 0:00:39 + 86540288 44% 2.76MB/s 0:00:38 + 89292800 45% 2.72MB/s 0:00:38 + 91389952 46% 2.51MB/s 0:00:40 + 94404608 48% 2.50MB/s 0:00:39 + 97288192 49% 2.49MB/s 0:00:38 + 100040704 50% 2.49MB/s 0:00:37 + 102924288 52% 2.66MB/s 0:00:34 + 105807872 53% 2.65MB/s 0:00:33 + 108691456 55% 2.67MB/s 0:00:32 + 111443968 56% 2.65MB/s 0:00:31 + 114196480 58% 2.63MB/s 0:00:30 + 117342208 59% 2.66MB/s 0:00:29 + 120225792 61% 2.66MB/s 0:00:27 + 123109376 62% 2.70MB/s 0:00:26 + 125992960 64% 2.73MB/s 0:00:25 + 128745472 65% 2.67MB/s 0:00:24 + 131760128 67% 2.70MB/s 0:00:23 + 134643712 68% 2.70MB/s 0:00:22 + 137396224 69% 2.65MB/s 0:00:21 + 140410880 71% 2.72MB/s 0:00:20 + 143294464 72% 2.70MB/s 0:00:19 + 145915904 74% 2.60MB/s 0:00:19 + 148275200 75% 2.50MB/s 0:00:18 + 150896640 76% 2.41MB/s 0:00:18 + 153780224 78% 2.41MB/s 0:00:17 + 157057024 79% 2.60MB/s 0:00:14 + 160202752 81% 2.79MB/s 0:00:12 + 163217408 83% 2.87MB/s 0:00:11 + 166100992 84% 2.86MB/s 0:00:10 + 168984576 85% 2.75MB/s 0:00:09 + 171737088 87% 2.68MB/s 0:00:09 + 174817280 88% 2.68MB/s 0:00:07 + 177831936 90% 2.71MB/s 0:00:06 + 180846592 92% 2.75MB/s 0:00:05 + 183730176 93% 2.77MB/s 0:00:04 + 186875904 95% 2.80MB/s 0:00:03 + 190021632 96% 2.84MB/s 0:00:02 + 192970752 98% 2.85MB/s 0:00:01 + 195854336 99% 2.87MB/s 0:00:00 + 196517551 100% 2.72MB/s 0:01:08 (xfer#1, to-check=0/1) + +sent 196541725 bytes received 42 bytes 2787826.48 bytes/sec +total size is 196517551 speedup is 1.00 +[2014-05-25 18:17:58 CEST] Transferrer: Uploaded 01_introduction.mp4 +[2014-05-25 18:17:58 CEST] Pusher: Syncing with diskstation + +WORM-s57838296-m1400607924--An Introduction to d3.js - From Scattered to Scatterplot%02_setting-up.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4030464 6% 3.75MB/s 0:00:14 + 6782976 11% 3.15MB/s 0:00:15 + 9535488 16% 2.96MB/s 0:00:15 + 12288000 21% 2.88MB/s 0:00:15 + 15040512 26% 2.58MB/s 0:00:16 + 17793024 30% 2.60MB/s 0:00:15 + 20545536 35% 2.61MB/s 0:00:13 + 23560192 40% 2.66MB/s 0:00:12 + 26705920 46% 2.76MB/s 0:00:11 + 29720576 51% 2.80MB/s 0:00:09 + 32604160 56% 2.81MB/s 0:00:08 +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 16f51d5..b142966 git-annex -> synced/git-annex + 35356672 61% 2.76MB/s 0:00:07 + 38371328 66% 2.73MB/s 0:00:06 +[2014-05-25 18:18:14 CEST] RemoteControl: Syncing with diskstation + 41648128 72% 2.79MB/s 0:00:05 + 44761088 77% 2.86MB/s 0:00:04 + 47841280 82% 2.92MB/s 0:00:03 + 50855936 87% 2.92MB/s 0:00:02 + 53870592 93% 2.86MB/s 0:00:01 + 56885248 98% 2.81MB/s 0:00:00 + 57838296 100% 2.80MB/s 0:00:19 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 95ae98a..5809ceb git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at b1429660ab35f95d5bc54e4d8b4f39a19fe66998 but expected 16f51d51d23bf026556435a5cea88488ae0ab108 + ! 16f51d5..b142966 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 57845539 bytes received 42 bytes 2690492.14 bytes/sec +total size is 57838296 speedup is 1.00 +[2014-05-25 18:18:22 CEST] Transferrer: Uploaded 02_setting-up.mp4 +[2014-05-25 18:18:23 CEST] Pusher: Syncing with diskstation + +WORM-s149069061-m1401033118--An Introduction to d3.js - From Scattered to Scatterplot%03_selecting-and-creating-elements.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4063232 2% 3.60MB/s 0:00:39 +remote: merge git-annex 6815744 4% 3.12MB/s 0:00:44 + 9568256 6% 2.96MB/s 0:00:46 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 18:18:28 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + b142966..7713a32 git-annex -> synced/git-annex + 12582912 8% 2.93MB/s 0:00:45 + 15466496 10% 2.70MB/s 0:00:48 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5809ceb..19d05e5 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7713a32f85cf1d993948f15859f0d035d63aa6e0 but expected b1429660ab35f95d5bc54e4d8b4f39a19fe66998 + ! b142966..7713a32 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 18448384 12% 2.75MB/s 0:00:46 + 21594112 14% 2.83MB/s 0:00:44 + 24477696 16% 2.80MB/s 0:00:43 + 27492352 18% 2.84MB/s 0:00:41 + 30375936 20% 2.80MB/s 0:00:41 + 33587200 22% 2.83MB/s 0:00:39 + 36601856 24% 2.85MB/s 0:00:38 + 39616512 26% 2.82MB/s 0:00:37 + 42041344 28% 2.73MB/s 0:00:38 + 45056000 30% 2.67MB/s 0:00:37 + 48037888 32% 2.66MB/s 0:00:37 + 50855936 34% 2.64MB/s 0:00:36 + 52756480 35% 2.52MB/s 0:00:37 + 54853632 36% 2.26MB/s 0:00:40 + 56950784 38% 2.02MB/s 0:00:44 + 58916864 39% 1.81MB/s 0:00:48 + 61669376 41% 2.00MB/s 0:00:42 + 64552960 43% 2.23MB/s 0:00:36 + 67567616 45% 2.48MB/s 0:00:32 + 70713344 47% 2.77MB/s 0:00:27 + 73859072 49% 2.84MB/s 0:00:25 + 76873728 51% 2.85MB/s 0:00:24 + 79888384 53% 2.85MB/s 0:00:23 + 82903040 55% 2.81MB/s 0:00:22 + 85786624 57% 2.77MB/s 0:00:22 + 88571904 59% 2.73MB/s 0:00:21 + 91422720 61% 2.70MB/s 0:00:20 + 94502912 63% 2.73MB/s 0:00:19 + 97288192 65% 2.68MB/s 0:00:18 + 100335616 67% 2.72MB/s 0:00:17 + 103350272 69% 2.77MB/s 0:00:16 + 106364928 71% 2.73MB/s 0:00:15 + 109379584 73% 2.82MB/s 0:00:13 + 112394240 75% 2.79MB/s 0:00:12 + 115376128 77% 2.76MB/s 0:00:11 + 118390784 79% 2.76MB/s 0:00:10 + 121536512 81% 2.80MB/s 0:00:09 + 124682240 83% 2.85MB/s 0:00:08 + 127827968 85% 2.90MB/s 0:00:07 + 130842624 87% 2.91MB/s 0:00:06 + 133988352 89% 2.91MB/s 0:00:05 + 137003008 91% 2.88MB/s 0:00:04 + 140017664 93% 2.86MB/s 0:00:03 + 142901248 95% 2.85MB/s 0:00:02 + 145588224 97% 2.71MB/s 0:00:01 + 148537344 99% 2.71MB/s 0:00:00 + 149069061 100% 2.71MB/s 0:00:52 (xfer#1, to-check=0/1) + +sent 149087462 bytes received 42 bytes 2786682.32 bytes/sec +total size is 149069061 speedup is 1.00 +[2014-05-25 18:19:18 CEST] Transferrer: Uploaded 03_select..ments.mp4 +[2014-05-25 18:19:18 CEST] Pusher: Syncing with diskstation + +WORM-s36798210-m1400608746--An Introduction to d3.js - From Scattered to Scatterplot%04_exercise-1.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 11% 3.89MB/s 0:00:08 + 7143424 19% 3.32MB/s 0:00:08 + 10158080 27% 3.15MB/s 0:00:08 +remote: merge git-annex 13172736 35% 3.07MB/s 0:00:07 +[2014-05-25 18:19:24 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7713a32..c892127 git-annex -> synced/git-annex + 16187392 43% 2.81MB/s 0:00:07 + 19136512 52% 2.83MB/s 0:00:06 + 22282240 60% 2.88MB/s 0:00:04 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 19d05e5..928f25d git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at c8921270e51c1eb7f5f88a288adbd778711d0ff0 but expected 7713a32f85cf1d993948f15859f0d035d63aa6e0 + ! 7713a32..c892127 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 25296896 68% 2.88MB/s 0:00:03 + 28442624 77% 2.88MB/s 0:00:02 + 31457280 85% 2.88MB/s 0:00:01 + 34603008 94% 2.84MB/s 0:00:00 + 36798210 100% 2.94MB/s 0:00:11 (xfer#1, to-check=0/1) + +sent 36802881 bytes received 42 bytes 2538132.62 bytes/sec +total size is 36798210 speedup is 1.00 +[2014-05-25 18:19:32 CEST] Transferrer: Uploaded 04_exercise-1.mp4 +[2014-05-25 18:19:32 CEST] Pusher: Syncing with diskstation + +WORM-s272759172-m1400608447--An Introduction to d3.js - From Scattered to Scatterplot%05_svg.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 1% 3.97MB/s 0:01:06 + 7241728 2% 3.39MB/s 0:01:16 + 10256384 3% 3.17MB/s 0:01:20 +remote: merge git-annex 13402112 4% 3.11MB/s 0:01:21 + 16416768 6% 2.83MB/s 0:01:28 +[2014-05-25 18:19:38 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + c892127..ff739c0 git-annex -> synced/git-annex + 19431424 7% 2.83MB/s 0:01:27 + 22446080 8% 2.85MB/s 0:01:25 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 928f25d..383d246 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at ff739c08bd8881b7d1c3fd6c305b0d80b3213b0d but expected c8921270e51c1eb7f5f88a288adbd778711d0ff0 + ! c892127..ff739c0 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 25591808 9% 2.83MB/s 0:01:25 + 28606464 10% 2.81MB/s 0:01:24 + 31621120 11% 2.82MB/s 0:01:23 + 34766848 12% 2.83MB/s 0:01:22 + 37781504 13% 2.83MB/s 0:01:21 + 40927232 15% 2.87MB/s 0:01:18 + 44072960 16% 2.89MB/s 0:01:17 + 47087616 17% 2.89MB/s 0:01:16 + 50397184 18% 2.95MB/s 0:01:13 + 53411840 19% 2.93MB/s 0:01:13 + 56295424 20% 2.89MB/s 0:01:13 + 59146240 21% 2.84MB/s 0:01:13 + 62160896 22% 2.78MB/s 0:01:13 + 65306624 23% 2.82MB/s 0:01:11 + 68321280 25% 2.84MB/s 0:01:10 + 71335936 26% 2.86MB/s 0:01:08 + 74350592 27% 2.85MB/s 0:01:07 + 77365248 28% 2.80MB/s 0:01:08 + 80379904 29% 2.80MB/s 0:01:07 + 83394560 30% 2.82MB/s 0:01:05 + 86540288 31% 2.84MB/s 0:01:04 + 89554944 32% 2.85MB/s 0:01:02 + 92569600 33% 2.86MB/s 0:01:01 + 95453184 34% 2.81MB/s 0:01:01 + 98336768 36% 2.76MB/s 0:01:01 + 101220352 37% 2.74MB/s 0:01:01 + 104103936 38% 2.70MB/s 0:01:00 + 107118592 39% 2.75MB/s 0:00:58 + 110002176 40% 2.74MB/s 0:00:58 + 113016832 41% 2.75MB/s 0:00:56 + 115113984 42% 2.57MB/s 0:00:59 + 117342208 43% 2.37MB/s 0:01:04 + 120356864 44% 2.40MB/s 0:01:02 + 123371520 45% 2.41MB/s 0:01:00 + 126386176 46% 2.61MB/s 0:00:54 + 129335296 47% 2.77MB/s 0:00:50 + 132481024 48% 2.80MB/s 0:00:48 + 135626752 49% 2.83MB/s 0:00:47 + 138772480 50% 2.86MB/s 0:00:45 + 141656064 51% 2.88MB/s 0:00:44 + 144572416 53% 2.83MB/s 0:00:44 + 147456000 54% 2.78MB/s 0:00:43 + 150732800 55% 2.84MB/s 0:00:41 + 153845760 56% 2.89MB/s 0:00:40 + 156860416 57% 2.88MB/s 0:00:39 + 159875072 58% 2.89MB/s 0:00:38 + 162889728 59% 2.83MB/s 0:00:37 + 165904384 60% 2.79MB/s 0:00:37 + 168919040 61% 2.80MB/s 0:00:36 + 172064768 63% 2.82MB/s 0:00:34 + 175079424 64% 2.79MB/s 0:00:34 + 178094080 65% 2.79MB/s 0:00:33 + 180977664 66% 2.77MB/s 0:00:32 + 183861248 67% 2.74MB/s 0:00:31 + 186875904 68% 2.76MB/s 0:00:30 + 190152704 69% 2.81MB/s 0:00:28 + 193298432 70% 2.86MB/s 0:00:27 + 196313088 71% 2.87MB/s 0:00:26 + 199458816 73% 2.92MB/s 0:00:24 + 202473472 74% 2.86MB/s 0:00:23 + 205455360 75% 2.82MB/s 0:00:23 + 208207872 76% 2.76MB/s 0:00:22 + 211091456 77% 2.69MB/s 0:00:22 + 214237184 78% 2.74MB/s 0:00:20 + 217251840 79% 2.77MB/s 0:00:19 + 220266496 80% 2.81MB/s 0:00:18 + 223019008 81% 2.77MB/s 0:00:17 + 225247232 82% 2.54MB/s 0:00:18 + 228261888 83% 2.54MB/s 0:00:17 + 231145472 84% 2.52MB/s 0:00:16 + 234160128 85% 2.58MB/s 0:00:14 + 237043712 86% 2.74MB/s 0:00:12 + 240091136 88% 2.76MB/s 0:00:11 + 243073024 89% 2.78MB/s 0:00:10 + 246087680 90% 2.79MB/s 0:00:09 + 248971264 91% 2.81MB/s 0:00:08 + 251723776 92% 2.71MB/s 0:00:07 + 254738432 93% 2.73MB/s 0:00:06 + 257884160 94% 2.75MB/s 0:00:05 + 261029888 95% 2.80MB/s 0:00:04 + 263913472 96% 2.85MB/s 0:00:03 + 266928128 97% 2.87MB/s 0:00:01 + 269942784 98% 2.83MB/s 0:00:00 + 272759172 100% 2.80MB/s 0:01:32 (xfer#1, to-check=0/1) + +sent 272792641 bytes received 42 bytes 2886695.06 bytes/sec +total size is 272759172 speedup is 1.00 +[2014-05-25 18:21:07 CEST] Transferrer: Uploaded 05_svg.mp4 +[2014-05-25 18:21:07 CEST] Pusher: Syncing with diskstation + +WORM-s29712591-m1400608733--An Introduction to d3.js - From Scattered to Scatterplot%06_exercise-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4259840 14% 4.00MB/s 0:00:06 + 7274496 24% 3.44MB/s 0:00:06 + 10289152 34% 3.24MB/s 0:00:05 +remote: merge git-annex 13434880 45% 3.17MB/s 0:00:05 + 16678912 56% 2.92MB/s 0:00:04 +[2014-05-25 18:21:13 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + ff739c0..07153a2 git-annex -> synced/git-annex + 19693568 66% 2.89MB/s 0:00:03 + 22740992 76% 2.86MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 383d246..1749643 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 07153a2d49264b9792593fc016c00499ce87f70b but expected ff739c08bd8881b7d1c3fd6c305b0d80b3213b0d + ! ff739c0..07153a2 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 25624576 86% 2.81MB/s 0:00:01 + 28639232 96% 2.75MB/s 0:00:00 + 29712591 100% 2.94MB/s 0:00:09 (xfer#1, to-check=0/1) + +sent 29716398 bytes received 42 bytes 2584038.26 bytes/sec +total size is 29712591 speedup is 1.00 +[2014-05-25 18:21:18 CEST] Transferrer: Uploaded 06_exercise-2.mp4 +[2014-05-25 18:21:18 CEST] Pusher: Syncing with diskstation + +WORM-s276749404-m1400608181--An Introduction to d3.js - From Scattered to Scatterplot%07_binding-data-and-creating-elements-from-data.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4030464 1% 3.60MB/s 0:01:13 + 7307264 2% 3.29MB/s 0:01:19 +remote: merge git-annex 10190848 3% 3.11MB/s 0:01:23 + 13336576 4% 3.06MB/s 0:01:24 +[2014-05-25 18:21:24 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 07153a2..0a42aa9 git-annex -> synced/git-annex + 16482304 5% 2.89MB/s 0:01:27 + 19496960 7% 2.85MB/s 0:01:28 + 22642688 8% 2.89MB/s 0:01:25 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 1749643..e6798ff git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 0a42aa9412e0a0f03e8edaa7a37eb0d6273bc4d9 but expected 07153a2d49264b9792593fc016c00499ce87f70b + ! 07153a2..0a42aa9 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 25788416 9% 2.88MB/s 0:01:25 + 28803072 10% 2.84MB/s 0:01:25 + 31817728 11% 2.84MB/s 0:01:24 + 34832384 12% 2.83MB/s 0:01:23 + 37978112 13% 2.84MB/s 0:01:22 + 40828928 14% 2.82MB/s 0:01:21 + 43974656 15% 2.83MB/s 0:01:20 + 46956544 16% 2.84MB/s 0:01:18 + 50233344 18% 2.88MB/s 0:01:16 + 53248000 19% 2.91MB/s 0:01:15 + 56262656 20% 2.88MB/s 0:01:14 + 59146240 21% 2.84MB/s 0:01:14 + 62291968 22% 2.81MB/s 0:01:14 + 65699840 23% 2.89MB/s 0:01:11 + 68812800 24% 2.91MB/s 0:01:09 + 71892992 25% 2.97MB/s 0:01:07 + 75038720 27% 2.95MB/s 0:01:06 + 78020608 28% 2.87MB/s 0:01:07 + 81166336 29% 2.88MB/s 0:01:06 + 84049920 30% 2.83MB/s 0:01:06 + 86769664 31% 2.76MB/s 0:01:07 + 89653248 32% 2.73MB/s 0:01:06 + 92536832 33% 2.66MB/s 0:01:07 + 95420416 34% 2.66MB/s 0:01:06 + 98304000 35% 2.69MB/s 0:01:04 + 101187584 36% 2.69MB/s 0:01:03 + 104202240 37% 2.75MB/s 0:01:01 + 107216896 38% 2.76MB/s 0:00:59 + 110100480 39% 2.77MB/s 0:00:58 + 113016832 40% 2.78MB/s 0:00:57 + 115867648 41% 2.74MB/s 0:00:57 + 118620160 42% 2.71MB/s 0:00:57 + 121503744 43% 2.69MB/s 0:00:56 + 124452864 44% 2.67MB/s 0:00:55 + 127467520 46% 2.70MB/s 0:00:53 + 130220032 47% 2.69MB/s 0:00:53 + 132972544 48% 2.68MB/s 0:00:52 + 135987200 49% 2.70MB/s 0:00:50 + 138870784 50% 2.68MB/s 0:00:50 + 141754368 51% 2.72MB/s 0:00:48 + 144474112 52% 2.71MB/s 0:00:47 + 147357696 53% 2.68MB/s 0:00:47 + 150372352 54% 2.70MB/s 0:00:45 + 153387008 55% 2.71MB/s 0:00:44 + 156401664 56% 2.76MB/s 0:00:42 + 159416320 57% 2.79MB/s 0:00:41 + 162299904 58% 2.78MB/s 0:00:40 + 165445632 59% 2.80MB/s 0:00:38 + 168460288 60% 2.82MB/s 0:00:37 + 171343872 61% 2.79MB/s 0:00:36 + 174227456 62% 2.78MB/s 0:00:36 + 177373184 64% 2.78MB/s 0:00:34 + 180387840 65% 2.79MB/s 0:00:33 + 183533568 66% 2.86MB/s 0:00:31 + 186548224 67% 2.87MB/s 0:00:30 + 189562880 68% 2.81MB/s 0:00:30 + 192446464 69% 2.75MB/s 0:00:29 + 195461120 70% 2.71MB/s 0:00:29 + 198475776 71% 2.73MB/s 0:00:28 + 201359360 72% 2.74MB/s 0:00:26 + 204308480 73% 2.78MB/s 0:00:25 + 207060992 74% 2.72MB/s 0:00:24 + 210206720 75% 2.77MB/s 0:00:23 + 212828160 76% 2.64MB/s 0:00:23 + 215318528 77% 2.54MB/s 0:00:23 + 218333184 78% 2.58MB/s 0:00:22 + 221347840 79% 2.53MB/s 0:00:21 + 224362496 81% 2.67MB/s 0:00:19 + 227377152 82% 2.77MB/s 0:00:17 + 230129664 83% 2.74MB/s 0:00:16 + 233078784 84% 2.74MB/s 0:00:15 + 236093440 85% 2.74MB/s 0:00:14 + 239108096 86% 2.76MB/s 0:00:13 + 242122752 87% 2.83MB/s 0:00:11 + 245006336 88% 2.81MB/s 0:00:11 + 247824384 89% 2.77MB/s 0:00:10 + 250707968 90% 2.70MB/s 0:00:09 + 253460480 91% 2.63MB/s 0:00:08 + 256606208 92% 2.69MB/s 0:00:07 + 259620864 93% 2.73MB/s 0:00:06 + 262504448 94% 2.75MB/s 0:00:05 + 264994816 95% 2.63MB/s 0:00:04 + 266960896 96% 2.37MB/s 0:00:04 + 268795904 97% 2.11MB/s 0:00:03 + 271155200 97% 1.99MB/s 0:00:02 + 274038784 99% 2.14MB/s 0:00:01 + 276749404 100% 2.75MB/s 0:01:36 (xfer#1, to-check=0/1) + +sent 276783402 bytes received 42 bytes 2838804.55 bytes/sec +total size is 276749404 speedup is 1.00 +[2014-05-25 18:22:56 CEST] Transferrer: Uploaded 07_bindin..-data.mp4 +[2014-05-25 18:22:56 CEST] Pusher: Syncing with diskstation + +WORM-s58893321-m1400608603--An Introduction to d3.js - From Scattered to Scatterplot%08_exercise-3.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 7% 3.98MB/s 0:00:13 + 7241728 12% 3.38MB/s 0:00:14 + 10125312 17% 3.14MB/s 0:00:15 + 13139968 22% 3.05MB/s 0:00:14 + 16023552 27% 2.74MB/s 0:00:15 +remote: merge git-annex 18907136 32% 2.72MB/s 0:00:14 +[2014-05-25 18:23:04 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 0a42aa9..961714e git-annex -> synced/git-annex + 21790720 37% 2.72MB/s 0:00:13 + 24870912 42% 2.72MB/s 0:00:12 + 27754496 47% 2.72MB/s 0:00:11 + 30638080 52% 2.70MB/s 0:00:10 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e6798ff..c074ab0 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 961714e5af3653435346ed0f7ae7e19efb899c6f but expected 0a42aa9412e0a0f03e8edaa7a37eb0d6273bc4d9 + ! 0a42aa9..961714e synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 33980416 57% 2.81MB/s 0:00:08 + 36864000 62% 2.78MB/s 0:00:07 + 39616512 67% 2.76MB/s 0:00:06 + 42369024 71% 2.75MB/s 0:00:05 + 45252608 76% 2.64MB/s 0:00:05 + 48136192 81% 2.64MB/s 0:00:03 + 51150848 86% 2.67MB/s 0:00:02 + 53903360 91% 2.65MB/s 0:00:01 + 56655872 96% 2.63MB/s 0:00:00 + 58893321 100% 2.76MB/s 0:00:20 (xfer#1, to-check=0/1) + +sent 58900692 bytes received 42 bytes 2617810.40 bytes/sec +total size is 58893321 speedup is 1.00 +[2014-05-25 18:23:18 CEST] Transferrer: Uploaded 08_exercise-3.mp4 +[2014-05-25 18:23:18 CEST] Pusher: Syncing with diskstation + +WORM-s134947390-m1400608565--An Introduction to d3.js - From Scattered to Scatterplot%09_transitions.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4161536 3% 3.82MB/s 0:00:33 + 7045120 5% 3.24MB/s 0:00:38 +remote: merge git-annex 9928704 7% 3.04MB/s 0:00:40 + 13205504 9% 3.05MB/s 0:00:38 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 961714e..dbdf944 git-annex -> synced/git-annex +[2014-05-25 18:23:24 CEST] RemoteControl: Syncing with diskstation + 16220160 12% 2.79MB/s 0:00:41 + 19103744 14% 2.80MB/s 0:00:40 + 21856256 16% 2.79MB/s 0:00:39 + 24576000 18% 2.66MB/s 0:00:40 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c074ab0..1e5f9f1 git-annex -> diskstation/git-annex + 27459584 20% 2.64MB/s 0:00:39 + 30474240 22% 2.68MB/s 0:00:38 + 33357824 24% 2.70MB/s 0:00:36 + 36372480 26% 2.76MB/s 0:00:34 + 39256064 29% 2.76MB/s 0:00:33 + 42139648 31% 2.73MB/s 0:00:33 + 45023232 33% 2.73MB/s 0:00:32 + 47775744 35% 2.66MB/s 0:00:31 + 50659328 37% 2.66MB/s 0:00:30 + 53542912 39% 2.65MB/s 0:00:29 + 56557568 41% 2.66MB/s 0:00:28 + 59310080 43% 2.67MB/s 0:00:27 + 62029824 45% 2.64MB/s 0:00:26 + 64782336 48% 2.62MB/s 0:00:26 + 67665920 50% 2.61MB/s 0:00:25 + 70680576 52% 2.64MB/s 0:00:23 + 73695232 54% 2.70MB/s 0:00:22 + 76709888 56% 2.77MB/s 0:00:20 + 79593472 58% 2.76MB/s 0:00:19 + 82608128 61% 2.79MB/s 0:00:18 + 85622784 63% 2.81MB/s 0:00:17 + 88506368 65% 2.76MB/s 0:00:16 + 91619328 67% 2.81MB/s 0:00:15 + 94502912 70% 2.78MB/s 0:00:14 + 97255424 72% 2.72MB/s 0:00:13 + 100270080 74% 2.76MB/s 0:00:12 + 102760448 76% 2.61MB/s 0:00:12 + 105349120 78% 2.54MB/s 0:00:11 + 108232704 80% 2.57MB/s 0:00:10 + 111247360 82% 2.56MB/s 0:00:09 + 114262016 84% 2.68MB/s 0:00:07 + 117145600 86% 2.76MB/s 0:00:06 + 120029184 88% 2.75MB/s 0:00:05 + 123043840 91% 2.76MB/s 0:00:04 + 125927424 93% 2.74MB/s 0:00:03 + 128942080 95% 2.76MB/s 0:00:02 + 131694592 97% 2.74MB/s 0:00:01 + 134447104 99% 2.64MB/s 0:00:00 + 134947390 100% 2.72MB/s 0:00:47 (xfer#1, to-check=0/1) + +sent 134964047 bytes received 42 bytes 2726547.25 bytes/sec +total size is 134947390 speedup is 1.00 +[2014-05-25 18:24:08 CEST] Transferrer: Uploaded 09_transitions.mp4 +[2014-05-25 18:24:08 CEST] Pusher: Syncing with diskstation + +WORM-s106802484-m1399168180--An Introduction to d3.js - From Scattered to Scatterplot%10_scales-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4128768 3% 3.75MB/s 0:00:26 + 7143424 6% 3.27MB/s 0:00:29 + 10027008 9% 3.10MB/s 0:00:30 +remote: merge git-annex 13008896 12% 3.01MB/s 0:00:30 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 18:24:13 CEST] RemoteControl: Syncing with diskstation + dbdf944..cef70b3 git-annex -> synced/git-annex + 16154624 15% 2.81MB/s 0:00:31 + 19169280 17% 2.81MB/s 0:00:30 + 22183936 20% 2.83MB/s 0:00:29 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 1e5f9f1..af18e69 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at cef70b30ddce59c2b22b370b25420da2fa7e2b49 but expected dbdf94438b7e48971a594c7647721f4821c8cff2 + ! dbdf944..cef70b3 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 24936448 23% 2.78MB/s 0:00:28 + 27688960 25% 2.70MB/s 0:00:28 + 30834688 28% 2.73MB/s 0:00:27 + 32899072 30% 2.50MB/s 0:00:28 + 35749888 33% 2.53MB/s 0:00:27 + 38764544 36% 2.56MB/s 0:00:25 + 41779200 39% 2.53MB/s 0:00:25 + 44072960 41% 2.60MB/s 0:00:23 + 47415296 44% 2.71MB/s 0:00:21 + 50036736 46% 2.65MB/s 0:00:20 + 52789248 49% 2.59MB/s 0:00:20 + 55672832 52% 2.72MB/s 0:00:18 + 58687488 54% 2.64MB/s 0:00:17 + 61571072 57% 2.69MB/s 0:00:16 + 64585728 60% 2.75MB/s 0:00:14 + 67207168 62% 2.65MB/s 0:00:14 + 69304320 64% 2.44MB/s 0:00:14 + 72318976 67% 2.46MB/s 0:00:13 + 75071488 70% 2.42MB/s 0:00:12 + 78020608 73% 2.53MB/s 0:00:11 + 80904192 75% 2.71MB/s 0:00:09 + 83787776 78% 2.68MB/s 0:00:08 + 86540288 81% 2.66MB/s 0:00:07 + 89423872 83% 2.64MB/s 0:00:06 + 92372992 86% 2.67MB/s 0:00:05 + 95256576 89% 2.68MB/s 0:00:04 + 98140160 91% 2.72MB/s 0:00:03 + 101154816 94% 2.74MB/s 0:00:02 + 104169472 97% 2.73MB/s 0:00:00 + 106802484 100% 2.70MB/s 0:00:37 (xfer#1, to-check=0/1) + +sent 106815702 bytes received 42 bytes 2704196.05 bytes/sec +total size is 106802484 speedup is 1.00 +[2014-05-25 18:24:47 CEST] Transferrer: Uploaded 10_scales-2.mp4 +[2014-05-25 18:24:47 CEST] Pusher: Syncing with diskstation + +WORM-s106802484-m1399168180--An Introduction to d3.js - From Scattered to Scatterplot%10_scales.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3964928 3% 3.74MB/s 0:00:26 + 6848512 6% 3.19MB/s 0:00:30 + 9994240 9% 3.08MB/s 0:00:30 +remote: merge git-annex 12877824 12% 2.97MB/s 0:00:30 + 15892480 14% 2.74MB/s 0:00:32 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 18:24:53 CEST] RemoteControl: Syncing with diskstation + cef70b3..bc92e4a git-annex -> synced/git-annex + 18644992 17% 2.71MB/s 0:00:31 + 20873216 19% 2.51MB/s 0:00:33 + 23429120 21% 2.39MB/s 0:00:34 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + af18e69..7b0c500 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at bc92e4a867338760dec749af77a9262591b9c43a but expected cef70b30ddce59c2b22b370b25420da2fa7e2b49 + ! cef70b3..bc92e4a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 27099136 25% 2.52MB/s 0:00:30 + 29982720 28% 2.56MB/s 0:00:29 + 32866304 30% 2.72MB/s 0:00:26 + 35880960 33% 2.88MB/s 0:00:24 + 38633472 36% 2.69MB/s 0:00:24 + 41517056 38% 2.68MB/s 0:00:23 + 44662784 41% 2.74MB/s 0:00:22 + 47546368 44% 2.72MB/s 0:00:21 + 50298880 47% 2.72MB/s 0:00:20 + 53182464 49% 2.72MB/s 0:00:19 + 56066048 52% 2.66MB/s 0:00:18 + 58949632 55% 2.67MB/s 0:00:17 + 61308928 57% 2.59MB/s 0:00:17 + 63799296 59% 2.51MB/s 0:00:16 + 66781184 62% 2.54MB/s 0:00:15 + 69697536 65% 2.53MB/s 0:00:14 + 72712192 68% 2.67MB/s 0:00:12 + 75595776 70% 2.77MB/s 0:00:10 + 78479360 73% 2.74MB/s 0:00:10 + 81428480 76% 2.75MB/s 0:00:09 + 84312064 78% 2.73MB/s 0:00:08 + 87195648 81% 2.73MB/s 0:00:07 + 90210304 84% 2.77MB/s 0:00:05 + 93192192 87% 2.76MB/s 0:00:04 + 96075776 89% 2.74MB/s 0:00:03 + 98959360 92% 2.71MB/s 0:00:02 + 101974016 95% 2.68MB/s 0:00:01 + 104857600 98% 2.68MB/s 0:00:00 + 106802484 100% 2.71MB/s 0:00:37 (xfer#1, to-check=0/1) + +sent 106815700 bytes received 42 bytes 2704196.00 bytes/sec +total size is 106802484 speedup is 1.00 +[2014-05-25 18:25:26 CEST] Transferrer: Uploaded 10_scales.mp4 +[2014-05-25 18:25:26 CEST] Pusher: Syncing with diskstation + +WORM-s132805496-m1399168071--An Introduction to d3.js - From Scattered to Scatterplot%11_axes.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4096000 3% 3.82MB/s 0:00:32 + 7110656 5% 3.32MB/s 0:00:37 + 9863168 7% 3.07MB/s 0:00:39 +remote: merge git-annex 12877824 9% 3.01MB/s 0:00:38 + 15826944 11% 2.76MB/s 0:00:41 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 18:25:33 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + bc92e4a..cf6d3d1 git-annex -> synced/git-annex + 18710528 14% 2.74MB/s 0:00:40 + 21594112 16% 2.78MB/s 0:00:39 + 24477696 18% 2.75MB/s 0:00:38 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7b0c500..8393191 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at cf6d3d1e7ec71ad4d9c4a0e5256f361c58ca5e75 but expected bc92e4a867338760dec749af77a9262591b9c43a + ! bc92e4a..cf6d3d1 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 27230208 20% 2.70MB/s 0:00:38 + 29949952 22% 2.63MB/s 0:00:38 + 32964608 24% 2.64MB/s 0:00:36 + 35848192 26% 2.64MB/s 0:00:35 + 38862848 29% 2.69MB/s 0:00:34 + 41877504 31% 2.77MB/s 0:00:32 + 44761088 33% 2.73MB/s 0:00:31 + 47513600 35% 2.71MB/s 0:00:30 + 50135040 37% 2.61MB/s 0:00:30 + 53280768 40% 2.66MB/s 0:00:29 + 56164352 42% 2.67MB/s 0:00:28 + 59179008 44% 2.71MB/s 0:00:26 + 62062592 46% 2.79MB/s 0:00:24 + 64946176 48% 2.73MB/s 0:00:24 + 68091904 51% 2.82MB/s 0:00:22 + 71106560 53% 2.84MB/s 0:00:21 + 74055680 55% 2.83MB/s 0:00:20 + 77070336 58% 2.85MB/s 0:00:19 + 79953920 60% 2.77MB/s 0:00:18 + 82837504 62% 2.74MB/s 0:00:17 + 85590016 64% 2.72MB/s 0:00:16 + 88342528 66% 2.63MB/s 0:00:16 + 91095040 68% 2.60MB/s 0:00:15 + 94044160 70% 2.62MB/s 0:00:14 + 97058816 73% 2.66MB/s 0:00:13 + 99549184 74% 2.60MB/s 0:00:12 + 101515264 76% 2.41MB/s 0:00:12 + 103481344 77% 2.18MB/s 0:00:13 + 105578496 79% 1.93MB/s 0:00:13 + 107806720 81% 1.89MB/s 0:00:12 + 110821376 83% 2.12MB/s 0:00:10 + 113704960 85% 2.34MB/s 0:00:07 + 116719616 87% 2.60MB/s 0:00:06 + 119603200 90% 2.77MB/s 0:00:04 + 122486784 92% 2.73MB/s 0:00:03 + 125435904 94% 2.74MB/s 0:00:02 + 128450560 96% 2.74MB/s 0:00:01 + 131268608 98% 2.70MB/s 0:00:00 + 132805496 100% 2.67MB/s 0:00:47 (xfer#1, to-check=0/1) + +sent 132821882 bytes received 42 bytes 2683271.19 bytes/sec +total size is 132805496 speedup is 1.00 +[2014-05-25 18:26:16 CEST] Transferrer: Uploaded 11_axes.mp4 +[2014-05-25 18:26:16 CEST] Pusher: Syncing with diskstation + +WORM-s120549770-m1399667258--An Introduction to d3.js - From Scattered to Scatterplot%12_advanced-techniques.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4096000 3% 3.77MB/s 0:00:30 + 7110656 5% 3.31MB/s 0:00:33 + 10125312 8% 3.15MB/s 0:00:34 +remote: merge git-annex 13008896 10% 3.04MB/s 0:00:34 +[2014-05-25 18:26:22 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + cf6d3d1..fef357a git-annex -> synced/git-annex + 15892480 13% 2.78MB/s 0:00:36 + 18776064 15% 2.75MB/s 0:00:36 + 21659648 17% 2.72MB/s 0:00:35 + 24608768 20% 2.73MB/s 0:00:34 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8393191..9ef8d81 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at fef357aaed77f1b94344c0aeea71b30a50de247d but expected cf6d3d1e7ec71ad4d9c4a0e5256f361c58ca5e75 + ! cf6d3d1..fef357a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 27623424 22% 2.75MB/s 0:00:33 + 30507008 25% 2.74MB/s 0:00:32 + 33390592 27% 2.72MB/s 0:00:31 + 36405248 30% 2.74MB/s 0:00:30 + 39419904 32% 2.73MB/s 0:00:29 + 42434560 35% 2.76MB/s 0:00:27 + 45580288 37% 2.83MB/s 0:00:25 + 48594944 40% 2.83MB/s 0:00:24 + 51576832 42% 2.83MB/s 0:00:23 + 54231040 44% 2.76MB/s 0:00:23 + 57245696 47% 2.74MB/s 0:00:22 + 60260352 49% 2.73MB/s 0:00:21 + 63275008 52% 2.73MB/s 0:00:20 + 66289664 54% 2.80MB/s 0:00:18 + 69304320 57% 2.80MB/s 0:00:17 + 72187904 59% 2.77MB/s 0:00:17 + 75071488 62% 2.74MB/s 0:00:16 + 78086144 64% 2.73MB/s 0:00:15 + 80969728 67% 2.70MB/s 0:00:14 + 84115456 69% 2.75MB/s 0:00:12 + 87130112 72% 2.79MB/s 0:00:11 + 90013696 74% 2.77MB/s 0:00:10 + 92766208 76% 2.73MB/s 0:00:09 + 95780864 79% 2.70MB/s 0:00:08 + 98664448 81% 2.68MB/s 0:00:07 + 101679104 84% 2.71MB/s 0:00:06 + 104693760 86% 2.78MB/s 0:00:05 + 107511808 89% 2.74MB/s 0:00:04 + 110526464 91% 2.74MB/s 0:00:03 + 113508352 94% 2.75MB/s 0:00:02 + 116654080 96% 2.77MB/s 0:00:01 + 119668736 99% 2.82MB/s 0:00:00 + 120549770 100% 2.79MB/s 0:00:41 (xfer#1, to-check=0/1) + +sent 120564675 bytes received 42 bytes 2771602.69 bytes/sec +total size is 120549770 speedup is 1.00 +[2014-05-25 18:26:59 CEST] Transferrer: Uploaded 12_advanc..iques.mp4 +[2014-05-25 18:27:00 CEST] Pusher: Syncing with diskstation + +WORM-s17591948-m1399167639--An Introduction to d3.js - From Scattered to Scatterplot%13_conclusion.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3997696 22% 3.68MB/s 0:00:03 + 6881280 39% 3.16MB/s 0:00:03 + 9764864 55% 2.99MB/s 0:00:02 +remote: merge git-annex 12910592 73% 2.99MB/s 0:00:01 + 15794176 89% 2.74MB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 18:27:07 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 17591948 100% 2.92MB/s 0:00:05 (xfer#1, to-check=0/1) + fef357a..28d7559 git-annex -> synced/git-annex + +sent 17594275 bytes received 42 bytes 2345908.93 bytes/sec +total size is 17591948 speedup is 1.00 +[2014-05-25 18:27:08 CEST] Transferrer: Uploaded 13_conclusion.mp4 + +WORM-s1250093-m1389398522--C,43,43 Memory Management%01_introduction.mp4 + 32768 2% 0.00kB/s 0:00:00 + 1250093 100% 25.24MB/s 0:00:00 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9ef8d81..740fecd git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 28d7559836e91e16f98a532c30e5a4cbaef12250 but expected fef357aaed77f1b94344c0aeea71b30a50de247d + ! fef357a..28d7559 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 1250398 bytes received 42 bytes 833626.67 bytes/sec +total size is 1250093 speedup is 1.00 +[2014-05-25 18:27:10 CEST] Transferrer: Uploaded 01_introduction.mp4 +[2014-05-25 18:27:11 CEST] Pusher: Syncing with diskstation + +WORM-s4072461-m1389398387--C,43,43 Memory Management%02_leaks-and-overruns.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3801088 93% 3.52MB/s 0:00:00 + 4072461 100% 3.35MB/s 0:00:01 (xfer#1, to-check=0/1) +remote: merge git-annex +sent 4073116 bytes received 42 bytes 1629263.20 bytes/sec +total size is 4072461 speedup is 1.00 +[2014-05-25 18:27:17 CEST] Transferrer: Uploaded 02_leaks-..rruns.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + +WORM-s10885066-m1389398446--C,43,43 Memory Management%03_stl-vector-methods-range-checking-and-sentinels.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 18:27:18 CEST] RemoteControl: Syncing with diskstation + 28d7559..d7a7f79 git-annex -> synced/git-annex + 3964928 36% 3.71MB/s 0:00:01 + 6979584 64% 3.28MB/s 0:00:01 + 9797632 90% 3.08MB/s 0:00:00 + 10885066 100% 3.07MB/s 0:00:03 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 740fecd..8700b31 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at d7a7f7988fd67d9cd827311157f7633da55d2e85 but expected 28d7559836e91e16f98a532c30e5a4cbaef12250 + ! 28d7559..d7a7f79 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 10886583 bytes received 42 bytes 1979386.36 bytes/sec +total size is 10885066 speedup is 1.00 +[2014-05-25 18:27:22 CEST] Transferrer: Uploaded 03_stl-ve..inels.mp4 + +WORM-s6830209-m1389398548--C,43,43 Memory Management%04_memory-leaks-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 18:27:23 CEST] Pusher: Syncing with diskstation + 3964928 58% 3.72MB/s 0:00:00 + 6830209 100% 3.23MB/s 0:00:00 + 6830209 100% 3.23MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 6831201 bytes received 42 bytes 1951783.71 bytes/sec +total size is 6830209 speedup is 1.00 +[2014-05-25 18:27:25 CEST] Transferrer: Uploaded 04_memory..art-1.mp4 + +WORM-s4500501-m1389398494--C,43,43 Memory Management%05_memory-leaks-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 3833856 85% 3.57MB/s 0:00:00 + 4500501 100% 3.39MB/s 0:00:01 (xfer#1, to-check=0/1) +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + d7a7f79..963ef9d git-annex -> synced/git-annex +[2014-05-25 18:27:28 CEST] RemoteControl: Syncing with diskstation + +sent 4501209 bytes received 42 bytes 1286071.71 bytes/sec +total size is 4500501 speedup is 1.00 +[2014-05-25 18:27:28 CEST] Transferrer: Uploaded 05_memory..art-2.mp4 + +WORM-s4479532-m1389398463--C,43,43 Memory Management%06_pointers-pitfalls-and-best-practices.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4292608 95% 4.06MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8700b31..8a3838b git-annex -> diskstation/git-annex + 4479532 100% 4.05MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 4480253 bytes received 42 bytes 1280084.29 bytes/sec +total size is 4479532 speedup is 1.00 +[2014-05-25 18:27:31 CEST] Transferrer: Uploaded 06_pointe..tices.mp4 + +WORM-s9775707-m1389398514--C,43,43 Memory Management%07_initialize-everything-trust-but-verify.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 18:27:32 CEST] Pusher: Syncing with diskstation + 4096000 41% 3.77MB/s 0:00:01 + 7241728 74% 3.37MB/s 0:00:00 + 9775707 100% 3.22MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 9777078 bytes received 42 bytes 2793462.86 bytes/sec +total size is 9775707 speedup is 1.00 +[2014-05-25 18:27:34 CEST] Transferrer: Uploaded 07_initia..erify.mp4 +remote: merge git-annex +WORM-s15498925-m1389398484--C,43,43 Memory Management%08_reading-and-writing-shared-assets.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3964928 25% 3.69MB/s 0:00:03 +[2014-05-25 18:27:36 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 963ef9d..d7cb480 git-annex -> synced/git-annex + 6848512 44% 3.21MB/s 0:00:02 + 9863168 63% 3.07MB/s 0:00:01 + 13008896 83% 3.05MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8a3838b..9dc2149 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at d7cb4801b1d5172fa94c5ef5b952650404806c5e but expected 963ef9d37e0ca48e88afccc16e3d53a7dbe94a15 + ! 963ef9d..d7cb480 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 15498925 100% 3.04MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 15500988 bytes received 42 bytes 2818369.09 bytes/sec +total size is 15498925 speedup is 1.00 +[2014-05-25 18:27:41 CEST] Transferrer: Uploaded 08_readin..ssets.mp4 +[2014-05-25 18:27:41 CEST] Pusher: Syncing with diskstation + +WORM-s7479394-m1389398424--C,43,43 Memory Management%09_undefined-behaviour-and-other-bad-practices.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4030464 53% 3.77MB/s 0:00:00 +remote: merge git-annex 7045120 94% 3.28MB/s 0:00:00 + 7479394 100% 3.24MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 7480490 bytes received 42 bytes 2137294.86 bytes/sec +total size is 7479394 speedup is 1.00 +[2014-05-25 18:27:47 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 18:27:47 CEST] Transferrer: Uploaded 09_undefi..tices.mp4 + +WORM-s5620037-m1389398373--C,43,43 Memory Management%10_the-heap-and-stl-wrappers.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + d7cb480..cebe41e git-annex -> synced/git-annex + 4390912 78% 4.02MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9dc2149..2c100e7 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at cebe41ecefec0ba03838b77300b8213abff6e46f but expected d7cb4801b1d5172fa94c5ef5b952650404806c5e + ! d7cb480..cebe41e synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 18:27:48 CEST] RemoteControl: Syncing with diskstation + 5620037 100% 3.71MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 5620887 bytes received 42 bytes 2248371.60 bytes/sec +total size is 5620037 speedup is 1.00 +[2014-05-25 18:27:50 CEST] Transferrer: Uploaded 10_the-he..ppers.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2c100e7..7d585c6 git-annex -> diskstation/git-annex + +WORM-s1014080-m1389398563--C,43,43 Memory Management%11_about-the-author.mp4 + 32768 3% 0.00kB/s 0:00:00 + 1014080 100% 20.80MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1014357 bytes received 42 bytes 676266.00 bytes/sec +total size is 1014080 speedup is 1.00 +[2014-05-25 18:27:51 CEST] Transferrer: Uploaded 11_about-..uthor.mp4 +[2014-05-25 18:27:52 CEST] Pusher: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 18:27:56 CEST] RemoteControl: Syncing with diskstation + cebe41e..1f16e00 git-annex -> synced/git-annex +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7d585c6..25d816f git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 1f16e00081100c31ba110cc6655ba98ce9c3ccf9 but expected cebe41ecefec0ba03838b77300b8213abff6e46f + ! cebe41e..1f16e00 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 19:02:45 CEST] main: Syncing with diskstation +remote: merge git-annex ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 1f16e00..25d816f git-annex -> synced/git-annex +[2014-05-25 19:16:16 CEST] NetWatcherFallback: Syncing with diskstation +Everything up-to-date +[2014-05-25 19:44:23 CEST] main: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 25d816f..af358a2 git-annex -> synced/git-annex + +WORM-s311796310-m1396397568--Lean UX Workshop%01_introduction.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3440640 1% 3.23MB/s 0:01:33 + 6062080 1% 2.75MB/s 0:01:48 + 10518528 3% 3.15MB/s 0:01:33 + 13926400 4% 3.15MB/s 0:01:32 + 16023552 5% 2.73MB/s 0:01:45 + 20611072 6% 3.22MB/s 0:01:28 + 22315008 7% 2.58MB/s 0:01:49 + 26509312 8% 2.76MB/s 0:01:40 + 29655040 9% 3.10MB/s 0:01:28 + 33325056 10% 2.61MB/s 0:01:44 + 36470784 11% 2.96MB/s 0:01:30 + 40402944 12% 2.88MB/s 0:01:32 + 44072960 14% 2.96MB/s 0:01:28 + 47218688 15% 3.17MB/s 0:01:21 + 49840128 15% 3.04MB/s 0:01:24 + 54296576 17% 3.12MB/s 0:01:20 + 58228736 18% 3.20MB/s 0:01:17 + 61636608 19% 3.23MB/s 0:01:15 + 64782336 20% 3.40MB/s 0:01:11 + 66879488 21% 2.92MB/s 0:01:21 + 71335936 22% 3.07MB/s 0:01:16 + 75005952 24% 3.15MB/s 0:01:13 + 78151680 25% 3.14MB/s 0:01:12 + 80510976 25% 3.01MB/s 0:01:15 + 83918848 26% 2.76MB/s 0:01:20 + 86540288 27% 2.48MB/s 0:01:28 + 91291648 29% 2.83MB/s 0:01:15 + 92831744 29% 2.75MB/s 0:01:17 + 95977472 30% 2.66MB/s 0:01:19 + 100433920 32% 3.08MB/s 0:01:06 + 103841792 33% 2.77MB/s 0:01:13 + 107446272 34% 3.30MB/s 0:01:00 + 109608960 35% 3.12MB/s 0:01:03 + 113803264 36% 3.09MB/s 0:01:02 + 115900416 37% 2.68MB/s 0:01:11 + 119308288 38% 2.62MB/s 0:01:11 + 123240448 39% 2.97MB/s 0:01:01 + 126648320 40% 2.61MB/s 0:01:09 + 130580480 41% 3.09MB/s 0:00:57 + 134643712 43% 3.26MB/s 0:00:52 + 135561216 43% 2.65MB/s 0:01:04 + 140017664 44% 3.11MB/s 0:00:53 + 142639104 45% 2.82MB/s 0:00:58 + 146866176 47% 2.87MB/s 0:00:56 + 150241280 48% 3.46MB/s 0:00:45 + 152338432 48% 2.80MB/s 0:00:55 + 157220864 50% 3.31MB/s 0:00:45 + 160464896 51% 2.88MB/s 0:00:51 + 165085184 52% 3.14MB/s 0:00:45 + 167542784 53% 3.35MB/s 0:00:42 + 171638784 55% 3.18MB/s 0:00:43 + 172785664 55% 2.78MB/s 0:00:48 + 176979968 56% 2.67MB/s 0:00:49 + 179601408 57% 2.48MB/s 0:00:52 + 184254464 59% 2.60MB/s 0:00:47 + 187432960 60% 3.16MB/s 0:00:38 + 190742528 61% 2.96MB/s 0:00:39 + 194412544 62% 3.48MB/s 0:00:32 + 197525504 63% 3.12MB/s 0:00:35 + 201064448 64% 3.19MB/s 0:00:33 + 203980800 65% 3.01MB/s 0:00:35 + 208699392 66% 3.25MB/s 0:00:31 + 212369408 68% 3.36MB/s 0:00:28 + 215515136 69% 3.27MB/s 0:00:28 + 217350144 69% 3.04MB/s 0:00:30 + 221806592 71% 2.99MB/s 0:00:29 + 225378304 72% 2.94MB/s 0:00:28 + 228622336 73% 2.98MB/s 0:00:27 + 231243776 74% 3.13MB/s 0:00:25 + 233603072 74% 2.59MB/s 0:00:29 + 237273088 76% 2.35MB/s 0:00:30 + 239894528 76% 2.22MB/s 0:00:31 + 242515968 77% 2.07MB/s 0:00:32 + 244350976 78% 1.97MB/s 0:00:33 + 246448128 79% 1.87MB/s 0:00:34 + 250118144 80% 1.73MB/s 0:00:34 + 253263872 81% 2.00MB/s 0:00:28 + 254312448 81% 1.80MB/s 0:00:31 + 255885312 82% 1.58MB/s 0:00:34 + 257720320 82% 1.33MB/s 0:00:39 + 259817472 83% 1.01MB/s 0:00:50 + 261914624 84% 1.06MB/s 0:00:45 + 264011776 84% 1.08MB/s 0:00:43 + 265584640 85% 1.16MB/s 0:00:39 + 267419648 85% 1.21MB/s 0:00:35 + 272662528 87% 2.00MB/s 0:00:19 + 276856832 88% 2.77MB/s 0:00:12 + 278953984 89% 2.81MB/s 0:00:11 + 283410432 90% 3.51MB/s 0:00:07 + 288358400 92% 3.47MB/s 0:00:06 + 292323328 93% 3.32MB/s 0:00:05 + 296714240 95% 3.93MB/s 0:00:03 + 300908544 96% 3.95MB/s 0:00:02 + 303333376 97% 3.30MB/s 0:00:02 + 307789824 98% 3.53MB/s 0:00:01 + 310673408 99% 2.89MB/s 0:00:00 + 311796310 100% 2.73MB/s 0:01:48 (xfer#1, to-check=0/1) + +sent 311834516 bytes received 42 bytes 2822032.20 bytes/sec +total size is 311796310 speedup is 1.00 +[2014-05-25 19:46:46 CEST] Transferrer: Uploaded 01_introduction.mp4 +[2014-05-25 19:46:46 CEST] Pusher: Syncing with diskstation + +WORM-s197776451-m1396396404--Lean UX Workshop%02_nordstrom-case-study.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5177344 2% 4.78MB/s 0:00:39 + 8683520 4% 3.74MB/s 0:00:49 + 13139968 6% 3.33MB/s 0:00:54 +remote: merge git-annex 18382848 9% 3.63MB/s 0:00:48 + 22315008 11% 3.16MB/s 0:00:54 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + af358a2..3b93fc5 git-annex -> synced/git-annex +[2014-05-25 19:46:54 CEST] RemoteControl: Syncing with diskstation + 26902528 13% 3.47MB/s 0:00:48 + 29917184 15% 3.51MB/s 0:00:46 + 31653888 16% 2.82MB/s 0:00:57 + 33849344 17% 2.64MB/s 0:01:00 + 36995072 18% 2.30MB/s 0:01:08 + 41189376 20% 2.62MB/s 0:00:58 + 44859392 22% 2.97MB/s 0:00:50 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 25d816f..b7c06ab git-annex -> diskstation/git-annex + 50102272 25% 3.67MB/s 0:00:39 + 52199424 26% 3.41MB/s 0:00:41 + 56655872 28% 3.47MB/s 0:00:39 + 60719104 30% 3.64MB/s 0:00:36 + 64520192 32% 3.31MB/s 0:00:39 + 68714496 34% 3.85MB/s 0:00:32 + 72876032 36% 3.79MB/s 0:00:32 + 76054528 38% 3.60MB/s 0:00:32 + 80216064 40% 3.70MB/s 0:00:31 + 83656704 42% 3.25MB/s 0:00:34 + 88899584 44% 3.48MB/s 0:00:30 + 92995584 47% 3.69MB/s 0:00:27 + 96763904 48% 3.62MB/s 0:00:27 + 100925440 51% 4.08MB/s 0:00:23 + 104628224 52% 3.73MB/s 0:00:24 + 109084672 55% 3.80MB/s 0:00:22 + 111443968 56% 3.40MB/s 0:00:24 + 116752384 59% 3.66MB/s 0:00:21 + 119046144 60% 3.33MB/s 0:00:23 + 124026880 62% 3.44MB/s 0:00:20 + 128483328 64% 3.98MB/s 0:00:16 + 132710400 67% 3.73MB/s 0:00:17 + 136871936 69% 4.17MB/s 0:00:14 + 141131776 71% 4.00MB/s 0:00:13 + 145522688 73% 4.01MB/s 0:00:12 + 149716992 75% 4.02MB/s 0:00:11 + 154173440 77% 4.08MB/s 0:00:10 + 158433280 80% 4.11MB/s 0:00:09 + 162758656 82% 4.08MB/s 0:00:08 + 166952960 84% 4.08MB/s 0:00:07 + 170459136 86% 3.85MB/s 0:00:06 + 174817280 88% 3.87MB/s 0:00:05 + 179011584 90% 3.85MB/s 0:00:04 + 183238656 92% 3.86MB/s 0:00:03 + 187367424 94% 4.01MB/s 0:00:02 + 191561728 96% 3.96MB/s 0:00:01 + 195887104 99% 3.98MB/s 0:00:00 + 197776451 100% 3.62MB/s 0:00:52 (xfer#1, to-check=0/1) + +sent 197800745 bytes received 42 bytes 3697210.97 bytes/sec +total size is 197776451 speedup is 1.00 +[2014-05-25 19:47:40 CEST] Transferrer: Uploaded 02_nordst..study.mp4 +[2014-05-25 19:47:40 CEST] Pusher: Syncing with diskstation + +WORM-s401429383-m1396397422--Lean UX Workshop%03_assumptions-and-hypotheses.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5472256 1% 5.18MB/s 0:01:14 +remote: merge git-annex 9895936 2% 4.61MB/s 0:01:22 + 14188544 3% 4.41MB/s 0:01:25 +[2014-05-25 19:47:45 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 3b93fc5..02a8a6a git-annex -> synced/git-annex + 18808832 4% 4.39MB/s 0:01:25 + 22315008 5% 3.92MB/s 0:01:34 + 26935296 6% 3.98MB/s 0:01:31 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b7c06ab..c1859f2 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 02a8a6a6016fd1f36acc39b27cd9e2f1b24fd394 but expected 3b93fc5ace21818579a161200a925cf8e2120c4d + ! 3b93fc5..02a8a6a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 31752192 7% 4.10MB/s 0:01:28 + 36110336 8% 4.04MB/s 0:01:28 + 39616512 9% 4.02MB/s 0:01:27 + 44826624 11% 4.13MB/s 0:01:24 + 47742976 11% 3.71MB/s 0:01:33 + 52854784 13% 3.89MB/s 0:01:27 + 57180160 14% 3.87MB/s 0:01:26 + 62423040 15% 3.92MB/s 0:01:24 + 66617344 16% 4.20MB/s 0:01:17 + 71008256 17% 4.04MB/s 0:01:19 + 75333632 18% 4.30MB/s 0:01:14 + 79659008 19% 4.08MB/s 0:01:17 + 83918848 20% 4.07MB/s 0:01:16 + 88375296 22% 4.07MB/s 0:01:15 + 92700672 23% 4.04MB/s 0:01:14 + 97058816 24% 4.05MB/s 0:01:13 + 101253120 25% 4.06MB/s 0:01:12 + 104759296 26% 3.84MB/s 0:01:15 + 109084672 27% 3.84MB/s 0:01:14 + 112820224 28% 3.70MB/s 0:01:16 + 117473280 29% 3.79MB/s 0:01:13 + 120094720 29% 3.53MB/s 0:01:17 + 125435904 31% 3.79MB/s 0:01:11 + 128483328 32% 3.46MB/s 0:01:17 + 133988352 33% 3.67MB/s 0:01:11 + 137134080 34% 3.68MB/s 0:01:10 + 142639104 35% 3.70MB/s 0:01:08 + 145522688 36% 3.72MB/s 0:01:07 + 150962176 37% 3.69MB/s 0:01:06 + 154435584 38% 3.72MB/s 0:01:04 + 159875072 39% 3.73MB/s 0:01:03 + 163610624 40% 3.76MB/s 0:01:01 + 168755200 42% 3.72MB/s 0:01:01 + 172523520 42% 3.67MB/s 0:01:00 + 177995776 44% 3.66MB/s 0:00:59 + 181960704 45% 3.69MB/s 0:00:58 + 187400192 46% 3.74MB/s 0:00:55 + 191397888 47% 3.79MB/s 0:00:54 + 196739072 49% 3.77MB/s 0:00:53 + 200310784 49% 3.72MB/s 0:00:52 + 205553664 51% 3.69MB/s 0:00:51 + 209780736 52% 4.06MB/s 0:00:46 + 213778432 53% 3.76MB/s 0:00:48 + 217088000 54% 3.72MB/s 0:00:48 + 222560256 55% 3.76MB/s 0:00:46 + 225214464 56% 3.09MB/s 0:00:55 + 227573760 56% 2.76MB/s 0:01:01 + 232816640 57% 3.35MB/s 0:00:49 + 236486656 58% 2.94MB/s 0:00:54 + 241336320 60% 3.77MB/s 0:00:41 + 243826688 60% 3.50MB/s 0:00:44 + 249069568 62% 3.47MB/s 0:00:42 + 253001728 63% 3.18MB/s 0:00:45 + 258146304 64% 3.23MB/s 0:00:43 + 262438912 65% 3.84MB/s 0:00:35 + 263487488 65% 3.00MB/s 0:00:44 + 267943936 66% 3.41MB/s 0:00:38 + 271876096 67% 2.87MB/s 0:00:44 + 277118976 69% 3.07MB/s 0:00:39 + 281542656 70% 3.77MB/s 0:00:31 + 285507584 71% 3.74MB/s 0:00:30 + 290226176 72% 4.25MB/s 0:00:25 + 293371904 73% 3.74MB/s 0:00:28 + 298614784 74% 3.64MB/s 0:00:27 + 304119808 75% 4.00MB/s 0:00:23 + 307527680 76% 3.39MB/s 0:00:27 + 312508416 77% 3.67MB/s 0:00:23 + 317882368 79% 3.97MB/s 0:00:20 + 320372736 79% 3.32MB/s 0:00:23 + 325550080 81% 4.07MB/s 0:00:18 + 329842688 82% 4.06MB/s 0:00:17 + 333217792 83% 3.54MB/s 0:00:18 + 338460672 84% 4.23MB/s 0:00:14 + 342949888 85% 4.06MB/s 0:00:14 + 346062848 86% 3.50MB/s 0:00:15 + 350519296 87% 3.72MB/s 0:00:13 + 355926016 88% 3.75MB/s 0:00:11 + 360185856 89% 3.70MB/s 0:00:10 + 364380160 90% 4.24MB/s 0:00:08 + 368607232 91% 4.26MB/s 0:00:07 + 372015104 92% 3.72MB/s 0:00:07 + 377520128 94% 3.97MB/s 0:00:05 + 381976576 95% 4.03MB/s 0:00:04 + 386236416 96% 4.03MB/s 0:00:03 + 389578752 97% 4.10MB/s 0:00:02 + 394330112 98% 3.97MB/s 0:00:01 + 398589952 99% 3.94MB/s 0:00:00 + 401429383 100% 3.77MB/s 0:01:41 (xfer#1, to-check=0/1) + +sent 401478543 bytes received 42 bytes 3879020.14 bytes/sec +total size is 401429383 speedup is 1.00 +[2014-05-25 19:49:23 CEST] Transferrer: Uploaded 03_assump..heses.mp4 +[2014-05-25 19:49:23 CEST] Pusher: Syncing with diskstation + +WORM-s341574274-m1396396677--Lean UX Workshop%04_personas.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5013504 1% 3.92MB/s 0:01:23 + 10452992 3% 4.49MB/s 0:01:12 +remote: merge git-annex 14778368 4% 4.38MB/s 0:01:12 + 18382848 5% 4.15MB/s 0:01:16 +[2014-05-25 19:49:29 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 02a8a6a..399d085 git-annex -> synced/git-annex + 22577152 6% 4.16MB/s 0:01:14 + 26509312 7% 3.60MB/s 0:01:25 + 31293440 9% 3.70MB/s 0:01:21 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c1859f2..5a46cc4 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 399d0856bfb9fef74a18eb9d1d57c0151267323d but expected 02a8a6a6016fd1f36acc39b27cd9e2f1b24fd394 + ! 02a8a6a..399d085 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 35684352 10% 3.88MB/s 0:01:17 + 40108032 11% 3.92MB/s 0:01:15 + 43352064 12% 3.95MB/s 0:01:13 + 46956544 13% 3.67MB/s 0:01:18 + 51675136 15% 3.55MB/s 0:01:19 + 57180160 16% 3.80MB/s 0:01:13 + 61472768 17% 4.03MB/s 0:01:07 + 65044480 19% 4.00MB/s 0:01:07 + 70057984 20% 4.29MB/s 0:01:01 + 74383360 21% 4.03MB/s 0:01:04 + 78675968 23% 4.03MB/s 0:01:03 + 82739200 24% 4.18MB/s 0:01:00 + 86999040 25% 4.01MB/s 0:01:02 + 90734592 26% 3.76MB/s 0:01:05 + 95977472 28% 3.96MB/s 0:01:00 + 100433920 29% 4.04MB/s 0:00:58 + 104792064 30% 4.04MB/s 0:00:57 + 108986368 31% 4.24MB/s 0:00:53 + 111443968 32% 3.60MB/s 0:01:02 + 116686848 34% 3.74MB/s 0:00:58 + 120487936 35% 3.62MB/s 0:00:59 + 123764736 36% 3.25MB/s 0:01:05 + 128974848 37% 3.88MB/s 0:00:53 + 132415488 38% 3.52MB/s 0:00:58 + 136347648 39% 3.31MB/s 0:01:00 + 141721600 41% 3.92MB/s 0:00:49 + 144998400 42% 3.48MB/s 0:00:55 + 147619840 43% 3.27MB/s 0:00:57 + 152862720 44% 3.81MB/s 0:00:48 + 156008448 45% 3.29MB/s 0:00:55 + 160464896 46% 3.25MB/s 0:00:54 + 165904384 48% 3.88MB/s 0:00:44 + 169246720 49% 3.48MB/s 0:00:48 + 172523520 50% 3.36MB/s 0:00:49 + 178028544 52% 3.92MB/s 0:00:40 + 181600256 53% 3.51MB/s 0:00:44 + 184582144 54% 3.28MB/s 0:00:46 + 188514304 55% 3.60MB/s 0:00:41 + 192970752 56% 3.36MB/s 0:00:43 + 196902912 57% 3.19MB/s 0:00:44 + 202113024 59% 3.81MB/s 0:00:35 + 205684736 60% 3.72MB/s 0:00:35 + 208175104 60% 3.27MB/s 0:00:39 + 213581824 62% 3.87MB/s 0:00:32 + 216825856 63% 3.41MB/s 0:00:35 + 219709440 64% 3.22MB/s 0:00:36 + 225083392 65% 3.91MB/s 0:00:29 + 228622336 66% 3.48MB/s 0:00:31 + 232292352 68% 3.31MB/s 0:00:32 + 237666304 69% 3.89MB/s 0:00:26 + 241139712 70% 3.48MB/s 0:00:28 + 245137408 71% 3.29MB/s 0:00:28 + 250380288 73% 3.49MB/s 0:00:25 + 255361024 74% 3.42MB/s 0:00:24 + 258899968 75% 3.43MB/s 0:00:23 + 262176768 76% 3.38MB/s 0:00:22 + 267452416 78% 3.79MB/s 0:00:19 + 270434304 79% 3.36MB/s 0:00:20 + 274235392 80% 3.24MB/s 0:00:20 + 279478272 81% 3.89MB/s 0:00:15 + 282886144 82% 3.45MB/s 0:00:16 + 286818304 83% 3.38MB/s 0:00:15 + 292061184 85% 3.50MB/s 0:00:13 + 297304064 87% 3.50MB/s 0:00:12 + 300711936 88% 3.49MB/s 0:00:11 + 304152576 89% 3.66MB/s 0:00:09 + 308543488 90% 3.86MB/s 0:00:08 + 312770560 91% 3.60MB/s 0:00:07 + 316178432 92% 3.63MB/s 0:00:06 + 319586304 93% 3.44MB/s 0:00:06 + 325025792 95% 3.66MB/s 0:00:04 + 328466432 96% 3.50MB/s 0:00:03 + 331120640 96% 3.24MB/s 0:00:03 + 336592896 98% 3.87MB/s 0:00:01 + 340000768 99% 3.42MB/s 0:00:00 + 341574274 100% 3.66MB/s 0:01:29 (xfer#1, to-check=0/1) + +sent 341616112 bytes received 42 bytes 3733509.88 bytes/sec +total size is 341574274 speedup is 1.00 +[2014-05-25 19:50:54 CEST] Transferrer: Uploaded 04_personas.mp4 +[2014-05-25 19:50:54 CEST] Pusher: Syncing with diskstation + +WORM-s112588009-m1396396463--Lean UX Workshop%05_outcomes-and-features.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5537792 4% 5.11MB/s 0:00:20 + 8683520 7% 3.73MB/s 0:00:27 + 14057472 12% 4.16MB/s 0:00:23 +remote: merge git-annex 17334272 15% 3.90MB/s 0:00:23 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 19:51:00 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 21266432 18% 3.26MB/s 0:00:27 + 399d085..8395b06 git-annex -> synced/git-annex + 26509312 23% 3.85MB/s 0:00:21 + 29655040 26% 3.34MB/s 0:00:24 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5a46cc4..c29a46c git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 8395b065d53211a1d1da518dafd09a81ba42f11c but expected 399d0856bfb9fef74a18eb9d1d57c0151267323d + ! 399d085..8395b06 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 33062912 29% 3.16MB/s 0:00:24 + 38502400 34% 3.76MB/s 0:00:19 + 41910272 37% 3.36MB/s 0:00:20 + 45121536 40% 3.21MB/s 0:00:20 + 50561024 44% 3.88MB/s 0:00:15 + 53772288 47% 3.36MB/s 0:00:17 + 57442304 51% 3.22MB/s 0:00:16 + 62881792 55% 3.88MB/s 0:00:12 + 66093056 58% 3.39MB/s 0:00:13 + 70451200 62% 3.69MB/s 0:00:11 + 72908800 64% 3.15MB/s 0:00:12 + 77627392 68% 2.87MB/s 0:00:11 + 83132416 73% 3.33MB/s 0:00:08 + 84541440 75% 2.75MB/s 0:00:09 + 89423872 79% 3.71MB/s 0:00:06 + 90570752 80% 3.08MB/s 0:00:06 + 95911936 85% 3.02MB/s 0:00:05 + 97550336 86% 3.06MB/s 0:00:04 + 102531072 91% 2.60MB/s 0:00:03 + 107872256 95% 3.43MB/s 0:00:01 + 109871104 97% 2.78MB/s 0:00:00 + 112588009 100% 3.35MB/s 0:00:31 (xfer#1, to-check=0/1) + +sent 112601904 bytes received 42 bytes 3361252.12 bytes/sec +total size is 112588009 speedup is 1.00 +[2014-05-25 19:51:27 CEST] Transferrer: Uploaded 05_outcom..tures.mp4 +[2014-05-25 19:51:27 CEST] Pusher: Syncing with diskstation + +WORM-s78565449-m1396396837--Lean UX Workshop%06_writing-hypotheses.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5275648 6% 4.94MB/s 0:00:14 + 6848512 8% 3.18MB/s 0:00:22 +remote: merge git-annex 11796480 15% 3.64MB/s 0:00:17 + 13402112 17% 3.12MB/s 0:00:20 +[2014-05-25 19:51:32 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8395b06..bbec44b git-annex -> synced/git-annex + 17858560 22% 2.94MB/s 0:00:20 + 19693568 25% 3.01MB/s 0:00:19 + 24412160 31% 2.96MB/s 0:00:17 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c29a46c..d52fe33 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at bbec44b1f18107dc3aaab411ddf2ada1aa273741 but expected 8395b065d53211a1d1da518dafd09a81ba42f11c + ! 8395b06..bbec44b synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 27033600 34% 3.00MB/s 0:00:16 + 31490048 40% 2.69MB/s 0:00:17 + 36470784 46% 2.96MB/s 0:00:13 + 41910272 53% 3.09MB/s 0:00:11 + 43286528 55% 2.97MB/s 0:00:11 + 48529408 61% 3.00MB/s 0:00:09 + 53510144 68% 3.06MB/s 0:00:07 + 58753024 74% 2.78MB/s 0:00:06 + 64159744 81% 3.51MB/s 0:00:04 + 67141632 85% 3.23MB/s 0:00:03 + 72548352 92% 3.61MB/s 0:00:01 + 76840960 97% 3.79MB/s 0:00:00 + 78565449 100% 3.17MB/s 0:00:23 (xfer#1, to-check=0/1) + +sent 78575188 bytes received 42 bytes 3081381.57 bytes/sec +total size is 78565449 speedup is 1.00 +[2014-05-25 19:51:52 CEST] Transferrer: Uploaded 06_writin..heses.mp4 +[2014-05-25 19:51:52 CEST] Pusher: Syncing with diskstation + +WORM-s237023281-m1396397192--Lean UX Workshop%07_design-studio.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3964928 1% 3.16MB/s 0:01:12 +remote: merge git-annex 9207808 3% 3.35MB/s 0:01:06 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 19:51:57 CEST] RemoteControl: Syncing with diskstation + 14712832 6% 3.19MB/s 0:01:08 + bbec44b..423bfb2 git-annex -> synced/git-annex + 19169280 8% 2.99MB/s 0:01:11 + 23887872 10% 3.20MB/s 0:01:05 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + d52fe33..b408181 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 423bfb2586ebc18e8149998862ee1d0060d962ec but expected bbec44b1f18107dc3aaab411ddf2ada1aa273741 + ! bbec44b..423bfb2 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 26771456 11% 2.98MB/s 0:01:08 + 30965760 13% 2.91MB/s 0:01:09 + 35946496 15% 3.04MB/s 0:01:04 + 40927232 17% 2.76MB/s 0:01:09 + 45187072 19% 3.01MB/s 0:01:02 + 48005120 20% 3.04MB/s 0:01:00 + 50364416 21% 2.73MB/s 0:01:06 + 55607296 23% 2.77MB/s 0:01:03 + 60948480 25% 3.01MB/s 0:00:57 + 62423040 26% 2.75MB/s 0:01:01 + 66355200 27% 2.96MB/s 0:00:56 + 71335936 30% 2.89MB/s 0:00:55 + 76742656 32% 2.90MB/s 0:00:53 + 79200256 33% 3.06MB/s 0:00:50 + 82870272 34% 3.28MB/s 0:00:45 + 86802432 36% 3.60MB/s 0:00:40 + 91521024 38% 3.44MB/s 0:00:41 + 95191040 40% 3.74MB/s 0:00:37 + 97026048 40% 3.23MB/s 0:00:42 + 100171776 42% 2.87MB/s 0:00:46 + 104628224 44% 2.80MB/s 0:00:46 + 109903872 46% 3.14MB/s 0:00:39 + 113541120 47% 3.66MB/s 0:00:32 + 116686848 49% 3.89MB/s 0:00:30 + 121667584 51% 3.68MB/s 0:00:30 + 126386176 53% 3.51MB/s 0:00:30 + 131530752 55% 3.83MB/s 0:00:26 + 135823360 57% 4.07MB/s 0:00:24 + 140214272 59% 4.31MB/s 0:00:21 + 144474112 60% 4.26MB/s 0:00:21 + 148144128 62% 3.82MB/s 0:00:22 + 153124864 64% 3.97MB/s 0:00:20 + 154959872 65% 3.40MB/s 0:00:23 + 160071680 67% 3.59MB/s 0:00:20 + 161513472 68% 3.14MB/s 0:00:23 + 166494208 70% 3.15MB/s 0:00:21 + 169639936 71% 3.11MB/s 0:00:21 + 175046656 73% 3.17MB/s 0:00:19 + 178028544 75% 3.30MB/s 0:00:17 + 183271424 77% 3.33MB/s 0:00:15 + 186941440 78% 3.34MB/s 0:00:14 + 191922176 80% 3.25MB/s 0:00:13 + 195330048 82% 3.22MB/s 0:00:12 + 200835072 84% 3.27MB/s 0:00:10 + 202211328 85% 3.22MB/s 0:00:10 + 207585280 87% 3.31MB/s 0:00:08 + 210534400 88% 3.58MB/s 0:00:07 + 215154688 90% 3.40MB/s 0:00:06 + 215777280 91% 3.21MB/s 0:00:06 + 221020160 93% 3.03MB/s 0:00:05 + 225738752 95% 2.96MB/s 0:00:03 + 230227968 97% 2.94MB/s 0:00:02 + 235175936 99% 3.25MB/s 0:00:00 + 237023281 100% 3.26MB/s 0:01:09 (xfer#1, to-check=0/1) + +sent 237052360 bytes received 42 bytes 3315418.21 bytes/sec +total size is 237023281 speedup is 1.00 +[2014-05-25 19:53:03 CEST] Transferrer: Uploaded 07_design..tudio.mp4 +[2014-05-25 19:53:04 CEST] Pusher: Syncing with diskstation + +WORM-s113325561-m1396396724--Lean UX Workshop%08_experiments-and-mvp-s.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 3% 3.88MB/s 0:00:27 +remote: merge git-annex 7897088 6% 3.69MB/s 0:00:27 +[2014-05-25 19:53:08 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 423bfb2..e9861a8 git-annex -> synced/git-annex + 13139968 11% 4.11MB/s 0:00:23 + 16023552 14% 3.39MB/s 0:00:28 + 21266432 18% 3.62MB/s 0:00:24 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b408181..6b97695 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at e9861a8445e7859f23e90dbc1e6113af547c0515 but expected 423bfb2586ebc18e8149998862ee1d0060d962ec + ! 423bfb2..e9861a8 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 23101440 20% 3.22MB/s 0:00:27 + 28082176 24% 3.16MB/s 0:00:26 + 31490048 27% 3.25MB/s 0:00:24 + 35946496 31% 3.09MB/s 0:00:24 + 41189376 36% 3.80MB/s 0:00:18 + 42500096 37% 3.03MB/s 0:00:22 + 47972352 42% 3.88MB/s 0:00:16 + 51675136 45% 3.70MB/s 0:00:16 + 55345152 48% 3.13MB/s 0:00:18 + 60948480 53% 4.11MB/s 0:00:12 + 63209472 55% 3.10MB/s 0:00:15 + 67698688 59% 3.28MB/s 0:00:13 + 72646656 64% 3.26MB/s 0:00:12 + 78315520 69% 3.26MB/s 0:00:10 + 81297408 71% 3.36MB/s 0:00:09 + 86900736 76% 3.55MB/s 0:00:07 + 90472448 79% 3.68MB/s 0:00:06 + 94928896 83% 3.23MB/s 0:00:05 + 100433920 88% 3.87MB/s 0:00:03 + 104628224 92% 3.40MB/s 0:00:02 + 110067712 97% 3.85MB/s 0:00:00 + 113325561 100% 3.52MB/s 0:00:30 (xfer#1, to-check=0/1) + +sent 113339548 bytes received 42 bytes 3487372.00 bytes/sec +total size is 113325561 speedup is 1.00 +[2014-05-25 19:53:36 CEST] Transferrer: Uploaded 08_experi..mvp-s.mp4 +[2014-05-25 19:53:37 CEST] Pusher: Syncing with diskstation + +WORM-s171315323-m1396397078--Lean UX Workshop%09_research.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 3964928 2% 3.72MB/s 0:00:43 + 9469952 5% 4.48MB/s 0:00:35 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + e9861a8..0967b9e git-annex -> synced/git-annex +[2014-05-25 19:53:41 CEST] RemoteControl: Syncing with diskstation + 12353536 7% 3.86MB/s 0:00:40 + 16252928 9% 3.83MB/s 0:00:39 + 19693568 11% 3.50MB/s 0:00:42 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 6b97695..b05c1b5 git-annex -> diskstation/git-annex + 25198592 14% 3.50MB/s 0:00:40 + 29392896 17% 3.78MB/s 0:00:36 + 31227904 18% 3.31MB/s 0:00:41 + 35979264 21% 3.82MB/s 0:00:34 + 38043648 22% 2.87MB/s 0:00:45 + 43548672 25% 3.18MB/s 0:00:39 + 47218688 27% 3.16MB/s 0:00:38 + 52723712 30% 3.26MB/s 0:00:35 + 55607296 32% 3.33MB/s 0:00:33 + 59801600 34% 3.09MB/s 0:00:35 + 65208320 38% 3.87MB/s 0:00:26 + 66879488 39% 3.10MB/s 0:00:32 + 72122368 42% 3.87MB/s 0:00:25 + 75530240 44% 3.32MB/s 0:00:28 + 80510976 46% 3.20MB/s 0:00:27 + 84180992 49% 3.32MB/s 0:00:25 + 89686016 52% 3.39MB/s 0:00:23 + 93880320 54% 3.59MB/s 0:00:21 + 99483648 58% 3.74MB/s 0:00:18 + 103317504 60% 3.83MB/s 0:00:17 + 108822528 63% 3.85MB/s 0:00:15 + 112754688 65% 3.82MB/s 0:00:14 + 118292480 69% 3.81MB/s 0:00:13 + 121405440 70% 3.93MB/s 0:00:12 + 126124032 73% 3.76MB/s 0:00:11 + 128745472 75% 3.68MB/s 0:00:11 + 133988352 78% 3.59MB/s 0:00:10 + 138182656 80% 3.53MB/s 0:00:09 + 143687680 83% 3.66MB/s 0:00:07 + 146833408 85% 3.70MB/s 0:00:06 + 152338432 88% 3.77MB/s 0:00:04 + 155484160 90% 3.70MB/s 0:00:04 + 160989184 93% 3.65MB/s 0:00:02 + 164397056 95% 3.71MB/s 0:00:01 + 169639936 99% 3.67MB/s 0:00:00 + 171315323 100% 3.60MB/s 0:00:45 (xfer#1, to-check=0/1) + +sent 171336377 bytes received 42 bytes 3607082.51 bytes/sec +total size is 171315323 speedup is 1.00 +[2014-05-25 19:54:24 CEST] Transferrer: Uploaded 09_research.mp4 +[2014-05-25 19:54:24 CEST] Pusher: Syncing with diskstation + +WORM-s254857031-m1396396965--Lean UX Workshop%10_combining-lean-and-agile.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5275648 2% 4.91MB/s 0:00:49 + 10027008 3% 4.72MB/s 0:00:50 +remote: merge git-annex 13139968 5% 3.93MB/s 0:01:00 + 18710528 7% 4.26MB/s 0:00:54 +[2014-05-25 19:54:30 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 22052864 8% 3.51MB/s 0:01:04 + 0967b9e..8e9de0b git-annex -> synced/git-annex + 27033600 10% 3.53MB/s 0:01:02 + 30441472 11% 3.72MB/s 0:00:58 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b05c1b5..9285684 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 8e9de0bb0562a8c9e6a72dcff4ad92f93403ad43 but expected 0967b9e587fc2d85662e7b0c1d047ea77bd1e540 + ! 0967b9e..8e9de0b synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 35815424 14% 3.66MB/s 0:00:58 + 39092224 15% 3.99MB/s 0:00:52 + 43286528 16% 3.83MB/s 0:00:54 + 45645824 17% 3.39MB/s 0:01:00 + 50888704 19% 3.34MB/s 0:00:59 + 54034432 21% 3.04MB/s 0:01:04 + 57966592 22% 3.00MB/s 0:01:04 + 63373312 24% 3.79MB/s 0:00:49 + 64520192 25% 2.95MB/s 0:01:02 + 67403776 26% 3.06MB/s 0:00:59 + 72908800 28% 3.40MB/s 0:00:52 + 76840960 30% 3.06MB/s 0:00:56 + 79986688 31% 3.51MB/s 0:00:48 + 85196800 33% 4.18MB/s 0:00:39 + 87326720 34% 3.20MB/s 0:00:51 + 92831744 36% 3.55MB/s 0:00:44 + 95977472 37% 3.15MB/s 0:00:49 + 100696064 39% 2.97MB/s 0:00:50 + 105676800 41% 3.27MB/s 0:00:44 + 110395392 43% 3.13MB/s 0:00:45 + 115376128 45% 3.84MB/s 0:00:35 + 116686848 45% 3.27MB/s 0:00:41 + 121667584 47% 3.72MB/s 0:00:34 + 125861888 49% 3.56MB/s 0:00:35 + 129007616 50% 2.92MB/s 0:00:42 + 134250496 52% 3.74MB/s 0:00:31 + 137396224 53% 3.01MB/s 0:00:38 + 142835712 56% 3.30MB/s 0:00:33 + 146571264 57% 3.21MB/s 0:00:32 + 150765568 59% 3.02MB/s 0:00:33 + 156270592 61% 3.80MB/s 0:00:25 + 158072832 62% 3.08MB/s 0:00:30 + 163282944 64% 3.87MB/s 0:00:23 + 165445632 64% 2.81MB/s 0:00:31 + 169279488 66% 2.52MB/s 0:00:33 + 173572096 68% 2.96MB/s 0:00:26 + 177242112 69% 2.28MB/s 0:00:33 + 179601408 70% 2.36MB/s 0:00:31 + 183959552 72% 2.44MB/s 0:00:28 + 187203584 73% 2.27MB/s 0:00:29 + 191135744 74% 2.68MB/s 0:00:23 + 196640768 77% 3.84MB/s 0:00:14 + 197427200 77% 2.79MB/s 0:00:20 + 200310784 78% 2.76MB/s 0:00:19 + 205815808 80% 3.13MB/s 0:00:15 + 207650816 81% 2.33MB/s 0:00:19 + 213123072 83% 3.64MB/s 0:00:11 + 217579520 85% 3.99MB/s 0:00:09 + 219185152 86% 3.08MB/s 0:00:11 + 222068736 87% 3.17MB/s 0:00:10 + 227508224 89% 3.15MB/s 0:00:08 + 230457344 90% 2.83MB/s 0:00:08 + 234389504 91% 3.27MB/s 0:00:06 + 238583808 93% 3.81MB/s 0:00:04 + 243204096 95% 3.63MB/s 0:00:03 + 247496704 97% 3.94MB/s 0:00:01 + 249593856 97% 3.61MB/s 0:00:01 + 254312448 99% 3.71MB/s 0:00:00 + 254857031 100% 3.29MB/s 0:01:13 (xfer#1, to-check=0/1) + +sent 254888297 bytes received 42 bytes 3376004.49 bytes/sec +total size is 254857031 speedup is 1.00 +[2014-05-25 19:55:40 CEST] Transferrer: Uploaded 10_combin..agile.mp4 +[2014-05-25 19:55:40 CEST] Pusher: Syncing with diskstation + +WORM-s67182998-m1396396768--Lean UX Workshop%11_tools-and-techniques.mp4 + 32768 0% 0.00kB/s 0:00:00 + 2392064 3% 2.20MB/s 0:00:28 +remote: merge git-annex 7897088 11% 3.69MB/s 0:00:15 + 12353536 18% 3.75MB/s 0:00:14 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8e9de0b..10f88fb git-annex -> synced/git-annex +[2014-05-25 19:55:45 CEST] RemoteControl: Syncing with diskstation + 13664256 20% 3.12MB/s 0:00:16 + 18644992 27% 3.71MB/s 0:00:12 + 20217856 30% 2.79MB/s 0:00:16 + 24510464 36% 2.82MB/s 0:00:14 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9285684..b2bad3b git-annex -> diskstation/git-annex + 27557888 41% 3.04MB/s 0:00:12 + 32931840 49% 3.15MB/s 0:00:10 + 34373632 51% 3.09MB/s 0:00:10 + 38830080 57% 3.12MB/s 0:00:08 + 44072960 65% 3.80MB/s 0:00:05 + 45907968 68% 2.96MB/s 0:00:07 + 50626560 75% 3.81MB/s 0:00:04 + 53248000 79% 3.15MB/s 0:00:04 + 57442304 85% 2.95MB/s 0:00:03 + 62717952 93% 3.72MB/s 0:00:01 + 64520192 96% 3.07MB/s 0:00:00 + 67182998 100% 3.28MB/s 0:00:19 (xfer#1, to-check=0/1) + +sent 67191351 bytes received 42 bytes 3125181.07 bytes/sec +total size is 67182998 speedup is 1.00 +[2014-05-25 19:56:01 CEST] Transferrer: Uploaded 11_tools-..iques.mp4 +[2014-05-25 19:56:01 CEST] Pusher: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 10f88fb..aa5471b git-annex -> synced/git-annex +[2014-05-25 19:56:06 CEST] RemoteControl: Syncing with diskstation +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b2bad3b..34ef046 git-annex -> diskstation/git-annex +[2014-05-25 20:16:23 CEST] NetWatcherFallback: Syncing with diskstation +remote: merge git-annex ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + aa5471b..34ef046 git-annex -> synced/git-annex +[2014-05-25 21:01:01 CEST] main: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 34ef046..2f32e55 git-annex -> synced/git-annex + +WORM-s14123840-m1398381779--Learning Corel Painter X3%01_a-quick-tour-of-painter.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5799936 41% 5.46MB/s 0:00:01 + 9994240 70% 4.70MB/s 0:00:00 + 14123840 100% 4.71MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 14125729 bytes received 42 bytes 4035934.57 bytes/sec +total size is 14123840 speedup is 1.00 +[2014-05-25 21:01:34 CEST] Transferrer: Uploaded 01_a-quic..inter.mp4 +[2014-05-25 21:01:34 CEST] Pusher: Syncing with diskstation + +WORM-s23356431-m1398381923--Learning Corel Painter X3%02_brushes-and-custom-palettes.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5275648 22% 4.47MB/s 0:00:03 + 10715136 45% 4.81MB/s 0:00:02 + 15237120 65% 4.65MB/s 0:00:01 + 19955712 85% 4.60MB/s 0:00:00 +remote: merge git-annex 23356431 100% 4.51MB/s 0:00:04 (xfer#1, to-check=0/1) +[2014-05-25 21:01:40 CEST] RemoteControl: Syncing with diskstation + +sent 23359448 bytes received 42 bytes 4247180.00 bytes/sec +total size is 23356431 speedup is 1.00 +[2014-05-25 21:01:40 CEST] Transferrer: Uploaded 02_brushe..ettes.mp4 + +WORM-s16835823-m1398381229--Learning Corel Painter X3%03_managing-layers.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2f32e55..f2e1569 git-annex -> synced/git-annex + 6094848 36% 5.76MB/s 0:00:01 + 11010048 65% 5.22MB/s 0:00:01 + 15761408 93% 4.99MB/s 0:00:00 + 16835823 100% 4.96MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 16838032 bytes received 42 bytes 3741794.22 bytes/sec +total size is 16835823 speedup is 1.00 +[2014-05-25 21:01:45 CEST] Transferrer: Uploaded 03_managi..ayers.mp4 + +WORM-s26947174-m1398380993--Learning Corel Painter X3%04_project-red-chairs.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:01:46 CEST] Pusher: Syncing with diskstation + 5799936 21% 5.47MB/s 0:00:03 + 8421376 31% 3.79MB/s 0:00:04 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 34ef046..28ecf68 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at f2e15690121bf48eba8288426bf72c0661ea444a but expected 2f32e55b5e8bd953707452ada9ad57fbeb20b7b1 + ! 2f32e55..f2e1569 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:01:48 CEST] RemoteControl: Syncing with diskstation + 13139968 48% 3.94MB/s 0:00:03 + 17956864 66% 4.10MB/s 0:00:02 + 22577152 83% 3.83MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 28ecf68..644a4ea git-annex -> diskstation/git-annex + 25460736 94% 3.94MB/s 0:00:00 + 26947174 100% 3.97MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 26950622 bytes received 42 bytes 3593421.87 bytes/sec +total size is 26947174 speedup is 1.00 +remote: merge git-annex [2014-05-25 21:01:52 CEST] Transferrer: Uploaded 04_projec..hairs.mp4 + +WORM-s14550387-m1398382074--Learning Corel Painter X3%05_the-toolbox-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:01:53 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + f2e1569..7bf9116 git-annex -> synced/git-annex + 5668864 38% 5.09MB/s 0:00:01 + 10289152 70% 4.74MB/s 0:00:00 + 14550387 100% 4.56MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 14552323 bytes received 42 bytes 3233858.89 bytes/sec +total size is 14550387 speedup is 1.00 +[2014-05-25 21:01:57 CEST] Transferrer: Uploaded 05_the-to..art-1.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 644a4ea..f3817af git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7bf9116bbeb90b398ac29d7b38e78dbe493f081f but expected f2e15690121bf48eba8288426bf72c0661ea444a + ! f2e1569..7bf9116 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s5537051-m1398381582--Learning Corel Painter X3%06_the-toolbox-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 76% 4.00MB/s 0:00:00 +[2014-05-25 21:01:58 CEST] Pusher: Syncing with diskstation + 5537051 100% 4.47MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 5537882 bytes received 42 bytes 3691949.33 bytes/sec +total size is 5537051 speedup is 1.00 +[2014-05-25 21:02:00 CEST] Transferrer: Uploaded 06_the-to..art-2.mp4 + +WORM-s16270822-m1398381489--Learning Corel Painter X3%07_color-panels.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4882432 30% 4.62MB/s 0:00:02 +remote: merge git-annex 7634944 46% 3.29MB/s 0:00:02 +[2014-05-25 21:02:03 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7bf9116..a826827 git-annex -> synced/git-annex + 9994240 61% 2.94MB/s 0:00:02 + 13369344 82% 3.01MB/s 0:00:00 + 15761408 96% 2.44MB/s 0:00:00 + 16270822 100% 2.91MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 16272960 bytes received 42 bytes 2503538.77 bytes/sec +total size is 16270822 speedup is 1.00 +[2014-05-25 21:02:06 CEST] Transferrer: Uploaded 07_color-panels.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + f3817af..bff569c git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at a8268279606cf4fdee4e0fabeef0c9075d840f71 but expected 7bf9116bbeb90b398ac29d7b38e78dbe493f081f + ! 7bf9116..a826827 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s21555439-m1398381255--Learning Corel Painter X3%08_paper-and-media-libraries.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5111808 23% 4.81MB/s 0:00:03 +[2014-05-25 21:02:08 CEST] Pusher: Syncing with diskstation + 9175040 42% 4.29MB/s 0:00:02 + 13369344 62% 4.18MB/s 0:00:01 + 17563648 81% 4.10MB/s 0:00:00 + 21555439 100% 4.05MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 21558234 bytes received 42 bytes 3316657.85 bytes/sec +total size is 21555439 speedup is 1.00 +[2014-05-25 21:02:12 CEST] Transferrer: Uploaded 08_paper-..aries.mp4 +remote: merge git-annex +WORM-s24881920-m1398382026--Learning Corel Painter X3%09_menu-commands-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5210112 20% 4.80MB/s 0:00:03 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 21:02:14 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + a826827..e65041f git-annex -> synced/git-annex + 9142272 36% 4.28MB/s 0:00:03 + 13041664 52% 4.08MB/s 0:00:02 + 17235968 69% 4.03MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + bff569c..b552f10 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at e65041fc45b14af68426581456deb8d3e9efa1d9 but expected a8268279606cf4fdee4e0fabeef0c9075d840f71 + ! a826827..e65041f synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 21397504 85% 3.81MB/s 0:00:00 + 24881920 100% 4.05MB/s 0:00:05 (xfer#1, to-check=0/1) +[2014-05-25 21:02:19 CEST] Pusher: Syncing with diskstation + +sent 24885118 bytes received 42 bytes 3318021.33 bytes/sec +total size is 24881920 speedup is 1.00 +[2014-05-25 21:02:20 CEST] Transferrer: Uploaded 09_menu-c..art-1.mp4 + +WORM-s29078392-m1398382059--Learning Corel Painter X3%10_menu-commands-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5210112 17% 4.81MB/s 0:00:04 + 9437184 32% 4.41MB/s 0:00:04 +[2014-05-25 21:02:24 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + e65041f..530d23c git-annex -> synced/git-annex + 13762560 47% 4.30MB/s 0:00:03 + 17924096 61% 4.20MB/s 0:00:02 + 22970368 78% 4.16MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b552f10..4dc60d5 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 530d23cf75a7f936041cdb408fd4f3516fe1514b but expected e65041fc45b14af68426581456deb8d3e9efa1d9 + ! e65041f..530d23c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 27688960 95% 4.26MB/s 0:00:00 + 29078392 100% 4.33MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 29082102 bytes received 42 bytes 3421428.71 bytes/sec +total size is 29078392 speedup is 1.00 +[2014-05-25 21:02:29 CEST] Transferrer: Uploaded 10_menu-c..art-2.mp4 + +WORM-s18704564-m1398381759--Learning Corel Painter X3%11_cloner-brushes.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:02:29 CEST] Pusher: Syncing with diskstation + 5996544 32% 5.68MB/s 0:00:02 + 10321920 55% 4.86MB/s 0:00:01 + 14581760 77% 4.55MB/s 0:00:00 + 18704564 100% 4.39MB/s 0:00:00 + 18704564 100% 4.39MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 18707000 bytes received 42 bytes 4157120.44 bytes/sec +total size is 18704564 speedup is 1.00 +[2014-05-25 21:02:33 CEST] Transferrer: Uploaded 11_cloner..ushes.mp4 + +WORM-s16483665-m1398381099--Learning Corel Painter X3%12_project-clone-painting-a-pear.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 3964928 24% 3.69MB/s 0:00:03 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 21:02:36 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 530d23c..821b643 git-annex -> synced/git-annex + 8683520 52% 3.90MB/s 0:00:01 + 12877824 78% 3.90MB/s 0:00:00 + 16483665 100% 4.01MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 16485848 bytes received 42 bytes 2997434.55 bytes/sec +total size is 16483665 speedup is 1.00 +[2014-05-25 21:02:38 CEST] Transferrer: Uploaded 12_projec..-pear.mp4 + +WORM-s13729745-m1398381011--Learning Corel Painter X3%13_dab-stroke-and-method.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 4dc60d5..b35b714 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 821b643cf14025648cceac17c2de27e1a17840e3 but expected 530d23cf75a7f936041cdb408fd4f3516fe1514b + ! 530d23c..821b643 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 5013504 36% 4.35MB/s 0:00:01 +[2014-05-25 21:02:41 CEST] Pusher: Syncing with diskstation + 9469952 68% 4.23MB/s 0:00:00 + 13402112 97% 4.06MB/s 0:00:00 + 13729745 100% 3.98MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 13731580 bytes received 42 bytes 3923320.57 bytes/sec +total size is 13729745 speedup is 1.00 +[2014-05-25 21:02:43 CEST] Transferrer: Uploaded 13_dab-st..ethod.mp4 + +WORM-s15796088-m1398381069--Learning Corel Painter X3%14_advanced-controls.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5013504 31% 4.63MB/s 0:00:02 + 9207808 58% 4.25MB/s 0:00:01 + 13664256 86% 4.21MB/s 0:00:00 + 15796088 100% 4.21MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 15798175 bytes received 42 bytes 3510714.89 bytes/sec +total size is 15796088 speedup is 1.00 +[2014-05-25 21:02:47 CEST] Transferrer: Uploaded 14_advanc..trols.mp4 + +WORM-s14529732-m1398382119--Learning Corel Painter X3%15_custom-variants.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5996544 41% 5.49MB/s 0:00:01 +remote: merge git-annex 10551296 72% 4.90MB/s 0:00:00 + 14529732 100% 4.82MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 14531661 bytes received 42 bytes 2235646.62 bytes/sec +total size is 14529732 speedup is 1.00 +[2014-05-25 21:02:54 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:02:54 CEST] Transferrer: Uploaded 15_custom..iants.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 821b643..d1a88a1 git-annex -> synced/git-annex + +WORM-s20256713-m1398381124--Learning Corel Painter X3%16_abstract-painting.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5242880 25% 4.82MB/s 0:00:03 + 9437184 46% 4.38MB/s 0:00:02 + 13729792 67% 4.28MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b35b714..5d9e777 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at d1a88a1d1fb37d139753d3b96cbd570810a61a51 but expected 821b643cf14025648cceac17c2de27e1a17840e3 + ! 821b643..d1a88a1 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 17924096 88% 4.19MB/s 0:00:00 + 20256713 100% 4.15MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 20259344 bytes received 42 bytes 3116828.62 bytes/sec +total size is 20256713 speedup is 1.00 +[2014-05-25 21:03:00 CEST] Transferrer: Uploaded 16_abstra..nting.mp4 + +WORM-s15821561-m1398381954--Learning Corel Painter X3%17_tonal-controls.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:03:01 CEST] Pusher: Syncing with diskstation + 3964928 25% 3.50MB/s 0:00:03 + 6848512 43% 3.13MB/s 0:00:02 + 11829248 74% 3.62MB/s 0:00:01 + 15821561 100% 3.70MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 15823645 bytes received 42 bytes 2877034.00 bytes/sec +total size is 15821561 speedup is 1.00 +[2014-05-25 21:03:05 CEST] Transferrer: Uploaded 17_tonal-..trols.mp4 +remote: merge git-annex +WORM-s27686314-m1398381815--Learning Corel Painter X3%18_surface-controls.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5210112 18% 4.91MB/s 0:00:04 +[2014-05-25 21:03:08 CEST] RemoteControl: Syncing with diskstation + 9142272 33% 4.29MB/s 0:00:04 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + d1a88a1..2f6a023 git-annex -> synced/git-annex + 12943360 46% 4.06MB/s 0:00:03 + 17104896 61% 4.01MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5d9e777..5732a07 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 2f6a0230e37a27a287290d40a66a61284abd958e but expected d1a88a1d1fb37d139753d3b96cbd570810a61a51 + ! d1a88a1..2f6a023 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 21266432 76% 3.76MB/s 0:00:01 + 25591808 92% 3.85MB/s 0:00:00 +[2014-05-25 21:06:06 CEST] Pusher: Syncing with diskstation + 26640384 96% 73.39kB/s 0:00:14 + 27686314 100% 145.74kB/s 0:03:05 (xfer#1, to-check=0/1) + +sent 27689848 bytes received 42 bytes 148471.26 bytes/sec +total size is 27686314 speedup is 1.00 +[2014-05-25 21:06:11 CEST] Transferrer: Uploaded 18_surfac..trols.mp4 +remote: merge git-annex +WORM-s20041059-m1398382199--Learning Corel Painter X3%19_esoterica.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:06:13 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5013504 25% 4.74MB/s 0:00:03 + 2f6a023..3de6568 git-annex -> synced/git-annex + 8421376 42% 3.99MB/s 0:00:02 + 12681216 63% 4.01MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5732a07..22c09fa git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 3de6568fc3634c50a42c935f315c763106a22e3c but expected 2f6a0230e37a27a287290d40a66a61284abd958e + ! 2f6a023..3de6568 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 17596416 87% 4.18MB/s 0:00:00 + 20041059 100% 4.24MB/s 0:00:04 (xfer#1, to-check=0/1) +[2014-05-25 21:06:17 CEST] Pusher: Syncing with diskstation + +sent 20043654 bytes received 42 bytes 3083645.54 bytes/sec +total size is 20041059 speedup is 1.00 +[2014-05-25 21:06:18 CEST] Transferrer: Uploaded 19_esoterica.mp4 + +WORM-s20049901-m1398382237--Learning Corel Painter X3%20_esoterica-mosaic.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 21% 3.93MB/s 0:00:03 +remote: merge git-annex 7372800 36% 3.43MB/s 0:00:03 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 21:06:22 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 3de6568..91bf58d git-annex -> synced/git-annex + 11042816 55% 3.45MB/s 0:00:02 + 14712832 73% 3.45MB/s 0:00:01 + 17858560 89% 3.20MB/s 0:00:00 + 20049901 100% 3.44MB/s 0:00:05 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 22c09fa..f2cac44 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 91bf58d7240d46f8eee363bd3b56dde6deefc012 but expected 3de6568fc3634c50a42c935f315c763106a22e3c + ! 3de6568..91bf58d synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 20052503 bytes received 42 bytes 2673672.67 bytes/sec +total size is 20049901 speedup is 1.00 +[2014-05-25 21:06:25 CEST] Transferrer: Uploaded 20_esoter..osaic.mp4 + +WORM-s18181651-m1398381889--Learning Corel Painter X3%21_selection-tools-and-commands.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:06:26 CEST] Pusher: Syncing with diskstation + 4751360 26% 4.38MB/s 0:00:02 + 8421376 46% 3.89MB/s 0:00:02 + 12091392 66% 3.71MB/s 0:00:01 + 15761408 86% 3.64MB/s 0:00:00 + 18181651 100% 3.65MB/s 0:00:04 (xfer#1, to-check=0/1) +remote: merge git-annex +sent 18184037 bytes received 42 bytes 2797550.62 bytes/sec +total size is 18181651 speedup is 1.00 +[2014-05-25 21:06:31 CEST] Transferrer: Uploaded 21_select..mands.mp4 + +WORM-s16431574-m1398381365--Learning Corel Painter X3%22_text-properties.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5013504 30% 4.71MB/s 0:00:02 +[2014-05-25 21:06:32 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 91bf58d..9341c6c git-annex -> synced/git-annex + 8355840 50% 3.82MB/s 0:00:02 + 11763712 71% 3.60MB/s 0:00:01 + 15466496 94% 3.57MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + f2cac44..70eb4e9 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 9341c6cf9e5fe11181099779b7248a9debecaa26 but expected 91bf58d7240d46f8eee363bd3b56dde6deefc012 + ! 91bf58d..9341c6c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 16431574 100% 3.62MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 16433735 bytes received 42 bytes 2987959.45 bytes/sec +total size is 16431574 speedup is 1.00 +[2014-05-25 21:06:36 CEST] Transferrer: Uploaded 22_text-p..rties.mp4 + +WORM-s17364419-m1398381850--Learning Corel Painter X3%23_text-effects.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:06:37 CEST] Pusher: Syncing with diskstation + 5046272 29% 4.76MB/s 0:00:02 + 8421376 48% 3.97MB/s 0:00:02 + 12255232 70% 3.87MB/s 0:00:01 + 16023552 92% 3.79MB/s 0:00:00 +remote: merge git-annex 17364419 100% 3.71MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 17366689 bytes received 42 bytes 3157587.45 bytes/sec +total size is 17364419 speedup is 1.00 +[2014-05-25 21:06:42 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:06:42 CEST] Transferrer: Uploaded 23_text-effects.mp4 + +WORM-s19708183-m1398382290--Learning Corel Painter X3%24_postcard-graphic-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9341c6c..08cb8d8 git-annex -> synced/git-annex + 4489216 22% 3.60MB/s 0:00:04 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 70eb4e9..dce2d61 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 08cb8d8ba4b56c67984027263d5213133dcdaad2 but expected 9341c6cf9e5fe11181099779b7248a9debecaa26 + ! 9341c6c..08cb8d8 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:06:44 CEST] RemoteControl: Syncing with diskstation + 9469952 48% 4.08MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + dce2d61..ac9201d git-annex -> diskstation/git-annex + 13664256 69% 3.97MB/s 0:00:01 + 17301504 87% 3.86MB/s 0:00:00 +[2014-05-25 21:06:47 CEST] Pusher: Syncing with diskstation + 19708183 100% 3.96MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 19710752 bytes received 42 bytes 3032429.85 bytes/sec +total size is 19708183 speedup is 1.00 +[2014-05-25 21:06:48 CEST] Transferrer: Uploaded 24_postca..art-1.mp4 + +WORM-s21565207-m1398381554--Learning Corel Painter X3%25_postcard-graphic-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5439488 25% 5.07MB/s 0:00:03 +remote: merge git-annex 9306112 43% 4.32MB/s 0:00:02 +[2014-05-25 21:06:51 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 08cb8d8..1212159 git-annex -> synced/git-annex + 13107200 60% 4.05MB/s 0:00:02 + 16449536 76% 3.84MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ac9201d..a885109 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 12121595714360b6216de28d0beef79305ec276d but expected 08cb8d8ba4b56c67984027263d5213133dcdaad2 + ! 08cb8d8..1212159 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 20250624 93% 3.46MB/s 0:00:00 + 21565207 100% 3.75MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 21568004 bytes received 42 bytes 2875739.47 bytes/sec +total size is 21565207 speedup is 1.00 +[2014-05-25 21:06:55 CEST] Transferrer: Uploaded 25_postca..art-2.mp4 + +WORM-s20239101-m1398380964--Learning Corel Painter X3%26_dynamic-layers.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:06:56 CEST] Pusher: Syncing with diskstation + 5275648 26% 4.78MB/s 0:00:03 + 9404416 46% 4.35MB/s 0:00:02 + 12943360 63% 4.03MB/s 0:00:01 + 16384000 80% 3.85MB/s 0:00:00 +remote: merge git-annex 20152320 99% 3.52MB/s 0:00:00 + 20239101 100% 3.77MB/s 0:00:05 (xfer#1, to-check=0/1) +[2014-05-25 21:07:01 CEST] RemoteControl: Syncing with diskstation + +sent 20241725 bytes received 42 bytes 3114118.00 bytes/sec +total size is 20239101 speedup is 1.00 +[2014-05-25 21:07:02 CEST] Transferrer: Uploaded 26_dynami..ayers.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 1212159..4c20688 git-annex -> synced/git-annex + +WORM-s17613999-m1398382264--Learning Corel Painter X3%27_auto-painting.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5275648 29% 4.78MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + a885109..ac9fbda git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 4c206880fc1f99dd380b0fb28ebb780b72171633 but expected 12121595714360b6216de28d0beef79305ec276d + ! 1212159..4c20688 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 9175040 52% 4.26MB/s 0:00:01 + 12845056 72% 4.00MB/s 0:00:01 + 16384000 93% 3.82MB/s 0:00:00 +[2014-05-25 21:07:07 CEST] Pusher: Syncing with diskstation + 17613999 100% 3.79MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 17616302 bytes received 42 bytes 3202971.64 bytes/sec +total size is 17613999 speedup is 1.00 +[2014-05-25 21:07:08 CEST] Transferrer: Uploaded 27_auto-p..nting.mp4 + +WORM-s15562581-m1398381274--Learning Corel Painter X3%28_smart-stroke-cloning.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5275648 33% 4.77MB/s 0:00:02 + 9469952 60% 4.34MB/s 0:00:01 +[2014-05-25 21:07:11 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 4c20688..f7be7ec git-annex -> synced/git-annex + 13139968 84% 4.06MB/s 0:00:00 + 15562581 100% 3.89MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 15564639 bytes received 42 bytes 3458818.00 bytes/sec +total size is 15562581 speedup is 1.00 +[2014-05-25 21:07:13 CEST] Transferrer: Uploaded 28_smart-..oning.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ac9fbda..4f23f91 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at f7be7ececec0dd7a424dfc71571fc2a6cfc63bea but expected 4c206880fc1f99dd380b0fb28ebb780b72171633 + ! 4c20688..f7be7ec synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s28205928-m1398382150--Learning Corel Painter X3%29_mirror-and-kaleidoscope.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5537792 19% 4.94MB/s 0:00:04 +[2014-05-25 21:07:15 CEST] Pusher: Syncing with diskstation + 9994240 35% 4.54MB/s 0:00:03 + 14155776 50% 4.34MB/s 0:00:03 + 17956864 63% 4.16MB/s 0:00:02 + 21725184 77% 3.79MB/s 0:00:01 +remote: merge git-annex 25198592 89% 3.58MB/s 0:00:00 + 28205928 100% 3.85MB/s 0:00:06 (xfer#1, to-check=0/1) +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 21:07:21 CEST] RemoteControl: Syncing with diskstation + +sent 28209533 bytes received 42 bytes 3761276.67 bytes/sec +total size is 28205928 speedup is 1.00 + f7be7ec..5c452a1 git-annex -> synced/git-annex +[2014-05-25 21:07:21 CEST] Transferrer: Uploaded 29_mirror..scope.mp4 + +WORM-s21976288-m1398382005--Learning Corel Painter X3%30_introduction-to-mixed-media.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5406720 24% 5.07MB/s 0:00:03 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 4f23f91..1ca4624 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 5c452a15506c41b30a4ff7099c02f5dae74db8db but expected f7be7ececec0dd7a424dfc71571fc2a6cfc63bea + ! f7be7ec..5c452a1 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:22:27 CEST] Pusher: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5c452a1..de02d45 git-annex -> synced/git-annex + 8486912 38% 9.03kB/s 0:24:53 +[2014-05-25 21:22:35 CEST] RemoteControl: Syncing with diskstation + 12353536 56% 13.15kB/s 0:12:11 + 15761408 71% 16.76kB/s 0:06:10 + 18644992 84% 14.11kB/s 0:03:56 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 1ca4624..0fddca6 git-annex -> diskstation/git-annex + 21921792 99% 3.02MB/s 0:00:00 + 21976288 100% 23.34kB/s 0:15:18 (xfer#1, to-check=0/1) + +sent 21979137 bytes received 42 bytes 23903.40 bytes/sec +total size is 21976288 speedup is 1.00 +[2014-05-25 21:22:40 CEST] Transferrer: Uploaded 30_introd..media.mp4 +[2014-05-25 21:22:40 CEST] Pusher: Syncing with diskstation + +WORM-s20759393-m1398382174--Learning Corel Painter X3%31_portrait-of-stephen.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4194304 20% 3.79MB/s 0:00:04 + 6815744 32% 3.15MB/s 0:00:04 +remote: merge git-annex 9306112 44% 2.89MB/s 0:00:03 + 12320768 59% 2.87MB/s 0:00:02 +[2014-05-25 21:22:45 CEST] RemoteControl: Syncing with diskstation +/Applications/git-annex.app/Contents/MacOS/git-annex: fork: Resource temporarily unavailable +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + de02d45..251064b git-annex -> synced/git-annex + 15073280 72% 2.55MB/s 0:00:02 + 17563648 84% 2.52MB/s 0:00:01 + 20316160 97% 2.56MB/s 0:00:00 + 20759393 100% 2.71MB/s 0:00:07 (xfer#1, to-check=0/1) + +sent 20762086 bytes received 42 bytes 2185487.16 bytes/sec +total size is 20759393 speedup is 1.00 +[2014-05-25 21:22:49 CEST] Transferrer: Uploaded 31_portra..ephen.mp4 + +WORM-s25441460-m1398381650--Learning Corel Painter X3%32_cel-animation.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:22:50 CEST] Pusher: Syncing with diskstation +Pusher crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) +[2014-05-25 21:22:50 CEST] Pusher: warning Pusher crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) + 4096000 16% 3.83MB/s 0:00:05 + 6979584 27% 3.27MB/s 0:00:05 + 9469952 37% 2.97MB/s 0:00:05 + 12091392 47% 2.78MB/s 0:00:04 + 13664256 53% 2.19MB/s 0:00:05 + 16023552 62% 2.04MB/s 0:00:04 + 18644992 73% 2.07MB/s 0:00:03 + 21266432 83% 2.10MB/s 0:00:01 + 23625728 92% 2.25MB/s 0:00:00 + 25441460 100% 2.36MB/s 0:00:10 (xfer#1, to-check=0/1) + +sent 25444719 bytes received 42 bytes 2212587.91 bytes/sec +total size is 25441460 speedup is 1.00 +[2014-05-25 21:23:00 CEST] Transferrer: Uploaded 32_cel-an..ation.mp4 + +WORM-s23123916-m1398381154--Learning Corel Painter X3%33_rotoscope-techniques.mp4 + 32768 0% 0.00kB/s 0:00:00 + 2129920 9% 1.98MB/s 0:00:10 + 5275648 22% 2.45MB/s 0:00:07 + 8945664 38% 2.77MB/s 0:00:04 + 12353536 53% 2.89MB/s 0:00:03 + 15269888 66% 3.06MB/s 0:00:02 + 18022400 77% 2.99MB/s 0:00:01 + 20742144 89% 2.78MB/s 0:00:00 + 23123916 100% 2.74MB/s 0:00:08 (xfer#1, to-check=0/1) + +sent 23126898 bytes received 42 bytes 2434414.74 bytes/sec +total size is 23123916 speedup is 1.00 +[2014-05-25 21:23:10 CEST] Transferrer: Uploaded 33_rotosc..iques.mp4 + +WORM-s16168686-m1398381345--Learning Corel Painter X3%34_portrait-of-hines-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4194304 25% 3.85MB/s 0:00:03 + 7340032 45% 3.40MB/s 0:00:02 + 10256384 63% 3.19MB/s 0:00:01 + 13500416 83% 3.16MB/s 0:00:00 + 16168686 100% 3.09MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 16170824 bytes received 42 bytes 2940157.45 bytes/sec +total size is 16168686 speedup is 1.00 +[2014-05-25 21:23:16 CEST] Transferrer: Uploaded 34_portra..art-1.mp4 + +WORM-s16185635-m1398381044--Learning Corel Painter X3%35_portrait-of-hines-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4390912 27% 4.09MB/s 0:00:02 + 7372800 45% 3.37MB/s 0:00:02 + 10518528 64% 3.23MB/s 0:00:01 + 13139968 81% 3.02MB/s 0:00:00 + 16185635 100% 3.13MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 16187773 bytes received 42 bytes 2490433.08 bytes/sec +total size is 16185635 speedup is 1.00 +[2014-05-25 21:23:22 CEST] Transferrer: Uploaded 35_portra..art-2.mp4 + +WORM-s30681625-m1398381209--Learning Corel Painter X3%36_portrait-of-hines-part-3.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4489216 14% 4.25MB/s 0:00:06 + 7798784 25% 3.65MB/s 0:00:06 + 11206656 36% 3.49MB/s 0:00:05 + 14483456 47% 3.40MB/s 0:00:04 + 17858560 58% 3.14MB/s 0:00:03 + 21299200 69% 3.17MB/s 0:00:02 + 24576000 80% 3.12MB/s 0:00:01 + 27951104 91% 3.15MB/s 0:00:00 + 30681625 100% 3.26MB/s 0:00:08 (xfer#1, to-check=0/1) + +sent 30685535 bytes received 42 bytes 3230060.74 bytes/sec +total size is 30681625 speedup is 1.00 +[2014-05-25 21:23:32 CEST] Transferrer: Uploaded 36_portra..art-3.mp4 + +WORM-s22528765-m1398382099--Learning Corel Painter X3%37_digital-watercolor.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4390912 19% 4.08MB/s 0:00:04 + 7536640 33% 3.55MB/s 0:00:04 + 10813440 47% 3.39MB/s 0:00:03 + 14090240 62% 3.30MB/s 0:00:02 + 17334272 76% 3.02MB/s 0:00:01 + 21495808 95% 3.25MB/s 0:00:00 + 22528765 100% 3.39MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 22531673 bytes received 42 bytes 3004228.67 bytes/sec +total size is 22528765 speedup is 1.00 +[2014-05-25 21:23:39 CEST] Transferrer: Uploaded 37_digita..color.mp4 + +WORM-s26374030-m1398381726--Learning Corel Painter X3%38_real-watercolor-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5210112 19% 4.87MB/s 0:00:04 + 8945664 33% 4.18MB/s 0:00:04 + 13074432 49% 4.08MB/s 0:00:03 + 16547840 62% 3.89MB/s 0:00:02 + 20676608 78% 3.65MB/s 0:00:01 + 24412160 92% 3.63MB/s 0:00:00 + 26374030 100% 3.82MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 26377410 bytes received 42 bytes 3103229.65 bytes/sec +total size is 26374030 speedup is 1.00 +[2014-05-25 21:23:47 CEST] Transferrer: Uploaded 38_real-w..art-1.mp4 + +WORM-s19723496-m1398381429--Learning Corel Painter X3%39_real-watercolor-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4751360 24% 4.50MB/s 0:00:03 + 8683520 44% 4.11MB/s 0:00:02 + 12517376 63% 3.96MB/s 0:00:01 + 16384000 83% 3.88MB/s 0:00:00 + 19723496 100% 3.86MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 19726064 bytes received 42 bytes 3586564.73 bytes/sec +total size is 19723496 speedup is 1.00 +[2014-05-25 21:23:53 CEST] Transferrer: Uploaded 39_real-w..art-2.mp4 + +WORM-s19493451-m1398381312--Learning Corel Painter X3%40_caricature-part-1.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4980736 25% 4.62MB/s 0:00:03 + 8683520 44% 4.04MB/s 0:00:02 + 12615680 64% 3.91MB/s 0:00:01 + 16547840 84% 3.84MB/s 0:00:00 + 19493451 100% 3.84MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 19495986 bytes received 42 bytes 2999388.92 bytes/sec +total size is 19493451 speedup is 1.00 +[2014-05-25 21:23:59 CEST] Transferrer: Uploaded 40_carica..art-1.mp4 +rsync: fork: Resource temporarily unavailable (35) +rsync error: error in IPC code (code 14) at /SourceCache/rsync/rsync-42/rsync/pipe.c(65) [sender=2.6.9] +rsync: fork: Resource temporarily unavailable (35) +rsync error: error in IPC code (code 14) at /SourceCache/rsync/rsync-42/rsync/pipe.c(65) [sender=2.6.9] +[2014-05-25 21:36:13 CEST] NetWatcherFallback: Syncing with diskstation +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 0fddca6..08995a9 git-annex -> diskstation/git-annex +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +[2014-05-25 21:36:38 CEST] RemoteControl: Syncing with diskstation + 251064b..9043046 git-annex -> synced/git-annex +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 08995a9..d2359ee git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 90430461e599b7aad5bc8f4891f1e0eac38766b0 but expected 251064bd591813a5e813bd9cefafb8b4e6788f77 + ! 251064b..9043046 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + + + rsync failed -- run git annex again to resume file transfer + + + rsync failed -- run git annex again to resume file transfer + + + rsync failed -- run git annex again to resume file transfer + +WORM-s14012455-m1398381979--Learning Corel Painter X3%41_caricature-part-2.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 30% 3.81MB/s 0:00:02 + 8159232 58% 3.69MB/s 0:00:01 + 9994240 71% 3.04MB/s 0:00:01 + 11829248 84% 2.67MB/s 0:00:00 + 13664256 97% 2.15MB/s 0:00:00 + 14012455 100% 2.50MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 14014322 bytes received 42 bytes 1868581.87 bytes/sec +total size is 14012455 speedup is 1.00 +[2014-05-25 21:37:01 CEST] Transferrer: Uploaded 41_carica..art-2.mp4 + +WORM-s2813795-m1398381163--Learning Corel Painter X3%42_about-the-author.mp4 + 32768 1% 0.00kB/s 0:00:00 + 2813795 100% 6.18MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 2814292 bytes received 42 bytes 1125733.60 bytes/sec +total size is 2813795 speedup is 1.00 +[2014-05-25 21:37:03 CEST] Transferrer: Uploaded 42_about-..uthor.mp4 + +WORM-s15151010-m1398381679--Learning Corel Painter X3%43_painter-resources-and-the-painter-community.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5111808 33% 4.69MB/s 0:00:02 + 9109504 60% 4.20MB/s 0:00:01 + 12779520 84% 3.97MB/s 0:00:00 + 15151010 100% 3.95MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 15153043 bytes received 42 bytes 3367352.22 bytes/sec +total size is 15151010 speedup is 1.00 +[2014-05-25 21:37:07 CEST] Transferrer: Uploaded 43_painte..unity.mp4 +Watcher crashed: ResumeWatcher +[2014-05-25 21:39:08 CEST] Watcher: warning Watcher crashed: ResumeWatcher + + +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(scanning...) [2014-05-25 21:39:16 CEST] Watcher: Performing startup scan +[2014-05-25 21:39:20 CEST] Pusher: Syncing with diskstation +remote: merge git-annex (merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9043046..57f7b8b git-annex -> synced/git-annex +[2014-05-25 21:39:28 CEST] RemoteControl: Syncing with diskstation +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + d2359ee..e459e2f git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 57f7b8bb8d2dd5418eda74deef4a0338b00390d9 but expected 90430461e599b7aad5bc8f4891f1e0eac38766b0 + ! 9043046..57f7b8b synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(started...) [2014-05-25 21:39:46 CEST] Committer: Committing changes to git +[2014-05-25 21:39:46 CEST] Pusher: Syncing with diskstation +Already up-to-date. +remote: merge git-annex ok +remote: merge synced/master Updating 53c007f..6f2044d +remote: Fast-forward +remote: .../01_introduction.mp4 | 1 + +remote: .../02_setting-up.mp4 | 1 + +remote: .../03_selecting-and-creating-elements.mp4 | 1 + +remote: .../04_exercise-1.mp4 | 1 + +remote: An Introduction to d3.js - From Scattered to Scatterplot/05_svg.mp4 | 1 + +remote: .../06_exercise-2.mp4 | 1 + +remote: .../07_binding-data-and-creating-elements-from-data.mp4 | 1 + +remote: .../08_exercise-3.mp4 | 1 + +remote: .../09_transitions.mp4 | 1 + +remote: An Introduction to d3.js - From Scattered to Scatterplot/10_scales-2.mp4 | 1 + +remote: An Introduction to d3.js - From Scattered to Scatterplot/10_scales.mp4 | 1 + +remote: An Introduction to d3.js - From Scattered to Scatterplot/11_axes.mp4 | 1 + +remote: .../12_advanced-techniques.mp4 | 1 + +remote: .../13_conclusion.mp4 | 1 + +remote: C++ Memory Management/01_introduction.mp4 | 1 + +remote: C++ Memory Management/02_leaks-and-overruns.mp4 | 1 + +remote: .../03_stl-vector-methods-range-checking-and-sentinels.mp4 | 1 + +remote: C++ Memory Management/04_memory-leaks-part-1.mp4 | 1 + +remote: C++ Memory Management/05_memory-leaks-part-2.mp4 | 1 + +remote: C++ Memory Management/06_pointers-pitfalls-and-best-practices.mp4 | 1 + +remote: C++ Memory Management/07_initialize-everything-trust-but-verify.mp4 | 1 + +remote: C++ Memory Management/08_reading-and-writing-shared-assets.mp4 | 1 + +remote: C++ Memory Management/09_undefined-behaviour-and-other-bad-practices.mp4 | 1 + +remote: C++ Memory Management/10_the-heap-and-stl-wrappers.mp4 | 1 + +remote: C++ Memory Management/11_about-the-author.mp4 | 1 + +remote: Lean UX Workshop/01_introduction.mp4 | 1 + +remote: Lean UX Workshop/02_nordstrom-case-study.mp4 | 1 + +remote: Lean UX Workshop/03_assumptions-and-hypotheses.mp4 | 1 + +remote: Lean UX Workshop/04_personas.mp4 | 1 + +remote: Lean UX Workshop/05_outcomes-and-features.mp4 | 1 + +remote: Lean UX Workshop/06_writing-hypotheses.mp4 | 1 + +remote: Lean UX Workshop/07_design-studio.mp4 | 1 + +remote: Lean UX Workshop/08_experiments-and-mvp-s.mp4 | 1 + +remote: Lean UX Workshop/09_research.mp4 | 1 + +remote: Lean UX Workshop/10_combining-lean-and-agile.mp4 | 1 + +remote: Lean UX Workshop/11_tools-and-techniques.mp4 | 1 + +remote: Learning Corel Painter X3/01_a-quick-tour-of-painter.mp4 | 1 + +remote: Learning Corel Painter X3/02_brushes-and-custom-palettes.mp4 | 1 + +remote: Learning Corel Painter X3/03_managing-layers.mp4 | 1 + +remote: Learning Corel Painter X3/04_project-red-chairs.mp4 | 1 + +remote: Learning Corel Painter X3/05_the-toolbox-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/06_the-toolbox-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/07_color-panels.mp4 | 1 + +remote: Learning Corel Painter X3/08_paper-and-media-libraries.mp4 | 1 + +remote: Learning Corel Painter X3/09_menu-commands-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/10_menu-commands-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/11_cloner-brushes.mp4 | 1 + +remote: Learning Corel Painter X3/12_project-clone-painting-a-pear.mp4 | 1 + +remote: Learning Corel Painter X3/13_dab-stroke-and-method.mp4 | 1 + +remote: Learning Corel Painter X3/14_advanced-controls.mp4 | 1 + +remote: Learning Corel Painter X3/15_custom-variants.mp4 | 1 + +remote: Learning Corel Painter X3/16_abstract-painting.mp4 | 1 + +remote: Learning Corel Painter X3/17_tonal-controls.mp4 | 1 + +remote: Learning Corel Painter X3/18_surface-controls.mp4 | 1 + +remote: Learning Corel Painter X3/19_esoterica.mp4 | 1 + +remote: Learning Corel Painter X3/20_esoterica-mosaic.mp4 | 1 + +remote: Learning Corel Painter X3/21_selection-tools-and-commands.mp4 | 1 + +remote: Learning Corel Painter X3/22_text-properties.mp4 | 1 + +remote: Learning Corel Painter X3/23_text-effects.mp4 | 1 + +remote: Learning Corel Painter X3/24_postcard-graphic-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/25_postcard-graphic-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/26_dynamic-layers.mp4 | 1 + +remote: Learning Corel Painter X3/27_auto-painting.mp4 | 1 + +remote: Learning Corel Painter X3/28_smart-stroke-cloning.mp4 | 1 + +remote: Learning Corel Painter X3/29_mirror-and-kaleidoscope.mp4 | 1 + +remote: Learning Corel Painter X3/30_introduction-to-mixed-media.mp4 | 1 + +remote: Learning Corel Painter X3/31_portrait-of-stephen.mp4 | 1 + +remote: Learning Corel Painter X3/32_cel-animation.mp4 | 1 + +remote: Learning Corel Painter X3/33_rotoscope-techniques.mp4 | 1 + +remote: Learning Corel Painter X3/34_portrait-of-hines-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/35_portrait-of-hines-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/36_portrait-of-hines-part-3.mp4 | 1 + +remote: Learning Corel Painter X3/37_digital-watercolor.mp4 | 1 + +remote: Learning Corel Painter X3/38_real-watercolor-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/39_real-watercolor-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/40_caricature-part-1.mp4 | 1 + +remote: Learning Corel Painter X3/41_caricature-part-2.mp4 | 1 + +remote: Learning Corel Painter X3/42_about-the-author.mp4 | 1 + +remote: .../43_painter-resources-and-the-painter-community.mp4 | 1 + +remote: 79 files changed, 79 insertions(+) +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/01_introduction.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/02_setting-up.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/03_selecting-and-creating-elements.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/04_exercise-1.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/05_svg.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/06_exercise-2.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/07_binding-data-and-creating-elements-from-data.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/08_exercise-3.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/09_transitions.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/10_scales-2.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/10_scales.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/11_axes.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/12_advanced-techniques.mp4 +remote: create mode 120000 An Introduction to d3.js - From Scattered to Scatterplot/13_conclusion.mp4 +remote: create mode 120000 C++ Memory Management/01_introduction.mp4 +remote: create mode 120000 C++ Memory Management/02_leaks-and-overruns.mp4 +remote: create mode 120000 C++ Memory Management/03_stl-vector-methods-range-checking-and-sentinels.mp4 +remote: create mode 120000 C++ Memory Management/04_memory-leaks-part-1.mp4 +remote: create mode 120000 C++ Memory Management/05_memory-leaks-part-2.mp4 +remote: create mode 120000 C++ Memory Management/06_pointers-pitfalls-and-best-practices.mp4 +remote: create mode 120000 C++ Memory Management/07_initialize-everything-trust-but-verify.mp4 +remote: create mode 120000 C++ Memory Management/08_reading-and-writing-shared-assets.mp4 +remote: create mode 120000 C++ Memory Management/09_undefined-behaviour-and-other-bad-practices.mp4 +remote: create mode 120000 C++ Memory Management/10_the-heap-and-stl-wrappers.mp4 +remote: create mode 120000 C++ Memory Management/11_about-the-author.mp4 +remote: create mode 120000 Lean UX Workshop/01_introduction.mp4 +remote: create mode 120000 Lean UX Workshop/02_nordstrom-case-study.mp4 +remote: create mode 120000 Lean UX Workshop/03_assumptions-and-hypotheses.mp4 +remote: create mode 120000 Lean UX Workshop/04_personas.mp4 +remote: create mode 120000 Lean UX Workshop/05_outcomes-and-features.mp4 +remote: create mode 120000 Lean UX Workshop/06_writing-hypotheses.mp4 +remote: create mode 120000 Lean UX Workshop/07_design-studio.mp4 +remote: create mode 120000 Lean UX Workshop/08_experiments-and-mvp-s.mp4 +remote: create mode 120000 Lean UX Workshop/09_research.mp4 +remote: create mode 120000 Lean UX Workshop/10_combining-lean-and-agile.mp4 +remote: create mode 120000 Lean UX Workshop/11_tools-and-techniques.mp4 +remote: create mode 120000 Learning Corel Painter X3/01_a-quick-tour-of-painter.mp4 +remote: create mode 120000 Learning Corel Painter X3/02_brushes-and-custom-palettes.mp4 +remote: create mode 120000 Learning Corel Painter X3/03_managing-layers.mp4 +remote: create mode 120000 Learning Corel Painter X3/04_project-red-chairs.mp4 +remote: create mode 120000 Learning Corel Painter X3/05_the-toolbox-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/06_the-toolbox-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/07_color-panels.mp4 +remote: create mode 120000 Learning Corel Painter X3/08_paper-and-media-libraries.mp4 +remote: create mode 120000 Learning Corel Painter X3/09_menu-commands-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/10_menu-commands-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/11_cloner-brushes.mp4 +remote: create mode 120000 Learning Corel Painter X3/12_project-clone-painting-a-pear.mp4 +remote: create mode 120000 Learning Corel Painter X3/13_dab-stroke-and-method.mp4 +remote: create mode 120000 Learning Corel Painter X3/14_advanced-controls.mp4 +remote: create mode 120000 Learning Corel Painter X3/15_custom-variants.mp4 +remote: create mode 120000 Learning Corel Painter X3/16_abstract-painting.mp4 +remote: create mode 120000 Learning Corel Painter X3/17_tonal-controls.mp4 +remote: create mode 120000 Learning Corel Painter X3/18_surface-controls.mp4 +remote: create mode 120000 Learning Corel Painter X3/19_esoterica.mp4 +remote: create mode 120000 Learning Corel Painter X3/20_esoterica-mosaic.mp4 +remote: create mode 120000 Learning Corel Painter X3/21_selection-tools-and-commands.mp4 +remote: create mode 120000 Learning Corel Painter X3/22_text-properties.mp4 +remote: create mode 120000 Learning Corel Painter X3/23_text-effects.mp4 +remote: create mode 120000 Learning Corel Painter X3/24_postcard-graphic-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/25_postcard-graphic-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/26_dynamic-layers.mp4 +remote: create mode 120000 Learning Corel Painter X3/27_auto-painting.mp4 +remote: create mode 120000 Learning Corel Painter X3/28_smart-stroke-cloning.mp4 +remote: create mode 120000 Learning Corel Painter X3/29_mirror-and-kaleidoscope.mp4 +remote: create mode 120000 Learning Corel Painter X3/30_introduction-to-mixed-media.mp4 +remote: create mode 120000 Learning Corel Painter X3/31_portrait-of-stephen.mp4 +remote: create mode 120000 Learning Corel Painter X3/32_cel-animation.mp4 +remote: create mode 120000 Learning Corel Painter X3/33_rotoscope-techniques.mp4 +remote: create mode 120000 Learning Corel Painter X3/34_portrait-of-hines-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/35_portrait-of-hines-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/36_portrait-of-hines-part-3.mp4 +remote: create mode 120000 Learning Corel Painter X3/37_digital-watercolor.mp4 +remote: create mode 120000 Learning Corel Painter X3/38_real-watercolor-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/39_real-watercolor-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/40_caricature-part-1.mp4 +remote: create mode 120000 Learning Corel Painter X3/41_caricature-part-2.mp4 +remote: create mode 120000 Learning Corel Painter X3/42_about-the-author.mp4 +remote: create mode 120000 Learning Corel Painter X3/43_painter-resources-and-the-painter-community.mp4 +remote: +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 57f7b8b..e459e2f git-annex -> synced/git-annex + 53c007f..6f2044d master -> synced/master +Already up-to-date. +[2014-05-25 21:41:22 CEST] Committer: Adding 01_introduction.mp4 02_settin..plate.mp4 03_settin..lbars.mp4 04_how-to..files.mp4 05_line-tool.mp4 06_rectan..-tool.mp4 07_circle-tool.mp4 08_polygon-tool.mp4 09_arc-tool.mp4 and 34 other files + +(Recording state in git...) + + +add Learning SketchUp 2013/01_introduction.mp4 ok +add Learning SketchUp 2013/02_setting-up-the-template.mp4 ok +add Learning SketchUp 2013/03_setting-up-the-toolbars.mp4 ok +add Learning SketchUp 2013/04_how-to-access-your-working-files.mp4 ok +add Learning SketchUp 2013/05_line-tool.mp4 ok +add Learning SketchUp 2013/06_rectangle-tool.mp4 ok +add Learning SketchUp 2013/07_circle-tool.mp4 ok +add Learning SketchUp 2013/08_polygon-tool.mp4 ok +add Learning SketchUp 2013/09_arc-tool.mp4 ok +add Learning SketchUp 2013/100_adding-lighting.mp4 ok +add Learning SketchUp 2013/101_add-reflections-to-existing-textures.mp4 ok +add Learning SketchUp 2013/102_model-presets-create-a-preview-rendering.mp4 ok +add Learning SketchUp 2013/103_rendering-a-high-quality-image.mp4 ok +add Learning SketchUp 2013/104_post-processing-in-photoshop.mp4 ok +add Learning SketchUp 2013/105_what-is-layout.mp4 ok +add Learning SketchUp 2013/106_adjusting-the-model-settings.mp4 ok +add Learning SketchUp 2013/108_adding-additional-pages-and-content.mp4 ok +add Learning SketchUp 2013/109_updating-the-model-references.mp4 ok +add Learning SketchUp 2013/10_freehand-tool.mp4 ok +add Learning SketchUp 2013/111_about-dan-brown.mp4 ok +add Learning SketchUp 2013/11_navigating-in-3d.mp4 ok +add Learning SketchUp 2013/12_push-pull-and-move-tool.mp4 ok +add Learning SketchUp 2013/13_using-follow-me-complex-roof-pitches.mp4 ok +add Learning SketchUp 2013/14_creating-a-mansard-roof.mp4 ok +add Learning SketchUp 2013/15_creating-a-gambrel-roof.mp4 ok +add Learning SketchUp 2013/16_measurements.mp4 ok +add Learning SketchUp 2013/18_extruding-your-walls-push-pull-and-offset.mp4 ok +add Learning SketchUp 2013/19_creating-doors-and-openings.mp4 ok +add Learning SketchUp 2013/20_clean-up-using-the-eraser-to-remove-unwanted-edges.mp4 ok +add Learning SketchUp 2013/21_why-groups.mp4 ok +add Learning SketchUp 2013/22_creating-the-second-floor.mp4 ok +add Learning SketchUp 2013/23_creating-additional-openings.mp4 ok +add Learning SketchUp 2013/24_hide-model-and-other-useful-shortcuts.mp4 ok +add Learning SketchUp 2013/25_using-the-outliner.mp4 ok +add Learning SketchUp 2013/26_using-layers-to-control-visibility.mp4 ok +add Learning SketchUp 2013/27_viewing-layer-states-of-the-model.mp4 ok +add Learning SketchUp 2013/28_field-of-view.mp4 ok +add Learning SketchUp 2013/29_dividing-faces-to-create-your-rooms.mp4 ok +add Learning SketchUp 2013/30_area-tool-for-calculations.mp4 ok +add Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture-2.mp4 ok +add Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture.mp4 ok +add Learning SketchUp 2013/32_importing-and-applying-a-texture.mp4 ok +add Learning SketchUp 2013/33_positioning-an-imported-texture.mp4 [2014-05-25 21:41:29 CEST] Committer: Adding 34_editin..tchup.mp4 35_editin..oshop.mp4 36_hide-e..-tool.mp4 37_creati..iling.mp4 38_assign..roups.mp4 39_adding..ter-7.mp4 40_creati..lding.mp4 41_copy-a..place.mp4 42_why-we..nents.mp4 and 57 other files +ok +add Learning SketchUp 2013/34_editing-texture-colour-in-sketchup.mp4 ok +add Learning SketchUp 2013/35_editing-a-texture-in-photoshop.mp4 ok +add Learning SketchUp 2013/36_hide-edges-and-lines-with-the-eraser-tool.mp4 ok +add Learning SketchUp 2013/37_creating-the-ceiling.mp4 ok +add Learning SketchUp 2013/38_assigning-layers-within-groups.mp4 ok +add Learning SketchUp 2013/39_adding-detail-chapter-7.mp4 ok +add Learning SketchUp 2013/40_creating-crown-moulding.mp4 ok +add Learning SketchUp 2013/41_copy-and-paste-in-place.mp4 ok +add Learning SketchUp 2013/42_why-we-use-groups-and-components.mp4 ok +add Learning SketchUp 2013/43_creating-the-staircase.mp4 ok +add Learning SketchUp 2013/44_adding-riser-detail.mp4 ok +add Learning SketchUp 2013/45_making-a-unique-bottom-step.mp4 ok +add Learning SketchUp 2013/46_adding-spindles-with-move-and-copy.mp4 ok +add Learning SketchUp 2013/47_adding-railing.mp4 ok +add Learning SketchUp 2013/48_review-of-components-and-nested-groups.mp4 ok +add Learning SketchUp 2013/49_creating-doors.mp4 ok +add Learning SketchUp 2013/50_creating-the-front-window-frame.mp4 ok +add Learning SketchUp 2013/51_double-hung-windows.mp4 ok +add Learning SketchUp 2013/52_installing-bit-tools-plugins.mp4 ok +add Learning SketchUp 2013/53_creating-walls-and-door-openings.mp4 ok +add Learning SketchUp 2013/54_using-the-window-feature.mp4 ok +add Learning SketchUp 2013/55_starting-at-the-base.mp4 ok +add Learning SketchUp 2013/56_building-the-mantle.mp4 ok +add Learning SketchUp 2013/57_mantle-columns.mp4 ok +add Learning SketchUp 2013/58_mantle-support.mp4 ok +add Learning SketchUp 2013/59_adding-textures.mp4 ok +add Learning SketchUp 2013/60_base-cabinets.mp4 ok +add Learning SketchUp 2013/61_wall-cabinets.mp4 ok +add Learning SketchUp 2013/62_cabinet-doors.mp4 ok +add Learning SketchUp 2013/63_creating-the-countertop.mp4 ok +add Learning SketchUp 2013/64_adding-materials.mp4 ok +add Learning SketchUp 2013/65_adding-appliances.mp4 ok +add Learning SketchUp 2013/66_adding-the-fridge-and-sink.mp4 ok +add Learning SketchUp 2013/67_using-the-3d-warehouse.mp4 ok +add Learning SketchUp 2013/68_using-form-fonts.mp4 ok +add Learning SketchUp 2013/69_using-the-podium-browser.mp4 ok +add Learning SketchUp 2013/70_creating-a-library.mp4 ok +add Learning SketchUp 2013/71_setting-up-to-match-a-new-photo.mp4 ok +add Learning SketchUp 2013/72_creating-the-massing-model.mp4 ok +add Learning SketchUp 2013/73_applying-textures.mp4 ok +add Learning SketchUp 2013/74_adding-detail-chapter-13.mp4 ok +add Learning SketchUp 2013/75_saving-and-placing-into-the-model.mp4 ok +add Learning SketchUp 2013/76_creating-the-exterior.mp4 ok +add Learning SketchUp 2013/77_setting-the-building-in-place-geolocation.mp4 ok +add Learning SketchUp 2013/78_reset-axis-to-align-building.mp4 ok +add Learning SketchUp 2013/79_creating-the-front-facade.mp4 ok +add Learning SketchUp 2013/80_adding-context.mp4 ok +add Learning SketchUp 2013/81_get-photo-google-street-view.mp4 ok +add Learning SketchUp 2013/82_using-3d-text.mp4 ok +add Learning SketchUp 2013/83_add-solar-panels-with-skelion-plugin.mp4 ok +add Learning SketchUp 2013/84_creating-scenes-and-updating.mp4 ok +add Learning SketchUp 2013/85_styles.mp4 ok +add Learning SketchUp 2013/86_scenes-for-animation.mp4 ok +add Learning SketchUp 2013/87_section-cut-for-interior-elevations.mp4 ok +add Learning SketchUp 2013/88_creating-a-group.mp4 ok +add Learning SketchUp 2013/89_creating-the-animation.mp4 ok +add Learning SketchUp 2013/90_jpeg-and-png-files.mp4 ok +add Learning SketchUp 2013/91_dwg-elevation-and-plan-pro-feature.mp4 ok +add Learning SketchUp 2013/92_kmz-for-google-earth.mp4 ok +add Learning SketchUp 2013/93_collada-files.mp4 ok +add Learning SketchUp 2013/94_animation-options.mp4 ok +add Learning SketchUp 2013/95_add-final-touches.mp4 ok +add Learning SketchUp 2013/96_export-display-options.mp4 ok +add Learning SketchUp 2013/97_stacking-images-in-photoshop.mp4 ok +add Learning SketchUp 2013/98_multiply-and-opacity.mp4 ok +add Learning SketchUp 2013/99_saving-the-image.mp4 [2014-05-25 21:41:31 CEST] Committer: Committing changes to git +[2014-05-25 21:41:32 CEST] Pusher: Syncing with diskstation + +WORM-s8756441-m1398385688--Learning SketchUp 2013%34_editing-texture-colour-in-sketchup.mp4 + 32768 0% 0.00kB/s 0:00:00 + 2654208 30% 1.97MB/s 0:00:03 + 5734400 65% 2.32MB/s 0:00:01 +Already up-to-date. + 8756441 100% 2.66MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 8757681 bytes received 42 bytes 1592313.27 bytes/sec +total size is 8756441 speedup is 1.00 +[2014-05-25 21:41:37 CEST] Transferrer: Uploaded 34_editin..tchup.mp4 + +WORM-s16632826-m1398386674--Learning SketchUp 2013%33_positioning-an-imported-texture.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4423680 26% 4.12MB/s 0:00:02 + 8486912 51% 3.96MB/s 0:00:02 + 12517376 75% 3.90MB/s 0:00:01 +remote: merge git-annex 16580608 99% 3.87MB/s 0:00:00 + 16632826 100% 3.89MB/s 0:00:04 (xfer#1, to-check=0/1) +[2014-05-25 21:41:42 CEST] RemoteControl: Syncing with diskstation + +sent 16635024 bytes received 42 bytes 3024557.45 bytes/sec +total size is 16632826 speedup is 1.00 +[2014-05-25 21:41:43 CEST] Transferrer: Uploaded 33_positi..xture.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: merge synced/master +WORM-s13603741-m1398386183--Learning SketchUp 2013%32_importing-and-applying-a-texture.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3244032 23% 3.06MB/s 0:00:03 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e459e2f..297826c git-annex -> diskstation/git-annex + e459e2f..26c6449 synced/git-annex -> diskstation/synced/git-annex + 6f2044d..7500a88 synced/master -> diskstation/synced/master +Already up-to-date. +Updating 6f2044d..7500a88 +remote: Fast-forward + 6520832 47% 3.08MB/s 0:00:02 +remote: Learning SketchUp 2013/01_introduction.mp4 | 1 + +remote: Learning SketchUp 2013/02_setting-up-the-template.mp4 | 1 + +remote: Learning SketchUp 2013/03_setting-up-the-toolbars.mp4 | 1 + +remote: Learning SketchUp 2013/04_how-to-access-your-working-files.mp4 | 1 + +remote: Learning SketchUp 2013/05_line-tool.mp4 | 1 + +remote: Learning SketchUp 2013/06_rectangle-tool.mp4 | 1 + +remote: Learning SketchUp 2013/07_circle-tool.mp4 | 1 + +remote: Learning SketchUp 2013/08_polygon-tool.mp4 | 1 + +remote: Learning SketchUp 2013/09_arc-tool.mp4 | 1 + +remote: Learning SketchUp 2013/100_adding-lighting.mp4 | 1 + +remote: Learning SketchUp 2013/101_add-reflections-to-existing-textures.mp4 | 1 + +remote: Learning SketchUp 2013/102_model-presets-create-a-preview-rendering.mp4 | 1 + +remote: Learning SketchUp 2013/103_rendering-a-high-quality-image.mp4 | 1 + +remote: Learning SketchUp 2013/104_post-processing-in-photoshop.mp4 | 1 + +remote: Learning SketchUp 2013/105_what-is-layout.mp4 | 1 + +remote: Learning SketchUp 2013/106_adjusting-the-model-settings.mp4 | 1 + +remote: Learning SketchUp 2013/108_adding-additional-pages-and-content.mp4 | 1 + +remote: Learning SketchUp 2013/109_updating-the-model-references.mp4 | 1 + +remote: Learning SketchUp 2013/10_freehand-tool.mp4 | 1 + +remote: Learning SketchUp 2013/111_about-dan-brown.mp4 | 1 + +remote: Learning SketchUp 2013/11_navigating-in-3d.mp4 | 1 + +remote: Learning SketchUp 2013/12_push-pull-and-move-tool.mp4 | 1 + +remote: Learning SketchUp 2013/13_using-follow-me-complex-roof-pitches.mp4 | 1 + +remote: Learning SketchUp 2013/14_creating-a-mansard-roof.mp4 | 1 + +remote: Learning SketchUp 2013/15_creating-a-gambrel-roof.mp4 | 1 + +remote: Learning SketchUp 2013/16_measurements.mp4 | 1 + +remote: Learning SketchUp 2013/18_extruding-your-walls-push-pull-and-offset.mp4 | 1 + +remote: Learning SketchUp 2013/19_creating-doors-and-openings.mp4 | 1 + +remote: .../20_clean-up-using-the-eraser-to-remove-unwanted-edges.mp4 | 1 + +remote: Learning SketchUp 2013/21_why-groups.mp4 | 1 + +remote: Learning SketchUp 2013/22_creating-the-second-floor.mp4 | 1 + +remote: Learning SketchUp 2013/23_creating-additional-openings.mp4 | 1 + +remote: Learning SketchUp 2013/24_hide-model-and-other-useful-shortcuts.mp4 | 1 + +remote: Learning SketchUp 2013/25_using-the-outliner.mp4 | 1 + +remote: Learning SketchUp 2013/26_using-layers-to-control-visibility.mp4 | 1 + +remote: Learning SketchUp 2013/27_viewing-layer-states-of-the-model.mp4 | 1 + +remote: Learning SketchUp 2013/28_field-of-view.mp4 | 1 + +remote: Learning SketchUp 2013/29_dividing-faces-to-create-your-rooms.mp4 | 1 + +remote: Learning SketchUp 2013/30_area-tool-for-calculations.mp4 | 1 + +remote: Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture-2.mp4 | 1 + +remote: Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture.mp4 | 1 + +remote: Learning SketchUp 2013/32_importing-and-applying-a-texture.mp4 | 1 + +remote: Learning SketchUp 2013/33_positioning-an-imported-texture.mp4 | 1 + +remote: Learning SketchUp 2013/34_editing-texture-colour-in-sketchup.mp4 | 1 + +remote: Learning SketchUp 2013/35_editing-a-texture-in-photoshop.mp4 | 1 + +remote: Learning SketchUp 2013/36_hide-edges-and-lines-with-the-eraser-tool.mp4 | 1 + +remote: Learning SketchUp 2013/37_creating-the-ceiling.mp4 | 1 + +remote: Learning SketchUp 2013/38_assigning-layers-within-groups.mp4 | 1 + +remote: Learning SketchUp 2013/39_adding-detail-chapter-7.mp4 | 1 + +remote: Learning SketchUp 2013/40_creating-crown-moulding.mp4 | 1 + +remote: Learning SketchUp 2013/41_copy-and-paste-in-place.mp4 | 1 + +remote: Learning SketchUp 2013/42_why-we-use-groups-and-components.mp4 | 1 + +remote: Learning SketchUp 2013/43_creating-the-staircase.mp4 | 1 + +remote: Learning SketchUp 2013/44_adding-riser-detail.mp4 | 1 + +remote: Learning SketchUp 2013/45_making-a-unique-bottom-step.mp4 | 1 + +remote: Learning SketchUp 2013/46_adding-spindles-with-move-and-copy.mp4 | 1 + +remote: Learning SketchUp 2013/47_adding-railing.mp4 | 1 + +remote: Learning SketchUp 2013/48_review-of-components-and-nested-groups.mp4 | 1 + +remote: Learning SketchUp 2013/49_creating-doors.mp4 | 1 + +remote: Learning SketchUp 2013/50_creating-the-front-window-frame.mp4 | 1 + +remote: Learning SketchUp 2013/51_double-hung-windows.mp4 | 1 + +remote: Learning SketchUp 2013/52_installing-bit-tools-plugins.mp4 | 1 + +remote: Learning SketchUp 2013/53_creating-walls-and-door-openings.mp4 | 1 + +remote: Learning SketchUp 2013/54_using-the-window-feature.mp4 | 1 + +remote: Learning SketchUp 2013/55_starting-at-the-base.mp4 | 1 + +remote: Learning SketchUp 2013/56_building-the-mantle.mp4 | 1 + +remote: Learning SketchUp 2013/57_mantle-columns.mp4 | 1 + +remote: Learning SketchUp 2013/58_mantle-support.mp4 | 1 + +remote: Learning SketchUp 2013/59_adding-textures.mp4 | 1 + +remote: Learning SketchUp 2013/60_base-cabinets.mp4 | 1 + +remote: Learning SketchUp 2013/61_wall-cabinets.mp4 | 1 + +remote: Learning SketchUp 2013/62_cabinet-doors.mp4 | 1 + +remote: Learning SketchUp 2013/63_creating-the-countertop.mp4 | 1 + +remote: Learning SketchUp 2013/64_adding-materials.mp4 | 1 + +remote: Learning SketchUp 2013/65_adding-appliances.mp4 | 1 + +remote: Learning SketchUp 2013/66_adding-the-fridge-and-sink.mp4 | 1 + +remote: Learning SketchUp 2013/67_using-the-3d-warehouse.mp4 | 1 + +remote: Learning SketchUp 2013/68_using-form-fonts.mp4 | 1 + +remote: Learning SketchUp 2013/69_using-the-podium-browser.mp4 | 1 + +remote: Learning SketchUp 2013/70_creating-a-library.mp4 | 1 + +remote: Learning SketchUp 2013/71_setting-up-to-match-a-new-photo.mp4 | 1 + +remote: Learning SketchUp 2013/72_creating-the-massing-model.mp4 | 1 + +remote: Learning SketchUp 2013/73_applying-textures.mp4 | 1 + +remote: Learning SketchUp 2013/74_adding-detail-chapter-13.mp4 | 1 + +remote: Learning SketchUp 2013/75_saving-and-placing-into-the-model.mp4 | 1 + +remote: Learning SketchUp 2013/76_creating-the-exterior.mp4 | 1 + +remote: Learning SketchUp 2013/77_setting-the-building-in-place-geolocation.mp4 | 1 + +remote: Learning SketchUp 2013/78_reset-axis-to-align-building.mp4 | 1 + +remote: Learning SketchUp 2013/79_creating-the-front-facade.mp4 | 1 + +remote: Learning SketchUp 2013/80_adding-context.mp4 | 1 + +remote: Learning SketchUp 2013/81_get-photo-google-street-view.mp4 | 1 + +remote: Learning SketchUp 2013/82_using-3d-text.mp4 | 1 + +remote: Learning SketchUp 2013/83_add-solar-panels-with-skelion-plugin.mp4 | 1 + +remote: Learning SketchUp 2013/84_creating-scenes-and-updating.mp4 | 1 + +remote: Learning SketchUp 2013/85_styles.mp4 | 1 + +remote: Learning SketchUp 2013/86_scenes-for-animation.mp4 | 1 + +remote: Learning SketchUp 2013/87_section-cut-for-interior-elevations.mp4 | 1 + +remote: Learning SketchUp 2013/88_creating-a-group.mp4 | 1 + +remote: Learning SketchUp 2013/89_creating-the-animation.mp4 | 1 + +remote: Learning SketchUp 2013/90_jpeg-and-png-files.mp4 | 1 + +remote: Learning SketchUp 2013/91_dwg-elevation-and-plan-pro-feature.mp4 | 1 + +remote: Learning SketchUp 2013/92_kmz-for-google-earth.mp4 | 1 + +remote: Learning SketchUp 2013/93_collada-files.mp4 | 1 + +remote: Learning SketchUp 2013/94_animation-options.mp4 | 1 + +remote: Learning SketchUp 2013/95_add-final-touches.mp4 | 1 + +remote: Learning SketchUp 2013/96_export-display-options.mp4 | 1 + +remote: Learning SketchUp 2013/97_stacking-images-in-photoshop.mp4 | 1 + +remote: Learning SketchUp 2013/98_multiply-and-opacity.mp4 | 1 + +remote: Learning SketchUp 2013/99_saving-the-image.mp4 | 1 + +remote: 109 files changed, 109 insertions(+) +remote: create mode 120000 Learning SketchUp 2013/01_introduction.mp4 +remote: create mode 120000 Learning SketchUp 2013/02_setting-up-the-template.mp4 +remote: create mode 120000 Learning SketchUp 2013/03_setting-up-the-toolbars.mp4 +remote: create mode 120000 Learning SketchUp 2013/04_how-to-access-your-working-files.mp4 +remote: create mode 120000 Learning SketchUp 2013/05_line-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/06_rectangle-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/07_circle-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/08_polygon-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/09_arc-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/100_adding-lighting.mp4 +remote: create mode 120000 Learning SketchUp 2013/101_add-reflections-to-existing-textures.mp4 +remote: create mode 120000 Learning SketchUp 2013/102_model-presets-create-a-preview-rendering.mp4 +remote: create mode 120000 Learning SketchUp 2013/103_rendering-a-high-quality-image.mp4 +remote: create mode 120000 Learning SketchUp 2013/104_post-processing-in-photoshop.mp4 +remote: create mode 120000 Learning SketchUp 2013/105_what-is-layout.mp4 +remote: create mode 120000 Learning SketchUp 2013/106_adjusting-the-model-settings.mp4 +remote: create mode 120000 Learning SketchUp 2013/108_adding-additional-pages-and-content.mp4 +remote: create mode 120000 Learning SketchUp 2013/109_updating-the-model-references.mp4 +remote: create mode 120000 Learning SketchUp 2013/10_freehand-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/111_about-dan-brown.mp4 +remote: create mode 120000 Learning SketchUp 2013/11_navigating-in-3d.mp4 +remote: create mode 120000 Learning SketchUp 2013/12_push-pull-and-move-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/13_using-follow-me-complex-roof-pitches.mp4 +remote: create mode 120000 Learning SketchUp 2013/14_creating-a-mansard-roof.mp4 +remote: create mode 120000 Learning SketchUp 2013/15_creating-a-gambrel-roof.mp4 +remote: create mode 120000 Learning SketchUp 2013/16_measurements.mp4 +remote: create mode 120000 Learning SketchUp 2013/18_extruding-your-walls-push-pull-and-offset.mp4 +remote: create mode 120000 Learning SketchUp 2013/19_creating-doors-and-openings.mp4 +remote: create mode 120000 Learning SketchUp 2013/20_clean-up-using-the-eraser-to-remove-unwanted-edges.mp4 +remote: create mode 120000 Learning SketchUp 2013/21_why-groups.mp4 +remote: create mode 120000 Learning SketchUp 2013/22_creating-the-second-floor.mp4 +remote: create mode 120000 Learning SketchUp 2013/23_creating-additional-openings.mp4 +remote: create mode 120000 Learning SketchUp 2013/24_hide-model-and-other-useful-shortcuts.mp4 +remote: create mode 120000 Learning SketchUp 2013/25_using-the-outliner.mp4 +remote: create mode 120000 Learning SketchUp 2013/26_using-layers-to-control-visibility.mp4 +remote: create mode 120000 Learning SketchUp 2013/27_viewing-layer-states-of-the-model.mp4 +remote: create mode 120000 Learning SketchUp 2013/28_field-of-view.mp4 +remote: create mode 120000 Learning SketchUp 2013/29_dividing-faces-to-create-your-rooms.mp4 +remote: create mode 120000 Learning SketchUp 2013/30_area-tool-for-calculations.mp4 +remote: create mode 120000 Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture-2.mp4 +remote: create mode 120000 Learning SketchUp 2013/31_using-paint-bucket-for-floor-texture.mp4 +remote: create mode 120000 Learning SketchUp 2013/32_importing-and-applying-a-texture.mp4 +remote: create mode 120000 Learning SketchUp 2013/33_positioning-an-imported-texture.mp4 +remote: create mode 120000 Learning SketchUp 2013/34_editing-texture-colour-in-sketchup.mp4 +remote: create mode 120000 Learning SketchUp 2013/35_editing-a-texture-in-photoshop.mp4 +remote: create mode 120000 Learning SketchUp 2013/36_hide-edges-and-lines-with-the-eraser-tool.mp4 +remote: create mode 120000 Learning SketchUp 2013/37_creating-the-ceiling.mp4 +remote: create mode 120000 Learning SketchUp 2013/38_assigning-layers-within-groups.mp4 +remote: create mode 120000 Learning SketchUp 2013/39_adding-detail-chapter-7.mp4 +remote: create mode 120000 Learning SketchUp 2013/40_creating-crown-moulding.mp4 +remote: create mode 120000 Learning SketchUp 2013/41_copy-and-paste-in-place.mp4 +remote: create mode 120000 Learning SketchUp 2013/42_why-we-use-groups-and-components.mp4 +remote: create mode 120000 Learning SketchUp 2013/43_creating-the-staircase.mp4 +remote: create mode 120000 Learning SketchUp 2013/44_adding-riser-detail.mp4 +remote: create mode 120000 Learning SketchUp 2013/45_making-a-unique-bottom-step.mp4 +remote: create mode 120000 Learning SketchUp 2013/46_adding-spindles-with-move-and-copy.mp4 +remote: create mode 120000 Learning SketchUp 2013/47_adding-railing.mp4 +remote: create mode 120000 Learning SketchUp 2013/48_review-of-components-and-nested-groups.mp4 +remote: create mode 120000 Learning SketchUp 2013/49_creating-doors.mp4 +remote: create mode 120000 Learning SketchUp 2013/50_creating-the-front-window-frame.mp4 +remote: create mode 120000 Learning SketchUp 2013/51_double-hung-windows.mp4 +remote: create mode 120000 Learning SketchUp 2013/52_installing-bit-tools-plugins.mp4 +remote: create mode 120000 Learning SketchUp 2013/53_creating-walls-and-door-openings.mp4 +remote: create mode 120000 Learning SketchUp 2013/54_using-the-window-feature.mp4 +remote: create mode 120000 Learning SketchUp 2013/55_starting-at-the-base.mp4 +remote: create mode 120000 Learning SketchUp 2013/56_building-the-mantle.mp4 +remote: create mode 120000 Learning SketchUp 2013/57_mantle-columns.mp4 +remote: create mode 120000 Learning SketchUp 2013/58_mantle-support.mp4 +remote: create mode 120000 Learning SketchUp 2013/59_adding-textures.mp4 +remote: create mode 120000 Learning SketchUp 2013/60_base-cabinets.mp4 +remote: create mode 120000 Learning SketchUp 2013/61_wall-cabinets.mp4 +remote: create mode 120000 Learning SketchUp 2013/62_cabinet-doors.mp4 +remote: create mode 120000 Learning SketchUp 2013/63_creating-the-countertop.mp4 +remote: create mode 120000 Learning SketchUp 2013/64_adding-materials.mp4 +remote: create mode 120000 Learning SketchUp 2013/65_adding-appliances.mp4 +remote: create mode 120000 Learning SketchUp 2013/66_adding-the-fridge-and-sink.mp4 +remote: create mode 120000 Learning SketchUp 2013/67_using-the-3d-warehouse.mp4 +remote: create mode 120000 Learning SketchUp 2013/68_using-form-fonts.mp4 +remote: create mode 120000 Learning SketchUp 2013/69_using-the-podium-browser.mp4 +remote: create mode 120000 Learning SketchUp 2013/70_creating-a-library.mp4 +remote: create mode 120000 Learning SketchUp 2013/71_setting-up-to-match-a-new-photo.mp4 +remote: create mode 120000 Learning SketchUp 2013/72_creating-the-massing-model.mp4 +remote: create mode 120000 Learning SketchUp 2013/73_applying-textures.mp4 +remote: create mode 120000 Learning SketchUp 2013/74_adding-detail-chapter-13.mp4 +remote: create mode 120000 Learning SketchUp 2013/75_saving-and-placing-into-the-model.mp4 +remote: create mode 120000 Learning SketchUp 2013/76_creating-the-exterior.mp4 +remote: create mode 120000 Learning SketchUp 2013/77_setting-the-building-in-place-geolocation.mp4 +remote: create mode 120000 Learning SketchUp 2013/78_reset-axis-to-align-building.mp4 +remote: create mode 120000 Learning SketchUp 2013/79_creating-the-front-facade.mp4 +remote: create mode 120000 Learning SketchUp 2013/80_adding-context.mp4 +remote: create mode 120000 Learning SketchUp 2013/81_get-photo-google-street-view.mp4 +remote: create mode 120000 Learning SketchUp 2013/82_using-3d-text.mp4 +remote: create mode 120000 Learning SketchUp 2013/83_add-solar-panels-with-skelion-plugin.mp4 +remote: create mode 120000 Learning SketchUp 2013/84_creating-scenes-and-updating.mp4 +remote: create mode 120000 Learning SketchUp 2013/85_styles.mp4 +remote: create mode 120000 Learning SketchUp 2013/86_scenes-for-animation.mp4 +remote: create mode 120000 Learning SketchUp 2013/87_section-cut-for-interior-elevations.mp4 +remote: create mode 120000 Learning SketchUp 2013/88_creating-a-group.mp4 +remote: create mode 120000 Learning SketchUp 2013/89_creating-the-animation.mp4 +remote: create mode 120000 Learning SketchUp 2013/90_jpeg-and-png-files.mp4 +remote: create mode 120000 Learning SketchUp 2013/91_dwg-elevation-and-plan-pro-feature.mp4 +remote: create mode 120000 Learning SketchUp 2013/92_kmz-for-google-earth.mp4 +remote: create mode 120000 Learning SketchUp 2013/93_collada-files.mp4 +remote: create mode 120000 Learning SketchUp 2013/94_animation-options.mp4 +remote: create mode 120000 Learning SketchUp 2013/95_add-final-touches.mp4 +remote: create mode 120000 Learning SketchUp 2013/96_export-display-options.mp4 +remote: create mode 120000 Learning SketchUp 2013/97_stacking-images-in-photoshop.mp4 +remote: create mode 120000 Learning SketchUp 2013/98_multiply-and-opacity.mp4 +remote: create mode 120000 Learning SketchUp 2013/99_saving-the-image.mp4 + 8224768 60% 2.54MB/s 0:00:02 +remote: +remote: ok +remote: (Recording state in git...) +[2014-05-25 21:41:47 CEST] RemoteControl: Syncing with diskstation +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + e459e2f..26c6449 git-annex -> synced/git-annex + 6f2044d..7500a88 master -> synced/master + 10911744 80% 2.52MB/s 0:00:01 + 13603741 100% 2.69MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 13605572 bytes received 42 bytes 2473748.00 bytes/sec +total size is 13603741 speedup is 1.00 +[2014-05-25 21:41:49 CEST] Transferrer: Uploaded 32_import..xture.mp4 + +WORM-s13731971-m1398386799--Learning SketchUp 2013%31_using-paint-bucket-for-floor-texture.mp4 + 32768 0% 0.00kB/s 0:00:00 + 2752512 20% 2.48MB/s 0:00:04 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 297826c..ee2d7a6 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/master is at 7500a886b58db7f0a3d2d279a946215525109cd2 but expected 6f2044d781d283993104edb9f8b96041801c1e76 + ! 6f2044d..7500a88 master -> diskstation/master (unable to update local ref) +[2014-05-25 21:41:51 CEST] Pusher: Syncing with diskstation + 5373952 39% 2.45MB/s 0:00:03 + 9404416 68% 2.88MB/s 0:00:01 + 12681216 92% 2.63MB/s 0:00:00 + 13731971 100% 2.84MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 13733822 bytes received 42 bytes 2497066.18 bytes/sec +total size is 13731971 speedup is 1.00 +[2014-05-25 21:41:54 CEST] Transferrer: Uploaded 31_using-..xture.mp4 + +WORM-s13731971-m1398386799--Learning SketchUp 2013%31_using-paint-bucket-for-floor-texture-2.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 3211264 23% 2.96MB/s 0:00:03 + 7634944 55% 3.55MB/s 0:00:01 +[2014-05-25 21:41:57 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 26c6449..9d66740 git-annex -> synced/git-annex + 11370496 82% 3.54MB/s 0:00:00 + 13731971 100% 3.62MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 13733824 bytes received 42 bytes 2497066.55 bytes/sec +total size is 13731971 speedup is 1.00 +[2014-05-25 21:41:59 CEST] Transferrer: Uploaded 31_using-..ure-2.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ee2d7a6..be030de git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 9d667409bdd47098b595460d26a4a47a7477b602 but expected 26c64492572c692eb6c5e3af0922849d42142cc5 + ! 26c6449..9d66740 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s6958518-m1398385748--Learning SketchUp 2013%30_area-tool-for-calculations.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4096000 58% 3.77MB/s 0:00:00 +[2014-05-25 21:42:01 CEST] Pusher: Syncing with diskstation + 5505024 79% 2.56MB/s 0:00:00 + 6958518 100% 2.63MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 6959530 bytes received 42 bytes 1988449.14 bytes/sec +total size is 6958518 speedup is 1.00 +[2014-05-25 21:42:02 CEST] Transferrer: Uploaded 30_area-t..tions.mp4 + +WORM-s17894336-m1398385618--Learning SketchUp 2013%29_dividing-faces-to-create-your-rooms.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5210112 29% 4.90MB/s 0:00:02 + 8617984 48% 3.99MB/s 0:00:02 + 10715136 59% 3.34MB/s 0:00:02 +[2014-05-25 21:42:07 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9d66740..2f65ea4 git-annex -> synced/git-annex + 13336576 74% 3.11MB/s 0:00:01 + 16842752 94% 2.72MB/s 0:00:00 + 17894336 100% 3.16MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 17896694 bytes received 42 bytes 2753344.00 bytes/sec +total size is 17894336 speedup is 1.00 +[2014-05-25 21:42:09 CEST] Transferrer: Uploaded 29_dividi..rooms.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + be030de..afc435c git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 2f65ea464ab39db40b09478a6857d41450b394d3 but expected 9d667409bdd47098b595460d26a4a47a7477b602 + ! 9d66740..2f65ea4 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:42:10 CEST] Committer: Adding 107_addin..sions.mp4 110_prese..aving.mp4 +ok +(Recording state in git...) +(Recording state in git...) + +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) + +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +(merging diskstation/git-annex into git-annex...) +(Recording state in git...) +add Learning SketchUp 2013/107_adding-annotations-and-dimensions.mp4 ok +add Learning SketchUp 2013/110_presenting-and-saving.mp4 [2014-05-25 21:42:10 CEST] Committer: Committing changes to git + +WORM-s16183756-m1398386984--Learning SketchUp 2013%28_field-of-view.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:42:11 CEST] Pusher: Syncing with diskstation + 5177344 31% 4.80MB/s 0:00:02 +Already up-to-date. + 9306112 57% 4.38MB/s 0:00:01 + 13434880 83% 4.21MB/s 0:00:00 +remote: merge git-annex 16183756 100% 3.91MB/s 0:00:03 (xfer#1, to-check=0/1) +[2014-05-25 21:42:16 CEST] RemoteControl: Syncing with diskstation + +sent 16185880 bytes received 42 bytes 2942894.91 bytes/sec +total size is 16183756 speedup is 1.00 +[2014-05-25 21:42:16 CEST] Transferrer: Uploaded 28_field-..-view.m(merging synced/git-annex into git-annex...) +premote: (Recording state in git...) +4remote: ok +remote: merge synced/master + +WORM-s8653832-m1398386968--Learning SketchUp 2013%110_presenting-and-saving.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + afc435c..2feeb97 git-annex -> diskstation/git-annex + 2f65ea4..de80d6d synced/git-annex -> diskstation/synced/git-annex + 7500a88..af4c173 synced/master -> diskstation/synced/master + 4390912 50% 4.13MB/s 0:00:01 +Already up-to-date. + 7045120 81% 3.30MB/s 0:00:00 +Updating 7500a88..af4c173 +remote: Fast-forward +remote: Learning SketchUp 2013/107_adding-annotations-and-dimensions.mp4 | 1 + +remote: Learning SketchUp 2013/110_presenting-and-saving.mp4 | 1 + +remote: 2 files changed, 2 insertions(+) +remote: create mode 120000 Learning SketchUp 2013/107_adding-annotations-and-dimensions.mp4 +remote: create mode 120000 Learning SketchUp 2013/110_presenting-and-saving.mp4 + 8653832 100% 3.26MB/s 0:00:02 (xfer#1, to-check=0/1) +remote: +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2f65ea4..de80d6d git-annex -> synced/git-annex + 7500a88..af4c173 master -> synced/master + +sent 8655048 bytes received 42 bytes 1923353.33 bytes/sec +total size is 8653832 speedup is 1.00 +[2014-05-25 21:42:20 CEST] Transferrer: Uploaded 110_prese..aving.mp4 +[2014-05-25 21:42:20 CEST] RemoteControl: Syncing with diskstation + +WORM-s12740321-m1398386533--Learning SketchUp 2013%107_adding-annotations-and-dimensions.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2feeb97..c393949 git-annex -> diskstation/git-annex + 7500a88..af4c173 master -> diskstation/master + 4685824 36% 4.30MB/s 0:00:01 + 7667712 60% 3.56MB/s 0:00:01 + 10518528 82% 3.25MB/s 0:00:00 +[2014-05-25 21:42:24 CEST] Pusher: Syncing with diskstation + 12740321 100% 3.20MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 12742046 bytes received 42 bytes 2316743.27 bytes/sec +total size is 12740321 speedup is 1.00 +[2014-05-25 21:42:25 CEST] Transferrer: Uploaded 107_addin..sions.mp4 + +WORM-s21683651-m1398384839--Learning SketchUp 2013%27_viewing-layer-states-of-the-model.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4358144 20% 4.11MB/s 0:00:04 + 7438336 34% 3.47MB/s 0:00:04 +[2014-05-25 21:42:29 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + de80d6d..da93668 git-annex -> synced/git-annex + 9273344 42% 2.81MB/s 0:00:04 + 12189696 56% 2.78MB/s 0:00:03 + 15532032 71% 2.54MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c393949..9f19ee8 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at da936685ca807cb619e2d6073c857cdcdc345dde but expected de80d6dd537ca7e4bfade9d40eade18afc58878b + ! de80d6d..da93668 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 19300352 89% 2.70MB/s 0:00:00 + 21683651 100% 2.95MB/s 0:00:06 (xfer#1, to-check=0/1) +[2014-05-25 21:42:33 CEST] Pusher: Syncing with diskstation + +sent 21686467 bytes received 42 bytes 2551354.00 bytes/sec +total size is 21683651 speedup is 1.00 +[2014-05-25 21:42:33 CEST] Transferrer: Uploaded 27_viewin..model.mp4 + +WORM-s16669986-m1398385184--Learning SketchUp 2013%26_using-layers-to-control-visibility.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4259840 25% 3.95MB/s 0:00:03 + 7274496 43% 3.37MB/s 0:00:02 +[2014-05-25 21:42:37 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + da93668..fc553e7 git-annex -> synced/git-annex + 10387456 62% 3.21MB/s 0:00:01 + 13500416 80% 3.14MB/s 0:00:00 + 16613376 99% 2.87MB/s 0:00:00 + 16669986 100% 3.09MB/s 0:00:05 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9f19ee8..a8b9203 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at fc553e72a5ea5a077a254df3f557b3d6241d9342 but expected da936685ca807cb619e2d6073c857cdcdc345dde + ! da93668..fc553e7 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 16672191 bytes received 42 bytes 2564958.92 bytes/sec +total size is 16669986 speedup is 1.00 +[2014-05-25 21:42:40 CEST] Transferrer: Uploaded 26_using-..ility.mp4 + +WORM-s8161367-m1398386819--Learning SketchUp 2013%25_using-the-outliner.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4620288 56% 4.32MB/s 0:00:00 +[2014-05-25 21:42:41 CEST] Pusher: Syncing with diskstation + 8161367 100% 3.89MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 8162519 bytes received 42 bytes 3265024.40 bytes/sec +total size is 8161367 speedup is 1.00 +[2014-05-25 21:42:42 CEST] Transferrer: Uploaded 25_using-..liner.mp4 + +WORM-s26081165-m1398387035--Learning SketchUp 2013%24_hide-model-and-other-useful-shortcuts.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4620288 17% 4.27MB/s 0:00:04 +remote: merge git-annex 6193152 23% 2.82MB/s 0:00:06 + 9568256 36% 2.93MB/s 0:00:05 + 13631488 52% 3.16MB/s 0:00:03 +[2014-05-25 21:42:47 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + fc553e7..7eccd72 git-annex -> synced/git-annex + 17203200 65% 2.92MB/s 0:00:02 + 21561344 82% 3.62MB/s 0:00:01 + 25362432 97% 3.72MB/s 0:00:00 + 26081165 100% 3.37MB/s 0:00:07 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + a8b9203..829ce2e git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7eccd720d952d1ec3a1ee00cc524732ec970285f but expected fc553e72a5ea5a077a254df3f557b3d6241d9342 + ! fc553e7..7eccd72 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 26084521 bytes received 42 bytes 2745743.47 bytes/sec +total size is 26081165 speedup is 1.00 +[2014-05-25 21:42:51 CEST] Transferrer: Uploaded 24_hide-m..tcuts.mp4 + +WORM-s24710536-m1398386140--Learning SketchUp 2013%23_creating-additional-openings.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:42:52 CEST] Pusher: Syncing with diskstation + 5111808 20% 4.80MB/s 0:00:03 + 9142272 36% 4.25MB/s 0:00:03 + 12648448 51% 3.92MB/s 0:00:03 + 16023552 64% 3.71MB/s 0:00:02 +remote: merge git-annex 19365888 78% 3.27MB/s 0:00:01 + 22478848 90% 3.05MB/s 0:00:00 +[2014-05-25 21:42:58 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7eccd72..5dd7ceb git-annex -> synced/git-annex + 24710536 100% 3.34MB/s 0:00:07 (xfer#1, to-check=0/1) + +sent 24713719 bytes received 42 bytes 2907501.29 bytes/sec +total size is 24710536 speedup is 1.00 +[2014-05-25 21:42:59 CEST] Transferrer: Uploaded 23_creati..nings.mp4 + +WORM-s27007278-m1398386399--Learning SketchUp 2013%22_creating-the-second-floor.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 829ce2e..432e319 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 5dd7ceb17a57b1f11edb692c3c20eb05f7c89aa7 but expected 7eccd720d952d1ec3a1ee00cc524732ec970285f + ! 7eccd72..5dd7ceb synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 4194304 15% 3.94MB/s 0:00:05 + 6946816 25% 3.24MB/s 0:00:06 +[2014-05-25 21:43:02 CEST] Pusher: Syncing with diskstation + 9830400 36% 3.06MB/s 0:00:05 + 12582912 46% 2.96MB/s 0:00:04 +remote: merge git-annex 15761408 58% 2.73MB/s 0:00:04 + 18481152 68% 2.71MB/s 0:00:03 +[2014-05-25 21:43:06 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5dd7ceb..114c7a8 git-annex -> synced/git-annex + 21889024 81% 2.82MB/s 0:00:01 + 24805376 91% 2.86MB/s 0:00:00 + 27007278 100% 2.89MB/s 0:00:08 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 432e319..ee3c95a git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 114c7a8e0d0873ea44ebfd8a5989b7e4f6fe300d but expected 5dd7ceb17a57b1f11edb692c3c20eb05f7c89aa7 + ! 5dd7ceb..114c7a8 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 27010738 bytes received 42 bytes 2572455.24 bytes/sec +total size is 27007278 speedup is 1.00 +[2014-05-25 21:43:09 CEST] Transferrer: Uploaded 22_creati..floor.mp4 + +WORM-s11952523-m1398387004--Learning SketchUp 2013%21_why-groups.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3538944 29% 3.13MB/s 0:00:02 +[2014-05-25 21:43:11 CEST] Pusher: Syncing with diskstation + 4849664 40% 2.11MB/s 0:00:03 + 8257536 69% 2.44MB/s 0:00:01 + 11272192 94% 2.54MB/s 0:00:00 +remote: merge git-annex 11952523 100% 2.56MB/s 0:00:04 (xfer#1, to-check=0/1) +[2014-05-25 21:43:15 CEST] RemoteControl: Syncing with diskstation + +sent 11954128 bytes received 42 bytes 2173485.45 bytes/sec +total size is 11952523 speedup is 1.00 +[2014-05-25 21:43:15 CEST] Transferrer: Uploaded 21_why-groups.mp4 + +WORM-s14698958-m1401045757--Learning SketchUp 2013%20_clean-up-using-the-eraser-to-remove-unwanted-edges.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 114c7a8..70d2843 git-annex -> synced/git-annex +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ee3c95a..292456c git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 70d2843ca3fd83291be9e3a83c8a2b1d393344fc but expected 114c7a8e0d0873ea44ebfd8a5989b7e4f6fe300d + ! 114c7a8..70d2843 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:43:17 CEST] RemoteControl: Syncing with diskstation + 4489216 30% 4.09MB/s 0:00:02 + 7634944 51% 3.53MB/s 0:00:01 + 10715136 72% 3.32MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 292456c..489a02f git-annex -> diskstation/git-annex + 14254080 96% 3.32MB/s 0:00:00 + 14698958 100% 3.27MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 14700939 bytes received 42 bytes 2261689.38 bytes/sec +total size is 14698958 speedup is 1.00 +[2014-05-25 21:43:21 CEST] Transferrer: Uploaded 20_clean-..edges.mp4 +[2014-05-25 21:43:21 CEST] Pusher: Syncing with diskstation + +WORM-s53078315-m1401045818--Learning SketchUp 2013%19_creating-doors-and-openings.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5046272 9% 4.66MB/s 0:00:10 + 9109504 17% 4.21MB/s 0:00:10 +remote: merge git-annex 12779520 24% 3.96MB/s 0:00:09 + 16187392 30% 3.76MB/s 0:00:09 + 20676608 38% 3.66MB/s 0:00:08 +[2014-05-25 21:43:27 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 70d2843..0d8c767 git-annex -> synced/git-annex + 24739840 46% 3.67MB/s 0:00:07 + 28573696 53% 3.71MB/s 0:00:06 + 32243712 60% 3.76MB/s 0:00:05 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 489a02f..7a7f5ca git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 0d8c76720fa6b51cf2cf5edf847e732dd550ab40 but expected 70d2843ca3fd83291be9e3a83c8a2b1d393344fc + ! 70d2843..0d8c767 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 36765696 69% 3.74MB/s 0:00:04 + 40697856 76% 3.72MB/s 0:00:03 + 44564480 83% 3.73MB/s 0:00:02 + 47316992 89% 3.53MB/s 0:00:01 + 50331648 94% 3.18MB/s 0:00:00 + 53078315 100% 3.62MB/s 0:00:13 (xfer#1, to-check=0/1) + +sent 53084957 bytes received 42 bytes 3424838.65 bytes/sec +total size is 53078315 speedup is 1.00 +[2014-05-25 21:43:36 CEST] Transferrer: Uploaded 19_creati..nings.mp4 +[2014-05-25 21:43:36 CEST] Pusher: Syncing with diskstation + +WORM-s30352251-m1398385646--Learning SketchUp 2013%18_extruding-your-walls-push-pull-and-offset.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4784128 15% 4.50MB/s 0:00:05 +remote: merge git-annex 8159232 26% 3.81MB/s 0:00:05 + 10256384 33% 3.17MB/s 0:00:06 +[2014-05-25 21:43:40 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 0d8c767..6f8ae3d git-annex -> synced/git-annex + 13271040 43% 3.06MB/s 0:00:05 + 16318464 53% 2.65MB/s 0:00:05 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7a7f5ca..bef94a6 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 6f8ae3d49d1006e2d5cf957d7539c0818db4df12 but expected 0d8c76720fa6b51cf2cf5edf847e732dd550ab40 + ! 0d8c767..6f8ae3d synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 19070976 62% 2.51MB/s 0:00:04 + 21954560 72% 2.71MB/s 0:00:03 + 24969216 82% 2.72MB/s 0:00:01 + 27852800 91% 2.69MB/s 0:00:00 + 30352251 100% 2.87MB/s 0:00:10 (xfer#1, to-check=0/1) + +sent 30356135 bytes received 42 bytes 2639667.57 bytes/sec +total size is 30352251 speedup is 1.00 +[2014-05-25 21:43:48 CEST] Transferrer: Uploaded 18_extrud..ffset.mp4 +[2014-05-25 21:43:48 CEST] Pusher: Syncing with diskstation + +WORM-s14102612-m1398386513--Learning SketchUp 2013%16_measurements.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4554752 32% 4.23MB/s 0:00:02 + 7634944 54% 3.59MB/s 0:00:01 +remote: merge git-annex 10584064 75% 3.29MB/s 0:00:01 +[2014-05-25 21:43:52 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 6f8ae3d..32eee1a git-annex -> synced/git-annex + 13434880 95% 3.13MB/s 0:00:00 + 14102612 100% 3.14MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 14104483 bytes received 42 bytes 2564459.09 bytes/sec +total size is 14102612 speedup is 1.00 +[2014-05-25 21:43:53 CEST] Transferrer: Uploaded 16_measurements.mp4 + +WORM-s16792198-m1398384994--Learning SketchUp 2013%15_creating-a-gambrel-roof.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + bef94a6..10025f1 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 32eee1aff2a03a33e7cc200fefcef41ce775767e but expected 6f8ae3d49d1006e2d5cf957d7539c0818db4df12 + ! 6f8ae3d..32eee1a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 4128768 24% 3.88MB/s 0:00:03 + 7012352 41% 3.26MB/s 0:00:02 +[2014-05-25 21:43:56 CEST] Pusher: Syncing with diskstation + 9895936 58% 3.07MB/s 0:00:02 + 12648448 75% 2.95MB/s 0:00:01 +remote: merge git-annex 14745600 87% 2.48MB/s 0:00:00 + 16416768 97% 2.20MB/s 0:00:00 + 16792198 100% 2.58MB/s 0:00:06 (xfer#1, to-check=0/1) +[2014-05-25 21:44:01 CEST] RemoteControl: Syncing with diskstation + +sent 16794408 bytes received 42 bytes 1975817.65 bytes/sec +total size is 16792198 speedup is 1.00 +[2014-05-25 21:44:01 CEST] Transferrer: Uploaded 15_creati..-roof.mp4 + +WORM-s33139501-m1398386446--Learning SketchUp 2013%14_creating-a-mansard-roof.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 32eee1a..cc461b8 git-annex -> synced/git-annex + 4685824 14% 4.39MB/s 0:00:06 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 10025f1..f39db09 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at cc461b8c48eb38d8f0b020a9c22440dada4973f0 but expected 32eee1aff2a03a33e7cc200fefcef41ce775767e + ! 32eee1a..cc461b8 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:44:03 CEST] RemoteControl: Syncing with diskstation + 8159232 24% 3.84MB/s 0:00:06 + 11730944 35% 3.67MB/s 0:00:05 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + f39db09..d356ca4 git-annex -> diskstation/git-annex + 16351232 49% 3.85MB/s 0:00:04 +[2014-05-25 21:44:07 CEST] Pusher: Syncing with diskstation + 20119552 60% 3.63MB/s 0:00:03 + 23265280 70% 3.52MB/s 0:00:02 + 25952256 78% 3.31MB/s 0:00:02 +remote: merge git-annex 28803072 86% 2.89MB/s 0:00:01 +(merging synced/git-annex into git-annex...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + cc461b8..f90e094 git-annex -> synced/git-annex + 31653888 95% 2.67MB/s 0:00:00 + 33139501 100% 3.28MB/s 0:00:09 (xfer#1, to-check=0/1) + +sent 33143707 bytes received 42 bytes 2882065.13 bytes/sec +total size is 33139501 speedup is 1.00 +[2014-05-25 21:44:12 CEST] Transferrer: Uploaded 14_creati..-roof.mp4 + +WORM-s32543230-m1398386371--Learning SketchUp 2013%13_using-follow-me-complex-roof-pitches.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4718592 14% 4.45MB/s 0:00:06 +[2014-05-25 21:44:14 CEST] Pusher: Syncing with diskstation + 7340032 22% 3.45MB/s 0:00:07 + 10125312 31% 3.18MB/s 0:00:06 + 12877824 39% 3.03MB/s 0:00:06 +remote: merge git-annex 15892480 48% 2.64MB/s 0:00:06 + 18579456 57% 2.64MB/s 0:00:05 + 21561344 66% 2.67MB/s 0:00:04 +[2014-05-25 21:44:20 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + f90e094..795020d git-annex -> synced/git-annex + 24412160 75% 2.70MB/s 0:00:02 + 27164672 83% 2.61MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + d356ca4..7d763cd git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 795020d6aa856441f602de8d1f2f7efb98c00f20 but expected f90e0945bc55e8e50115bccec9672d1df7c23e69 + ! f90e094..795020d synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 28737536 88% 2.28MB/s 0:00:01 + 30703616 94% 2.05MB/s 0:00:00 + 32543230 100% 2.58MB/s 0:00:12 (xfer#1, to-check=0/1) + +sent 32547377 bytes received 42 bytes 2410919.93 bytes/sec +total size is 32543230 speedup is 1.00 +[2014-05-25 21:44:25 CEST] Transferrer: Uploaded 13_using-..tches.mp4 +[2014-05-25 21:44:25 CEST] Pusher: Syncing with diskstation + +WORM-s22461160-m1401045786--Learning SketchUp 2013%12_push-pull-and-move-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4161536 18% 3.80MB/s 0:00:04 +remote: merge git-annex 6782976 30% 3.13MB/s 0:00:04 + 9666560 43% 2.95MB/s 0:00:04 +[2014-05-25 21:44:29 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 795020d..496b7bd git-annex -> synced/git-annex + 12681216 56% 2.91MB/s 0:00:03 + 15859712 70% 2.70MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7d763cd..2bf57cb git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 496b7bd40f4c979efdd6196eccadeeb370bb4ec3 but expected 795020d6aa856441f602de8d1f2f7efb98c00f20 + ! 795020d..496b7bd synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 18579456 82% 2.72MB/s 0:00:01 + 20414464 90% 2.50MB/s 0:00:00 + 22461160 100% 2.69MB/s 0:00:07 (xfer#1, to-check=0/1) + +sent 22464062 bytes received 42 bytes 2364642.53 bytes/sec +total size is 22461160 speedup is 1.00 +[2014-05-25 21:44:34 CEST] Transferrer: Uploaded 12_push-p..-tool.mp4 +[2014-05-25 21:44:34 CEST] Pusher: Syncing with diskstation + +WORM-s15320679-m1398386653--Learning SketchUp 2013%11_navigating-in-3d.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4587520 29% 4.18MB/s 0:00:02 +remote: merge git-annex 7471104 48% 3.45MB/s 0:00:02 + 10223616 66% 3.16MB/s 0:00:01 +[2014-05-25 21:44:38 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 496b7bd..eefc387 git-annex -> synced/git-annex + 12976128 84% 3.00MB/s 0:00:00 + 15320679 100% 2.92MB/s 0:00:04 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2bf57cb..310d31e git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at eefc387772b3e6ba46f51fbecd86cdabcd27db96 but expected 496b7bd40f4c979efdd6196eccadeeb370bb4ec3 + ! 496b7bd..eefc387 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 15322702 bytes received 42 bytes 2357345.23 bytes/sec +total size is 15320679 speedup is 1.00 +[2014-05-25 21:44:40 CEST] Transferrer: Uploaded 11_naviga..in-3d.mp4 + +WORM-s6065317-m1398386928--Learning SketchUp 2013%111_about-dan-brown.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4292608 70% 3.98MB/s 0:00:00 +[2014-05-25 21:44:42 CEST] Pusher: Syncing with diskstation + 6065317 100% 3.02MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 6066211 bytes received 42 bytes 1733215.14 bytes/sec +total size is 6065317 speedup is 1.00 +[2014-05-25 21:44:43 CEST] Transferrer: Uploaded 111_about..brown.mp4 + +WORM-s2764724-m1398386941--Learning SketchUp 2013%10_freehand-tool.mp4 + 32768 1% 0.00kB/s 0:00:00 + 2764724 100% 5.18MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 2765211 bytes received 42 bytes 1843502.00 bytes/sec +total size is 2764724 speedup is 1.00 +[2014-05-25 21:44:45 CEST] Transferrer: Uploaded 10_freeha..-tool.mp4 +remote: merge git-annex +WORM-s6834151-m1398385049--Learning SketchUp 2013%109_updating-the-model-references.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 61% 3.81MB/s 0:00:00 + 6834151 100% 3.46MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:44:47 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + eefc387..dc4c11c git-annex -> synced/git-annex + +sent 6835151 bytes received 42 bytes 1952912.29 bytes/sec +total size is 6834151 speedup is 1.00 +[2014-05-25 21:44:48 CEST] Transferrer: Uploaded 109_updat..ences.mp4 + +WORM-s6878166-m1398386493--Learning SketchUp 2013%108_adding-additional-pages-and-content.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4259840 61% 3.87MB/s 0:00:00 + 6878166 100% 3.80MB/s 0:00:01 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 310d31e..e2f5d0d git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at dc4c11c618002775bb0e8dcf4b132113c40875ed but expected eefc387772b3e6ba46f51fbecd86cdabcd27db96 + ! eefc387..dc4c11c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 6879176 bytes received 42 bytes 1965490.86 bytes/sec +total size is 6878166 speedup is 1.00 +[2014-05-25 21:44:51 CEST] Transferrer: Uploaded 108_addin..ntent.mp4 + +WORM-s8253246-m1398386838--Learning SketchUp 2013%106_adjusting-the-model-settings.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:44:52 CEST] Pusher: Syncing with diskstation + 2588672 31% 2.32MB/s 0:00:02 + 4554752 55% 2.10MB/s 0:00:01 + 8093696 98% 2.51MB/s 0:00:00 + 8253246 100% 2.52MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 8254417 bytes received 42 bytes 1834324.22 bytes/sec +total size is 8253246 speedup is 1.00 +[2014-05-25 21:44:55 CEST] Transferrer: Uploaded 106_adjus..tings.mp4 + +WORM-s5364896-m1398386068--Learning SketchUp 2013%105_what-is-layout.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4816896 89% 4.56MB/s 0:00:00 + 5364896 100% 4.39MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 5365701 bytes received 42 bytes 2146297.20 bytes/sec +total size is 5364896 speedup is 1.00 +[2014-05-25 21:44:58 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:44:58 CEST] Transferrer: Uploaded 105_what-..ayout.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + dc4c11c..a19dfa9 git-annex -> synced/git-annex + +WORM-s7390741-m1398386693--Learning SketchUp 2013%104_post-processing-in-photoshop.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4227072 57% 3.91MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e2f5d0d..73400d3 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at a19dfa9bd0b4aee28bf67773a9f578a9bb94f2e9 but expected dc4c11c618002775bb0e8dcf4b132113c40875ed + ! dc4c11c..a19dfa9 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 7241728 97% 3.34MB/s 0:00:00 + 7390741 100% 3.35MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 7391808 bytes received 42 bytes 1642633.33 bytes/sec +total size is 7390741 speedup is 1.00 +[2014-05-25 21:45:02 CEST] Transferrer: Uploaded 104_post-..oshop.mp4 + +WORM-s12544086-m1398385948--Learning SketchUp 2013%103_rendering-a-high-quality-image.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:45:03 CEST] Pusher: Syncing with diskstation + 4292608 34% 3.96MB/s 0:00:02 + 7307264 58% 3.39MB/s 0:00:01 + 9535488 76% 2.97MB/s 0:00:00 +remote: merge git-annex 12419072 99% 2.91MB/s 0:00:00 + 12544086 100% 2.90MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 12545784 bytes received 42 bytes 2281059.27 bytes/sec +total size is 12544086 speedup is 1.00 +[2014-05-25 21:45:07 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:45:07 CEST] Transferrer: Uploaded 103_rende..image.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + a19dfa9..96ceb2c git-annex -> synced/git-annex + +WORM-s6567293-m1398384854--Learning SketchUp 2013%102_model-presets-create-a-preview-rendering.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4128768 62% 3.83MB/s 0:00:00 + 6567293 100% 3.26MB/s 0:00:01 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 73400d3..3e5d1b8 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 96ceb2c0e06ff0f1372950ab38c2aa2ebb0f00d7 but expected a19dfa9bd0b4aee28bf67773a9f578a9bb94f2e9 + ! a19dfa9..96ceb2c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 6568272 bytes received 42 bytes 1876661.14 bytes/sec +total size is 6567293 speedup is 1.00 +[2014-05-25 21:45:11 CEST] Transferrer: Uploaded 102_model..ering.mp4 + +WORM-s8030582-m1398385367--Learning SketchUp 2013%101_add-reflections-to-existing-textures.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4423680 55% 4.18MB/s 0:00:00 +[2014-05-25 21:45:12 CEST] Pusher: Syncing with diskstation + 7569408 94% 3.54MB/s 0:00:00 + 8030582 100% 3.53MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 8031737 bytes received 42 bytes 2294794.00 bytes/sec +total size is 8030582 speedup is 1.00 +[2014-05-25 21:45:14 CEST] Transferrer: Uploaded 101_add-r..tures.mp4 + +WORM-s13509940-m1398384818--Learning SketchUp 2013%100_adding-lighting.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4587520 33% 4.25MB/s 0:00:02 +remote: merge git-annex 7831552 57% 3.62MB/s 0:00:01 + 10420224 77% 3.24MB/s 0:00:00 +[2014-05-25 21:45:18 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 96ceb2c..a5f9c8b git-annex -> synced/git-annex + 13509940 100% 3.28MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 13511743 bytes received 42 bytes 2456688.18 bytes/sec +total size is 13509940 speedup is 1.00 +[2014-05-25 21:45:19 CEST] Transferrer: Uploaded 100_addin..hting.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 3e5d1b8..6ea05e0 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at a5f9c8b9874d4d3fe571687365c391050325bc87 but expected 96ceb2c0e06ff0f1372950ab38c2aa2ebb0f00d7 + ! 96ceb2c..a5f9c8b synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s6047748-m1398386548--Learning SketchUp 2013%09_arc-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4751360 78% 4.47MB/s 0:00:00 + 6047748 100% 4.50MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 6048630 bytes received 42 bytes 2419468.80 bytes/sec +total size is 6047748 speedup is 1.00 +[2014-05-25 21:45:22 CEST] Pusher: Syncing with diskstation +[2014-05-25 21:45:22 CEST] Transferrer: Uploaded 09_arc-tool.mp4 + +WORM-s7257160-m1398385203--Learning SketchUp 2013%08_polygon-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5079040 69% 4.65MB/s 0:00:00 +remote: merge git-annex 7257160 100% 4.35MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:45:25 CEST] RemoteControl: Syncing with diskstation + +sent 7258194 bytes received 42 bytes 2073781.71 bytes/sec +total size is 7257160 speedup is 1.00 +[2014-05-25 21:45:25 CEST] Transferrer: Uploaded 08_polygon-tool.mp4 + +WORM-s6789048-m1398386463--Learning SketchUp 2013%07_circle-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + a5f9c8b..05787b8 git-annex -> synced/git-annex + 2654208 39% 2.46MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 6ea05e0..b78228d git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 05787b8b7c6dd1aad45fdb0a019a2ed5e56b26bb but expected a5f9c8b9874d4d3fe571687365c391050325bc87 + ! a5f9c8b..05787b8 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:45:28 CEST] RemoteControl: Syncing with diskstation + 5013504 73% 2.35MB/s 0:00:00 + 6789048 100% 2.62MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 6790025 bytes received 42 bytes 1940019.14 bytes/sec +total size is 6789048 speedup is 1.00 +[2014-05-25 21:45:29 CEST] Transferrer: Uploaded 07_circle-tool.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + b78228d..f1fd60c git-annex -> diskstation/git-annex + +WORM-s3766669-m1398384958--Learning SketchUp 2013%06_rectangle-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:45:31 CEST] Pusher: Syncing with diskstation + 3702784 98% 2.95MB/s 0:00:00 + 3766669 100% 3.00MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 3767277 bytes received 42 bytes 1506927.60 bytes/sec +total size is 3766669 speedup is 1.00 +[2014-05-25 21:45:31 CEST] Transferrer: Uploaded 06_rectan..-tool.mp4 + +WORM-s5571735-m1398386867--Learning SketchUp 2013%05_line-tool.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5144576 92% 4.78MB/s 0:00:00 + 5571735 100% 4.70MB/s 0:00:01 (xfer#1, to-check=0/1) +remote: merge git-annex +sent 5572562 bytes received 42 bytes 2229041.60 bytes/sec +total size is 5571735 speedup is 1.00 +[2014-05-25 21:45:33 CEST] Transferrer: Uploaded 05_line-tool.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +[2014-05-25 21:45:35 CEST] RemoteConTo joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies +trol: Syncing with diskstati 05787b8..2a723a6 ogit-annex -> synced/git-annexn + + +WORM-s13796050-m1398386633--Learning SketchUp 2013%04_how-to-access-your-working-files.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4915200 35% 4.65MB/s 0:00:01 + 8159232 59% 3.77MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + f1fd60c..bdd7ed6 git-annex -> diskstation/git-annex + 11304960 81% 3.45MB/s 0:00:00 + 13796050 100% 3.57MB/s 0:00:03 (xfer#1, to-check=0/1) +[2014-05-25 21:45:38 CEST] Pusher: Syncing with diskstation + +sent 13797905 bytes received 42 bytes 2508717.64 bytes/sec +total size is 13796050 speedup is 1.00 +[2014-05-25 21:45:39 CEST] Transferrer: Uploaded 04_how-to..files.mp4 + +WORM-s5852944-m1398386582--Learning SketchUp 2013%03_setting-up-the-toolbars.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4947968 84% 4.65MB/s 0:00:00 + 5852944 100% 4.42MB/s 0:00:01 (xfer#1, to-check=0/1) +remote: merge git-annex [2014-05-25 21:45:42 CEST] RemoteControl: Syncing with diskstation + +sent 5853817 bytes received 42 bytes 2341543.60 bytes/sec +total size is 5852944 speedup is 1.00 +[2014-05-25 21:45:42 CEST] Transferrer: Uploaded 03_settin..lbars.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2a723a6..dc76c23 git-annex -> synced/git-annex + +WORM-s3829366-m1398386198--Learning SketchUp 2013%02_setting-up-the-template.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3829366 100% 4.68MB/s 0:00:00 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + bdd7ed6..84f8e25 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at dc76c234409bd5cfac50be70dd21ef8be88aed9b but expected 2a723a6697455228d8b2e95a7015aafb4be4f003 + ! 2a723a6..dc76c23 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 3829991 bytes received 42 bytes 1532013.20 bytes/sec +total size is 3829366 speedup is 1.00 +[2014-05-25 21:45:45 CEST] Transferrer: Uploaded 02_settin..plate.mp4 + +WORM-s6528377-m1398386753--Learning SketchUp 2013%01_introduction.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4718592 72% 4.42MB/s 0:00:00 +[2014-05-25 21:45:47 CEST] Pusher: Syncing with diskstation + 6528377 100% 3.21MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 6529323 bytes received 42 bytes 2611746.00 bytes/sec +total size is 6528377 speedup is 1.00 +[2014-05-25 21:45:48 CEST] Transferrer: Uploaded 01_introduction.mp4 + +WORM-s5900041-m1398386278--Learning SketchUp 2013%99_saving-the-image.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5079040 86% 4.72MB/s 0:00:00 + 5900041 100% 4.60MB/s 0:00:01 (xfer#1, to-check=0/1) +remote: merge git-annex +sent 5900915 bytes received 42 bytes 2360382.80 bytes/sec +total size is 5900041 speedup is 1.00 +[2014-05-25 21:45:50 CEST] Transferrer: Uploaded 99_saving..image.mp4 + +WORM-s7221607-m1398385119--Learning SketchUp 2013%98_multiply-and-opacity.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:45:52 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + dc76c23..60c1e82 git-annex -> synced/git-annex + 4456448 61% 4.07MB/s 0:00:00 + 7221607 100% 4.25MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 7222645 bytes received 42 bytes 2889074.80 bytes/sec +total size is 7221607 speedup is 1.00 +[2014-05-25 21:45:54 CEST] Transferrer: Uploaded 98_multip..acity.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 84f8e25..3261510 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 60c1e827e829b642d4618889b425c0bfc259b2c9 but expected dc76c234409bd5cfac50be70dd21ef8be88aed9b + ! dc76c23..60c1e82 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s6262129-m1398386258--Learning SketchUp 2013%97_stacking-images-in-photoshop.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4947968 79% 4.69MB/s 0:00:00 + 6262129 100% 4.40MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:45:56 CEST] Pusher: Syncing with diskstation + +sent 6263059 bytes received 42 bytes 2505240.40 bytes/sec +total size is 6262129 speedup is 1.00 +[2014-05-25 21:45:56 CEST] Transferrer: Uploaded 97_stacki..oshop.mp4 + +WORM-s9298049-m1398385793--Learning SketchUp 2013%96_export-display-options.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5177344 55% 4.84MB/s 0:00:00 +remote: merge git-annex 8519680 91% 4.01MB/s 0:00:00 + 9298049 100% 3.97MB/s 0:00:02 (xfer#1, to-check=0/1) +[2014-05-25 21:46:00 CEST] RemoteControl: Syncing with diskstation + +sent 9299341 bytes received 42 bytes 2656966.57 bytes/sec +total size is 9298049 speedup is 1.00 +[2014-05-25 21:46:00 CEST] Transferrer: Uploaded 96_export..tions.mp4 + +WORM-s7895136-m1398385533--Learning SketchUp 2013%95_add-final-touches.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 60c1e82..f08968c git-annex -> synced/git-annex + 4325376 54% 4.06MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 3261510..c9b4dc3 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at f08968c15cbe86c49c1fb71f22f578ad7cecd680 but expected 60c1e827e829b642d4618889b425c0bfc259b2c9 + ! 60c1e82..f08968c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:46:02 CEST] RemoteControl: Syncing with diskstation + 7895136 100% 3.99MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 7896251 bytes received 42 bytes 2256083.71 bytes/sec +total size is 7895136 speedup is 1.00 +[2014-05-25 21:46:03 CEST] Transferrer: Uploaded 95_add-fi..uches.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c9b4dc3..78519cd git-annex -> diskstation/git-annex + +WORM-s13569035-m1398385318--Learning SketchUp 2013%94_animation-options.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5373952 39% 5.00MB/s 0:00:01 +[2014-05-25 21:46:05 CEST] Pusher: Syncing with diskstation + 9437184 69% 4.45MB/s 0:00:00 + 13565952 99% 4.26MB/s 0:00:00 + 13569035 100% 4.26MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 13570847 bytes received 42 bytes 3015753.11 bytes/sec +total size is 13569035 speedup is 1.00 +[2014-05-25 21:46:07 CEST] Transferrer: Uploaded 94_animat..tions.mp4 + +WORM-s8278464-m1398386213--Learning SketchUp 2013%93_collada-files.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5341184 64% 4.98MB/s 0:00:00 + 8278464 100% 4.37MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:46:10 CEST] RemoteControl: Syncing with diskstation + +sent 8279623 bytes received 42 bytes 2365618.57 bytes/sec +total size is 8278464 speedup is 1.00 +[2014-05-25 21:46:10 CEST] Transferrer: Uploaded 93_collad..files.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + f08968c..f99a466 git-annex -> synced/git-annex + +WORM-s8934010-m1398386414--Learning SketchUp 2013%92_kmz-for-google-earth.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4784128 53% 4.43MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 78519cd..e30d06f git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at f99a466d7568addbbc99cb058f66a2c03c571fba but expected f08968c15cbe86c49c1fb71f22f578ad7cecd680 + ! f08968c..f99a466 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 8934010 100% 4.24MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 8935256 bytes received 42 bytes 2552942.29 bytes/sec +total size is 8934010 speedup is 1.00 +[2014-05-25 21:46:13 CEST] Transferrer: Uploaded 92_kmz-fo..earth.mp4 + +WORM-s9716042-m1398384915--Learning SketchUp 2013%91_dwg-elevation-and-plan-pro-feature.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5341184 54% 5.00MB/s 0:00:00 +[2014-05-25 21:46:15 CEST] Pusher: Syncing with diskstation + 9371648 96% 4.39MB/s 0:00:00 + 9716042 100% 4.44MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 9717398 bytes received 42 bytes 2776411.43 bytes/sec +total size is 9716042 speedup is 1.00 +[2014-05-25 21:46:16 CEST] Transferrer: Uploaded 91_dwg-el..ature.mp4 + +WORM-s14343030-m1398386888--Learning SketchUp 2013%90_jpeg-and-png-files.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5079040 35% 4.81MB/s 0:00:01 + 9535488 66% 4.50MB/s 0:00:01 +[2014-05-25 21:46:19 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + f99a466..af84b87 git-annex -> synced/git-annex + 13565952 94% 4.25MB/s 0:00:00 + 14343030 100% 3.99MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 14344935 bytes received 42 bytes 2608177.64 bytes/sec +total size is 14343030 speedup is 1.00 +[2014-05-25 21:46:21 CEST] Transferrer: Uploaded 90_jpeg-a..files.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e30d06f..c6bcde6 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at af84b876d0902aa7da89ca414becf5b9d98d8a19 but expected f99a466d7568addbbc99cb058f66a2c03c571fba + ! f99a466..af84b87 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s10692771-m1398385558--Learning SketchUp 2013%89_creating-the-animation.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5341184 49% 4.94MB/s 0:00:01 +[2014-05-25 21:46:23 CEST] Pusher: Syncing with diskstation + 9535488 89% 4.43MB/s 0:00:00 + 10692771 100% 4.41MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 10694236 bytes received 42 bytes 3055508.00 bytes/sec +total size is 10692771 speedup is 1.00 +[2014-05-25 21:46:24 CEST] Transferrer: Uploaded 89_creati..ation.mp4 + +WORM-s14320839-m1398385514--Learning SketchUp 2013%88_creating-a-group.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5308416 37% 5.02MB/s 0:00:01 +remote: merge git-annex 9469952 66% 4.47MB/s 0:00:01 + 13631488 95% 4.28MB/s 0:00:00 + 14320839 100% 4.31MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 14322742 bytes received 42 bytes 3182840.89 bytes/sec +total size is 14320839 speedup is 1.00 +[2014-05-25 21:46:28 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:46:28 CEST] Transferrer: Uploaded 88_creati..group.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + af84b87..7f1137a git-annex -> synced/git-annex + +WORM-s20730987-m1398385414--Learning SketchUp 2013%87_section-cut-for-interior-elevations.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5341184 25% 4.91MB/s 0:00:03 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c6bcde6..a8341a2 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7f1137a28d8b17c5cdc10e856578da6337d1143c but expected af84b876d0902aa7da89ca414becf5b9d98d8a19 + ! af84b87..7f1137a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 9371648 45% 4.38MB/s 0:00:02 + 13860864 66% 4.33MB/s 0:00:01 +[2014-05-25 21:46:33 CEST] Pusher: Syncing with diskstation + 18055168 87% 4.23MB/s 0:00:00 + 20730987 100% 4.19MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 20733689 bytes received 42 bytes 3189804.77 bytes/sec +total size is 20730987 speedup is 1.00 +[2014-05-25 21:46:35 CEST] Transferrer: Uploaded 87_sectio..tions.mp4 + +WORM-s21661288-m1398385144--Learning SketchUp 2013%86_scenes-for-animation.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5177344 23% 4.89MB/s 0:00:03 + 9404416 43% 4.46MB/s 0:00:02 +[2014-05-25 21:46:38 CEST] RemoteControl: Syncing with diskstation + 13631488 62% 4.28MB/s 0:00:01 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7f1137a..9338de4 git-annex -> synced/git-annex + 17170432 79% 4.04MB/s 0:00:01 + 20905984 96% 3.69MB/s 0:00:00 + 21661288 100% 3.90MB/s 0:00:05 (xfer#1, to-check=0/1) +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + a8341a2..72c4e65 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 9338de4e5a82415622d40ef588287666f8757fc0 but expected 7f1137a28d8b17c5cdc10e856578da6337d1143c + ! 7f1137a..9338de4 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +sent 21664091 bytes received 42 bytes 3332943.54 bytes/sec +total size is 21661288 speedup is 1.00 +[2014-05-25 21:46:41 CEST] Transferrer: Uploaded 86_scenes..ation.mp4 + +WORM-s23994784-m1398385930--Learning SketchUp 2013%85_styles.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5177344 21% 4.83MB/s 0:00:03 +[2014-05-25 21:46:42 CEST] Pusher: Syncing with diskstation + 9371648 39% 4.39MB/s 0:00:03 + 13565952 56% 4.26MB/s 0:00:02 + 17661952 73% 4.17MB/s 0:00:01 +remote: merge git-annex 21856256 91% 3.94MB/s 0:00:00 + 23994784 100% 4.08MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 23997857 bytes received 42 bytes 3691984.46 bytes/sec +total size is 23994784 speedup is 1.00 +[2014-05-25 21:46:48 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:46:48 CEST] Transferrer: Uploaded 85_styles.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 9338de4..47c3025 git-annex -> synced/git-annex + +WORM-s9421737-m1398386334--Learning SketchUp 2013%84_creating-scenes-and-updating.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4128768 43% 3.80MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 72c4e65..3862dfd git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 47c3025b26597ab96c6553b17d40df2473761367 but expected 9338de4e5a82415622d40ef588287666f8757fc0 + ! 9338de4..47c3025 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 7045120 74% 3.29MB/s 0:00:00 + 9421737 100% 3.42MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 9423051 bytes received 42 bytes 2094020.67 bytes/sec +total size is 9421737 speedup is 1.00 +[2014-05-25 21:46:52 CEST] Transferrer: Uploaded 84_creati..ating.mp4 + +WORM-s15890796-m1398387058--Learning SketchUp 2013%83_add-solar-panels-with-skelion-plugin.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3932160 24% 3.64MB/s 0:00:03 +[2014-05-25 21:46:54 CEST] Pusher: Syncing with diskstation + 8093696 50% 3.80MB/s 0:00:02 + 11304960 71% 3.54MB/s 0:00:01 + 14516224 91% 3.40MB/s 0:00:00 + 15890796 100% 3.45MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 15892907 bytes received 42 bytes 2889627.09 bytes/sec +total size is 15890796 speedup is 1.00 +[2014-05-25 21:46:58 CEST] Transferrer: Uploaded 83_add-so..lugin.mp4 +remote: merge git-annex +WORM-s9278449-m1398386852--Learning SketchUp 2013%82_using-3d-text.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5439488 58% 5.07MB/s 0:00:00 + 9278449 100% 4.51MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:47:00 CEST] RemoteControl: Syncing with diskstation + +sent 9279732 bytes received 42 bytes 3711909.60 bytes/sec +total size is 9278449 speedup is 1.00 +[2014-05-25 21:47:00 CEST] Transferrer: Uploaded 82_using-..-text.mp4 + +WORM-s11983231-m1398385259--Learning SketchUp 2013%81_get-photo-google-street-view.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 47c3025..a7b0dc9 git-annex -> synced/git-annex + 5079040 42% 4.63MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 3862dfd..5f94bb2 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at a7b0dc9c64973369eb06a57d14ed6e64ec20fa07 but expected 47c3025b26597ab96c6553b17d40df2473761367 + ! 47c3025..a7b0dc9 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:47:03 CEST] RemoteControl: Syncing with diskstation + 9404416 78% 4.32MB/s 0:00:00 + 11983231 100% 4.36MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 11984858 bytes received 42 bytes 2663311.11 bytes/sec +total size is 11983231 speedup is 1.00 +[2014-05-25 21:47:04 CEST] Transferrer: Uploaded 81_get-ph..-view.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5f94bb2..521740c git-annex -> diskstation/git-annex + +WORM-s10154793-m1398385298--Learning SketchUp 2013%80_adding-context.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5242880 51% 4.94MB/s 0:00:00 +[2014-05-25 21:47:06 CEST] Pusher: Syncing with diskstation + 9437184 92% 4.40MB/s 0:00:00 + 10154793 100% 4.41MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 10156182 bytes received 42 bytes 2901778.29 bytes/sec +total size is 10154793 speedup is 1.00 +[2014-05-25 21:47:07 CEST] Transferrer: Uploaded 80_adding..ntext.mp4 + +WORM-s15455988-m1398386244--Learning SketchUp 2013%79_creating-the-front-facade.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5308416 34% 4.93MB/s 0:00:02 +remote: merge git-annex 9306112 60% 4.38MB/s 0:00:01 + 12124160 78% 3.73MB/s 0:00:00 +[2014-05-25 21:47:12 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + a7b0dc9..7a6f85f git-annex -> synced/git-annex + 13434880 86% 3.11MB/s 0:00:00 + 15455988 100% 3.14MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 15458036 bytes received 42 bytes 2810559.64 bytes/sec +total size is 15455988 speedup is 1.00 +[2014-05-25 21:47:13 CEST] Transferrer: Uploaded 79_creati..acade.mp4 + +WORM-s7511926-m1398385903--Learning SketchUp 2013%78_reset-axis-to-align-building.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 521740c..57437fb git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7a6f85f7864920fbcac361f47558fc352f1d2d16 but expected a7b0dc9c64973369eb06a57d14ed6e64ec20fa07 + ! a7b0dc9..7a6f85f synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 4554752 60% 4.27MB/s 0:00:00 + 7511926 100% 4.13MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:47:16 CEST] Pusher: Syncing with diskstation + +sent 7513008 bytes received 42 bytes 2146585.71 bytes/sec +total size is 7511926 speedup is 1.00 +[2014-05-25 21:47:16 CEST] Transferrer: Uploaded 78_reset-..lding.mp4 + +WORM-s9197360-m1398386099--Learning SketchUp 2013%77_setting-the-building-in-place-geolocation.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4521984 49% 4.04MB/s 0:00:01 +remote: merge git-annex 7962624 86% 3.66MB/s 0:00:00 + 9197360 100% 3.73MB/s 0:00:02 (xfer#1, to-check=0/1) +[2014-05-25 21:47:21 CEST] RemoteControl: Syncing with diskstation + +sent 9198659 bytes received 42 bytes 2628200.29 bytes/sec +total size is 9197360 speedup is 1.00 +[2014-05-25 21:47:21 CEST] Transferrer: Uploaded 77_settin..ation.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7a6f85f..7457693 git-annex -> synced/git-annex + +WORM-s11971891-m1398387083--Learning SketchUp 2013%76_creating-the-exterior.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4784128 39% 4.52MB/s 0:00:01 + 8355840 69% 3.95MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 57437fb..394b254 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7457693b085f06be2a38cfaafb7c76b34eb62960 but expected 7a6f85f7864920fbcac361f47558fc352f1d2d16 + ! 7a6f85f..7457693 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 11971891 100% 4.15MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 11973511 bytes received 42 bytes 3421015.14 bytes/sec +total size is 11971891 speedup is 1.00 +[2014-05-25 21:47:25 CEST] Transferrer: Uploaded 76_creati..erior.mp4 +[2014-05-25 21:47:26 CEST] Pusher: Syncing with diskstation + +WORM-s6407146-m1398386568--Learning SketchUp 2013%75_saving-and-placing-into-the-model.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4390912 68% 4.14MB/s 0:00:00 + 6324224 98% 2.99MB/s 0:00:00 + 6407146 100% 3.02MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 6408097 bytes received 42 bytes 1830896.86 bytes/sec +total size is 6407146 speedup is 1.00 +[2014-05-25 21:47:28 CEST] Transferrer: Uploaded 75_saving..model.mp4 + +WORM-s8962345-m1398386088--Learning SketchUp 2013%74_adding-detail-chapter-13.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5144576 57% 4.78MB/s 0:00:00 + 8962345 100% 4.67MB/s 0:00:01 (xfer#1, to-check=0/1) +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + +sent 8963599 bytes received 42 bytes 2561040.29 bytes/sec +total size is 8962345 speedup is 1.00 + 7457693..ea4b518 git-annex -> synced/git-annex +[2014-05-25 21:47:31 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:47:31 CEST] Transferrer: Uploaded 74_adding..er-13.mp4 + +WORM-s7160845-m1398385888--Learning SketchUp 2013%73_applying-textures.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4816896 67% 4.45MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 394b254..c52b780 git-annex -> diskstation/git-annex + 7160845 100% 4.44MB/s 0:00:01 (xfer#1, to-check=0/1) + +sent 7161872 bytes received 42 bytes 2046261.14 bytes/sec +total size is 7160845 speedup is 1.00 +[2014-05-25 21:47:34 CEST] Transferrer: Uploaded 73_applyi..tures.mp4 + +WORM-s11661338-m1398385993--Learning SketchUp 2013%72_creating-the-massing-model.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:47:35 CEST] Pusher: Syncing with diskstation + 5341184 45% 4.97MB/s 0:00:01 + 8028160 68% 3.71MB/s 0:00:00 + 9601024 82% 2.97MB/s 0:00:00 + 11661338 100% 3.00MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 11662923 bytes received 42 bytes 2120539.09 bytes/sec +total size is 11661338 speedup is 1.00 +[2014-05-25 21:47:39 CEST] Transferrer: Uploaded 72_creati..model.mp4 + +WORM-s18351413-m1398385439--Learning SketchUp 2013%71_setting-up-to-match-a-new-photo.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4816896 26% 4.56MB/s 0:00:02 + 8945664 48% 4.23MB/s 0:00:02 +[2014-05-25 21:47:42 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + ea4b518..d1f5994 git-annex -> synced/git-annex + 13467648 73% 4.25MB/s 0:00:01 + 17104896 93% 4.04MB/s 0:00:00 + 18351413 100% 4.03MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 18353823 bytes received 42 bytes 3337066.36 bytes/sec +total size is 18351413 speedup is 1.00 +[2014-05-25 21:47:44 CEST] Transferrer: Uploaded 71_settin..photo.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c52b780..c25cca9 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at d1f5994466b35d4c32ad5a9bbb9dd071e461e3e2 but expected ea4b518d3f3234433b2819aa9965b5613366f1bb + ! ea4b518..d1f5994 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s13344990-m1398385353--Learning SketchUp 2013%70_creating-a-library.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3506176 26% 3.17MB/s 0:00:03 +[2014-05-25 21:47:47 CEST] Pusher: Syncing with diskstation + 6914048 51% 3.20MB/s 0:00:01 + 11337728 84% 3.52MB/s 0:00:00 + 13344990 100% 3.56MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 13346775 bytes received 42 bytes 2426694.00 bytes/sec +total size is 13344990 speedup is 1.00 +[2014-05-25 21:47:49 CEST] Transferrer: Uploaded 70_creati..brary.mp4 + +WORM-s9842222-m1398386008--Learning SketchUp 2013%69_using-the-podium-browser.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5275648 53% 4.88MB/s 0:00:00 + 8323072 84% 3.89MB/s 0:00:00 + 9842222 100% 3.92MB/s 0:00:02 (xfer#1, to-check=0/1) +[2014-05-25 21:47:52 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + d1f5994..33198fa git-annex -> synced/git-annex + +sent 9843584 bytes received 42 bytes 2812464.57 bytes/sec +total size is 9842222 speedup is 1.00 +[2014-05-25 21:47:53 CEST] Transferrer: Uploaded 69_using-..owser.mp4 + +WORM-s11662587-m1398385968--Learning SketchUp 2013%68_using-form-fonts.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4653056 39% 4.33MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c25cca9..2496e60 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 33198fa7a8195245180bb53efbdec32359506368 but expected d1f5994466b35d4c32ad5a9bbb9dd071e461e3e2 + ! d1f5994..33198fa synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 9437184 80% 4.41MB/s 0:00:00 + 11662587 100% 4.32MB/s 0:00:02 (xfer#1, to-check=0/1) +[2014-05-25 21:47:57 CEST] Pusher: Syncing with diskstation + +sent 11664162 bytes received 42 bytes 3332629.71 bytes/sec +total size is 11662587 speedup is 1.00 +[2014-05-25 21:47:57 CEST] Transferrer: Uploaded 68_using-..fonts.mp4 + +WORM-s8289672-m1398385702--Learning SketchUp 2013%67_using-the-3d-warehouse.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5439488 65% 4.99MB/s 0:00:00 +remote: merge git-annex 8289672 100% 4.48MB/s 0:00:01 (xfer#1, to-check=0/1) +[2014-05-25 21:48:00 CEST] RemoteControl: Syncing with diskstation + +sent 8290840 bytes received 42 bytes 3316352.80 bytes/sec +total size is 8289672 speedup is 1.00 +[2014-05-25 21:48:00 CEST] Transferrer: Uploaded 67_using-..house.mp4 + +WORM-s12841748-m1398385284--Learning SketchUp 2013%66_adding-the-fridge-and-sink.mp4 + 32768 0% 0.00kB/s 0:00:00 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 33198fa..f4258a2 git-annex -> synced/git-annex + 3899392 30% 3.62MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 2496e60..8f91b25 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at f4258a2cd12ee4f23f3a9c9b9c635b9d59075f21 but expected 33198fa7a8195245180bb53efbdec32359506368 + ! 33198fa..f4258a2 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:48:03 CEST] RemoteControl: Syncing with diskstation + 7897088 61% 3.69MB/s 0:00:01 + 11698176 91% 3.66MB/s 0:00:00 + 12841748 100% 3.72MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 12843477 bytes received 42 bytes 2335185.27 bytes/sec +total size is 12841748 speedup is 1.00 +[2014-05-25 21:48:05 CEST] Transferrer: Uploaded 66_adding..-sink.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8f91b25..c4dc443 git-annex -> diskstation/git-annex + +WORM-s15640646-m1398385334--Learning SketchUp 2013%65_adding-appliances.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5505024 35% 5.08MB/s 0:00:01 +[2014-05-25 21:48:07 CEST] Pusher: Syncing with diskstation + 9601024 61% 4.50MB/s 0:00:01 + 13860864 88% 4.32MB/s 0:00:00 + 15640646 100% 4.28MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 15642710 bytes received 42 bytes 3476167.11 bytes/sec +total size is 15640646 speedup is 1.00 +[2014-05-25 21:48:09 CEST] Transferrer: Uploaded 65_adding..ances.mp4 + +WORM-s14906076-m1398385849--Learning SketchUp 2013%64_adding-materials.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4620288 30% 4.38MB/s 0:00:02 +[2014-05-25 21:48:12 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + f4258a2..89ce825 git-annex -> synced/git-annex + 7700480 51% 3.61MB/s 0:00:01 + 10649600 71% 3.30MB/s 0:00:01 + 13467648 90% 3.13MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c4dc443..6fdf232 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 89ce825f4a57b9bc5490b2c0f7dc77e9b3cf0016 but expected f4258a2cd12ee4f23f3a9c9b9c635b9d59075f21 + ! f4258a2..89ce825 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 14906076 100% 3.07MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 14908047 bytes received 42 bytes 2293552.15 bytes/sec +total size is 14906076 speedup is 1.00 +[2014-05-25 21:48:15 CEST] Transferrer: Uploaded 64_adding..rials.mp4 + +WORM-s9700735-m1398385733--Learning SketchUp 2013%63_creating-the-countertop.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4554752 46% 4.18MB/s 0:00:01 +[2014-05-25 21:48:17 CEST] Pusher: Syncing with diskstation + 7569408 78% 3.53MB/s 0:00:00 + 9700735 100% 3.40MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 9702080 bytes received 42 bytes 2156027.11 bytes/sec +total size is 9700735 speedup is 1.00 +[2014-05-25 21:48:19 CEST] Transferrer: Uploaded 63_creati..ertop.mp4 + +WORM-s15089043-m1398386778--Learning SketchUp 2013%62_cabinet-doors.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 4456448 29% 4.05MB/s 0:00:02 + 7340032 48% 3.36MB/s 0:00:02 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 89ce825..be1967a git-annex -> synced/git-annex +[2014-05-25 21:48:22 CEST] RemoteControl: Syncing with diskstation + 10223616 67% 3.12MB/s 0:00:01 + 13369344 88% 3.08MB/s 0:00:00 + 15089043 100% 3.02MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 15091035 bytes received 42 bytes 2321704.15 bytes/sec +total size is 15089043 speedup is 1.00 +[2014-05-25 21:48:25 CEST] Transferrer: Uploaded 62_cabine..doors.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 6fdf232..5d94435 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at be1967a15a951b38c76e4e8f674812a01df4c8c8 but expected 89ce825f4a57b9bc5490b2c0f7dc77e9b3cf0016 + ! 89ce825..be1967a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s10872872-m1398384973--Learning SketchUp 2013%61_wall-cabinets.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4194304 38% 3.90MB/s 0:00:01 +[2014-05-25 21:48:27 CEST] Pusher: Syncing with diskstation + 7208960 66% 3.34MB/s 0:00:01 + 10190848 93% 3.16MB/s 0:00:00 + 10872872 100% 3.14MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 10874348 bytes received 42 bytes 2416531.11 bytes/sec +total size is 10872872 speedup is 1.00 +remote: merge git-annex [2014-05-25 21:48:29 CEST] Transferrer: Uploaded 61_wall-c..inets.mp4 + +WORM-s14169006-m1398385488--Learning SketchUp 2013%60_base-cabinets.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4292608 30% 3.96MB/s 0:00:02 +[2014-05-25 21:48:31 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + be1967a..0c0e83a git-annex -> synced/git-annex + 7143424 50% 3.29MB/s 0:00:02 + 10289152 72% 3.16MB/s 0:00:01 + 13139968 92% 3.03MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 5d94435..c7aef43 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 0c0e83a4b729ed1ef86e4854405ec752226bbd09 but expected be1967a15a951b38c76e4e8f674812a01df4c8c8 + ! be1967a..0c0e83a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 14169006 100% 3.08MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 14170886 bytes received 42 bytes 2180142.77 bytes/sec +total size is 14169006 speedup is 1.00 +[2014-05-25 21:48:35 CEST] Transferrer: Uploaded 60_base-c..inets.mp4 +[2014-05-25 21:48:35 CEST] Pusher: Syncing with diskstation + +WORM-s13699702-m1398385658--Learning SketchUp 2013%59_adding-textures.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4063232 29% 3.80MB/s 0:00:02 +remote: merge git-annex 7503872 54% 3.54MB/s 0:00:01 + 11599872 84% 3.65MB/s 0:00:00 + 13699702 100% 3.75MB/s 0:00:03 (xfer#1, to-check=0/1) +[2014-05-25 21:48:41 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 0c0e83a..cd5b9c0 git-annex -> synced/git-annex + +sent 13701528 bytes received 42 bytes 3044793.33 bytes/sec +total size is 13699702 speedup is 1.00 +[2014-05-25 21:48:42 CEST] Transferrer: Uploaded 59_adding..tures.mp4 + +WORM-s10444949-m1398386483--Learning SketchUp 2013%58_mantle-support.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5177344 49% 4.89MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + c7aef43..e499593 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at cd5b9c01988d7c7b10730356ed55cc8b1422ce52 but expected 0c0e83a4b729ed1ef86e4854405ec752226bbd09 + ! 0c0e83a..cd5b9c0 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 9175040 87% 4.34MB/s 0:00:00 + 10444949 100% 3.92MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 10446374 bytes received 42 bytes 2984690.29 bytes/sec +total size is 10444949 speedup is 1.00 +[2014-05-25 21:48:46 CEST] Transferrer: Uploaded 58_mantle..pport.mp4 +[2014-05-25 21:48:46 CEST] Pusher: Syncing with diskstation + +WORM-s24021797-m1398385079--Learning SketchUp 2013%57_mantle-columns.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5079040 21% 4.81MB/s 0:00:03 + 9011200 37% 4.25MB/s 0:00:03 + 13041664 54% 4.09MB/s 0:00:02 +remote: merge git-annex 17006592 70% 3.97MB/s 0:00:01 + 20643840 85% 3.61MB/s 0:00:00 +[2014-05-25 21:48:52 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + cd5b9c0..7f4755f git-annex -> synced/git-annex + 23887872 99% 3.44MB/s 0:00:00 + 24021797 100% 3.69MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 24024882 bytes received 42 bytes 3203323.20 bytes/sec +total size is 24021797 speedup is 1.00 +[2014-05-25 21:48:53 CEST] Transferrer: Uploaded 57_mantle..lumns.mp4 + +WORM-s20301926-m1398385822--Learning SketchUp 2013%56_building-the-mantle.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e499593..a7e1df5 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 7f4755fe1b2fbe86253a5854d83948a479df1302 but expected cd5b9c01988d7c7b10730356ed55cc8b1422ce52 + ! cd5b9c0..7f4755f synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 4358144 21% 4.07MB/s 0:00:03 +[2014-05-25 21:48:55 CEST] Pusher: Syncing with diskstation + 7241728 35% 3.34MB/s 0:00:03 + 10125312 49% 3.14MB/s 0:00:03 + 13271040 65% 3.10MB/s 0:00:02 +remote: merge git-annex 16154624 79% 2.73MB/s 0:00:01 + 18972672 93% 2.74MB/s 0:00:00 +[2014-05-25 21:49:00 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 7f4755f..367f02c git-annex -> synced/git-annex + 20301926 100% 2.92MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 20304560 bytes received 42 bytes 2388776.71 bytes/sec +total size is 20301926 speedup is 1.00 +[2014-05-25 21:49:01 CEST] Transferrer: Uploaded 56_buildi..antle.mp4 + +WORM-s15278630-m1398386298--Learning SketchUp 2013%55_starting-at-the-base.mp4 + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + a7e1df5..200c73f git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 367f02ceec6d27fdb719156715a8a24a9f0cc149 but expected 7f4755fe1b2fbe86253a5854d83948a479df1302 + ! 7f4755f..367f02c synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 4653056 30% 4.41MB/s 0:00:02 + 7733248 50% 3.61MB/s 0:00:02 +[2014-05-25 21:49:04 CEST] Pusher: Syncing with diskstation + 10616832 69% 3.32MB/s 0:00:01 + 13500416 88% 3.14MB/s 0:00:00 + 15278630 100% 3.14MB/s 0:00:04 (xfer#1, to-check=0/1) +remote: merge git-annex +sent 15280653 bytes received 42 bytes 2350876.15 bytes/sec +total size is 15278630 speedup is 1.00 +[2014-05-25 21:49:07 CEST] Transferrer: Uploaded 55_starti..-base.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 367f02c..e9cb764 git-annex -> synced/git-annex + +WORM-s17900868-m1398386914--Learning SketchUp 2013%54_using-the-window-feature.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:49:08 CEST] RemoteControl: Syncing with diskstation + 4718592 26% 4.44MB/s 0:00:02 + 8290304 46% 3.92MB/s 0:00:02 + 12189696 68% 3.85MB/s 0:00:01 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 200c73f..e2eb7b5 git-annex -> diskstation/git-annex + 16482304 92% 3.88MB/s 0:00:00 + 17900868 100% 3.91MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 17903215 bytes received 42 bytes 2754347.23 bytes/sec +total size is 17900868 speedup is 1.00 +[2014-05-25 21:49:13 CEST] Pusher: Syncing with diskstation +[2014-05-25 21:49:13 CEST] Transferrer: Uploaded 54_using-..ature.mp4 + +WORM-s13516185-m1398386734--Learning SketchUp 2013%53_creating-walls-and-door-openings.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5242880 38% 4.94MB/s 0:00:01 + 9273344 68% 4.36MB/s 0:00:00 +remote: merge git-annex 13369344 98% 4.17MB/s 0:00:00 + 13516185 100% 4.17MB/s 0:00:03 (xfer#1, to-check=0/1) +[2014-05-25 21:49:18 CEST] RemoteControl: Syncing with diskstation + +sent 13518004 bytes received 42 bytes 3004010.22 bytes/sec +total size is 13516185 speedup is 1.00 +[2014-05-25 21:49:18 CEST] Transferrer: Uploaded 53_creati..nings.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + +WORM-s18590095-m1398385163--Learning SketchUp 2013%52_installing-bit-tools-plugins.mp4 + e9cb764..c7f1783 git-annex -> synced/git-annex + 32768 0% 0.00kB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + e2eb7b5..ff506d2 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at c7f178361d32682b60332b5c508a3ce0aec3925c but expected e9cb7644b684d418952b4132c725211eb045b260 + ! e9cb764..c7f1783 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) +[2014-05-25 21:49:19 CEST] RemoteControl: Syncing with diskstation + 4259840 22% 3.88MB/s 0:00:03 + 6684672 35% 3.09MB/s 0:00:03 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ff506d2..ff2bd4c git-annex -> diskstation/git-annex + 10813440 58% 3.36MB/s 0:00:02 +[2014-05-25 21:49:23 CEST] Pusher: Syncing with diskstation + 14876672 80% 3.46MB/s 0:00:01 + 18590095 100% 3.53MB/s 0:00:05 (xfer#1, to-check=0/1) + +sent 18592530 bytes received 42 bytes 2860395.69 bytes/sec +total size is 18590095 speedup is 1.00 +[2014-05-25 21:49:24 CEST] Transferrer: Uploaded 52_instal..ugins.mp4 + +WORM-s28284719-m1398385600--Learning SketchUp 2013%51_double-hung-windows.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5046272 17% 4.72MB/s 0:00:04 +remote: merge git-annex 9076736 32% 4.27MB/s 0:00:04 + 13303808 47% 4.16MB/s 0:00:03 +[2014-05-25 21:49:29 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + c7f1783..a39803a git-annex -> synced/git-annex + 16711680 59% 3.89MB/s 0:00:02 + 18841600 66% 3.14MB/s 0:00:02 + 21331968 75% 2.78MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + ff2bd4c..338767b git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at a39803aef5ce739ae6a6472a7de156efac31bebc but expected c7f178361d32682b60332b5c508a3ce0aec3925c + ! c7f1783..a39803a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 26050560 92% 2.89MB/s 0:00:00 + 28284719 100% 3.45MB/s 0:00:07 (xfer#1, to-check=0/1) + +sent 28288329 bytes received 42 bytes 2977723.26 bytes/sec +total size is 28284719 speedup is 1.00 +[2014-05-25 21:49:34 CEST] Transferrer: Uploaded 51_double..ndows.mp4 + +WORM-s16987083-m1398385579--Learning SketchUp 2013%50_creating-the-front-window-frame.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:49:35 CEST] Pusher: Syncing with diskstation + 5144576 30% 4.85MB/s 0:00:02 + 9371648 55% 4.39MB/s 0:00:01 + 11468800 67% 3.58MB/s 0:00:01 + 15859712 93% 3.72MB/s 0:00:00 + 16987083 100% 3.75MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 16989325 bytes received 42 bytes 3088975.82 bytes/sec +total size is 16987083 speedup is 1.00 +[2014-05-25 21:49:39 CEST] Transferrer: Uploaded 50_creati..frame.mp4 +remote: merge git-annex +WORM-s19055363-m1398385037--Learning SketchUp 2013%49_creating-doors.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5013504 26% 4.68MB/s 0:00:02 +[2014-05-25 21:49:41 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + a39803a..8462dc1 git-annex -> synced/git-annex + 9011200 47% 4.21MB/s 0:00:02 + 13041664 68% 4.05MB/s 0:00:01 + 16351232 85% 3.83MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 338767b..47c33b6 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 8462dc1c099c64ff94d5d35cb2f2efaff89b028e but expected a39803aef5ce739ae6a6472a7de156efac31bebc + ! a39803a..8462dc1 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 19055363 100% 3.97MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 19057840 bytes received 42 bytes 2931981.85 bytes/sec +total size is 19055363 speedup is 1.00 +[2014-05-25 21:49:46 CEST] Pusher: Syncing with diskstation +[2014-05-25 21:49:46 CEST] Transferrer: Uploaded 49_creati..doors.mp4 + +WORM-s11184398-m1398385463--Learning SketchUp 2013%48_review-of-components-and-nested-groups.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3375104 30% 2.72MB/s 0:00:02 + 5603328 50% 2.38MB/s 0:00:02 +remote: merge git-annex 9371648 83% 2.75MB/s 0:00:00 + 11184398 100% 2.89MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 11185939 bytes received 42 bytes 2033814.73 bytes/sec +total size is 11184398 speedup is 1.00 +[2014-05-25 21:49:52 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:49:52 CEST] Transferrer: Uploaded 48_review..roups.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 8462dc1..877c07a git-annex -> synced/git-annex + +WORM-s19612237-m1398385719--Learning SketchUp 2013%47_adding-railing.mp4 + 32768 0% 0.00kB/s 0:00:00 + 3997696 20% 3.75MB/s 0:00:04 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 47c33b6..bb182f5 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 877c07ad78a25ddf859ac96049ec938fa9b0b5f3 but expected 8462dc1c099c64ff94d5d35cb2f2efaff89b028e + ! 8462dc1..877c07a synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 8257536 42% 3.88MB/s 0:00:02 + 12845056 65% 4.02MB/s 0:00:01 + 17039360 86% 4.00MB/s 0:00:00 +[2014-05-25 21:49:57 CEST] Pusher: Syncing with diskstation + 19612237 100% 3.99MB/s 0:00:04 (xfer#1, to-check=0/1) + +sent 19614782 bytes received 42 bytes 3017665.23 bytes/sec +total size is 19612237 speedup is 1.00 +[2014-05-25 21:49:58 CEST] Transferrer: Uploaded 47_adding..iling.mp4 + +WORM-s23427266-m1398386041--Learning SketchUp 2013%46_adding-spindles-with-move-and-copy.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4128768 17% 3.80MB/s 0:00:04 +remote: merge git-annex 7176192 30% 3.33MB/s 0:00:04 + 11304960 48% 3.53MB/s 0:00:03 +[2014-05-25 21:50:02 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 877c07a..873eda1 git-annex -> synced/git-annex + 15138816 64% 3.53MB/s 0:00:02 + 18644992 79% 3.42MB/s 0:00:01 + 21135360 90% 3.29MB/s 0:00:00 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + bb182f5..470a1af git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 873eda1fd0b52f509bbd03a02ec5a3d6d8085488 but expected 877c07ad78a25ddf859ac96049ec938fa9b0b5f3 + ! 877c07a..873eda1 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 23427266 100% 3.17MB/s 0:00:07 (xfer#1, to-check=0/1) + +sent 23430295 bytes received 42 bytes 2756510.24 bytes/sec +total size is 23427266 speedup is 1.00 +[2014-05-25 21:50:06 CEST] Transferrer: Uploaded 46_adding..-copy.mp4 + +WORM-s28584390-m1398385775--Learning SketchUp 2013%45_making-a-unique-bottom-step.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:50:07 CEST] Pusher: Syncing with diskstation + 5472256 19% 4.96MB/s 0:00:04 + 9895936 34% 4.53MB/s 0:00:04 + 14221312 49% 4.40MB/s 0:00:03 +remote: merge git-annex 18055168 63% 4.21MB/s 0:00:02 + 22609920 79% 4.05MB/s 0:00:01 +[2014-05-25 21:50:12 CEST] RemoteControl: Syncing with diskstation +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 873eda1..274fd99 git-annex -> synced/git-annex + 26279936 91% 3.88MB/s 0:00:00 + 28584390 100% 4.06MB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 28588044 bytes received 42 bytes 3363304.24 bytes/sec +total size is 28584390 speedup is 1.00 +[2014-05-25 21:50:14 CEST] Transferrer: Uploaded 45_making..-step.mp4 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 470a1af..989e8b5 git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at 274fd99803c01b7911e45dcb050480eb4bfe2a82 but expected 873eda1fd0b52f509bbd03a02ec5a3d6d8085488 + ! 873eda1..274fd99 synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + +WORM-s24162552-m1398385100--Learning SketchUp 2013%44_adding-riser-detail.mp4 + 32768 0% 0.00kB/s 0:00:00 + 5341184 22% 5.06MB/s 0:00:03 +[2014-05-25 21:50:17 CEST] Pusher: Syncing with diskstation + 9240576 38% 4.38MB/s 0:00:03 + 13959168 57% 4.38MB/s 0:00:02 + 18153472 75% 4.28MB/s 0:00:01 +remote: merge git-annex 22347776 92% 4.00MB/s 0:00:00 + 24162552 100% 4.15MB/s 0:00:05 (xfer#1, to-check=0/1) +[2014-05-25 21:50:22 CEST] RemoteControl: Syncing with diskstation + +sent 24165658 bytes received 42 bytes 3222093.33 bytes/sec +total size is 24162552 speedup is 1.00 +[2014-05-25 21:50:22 CEST] Transferrer: Uploaded 44_adding..etail.mp4 +(merging synced/git-annex into git-annex...) +remote: (Recording state in git...) +remote: ok +remote: (Recording state in git...) +To joern@annex.diskstation.local:/volume1/homes/joern/Annex.movies + 274fd99..baa9cda git-annex -> synced/git-annex + +WORM-s14814183-m1398385868--Learning SketchUp 2013%43_creating-the-staircase.mp4 + 32768 0% 0.00kB/s 0:00:00 + 4947968 33% 4.69MB/s 0:00:02 +From annex.diskstation.local:/volume1/homes/joern/Annex.movies + 989e8b5..c15470f git-annex -> diskstation/git-annex +error: Ref refs/remotes/diskstation/synced/git-annex is at baa9cdae739f6bc1f928d9abe82c0f83b6645093 but expected 274fd99803c01b7911e45dcb050480eb4bfe2a82 + ! 274fd99..baa9cda synced/git-annex -> diskstation/synced/git-annex (unable to update local ref) + 9011200 60% 4.25MB/s 0:00:01 + 13729792 92% 4.31MB/s 0:00:00 + 14814183 100% 4.30MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 14816152 bytes received 42 bytes 2693853.45 bytes/sec +total size is 14814183 speedup is 1.00 +[2014-05-25 21:50:27 CEST] Transferrer: Uploaded 43_creati..rcase.mp4 + +WORM-s14506973-m1398386318--Learning SketchUp 2013%42_why-we-use-groups-and-components.mp4 + 32768 0% 0.00kB/s 0:00:00 +[2014-05-25 21:50:27 CEST] Pusher: Syncing with diskstation + 5341184 36% 5.04MB/s 0:00:01 + 9633792 66% 4.55MB/s 0:00:01 + 13926400 95% 4.37MB/s 0:00:00 + 14506973 100% 4.38MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 14508912 bytes received 42 bytes 3224212.00 bytes/sec +total size is 14506973 speedup is 1.00 +[2014-05-25 21:50:31 CEST] Transferrer: Uploaded 42_why-we..nents.mp4 + +WORM-s11494983-m1398385388--Learning SketchUp 2013%41_copy-and-paste-in-place.mp4 + 32768 0% 0.00kB/s 0:00:00 +remote: merge git-annex 5210112 45% 4.82MB/s 0:00:01 + 9404416 81% 4.37MB/s 0:00:00 + 11494983 100% 4.21MB/s 0:00:02 (xfer#1, to-check=0/1) + +sent 11496545 bytes received 42 bytes 3284739.14 bytes/sec +total size is 11494983 speedup is 1.00 +[2014-05-25 21:50:34 CEST] RemoteControl: Syncing with diskstation +[2014-05-25 21:50:34 CEST] Transferrer: Uploaded 41_copy-a..place.mp4 + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment b/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment new file mode 100644 index 000000000..382b3a8b7 --- /dev/null +++ b/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-30T19:15:33Z" + content=""" +What I see in the log is git-annex is syncing files to/from the remote \"diskstation\". This remote is not encrypted at all, so git-annex is not using gpg. There is no mention of gpg in the log at all. + +So, I don't see any indication that whatever is causing too many gpg-agent processes to be spawned is git-annex. Can you share more information that would point toward git-annex being the cause of this problem? +"""]] diff --git a/doc/bugs/gpg_does_not_ask_for_password_inside_tmux.mdwn b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux.mdwn new file mode 100644 index 000000000..7dbcf3048 --- /dev/null +++ b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. + +When commands that need gpg like `git annex copy` are run inside tmux, the GPG prompt does not show up and the user cannot give their password. + +Running the same command outside tmux causes GPG to properly show its prompt + +### What steps will reproduce the problem? + + $ tmux + TMUX$ GIT_ANNEX_ROOT/runshell + TMUX$ git annex copy --not -in remote --to remote + +git-annex will show the name of the first filename but will get stuck soon after that, waiting for GPG. + +### What version of git-annex are you using? On what operating system? + +git-annex 5.20140708-g8c9cc55c from the precompiled binaries, run inside tmux 1.6. + +`tmux.conf` contains `set-option -g default-command $SHELL` (this means that a normal shell is spawned, not a login shell) + +Ubuntu 12.04.4 + +[[!tag moreinfo]] + +> [[done]]; apparently a local misconfiguration of some sort. --[[Joey]] diff --git a/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_1_053b12e8b412723ff1d6b4e64e71af9e._comment b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_1_053b12e8b412723ff1d6b4e64e71af9e._comment new file mode 100644 index 000000000..0359be528 --- /dev/null +++ b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_1_053b12e8b412723ff1d6b4e64e71af9e._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T18:24:17Z" + content=""" +I cannot reproduce this. I made sure to unset `GPG_AGENT_INFO` so gpg would need to prompt for a password on the terminal, and it did. + +
+joey@darkstar:~/tmp/r>unset GPG_AGENT_INFO 
+joey@darkstar:~/tmp/r>git annex copy --to remote
+copy n/xxx (gpg) 
+You need a passphrase to unlock the secret key for
+user: \"Joey Hess \"
+4096-bit RSA key, ID 17065459, created 2009-06-17 (main key ID 2512E3C7)
+
+gpg: gpg-agent is not available in this session
+Enter passphrase: 
+
+ +I cannot think of anything that would make gpg's password prompting behave differently inside tmux than outside, either. + +I think that to debug this, you are going to need to look at what the gpg process is trying to do. +"""]] diff --git a/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_2_44830ba952cad3b153249bd405671507._comment b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_2_44830ba952cad3b153249bd405671507._comment new file mode 100644 index 000000000..28756f654 --- /dev/null +++ b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_2_44830ba952cad3b153249bd405671507._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://svario.it/gioele" + nickname="gioele" + subject="GPG_AGENT_INFO was already set in the outside shell" + date="2014-07-11T07:19:45Z" + content=""" +I found what the problem is: GPG_AGENT_INFO was already set in the outside shell. + +Unsetting GPG_AGENT_INFO fixes the problem. +"""]] diff --git a/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_3_a63db33a1dc70e64418de8b4bea6a9fa._comment b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_3_a63db33a1dc70e64418de8b4bea6a9fa._comment new file mode 100644 index 000000000..4f5428b87 --- /dev/null +++ b/doc/bugs/gpg_does_not_ask_for_password_inside_tmux/comment_3_a63db33a1dc70e64418de8b4bea6a9fa._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-11T18:15:09Z" + content=""" +AFAICS there is no problem with GPG_AGENT_INFO being set while using tmux. The gpg agent works as usual and pops up a passphrase prompt window. + +Is there something broken in your gpg agent that prevents it from working inside tmux, or working at all? In any case, this seems like a local misconfiruation problem and out of git-annex's scope anyway so I suppose I will close the bug. + +"""]] diff --git a/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn new file mode 100644 index 000000000..5f36a7cd0 --- /dev/null +++ b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +Bad input data given to gpg will make it lock. + +### What steps will reproduce the problem? +Trying to download gpg encrypted data from remote with bad/incorrect data + +### What version of git-annex are you using? On what operating system? +4.20130501-gd9e288b, on ubuntu 13.04 + +### Please provide any additional information below. +Transcript +http://paste.ubuntu.com/5626517/ + +Note: The problem is most likely caused by bad data from either the nntp hooks program, or the nntp server itself. + +I also have one file with bad data that consistently is NOT a problem for gpg to handle(lines 24-25 of log). + +[[!tag moreinfo]] diff --git a/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment new file mode 100644 index 000000000..43211bdd8 --- /dev/null +++ b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-06T17:09:58Z" + content=""" +What version of gnupg do you have installed? + +
+gpg: block_filter 0x946320: read error (size=12864,a->size=12864)
+gpg: [don't know]: invalid packet (ctb=68)
+gpg: [don't know]: invalid packet (ctb=21)
+gpg: mdc_packet with invalid encoding
+gpg: decryption failed: invalid packet
+gpg: [don't know]: invalid packet (ctb=00)
+gpg: block_filter: pending bytes!
+
+ +I don't see how git-annex can possibly guard against gpg behaving this way when given bad data. So the best thing to do would be to get a test case file that causes gpg to behave this way, and then I could file a bug on gpg and get it fixed to immediately exit. + +I tried to reproduce this by encrypting a 1 mb file with gpg. This yeilded a 1.1 mb file. I then truncated it back to 1 mb, and tried to decrypt it. + +[[!format sh \"\"\" +joey@gnu:~>gpg --decrypt me2.gpg > x +gpg: encrypted with 1 passphrase +gpg: block_filter 0x9d6fda0: read error (size=15680,a->size=15680) +gpg: Problem reading source (8570 bytes remaining) +gpg: handle plaintext failed: file read error +gpg: mdc_packet with invalid encoding +gpg: decryption failed: invalid packet +gpg: block_filter: pending bytes! +zsh: exit 2 gpg --decrypt +\"\"\"]] + +gpg exited immediately on error, which is what it should do. So it doesn't seem likely I can guess at a test case file that causes gpg to behave this way. You will need to provide one for me to help. +"""]] diff --git a/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__.mdwn b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__.mdwn new file mode 100644 index 000000000..afc95b6ce --- /dev/null +++ b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +shiny-2:MacOS ovi$ git annex sync +git: 'annex' is not a git command. See 'git --help'. +shiny-2:MacOS ovi$ + +### What steps will reproduce the problem? +INstall git-annex for MAC like this: http://git-annex.branchable.com/install/OSX/ via .dmg file then try above commands from your terminal + +### What version of git-annex are you using? On what operating system? +Version: 5.20140420-ga25b8bb Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +Mac OSX 10.9.2 + +### Please provide any additional information below. +I tried adding the path to my .bash_profile manually like this but it didn't help (actually, this was already in there, I just added the path to git-annex to the string): +export PATH=/opt/local/bin:/opt/local/sbin/Applications/git-annex.app/Contents/MacOS:$PATH + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> To the extent this is a bug report, it's a duplicate of +> [[standalone_tarball_symlink_to_PATH_broken]]. +> [[closing dup|done]]. --[[Joey]] diff --git a/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_1_780fbb7b8dda331503064dfa6bcabaa3._comment b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_1_780fbb7b8dda331503064dfa6bcabaa3._comment new file mode 100644 index 000000000..5d7dd9493 --- /dev/null +++ b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_1_780fbb7b8dda331503064dfa6bcabaa3._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T17:17:54Z" + content=""" +Here's how I do it: + +
+$ oberon:tmp joeyh$ hdiutil attach git-annex.dmg
+$ oberon:tmp joeyh$  /Volumes/git-annex/git-annex.app/Contents/MacOS/git-annex version
+git-annex version: 5.20140516-g693a6a4
+oberon:tmp joeyh$ PATH=$PATH:/Volumes/git-annex/git-annex.app/Contents/MacOS/
+oberon:tmp joeyh$ git-annex version
+git-annex version: 5.20140516-g693a6a4
+
+ +So, adding to PATH works fine. Perhaps you added the wrong directory to your PATH. + +Note that .bash_profile is only used for bash login shells. It may not be run when you open a terminal, or when git-annex ssh's in from elsewhere to run git-annex-shell (which you seem to be asking about, but only in the title of this page?). + +In particular, bash does not provide any way to set the PATH which works when you run \"ssh yourcomputer git-annex-shell\". So you will need to instead move the git-annex files into a directory that is in the default PATH. +"""]] diff --git a/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_2_1785e99846998aa50e1c62a88b558196._comment b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_2_1785e99846998aa50e1c62a88b558196._comment new file mode 100644 index 000000000..e5d09ec64 --- /dev/null +++ b/doc/bugs/how_to_get_git-annex_shell_on_MAC__63__/comment_2_1785e99846998aa50e1c62a88b558196._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 2" + date="2014-05-16T17:23:32Z" + content=""" +Thanks for the additional info, for now its working fine: + +git-annex version +git-annex version: 5.20140420-ga25b8bb +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +"""]] diff --git a/doc/bugs/id__95__rsa_on_android.mdwn b/doc/bugs/id__95__rsa_on_android.mdwn new file mode 100644 index 000000000..2aadd6c40 --- /dev/null +++ b/doc/bugs/id__95__rsa_on_android.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +I generated id_rsa and id_rsa.pub from the android shell. +After copying the id_rsa.pub file on my server, ssh on android complains because id_rsa permissions on the phone are too open (660). +Chmod 600 id_rsa on /sdcard/git-annex.home/.ssh/id_rsa has no effect, i.e. permissions remain 660. + +### What steps will reproduce the problem? +use ssh-keygen to generate keys, default location is /sdcard/git-annex.home/.ssh/ +copy id_rsa.pub on ssh server, try to connect from android to ssh server. + + +### What version of git-annex are you using? On what operating system? +latest git-annex.apk (2014-03-06) on android 4.4.2 + +### Please provide any additional information below. + + +root@android:/ # /data/data/ga.androidterm/runshell +Falling back to hardcoded app location; cannot find expected files in /data/app-lib + +root@android:/sdcard/git-annex.home # ssh MYSERVERIP -p PORT -l USERNAME + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: UNPROTECTED PRIVATE KEY FILE! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +Permissions 0660 for '/sdcard/git-annex.home/.ssh/id_rsa' are too open. +It is required that your private key files are NOT accessible by others. +This private key will be ignored. +bad permissions: ignore key: /sdcard/git-annex.home/.ssh/id_rsa + + +> [[fixed|done]]; daily build is updated. --[[Joey]] diff --git a/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment b/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment new file mode 100644 index 000000000..0a5a9e230 --- /dev/null +++ b/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-03-10T21:20:10Z" + content=""" +Hmm, I know that I and others have used git-annex on android with ssh, without encountering this problem. Odd. Oh well, was already patching out many other permissions checks in ssh, so added this one to the pile. +"""]] diff --git a/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment b/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment new file mode 100644 index 000000000..8500c41e5 --- /dev/null +++ b/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://smcv.pseudorandom.co.uk/" + nickname="smcv" + subject="comment 2" + date="2014-03-12T07:54:08Z" + content=""" +Would it be better to put the home directory under git-annex' directory +in `/data`, so it isn't available to every app (and every user, if more +than one) on the device? If other apps can write to its `.gitconfig` +then I think they can make git-annex run arbitrary code with its own +permissions. +"""]] diff --git a/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment b/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment new file mode 100644 index 000000000..b972139a6 --- /dev/null +++ b/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-12T19:45:24Z" + content=""" +Well, that would simplify the ssh patching. + +Putting a git repository on /sdcard also allows other apps to do things with .git/config. I don't know if git-annex has permissions other apps might want to exploit.. Maybe the ability to use the network? +"""]] diff --git a/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn new file mode 100644 index 000000000..115b8a750 --- /dev/null +++ b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. + +git-annex exists with "illegal hardware instruction" on OSX + +### What steps will reproduce the problem? + +git annex webapp + +### What version of git-annex are you using? On what operating system? + +git annex 5.20131230-g9a495e6 +OSX 10.9.1 + +### Please provide any additional information below. + +[[!format sh """ + +start git assistant with "git annex web app" +safari open tab, but shows connection refused +git annex crashed with "illegal hardware instruction" + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment new file mode 100644 index 000000000..2b9f629b1 --- /dev/null +++ b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-07T15:37:18Z" + content=""" +This problem is fixed in the daily build. +"""]] diff --git a/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn b/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn new file mode 100644 index 000000000..50037246d --- /dev/null +++ b/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. + +I have found various `.tmp` files in a directory in which I performed various `git annex import` that failed because the destination disk was full. + +These files should be removed when import detects that its has no more space to proceed and exists. + +### What version of git-annex are you using? On what operating system? + +git-annex 5.20140517.4 in Ubuntu 12.04. + +> The ".tmp" means this dropping is left by viaTmp, and I see why. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/import_memleak_from_the_assistant.mdwn b/doc/bugs/import_memleak_from_the_assistant.mdwn new file mode 100644 index 000000000..5a0a0225b --- /dev/null +++ b/doc/bugs/import_memleak_from_the_assistant.mdwn @@ -0,0 +1,1608 @@ +### Please describe the problem. +Git annex daemon are memleaking abundantly thus making it unusable for a long period of time. It is currently taking 38.8% of my available ram (8go) and has been launched arround 14h today. + +### What steps will reproduce the problem? +The assistant has been launched using "git annex assistant" on a repository +created by the Webapp (the Webapp wasn't running at that time). + +If I simply launch the Webapp, I've got the same result of memleaking. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131213 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +On Ubuntu LTS using the ppa. + +### Please provide any additional information below. +This daemon.log come from a very fast moving repository but this also happen on other way slower moving repositories. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +me@dolgoff ~/public/.git/annex ps avx | grep git +14647 pts/7 S+ 0:00 0 150 13493 948 0.0 grep -i --color=auto git +15910 ? Sl 273:24 0 39530 3879109 3207152 39.3 git-annex assistant +15925 ? R 134:10 1439 1283 544320 35660 0.4 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch +15972 ? S 0:01 114 1283 530064 10576 0.1 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch +16120 ? SN 0:00 0 1283 18196 1156 0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false check-attr -z --stdin annex.backend annex.numcopies -- +25646 ? SNl 0:01 0 42547 222616 22132 0.2 git-annex transferkeys +25667 ? SN 0:00 0 1447 117648 1976 0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch +25677 ? SNs 0:00 0 410 42657 2620 0.0 ssh: .git/annex/ssh/griboiedov [mux] + +daemon.log +[2013-12-23 21:04:24 CET] NetWatcherFallback: Syncing with origin +From griboiedov:public + 331ab7e..763310f annex/direct/master -> origin/annex/direct/master + 4caf626..2171219 git-annex -> origin/git-annex + 73c5341..153ec5a synced/master -> origin/synced/master +Updating 73c5341..763310f +Fast-forward +Auto packing the repository for optimum performance. You may also +run "git gc" manually. See "git help gc" for more information. +warning: There are too many unreachable loose objects; run 'git prune' to remove them. + mails/.mhonarc.db | 2 +- + mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} | 0 + mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} | 0 + mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} | 0 + mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} | 0 + mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} | 0 + mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} | 0 + mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} | 0 + mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} | 0 + mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} | 0 + mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} | 0 + mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} | 0 + mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} | 0 + mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} | 0 + mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} | 0 + mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} | 0 + mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} | 0 + mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} | 0 + mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} | 0 + mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} | 0 + mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} | 0 + mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} | 0 + mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} | 0 + mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} | 0 + mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} | 0 + mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} | 0 + mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} | 0 + mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} | 0 + mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} | 0 + mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} | 0 + mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} | 0 + mails/msg00006.html | 2 +- + mails/msg00018.html | 2 +- + mails/msg00023.html | 2 +- + mails/msg00024.html | 2 +- + mails/msg00025.html | 2 +- + mails/msg00026.html | 2 +- + mails/msg00027.html | 2 +- + mails/msg00028.html | 2 +- + mails/msg00032.html | 2 +- + mails/msg00040.html | 2 +- + mails/msg00041.html | 2 +- + mails/msg00042.html | 2 +- + mails/msg00055.html | 2 +- + mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} | 0 + mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} | 0 + mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} | 0 + mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} | 0 + mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} | 0 + mails/{pngKStItI4meN.png => png9O3vtGcotx.png} | 0 + mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} | 0 + 51 files changed, 14 insertions(+), 14 deletions(-) + rename mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} (100%) + rename mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} (100%) + rename mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} (100%) + rename mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} (100%) + rename mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} (100%) + rename mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} (100%) + rename mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} (100%) + rename mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} (100%) + rename mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} (100%) + rename mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} (100%) + rename mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} (100%) + rename mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} (100%) + rename mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} (100%) + rename mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} (100%) + rename mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} (100%) + rename mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} (100%) + rename mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} (100%) + rename mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} (100%) + rename mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} (100%) + rename mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} (100%) + rename mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} (100%) + rename mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} (100%) + rename mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} (100%) + rename mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} (100%) + rename mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} (100%) + rename mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} (100%) + rename mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} (100%) + rename mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} (100%) + rename mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} (100%) + rename mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} (100%) + rename mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} (100%) + rename mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} (100%) + rename mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} (100%) + rename mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} (100%) + rename mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} (100%) + rename mails/{pngKStItI4meN.png => png9O3vtGcotx.png} (100%) + rename mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} (100%) +[2013-12-23 21:04:40 CET] Committer: Committing changes to git +[2013-12-23 21:04:40 CET] Pusher: Syncing with public, dolgoff, origin +error: Ref refs/heads/synced/git-annex is at 4f98427ba635b1548da21b5e6e1a84c49f708284 but expected 217121951ca4ede24d91fe92acee9061a527ba93 +remote: error: failed to lock refs/heads/synced/git-annex +Auto packing the repository for optimum performance. +Auto packing the repository for optimum performance. +fatal: Unable to create '/home/me/public/.git/packed-refs.lock': Le fichier existe. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +error: failed to run pack-refs +To /home/me/public + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to '/home/me/public' +[2013-12-23 21:04:42 CET] Committer: Adding pngBkJAx0zfhF.png png9O3vtGcotx.png pgpBKaIcivKYa.pgp pdfU9I3NUvHOG.pdf pdfPePGLsDAym.pdf pdfDH4ZUAcsJE.pdf pdf82oysVxMKf.pdf msg00040.html msg00032.html and 39 other files +ok +(Recording state in git...) +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) + +(Recording state in git...) +(Recording state in git...) +add mails/pngBkJAx0zfhF.png ok +add mails/png9O3vtGcotx.png ok +add mails/pgpBKaIcivKYa.pgp ok +add mails/pdfU9I3NUvHOG.pdf ok +add mails/pdfPePGLsDAym.pdf ok +add mails/pdfDH4ZUAcsJE.pdf ok +add mails/pdf82oysVxMKf.pdf ok +add mails/msg00040.html ok +add mails/msg00032.html ok +add mails/msg00028.html ok +add mails/msg00027.html ok +add mails/msg00026.html ok +add mails/msg00025.html ok +add mails/msg00024.html ok +add mails/msg00023.html ok +add mails/msg00018.html ok +add mails/msg00006.html ok +add mails/jpgyDMQ3JRqJQ.jpg ok +add mails/jpgwgZCUHCRLD.jpg ok +add mails/jpgtvEG4unHFl.jpg ok +add mails/jpgrzViZx_4aI.jpg ok +add mails/jpgpIVZxq60Dk.jpg ok +add mails/jpgoHLfpoWcUO.jpg ok +add mails/jpgmFXSd2Dp97.jpg ok +add mails/jpgmFXSd2Dp97.jpg ok +add mails/jpgkU70wDyd7n.jpg ok +add mails/jpgjY_paWcDcr.jpg ok +add mails/jpgim5vpaDawh.jpg ok +add mails/jpghvPaq3_Be0.jpg ok +add mails/jpgh1EzKSHWvb.jpg ok +add mails/jpgdQNUXemgWT.jpg ok +add mails/jpgbS7_tLed4m.jpg ok +add mails/jpgbS7_tLed4m.jpg ok +add mails/jpgVzzX55uqdu.jpg ok +add mails/jpgVzzX55uqdu.jpg ok +add mails/jpgVt3cWtM2fp.jpg ok +add mails/jpgV1Ek5XTDpl.jpg ok +add mails/jpgV1Ek5XTDpl.jpg ok +add mails/jpgU2vrhPtw4a.jpg ok +add mails/jpgU2vrhPtw4a.jpg ok +add mails/jpgScmPPKPHFq.jpg ok +add mails/jpgScmPPKPHFq.jpg ok +add mails/jpgMi7I6uLnaD.jpg ok +add mails/jpgMi7I6uLnaD.jpg ok +add mails/jpgKyEVJPJdPY.jpg ok +add mails/jpgKyEVJPJdPY.jpg ok +add mails/jpgK4Lmnj5kJU.jpg ok +add mails/jpgK4Lmnj5kJU.jpg ok +add mails/jpgJnSKE5skVx.jpg ok +add mails/jpgCw4FBEkcOV.jpg ok +add mails/jpgCw4FBEkcOV.jpg ok +add mails/jpgCfz3HNRLYo.jpg ok +add mails/jpgCfz3HNRLYo.jpg ok +add mails/jpgAsv158YPXC.jpg ok +add mails/jpgAsv158YPXC.jpg ok +add mails/jpgAU20k3zk5w.jpg ok +add mails/jpgAU20k3zk5w.jpg ok +add mails/jpg9a_S8ignCJ.jpg ok +add mails/jpg9a_S8ignCJ.jpg ok +add mails/binuVoVGDloKB.bin ok +add mails/binjMrfB7aM7s.bin ok +add mails/binjMrfB7aM7s.bin ok +add mails/.mhonarc.db [2013-12-23 21:04:43 CET] Committer: Committing changes to git +[2013-12-23 21:04:43 CET] Transferrer: Uploaded msg00028.html +[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgyDMQ3JRqJQ.jpg +[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgkU70wDyd7n.jpg +[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgVt3cWtM2fp.jpg +[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgKyEVJPJdPY.jpg +[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgAsv158YPXC.jpg +[2013-12-23 21:04:43 CET] Transferrer: Uploaded .mhonarc.db +[2013-12-23 21:04:48 CET] Committer: Adding msg00041.html +ok +(Recording state in git...) +add mails/msg00041.html [2013-12-23 21:04:48 CET] Committer: Committing changes to git +warning: There are too many unreachable loose objects; run 'git prune' to remove them. +To /home/me/public + 2171219..4f98427 git-annex -> synced/git-annex +error: Ref refs/heads/synced/git-annex is at 90996528a22e94d52911e1abc8b90eb451d40dee but expected b0f556fff29e038eba46c95fecb4d1cc57d7dacd +remote: error: failed to lock refs/heads/synced/git-annex +To griboiedov:public + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to 'griboiedov:public' +To griboiedov:public + b0f556f..9099652 git-annex -> synced/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +From /home/me/public + 73c5341..763310f annex/direct/master -> dolgoff/annex/direct/master + e326ebb..c8c86fe git-annex -> dolgoff/git-annex + e326ebb..4f98427 synced/git-annex -> dolgoff/synced/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-12-23 21:04:59 CET] Committer: Adding msg00042.html +ok +(Recording state in git...) +add mails/msg00042.html [2013-12-23 21:04:59 CET] Committer: Committing changes to git +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +From griboiedov:public + 2171219..c7b4195 git-annex -> origin/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +Auto packing the repository for optimum performance. +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-12-23 21:05:07 CET] Committer: Adding msg00055.html +ok +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) +add mails/msg00055.html [2013-12-23 21:05:07 CET] Committer: Committing changes to git +To griboiedov:public + 9099652..c8c86fe git-annex -> synced/git-annex +warning: There are too many unreachable loose objects; run 'git prune' to remove them. +To /home/me/public + c7b4195..c6278b9 git-annex -> synced/git-annex +[2013-12-23 21:05:13 CET] Pusher: Syncing with public, dolgoff, origin +fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +Auto packing the repository for optimum performance. +To griboiedov:public + c8c86fe..c6278b9 git-annex -> synced/git-annex +warning: There are too many unreachable loose objects; run 'git prune' to remove them. +To /home/me/public + c6278b9..fe337a3 git-annex -> synced/git-annex +From /home/me/public + c8c86fe..fe337a3 git-annex -> dolgoff/git-annex + c6278b9..fe337a3 synced/git-annex -> dolgoff/synced/git-annex +Everything up-to-date +[2013-12-23 22:04:54 CET] NetWatcherFallback: Syncing with origin +From griboiedov:public + 763310f..4a82c94 annex/direct/master -> origin/annex/direct/master + c7b4195..4051e5f git-annex -> origin/git-annex + 763310f..4a82c94 synced/master -> origin/synced/master +Updating 763310f..4a82c94 +Fast-forward +Auto packing the repository for optimum performance. You may also +run "git gc" manually. See "git help gc" for more information. +warning: There are too many unreachable loose objects; run 'git prune' to remove them. + code.html | 2 +- + libre.html | 2 +- + mails/.mhonarc.db | 2 +- + mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} | 0 + mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} | 0 + mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} | 0 + mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} | 0 + mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} | 0 + mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} | 0 + mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} | 0 + mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} | 0 + mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} | 0 + mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} | 0 + mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} | 0 + mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} | 0 + mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} | 0 + mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} | 0 + mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} | 0 + mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} | 0 + mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} | 0 + mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} | 0 + mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} | 0 + mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} | 0 + mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} | 0 + mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} | 0 + mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} | 0 + mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} | 0 + mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} | 0 + mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} | 0 + mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} | 0 + mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} | 0 + mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} | 0 + mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} | 0 + mails/maillist.html | 2 +- + mails/msg00006.html | 2 +- + mails/msg00018.html | 2 +- + mails/msg00023.html | 2 +- + mails/msg00024.html | 2 +- + mails/msg00025.html | 2 +- + mails/msg00026.html | 2 +- + mails/msg00027.html | 2 +- + mails/msg00028.html | 2 +- + mails/msg00032.html | 2 +- + mails/msg00040.html | 2 +- + mails/msg00041.html | 2 +- + mails/msg00042.html | 2 +- + mails/msg00048.html | 2 +- + mails/msg00049.html | 2 +- + mails/msg00050.html | 2 +- + mails/msg00051.html | 2 +- + mails/msg00052.html | 1 - + mails/msg00053.html | 1 - + mails/msg00054.html | 1 - + mails/msg00055.html | 1 - + mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} | 0 + mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} | 0 + mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} | 0 + mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} | 0 + mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} | 0 + mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} | 0 + mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} | 0 + mails/threads.html | 2 +- + output.html | 2 +- + reflets.html | 2 +- + 64 files changed, 23 insertions(+), 27 deletions(-) + rename mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} (100%) + rename mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} (100%) + rename mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} (100%) + rename mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} (100%) + rename mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} (100%) + rename mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} (100%) + rename mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} (100%) + rename mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} (100%) + rename mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} (100%) + rename mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} (100%) + rename mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} (100%) + rename mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} (100%) + rename mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} (100%) + rename mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} (100%) + rename mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} (100%) + rename mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} (100%) + rename mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} (100%) + rename mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} (100%) + rename mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} (100%) + rename mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} (100%) + rename mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} (100%) + rename mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} (100%) + rename mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} (100%) + rename mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} (100%) + rename mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} (100%) + rename mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} (100%) + rename mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} (100%) + rename mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} (100%) + rename mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} (100%) + rename mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} (100%) + delete mode 120000 mails/msg00052.html + delete mode 120000 mails/msg00053.html + delete mode 120000 mails/msg00054.html + delete mode 120000 mails/msg00055.html + rename mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} (100%) + rename mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} (100%) + rename mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} (100%) + rename mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} (100%) + rename mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} (100%) + rename mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} (100%) + rename mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} (100%) +[2013-12-23 22:05:12 CET] Committer: Committing changes to git +[2013-12-23 22:05:13 CET] Pusher: Syncing with public, dolgoff, origin +Auto packing the repository for optimum performance. +fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +[2013-12-23 22:05:16 CET] Committer: Adding reflets.html output.html threads.html pngphoxRepygs.png pngfmEm5tkUDn.png pgpcO0uja6Z0Q.pgp pdfmQ9u5fWUkK.pdf pdfF0TCUFYgxV.pdf pdf3vLwdvymu6.pdf and 51 other files +ok +(Recording state in git...) +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add reflets.html ok +add reflets.html ok +add output.html ok +add mails/threads.html ok +add mails/pngphoxRepygs.png ok +add mails/pngfmEm5tkUDn.png ok +add mails/pgpcO0uja6Z0Q.pgp ok +add mails/pdfmQ9u5fWUkK.pdf ok +add mails/pdfF0TCUFYgxV.pdf ok +add mails/pdf3vLwdvymu6.pdf ok +add mails/pdf2EajO3nKRV.pdf ok +add mails/msg00051.html ok +add mails/msg00050.html ok +add mails/msg00049.html ok +add mails/msg00048.html ok +add mails/msg00042.html ok +add mails/msg00041.html ok +add mails/msg00040.html ok +add mails/msg00032.html ok +add mails/msg00032.html ok +add mails/msg00028.html ok +add mails/msg00027.html ok +add mails/msg00026.html ok +add mails/msg00025.html ok +add mails/msg00024.html ok +add mails/msg00023.html ok +add mails/msg00018.html ok +add mails/msg00006.html ok +add mails/maillist.html ok +add mails/jpgzTcmXOboBC.jpg ok +add mails/jpgzTcmXOboBC.jpg ok +add mails/jpgzKwM4quoCJ.jpg ok +add mails/jpgygiJgjjLdg.jpg ok +add mails/jpgqYEKj5yxhL.jpg ok +add mails/jpgmcn6CC58d1.jpg ok +add mails/jpgkoEH5SoLvR.jpg ok +add mails/jpggs4xMeCwqp.jpg ok +add mails/jpggs4xMeCwqp.jpg ok +add mails/jpgfTUANHcfnz.jpg ok +add mails/jpgdu9EKZP18V.jpg ok +add mails/jpgd4jRWMqhI3.jpg ok +add mails/jpgb6Amcdbt_p.jpg ok +add mails/jpgb6Amcdbt_p.jpg ok +add mails/jpg_TlOpz5yEI.jpg ok +add mails/jpgWN0orLG26U.jpg ok +add mails/jpgWN0orLG26U.jpg ok +add mails/jpgTmkvSP5OCN.jpg ok +add mails/jpgTmkvSP5OCN.jpg ok +add mails/jpgQJv5bJd7Z_.jpg ok +add mails/jpgOerFzfMUut.jpg ok +add mails/jpgOerFzfMUut.jpg ok +add mails/jpgNehfnysPB_.jpg ok +add mails/jpgNehfnysPB_.jpg ok +add mails/jpgLqoIemkRHW.jpg ok +add mails/jpgLqoIemkRHW.jpg ok +add mails/jpgLRAgF_kk2y.jpg ok +add mails/jpgKXplac49vA.jpg ok +add mails/jpgKXplac49vA.jpg ok +add mails/jpgHsS_2rOL6Y.jpg ok +add mails/jpgHsS_2rOL6Y.jpg ok +add mails/jpgFNaMv1VRz6.jpg ok +add mails/jpgFNaMv1VRz6.jpg ok +add mails/jpgE97mvEaO69.jpg ok +add mails/jpgE97mvEaO69.jpg ok +add mails/jpg924jbjXysn.jpg ok +add mails/jpg7fboROgExn.jpg ok +add mails/jpg7fboROgExn.jpg ok +add mails/jpg3krTrtBEkb.jpg ok +add mails/jpg3krTrtBEkb.jpg ok +add mails/jpg3DFKEEjrkk.jpg ok +add mails/jpg3DFKEEjrkk.jpg ok +add mails/jpg1UMqWMrG7a.jpg ok +add mails/binrPJBAv0ZVt.bin ok +add mails/bin5AtY2Z6c7Y.bin ok +add mails/.mhonarc.db ok +add libre.html ok +add code.html [2013-12-23 22:05:17 CET] Committer: Committing changes to git +[2013-12-23 22:05:17 CET] Transferrer: Uploaded jpgb6Amcdbt_p.jpg +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +git-annex-shell: fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +To griboiedov:public + c6278b9..d7c3c7d git-annex -> synced/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +warning: There are too many unreachable loose objects; run 'git prune' to remove them. +To /home/me/public + 4051e5f..8092c30 git-annex -> synced/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +From /home/me/public + 763310f..2ec4f5d annex/direct/master -> dolgoff/annex/direct/master + fe337a3..8092c30 git-annex -> dolgoff/git-annex + fe337a3..8092c30 synced/git-annex -> dolgoff/synced/git-annex + 763310f..6024c22 synced/master -> dolgoff/synced/master +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +Everything up-to-date +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +To griboiedov:public + d7c3c7d..8092c30 git-annex -> synced/git-annex + 4a82c94..2ec4f5d annex/direct/master -> synced/master +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-12-23 22:05:37 CET] Pusher: Syncing with public, dolgoff, origin +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +Auto packing the repository for optimum performance. +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: To griboiedov:public + 8092c30..3f6f227 key is already present in annexgit-annex -> synced/git-annex + +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +warning: There are too many unreachable loose objects; run 'git prune' to remove them. +To /home/me/public + 8092c30..3f6f227 git-annex -> synced/git-annex +From /home/me/public + 8092c30..3f6f227 git-annex -> dolgoff/git-annex + 8092c30..3f6f227 synced/git-annex -> dolgoff/synced/git-annex +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +Everything up-to-date +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-12-23 23:03:21 CET] SanityCheckerHourly: Rotated logs due to size: 1004794 + +# End of transcript or log. +"""]] + +> [[Fixed|done]]. This was several garden-variety haskell laziness leaks, +> all fixed by adding strictness annotations. +> +> Before: [[leakbefore.png]] +> After: [[leakafter.png]] +> +> Looks like I got them all, and it returns to running in constant space +> after adding and uploading the files (which can take memory porportional +> to the number of files that were added/changed at once). --[[Joey]] diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment b/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment new file mode 100644 index 000000000..e551c357f --- /dev/null +++ b/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-24T20:51:30Z" + content=""" +How many files are in this repository? + +There are various ways to profile git-annex's memory use, but they all require building it from source. For example, it can be built with [[EKG_support|ekg]]. +"""]] diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment b/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment new file mode 100644 index 000000000..dbc63d234 --- /dev/null +++ b/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://launchpad.net/~psycojoker" + nickname="psycojoker" + subject="comment 2" + date="2014-01-04T04:43:26Z" + content=""" +There are 139 files in this repo but this repos is updated very frequently (the files are generated every 10min). + +After a lot of fight with cabal and cabal-dev, I've managed to make EKG run, here is a screenshotof the result after hours of run and an actual consumption of 33.8% of 8gb of ram. + +http://pix.toile-libre.org/upload/original/1388810323.png + +But looking at it I don't know how it can be usefull. I don't know very well the haskell ecosystem, don't hesitate to point me to things that could help. + +On a more positive note: git annex compiled from cabal (and from source) seems to eat my available memory way slower than the one from the ubuntu ppa. +"""]] diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment b/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment new file mode 100644 index 000000000..6d03b4cdb --- /dev/null +++ b/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 3" + date="2014-01-05T20:41:35Z" + content=""" +Well, EKG either cannot see the leak, or perhaps haskell profiling generally cannot see it. Don't have a lot of experience with EKG, it's just a lot easier to ask for than full ghc profiling data.. + +It's certainly useful information that you are constantly changing the files. + +I have tried to replicate this setup, with a few hundred files, and writing random stuff to them repeatedly. The RSS did not grow at all despite repeatedly changing and committing the files. + +I then tried adding a remote for it to sync with, and see evidence of a small leak there -- around 8 bytes per file transferred. The leak appears to be in the transfer code, not the git sync code; it happens with both git remotes and with directory special remotes. + +"""]] diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment b/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment new file mode 100644 index 000000000..11aeff31a --- /dev/null +++ b/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~psycojoker" + nickname="psycojoker" + subject="comment 4" + date="2014-01-06T01:31:14Z" + content=""" +Great, don't hesitate to ask me if you need more informations! + +Thanks :) +"""]] diff --git a/doc/bugs/import_memleak_from_the_assistant/leakafter.png b/doc/bugs/import_memleak_from_the_assistant/leakafter.png new file mode 100644 index 000000000..32c27f370 Binary files /dev/null and b/doc/bugs/import_memleak_from_the_assistant/leakafter.png differ diff --git a/doc/bugs/import_memleak_from_the_assistant/leakbefore.png b/doc/bugs/import_memleak_from_the_assistant/leakbefore.png new file mode 100644 index 000000000..9a04bfb20 Binary files /dev/null and b/doc/bugs/import_memleak_from_the_assistant/leakbefore.png differ diff --git a/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn b/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn new file mode 100644 index 000000000..df7fc5fb2 --- /dev/null +++ b/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn @@ -0,0 +1,55 @@ +### Please describe the problem. + +`git annex status` inconsistently uses mebi (SI) and giga (informal) prefixes. + +### What steps will reproduce the problem? + +Example: + +[[!format txt """ +anarcat@marcos:mp3$ git annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git S3 bup directory rsync web glacier hook +repository mode: direct +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + b7802161-c984-4c9f-8d05-787a29c41cfe -- here (anarcat@marcos:/srv/mp3) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 31.93 gigabytes (+1 megabyte reserved) +local annex keys: 19913 +local annex size: 111.08 gigabytes +known annex keys: 20085 +known annex size: 111.38 gigabytes +bloom filter size: 16 mebibytes (3.1% full) +backend usage: + SHA256E: 39998 +"""]] + +Notice `mebibytes` and `gigabytes`. It is unclear whether those are gigabytes (1000^3) or gibibytes (1024^3). + +### What version of git-annex are you using? On what operating system? + +4.20130802~bpo70+2, Debian wheezy. + +### Please provide any additional information below. + +nil. --[[anarcat]] + +> git-annex consistently uses the powers of ten units +> for disk storage sizes. Its "gigabyte" is the SI gigabyte. +> +> It uses the absurdly named units for powers of 2 for memory sizes, +> in the few places it deals with memory (probably only the above bloom +> filter size number). +> +> AFAIK I am complying with all relevant standards and best practices. +> Even though I consider them rather dumb, as is clear if you +> [read the opionated source code I wrote to handle this](). +> +> If git-annex used "gibibyte", the numbers it reports for disk size +> would not match the numbers disk vendors and most tools use. +> +> [[bug_is_in_world_not_in_git-annex|done]] --[[Joey]] + diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn b/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn new file mode 100644 index 000000000..108ba5a6a --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. + +There are multiple problems that have the same cause: + + * When using a shared repository (core.sharedrepository = group), the directories that contain the actual objects may be owned by different users. In this case adding or removing the sticky bit is prohibited by the operating system. Thus shared repositories can only be incrementally fscked if all objects are owned by the same user. + + * It is not currently possible to run incremental fscks on the local repository and on a special remote at the same time, because both of them use the same flag space, the sticky bit. + +### What steps will reproduce the problem? + +Create a shared repository (core.sharedrepository = group), let a different user add an object and then try to fsck it. + +### What version of git-annex are you using? On what operating system? + +Debian's 4.20131106~bpo70+1 + +[[!tag confirmed]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment new file mode 100644 index 000000000..b061224e9 --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-02T17:58:55Z" + content=""" +See [[todo/incremental_fsck]] for background. + +Options: + +* using per-object files +* using sqllite or another relational database +* using git as the database +* using a key/value store + +Per-object files have the problem that they clutter up the .git/annex/objects/ tree quite a lot with info only used by fsck. We have a similar clutter problem with direct mode mapping files, and for various reasons (including [[direct mode mappings scale badly with thousands of identical files|bugs/\"Adding_4923_files\"_is_really_slow]]) I have been hoping to move that data to a better storage, perhaps a database, eventually. Switching fsck to use a database first might be a good first step to using a database for the more important direct mode mapping storage. If the fsck database goes wrong, the worse that happens is some extra incremental fscking. + +Using git as the database is possible. Just store the info in a separate git ref, like the git-annex branch, but that is not synced. But it will use more disk over time. Probably not the best choice. + +There are plenty of sqllite interfaces for haskell. They all do have the problem that the C sqlite has to be installed. This will make `cabal install git-annex` harder. It is currently possible to do a `cabal install git-annex` with flags that avoid needing to install any C libraries. This is useful for my sanity, since otherwise people want hand-holding on installing libraries on OSX and stuff. + +Perhaps there's a pure haskell key/value store that would be a better choice than sqllite. I do not anticipate git-annex needing complex relational database storage, if we look at everything it needs to store so far, key/value is enough. (The more complicated stuff is stored in git anyway.) + +* is actually memory only, not suitable +* is I think the gold standard in its area. Strongly typed. Has some Template Haskell stuff but it's optional. Packaged in Debian already, but only on TH capable architectures so that would need to be fixed. Seems to have the disadvantage that it's not really a key/value store, so works by loading the *entire* data into ram. This is a problem since git-annex wants to run in constant memory. +* has some caveats about not being able to remove old keys +* looks possible, has only had one release in 2011 though and undocumented +"""]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment new file mode 100644 index 000000000..ec921ce8f --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="helmut" + ip="89.0.78.89" + subject="git as a database" + date="2013-12-02T18:24:12Z" + content=""" +You said that \"[...] it will use more disk over time. Probably not the best choice.\" But this does not have to be true. Since this git ref is never synced, an update can be forced. The tricky part is in finding good truncation points. Now for fsck, the log can be truncated whenever an incremental fsck is started. +"""]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment new file mode 100644 index 000000000..17d7a3aab --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-02T19:11:27Z" + content=""" +HongoDB doesn't build with current hackage. + +keyvaluehash passed some inital load etc tests. The inability to delete old keys/values might not be a significant problem. + +However I don't think it has any ACID guarantees; eg a crash at the wrong time could leave the database in some inconsistent state. +"""]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment new file mode 100644 index 000000000..3b55891c4 --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 4" + date="2013-12-02T20:35:45Z" + content=""" +@helmut Well, true, it could overwrite the old ref with a new one at the start of a new fsck pass. If there was a separate ref for each uuid, this would work even for mixed local/remote fscking. And git should eventually drop the objects associated with the old ref, probably in `gc --auto`, which has a default --prune of 2 weeks. + +The git overhead would probably be fine for fsck. I am less sure about it for the direct mode mapping files, which can be queried quite frequently. In particular inAnnex is used lots of places, often repeatedly on a lot of files, and it uses withObjectLoc, which uses associatedFiles. +"""]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment new file mode 100644 index 000000000..a627e1841 --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="68.119.96.78" + subject="comment 5" + date="2013-12-21T16:26:51Z" + content=""" + looks potentially good. It seems that it may allow storing stuff on disk and only loading it into cache when accessed, but I am not sure. Need to run some tests to try it out. +"""]] diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment new file mode 100644 index 000000000..9d70c84ec --- /dev/null +++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 6" + date="2014-02-20T20:09:22Z" + content=""" +I also need some local fast database for metadata index storing. +"""]] diff --git a/doc/bugs/index_file_smaller_than_expected.mdwn b/doc/bugs/index_file_smaller_than_expected.mdwn new file mode 100644 index 000000000..0eac3f20e --- /dev/null +++ b/doc/bugs/index_file_smaller_than_expected.mdwn @@ -0,0 +1,53 @@ +### Please describe the problem. + +I get an error in one of my repositories. + +### What steps will reproduce the problem? + +I paired my macbook repository with an repository on my desktop. The repository on the desktop contains many smaller files, because it is my documents folder. + +Pairing this repository with smaller files never worked for me. I posted to the forum about it: +[[forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/]] + +I am a little confused because I paired three other repositories between these computers sucessfully. They contain pictures, videos and music. + +### What version of git-annex are you using? On what operating system? + +Version: 5.20140106-gcb3351b +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + +Mac OS X Mavericks + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Please make sure you have the correct access rights +and the repository exists. +fatal: index file smaller than expected +TransferScanner crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128) +[2014-01-10 16:26:00 CET] TransferScanner: warning TransferScanner crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128) +ssh_exchange_identification: read: Connection reset by peer +ssh_exchange_identification: read: Connection reset by peer +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +[2014-01-10 16:56:09 CET] NetWatcherFallback: Syncing with sokrates.local_Dokumente +ssh_exchange_identification: read: Connection reset by peer +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +fatal: index file smaller than expected +NetWatcherFallback crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128) +[2014-01-10 17:01:09 CET] NetWatcherFallback: warning NetWatcherFallback crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128) + + +# End of transcript or log. +"""]] + +> Made assistant detect corrupted .git/annex/index on startup and correct +> it. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment b/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment new file mode 100644 index 000000000..9cf0ce336 --- /dev/null +++ b/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-14T21:12:19Z" + content=""" +It's unusual for git's index file to get corrupted or short like this. git writes to .git/index by first writing the new content to .git/index.lock, and then once it's written, renaming it. So if git is interrupted in the middle of a write, it doesn't leave the index file truncated. Of course, it's somewhat up to the OS's filesystem and buffering, and so I suppose if the system loses power at just the right time, and the filesystem does not journal data, this could happen. + +Anyway, git-annex's assistant should be able to detect when the index file is corrupt, including too short, and fix it. When I try with a current version of git-annex, opening the webapp or starting the assistant results in the index file being automatically repaired, with this logged to .git/annex/daemon.log: + +
+fatal: index file smaller than expected
+[2014-01-14 16:58:11 JEST] SanityCheckerStartup: corrupt index file found at startup; removing and restaging
+
+ +However, it looks like it needs to do the same check for .git/annex/index. I was able to reproduce this bug by corrupting that file. +"""]] diff --git a/doc/bugs/info_file_contains_wrong_version.mdwn b/doc/bugs/info_file_contains_wrong_version.mdwn new file mode 100644 index 000000000..629fd6399 --- /dev/null +++ b/doc/bugs/info_file_contains_wrong_version.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +The script producing the .info file along with the binary tarball seems to generate the wrong version. + + +### What steps will reproduce the problem? + + % curl https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz.info + GitAnnexDistribution {distributionUrl = "https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz", + distributionKey = Key {keyName = "2a01f853b08dc0f47392b50cda41d5f589f46413073fdf4ffd5b817d6638a502.tar.gz", keyBackendName = "SHA256E", + keySize = Just 27578790, keyMtime = Nothing}, distributionVersion = "5.20131222", + distributionReleasedate = 2013-12-30 18:56:44.908259 UTC, distributionUrgentUpgrade = Nothing} + + +`distributionVersion` is 5.20131222, but `git annex version` returns 5.20131230-g4aa88d8. + +This may look anecdotical, but at least the `git-annex-bin` package of Arch Linux uses the .info data to retrieve the version information. + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn new file mode 100644 index 000000000..baa59951c --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +When working with git-annex in a folder managed by Dropbox, the folders names in .git/annex/objects/ are mangled by Dropbox. This leads to lost files. + +This is not a git-annex bug, but the problem is severe and it would be helpful when git-annex can deal with it somehow. Possibilities are: + +* include a warning in documentation (this will be probably found after someone encounters the problem actually) +* issue a warning when running in a Dropbox managed folder +* avoid using filenames that differs in case only (this would make git-annex also more robust against corruption i.e. when a repository is copied over filesystems/protocols without filename case support) + +Dropbox file name limitations: [[https://www.dropbox.com/help/145/en]] + +### What steps will reproduce the problem? + cd ~/Dropbox + mkdir test_annex + cd test_annex + git init + git annex init "test_annex" + cp ~/somefiles/* . + git annex add * + # wait for Dropbox to upload and mangle folder names in .git/annex/objects/ + find -L . -type l | wc -l # print number of broken symlinks + git annex fsck # prints all the missing files + + +### What version of git-annex are you using? On what operating system? + +* git-annex 3.20130207 +* Fedora 19 + +### Please provide any additional information below. + +[[!format sh """ +# folder names mangled by Dropbox + +$ ls .git/annex/objects/ +Ff/ M9 (Case Conflict (1))/ x8 (Case Conflict (1))/ +Ff (Case Conflict)/ pF/ x9/ +Ff (Case Conflict (1))/ pF (Case Conflict)/ x9 (Case Conflict)/ +Ff (Case Conflict (2))/ pF (Case Conflict (1))/ Zf/ +Ff (Case Conflict (3))/ pF (Case Conflict (2))/ Zf (Case Conflict)/ +Ff (Case Conflict (4))/ pF (Case Conflict (3))/ Zf (Case Conflict (1))/ +Ff (Case Conflict (5))/ pF (Case Conflict (4))/ Zf (Case Conflict (2))/ +Ff (Case Conflict (6))/ PG/ Zf (Case Conflict (3))/ +... + +# End of transcript or log. +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment new file mode 100644 index 000000000..256ae83b4 --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-06T16:02:45Z" + content=""" +I'm not seeing data loss. It looks like the contents of your files are still there, you just need to rename them back to the right directory names. If you're using indirect mode, you should be able to do this: + + mv .git/annex/objects . + chmod -R u+w objects + git annex add objects + +That will re-inject all the file contents with the right names. You can then delete the objects directory, which should only contain symlinks at that point. + +---- + +Moving git-annex to using lower case hash directories is on the very long term todo list, due to various crappy filesystems (problems mostly worked around by direct mode). Since it requires changing every symlink in every existing git-annex repository, which will be extremely disruptive, I'd need a much better reason than dropbox to do it now. + +I have no interest, in general, in making git-annex use filenames that meet whatever limitations dropbox wants to impose on its users. +"""]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment new file mode 100644 index 000000000..a02a55f44 --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkWQXo7MLYIDa-ep04UTbdz8KuvfjwLDCQ" + nickname="Matěj" + subject="comment 2" + date="2014-01-08T22:11:34Z" + content=""" +I understand, it's not git-annex fail. I added at least a tip with a warning here: [[forum/do not use git-annex inside your Dropbox]]. +"""]] diff --git a/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn b/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn new file mode 100644 index 000000000..8c9703ed2 --- /dev/null +++ b/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. + +Some logs fail to be displayed, and instead of displaying parts of the log, no logs at all are displayed in the webapp. + +The problem character is, I believe, a latin-1 encoded filename (as opposed to UTF-8). --[[anarcat]] + +### What steps will reproduce the problem? + +1. download [this logfile](http://paste.anarc.at/daemon.log.1) +2. install it in .git/annex/daemon.log +3. load the webapp +4. visit the logs page + +### What version of git-annex are you using? On what operating system? + +4.20131105-g8efdc1a + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Internal Server Error +/srv/video/.git/annex/daemon.log.1: hGetContents: invalid argument (invalid byte sequence) +git-annex version 4.20131105-g8efdc1a +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/issues_with_non-posix_compatible_shells.mdwn b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn new file mode 100644 index 000000000..34fb72a1c --- /dev/null +++ b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. +Some internals of git annex does not check if the shell it is running is Posix-compatible, ie. bash. + +I am using fish, and after setting up local pairing, and working, I switched back the login-shell to fish, and when syncing a file, I got this error, read from daemon.log: + +fish: Unknown command 'GIT_ANNEX_SHELL_DIRECTORY=/home/s/annex'. Did you mean to run ~/.ssh/git-annex-shell with a modified environment? Try 'env GIT_ANNEX_SHELL_DIRECTORY=/home/s/annex ~/.ssh/git-annex-shell...'. See the help section on the set command by typing 'help set'. +Standard input: GIT_ANNEX_SHELL_DIRECTORY='/home/s/annex' ~/.ssh/git-annex-shell + ^ +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. + +### What steps will reproduce the problem? +Set up local pairing ( I believe having sh/bash as login terminal is necessary for this). +Switch back to fish as login-shell with chsh -s /usr/bin/fish +Add a file to either repository. + +### What version of git-annex are you using? On what operating system? +[s@b ~]$ git annex version +git-annex version: 5.20140320-g63535e3 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] so +> +> I have not tried to make the assistant go back and fix up existing +> `authorized_keys` lines. So if someone had been using a posix shell and +> switched to fish, they'll hit this and need to fix it themselves. I judge +> this is pretty small number of users. --[[Joey]] diff --git a/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment b/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment new file mode 100644 index 000000000..72b3e48e9 --- /dev/null +++ b/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 1" + date="2014-04-02T08:40:17Z" + content=""" +FWIW, `env foo=bar cmd` would probably work on every system on which the `foo=bar cmd` invocation works now. +"""]] diff --git a/doc/bugs/links_in_firefox_do_not_always_work.mdwn b/doc/bugs/links_in_firefox_do_not_always_work.mdwn new file mode 100644 index 000000000..d0b735083 --- /dev/null +++ b/doc/bugs/links_in_firefox_do_not_always_work.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +I noticed that you (@joey) wrote + +> webapp: Odd problem when using Firefox: Some links don't seem to load. Clicking on such a link repeatedly will eventually load the right page. Network console shows web browser is requesting page "/" despite a link to another page being clicked on. Workaround: Use Chrome instead; no such problem there. + +in [[todo/windows_support]], and thought I would get around to mentioning that I also see this problem on linux (so it's not windows specific), but I am using firefox. + + +### What steps will reproduce the problem? +Click on a link in the webapp; most of the time, even though the link target is correct, the current page is reloaded instead of loading the target. + +### What version of git-annex are you using? On what operating system? +5.20131205-gc448602 + +Ubuntu 13.04, firefox 25.0.1 + + + +--Walter + +> [[fixed|done]]; increased number of longpolling failures allowed before +> it enters the chromium back button bugfix workaround to 12. +> Should be more than enough for 3 or 4 long polling elements on a page. +> (Considered only running the chromium bugfix on chromium, but I don't +> want to get into browser detection hacks.) --[[Joey]] diff --git a/doc/bugs/links_in_firefox_do_not_always_work/comment_1_5e506674f157e8ed612eca1f9adfa068._comment b/doc/bugs/links_in_firefox_do_not_always_work/comment_1_5e506674f157e8ed612eca1f9adfa068._comment new file mode 100644 index 000000000..1249a6f81 --- /dev/null +++ b/doc/bugs/links_in_firefox_do_not_always_work/comment_1_5e506674f157e8ed612eca1f9adfa068._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-09T21:08:29Z" + content=""" +Thanks, that's very interesting indeed. + +When I was debugging this on Windows, I had the network console open, and could see clearly that Firefox was trying to load \"/\" when I clicked on a link to \"/config\". Both firefox and the git-annex webapp's debug log agreed that it asked for the wrong page. + +I have just reproduced it using iceweasel as well. I know that I have tested git-annex before under iceweasel and it seemed to work. + +Seems that clicking 3+ times on a link makes it finally follow it. + +I wonder if this has something to do with the long polling. Disabling javascript would avoid it if so. They've made disabling JS in firefox sufficiently hard that I cannot find how to do it. + +Also, the problem seems to open happen on the main page (/). Once I get to any other page, further links are followed without trouble. +"""]] diff --git a/doc/bugs/links_in_firefox_do_not_always_work/comment_2_dfde57b433301e971c2d5b9e4d3c824a._comment b/doc/bugs/links_in_firefox_do_not_always_work/comment_2_dfde57b433301e971c2d5b9e4d3c824a._comment new file mode 100644 index 000000000..cda8995a4 --- /dev/null +++ b/doc/bugs/links_in_firefox_do_not_always_work/comment_2_dfde57b433301e971c2d5b9e4d3c824a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-12-09T21:39:16Z" + content=""" +Tried renaming / to /dashboard , just in case firefox was having problems with the name of the page. Didn't help, so the problem must be something on the page. + +Tried removing the repolist and the transferlist from the dashboard, and this indeed avoided the problem. So it's certainly related to the long polling code. Although note that this left 1 long polling call still on the page, for the sidebar. In fact, only removing one of the repolist or transfer list seems to be enough to avoid the problem. 1 works, 2 works, 3 fails. + +Aha.. After 3 long polling failures, the JS runs a fail function. To work around a seeming bug in chromium when navigating back to a page, [[!commit b5678d74a29023cbeb3d65c0d7f57d20f47ebef9]] made this reload the page. +"""]] diff --git a/doc/bugs/links_in_firefox_do_not_always_work/comment_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment b/doc/bugs/links_in_firefox_do_not_always_work/comment_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment new file mode 100644 index 000000000..f0e7cf244 --- /dev/null +++ b/doc/bugs/links_in_firefox_do_not_always_work/comment_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 3" + date="2013-12-09T21:43:58Z" + content=""" +I just tried in the browser console, and see the same behaviour. + +I also see that links work when not on the dashboard. + +I disabled javasript (set javascript.enabled to false in about:config), and the links all work well (though dropdown menus don't work at all). + + +(I see after writing this you seem to have worked it out already) +"""]] diff --git a/doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn b/doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn new file mode 100644 index 000000000..c43075e58 --- /dev/null +++ b/doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? +In the git-annex tree, + + $ make + $ sudo make install + +What is the expected output? What do you see instead? + +One would expect git-annex to be installed in the configured prefix. Unfortunately, make tries to rebuild the "all" target before "install". This fails (presumably) due to incorrect environment state, + + ghc -O2 -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_INOTIFY --make git-annex Utility/libdiskfree.o + + Utility/FileSystemEncoding.hs:17:8: + Could not find module `Data.Bits.Utils': + Use -v to see a list of the files searched for. + make: *** [git-annex] Error 1 + +Removing "all" from the dependencies of "install" allows the process to run to completion, although this is clearly not a satisfactory solution. + +> [[fixed|done]] using an ugly stamp file. --[[Joey]] diff --git a/doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn new file mode 100644 index 000000000..471c91e9d --- /dev/null +++ b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. +There is no git-annex-shell command in path and thus sync with ssh server fails. If I symlink /usr/bin/git-annex-shell -> /usr/bin/git-annex, it complains that key is already present in annex and errors out. There is executable git-annex-shell in server's ~/.ssh/ + +### What steps will reproduce the problem? +Start webapp to sync local repo with ssh server. + +### What version of git-annex are you using? On what operating system? +git-annex 4.20130627 on Gentoo + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-07-08 17:28:48 EEST] main: starting assistant version 4.20130627 +[2013-07-08 17:28:49 EEST] TransferScanner: Syncing with netbook_Lit, sigma_Lit + + dbus failed; falling back to mtab polling (SocketError {socketErrorMessage = "connect: does not exist (Connection refused)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:abstract=/tmp/dbus-HBxh6EyMJ3,guid=adc3101676daede2a128013351daa535")}) +Already up-to-date. + +(scanning...) [2013-07-08 17:28:49 EEST] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. + + +(started...) Everything up-to-date +Everything up-to-date +bash: git-annex-shell: command not found +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: remote command not found (code 127) at io.c(605) [sender=3.0.9] +bash: git-annex-shell: command not found +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: remote command not found (code 127) at io.c(605) [sender=3.0.9] + + +[2013-07-08 17:50:23 EEST] main: starting assistant version 4.20130627 +[2013-07-08 17:50:23 EEST] TransferScanner: Syncing with netbook_Lit, sigma_Lit + + dbus failed; falling back to mtab polling (SocketError {socketErrorMessage = "connect: does not exist (Connection refused)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:abstract=/tmp/dbus-HBxh6EyMJ3,guid=adc3101676daede2a128013351daa535")}) +Already up-to-date. + +(scanning...) [2013-07-08 17:50:23 EEST] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. + + +(started...) Everything up-to-date +Everything up-to-date +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] + + + +# End of transcript or log. +"""]] + +[[!tag done]] diff --git a/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_1_8c20edd8c6483500f807528d616c6dfd._comment b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_1_8c20edd8c6483500f807528d616c6dfd._comment new file mode 100644 index 000000000..ad3273723 --- /dev/null +++ b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_1_8c20edd8c6483500f807528d616c6dfd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-08T16:14:37Z" + content=""" +The Makefile contains, for the install target: + +[[!format sh \"\"\" + ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell +\"\"\"]] + +How was git-annex installed on your server? +"""]] diff --git a/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment new file mode 100644 index 000000000..452b55d40 --- /dev/null +++ b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 2" + date="2013-07-08T18:09:50Z" + content=""" +That is Gentoo box and git-annex is installed using the following ebuild: + +[[https://github.com/gentoo-haskell/gentoo-haskell/blob/master/dev-vcs/git-annex/git-annex-4.20130627.ebuild]] + +which uses cabal to install it. It uses also the following eclass: + +[[http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/eclass/haskell-cabal.eclass?revision=1.40&view=markup]] + +The main functions of interest there are cabal-bootstrap(), cabal-copy() and cabal_src_install(). I'm not familiar enough with haskell nor with cabal to follow trough in detail how the setup program is constructed and how it works, but the end result is that this is all that is installed. I don't know if normal cabal installs work as intended, maybe something there needs to be adjusted? + +[[!format sh \"\"\" + * Contents of dev-vcs/git-annex-4.20130627: +/usr +/usr/bin +/usr/bin/git-annex +/usr/lib64 +/usr/lib64/ghc-7.6.3 +/usr/lib64/ghc-7.6.3/gentoo +/usr/lib64/ghc-7.6.3/gentoo/git-annex-4.20130627.conf +/usr/share +/usr/share/doc +/usr/share/doc/git-annex-4.20130627 +/usr/share/doc/git-annex-4.20130627/COPYRIGHT.bz2 +\"\"\" ]] +"""]] diff --git a/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment new file mode 100644 index 000000000..fd97f6a21 --- /dev/null +++ b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 3" + date="2013-07-08T18:22:18Z" + content=""" +`cabal install` also creates the git-annex-shell symlink. I have filed a bug on the ebuild: +"""]] diff --git a/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_4_ec78032ba62d6918baa2c0b07ead5b50._comment b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_4_ec78032ba62d6918baa2c0b07ead5b50._comment new file mode 100644 index 000000000..86f1b46f0 --- /dev/null +++ b/doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_4_ec78032ba62d6918baa2c0b07ead5b50._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 4" + date="2013-07-08T18:44:59Z" + content=""" +Thanks! That leaves the issue that even when manually creating the symlink it still errors out (second half of the log in original report), but that probably is another issue. Should I open separate report for it? There was something similar in [[http://git-annex.branchable.com/bugs/Rsync_remote_created_via_webapp_remains_empty/]], but the command= part was in the file on my local computer only and removing it didn't make any difference. +"""]] diff --git a/doc/bugs/manpage_has_slight_indentation_error.mdwn b/doc/bugs/manpage_has_slight_indentation_error.mdwn new file mode 100644 index 000000000..56d9d2266 --- /dev/null +++ b/doc/bugs/manpage_has_slight_indentation_error.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. + +The "import" section of the manpage has an indentation error. + +### What steps will reproduce the problem? + +man git-annex + +### What version of git-annex are you using? On what operating system? + +anything after 20130827, i believe. + +### Please provide any additional information below. + +silly patch: + +[[!format diff """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +diff --git a/Build/mdwn2man b/Build/mdwn2man +index ba5919b..b3ee404 100755 +--- a/Build/mdwn2man ++++ b/Build/mdwn2man +@@ -25,7 +25,7 @@ while (<>) { + $inlist=1; + $spippara=0; + } +- elsif (/.SH/) { ++ elsif (/^.SH/) { + $skippara=0; + $inlist=0; + } +# End of transcript or log. +"""]] + +-- [[anarcat]] + +> [[applied|done]] --[[Joey]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn b/doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn new file mode 100644 index 000000000..c081f9799 --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +`git annex merge` goes out of memory on a large repo. + + +### What steps will reproduce the problem? + + $ git annex merge + merge git-annex git-annex: out of memory (requested 1048576 bytes) + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130827 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +On debian wheezy i386 + +### Please provide any additional information below. + +The repository contains a lot of files: + + $ cd .git/objects + $ find . -type f | wc -l + 1091548 + +[[!tag moreinfo]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_1_6d47485728ea65a9b555f8be7159dea5._comment b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_1_6d47485728ea65a9b555f8be7159dea5._comment new file mode 100644 index 000000000..f87a9a84d --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_1_6d47485728ea65a9b555f8be7159dea5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00" + nickname="Jakukyo" + subject="pre-commit hook of git annex" + date="2013-09-11T00:58:09Z" + content=""" +The pre-commit hook of git annex throws an 'out of memory' error, too. + +As a workaround, I've deleted ~/.git/hooks/pre-commit, and use `git merge` manually. +"""]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_2_06723d13ecdaf87de5ff2b209e3c5198._comment b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_2_06723d13ecdaf87de5ff2b209e3c5198._comment new file mode 100644 index 000000000..76a0d2fd4 --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_2_06723d13ecdaf87de5ff2b209e3c5198._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 2" + date="2013-09-13T18:38:11Z" + content=""" +Can you run this so I can get a better idea of the size of this repository: + +git ls-tree -r git-annex | wc -l +"""]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_3_9f83ef190547b291a715cda55b7977d4._comment b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_3_9f83ef190547b291a715cda55b7977d4._comment new file mode 100644 index 000000000..11f03b39d --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_3_9f83ef190547b291a715cda55b7977d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 3" + date="2013-09-19T18:53:14Z" + content=""" +I just fixed a memory leak that occurred when large files were checked directly into git (perhaps by accident by committing files manually when using direct mode). However, I don't think it affected `git annex merge`. + +Still need information about how to reproduce this bug... +"""]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_4_0e32ae0300472c56079cfbcd78a3e386._comment b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_4_0e32ae0300472c56079cfbcd78a3e386._comment new file mode 100644 index 000000000..d1c447980 --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_4_0e32ae0300472c56079cfbcd78a3e386._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00" + nickname="Jakukyo" + subject="size of repo" + date="2013-09-21T09:32:03Z" + content=""" + $ git ls-tree -r git-annex | wc -l + 29273 +"""]] diff --git a/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_5_e8998716107e7ae8d0e8d332812517ad._comment b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_5_e8998716107e7ae8d0e8d332812517ad._comment new file mode 100644 index 000000000..272dc2fd2 --- /dev/null +++ b/doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_5_e8998716107e7ae8d0e8d332812517ad._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 5" + date="2013-09-25T18:36:39Z" + content=""" +That doesn't look very big, I merge one 3x that large on a 128 mb machine. + +I think you will need to either email me privately so I can get a copy of your repository to investigate with ... or you can try to investigate on your own. + +I think the first things I would try to debug this are to look over `git annex merge --debug` and see if I see anything unusual, and then I would probably `git checkout git-annex` in the repository, and wc -l on all the files and see if any file has a lot of lines, or is otherwise very large. + +If that found nothing, my next step would be to rebuild git-annex from source with memory profiling enabled, as explained in this book, and try to get a memory profiling graph that explained what was using up the memory. +"""]] diff --git a/doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn b/doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn new file mode 100644 index 000000000..33776d13a --- /dev/null +++ b/doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn @@ -0,0 +1,62 @@ +Word summary: After migrating from SHA256 to SHA256E I still have a ton of SHA256 files around that aren't being found by unused. + +Command outputs (see, specifically, the output of status showing number of SHA256 and SHA256E files): + + + greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ less .gitattributes + * annex.backend=SHA256E + + greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex migrate . + (Recording state in git...) + + greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex unused + unused . (checking for unused data...) (checking master...) (checking rose/master...) (checking x200s/master...) + Some partially transferred data exists in temporary files: + NUMBER KEY + 1 SHA256E-s15766010--8132a02a8b245eb9842e89c5e696df4e9c82d676f8dec3c6bb96892c19f99d51.jpg + + To remove unwanted data: git-annex dropunused NUMBER + + ok + (Recording state in git...) + + greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ git-annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 1 + c0e4106e-2631-11e2-9749-1bfa37a61069 -- rose + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + 9bd4077e-196c-11e2-9cc9-9faafb3e34ee -- x200s + c69d6fcc-18d1-11e2-9487-2fe6dbf0516b -- here (photos on eeepc) + untrusted repositories: 0 + dead repositories: 1 + 3ebd5ac2-2092-11e2-856a-bb0203cce179 -- Photos on Rose + transfers in progress: + downloading 2011/06/30/IMG_8180.jpg + from rose + available local disk space: 2 terabytes (+1 megabyte reserved) + temporary directory size: 9 megabytes (clean up with git-annex unused) + local annex keys: 36210 + local annex size: 136 gigabytes + known annex keys: 23388 + known annex size: 102 gigabytes + bloom filter size: 16 mebibytes (7.2% full) + backend usage: + SHA256E: 37453 + SHA256: 22145 + (Recording state in git...) + + greg@eeepc:/mnt/blackbox/Media/Pictures/Photos$ apt-cache policy git-annex + git-annex: + Installed: 3.20121017 + Candidate: 3.20121017 + Version table: + *** 3.20121017 0 + 600 http://ftp.us.debian.org/debian/ unstable/main i386 Packages + 100 /var/lib/dpkg/status + 3.20120629 0 + 650 http://ftp.us.debian.org/debian/ wheezy/main i386 Packages + + +As Joey predicted, this took care of itself over time. Marking as [[bugs/done]]. diff --git a/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_1_2cfbf6693b051c758fe5efa5ee885829._comment b/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_1_2cfbf6693b051c758fe5efa5ee885829._comment new file mode 100644 index 000000000..ee5f05617 --- /dev/null +++ b/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_1_2cfbf6693b051c758fe5efa5ee885829._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-07T19:02:45Z" + content=""" +Notice where it says: + +> (checking master...) (checking rose/master...) (checking x200s/master...) + +AFAICS, every one of those branches still refers to the migrated keys. For one thing, `git annex migrate` makes changes, but it doesn't commit them to master. And then you need to wait until the other remote are updated to. + +Also, there's not really any point in worrying about getting rid of migrated keys, since `git-annex migrate` hard links the new key to the old key, so the old ones don't take up any additional disk space. + +In other words: This should take care of itself as you continue to use the repository. +"""]] diff --git a/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_2_acb1abeb32c3aba8ba65151afbea753c._comment b/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_2_acb1abeb32c3aba8ba65151afbea753c._comment new file mode 100644 index 000000000..ccb711588 --- /dev/null +++ b/doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_2_acb1abeb32c3aba8ba65151afbea753c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2012-11-15T04:11:55Z" + content=""" +You were right, this has taken care of itself. + +Thanks much for the solid piece of software. +"""]] diff --git a/doc/bugs/moreinfo.mdwn b/doc/bugs/moreinfo.mdwn new file mode 100644 index 000000000..579707dab --- /dev/null +++ b/doc/bugs/moreinfo.mdwn @@ -0,0 +1,2 @@ +This tags is for bugs needing more information from their submitter. +Please respond to the bug and provide the requested information. diff --git a/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__.mdwn b/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__.mdwn new file mode 100644 index 000000000..8dca631ba --- /dev/null +++ b/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. +When I try to start the webapp, it fails, complaining about a nautilus script. + + +### What version of git-annex are you using? On what operating system? +Mythbuntu 12.04 (which is based on XFCE and doesn't have nautilus) +$ git-annex version +git-annex version: 5.20140402 +build flags: Assistant Webapp Webapp-secure Pairing S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ git-annex webapp + +git-annex: /home/mythbuntu/.local/share/nautilus/scripts/git-annex get: openFile: does not exist (No such file or directory) +failed +git-annex: webapp: 1 failed + +# End of transcript or log. +"""]] + +[[fixed|done]] --[[Joey]] diff --git a/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_9fdeaa51ccc7c71dcfeea3ea783d3b50._comment b/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_9fdeaa51ccc7c71dcfeea3ea783d3b50._comment new file mode 100644 index 000000000..d25188658 --- /dev/null +++ b/doc/bugs/nautilus__47__scripts__47__git-annex_get:_openFile:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_9fdeaa51ccc7c71dcfeea3ea783d3b50._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 1" + date="2014-04-06T11:34:37Z" + content=""" +The problem has been reported [here](http://git-annex.branchable.com/bugs/git-annex_fails_to_start_when_nautilus_script_directory_is_missing/) as well and is already fixed in the latest [release](http://git-annex.branchable.com/news/version_5.20140405/). + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows.mdwn b/doc/bugs/no_git-annex_shell_on_Windows.mdwn new file mode 100644 index 000000000..60a67eae9 --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +git annex installer on Windows only installs git-annex-licenses.txt git-annex-uninstall.exe git-annex.exe + +This makes git-annex unusable over ssh (Windows box runs cygwin sshd). + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +Windows 7 64bit + +git annex version +git-annex version: 5.20140421-g78d6aa1 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_1_988768c3e4f30c751034a0b0390cdd88._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_1_988768c3e4f30c751034a0b0390cdd88._comment new file mode 100644 index 000000000..fc58c35dd --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_1_988768c3e4f30c751034a0b0390cdd88._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T18:12:34Z" + content=""" +You should be able to copy git-annex.exe to git-annex-shell.exe and that will be usable as git-annex-shell. I could make the windows installer do this, but without the ability to easily hard or symlink the files, it would double the disk space for what seems an unusual use case.. +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_2_70a6c9af57eed4f8ceb3de63cbf8a5e6._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_2_70a6c9af57eed4f8ceb3de63cbf8a5e6._comment new file mode 100644 index 000000000..dd8a5ef67 --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_2_70a6c9af57eed4f8ceb3de63cbf8a5e6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2014-05-16T18:58:13Z" + content=""" +Hmm, I don't understand the double disk space issue. +If direct mode is used, files are stored once, right? + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_3_7f48959c6242c5cc52e9d0a79fd3f85d._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_3_7f48959c6242c5cc52e9d0a79fd3f85d._comment new file mode 100644 index 000000000..634c0d8b6 --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_3_7f48959c6242c5cc52e9d0a79fd3f85d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-05-16T20:36:02Z" + content=""" +I mean that copying git-annex.exe to git-annex-shell.exe doubles the disk space needed to install git-annex. +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_4_04b30dd9e510762ee547e7b45bdba660._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_4_04b30dd9e510762ee547e7b45bdba660._comment new file mode 100644 index 000000000..4a6fd402d --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_4_04b30dd9e510762ee547e7b45bdba660._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 4" + date="2014-05-24T21:26:24Z" + content=""" +I tried copying git-annex.exe to git-annex-shell.exe, but it doesn't behave as git-annex-shell: + +git-annex-shell -c configlist +git-annex-shell.exe: unknown command configlist + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_5_beebbd4a41cccfc7aac3c19d76c3b978._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_5_beebbd4a41cccfc7aac3c19d76c3b978._comment new file mode 100644 index 000000000..9d9acf54f --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_5_beebbd4a41cccfc7aac3c19d76c3b978._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 5" + date="2014-05-24T21:45:55Z" + content=""" +Looks like .exe prefix confuses detection logic. If I remove extension, it does behave as git-annex-shell. +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_6_957c5da5f336c7ef59e4149602471888._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_6_957c5da5f336c7ef59e4149602471888._comment new file mode 100644 index 000000000..c9d4c3a6a --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_6_957c5da5f336c7ef59e4149602471888._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 6" + date="2014-05-24T21:49:47Z" + content=""" +However, it's still not usable remotely over ssh: + +git annex sync kpf + +git-annex-shell: git: createProcess: invalid argument (Invalid argument) + + Remote kpf does not have git-annex installed; setting annex-ignore + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_7_a8654cf656de55ccdcf40270a1ef4ca9._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_7_a8654cf656de55ccdcf40270a1ef4ca9._comment new file mode 100644 index 000000000..1733b29dd --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_7_a8654cf656de55ccdcf40270a1ef4ca9._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 7" + date="2014-05-24T22:07:15Z" + content=""" +OK thought I'd use it with annex-ignore set, but: + + git annex copy --to=kpf file.jpg + copy file.jpg (checking kpf...) git-annex-shell: git: createProcess: invalid argument (Invalid argument) +(to kpf...) + git-annex-shell: git: createProcess: invalid argument (Invalid argument) + rsync: connection unexpectedly closed (0 bytes received so far) [sender] + rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0] + + rsync failed -- run git annex again to resume file transfer + failed +git-annex: copy: 1 failed + + +For reference, here's the .git/config section. + +I can either set receivepack/uploadpack like below or add /cygdrive/c/Program Files (x86)/Git/libexec/git-core to PATH in cygwin shell. + +Also, if I set url to kp:/cygdrive/f/backup/f, git complains that it's not a git repository (msysgit doesn't understand cygwin stuff?) + + [remote \"kpf\"] + url = kp:f:/backup/ph + fetch = +refs/heads/*:refs/remotes/kpf/* + receivepack = git receive-pack + uploadpack = git upload-pack + annex-uuid = 99c498fc-e38e-11e3-8bb0-5368a291bd90 + annex-ignore = true + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_8_3c8bb1b1d67ca1a6e568e381d24a2574._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_8_3c8bb1b1d67ca1a6e568e381d24a2574._comment new file mode 100644 index 000000000..ba7fadc23 --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_8_3c8bb1b1d67ca1a6e568e381d24a2574._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 8" + date="2014-05-24T22:58:16Z" + content=""" +Another data point. If I install cygwin's git (so references like kp:/cygdrive/f would be understood) and remove annex-ignore setting, I get: + + git annex sync kpf + commit ok + pull kpf + git-annex: Unknown command 'kp' + +Looks like hostname (kp) is taken as a command somehow. + +"""]] diff --git a/doc/bugs/no_git-annex_shell_on_Windows/comment_9_03646c9df9d4f4ea27459660fe65a976._comment b/doc/bugs/no_git-annex_shell_on_Windows/comment_9_03646c9df9d4f4ea27459660fe65a976._comment new file mode 100644 index 000000000..7a5152b59 --- /dev/null +++ b/doc/bugs/no_git-annex_shell_on_Windows/comment_9_03646c9df9d4f4ea27459660fe65a976._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="comment 9" + date="2014-07-05T22:29:01Z" + content=""" +Copying the `git-annex.exe` does work but you can also create a symlink and tell Windows to execute symlinks by doing the following. + +On the remote machine (the one you are connecting to) + +## Create a symlink: + + mklink \"C:\Program Files (x86)\Git\bin\git-annex-shell\" \"C:\Program Files (x86)\Git\bin\git-annex.exe\" + +## Tell Windows to run files with no extension: + +* Open Environment Variables +* At the end of `PATHEXT` add `;.` + +## A problem with rsync + +Unfortunately I now get `Access is denied` and `rsync: connection unexpectedly closed`. I think this is due to path issues on Windows. Trying rsync manually I need to use the `/cygdrive/c/rest/of/path` syntax otherwise I get `No such file or directory.` + + +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn new file mode 100644 index 000000000..1dca84346 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. + +Changing a file in a repository from a symlink to a normal file causes annex to create an annexed file from that typechange regardless of weather or not it was an annexed file. + + +### What steps will reproduce the problem? + + git init newrepo + cd newrepo && git annex init + touch realfile + git add . + git commit -m "added realfile" + mkdir newdir && cd newdir + ln -s ../realfile newfile + git add . + git commit -m "Added placeholder until we get assets from designers" + rm newfile + dd bs=1024 count=10000 if=/dev/zero of=newfile + git add . + git commit -m "Finally got assets from designers" + ls -la newfile + # lrwxrwxrwx 1 user user newfile -> ../.git/annex/objects/XX/XX/UUID/UUID + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130802 + +Ubuntu 12.04 LTS + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_1_6ac691645edb483797bee05043fd83b3._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_1_6ac691645edb483797bee05043fd83b3._comment new file mode 100644 index 000000000..a3c162d61 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_1_6ac691645edb483797bee05043fd83b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 1" + date="2013-08-12T20:19:37Z" + content=""" +It looks like all the \"add\" operations are missing from the log, which makes it a bit hard to follow... +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_2_5d67e3a60b7cc30c2b1857f50895d363._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_2_5d67e3a60b7cc30c2b1857f50895d363._comment new file mode 100644 index 000000000..c122bd92f --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_2_5d67e3a60b7cc30c2b1857f50895d363._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 2" + date="2013-08-12T20:41:34Z" + content=""" +Sorry about that. I forgot that -a doesn't add files. +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_3_78f1e081b92f418c20893d86a8715501._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_3_78f1e081b92f418c20893d86a8715501._comment new file mode 100644 index 000000000..d00556c75 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_3_78f1e081b92f418c20893d86a8715501._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 3" + date="2013-08-12T20:48:42Z" + content=""" +There are still no git-annex actions in the log, except for the init. So the end result for ls -la is not possible with those commands. You may want to try to reproduce it again and write down the exact command sequence used ;) +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment new file mode 100644 index 000000000..d68b3ea35 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 4" + date="2013-08-12T21:07:45Z" + content=""" +@arand: That's precisely the problem! I think you'll find if you run those commands exactly, that's what you'll get. + +It's got something to do with the git annex pre-commit hook that runs and checks for typechanges. + +I shortened the output on the last command to be less verbose, but if the full output is needed, I'll add it. +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_5_5e74431048b07631e0dbeca90fdb365b._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_5_5e74431048b07631e0dbeca90fdb365b._comment new file mode 100644 index 000000000..b2f525648 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_5_5e74431048b07631e0dbeca90fdb365b._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 5" + date="2013-08-12T21:50:47Z" + content=""" +Hmm, I think I see it now, you were missing a `rm` command in the log, and I had no idea the pre-commit hook existed :) + +This reproduces the issue, and it seems to indeed be a bug in the git-annex pre-commit handling, nice catch. + +
+$ git init temp
+Initialized empty Git repository in /home/arand/tmp/temp/.git/
+$ cd temp && git annex init
+init  ok
+(Recording state in git...)
+$ ln -s broken link
+$ git add .
+$ git commit -m\"add broken link\"
+[master (root-commit) 8125488] add broken link
+ 1 file changed, 1 insertion(+)
+ create mode 120000 link
+$ rm link
+$ echo \"actual file\" >link
+$ git add .
+$ git commit -m\"replace link with real file\"
+add link (checksum...) ok
+ok
+(Recording state in git...)
+[master b58b068] replace link with real file
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+$ git diff HEAD~ | cat
+diff --git a/link b/link
+index 86a410d..4104f6e 120000
+--- a/link
++++ b/link
+@@ -1 +1 @@
+-broken
+\ No newline at end of file
++.git/annex/objects/v4/GQ/SHA256E-s12--ef29ded6f5ae80d89a838d37e01ed3efaade7a2994aff87d1100697554b7327b/SHA256E-s12--ef29ded6f5ae80d89a838d37e01ed3efaade7a2994aff87d1100697554b7327b
+\ No newline at end of file
+$
+
+ + + +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_6_3724e1c1a5fc6d3589452478249792ec._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_6_3724e1c1a5fc6d3589452478249792ec._comment new file mode 100644 index 000000000..9c558e05e --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_6_3724e1c1a5fc6d3589452478249792ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 6" + date="2013-08-12T21:53:17Z" + content=""" +Ah, you're very right. Thank you. +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment new file mode 100644 index 000000000..e781beae1 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 7" + date="2013-08-12T21:53:56Z" + content=""" +I updated the issue with the `rm` statement I forgot. +"""]] diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_8_c53ce2274388711ffbde1595b64f932b._comment b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_8_c53ce2274388711ffbde1595b64f932b._comment new file mode 100644 index 000000000..b4ef6b5c7 --- /dev/null +++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_8_c53ce2274388711ffbde1595b64f932b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 8" + date="2013-08-22T17:25:48Z" + content=""" +Yay for the git-annex community for another fine bug testcase! + +The problem is simply that it assumes any typechanged link was an annexed file, and doesn't doublecheck. Fixing that now.. +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status.mdwn b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status.mdwn new file mode 100644 index 000000000..a66d8635a --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status.mdwn @@ -0,0 +1,89 @@ +### Please describe the problem. + +when running ```git annex status``` i get 'alien' content in the list of repositories (some timestamps, something looking like git status messages, and a long list of ```(recovery from race)``` messages. the actual content seems fine and the list of repositories in the assistant looks ok, but the CLI status messages show this unusual content (full dump below). + +### What steps will reproduce the problem? + +not sure how i would go about reproducing this: i only noticed this weird output just now and i'm pretty sure it was fine 24h ago - in the meanwhile the single non-ordinary operation was deleting via the assistant's webapp an SSH remote, rsync+encryption, then creating it again as bare repo without encryption. + +after the assistant finished removing all the content from the previous annex directory, it stalled reporting deletion in progress (the annex directory's parent on the remote server was not writeable for the user used for the ssh connection - perhaps that was the cause). even after chowning the parent dir and restarting the assistant on my local workstation, the assistant would still show the remote as pending deletion. + +after a while i could add the remote again, setting it to be a git bare repo, and content was copied over. + +from the assistant's webapp, i still see the correct list of remotes, but the output of ```git annex status``` is as below. + +```.git/config``` also looks ok, listing some core settings, some annex settings and my three real remotes for this annex. + +the part of logs relevant to the above change (deletion of remote, creation of new one + content sync) is unfortunately gone from the annex logs (including the rotated ones in ```.git/annex/daemon.log*```). + +### What version of git-annex are you using? On what operating system? + +4.20130709:amd64 on Debian testing (linux 3.9.8-1) + + +### Please provide any additional information below. + +[[!format sh """ +$ git annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git S3 bup directory rsync web webdav glacier hook +repository mode: direct +trusted repositories: 7 + 1359161911.638435s -- 1 + 1359161913.173474s -- 1 + 1359161913.288686s -- 1 + 1359332402.294867s -- 1 + 1359332406.839623s -- 1 + 1359332407.454511s -- 1 + 1359332411.932021s -- 1 +semitrusted repositories: 36 + 00000000-0000-0000-0000-000000000001 -- web + 00511808-8d7c-11e2-a252-43e07a9aaa3c -- client + 12527a3a-a21d-4cc7-a7ea-074e8fd0260f -- annex_on_rpi00 (standard) + 12a7b66c-e681-4dcc-bf75-b995512e5e76 -- client + 1359159154.357141s -- 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359159155.817851s -- 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359159155.931382s -- 1 e08336a0-6742-11e2-8a53-17c5ab00507f + 1359161255.198519s -- 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359161256.72633s -- 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359161256.952372s -- 1 e08336a0-6742-11e2-8a53-17c5ab00507f + 1359332437.573825s -- 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332440.782882s -- 0 2e71af50-674c-11e2-b542-6397738d1182 + 1359332441.153755s -- 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332448.091981s -- 0 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359332507.354892s -- 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332512.553832s -- 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332512.666779s -- 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332517.773994s -- 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332523.112182s -- 0 2ce1be52-6745-11e2-83e5-e7d111798afd + 1374091795.70517s -- 1 2e71af50-674c-11e2-b542-6397738d1182 + 1374507271.515001s -- 0 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 + 1374507272.066961s -- 0 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 + 1a76c11b-b359-4606-be1d-cc3b17dc684e -- client + 2ce1be52-6745-11e2-83e5-e7d111798afd -- git.services__data_annex_ (transfer) + 2e71af50-674c-11e2-b542-6397738d1182 -- here (client) + 42c358c4-6741-11e2-ba3f-8bdecec02757 -- x11miel.local_data_annex (em@10.10.10.100:~/data/annex) + 4eb75def-169c-45f8-b9b0-a0aa52017bd6 -- client + 92aa538c-8d7b-11e2-9ae1-3fd2531928c1 -- client + author -- nnnn nnnn 1374509958 +0100 + committer -- nnnn nnnn 1374509958 +0100 + d83e4134-8d7a-11e2-8822-7f2218f2cc42 -- client + e08336a0-6742-11e2-8a53-17c5ab00507f -- backup + f7969bd0-d5dc-11e2-b362-cbb323f72415 -- transfer + merging -- 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + parent -- fcde6fd44ff2ad2aaca895bca1b32fb398d76545 + tree -- b6d4b49d9b67b296b0a0d9a800b96f88d480f923 +untrusted repositories: 2 + 1359332417.999925s -- 0 + 1374507270.94356s -- 0 +transfers in progress: none +available local disk space: 6 gigabytes (+1 megabyte reserved) +local annex keys: 1984 +local annex size: 6 gigabytes +known annex keys: 1989 +known annex size: 6 gigabytes +bloom filter size: 16 mebibytes (0.3% full) +backend usage: + SHA256E: 3973 +$ +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_1_fcd230cbb2ac363c469b98021042c011._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_1_fcd230cbb2ac363c469b98021042c011._comment new file mode 100644 index 000000000..c9aa34806 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_1_fcd230cbb2ac363c469b98021042c011._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="git annex status output on connected nodes" + date="2013-07-25T16:42:04Z" + content=""" +i have now updated the git-annex package to the latest 4.20130723:amd64 still on Debian testing (linux 3.9.8-1) - i see the same issue (while files keep synchronising fine across the various connected nodes). + +i have noticed that the same output appears when i issue ```git annex status``` on the other nodes (an Ubuntu 13.04 with kernel 3.9.7 amd64 and a Debian stable with 3.10.1-1 amd64, all with latest Debian 4.20130723:amd64 package). +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_2_23207ecabd4b41d9551d0491fa71e96b._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_2_23207ecabd4b41d9551d0491fa71e96b._comment new file mode 100644 index 000000000..3c9d1f36f --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_2_23207ecabd4b41d9551d0491fa71e96b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-07-25T20:12:06Z" + content=""" +Please paste the output of: `git show git-annex:uuid.log` + +The file seems to have a lot of garbage in it. The \"merging -- 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race)\" in particular is only ever passed to git as the commit message. It should not be possible for it to appear in a file unless data has somehow become corrupted. + +So, I think you should also run `git fsck`. You may also find that it helps to shut down any running git-annex, and move `.git/annex/index` away to a backup location. A corrupted index file would be kind of be the best scenario since git-annex can automatically rebuild it from the git repository.. +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment new file mode 100644 index 000000000..56ae258a7 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment @@ -0,0 +1,119 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="comment 3" + date="2013-07-26T14:54:23Z" + content=""" +thanks Joey. + +output from ```git show git-annex:uuid.log``` is below. + +```git fsck``` shows me 4201 lines of ```dangling blob ```. + +```git annex fsck``` instead checksums all the files and only reports a single error about no known copies of an individual file. i guess this can be relied upon to confirm that the actual data is fine? + +i have also tried shutting down any running git-annex and moving the index file away - it was rebuilt when i restarted the assistant, but i still get the same output from ```git annex status```. + +i should probably work around this by just copying the annex folder's contents to a new folder and create a new annex there (perhaps in indirect mode rather than direct as it is now, as this is mostly a document archive with no further changes to files except some occasional renaming) and create my remotes from scratch, but now i'm quite curious about trying to track down what happened and to understand if the annex is reliably storing and syncing content even though the status message contains alien data. + + +(output from ```git show git-annex:uuid.log``` follows) + + 00511808-8d7c-11e2-a252-43e07a9aaa3c client timestamp=1363357452.108251s + 12527a3a-a21d-4cc7-a7ea-074e8fd0260f pi@pi0:/mnt/annex/00/annex timestamp=1374508625.460693s + 12527a3a-a21d-4cc7-a7ea-074e8fd0260f standard timestamp=1374508627.738835s + 12527a3a-a21d-4cc7-a7ea-074e8fd0260f transfer timestamp=1374508627.731088s + 12a7b66c-e681-4dcc-bf75-b995512e5e76 client timestamp=1363469702.545491s + 1359159154.357141s 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359159155.817851s 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359159155.931382s 1 e08336a0-6742-11e2-8a53-17c5ab00507f + 1359161255.198519s 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359161256.72633s 1 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359161256.952372s 1 e08336a0-6742-11e2-8a53-17c5ab00507f + 1359161911.638435s 1 + 1359161913.173474s 1 + 1359161913.288686s 1 + 1359332402.294867s 1 + 1359332406.839623s 1 + 1359332407.454511s 1 + 1359332411.932021s 1 + 1359332417.999925s 0 + 1359332437.573825s 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332440.782882s 0 2e71af50-674c-11e2-b542-6397738d1182 + 1359332441.153755s 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332448.091981s 0 2ce1be52-6745-11e2-83e5-e7d111798afd + 1359332507.354892s 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332512.553832s 1 2e71af50-674c-11e2-b542-6397738d1182 + 1359332512.666779s 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332517.773994s 1 42c358c4-6741-11e2-ba3f-8bdecec02757 + 1359332523.112182s 0 2ce1be52-6745-11e2-83e5-e7d111798afd + 1374091795.70517s 1 2e71af50-674c-11e2-b542-6397738d1182 + 1374507270.94356s 0 + 1374507271.515001s 0 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 + 1374507272.066961s 0 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 + 1a76c11b-b359-4606-be1d-cc3b17dc684e client timestamp=1370536281.421365s + 2ce1be52-6745-11e2-83e5-e7d111798afd timestamp=1359155758.081281s + 2ce1be52-6745-11e2-83e5-e7d111798afd transfer timestamp=1359155760.243544s + 2e71af50-674c-11e2-b542-6397738d1182 em@x12yad:~/data/annex timestamp=1359158766.916677s + 2e71af50-674c-11e2-b542-6397738d1182 client timestamp=1359158766.994574s + 42c358c4-6741-11e2-ba3f-8bdecec02757 em@10.10.10.100:~/data/annex timestamp=1359314998.998417s + 42c358c4-6741-11e2-ba3f-8bdecec02757 em@x11miel:~/data/annex timestamp=1359154076.554768s + 42c358c4-6741-11e2-ba3f-8bdecec02757 client timestamp=1359154076.649004s + 4eb75def-169c-45f8-b9b0-a0aa52017bd6 client timestamp=1363467301.827658s + 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 X timestamp=1374508357.215776s + 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 backup on rPi Zero timestamp=1374398146.433271s + 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 standard timestamp=1374508303.429835s + 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 unwanted timestamp=1374506712.447376s + 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 unwanted timestamp=1374508303.426075s + 92aa538c-8d7b-11e2-9ae1-3fd2531928c1 client timestamp=1363357265.665495s + author nnnn nnnn 1374508641 +0100 + author nnnn nnnn 1374508642 +0100 + author nnnn nnnn 1374508643 +0100 + author nnnn nnnn 1374508644 +0100 + author nnnn nnnn 1374508645 +0100 + author nnnn nnnn 1374509958 +0100 + committer nnnn nnnn 1374508641 +0100 + committer nnnn nnnn 1374508642 +0100 + committer nnnn nnnn 1374508643 +0100 + committer nnnn nnnn 1374508644 +0100 + committer nnnn nnnn 1374508645 +0100 + committer nnnn nnnn 1374509958 +0100 + d83e4134-8d7a-11e2-8822-7f2218f2cc42 em@x11miel:~/data/photos timestamp=1363356952.82141s + d83e4134-8d7a-11e2-8822-7f2218f2cc42 client timestamp=1363356952.865265s + e08336a0-6742-11e2-8a53-17c5ab00507f backup timestamp=1359154795.94703s + f7969bd0-d5dc-11e2-b362-cbb323f72415 timestamp=1371315579.82712s + f7969bd0-d5dc-11e2-b362-cbb323f72415 transfer timestamp=1371315580.420388s + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + merging 10.10.10.10__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) + parent 02683b204119ba5668286ef6aa803bb52d3515d0 + parent 07e2a9755790cefa6004496570bc8094aa757afa + parent 09199d3870ae53d6a602c26f4b9d59f62411236c + parent 0d436b9b3c3766dec276f32fdb80251c2159c154 + parent 5aca77f1f93d2f34b521e7844b0608242a70f68f + parent 5e3331cc8f28603e4cb8ce890fbe221d3857717c + parent 92b9cacae1f40a23a2e8d5feea2b058e39806bd4 + parent bc52e17b49503d598347bc7ddb1fa05a1ca6eba2 + parent bfc242d6cfc27ec5fb7ec5fdb745ef8e08028fd9 + parent d7867e1afaa32a829cb875589764e921a92bde5b + parent ecab3543a69ac98a1509933fa25600ac3f9c091b + parent fcde6fd44ff2ad2aaca895bca1b32fb398d76545 + tree 14dc2bb1ff7682d7c2f4d14ae1e5c378b0b89d47 + tree 59d730a282fa721332a4a2686061d6ee11024e72 + tree 5a452c8e00eb1d1fb67ef63ed74381b8f80b2ae0 + tree 80cc5887614c1d5dd200b2ea6a90ee6b881b966b + tree af2b572801e828df16c195d4dfd368a1f37db33f + tree b026659bb4b1bf02bf146c0b873244230c7cea06 + tree b33eaa96e7f04c014c93b4e388d831d6ec7c3746 + tree b6d4b49d9b67b296b0a0d9a800b96f88d480f923 + +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_4_d0e55585f1612148163039d157253258._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_4_d0e55585f1612148163039d157253258._comment new file mode 100644 index 000000000..1e2a8fe24 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_4_d0e55585f1612148163039d157253258._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-07-26T16:52:26Z" + content=""" +The 4201 dangling blobs is a little bit strange, although it could certainly happen in some normal scenarios. +Overall, your repository seems to be ok except for this weird data in the one file. I do not anticipate the extra garbage causing any problems at all. + +To track this down, we need to find the commit that added the garbage. One way, assuming you're using indirect mode, is to `git checkout git-annex; git blame uuid.log` and `git show` the commit that added the garbage. If you're using direct mode, you should first `git clone` the repository and do that in the clone. +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_6_5506dc1b08516677886da4aa97263864._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_6_5506dc1b08516677886da4aa97263864._comment new file mode 100644 index 000000000..1aaeff404 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_6_5506dc1b08516677886da4aa97263864._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 6" + date="2013-07-26T20:59:42Z" + content=""" +I think that the whole `git show $sha` for each commit will provide useful context. + +I want to understand what happened here, because there are multiple weird things going on, and it's important to root cause this sort of bug. + +What version of git-annex is on the rPi and how was it installed? Is there a simple operation you can do that segfaults every time? +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_073449cc2cb73efd2b2d3d778a5573de._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_073449cc2cb73efd2b2d3d778a5573de._comment new file mode 100644 index 000000000..f7046a349 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_073449cc2cb73efd2b2d3d778a5573de._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="comment 7" + date="2013-07-26T22:31:15Z" + content=""" +thanks Joey. i'm sending the output of ```git show $sha``` separately as it contains some non-public data; according to apt/dpkg logs, the rPi was actually using git-annex:armhf 4.20130521 from Debian testing at the time these commits were done. i did in fact install 4.20130709 and then 4.20130723 a couple of days after the issue showed up, but only yesterday i realised that both versions were segfaulting all the time (just invoking ```git-annex``` would segfault); 4.20130521 works reliably, instead (i have just downgraded to test), so my previous question about an interrupted operation possibly causing the metadata corruption is not valid as the git-annex executable in use at the time of the issue was not segfaulting (at least not under every circumstance as the more recent versions *in my setup* - but i'll dig into this separately - probably some library issue or so). + +the only change i can't really trace in terms of timing is when i deleted the remote i had originally set up on my rPi (using encrypted rsync) via the assistant's web interface on my laptop, and set it up again as plain unencrypted ssh remote (bare repo). i'm pretty sure this operation was done the day the commits in the ```git blame``` for ```uuid.log``` were done, but i'm not sure about the time and don't have logs going back to that moment. + +i could disconnect all the remotes from my laptop and redo the setup on the rPi to see if i can reproduce the issue, but i would need some pointers on how to revert my main annex on my laptop to the state it was in before i first started using the rPi as remote: can i just ```git reset --hard ``` while on the ```git-annex``` branch? the annex is currently in direct mode (and as been so for a few months now). + +otherwise, i could easily copy all the data (or a subset, to start with) to a clean folder, set up a fresh annex there and pair the rPi again - if the corruption was due to some issue on the rPi it may not depend on the exact status the annex was at when the metadata corruption happened (although my full setup includes other remotes and i see some back-and-forth of merging going on throughout the history of the annex around the time the metadata issue started, so it may be hard to reproduce the exact same context). +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_3516e71ba3b07427a10cbb4965712aa6._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_3516e71ba3b07427a10cbb4965712aa6._comment new file mode 100644 index 000000000..d8e91fdd4 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_3516e71ba3b07427a10cbb4965712aa6._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="comment 7" + date="2013-07-26T18:11:25Z" + content=""" +thanks; the current ```uuid.log``` file carries content from 8 distinct commits : + + 335cb49c 2013-07-22 16:57:32 +0100 + 4ec397f7 2013-07-22 16:57:26 +0100 + 50542096 2013-07-22 17:19:21 +0100 + 621a1a03 2013-07-22 16:57:28 +0100 + 63dd4509 2013-07-22 16:57:26 +0100 + 8c2d3ff7 2013-07-22 16:57:19 +0100 + 9ba4166d 2013-07-22 18:38:29 +0100 + e182ee60 2013-07-22 16:57:26 +0100 + +would the whole diff for each commit be useful, or just the part related to uuid.log? + +all these commits were done by git-annex on my laptop; the earliest of these commits come seconds after two commits done on another node - a raspberry pi running armhf Raspbian, although i now see that ```git-annex``` and ```git-annex-shell``` on this rPi are constantly segfaulting (though i can't understand the reason from the strace output): perhaps a segfault while dealing with a git operation on the rPi started the metadata corruption somehow? + +btw - if this could be useful to track down a possible bug in git-annex (although only involving some metadata, not the actual data), i am happy to dig further to provide all the information needed to understand what might have happened, but if it's not something worth investigating further in the bigger scheme of things, from my point of view i'm ok with restarting a fresh annex with content moved from this annex, and pristine metadata :) + +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_8_ea2e4704adb2f304f9c11c61eb62e919._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_8_ea2e4704adb2f304f9c11c61eb62e919._comment new file mode 100644 index 000000000..a87e4cab2 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_8_ea2e4704adb2f304f9c11c61eb62e919._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="comment 8" + date="2013-07-26T22:38:51Z" + content=""" +forgot to mention - git-annex:armhf 4.20130521 was installed on the rPi via apt-get after having added testing as extra source besides the base stable of Raspbian; the other two versions (the segfaulting ones) were installed via ```dpkg -i``` on the packages downloaded directly from packages.d.o. +"""]] diff --git a/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_9_4d17fedead7977541371a3f2c192e030._comment b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_9_4d17fedead7977541371a3f2c192e030._comment new file mode 100644 index 000000000..f2d9f56d8 --- /dev/null +++ b/doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_9_4d17fedead7977541371a3f2c192e030._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 9" + date="2013-07-27T17:37:11Z" + content=""" +Here's an excerpt of the first commit where uuid.log got garbage into it. It seems that some other log files got garbage put in them before this point, and it will be interesting to see if every time new garbage gets in it's doing a \"(recovery from race)\" commit. If so, that would point pretty strongly at that code as a culprit. + +(Of course, it's intriguing that the race recovery commit itself seemed to encounter a race and this repeated dozens of times. An exceptionally unlikely thing to happen if everything is behaving correctly.) + +
+commit 8c2d3ff75431873d99c512bcae007d68ff0b565e 
+Author: REDACTED AUTHOR
+Date:   Mon Jul 22 16:57:19 2013 +0100
+
+    merging 10.4.10.106__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race)
+
+diff --git a/uuid.log b/uuid.log
+index 7e7e0f9..0423e02 100644
+--- a/uuid.log
++++ b/uuid.log
+@@ -1,4 +1,6 @@
++
+ 00511808-8d7c-11e2-a252-43e07a9aaa3c client timestamp=1363357452.108251s
++12527a3a-a21d-4cc7-a7ea-074e8fd0260f pi@pi0:/mnt/annex/00/annex timestamp=1374508625.460693s
+ 12527a3a-a21d-4cc7-a7ea-074e8fd0260f transfer timestamp=1374508627.731088s
+ 12a7b66c-e681-4dcc-bf75-b995512e5e76 client timestamp=1363469702.545491s
+ 1359159154.357141s 1 2ce1be52-6745-11e2-83e5-e7d111798afd
+@@ -28,6 +30,13 @@
+ 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 unwanted timestamp=1374506712.447376s
+ 8d243fde-0c4c-4a19-8bce-ac1beb48eef0 unwanted timestamp=1374508303.426075s
+ 92aa538c-8d7b-11e2-9ae1-3fd2531928c1 client timestamp=1363357265.665495s
++author REDACTED AUTHOR 1374508635 +0100
++committer REDACTED AUTHOR 1374508635 +0100
+ d83e4134-8d7a-11e2-8822-7f2218f2cc42 client timestamp=1363356952.865265s
+ e08336a0-6742-11e2-8a53-17c5ab00507f backup timestamp=1359154795.94703s
+ f7969bd0-d5dc-11e2-b362-cbb323f72415 transfer timestamp=1371315580.420388s
++merging 10.4.10.106__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race)
++merging 10.4.10.106__mnt_annex_00_annex/git-annex into git-annex (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race) (recovery from race)
++parent 059104588cc3c45a762586843e8ae375473993af
++parent 21a14d1ed6ea5afa11eb07c7f16fb2dd03f5d64c
++tree c4ebf18a3d1d7862484b1378124c8cb7d2c704da
+
+ +Looks a lot like a whole git commit object was union merged into the file, doesn't it? +"""]] diff --git a/doc/bugs/numcopies_deprecated__44___but_still_in_walkthrough.mdwn b/doc/bugs/numcopies_deprecated__44___but_still_in_walkthrough.mdwn new file mode 100644 index 000000000..12e2672f3 --- /dev/null +++ b/doc/bugs/numcopies_deprecated__44___but_still_in_walkthrough.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. +Within the walkthrough the deprecated annex.numcopies are still used. At least it should be added that "git annex numcopies x" can be used to define it globally without the need for a .gitattribute file. And use .gitattribute only for per directory and fine grained control. +http://git-annex.branchable.com/walkthrough/backups/ + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn b/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn new file mode 100644 index 000000000..6c8f73f5e --- /dev/null +++ b/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn @@ -0,0 +1,52 @@ +### Please describe the problem. + +When git annex is used on a encfs mount, ``.fuse_hiddenXXXX`` files are left behind in ``.git/annex/objects/*/*/`` when I ``git annex move`` files off the encfs + +### What steps will reproduce the problem? + + mkdir normal plain enc + encfs -o kernel_cache "$(realpath enc)" "$(realpath plain)" + + cd normal + git init + git annex init normal + + cd ../plain + git init + git annex init enc + dd if=/dev/urandom bs=1M count=11 of=11m + git annex add 11m + git remote add normal "$(realpath ../normal)" + du -hscL * + << 11MB-ish >> + du -hsc .git/annex/objects + << 11MB-ish >> + git annex move --to=normal 11m + du -hscL * + << 0 >> + du -hsc .git/annex/objects + << 11MB-ish but should be 0-ish >> + tree -a .git/annex/objects + << ??/??/SHA1-*/.fuse_hidden??????? >> + lsof .git/annex/objects/??/??/SHA*/.fuse_hidden* + << shows no programs have this file open >> + + +### What version of git-annex are you using? On what operating system? + +5.20131221 on debian unstable (installed by aptitude from debian/main) + +### Please provide any additional information below. + +I did a couple quick internet searches on these .fuse_hidden files, and (if a random person on the internet is correct) they are created by enfs (or maybe fuse itself) when a file is unlinked while open. It is supposed to be deleted when the file is closed. + +Possibilities come to mind: + +* There's a bug in encfs/fuse +* git annex fails to close the file, and whatever cleanup happens when the linux kernel closes git annex fails to trigger encfs/fuse's real unlinking/cleanup thing + + + +I'm happy to help with further testing, experimenting, etc. I'm good at git, the commandline, programming, etc but I don't know Haskell. + +- Jason diff --git a/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind/comment_1_b96ea3ece44d42e79e4d903ca66065ee._comment b/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind/comment_1_b96ea3ece44d42e79e4d903ca66065ee._comment new file mode 100644 index 000000000..bf7aaedee --- /dev/null +++ b/doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind/comment_1_b96ea3ece44d42e79e4d903ca66065ee._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-31T19:35:20Z" + content=""" +When git-annex is deleting an object's content, it opens the object, locks it, unlinks it, and closes it. This is necessary in order to avoid various race conditions that could cause data loss (ie, another repository might be in the process of verifying that the object that is being deleted is present). + +I suspect that is what causes the problem with encfs. Since it is entirely a valid POSIX operation to do this, and since not doing it could cause data loss in some situations, I am very reluctant to change anything in git-annex in this area. + +It's unfortunate that encfs seems to cause so many problems for POSIX filesystem semantics. Luckily, there are other ways to encrypt filesystems that do not suffer from such problems. +"""]] diff --git a/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn new file mode 100644 index 000000000..56311bc70 --- /dev/null +++ b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +Filenames for the *include* statement for [preferred content](http://git-annex.branchable.com/preferred_content/) can not contain spaces. + +### What steps will reproduce the problem? + +* Create an annex repo +* Run `git annex vicfg` +* Enter expression *include='pictures/dir with spaces'* +* git annex complains: # ** Parse error in next line: Parse failure: near "with" Parse failure: near "spaces'" + +(The *'* is interpreted as part of the filepath.) + +### What version of git-annex are you using? On what operating system? + +I am using the current binaries from Debian stable amd64. + +
+git-annex version: 5.20140320~bpo70+1
+build flags: Assistant Webapp Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+remote types: git gcrypt S3 bup directory rsync web tahoe glacier hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+
+ +### Please provide any additional information below. + +The only workaround I found is to use a glob for the filepath which only works for the first space: *include='pictures/dir\*'*. + +[[!tag confirmed]] diff --git a/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment new file mode 100644 index 000000000..a7438c559 --- /dev/null +++ b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T18:45:36Z" + content=""" +A better workaround is: + +include='pictures/dir?with?spaces' + +Tokenizing text with embedded quotes is a bit of a PITA, certianly doable I suppose.. +"""]] diff --git a/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_2_986a393a512229d35e529ba242b77b1e._comment b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_2_986a393a512229d35e529ba242b77b1e._comment new file mode 100644 index 000000000..7dbeb3d08 --- /dev/null +++ b/doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_2_986a393a512229d35e529ba242b77b1e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="comment 2" + date="2014-04-02T21:29:54Z" + content=""" +Thanks for your workaround ... Works for me after removing the single quote signs. + +With this workaround on hand one could include/match any filename. Works for me ;) +"""]] diff --git a/doc/bugs/problem_commit_normal_links.mdwn b/doc/bugs/problem_commit_normal_links.mdwn new file mode 100644 index 000000000..6dbd41fb4 --- /dev/null +++ b/doc/bugs/problem_commit_normal_links.mdwn @@ -0,0 +1,59 @@ +Dear All, + +thank you for this wonderful tool! + +I am having an issue when I try to commit a normal link + +diokletian*194-> mkdir test + +diokletian*195-> cd test + +diokletian*196-> git init + +Initialized empty Git repository in /home/henrus/test/.git/ + +diokletian*197-> git annex init new + +init new [master (root-commit) 49f5f91] git-annex setup + + 1 files changed, 1 insertions(+), 0 deletions(-) + + create mode 100644 .gitattributes + +[master 76496ff] git annex init + + 1 files changed, 1 insertions(+), 0 deletions(-) + + create mode 100644 .git-annex/uuid.log + +ok + +diokletian*198-> mkdir subdir + +diokletian*199-> ln -s subdir link + +diokletian*200-> git add link + +diokletian*201-> git commit -m "ok" + +[master f12f62d] ok + + 1 files changed, 1 insertions(+), 0 deletions(-) + + create mode 120000 link + +diokletian*202-> ln -s subdir/ link2 + +diokletian*203-> git add link2 + +diokletian*204-> git commit -m "not ok" + +git-annex: Prelude.head: empty list + +The trailing slash seems to make a difference! + +Best Regards, + +Henrik + +> Thanks for the bug report. This is fixed in 0.17. --[[Joey]] [[!tag done]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn b/doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn new file mode 100644 index 000000000..7f37668ad --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn @@ -0,0 +1,3 @@ +On several of my repos, the upgrade to v3 seemed to take forever. A Crl-C followed by another "git annex upgrade" "solved" the problem in some cases. Sometimes, I had to also delete the .git/annex/journal dir to have the upgrade. I didn't notice anything special about the non-working repos to help diagnose the problem. + +[[!tag done]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment new file mode 100644 index 000000000..0cf0ad461 --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-07-04T22:58:46Z" + content=""" +Well if it happens again why don't you use `ps` or `strace` to see what it's doing. +"""]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment new file mode 100644 index 000000000..4bef5f645 --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://lithitux.org/openidserver/users/pavel" + nickname="pavel" + subject=""Me too"" + date="2011-07-05T15:54:19Z" + content=""" +I've also seen this apparent hang during upgrade to v3. A few more details: + +The annex in question has just under 18k files (and hence that many log files), which can slow down directory operations when they're all in the same place (like, for example, .git/annex/journal). + +git-annex uses virtually no CPU time and disk IO when it's hanging like this; the first time it happened, 'ps' showed three defunct git processes, with two \"git-annex\" processes and three \"git\" procs: + + * git --git-dir=/mnt/annex/.git --work-tree=/mnt/annex cat-file --batch + * git --git-dir=/mnt/annex/.git --work-tree=/mnt/annex hash-object -w --stdin-paths + * git --git-dir=/mnt/annex/.git --work-tree=/mnt/annex update-index -z --index-info + +I Ctrl+C'd that and tried again, but it hung again -- this time without the defunct gits. + +An strace of the process and its children at the time of hang can be found at http://pastebin.com/4kNh4zEJ . It showed somewhat weird behaviour: When I attached with strace, it would scroll through a whole bunch of syscalls making up the open-fstat-read-close-write loop on .git/annex/journal files, but then would block on a write (sorry, don't have that in my scrollback any more so can't give more details) until I Ctrl+C'd strace; when attaching again, it would again scroll through the syscalls for a second or so and then hang with no output. + +Ultimately I detached/reattached with strace about two dozen times and that caused it (?) to finish the upgrade; not really sure how to explain it, but it seems like too much of a timing coincidence. + +"""]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment new file mode 100644 index 000000000..e314e73fa --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-07-05T17:31:22Z" + content=""" +I've seen this kind of piping stall that is unblocked by strace before. It can vary with versions of GHC, so it would be good to know what version built git-annex (and on what OS version). I filed a bug report upstream before at . + +I really need a full strace -f from the top, or at least a complete `strace -o log` of git-annex from one hang through to another hang. The strace you pastebinned does not seem complete. If I can work out which specific git command is being written to when it hangs I can lift the writing out into a separate thread or process to fix it. + +@pavel, you mentioned three defunct git processes, and then showed ps output for 3 git processes. Were there 6 git processes in total? And then when you ran it again you said there were no defunct gits -- where the other 3 git processes running once again? + +As best I can make out from the (apparently) running git processes, it seems like the journal files for the upgrade had all been written, and the hang occurred when staging them all into the index in preparation for a commit. I have committed a change that lifts the code that does that write out into a new process, which, if I am guessing right on the limited info I have, will avoid the hang. + +However, since I can't reproduce it, even when I put 200 thousand files in the journal and have git-annex process them, I can't be sure. +"""]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment new file mode 100644 index 000000000..7bc32c259 --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-07-05T18:37:21Z" + content=""" +I've managed to reproduce this and confirmed my fix works. +"""]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment new file mode 100644 index 000000000..8649dc77a --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-07-05T19:06:48Z" + content=""" +By the way, the original bug reporter mentioned deleting .git/annex/journal. This is not recommended, and doing it during an upgrade can result in git-annex losing location tracking information. You should probably run `git annex fsck` or reset to the old git tree (and `git config annex.version 2`) and upgrade again. +"""]] diff --git a/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment new file mode 100644 index 000000000..0852db079 --- /dev/null +++ b/doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://lithitux.org/openidserver/users/pavel" + nickname="pavel" + subject="comment 6" + date="2011-07-06T08:14:26Z" + content=""" +Ah, great, thanks very much for the quick fix! + +Yes, when I mentioned three defunct git processes, there were three processes shown as \"git [defunct]\", plus the three git processes I listed, plus two \"git-annex\" processes. Upon cancel/resume, there were no defunct git processes when I checked, but by the time I found the bug report on the forum and commented I'd already successfully upgraded by annex (by repeatedly attaching strace) and couldn't really easily get at either additional 'ps' info or a fuller strace than what I posted (that was just the log from one of the attach/detach cycles), so it's a relief you managed to pinpoint the problem. +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg.mdwn b/doc/bugs/problems_with_android_and_gpg.mdwn new file mode 100644 index 000000000..ac5cab7cd --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg.mdwn @@ -0,0 +1,73 @@ +### Please describe the problem. +When my android phone tries to decode files downloaded from a ssh remote using shared encryption, gpg errors occur. + +### What steps will reproduce the problem? +Setup is very similar to my other bug report in . +Only difference is the location of the annex on the android side. +I have put it on the /data mount which uses ext4 to avoid the /sdcard fuse mount, which does not handle symlinks. + +1) setup git annex via webapp on laptop: + +* local annex + +* remote annex via ssh with shared encryption (tried two different servers, one with and one without git-annex installed) + +* share with my devices using jabber.me account + +2) setup git annex via webapp on android: + +* local annex in /data/data/ga.androidterm/annex (ext filesystem) + +* share with my devices using jabber.me account + +* ssh remote is automatically added via XMPP + +3) add file to annex on linux, which gets uploaded to the ssh remote + +4) symlink for file is created on phone and data downloaded, but never decrypted (see logs below) + +### What version of git-annex are you using? On what operating system? +Ubunut Linux 12.04 with git-annex version: + +* 5.20140127.1 (from PPA) + +Android 4.2 (rooted) with git-annex version: + +* 5.20140211-g556cfeb (from autobuilds) + +### Please provide any additional information below. +full logs: + +* linux: + +* android: + +most interesting parts: +[[!format sh """ +# +# android: +# +gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory +gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/secring.gpg.lock' done via O_EXCL +gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/pubring.gpg.lock' done via O_EXCL +gpg: decryption failed: bad key + +# followed by just the last line for all further attemps +gpg: decryption failed: bad key + +# gpg it self seems to be fine +root@android:/data/data/ga.androidterm # ./bin/gpg --version -v +gpg (GnuPG) 1.4.15 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Home: ~/.gnupg +Supported algorithms: +Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA +Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, + CAMELLIA128, CAMELLIA192, CAMELLIA256 +Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 +Compression: Uncompressed, ZIP, ZLIB +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg/comment_1_526d8805cb1ae896e8b1920ac2aecc17._comment b/doc/bugs/problems_with_android_and_gpg/comment_1_526d8805cb1ae896e8b1920ac2aecc17._comment new file mode 100644 index 000000000..308d7ed8d --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg/comment_1_526d8805cb1ae896e8b1920ac2aecc17._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/3f8a1927-744c-4409-8425-48fb3c86672f" + nickname="kim" + subject="comment 1" + date="2014-02-14T19:16:02Z" + content=""" +I am experiencing the exaxact same issue on android 4.3 with the current git-annex version (5.20140211) +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg/comment_2_2e1ae66bac4f55b74074b09e22ab270d._comment b/doc/bugs/problems_with_android_and_gpg/comment_2_2e1ae66bac4f55b74074b09e22ab270d._comment new file mode 100644 index 000000000..c7709f0fc --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg/comment_2_2e1ae66bac4f55b74074b09e22ab270d._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm78jq1Uo-ZbyOPG3diJUWVvEiM0kyAcvk" + nickname="Dorian" + subject="any ideas or questions?" + date="2014-02-25T13:41:16Z" + content=""" +Hey Joey, + +I was wondering if you had any idea how we could fix this problem or if you need further information on this. +Any response would be appreciated. + +Thanks for your great work on git-annex! + +Cheers, +Dorian +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg/comment_3_47510400e8e45a71a1581aed99a157a1._comment b/doc/bugs/problems_with_android_and_gpg/comment_3_47510400e8e45a71a1581aed99a157a1._comment new file mode 100644 index 000000000..2f663d943 --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg/comment_3_47510400e8e45a71a1581aed99a157a1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 3" + date="2014-02-26T18:34:18Z" + content=""" +AFAICS, the messages about locking are a red herring, since shared encryption is being used, the public and secret key rings are not used. + +This problem seems to be explained here: + +It seems there must be a problem with the symmetric key used for shared encryption. Either the repository somehow has the wrong key in it, or the key is not extracted from the repository correctly somehow, or it's not fed into gpg correctly somehow. +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg/comment_4_d28d773450d09e03160548d99f12256d._comment b/doc/bugs/problems_with_android_and_gpg/comment_4_d28d773450d09e03160548d99f12256d._comment new file mode 100644 index 000000000..8815f03c9 --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg/comment_4_d28d773450d09e03160548d99f12256d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm78jq1Uo-ZbyOPG3diJUWVvEiM0kyAcvk" + nickname="Dorian" + subject="comment 4" + date="2014-03-03T14:05:35Z" + content=""" +Is it correct, that the shared key is transfered through the git repo, meaning in this case XMPP? + +Then I guess this might simply be the problem of unreliable XMPP. +Same problem as here: + +"""]] diff --git a/doc/bugs/problems_with_android_and_gpg/comment_5_74f1177d6dd42bab5ddfc040cbfb035e._comment b/doc/bugs/problems_with_android_and_gpg/comment_5_74f1177d6dd42bab5ddfc040cbfb035e._comment new file mode 100644 index 000000000..a9d24b97d --- /dev/null +++ b/doc/bugs/problems_with_android_and_gpg/comment_5_74f1177d6dd42bab5ddfc040cbfb035e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-05T20:49:20Z" + content=""" +Yes, the key is in the git repository. + +While XMPP is an unreliable transport, it either manages to git pull over it, or it fails, git does not allow partial or corrupt pulls. +"""]] diff --git a/doc/bugs/problems_with_android_and_xmpp.mdwn b/doc/bugs/problems_with_android_and_xmpp.mdwn new file mode 100644 index 000000000..0b05c94bb --- /dev/null +++ b/doc/bugs/problems_with_android_and_xmpp.mdwn @@ -0,0 +1,82 @@ +### Please describe the problem. +When trying to sync my android phone with my linux laptop using the git annex assistant and XMPP no files are transferred. + +### What steps will reproduce the problem? +1) setup git annex via webapp on laptop: + +* local annex + +* remote annex via ssh with shared encryption (tried two different servers, one with and one without git-annex installed) + +* share with my devices using jabber.me account + +2) setup git annex via webapp on android: + +* local annex in /sdcard/annex (fuse filesystem without symlink support) + +* share with my devices using jabber.me account + +* ssh remote is automatically added via XMPP + +3) add files to annex on linux, they get uploaded to the ssh remote + +4) wait forever for any files from linux to download to phone + +5) add files to annex on phone, they get uploaded to the ssh remote + +4) wait forever for any files from phone to download to linux + +### What version of git-annex are you using? On what operating system? +Ubunut Linux 12.04 with git-annex version: + +* 5.20140127.1 (from PPA) + +Android 4.2 (rooted) tried with git-annex versions: + +* 5.20140209 (from http://downloads.kitenet.net/git-annex/android/current/4.0/) + +* 5.20140211-g556cfeb (from autobuilds) + +### Please provide any additional information below. +full logs: + +(these do not show the uploads to the ssh remote, because I restarted to get clean and short logs, but the files are on the server and can be dropped and restored on the linux side manually) + +* linux: + +* android: + +most interesting parts: +[[!format sh """ +# +# linux: +# + +[2014-02-13 13:11:27 CET] XMPPClient: Pairing with dorian in progress +[2014-02-13 13:11:28 CET] XMPPSendPack: Syncing with dorian +To xmpp::dorian@jabber.me + * [new branch] git-annex -> refs/synced/4ce7576f-6f02-4657-bab5-2f4c4a564ee7/ZG9yaWFuQGphYmJlci5tZQ==/git-annex + * [new branch] annex/direct/master -> refs/synced/4ce7576f-6f02-4657-bab5-2f4c4a564ee7/ZG9yaWFuQGphYmJlci5tZQ==/annex/direct/master +[2014-02-13 13:11:29 CET] XMPPSendPack: Syncing with dorian +Everything up-to-date +[2014-02-13 13:12:21 CET] XMPPSendPack: Syncing with dorian +Everything up-to-date +[2014-02-13 13:12:21 CET] XMPPSendPack: Syncing with dorian +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. + +# +# android: +# +[2014-02-13 13:16:25 CET] XMPPClient: sending: Pushing "d29" (ReceivePackOutput 2 "") +[2014-02-13 13:16:25 CET] XMPPClient: to client: d6/tigase-14134 +[2014-02-13 13:18:22 CET] XMPPClient: received: ["Unknown message"] +[2014-02-13 13:18:25 CET] XMPPReceivePack: timeout waiting for git send-pack output via XMPP +fatal: The remote end hung up unexpectedly +[2014-02-13 13:18:25 CET] XMPPReceivePack: finished running push Pushing "d29" (StartingPush (UUID "4ce7576f-6f02-4657-bab5-2f4c4a564ee7")) True +[2014-02-13 13:18:25 CET] XMPPClient: sending: Pushing "d29" (ReceivePackDone (ExitFailure 128)) +[2014-02-13 13:18:25 CET] XMPPClient: to client: d6/tigase-14134 + +"""]] diff --git a/doc/bugs/problems_with_android_and_xmpp/comment_1_dd56eb74660a606c7db54861ec745cc6._comment b/doc/bugs/problems_with_android_and_xmpp/comment_1_dd56eb74660a606c7db54861ec745cc6._comment new file mode 100644 index 000000000..945a59021 --- /dev/null +++ b/doc/bugs/problems_with_android_and_xmpp/comment_1_dd56eb74660a606c7db54861ec745cc6._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm78jq1Uo-ZbyOPG3diJUWVvEiM0kyAcvk" + nickname="Dorian" + subject="further information" + date="2014-02-13T13:33:49Z" + content=""" +I just tried moving the annex on the android phone to a different location, because I wasn't sure how git annex handles the /sdcard's fuse file system without symlinks... +So with the annex on the /data mount using ext I got a little further (and discovered a different problem ). + + +"""]] diff --git a/doc/bugs/problems_with_android_and_xmpp/comment_2_ae4554fadfc3ea1913a36aa535815cfb._comment b/doc/bugs/problems_with_android_and_xmpp/comment_2_ae4554fadfc3ea1913a36aa535815cfb._comment new file mode 100644 index 000000000..48f945d85 --- /dev/null +++ b/doc/bugs/problems_with_android_and_xmpp/comment_2_ae4554fadfc3ea1913a36aa535815cfb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-02-26T18:52:17Z" + content=""" +I don't see any indications that this problem is specific to Android. + +Relying on git push over XMPP is known to be somewhat fragile, and some XMPP servers are known to do things with the XMPP protcol that make it impossible to reliably do git push over it. [[design/assistant/xmpp]] discusses these problems. Since this seems a basically intractable problem to solve, git-annex will be moving away from XMPP as soon as something better is available. (eg [[design/assistant/telehash]]) + +The best way to use XMPP currently is as a simple signaling mechanism to tell when a push has been made to a git repository. Your ssh server seems to have an encrypted rsync repository on it, so no git repository. If you can put up a git repository someplace both the android and linux machine can access, I think that you'll find it greatly improves the reliability of the syncing. +"""]] diff --git a/doc/bugs/problems_with_android_and_xmpp/comment_3_128702a7974bd00337c3304e49a74f0b._comment b/doc/bugs/problems_with_android_and_xmpp/comment_3_128702a7974bd00337c3304e49a74f0b._comment new file mode 100644 index 000000000..29839cd50 --- /dev/null +++ b/doc/bugs/problems_with_android_and_xmpp/comment_3_128702a7974bd00337c3304e49a74f0b._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm78jq1Uo-ZbyOPG3diJUWVvEiM0kyAcvk" + nickname="Dorian" + subject="comment 3" + date="2014-03-03T14:01:10Z" + content=""" +You're right, with an unencrypted git repo in between it works. +I was hoping to be able to avoid that, though. + +My very first try was actually to switch XMPP servers, because I thought they might be the problem. But after trying both servers you mentioned in the assistant and on the instruction pages (Google and jabber.me) I figured it should at least work with one of them... + +So if XMPP can actually only be used as a simple signaling mechanism, this should be mentioned explicitly in the \"remote sharing\" and \"share with a friend\" walkthroughs. +After reading/watching them I was under the impression, that after setting up XMPP, you can use any cloud storage to exchange files. +But if I now understand correctly this cloud storage needs to have a full git repo, not only the encrypted files. +And for Android you cannot use a gcrypt remote, so only unencrypted git repos are possible, making any public cloud service unfeasible. + +Is my conclusion correct, that this leaves only one option when sharing with Android? +1) unencrypted git repo on trusted/private special remote + +Or am I missing something? + +Thanks again for this! +"""]] diff --git a/doc/bugs/problems_with_glacier.mdwn b/doc/bugs/problems_with_glacier.mdwn new file mode 100644 index 000000000..60e2f7e69 --- /dev/null +++ b/doc/bugs/problems_with_glacier.mdwn @@ -0,0 +1,65 @@ +### Please describe the problem. +Annex errors when copying to glacier. + +### What version of git-annex are you using? On what operating system? + +OS X 10.9.2 Build 13C64 + + git-annex version: 5.20140318-gdcf93d0 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +> git annex initremote glacier type=glacier encryption=hybrid keyid=E9053BDA datacenter=us-west-1 ║██████████╠ ∞ ∞ +initremote glacier (encryption setup) (hybrid cipher with gpg key B608B8F6E9053BDA) ok +(Recording state in git...) +> git annex copy Cobalt\ Strike\ Tradecraft --to=glacier --debug +[2014-03-27 07:27:39 PDT] read: git ["--git-dir=/Users/akraut/Desktop/annexes/media/.git","--work-tree=/Users/akraut/Desktop/annexes/media","show-ref","git-annex"] +[2014-03-27 07:27:39 PDT] read: git ["--git-dir=/Users/akraut/Desktop/annexes/media/.git","--work-tree=/Users/akraut/Desktop/annexes/media","show-ref","--hash","refs/heads/git-annex"] +[2014-03-27 07:27:39 PDT] read: git ["--git-dir=/Users/akraut/Desktop/annexes/media/.git","--work-tree=/Users/akraut/Desktop/annexes/media","log","refs/heads/git-annex..9f59057d857784e6ae6b3dcd6793092264375913","--oneline","-n1"] +[2014-03-27 07:27:39 PDT] chat: git ["--git-dir=/Users/akraut/Desktop/annexes/media/.git","--work-tree=/Users/akraut/Desktop/annexes/media","cat-file","--batch"] +[2014-03-27 07:27:39 PDT] read: git ["config","--null","--list"] +[2014-03-27 07:27:39 PDT] read: git ["--git-dir=/Users/akraut/Desktop/annexes/media/.git","--work-tree=/Users/akraut/Desktop/annexes/media","ls-files","--cached","-z","--","Cobalt Strike Tradecraft"] +copy Cobalt Strike Tradecraft/Tradecraft__1_of_9____Introduction.mp4 (gpg) [2014-03-27 07:27:39 PDT] chat: gpg ["--quiet","--trust-model","always","--decrypt"] + +You need a passphrase to unlock the secret key for +user: "Andrew Mark Kraut " +4096-bit ELG-E key, ID 353E49B9, created 2008-11-11 (main key ID E9053BDA) + +(checking glacier...) [2014-03-27 07:27:46 PDT] read: glacier ["--region=us-west-1","archive","checkpresent","git-annex: Maybe.fromJust: Nothing + +# End of transcript or log. +"""]] + +> This was a bug introduced last month, it forgot to receord the +> datacenter and vault used when initializing the glacier repository. +> +> I've fixed the bug, but this does not fix repositories created with +> the broken version. I considered just making it use the default +> datacenter and vault for such a repository, but +> a) those may change in the future +> and I don't want to have to worry about breaking such a repository +> going forward and b) someone may have overridden it to use another +> datacenter or vault name and so it shouldn't blindly assume the defaults. +> +> Instead, there's a manual fix up step you need to do. Luckily quite easy. +> For example: +> +> git annex enableremote myglacier datacenter=us-east-1 vault=myglacier-fae9be57-8eb4-47af-932f-136b9b40e669 +> +> The default datacenter is us-east-1, and the default vault name is +> "$remotename-$uuid". So you just have to tell it these values +> once with an enableremote command, and it will then work. + +> You don't even need to get the fixed version of git-annex to work +> around the bug this way.. Although it does have better error messages +> too. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment b/doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment new file mode 100644 index 000000000..e4556dc82 --- /dev/null +++ b/doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 1" + date="2014-03-27T14:46:19Z" + content=""" +I just updated to the latest glacier-cli and boto and have confirmed that those are working properly and that the vault has been created on glacier: +[[!format sh \"\"\" +> glacier --region=us-west-1 vault list +glacier-571d1ec3-8870-46cb-977e-15830a2b474d +\"\"\"]] +"""]] diff --git a/doc/bugs/protocol_mismatch_after_interrupt.mdwn b/doc/bugs/protocol_mismatch_after_interrupt.mdwn new file mode 100644 index 000000000..799ccc00f --- /dev/null +++ b/doc/bugs/protocol_mismatch_after_interrupt.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +git annex now fails to transfer a fail with: `protocol version mismatch -- is your shell clean?` + +### What steps will reproduce the problem? + +start a transfer, then switch between your wireless and wired connexions (I am using network-manager), then interrupt the transfer with control-c. + +### What version of git-annex are you using? On what operating system? + +on my side: 5.20140306~bpo70 on debian wheezy amd64 + +on the other side: 4.20130815 on ubuntu saucy i386 + +### Please provide any additional information below. + +[[!format sh """ +anarcat@angela:video$ git annex copy --to t films/foo.mkv +copy films/foo.mkv (checking t...) (to t...) +protocol version mismatch -- is your shell clean? +(see the rsync man page for an explanation) +rsync error: protocol incompatibility (code 2) at compat.c(174) [sender=3.0.9] + + rsync failed -- run git annex again to resume file transfer +failed +git-annex: copy: 1 failed +"""]] + +workaround: `cd .git/annex/; mv transfer transfer.old` on the other side. + +-- [[anarcat]] + +[[!taglink moreinfo]] diff --git a/doc/bugs/protocol_mismatch_after_interrupt/comment_1_415de83053dc61a64cf2e301223f1916._comment b/doc/bugs/protocol_mismatch_after_interrupt/comment_1_415de83053dc61a64cf2e301223f1916._comment new file mode 100644 index 000000000..6247cf42e --- /dev/null +++ b/doc/bugs/protocol_mismatch_after_interrupt/comment_1_415de83053dc61a64cf2e301223f1916._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-20T16:52:15Z" + content=""" +Last time rsync seemed to fail like this it was really the remote git-annex-shell failing on an encoding problem: +[[!commit 0b12db64d834979d49ed378235b0c19b34e4a4d6]] + +It seems I would need to see the transfer info files you moved out of the way to say more. Or you could copy the back, reproduce the problem, find the git-annex-shell command that is being run (using --debug), and see if you can run it on the remote system and reproduce the problem there without rsync in the picture, in order to get the actual error message. +"""]] diff --git a/doc/bugs/ran_once_then_stopped_running_opensuse_13.1.mdwn b/doc/bugs/ran_once_then_stopped_running_opensuse_13.1.mdwn new file mode 100644 index 000000000..271b429bf --- /dev/null +++ b/doc/bugs/ran_once_then_stopped_running_opensuse_13.1.mdwn @@ -0,0 +1,13 @@ +Installed stand-alone tarball amd64. +I was able to launch webapp. (on laptop) +Created a repository to local home directory. +Then ceated another repository to invite local desktop pc.(this one had all the files i wanted to sync) +Went to dektop and accepted invitation. But both machines never stopped synching? and nothing really happened. +so I removed repository on laptop to start fresh. +But now webapp does nothing. I removed and re-installed a few times but still nothing. +Only as superuser will the webapp attempt to load but fails because it is super user running. +As far as version of git-annex... it prompted to upgrade and i think i saw a 5 in there somewhere. + +and since it won't load anymore i guess there is no log. + +[[!tag moreinfo]] diff --git a/doc/bugs/ran_once_then_stopped_running_opensuse_13.1/comment_1_a9daf9e8f968b32f25e236f53ea4b845._comment b/doc/bugs/ran_once_then_stopped_running_opensuse_13.1/comment_1_a9daf9e8f968b32f25e236f53ea4b845._comment new file mode 100644 index 000000000..604da4022 --- /dev/null +++ b/doc/bugs/ran_once_then_stopped_running_opensuse_13.1/comment_1_a9daf9e8f968b32f25e236f53ea4b845._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T19:14:47Z" + content=""" +There's a bit of a dearth of information here. I think I need to know: + +* What the version is (output of `git annex version`) + +* What happens when you run `git annex webapp` (\"does nothing\" is very vague. Does it sit there forever without returning to the prompt? Print an error message? Open a web browser that's not usable somehow?) + +You might take a look at the file `~/.config/git-annex/autostart` and remove any repository you deleted from there, although normally git-annex will ignore entries that no longer exist. +"""]] diff --git a/doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn new file mode 100644 index 000000000..aa34a8056 --- /dev/null +++ b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn @@ -0,0 +1,34 @@ +#What steps will reproduce the problem? + +Running assistant in foreground on one repository that is paired to another repository, than killing it using CTRL-C and restarting it + + +#What is the expected output? What do you see instead? + +I get messages like: + + (Recording state in git...) + # Auf Zweig master + # Änderungen, die nicht zum Eintragen bereitgestellt sind: + # (benutze "git add/rm ..." zum Bereitstellen) + # (benutze "git checkout -- ..." um die Änderungen im Arbeitsverzeichnis zu verwerfen) + # + # gelöscht: "path/to/file" + # + keine Änderungen zum Eintragen hinzugefügt (benutze "git add" und/oder "git commit -a") + Total 0 (delta 0), reused 0 (delta 0) + To ssh://stormking@git-annex-volyova-stormking/data/repository/ + 4e2c631..911b80c git-annex -> synced/git-annex + + Already up-to-date. + +Sorry for the german language, I'll try to reproduce it in english, later. +After that, the symlinks for the file in the repository are gone. I can get +them back by reverting the commit but things like that make me very nervous. + + +#What version of git-annex are you using? On what operating system? + +3.20130102 on Arch Linux x64 + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment new file mode 100644 index 000000000..aafd42649 --- /dev/null +++ b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-17T18:30:06Z" + content=""" +AFAICS, the German message is the equivilant of `git status` when a file has been deleted: + +
+# On branch master
+# Changes not staged for commit:
+#   (use \"git add/rm ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	deleted:    bigfile
+#
+no changes added to commit (use \"git add\" and/or \"git commit -a\")
+
+ +There's no indication here of when the file was deleted, or what deleted it. I need a way to reproduce this to be able to help. At this point it's not clear if the file is deleted by the old assistant that you ctrl-c'd, or if it was deleted while the assistant was not running, or if it somehow gets deleted when the new assistant is started up. +"""]] diff --git a/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_2_e66532b23b089c9ea61122d6664cddb9._comment b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_2_e66532b23b089c9ea61122d6664cddb9._comment new file mode 100644 index 000000000..66c038f61 --- /dev/null +++ b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_2_e66532b23b089c9ea61122d6664cddb9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnjjCyhVEcTRM5m4iIBqL3ZCooPx7ZYB_E" + nickname="Marcus" + subject="comment 2" + date="2013-01-18T09:08:05Z" + content=""" +> At this point it's not clear if the file is deleted by the old assistant that you ctrl-c'd, or if it was deleted while the assistant was not running, or if it somehow gets deleted when the new assistant is started up. + +So how can I help to track this down? So far I can only rule out the file being deleted by some other process. +"""]] diff --git a/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_3_c9d692c867acc076f64f1213ea03ca11._comment b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_3_c9d692c867acc076f64f1213ea03ca11._comment new file mode 100644 index 000000000..65dcb6b00 --- /dev/null +++ b/doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_3_c9d692c867acc076f64f1213ea03ca11._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 3" + date="2013-01-18T20:18:36Z" + content=""" +If you can reproduce the problem, you should be able to see if the file is there when you've ctrl-c the assistant. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior.mdwn b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior.mdwn new file mode 100644 index 000000000..4c1f0971d --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior.mdwn @@ -0,0 +1,113 @@ +### Please describe the problem. +In latest git-annex version for windows (4.2130723), after a fresh clone, git annex sync considers dummy symlinks as recently modified files and commits the content. + +Alternatively, to try and avoid this problem, I tried manually merging branches (git-annex and master) but if I do that, I can't retrieve files anymore. That is, `git annex get .` downloads files but doesn't replace the dummy symlinks (I am guessing the same as `http://git-annex.branchable.com/bugs/windows_port_-_can__39__t_directly_access_files/`. Tell me if this is a different bug, I'll file a new bug report) + + +### What steps will reproduce the problem? +Create a new repository (on windows or on linux), create a file and commit it. + +Clone this repository (on windows), then `git annex init` it. The file is here, containing the path to the real file (like a symlink but the crippled filesystem's version). + +At this point, if you perform `git annex sync`, git-annex thinks the dummy symlink is the new content of the file and commits it. + + +### What version of git-annex are you using? On what operating system? +This problem occurs on git-annex for windows version 4.20130723 (the latest version as of now) although it worked well in version 4.20130709. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ mkdir test1 + +$ cd test1 + +$ git init +Initialized empty Git repository in c:/Users/raz/test1/.git/ + +$ git annex init test1 +init test1 + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +$ echo "This is the content of the file" > file.txt + +$ git annex add +add file.txt (checksum...) ok +(Recording state in git...) + +$ git annex sync +commit +ok +git-annex: no branch is checked out + +$ cat file.txt +This is the content of the file + +$ cd .. + +$ git clone test1 test2 +Cloning into 'test2'... +done. + +$ cd test2 + +$ git annex init test2 +init test2 + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +$ cat file.txt # File is only a dummy file, it contains the path to the real file (which doesn't yet exist here, this is expected behavior) +.git/annex/objects/33/43/SHA256E-s32--a50017c6136930a142cfca6ee34b700d96dcf0ba59cf7007c27c2924f80dfa7a.txt/SHA256E-s32--a50017c6136930a142cfca6ee34b700d96dcf0ba59cf7007c27c2924f80dfa7a.txt + +$ git annex sync +(merging origin/git-annex into git-annex...) +(Recording state in git...) +add file.txt (checksum...) ok # ??? The dummy file is added to the index -> shouldn't happen +(Recording state in git...) +commit +(Recording state in git...) +ok +pull origin +ok +push origin +Counting objects: 26, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (14/14), done. +Writing objects: 100% (19/19), 1.78 KiB | 0 bytes/s, done. +Total 19 (delta 2), reused 0 (delta 0) +To c:/Users/Renaud Casenave-Pere/test1 + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +ok + +$ git annex whereis # File should be in origin repository, not here +whereis file.txt (1 copy) + e6e1c558-7127-4ffa-a79b-2161b44ec44b -- here (test2) +ok + +$ cat file.txt # The committed content, discarding the real content +.git/annex/objects/33/43/SHA256E-s32--a50017c6136930a142cfca6ee34b700d96dcf0ba59cf7007c27c2924f80dfa7a.txt/SHA256E-s32--a50017c6136930a142cfca6ee34b700d96dcf0ba59cf7007c27c2924f80dfa7a.txt + +# End of transcript or log. +"""]] + +Tell me if you need further information. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_1_1a0b964f93c753838d6ccbdc8f79b39e._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_1_1a0b964f93c753838d6ccbdc8f79b39e._comment new file mode 100644 index 000000000..f3e8ec690 --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_1_1a0b964f93c753838d6ccbdc8f79b39e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="re: workaround" + date="2013-07-30T19:17:11Z" + content=""" +The problem with manually merging the branches and not using sync is that the file mappings get out of date. You should be able to correct them by running `git annex fsck` +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_2_d22dcd7f95c5dc1c381c3c746781efce._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_2_d22dcd7f95c5dc1c381c3c746781efce._comment new file mode 100644 index 000000000..6af5a06a6 --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_2_d22dcd7f95c5dc1c381c3c746781efce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T19:55:04Z" + content=""" +This reversion affects direct mode on FAT, not just on Windows! It was probably caused by commit ecdfa40cbea1ae213ab84913d8f011027967a610 or commit ae341c1a37eecc1724517e3e025d144badb5abfe. Investigating. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_3_a25140eb90f6b24c1a3ca39c901694e2._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_3_a25140eb90f6b24c1a3ca39c901694e2._comment new file mode 100644 index 000000000..b608efdbe --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_3_a25140eb90f6b24c1a3ca39c901694e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 3" + date="2013-07-30T20:07:09Z" + content=""" +Yeah, I inverted some logic. This also affects, for example, git-annex on Android. Sigh. Sorry about this. + +I suppose that, if you run into this bug, the best way to fix up after it is to `git-revert -n` the bad commit that sync made. Then run `git annex sync` with the fixed git-annex to commit the reversion. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_4_825e15183008ff7d97a81cacc3f55fb4._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_4_825e15183008ff7d97a81cacc3f55fb4._comment new file mode 100644 index 000000000..7b503ac9a --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_4_825e15183008ff7d97a81cacc3f55fb4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="fixed" + date="2013-07-30T20:11:19Z" + content=""" +Seems like the test suite should have caught this on Windows. Unfortunately, the part of the test suite that tests sync is commented out due to it not working at all from within the test suite for reasons I don't understand. Pity. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_5_e858fc7c729cd39740354fb12627d556._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_5_e858fc7c729cd39740354fb12627d556._comment new file mode 100644 index 000000000..9b3aa7c17 --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_5_e858fc7c729cd39740354fb12627d556._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 5" + date="2013-07-30T21:12:54Z" + content=""" +All Windows and Android builds have been updated with the bug fixed. + +Test suite fixed to test `git annex sync` on Windows.. although the test suite is still failing for unknown reasons in the autobuilder environment and so does not stop the build. I have added a recommendation to the Windows install page that users run `git annex test` themselves to make sure they have a good build that works on their Windows system. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_6_9881b0f2dfb0907a60c0da296bc3da3f._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_6_9881b0f2dfb0907a60c0da296bc3da3f._comment new file mode 100644 index 000000000..f1509b395 --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_6_9881b0f2dfb0907a60c0da296bc3da3f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknruiCHUcOh2mmpkh7OFJ4iNfAOOamRVs" + nickname="Renaud" + subject="comment 6" + date="2013-07-31T05:34:33Z" + content=""" +Great, thank you very much! + +I successfully ran the test suite and it's now working fine. +"""]] diff --git a/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_7_ca017b9d3bafea4cb31448c802f3834e._comment b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_7_ca017b9d3bafea4cb31448c802f3834e._comment new file mode 100644 index 000000000..48173bff9 --- /dev/null +++ b/doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_7_ca017b9d3bafea4cb31448c802f3834e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Remy" + ip="82.94.186.146" + subject="comment 7" + date="2013-07-31T13:55:07Z" + content=""" +I got the same problem with the dummy symlinks while syncing to an annex on an EncFS mount on Ubuntu so I hope the fix doesn't just apply to Windows and Android. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist.mdwn b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist.mdwn new file mode 100644 index 000000000..3bfdf9e1d --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist.mdwn @@ -0,0 +1,67 @@ +### Please describe the problem. + +I created somelargefile on host1. A file with that name appears in the right place on host2 but I can't use it: + + + host2:~/annex% cat somelargefile + cat: somelargefile: No such file or directory + + +### What steps will reproduce the problem? + +I am running http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz and I connected two hosts with the 'Local computer' workflow. I run assistant on both sides. + +I make a file on either side, wait a minute for it to sync, and then observe this on the remote side: + + lrwxrwxrwx 1 drewp drewp 178 Jul 9 23:58 somelargefile -> .git/annex/objects/Pw/vw/SHA256E-s8--bf87165d313027621936809a01da1994f9bd20ff9580c1380e7636e2443fe4ed/SHA256E-s8--bf87165d313027621936809a01da1994f9bd20ff9580c1380e7636e2443fe4ed + + host2:~/annex% ls -l .git/annex/objects/Pw/vw/SHA256E-s8--bf87165d313027621936809a01da1994f9bd20ff9580c1380e7636e2443fe4ed/ + total 4 + -rw------- 1 drewp drewp 14 Jul 9 23:58 SHA256E-s8--bf87165d313027621936809a01da1994f9bd20ff9580c1380e7636e2443fe4ed.map + +My "large file" is in fact 8 bytes long. The .map file contains the string "somelargefile\n" + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130709-g339d1e0 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +ubuntu 12.10 64-bit + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +New lines in .git/annex/daemon.log when I add another new file: + + + (merging synced/git-annex into git-annex...) + + Updating bac8b65..0422d27 + Fast-forward + newfile2 | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 newfile2 + [2013-07-10 00:08:38 PDT] Committer: Committing changes to git + (Recording state in git...) + [2013-07-10 00:08:38 PDT] Pusher: Syncing with host1.local_annex + To ssh://drewp@git-annex-host1.local-drewp_annex/~/annex/ + a80b6f5..72c0865 git-annex -> synced/git-annex + + Already up-to-date. + + +# End of transcript or log. +"""]] + +[[!meta title="local pairing git-annex-shell issue when using standalone tarball"]] + +[[!tag moreinfo]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_10_8a1d16b2aaba224e94be3d9dcc036d91._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_10_8a1d16b2aaba224e94be3d9dcc036d91._comment new file mode 100644 index 000000000..9cfc0ebee --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_10_8a1d16b2aaba224e94be3d9dcc036d91._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="comment 10" + date="2013-07-27T07:42:26Z" + content=""" +Sorry, I meant to get those logs earlier but I got distracted. + +One confounding thing in the previous runs is that I may have had accidental instances of git-annex assistant running on at least one of the machines. I killed them all for this next attempt, and named the dir annex2 just in case. + +daemon.log files are now at http://bigasterisk.com/post/git-annex/logs1/ +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_11_434ed328a22a6657dba3b2929a56e499._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_11_434ed328a22a6657dba3b2929a56e499._comment new file mode 100644 index 000000000..13bfc4468 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_11_434ed328a22a6657dba3b2929a56e499._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 11" + date="2013-07-28T00:06:53Z" + content=""" +From the log on bang: + +
+[2013-07-27 00:33:15 PDT] read: ssh [\"-S\",\"/home/drewp/annex2/.git/annex/ssh/drewp@git-annex-dash.local-drewp_annex2\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"-T\",\"drewp@git-annex-dash.local-drewp_annex2\",\"git-annex-shell 'configlist' '/~/annex2/'\"]
+zsh:1: command not found: git-annex-shell
+Remote dash.local_annex2 does not have git-annex installed; setting remote.dash.local_annex2.annex-ignore
+
+ +You said you're running from the standalone tarball. I think that's the problem, probably if you get git-annex-shell into your path it'll just work. + +Can you paste the line git-annex added to \"dash\"'s .ssh/authorized_keys? +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_12_1837b70ace42882db3ab82e001680934._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_12_1837b70ace42882db3ab82e001680934._comment new file mode 100644 index 000000000..54ba310b5 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_12_1837b70ace42882db3ab82e001680934._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="comment 12" + date="2013-07-28T05:36:39Z" + content=""" +Thanks for finding that. I added git-annex-shell to my path and ran again. The repo lists look good now. + +For the record, here's what I am getting in authorized_keys on dash: + + command=\"GIT_ANNEX_SHELL_DIRECTORY='/home/drewp/annex2' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1y.......0c2ilnh drewp@bang + + +When I went to the settings on each box, all 4 repository group select boxes were blank. I set them all to 'client'. + +How do we make this long ticket worth your time by improving the code so people don't hit the same trap in the future? I think I would have looked in the right direction if, instead of saying nothing and not having a uuid to make the links work, the web ui said something like this: + + 'command not found: git-annex-shell' on remote host. Sync disabled with this host. + + +-------- + +Next, I ran \"date > annex2/file1\" on bang. The web consoles said they synced, but no file appeared on dash. There was a ~/annex2/.git/annex/objects/../../SHA256.../SHA256... file on dash with the right contents, but no symlink showed up in dash:~/annex2. + +I ran \"date > annex2/file2\" on dash, and then I got both file1 and file2 on both boxes. + +In the new logs at http://bigasterisk.com/post/git-annex/logs2/, the surprise is at [2013-07-27 22:10:49 PDT] where I thought dash would make a symlink called 'file1' but instead it reports no attempt or error. Later at [2013-07-27 22:12:08 PDT], while dealing with the upload of file2, dash finally makes the symlink for file1. + +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_13_ca9c87a10f29e41572540edeb99652f2._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_13_ca9c87a10f29e41572540edeb99652f2._comment new file mode 100644 index 000000000..07cf64865 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_13_ca9c87a10f29e41572540edeb99652f2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 13" + date="2013-07-30T18:51:38Z" + content=""" +I'm more interested in fixing core problems, like why it was not able to find git-annex-shell, than in fixing bugs in the web UI that follow on from those problems. + +When you're using the standalone tarball, it's supposed to set up `~/.ssh/git-annex-shell` to point to wherever you've unpacked the tarball. The assistant does this the first time you run it, and any time it sees the file is out of date. +I've tested this, and it appears to be working ok. I don't understand what happened in your case to prevent this from happening. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_1_69eafc4201e3014ef1b5d74fe319e462._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_1_69eafc4201e3014ef1b5d74fe319e462._comment new file mode 100644 index 000000000..03d14c586 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_1_69eafc4201e3014ef1b5d74fe319e462._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-10T16:31:40Z" + content=""" +Everything you've described is expected behavior, when the content of the file has not yet been transferred to the repository. + +There should be something in daemon.log about the transfer of the file. If there's an error message for the transfer, it will certainly show up there. You can enable debugging to get more information in daemon.log about file transfers. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_2_b7a64db9abe006af8c30169ad849efe9._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_2_b7a64db9abe006af8c30169ad849efe9._comment new file mode 100644 index 000000000..954d6e375 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_2_b7a64db9abe006af8c30169ad849efe9._comment @@ -0,0 +1,76 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="debug log" + date="2013-07-16T04:02:40Z" + content=""" +receiver side logs again, with --debug mode on. I don't see anything weird. + + + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..a7cb1b3f2a3f2a7d24827e10f9f3ac5848fd11d9\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..4a2771e15cb5c7a0a8d70443e76b65c12115a8cd\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..ddf6aa74d771521b11657edfae558858b60e8368\",\"--oneline\",\"-n1\"] + (merging synced/git-annex into git-annex...) + [2013-07-15 20:53:02 PDT] feed: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"update-index\",\"-z\",\"--index-info\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"4a2771e15cb5c7a0a8d70443e76b65c12115a8cd\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"4a2771e15cb5c7a0a8d70443e76b65c12115a8cd..refs/heads/git-annex\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] call: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"update-ref\",\"refs/heads/git-annex\",\"4a2771e15cb5c7a0a8d70443e76b65c12115a8cd\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] Merger: merging refs/heads/synced/master into refs/heads/master + + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] call: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex/.git/annex/merge/\",\"merge\",\"--no-edit\",\"refs/heads/synced/master\"] + Updating 6f8cbe0..18cea18 + Fast-forward + test-2013-07-15e | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 test-2013-07-15e + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"diff-tree\",\"-z\",\"--raw\",\"--no-renames\",\"-l0\",\"-r\",\"6f8cbe0a34d70e70a6365385bbd4338d97047d4b\",\"18cea18855143095a872a463eb0a7cf5dd81de4c\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..4a2771e15cb5c7a0a8d70443e76b65c12115a8cd\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..ddf6aa74d771521b11657edfae558858b60e8368\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..a7cb1b3f2a3f2a7d24827e10f9f3ac5848fd11d9\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] feed: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"update-index\",\"-z\",\"--index-info\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"diff-index\",\"--raw\",\"-z\",\"-r\",\"--no-renames\",\"-l0\",\"--cached\",\"refs/heads/git-annex\"] + [2013-07-15 20:53:02 PDT] Watcher: add symlink test-2013-07-15e + [2013-07-15 20:53:02 PDT] chat: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] + [2013-07-15 20:53:02 PDT] Committer: committing 1 changes + [2013-07-15 20:53:02 PDT] Committer: Committing changes to git + (Recording state in git...) + [2013-07-15 20:53:02 PDT] feed: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"update-index\",\"-z\",\"--index-info\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"commit\",\"--allow-empty-message\",\"--no-edit\",\"-m\",\"\",\"--quiet\",\"--no-verify\"] + [2013-07-15 20:53:02 PDT] Pusher: Syncing with host1.local_annex + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] Pusher: pushing to [Remote { name =\"host1.local_annex\" }] + [2013-07-15 20:53:02 PDT] call: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"branch\",\"-f\",\"synced/master\"] + [2013-07-15 20:53:02 PDT] call: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"push\",\"host1.local_annex\",\"git-annex:synced/git-annex\",\"master:synced/master\"] + To ssh://drewp@git-annex-host1.local-drewp_annex/~/annex/ + a7cb1b3..4a2771e git-annex -> synced/git-annex + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"push\",\"host1.local_annex\",\"git-annex:synced/git-annex\",\"master\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..4a2771e15cb5c7a0a8d70443e76b65c12115a8cd\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"log\",\"refs/heads/git-annex..ddf6aa74d771521b11657edfae558858b60e8368\",\"--oneline\",\"-n1\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] Merger: merging refs/remotes/host1.local_annex/synced/master into refs/heads/master + + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] call: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex/.git/annex/merge/\",\"merge\",\"--no-edit\",\"refs/remotes/host1.local_annex/synced/master\"] + Already up-to-date. + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"show-ref\",\"--hash\",\"refs/heads/master\"] + [2013-07-15 20:53:02 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"diff-tree\",\"-z\",\"--raw\",\"--no-renames\",\"-l0\",\"-r\",\"18cea18855143095a872a463eb0a7cf5dd81de4c\",\"18cea18855143095a872a463eb0a7cf5dd81de4c\"] + [2013-07-15 20:53:28 PDT] read: git [\"--git-dir=/home/drewp/annex/.git\",\"--work-tree=/home/drewp/annex\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + +I also noticed on host1 where the file was made, there is a git node in gitk that says 'Local uncommitted changes, not checked in to index' and this node appears to have all my file contents as diffs. So the problem is maybe not the transfer, but the failure of the originating side to commit the file contents properly? +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_3_197ac6070f256131c6e18a07aa3834fa._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_3_197ac6070f256131c6e18a07aa3834fa._comment new file mode 100644 index 000000000..d772de5af --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_3_197ac6070f256131c6e18a07aa3834fa._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 3" + date="2013-07-16T18:03:40Z" + content=""" +It's normal for git diff and gitk to look like that in a repository that's using direct mode. + +In your log, I see you added a file \"test-2013-07-15e\". And I don't see any indication that it tried to transfer it. + +There are a few reasons that could happen. If you've \"paused\" syncing with a remote in the webapp, it could do that. + +I think more likely would be if you've put the remote repository in a repository group that doesn't want the file. If it's configured to be in the Manual group or the Source group (or the Transfer, Public, or Small Archive group for that matter), the assistant won't try to send files to it. You can check this by editing the repository in the webapp. It should probably be set to be in the Client group. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_4_fe07832333b536c71b7dcb46a4a44bd0._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_4_fe07832333b536c71b7dcb46a4a44bd0._comment new file mode 100644 index 000000000..2201db88e --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_4_fe07832333b536c71b7dcb46a4a44bd0._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="comment 4" + date="2013-07-25T05:02:16Z" + content=""" +I saw the 'syncing enabled'/'syncing disabled' switch in the webapp, which I think is what you're calling pause. That was always enabled. + +I never adjusted the groups, but I see in the webapp that my remote is busted in other ways. It has no title, and settings->edit makes an error page. The edit link is like this: + +http://127.0.0.1:38187/config/repository/edit/NoUUID?auth=4294a...333c + +and the error is + + Internal Server Error + Unknown UUID + +I'll try re-configuring that remote. I wish the webapp could tell me more about what is broken with the remote repo and where I might go to repair it. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment new file mode 100644 index 000000000..8e00198ef --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="comment 5" + date="2013-07-25T05:14:12Z" + content=""" +BTW \"go enter it into the computer you want to pair with\" is a very frustrating instruction to read. Every time I try to do a pairing and I encounter that, it's telling me \"now it's time for you to guess what to do, so this is probably where you'll screw things up.\" I have no idea where to enter that secret phrase. I would also like to know if 'asdfasdf' is a good secret phrase or not, presuming the two computers are both on my internal network. Does the secret matter later or is it just used for a minute? + +So far, I keep getting blank repo names with the NoUUID edit url, or I fail to accomplish a pairing at all. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_6_3f236b35e9820cd88bb77fcd57d6975e._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_6_3f236b35e9820cd88bb77fcd57d6975e._comment new file mode 100644 index 000000000..63261fb9d --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_6_3f236b35e9820cd88bb77fcd57d6975e._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="comment 6" + date="2013-07-25T05:36:07Z" + content=""" +Here's how little it takes for things to go wrong: + +---- +First host: + +bang(pts/17):~/annex% git init +Initialized empty Git repository in /home/drewp/annex/.git/ + +bang(pts/17):~/annex% git-annex init +init ok +(Recording state in git...) + +bang(pts/17):~/annex% git-annex webapp --listen 10.1.0.1:9999 +http://10.1.0.1:9999/?auth=6f9a8b... + + +---- +Second host: + +dash(pts/34):~/annex% git init +Initialized empty Git repository in /home/drewp/annex/.git/ + +dash(pts/34):~/annex% git-annex init +init ok +(Recording state in git...) + +dash(pts/34):~/annex% git-annex webapp --listen 10.1.0.229:9999 +http://10.1.0.229:9999/?auth=f28bd56b456.... + + +Browse to first URI. Add another repo. Local computer. Enter 'qwerty'. +Browse to second URI. Respond to pairing request. Enter 'qwerty' again. +View both dashboards: http://bigasterisk.com/post/git-annex-bad-pair.png + + + +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_7_3cc5dae0351201522711a7caeecd60d5._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_7_3cc5dae0351201522711a7caeecd60d5._comment new file mode 100644 index 000000000..832f38fa5 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_7_3cc5dae0351201522711a7caeecd60d5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 7" + date="2013-07-25T20:02:18Z" + content=""" +What settings does `.git/config` have for the git remote created by the local pairing process? + +Since I can't reproduce any problems with local pairing -- it works great on this network -- you will need to enable debugging, reproduce the bug, and send a debug log for me to debug this any further. +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_8_3c3883cb66d02a15d5de84d22aa113da._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_8_3c3883cb66d02a15d5de84d22aa113da._comment new file mode 100644 index 000000000..bf14ad573 --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_8_3c3883cb66d02a15d5de84d22aa113da._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="http://bigasterisk.com/" + nickname="Drew Perttula" + subject="~/annex/.git/config files (after running the steps above)" + date="2013-07-26T13:20:29Z" + content=""" + dash(pts/32):~/annex% cat .git/config + [core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + [annex] + uuid = ddbb5112-3cff-46d3-b42a-f3a6826827a5 + version = 3 + [remote \"bang.local_annex\"] + url = ssh://drewp@git-annex-bang.local-drewp_annex/~/annex/ + fetch = +refs/heads/*:refs/remotes/bang.local_annex/* + annex-ignore = true + annex-cost = 175.0 + + + bang(pts/16):~/annex% cat .git/config + [core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + [annex] + uuid = c8a6c420-0567-4f33-8abb-e44b2012ad55 + version = 3 + [remote \"dash.local_annex\"] + url = ssh://drewp@git-annex-dash.local-drewp_annex/~/annex/ + fetch = +refs/heads/*:refs/remotes/dash.local_annex/* + annex-ignore = true + annex-cost = 175.0 + +"""]] diff --git a/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_9_c8cece9559bd2dc6154cd28772369e48._comment b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_9_c8cece9559bd2dc6154cd28772369e48._comment new file mode 100644 index 000000000..0fd052a4c --- /dev/null +++ b/doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_9_c8cece9559bd2dc6154cd28772369e48._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 9" + date="2013-07-26T16:55:08Z" + content=""" +Like I sort of expected, this is missing a remote.$foo.annex-uuid setting. But I don't know why yet. I need a debug log to figure this out. + +Can you enable debugging (run git-annex webapp --debug), reproduce the problem again, and send me the log? +"""]] diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn new file mode 100644 index 000000000..41122f8a6 --- /dev/null +++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. + +I've setup a gcrypt based git backup repository as per the examples here: + +http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/ + +It all seems to work well until I try to do any kind git annex operation from the console on the gcrypted repo on the remote server. If I run a `git annex fsck` (this seems a reasonable thing to do) then it initialises the encrypted remote with a different uuid to the one in the creation step. The initial repository that created the repo seems to work okay but it's no longer possible to add further repositories without getting conflicting uuid errors. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]]; <>. I have updated the OSX autobuilder so tonight's +> build will include the fixed git-remote-gcrypt. --[[Joey]] +> +> Note that gcrypt repositories affected by this bug are in fact empty, so +> the first time a push is made with the fixed gcrypt it will probably +> generate a new gcrypt-id and push everything. diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment new file mode 100644 index 000000000..a8a4af4cf --- /dev/null +++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_1_11af589cf646cb7552eeb5c7401934f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2014-04-27T15:04:09Z" + content=""" +Thinking about it some more perhaps it's not a reasonable thing to do if you don't want people to be able to discover info about the repo. However it would be good to somehow prevent git-annex from running a local init operation when working with a gcrypt repo. +"""]] diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment new file mode 100644 index 000000000..e3e744127 --- /dev/null +++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_2_d81cb9b47dea34b639dc250bb231010a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2014-04-27T19:19:22Z" + content=""" +I'm having a pretty bad time with gcrypt based repos. Seemingly at random a `git-annex sync` will occasionally decide that the remote repo doesn't exist and then attempt to create a new one - it generates a new gcryptid and the repository seems lost. + +This sometimes happens after a good few hours of use, sometimes it happens immediately after creation (but maybe due to the fact that annexs are sullied by previous bad attempts). I've cleaned up making the repo dead, removing via `git remote` and editing the remote.log in the git-annex branch. No idea if that's enough. + +What do you need from me to try to sort this? + +Cheers, + +Matt. +"""]] diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment new file mode 100644 index 000000000..fd2e9f840 --- /dev/null +++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_3_8df00f0ed4a26f702e0935b366521530._comment @@ -0,0 +1,164 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 3" + date="2014-04-29T03:00:59Z" + content=""" +Hi, I'm finally through trial and error am able to reproduce the bug... + +On OSX using version 5.20140420-ga25b8bb the creation of an gcrypt remote via initremote does not work properly. See the attached debug log for what happens - no errors but subsequent syncs fail and creates a new repo. + +Using linux and version 5.20140421-g515d251 to create the gcrypt does work without issue. Interestingly the OSX client will happily use the linux created repo without problem (at least it hasn't borked it yet). This suggests something up in the creation step. Perhaps this is fixed in the later version (see the other bug about the latest OSX upgrade having the older binary)? But I didn't see anything in the change log about it? But I did see the gcrypt script in the manifest now... + +
~/iMovies $ git annex initremote isilon-2 type=gcrypt gitrepo=ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2 keyid=matt@dancingfrog.co.uk
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+git [2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:54:47 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:54:47 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"cat-file\",\"--batch\"]
+initremote isilon-2 (encryption setup) [2014-04-29 01:54:47 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-public-keys\",\"matt@dancingfrog.co.uk\"]
+[2014-04-29 01:54:47 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"]
+[2014-04-29 01:54:47 BST] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--recipient\",\"68D8501429C42E01\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--force-mdc\",\"--no-textmode\"]
+(hybrid cipher with gpg key 68D8501429C42E01) [2014-04-29 01:54:47 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"remote\",\"add\",\"isilon-2\",\"gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2\"]
+[2014-04-29 01:54:47 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.gcrypt-participants\",\"68D8501429C42E01\"]
+[2014-04-29 01:54:47 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:48 BST] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-secret-keys\",\"--fixed-list-mode\"]
+[2014-04-29 01:54:48 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.gcrypt-signingkey\",\"68D8501429C42E01\"]
+[2014-04-29 01:54:48 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:48 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon-2\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+[2014-04-29 01:54:49 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"refs/heads/git-annex\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:oWSdoSaFhKA19TcXRHPS
+Counting objects: 4170, done.
+Compressing objects: 100% (3113/3113), done.
+Total 4170 (delta 149), reused 146 (delta 3)
+gcrypt: Encrypting to:  -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) \"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+ * [new branch]      git-annex -> git-annex
+[2014-04-29 01:54:52 BST] read: git [\"config\",\"--null\",\"--list\"]
+[2014-04-29 01:54:52 BST] call: ssh [\"-S\",\".git/annex/ssh/rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"-T\",\"rss\",\"git-annex-shell 'gcryptsetup' '/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2' ':id:oWSdoSaFhKA19TcXRHPS'\"]
+ok
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.annex-gcrypt\",\"shell\"]
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"config\",\"remote.isilon-2.annex-uuid\",\"8fc5d933-d76f-5a61-b3a0-96b909e3f06c\"]
+ok
+[2014-04-29 01:54:53 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"]
+[2014-04-29 01:54:53 BST] feed: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"update-index\",\"-z\",\"--index-info\"]
+[2014-04-29 01:54:53 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+(Recording state in git...)
+[2014-04-29 01:54:53 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"write-tree\"]
+[2014-04-29 01:54:53 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"commit-tree\",\"8c27761996045cb6daf7dc83920e15bfe0f2b2ed\",\"-p\",\"refs/heads/git-annex\"]
+[2014-04-29 01:54:53 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"update-ref\",\"refs/heads/git-annex\",\"0755de89ac06bb3babc73de294a550d9b62f39f1\"]
+[2014-04-29 01:54:53 BST] read: ssh [\"-O\",\"stop\",\"-S\",\"rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"localhost\"]
+
+
+~/iMovies $ git annex sync
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..0755de89ac06bb3babc73de294a550d9b62f39f1\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:55 BST] chat: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"cat-file\",\"--batch\"]
+commit  [2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"commit\",\"-a\",\"-m\",\"git-annex automatic sync\"]
+ok
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"symbolic-ref\",\"HEAD\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"refs/heads/master\"]
+[2014-04-29 01:57:55 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/heads/synced/master\"]
+[2014-04-29 01:57:55 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"]
+pull isilon 
+[2014-04-29 01:57:55 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+[2014-04-29 01:57:56 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/master\"]
+[2014-04-29 01:57:56 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/master..refs/remotes/isilon/master\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:56 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/synced/master\"]
+[2014-04-29 01:57:56 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/synced/master..refs/remotes/isilon/synced/master\",\"--oneline\",\"-n1\"]
+ok
+pull isilon-2 
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"fetch\",\"isilon-2\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/master\"]
+[2014-04-29 01:57:57 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/synced/master\"]
+ok
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"git-annex\"]
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+[2014-04-29 01:57:57 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..0755de89ac06bb3babc73de294a550d9b62f39f1\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..4dc8becdffd42c9af57e0d1007892516f2114c0e\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..3269adaaa41b42dab88399e8212d77301967f436\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/heads/git-annex..13d8993b7d9a89ea4198ec3edd63aa575745c64c\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"branch\",\"-f\",\"synced/master\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/synced/master\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/remotes/isilon/synced/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"]
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon/git-annex\"]
+[2014-04-29 01:57:58 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"log\",\"refs/remotes/isilon/git-annex..git-annex\",\"--oneline\",\"-n1\"]
+push isilon 
+[2014-04-29 01:57:58 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon\",\"+git-annex:synced/git-annex\",\"master:synced/master\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:p4cHPeAFIRIvZTnm4UrK
+Counting objects: 5649, done.
+Compressing objects: 100% (4579/4579), done.
+Total 5649 (delta 151), reused 146 (delta 3)
+gcrypt: Encrypting to:  -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) \"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov
+ * [new branch]      git-annex -> synced/git-annex
+ * [new branch]      master -> synced/master
+[2014-04-29 01:58:01 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon\",\"master\"]
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) \"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+ok
+[2014-04-29 01:58:03 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/isilon-2/synced/master\"]
+push isilon-2 
+[2014-04-29 01:58:03 BST] call: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"+git-annex:synced/git-annex\",\"master:synced/master\"]
+gcrypt: Development version -- Repository format MAY CHANGE
+gcrypt: Repository not found: ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+gcrypt: Setting up new repository
+gcrypt: Remote ID is :id:wTHlCd+vFviIzoTDv2Xu
+Counting objects: 5649, done.
+Compressing objects: 100% (4579/4579), done.
+Total 5649 (delta 152), reused 146 (delta 3)
+gcrypt: Encrypting to:  -R 68D8501429C42E01
+gcrypt: Requesting manifest signature
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) \"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+gpg: 68D8501429C42E01: skipped: public key already present
+To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mov2
+ * [new branch]      git-annex -> synced/git-annex
+ * [new branch]      master -> synced/master
+[2014-04-29 01:58:06 BST] read: git [\"--git-dir=/Volumes/Media/iTunes Media/Movies/.git\",\"--work-tree=/Volumes/Media/iTunes Media/Movies\",\"push\",\"isilon-2\",\"master\"]
+
+You need a passphrase to unlock the secret key for
+user: \"Matt Ford (Work) \"
+1024-bit DSA key, ID 29C42E01, created 2010-03-10
+
+ok
+[2014-04-29 01:58:09 BST] read: ssh [\"-O\",\"stop\",\"-S\",\"rss\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"localhost\"]
+
+"""]] diff --git a/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_4_7eb33c23223dfc634eb3c9c6621f7f3e._comment b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_4_7eb33c23223dfc634eb3c9c6621f7f3e._comment new file mode 100644 index 000000000..d40c435db --- /dev/null +++ b/doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids/comment_4_7eb33c23223dfc634eb3c9c6621f7f3e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 4" + date="2014-05-19T16:28:01Z" + content=""" +I can reproduce this problem on OSX. + +I've only gotten as far as seeing that the gcrypt repository never gets initialized as a git repository. It has a config file, but no objects are ever pushed to it. This is why gcrypt sees no repository there in subsequent runs. + +This is a bug in gcrypt, so filed: +"""]] diff --git a/doc/bugs/remote_not_showing_up_in_webapp.mdwn b/doc/bugs/remote_not_showing_up_in_webapp.mdwn new file mode 100644 index 000000000..f2f83f064 --- /dev/null +++ b/doc/bugs/remote_not_showing_up_in_webapp.mdwn @@ -0,0 +1,100 @@ +### Please describe the problem. + +This is a followup on [[bugs/internal_server_error:_unknown_UUID_on_webapp]]. In that issue, webapps previous to 20130929 would crash with `internal server error: unknown UUID`. This was fixed at that date, but some problems remain, namely that the remote that is recognized on the commandline doesn't show up in the webapp. + +`markov` is able to push to `marcos`, but not the reverse because `markov` is hidden behind a NAT. `git annex sync` seems to do the right thing accordingly on both ends (which is: `marcos` doesn't try to push to `markov` but `markov` pushes to `marcos`). + +### What steps will reproduce the problem? + +See [[bugs/internal_server_error:_unknown_UUID_on_webapp]]. I didn't do any further changes other than upgrade `git-annex` on both ends. + +### What version of git-annex are you using? On what operating system? + +`marcos` is now running `Version: 4.20131105-g8efdc1a Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash` + +`markov` is now running the wheezy backport, `4.20131002~bpo70+1`. + +### Please provide any additional information below. + +#### On `marcos` + +Here's the output of `git annex status` on `marcos`: + +[[!format sh """ +anarcat@marcos:books$ git annex status +repository mode: direct +trusted repositories: 0 +semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + a75cbbf7-e055-423e-b375-443e0552c9e2 -- here (anarcat@marcos:/srv/books) + aa500f29-42d9-4777-ae02-4a2c3d47db44 -- anarcat@markov:~/books +untrusted repositories: 0 +transfers in progress: none +available local disk space: 7.04 gigabytes (+1 megabyte reserved) +local annex keys: 736 +local annex size: 3.92 gigabytes +annexed files in working tree: 721 +size of annexed files in working tree: 3.92 gigabytes +bloom filter size: 16 mebibytes (0.1% full) +backend usage: + SHA256E: 1457 +# End of transcript or log. +"""]] + +Here's a screenshot of the idle webapp on marcos: + + + +You can clearly see that the webapp doesn't see the `markov` remote. + +When `markov` transfers stuff, `marcos` sees the transfers happening, but marks it as going to the `unknown` remote: + + + +Clicking on that link is what was previously triggering [[bugs/internal_server_error:_unknown_UUID_on_webapp]] but now yields a "Unknown remote" error. + + + +#### On `markov`: + +Here is a screenshot from `markov` that shows *it* knows about both repositories and seem to behave properly: + + + +And here's the output of `git annex status` on markov: + +[[!format sh """ +anarcat@desktop008:books$ git annex status +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + a75cbbf7-e055-423e-b375-443e0552c9e2 -- origin (anarcat@marcos:/srv/books) + aa500f29-42d9-4777-ae02-4a2c3d47db44 -- here (anarcat@markov:~/books) +untrusted repositories: 0 +transfers in progress: + downloading Patrick K. O'Brien/Philip's Atlas of World History, Concise Edition (115)/Philip's Atlas of World History, Concise Edition - Patrick K. O'Brien.pdf from origin +available local disk space: 93.25 gigabytes (+1 megabyte reserved) +temporary directory size: 50.07 megabytes (clean up with git-annex unused) +local annex keys: 708 +local annex size: 3.81 gigabytes +known annex keys: 721 +known annex size: 3.92 gigabytes +bloom filter size: 16 mebibytes (0.1% full) +backend usage: + SHA256E: 1429 +"""]] + +Finally, note that you sometimes see `desktop008` above: it turns out I am running `git annex` from my workstation, which NFS-mounts the `/home` directory of `markov` into `/srv/musique`. --[[anarcat]] + +Yesterday, I made the webapp register ssh remotes it creates. +They then show up in the webapp when run in a repository where that ssh +remote is not enabled. + +You can also manually register a ssh remote. First set up the git remote +as usual. Then run `git annex initremote type=git name=foo +location=$url`. + +[[!meta title="webapp shows transfer from 'unknown' when no remote is configured for a system that is downloading files"]] + +[[!tag confirmed]] diff --git a/doc/bugs/remote_not_showing_up_in_webapp/comment_1_2a269732fd528f505777542d3556437a._comment b/doc/bugs/remote_not_showing_up_in_webapp/comment_1_2a269732fd528f505777542d3556437a._comment new file mode 100644 index 000000000..4582a3071 --- /dev/null +++ b/doc/bugs/remote_not_showing_up_in_webapp/comment_1_2a269732fd528f505777542d3556437a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-06T16:38:47Z" + content=""" +marcov does not show up in the webapp because there is no configured git remote for it. + +This is a slightly confusing corner of the webapp. The webapp will show repositories that do not have a configured remote, but it only does it for special remotes. ssh repos, being regular git remotes, don't currently show up in the webapp unless that repository is actually set up as a remote. + +It should certainly not show it as \"unknown\"; it would be much better to use the full repo description here, since it does not have a remote name. +(Unless the description is really long!) + +I think you'll also get the \"unknown uuid\" screen even for a special remote that is not configured in the local repository. So that needs to be fixed. + +Finally, it would probably be good for the webapp to show ssh repos that don't have remotes as existing, and let the user enter a ssh address to configure them. The problem with trying to do this is it actually has no idea that this is a ssh repo. It could just as easily be a local directory. The UI to configure it would be pretty elaborate. +"""]] diff --git a/doc/bugs/remote_not_showing_up_in_webapp/comment_2_10638e99e2e11460f99266f56adbc1db._comment b/doc/bugs/remote_not_showing_up_in_webapp/comment_2_10638e99e2e11460f99266f56adbc1db._comment new file mode 100644 index 000000000..fb2976657 --- /dev/null +++ b/doc/bugs/remote_not_showing_up_in_webapp/comment_2_10638e99e2e11460f99266f56adbc1db._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 2" + date="2014-04-19T04:26:57Z" + content=""" +i hit that thing again, utterly confused. it happens all the time with my laptop, which has access to my workstation, but not the other way around. so from the POV of my laptop, things make sense somehow, but from the workstation, the laptop doesn't show up at all, and when there's a transfer, it says it's into the unknown. + +really confusing... surely there's a way to show the remote name at least... +"""]] diff --git a/doc/bugs/remote_not_showing_up_in_webapp/comment_3_4aa72acc0938f7f824ba10f3f102e8bc._comment b/doc/bugs/remote_not_showing_up_in_webapp/comment_3_4aa72acc0938f7f824ba10f3f102e8bc._comment new file mode 100644 index 000000000..c0280b48b --- /dev/null +++ b/doc/bugs/remote_not_showing_up_in_webapp/comment_3_4aa72acc0938f7f824ba10f3f102e8bc._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 3" + date="2014-05-23T14:57:43Z" + content=""" +Yesterday, I made the webapp register ssh remotes it creates. +They then show up in the webapp when run in a repository where that ssh +remote is not enabled. + +You can also manually register a ssh remote. First set up the git remote +as usual. Then run `git annex initremote type=git name=foo +location=$url`. + +So, this bugs titular issue is fixed, but the issue of it displaying \"unknown\" rather than the remote description is not yet fixed. Will retitle this bug appropriately, and leave open until that gets fixed. +"""]] diff --git a/doc/bugs/repo_creation_fails_on_android_4.4.3.mdwn b/doc/bugs/repo_creation_fails_on_android_4.4.3.mdwn new file mode 100644 index 000000000..335357c10 --- /dev/null +++ b/doc/bugs/repo_creation_fails_on_android_4.4.3.mdwn @@ -0,0 +1,30 @@ +Hello everyone, +Creating a new repository through the web-app fails on Android 4.4.3, git annex version 5.20140612-g1bebb0d. + +Steps to reproduce the problem: + +1. Install git annex for android 4.4.3 + +2. Launch git annex. + +3. The terminal opens up reporting some (non-fatal?) errors. (I notice that I can't do anything in the terminal, is it supposed to reply to git annex commands? typing in "git annex version" does nothing). + +4. The web-app is launched. + +5. Click on make repository. + +6. Error message. + +I've made a few screenshots to illustrate: + +[terminal screenshot](https://drive.google.com/file/d/0B1qM91oKErVDSEJwbnhiaFJhQVU/edit?usp=sharing) + +This is the webapp error when creating a new repo: + +[first](https://drive.google.com/file/d/0B1qM91oKErVDVHVuLVpacmJaOEU/edit?usp=sharing) + +[second](https://drive.google.com/file/d/0B1qM91oKErVDX3R3cFhyb2VjcHc/edit?usp=sharing) + +Being on android I can't find any ".git/annex/daemon.log to" to report. I tried to look in the repo folder but there was no .git in it (maybe hidden?) + +> dup; [[done]] --[[Joey]] diff --git a/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_1_01e638ec9c6d74966d76b6ceb7c06bad._comment b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_1_01e638ec9c6d74966d76b6ceb7c06bad._comment new file mode 100644 index 000000000..9994130f5 --- /dev/null +++ b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_1_01e638ec9c6d74966d76b6ceb7c06bad._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxFr-i4nNUVrj3PJ_JKhp7GtZ5Xom7-3w" + nickname="John" + subject="Errors from Screenshots" + date="2014-07-03T20:00:25Z" + content=""" +A low-bandwidth version. + +*terminal screenshot:* + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +nex webapp +WARNING: linker: git-annex has text relocations. This is wasting memory and is a security risk. Please fix. +error: fchmod on /sdcard/annex/.git/config.lock failed: Operation not permitted +error: fchmod on /sdcard/annex/.git/config.lock failed: Operation not permitted + +*first:* + +git [Param \"config\",Param \"annex.uuid\",Param \"51e7d274-9723-4b14-8c5 + +*second:* + +ram \"annex.uuid\",Param \"51e7d274-9723-4b14-8c57-1d72263e3982\"] failed + +"""]] diff --git a/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_2_07c0f9387433b7107e9def2bfbed3039._comment b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_2_07c0f9387433b7107e9def2bfbed3039._comment new file mode 100644 index 000000000..473bfb308 --- /dev/null +++ b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_2_07c0f9387433b7107e9def2bfbed3039._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-03T20:13:57Z" + content=""" +Thanks, this is then a dup of [[bugs/Android_fails_on_Google_Nexus_10_Jellybean]]. +"""]] diff --git a/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_3_caf4f02677ea9e7fe28dbace99aa6860._comment b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_3_caf4f02677ea9e7fe28dbace99aa6860._comment new file mode 100644 index 000000000..0b46416f5 --- /dev/null +++ b/doc/bugs/repo_creation_fails_on_android_4.4.3/comment_3_caf4f02677ea9e7fe28dbace99aa6860._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 3" + date="2014-07-04T17:52:41Z" + content=""" +This problem should be fixed in the most recent daily build of git-annex for android. Testing appreciated. +"""]] diff --git a/doc/bugs/rsync_special_remote_fails_to___96__get__96___files_which_have_names_containing_spaces.mdwn b/doc/bugs/rsync_special_remote_fails_to___96__get__96___files_which_have_names_containing_spaces.mdwn new file mode 100644 index 000000000..040d86bb8 --- /dev/null +++ b/doc/bugs/rsync_special_remote_fails_to___96__get__96___files_which_have_names_containing_spaces.mdwn @@ -0,0 +1,50 @@ + ~$ mkdir test annex + ~$ cd test + ~$ git init + Initialized empty Git repository in /home/user/test/.git/ + ~$ git annex init test + init test ok + ~$ git annex initremote localrsync encryption=none type=rsync rsyncurl=localhost:annex/ + initremote localrsync ok + ~$ cp /home/user/Music/Charming\ Hostess/Eat/03\ Mi\ Nuera.ogg ./ + ~$ git annex add 03\ Mi\ Nuera.ogg + add 03 Mi Nuera.ogg ok + (Recording state in git...) + ~$ git commit -m "add ogg" + fatal: No HEAD commit to compare with (yet) + fatal: No HEAD commit to compare with (yet) + [master (root-commit) 12608af] add ogg + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 03 Mi Nuera.ogg + ~$ git annex move 03\ Mi\ Nuera.ogg --to localrsync + move 03 Mi Nuera.ogg (checking localrsync...) (to localrsync...) + sending incremental file list + 1X/ + 1X/39/ + 1X/39/WORM-s6296772-m1311874383--03 Mi Nuera.ogg/ + 1X/39/WORM-s6296772-m1311874383--03 Mi Nuera.ogg/WORM-s6296772-m1311874383--03 Mi Nuera.ogg + 6296772 100% 42.98MB/s 0:00:00 (xfer#1, to-check=0/5) + + sent 6297754 bytes received 43 bytes 4198531.33 bytes/sec + total size is 6296772 speedup is 1.00 + ok + ~$ git annex get 03\ Mi\ Nuera.ogg + get 03 Mi Nuera.ogg (from localrsync...) + rsync: link_stat "/home/user/annex/1X/39/WORM-s6296772-m1311874383--03" failed: No such file or directory (2) + rsync: link_stat "/home/user/Mi" failed: No such file or directory (2) + rsync: change_dir "/home/user/Nuera.ogg" failed: No such file or directory (2) + rsync: link_stat "/home/user/Mi" failed: No such file or directory (2) + rsync: link_stat "/home/user/Nuera.ogg" failed: No such file or directory (2) + + sent 8 bytes received 12 bytes 13.33 bytes/sec + total size is 0 speedup is 0.00 + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1526) [Receiver=3.0.7] + + rsync failed -- run git annex again to resume file transfer + Unable to access these remotes: localrsync + Try making some of these repositories available: + b8b1ea7a-b93f-11e0-b712-d7bffb6e61e6 -- localrsync + failed + git-annex: 1 failed + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/rsync_transport:_username_not_respected.mdwn b/doc/bugs/rsync_transport:_username_not_respected.mdwn new file mode 100644 index 000000000..467e67643 --- /dev/null +++ b/doc/bugs/rsync_transport:_username_not_respected.mdwn @@ -0,0 +1,43 @@ +### Please describe the problem. + +I created an encrypted rsync remote with a username (user@host). The rsync command issued by git-annex doesn't contain the username. I solved the problem using .ssh/config. + +### What steps will reproduce the problem? + + +[[!format sh """ +# Add remote like that +git-annex initremote encrsync type=rsync rsyncurl=user@xxx.rsync.net:rsync/X keyid=0xXXX +# Sync it +git-annex sync --content + + +# You'll see +$> ps ax | grep rsync +30652 pts/3 S+ 0:00 /home/ganwell/bin/git-annex.linux//lib64/ld-linux-x86-64.so.2 --library-path /home/ganwell/bin/git-annex.linux//etc/ld.so.conf.d:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu/gconv:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu/libc:/home/ganwell/bin/git-annex.linux//usr/lib:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu:/home/ganwell/bin/git-annex.linux//lib64:/home/ganwell/bin/git-annex.linux//lib/x86_64-linux-gnu: /home/ganwell/bin/git-annex.linux/shimmed/rsync/rsync xxx.rsync.net:rsync/X/9fa/634/'GPGHMACSHA1--X/GPGHMACSHA1--X +"""]] + + + +### What version of git-annex are you using? On what operating system? + +OS: Linux + +Ver: git-annex version: 5.20140210-g1e0a3ad + +Type: prebuilt + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Argh! How did that break? I know it used to work. +> I have fixed it, unfortunately the fix was too late for today's release, +> but it will be available in autobuilds shortly. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files.mdwn b/doc/bugs/runs_of_of_memory_adding_2_million_files.mdwn new file mode 100644 index 000000000..3891933a6 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files.mdwn @@ -0,0 +1,17 @@ +Make 2 million files and `git annex add` (indirect mode), fails at the end: + +
+add 999996 ok
+add 999997 ok
+(Recording state in git...)
+[2014-06-21 11:49:28 JEST] feed: xargs ["-0","git","--git-dir=/home/joey/tmp/r/.git","--work-tree=/home/joey/tmp/r","add","--"]
+add 999998 ok
+add 999999 ok
+[2014-06-21 11:49:49 JEST] read: git ["--git-dir=/home/joey/tmp/r/.git","--work-tree=/home/joey/tmp/r","diff","--name-only","--diff-filter=T","-z","--","."]
+(Recording state in git...)
+[2014-06-21 11:52:24 JEST] feed: xargs ["-0","git","--git-dir=/home/joey/tmp/r/.git","--work-tree=/home/joey/tmp/r","add","--"]
+Stack space overflow: current size 8388608 bytes.
+Use `+RTS -Ksize -RTS' to increase it.
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_1_8b60b7816b9bf2c8cdd21b5cae431555._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_1_8b60b7816b9bf2c8cdd21b5cae431555._comment new file mode 100644 index 000000000..d4b1c3fd8 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_1_8b60b7816b9bf2c8cdd21b5cae431555._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-04T18:24:51Z" + content=""" +The diff-filter=T comes from when Command.Add runs its pass to find unlocked files. It's finished adding all the files, so it must either be that or the git-annex branch commit that's running out of memory, I think. +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_2_32908da23e4fb38a7d20b765a5ab4656._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_2_32908da23e4fb38a7d20b765a5ab4656._comment new file mode 100644 index 000000000..7f0e8ba70 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_2_32908da23e4fb38a7d20b765a5ab4656._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-04T18:36:49Z" + content=""" +Does not seem to be the diff-filter=T command that is the problem. It's not outputting a lot of files, and should stream over them even if it did. + +The last xargs appears to be at or near the problem. It is called by Annex.Content.saveState, which first does a Annex.Queue.flush, followed by a Annex.Branch.commit. I suspect the problem is the latter; at this point there are 2 million files in .git/annex/journal waiting to be committed to the git-annex branch. + +In the same big repo, I can add one more file and reproduce the problem running `git annex add $newfile`. +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_3_3cff88b50eb3872565bccbeb6ee15716._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_3_3cff88b50eb3872565bccbeb6ee15716._comment new file mode 100644 index 000000000..7e2c5568d --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_3_3cff88b50eb3872565bccbeb6ee15716._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 3" + date="2014-07-04T19:26:00Z" + content=""" +Looking at the code, it's pretty clear why this is using a lot of memory: + +
+        fs <- getJournalFiles jl
+        liftIO $ do
+                h <- hashObjectStart g
+                Git.UpdateIndex.streamUpdateIndex g
+                        [genstream dir h fs]
+                hashObjectStop h
+        return $ liftIO $ mapM_ (removeFile . (dir )) fs
+
+ +So the big list in `fs` has to be retained in memory after the files are streamed to update-index, in order for them to be deleted! + +Fixing is a bit tricky.. New journal files can appear while this is going on, so it can't just run getJournalFiles a second time to get the files to clean. +Maybe delete the file after it's been sent to git-update-index? But git-update-index is going to want to read the file, and we don't really know when it will choose to do so. It could wait a while after we've sent the filename to it, potentially. + +Also, per [[!commit 750c4ac6c282d14d19f79e0711f858367da145e4]], we cannot delete the journal files until *after* the commit, or another git-annex process would see inconsistent data! + +I actually think I am going to need to use a temp file to hold the list of files.. +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_4_e991986eb8ae49d2e69f7ed7fd61485f._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_4_e991986eb8ae49d2e69f7ed7fd61485f._comment new file mode 100644 index 000000000..40ff69d05 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_4_e991986eb8ae49d2e69f7ed7fd61485f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 4" + date="2014-07-04T19:38:18Z" + content=""" +While I fixed the problem analized above, it still runs out of memory in the same place. Must be other strictness problems.. +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_5_241ad838135a7a377374ca9ba90aec5c._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_5_241ad838135a7a377374ca9ba90aec5c._comment new file mode 100644 index 000000000..41382e1c2 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_5_241ad838135a7a377374ca9ba90aec5c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 5" + date="2014-07-04T19:53:43Z" + content=""" +The other memory leak is in getJournalFiles itself! +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_6_744982b77cc867e9e3a7d638c7a653d6._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_6_744982b77cc867e9e3a7d638c7a653d6._comment new file mode 100644 index 000000000..574cc0dc7 --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_6_744982b77cc867e9e3a7d638c7a653d6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 6" + date="2014-07-04T21:10:17Z" + content=""" +Actually, it is in getDirectoryContents itself, so not even in git-annex's code. Filed a bug w/patch: + +I do not feel this is serious enough to work around in git-annex with a fixed copy of getDirectoryContents, so I'll wait for that get fixed. + +Testing with my patched getDirectoryContents, git-annex still uses up a lot of memory in this situation. It no longer blows the stack, but getDirectoryContents is still using entirely more memory than it needs to. +"""]] diff --git a/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_7_9add4ee13b7ea846e6495c28da214269._comment b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_7_9add4ee13b7ea846e6495c28da214269._comment new file mode 100644 index 000000000..a6f837dff --- /dev/null +++ b/doc/bugs/runs_of_of_memory_adding_2_million_files/comment_7_9add4ee13b7ea846e6495c28da214269._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 7" + date="2014-07-04T22:09:38Z" + content=""" +I wrote my own getDirectoryContents' with different exception semantics and entirely fixed this now. git-annex's memory use remains stable at around 1.5 mb during the entire staging of the millions of files. git itself uses a few hundred mb ;) +"""]] diff --git a/doc/bugs/set_metadata_on_wrong_files.mdwn b/doc/bugs/set_metadata_on_wrong_files.mdwn new file mode 100644 index 000000000..e31714784 --- /dev/null +++ b/doc/bugs/set_metadata_on_wrong_files.mdwn @@ -0,0 +1,90 @@ +### Please describe the problem. + +For an example I wanted to add different metadata to some test files, +but the outcome is that the last metadata gets applied to all three files. see transcript below. + + + +### What steps will reproduce the problem? + +1. Create a git annex repository +2. add a few files +3. add some metadata to the files, same keys, differnt values +4. watch the metadata, only the last added one is shown for all files + + +### What version of git-annex are you using? On what operating system? + $cat /etc/debian_version; uname -a; git annex version + 7.4 + Linux jupiter 3.13.0ct #33 SMP PREEMPT Tue Jan 21 05:04:01 CET 2014 x86_64 GNU/Linux + git-annex version: 5.20140306~bpo70+1 + build flags: Assistant Webapp Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + + +### Please provide any additional information below. + +Debian/Wheezy with git annex from backports. The test was done in /tmp which is a tmpfs. + + +[[!format sh """ +$export LC_ALL=C +$mkdir /tmp/annextest +$cd /tmp/annextest +$git init +Initialized empty Git repository in /tmp/annextest/.git/ +$git annex init +init ok +(Recording state in git...) + +$touch a.txt b.txt c.txt +$git annex add a.txt b.txt c.txt +add a.txt ok +add b.txt ok +add c.txt ok +(Recording state in git...) +$git commit -m init +[master (root-commit) 5470bdb] init + 3 files changed, 3 insertions(+) + create mode 120000 a.txt + create mode 120000 b.txt + create mode 120000 c.txt + +$git annex metadata a.txt -s foo=bar -s num=1 +metadata a.txt + foo=bar + num=1 +ok +(Recording state in git...) +$git annex metadata b.txt -s foo=baz -s num=2 +metadata b.txt + foo=baz + num=2 +ok +(Recording state in git...) +$git annex metadata c.txt -s foo=barf -s num=3 +metadata c.txt + foo=barf + num=3 +ok +(Recording state in git...) +$git annex metadata +metadata a.txt + foo=barf + num=3 +ok +metadata b.txt + foo=barf + num=3 +ok +metadata c.txt + foo=barf + num=3 +ok +"""]] + +> [[fixed|done]]; documentation improved --[[Joey]] diff --git a/doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment b/doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment new file mode 100644 index 000000000..f7a47d2fe --- /dev/null +++ b/doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T20:55:07Z" + content=""" +This is because metadata applies to the contents of files, and all 3 of your files have the same single content. I will update the documentation to make it more clear metadata works this way. +"""]] diff --git a/doc/bugs/signal_weirdness.mdwn b/doc/bugs/signal_weirdness.mdwn new file mode 100644 index 000000000..5a0096334 --- /dev/null +++ b/doc/bugs/signal_weirdness.mdwn @@ -0,0 +1,50 @@ +For the record, there is a slight weirdness with how git-annex +handles a signal like ctrl-c. + +For example: + + joey@gnu:~/tmp/b>git annex copy a b --to origin + copy a (checking origin...) (to origin...) + SHA256-s104857600--20492a4d0d84f8beb1767f6616229f85d44c2827b64bdbfb260ee12fa1109e0e + 3272 0% 0.00kB/s 0:00:00 ^C + zsh: interrupt git annex copy a --to origin + joey@gnu:~/tmp/b> + rsync error: unexplained error (code 130) at rsync.c(549) [sender=3.0.9] + +Here git-annex exits before rsync has fully exited. Not a large problem +but sorta weird. + +The culprit is `CmdLine.startup` in Utility.SafeCommand, which installs +a default signal handler for SIGINT, which causes it to immediatly +terminate git-annex. rsync, in turn, has its own SIGINT handler, which +prints the message, typically later. + +(Why it prints that message and not its more usual message about having +received a signal, I'm not sure?) + +It's more usual for a `system` like thing to block SIGINT, letting the child +catch it and exit, and then detecting the child's exit status and terminating. +However, since rsync *is* trapping SIGINT, and exiting nonzero explicitly, +git-annex can't tell that rsync failed due to a SIGINT by examining the +`waitpid` result. +And, git-annex typically doesn't stop when a single child fails. In the +example above, it would go on to copy `b` after a ctrl-c! + +A further complication is that git-annex is itself a child process +of git, which does not block SIGINT either. So if git-annex blocks SIGINT, +it will be left running in the background after git exits, and continuing +with further actions too. (Perhaps its SIGINT handling is a bug in git.) + +Now, rsync does have a documented exit code it uses after a SIGINT. +But other programs git-annex runs generally do not. So it would be possible +to special case in support for rsync, blocking SIGINT while running it, +noticing it exited with 20, and git-annex then stopping. But this is +ugly and failure prone if rsync's code 20 changes. And it only +would fix the rsync case, not helping with other commands like wget, unless +it assumes they never trap SIGINT on their own. + +Which is why the current behavior of not blocking SIGINT was chosen, +as a less bad alternative. Still, I'd like to find a better one. +--[[Joey]] + +[[!tag confirmed]] diff --git a/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink.mdwn b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink.mdwn new file mode 100644 index 000000000..3f8c7fc48 --- /dev/null +++ b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +ATM git annex assistant app is the largest one installed on my phone. I simply keep hitting the available storage space limits and keep pruning some apps + +According to file +$> file lib/armeabi/lib.git-annex.so +lib/armeabi/lib.git-annex.so: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped +so largest annex's .so is 133M and is not stripped. stripping it seems to half its size: + +$> ls -l lib.git-annex.so +62052 -rw------- 1 yoh yoh 63468304 Nov 25 22:21 lib.git-annex.so +$> file lib.git-annex.so +lib.git-annex.so: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped + +so may be it could be the first step to make the .apk and installation itself more lightweight and thus easier to "manage" + +thanks in advance + +### What steps will reproduce the problem? + +install provided .apk on Android + +### What version of git-annex are you using? On what operating system? + +Android, just fetched the most recent "release" apk from the +http://downloads.kitenet.net/git-annex/android/current/4.0/git-annex.apk +Last-Modified: Mon, 18 Nov 2013 11:57:25 GMT + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Seems that I lost stripping of the git-annex binary when adding the build +> for the newer android versions. [[fixed|done]] (There is not otherwise +> much way to shrink the size.) --[[Joey]] diff --git a/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_1_d2faaff98386433110dcf7aae87916b7._comment b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_1_d2faaff98386433110dcf7aae87916b7._comment new file mode 100644 index 000000000..894c48784 --- /dev/null +++ b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_1_d2faaff98386433110dcf7aae87916b7._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="sure there is no other ways to shrink?" + date="2013-11-27T04:26:35Z" + content=""" +Might be quite a stretch but it is hard to grasp that all 60MB are really needed... although with haskell -- it might indeed be the case, but I thought that may be there could be some symbols pulled in which aren't used, and for which when in gcc/ld world there are ways to get rid of them, e.g. -dead_strip (just excercising ideas) + +"""]] diff --git a/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_2_1359ddf1b5db4303f8bd219d3f07df3a._comment b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_2_1359ddf1b5db4303f8bd219d3f07df3a._comment new file mode 100644 index 000000000..5f7688d1f --- /dev/null +++ b/doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_2_1359ddf1b5db4303f8bd219d3f07df3a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-11-27T04:55:51Z" + content=""" +The git-annex binary is around 45 mb on Linux. The android binary statically links a few additional C libraries, so is slightly larger. + +The only way I know of to potentially shrink it is to fix certian ghc / ld interactions that, in my limited understanding, cause functions that are never used to be linked into the binary if another function in the same file (or module) is used. That might half its size or something. +"""]] diff --git a/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn b/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn new file mode 100644 index 000000000..3aa3188af --- /dev/null +++ b/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +When I try to add remote ssh server repository it fails with an error: + +Internal Server Error +ssh-keygen failed" + + +### What steps will reproduce the problem? +1. Select "Add another repository", then choose "Remote server", enter credentials. +2. On the page "Ready to add remote server" click any choice ("Use a git repository on the server" or "Use an encrypted rsync repository on the server") +3. Error is raised + +### What version of git-annex are you using? On what operating system? +git-annex version 4.20130922-g7dc188a + +Fedora 18 x86_64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-10-03 19:27:27 NOVT] main: starting assistant version 4.20130922-g7dc188a +(scanning...) [2013-10-03 19:27:27 NOVT] Watcher: Performing startup scan +(started...) +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp +[2013-10-03 19:55:23 NOVT] call: ssh-keygen ["-P","","-f","/tmp/git-annex-keygen.0/key"] +ssh-keygen: symbol lookup error: /lib64/libldap-2.4.so.2: undefined symbol: ber_sockbuf_io_udp + + +# End of transcript or log. +"""]] + +> Added ssh-keygen to bundle. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo/comment_1_52180983b59c247389a55a9523ec435b._comment b/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo/comment_1_52180983b59c247389a55a9523ec435b._comment new file mode 100644 index 000000000..f0f50151a --- /dev/null +++ b/doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo/comment_1_52180983b59c247389a55a9523ec435b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2013-11-08T18:28:37Z" + content=""" +Apologies for not following up on this bug sooner.. + +It seems to me that your system has a broken ssh-keygen program. You didn't say how you installed git-annex, but based on the git rev in the version number, I'm guessing you either built it yourself, or you're using the standalone tarball I build. + +In the case of the latter, it didn't include ssh-keygen, so would try to use the one that comes with fedora. It seems likely that the problem comes from the libraries included in the bundle being used with a binary not in the bundle, that in turn is also using additional libraries. + +So, I think I should add ssh-keygen to the standalone bundle! +"""]] diff --git a/doc/bugs/ssh:_unprotected_private_key_file.mdwn b/doc/bugs/ssh:_unprotected_private_key_file.mdwn new file mode 100644 index 000000000..207ef76d1 --- /dev/null +++ b/doc/bugs/ssh:_unprotected_private_key_file.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. + +When pairing two machines with git-annex assistant, the assistant kept asking for the ssh password. Checking the git-annex daemon logs, I saw that ssh was refusing to use the key the assistant had created because it was group readable (see below for the log extract). + +### What steps will reproduce the problem? + +The assistant was installed from the ubuntu precise ppa backport on an up-to-date copy of ubuntu precise. +It was started using "git-annex webapp --listen=XYZ". +This was done on two machines on the same network. +Created a repository using the web-app, the same on both machines. +Did a pair request. This initially worked fine, until it got to the point of using ssh, when it started asking for the password many many times. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140306 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +Ubuntu 12.04.4 LTS + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(started...) Generating public/private rsa key pair. +Your identification has been saved in /tmp/git-annex-keygen.0/key. +Your public key has been saved in /tmp/git-annex-keygen.0/key.pub. +The key fingerprint is: +2b:f4:28:35:72:2c:9e:5b:d3:1d:d1:a1:b7:c7:a5:34 ABC@XYZ +The key's randomart image is: ++--[ RSA 2048]----+ +| . | +| o . | +| o o E .| +| . o + + | +| o * S . . + | +| . B = o . . | +| + = + . | +| + o | +| . | ++-----------------+ +[2014-03-14 13:35:45 GMT] main: Pairing in progress +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ WARNING: UNPROTECTED PRIVATE KEY FILE! @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +Permissions 0620 for 'ABC/.ssh/git-annex/key.git-annex-XYZ_annex' are too open. +It is required that your private key files are NOT accessible by others. +This private key will be ignored. +bad permissions: ignore key: ABC/.ssh/git-annex/key.git-annex-XYZ_annex +(merging XYZ_annex/git-annex into git-annex...) + +# End of transcript or log. +"""]] + +> [[Fixed|done]]; the code made sure the file did not have any group or +> world read bits, but did not clear write bits. --[[Joey]] diff --git a/doc/bugs/ssh_portnum_bugs.mdwn b/doc/bugs/ssh_portnum_bugs.mdwn new file mode 100644 index 000000000..4f24a9945 --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. + +Lots of issues setting up assistant using SSH running on non-standard ports. Tested local pairing (which did seem to show other computer, but then wouldn't sync) and Remote Server. + +### What steps will reproduce the problem? + +Change Port 22 in /etc/ssh/sshd_config to Port 9999, restart ssh on both computers. With a clean local .ssh/config and directory, try to set up local pairing or remote server. It appears to work, especially if XMPP is working properly with remote server, but then some operations fail. (Iirc, metadata does sync but not data.) Ultimately, I had to go back to using Port 22 and using denyhosts/fail2ban (which occasionally erroneously ban my IP). + +(Although it's probably not relevant to the bug report, it could be argued that this is security through obscurity. There is some truth in this, but scanning an entire machine is 65,535 times slower than scanning just port 22, so it introduces a real cost to bulk scanning. I almost never, ever have attacks on random ports, whereas I have dozens per day on each server on port 22, and often thousands of attacks.) + +### What version of git-annex are you using? On what operating system? + +When I was experiencing this issue, I was running the default on Jessie/Wheezy. Now I'm running the latest (via auto-update and distributed binary) but don't know if this is still an issue with latest versions (I switched to 22 as a workaround). + +[[!tag moreinfo]] diff --git a/doc/bugs/ssh_portnum_bugs/comment_1_2026785c06e99b55158cd65c221eb598._comment b/doc/bugs/ssh_portnum_bugs/comment_1_2026785c06e99b55158cd65c221eb598._comment new file mode 100644 index 000000000..35792e2ce --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs/comment_1_2026785c06e99b55158cd65c221eb598._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-05T16:37:27Z" + content=""" +I'm going to assume that the \"jessie/wheezy\" is a typo, since those are two completely different versions. It sounds to me like you were using the git-annex 3.x distributed with debian stable. + +I cannot reproduce ssh port issues with the current release, and there have been ssh port fixes in the over 2 years since the version in Debian stable. +"""]] diff --git a/doc/bugs/ssh_portnum_bugs/comment_2_76551dfcd29b54814809c434d7cb64af._comment b/doc/bugs/ssh_portnum_bugs/comment_2_76551dfcd29b54814809c434d7cb64af._comment new file mode 100644 index 000000000..0a88c37bb --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs/comment_2_76551dfcd29b54814809c434d7cb64af._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jamieson" + ip="71.11.173.17" + subject="comment 2" + date="2014-06-05T16:50:20Z" + content=""" +Jessie on one machine, Wheezy on the other; exactly, that is the version I was using. Git Annex is awesome. Thanks!! +"""]] diff --git a/doc/bugs/ssh_portnum_bugs/comment_3_ab49a0e307a29c7c20627bbb3b10ab1d._comment b/doc/bugs/ssh_portnum_bugs/comment_3_ab49a0e307a29c7c20627bbb3b10ab1d._comment new file mode 100644 index 000000000..99dad8dcd --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs/comment_3_ab49a0e307a29c7c20627bbb3b10ab1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-05T16:50:30Z" + content=""" +I did notice a problem where the same ssh config stanza was used if the webapp set up a repository on a host first using one port, and later using a different port. I've fixed that. +"""]] diff --git a/doc/bugs/ssh_portnum_bugs/comment_4_e0d96a43208453dc29373d0e045751e3._comment b/doc/bugs/ssh_portnum_bugs/comment_4_e0d96a43208453dc29373d0e045751e3._comment new file mode 100644 index 000000000..dd20bf76d --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs/comment_4_e0d96a43208453dc29373d0e045751e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-05T16:51:42Z" + content=""" +Did the failure occur on the machine running jessie, or on the machine running wheezy? +"""]] diff --git a/doc/bugs/ssh_portnum_bugs/comment_5_9ed44cdb79224dac6b000983d77d53f3._comment b/doc/bugs/ssh_portnum_bugs/comment_5_9ed44cdb79224dac6b000983d77d53f3._comment new file mode 100644 index 000000000..9f57c64df --- /dev/null +++ b/doc/bugs/ssh_portnum_bugs/comment_5_9ed44cdb79224dac6b000983d77d53f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jamieson" + ip="71.11.173.17" + subject="comment 5" + date="2014-06-05T16:56:33Z" + content=""" +I'm not sure. I'll do some more testing! +"""]] diff --git a/doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn b/doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn new file mode 100644 index 000000000..ba7dcad30 --- /dev/null +++ b/doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn @@ -0,0 +1,20 @@ +Let's say that http://people.collabora.com/~alsuren/git/fate-suite.git/ is a bare git repo. It has been 'git update-server-info'd so that it can be served on a dumb http server. + +The repo is also a git annex remote, created using the following commands: + +* git remote add alsuren git+ssh://people.collabora.co.uk/user/alsuren/public_html/fate-suite.git +* git push alsuren --all +* git annex copy --to=alsuren + +so http://people.collabora.com/~alsuren/git/fate-suite.git/annex is a valid git annex (though listing dirs is forbidden, so you need to know the filenames ahead of time). + +I would like to be able to use the following commands to get a clone of the repo: + +* git clone http://people.collabora.com/~alsuren/git/fate-suite.git/ +* cd fate-suite +* git annex get + +This would allow contributors to quickly get a copy of our upstream repo and start contributing with minimal bandwidth/effort. + +> This is now supported.. I look forward to seeing your project using it! +> --[[Joey]] [[!tag done]] diff --git a/doc/bugs/sync_does_not_commit_with_alwasycommit___61___false.mdwn b/doc/bugs/sync_does_not_commit_with_alwasycommit___61___false.mdwn new file mode 100644 index 000000000..9b7ec7cf5 --- /dev/null +++ b/doc/bugs/sync_does_not_commit_with_alwasycommit___61___false.mdwn @@ -0,0 +1,90 @@ +### Please describe the problem. + +The documentation of `git annex sync` states + +> The sync process involves first committing all local changes, then fetching and merging […] +> You can use standard git commands to do each of those steps by hand, or if you +> don't want to worry about the details, you can use sync. + +The documentation of `alwasycommit` states + +> By default, git-annex automatically commits data to the git-annex branch after each +> command is run. To disable these commits, set to false. Then data will only be +> committed when running `git annex merge` (or by automatic merges) or `git annex sync`. + +In fact, however, `git annex sync` will not commit or will not commit some pieces of information when `alwasycommit` is false. This leads to various problems, the first of which is that cloned repositories do not have information about the other remotes. + +It is hard to work around this problem because `git commit` cannot be used in direct mode. + +This problem does not show up when using local, non over-the-network, remotes. + +### What steps will reproduce the problem? + +The following script (available at ) will reproduce this problem. If you do not have SSH running on localhost, you can change the `h` variable to point to another host. + + #!/bin/sh -x + + set -e ; set -u + export LC_ALL=C + + h=${h:-localhost} + dr="/tmp/annex" + + chmod a+rwx -R pc1 pc2 || true + rm -Rf pc1 pc2 + + # create central git repo + ssh $h "chmod a+rwx -R ${dr}/Docs.git" || true + ssh $h "rm -Rf ${dr}/Docs.git" + ssh $h "mkdir -p ${dr}/Docs.git" + ssh $h "cd ${dr}/Docs.git ; git init --bare" + + d=$(pwd) + + # populate repo in PC1 + mkdir -p pc1/Docs + cd pc1/Docs + echo AAA > fileA + echo BBB > fileB + + git init + git config annex.alwayscommit false # change to true to solve this problem + + git remote add origin $h:$dr/Docs.git + git fetch --all + + # simulate a host without git-annex + git config remote.origin.annex-ignore true + + git annex init "pc1" + git annex info + + git annex direct + git annex sync origin + + git annex add . + git annex sync + + # re-create repo on PC2 + cd $d + mkdir -p pc2 + cd pc2 + git clone $h:$dr/Docs.git + cd Docs + + git config remote.origin.annex-ignore true + + git annex init "pc2" + git annex direct + git annex info + + # git annex info shows only pc2, shouldn't pc1 be there as well? + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140708-g8c9c55c on Ubuntu 12.04.4 + +> I have improved the documentation to not imply that sync/merge are a +> special case. They honor the autocommit settings more or less +> intentionally, and to get a commit to be made, just pass -c +> autocommit=true when running them. [[done]] --[[Joey]] diff --git a/doc/bugs/test_failures_on_window_for_5.20131118.mdwn b/doc/bugs/test_failures_on_window_for_5.20131118.mdwn new file mode 100644 index 000000000..319eae4f1 --- /dev/null +++ b/doc/bugs/test_failures_on_window_for_5.20131118.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. + +git annex test reports failures + +### What steps will reproduce the problem? + +running git annex test (from standard cmd, with: git version: 1.7.11.msysgit.1) + +### What version of git-annex are you using? On what operating system? + +5.20131118 from installers + +### Please provide any additional information below. + +operating system: + +windows XP, NTFS = 1 FAIL +windows 7, NTFS = 2 FAILs + +see attachment for full log of git annex test output + +> Reproduced and [[fixed|done]]. --[[Joey]] diff --git a/doc/bugs/test_failures_on_window_for_5.20131118/comment_1_5a7a284625c12d54390fe4a4ec1d4211._comment b/doc/bugs/test_failures_on_window_for_5.20131118/comment_1_5a7a284625c12d54390fe4a4ec1d4211._comment new file mode 100644 index 000000000..d27e69b30 --- /dev/null +++ b/doc/bugs/test_failures_on_window_for_5.20131118/comment_1_5a7a284625c12d54390fe4a4ec1d4211._comment @@ -0,0 +1,188 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI" + nickname="Michele" + subject="seems i'm not allowed to attach full logs." + date="2013-11-23T16:06:17Z" + content=""" +here's an excerpt (the context of FAIL), hopefully i've interpreted correctely the test begin message. + +win7: + + unannex (with copy): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +unannex foo +git-annex: M:\gitannex.test\.t\tmprepo4\.git\annex\objects\6cd\e82\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77.map4432.tmp: MoveFileEx \"M:\\gitannex.test\\.t\\tmprepo4\\.git\\annex\\objects\\6cd\\e82\\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77\\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77.map4432.tmp\" \"M:\\gitannex.test\\.t\\tmprepo4\\.git\\annex\\objects\\6cd\\e82\\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77\\SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77.map\": permission denied (Access is denied.) +failed +git-annex: unannex: 1 failed +FAIL + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor (checksum...) ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit + ok + pull origin bash.exe: warning: could not find /tmp, please create! + + ok + push origin bash.exe: warning: could not find /tmp, please create! + To M:/gitannex.test/.t\repo + 32fb7c0..38147e0 git-annex -> synced/git-annex + 7684984..4116595 annex/direct/master -> synced/master + + ok + add conflictor/subfile (checksum...) ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit + ok + pull origin bash.exe: warning: could not find /tmp, please create! + From M:/gitannex.test/.t\repo + 7684984..4116595 master -> origin/master + 32fb7c0..38147e0 synced/git-annex -> origin/synced/git-annex + 7684984..4116595 synced/master -> origin/synced/master + Adding conflictor/subfile + CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~refs_remotes_origin_synced_master + Automatic merge failed; fix conflicts and then commit the result. + Ignoring path ./conflictor.variant-cc12 + conflictor: needs merge + [annex/direct/master 27c52e4] git-annex automatic merge conflict fix + + + (Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin bash.exe: warning: could not find /tmp, please create! + To M:/gitannex.test/.t\repo + 38147e0..02916ee git-annex -> synced/git-annex + 4116595..27c52e4 annex/direct/master -> synced/master + + ok + commit + ok + pull r2 bash.exe: warning: could not find /tmp, please create! + From ../../.t\tmprepo35 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master + Updating 4116595..27c52e4 + Fast-forward + conflictor | 1 - + conflictor/subfile | 1 + + 2 files changed, 1 insertion(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor/subfile + Already up-to-date. + + + + ok + (merging r2/git-annex into git-annex...) + FAIL + + +windowsXP: + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add conflictor (checksum...) ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit +ok +pull origin bash.exe: warning: could not find /tmp, please create! + +ok +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Documents and Settings/Silvia/.t\repo + edd69f1..83c6a5a git-annex -> synced/git-annex + bed393e..978ac14 annex/direct/master -> synced/master + +ok +add conflictor/subfile (checksum...) ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit +ok +pull origin bash.exe: warning: could not find /tmp, please create! +From C:/Documents and Settings/Silvia/.t\repo + bed393e..978ac14 master -> origin/master + edd69f1..83c6a5a synced/git-annex -> origin/synced/git-annex + bed393e..978ac14 synced/master -> origin/synced/master +Adding conflictor/subfile +CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~refs_remotes_origin_synced_master +Automatic merge failed; fix conflicts and then commit the result. +Ignoring path ./conflictor.variant-cc12 +conflictor: needs merge +[annex/direct/master e3e39fc] git-annex automatic merge conflict fix + + +(Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. +ok +(merging origin/synced/git-annex into git-annex...) +(Recording state in git...) +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Documents and Settings/Silvia/.t\repo + 83c6a5a..e1a1678 git-annex -> synced/git-annex + 978ac14..e3e39fc annex/direct/master -> synced/master + +ok +commit +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo35 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master +Updating 978ac14..e3e39fc +Fast-forward + conflictor | 1 - + conflictor/subfile | 1 + + 2 files changed, 1 insertion(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor/subfile +Already up-to-date. + + + +ok +(merging r2/git-annex into git-annex...) +FAIL +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn new file mode 100644 index 000000000..116f1496f --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn @@ -0,0 +1,20 @@ +It seems that commit bc5c54c987f548505a3877e8a0e460abe0b2a081 introduced some linux specific things... + +
+hsc2hs Touch.hsc
+Touch.hsc: In function ‘main’:
+Touch.hsc:46: error: ‘UTIME_OMIT’ undeclared (first use in this function)
+Touch.hsc:46: error: (Each undeclared identifier is reported only once
+Touch.hsc:46: error: for each function it appears in.)
+Touch.hsc:48: error: ‘UTIME_NOW’ undeclared (first use in this function)
+Touch.hsc:67: error: ‘AT_FDCWD’ undeclared (first use in this function)
+Touch.hsc:68: error: ‘AT_SYMLINK_NOFOLLOW’ undeclared (first use in this function)
+compiling Touch_hsc_make.c failed
+command was: /usr/bin/gcc -c -m32 -I/Library/Frameworks/GHC.framework/Versions/612/usr/lib/ghc-6.12.3/include/ Touch_hsc_make.c -o Touch_hsc_make.o
+make: *** [Touch.hs] Error 1
+
+ +I dug around the OSX documentation and fcntl.h header file and it seems that UTIME_OMIT, UTIME_NOW, AT_FDCWD and AT_SYMLINK_NOFOLLOW aren't defined (at least on OSX). I suspect the BSD's in general will have problems compiling git-annex. + +[[!meta title="annexed symlink mtime matching code is disabled on non-linux systems; needs testing"]] +[[!tag confirmed]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment new file mode 100644 index 000000000..f26239c3e --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-16T16:07:26Z" + content=""" +Hmm.. is utimensat available at all? + +I've committed an update that may convince at least some compilers to expose this newer POSIX stuff. I don't know if it will help, please let me know. +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment new file mode 100644 index 000000000..0222e645b --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2011-03-16T16:49:18Z" + content=""" +Just pulled the changes, it still fails to build. utimensat doesn't seem to exist on OSX 10.6.6. +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment new file mode 100644 index 000000000..7e79dea88 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-16T17:46:40Z" + content=""" +Alright, I've added #idefs and the symlink timestamp mirroring feature will be unavailable on OSX until I get a version that works there. +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment new file mode 100644 index 000000000..6b1e03b02 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2011-03-16T20:32:01Z" + content=""" +Just tried it out on my mac and it's working again. I guess this issue could be closed for now. +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment new file mode 100644 index 000000000..aeb576be3 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-03-20T18:12:59Z" + content=""" +I'm leaving this bug open because this feature, however minor is not available on OSX and BSD. + +I have added a partial implementation using lutimes(3), which should be available on the BSDs. However, it's ifdefed out due to a casting problem: The TimeSpec uses a CTime, while lutimes uses a CLong. These data types may be internally the same on some or all platforms, so if you want this feature you can try changing the \"ifdef 0\" in Touch.hsc to 1 and try it, see if \"git annex add\" mirrors file modification time in created symlinks, and let me know. +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment new file mode 100644 index 000000000..cd116c232 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 6" + date="2011-03-20T20:48:41Z" + content=""" +ok, pulling the latest master and building on OSX now does this... + +
+ghc -O2 -Wall -ignore-package monads-fd --make git-annex
+[ 1 of 63] Compiling Touch            ( Touch.hs, Touch.o )
+
+Touch.hsc:24:0:
+    The type signature for `touchBoth' lacks an accompanying binding
+
+Touch.hsc:27:26: Not in scope: `touchBoth'
+make: *** [git-annex] Error 1
+
+ +changing the #if 0 to 1 gives this... + +
+ghc -O2 -Wall -ignore-package monads-fd --make git-annex
+[ 1 of 63] Compiling Touch            ( Touch.hs, Touch.o )
+
+Touch.hsc:95:43:
+    Couldn't match expected type `CLong' against inferred type `CTime'
+    In the second argument of `(\ hsc_ptr
+                                    -> pokeByteOff hsc_ptr 0)', namely
+        `(sec :: CLong)'
+    In a stmt of a 'do' expression:
+        (\ hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (sec :: CLong)
+    In the expression:
+        do { (\ hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (sec :: CLong);
+             (\ hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (0 :: CLong) }
+make: *** [git-annex] Error 1
+
+ + +it seems that commit 6634b6a6b84a924f6f6059b5bea61f449d056eee has broken support for OSX. + +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment new file mode 100644 index 000000000..e35dc8a82 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-03-20T22:06:25Z" + content=""" +Fixed that, and removed the impossible cast so it can be built with #if 1 +"""]] diff --git a/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment new file mode 100644 index 000000000..56a7eb360 --- /dev/null +++ b/doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 8" + date="2011-03-21T08:52:18Z" + content=""" +Just tried building both of the code paths, and they seem to build and somewhat function on OSX. I have yet to confirm the functionality is working correctly, but so far it's looking good. (I somewhat care less about the utimes/mtimes of my files since I care more about the content :) ) +"""]] diff --git a/doc/bugs/trust_command_and_gitconfig_contradiction_causing_confusion.mdwn b/doc/bugs/trust_command_and_gitconfig_contradiction_causing_confusion.mdwn new file mode 100644 index 000000000..d67ebe66a --- /dev/null +++ b/doc/bugs/trust_command_and_gitconfig_contradiction_causing_confusion.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. +'trust', 'dead', etc commands completing with 'ok' but fail to acknowledge contradiction in .git/config, causing confusion. + +[[!format sh """ +greg@x200s:~/Photos$ git-annex untrust home # yes, bad remote name +untrust home ok +(Recording state in git...) +greg@x200s:~/Photos$ git-annex status # /me is old-school and forgets +greg@x200s:~/Photos$ git-annex info +repository mode: indirect +trusted repositories: 2 + c0e4106e-2631-11e2-9749-1bfa37a61069 -- rose + c69d6fcc-18d1-11e2-9487-2fe6dbf0516b -- home (photos on eeepc) + +.... + +greg@x200s:~/Photos$ git-annex dead home +dead home ok +(Recording state in git...) +greg@x200s:~/Photos$ git-annex info +repository mode: indirect +trusted repositories: 2 + c0e4106e-2631-11e2-9749-1bfa37a61069 -- rose + c69d6fcc-18d1-11e2-9487-2fe6dbf0516b -- home (photos on eeepc) +"""]] + +The home remote has "annex-trustlevel=trusted" in .git/config + + +Maybe have those commands instead say "Hey, this is different than what you said explicitly in .git/config, ya sure? (y/n)" If y, overwrite config, if n, abort. + +### What version of git-annex are you using? On what operating system? +5.20140127 on Debian + +> [[Fixed|done]], it will now warn about this situation. --[[Joey]] diff --git a/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn new file mode 100644 index 000000000..8f5e8c324 --- /dev/null +++ b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn @@ -0,0 +1,11 @@ +As told in http://git-annex.branchable.com/bugs/OSX_app_issues/#comment-2a69d531bd3bb593c1a49dc8cdb34b1e the Mac OS 10.7.5 (Lion) build fails to run. + + $ /Applications/git-annex.app/Contents/MacOS/git-annex + + /Applications/git-annex.app/Contents/MacOS/runshell: line 25: syntax error near unexpected token `&' + +Manually editing /Applications/git-annex.app/Contents/MacOS/runshell as told in http://git-annex.branchable.com/bugs/OSX_app_issues/#comment-5579c2150ad4d2ccc207a253fe57612a fixes the issue. + +Furthermore, this build is quite outdated... + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_1_e8df4b36a89b37edd94f3a318ae93a32._comment b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_1_e8df4b36a89b37edd94f3a318ae93a32._comment new file mode 100644 index 000000000..d67330a22 --- /dev/null +++ b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_1_e8df4b36a89b37edd94f3a318ae93a32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-14T15:26:01Z" + content=""" +This is unfortunate.. The Lion autobuilder is running, but has been failing for various reasons for some time, and I have not managed to get ahold of Jimmy to fix them. Also, that machine may be upgraded from Lion before too long. +"""]] diff --git a/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_2_3b2c3c84bd1910280c549a2ee1c622b9._comment b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_2_3b2c3c84bd1910280c549a2ee1c622b9._comment new file mode 100644 index 000000000..bd1763ca0 --- /dev/null +++ b/doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_2_3b2c3c84bd1910280c549a2ee1c622b9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2013-11-15T20:57:27Z" + content=""" +The builder is back, I was away from the office when it broke. It should be spitting out builds on a daily basis again. +"""]] diff --git a/doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn b/doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn new file mode 100644 index 000000000..4098f8acf --- /dev/null +++ b/doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn @@ -0,0 +1,13 @@ +### Please describe the problem. +(I assume) following your change to disallow changing the name of "here", I am unable to change the repository group of "here" + + +### What steps will reproduce the problem? +In webapp, edit "here", and try and change repository group. +It highlights the (now empty) name field, and says "value is required". + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130618-g333cb8e +Ubuntu 13.04 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/undefined.mdwn b/doc/bugs/undefined.mdwn new file mode 100644 index 000000000..8ee37f034 --- /dev/null +++ b/doc/bugs/undefined.mdwn @@ -0,0 +1,5 @@ +Trying to move files from a local remote that is not mounted: + + git-annex: Prelude.undefined + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/unfinished_repository_when_using_annex-ignore_true_.mdwn b/doc/bugs/unfinished_repository_when_using_annex-ignore_true_.mdwn new file mode 100644 index 000000000..848f1b30b --- /dev/null +++ b/doc/bugs/unfinished_repository_when_using_annex-ignore_true_.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. + +When using a git remote which doesn't support git-annex (f.e. gitlab) and is configured with `annex-ignore true` the remote is shown as `unfinished repository` in the webapp. + +It would be nice if the webapp would recognize this and show the remote as git-only remote including sync-state and remote name (or even better: the remote details, like the URL to the remote) + +### What steps will reproduce the problem? + +Add a normal git remote and configure `git config remote..annex-ignore true`. +Start the webapp. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20131101-gf59a6d1 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +Kubuntu 13.10 x86_64 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument.mdwn b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument.mdwn new file mode 100644 index 000000000..cc9a4c57f --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument.mdwn @@ -0,0 +1,87 @@ +### Please describe the problem. + +#### git annex unused fails with the message: + +... + 86731 SHA256E-s13243--a6c5fe9710975e0b0ca01ec0b7eca6068a01b1b1c06adbd8ad7921e26d3b076d.h + + 86732 SHA256E-s12872--f50b73d313a116ea21649d684f601840dbc8ed3c264165dd77fa5d54a1c57464.c + + 86733 SHA256E-s6557264--6b502d56378b9919fd3c54c3bb2dc2906a326be8e9d477a8f3518419929f4706.dll + + 86734 SHA256E-s141--c6227fe715dab2b4447b6e43af2b170ac66d82043aa81a14013c56be922e11db.out + + 86735 SHA256E-s6564--ec4bcd833d071fff7d8cc81b908558acdeae2c9ba62f7d65b584effe6b36a8c6.c + +git-annex: /bluepool/data/.git/annex/unused32594.tmp: commitBuffer: invalid argument (invalid character) +failed + +git-annex: unused: 1 failed + +#### A subsequent git annex dropunused does not work (there are 86735 files unused). A simple: +"git annex dropunused 1-10" produces: + +git-annex: 1 not valid (run git annex unused for list) + +#### It seems that the list of unused files was not saved (committed) + +### What steps will reproduce the problem? + +I suspect it can be reproduced by having files with non-english characters. +This should be the sequence of commands to reproduce if one knew the invalid character: + +git init . + +git annex init . + +touch "Invalid character in file name" + +git annex add "Invalid character in file name" + +git commit + +git rm "Invalid character in file name" + +git commit + +git unused + +However, I usually have "git annex watch" running so this might also have an influence on how (maybe not-escaped) filenames are added. + +### What version of git-annex are you using? On what operating system? + +git annex standalone: + +git-annex version: 5.20140306-g6e2e021 + +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash + +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +local repository version: 5 + +supported repository version: 5 + +upgrade supported from repository versions: 0 1 2 4 + + + +Ubuntu Raring: Linux i3 3.11.4-031104-generic + + +### Please provide any additional information below. + +I guess I could provide the full output of git annex unused but I would rather not put it into this bug report for privacy reasons. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[closing|done]], would still be nice to have verification my fix worked. +> --[[Joey]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_1_004cb3015895ad67386276f3e1f0de0d._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_1_004cb3015895ad67386276f3e1f0de0d._comment new file mode 100644 index 000000000..e1db22b2e --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_1_004cb3015895ad67386276f3e1f0de0d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-15T16:01:53Z" + content=""" +I see the problem, although I have not quite managed to reproduce it. I think this would probably only happen if you have the unusual character in the extension of the file (or are using the WORM backend). + +I've put a fix in git. It will be available in the next autobuild, in half an hour or so. +"""]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_2_3fe298ebb3ff04d12f2528aa982d7084._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_2_3fe298ebb3ff04d12f2528aa982d7084._comment new file mode 100644 index 000000000..ed5733d04 --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_2_3fe298ebb3ff04d12f2528aa982d7084._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Problem still occurs but maybe my update did not work" + date="2014-03-16T18:01:24Z" + content=""" +Hi Joey, thanks for the quick response. + +I tried to update and retry my \"git annex unused\" but it gave the same error. Maybe my updating did not work (see below). But is there a way I can retry it without running \"git annex unused\" again? The problem is that each run takes several hours with my amount of files. +It would be nice, if git annex recognized some error in the last approach and recovered. +The tmp files that are created by \"git annex unused\" are still in .git/annex/. + + +Regarding the updating: +I tried to obtain the autobuild version but on this website I could not find a link to download the latest autobuild. I could only find the build reports. But I used the git annex installer script from https://github.com/zerodogg/scriptbucket/blob/master/gitannex-install +and it apparently knows the location of the daily build. Is this the autobuild or is git annex autobuilt more often? + +This is my version after installing it yesterday evening approx. 2h hours after your answer to the bug description. + +git-annex version: 5.20140314-g48e0f18 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +"""]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_3_9302536d1577c12337d714fa3a9ea7a1._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_3_9302536d1577c12337d714fa3a9ea7a1._comment new file mode 100644 index 000000000..e74ccba1c --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_3_9302536d1577c12337d714fa3a9ea7a1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-17T19:28:05Z" + content=""" +No, your version is from before I fixed it. + +You can get an autobuild from [[install/Linux_standalone]] +"""]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_4_c1c8de66192957b7026d99b9ff90589c._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_4_c1c8de66192957b7026d99b9ff90589c._comment new file mode 100644 index 000000000..b229545f6 --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_4_c1c8de66192957b7026d99b9ff90589c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Maybe the autobuild is broken?" + date="2014-03-17T20:32:19Z" + content=""" +The latest autobuild log for amd64 says: +Starting at: Fri Mar 14 21:42:07 UTC 2014 + +I downloaded the amd64 autobuild from https://git-annex.branchable.com/install/Linux_standalone/ + +and it indeed is from Friday. + +Cheers, +Marek +"""]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_5_8c2dad766e4115073d49b698919b5ed5._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_5_8c2dad766e4115073d49b698919b5ed5._comment new file mode 100644 index 000000000..360003fba --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_5_8c2dad766e4115073d49b698919b5ed5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 5" + date="2014-03-18T19:07:25Z" + content=""" +cron was not running them for some reason, but they are up-to-date now. +"""]] diff --git a/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_6_8da2a73381309ecef4b2796d8f2bb0bb._comment b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_6_8da2a73381309ecef4b2796d8f2bb0bb._comment new file mode 100644 index 000000000..8532afaf7 --- /dev/null +++ b/doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_6_8da2a73381309ecef4b2796d8f2bb0bb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Your changes to git annex worked" + date="2014-03-19T21:27:39Z" + content=""" +Thanks a lot. + +BTW, will you start a new funding round? +"""]] diff --git a/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn new file mode 100644 index 000000000..7fdbc3ca4 --- /dev/null +++ b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn @@ -0,0 +1,16 @@ +I upgraded another one of my git-annex clones. The upgrade worked fine (i.e. +according to the manual) on two other clones before, but this time something is +different. + +After 'git pull' and 'git annex upgrade', which took a long time and seemed to +have succeeded, there are no staged changes in git. Instead there are lots of +untracked directories in .git-annex. Aside from that, nothing seems to be +wrong. + +At the time I had git-annex version 0.20110329 and I've been using the SHA1 +backend since version 1. + +> Yes, I agree with Jimmy, it's the same bug. So I'll be closing this one. +> Please keep us informed how the workaround committed to git-annex +> yesterday for the case insensativity issue works out. [[dup|done]] +> --[[Joey]] diff --git a/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment new file mode 100644 index 000000000..78309df87 --- /dev/null +++ b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T02:26:20Z" + content=""" +I'm not sure how this happened, as far as I can see, and based on my testing, `git annex upgrade` does stage the location log files. OTOH, I vaguely rememeber needing to stage some of them when I was doing my own upgrades, but that was a while ago, and I don't remember the details. + +Your upgrade seems to have gone ok from the file lists you sent, so you can just: `git add .git-annex; git commit` +"""]] diff --git a/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment new file mode 100644 index 000000000..4fc9647e8 --- /dev/null +++ b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="gernot" + ip="213.168.117.192" + subject="comment 2" + date="2011-04-03T15:35:52Z" + content=""" +'git add .git-annex' didn't do anything. That's when I noticed that this +repository is on a case-insensitive HFS+ file system. + +So, if I get this right it's not a new bug, but similar to this situation: +[[git-annex_directory_hashing_problems_on_osx]] + +Assuming that it was the file system's fault, I went ahead and upgraded yet +another clone. That one (on an ext3 file system) had neither staged changes +nor left-over untracked files. Everything seems to just have fallen right into +place. Is that possible or still weird? + +"""]] diff --git a/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment new file mode 100644 index 000000000..99095c156 --- /dev/null +++ b/doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2011-04-03T16:05:39Z" + content=""" +Yes you seem to have come across the same bug that I had initially reported :P +"""]] diff --git a/doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn b/doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn new file mode 100644 index 000000000..6f45cb8ff --- /dev/null +++ b/doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn @@ -0,0 +1,34 @@ +## What steps will reproduce the problem? + +After the assistant idles for a while, it queues many transfers to remotes configured annex-ignore=true + +##What is the expected output? What do you see instead? + +No attempts to upload to repos marked 'annex-ignore=true' + +Instead I see many queued transfers to the remote 'origin' + +[Screenshot](https://www.evernote.com/shard/s1/sh/ea0de76c-4b68-4266-b9f6-8a9c343997b6/72baab4a3ce73b0915b151829bbeaf75/res/8a8ab1fb-3173-47ea-875d-b0e320cb827b/skitch.png) + +##What version of git-annex are you using? On what operating system? + + % > git annex version + git-annex version: 4.20130315 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Mac OSX 10.8.2 Build 12C3006 + +##Please provide any additional information below. + +The remote in question: + + [remote "origin"] + url = git@git.example.com:annex-home + fetch = +refs/heads/*:refs/remotes/origin/* + annex-ignore = true + +> belived to be [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/uploads_queued_to_annex-ignore_remotes/comment_1_fa1c98f38253db8c2be3604c72eb3726._comment b/doc/bugs/uploads_queued_to_annex-ignore_remotes/comment_1_fa1c98f38253db8c2be3604c72eb3726._comment new file mode 100644 index 000000000..d58d5f5dd --- /dev/null +++ b/doc/bugs/uploads_queued_to_annex-ignore_remotes/comment_1_fa1c98f38253db8c2be3604c72eb3726._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-17T20:03:48Z" + content=""" +I was able to find two ways this could happen: + +* When a removable drive was attached and the annex-ignored repository was on it. +* When the network connection went down and came back up. + +In either case, it would git sync with the ignored repository. And in some cases could scan it for transfers. + +I've pushed a fix for these two cases. If you can try the next autobuild, that would be helpful. + +If you continue to see this happening, you should enable debug logging, and send a log after it happens. +"""]] diff --git a/doc/bugs/using_gpg_encryption_with_multiple_keys_fails.mdwn b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails.mdwn new file mode 100644 index 000000000..887f9f1fd --- /dev/null +++ b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails.mdwn @@ -0,0 +1,57 @@ +### Please describe the problem. +git-annex assistant uses wrong key if multiple are available. If there is only one gpg available it works without issue. + +### What steps will reproduce the problem? + +I tried to creating a new key through cli or assistant UI. I also tried to select preexisting key but it always appears to choose the initial key. Log below is creating a new key through assistant UI. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140709-gc75193e on linux amd64 & os x 10.9.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2014-07-12 23:22:57 PDT] main: starting assistant version 5.20140709-gc75193e +[2014-07-12 23:22:57 PDT] Cronner: You should enable consistency checking to protect your data. +(Recording state in git...) +(scanning...) [2014-07-12 23:22:57 PDT] Watcher: Performing startup scan +(started...) gpg: Signature made Wed Jul 9 19:09:28 2014 PDT using DSA key ID 89C809CB +gpg: Can't check signature: public key not found + +(encryption setup) (hybrid cipher with gpg key A1FE7E9BECB5C7CA) gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Repository not found: ssh://admin@nappy.local/share/backups/annex/ +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Repository not found: ssh://admin@nappy.local/share/backups/annex/ +gcrypt: Setting up new repository +gcrypt: Remote ID is :id:smTV2DKvbvPIi7ftJLey +gcrypt: Encrypting to: -R A1FE7E9BECB5C7CA +gcrypt: Requesting manifest signature +To gcrypt::ssh://admin@nappy.local/share/backups/annex/ + * [new branch] git-annex -> git-annex +ok +[2014-07-12 23:23:42 PDT] main: Syncing with nappy.local__share_backups_annex +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Decrypting manifest +gpg: anonymous recipient; trying secret key 6DF1BC5D ... +gpg: cannot open tty `/dev/tty': Device not configured +gcrypt: Failed to decrypt manifest! +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Decrypting manifest +gpg: anonymous recipient; trying secret key 6DF1BC5D ... +gpg: cannot open tty `/dev/tty': Device not configured +gcrypt: Failed to decrypt manifest! + + +# End of transcript or log. +"""]] + +[[!tag forwarded]] +[[!meta title="using git-remote-gcrypt with multiple keys causes unncessary password prompts for keys that did not encrypt the repository"]] + +> [[fixed|done]]; upgrade git-remote-gcrypt and `git config gcrypt.publish-participants true` +> and after the next push to the repo, it'll stop guessing at keys, and use +> the right one. git-annex will do this by default for new gcrypt +> repositories. --[[Joey]] diff --git a/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_1_584390159278577da78b05bc7bb0e673._comment b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_1_584390159278577da78b05bc7bb0e673._comment new file mode 100644 index 000000000..01b9726a9 --- /dev/null +++ b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_1_584390159278577da78b05bc7bb0e673._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-14T20:54:32Z" + content=""" +AFAICs, this is a known bug in git-remote-gcrypt: + +In your log, it encrypts to A1FE7E9BECB5C7CA. I think this is the new key that git-annex generated. The problem comes when trying to decrypt the manifest, then it tries every gpg key until it finds one that works. +"""]] diff --git a/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_2_51855f5bb857e1b6bc5531cdd7073c31._comment b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_2_51855f5bb857e1b6bc5531cdd7073c31._comment new file mode 100644 index 000000000..df07fd04a --- /dev/null +++ b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_2_51855f5bb857e1b6bc5531cdd7073c31._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="lex" + ip="17.199.80.21" + subject="comment 2" + date="2014-07-14T22:21:32Z" + content=""" +ah. It's bailing due to the first key requiring passphrase, and since it aborts there it never tries the second so the whole thing fails. + +okay thanks for the link. +"""]] diff --git a/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_3_3a6ff3dbc24850b065d045c7c9398eb1._comment b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_3_3a6ff3dbc24850b065d045c7c9398eb1._comment new file mode 100644 index 000000000..7dab63081 --- /dev/null +++ b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_3_3a6ff3dbc24850b065d045c7c9398eb1._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-15T20:42:15Z" + content=""" +So let's think about whether gcrypt using gpg -R makes sense from the git-annex perspective. + +Without -R, an attacker who can look at the remote, encrypted git repository can easily see the gpg keys of participants. This could allow them to perform other, more targeted attacks to get at the unencrypted repository. + +If the user is using eg, github to store the gcrypt repo, an attacker can easily find out who owns the repo anyway, so they know who to attack then, even when -R is used. The -R can still prevent them from finding out when it's encrypted to additional users than the owner. + +As far as the assistant goes, it only ever sets up a gcrypt repo with one participant. Using either an existing gpg key of the user, or generating a new one (which doesn't even have their name on it). Adding more participants to a gcrypt repo is tricky, and the assistant doesn't currently support it. But I'd like to have it support setting up multiple participants eventually. So the current limitations of the assistant are not a sufficient reason to avoid using -R. + +So, it seems to come down to the question of whether it's a reasonable goal for git-annex, when used with gcrypt, to hide the identities of people who use a repository. And whether such a goal is worth the security/usability tradeoff of the user getting gpg passphrase prompts for other keys. + +Hmm, when git-annex encrypts files to send them to a special remote, if it's using encryption=pubkey, it does not use -R. So an attacker can get the list of participants that way. Although the more common approach is for git-annex to encrypt using encryption=shared/hybrid, which uses a symmetric cipher, which avoids that problem. There are plenty of other things that git-annex can do that would leak identity. + +It kind of seems to me that if you want to prevent anyone learning who uses your repository, you are going to need to be very cautious (using tor etc) and the most git-annex can do is be open about how it works and avoid adding any obstacles. Looking at it this way, such a user, or group of users, would be well-served by using gpg keys that don't have their names on them... +"""]] diff --git a/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_4_84168b56288262e01280da59ffaf19f6._comment b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_4_84168b56288262e01280da59ffaf19f6._comment new file mode 100644 index 000000000..22f0e909f --- /dev/null +++ b/doc/bugs/using_gpg_encryption_with_multiple_keys_fails/comment_4_84168b56288262e01280da59ffaf19f6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-15T21:06:23Z" + content=""" +@lex, it shouldn't fail due to passphrase if you have gpg-agent set up. You'll only get some unncessary passphrase prompts. +"""]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output.mdwn b/doc/bugs/using_old_remote_format_generates_irritating_output.mdwn new file mode 100644 index 000000000..1809ade37 --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output.mdwn @@ -0,0 +1,30 @@ +a special remote (encrypted rsync) that got copied to long ago (not sure when, there are old files that already have sizes in their unencrypted file names) seems to use the aa/bb/GPGHMACSHA1-- format instead of aaa/bbb/GPGHMACSHA1-. ``git annex fsck`` over such files produces very irritating output: + + +fsck L1100423.JPG (gpg) (checking …remote…...) +rsync: change_dir "…somewhere…/0a0/8cd/GPGHMACSHA1--91234b770b34eeff811d09c97ce94bb2398b3d72" failed: No such file or directory (2) + +sent 8 bytes received 12 bytes 40.00 bytes/sec +total size is 0 speedup is 0.00 +rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [Receiver=3.0.9] + + rsync failed -- run git annex again to resume file transfer + +GPGHMACSHA1--91234b770b34eeff811d09c97ce94bb2398b3d72 + 3922730 100% 623.81kB/s 0:00:06 (xfer#1, to-check=0/1) + +sent 30 bytes received 3923328 bytes 523114.40 bytes/sec +total size is 3922730 speedup is 1.00 +(checksum...) ok + + +(observed with debian's git-annex 3.20121017). + +while this does output an "ok" at th end and a zero exit status, having such messages in an fsck is highly irritating. + +i see two ways to enhance the situation: + +* silence the "not found" error when the file is found in another location +* a way to rename the files in the remote (i guess the aaa/bbb part can be derived from the file name; in that case, that could even be done w/o network interaction). + +[[!tag confirmed]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output/comment_1_fceba878f1097e27f056580e8d6d5b31._comment b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_1_fceba878f1097e27f056580e8d6d5b31._comment new file mode 100644 index 000000000..d2208b57b --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_1_fceba878f1097e27f056580e8d6d5b31._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="also affects `git annex get`" + date="2012-11-12T23:11:36Z" + content=""" +the same problem also shows up with `git annex get`: + + get …filename… (from prometheus...) + rsync: change_dir \"/home/shared/photos/encrypted_storage/63e/50b/GPGHMACSHA1--b83e8aaf05918ae2fc81652368f9d4068f938625\" failed: No such file or directory (2) + + sent 8 bytes received 12 bytes 8.00 bytes/sec + total size is 0 speedup is 0.00 + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [Receiver=3.0.9] + + rsync failed -- run git annex again to resume file transfer + + GPGHMACSHA1--b83e8aaf05918ae2fc81652368f9d4068f938625 + 513214 100% 95.68kB/s 0:00:05 (xfer#1, to-check=0/1) + + sent 30 bytes received 513396 bytes 44645.74 bytes/sec + total size is 513214 speedup is 1.00 + ok + +again, it says \"ok\", but the \"no such file or directory\" / \"rsync failed\" is visually more prominent. +"""]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output/comment_2_416992874813f120721a56d88b2bef65._comment b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_2_416992874813f120721a56d88b2bef65._comment new file mode 100644 index 000000000..1dfd0bde7 --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_2_416992874813f120721a56d88b2bef65._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 2" + date="2012-11-13T17:27:31Z" + content=""" +So, I don't know how to suppress this message without causing worse problems, like suppressing real error messages, and even password prompts. + +"""]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output/comment_3_a20f470c5226ac5693eb15146a02b3f5._comment b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_3_a20f470c5226ac5693eb15146a02b3f5._comment new file mode 100644 index 000000000..8ee00709d --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_3_a20f470c5226ac5693eb15146a02b3f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="comment 3" + date="2012-11-14T07:31:11Z" + content=""" +how about renaming the stored files, them? if you give me a pointer on how the directory names are generated, i can write a script that does the migration (some hash of the file name?). i suppose that's just a relic from another naming scheme, isn't it? +"""]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output/comment_4_a81f06191bc03a7aad5929af99f0634e._comment b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_4_a81f06191bc03a7aad5929af99f0634e._comment new file mode 100644 index 000000000..9ea804767 --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_4_a81f06191bc03a7aad5929af99f0634e._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 4" + date="2012-11-14T17:31:38Z" + content=""" +The new hash directory tree is generated in a simple to explain way. Take the md5sum of the key and the first 3 characters are the first directory, and the next 3 characters are the second directory. + +The old hash directory tree is rather harder to explain. It takes the md5sum of the key, but rather than a string, represents it as 4 32bit words. Only the first word is used. It is converted into a string by the same mechanism that would be used to encode a normal md5sum value into a string, but where that would normally encode the bits using the 16 characters 0-9a-f, this instead uses the 32 characters \"0123456789zqjxkmvwgpfZQJXKMVWGPF\". The first 2 letters of the resulting string are the first directory, and the second 2 are the second directory. + +There's probably a 1:1 mapping between this special md5 encoding an a regular md5 encoding. But it's certainly easier just to use the existing Haskell implementation of the hash. The following program, which needs to be built inside a git-annex source tree, reads keys on stdin, and outputs their old hash directory tree values, and their new values on stdout. + +
+import Locations
+import Types.Key
+import Utility.Misc
+
+main = interact $ \s -> case file2key $ firstLine s of
+        Nothing -> \"bad key\"
+        Just k -> hashDirMixed k ++ \" \" ++ hashDirLower k ++ \"\n\"
+
+ +
+joey@gnu:~/src/git-annex>ghc --make convert.hs
+joey@gnu:~/src/git-annex>echo WORM--foo | ./ convert
+jq/8w/ 2b1/ba3/
+
+"""]] diff --git a/doc/bugs/using_old_remote_format_generates_irritating_output/comment_5_7438caecf78b4fb5d21f9f31dff95cf2._comment b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_5_7438caecf78b4fb5d21f9f31dff95cf2._comment new file mode 100644 index 000000000..707ea52cf --- /dev/null +++ b/doc/bugs/using_old_remote_format_generates_irritating_output/comment_5_7438caecf78b4fb5d21f9f31dff95cf2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="single-line migration" + date="2012-11-22T03:14:45Z" + content=""" +i've successfully applied this monster to migrate my repository (as always with such expressions, use it only if you know what it does, and have a backup): + + find . -path './??/??/*' -type d \( -exec python -c 'import sys, hashlib, os; hash = hashlib.md5(sys.argv[1][8:]).hexdigest(); h1 = hash[:3]; h2 = hash[3:6]; os.mkdir(h1) if not os.path.exists(h1) else None; os.mkdir(h1+\"/\"+h2) if not os.path.exists(h1+\"/\"+h2) else None; os.rename(sys.argv[1], h1+\"/\"+h2+\"/\"+sys.argv[1][8:])' '{}' ';' -o -print \) -prune + +when executed in an encrypted git annex object directory, it takes all two-letter directories, executes a python expression on them (in case of failure, printing the file name it failed on), and doesn't continue searching there (-prune avoids error messages about moved-away directories). + +the python expression itself generates the hash described above, generates the required directories (put awkwardly in an `a if b else c` expression to avoid ifs (which wouldn't fit in a single line) and because python still doesn't have a proper mkdir-p function), and moves the found object there. (nb: using the system's `mkdir -p` would trigger [[another bug|bugs/using_old_remote_format_generates_irritating_output]]). +"""]] diff --git a/doc/bugs/web_app_loops_over_a_non-addable_file.mdwn b/doc/bugs/web_app_loops_over_a_non-addable_file.mdwn new file mode 100644 index 000000000..a1f490061 --- /dev/null +++ b/doc/bugs/web_app_loops_over_a_non-addable_file.mdwn @@ -0,0 +1,56 @@ +### Please describe the problem. + +I started the webapp on a pre-existing repo today, and it started adding all sorts of files which I didn't manually add, which is a little bit surprising, but "okay". + +The problem is that it would loop over this one file over and over again. Adding it on the commandline yields a proper error, but this doesn't seem to properly propagate to the frontend. + +### What steps will reproduce the problem? + +Unclear. + +### What version of git-annex are you using? On what operating system? + +4.20131105-g8efdc1a + +### Please provide any additional information below. + +Here's the daemon.log: + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +add clips/A31-05-12_21.22.amr (checksum...) [2013-11-06 10:21:10 EST] Committer: Committing changes to git +[2013-11-06 10:21:11 EST] Committer: Adding A31-05-12_21.22.amr +(Recording state in git...) +(Recording state in git...) +add clips/A31-05-12_21.22.amr (checksum...) [2013-11-06 10:21:11 EST] Committer: Committing changes to git +[2013-11-06 10:21:12 EST] Committer: Adding A31-05-12_21.22.amr +(Recording state in git...) +(Recording state in git...) +add clips/A31-05-12_21.22.amr (checksum...) [2013-11-06 10:21:12 EST] Committer: Committing changes to git +[2013-11-06 10:21:13 EST] Committer: Adding A31-05-12_21.22.amr +(Recording state in git...) +add clips/A31-05-12_21.22.amr (checksum...) [2013-11-06 10:21:13 EST] Committer: Committing changes to git +[2013-11-06 10:21:14 EST] Committer: Adding A31-05-12_21.22.amr +(Recording state in git...) +(Recording state in git...) +add clips/A31-05-12_21.22.amr (checksum...) [2013-11-06 10:21:14 EST] Committer: Committing changes to git +# End of transcript or log. +"""]] + +And here's the attempt on the commandline, which is way more informative: + +[[!format sh """ +anarcat@marcos:video$ git annex add . +add clips/96_257.mp3 ok +add clips/A31-05-12_21.22.amr (checksum...) +git-annex: /srv/video/.git/annex/objects/z3/96/SHA256E-s260070--46f0d657cdd79032d431e2aebb04b63685ab26e7d00963036e0b64c9f86998f8.22.amr/SHA256E-s260070--46f0d657cdd79032d431e2aebb04b63685ab26e7d00963036e0b64c9f86998f8.22.amr: setFileMode: permission denied (Operation not permitted) +failed +"""]] + +Turns out that file is owned by root, so it's an expected failure. But the webapp should simply skip this file, not loop over it. + +The workaround is obviously to give this file to the proper user. --[[anarcat]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn b/doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn new file mode 100644 index 000000000..41007dbb4 --- /dev/null +++ b/doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. +I could not find a way to abort the addition of a new remote repository. + +### What steps will reproduce the problem? +- start adding a remote repository (unencrypted, with git-annex installed); +- forget to create the folder on the remote host; +- navigate away from the repository page; +- the dashboard says the repository is partially set-up, and the only thing one can do is look at the log (which says the folder is missing). + +I was able to solve it by creating another repository with the exact same data. + +### What version of git-annex are you using? On what operating system? + +Version: 4.20131002-gf25991c on OS X 10.8.5 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/webapp_doesn__39__t_start_when___126____47__annex_isn__39__t_a_git_repo.mdwn b/doc/bugs/webapp_doesn__39__t_start_when___126____47__annex_isn__39__t_a_git_repo.mdwn new file mode 100644 index 000000000..ac02590e6 --- /dev/null +++ b/doc/bugs/webapp_doesn__39__t_start_when___126____47__annex_isn__39__t_a_git_repo.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. +The webapp doesn't start. There is no feedback as to what is wrong when starting the OS X app. Makes for a very confusing behaviour. + +When starting git-annex-webapp directly, it says: +git-annex: no git repository in /Users/lhunath/annex + +### What steps will reproduce the problem? +Create a ~/annex that is not a git repo. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140517-g0aed6d9 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +local repository version: unknown +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ /Applications/git-annex.app/Contents/MacOS/git-annex-webapp +git-annex: no git repository in /Users/lhunath/annex +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn b/doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn new file mode 100644 index 000000000..73908f40b --- /dev/null +++ b/doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. + +Starting the webapp on a repository that was hastily created by copying an existing one with an older version yields an undecipherable error. + +Rather minor. + +### What steps will reproduce the problem? + +1. Install git-annex from git +2. make a repo +3. copy it over to an external hard drive +4. connect that drive to a wheezy box running git-annex from backports +5. add the external hard drive to the webapp as a new repo +6. boom + +I expected git-annex to tell me: + + git-annex: Repository version 5 is not supported. Upgrade git-annex. + +Instead, it popped a red box saying a scary "Internal server error". I couldn't read the daemon logs either. + +### What version of git-annex are you using? On what operating system? + +original version is: + + git-annex version: 5.20131109-gf2cb5b9 + +the failing version is running the one from wheezy backports. + +### Please provide any additional information below. + +screenshot coming up. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/weird_unicode_bug_on_windows.mdwn b/doc/bugs/weird_unicode_bug_on_windows.mdwn new file mode 100644 index 000000000..f1f0377f8 --- /dev/null +++ b/doc/bugs/weird_unicode_bug_on_windows.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. + +My repo contains more than 1000 files, many are unicode filenames. Now that [this bug](http://git-annex.branchable.com/bugs/fails_to_get_content_from_bare_repo_on_windows/) is resolved, almost all files are fetched, except one file named '移动硬盘 1T Buffalo USB3.0 白色.rtf'. + +### What steps will reproduce the problem? + +I reproduced this problem by creating a repo containing only this file with no content. If anyone wants to reproduce this, just create an empty file by copy and paste the above filename in the quote. + +I created the repo on mac, synced with a usb drive, then on windows machine try to sync it back. + +* When run git-annex webapp in the newly created windows repo, after the usb drive is added as a remote, an error popups up: http://imgur.com/5ZfIeGQ although the remote is added successfully (http://imgur.com/04O8kaC) +* On the command line, git annex sync runs successfully, but git annex get . failed: http://imgur.com/bIVrbe2 +* The file is there (http://imgur.com/URGwWWt) with correct filename, just that the content is not there. + +### What version of git-annex are you using? On what operating system? + +Latest release of git-annex on both mac and windows. The initial repo on mac is indirect repo, the one on usb drive is a bare repo, the one on windows is direct repo. diff --git a/doc/bugs/weird_unicode_bug_on_windows/comment_1_69af9bd8c7898fccc2219edd860d547b._comment b/doc/bugs/weird_unicode_bug_on_windows/comment_1_69af9bd8c7898fccc2219edd860d547b._comment new file mode 100644 index 000000000..b16155c5f --- /dev/null +++ b/doc/bugs/weird_unicode_bug_on_windows/comment_1_69af9bd8c7898fccc2219edd860d547b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 1" + date="2014-06-19T22:39:46Z" + content=""" +I don't quite reproduce this on windows. Instead of the file showing up and `git annex get` not getting it, the file never shows up at all. It seems that the direct mode merge code fails to create the file in the work tree. This also means that another sync will commit the deletion of the file. + +Based on the screenshot, I do have the identical filename checked into git, which git ls-files etc represents as \"\347\247\273\345\212\250\347\241\254\347\233\230 1T Buffalo USB3.0 \347\231\275\350\211\262.rtf\" + +Anyway, the root cause is probably the same. See [[todo/windows_support]] for a discussion of several issues with filename encodings and windows. +"""]] diff --git a/doc/bugs/wget_and_android_4.4.mdwn b/doc/bugs/wget_and_android_4.4.mdwn new file mode 100644 index 000000000..a695bc978 --- /dev/null +++ b/doc/bugs/wget_and_android_4.4.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +audio file won't download when it's sole source is the internet + +### What steps will reproduce the problem? +on my laptop git annex addurl --fast http://path/to/file.mp3 in folder phone/ +sync to homeserver +sync to phone +phone is set to prefer phone/* and present +after the phone receives the sync from homeserver, it looks to start the download and fails. +https://www.dropbox.com/s/ozcwub2mzo40z4y/2014-01-12%2012.36.01.png -> says wget doesn't recognize option --clobber + +https://www.dropbox.com/s/x1jhb6rcp17c7t8/2014-01-12%2013.13.56.png -> git annex get . -d output + +### What version of git-annex are you using? On what operating system? +android is version 5.20131230-g4aa88d8 for android 4.3+ + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files.mdwn b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files.mdwn new file mode 100644 index 000000000..2a756cc4d --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files.mdwn @@ -0,0 +1,55 @@ +### Please describe the problem. +I've a undirect repository that I sync with a direct one (that is on a +crippled filesystem). My repository contain tex file that are directly +in git, and binary file that are annexed. + +If I create or modify an standard git files in my undirect repository, +then sync it with the direct repository, the new file is not created +there, or the modified file is deleted there. + + +### What steps will reproduce the problem? + + $ cd direct + $ echo foo > bar.tex + $ git commit bar.tex -m "new tex file" + $ git annex sync + $ cd /media/direct-repo + $ git annex sync + $ ls bar.tex + +There the bar.tex file don't exist, and the next `git annex sync` will +commit the change. + +The problem exist for some time (I first believed I add a problem with +my usb stick), but now that direct repository are treated somewhat as +bare repository, I don't know of an easy fix. + +### What version of git-annex are you using? On what operating system? + +On Debian, since at least git annex 5.20131120 I believe. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +mkdir direct +cd direct +git init && git annex init "direct" +git annex direct +cd .. +git clone direct indirect +cd indirect +git annex init "indirect" +echo bla > test.tex +git add test.tex +git commit -m "test" +git annex sync +cd ../direct +git annex sync +ls +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_1_6c9f5fe14e46ac96254426e1e9cff23f._comment b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_1_6c9f5fe14e46ac96254426e1e9cff23f._comment new file mode 100644 index 000000000..b3f10176d --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_1_6c9f5fe14e46ac96254426e1e9cff23f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnm19dBCRphmtjXfopm_NpvnRwz-qIJ2Tw" + nickname="Remi" + subject="Checking out the file" + date="2013-12-03T10:29:40Z" + content=""" +If I run `GIT_WORK_TREE=/media/direct-repo git checkout bar.tex` I have my file back. +"""]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment new file mode 100644 index 000000000..e0ff4c5c5 --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="Similar problem" + date="2013-12-08T12:30:12Z" + content=""" +I've described the same (or similar) problem here: +http://git-annex.branchable.com/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/#comment-015d93573c7c34d10f3815a22bdc13c0 +"""]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_3_f449f259f076ea1b11bd289bdbcc9339._comment b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_3_f449f259f076ea1b11bd289bdbcc9339._comment new file mode 100644 index 000000000..3aadbc513 --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_3_f449f259f076ea1b11bd289bdbcc9339._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpmMRq6lo2NBrlmoxZQljaU_IaWsWB7qw" + nickname="Lukas" + subject="direct mode and vanishing files" + date="2013-12-10T12:40:51Z" + content=""" +Hi + +I have the same problem with git-annex 4.20131106 on debian jessie (powerpc) in direct mode and 4.20131101 on mac osx 10.8.5 (self compiled from haskell) in indirect mode. +Files directly added to git on the mac (indirect mode) are not created in the direct repository and are removed in the indirect repo after the next sync roundtrip. + +Thanks a lot for all your efforts and greetings, Lukas +"""]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_4_78ccd70a17d776f14ea9193ab55c6732._comment b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_4_78ccd70a17d776f14ea9193ab55c6732._comment new file mode 100644 index 000000000..20992d2ab --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_4_78ccd70a17d776f14ea9193ab55c6732._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 4" + date="2013-12-12T19:56:50Z" + content=""" +I have fixed this bug. I apologise for the trouble. + +I did not try to make it clean up, so I recommend doing the checkout as shown above, or doing a `git revert` to get the file added back, if you experienced this bug. +"""]] diff --git a/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_5_95fcc19327b57222844302bb81236ee9._comment b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_5_95fcc19327b57222844302bb81236ee9._comment new file mode 100644 index 000000000..af319430a --- /dev/null +++ b/doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_5_95fcc19327b57222844302bb81236ee9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="comment 5" + date="2013-12-13T15:43:46Z" + content=""" +That's great, Joey, thanks a lot! +"""]] diff --git a/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote.mdwn b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote.mdwn new file mode 100644 index 000000000..98ee21d16 --- /dev/null +++ b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote.mdwn @@ -0,0 +1,30 @@ +`git annex whereis` claims that I have zero copies of two particular files. However, it is wrong; both files are present: + +[[!format txt """ +[jkt@vorvan fotky]$ git annex whereis '2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301'* +(merging synced/git-annex into git-annex...) +whereis 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.CR2 (0 copies) failed +whereis 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.JPG (0 copies) failed +git-annex: whereis: 2 failed +[jkt@vorvan fotky]$ ll 2011-08-13\ Svatba\ Anička\ Fellnerová\ a\ výlet\ s\ Julií/IMG_4301* +lrwxrwxrwx. 1 jkt jkt 331 Aug 13 2011 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.CR2 -> ../.git/annex/objects/mg/qq/SHA512E-s19424303--9bdd6917fe85a450b50233a444c1814d407d41b550b66661272728aaf139576cc7c09de158f47a33ff263d7d25253cec193d0e44ed5fb4a1581c28a9a05e75e1.CR2/SHA512E-s19424303--9bdd6917fe85a450b50233a444c1814d407d41b550b66661272728aaf139576cc7c09de158f47a33ff263d7d25253cec193d0e44ed5fb4a1581c28a9a05e75e1.CR2 +lrwxrwxrwx. 1 jkt jkt 329 Aug 13 2011 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.JPG -> ../.git/annex/objects/zG/xq/SHA512E-s4744850--da9b1e19f0ecdf08d2f5564232a9c7d4b5ec9fbc9c67033121e5c90468e09e5573ddac42469cfd51fb0d8328dff925830e2d753022365df6d92b115b77831228.JPG/SHA512E-s4744850--da9b1e19f0ecdf08d2f5564232a9c7d4b5ec9fbc9c67033121e5c90468e09e5573ddac42469cfd51fb0d8328dff925830e2d753022365df6d92b115b77831228.JPG +"""]] + +Looking at another repo, the situation is the same: + +[[!format txt """ +jkt@svist /mnt/storage5/fotky[master] $ git annex whereis '2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301'* +whereis 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.CR2 (0 copies) failed +whereis 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.JPG (0 copies) failed +git-annex: whereis: 2 failed +jkt@svist /mnt/storage5/fotky[master] $ ll '2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301'* +lrwxrwxrwx 1 jkt jkt 331 Mar 3 02:08 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.CR2 -> ../.git/annex/objects/mg/qq/SHA512E-s19424303--9bdd6917fe85a450b50233a444c1814d407d41b550b66661272728aaf139576cc7c09de158f47a33ff263d7d25253cec193d0e44ed5fb4a1581c28a9a05e75e1.CR2/SHA512E-s19424303--9bdd6917fe85a450b50233a444c1814d407d41b550b66661272728aaf139576cc7c09de158f47a33ff263d7d25253cec193d0e44ed5fb4a1581c28a9a05e75e1.CR2 +lrwxrwxrwx 1 jkt jkt 329 Mar 3 02:08 2011-08-13 Svatba Anička Fellnerová a výlet s Julií/IMG_4301.JPG -> ../.git/annex/objects/zG/xq/SHA512E-s4744850--da9b1e19f0ecdf08d2f5564232a9c7d4b5ec9fbc9c67033121e5c90468e09e5573ddac42469cfd51fb0d8328dff925830e2d753022365df6d92b115b77831228.JPG/SHA512E-s4744850--da9b1e19f0ecdf08d2f5564232a9c7d4b5ec9fbc9c67033121e5c90468e09e5573ddac42469cfd51fb0d8328dff925830e2d753022365df6d92b115b77831228.JPG +"""]] + +The directory names are valid UTF-8. These are very common on my machine and there is a ton of directories with these funny names here -- all working without any real trouble. + +As far as I know, the file which the links point to is absolutely correct and not corrupted. Looking at the files in the directory chronologically, it also appears that the symlinks point to a correct file. + +[[!tag moreinfo]] diff --git a/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment new file mode 100644 index 000000000..11c55bb5b --- /dev/null +++ b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T03:14:09Z" + content=""" +Have you tried running `git annex fsck`? +"""]] diff --git a/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_2_f430538101f0ef6114b5e953248fa599._comment b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_2_f430538101f0ef6114b5e953248fa599._comment new file mode 100644 index 000000000..e78971a90 --- /dev/null +++ b/doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_2_f430538101f0ef6114b5e953248fa599._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="ping?" + date="2014-03-19T20:24:23Z" + content=""" +Have you tried running git-annex fsck? +"""]] diff --git a/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn b/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn new file mode 100644 index 000000000..d4d4826ff --- /dev/null +++ b/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn @@ -0,0 +1,46 @@ +What steps will reproduce the problem? + + ...:/tmp$ mkdir repro + ...:/tmp$ cd repro/ + ...:/tmp/repro$ git init + Initialized empty Git repository in /tmp/repro/.git/ + ...:/tmp/repro$ git annex init test + init test ok + ...:/tmp/repro$ echo "A" > a.txt + ...:/tmp/repro$ git annex add a.txt + add a.txt (checksum...) ok + (Recording state in git...) + ...:/tmp/repro$ git commit -m "add file" + [master (root-commit) bf53ce2] add file + 1 file changed, 1 insertion(+) + create mode 120000 a.txt + ...:/tmp/repro$ git annex whereis a.txt + whereis a.txt (1 copy) + 5c028c6a-2c5e-11e2-bb9c-17bd7ce81377 -- here (test) + ok + ...:/tmp/repro$ git annex unlock a.txt + unlock a.txt (copying...) ok + ...:/tmp/repro$ git annex whereis a.txt + +What is the expected output? What do you see instead? + + I'd expect that whereis executed on an unlocked file would behave like whereis executed on a locked file. + +What version of git-annex are you using? On what operating system? + + $ cat /etc/issue + Ubuntu 12.04.1 LTS \n \l + + $ git-annex version + git-annex version: 3.20120406 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + + $ uname -a + Linux ... 3.2.0-31-generic #50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux + +Please provide any additional information below. + +[[!tag confirmed]] diff --git a/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files/comment_1_47bd0fc8d1c65f8a868d9722e66c71db._comment b/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files/comment_1_47bd0fc8d1c65f8a868d9722e66c71db._comment new file mode 100644 index 000000000..e92ec33f9 --- /dev/null +++ b/doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files/comment_1_47bd0fc8d1c65f8a868d9722e66c71db._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 1" + date="2014-03-19T20:52:08Z" + content=""" +The reason this doesn't work is that, in indirect mode, git-annex looks at the current state of the symlink in the work tree to know what key is associated with a file. And an unlocked file has no symlink. + +Direct mode avoids this problem, but at the expense of being less flexible and well, doing more work. +"""]] diff --git a/doc/bugs/windows_install_failure.mdwn b/doc/bugs/windows_install_failure.mdwn new file mode 100644 index 000000000..5253468f1 --- /dev/null +++ b/doc/bugs/windows_install_failure.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. +When installing the windows aplha dated 2013-06-21 12:17 it gives an error: + +Error opening file for writing: +c:\program files (x86)\Git\cmd\git-annex.exe +Abort,retry or ignore? + +If you run as administrator it works. + + + +### What steps will reproduce the problem? + +Download the alpha installer and run as normal user. + +### What version of git-annex are you using? On what operating system? +Windows 7 64 bit + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!meta title="windows installer fails unless run as admin user"]] + +> [[dup|done]] of +> [[git-annex_does_not_install_on_windows_without_admin_rights]] --[[Joey]] diff --git a/doc/bugs/windows_install_failure/comment_1_f339574c7cfa35c1f0dfd515fde457f5._comment b/doc/bugs/windows_install_failure/comment_1_f339574c7cfa35c1f0dfd515fde457f5._comment new file mode 100644 index 000000000..a1e10da20 --- /dev/null +++ b/doc/bugs/windows_install_failure/comment_1_f339574c7cfa35c1f0dfd515fde457f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnI6EUnvCSB6JG3KsjCDpBIBWYniaZkhXs" + nickname="Jason" + subject="expected behavior" + date="2013-06-27T02:44:37Z" + content=""" +I expect it should automatically ask for privileged escalation rather than fail. +"""]] diff --git a/doc/bugs/windows_install_failure/comment_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment b/doc/bugs/windows_install_failure/comment_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment new file mode 100644 index 000000000..84966d647 --- /dev/null +++ b/doc/bugs/windows_install_failure/comment_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrFnHRRNUQBB5RCDaIwhVmCcxQp8_yiYw" + nickname="Oliver" + subject="comment 2" + date="2013-06-28T08:37:39Z" + content=""" +Indeed, but the windows installer (whether built by hand or from the prebuilts) does not. Might have a poke at it when I'm back at my machine again - should be a fairly easy fix. +"""]] diff --git a/doc/bugs/youtube_support_suddenly_stopped_working.mdwn b/doc/bugs/youtube_support_suddenly_stopped_working.mdwn new file mode 100644 index 000000000..bedda7674 --- /dev/null +++ b/doc/bugs/youtube_support_suddenly_stopped_working.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. + +[[This|design/assistant/blog/day_314__quvi/]] says that I can download youtube videos with git-annex, but I can't - it downloads the HTML of the page instead! + +### What steps will reproduce the problem? + + git annex addurl http://www.youtube.com/watch?v=BTzNLhxPzjo + +Should have downloaded a Bill Hicks video, instead it downloads the HTML. + +### What version of git-annex are you using? On what operating system? + +[[!format txt """ +git-annex version: 4.20130912-ga1faca3 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +Note that quvi is still capable of fetching that video, no problem there. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +anarcat@marcos:clips$ git annex addurl http://www.youtube.com/watch?v=BTzNLhxPzjo +addurl www.youtube.com_watch_v=BTzNLhxPzjo ok +anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo +www.youtube.com_watch_v=BTzNLhxPzjo: broken symbolic link to `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b' +anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo ^C +anarcat@marcos:clips$ file .git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b +.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b: ERROR: cannot open `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b' (No such file or directory) +anarcat@marcos:clips$ git annex get www.youtube.com_watch_v\=BTzNLhxPzjo +get www.youtube.com_watch_v=BTzNLhxPzjo (from web...) +--2013-09-14 17:24:23-- http://www.youtube.com/watch?v=BTzNLhxPzjo +Résolution de www.youtube.com (www.youtube.com)... 173.194.43.96, 173.194.43.97, 173.194.43.98, ... +Connexion vers www.youtube.com (www.youtube.com)|173.194.43.96|:80...connecté. +requête HTTP transmise, en attente de la réponse...200 OK +Longueur: non spécifié [text/html] +Sauvegarde en : «/srv/video/clips/.git/annex/tmp/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b» + + [ <=> ] 123 245 346K/s ds 0,3s + +2013-09-14 17:24:23 (346 KB/s) - «/srv/video/clips/.git/annex/tmp/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b» sauvegardé [123245] + +ok +(Recording state in git...) +anarcat@marcos:clips$ file www.youtube.com_watch_v\=BTzNLhxPzjo +www.youtube.com_watch_v=BTzNLhxPzjo: symbolic link to `.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b' +anarcat@marcos:clips$ file .git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b +.git/annex/objects/qZ/q1/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b/SHA256E-s123162--96fe8634aaf035373077473ac2b166c5ad22bfe099112c414eee9fe753f4ce2b: HTML document, UTF-8 Unicode text, with very long lines +# End of transcript or log. +"""]] + +### Workaround + +Use the `quvi` prefix. + +> Typo introduced in last release. [[fixed|done]] --[[Joey]] diff --git a/doc/builds.mdwn b/doc/builds.mdwn new file mode 100644 index 000000000..b920643b5 --- /dev/null +++ b/doc/builds.mdwn @@ -0,0 +1,44 @@ +[[!meta title="git-annex autobuild overview"]] + +[[!sidebar content=""" +# last uploaded build-versions + +

Linux i386

+ +

Linux amd64

+ +

Linux armel

+ +

Android

+ +

OSX Mavericks

+ +

Windows

+ +"""]] + +# build logs + +

Linux i386

+ +

Linux amd64

+ +

Linux armel

+ +

Android

+ +

OSX Mavericks

+ +

Windows

+here diff --git a/doc/coding_style.mdwn b/doc/coding_style.mdwn new file mode 100644 index 000000000..101ac4f58 --- /dev/null +++ b/doc/coding_style.mdwn @@ -0,0 +1,92 @@ +If you do nothing else, avoid use of partial functions from the Prelude! +`import Utility.PartialPrelude` helps avoid this by defining conflicting +functions for all the common ones. Also avoid `!!`, it's partial too. + +Use tabs for indentation. The one exception to this rule are +the Hamlet format files in `templates/*`. Hamlet, infuriatingly, refuses +to allow tabs to be used for indentation. + +Code should make sense with any tab stop setting, but 8 space tabs are +the default. With 8 space tabs, code should not exceed 80 characters +per line. (With larger tabs, it may of course.) + +Use spaces for layout. For example, here spaces (indicated with `.`) +are used after the initial tab to make the third test line up with +the others. + + when (foo_test || bar_test || + ......some_other_long_test) + print "hi" + +As a special Haskell-specific rule, "where" clauses are indented with two +spaces, rather than a tab. This makes them stand out from the main body +of the function, and avoids excessive indentation of the where cause content. +The definitions within the where clause should be put on separate lines, +each indented with a tab. + + main = do + foo + bar + foo + where + foo = ... + bar = ... + +Where clauses for instance definitions and modules tend to appear at the end +of a line, rather than on a separate line. + + module Foo (Foo, mkFoo, unFoo) where + instance MonadBaseControl IO Annex where + +When a function's type signature needs to be wrapped to another line, +it's typical to switch to displaying one parameter per line. + + foo :: Bar -> Baz -> (Bar -> Baz) -> IO Baz + + foo' + :: Bar + -> Baz + -> (Bar -> Baz) + -> IO Baz + +Note that the "::" then starts its own line. It is not put on the same +line as the function name because then it would not be guaranteed to line +up with the "->" at all tab width settings. Similarly, guards are put +on their own lines: + + splat i + | odd i = error "splat!" + | otherwise = i + +Multiline lists and record syntax are written with leading commas, +that line up with the open and close punctuation. + + list = + [ item1 + , item2 + , item3 + ] + + foo = DataStructure + { name = "bar" + , address = "baz" + } + +Module imports are separated into two blocks, one for third-party modules, +and one for modules that are part of git-annex. (Additional blocks can be used +if it makes sense.) + +Using tabs for indentation makes use of `let .. in` particularly tricky. +There's no really good way to bind multiple names in a let clause with +tab indentation. Instead, a where clause is typically used. To bind a single +name in a let clause, this is sometimes used: + + foo = let x = 42 + in x + (x-1) + x + +----- + +If you feel that this coding style leads to excessive amounts of horizontal +or vertical whitespace around your code, making it hard to fit enough of it +on the screen, consider finding a better abstraction, so the code that +does fit on the screen is easily understandable. ;) diff --git a/doc/coding_style/comment_1_70521cf79ad06832b1d73fc2c20c68ec._comment b/doc/coding_style/comment_1_70521cf79ad06832b1d73fc2c20c68ec._comment new file mode 100644 index 000000000..a8200f856 --- /dev/null +++ b/doc/coding_style/comment_1_70521cf79ad06832b1d73fc2c20c68ec._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnq-RfkVpFN15SWvQ2lpSGAi0XpNQuLxKM" + nickname="Yuval" + subject="What about safe?" + date="2014-07-06T10:45:59Z" + content=""" +https://hackage.haskell.org/package/safe + +> A library wrapping Prelude/Data.List functions that can throw exceptions, such as head and !!. Each unsafe function has up to four variants, e.g. with tail: +> +> tail :: [a] -> [a], raises an error on tail []. + +> tailMay :: [a] -> Maybe [a], turns errors into Nothing. + +> tailDef :: [a] -> [a] -> [a], takes a default to return on errors. + +> tailNote :: String -> [a] -> [a], takes an extra argument which supplements the error message. + +> tailSafe :: [a] -> [a], returns some sensible default if possible, [] in the case of tail. +"""]] diff --git a/doc/coding_style/comment_2_a820b7c8ae7c2290eb000f61bdb5c514._comment b/doc/coding_style/comment_2_a820b7c8ae7c2290eb000f61bdb5c514._comment new file mode 100644 index 000000000..9f9d96196 --- /dev/null +++ b/doc/coding_style/comment_2_a820b7c8ae7c2290eb000f61bdb5c514._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-10T20:24:03Z" + content=""" +safe does not prevent using the unsafe prelude functions. Utility.PartialPrelude does, and provides a few safe wrappers like lastMaybe. +"""]] diff --git a/doc/comments.mdwn b/doc/comments.mdwn new file mode 100644 index 000000000..e19962b92 --- /dev/null +++ b/doc/comments.mdwn @@ -0,0 +1,9 @@ +[[!sidebar content=""" +[[!inline pages="comment_pending(*)" feedfile=pendingmoderation +description="comments pending moderation" show=-1]] +Comments in the [[!commentmoderation desc="moderation queue"]]: +[[!pagecount pages="comment_pending(*)"]] +"""]] + +Recent comments posted to this site: +[[!inline pages="comment(*)" template="comment"]] diff --git a/doc/contact.mdwn b/doc/contact.mdwn new file mode 100644 index 000000000..b2ccf8201 --- /dev/null +++ b/doc/contact.mdwn @@ -0,0 +1,11 @@ +Joey Hess is the author of git-annex. If you need to +talk about something privately, email me. + +The [[forum]] is the best place to discuss git-annex. + +For realtime chat, use the `#git-annex` channel on irc.oftc.net. +You can also watch incoming commits there. + +The [VCS-home mailing list](http://lists.madduck.net/listinfo/vcs-home) +is a good mailing list for users who want to use git-annex in the context +of managing their large personal files. diff --git a/doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment b/doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment new file mode 100644 index 000000000..f72f3fbe5 --- /dev/null +++ b/doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlZQcpoRmyZBlsFQ7TMMYlZZdmBG1TxMzA" + nickname="Felipe" + subject="translation" + date="2013-09-10T20:19:53Z" + content=""" +I would like to translate this content of site, the tutorials, pages, etc, to portuguese. I think that can help many users in my country. How can I build a new pages here with git-annex content in portuguese? +"""]] diff --git a/doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment b/doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment new file mode 100644 index 000000000..6f451d9ae --- /dev/null +++ b/doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 2" + date="2013-09-12T21:08:16Z" + content=""" +I welcome translations in theory, but I do not have any infrastructure in place to support it, so that would have to be the first step. + +(Also, this page is not a general-purpose discussion forum.) +"""]] diff --git a/doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment b/doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment new file mode 100644 index 000000000..32fbc7f65 --- /dev/null +++ b/doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4" + nickname="Blake" + subject="Starting git-annex assistant" + date="2013-10-02T23:57:48Z" + content=""" +Hi Joey, + +I am one of your original funders for git-annex. I think you have done a great job and I am proud to say I helped fund your endeavor. + +How do I start the git-annex assistant webapp via command line? I installed the program on my Fedora 19 computer via YUM and it does not come packaged with a desktop icon as you show in your demonstration video. I try running `$ git annex assistant` but I cannot access `http://127.0.0.1:34795/` as you do in the video. Also, the quickstart page (http://git-annex.branchable.com/assistant/quickstart/) seems to have outdated information as it states you can start the webapp via `$ git annex webapp`, however when I try to run this I get the following error: `git-annex: unknown command webapp`. + +Regards, +Blake + +"""]] diff --git a/doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment b/doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment new file mode 100644 index 000000000..1cf9c3acc --- /dev/null +++ b/doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2013-10-03T00:06:11Z" + content=""" +Your fedora build apparently does not include the webapp, since `git annex webapp` is the right command. Install the [[install/Linux_standalone]] build instead. + +(Again this page is not a discussion forum. Next person to post here will waste my time since I will have to go configure the site to block comments here..) +"""]] diff --git a/doc/contribute.mdwn b/doc/contribute.mdwn new file mode 100644 index 000000000..71bce6c54 --- /dev/null +++ b/doc/contribute.mdwn @@ -0,0 +1,38 @@ +Help make git-annex better! + +## wiki gardening + +This website is a wiki, so you can edit and improve any page. + +Or, write a [[new_tip|tips]] explaining how to accomplish something with +git-annex. + +## bug triage + +People often file [[bugs]] on git-annex that are easily resolved by helping +them with a problem, and perhaps writing some documentation. + +Many bugs are also filed without enough information +to reproduce the problem, and need to be tagged moreinfo and a comment +posted asking the submitter for details. + +Joey spends a lot of time dealing with this kind of bug triage. If you can +take the time to pick a bug that is not marked as "confirmed" or "moreinfo" +from the list of [[bugs]], try to reproduce it and follow up either +confirming that the problem exists, or asking the submitter for more info, +you'll make Joey more productive! + +## code contributions + +[[download]] the source code and send patches! + +If you know Haskell, git-annex has lots of Haskell code that +could be improved. See the [[coding_style]] and have at it. + +If you don't know Haskell, git-annex has many other coding opportunities. +You could work to improve the Android port (Java etc) or improve the +Javascript and CSS of the git-annex webapp, or work on porting libraries +needed by the Windows port. + +To send patches, either include the patch in a bug report (small patch) +or put up a branch in a git repository containing your changes. diff --git a/doc/copies.mdwn b/doc/copies.mdwn new file mode 100644 index 000000000..3e0ebc6c6 --- /dev/null +++ b/doc/copies.mdwn @@ -0,0 +1,35 @@ +Annexed data is stored inside your git repository's `.git/annex` directory. +Some [[special_remotes]] can store annexed data elsewhere. + +It's important that data not get lost by an ill-considered `git annex drop` +command. So, git-annex can be configured to try +to keep N copies of a file's content available across all repositories. +(Although [[untrusted_repositories|trust]] don't count toward this total.) + +By default, N is 1; it is configured by running `git annex numcopies N`. +This default can be overridden on a per-file-type basis by the annex.numcopies +setting in `.gitattributes` files. The --numcopies switch allows +temporarily using a different value. + +`git annex drop` attempts to check with other git remotes, to check that N +copies of the file exist. If enough repositories cannot be verified to have +it, it will retain the file content to avoid data loss. Note that +[[trusted_repositories|trust]] are not explicitly checked. + +For example, consider three repositories: Server, Laptop, and USB. Both Server +and USB have a copy of a file, and N=1. If on Laptop, you `git annex get +$file`, this will transfer it from either Server or USB (depending on which +is available), and there are now 3 copies of the file. + +Suppose you want to free up space on Laptop again, and you `git annex drop` the file +there. If USB is connected, or Server can be contacted, git-annex can check +that it still has a copy of the file, and the content is removed from +Laptop. But if USB is currently disconnected, and Server also cannot be +contacted, it can't verify that it is safe to drop the file, and will +refuse to do so. + +With N=2, in order to drop the file content from Laptop, it would need access +to both USB and Server. + +For more complicated requirements about which repositories contain which +content, see [[required_content]]. diff --git a/doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment b/doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment new file mode 100644 index 000000000..45e572260 --- /dev/null +++ b/doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="See also section on backups in walthroug" + date="2013-08-25T05:37:04Z" + content=""" +See also [walthrough/backups](/walkthrough/backups/) for some details about copies. +"""]] diff --git a/doc/design.mdwn b/doc/design.mdwn new file mode 100644 index 000000000..e4f0e5c2a --- /dev/null +++ b/doc/design.mdwn @@ -0,0 +1,6 @@ +git-annex's high-level design is mostly inherent in the data that it +stores in git, and alongside git. See [[internals]] for details. + +Here's the other design documents we have: + +[[!map pages="page(design/*) and !design/*/*"]] diff --git a/doc/design/assistant.mdwn b/doc/design/assistant.mdwn new file mode 100644 index 000000000..052c53678 --- /dev/null +++ b/doc/design/assistant.mdwn @@ -0,0 +1,45 @@ +These are the design pages for the git-annex [[/assistant]]. + +Parts of the design is still being fleshed out, still many ideas +and use cases to add. Feel free to chip in with comments! --[[Joey]] + +See [[roadmap]] for current plans, as this list was mostly completed. + +## initial development kickstarter year overview (2012-2013) + +* Month 1 "like dropbox": [[!traillink inotify]] [[!traillink syncing]] +* Month 2 "shiny webapp": [[!traillink webapp]] [[!traillink progressbars]] +* Month 3 "easy setup": [[!traillink configurators]] [[!traillink pairing]] +* Month 4 "cloud": [[!traillink cloud]] [[!traillink transfer_control]] +* Month 5 "cloud continued": [[!traillink xmpp]] [[!traillink more_cloud_providers]] +* Month 6 "9k bonus round": [[!traillink desymlink]] +* Month 7: user-driven features and polishing; + [presentation at LCA2013](http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4) +* Month 8: [[!traillink Android]] +* Month 9: [[screencasts|videos]] and polishing +* Month 10: bugfixing, [[Android]] webapp +* Month 11: [[!traillink Windows]] porting, finishing touches +* Month 12: [presentation at SELF2013](http://www.southeastlinuxfest.org/), finishing touches + +## porting + +* [[OSX]] port is in fairly good shape, but still has some room for improvement +* [[android]] port is zooming along +* [[Windows]] port is barely getting started + +## not yet on the map: + +* [[rate_limiting]] +* [[partial_content]] +* [[deltas]] +* [[leftovers]] +* [[other todo items|todo]] + +## polls + +I post [[polls]] occasionally to make decisions. You can vote! + +## blog + +I'm blogging about my progress in the [[devblog]] on a semi-daily basis. +Follow along! diff --git a/doc/design/assistant/OSX.mdwn b/doc/design/assistant/OSX.mdwn new file mode 100644 index 000000000..400e517bf --- /dev/null +++ b/doc/design/assistant/OSX.mdwn @@ -0,0 +1,13 @@ +Misc OSX porting things: + +* autostart the assistant on OSX, using launchd **done** +* icon to start webapp **done** +* use FSEvents to detect file changes (better than kqueue) **done** +* Use OSX's "network reachability functionality" to detect when on a network + +* Switch from gpg to . According to a user, + this is better because it can show a dialog window for password prompts. + +Bugs: + +[[!inline pages="tagged(design/assistant/OSX) and !link(bugs/done)" show=0 archive=yes]] diff --git a/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment b/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment new file mode 100644 index 000000000..633dd01b4 --- /dev/null +++ b/doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4" + nickname="Jörn" + subject="Mount detection" + date="2012-09-21T09:23:34Z" + content=""" +regarding the current mount polling on OSX: why not use the NSNotificationCenter for being notified on mount events on OSX? + +Details see: + +1. +2. +3. +"""]] diff --git a/doc/design/assistant/android.mdwn b/doc/design/assistant/android.mdwn new file mode 100644 index 000000000..8beaffabc --- /dev/null +++ b/doc/design/assistant/android.mdwn @@ -0,0 +1,42 @@ +The Android port is just about usable. Still, we have some fun todo items +to improve it. + +## high-priority TODO + +* [[bugs/Android_app_permission_denial_on_startup]] +* S3 doesn't work (at least to Internet Archive: + "connect: does not exist (connection refused)") +* Get app into Google Play and/or FDroid + +## TODO + +* Don't make app initially open terminal + webapp, but go to a page that + allows opening the webapp or terminal. + Possibly, switch from running inside terminal app to real standalone app. + See + and . + +* I have seen an assistant thread crash with an interrupted system call + when the device went to sleep while it was running. Auto-detect and deal with + that somehow. +* Make git stop complaining that "warning: no threads uspport, ignoring --threads" +* git does not support http remotes. To fix, need to port libcurl and + allow git to link to it. +* getEnvironment is broken on Android + and a few places use it. I have some horrible workarounds in place. +* Get local pairing to work. network-multicast and network-info don't + currently install. +* Get test suite to pass. `git clone` of a local repo fails on android + for some reason. +* Make app autostart on boot, optionally. +* The app should be aware of power status, and avoid expensive background + jobs when low on battery or run flat out when plugged in. +* The app should be aware of network status, and avoid expensive data + transfers when not on wifi. This may need to be configurable. +* glacier and local pairing are not yet enabled for Android. +* The "Files" link doesn't start a file browser. Should be possible to do + on Android via intents, I suppose? +* Adding removable drives would work, but the android app is not in the + appropriate group to write to them. `WRITE_MEDIA_STORAGE` permission + needed. Added to AndroidManifest, but did not seem to be used. + Googleing for it will find a workaround that needs a rooted device. diff --git a/doc/design/assistant/android/comment_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment b/doc/design/assistant/android/comment_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment new file mode 100644 index 000000000..89f23d72c --- /dev/null +++ b/doc/design/assistant/android/comment_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 10" + date="2013-05-06T12:18:39Z" + content=""" +One of the points is: + +* The app should be aware of power status, and avoid expensive background jobs when low on battery or run flat out when plugged in. + +This isn't good for situations where the device is plugged in and charging, but will only be so for a limited time (such as charging during a car journey) as the device would charge slower. + +Could this behaviour be configurable too? +"""]] diff --git a/doc/design/assistant/android/comment_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment b/doc/design/assistant/android/comment_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment new file mode 100644 index 000000000..389eac026 --- /dev/null +++ b/doc/design/assistant/android/comment_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~gdr-go2" + nickname="gdr-go2" + subject="FAT symlinks" + date="2012-05-28T18:12:10Z" + content=""" +It's a linux kernel so perhaps another option would be to create a big file and mount -o loop +"""]] diff --git a/doc/design/assistant/android/comment_2_3dd386ac1b757c73d14f14377b9eedd4._comment b/doc/design/assistant/android/comment_2_3dd386ac1b757c73d14f14377b9eedd4._comment new file mode 100644 index 000000000..3ff46ca06 --- /dev/null +++ b/doc/design/assistant/android/comment_2_3dd386ac1b757c73d14f14377b9eedd4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhIMPGF1E0XEJKV6j6-PFzAxA1-nIlydo" + nickname="Bernhard" + subject="re @ gdr-go2 " + date="2012-09-10T19:34:00Z" + content=""" +`mount` requires root and you'll have still the 4gb limit for your image by FAT. some phones (e.g. galaxy nexus) already use `ext4` for `/sdcard` though. +"""]] diff --git a/doc/design/assistant/android/comment_3_5dca47a4599d6e88d19193701c5a571b._comment b/doc/design/assistant/android/comment_3_5dca47a4599d6e88d19193701c5a571b._comment new file mode 100644 index 000000000..8f60efdb0 --- /dev/null +++ b/doc/design/assistant/android/comment_3_5dca47a4599d6e88d19193701c5a571b._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhIMPGF1E0XEJKV6j6-PFzAxA1-nIlydo" + nickname="Bernhard" + subject="GHC and Android" + date="2012-09-10T21:58:28Z" + content=""" +I played around a bit with GHC and Android today. It isn't really a result, but maybe useful for someone out there. + +I have a Debian `chroot` environment on my Android device (howto: ). In the Debian box: + + $ cat arm.hs + main = do + putStrLn \"Hello ARM\" + $ ghc -static --make arm.hs + Linking arm ... + $ ldd arm + libgmp.so.3 => /usr/lib/libgmp.so.3 (0x40233000) + libm.so.6 => /lib/libm.so.6 (0x400c8000) + libffi.so.5 => /usr/lib/libffi.so.5 (0x401b1000) + librt.so.1 => /lib/librt.so.1 (0x40171000) + libdl.so.2 => /lib/libdl.so.2 (0x40180000) + libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4018b000) + libc.so.6 => /lib/libc.so.6 (0x40282000) + /lib/ld-linux.so.3 (0x400a2000) + libpthread.so.0 => /lib/libpthread.so.0 (0x4007e000) + +well, that isn't really static. tell the linker to build a static binary (those are arguments to `ld`): + + $ ghc --make arm.hs -optl-static -optl-pthread + [1 of 1] Compiling Main ( arm.hs, arm.o ) + Linking arm ... + $ file arm + arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.18, not stripped + $ ldd arm + not a dynamic executable + $ ./arm + Hello ARM + +now, get this (quite big) binary into the normal android environment, using `adb`, `SSHDroid` or whatever: + + % cd /data/local/tmp # assuming destination of file transfer + % ./arm + arm: mkTextEncoding: invalid argument (Invalid argument) + +looking in the source of `System.IO` it seems like an `iconv` issue. So, there's still some dynamic dependency in there... *sigh* +"""]] diff --git a/doc/design/assistant/android/comment_4_054f06311e2b51d73be569f181eb004f._comment b/doc/design/assistant/android/comment_4_054f06311e2b51d73be569f181eb004f._comment new file mode 100644 index 000000000..76c32908a --- /dev/null +++ b/doc/design/assistant/android/comment_4_054f06311e2b51d73be569f181eb004f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 4" + date="2012-09-11T02:12:45Z" + content=""" +Thanks Bernard, that's really massively useful. It makes sense -- statically building with libc should work, the Android kernel is still Linux after all. + +To get past the iconv problem, I think all you need is part of the `locales` package from your linux system installed on the Android. Probably just a few of the data files from /usr/share/i18n/charmaps/ +"""]] diff --git a/doc/design/assistant/android/comment_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment b/doc/design/assistant/android/comment_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment new file mode 100644 index 000000000..be1e3e9e8 --- /dev/null +++ b/doc/design/assistant/android/comment_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhIMPGF1E0XEJKV6j6-PFzAxA1-nIlydo" + nickname="Bernhard" + subject="comment 5" + date="2012-09-11T09:34:42Z" + content=""" +`/usr/share/i18n/` does not exists on my Debian ARM system :/ + +however, `strace ./arm` in the debian chroot reveals that some files from `/usr/lib/gconv/` are loaded: + + [...] + open(\"/usr/lib/gconv/UTF-32.so\", O_RDONLY) = 3 + read(3, \"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\4\4\0\0004\0\0\0\"..., 512) = 512 + [...] + +full log: . Unfortunately, I don't have `strace` in the android userland for comparison. + +Just copying the related `gconv` files didn't work. I don't have so much time at the moment, I'll investigate further in some days or so. + +At least, output using `error :: String -> a` does work :-) +"""]] diff --git a/doc/design/assistant/android/comment_6_fee32a831eeb5736fe1dce52e30320c8._comment b/doc/design/assistant/android/comment_6_fee32a831eeb5736fe1dce52e30320c8._comment new file mode 100644 index 000000000..9dfe5670d --- /dev/null +++ b/doc/design/assistant/android/comment_6_fee32a831eeb5736fe1dce52e30320c8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 6" + date="2012-10-30T08:44:32Z" + content=""" +Just so this does not get lost: For better or for worse, the vanilla Android devices stopped shipping with micro-SD support in 2011 (or 2010 if the Nexus S does not support them either; on sketchy GPRS so not googling around). Most higher-end Android devices ship with at least 8 GiB of on-board Flash storage, some even go up to 64 GiB. + +IMHO, this would make it viable to first get git-annex working on Android without regard for FAT. + +The obvious advantage is that porting should be easier and quicker. + +The obvious downside is that this may mean revisiting some parts of the code later. + +-- Richard +"""]] diff --git a/doc/design/assistant/android/comment_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment b/doc/design/assistant/android/comment_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment new file mode 100644 index 000000000..0419b1d1b --- /dev/null +++ b/doc/design/assistant/android/comment_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 7" + date="2012-10-30T08:51:17Z" + content=""" +Actually, this is something that would be ideal for a poll: + +Should FAT-based Android repos be implemented: + +* Immediately +* After the initial release of the Android app is working +* Before the kickstarter ends +* Not at all + +Also, as another data point, the FAT-based SD card can be mounted as USB storage by any computer an Android device is connected to whereas the EXT4-based root FS can only be accessed via MTP. +"""]] diff --git a/doc/design/assistant/android/comment_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment b/doc/design/assistant/android/comment_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment new file mode 100644 index 000000000..91db74ec6 --- /dev/null +++ b/doc/design/assistant/android/comment_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Terminal IDE" + date="2012-11-21T21:46:19Z" + content=""" +I use Terminal IDE on android, which is 'sort of a shell environment'. + +It has bash, git, dropbear ssh, and vim. It is a bit limited, but it does feel like a linux shell. + +"""]] diff --git a/doc/design/assistant/android/comment_9_55ea70a6929523d26248ff6409b04a6e._comment b/doc/design/assistant/android/comment_9_55ea70a6929523d26248ff6409b04a6e._comment new file mode 100644 index 000000000..d371c5fed --- /dev/null +++ b/doc/design/assistant/android/comment_9_55ea70a6929523d26248ff6409b04a6e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl7ciFZWmffuw6sLRww3CcL_F5ItsttL9w" + nickname="Aaron" + subject="Feature request: Events triggered on wifi SSID or connection state" + date="2013-01-08T13:04:05Z" + content=""" +I'd like to have my phone sync a bunch of files when I'm at home and when I get to work, have them synced to my work machine, deleted off my phone and when I get home, also deleted off my home machine. + +This will allow incremental backups to a local folder at home and I can then \"mule\" my files, sneaker-net style, to work with zero user intervention. It only works if events can be triggered or I can combine a triggering app with a special android intent for both ends of my trip. +"""]] diff --git a/doc/design/assistant/blog.mdwn b/doc/design/assistant/blog.mdwn new file mode 100644 index 000000000..561173d27 --- /dev/null +++ b/doc/design/assistant/blog.mdwn @@ -0,0 +1,11 @@ +This blog was updated on a semi-daily basis by Joey during the year of work +concentrating on the git-annex assistant that was funded by his kickstarter +campaign. + +Post-kickstarter work will instead appear on the [[devblog]]. However, +this page's RSS feed will continue to work, so you don't have to migrate +your RSS reader. + +[[!inline pages="page(devblog/*)" show=-1 feedshow=7]] + +[[!inline pages="page(design/assistant/blog/*)" show=0 feeds=no]] diff --git a/doc/design/assistant/blog/day_100__cursed_clouds.mdwn b/doc/design/assistant/blog/day_100__cursed_clouds.mdwn new file mode 100644 index 000000000..7ac38f463 --- /dev/null +++ b/doc/design/assistant/blog/day_100__cursed_clouds.mdwn @@ -0,0 +1,19 @@ +Preferred content control is wired up to `--auto` and working for `get`, +`copy`, and `drop`. Note that `drop --from remote --auto` drops files that +the remote's preferred content settings indicate it doesn't want; +likewise `copy --to remote --auto` sends content that the remote does want. + +Also implemented `smallerthan`, `largerthan`, and `ingroup` limits, +which should be everything needed for the scenarios described in +[[transfer_control]]. + +Dying to hook this up to the assistant, but a cloudy day is forcing me to +curtail further computer use. + +---- + +Also, last night I developed a patch for the hS3 library, that should let +git-annex upload large files to S3 without buffering their whole content in +memory. I have a `s3-memory-leak` in git-annex that uses the new API I +developed. Hopefully hS3's maintainer will release a new version with that +soon. diff --git a/doc/design/assistant/blog/day_102__very_high_level_programming.mdwn b/doc/design/assistant/blog/day_102__very_high_level_programming.mdwn new file mode 100644 index 000000000..4e29cc65d --- /dev/null +++ b/doc/design/assistant/blog/day_102__very_high_level_programming.mdwn @@ -0,0 +1,37 @@ +## today + +Came up with four groups of repositories that it makes sense to +define standard preferred content expressions for. + +[[!format haskell """ + preferredContent :: StandardGroup -> String + preferredContent ClientGroup = "exclude=*/archive/*" + preferredContent TransferGroup = "not inallgroup=client and " ++ preferredContent ClientGroup + preferredContent ArchiveGroup = "not copies=archive:1" + preferredContent BackupGroup = "" -- all content is preferred +"""]] + +[[preferred_content]] has the details about these groups, but +as I was writing those three preferred content expressions, +I realized they are some of the highest level programming I've ever done, +in a way. + +Anyway, these make for a very simple repository configuration UI: + +[[!img /assistant/repogroups.png alt="form with simple select box"]] + +## yesterday (forgot to post this) + +Got the assistant honoring preferred content settings. Although so far that +only determines what it transfers. Additional work will be needed to make +content be dropped when it stops being preferred. + +---- + +Added a "configure" link next to each repository on the repository config +page. This will go to a form to allow setting things like repository +descriptions, groups, and preferred content settings. + +---- + +Cut a release. diff --git a/doc/design/assistant/blog/day_102__very_high_level_programming/comment_1_c028b403261dd66bcf83e6ffd134b80b._comment b/doc/design/assistant/blog/day_102__very_high_level_programming/comment_1_c028b403261dd66bcf83e6ffd134b80b._comment new file mode 100644 index 000000000..d9be239bd --- /dev/null +++ b/doc/design/assistant/blog/day_102__very_high_level_programming/comment_1_c028b403261dd66bcf83e6ffd134b80b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlVwbp82f-7rNOyEpvqc9A8FEfn7wl2Akw" + nickname="Jos" + subject="Works for me" + date="2012-10-11T13:40:08Z" + content=""" +These categories make it much clearer to me how I will be able to use git annex assistant +"""]] diff --git a/doc/design/assistant/blog/day_103__bugfix_day.mdwn b/doc/design/assistant/blog/day_103__bugfix_day.mdwn new file mode 100644 index 000000000..7c08a2065 --- /dev/null +++ b/doc/design/assistant/blog/day_103__bugfix_day.mdwn @@ -0,0 +1,25 @@ +Bugfixes all day. + +The most amusing bug, which I just stumbled over randomly on my own, +after someone on IRC yesterday was possibly encountering the same issue, +made `git annex webapp` go into an infinite memory-consuming loop on +startup if the repository it had been using was no longer a valid git +repository. + +Then there was the place where HOME got unset, with also sometimes amusing +results. + +Also fixed several build problems, including a threaded runtime hang +in the test suite. Hopefully the next release will build on all Debian +architectures again. + +I'll be cutting that release tomorrow. I also updated the linux +prebuilt tarballs today. + +---- + +Hmm, not entirely bugfixes after all. Had time (and power) to work +on the repository configuration form too, and added a check box to it that +can be unchecked to disable syncing with a repository. +Also, made that form be displayed after the webapp creates a new +repository. diff --git a/doc/design/assistant/blog/day_104__misc.mdwn b/doc/design/assistant/blog/day_104__misc.mdwn new file mode 100644 index 000000000..bda802bfe --- /dev/null +++ b/doc/design/assistant/blog/day_104__misc.mdwn @@ -0,0 +1,18 @@ +Switched the OSX standalone app to use `DYLD_ROOT_PATH`. +This is the third `DYLD_*` variable I've tried; neither +of the other two worked in all situations. This one may do better. +If not, I may be stuck modifying the library names in each executable +using `install_name_tool` +([good reference for doing that](http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html)). +As far as I know, every existing dynamic library lookup system is broken +in some way other other; nothing I've seen about OSX's so far +disproves that rule. + +Fixed a nasty utf-8 encoding crash that could occur when merging the +git-annex branch. I hope I'm almost done with those. + +Made git-annex auto-detect when a git remote is on a sever like github +that doesn't support git-annex, and automatically set annex-ignore. + +Finished the UI for pausing syncing of a remote. Making the syncing +actually stop still has some glitches to resolve. diff --git a/doc/design/assistant/blog/day_104__misc/comment_1_13d7fad2d3f8eab10314784c035e2a16._comment b/doc/design/assistant/blog/day_104__misc/comment_1_13d7fad2d3f8eab10314784c035e2a16._comment new file mode 100644 index 000000000..67e342a4b --- /dev/null +++ b/doc/design/assistant/blog/day_104__misc/comment_1_13d7fad2d3f8eab10314784c035e2a16._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="Thank you for stickers" + date="2012-10-14T13:59:55Z" + content=""" +Mail received in Finland. +"""]] diff --git a/doc/design/assistant/blog/day_105__lazy_Sunday.mdwn b/doc/design/assistant/blog/day_105__lazy_Sunday.mdwn new file mode 100644 index 000000000..eb25ddace --- /dev/null +++ b/doc/design/assistant/blog/day_105__lazy_Sunday.mdwn @@ -0,0 +1,43 @@ +Did a fair amount of testing and bug fixing today. + +There is still some buggy behavior around pausing syncing to a remote, +where transfers still happen to it, but I fixed the worst bug there. + +Noticed that if a non-bare repo is set up on a removable drive, +its file tree will not normally be updated as syncs come in -- because the +assistant is not running on that repo, and so incoming syncs are not +merged into the local master branch. For now I made it always use bare +repos on removable drives, but I may want to revisit this. + +The repository edit form now has a field for the name of the repo, +so the ugly names that the assistant comes up with for ssh remotes +can be edited as you like. `git remote rename` is a very nice thing. + +Changed the preferred content expression for transfer repos to this: +"not (inallgroup=client **and copies=client:2)**". This way, when there's +just one client, files on it will be synced to transfer repos, even +though those repos have no other clients to transfer them to. Presumably, +if a transfer repo is set up, more clients are coming soon, so this avoids +a wait. Particularly useful with removable drives, as the drive will start +being filled as soon as it's added, and can then be brought to a client +elsewhere. The "2" does mean that, once another client is found, +the data on the transfer repo will be dropped, and so if it's brought +to yet another new client, it won't have data for it right away. +I can't see way to generalize this workaround to more than 2 clients; +the transfer repo has to start dropping apparently unwanted content at +some point. Still, this will avoid a potentially very confusing behavior +when getting started. + +---- + +I need to get that dropping of non-preferred content to happen still. +Yesterday, I did some analysis of all the events that can cause previously +preferred content to no longer be preferred, so I know all the places +I have to deal with this. + +The one that's giving me some trouble is checking in the transfer scan. If it +checks for content to drop at the same time as content to transfer, it could +end up doing a lot of transfers before dropping anything. It'd be nicer to +first drop as much as it can, before getting more data, so that transfer +remotes stay as small as possible. But the scan is expensive, and it'd also +be nice not to need two passes. diff --git a/doc/design/assistant/blog/day_106__lazy_Monday.mdwn b/doc/design/assistant/blog/day_106__lazy_Monday.mdwn new file mode 100644 index 000000000..84b96f635 --- /dev/null +++ b/doc/design/assistant/blog/day_106__lazy_Monday.mdwn @@ -0,0 +1,10 @@ +I was mostly working on other things today, but I did do some bug fixing. +The worst of these is a bug introduced in 3.20121009 that breaks +`git-annex-shell configlist`. That's pretty bad for using git-annex +on servers, although you mostly won't notice unless you're just getting +started using a ssh remote, since that's when it calls configlist. +I will be releasing a new version as soon as I have bandwidth (tomorrow). + +Also made the standalone Linux and OSX binaries build with ssh connection +caching disabled, since they don't bundle their own ssh and need to work +with whatever ssh is installed. diff --git a/doc/design/assistant/blog/day_107__memory_leak.mdwn b/doc/design/assistant/blog/day_107__memory_leak.mdwn new file mode 100644 index 000000000..e33008f97 --- /dev/null +++ b/doc/design/assistant/blog/day_107__memory_leak.mdwn @@ -0,0 +1,11 @@ +More bugfixes today. The assistant now seems to have enough users that +they're turning up interesting bugs, which is good. But does keep me too +busy to add many more bugs\^Wcode. + +The fun one today made it bloat to eat all memory when logging out of a +Linux desktop. I tracked that back to a bug in the Haskell DBUS library +when a session connection is open and the session goes away. Developed a +test case, and even profiled it, and sent it all of to the library's +author. Hopefully there will be a quick fix, in the meantime today's +release has DBUS turned off. Which is ok, it just makes it a little bit +slower to notice some events. diff --git a/doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn b/doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn new file mode 100644 index 000000000..ee46073bd --- /dev/null +++ b/doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn @@ -0,0 +1,33 @@ +I released git-annex an unprecidented two times yesterday, because just +after the first release, I learned of a another zombie problem. Turns out +this zombie had existed for a while, but it was masked by zombie reaping +code that I removed recently, after fixing most of the other zombie +problems. This one, though, is not directly caused by git-annex. When rsync +runs ssh, it seems to run two copies, and one is left unwaited on as a +zombie. Oddly, this only happens when rsync's stdout is piped into +git-annex, for progress bar handling. I have not source-dived rsync's code +to get to the bottom of this, but I put in a workaround. + +I did get to the bottom of yesterday's runaway dbus library. Got lucky and +found the cause of the memory leak in that library on the first try, which +is nice since each try involved logging out of X. I've been corresponding +with its author, and a fix will be available soon, and then git-annex will +need some changes to handle dbus reconnection. + +----- + +For the first time, I'm starting to use the assistant on my own personal +git-annex repo. The preferred content and group settings let me configure it +use the complex system of partial syncing I need. For example, I have this +configured for my sound files, keeping new podcasts on a server until they land +somewhere near me. And keeping any sound files that I've manually put on my +laptop, and syncing new podcasts, but not other stuff. + + # (for my server) + preferred-content 87e06c7a-7388-11e0-ba07-03cdf300bd87 = include=podcasts/* and (not copies=nearjoey:1) + # (for my laptop) + preferred-content 0c443de8-e644-11df-acbf-f7cd7ca6210d = exclude=*/out/* and (in=here or (include=podcasts/*)) + +Found and fixed a bug in the preferred content matching code, where +if the assistant was run in a subdirectory of the repo, it failed to +match files correctly. diff --git a/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_1_194c48d65993462f809a2cfaa774a3e2._comment b/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_1_194c48d65993462f809a2cfaa774a3e2._comment new file mode 100644 index 000000000..690d59d17 --- /dev/null +++ b/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_1_194c48d65993462f809a2cfaa774a3e2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 1" + date="2012-10-19T01:21:42Z" + content=""" +Can you elaborate on the \"nearjoey\" option below? +> (not copies=nearjoey:1) + +Are you able to assign a \"nearjoey\" flag to multiple annexes? +"""]] diff --git a/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_2_ef5ee5933fcadcb81cc81b816db14bda._comment b/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_2_ef5ee5933fcadcb81cc81b816db14bda._comment new file mode 100644 index 000000000..0da13b735 --- /dev/null +++ b/doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_2_ef5ee5933fcadcb81cc81b816db14bda._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 2" + date="2012-10-19T17:07:08Z" + content=""" +Yes, using the group command. +"""]] diff --git a/doc/design/assistant/blog/day_109__dropping.mdwn b/doc/design/assistant/blog/day_109__dropping.mdwn new file mode 100644 index 000000000..210f71f55 --- /dev/null +++ b/doc/design/assistant/blog/day_109__dropping.mdwn @@ -0,0 +1,16 @@ +Got unwanted content to be dropped from the local repo, as well as remotes +when doing the expensive scan. I kept the scan a single pass for now, +need to revisit that later to drop content before transferring more. +Also, when content is downloaded or uploaded, this can result in it +needing to be dropped from somewhere, and the assistant handles that too. + +There are some edge cases with hypothetical, very weird preferred +content expressions, where the assistant won't drop content right away. +(But will later in the expensive scan.) Other than those, I think I have +nearly all content dropping sorted out. The only common case I know of where +unwanted content is not dropped by the assistant right away is when a file +is renamed (eg, put in a "Trash" directory). + +In other words, repositories put into the transfer group will now work as +described, only retaining content as long as is needed to distribute it to +clients. Big milestone! diff --git a/doc/design/assistant/blog/day_10__lsof.mdwn b/doc/design/assistant/blog/day_10__lsof.mdwn new file mode 100644 index 000000000..d4217677f --- /dev/null +++ b/doc/design/assistant/blog/day_10__lsof.mdwn @@ -0,0 +1,54 @@ +A rather frustrating and long day coding went like this: + +## 1-3 pm + +Wrote a single function, of which all any Haskell programmer needs to know +is its type signature: + + Lsof.queryDir :: FilePath -> IO [(FilePath, LsofOpenMode, ProcessInfo)] + +When I'm spending another hour or two taking a unix utility like lsof and +parsing its output, which in this case is in a rather complicated +machine-parsable output format, I often wish unix streams were strongly +typed, which would avoid this bother. + +## 3-9 pm + +Six hours spent making it defer annexing files until the commit thread +wakes up and is about to make a commit. Why did it take so horribly long? +Well, there were a number of complications, and some really bad bugs +involving races that were hard to reproduce reliably enough to deal with. + +In other words, I was lost in the weeds for a lot of those hours... + +At one point, something glorious happened, and it was always making exactly +one commit for batch mode modifications of a lot of files (like untarring +them). Unfortunately, I had to lose that gloriousness due to another +potential race, which, while unlikely, would have made the program deadlock +if it happened. + +So, it's back to making 2 or 3 commits per batch mode change. I also have a +buglet that causes sometimes a second empty commit after a file is added. +I know why (the inotify event for the symlink gets in late, +after the commit); will try to improve commit frequency later. + +## 9-11 pm + +Put the capstone on the day's work, by calling lsof on a directory full +of hardlinks to the files that are about to be annexed, to check if any +are still open for write. + +This works great! Starting up `git annex watch` when processes have files +open is no longer a problem, and even if you're evil enough to try having +multiple processes open the same file, it will complain and not annex it +until all the writers close it. + +(Well, someone really evil could turn the write bit back on after git annex +clears it, and open the file again, but then really evil people can do +that to files in `.git/annex/objects` too, and they'll get their just +deserts when `git annex fsck` runs. So, that's ok..) + +---- + +Anyway, will beat on it more tomorrow, and if all is well, this will finally +go out to the beta testers. diff --git a/doc/design/assistant/blog/day_10__lsof/comment_1_9b8c28c85c979f32e5c295b6a03c048e._comment b/doc/design/assistant/blog/day_10__lsof/comment_1_9b8c28c85c979f32e5c295b6a03c048e._comment new file mode 100644 index 000000000..9d970da22 --- /dev/null +++ b/doc/design/assistant/blog/day_10__lsof/comment_1_9b8c28c85c979f32e5c295b6a03c048e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="comment 1" + date="2012-06-16T09:14:26Z" + content=""" +maybe at some point, your tool could show \"warning, the following files are still open and are hence not being annexed\" +to avoid any nasty surprises of a file not being annexed and the user not realizing it. +"""]] diff --git a/doc/design/assistant/blog/day_110__more_dropping.mdwn b/doc/design/assistant/blog/day_110__more_dropping.mdwn new file mode 100644 index 000000000..afa256c77 --- /dev/null +++ b/doc/design/assistant/blog/day_110__more_dropping.mdwn @@ -0,0 +1,55 @@ +Got preferred content checked when files are moved around. +So, in repositories in the default client group, if you make a +"archive" directory and move files to it, the assistant will drop +their content (when possible, ie when it's reached an archive or backup). +Move a file out of an archive directory, and the assistant will get its +content again. Magic. + +Found an intractable bug, obvious in retrospect, with the git-annex branch +read cache, and had to remove that cache. I have not fully determined +if this will slow down git-annex in some use cases; might need to add more +higher-level caching. It was a very minimal cache anyway, just of one file. + +Removed support for "in=" from preferred content expressions. That was +problimatic in two ways. First, it referred to a remote by name, but +preferred content expressions can be evaluated elsewhere, where that remote +doesn't exist, or a different remote has the same name. This name lookup +code could error out at runtime. Secondly, "in=" seemed pretty useless, and +indeed counterintuitive in preferred content expressions. "in=here" did not +cause content to be gotten, but it did let present content be dropped. +Other uses of "in=" are better handled by using groups. + +In place of "in=here", preferred content expressions can now use "present", +which is useful if you want to disable automatic getting or dropping of +content in some part of a repository. Had to document that "not present" +is not a good thing to use -- it's unstable. Still, I find "present" handy +enough to put up with that wart. + +Realized last night that the code I added to the TransferWatcher +to check preferred content once a transfer is done is subject to a race; +it will often run before the location log gets updated. Haven't found a good +solution yet, but this is something I want working now, so I did put in a +quick delay hack to avoid the race. Delays to avoid races are never a real +solution, but sometimes you have to TODO it for later. + +---- + +Been thinking about how to make the assistant notice changes to configuration +in the git-annex branch that are merged in from elsewhere while it's running. +I'd like to avoid re-reading unchanged configuration files after each merge +of the branch. + +The most efficient way would be to reorganise the git-annex branch, moving +config files into a configs directory, and logs into a logs directory. Then it +could `git ls-tree git-annex configs` and check if the sha of the configs +directory had changed, with git doing minimal work +(benchmarked at 0.011 seconds). + +Less efficiently, keep the current git-annex branch layout, and +use: `git ls-tree git-annex uuid.log remote.log preferred-content.log group.log trust.log` +(benchmarked at 0.015 seconds) + +Leaning toward the less efficient option, with a rate limiter so it +doesn't try more often than once every minute. Seems reasonable for it to +take a minute for config changes take effect on remote repos, even +if the assistant syncs file changes to them more quickly. diff --git a/doc/design/assistant/blog/day_111__config_monitor.mdwn b/doc/design/assistant/blog/day_111__config_monitor.mdwn new file mode 100644 index 000000000..8addf54ae --- /dev/null +++ b/doc/design/assistant/blog/day_111__config_monitor.mdwn @@ -0,0 +1,18 @@ +Added yet another thread, the ConfigMonitor. Since that thread needs to run +code to reload cached config values from the git-annex branch when files +there change, writing it also let me review where config files are cached, +and I found that every single config file in the git-annex branch does +get cached, with the exception of the uuid.log. So, added a cache for that, +and now I'm more sanguine about yesterday's removal of the lower-level +cache, because the only thing not being cached is location log information. + +The ConfigMonitor thread seems to work, though I have not tested it +extensively. The assistant should notice and apply config changes +made locally, as well as any config changes pushed in from remotes. +So, for example, if you add a S3 repo in the webapp, and are paired with +another computer, that one's webapp will shortly include the new repo in +its list. And all the preferred content, groups, etc settings will +propigate over and be used as well. + +Well ... almost. Seems nothing causes git-annex branch changes to be +pushed, until there's some file change to sync out. diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different.mdwn b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different.mdwn new file mode 100644 index 000000000..b7d72a275 --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different.mdwn @@ -0,0 +1,50 @@ +Time to solve the assistant's [[cloud]] notification problem. This is +really the last big road-bump to making it be able to sync computers +across the big, bad internet. + +So, IRC still seems a possibility, but I'm going to try XMPP first. Since +Google Talk uses XMPP, it should be easy for users to get an account, and +it's also easy to run your own XMPP server. + +Played around with the Haskell XMPP library. Clint helpfully showed me an +example of a simple client, which helped cut through that library's thicket +of data types. In short order I had some clients that were able to see each +other connecting to my personal XMPP server. On to some design.. + +1. I want to avoid user-visible messages. + (dvcs-autosync also uses XMPP, but I checked the code and it + seems to send user-visible messages, so I diverge from its lead here.) + This seems very possible, only a matter of finding the right + way to use the protocol, or an appropriate and widely deployed extension. + The only message I need to send with XMPP, really, is "I have pushed to our + git repo". One bit of data would do; being able to send a UUID of the repo + that did the update would be nice. + +2. I'd also like to broadcast my notification to a user's buddies. + dvcs-autosync sends only self-messages, but that requires every node + have the same XMPP account configured. While I want to be able to run + in that mode, I also want to support pairs of users who have their own XMPP + accounts, that are buddied up in XMPP. + +3. To add to the fun, the assistant's use of XMPP should not make that XMPP + account appear active to its buddies. Users should not need a dedicated + XMPP account for git-annex, and always seeming to be available when + git-annex is running would not be nice. + +The first method I'm trying out is to encode the notification +data inside a XMPP presence broadcast. This should meet all three +requirements. The plan is two send two +presence messages, the first marks the client as available, and the second +as unavailable again. +The "id" attribute will be set to some +value generated by the assistant. That attribute is allowed on presence +messages, and servers are [required to preserve it](http://xmpp.org/rfcs/rfc6121.html#presence-probe-inbound-id) +while the client is connected. +(I'd only send unavailable messages, but while +that worked when I tested it using the prosody server, with google talk, +repeated unavailable messages were suppressed. Also, google talk does not +preserve the "id" attribute of unavailable presence messages.) + +If this presence hackery doesn't work out, I could try +[XEP-0163: Personal Eventing Protocol](http://xmpp.org/extensions/xep-0163.html). +But I like not relying on any extensions. diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment new file mode 100644 index 000000000..26514601b --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmQ4Oe5-qOANRuZel9kDvtBfQG1zlEcIzw" + nickname="Dominik" + subject="PEP is ok" + date="2012-10-24T05:15:38Z" + content=""" +PEP and pubsub are really widely used. You will have a hard time finding a server that doesn't support it. + +Also note XMPPs ability to send status to only selected buddies and even resources. You can globally appear as offline while sending availability to myownjid@example.com/thatannexthere. +"""]] diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_2_c5a734f611ecc95729904e645583ee43._comment b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_2_c5a734f611ecc95729904e645583ee43._comment new file mode 100644 index 000000000..2b85707a9 --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_2_c5a734f611ecc95729904e645583ee43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmQ4Oe5-qOANRuZel9kDvtBfQG1zlEcIzw" + nickname="Dominik" + subject="Remote control clients" + date="2012-10-24T05:18:02Z" + content=""" +Then of course there is XEP-0146, which has some advantages to it, like controlling annex from the context menu of another Jabber client. +"""]] diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment new file mode 100644 index 000000000..5c6c161ff --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 3" + date="2012-10-24T22:44:41Z" + content=""" +Google talk does not seem to support PEP. At least, I'm sending something that prosody accepts and that looks like the example at , and it replies with an IQ Error. +"""]] diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_4_1fe036e4c65fb4211aa2c394f535344a._comment b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_4_1fe036e4c65fb4211aa2c394f535344a._comment new file mode 100644 index 000000000..d19b70189 --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_4_1fe036e4c65fb4211aa2c394f535344a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaM3-vbAh5B8tY_IL3yh31ik6cAVsgoPw" + nickname="IC" + subject="Haskell XMPP" + date="2012-10-27T05:54:53Z" + content=""" +Which xmpp library you've decided to use? +"""]] diff --git a/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_5_e4ba3568c4efd98f212dd47427a1cf47._comment b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_5_e4ba3568c4efd98f212dd47427a1cf47._comment new file mode 100644 index 000000000..272970caa --- /dev/null +++ b/doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_5_e4ba3568c4efd98f212dd47427a1cf47._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 5" + date="2012-10-27T06:08:44Z" + content=""" +I'm using http://hackage.haskell.org/package/network-protocol-xmpp + +While its author thinks \"its current design (session in an XMPP monad) is a failed mistake\", I've found it pretty good. Aside from the segfault problem, which we got fixed today. +"""]] diff --git a/doc/design/assistant/blog/day_113__notifier_work.mdwn b/doc/design/assistant/blog/day_113__notifier_work.mdwn new file mode 100644 index 000000000..920b48dfe --- /dev/null +++ b/doc/design/assistant/blog/day_113__notifier_work.mdwn @@ -0,0 +1,22 @@ +Built out the XMPP push notifier; around 200 lines of code. +Haven't tested it yet, but it just might work. It's in the `xmpp` branch +for now. + +I decided to send the UUID of the repo that was pushed to, otherwise +peers would have to speculatively pull from every repo. A wrinkle in this +is that not all git repos have a git-annex UUID. So it might notify that +a push was sent to an unidentified repo, and then peers need to pull from +every such repo. In the common case, there will only be one or a few such +repos, at someplace like at github that doesn't support git-annex. I could +send the URL, but there's no guarantee different clients have the same +URLs for a git remote, and also sending the URL leaks rather more data than +does a random UUID. + +Had a bit of a scare where it looked like I couldn't use the haskell +`network-protocol-xmpp` package together with the `mtl` package that +git-annex already depends on. With help from #haskell I found the way +to get them co-existing, by using the PackageImports extension. Whew! + +Need to add configuration of the XMPP server to use in the webapp, and +perhaps also a way to create `.git/annex/creds/notify-xmpp` from the +command line. diff --git a/doc/design/assistant/blog/day_114__xmpp.mdwn b/doc/design/assistant/blog/day_114__xmpp.mdwn new file mode 100644 index 000000000..617824d48 --- /dev/null +++ b/doc/design/assistant/blog/day_114__xmpp.mdwn @@ -0,0 +1,56 @@ +Had to toss out my XMPP presence hack. Turns out that, at least in Google +Talk, presence info is not sent to clients that have marked themselves +unavailable, and that means the assistant would not see notifications, as it +was nearly always marked unavailable as part of the hack. + +I tried writing a test program that uses XMPP personal eventing, only +to find that Google Talk rejected my messages. I'm not 100% sure my +messages were right, but I was directly copying the example in the RFC, +and prosody accepted them. I could not seem to get a list of extensions out +of Google Talk either, so I don't know if it doesn't support personal +eventing, or perhaps only supports certian specific types of events. + +So, plan C... using XMPP [presence extended content](http://xmpp.org/rfcs/rfc6121.html#presence-extended). +The assistant generates a presence message tagged "xa" (Extended Away), +which hopefully will make it not seem present to clients. +And to that presence message, I add my own XML element: + + + +This is all entirely legal, and not at all a hack. +(Aside from this not really being presence info.) Isn't XML fun? + +And plan C works, with Google Talk, and prosody. I've successfully gotten +push notifications flowing over XMPP! + +---- + +Spent some hours dealing with an unusual probolem: git-annex started +segfaulting intermittently on startup with the new XMPP code. + +Haskell code is not supposed to segfault.. + +I think this was probably due to not using a bound thread for XMPP, +so if haskell's runtime system recheduled its green thread onto a different +OS thread during startup, when it's setting up TLS, it'd make gnuTLS very +unhappy. + +So, fixed it to use a bound thread. Will wait and see if the crash is gone. + +---- + +Re-enabled DBUS support, using a new version of the library that avoids the +memory leak. Will need further changes to the library to support +reconnecting to dbus. + +---- + +Next will be a webapp configuration UI for XMPP. Various parts of the +webapp will direct the user to set up XMPP, when appropriate, especially +when the user sets up a cloud remote. + +To make XMPP sufficiently easy to configure, I need to check SRV records to +find the XMPP server, which is an unexpected PITA because `getaddrinfo` +can't do that. There are several haskell DNS libraries that I could use for +SRV, or I could use the `host` command: +`host -t SRV _xmpp-client._tcp.gmail.com` diff --git a/doc/design/assistant/blog/day_114__xmpp/comment_1_c2b0617a2fc3dc4f19a6be6947913842._comment b/doc/design/assistant/blog/day_114__xmpp/comment_1_c2b0617a2fc3dc4f19a6be6947913842._comment new file mode 100644 index 000000000..a391435c4 --- /dev/null +++ b/doc/design/assistant/blog/day_114__xmpp/comment_1_c2b0617a2fc3dc4f19a6be6947913842._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="How to deal with offline messages being eaten?" + date="2012-11-09T14:05:30Z" + content=""" +How do you avoid eating up normal text messages when git-annex is the only client left? Granted, Google Talk does some additional magic so that it shows you the history when connecting with the web page client. But with other servers it would be inconvenient if new messages weren't saved as offline messages but sent to the dæmon instead. +"""]] diff --git a/doc/design/assistant/blog/day_114__xmpp/comment_2_d14375dfb5791615802dab3c5438f8e2._comment b/doc/design/assistant/blog/day_114__xmpp/comment_2_d14375dfb5791615802dab3c5438f8e2._comment new file mode 100644 index 000000000..716f7d99a --- /dev/null +++ b/doc/design/assistant/blog/day_114__xmpp/comment_2_d14375dfb5791615802dab3c5438f8e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 2" + date="2012-11-09T21:55:42Z" + content=""" +It does try to mark itself as extended away, but yes, I think this is a potential concern. If you find the assistant interacts badly with your other clients, you can certainly give it its own XMPP account. +"""]] diff --git a/doc/design/assistant/blog/day_114__xmpp/comment_3_6d72ea32c111e605be30ad2153fc71c9._comment b/doc/design/assistant/blog/day_114__xmpp/comment_3_6d72ea32c111e605be30ad2153fc71c9._comment new file mode 100644 index 000000000..6d2147d37 --- /dev/null +++ b/doc/design/assistant/blog/day_114__xmpp/comment_3_6d72ea32c111e605be30ad2153fc71c9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 3" + date="2012-11-10T18:50:46Z" + content=""" +Sure, I could, as I'm operating my own server anyway. Others might not be willing to go to some random server and create another account, though. + +Reviewing RFC 6121: Did you try negative priorities for your resources already? It's possible that Gtalk does something weird but in theory they should be ignored for messages directed to non-qualified JIDs (i.e. without an explicit resource setting). Setting \"xa\" alone won't help you anything, it will only cause the others to see you as \"xa\" but that's a perfectly valid common chat status where you expect messages to be queued in the client until the user returns. +"""]] diff --git a/doc/design/assistant/blog/day_114__xmpp/comment_4_e51d6f854db5f9e74a1aa58bd8923795._comment b/doc/design/assistant/blog/day_114__xmpp/comment_4_e51d6f854db5f9e74a1aa58bd8923795._comment new file mode 100644 index 000000000..7320d0365 --- /dev/null +++ b/doc/design/assistant/blog/day_114__xmpp/comment_4_e51d6f854db5f9e74a1aa58bd8923795._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 4" + date="2012-11-10T19:48:01Z" + content=""" +I hadn't tried it, but it looks like a very good idea. I will have to change my protocol a little bit as I currently sometimes send chat messages not directed to a specific client, in order to reach any clients using an account. To reach clients with a negative priority, chat messages have to be directed at the client. + +Ok, done; priority is set to -1 and all the XMPP messaging in git-annex still seems to work! + +I don't know though, that this entirely solves the problem. In particular, a regular xmpp client may decide to direct a chat message at a git-annex client, due to that being the only client connected. If this does become a problem, I suppose git-annex could buffer and re-send such messages when it sees a regular client connect. Or it could show them in the webapp, but that seems feature creep. +"""]] diff --git a/doc/design/assistant/blog/day_115__my_new_form.mdwn b/doc/design/assistant/blog/day_115__my_new_form.mdwn new file mode 100644 index 000000000..d44565084 --- /dev/null +++ b/doc/design/assistant/blog/day_115__my_new_form.mdwn @@ -0,0 +1,17 @@ +Built a SRV lookup library that can use either `host` or ADNS. + +Worked on DBUS reconnection some more; found a FD leak in the dbus library, +and wrote its long-suffering author, John Millikin (also the XMPP library +author, so I've been bothering him a lot lately), who once again came +through with a quick fix. + +Built a XMPP configuration form, that tests the connection to the server. +Getting the wording right on this was hard, and it's probably still not +100% right. + +[[!img /assistant/xmpp.png]] + +Pairing over XMPP is something I'm still thinking about. It's +contingent on tunneling git over XMPP (actually not too hard), +and getting a really secure XMPP connection (needs library improvements, +as the library currently accepts any SSL certificate). diff --git a/doc/design/assistant/blog/day_116__the_segfault.mdwn b/doc/design/assistant/blog/day_116__the_segfault.mdwn new file mode 100644 index 000000000..47633454a --- /dev/null +++ b/doc/design/assistant/blog/day_116__the_segfault.mdwn @@ -0,0 +1,25 @@ +Continuing to flail away at this XMPP segfault, which turned out not to be +fixed by bound threads. I managed to make a fairly self-contained and small +reproducible test case for it that does not depend on the network. +Seems the bug is gonna be either in the Haskell binding for GNUTLS, +or possibly in GNUTLS itself. + +Update: John was able to fix it using my testcase! It was a GNUTLS +credentials object that went out of scope and got garbage collected. +I think I was seeing the crash only with the threaded runtime because +it has a separate garbage collection thread. + +---- + +Arranged for the XMPP thread to restart when network connections +change, as well as when the webapp configures it. + +Added an alert to nudge users to enable XMPP. It's displayed after adding a +remote in the cloud. + +[[!img /assistant/xmppnudge.png]] + +---- + +So, the first stage of XMPP is done. But so far all it does is push +notification. Much more work to do here. diff --git a/doc/design/assistant/blog/day_117__new_topologies.mdwn b/doc/design/assistant/blog/day_117__new_topologies.mdwn new file mode 100644 index 000000000..f62da3c5b --- /dev/null +++ b/doc/design/assistant/blog/day_117__new_topologies.mdwn @@ -0,0 +1,41 @@ +Back in [[day_85__more_foundation_work]], I wrote: + +> I suspect, but have not proven, +> that the assistant is able to keep repos arranged in any shape of graph in +> sync, as long as it's connected (of course) and each connection is +> bi-directional. [And each node is running the assistant.] + +After today's work, many more graph topologies can be kept in sync -- the +assistant now can keep repos in sync that are not directly connected, but +must go through a central transfer point, which does not run the assistant +at all. Major milestone! + +To get that working, as well as using XMPP push notifications, it turned +out to need to be more agressive about pushing out changed location log +information. And, it seems, that was the last piece that was missing. +Although I narrowly avoided going down a blind alley involving sending +transfer notifications over XMPP. Luckily, I came to my senses. + +---- + +This month's focus was the cloud, and the month is almost done. And now +the assistant can, indeed be used to sync over the cloud! I would have +liked to have gotten on to implementing Amazon Glacier or Google Drive +support, but at least the cloud fundamentals are there. + +Now that I have XMPP support, I'm tending toward going ahead and adding +XMPP pairing, and git push over XMPP. This will open up lots of excellent +use cases. + +So, how to tunnel git pushes over XMPP? Well, `GIT_SHELL` can be set to +something that intercepts the output of `git-send-pack` and +`git-receive-pack`, and that data can be tunneled through XMPP to connect +them. Probably using XMPP ping. +(XEP-0047: In-Band Bytestreams would be the right way ... +but of course Google Talk doesn't support that extension.) + +XMPP requires ugly encoding that will bloat the data, but the data +quantities are fairly small to sync up a few added or moved files +(of course, we'll not be sending file contents over XMPP). Pairing with +an large git repository over XMPP will need rather more bandwidth, +of course. diff --git a/doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn b/doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn new file mode 100644 index 000000000..758b26974 --- /dev/null +++ b/doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn @@ -0,0 +1,15 @@ +Spent most of the past day moving the assistant into a monad of its own +that encapsulates all the communications channels for its threads. This +involved modifiying nearly every line of code in the whole assistant. + +Typical change: + +[[!format haskell """ +handleConnection threadname st dstatus scanremotes pushnotifier = do + reconnectRemotes threadname st dstatus scanremotes (Just pushnotifier) + =<< networkRemotes st + +handleConnection = reconnectRemotes True =<< networkRemotes +"""]] + +So, it's getting more readable.. diff --git a/doc/design/assistant/blog/day_119__time_for_testing.mdwn b/doc/design/assistant/blog/day_119__time_for_testing.mdwn new file mode 100644 index 000000000..adf1d0d41 --- /dev/null +++ b/doc/design/assistant/blog/day_119__time_for_testing.mdwn @@ -0,0 +1,12 @@ +Finished working the new assistant monad into all the assistant's code. +I've changed 1870 lines of code in the past two days. It feels like more. +While the total number of lines of code has gone up by around 100, the +actual code size has gone *down*; the monad allowed dropping 3.4 kilobytes +of manual variable threading complications. Or around 1% of a novel edited +away, in other words. + +I don't seem to have broken anything, but I'm started an extensive test +of all the assistant and webapp. So far, the bugs I've found were not +introduced by my monadic changes. Fixed several bugs around adding +removable drives, and a few other minor bugs. Plan to continue testing +tomorrow. diff --git a/doc/design/assistant/blog/day_11__freebsd.mdwn b/doc/design/assistant/blog/day_11__freebsd.mdwn new file mode 100644 index 000000000..92a3ef289 --- /dev/null +++ b/doc/design/assistant/blog/day_11__freebsd.mdwn @@ -0,0 +1,50 @@ +I've been investigating how to make `git annex watch` work on +FreeBSD, and by extension, OSX. + +One option is kqueue, which works on both operating systems, and allows +very basic monitoring of file changes. There's also an OSX specific +hfsevents interface. + +Kqueue is far from optimal for `git annex watch`, because it provides even +less information than inotify (which didn't really provide everything I +needed, thus the lsof hack). Kqueue doesn't have events for files being +closed, only an event when a file is created. So it will be difficult for +`git annex watch` to know when a file is done being written to and can be +annexed. git annex will probably need to run lsof periodically to check when +recently added files are complete. (hsevents shares this limitation) + +Kqueue also doesn't provide specific events when a file or directory is +moved. Indeed, it doesn't provide specific events about what changed at +all. All you get with kqueue is a generic "oh hey, the directory you're +watching changed in some way", and it's up to you to scan it to work out +how. So git annex will probably need to run `git ls-tree --others` +to find changes in the directory tree. This could be expensive with large +trees. (hsevents has per-file events on current versions of OSX) + +Despite these warts, I want to try kqueue first, since it's more portable +than hfsevents, and will surely be easier for me to develop support for, +since I don't have direct access to OSX. + +So I went to a handy Debian kFreeBSD porter box, and tried some kqueue +stuff to get a feel for it. I got a python program that does basic +directory monitoring with kqueue to work, so I know it's usable there. + +Next step was getting kqueue working from Haskell. Should be easy, there's +a Haskell library already. I spent a while trying to get it to work on +Debian kFreeBSD, but ran into a +[problem](https://github.com/hesselink/kqueue/issues/1) that could be +caused by the Debian kFreeBSD being different, or just a bug in the Haskell +library. I didn't want to spend too long shaving this yak; I might install +"real" FreeBSD on a spare laptop and try to get it working there instead. + +But for now, I've dropped down to C instead, and have a simple C program +that can monitor a directory with kqueue. Next I'll turn it into a simple +library, which can easily be linked into my Haskell code. The Haskell code +will pass it a set of open directory descriptors, and it'll return the +one that it gets an event on. This is necessary because kqueue doesn't +recurse into subdirectories on its own. + +I've generally had good luck with this approach to adding stuff in Haskell; +rather than writing a bit-banging and structure packing low level interface +in Haskell, write it in C, with a simpler interface between C and +Haskell. diff --git a/doc/design/assistant/blog/day_120__test_day.mdwn b/doc/design/assistant/blog/day_120__test_day.mdwn new file mode 100644 index 000000000..548222989 --- /dev/null +++ b/doc/design/assistant/blog/day_120__test_day.mdwn @@ -0,0 +1,2 @@ +Did a lot of testing, found and fixed 4 bugs with repository setup +configurators. None of them were caused by the recent code reworking. diff --git a/doc/design/assistant/blog/day_121__buddy_list.mdwn b/doc/design/assistant/blog/day_121__buddy_list.mdwn new file mode 100644 index 000000000..48ea1ffda --- /dev/null +++ b/doc/design/assistant/blog/day_121__buddy_list.mdwn @@ -0,0 +1,10 @@ +Got the XMPP client maintaining a list of buddies, including tracking which +clients are present and away, and which clients are recognised as other +git-annex assistant clients. This was fun, it is almost all pure +functional code, which always makes me happy. + +Started building UI for XMPP pairing. So far, I have it showing a list of +buddies who are also running git-annex (or not). The list even refreshes +in real time as new buddies come online. + +[[!img /assistant/buddylist.png]] diff --git a/doc/design/assistant/blog/day_122__xmpp_pairing.mdwn b/doc/design/assistant/blog/day_122__xmpp_pairing.mdwn new file mode 100644 index 000000000..868382725 --- /dev/null +++ b/doc/design/assistant/blog/day_122__xmpp_pairing.mdwn @@ -0,0 +1,29 @@ +Reworked my XMPP code, which was still specific to push notification, into +a more generic XMPP client, that's based on a very generic NetMessager +class, that the rest of the assistant can access without knowing anything +about XMPP. + +Got pair requests flowing via XMPP ping, over Google Talk! And when the +webapp receives a pair request, it'll pop up an alert to respond. The rest +of XMPP pairing should be easy to fill in from here. + +To finish XMPP pairing, I'll need git pull over XMPP, which is nontrivial, +but I think I know basically how to do. And I'll need some way to represent +an XMPP buddy as a git remote, which is all that XMPP pairing will really +set up. + +It could be a git remote using an `xmpp:user@host` URI for the git url, but +that would confuse regular git to no end (it'd think it was a ssh host), +and probably need lots of special casing in the parts of git-annex that +handle git urls too. Or it could be a git remote without an url set, and +use another config field to represent the XMPP data. But then git wouldn't +think it was a remote at all, which would prevent using "git pull +xmppremote" at all, which I'd like to be able to use when implementing git +pull over XMPP. + +Aha! The trick seems to be to leave the url unset in git config, +but temporarily set it when pulling: + + GIT_SSH=git-annex git git -c remote.xmppremote.url=xmpp:client pull xmppremote + +Runs git-annex with "xmpp git-upload-pack 'client'".. Just what I need. diff --git a/doc/design/assistant/blog/day_122__xmpp_pairing/comment_1_e95efb23eb2e67e3f11a5c7de56424a7._comment b/doc/design/assistant/blog/day_122__xmpp_pairing/comment_1_e95efb23eb2e67e3f11a5c7de56424a7._comment new file mode 100644 index 000000000..990fa816e --- /dev/null +++ b/doc/design/assistant/blog/day_122__xmpp_pairing/comment_1_e95efb23eb2e67e3f11a5c7de56424a7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.219.28.34" + subject="git-remote-helpers" + date="2012-11-09T08:54:11Z" + content=""" +It seems that xmpp::user@host (with double colon) would cause git to try to use a remote-xmpp helper. +Wouldn't it be a way to have the remote address (if not really URL) set and not be treated as ssh? + +"""]] diff --git a/doc/design/assistant/blog/day_122__xmpp_pairing/comment_2_30e251e73146512bde8b2f69eddeef2e._comment b/doc/design/assistant/blog/day_122__xmpp_pairing/comment_2_30e251e73146512bde8b2f69eddeef2e._comment new file mode 100644 index 000000000..256b91242 --- /dev/null +++ b/doc/design/assistant/blog/day_122__xmpp_pairing/comment_2_30e251e73146512bde8b2f69eddeef2e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 2" + date="2012-11-09T17:41:08Z" + content=""" +Thanks, I think that's exactly what I should do. +"""]] diff --git a/doc/design/assistant/blog/day_123__xmpp_insanity.mdwn b/doc/design/assistant/blog/day_123__xmpp_insanity.mdwn new file mode 100644 index 000000000..bfbc30669 --- /dev/null +++ b/doc/design/assistant/blog/day_123__xmpp_insanity.mdwn @@ -0,0 +1,49 @@ +Spent about 5 hours the other night in XMPP hell. At every turn Google Talk +exhibited behavior that may meet the letter of the XMPP spec (or not), but +varies between highly annoying and insane. + +By "insane", I mean this: If a presence message is directed from one client +to another client belonging to that same user, randomly leaking that message +out to other users who are subscribed is just a security hole waiting to +happen. + +Anyway, I came out of that with a collection of hacks that worked, but I +didn't like. I was using directed presence for buddy-to-buddy pairing, and +an IQ message hack for client-to-client pairing. + +Today I got chat messages working instead, for both sorts of pairing. These +chat messages have an empty body, which *should* prevent clients from +displaying them, but they're sent directed to only git-annex clients +anyway. + +---- + +And XMPP pairing 100% works now! Of course, it doesn't know how to git pull +over XMPP yet, but everything else works. + +Here's a real `.git/config` generated by the assistant after XMPP pairing. + + [remote "joey"] + url = + fetch = +refs/heads/*:refs/remotes/joey/* + annex-uuid = 14f5e93e-1ed0-11e2-aa1c-f7a45e662d39 + annex-xmppaddress = joey@kitenet.net + +---- + +Fixed a typo that led to an infinite loop when adding a ssh git repo with the +assistant. Only occurred when an absolute directory was specified, which +is why I didn't notice it before. + +---- + +Security fix: Added a `GIT_ANNEX_SHELL_DIRECTORY` environment variable that +locks down git-annex-shell to operating in only a single directory. The +assistant sets that in ssh `authorized_keys` lines it creates. This +prevents someone you pair with from being able to access any other git or +git-annex repositories you may have. + +---- + +Next up, more craziness. But tomorrow is Nov 6th, so you in the US already +knew that.. diff --git a/doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn b/doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn new file mode 100644 index 000000000..ecb6023f2 --- /dev/null +++ b/doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn @@ -0,0 +1,28 @@ +Laying the groundwork for git push over XMPP. BTW, the motivation for doing +this now is that if the assistant can push git data peer-to-peer, users +who are entirely using the cloud don't need to set up a git repo in the +cloud somewhere. Instead, a single special remote in the cloud will be all +they need. So this is a keystone in the assistant's cloud support. + +I'm building the following pipeline: + + git push <--> git-annex xmppgit <--> xmppPush <-------> xmpp + | + git receive-pack <--> xmppReceivePack <---------------> xmpp + +A tricky part of this is `git-annex xmppgit`, which is run by `git push` +rather than the usual `ssh`. Rather than speak XMPP itself, that feeds the +data through the assistant daemon, using some special FDs that are set +up by the assistant when it runs `git push`, and communicated via +environment variables. I hoped to set up a pipe and not need it to do any +work on its own, but short of using the linux-specific `splice(2)`, that +doesn't seem possible. It also will receive the exit status of +`git receive-pack` and propigate it to `git push`. + +Also built the IO sides of `xmppPush` and `xmppReceivePack` although these +are not tested. The XMPP sides of them come next. + +---- + +Stuffing lots of git-annex branded USB keys into envelopes tonight, while +watching the election coverage. diff --git a/doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn b/doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn new file mode 100644 index 000000000..010ab14da --- /dev/null +++ b/doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn @@ -0,0 +1,15 @@ +I've finished building the XMMP side of git push over XMPP. Now I only +have to add code to trigger these pushes. And of course, fix all the bugs, +since none of this has been tested at all. + +Had to deal with some complications, like handling multiple clients that +all want to push at the same time. Only one push is handled at a time; +messages for others are queued. Another complication I don't deal with yet +is what to do if a client stops responding in the middle of a push. It +currently will wait forever for a message from the client; instead it +should time out. + +---- + +Jimmy got the OSX builder working again, despite my best attempts to add +dependencies and break it. diff --git a/doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn b/doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn new file mode 100644 index 000000000..78d263b6d --- /dev/null +++ b/doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn @@ -0,0 +1,52 @@ +I'm stunned and stoked to have gotten git push over XMPP working today. +And am nearly out of steam, it was a wild ride.. + + To xmpp::joey@kitenet.net + * [new branch] master -> refs/xmpp/newmaster + +The surprising part is how close my initial implementation came to just +working on the first try. It had around 3 bugs, which took hours of staring +at debugging output to find: + +1. The git push action was run in the same thread as the XMPP + client, which prevented the client from continuing to run and relaying + messages. +2. The git-receive-pack side waited on the wrong thread, so didn't + notice when the program was done. +3. I accidentially used the wrong attribute name when sending a ReceivePackDone + message. + +But all in all, it just worked. + +Here's a sample of the actual data sent when one file is added to the +repository (also includes the corresponding update to the git-annex branch): + + MDA4NjhhMmNmOGZjMWE3MTlkOGVjOWVmOWZiMGZiNjVlODc2NjQ1NDAyMTAgODIwNTZjMDM4 + ZjU2YzE1ODdjYzllOWRhNzQzMzU0YjE4NzNjZWJlOSByZWZzL3htcHAvbmV3bWFzdGVyACBy + ZXBvcnQtc3RhdHVzIHNpZGUtYmFuZC02NGswMDAw + + UEFDSwAAAAIAAAADnAx4nJXLTQ4CIQxA4T2n4AKaAqVAYoxL4y2gU+Jo5iczdeHtnSu4eMm3 + ebqJ2NwgSCLmNkTBlKFCYwwhoHOtQ+scqZCwWesms9pcPffc2dXkypCFi/TSG/RGUXIiwojg + HZj60eey2cciX3uXfbeX18Hbe1SZRc9HV+tC9FgyJW9PgACGl2kaVeXfz/wArHQ81qMGeJwz + NDIAAoVUI4ZZB9RW1E8NtXp5t77/fn3hw41cl2MNIbIZqTk5+Qwerw+aJX2INjsffYndtdCz + 5mZWLDdUQV5qeVpmDtCQnx/3/6s40+Q4P/7O+Y4ShS+1Ad83AwC6CirftAt4nK3MsRGDMAwF + 0IkcSVgSdpkidzRUmcDWBy4pSAEFl+mzRN4A77a9Tmr7vlz06e8lzoPmmb5Mz+k+mD/SkTkl + eFHPq9eqQ+nSzFsWaDFnFmCMCEOvHgLrCrQxS7AWdvUVhv9uPwHxMbfumlvWdco1RLL4wSQF + g0uFFOKu3Q== + +Git said this push took 385 bytes; after base64 encoding to transport it over +XMPP as shown above, it needs 701 bytes, and the XMPP envelope and encryption +adds more overhead (although the XMPP connection may also be compressed?) + +Not the most efficient git transport, but still a practical one! + +---- + +Big thanks by the way to meep, who posted a comment reminding me about +`git-remote-helpers`. This was the right thing to use for XMPP over git, +it lets the git remote be configured with `url = xmpp::user@host`. + +---- + +Next, I need to get the assistant to use this for syncing. Currently, it only +pushes a test branch. diff --git a/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_1_ee1361e6b235f4e1c00596ba516b519a._comment b/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_1_ee1361e6b235f4e1c00596ba516b519a._comment new file mode 100644 index 000000000..47766dc77 --- /dev/null +++ b/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_1_ee1361e6b235f4e1c00596ba516b519a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5vDem1yeIu6uith5pxfb4mdKdIWVJpCs" + nickname="Louis" + subject="Base64 vs. yEnc" + date="2012-11-12T02:02:17Z" + content=""" +Would yEnc be a suitable alternative to base64 for encoding the binary transfers over XMPP? Or why not? + +Thanks! +"""]] diff --git a/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment b/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment new file mode 100644 index 000000000..6f76ec4c8 --- /dev/null +++ b/doc/design/assistant/blog/day_126__mr_watson_come_here/comment_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 2" + date="2012-11-12T02:39:19Z" + content=""" +AFAIK, yenc can use xml characters like < and > in its encoding. +"""]] diff --git a/doc/design/assistant/blog/day_127__xmpp_syncs.mdwn b/doc/design/assistant/blog/day_127__xmpp_syncs.mdwn new file mode 100644 index 000000000..7f95f87e3 --- /dev/null +++ b/doc/design/assistant/blog/day_127__xmpp_syncs.mdwn @@ -0,0 +1,35 @@ +I got full-on git-annex assistant syncing going over XMPP today! + +How well does it work? Well, I'm at the cabin behind a dialup modem. I have +two repos that can only communicate over XMPP. One uses my own XMPP server, +and the other uses a Google Talk account. I make a file in one repo, and +switch windows to the other, and type `ls`, and the file (not its content +tho..) has often already shown up. So, it's about as fast as syncing over +ssh, although YMMV. + +---- + +Refactored the git push over XMPP code rather severely. It's quite a +lot cleaner now. + +---- + +Set XMPP presence priority to a negative value, which will hopefully +prevent git-annex clients that share a XMPP account with other clients from +intercepting chat messages. Had to change my XMPP protocol some to deal +with this. + +---- + +Some webapp UI work. When showing the buddy list, indicate which buddies +are already paired with. + +After XMPP pairing, it now encourages setting up a shared cloud repository. + +[[!img /assistant/xmpppairingend.png]] + +I still need to do more with the UI after XMPP pairing, to help the paired +users configure a shared cloud transfer remote. Perhaps the thing to do is +for the ConfigMonitor to notice when a git push adds a new remote, +and pop up an alert suggesting the user enable it. Then one user +can create the repository, and the other one enable it. diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day.mdwn b/doc/design/assistant/blog/day_128__last_xmpp_day.mdwn new file mode 100644 index 000000000..2c7d70acc --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day.mdwn @@ -0,0 +1,49 @@ +I hope I'm nearly at the end of this XMPP stuff after today. Planning a new +release tomorrow. + +---- + +Split up the local pairing and XMPP pairing UIs, and wrote a +[[/assistant/share_with_a_friend_walkthrough]]. + +---- + +Got the XMPP push code to time out if expected data doesn't arrive within +2 minutes, rather than potentially blocking other XMPP push forever if +the other end went away. + +I pulled in the Haskell +[async](http://hackage.haskell.org/package/async) library for this, +which is yes, yet another library, but one that's now in the haskell platform. +It's worth it, because of how nicely it let me implement IO actions that +time out. + +[[!format haskell """ +runTimeout :: Seconds -> IO a -> IO (Either SomeException a) +runTimeout secs a = do + runner <- async a + controller <- async $ do + threadDelaySeconds secs + cancel runner + cancel controller `after` waitCatch runner +"""]] + +This would have been 20-50 lines of gnarly code without async, and I'm sure +I'll find more uses for async in the future. + +---- + +Discovered that the XMPP push code could deadlock, if both clients started +a push to the other at the same time. I decided to fix this by allowing +each client to run both one push and one receive-pack over XMPP at the same +time. + +---- + +Prevented the transfer scanner from trying to queue transfers to XMPP remotes. + +---- + +Made XMPP pair requests that come from the same account we've already +paired with be automatically accepted. So once you pair with one device, +you can easily add more. diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment new file mode 100644 index 000000000..add2cf313 --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqVi9eQjkZt8EC-byTXJ8TnY7VyOHzW2s" + nickname="Zahary" + subject="Pairing on the local network" + date="2012-11-12T11:39:17Z" + content=""" +Joey, How does pairing on the local network work btw? +Now that you have experience intercepting and relaying the git pack output maybe you can use UDP broadcast on the local network for a truly fast sync. +With dropbox, I'm often syncing working copies of software projects between several VMs so I can test the code on all platforms before committing. I've found that to be faster (for builds) then using a VM shared folders, network shares, etc. +"""]] diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_2_43664b73c71c41d71bc95e665f128106._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_2_43664b73c71c41d71bc95e665f128106._comment new file mode 100644 index 000000000..3a8318618 --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_2_43664b73c71c41d71bc95e665f128106._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 2" + date="2012-11-12T11:50:42Z" + content=""" +Developing something new based on IPv4 UDP broadcast seems to be insane. IPv6 link-local multicast should be available virtually anywhere. XMPP relies on TCP and a central server to guarantee that a single packet is not split up, which would need quite some protocol engineering to get right over lossy UDP (e.g. segmentation, flow control, congestion avoidance). But TCP as discovered using mDNS might work… Still needs some kind of authentication / encryption, though. +"""]] diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_3_d369b04f686009a9dbb57b999107a55e._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_3_d369b04f686009a9dbb57b999107a55e._comment new file mode 100644 index 000000000..951cc7e05 --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_3_d369b04f686009a9dbb57b999107a55e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqVi9eQjkZt8EC-byTXJ8TnY7VyOHzW2s" + nickname="Zahary" + subject="Jingle" + date="2012-11-12T12:00:50Z" + content=""" +Also, you probably know about Jingle: +http://en.wikipedia.org/wiki/Jingle_(protocol) + +What are you thoughts about it? I guess it would have been harder to use the Google C++ library from Haskell and full mesh peer-to-peer is certainly more complicated than using the XMPP server to effectively multicast to all paired clients. +"""]] diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_4_095855d301e7ccd3689ffe507cfb63ee._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_4_095855d301e7ccd3689ffe507cfb63ee._comment new file mode 100644 index 000000000..0e5295ad2 --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_4_095855d301e7ccd3689ffe507cfb63ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqVi9eQjkZt8EC-byTXJ8TnY7VyOHzW2s" + nickname="Zahary" + subject="@Philipp Kern" + date="2012-11-12T12:13:33Z" + content=""" +Alright, I stand corrected, although I'm aware of some libraries that have already solved the problem so you don't really have to implement reliable UDP from scratch: http://code.google.com/p/openpgm/ +"""]] diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment new file mode 100644 index 000000000..f10326a3c --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 5" + date="2012-11-12T12:50:26Z" + content=""" +To quote the website (emphasis mine): +> PGM is appropriate for applications that require duplicate-free multicast data delivery from multiple sources to multiple receivers. *PGM does not support acknowledged delivery, nor does it guarantee ordering of packets from multiple senders.* +"""]] diff --git a/doc/design/assistant/blog/day_128__last_xmpp_day/comment_6_2f9ba367e19d77bf52f372b6f0f5938a._comment b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_6_2f9ba367e19d77bf52f372b6f0f5938a._comment new file mode 100644 index 000000000..e73c4c071 --- /dev/null +++ b/doc/design/assistant/blog/day_128__last_xmpp_day/comment_6_2f9ba367e19d77bf52f372b6f0f5938a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 6" + date="2012-11-12T14:43:32Z" + content=""" +For local pairing, multicast UDP is used for discovery and authentication, and then all data transfers take place over ssh. +"""]] diff --git a/doc/design/assistant/blog/day_129__release.mdwn b/doc/design/assistant/blog/day_129__release.mdwn new file mode 100644 index 000000000..553b0e91f --- /dev/null +++ b/doc/design/assistant/blog/day_129__release.mdwn @@ -0,0 +1,4 @@ +Cut a new release today. It's been nearly a month since the last one, and a +large number of improvements.. Be sure to read the +[[/assistant/release_notes]] if upgrading. All the standalone builds are +updated already. diff --git a/doc/design/assistant/blog/day_12__freebsd_redux.mdwn b/doc/design/assistant/blog/day_12__freebsd_redux.mdwn new file mode 100644 index 000000000..5ec446c9d --- /dev/null +++ b/doc/design/assistant/blog/day_12__freebsd_redux.mdwn @@ -0,0 +1,23 @@ +Followed my plan from yesterday, and wrote a simple C library to interface +to `kqueue`, and Haskell code to use that library. By now I think I +understand kqueue fairly well -- there are some very tricky parts to the +interface. + +But... it still didn't work. After building all this, my code was +failing the same way that the +[haskell kqueue library failed](https://github.com/hesselink/kqueue/issues/1) +yesterday. I filed a [bug report with a testcase](). + +Then I thought to ask on #haskell. Got sorted out in quick order! The +problem turns out to be that haskell's runtime has a periodic SIGALARM, +that is interrupting my kevent call. It can be worked around with `+RTS -V0`, +but I put in a fix to retry to kevent when it's interrupted. + +And now `git-annex watch` can detect changes to directories on BSD and OSX! + +Note: I said "detect", not "do something useful in response to". Getting +from the limited kqueue events to actually staging changes in the git repo +is going to be another day's work. Still, brave FreeBSD or OSX users +might want to check out the `watch` branch from git and see if +`git annex watch` will at least *say* it sees changes you make to your +repository. diff --git a/doc/design/assistant/blog/day_12__freebsd_redux/comment_1_5da32cf53f1de27bfe6cec2d294db3e1._comment b/doc/design/assistant/blog/day_12__freebsd_redux/comment_1_5da32cf53f1de27bfe6cec2d294db3e1._comment new file mode 100644 index 000000000..253af9e7c --- /dev/null +++ b/doc/design/assistant/blog/day_12__freebsd_redux/comment_1_5da32cf53f1de27bfe6cec2d294db3e1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-06-19T06:53:26Z" + content=""" +heh, yea, it's detecting changes on OSX ;) +"""]] diff --git a/doc/design/assistant/blog/day_12__freebsd_redux/comment_2_696d6e22034acf5bb60d80124b72ef2f._comment b/doc/design/assistant/blog/day_12__freebsd_redux/comment_2_696d6e22034acf5bb60d80124b72ef2f._comment new file mode 100644 index 000000000..9f3e34adb --- /dev/null +++ b/doc/design/assistant/blog/day_12__freebsd_redux/comment_2_696d6e22034acf5bb60d80124b72ef2f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-06-19T07:01:26Z" + content=""" +issues with the watch command on OSX, it seems that there is a race condition somewhere. I dumped a few iso's into an annex and it only annexed the smaller files (checksums) and the bigger ones (the iso's) just got made read only. also do you want these bugs to be logged here or in the bugs section? +"""]] diff --git a/doc/design/assistant/blog/day_130__what_now.mdwn b/doc/design/assistant/blog/day_130__what_now.mdwn new file mode 100644 index 000000000..4fc3fe53c --- /dev/null +++ b/doc/design/assistant/blog/day_130__what_now.mdwn @@ -0,0 +1,36 @@ +Dealt with post-release feedback deluge. There are a couple weird bugs that +I don't understand yet. OSX app is still not working everywhere. + +---- + +Got the list of repositories in the webapp to update automatically when +repositories are added, including when syncing with a remote causes +repositories to be discovered. + +---- + +I need a plan for the rest of the month. It feels right to focus on more +cloud storage support. Particularly because all the cloud providers +supported so far are ones that, while often being best of breed, also cost +money. To finish up the cloud story, need support for some free ones. + +Looking at the results of the [[polls/prioritizing_special_remotes]] +poll, I suspect that free storage is a large part of why Google Drive got +so many votes. Soo, since there is not yet a Haskell library for Google +Drive, rather than spending a large chunk of time writing one, I hope to +use a [Haskell WebDAV library](http://hackage.haskell.org/package/DAV) +that my friend Clint recently wrote. A generic +WebDAV special remote in git-annex will provide much better support for +box.com (which has 5 to 50 gb free storage), as well as all the +[OwnCloud providers](http://owncloud.org/providers/), at least one of which +provides 5 gb free storage. + +If I have time left this month after doing that, I'd be inclined to do +Amazon Glacier. People have already gotten that working with git-annex, but +a proper special remote should be better/easier, and will allow integrating +support for it into the assistant, which should help deal with its long +retrieval delays. And since, if you have a lot of data +archived in Glacier, you will only want to pull out a few files at a time, +this is another place besides mobile phones where a [[partial_content]] +retrieval UI is needed. Which is on the roadmap to be worked on next +month-ish. Synergy, here I come. I hope. diff --git a/doc/design/assistant/blog/day_130__what_now/comment_1_402f00cc034351d8253a797dd4de55bf._comment b/doc/design/assistant/blog/day_130__what_now/comment_1_402f00cc034351d8253a797dd4de55bf._comment new file mode 100644 index 000000000..ec2158c22 --- /dev/null +++ b/doc/design/assistant/blog/day_130__what_now/comment_1_402f00cc034351d8253a797dd4de55bf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="definitely glacier would be cool" + date="2012-11-14T08:51:40Z" + content=""" +Because having it available as an archival system to move stuff over that you don't expect to constantly need available. But what would be needed is a way to prevent the assistant to pull all the data from there back on your clients. This probably allready is doable with preferred content, but probably needs an easier way to set up - when I tried the new version it immediately started to pull all the stuff from my server repository that I moved there to get my disk space free. So my scenario would be \"move stuff to archives and when I drop it afterwards, keep it dropped locally if at least one archival server has it\". +"""]] diff --git a/doc/design/assistant/blog/day_131__webdav_groundwork.mdwn b/doc/design/assistant/blog/day_131__webdav_groundwork.mdwn new file mode 100644 index 000000000..795acfea1 --- /dev/null +++ b/doc/design/assistant/blog/day_131__webdav_groundwork.mdwn @@ -0,0 +1,28 @@ +Read up on WebDAV, and got the haskell library working. Several hours +were wasted by stumbling over a bug in the library, that requires a +carefully crafted XML document to prevent. Such a pity about things +like DAV (and XMPP) being designed back when people were gung-ho about +XML.. but we're stuck with them now. + +Now I'm able to send and receive files to box.com using the library. Trying to +use an OwnCloud server, though, I get a most strange error message, which +looks to be coming from deep in the HTTPS library stack: "invalid IV length" + +The haskell DAV library didn't have a way to delete files. I've added one +and sent off a patch. + +Roughed in a skeleton of a webdav special remote. Doesn't do anything yet. +Will soon. + +Factored out a Creds module from parts of the S3 special remote and XMPP +support, that all has to do with credentials storage. Using this for webdav +creds storage too. + +Will also need to factor out the code that's currently in the directory +special remote, for chunking of files. + +---- + +PS: WebDAV, for all its monstrously complicated feature set, lacks one obvious +feature: The ability to check how much free space is available to store +files. Eyeroll. diff --git a/doc/design/assistant/blog/day_132__webdav_continued.mdwn b/doc/design/assistant/blog/day_132__webdav_continued.mdwn new file mode 100644 index 000000000..075a5d8c4 --- /dev/null +++ b/doc/design/assistant/blog/day_132__webdav_continued.mdwn @@ -0,0 +1,22 @@ +Two releases of the Haskell DAV library today. First release had my changes +from yesterday. Then I realized I'd also need support for making WebDAV +"collections" (subdirectories), and sent Clint a patch for that too, as +well as a patch for querying DAV properties, and that was 0.2. +Got it into Debian unstable as well. Should have everything I'll need now. + +The webdav special remote is now working! Still todo: +Encryption support, progress bars, large file chunking, and webapp +configurators. But already, it's a lot nicer than the old approach of using +davfs2, which was really flakey and slow with large data volumes. + +I did notice, though, that uploading a 100 mb file made the process use 100 +mb of memory. This is a problem I've struggled with earlier with S3, the +Haskell http libraries are prevented from streaming data by several parts +of the protocol that cause the data to be accessed more than once. I guess +this won't be a problem for DAV though, since it'll probably be chunking +files anyway. + +--- + +Mailed out all my Kickstarter USB key rewards, and ordered +the T-shirts too. diff --git a/doc/design/assistant/blog/day_133__webdav_working.mdwn b/doc/design/assistant/blog/day_133__webdav_working.mdwn new file mode 100644 index 000000000..d71f25852 --- /dev/null +++ b/doc/design/assistant/blog/day_133__webdav_working.mdwn @@ -0,0 +1,31 @@ +Worked on webdav special remotes all day. + +* Got encryption working, + after fixing an amusing typo that made `initremote` for webdav throw away the + encryption configuration and store files unencrypted. +* Factored out parts of the directory special remote that had to do with file + chunking, and am using that for webdav. This refactoring was painful. + +At this point, I feel the webdav special remote works better than the old +davfs2 + directory special remote hack. While webdav doesn't yet have +progress info for uploads, that info was pretty busted anyway with +davfs2 due to how it buffers files. So ... I've merged webdav into master! + +----- + +Tomorrow, webapp configurators for Box.com and any other webdav supporting +sites I can turn up and get to work.. + +----- + +A while ago I made git-annex not store login credentials in git for special +remotes, when it's only encrypting them with a shared cipher. The +rationalle was that you don't want to give everyone who gets ahold of your +git repo (which includes the encryption key) access to your passwords, +Amazon S3 account, or whatever. I'm now considering adding a checkbox (or +command-line flag) that allows storing the login credentials in git, +if the user wants to. While using public key crypto is the real solution +(and is fully supported by git-annex (but not yet configurable in the +webapp)), this seems like a reasonable thing to do in some circumstances, +like when you have a Box.com account you really do want to share with +the people who use the git repo. diff --git a/doc/design/assistant/blog/day_134__box.com_configurator.mdwn b/doc/design/assistant/blog/day_134__box.com_configurator.mdwn new file mode 100644 index 000000000..115633640 --- /dev/null +++ b/doc/design/assistant/blog/day_134__box.com_configurator.mdwn @@ -0,0 +1,8 @@ +I needed an easy day, and I got one. Configurator in the webapp for Box.com +came together really quickly and easily, and worked on the first try. + +Also filed a [bug](https://github.com/vincenthz/hs-cryptocipher/issues/21) +on the Haskell library that is failing on portknox.com's SSL certificate. +That site is the only OwnCloud provider currently offering free WebDAV +storage. Will hold off on adding OwnCloud to the webapp's cloud provider lists +until that's fixed. diff --git a/doc/design/assistant/blog/day_135__progress_revisited.mdwn b/doc/design/assistant/blog/day_135__progress_revisited.mdwn new file mode 100644 index 000000000..63e3c4bf2 --- /dev/null +++ b/doc/design/assistant/blog/day_135__progress_revisited.mdwn @@ -0,0 +1,37 @@ +Unexpectedly today, I got progress displays working for uploads via WebDAV. + +The roadblock had been that the interface of for uploading to S3 and WebDAV +is something like `ByteString -> IO a`. Which doesn't provide any hook to +update a progress display as the ByteString is consumed. + +My solution to this was to create a `hGetContentsObserved`, that's similar +to `hGetContents`, but after reading each 64kb chunk of data from the +Handle to populate the ByteString, it runs some observing action. So when +the ByteString is streamed, as each chunk is consumed, the observer +runs. I was able to get this to run in constant space, despite not having +access to some of the ByteString internals that `hGetContents` is built +with. + +So, a little scary, but nice. I am curious if there's not a better way +to solve this problem hidden in a library somewhere. Perhaps it's another +thing that conduit solves somehow? Because if there's not, my solution +probably deserves to be put into a library. Any Haskell folk know? + +---- + +Used above to do progress displays for uploads to S3. Also did progress +display to console on download from S3. Now very close to being done +with [[progressbars]]. Finally. Only bup and hook remotes need progress +work. + +---- + +Reworked the core crypto interface, to better support streaming data through +gpg. This allowed fixing both the directory and webdav special remotes to +not buffer whole files in memory when retrieving them as chunks from the +remote. + +----- + +Spent some time dealing with API changes in Yesod and Conduit. Some of them +annoyingly gratuitous. diff --git a/doc/design/assistant/blog/day_136__misc.mdwn b/doc/design/assistant/blog/day_136__misc.mdwn new file mode 100644 index 000000000..5a14156d5 --- /dev/null +++ b/doc/design/assistant/blog/day_136__misc.mdwn @@ -0,0 +1,14 @@ +Changed how the directory and webdav special remotes store content. +The new method uses less system calls, is more robust, and leaves any +partially transferred key content in a single tmp directory, which +will make it easier to clean that out later. + +Also found & fixed a cute bug in the directory special remote when the +chunksize is set to a smaller value than the ByteString chunk size, that +caused it to loop forever creating empty files. + +---- + +Added an embedcreds=yes option when setting up special remotes. +Will put UI for it into the webapp later, but rather than work on that +tomorrow, I plan to work on glacier. diff --git a/doc/design/assistant/blog/day_137__Glacier.mdwn b/doc/design/assistant/blog/day_137__Glacier.mdwn new file mode 100644 index 000000000..4e6787eb5 --- /dev/null +++ b/doc/design/assistant/blog/day_137__Glacier.mdwn @@ -0,0 +1,30 @@ +Got Amazon Glacier working as a full-fledged special remote. + +(Well, I think it works... Since it takes 4 hours to get data out, +which is longer than the time it took me to sign up for Glacier and +write the special remote ... I've yet to fully test it!) + +Thanks to Robie Basak for writing glacier-cli, and developing the intial +hook remote support. Also thanks to Peter Todd for pointing out that +Glacier cannot store empty files, which had to be worked around in the +special remote. + +Of course the 4 hour delay on retreval makes Glacier interesting. For now, +you have to run "git annex get" twice, once to queue the retrieval, and a +second time in 4 hours to get the file(s). There is a helpful example in +[[tips/using_Amazon_Glacier]]. + +The real complication though, is that Glacier's inventories take a long +time to get, and can be out of date. So glacier-cli caches inventory info. +I didn't feel comfortable making git-annex trust that information, +so it'll refuse to trust that Glacier has a copy of a file when dropping +it. There's a `--trust-glacier` switch to override this default paranoid +behavior when dropping files. + +---- + +Tomorrow ... er, tomorrow is Thanksgiving trip start. + +Next weekend: Webapp configurator for glacier, and maybe something +to get the assistant to detect when jobs are complete and finish +retrievals from Glacier, automatically. diff --git a/doc/design/assistant/blog/day_138__back.mdwn b/doc/design/assistant/blog/day_138__back.mdwn new file mode 100644 index 000000000..7c2b4ec45 --- /dev/null +++ b/doc/design/assistant/blog/day_138__back.mdwn @@ -0,0 +1,25 @@ +Added a configurator for Glacier repositories to the webapp. That was the last +cloud repository configurator that was listed in the webapp and wasn't +done. Indeed, just two more repository configurators remain to be filled in: +phone and NAS. + +By default, Glacier repositories are put in a new "small archive" group. +This makes only files placed in "archive" directories be sent to Glacier +(as well as being dropped from clients), unlike the full archive group +which archives all files. Of course you can change this setting, but +avoiding syncing all data to Glacier seemed like a good default, especially +since some are still worried about Glacier's pricing model. + +Fixed several bugs in the handling of archive directories, and +the webapp makes a toplevel archive directory when an archive remote is +created, so the user can get on with using it. + +Made the assistant able to drop local files immediately after transferring +them to glacier, despite not being able to trust glacier's inventory. +This was accomplished by making the transferrer, after a successful upload, +indicate that it trusts the remote it just uploaded to has the file, +when it checks if the file should be dropped. + +Only thing left to do for glacier is to make the assistant retry failed +downloads from it after 4 hours, or better, as soon as they become +available. diff --git a/doc/design/assistant/blog/day_138__back/comment_1_65a8499b284bed38d2bde1886a54a311._comment b/doc/design/assistant/blog/day_138__back/comment_1_65a8499b284bed38d2bde1886a54a311._comment new file mode 100644 index 000000000..5bd94d13e --- /dev/null +++ b/doc/design/assistant/blog/day_138__back/comment_1_65a8499b284bed38d2bde1886a54a311._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmnG4EuvZWse5hvgrl0XAK-U61e-0iGaao" + nickname="David" + subject="NAS?" + date="2012-11-25T12:27:50Z" + content=""" +What are you planning to support with the NAS repository type? Will the assistant sync over NFS? I wanted to read more about this but I couldn't find anything on the design pages. +"""]] diff --git a/doc/design/assistant/blog/day_139__catch_up.mdwn b/doc/design/assistant/blog/day_139__catch_up.mdwn new file mode 100644 index 000000000..fc1e572b0 --- /dev/null +++ b/doc/design/assistant/blog/day_139__catch_up.mdwn @@ -0,0 +1,11 @@ +Got progress bars working for glacier. This needed some glacier-cli +changes, which Robie helpfully made earlier. + +Spent some hours getting caught up and responding to bug reports, etc. + +Spent a while trying to make git-annex commands that fail to find +any matching files to act on print a useful warning message, +rather than the current nothing. Concluded this will be surprisingly +hard to do, due to the multiple seek passes some commands perform. Update: +Thought of a non-invasive and not too ugly way to do this while on my +evening walk, and this wart is gone. diff --git a/doc/design/assistant/blog/day_13__kqueue_continued.mdwn b/doc/design/assistant/blog/day_13__kqueue_continued.mdwn new file mode 100644 index 000000000..fd0cbb372 --- /dev/null +++ b/doc/design/assistant/blog/day_13__kqueue_continued.mdwn @@ -0,0 +1,34 @@ +Good news! My beta testers report that the new kqueue code works on OSX. +At least "works" as well as it does on Debian kFreeBSD. My crazy +development strategy of developing on Debian kFreeBSD while targeting Mac +OSX is vindicated. ;-) + +So, I've been beating the kqueue code into shape for the last 12 hours, +minus a few hours sleep. + +First, I noticed it was seeming to starve the other threads. I'm using +Haskell's non-threaded runtime, which does cooperative multitasking between +threads, and my C code was never returning to let the other threads run. +Changed that around, so the C code runs until SIGALARMed, and then that +thread calls `yield` before looping back into the C code. Wow, cooperative +multitasking.. I last dealt with that when programming for Windows 3.1! +(Should try to use Haskell's -threaded runtime sometime, but git-annex +doesn't work under it, and I have not tried to figure out why not.) + +Then I made a [single commit](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=2bfcc0b09c5dd37c5e0ab65cb089232bfcc31934), +with no testing, in which I made the kqueue code maintain a cache of what +it expects in the directory tree, and use that to determine what files +changed how when a change is detected. Serious code. It worked on the +first go. If you were wondering why I'm writing in Haskell ... yeah, +that's why. + +And I've continued to hammer on the kqueue code, making lots of little +fixes, and at this point it seems *almost* able to handle the changes I +throw at it. It does have one big remaining problem; kqueue doesn't tell me +when a writer closes a file, so it will sometimes miss adding files. To fix +this, I'm going to need to make it maintain a queue of new files, and +periodically check them, with `lsof`, to see when they're done being +written to, and add them to the annex. So while a file is being written +to, `git annex watch` will have to wake up every second or so, and run +`lsof` ... and it'll take it at least 1 second to notice a file's complete. +Not ideal, but the best that can be managed with kqueue. diff --git a/doc/design/assistant/blog/day_140__release_monday.mdwn b/doc/design/assistant/blog/day_140__release_monday.mdwn new file mode 100644 index 000000000..9c9ccd166 --- /dev/null +++ b/doc/design/assistant/blog/day_140__release_monday.mdwn @@ -0,0 +1,25 @@ +New release today, the main improvements in this one being WebDAV, +Box.com, and Amazon glacier support. [[/assistant/release_notes]] + +Collected together all the OSX problem reports into one place +at [[/assistant/OSX]], to make it easier to get an overview of them. + +Did some testing of the OSX standalone app and found that it was missing +some libraries. It seems some new libraries it's using themselves depend on +other libraries, and `otool -L` doesn't recursively resolve this. + +So I converted the simplistic shell script it was using to install +libraries into a haskell progream that recursively adds libraries until +there are no more to add. It's pulling in quite a lot more libraries now. +This may fix some of the problems that have been reported with the +standalone app; I don't really know since I can only do very limited +testing on OSX. + +Still working on getting the standalone builds for this release done, +should be done by the end of today. + +Also found a real stinker of a bug in `dirContentsRecursive`, which was +just completely broken, apparently since day 1. Fixing that has certainly +fixed buggy behavior of `git annex import`. It seems that the other +user of it, the transfer log code, luckily avoided the deep directory +trees that triggered the bug. diff --git a/doc/design/assistant/blog/day_141__release_tuesday.mdwn b/doc/design/assistant/blog/day_141__release_tuesday.mdwn new file mode 100644 index 000000000..41c323f01 --- /dev/null +++ b/doc/design/assistant/blog/day_141__release_tuesday.mdwn @@ -0,0 +1,6 @@ +I had planned to do nothing today; I can't remember the last time I did +that. Twas not to be; instead I had to make a new release to fix +a utterly stupid typo in the rsync special remote. I'm also seeing +some slightly encouraging signs of the OSX app being closer to working +and this release has a further fix toward that end; unsetting all the +environment variables before running the system's web browser. diff --git a/doc/design/assistant/blog/day_141__release_tuesday/comment_1_a5adea7a726df12f9121c744a036f08d._comment b/doc/design/assistant/blog/day_141__release_tuesday/comment_1_a5adea7a726df12f9121c744a036f08d._comment new file mode 100644 index 000000000..69fb64778 --- /dev/null +++ b/doc/design/assistant/blog/day_141__release_tuesday/comment_1_a5adea7a726df12f9121c744a036f08d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnbBRfl5F8gKRr1ko8Ai6FbEZStXXNF1S4" + nickname="Áron" + subject="deb package for amd64" + date="2012-12-04T08:51:55Z" + content=""" +Hey, great work! +Will we also have 64bit binaries in debian unstable soon? + +"""]] diff --git a/doc/design/assistant/blog/day_142__filling_in.mdwn b/doc/design/assistant/blog/day_142__filling_in.mdwn new file mode 100644 index 000000000..d7f5c84bf --- /dev/null +++ b/doc/design/assistant/blog/day_142__filling_in.mdwn @@ -0,0 +1,9 @@ +Just filling in a few remaining bits and pieces from this month's work. + +* Made the assistant periodically check glacier-cli for archives that are + ready, and queue downloads of them. +* The box.com configurator defaults to embedding the account info, allowing + one-click enabling of the repository. There's a check box to control this. +* Fix some bugs with how the standalone images run git-annex. +* Included ssh in the standalone images. +* Various other bug fies. diff --git a/doc/design/assistant/blog/day_143__what_next.mdwn b/doc/design/assistant/blog/day_143__what_next.mdwn new file mode 100644 index 000000000..6c277f7a2 --- /dev/null +++ b/doc/design/assistant/blog/day_143__what_next.mdwn @@ -0,0 +1,22 @@ +Yesterday, I woke up and realized I didn't know what I needed to work on in +git-annex. Added a poll, [[polls/Android]] to help me decide what major +thing to work on next. + +---- + +More flailing at the OSX monster. (A species of gelatinous cube?) +Current fun seems to involve git processes spinning if git-annex +was started without a controlling TTY. I'm befuddled by this. + +---- + +Made the S3 and Glacier configurators have a list of regions, rather than +requiring a the region's code be entered correctly. I could not find a list of +regions, or better, an API to get a list, so I'll have to keep updating as +Amazon adds services in new regions. + +---- + +Spent some time trying to get WebDAV to work with livedrive.com. +It doesn't like empty PROPPATCH. I've developed a change to the haskell DAV +library that will let me avoid this problem. diff --git a/doc/design/assistant/blog/day_143__what_next/comment_1_40cf25a2ebdd43d8974a28e180e100e5._comment b/doc/design/assistant/blog/day_143__what_next/comment_1_40cf25a2ebdd43d8974a28e180e100e5._comment new file mode 100644 index 000000000..28ef42975 --- /dev/null +++ b/doc/design/assistant/blog/day_143__what_next/comment_1_40cf25a2ebdd43d8974a28e180e100e5._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://1id.com/contact/=tp" + nickname="Tom" + subject="In case it might be helpful" + date="2012-12-04T14:25:14Z" + content=""" +S3 and Glacier regions. + + + +(EC2) Region list API - likely a superset of the other service regions, could be used for sanity checks. + +"""]] diff --git a/doc/design/assistant/blog/day_143__what_next/comment_2_af9ccbbc5131e6333c029415141bdb51._comment b/doc/design/assistant/blog/day_143__what_next/comment_2_af9ccbbc5131e6333c029415141bdb51._comment new file mode 100644 index 000000000..b9df466cf --- /dev/null +++ b/doc/design/assistant/blog/day_143__what_next/comment_2_af9ccbbc5131e6333c029415141bdb51._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5vDem1yeIu6uith5pxfb4mdKdIWVJpCs" + nickname="Louis" + subject="AWS regions in JSON" + date="2012-12-05T03:27:52Z" + content=""" +Mitch Garnaat maintains a json data file with AWS service regions & other useful data... + +https://github.com/garnaat/missingcloud/blob/master/aws.json +"""]] diff --git a/doc/design/assistant/blog/day_144__webapp_work.mdwn b/doc/design/assistant/blog/day_144__webapp_work.mdwn new file mode 100644 index 000000000..4e0c8287f --- /dev/null +++ b/doc/design/assistant/blog/day_144__webapp_work.mdwn @@ -0,0 +1,8 @@ +Made the webapp show runtime errors on a prettified page that includes version +info, a bug reporting link, etc. + +Dealt with a bad interaction between required fields and the bootstrap modals +displayed when submitting some configuration forms. This was long, complex, +and had lots of blind alleys. In the end, I had to derive new password and +text fields in yesod that don't set the required attribute in the generated +html. diff --git a/doc/design/assistant/blog/day_145__more_webapp_work.mdwn b/doc/design/assistant/blog/day_145__more_webapp_work.mdwn new file mode 100644 index 000000000..f9649be39 --- /dev/null +++ b/doc/design/assistant/blog/day_145__more_webapp_work.mdwn @@ -0,0 +1,12 @@ +One problem with the current configurators for remotes is they have a lot +of notes and text to read at the top. I've worked on cut that down somewhat, +mostly by adding links and help buttons next to fields in the form. + +I also made each form have a check box controlling whether encryption is +enabled. Mostly as a way to declutter the text at the top, which always had +to say encryption is enabled. + +--- + +I have a fairly well worked out design for [[desymlink]]. Will wait a few +days to work on it to let it jell. diff --git a/doc/design/assistant/blog/day_146__meanwhile.mdwn b/doc/design/assistant/blog/day_146__meanwhile.mdwn new file mode 100644 index 000000000..8ff8b1d72 --- /dev/null +++ b/doc/design/assistant/blog/day_146__meanwhile.mdwn @@ -0,0 +1,22 @@ +Biding my time while [[desymlink]] gells in my head.. + +Fixed a bug in the assistant's local pairing that rejected ssh keys with a +period in the comment. + +Fixed a bug in the assistant that made it try to drop content from remotes +that didn't have it, and avoided a drop failure crashing a whole assistant +thread. + +Made --auto behave better when preferred content is set. + +Looked into making the transfer queue allow running multiple transfers at +the same time, ie, one per remote. This seems to essentially mean splitting +the queue into per remote queues. There are some complexities, and I +decided not to dive into working through it right now, since it'd be +a distraction from thinking about [[desymlink]]. Will revisit it later. + +Allow specifying a port when setting up a ssh remote. + +While doing that, noticed that the assistant fails to transfer files to +sync to a ssh remote that was just added. That got broken while optimising +reconnecting with a remote; fixed it. diff --git a/doc/design/assistant/blog/day_147__direct_mode.mdwn b/doc/design/assistant/blog/day_147__direct_mode.mdwn new file mode 100644 index 000000000..1a7523785 --- /dev/null +++ b/doc/design/assistant/blog/day_147__direct_mode.mdwn @@ -0,0 +1,36 @@ +Started laying the groundwork for [[desymlink]]'s direct mode. +I got rather far! + +A git repo can be configured with `annex.direct` and all actions that +transfer objects to it will replace the symlinks with regular files. +Removing objects also works (and puts back a broken symlink), +as does checking if an object is present, which even detects if a file +has been modified. + +So far, this works best when such a direct mode repository is used as a git +remote of another repository. It is also possible to run a few git-annex +commands, like "get" in a direct mode repository, though others, like +"drop" won't work because they rely on the symlink to map back to the key. + +Direct mode relies on map files existing for each key in the repository, that tell +what file(s) use it. It also relies on cache files, that contain the last +known mtime, size, and inode of the file. So far, I've been setting these +files up by hand. + +The main thing that's missing is support for transferring objects from +direct mode repositories. There's no single place I can modify to support +that (like I could for the stuff mentioned above), and also it's difficult +to do safely, since files could be modified at any time. + +So it'll need to quarantine files, to prevent a modified version from +getting sent out. I could either do this by copying the file, or by +temporarily `git annex lock`ing it. Unsure which choice would be less +annoying.. + +---- + +Also did some investigation with Jimmy of the OSX app git-config hang. +Seems to be some kind of imcompatability between the 10.7 autobuilder and +10.8. Next step is probably to try to build on 10.8. Might also +be worth trying , although my +own scripts do more or less the same thing to build the app. diff --git a/doc/design/assistant/blog/day_147__direct_mode/comment_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment b/doc/design/assistant/blog/day_147__direct_mode/comment_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment new file mode 100644 index 000000000..567c094c9 --- /dev/null +++ b/doc/design/assistant/blog/day_147__direct_mode/comment_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.59.119" + subject=""removing" vs drop" + date="2012-12-12T13:20:42Z" + content=""" +I don't understand the difference behind: + +> Removing objects also works (and puts back a broken symlink) + +and + +> \"drop\" won't work because they rely on the symlink to map back to the key. + +If a file is removed (its content, which is replaced by a symlink), then it's not present there, so effectively it should be counted as \"dropped\" at this place. So, removing a file without counting it as dropped is something inconsistent, isn't it? Do I misunderstand something? +"""]] diff --git a/doc/design/assistant/blog/day_147__direct_mode/comment_2_3b26f0d081c3bf1037bb872d529ce825._comment b/doc/design/assistant/blog/day_147__direct_mode/comment_2_3b26f0d081c3bf1037bb872d529ce825._comment new file mode 100644 index 000000000..b29d45390 --- /dev/null +++ b/doc/design/assistant/blog/day_147__direct_mode/comment_2_3b26f0d081c3bf1037bb872d529ce825._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 2" + date="2012-12-12T23:45:42Z" + content=""" +`git annex drop` is a user-level operation built on top of lower-level object removal functions that are also used by other things. +"""]] diff --git a/doc/design/assistant/blog/day_148__direct_mode.mdwn b/doc/design/assistant/blog/day_148__direct_mode.mdwn new file mode 100644 index 000000000..14f1f889f --- /dev/null +++ b/doc/design/assistant/blog/day_148__direct_mode.mdwn @@ -0,0 +1,42 @@ +Got object sending working in direct mode. However, I don't yet have a +reliable way to deal with files being modified while they're being +transferred. I have code that detects it on the sending side, but the +receiver is still free to move the wrong content into its annex, and record +that it has the content. So that's not acceptable, and I'll need to work +on it some more. However, at this point I can use a direct mode repository +as a remote and transfer files from and to it. + +---- + +Automated updating of the cached mtime, etc data. Next I need to automate +generation of the key to filename mapping files. I'm thinking that I'll make +`git annex sync` do it. Then, once I get committing and +merging working in direct mode repositories (which is likely to be a +good week's worth of work), the workflow for using these repositories +will be something like this: + + git config annex.direct true + git annex sync # pulls any changes, merges, updates maps and caches + git annex get + # modify files + git annex sync # commits and pushes changes + +And once I get direct mode repositories working to this degree at the +command line, I can get on with adding support to the assistant. + +---- + +Also did some more work today on the OSX app. Am in the middle of getting +it to modify the binaries in the app to change the paths to the libraries they +depend on. This will avoid the hacky environment variable it is currently +using, and make runshell a much more usable environment. It's the right way +to do it. (I can't believe I just said RPATH was the right way to do +anything.) + +In the middle of this, I discovered +, which does the same +type of thing. + +Anyway, I have to do some crazy hacks to work around short library name +fields in executables that I don't want to have to be specially rebuilt in +order to build the webapp. Like git. diff --git a/doc/design/assistant/blog/day_149__rainy_day.mdwn b/doc/design/assistant/blog/day_149__rainy_day.mdwn new file mode 100644 index 000000000..eb4210884 --- /dev/null +++ b/doc/design/assistant/blog/day_149__rainy_day.mdwn @@ -0,0 +1,15 @@ +Made `git annex sync` update the file mappings in direct mode. +To do this efficiently, it uses `git diff-tree` to find files that are +changed by the sync, and only updates those mappings. I'm rather happy +with this, as a first step to fully supporting sync in direct mode. + +Finished the overhaul of the OSX app's library handling. It seems to work +well, and will fix a whole class of ways the OSX app could break. + +Fixed a bug in the preferred content settings for backup repositories, +introduced by some changes I made to preferred content handling 4 days ago. + +Fixed the Debian package to build with WebDAV support, which I forgot to +turn on before. + +Planning a release tomorrow. diff --git a/doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn b/doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn new file mode 100644 index 000000000..d7dab3611 --- /dev/null +++ b/doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn @@ -0,0 +1,23 @@ +... I'm getting tired of kqueue. + +But the end of the tunnel is in sight. Today I made git-annex handle files +that are still open for write after a kqueue creation event is received. +Unlike with inotify, which has a new event each time a file is closed, +kqueue only gets one event when a file is first created, and so git-annex +needs to retry adding files until there are no writers left. + +Eventually I found an elegant way to do that. The committer thread already +wakes up every second as long as there's a pending change to commit. So for +adds that need to be retried, it can just push them back onto the change +queue, and the committer thread will wait one second and retry the add. One +second might be too frequent to check, but it will do for now. + +This means that `git annex watch` should now be usable on OSX, FreeBSD, and +NetBSD! (It'll also work on Debian kFreeBSD once [lsof is ported to it](http://bugs.debian.org/589103).) +I've meged kqueue support to `master`. + +I also think I've squashed the empty commits that were sometimes made. + +Incidentally, I'm 50% through my first month, and finishing [[inotify]] +was the first half of my roadmap for this month. Seem to be right on +schedule.. Now I need to start thinking about [[syncing]]. diff --git a/doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn b/doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn new file mode 100644 index 000000000..4173fbf77 --- /dev/null +++ b/doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn @@ -0,0 +1,44 @@ +Pondering [[syncing]] today. I will be doing syncing of the git repository +first, and working on syncing of file data later. + +The former seems straightforward enough, since we just want to push all +changes to everywhere. Indeed, git-annex already has a [[sync]] command +that uses a smart technique to allow syncing between clones without a +central bare repository. (Props to Joachim Breitner for that.) + +But it's not all easy. Syncing should happen as fast as possible, so +changes show up without delay. Eventually it'll need to support syncing +between nodes that cannot directly contact one-another. Syncing needs to +deal with nodes coming and going; one example of that is a USB drive being +plugged in, which should immediately be synced, but network can also come +and go, so it should periodically retry nodes it failed to sync with. To +start with, I'll be focusing on fast syncing between directly connected +nodes, but I have to keep this wider problem space in mind. + +One problem with `git annex sync` is that it has to be run in both clones +in order for changes to fully propagate. This is because git doesn't allow +pushing changes into a non-bare repository; so instead it drops off a new +branch in `.git/refs/remotes/$foo/synced/master`. Then when it's run locally +it merges that new branch into `master`. + +So, how to trigger a clone to run `git annex sync` when syncing to it? +Well, I just realized I have spent two weeks developing something that can +be repurposed to do that! [[Inotify]] can watch for changes to +`.git/refs/remotes`, and the instant a change is made, the local sync +process can be started. This avoids needing to make another ssh connection +to trigger the sync, so is faster and allows the data to be transferred +over another protocol than ssh, which may come in handy later. + +So, in summary, here's what will happen when a new file is created: + +1. inotify event causes the file to be added to the annex, and + immediately committed. +2. new branch is pushed to remotes (probably in parallel) +3. remotes notice new sync branch and merge it +4. (data sync, TBD later) +5. file is fully synced and available + +Steps 1, 2, and 3 should all be able to be accomplished in under a second. +The speed of `git push` making a ssh connection will be the main limit +to making it fast. (Perhaps I should also reuse git-annex's existing ssh +connection caching code?) diff --git a/doc/design/assistant/blog/day_150__12:12.mdwn b/doc/design/assistant/blog/day_150__12:12.mdwn new file mode 100644 index 000000000..8e1f192db --- /dev/null +++ b/doc/design/assistant/blog/day_150__12:12.mdwn @@ -0,0 +1,53 @@ +Yesterday I cut another release. However, getting an OSX build took until +12:12 pm today because of a confusion about the location of lsof on OSX. The +OSX build is now available, and I'm looking forward to hearing if it's working! + +---- + +Today I've been working on making `git annex sync` commit in direct mode. + +For this I needed to find all new, modified, and deleted files, and I also +need the git SHA from the index for all non-new files. There's not really +an ideal git command to use to query this. For now I'm using +`git ls-files --others --stage`, which works but lists more files than I +really need to look at. It might be worth using one of the Haskell libraries +that can directly read git's index.. but for now I'll stick with `ls-files`. + +It has to check all direct mode files whose content is present, which means +one stat per file (on top of the stat that git already does), as well as one +retrieval of the key per file (using the single `git cat-file` process that +git-annex talks to). + +This is about as efficient as I can make it, except that unmodified +annexed files whose content is not present are listed due to --stage, +and so it has to stat those too, and currently also feeds them into `git add`. + +The assistant will be able to avoid all this work, except once at startup. + +Anyway, direct mode committing is working! + +For now, `git annex sync` in direct mode also adds new files. This because +`git annex add` doesn't work yet in direct mode. + +It's possible for a direct mode file to be changed during a commit, +which would be a problem since committing involves things like calculating +the key and caching the mtime/etc, that would be screwed up. I took +care to handle that case; it checks the mtime/etc cache before and after +generating a key for the file, and if it detects the file has changed, +avoids committing anything. It could retry, but if the file is a VM disk +image or something else that's constantly modified, commit retrying forever +would not be good. + +---- + +For `git annex sync` to be usable in direct mode, it still needs +to handle merging. It looks like I may be able to just enhance the automatic +conflict resolution code to know about typechanged direct mode files. + +The other missing piece before this can really be used is that currently +the key to file mapping is only maintained for files added locally, or +that come in via `git annex sync`. Something needs to set up that mapping +for files present when the repo is initally cloned. Maybe the thing +to do is to have a `git annex directmode` command that enables/disables +direct mode and can setup the the mapping, as well as any necessary unlocks +and setting the trust level to untrusted. diff --git a/doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn b/doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn new file mode 100644 index 000000000..c0b3f3245 --- /dev/null +++ b/doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn @@ -0,0 +1,59 @@ +Built `git annex direct` and `git annex indirect` to toggle back and forth +between direct mode. Made `git annex status` show if the repository is in +direct mode. Now *only* merging is needed for direct mode to be basically +usable. + +I can do a little demo now. Pay attention to the "@" ls shows at the end +of symlinks. + + joey@gnu:~/tmp/bench/rdirect>ls + myfile@ otherfile@ + joey@gnu:~/tmp/bench/rdirect>git annex find + otherfile + # So, two files, only one present in this repo. + + joey@gnu:~/tmp/bench/rdirect>git annex direct + commit + # On branch master + # Your branch is ahead of 'origin/master' by 7 commits. + # + nothing to commit (working directory clean) + ok + direct myfile ok + direct otherfile ok + direct ok + + joey@gnu:~/tmp/bench/rdirect>ls + myfile@ otherfile + # myfile is still a broken symlink because we don't have its content + joey@gnu:~/tmp/bench/rdirect>git annex get myfile + get myfile (from origin...) ok + (Recording state in git...) + joey@gnu:~/tmp/bench/rdirect>ls + myfile otherfile + + joey@gnu:~/tmp/bench/rdirect>echo "look mom, no symlinks" >> myfile + joey@gnu:~/tmp/bench/rdirect>git annex sync + add myfile (checksum...) ok + commit + (Recording state in git...) + [master 0e8de9b] git-annex automatic sync + ... + ok + + joey@gnu:~/tmp/bench/rdirect>git annex indirect + commit ok + indirect myfile ok + indirect otherfile ok + indirect ok + joey@gnu:~/tmp/bench/rdirect>ls + myfile@ otherfile@ + +I'd like `git annex direct` to set the repository to untrusted, but +I didn't do it. Partly because having `git annex indirect` set it back to +semitrusted seems possibly wrong -- the user might not trust a repo even in +indirect mode. Or might fully trust it. The docs will encourage users to +set direct mode repos to untrusted -- in direct mode you're operating +without large swathes of git-annex's carefully constructed safety net. +(When the assistant later uses direct mode, it'll untrust the repository +automatically.) diff --git a/doc/design/assistant/blog/day_152__bugfixes.mdwn b/doc/design/assistant/blog/day_152__bugfixes.mdwn new file mode 100644 index 000000000..da70fd156 --- /dev/null +++ b/doc/design/assistant/blog/day_152__bugfixes.mdwn @@ -0,0 +1,18 @@ +Fixed a bug in the kqueue code that made the assistant not notice when a +file was renamed into a subdirectory. This turned out to be because the +symlink got broken, and it was using `stat` on the file. Switching to +`lstat` fixed that. + +Improved installation of programs into standalone bundles. Now it uses +the programs detected by configure, rather than a separate hardcoded list. +Also improved handling of lsof, which is not always in PATH. + +Made a OSX 10.8.2 build of the app, which is nearly my last gasp attempt +at finding a way around this crazy `git init` spinning problem with Jimmy's +daily builds are used with newer OSX versions. Try it here: + + +---- + +Mailed out the Kickstarter T-shirt rewards today, to people in the US. +Have to fill out a bunch of forms before I can mail the non-US ones. diff --git a/doc/design/assistant/blog/day_152__bugfixes/comment_1_46863a875f9daa6f2c9248b66ff91929._comment b/doc/design/assistant/blog/day_152__bugfixes/comment_1_46863a875f9daa6f2c9248b66ff91929._comment new file mode 100644 index 000000000..9199f3768 --- /dev/null +++ b/doc/design/assistant/blog/day_152__bugfixes/comment_1_46863a875f9daa6f2c9248b66ff91929._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY" + nickname="Douglas" + subject="OSX troubles" + date="2012-12-17T16:07:41Z" + content=""" +Have you considered making a homebrew installable version of git-annex? It may make things easier for you when it comes to build dependencies. + +"""]] diff --git a/doc/design/assistant/blog/day_152__bugfixes/comment_2_a586e617bc024c8a9ff60f1b8345d74d._comment b/doc/design/assistant/blog/day_152__bugfixes/comment_2_a586e617bc024c8a9ff60f1b8345d74d._comment new file mode 100644 index 000000000..af7a901a9 --- /dev/null +++ b/doc/design/assistant/blog/day_152__bugfixes/comment_2_a586e617bc024c8a9ff60f1b8345d74d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 2" + date="2012-12-17T16:16:47Z" + content=""" +I would *love* *love* *love* for there to be a homebrew for git-annex. But I know nothing about homebrew so am not in a very good position to do it. +"""]] diff --git a/doc/design/assistant/blog/day_153__hibernation.mdwn b/doc/design/assistant/blog/day_153__hibernation.mdwn new file mode 100644 index 000000000..5406fcb86 --- /dev/null +++ b/doc/design/assistant/blog/day_153__hibernation.mdwn @@ -0,0 +1,26 @@ +As winter clouds set in, I have to ration my solar power and have been less +active than usual. + +It seems that the OSX 10.8.2 `git init` hanging issue has indeed been +resolved, by building the app on 10.8.2. Very good news! Autobuilder setup is +in progress. + +---- + +Finally getting stuck in to direct mode git-merge handling. It's +not possible to run `git merge` in a direct mode tree, because it'll +see typechanged files and refuse to do anything. + +So the only way to use `git merge`, rather than writing my own merge engine, +is to use `--work-tree` to make it operate in a temporary work tree directory +rather than the real one. + +When it's run this way, any new, modified, or renamed files will be added +to the temp dir, and will need to be moved to the real work tree. +To detect deleted files, need to use `git ls-files --others`, and +look at the old tree to see if the listed files were in it. + +When a merge conflict occurs, the new version of the file will be in the temp +directory, and the old one in the work tree. The normal automatic merge +conflict resolution machinery should work, with just some tweaks to handle +direct mode. diff --git a/doc/design/assistant/blog/day_154__direct_mode_merging.mdwn b/doc/design/assistant/blog/day_154__direct_mode_merging.mdwn new file mode 100644 index 000000000..c3233c36d --- /dev/null +++ b/doc/design/assistant/blog/day_154__direct_mode_merging.mdwn @@ -0,0 +1,21 @@ +Got merging working in direct mode! + +Basically works as outlined yesterday, although slightly less clumsily. +Since there was already code that ran `git diff-tree` to update the +associated files mappings after a merge, I was able to adapt that same code +to also update the working tree. + +An important invariant for direct mode merges is that they should never +cause annexed objects to be dropped. So if a file is deleted by a merge, +and was a direct mode file that was the only place in the working copy +where an object was stored, the object is moved into `.git/annex/objects`. +This avoids data loss and any need to re-transfer objects after a merge. +It also makes renames and other move complex tree manipulations always end +up with direct mode files, when their content was present. + +Automatic merge conflict resoltion doesn't quite work right yet in direct +mode. + +Direct mode has landed in the `master` branch, but I still consider it +experimental, and of course the assistant still needs to be updated to +support it. diff --git a/doc/design/assistant/blog/day_155__bugfixes.mdwn b/doc/design/assistant/blog/day_155__bugfixes.mdwn new file mode 100644 index 000000000..42a95cc5a --- /dev/null +++ b/doc/design/assistant/blog/day_155__bugfixes.mdwn @@ -0,0 +1,15 @@ +Finished getting automatic merge conflict resolution working in direct +mode. Turned out I was almost there yesterday, just a bug in a filename +comparison needed to be fixed. + +Fixed a bug where the assistant dropped a file after transferring it, +despite the preferred content settings saying it should keep its copy of +the file. This turned out to be due to it reading the transfer info +incorrectly, and adding a "\n" to the end of the filename, which caused the +preferred content check to think it wasn't wanted after all. (Probably +because it thought 0 copies of the file were wanted, but I didn't look into +this in detail.) + +Worked on my test suite, particularly more QuickCheck tests. I need to +use QuickCheck more, particularly when I've pairs of functions, like encode +and decode, that make for easy QuickCheck properties. diff --git a/doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn b/doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn new file mode 100644 index 000000000..f49d2914f --- /dev/null +++ b/doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn @@ -0,0 +1,45 @@ +Over Christmas, I'm working on making the assistant support direct +mode. I like to have a fairly detailed plan before starting this kind of +job, but in this case, I don't. (Also I have a cold so planning? Meh.) +This is a process of seeing what's broken in direct mode and fixing it. +I don't know if it'll be easy or hard. Let's find out.. + +* First, got direct mode adding of new files working. This was not hard, all the + pieces I needed were there. For now, it uses the same method as in + indirect mode to make sure nothing can modify the file while it's being + added. + +* An unexpected problem is that in its startup scan, the assistant runs + `git add --update` to detect and stage any deletions that happened + while it was not running. But in direct mode that also stages the full file + contents, so can't be used. Had to switch to using git plumbing to only + stage deleted files. Happily this also led to fixing a bug; deletions + were not always committed at startup when using the old method; with the + new method it can tell when there are deletions and trigger a commit. + +* Next, got it to commit when direct mode files are modified. The Watcher + thread gets a inotify event when this happens, so that was easy. (Although + in doing that I had to disable a guard in direct mode that made annexed + files co-exist with regular in-git files, so such mixed repositories + probably won't work in direct mode yet.) + + However, naughty kqueue is another story, there are no kqueue events for + file modifications. So this won't work on OSX or the BSDs yet. I tried + setting some more kqueue flags in hope that one would make such events + appear, but no luck. Seems I will need to find some other method to detect + file modifications, possibly an OSX-specific API. + +* Another unexpected problem: When an assistant receives new files from one + of its remotes, in direct mode it still sets up symlinks to the content. + This was because the Merger thread didn't use the `sync` command's direct + mode aware merge code.. so fixed that. + +* Finally there was some direct mode bookeeping the assistant has + to get right. For example, when a file is modified, the old object has + to be looked up, and be marked as not locally present any longer. That + lookup relies on the already running `git cat-file --batch`, so it's + not as fast as it could be, if I kept a local cache of the mapping + between files and objects. But it seems fast enough for now. + +At this point the assistant seems to work in direct mode on Linux! +Needs more testing.. diff --git a/doc/design/assistant/blog/day_158__fsevents.mdwn b/doc/design/assistant/blog/day_158__fsevents.mdwn new file mode 100644 index 000000000..472b6c2be --- /dev/null +++ b/doc/design/assistant/blog/day_158__fsevents.mdwn @@ -0,0 +1,20 @@ +Investigated using the OSX fsevents API to detect when files are modified, +so they can be committed when using direct mode. There's a +[haskell library](http://hackage.haskell.org/package/hfsevents-0.1.3) +and even a [sample directory watching program](http://hackage.haskell.org/package/hobbes). +Initial tests look good... + +Using fsevents will avoid kqueue's problems with needing enough file +descriptors to open every subdirectory. kqueue is a rather poor match for +git-annex's needs, really. It does not seem to provide events for file +modifications at all, unless every *file* is individually opened. While I +dislike leaving the BSD's out, they need a better interface to be perfectly +supported by git-annex, and kqueue will still work for indirect mode +repositories. + +---- + +Got the assistant to use fsevents. It seems to work well! + +The only problem I know of is that it doesn't yet handle whole directory +renames. That should be easy to fix later. diff --git a/doc/design/assistant/blog/day_158__fsevents/comment_1_b278372ac6399f64d5fa9da178278a6d._comment b/doc/design/assistant/blog/day_158__fsevents/comment_1_b278372ac6399f64d5fa9da178278a6d._comment new file mode 100644 index 000000000..a13936ed5 --- /dev/null +++ b/doc/design/assistant/blog/day_158__fsevents/comment_1_b278372ac6399f64d5fa9da178278a6d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkey8WuXUh_x5JC2c9_it1CYRnVTgdGu1M" + nickname="Dustin" + subject="Linux Support" + date="2012-12-27T21:37:45Z" + content=""" +Does this mean Linux will not support Direct mode? +"""]] diff --git a/doc/design/assistant/blog/day_158__fsevents/comment_2_2d5ce9b2807068c3517e185945662bd2._comment b/doc/design/assistant/blog/day_158__fsevents/comment_2_2d5ce9b2807068c3517e185945662bd2._comment new file mode 100644 index 000000000..edd63b125 --- /dev/null +++ b/doc/design/assistant/blog/day_158__fsevents/comment_2_2d5ce9b2807068c3517e185945662bd2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.127" + subject="comment 2" + date="2012-12-28T02:46:23Z" + content=""" +No, linux's inotify has everything I need for direct mode. +"""]] diff --git a/doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn b/doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn new file mode 100644 index 000000000..754e2c91f --- /dev/null +++ b/doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn @@ -0,0 +1,16 @@ +Short day today, but I spent it all on testing the new FSEvents code, +getting it working with the assistant in direct mode. This included fixing +its handling of renaming, and various other bugs. + +The assistant in direct mode now seems to work well on OSX. So I made +the assistant *default* to making direct mode repositories on OSX. + +That'll presumably flush out any bugs. :) More importantly, +it let me close several OSX-specific bugs to do with interactions between +git-annex's symlinks and OSX programs that were apparently written under the +misprehension that it's a user-mode program's job to manually follow symlinks. + +Of course, defaulting to direct mode also means users can just modify files +as they like and the assistant will commit and sync the changed files. +I'm waiting to see if direct mode becomes popular enough to make it the +default on all OS's. diff --git a/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_1_b85f446c3fa8d703a2a8882825c6f33f._comment b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_1_b85f446c3fa8d703a2a8882825c6f33f._comment new file mode 100644 index 000000000..8bc089857 --- /dev/null +++ b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_1_b85f446c3fa8d703a2a8882825c6f33f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2012-12-28T23:53:22Z" + content=""" +Make a release please, Im eager to try it out!:) +"""]] diff --git a/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment new file mode 100644 index 000000000..bc9c7031b --- /dev/null +++ b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFhHPFP7j3wGNgBxEJoA8LcBJ4Xd1tTMY" + nickname="Joe" + subject="Release + Version Number" + date="2012-12-29T11:16:05Z" + content=""" +I second Laszlo's request for a release! Also, could you include a version number of some sort on the download (and binary if there isn't one there) to make it easy to tell what is available for download vs. what is installed? +"""]] diff --git a/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_3_37abc41bae23a1d7de0d19d952aec492._comment b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_3_37abc41bae23a1d7de0d19d952aec492._comment new file mode 100644 index 000000000..b08636fd8 --- /dev/null +++ b/doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_3_37abc41bae23a1d7de0d19d952aec492._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-12-29T13:26:30Z" + content=""" +There are daily/hourly builds at the [[install/OSX]] install page, try out the new features from there +"""]] diff --git a/doc/design/assistant/blog/day_15__its_aliiive.mdwn b/doc/design/assistant/blog/day_15__its_aliiive.mdwn new file mode 100644 index 000000000..10ef4ffe5 --- /dev/null +++ b/doc/design/assistant/blog/day_15__its_aliiive.mdwn @@ -0,0 +1,33 @@ +Syncing works! I have two clones, and any file I create in the first +is immediately visible in the second. Delete that file from the second, and +it's immediately removed from the first. + +Most of my work today felt like stitching existing limbs onto a pre-existing +monster. Took the committer thread, that waits for changes and commits them, +and refashioned it into a pusher thread, that waits for commits and pushes +them. Took the watcher thread, that watches for files being made, +and refashioned it into a merger thread, that watches for git refs being +updated. Pulled in bits of the `git annex sync` command to reanimate this. + +It may be a shambling hulk, but it works. + +Actually, it's not much of a shambling hulk; I refactored my code after +copying it. ;) + +I think I'm up to 11 threads now in the new +`git annex assistant` command, each with its own job, and each needing +to avoid stepping on the other's toes. I did see one MVar deadlock error +today, which I have not managed to reproduce after some changes. I think +the committer thread was triggering the merger thread, which probably +then waited on the Annex state MVar the committer thread had held. + +Anyway, it even pushes to remotes in parallel, and keeps track of remotes +it failed to push to, although as of yet it doesn't do any attempt at +periodically retrying. + +One bug I need to deal with is that the push code assumes any change +made to the remote has already been pushed back to it. When it hasn't, +the push will fail due to not being a fast-forward. I need to make it +detect this case and pull before pushing. + +(I've pushed this work out in a new `assistant branch`.) diff --git a/doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn b/doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn new file mode 100644 index 000000000..c789ca2f6 --- /dev/null +++ b/doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn @@ -0,0 +1,10 @@ +A few final bits and pieces of direct mode. Fixed a few more bugs in the +assistant. Made all git-annex commands that don't work at +all, or only partially work in direct mode, refuse to run at all. Also, +some optimisations. + +I'll surely need to revisit direct mode later and make more commands +support it; `fsck` and `add` especially. +But the only thing I'd like to deal with before I make a release with direct +mode is the problem of files being able to be modified while they're +being transferred, which can result in data loss. diff --git a/doc/design/assistant/blog/day_161__release_day.mdwn b/doc/design/assistant/blog/day_161__release_day.mdwn new file mode 100644 index 000000000..5e3a62168 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day.mdwn @@ -0,0 +1,8 @@ +Released the first git-annex with direct mode today. Notably, the assistant +enables direct mode in repositories it creates. All builds are updated to +3.20130102 now. + +My plan for this month is to fix whatever things currently might be +preventing you from using the git-annex assistant. So bugfixes and +whatever other important gaps need to be filled, but no major new +feature developments. diff --git a/doc/design/assistant/blog/day_161__release_day/comment_1_e82c67f3ce216618149537bba1e0b850._comment b/doc/design/assistant/blog/day_161__release_day/comment_1_e82c67f3ce216618149537bba1e0b850._comment new file mode 100644 index 000000000..f697d12dc --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_1_e82c67f3ce216618149537bba1e0b850._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2013-01-02T21:26:32Z" + content=""" +1. Im not able to set direct mode (linux build, Version: 3.20130102 in about page). +Is there something specific needed? I started fresh. I added a new directory (empty), once +git annex assistant started, I copied files to that directory, and the assistant +replaced all files with symlinks, just as before. +What am I missing here? + +2. It is just minor usability remark: + I would like to see in the gui somewhere shown where the actual config is stored (~/.config/git-annex), +and an option to wipe it out and start fresh. Also a restart button. + +Best, Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_2_b1fe96fd818935c0497b78bb8ad32ffa._comment b/doc/design/assistant/blog/day_161__release_day/comment_2_b1fe96fd818935c0497b78bb8ad32ffa._comment new file mode 100644 index 000000000..1e44738a1 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_2_b1fe96fd818935c0497b78bb8ad32ffa._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 2" + date="2013-01-03T17:59:22Z" + content=""" +\"I added a new directory (empty)\" + +Sounds like you set up the repository yourself, rather than letting the assistant do it. If so, it won't be in direct mode. You can `git annex assistant--stop`, and then `git annex direct` to enable direct mode. + +Restart/shutdown in the UI coming soon, I think. + +The entire git-annex configuration, include that of the assistant, is stored in the `.git/config` of your reposository, and on its `git-annex` branch. Deleting the repository is thus all that's needed to start over. +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_3_40bac0e1756aa77bb966c4654857141c._comment b/doc/design/assistant/blog/day_161__release_day/comment_3_40bac0e1756aa77bb966c4654857141c._comment new file mode 100644 index 000000000..5bb35353b --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_3_40bac0e1756aa77bb966c4654857141c._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 3" + date="2013-01-03T22:23:36Z" + content=""" +>> I added a new directory (empty) + +> Sounds like you set up the repository yourself, rather than letting the assistant do it. +> If so, it won't be in direct mode. You can git annex assistant--stop, +> and then git annex direct to enable direct mode. + +I added like this: +0. no git-annex or git-annex-assistant is running +1. create directory (/mnt/dxd/annex) +2. launch git-annex-assistant +3. add repository via the webbrowser +4. copy a file over this(/mnt/dxd/annex) directory (via command line or nautilus) + +The file is replaced with symlink. + +This fix the issue: +0. stop git-annex-assistant +1. Go in the shell to that directory (cd /mnt/dxd/annex) +2. switch to direct mode (/home/looser/Desktop/download/git-annex.linux/git-annex direct) +3. start git-annex-assistant +4. create a new repository(/mnt/dxd/annex2) via the webbrowser (add repository in top right corner) +5. Now: +/mnt/dxd/annex - NOT in direct mode (symlinks created instantly) +/mnt/dxd/annex2 - in direct mode + +Im really happy I have finally direct mode running. +I will surely stress-test git-annex in the coming weeks. + +> Restart/shutdown in the UI coming soon, I think. + +Awesome. + +> The entire git-annex configuration, include that of the assistant, +> is stored in the .git/config of your reposository, and on its git-annex branch. +> Deleting the repository is thus all that's needed to start over. + +Thank you for the answer. +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_4_af65656b0d1179636937595868bb97b0._comment b/doc/design/assistant/blog/day_161__release_day/comment_4_af65656b0d1179636937595868bb97b0._comment new file mode 100644 index 000000000..178e2ead4 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_4_af65656b0d1179636937595868bb97b0._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 4" + date="2013-01-03T22:33:54Z" + content=""" +Usecase: +Keep two directories in sync on the same computer. + +\"Removable drive\" almost covers this, except you need an usb thumbdrive +permanently plugged into the computer. + +Would be nice, if I could select a \"sync to this local folder\" option +alongside the \"Select drive:\" option. + +So it is my choice if I want to sync to a partition or to a folder. + +Bug(?): +I created two repositories: +/mnt/dxd/annex +/mnt/dxd/annex2 + +And I added a \"Removable drive\" syncing option to /mnt/dxd/annex2, and I selected the \"/mnt/dxd\" drive as removable drive. +The two repositories got mixed together +(ie. broken symlinks pointing to nonexistent .git/annex/objects/.. file) + +Best, + Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_5_0c05caaaf9588e124585041bf5f45d75._comment b/doc/design/assistant/blog/day_161__release_day/comment_5_0c05caaaf9588e124585041bf5f45d75._comment new file mode 100644 index 000000000..e461bfdc4 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_5_0c05caaaf9588e124585041bf5f45d75._comment @@ -0,0 +1,20 @@ +[[!comment format=c + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 5" + date="2013-01-03T22:49:41Z" + content=""" +Ok, I think I figured it out. I have quit from git-annex-assistant (Ctrl-C in terminal window). + +And launched this command: +$ ps -e |grep git-ann + 1782 ? 00:01:00 git-annex +20144 pts/0 00:00:00 git-annex-webap +20148 pts/0 00:00:00 git-annex +20178 pts/0 00:00:00 git-annex +20508 pts/0 00:00:00 git-annex +20528 ? 00:00:02 git-annex +21132 ? 00:00:00 git-annex + +I will be more cautious in future. +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_6_5dfb5f428633d6062925f61af2b8829b._comment b/doc/design/assistant/blog/day_161__release_day/comment_6_5dfb5f428633d6062925f61af2b8829b._comment new file mode 100644 index 000000000..f9683c820 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_6_5dfb5f428633d6062925f61af2b8829b._comment @@ -0,0 +1,23 @@ +[[!comment format=c + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 6" + date="2013-01-03T22:55:41Z" + content=""" +another problem: +1. If you add a removable drive via the gui, you can not remove it anymore (from the gui) +2. If you delete the directory on the removable drive, git-annex assistant silently fails +to recreate the directory and start fresh. +2/a. on the gui, there is no indication something is wrong with the removable drive repository +2/b on the terminal it shows only this: +fatal: Not a git repository: '/mnt/dxd/annex/.git' + +On the main page it shows the two repositories, but on the upper right corner, the dropdown menu +contains only the original repository and not the removeable drive repository. + +I stop spaming now... + +Laszlo + + +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_7_ac4effb381b08d94d4a2d2482e92c89a._comment b/doc/design/assistant/blog/day_161__release_day/comment_7_ac4effb381b08d94d4a2d2482e92c89a._comment new file mode 100644 index 000000000..359947a5a --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_7_ac4effb381b08d94d4a2d2482e92c89a._comment @@ -0,0 +1,13 @@ +[[!comment format=c + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 7" + date="2013-01-03T23:07:27Z" + content=""" +Can not withstand myself. + +1. If you add a Removable drive repository, only the *new* files are copied over to the removable drive. +2. Removable drive repository is not in direct mode. +Would be nice if it could be kept the same mode as the original repository. +It is some kind of special repsoitory, I do not see any seemlinks either. +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_8_32600e89e3098e52a1280895e03b3f86._comment b/doc/design/assistant/blog/day_161__release_day/comment_8_32600e89e3098e52a1280895e03b3f86._comment new file mode 100644 index 000000000..c220fc826 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_8_32600e89e3098e52a1280895e03b3f86._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://csights.myopenid.com/" + ip="70.226.161.163" + subject="walkthroughs?" + date="2013-01-04T02:39:59Z" + content=""" +Could you post some walk-throughs? +Is it possible to set up a direct mode repository using git-annex webapp ? + +Thanks for your work! Sad to hear you had to get a generator. :) +C. + +"""]] diff --git a/doc/design/assistant/blog/day_161__release_day/comment_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment b/doc/design/assistant/blog/day_161__release_day/comment_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment new file mode 100644 index 000000000..fc8c9c4b1 --- /dev/null +++ b/doc/design/assistant/blog/day_161__release_day/comment_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.166.255" + subject="comment 9" + date="2013-01-04T20:26:46Z" + content=""" +You noted in a recent blog post that direct mode won't work with mixed repositories, that is, those that have files checked into git alongside annexed ones. Is this still the case? Thanks. +"""]] diff --git a/doc/design/assistant/blog/day_162__UI.mdwn b/doc/design/assistant/blog/day_162__UI.mdwn new file mode 100644 index 000000000..8994835c6 --- /dev/null +++ b/doc/design/assistant/blog/day_162__UI.mdwn @@ -0,0 +1,17 @@ +[Installed a generator](http://joeyh.name/blog/entry/overcast/), +so I'll have more power and less hibernation. + +Added UI in the webapp to shut down the daemon. Would like to also have +restart UI, but that's rather harder to do, seems it'd need to start +another copy of the webapp (and so, of the assistant), and redirect the +browser to its new url. ... But running two assistants in the same repo at +the same time isn't good. Anyway, users can now use the UI to shut it down, +and then use their native desktop UI to start it back up. + +[[!img /assistant/controlmenu.png]] + +Spiffed up the control menu. Had to stop listing other local repositories +in the menu, because there was no way to notice when a new one was added +(without checking a file on every page load, which is way overkill for this +minor feature). Instead added a new page that lists local repositories it +can switch to. diff --git a/doc/design/assistant/blog/day_163__free_features.mdwn b/doc/design/assistant/blog/day_163__free_features.mdwn new file mode 100644 index 000000000..444b6cc30 --- /dev/null +++ b/doc/design/assistant/blog/day_163__free_features.mdwn @@ -0,0 +1,32 @@ +There was a typo in cabal file that broke building the assistant on OSX. +This didn't affect the autobuilds of the app, but several users building by +hand reported problems. I made a new minor release fixing that typo, and +also a resouce leak bug. + +Got a restart UI working after all. It's a hack though. It +opens a new tab for the new assistant instance, and as most web browsers +don't allow javascript to close tabs, the old tab is left open. At some +point I need to add a proper thread manager to the assistant, which the +restart code could use to kill the watcher and committer threads, and then +I could do a clean restart, bringing up the new daemon and redirecting the +browser to it. + +Found a bug in the assistant in direct mode -- the expensive transfer scan +didn't queue uploads needed to sync to other repos in direct mode, although +it did queue downloads. Fixing this laid some very useful groundwork for +making more commands support direct mode, too. Got stuck for a long time +dealing with some very strange `git-cat-file` behavior while making this +work. Ended up putting in a workaround. + +After that, I found that these commands work in direct mode, without +needing any futher changes! + +* `git annex find` +* `git annex whereis` +* `git annex copy` +* `git annex move` +* `git annex drop` +* `git annex log` + +Enjoy! The only commands I'd like to add to this are `fsck`, `add`, +and `addurl`... diff --git a/doc/design/assistant/blog/day_164__bugfixes.mdwn b/doc/design/assistant/blog/day_164__bugfixes.mdwn new file mode 100644 index 000000000..1edca3d19 --- /dev/null +++ b/doc/design/assistant/blog/day_164__bugfixes.mdwn @@ -0,0 +1,17 @@ +Several bugfixes from user feedback today. + +Made the assistant detect misconfigured systems where git will fail to +commit because it cannot determine the user's name or email address, and +dummy up enough info to get git working. It makes sense for git and +git-annex to fail at the command line on such a misconfigured system, so +the user can fix it, but for the assistant it makes sense to plow on and just +work. + +I found a big gap in direct mode -- all the special remotes expected to find +content in the indirect mode location when transferring to the remote. It +was easy to fix once I noticed the problem. This is a big enough bug that +I will be making a new release in a day or so. + +Also, got fsck working in direct mode. It doesn't check as many things +as in indirect mode, because direct mode files can be modified at any time. +Still, it's usable, and useful. diff --git a/doc/design/assistant/blog/day_165__release_day.mdwn b/doc/design/assistant/blog/day_165__release_day.mdwn new file mode 100644 index 000000000..f29c6e589 --- /dev/null +++ b/doc/design/assistant/blog/day_165__release_day.mdwn @@ -0,0 +1,16 @@ +(Posted a day late.) [[!meta date="Mon Jan 7 16:05:13 JEST 2013"]] + +Got `git annex add` (and `addurl`) working in direct mode. This allowed me +to make `git annex sync` in direct mode no longer automatically add new +files. + +It's also now safe to mix direct mode annexed files with regular files in +git, in the same repository. Might have been safe all along, but I've +tested it, and it certainly works now. You just have to be careful to not +use `git commit -a` to commit changes to such files, since that'll also +stage the entire content of direct mode files. + +Made a minor release for these recent changes and bugfixes. Recommended if +you're using direct mode. Had to chase down a stupid typo I made yesterday +that caused fsck to infinite loop if it found a corrupted file. Thank +goodness for test suites. diff --git a/doc/design/assistant/blog/day_166__a_short_long_day.mdwn b/doc/design/assistant/blog/day_166__a_short_long_day.mdwn new file mode 100644 index 000000000..5f03fd1cf --- /dev/null +++ b/doc/design/assistant/blog/day_166__a_short_long_day.mdwn @@ -0,0 +1,25 @@ +I was up at the crack of dawn wrestling 100 pound batteries around for 3 +hours and rewiring most of my battery bank, so today is a partial day... +but a day with power, which is always nice. + +Did some design work on finally making transfers of files from direct mode +repositories safe, even if a file is modified as it's being uploaded. +This seems easily doable for special remotes; git to git repository +transfers are harder, but I think I see how to do it without breaking +backwards compatability. + +(An unresolved problem is that a temp file would be left behind when a +transfer failed due to a file being changed. What would really be nice to +do is to use that temp file as the rsync basis when transferring the new +version of a file. Although this really goes beyond direct mode, and into +[[deltas]] territory.) + +Made fsck work better in direct mode repositories. While it's expected for +files to change at any time in direct mode, and so fsck cannot complain +every time there's a checksum mismatch, it is possible for it to detect +when a file does not *seem* to have changed, then check its checksum, +and so detect disk corruption or other data problems. + +Also dealt with several bug reports. One really weird one involves `git +cat-file` failing due to some kind of gpg signed data in the git-annex +branch. I don't understand that at all yet. diff --git a/doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn new file mode 100644 index 000000000..8aa15fb13 --- /dev/null +++ b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn @@ -0,0 +1,12 @@ +Well underway on making direct mode transfers roll back when the file is +modified while it's transferred. + +As expected, it was easy to do for all the special remotes ... Except for +bup, which does not allow deleting content. For bup it just removes the git +ref for the bad content, and relies on bup's use of git delta compression +to keep space use sane. + +The problem is also handled by `git-annex-shell sendkey`. +But not yet for downloads from other git repositories. Bit stuck on that. + +Also: A few minor bug fixes. diff --git a/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_1_f1aa64fe803d8c14b250a4e98b88142a._comment b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_1_f1aa64fe803d8c14b250a4e98b88142a._comment new file mode 100644 index 000000000..4b5092036 --- /dev/null +++ b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_1_f1aa64fe803d8c14b250a4e98b88142a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="comment 1" + date="2013-01-10T08:49:20Z" + content=""" +hmm, wouldn't it make sense to do the downloads into the annex object space, just like with indirect annexes? Then when the download is complete, with indirect annexes you create a soft link and with direct annexes you move the file (or create a hardlink and remove the directory entry in the annex object space)? Actually when you started to talk about direct I first envisioned it to be exactly like indirect, only with hard links instead of soft links. +"""]] diff --git a/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_2_5ce1db84c9ead713f1272c4975645b93._comment b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_2_5ce1db84c9ead713f1272c4975645b93._comment new file mode 100644 index 000000000..c1b2724cb --- /dev/null +++ b/doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_2_5ce1db84c9ead713f1272c4975645b93._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-10T16:06:28Z" + content=""" +That is how direct mode works. (Although without the hard links, since maintaining them doesn't have any benefits.) And that's how downloading into a direct mode repo works. The issue I'm dealing with, though, is uploading from a direct mode repo, where the file that's being uploaded can be modified at the same time. +"""]] diff --git a/doc/design/assistant/blog/day_168__back_to_theme.mdwn b/doc/design/assistant/blog/day_168__back_to_theme.mdwn new file mode 100644 index 000000000..ff230e764 --- /dev/null +++ b/doc/design/assistant/blog/day_168__back_to_theme.mdwn @@ -0,0 +1,18 @@ +This month's theme is supposed to be fixing up whatever might prevent users +from using the assistant. To that end, I've posted an open-ended poll, +[[polls/what is preventing me from using git-annex assistant]]. Please go +fill it out so I can get an idea of how many people are using the +assistant, and what needs to be done to get the rest of you, and your +friends and family able to use it. + +In the meantime, today I fixed several bugs that were recently reported in +the webapp and assistant. Getting it working as widely as possible, even on +strange IPv6 only systems, and with browsers that didn't like my generated +javascript code is important, and fits right into this month's theme. I'm +happy to see lots of bugs being filed, since it means more users are trying +the assistant out. + +Also continued work on making direct mode transfers safe. All transfers to +local git remotes (wish I had a better phrase!) are now safe in direct mode. +Only uploading from a direct mode repository over ssh to another git +repository is still potentially unsafe. diff --git a/doc/design/assistant/blog/day_168__back_to_theme/comment_1_f248780bfcbd0384d9d72c2633a4ea46._comment b/doc/design/assistant/blog/day_168__back_to_theme/comment_1_f248780bfcbd0384d9d72c2633a4ea46._comment new file mode 100644 index 000000000..eaa098d69 --- /dev/null +++ b/doc/design/assistant/blog/day_168__back_to_theme/comment_1_f248780bfcbd0384d9d72c2633a4ea46._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="phrase suggestion" + date="2013-01-11T00:24:39Z" + content=""" +I suggest using the term \"repository\" not \"remote\". Two reasons: 1: it's a noun in *English. 2: it works for both local and remote repositories. + +Both get +1 because they match git terminology. (I have a secret dream that the assistant might bring people to git, maybe that's silly.) + +\* OK, so \"remote\" is also a noun in English, but it means the widget with buttons that controls the tv/whatever. +"""]] diff --git a/doc/design/assistant/blog/day_168__back_to_theme/comment_2_5beba073373b8e75a32d1fcfdc1a0782._comment b/doc/design/assistant/blog/day_168__back_to_theme/comment_2_5beba073373b8e75a32d1fcfdc1a0782._comment new file mode 100644 index 000000000..630892025 --- /dev/null +++ b/doc/design/assistant/blog/day_168__back_to_theme/comment_2_5beba073373b8e75a32d1fcfdc1a0782._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://csights.myopenid.com/" + ip="70.226.161.163" + subject=""local git remotes"" + date="2013-01-13T02:36:48Z" + content=""" +I am not quite sure how git-annex works and I do not know what a \"local git remote\" functionality is. + +How about this: call a \"git remote\" a \"git-annex store\" or just \"store\". Then instead of a remote git remote it would be a remote git-annex store or just remote store. :) + + + +"""]] diff --git a/doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn b/doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn new file mode 100644 index 000000000..c3f569bd8 --- /dev/null +++ b/doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn @@ -0,0 +1,24 @@ +I've finished making direct mode file transfers safe. The last piece of the +puzzle was making `git-annex-shell recv-key` check data it's received from +direct mode repositories. This is a bit expensive, but avoids adding +another round-trip to the protocol. I might revisit this later, this was +just a quick fix. + +--- + +The [[poll|polls/what is preventing me from using git-annex assistant]] was +quite useful. Some interesting points: + +* 14% have been reading this blog, and rightly don't trust direct mode to + be safe. Which is why I went ahead with a quick fix to make it safe. +* 6% want an Ubuntu PPA. I don't anticipate doing this myself, but + if anyone who develops for Ubuntu wants to put together a PPA with a + newer version, I can help you pick the newer haskell packages you'll + need from Debian, etc. +* 9% just need me to update the amd64 build in Debian sid. I forgot to + include it in the last release, and the Debian buildds cannot currently + autobuild git-annex due to some breakage in the versions of haskell + libraries in unstable. Hopefully I'll remember to include an amd64 build + in my next release. + +And lots of other interesting stuff, I have a nice new TODO list now. :) diff --git a/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_1_65f87656c4e6bc7cdb614f53961341c9._comment b/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_1_65f87656c4e6bc7cdb614f53961341c9._comment new file mode 100644 index 000000000..b51153cad --- /dev/null +++ b/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_1_65f87656c4e6bc7cdb614f53961341c9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.166.255" + subject="comment 1" + date="2013-01-11T20:25:48Z" + content=""" +If you have time, an updated sid package for armel would be much appreciated. +"""]] diff --git a/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_2_a116a402a126c62be54c06afd82439ab._comment b/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_2_a116a402a126c62be54c06afd82439ab._comment new file mode 100644 index 000000000..7afd951e1 --- /dev/null +++ b/doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_2_a116a402a126c62be54c06afd82439ab._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://csights.myopenid.com/" + ip="70.226.161.163" + subject="use debian repos instead of Ubuntu PPA?" + date="2013-01-12T13:43:44Z" + content=""" +Maybe Ubuntu users would be satisfied with tweaks to their sources.list and preferences? + +/etc/apt/sources.list.d/git-annex.sources.list +deb http://ftp.us.debian.org/debian unstable main + +/etc/apt/preferences.d/git-annex.preferences +Package: * +Pin: release a=unstable,o=Debian +Pin-Priority: 400 + + +Not sure how that will work out in Ubuntu package manager. In aptitude you'll get warning about untrusted repos (maybe install Debian's gpg keys) and will probably have to manually select dependencies from Debian repos. +"""]] diff --git a/doc/design/assistant/blog/day_16__more_robust_syncing.mdwn b/doc/design/assistant/blog/day_16__more_robust_syncing.mdwn new file mode 100644 index 000000000..e9343f846 --- /dev/null +++ b/doc/design/assistant/blog/day_16__more_robust_syncing.mdwn @@ -0,0 +1,44 @@ +I released a version of git-annex over the weekend that includes the `git +annex watch` command. There's a minor issue installing it from cabal on +OSX, which I've fixed in my tree. Nice timing: At least the watch command +should be shipped in the next Debian release, which freezes at the end of +the month. + +Jimmy found out how kqueue [[blows +up|bugs/Issue_on_OSX_with_some_system_limits]] when there are too many +directories to keep all open. I'm not surprised this happens, but it's nice +to see exactly how. Odd that it happened to him at just 512 directories; +I'd have guessed more. I have plans to fork watcher programs that each +watch 512 directories (or whatever the ulimit is), to deal with this. What +a pitiful interface is kqueue.. I have not thought yet about how the watcher +programs would communicate back to the main program. + +---- + +Back on the assistant front, I've worked today on making git syncing more +robust. Now when a push fails, it tries a pull, and a merge, and repushes. +That ensures that the push is, almost always, a fast-forward. Unless +something else gets in a push first, anyway! + +If a push still fails, there's Yet Another Thread, added today, that will +wake up after 30 minutes and retry the push. It currently keeps retrying +every 30 minutes until the push finally gets though. This will deal, to +some degree, with those situations where a remote is only sometimes +available. + +I need to refine the code a bit, to avoid it keeping an ever-growing queue +of failed pushes, if a remote is just dead. And to clear old failed pushes +from the queue when a later push succeeds. + +I also need to write a git merge driver that handles conflicts in the tree. +If two conflicting versions of a file `foo` are saved, this would merge +them, renaming them to `foo.X` and `foo.Y`. Probably X and Y are the +git-annex keys for the content of the files; this way all clones will +resolve the conflict in a way that leads to the same tree. It's also +possible to get a conflict by one repo deleting a file, and another +modifying it. In this case, renaming the deleted file to `foo.Y` may +be the right approach, I am not sure. + +I glanced through some Haskell dbus bindings today. I belive there are dbus +events available to detect when drives are mounted, and on Linux this would +let git-annex notice and sync to usb drives, etc. diff --git a/doc/design/assistant/blog/day_16__more_robust_syncing/comment_1_23e7a90429e4431f90787cd016ebe188._comment b/doc/design/assistant/blog/day_16__more_robust_syncing/comment_1_23e7a90429e4431f90787cd016ebe188._comment new file mode 100644 index 000000000..fece5c9af --- /dev/null +++ b/doc/design/assistant/blog/day_16__more_robust_syncing/comment_1_23e7a90429e4431f90787cd016ebe188._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-06-27T12:46:31Z" + content=""" +can X and Y be the names of the git-annex remotes? +"""]] diff --git a/doc/design/assistant/blog/day_16__more_robust_syncing/comment_2_8e7e7cd27791bb47625e60a284e9c802._comment b/doc/design/assistant/blog/day_16__more_robust_syncing/comment_2_8e7e7cd27791bb47625e60a284e9c802._comment new file mode 100644 index 000000000..e47b03d48 --- /dev/null +++ b/doc/design/assistant/blog/day_16__more_robust_syncing/comment_2_8e7e7cd27791bb47625e60a284e9c802._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 2" + date="2012-07-26T17:27:39Z" + content=""" +That's a good question. Unfortunatly they cannot; X and Y need to be stable across repositories, and git remotes can have different names in different repositories. + +Even using the description that git-annex stores for each repository for X and Y is problimatic, since that description can change, and so could be different in two repos that are each trying to resolve the same merge conflict. +"""]] diff --git a/doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn b/doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn new file mode 100644 index 000000000..251ee7636 --- /dev/null +++ b/doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn @@ -0,0 +1,8 @@ +Fixed a goodly amount of bugs today. + +The most interesting change was that in direct mode, files using the same +key are no longer hardlinked, as that could cause a surprising behavior if +modifying one, where the other would also change. + +Made a release, which is almost entirely bug fixes. Debian amd64 build +included this time. :) diff --git a/doc/design/assistant/blog/day_171__logs.mdwn b/doc/design/assistant/blog/day_171__logs.mdwn new file mode 100644 index 000000000..7c7a4c821 --- /dev/null +++ b/doc/design/assistant/blog/day_171__logs.mdwn @@ -0,0 +1,23 @@ +I've noticed people have some problems getting me logs when there'a a bug, +so I worked on improving the logging of the assistant. + +While the assistant logged to `.git/annex/daemon.log` when started as a +daemon, when the webapp ran it didn't log there. It's somewhat tricky to +make the webapp redirect messages to the log, because it may start a web +browser that wants to write to the console. Took some file descriptor +juggling, but I made this work. Now the log is even used when the assistant +is started for the first time in a newly created repository. So, we have +total log coverage. + +Next, I made a simple page in the webapp to display the accumulated logs. +It does not currently refresh as new things are logged. But it's easier +for me to tell users to click on `Current Repository -> View log` than +ask for them to look for the daemon.log file. + +Finally, I made all the webapp's alerts also be written to the log. + +--- + +Also did the requisite bug fixes. + +[[!img /assistant/logs.png alt="screenshot of logs page"]] diff --git a/doc/design/assistant/blog/day_172__short_day.mdwn b/doc/design/assistant/blog/day_172__short_day.mdwn new file mode 100644 index 000000000..031f90e0f --- /dev/null +++ b/doc/design/assistant/blog/day_172__short_day.mdwn @@ -0,0 +1,22 @@ +Only one bug fix today, but it was a doozie. It seems that gpg2 has an +incompatability with the gpg 1.x that git-annex was written for, that +causes large numbers of excess passphrase prompts, when it's supposed to be +using a remote's symmetric encryption key. Adding the --batch parameter +fixed this. + +I also put together a page listing [[related_software]] to git-annex. + +I've also updated [[direct_mode]]'s documentation, about when it's safe to +use direct mode. The intuition I've developed about direct mode is that if +you don't need full versioning of files (with the ability to get back old +versions), direct mode is fine and safe to use. If you want full +versioning, it's best to not use direct mode. Or a reasonable compromise is +to `git annex untrust` the direct mode repository and set up a backup remote. +With this compromise, only if you edit a file twice in a row might the old +version get lost before it can be backed up. + +Of course, it would be possible to make direct mode fully version +preserving, but it'd have to back up every file in the repository locally +to do so. Going back to two local copies of every file, which is part of +git that git-annex happily avoids. Hmm, it might be possible to only back +up a file locally until it reaches the backup remote.. diff --git a/doc/design/assistant/blog/day_172__short_day/comment_1_b75e26b77a23a45da1c4c3bca1399246._comment b/doc/design/assistant/blog/day_172__short_day/comment_1_b75e26b77a23a45da1c4c3bca1399246._comment new file mode 100644 index 000000000..c7d4c74ca --- /dev/null +++ b/doc/design/assistant/blog/day_172__short_day/comment_1_b75e26b77a23a45da1c4c3bca1399246._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://launchpad.net/~rubiojr" + nickname="rubiojr" + subject="comment 1" + date="2013-01-18T18:42:35Z" + content=""" +Awesome @joey, crisp clear. + +I guess that most people used to the Dropbox way of doing things will not miss versioning that much, which is not very useful for medium/large binary files in most cases I'd say. + +Being able to choose the mode for power users is pretty cool though. +"""]] diff --git a/doc/design/assistant/blog/day_173__snow_day.mdwn b/doc/design/assistant/blog/day_173__snow_day.mdwn new file mode 100644 index 000000000..9b07a8c5f --- /dev/null +++ b/doc/design/assistant/blog/day_173__snow_day.mdwn @@ -0,0 +1,22 @@ +When I wasn't dealing with the snowstorm today, I was fixing more bugs. +Rather serious bugs. + +One actually involved corruption to git-annex's location tracking info, due +to a busted three-way merge. Takes an unusual set of circumstances for that +bug to be triggered, which is why it was not noticed before now. Also, +since git-annex is designed to not trust its location tracking info, and +recover from it becoming inconsistent, someone could have experienced the +bug and not really noticed it. Still it's a serious problem and I'm in debt +to user a-or-b for developing a good test case that let me reproduce it and +fix it. (Also added to the test suite.) +[[This is how to make a perfect bug report|bugs/Annex_thinks_file_exists_afer_being_dropped]] + +Another bug made `git add; git commit` cause data loss in direct mode. +I was able to make that not lose data, although it still does something +that's unlikely to be desired, unless the goal is to move a file from an +annexed direct mode file to having its entire contents stored in git. + +Also found a bug with sync's automatic resolution of git conflicts. It +failed when two repositories both renamed a file to different names. +I had neglected to explicitly `git rm` the old file name, which is +necessary to resolve such a conflict. diff --git a/doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn b/doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn new file mode 100644 index 000000000..b86a39d66 --- /dev/null +++ b/doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn @@ -0,0 +1,25 @@ +On Friday, worked on several bugs in direct mode mapping code. Fixed it +to not crash on invalid unicode in filenames. Dealt with some bugs when +mappings were updated in subdirectories of the repository. + +Those bugs could result in inconsistent mapping files, so today I +made `fsck` check mapping files for consistency. + +Leaving for Australia tomorrow, but I also hope to get another bugfix +release out before my flight leaves. Then will be on vacation for several +days, more or less. Then at Linux Conf Australia, where there will +be a git-annex presentation on February 1st. + +---- + +BTW, I've lined up my Android development hardware for next month. I will +be using an [Asus Transformer](http://en.wikipedia.org/wiki/ASUS_Eee_Pad_Transformer), +kindly lent to me by Mark H. This has the advantage +of having a real keyboard, and running the (currently) second most widely used +version of Android, 4.0.x. I have already experienced frustration getting photos +off the thing and into my photo annex; the file manager is the worst I've +seen since the 80's. I understand why so many want an Android port! + +Interestingly, its main user filesystem is a FUSE mount point on `/sdcard` +backed by an ext4 filesystem on `/data` that a regular user is not allowed +to access. Whatever craziness this entails does not support symlinks. diff --git a/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_1_05a8fd47f54373331741cc869a53b0c3._comment b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_1_05a8fd47f54373331741cc869a53b0c3._comment new file mode 100644 index 000000000..f2a51310d --- /dev/null +++ b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_1_05a8fd47f54373331741cc869a53b0c3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-01-19T20:40:52Z" + content=""" +The Nexus devices all come without support for SD cards and without FAT anywhere to be seen. Indirect mode should work nicely on those. + +-- Richard +"""]] diff --git a/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_2_fc8e65eef954c4caa8321c2fe8b711b7._comment b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_2_fc8e65eef954c4caa8321c2fe8b711b7._comment new file mode 100644 index 000000000..b84ad4e3e --- /dev/null +++ b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_2_fc8e65eef954c4caa8321c2fe8b711b7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="84.48.83.221" + subject="Presentation video" + date="2013-01-19T22:09:50Z" + content=""" +Any chance your presentation will be filmed and made available? +"""]] diff --git a/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_3_399534f540d85cac067fbb7be9d373b4._comment b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_3_399534f540d85cac067fbb7be9d373b4._comment new file mode 100644 index 000000000..ebce958a7 --- /dev/null +++ b/doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_3_399534f540d85cac067fbb7be9d373b4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hamish" + ip="203.0.139.23" + subject="AU" + date="2013-01-24T12:50:06Z" + content=""" +I dont know how busy your LCA week is looking, but I'd love to shout you a beer one evening - perhaps there would also be other git-annex people hanging around the conference and interested too +"""]] diff --git a/doc/design/assistant/blog/day_175__pacific_features.mdwn b/doc/design/assistant/blog/day_175__pacific_features.mdwn new file mode 100644 index 000000000..403088ec8 --- /dev/null +++ b/doc/design/assistant/blog/day_175__pacific_features.mdwn @@ -0,0 +1,15 @@ +15 hours in a plane with in-seat power. Ok, time for some new features! + +Added two new repository groups. + +"manual" can be used to avoid the assistant downloading any file contents +on its own. It'll still upload and otherwise sync data. To download files, +you can use `git annex get` while the assistant is running. You can also +drop files using the command line. + +"source" is for repositories that are the source of new files, but don't +need to retain a copy once the file has been moved to another repository. +A camera would be a good example. + +Ok, those were easy features to code; I suck at being productive on planes. +Release coming up with those, once I find enough bandwidth here in AU. diff --git a/doc/design/assistant/blog/day_175__pacific_features/comment_1_c3ee4386f872b7c76aaecfa638b368cb._comment b/doc/design/assistant/blog/day_175__pacific_features/comment_1_c3ee4386f872b7c76aaecfa638b368cb._comment new file mode 100644 index 000000000..0f2708005 --- /dev/null +++ b/doc/design/assistant/blog/day_175__pacific_features/comment_1_c3ee4386f872b7c76aaecfa638b368cb._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlyFDd2xkx0uj738OArDj10CqEkVfWu_mQ" + nickname="Johann" + subject="comment 1" + date="2013-01-24T15:36:34Z" + content=""" +Regarding 'manual': Maybe it is necessary to adjust the other standard settings for preferred content then. +For the 'transfer' for example it would still make sense to treat a manual repository as a client. +"""]] diff --git a/doc/design/assistant/blog/day_176__thread_management.mdwn b/doc/design/assistant/blog/day_176__thread_management.mdwn new file mode 100644 index 000000000..38f043fcf --- /dev/null +++ b/doc/design/assistant/blog/day_176__thread_management.mdwn @@ -0,0 +1,13 @@ +Got back to hacking today, and did something I've wanted to do for some +time. Made all the assistant's threads be managed by a thread manager. This +allows restarting threads if they crash, by clicking a button in the +webapp. It also will allow for other features later, like stopping and +starting the watcher thread, to pause the assistant adding local files. + +[[!img /assistant/crashrecovery.png]] + +I added the haskell async library as a dependency, which made this pretty +easy to implement. The only hitch is that async's documentation is not +clear about how it handles asyncronous exceptions. It took me quite a while +to work out why the errors I'd inserted into threads to test were crashing +the whole program rather than being caught! diff --git a/doc/design/assistant/blog/day_178__bus_hacking.mdwn b/doc/design/assistant/blog/day_178__bus_hacking.mdwn new file mode 100644 index 000000000..738afd2c9 --- /dev/null +++ b/doc/design/assistant/blog/day_178__bus_hacking.mdwn @@ -0,0 +1,10 @@ +Hacking on a bus to Canberra for [LCA2013](https://lca2013.linux.org.au/), +I made the webapp's UI for pausing syncing to a repository also work for +the local repository. This pauses the watcher thread. (There's also an +annex.autocommit config setting for this.) + +Ironically, this didn't turn out to the use the thread manager I built +yesterday. I am not sure that a ThreadKilled exception would never be +masked in the watcher thread. (There is some overly broad exception +handling in git-annex that dates to back before I quite understood haskell +exceptions.) diff --git a/doc/design/assistant/blog/day_179__brief_updates.mdwn b/doc/design/assistant/blog/day_179__brief_updates.mdwn new file mode 100644 index 000000000..e755ca8ae --- /dev/null +++ b/doc/design/assistant/blog/day_179__brief_updates.mdwn @@ -0,0 +1,19 @@ +Not doing significant coding here at LCA2013, but stuff is still happening: + +* I'll be giving a talk and demo of git-annex and the assistant tomorrow. + Right after a keynote by Tim Berners-Lee! There's no streaming, but + a recording will be available later. +* I've met numerous git-annex users and git-annex curious folk from down + under. +* I had a suggestion that direct mode rename the `.git` directory to + something else, to prevent foot-shooting git commands being used. + A wrapper around git could be used to run git commands, and limit + to safe ones. Under consideration. +* I finally updated the OSX 10.8.2 build to last week's release. + Been having some problems with the autobuilder, but it finally spat out + a build. Hopefully this build is good, and it should fix the javascript + issues with Safari and the webapp. +* Ulrik Sverdrup has written , + which allows using gpg encrypted ssh remotes with git. The same idea + could be expanded to other types of remotes, like S3. I'm excited + about adding encrypted git remote support to the assistant! diff --git a/doc/design/assistant/blog/day_179__brief_updates/comment_1_920a84457d40358507a3eb817a4568d9._comment b/doc/design/assistant/blog/day_179__brief_updates/comment_1_920a84457d40358507a3eb817a4568d9._comment new file mode 100644 index 000000000..c58529cf1 --- /dev/null +++ b/doc/design/assistant/blog/day_179__brief_updates/comment_1_920a84457d40358507a3eb817a4568d9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmnG4EuvZWse5hvgrl0XAK-U61e-0iGaao" + nickname="David" + subject="git commit in direct mode" + date="2013-01-31T08:30:19Z" + content=""" +How about creating a .git/hooks/pre-commit script that warns the user or checks the commit before anything goes wrong? +"""]] diff --git a/doc/design/assistant/blog/day_17__push_queue_prune.mdwn b/doc/design/assistant/blog/day_17__push_queue_prune.mdwn new file mode 100644 index 000000000..54ee75fb8 --- /dev/null +++ b/doc/design/assistant/blog/day_17__push_queue_prune.mdwn @@ -0,0 +1,19 @@ +Not much available time today, only a few hours. + +Main thing I did was fixed up the failed push tracking to use a better data +structure. No need for a queue of failed pushes, all it needs is a map of +remotes that have an outstanding failed push, and a timestamp. Now it +won't grow in memory use forever anymore. :) + +Finding the right thread mutex type for this turned out to be a bit of a +challenge. I ended up with a STM TMVar, which is left empty when there are +no pushes to retry, so the thread using it blocks until there are some. And, +it can be updated transactionally, without races. + +I also fixed a bug outside the git-annex assistant code. It was possible to +crash git-annex if a local git repository was configured as a remote, and +the repository was not available on startup. git-annex now ignores such +remotes. This does impact the assistant, since it is a long running process +and git repositories will come and go. Now it ignores any that +were not available when it started up. This will need to be dealt with when +making it support removable drives. diff --git a/doc/design/assistant/blog/day_180__back.mdwn b/doc/design/assistant/blog/day_180__back.mdwn new file mode 100644 index 000000000..adb336244 --- /dev/null +++ b/doc/design/assistant/blog/day_180__back.mdwn @@ -0,0 +1,7 @@ +Back from Australia. Either later today or tomorrow I'll dig into the +messages I was not able to get to while traveling, and then the plan is to +get into the Android port. + +Video of my LCA2013 [git-annex talk](http://mirror.linux.org.au/linux.conf.au/2013/mp4/gitannex.mp4) +is now available. I have not watched it yet, hope it turned out ok despite +some technical difficulties! diff --git a/doc/design/assistant/blog/day_181__triage.mdwn b/doc/design/assistant/blog/day_181__triage.mdwn new file mode 100644 index 000000000..9c5e92280 --- /dev/null +++ b/doc/design/assistant/blog/day_181__triage.mdwn @@ -0,0 +1,23 @@ +Got fairly far along in my triage of my backlog, looking through everything +that happened after January 23rd. Still 39 or so items to look at. + +There have been several reports of problems with ssh password prompts. +I'm beginning to think the assistant may need to prompt for the password +when setting up a ssh remote. This should be handled by `ssh-askpass` or +similar, but some Linux users probably don't have it installed, and there +seems to be no widely used OSX equivalent. + +--- + +Fixed several bugs today, all involving (gasp) direct mode. + +The tricky one involved renaming or deleting files in direct mode. +Currently nothing removes the old filename from the direct mode +mapping, and this could result in the renamed or deleted file +unexpectedly being put back into the tree when content is downloaded. + +To deal with this, it now assumes that direct mode mappings may be out of +date compared to the tree, and does additional checks to catch +inconsistencies. While that works well enough for the assistant, +I'd also like to make the `pre-commit` hook update the mappings for files +that are changed. That's needed to handle things like `git mv`. diff --git a/doc/design/assistant/blog/day_182__it_begins.mdwn b/doc/design/assistant/blog/day_182__it_begins.mdwn new file mode 100644 index 000000000..48daea78f --- /dev/null +++ b/doc/design/assistant/blog/day_182__it_begins.mdwn @@ -0,0 +1,50 @@ +I need an Android development environment. I briefly looked into rooting +the Asus Transformer so I could put a Debian chroot on it and build +git-annex in there, but this quickly devolved to the typical maze of +forum posts all containing poor instructions and dead links. Not worth it. + +Instead, I'm doing builds on my Sheevaplug, and once I have a static armel +binary, will see what I need to do to get it running on Android. + +Fixed building with the webapp disabled, was broken by recent improvements. +I'll be building without the webapp on arm initially, because ghci/template +haskell on arm is still getting sorted out. (I tried ghc 7.6.2 and ghci is +available, but doesn't quite work.) + +From there, I got a binary built pretty quickly (well, it's arm, so not *too* +quickly). Then tried to make it static by appending +`-optl-static -optl-pthread` to the ghc command line. +This failed with a bunch of errors: + +
+/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../arm-linux-gnueabi/libxml2.a(nanohttp.o): In function `xmlNanoHTTPMethodRedir': (.text+0x2128): undefined reference to `inflateInit2_'
+/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../arm-linux-gnueabi/libxml2.a(xzlib.o): In function `xz_decomp': (.text+0x36c): undefined reference to `lzma_code'
+...
+
+ +Disabling DBUS and (temporarily) XMPP got around that. + +Result! + +
+joey@leech:~/git-annex>ldd tmp/git-annex 
+        not a dynamic executable
+joey@leech:~/git-annex>ls -lha tmp/git-annex 
+-rwxr-xr-x 1 joey joey 18M Feb  6 16:23 tmp/git-annex*
+
+ +Next: Copy binary to Android device, and watch it fail in some interesting way. +Repeat. + +--- + +Also more bug triage this morning... + +Got the pre-commit hook to update direct mode mappings. +Uses `git diff-index HEAD` to find out what's changed. The only +tricky part was detecting when `HEAD` doesn't exist yet. Git's +plumbing is deficient in this area. Anyway, the mappings get updated +much better now. + +Fixed a wacky bug where `git annex uninit` behaved badly on a filesystem +that does not support hardlinks. diff --git a/doc/design/assistant/blog/day_183__plan_b.mdwn b/doc/design/assistant/blog/day_183__plan_b.mdwn new file mode 100644 index 000000000..b310d0412 --- /dev/null +++ b/doc/design/assistant/blog/day_183__plan_b.mdwn @@ -0,0 +1,19 @@ +Have not tried to run my static binary on Android yet, but I'm already +working on a plan B in case that doesn't work. Yesterday I stumbled upon +, a ghc cross-compiler for +Android that uses the Android native development kit. +It first appeared on February 4th. Good timing! + +I've gotten it to build and it emits arm executables, that seem to use the +Android linker. So that's very promising indeed. + +I've also gotten cabal working with it, and have it chewing through +installing git-annex's build dependencies. + +---- + +Also made a release today, this is another release that's mostly bugfixes, +and a few minor features. Including one bug fixed at 6 am this morning, urk. + +I think I will probably split my days between working on Android porting +and other git-annex development. diff --git a/doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn b/doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn new file mode 100644 index 000000000..ac34293c3 --- /dev/null +++ b/doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn @@ -0,0 +1,46 @@ +Have been working on getting all the haskell libraries git-annex uses +built with the android cross compiler. Difficulties so far are +libraries that need tweaks to work with the new version of ghc, and some +that use cabal in ways that break cross compilation. Haskell's network +library was the last and most challenging of those. + +At this point, I'm able to start trying to build git-annex for android. +Here's the first try! + +
+joey@gnu:~/src/git-annex>cabal install -w $HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-unknown-linux-androideabi-ghc --with-ghc-pkg=$HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-unknown-linux-androideabi-ghc-pkg --with-ld=$HOME/.ghc-android-14-arm-linux-androideabi-4.7/bin/arm-linux-androideabi-ld --flags="-Webapp -WebDAV -XMPP -S3 -Dbus"
+Resolving dependencies...
+Configuring git-annex-3.20130207...
+Building git-annex-3.20130207...
+Preprocessing executable 'git-annex' for git-annex-3.20130207...
+on the commandline: Warning:
+    -package-conf is deprecated: Use -package-db instead
+
+Utility/libdiskfree.c:28:26:
+     fatal error: sys/statvfs.h: No such file or directory
+compilation terminated.
+
+ +Should not be far from a first android build now.. + +---- + +While I already have Android "hello world" executables to try, I have not yet +been able to run them. Can't seem to find a directory I can write to on the +Asus Transformer, with a filesystem that supports the +x bit. Do you really +have to root Android just to run simple binaries? I'm crying inside. + +It seems that the blessed Android NDK way would involve making a Java app, +that pulls in a shared library that contains the native code. For haskell, +the library will need to contain a C shim that, probably, calls an entry +point to the Haskell runtime system. Once running, it can use the FFI to +communicate back to the Java side, probably. The good news is that CJ van +den Berg, who already saved my bacon once by developing ghc-android, tells +me he's hard at work on that very thing. + +---- + +In the meantime, downloaded the Android SDK. Have gotten it to build a +`.apk` package from just javascript code, and managed to do it without +using eclipse (thank god). Will need this later, but for now want to wash +my brain out with soap after using it. diff --git a/doc/design/assistant/blog/day_184__just_wanna_run_something/comment_1_689adac7e26cb0b0a4e7ecc787cfd716._comment b/doc/design/assistant/blog/day_184__just_wanna_run_something/comment_1_689adac7e26cb0b0a4e7ecc787cfd716._comment new file mode 100644 index 000000000..b6ad3ac7e --- /dev/null +++ b/doc/design/assistant/blog/day_184__just_wanna_run_something/comment_1_689adac7e26cb0b0a4e7ecc787cfd716._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="hhm" + ip="108.17.80.177" + subject="Write and exec on unrooted Android." + date="2013-02-10T05:43:41Z" + content=""" +See for info on where in the android filesystem you have write, exec ability. + +Basically you have these abilities in `/data/local` from `adb shell` (and in debuggable app's folders using run-as with `adb shell`), and in `/data/data//` for each app (for example the terminal emulator's data dir when using the terminal emulator). + +It might be possible to just have temporary root using an old exploit and writing up a bit of code to just setuid on the process and exec sh (source for nachoroot exploit ). + +It *is* possible to install a distro without root using a chroot faker. + +I am working here on a way to install the OpenWrt distro on Android. This is working on my phone already for quite a while! So far only sketchy notes are up, but more to come, G-d willing. +"""]] diff --git a/doc/design/assistant/blog/day_185__android_liftoff.mdwn b/doc/design/assistant/blog/day_185__android_liftoff.mdwn new file mode 100644 index 000000000..88fc5635c --- /dev/null +++ b/doc/design/assistant/blog/day_185__android_liftoff.mdwn @@ -0,0 +1,20 @@ +Thanks to hhm, who pointed me at [KBOX](http://kevinboone.net/kbox.html), +I have verified that I can build haskell programs that work on Android. + +After hacking on it all day, I've succeeded in making an initial build of +git-annex for Android. It links! It runs! + +Which is not to say it's usable yet; for one thing I need to get a port +of git before it can do anything useful. (Some of the other things git-annex +needs, like ssh and sha256sum, are helpfully provided by KBOX.) + +Next step will be to find or built a git port for Android. I know there's +one in the "Terminal IDE" app. Once I can use git-annex at the command line +on Android, I'll be able to test it out some (I can also port the test +suite program and run it on Android), and get a feeling for what is needed +to get the port to a usable command-line state. + +And then on to the webapp, and an Android app, I suppose. So far, the port +doesn't include the webapp, but does include the assistant. The webapp +needs ghci/template haskell for arm. A few people have been reporting they +have that working, but I don't yet. diff --git a/doc/design/assistant/blog/day_185__android_liftoff/comment_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment b/doc/design/assistant/blog/day_185__android_liftoff/comment_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment new file mode 100644 index 000000000..c0d336b11 --- /dev/null +++ b/doc/design/assistant/blog/day_185__android_liftoff/comment_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://mlinden.myopenid.com/" + ip="2001:470:d1c3:0:5c01:5562:e242:37b9" + subject=""Build native GNU/Linux applications: the easy way"" + date="2013-02-10T22:02:19Z" + content=""" +Maybe this helps: +[[http://forum.xda-developers.com/showthread.php?t=1444792]] +"""]] diff --git a/doc/design/assistant/blog/day_185__android_liftoff/comment_2_ddeb24e86fafb7dae93142cc02767aad._comment b/doc/design/assistant/blog/day_185__android_liftoff/comment_2_ddeb24e86fafb7dae93142cc02767aad._comment new file mode 100644 index 000000000..ed0c3dc31 --- /dev/null +++ b/doc/design/assistant/blog/day_185__android_liftoff/comment_2_ddeb24e86fafb7dae93142cc02767aad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnbBRfl5F8gKRr1ko8Ai6FbEZStXXNF1S4" + nickname="Áron" + subject="another android git app" + date="2013-02-11T08:20:42Z" + content=""" +https://play.google.com/store/apps/details?id=com.madgag.agit&hl=en + +I used it and its decent and certainly runs git as a backend (although I havent seen its internals) +"""]] diff --git a/doc/design/assistant/blog/day_186__Android_success.mdwn b/doc/design/assistant/blog/day_186__Android_success.mdwn new file mode 100644 index 000000000..8ede7f29a --- /dev/null +++ b/doc/design/assistant/blog/day_186__Android_success.mdwn @@ -0,0 +1,33 @@ +I'm now successfully using git-annex at the command line on Android. +`git annex watch` works too. + +For now, I'm using a git repository under `/data`, which is on a real, +non-cripped filesystem, so symlinks work there. + +There's still the issue of running without any symlinks on `/mnt/sdcard`. +While direct mode gets most of the way, it still uses symlinks in a few +places, so some more work will be needed there. Also, git-annex uses hard +links to lock down files, which won't work on cripped filesystems. + +Besides that, there's lots of minor porting, but no big show-stoppers +currently.. Some of today's porting work: + +* Cross-compiled git for Android. While the Terminal IDE app has some git + stuff, it's not complete and misses a lot of plumbing commands git-annex + uses. My git build needs some tweaks to be relocatable without setting + `GIT_EXEC_PATH`, but it works. + +* Switched git-annex to use the Haskell glob library, rather than PCRE. This + avoids needing libpcre, which simplifies installation on several platforms + (including Android). + +* Made git-annex's `configure` hardcode some settings when cross-compiling + for Android, rather than probing the build system. + +* Android's built-in `lsof` doesn't support the -F option to use a + machine-readable output format. So wrote a separate lsof output parser for + the standard lsof output format. Unfortunatly, Android's lsof does not + provide any information about where a file is open for read or write, so + for safety, git-annex has to assume any file that's open might be written + to, and avoid annexing it. It might be better to provide my own lsof + eventually. diff --git a/doc/design/assistant/blog/day_186__Android_success/comment_1_1629da240ca7db5f8a32059f561fd435._comment b/doc/design/assistant/blog/day_186__Android_success/comment_1_1629da240ca7db5f8a32059f561fd435._comment new file mode 100644 index 000000000..07ef87bb4 --- /dev/null +++ b/doc/design/assistant/blog/day_186__Android_success/comment_1_1629da240ca7db5f8a32059f561fd435._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2013-02-12T10:24:50Z" + content=""" +heh, +1 for removing the need for pcre +"""]] diff --git a/doc/design/assistant/blog/day_187__porting_utilities.mdwn b/doc/design/assistant/blog/day_187__porting_utilities.mdwn new file mode 100644 index 000000000..496c74a1f --- /dev/null +++ b/doc/design/assistant/blog/day_187__porting_utilities.mdwn @@ -0,0 +1,22 @@ +Ported all the utilities git-annex needs to run on Android: +git, rsync, gnupg, dropbear (ssh client), busybox. Built a +Makefile that can download, patch, and cross build these from source. + +While all the utilities work, dropbear doesn't allow git-annex to use ssh +connection caching, which is rather annoying especially since these systems +tend to be rather slow and take a while to start up ssh connections. +I'd sort of like to try to get openssh's client working on Android instead. +Don't know how realistic that is. + +Dealt with several parts of git-annex that assumed `/bin/sh` exists, +so it instead uses `/system/bin/sh` on Android. Also adapted `runshell` +for Android. + +Now I have a 8 mb compressed tarball for Android. +Uncompressed it's 25 mb. This includes a lot of git and busybox +commands that won't be used, so it could be trimmed down further. +16 mb of it is git-annex itself. + +[[Instructions for using the Android tarball|install/Android]] +This is for users who are rather brave, not afraid of command line and +keyboard usage. Good first step. diff --git a/doc/design/assistant/blog/day_187__porting_utilities/comment_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment b/doc/design/assistant/blog/day_187__porting_utilities/comment_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment new file mode 100644 index 000000000..e25ff1c15 --- /dev/null +++ b/doc/design/assistant/blog/day_187__porting_utilities/comment_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 1" + date="2013-02-13T22:16:17Z" + content=""" +In addition to dropbear, there is ConnectBot which might make the ssh side of the equation simpler. I prefer it because it is half the size of dropbear. +"""]] diff --git a/doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn b/doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn new file mode 100644 index 000000000..48f6069d4 --- /dev/null +++ b/doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn @@ -0,0 +1,37 @@ +There are at least three problems with using git-annex +on `/sdcard` on Android, or on a FAT filesystem, or on (to a first +approximation) Windows: + +1. symlinks +2. hard links +3. unix permissions + +So, I've added an `annex.crippledfilesystem` setting. `git annex init` now +probes to see if all three are supported, and if not, enables that, as well +as direct mode. + +In crippled filesystem mode, all the permissions settings are skipped. +Most of them are only used to lock down content in the annex in indirect +mode anyway, so no great loss. + +There are several uses of hard links, most of which can be dealt with by +making copies. The one use of permissions and hard links I absolutely +needed to deal with was that they're used to lock down a file as it's being +ingested into the annex. That can't be done on crippled filesystems, so I +made it instead check the metadata of the file before and after to detect +if it changed, the same way direct mode detects when files are modified. +This is likely better than the old method anyway. + +The other reason files are hardlinked while they're being ingested is that +this allows running lsof on a single directory of files that are in the +process of being added, to detect if anything has them open for write. +I still need to adjust the lsof check to work in crippled filesystem mode. +It seems this won't make it much slower to run lsof on the whole repository. + +At this point, I can use git-annex with a repository on `/sdcard` or a FAT +filesystem, and at least `git annex add` works. + +Still several things on the TODO list before crippled filesystem mode is +complete. The only one I'm scared about is making `git merge` do something +sane when it wants to merge two trees full of symlinks, and the filesystem +doesn't let it create a symlink.. diff --git a/doc/design/assistant/blog/day_188__crippled_filesystem_support/comment_1_32a296fce23ae4b1e18bd5a9964bf619._comment b/doc/design/assistant/blog/day_188__crippled_filesystem_support/comment_1_32a296fce23ae4b1e18bd5a9964bf619._comment new file mode 100644 index 000000000..2796964e0 --- /dev/null +++ b/doc/design/assistant/blog/day_188__crippled_filesystem_support/comment_1_32a296fce23ae4b1e18bd5a9964bf619._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-02-15T00:38:00Z" + content=""" +Windows supports hardlinks on NTFS filesystems. Not sure about the privileges needed; I think all users can create them. + +Recent versions also support symlinks, but that's limited to Administrators by default, so Cygwin-Git (like the rest of Cygwin) uses special files with the \"system\" flag. + +As far as I know, Git does not try to dereference symlinks when merging – it only tracks the paths they point to. Where symlinks are not supported (e.g. vfat filesystems in general, or msysGit on Windows) it simply creates regular files containing the target path (i.e. the raw contents of the respective blobs). + +Regarding the use of Unix permissions: The \"open file\" syscall on Windows has a \"share mode\" flag, which can be used to disallow other programs from opening the file for writing (and/or even reading) as long as git-annex keeps it open. (I guess this is similar to mandatory locks in Linux.) +"""]] diff --git a/doc/design/assistant/blog/day_189__more_crippling.mdwn b/doc/design/assistant/blog/day_189__more_crippling.mdwn new file mode 100644 index 000000000..f3ddad266 --- /dev/null +++ b/doc/design/assistant/blog/day_189__more_crippling.mdwn @@ -0,0 +1,44 @@ +Finished crippled filesystem support, except for symlink handling. +This was straightforward, just got lsof working in that mode, made +`migrate` copy key contents, and adapted the rsync special remote to +support it. Encrypted rsync special remotes have no more overhead on +crippled filesystems than normally. Un-encrypted rsync special remotes +have some added overhead, but less than encrypted remotes. Acceptable +for now. + +I've now successfully run the assistant on a FAT filesystem. + +---- + +Git handles symlinks on crippled filesystems by setting +`core.symlinks=false` and checking them out as files containing the link +text. So to finish up crippled filesystem support, git-annex needs to +do the same whenever it creates a symlink, and needs to read file contents +when it normally reads a symlink target. + +There are rather a lot of calls to `createSymbolicLink`, +`readSymbolicLink`, `getSymbolicLinkStatus`, `isSymbolicLink`, and `isSymLink` +in the tree; only ones that are used in direct mode +need to be converted. This will take a while. + +Checking whether something is a symlink, or where it points is especially +tricky. How to tell if a small file in a git working tree is intended to be +a symlink or not? Well, it can look at the content and see if it makes +sense as a link text pointing at a git-annex key. As long as the +possibility of false positives is ok. It might be possible, in some cases, +to query git to verify if the object stored for that file is really a +symlink, but that won't work if the file has been renamed, for example. + +Converted some of the most commonly used symlink code to handle this. +Much more to do, but it basically works; I can `git annex get` and `git +annex drop` on FAT, and it works. + +----- + +Unfortunately, got side-tracked when I discovered that the last release +introduced a bug in direct mode. Due to the bug, "git annex get file; git annex +drop file; git annex get file" would end up with the file being an indirect +mode symlink to the content, rather than a direct mode file. No data loss, +but not right. So, spent several hours fixing that reversion, which was +caused by me stupidly fixing another bug at 5 am in the morning last week.. +and I'll probably be pushing out another release tomorrow with the fix. diff --git a/doc/design/assistant/blog/day_18__merging.mdwn b/doc/design/assistant/blog/day_18__merging.mdwn new file mode 100644 index 000000000..f963cf85d --- /dev/null +++ b/doc/design/assistant/blog/day_18__merging.mdwn @@ -0,0 +1,82 @@ +Worked on automatic merge conflict resolution today. I had expected to be +able to use git's merge driver interface for this, but that interface is +not sufficient. There are two problems with it: + +1. The merge program is run when git is in the middle of an operation + that locks the index. So it cannot delete or stage files. I need to + do both as part of my conflict resolution strategy. +2. The merge program is not run at all when the merge conflict is caused + by one side deleting a file, and the other side modifying it. This is + an important case to handle. + +So, instead, git-annex will use a regular `git merge`, and if it fails, it +will fix up the conflicts. + +That presented its own difficulty, of finding which files in the tree +conflict. `git ls-files --unmerged` is the way to do that, but its output +is a quite raw form: + + 120000 3594e94c04db171e2767224db355f514b13715c5 1 foo + 120000 35ec3b9d7586b46c0fd3450ba21e30ef666cfcd6 3 foo + 100644 1eabec834c255a127e2e835dadc2d7733742ed9a 2 bar + 100644 36902d4d842a114e8b8912c02d239b2d7059c02b 3 bar + +I had to stare at the rather impenetrable documentation for hours and +write a lot of parsing and processing code to get from that to these mostly +self explanatory data types: + + data Conflicting v = Conflicting + { valUs :: Maybe v + , valThem :: Maybe v + } deriving (Show) + + data Unmerged = Unmerged + { unmergedFile :: FilePath + , unmergedBlobType :: Conflicting BlobType + , unmergedSha :: Conflicting Sha + } deriving (Show) + +Not the first time I've whined here about time spent parsing unix command +output, is it? :) + +From there, it was relatively easy to write the actual conflict cleanup +code, and make `git annex sync` use it. Here's how it looks: + + $ ls -1 + foo.png + bar.png + $ git annex sync + commit + # On branch master + nothing to commit (working directory clean) + ok + merge synced/master + CONFLICT (modify/delete): bar.png deleted in refs/heads/synced/master and modified in HEAD. Version HEAD of bar.png left in tree. + Automatic merge failed; fix conflicts and then commit the result. + bar.png: needs merge + (Recording state in git...) + [master 0354a67] git-annex automatic merge conflict fix + ok + $ ls -1 + foo.png + bar.variant-a1fe.png + bar.variant-93a1.png + +There are very few options for ways for the conflict resolution code to +name conflicting variants of files. The conflict resolver can only use data +present in git to generate the names, because the same conflict needs to +be resolved the same everywhere. + +So I had to choose between using the full key name in the filenames produced +when resolving a merge, and using a shorter checksum of the key, that would be +more user-friendly, but could theoretically collide with another key. +I chose the checksum, and weakened it horribly by only using 32 bits of it! + +Surprisingly, I think this is a safe choice. The worst that can +happens if such a collision happens is another conflict, and the conflict +resolution code will work on conflicts produced by the conflict resolution +code! In such a case, it does fall back to putting the whole key in +the filename: +"bar.variant-SHA256-s2550--2c09deac21fa93607be0844fefa870b2878a304a7714684c4cc8f800fda5e16b.png" + +Still need to hook this code into `git annex assistant`. diff --git a/doc/design/assistant/blog/day_18__merging/comment_1_7a553ad559519f3b3e3cd20115b4c44e._comment b/doc/design/assistant/blog/day_18__merging/comment_1_7a553ad559519f3b3e3cd20115b4c44e._comment new file mode 100644 index 000000000..94261f81e --- /dev/null +++ b/doc/design/assistant/blog/day_18__merging/comment_1_7a553ad559519f3b3e3cd20115b4c44e._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://droggl.myopenid.com/" + ip="2001:638:602:1181:a6ba:dbff:fedd:8041" + subject="comment 1" + date="2013-09-11T11:55:27Z" + content=""" +Nice! +However I didnt find any documentation yet on how to actually resolve the situation as a user (sorry if I'm being blind). +To be more specific: Say a conflict occurs on foo.txt and i now have two files foo.variant-dead.txt and foo.variant-beef.txt. +Now what? Say I used my favorite merge diffmerge tool to create a merged version foo-merged.txt, should I rename that to foo.txt? +Should I delete the variant files? Or drop them? Or would that lead to another merge for systems that still have the old foo.txt? +(You see I'm kind of confused of what happens here ;)) + +TIA for any helpers +"""]] diff --git a/doc/design/assistant/blog/day_190-191__weekend.mdwn b/doc/design/assistant/blog/day_190-191__weekend.mdwn new file mode 100644 index 000000000..21e46529a --- /dev/null +++ b/doc/design/assistant/blog/day_190-191__weekend.mdwn @@ -0,0 +1,28 @@ +Pushed out a release yesterday mostly for a bug fix. I have to build +git-annex 5 times now when releasing. Am wondering if I could get rid of +the Linux 64 bit standalone build. The 32 bit build should run ok on 64 bit +Linux systems, since it has all its own 32 bit libraries. What I really +need to do is set up autobuilders for Linux and Android, like we have for OSX. + +Today, dealt with all code that creates or looks at symlinks. Audited every +bit of it, and converted all relevant parts to use a new abstraction layer +that handles the pseudolink files git uses when core.symlinks=false. +This is untested, but I'm quite happy with how it turned out. + +---- + +Where next for Android? I want to spend a while testing command-line +git-annex. After I'm sure it's really solid, I should try to get the webapp +working, if possible. + +I've heard rumors that Ubuntu's version of ghc somehow supports template +haskell on arm, so I need to investigate that. If I am unable to get +template haskell on arm, I would need to either wait for further +developments, or try to expand yesod's template haskell to regular haskell +and then build it on arm, or I could of course switch away from hamlet +(using blaze-html instead is appealing in some ways) and +use yesod in non-template-haskell mode entirely. One of these will work, +for sure, only question is how much pain. + +After getting the webapp working, there's still the issue of bundling it +all up in an Android app that regular users can install. diff --git a/doc/design/assistant/blog/day_190-191__weekend/comment_1_dbd692d12c14d08acd7d73a655b34e8b._comment b/doc/design/assistant/blog/day_190-191__weekend/comment_1_dbd692d12c14d08acd7d73a655b34e8b._comment new file mode 100644 index 000000000..965a762e6 --- /dev/null +++ b/doc/design/assistant/blog/day_190-191__weekend/comment_1_dbd692d12c14d08acd7d73a655b34e8b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="phonegap might help" + date="2013-02-17T22:43:06Z" + content=""" +In your research to see how to bundle up a graphical android app, I suggest you read up on phonegap: http://phonegap.com/ + +Essentially they bundle webkit so you can turn a web app into an android app. Not sure if they help you ship native/binary stuff along side the html/javascript/css, but phonegap should at least be useful as a reference for how to do some of the bundling-related stuff. +"""]] diff --git a/doc/design/assistant/blog/day_190-191__weekend/comment_2_c813830e53471a9732e010a748d574fc._comment b/doc/design/assistant/blog/day_190-191__weekend/comment_2_c813830e53471a9732e010a748d574fc._comment new file mode 100644 index 000000000..bdda398b0 --- /dev/null +++ b/doc/design/assistant/blog/day_190-191__weekend/comment_2_c813830e53471a9732e010a748d574fc._comment @@ -0,0 +1,28 @@ +[[!comment format=c + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Two direct mode repository on the same computer" + date="2013-02-19T09:24:21Z" + content=""" +Hi, + +I just tried the newest git annex webapp (20130216), +I am still not able to configure two direct mode repositories (one normal, one backup) on the same computer. + +It does recognize my other partition (/mnt/the) as a removable drive, but when I add it +it gives me internal server error: +\"\"\" +Internal Server Error + +there is no available git remote named \"the\" +git-annex version 3.20130216 +\"\"\" + +Could you please (pretty please) add a possibility to specify the removable drive as a simple folder? +So I could choose arbitrary folder(/mnt/the/annex-backup) on my computer and +it would treat it as a direct mode repository. + +Best, + Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_192_193__more_porting.mdwn b/doc/design/assistant/blog/day_192_193__more_porting.mdwn new file mode 100644 index 000000000..59f7cf836 --- /dev/null +++ b/doc/design/assistant/blog/day_192_193__more_porting.mdwn @@ -0,0 +1,44 @@ +Felt spread thin yesterday, as I was working on multiple things +concurrently & bouncing around as compiles finished. Been working to get +openssh to build for Android, which is quite a pain, starting with getting +openssl to build and then dealing with the Cyanogenmod patches, some of +which are necessary to build on Android and some of which break builds +outside Cyanogenmod. At the same time was testing git-annex on Android. +Found and fixed several more portability bugs while doing that. And on the +back burner I was making some changes to the webapp.. + +(Forgot to commit my blog post yesterday too..) + +Today, that all came together. + +* When adding another local repository in the webapp, + it now allows you to choose whether it should be combined with + your current repository, or kept separate. Several people had requested + a way to add local clones with the webapp, for various reasons, like + wanting a backup repository, or wanting to make a repository on a NFS + server, and this allows doing that. + +[[!img /assistant/combinerepos.png]] + +* More porting fun. FAT filesystems and other things used on Android can + get all new inode numbers each time mounted. Made git-annex use a + sentinal file to detect when this has happened, since in direct mode + it compares inodes. (As a bonus this also makes copying direct mode + repositories between filesystems work.) + +* Got openssh building for Android. Changed it to use $HOME/.ssh rather + than trusting pwent. + +* Got git-annex's ssh connection caching working on Android. That needs + a place where it can create a socket. When the + repository is on a crippled filesystem, it instead puts the socket + in a temporary directory set up on the filesystem where the git-annex + program resides. + +With ssh connection caching, transferring multiple files off my Android +tablet *screams*! I was seeing 6.5 megabytes transferred per second, +sustained over a whole month's worth of photos. + +Next problem: `git annex assistant` on Android is for some reason crashing +with a segfault on startup. Especially odd since `git annex watch` works. +I'm so close to snap-photo-and-it-syncs-nirvana, but still so far away... diff --git a/doc/design/assistant/blog/day_194__nice_moment.mdwn b/doc/design/assistant/blog/day_194__nice_moment.mdwn new file mode 100644 index 000000000..1a5ee9b1e --- /dev/null +++ b/doc/design/assistant/blog/day_194__nice_moment.mdwn @@ -0,0 +1,37 @@ + +video + +Today's work: + +* Fixed `git annex add` of a modified file in direct mode. +* Fixed bugs in the inode sentinal file code added yesterday. +* With some help from Kevin Boone, I now understand how KBOX works and + how to use similar techniques to build my own standalone Android app + that includes git-annex. + + Kevin is using a cute hack; he ships a tarball and some other stuff + as (pseudo-)library files (`libfoo.so`), which are the only files + the Android package manager deigns to install. Then the app runs one + of these, which installs the programs. + + This avoids needing to write Java code that extracts the programs from + one of its assets and writes it to an executable file, which is the + canonical way to do this sort of thing. But I noticed it has a benefit too + (which KBOX does not yet exploit). Since the pseudo-library file is installed + with the X bit set, if it's really a program, such as busybox or git-annex, + that program can be run without needing to copy it to an executable file. + This can save a lot of disk space. So, I'm planning to include all + the binaries needed by git-annex as these pseudo-libraries. +* Got the Android Terminal Emulator to build. I will be basing my first + git-annex Android app on this, since a terminal is needed until there's + a webapp. +* Wasted several hours fighting with `Android.mk` files to include + my pseudo shared library. This abuse of Makefiles by the NDK is what CDBS + wants to grow up to be.. or is it the other way around? Anyway, it + sucks horribly, and I finally found a way to do it without + modifying the file at all. Ugh. +* At this point, I can build a `git-annex.apk` file containing a + `libgit-annex.so`, and a `libbusybox.so`, that can both be directly + run. The plan from here is to give git-annex the ability to + auto-install itself, and the other pseudo-libraries, when it's run as + `libgit-annex.so`. diff --git a/doc/design/assistant/blog/day_195__real_android_app.mdwn b/doc/design/assistant/blog/day_195__real_android_app.mdwn new file mode 100644 index 000000000..f6a4eeebe --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app.mdwn @@ -0,0 +1,32 @@ +Well, it's built. [Real Android app for git-annex](http://downloads.kitenet.net/git-annex/android/current/). + +[[!img /android/appinstalled.png]] + +When installed, this will open a terminal in which you have access to +git-annex and all the git commands and busybox commands as well. No webapp +yet, but command line users should feel right at home. + +[[!img /android/terminal.png]] + +Please test it out, at least as far as installing it, opening the terminal, +and checking that you can run `git annex`; I've only been able to test on +one Android device so far. I'm especially keen to know if it works with +newer versions of Android than 4.0.3. (I know it only supports arm based +Android, no x86 etc.) Please comment if you tried it. + +---- + +Building this went mostly as planned, although I had about 12 builds of +the app in the middle which crashed on startup with no error message ora +logs. Still, it took only one day to put it all together, + and I even had time to gimp up a quick icon. (Better icons welcome.) + +Kevin thinks that my space-saving hack won't work on all Androiden, and he +may be right. If the `lib` directory is on a different filesystem on some +devices, it will fail. But I used it for now anyhow. Thanks to the hack, +the 7.8 mb compressed .apk file installs to use around 23 mb of disk space. + +---- + +Tomorrow: Why does `git-annex assistant` on Android re-add all existing +files on startup? diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_10_0112007552b30cd9bfeac614a1e399c4._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_10_0112007552b30cd9bfeac614a1e399c4._comment new file mode 100644 index 000000000..cc24c08c3 --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_10_0112007552b30cd9bfeac614a1e399c4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 10" + date="2013-02-22T17:30:59Z" + content=""" +@rillian could you try to install KBOX and see if its terminal accepts input? It's the same terminal app, so will be good to know if I broke it or this is a wider problem. + +Also, did you try the soft keyboard? There's a menu item to enable it. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_11_230d3c169c713f613b9d607d84ce5092._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_11_230d3c169c713f613b9d607d84ce5092._comment new file mode 100644 index 000000000..a984dd339 --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_11_230d3c169c713f613b9d607d84ce5092._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="rillian" + ip="64.213.70.194" + subject="Re: no keybourd events on Galaxy Tab 10.1" + date="2013-02-22T18:28:11Z" + content=""" +KBOX has the same input problem so you didn't break anything with your changes. + +I was testing with the soft keyboard. Turns out the spacebar and number keys on the soft keyboard work, as well as return, just not the alphabetic keys. + +Trying on a hardware keyboard (Samsung docking station) is similar. Space, Enter and numbers work, but not letters. There's some additional confusion about shift state, where it gets confused and reports shifted digits from the hardware keys when the soft keyboard is in some shift states. E.g. switching the soft keyboard to numeric mode results in shift-digits (punctuation) from the hardware numeric keys. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_12_8d74ad2a61c02272758d157282ad56ec._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_12_8d74ad2a61c02272758d157282ad56ec._comment new file mode 100644 index 000000000..76aee55fd --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_12_8d74ad2a61c02272758d157282ad56ec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 12" + date="2013-02-22T18:35:35Z" + content=""" +@rillian the upstream for this terminal is +and I found a bug that looks similar. +You might add your info there, and try the workaround documented there. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_13_4f6bc0680f2debd638933968a26975e0._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_13_4f6bc0680f2debd638933968a26975e0._comment new file mode 100644 index 000000000..57a601530 --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_13_4f6bc0680f2debd638933968a26975e0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 13" + date="2013-02-22T19:39:15Z" + content=""" +@Karsten does KBOX work on this version of Android? + +It may well be that this is just too old and incompatable for the terminal to work. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_14_71539c62608866464e8faa76bc522a55._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_14_71539c62608866464e8faa76bc522a55._comment new file mode 100644 index 000000000..bfb12f24a --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_14_71539c62608866464e8faa76bc522a55._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="comment 14" + date="2013-02-22T21:45:54Z" + content=""" +On Android 2.3.3 (Samsung Galaxy S+) KBOX works, git-annex displays the \"Terminal session is running\" notification and dies immediately. + +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_15_e1b205289721ae79ac7fbed2f44018b2._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_15_e1b205289721ae79ac7fbed2f44018b2._comment new file mode 100644 index 000000000..e48ee7134 --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_15_e1b205289721ae79ac7fbed2f44018b2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 15" + date="2013-02-22T22:26:22Z" + content=""" +I'm seeing a pattern with Android 2.3 failing.. + +This failure mode suggests that the bug is in the installation script. The next build will make the terminal not exit immediately if that script fails, so you can go in to the shell and run it by hand to see what's going wrong. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_1_4bc0aeae4fa1116944644c64feaf9697._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_1_4bc0aeae4fa1116944644c64feaf9697._comment new file mode 100644 index 000000000..05e3d298b --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_1_4bc0aeae4fa1116944644c64feaf9697._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://andrew.aylett.co.uk/" + nickname="andrew" + subject="Works on Samsung Galaxy S3" + date="2013-02-21T23:23:08Z" + content=""" +Installed, executed and managed to get the help text on a Samsung Galaxy S3 running 4.1.2. Not tried anything else yet, but looks good so far, thank you very much :). +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_2_17bb6e7565d4c757f6c1e3514c22f47d._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_2_17bb6e7565d4c757f6c1e3514c22f47d._comment new file mode 100644 index 000000000..138518bdb --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_2_17bb6e7565d4c757f6c1e3514c22f47d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlmNbexnCgLywD0MKyT9mG9mWFb_qVj-8I" + nickname="Joshua" + subject="Toshiba Excite 7.7 (Android 4.1.1)" + date="2013-02-22T00:15:46Z" + content=""" +Seems to run fine. I managed to create a repository, git-annex init it (had to set email and name per repository). + +The first time I tried git-annex init it said \"Detected a crippled file system.\" \"Enabling direct mode.\" The final try that actually worked only mentioned the crippled filesystem and not direct mode. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_3_cd8a6bec0f7c6843dd11d3266f25f864._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_3_cd8a6bec0f7c6843dd11d3266f25f864._comment new file mode 100644 index 000000000..643605d5b --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_3_cd8a6bec0f7c6843dd11d3266f25f864._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Installs and runs" + date="2013-02-22T00:17:30Z" + content=""" +No problem installing on a Galaxy Nexus with 4.2.2 + + 1|u0_a162@android:/sdcard $ git clone https://git.jim.sh/jim/annex.git + Cloning into 'annex'... + fatal: Unable to find remote helper for 'https' + +Too much to hope for at this stage, I suppose :) + + 128|u0_a162@android:/sdcard $ git annex assistant + git-annex: Not in a git repository. + 1|u0_a162@android:/sdcard $ git init test + Initialized empty Git repository in /storage/emulated/legacy/test/.git/ + u0_a162@android:/sdcard $ cd test + u0_a162@android:/sdcard/test $ git annex init + init + Detected a crippled filesystem. + + Enabling direct mode. + + *** Please tell me who you are. + + Run + + git config --global user.email \"you@example.com\" + git config --global user.name \"Your Name\" + + to set your account's default identity. + Omit --global to set the identity only in this repository. + + fatal: unable to auto-detect email address (got 'u0_a162@localhost.(none)') + + git-annex: user error (git [\"--git-dir=/storage/emulated/legacy/test/.git\",\"--work-tree=/storage/emulated/legacy/test\",\"commit-tree\",\"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"] exited 128) + failed + git-annex: init: 1 failed + 1|u0_a162@android:/sdcard/test $ + +However, I get the same error even after setting `user.email` and `user.name` (which seems to work fine) +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment new file mode 100644 index 000000000..acb022e13 --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 4" + date="2013-02-22T00:54:56Z" + content=""" +@jim git http support is disabled to save space + +What seems to work is: git config user.email \"you@example.com\" + +It's probably looking in the wrong place for the global .gitconfig so --global doesn't work. The assistant +also automates dealing with this problem BTW. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_6_3d96568c469a8c53a982f304eae5e7d4._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_6_3d96568c469a8c53a982f304eae5e7d4._comment new file mode 100644 index 000000000..0fc0a5cec --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_6_3d96568c469a8c53a982f304eae5e7d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="rillian" + ip="174.6.6.167" + subject="no keybourd events on Galaxy Tab 10.1" + date="2013-02-22T06:54:54Z" + content=""" +Hey, thanks for working on this. + +I tried the Feb 21 apk on my Samsung galaxy Tab 10.1 with Android 4.0.4. It installed and launched fine, bringing up a terminal window, keyboard, etc, but only the return key works. It's not possible to type znything. The menus, new window button etc all seem to be functional. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment new file mode 100644 index 000000000..8f1c71bad --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 6" + date="2013-02-22T07:00:41Z" + content=""" +Installed on Cyanogenmod 7.2 (Android 2.3.7) on my HTC Desire. When starting the App \"Terminalsitzung wird ausgeführt\" (Terminalsession is started) shows in the statusline, then the app immediately closes. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_7_cf8da7720ddc20b05955ee671ca4acd5._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_7_cf8da7720ddc20b05955ee671ca4acd5._comment new file mode 100644 index 000000000..b583d675b --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_7_cf8da7720ddc20b05955ee671ca4acd5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="installed successfully on galaxy nexus stock 4.2.2 rom" + date="2013-02-22T08:28:36Z" + content=""" +could run git annex and get the help screen. didn't do much else after that since I am at work currently. +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_8_f4709bdbc739182819b648fd6aa00531._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_8_f4709bdbc739182819b648fd6aa00531._comment new file mode 100644 index 000000000..367e791ff --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_8_f4709bdbc739182819b648fd6aa00531._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="nexus 4, android 4.2.2" + date="2013-02-22T11:59:13Z" + content=""" +Installs but can not detect email even when set: + + --global user.name \"Your Name\" < + --global user.email \"you@example.com\" < + u0_a135@android:/sdcard/git-annex.home $ git annex init + init + Detected a crippled filesystem. + + *** Please tell me who you are. + + Run + + git config --global user.email \"you@example.com\" + git config --global user.name \"Your Name\" + + to set your account's default identity. + Omit --global to set the identity only in this repository. + + fatal: unable to auto-detect email address (got 'u0_a135@localhost.(none)') + + git-annex: user error (git [\"--git- dir=/storage/emulated/legacy/git-annex.home/.git\",\"--work-tree=/storage/emulated/legacy/git-annex.home\",\"commit-tree\",\"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"] exited 128) +failed + git-annex: init: 1 failed + 1|u0_a135@android:/sdcard/git-annex.home $ + + +Sorry for bad copy paste... On tour bus in Stockholm and only have phone, no laptop... + +RichiH +"""]] diff --git a/doc/design/assistant/blog/day_195__real_android_app/comment_9_e66af12c7eca0d457b8406e9fb4b69be._comment b/doc/design/assistant/blog/day_195__real_android_app/comment_9_e66af12c7eca0d457b8406e9fb4b69be._comment new file mode 100644 index 000000000..46a9eff3d --- /dev/null +++ b/doc/design/assistant/blog/day_195__real_android_app/comment_9_e66af12c7eca0d457b8406e9fb4b69be._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="comment 9" + date="2013-02-22T15:19:25Z" + content=""" +Same trouble with --global config, however local config works. +"""]] diff --git a/doc/design/assistant/blog/day_196__android_bugfixes.mdwn b/doc/design/assistant/blog/day_196__android_bugfixes.mdwn new file mode 100644 index 000000000..a78853f93 --- /dev/null +++ b/doc/design/assistant/blog/day_196__android_bugfixes.mdwn @@ -0,0 +1,26 @@ +So it seems the Android app works pretty well on a variety of systems. +Only report of 100% failure so far is on Cyanogenmod 7.2 (Android 2.3.7). + +Worked today on some of the obvious bugs. + +* Turns out that getEnvironment is broken on Android, returning no + environment, which explains the weird git behavior where it complains + that it cannot determine the username and email (because it sees no USER + or HOST), and suggests setting them in the global git config (which it + ignores, because it sees no HOME). Put in a work around for this + that makes `git annex init` more pleasant, and opened a bug report on + ghc-android. +* Made the Android app detect when it's been upgraded, and re-link all + the commands, etc. +* Fixed the bug that made `git-annex assistant` on Android re-add all + existing files on startup. +* Enabled a few useful things in busybox. Including vi. +* Replaced the service notification icon with one with the git-annex logo. +* Made the terminal not close immediately when the shell exits, which + should aid in debugging of certain types of crashes. + +I want to set up an autobuilder for Android, but to do that I need to +install all the haskell libraries on my server. Since getting them built +for Android involved several days of hacking the first time, this will +be an opportunity to make sure I can replicate that. Hopefully in less time. +;) diff --git a/doc/design/assistant/blog/day_197__template_haskell.mdwn b/doc/design/assistant/blog/day_197__template_haskell.mdwn new file mode 100644 index 000000000..cb42b0803 --- /dev/null +++ b/doc/design/assistant/blog/day_197__template_haskell.mdwn @@ -0,0 +1,36 @@ +Set up an autobuilder for the linux standalone binaries. +Did not get an Android autobuilder set up yet, but I did update +the Android app with recent improvements, so [[upgrade|install/Android]]. + +---- + +Investigated further down paths to getting the webapp built for Android. + +* Since recent ghc versions support ghci and thus template haskell on arm, + at least some of the time, I wonder what's keeping the ghc-android build + from doing so? It might be due to it being a cross compiler. I tried + recompiling it with the stage 2, native compiler enabled. While I was + able to use that ghc binary on Android, it refused to run --interactive, + claiming it was not built with that enabled. Don't really understand + the ghc build system, so might have missed something. + + Maybe I need to recompile ghc using the native ghc running on Android. + But that would involve porting gcc and a lot of libraries and toolchain + stuff to Android. + +* [yesod-pure](http://hackage.haskell.org/package/yesod-pure) is an option, + and I would not mind making all the code changes to use it, getting + rid of template haskell entirely. (Probably around 1 thousand lines of + code would need to be written, but most of it would be trivial + conversion of hamlet templates.) + + Question is, will yesod install at all without template haskell? Not + easily. `vector`, `monad-logger`, `aeson`, `shakespeare`, + `shakespeare-css`, `shakespeare-js`, `shakespeare-i18n`, `hamlet` + all use TH at build time. Hacked them all to just remove the TH parts. + + The hack job on `yesod-core` was especially rough, involving things like + 404 handlers. Did get it to build tho! + + Still a dozen packages before I can build yesod, and then will try + building [this yesod-pure demo](https://gist.github.com/snoyberg/3870834/raw/212f0164de36524291df3ab35788e2b72d8d1e75/fib.hs). diff --git a/doc/design/assistant/blog/day_197__template_haskell/comment_1_82d9f9508929d84abf7b718c59436ae8._comment b/doc/design/assistant/blog/day_197__template_haskell/comment_1_82d9f9508929d84abf7b718c59436ae8._comment new file mode 100644 index 000000000..95fcde0d6 --- /dev/null +++ b/doc/design/assistant/blog/day_197__template_haskell/comment_1_82d9f9508929d84abf7b718c59436ae8._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="Android 2.3" + date="2013-02-24T15:16:51Z" + content=""" +The updated version lets me see the failure(s), and it looks like this: + + cd: can't cd to /data/data/ga.androidterm/lib/lib.runshell.so/../.. + [: not found + [: not found + could not open //installed-version, No such file or directory + /data/data/ga.androidterm/lib/lib.runshell.so: cannot create + /sdcard/git-annex.home/git-annex-install.log: directory nonexistent + + [Terminal session finished] + +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes.mdwn b/doc/design/assistant/blog/day_198__bugfixes.mdwn new file mode 100644 index 000000000..ec8535ad1 --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes.mdwn @@ -0,0 +1,11 @@ +Wrote a C shim to get the Android app started. This avoids it relying on +the Android /system/bin/sh to run its shell script, or indeed relying on +any unix utilities from Android at all, which may help on some +systems. Pushed a new build of the Android app. + +Tracked down a failure a lot of people are reporting with WebDAV support +to a backported security fix in the TLS library, and filed an upstream bug +about it. + +Various other misc fixing and stuff. +My queue of bug reports and stuff only has 47 items in it now. Urk.. diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment new file mode 100644 index 000000000..279a53f04 --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="Android 2.3 again" + date="2013-02-24T23:07:28Z" + content=""" +I got _a lot_ further with the latest upgrade. + +* installation worked +* `git init` worked +* first `git annex init` asked to set user.{email,name} +* `git config --global ...` worked +* second `git annex init` segfaulted, but not immediately: + + init + Detected a crippled filesystem. + error: git-annex died of signal 11 + +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_2_36d94b838e5e65c85e7afaabe8a578f1._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_2_36d94b838e5e65c85e7afaabe8a578f1._comment new file mode 100644 index 000000000..0a3414864 --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_2_36d94b838e5e65c85e7afaabe8a578f1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 2" + date="2013-02-25T11:22:53Z" + content=""" +Is the autiobuilder for linux available already? +I can't find it, and I'm eager to try the thumbdrive related fixes (where I can specify a simple folder). + +Best, + Laszlo +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment new file mode 100644 index 000000000..39e017ceb --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 3" + date="2013-02-25T15:53:30Z" + content=""" +@meep try running it with --debug for some more hint of where it's crashing + +@Laszlo see [[install/Linux_standalone]] +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_4_5a4827227c03bcff3b1e4c44b531f816._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_4_5a4827227c03bcff3b1e4c44b531f816._comment new file mode 100644 index 000000000..fafb8fd27 --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_4_5a4827227c03bcff3b1e4c44b531f816._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 4" + date="2013-02-25T18:28:09Z" + content=""" +joeyh: Is the 20130216 is the newest? Because you just wrote about two days ago of direct mode fixes, I'm interested in. +I tried 20130216 already. + +Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_5_9c5f4c85217e898be4c57c615e53c36f._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_5_9c5f4c85217e898be4c57c615e53c36f._comment new file mode 100644 index 000000000..221e28d25 --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_5_9c5f4c85217e898be4c57c615e53c36f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 5" + date="2013-02-26T16:33:11Z" + content=""" +I have not made a release with those fixes yet, but they are available in the autobuilds. +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_6_bccf1abfb7f56d97673158f3ccfce511._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_6_bccf1abfb7f56d97673158f3ccfce511._comment new file mode 100644 index 000000000..22012c0cd --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_6_bccf1abfb7f56d97673158f3ccfce511._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="git annex init --debug" + date="2013-02-27T06:39:19Z" + content=""" +The last thing before the signal 11 error that I can see with `--debug` is `read: uname [\"-n\"]` after reports of running 5 git commands. + +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment new file mode 100644 index 000000000..8adcd394d --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="comment 7" + date="2013-02-27T06:53:15Z" + content=""" +But the error does not happen immediately after that. All the 6 log messages have the same timestamp and `git annex init --debug; date` prints a timestamp that is 3-4 seconds later. +"""]] diff --git a/doc/design/assistant/blog/day_198__bugfixes/comment_8_8a3542437663028b17442818eba3f7c5._comment b/doc/design/assistant/blog/day_198__bugfixes/comment_8_8a3542437663028b17442818eba3f7c5._comment new file mode 100644 index 000000000..f9a50b94e --- /dev/null +++ b/doc/design/assistant/blog/day_198__bugfixes/comment_8_8a3542437663028b17442818eba3f7c5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="comment 8" + date="2013-02-27T06:55:24Z" + content=""" +Also, this was after a reinstall. The next time I start the app the terminal opens but prompt does not appear (at least not for a very long time). Then after uninstall and reinstall I get to the prompt again. + +"""]] diff --git a/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn b/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn new file mode 100644 index 000000000..7d37e8f94 --- /dev/null +++ b/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn @@ -0,0 +1,26 @@ +An Android autobuilder is now set up to run nightly. At this point +I don't see an immediate way to getting the webapp working on Android, so +it's best to wait a month or two and see how things develop in Haskell land. +So I'm moving on to other things. + +Today: + +* Fixed a nasty regression that made `*` not match files in subdirectories. + That broke the preferred content handling, among other things. I will + be pushing out a new release soon. +* As a last Android thing (for now), made the Android app automatically + run `git annex assistant --autostart` , so you can manually set up + an assistant-driven repository on Android, listing the repository in + `.config/git-annex/autostart` +* Made the webapp display any error message from `git init` if it fails. + This was the one remaining gap in the logging. + One reason it could fail is if the system has a newer git in use, and + `~/.gitconfig` is configured with some options the older git bundled + with git-annex doesn't like. +* Bumped the major version to 4, and annex.version will be set to 4 in + new direct mode repositories. (But version 3 is otherwise still used, to + avoid any upgrade pain.) This is to prevent old versions that don't + understand direct mode from getting confused. I hope direct mode is + finally complete, too, after the work to make it work on crippled + filesystems this month. +* Misc other bugfixes etc. Backlog down to 43. diff --git a/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now/comment_1_ec57358afc7e78d2860aa4237793832d._comment b/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now/comment_1_ec57358afc7e78d2860aa4237793832d._comment new file mode 100644 index 000000000..1d7923739 --- /dev/null +++ b/doc/design/assistant/blog/day_199__wrapping_up_Android_for_now/comment_1_ec57358afc7e78d2860aa4237793832d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="Automagic photo backups" + date="2013-02-26T21:56:44Z" + content=""" +Did you investigate how hard it would be to only commit & upload once the phone is being charged _and_ on WiFi? That does not rely on the webapp, but it would make using git-annex on Android a lot more useful until you restart your work on this. + + +RichiH +"""]] diff --git a/doc/design/assistant/blog/day_19__random_improvements.mdwn b/doc/design/assistant/blog/day_19__random_improvements.mdwn new file mode 100644 index 000000000..acb30bf93 --- /dev/null +++ b/doc/design/assistant/blog/day_19__random_improvements.mdwn @@ -0,0 +1,50 @@ +Random improvements day.. + +Got the merge conflict resolution code working in `git annex assistant`. + +Did some more fixes to the pushing and pulling code, covering some cases +I missed earlier. + +Git syncing seems to work well for me now; I've seen it recover +from a variety of error conditions, including merge conflicts and repos +that were temporarily unavailable. + +---- + +There is definitely a MVar deadlock if the merger thread's inotify event +handler tries to run code in the Annex monad. Luckily, it doesn't +currently seem to need to do that, so I have put off debugging what's going +on there. + +Reworked how the inotify thread runs, to avoid the two inotify threads +in the assistant now from both needing to wait for program termination, +in a possibly conflicting manner. + +Hmm, that *seems* to have fixed the MVar deadlock problem. + +---- + +Been thinking about how to fix [[bugs/watcher_commits_unlocked_files]]. +Posted some thoughts there. + +It's about time to move on to data [[syncing]]. While eventually that will +need to build a map of the repo network to efficiently sync data over the +fastest paths, I'm thinking that I'll first write a dumb version. So, two +more threads: + +1. Uploads new data to every configured remote. Triggered by the watcher + thread when it adds content. Easy; just use a `TSet` of Keys to send. + +2. Downloads new data from the cheapest remote that has it. Could be + triggered by the + merger thread, after it merges in a git sync. Rather hard; how does it + work out what new keys are in the tree without scanning it all? Scan + through the git history to find newly created files? Maybe the watcher + triggers this thread instead, when it sees a new symlink, without data, + appear. + +Both threads will need to be able to be stopped, and restarted, as needed +to control the data transfer. And a lot of other control smarts will +eventually be needed, but my first pass will be to do a straightforward +implementation. Once it's done, the git annex assistant will be basically +usable. diff --git a/doc/design/assistant/blog/day_1__inotify.mdwn b/doc/design/assistant/blog/day_1__inotify.mdwn new file mode 100644 index 000000000..ca27a4586 --- /dev/null +++ b/doc/design/assistant/blog/day_1__inotify.mdwn @@ -0,0 +1,57 @@ +First day of [Kickstarter funded work](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/)! + +Worked on [[inotify]] today. The `watch` branch in git now does a pretty +good job of following changes made to the directory, annexing files +as they're added and staging other changes into git. Here's a quick +transcript of it in action: + + joey@gnu:~/tmp>mkdir demo + joey@gnu:~/tmp>cd demo + joey@gnu:~/tmp/demo>git init + Initialized empty Git repository in /home/joey/tmp/demo/.git/ + joey@gnu:~/tmp/demo>git annex init demo + init demo ok + (Recording state in git...) + joey@gnu:~/tmp/demo>git annex watch & + [1] 3284 + watch . (scanning...) (started) + joey@gnu:~/tmp/demo>dd if=/dev/urandom of=bigfile bs=1M count=2 + add ./bigfile 2+0 records in + 2+0 records out + 2097152 bytes (2.1 MB) copied, 0.835976 s, 2.5 MB/s + (checksum...) ok + (Recording state in git...) + joey@gnu:~/tmp/demo>ls -la bigfile + lrwxrwxrwx 1 joey joey 188 Jun 4 15:36 bigfile -> .git/annex/objects/Wx/KQ/SHA256-s2097152--e5ced5836a3f9be782e6da14446794a1d22d9694f5c85f3ad7220b035a4b82ee/SHA256-s2097152--e5ced5836a3f9be782e6da14446794a1d22d9694f5c85f3ad7220b035a4b82ee + joey@gnu:~/tmp/demo>git status -s + A bigfile + joey@gnu:~/tmp/demo>mkdir foo + joey@gnu:~/tmp/demo>mv bigfile foo + "del ./bigfile" + joey@gnu:~/tmp/demo>git status -s + AD bigfile + A foo/bigfile + +Due to Linux's inotify interface, this is surely some of the most subtle, +race-heavy code that I'll need to deal with while developing the git annex +assistant. But I can't start wading, need to jump off the deep end to make +progress! + +The hardest problem today involved the case where a directory is moved +outside of the tree that's being watched. Inotify will still send events +for such directories, but it doesn't make sense to continue to handle them. + +Ideally I'd stop inotify watching such directories, but a lot of state +would need to be maintained to know which inotify handle to stop watching. +(Seems like Haskell's inotify API makes this harder than it needs to be...) + +Instead, I put in a hack that will make it detect inotify events from +directories moved away, and ignore them. This is probably acceptable, +since this is an unusual edge case. + +---- + +The notable omission in the inotify code, which I'll work on next, is +staging deleting of files. This is tricky because adding a file to the +annex happens to cause a deletion event. I need to make sure there are no +races where that deletion event causes data loss. diff --git a/doc/design/assistant/blog/day_200__release_day.mdwn b/doc/design/assistant/blog/day_200__release_day.mdwn new file mode 100644 index 000000000..99aebcf70 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day.mdwn @@ -0,0 +1,19 @@ +As well as making a new release, I rewrote most of the Makefile, so that it +uses cabal to build git-annex. This avoids some duplication, and most +importantly, means that the Makefile can auto-detect available libraries +rather than needing to juggle build flags manually. Which was becoming a +real pain. + +I had avoided doing this before because cabal is slow for me on my little +netbook. Adding ten seconds to every rebuild really does matter! But I came +up with a hack to let me do incremental development builds without the +cabal overhead, by intercepting and reusing the ghc command that cabal +runs. + +There was also cabal "fun" to get the Android build working with cabal. +And more fun involving building the test suite. For various reasons, I +decided to move the test suite into the git-annex binary. So you can run +`git annex test` at any time, any place, and it self-tests. That's a neat +trick I've seen one or two other programs do, and probably the nicest thing +to come out of what was otherwise a pretty yak shaving change that involved +babysitting builds all day. diff --git a/doc/design/assistant/blog/day_200__release_day/comment_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment b/doc/design/assistant/blog/day_200__release_day/comment_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment new file mode 100644 index 000000000..dfd4f32fe --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-03-01T04:23:48Z" + content=""" +@Brian, I follow your logic, it does seem that start.c is not finding itself. But, you checked the pid of the terminal, while start.c is the program it (usually) starts. + +Anyway, I have tried making start.c fall back to a hard coded path if it cannot find busybox. It'll also say what path it detected, which may help debug the underlying problem. You can pick up an app with this change from the autobuilder. +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_11_b26890fdae575d42170988073fb2e45d._comment b/doc/design/assistant/blog/day_200__release_day/comment_11_b26890fdae575d42170988073fb2e45d._comment new file mode 100644 index 000000000..164dce53f --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_11_b26890fdae575d42170988073fb2e45d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="comment 11" + date="2013-03-01T12:02:09Z" + content=""" +Good point--it didn't occur to me start.c runs as a child process. Makes sense. How do I download the output of the autobuild? Size-wise and behavior-wise, http://downloads.kitenet.net/git-annex/android/current/git-annex.apk looks like the same file I already had. +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_13_710a30c5d31bf549833ecfe9a0997c94._comment b/doc/design/assistant/blog/day_200__release_day/comment_13_710a30c5d31bf549833ecfe9a0997c94._comment new file mode 100644 index 000000000..50b99a965 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_13_710a30c5d31bf549833ecfe9a0997c94._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 13" + date="2013-03-01T16:36:58Z" + content=""" +@Brian the autobuild is linked to on [[install/Android]] +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment b/doc/design/assistant/blog/day_200__release_day/comment_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment new file mode 100644 index 000000000..efd38879f --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="comment 13" + date="2013-03-01T23:52:53Z" + content=""" +I got the latest autobuild version installed and the fallback works for me--thanks. FYI, the fallback error message says: \"cannot find expected files in /data/app-lib\" +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_1_a68e1ed7829b49086c567d97ddc09912._comment b/doc/design/assistant/blog/day_200__release_day/comment_1_a68e1ed7829b49086c567d97ddc09912._comment new file mode 100644 index 000000000..51247f6b7 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_1_a68e1ed7829b49086c567d97ddc09912._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI" + nickname="Amitai" + subject="comment 1" + date="2013-02-28T02:53:53Z" + content=""" +That _is_ a neat trick, especially since you're deploying to odd platforms where you'll probably be even gladder of the in-app tests far in the future than you are now! +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment b/doc/design/assistant/blog/day_200__release_day/comment_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment new file mode 100644 index 000000000..f6aeb306d --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="comment 2" + date="2013-02-28T06:13:21Z" + content=""" +Maybe it's the build changes? Android apk disappeared from +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_3_5b752d6a8d74e61190f09384b6108206._comment b/doc/design/assistant/blog/day_200__release_day/comment_3_5b752d6a8d74e61190f09384b6108206._comment new file mode 100644 index 000000000..066abd19a --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_3_5b752d6a8d74e61190f09384b6108206._comment @@ -0,0 +1,31 @@ +[[!comment format=c + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 3" + date="2013-02-28T08:40:46Z" + content=""" +Two suggestion: +1. Possibility to restrict CPU usage (a 10-20% would be nice, or a slider) +2. Pager on Dashboard + +I have a directory, it is 741MB, and contains 23381 files. +This directory is pretty much everything needed for my daily job. + +I added a copy of this directory to annex, then I created a backup dir of annex, +and my laptop is using almost 100%CPU al the time, it is running since 1 hour already, and +only 140MB was copied over to the backup directory. + +Don't get me wrong, this application just blows my mind, and it seems to *work* for the first time for real. + +The suggestion is simply a slider in resource manager (preferably inside dashboard): +Restrict CPU usage [0---X---100]34% +Restrict upload bandwith [0-X----800]9kB/s +Restrict download bandwith [0-X----800]80kB/s + +Also the pager is musthave in dashboard, because it renders firefox unusable with that many entries (21000). + +Nice work, thank you for the release! + +Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_4_881274ae0d6230bb4cafa4151ad72b49._comment b/doc/design/assistant/blog/day_200__release_day/comment_4_881274ae0d6230bb4cafa4151ad72b49._comment new file mode 100644 index 000000000..75d54e04e --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_4_881274ae0d6230bb4cafa4151ad72b49._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="lot of stuck git processes" + date="2013-02-28T09:01:25Z" + content=""" +Oh, and here is how it looks +ps -e |grep git +command after git-annex has been stopped (from the gui): +(54 process, from which 50 process ) +http://pastebin.com/5u74qTNU +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_5_e220059be77cf0ef396f37a4f9ccf9b5._comment b/doc/design/assistant/blog/day_200__release_day/comment_5_e220059be77cf0ef396f37a4f9ccf9b5._comment new file mode 100644 index 000000000..bd518cc0a --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_5_e220059be77cf0ef396f37a4f9ccf9b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-02-28T19:42:09Z" + content=""" +@meep That's not the autobuild. I put the wrong file there! Fixed. +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_6_ec2152151188dd252cdb61c68cfc12e4._comment b/doc/design/assistant/blog/day_200__release_day/comment_6_ec2152151188dd252cdb61c68cfc12e4._comment new file mode 100644 index 000000000..43e676f60 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_6_ec2152151188dd252cdb61c68cfc12e4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-02-28T19:52:59Z" + content=""" +Lazlo, could you please file a proper [[bug|bugs]] report and include details like what version of git-annex you're using there when you get the zombies. + +I have modified the webapp to only ever show 10 queued transfers on the dashboard. +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_7_42572411617c287368482bb9dcf94324._comment b/doc/design/assistant/blog/day_200__release_day/comment_7_42572411617c287368482bb9dcf94324._comment new file mode 100644 index 000000000..409ade91d --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_7_42572411617c287368482bb9dcf94324._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="link busybox: No such file or directory" + date="2013-03-01T02:32:32Z" + content=""" +When I run the 28-Feb-2013 android version of git annex, I'm getting the error: + + link busybox: No such file or directory + +Maybe this code is not finding the busybox.so file: + + link(\"lib/lib.busybox.so\", \"busybox\") + +Any ideas how I can troubleshoot? + +I'm running Android 4.2.2. +"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_8_6b69aa81a9ba4e07e547ed1869946d51._comment b/doc/design/assistant/blog/day_200__release_day/comment_8_6b69aa81a9ba4e07e547ed1869946d51._comment new file mode 100644 index 000000000..c375f3b84 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_8_6b69aa81a9ba4e07e547ed1869946d51._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-03-01T03:10:35Z" + content=""" +@Brian what you can do is go to the terminal's preferences menu and change the shell it runs to `/system/bin/sh` . This should let you open a new tab with a shell prompt. Then you can try to cd to `/data/data/ga.androidterm`, and see if both `lib/lib.start.so` and `lib/lib.busybox.so` exist. + +You could then try to do the same thing it does to set up the system: + +
+ln lib/lib.busybox.so busybox
+./busybox sh lib/lib.runshell.so
+
+"""]] diff --git a/doc/design/assistant/blog/day_200__release_day/comment_9_b070a2e4151d9fbf43d7906efa78515f._comment b/doc/design/assistant/blog/day_200__release_day/comment_9_b070a2e4151d9fbf43d7906efa78515f._comment new file mode 100644 index 000000000..4acf003c8 --- /dev/null +++ b/doc/design/assistant/blog/day_200__release_day/comment_9_b070a2e4151d9fbf43d7906efa78515f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="comment 9" + date="2013-03-01T03:55:46Z" + content=""" +@joey Both .so files were present and I was able to run the ln and busybox commands. And after that 'git annex' displayed the help screen. Thanks! + +Then I ran 'ps | grep ga.androidterm' to find the pid and then 'ls -l /proc/<pid>/exe' and it showed the symlink points at '/system/bin/app_process'. + +So the 'int n=readlink(\"/proc/self/exe\", buf, 1023);' in start.c isn't very useful in this case. +"""]] diff --git a/doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn b/doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn new file mode 100644 index 000000000..8ff743f68 --- /dev/null +++ b/doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn @@ -0,0 +1,38 @@ +[[!meta title="day 201 real Android wrapup"]] + +I got yesod-pure fully working on Android... + +[[!img fib.png size=400x]] + +As expected, this involved manually splicing some template haskell. I'm now +confident I can port the git-annex webapp to Android this way, and that it +will take about a week. Probably will start on that in a month or so. If +anyone has some spare Android hardware they'd like to loan me, possibly +sooner. (Returning loaner Asus Transformer tomorrow; thanks Mark.) Although +I'm inclined to let the situation develop; we may just get a ghc-android +that supports TH.. + +Also: + +* Fixed several bugs in the Android installation process. +* Committed patches for all Haskell libraries I've modified to + the git-annex git repo. +* Ran the test suite on Android. It found a problem; seems `git clone` + of a local repository is broken in the Android environment. + +Non-Android: + +* Made the assistant check every hour if logs have grown larger than a + megabyte, and rotate them to avoid using too much disk space. +* Avoided noise in log about typechanged objects when running + git commit in direct mode repositories. Seems `git commit` + has no way to shut that up, so I had to /dev/null it. +* When run with `--debug`, the assistant now logs more information + about why it transfers or drops objects. +* Found and fixed a case where moving a file to an archive directory would + not cause its content to be dropped. +* Working on a bug with the assistant where moving a file out of an + archive directory in direct mode sometimes ends up with a symlink + rather than a proper direct mode file. Have not gotten to the bottom + of it entirely, but it's a race, and I think the race is between + the direct mode mapping being updated, and the file being transferred. diff --git a/doc/design/assistant/blog/day_201__real_Android_wrapup/comment_1_88b9950c51324f0bb89c5646b3170952._comment b/doc/design/assistant/blog/day_201__real_Android_wrapup/comment_1_88b9950c51324f0bb89c5646b3170952._comment new file mode 100644 index 000000000..b9edfc4b6 --- /dev/null +++ b/doc/design/assistant/blog/day_201__real_Android_wrapup/comment_1_88b9950c51324f0bb89c5646b3170952._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://ao2.it/" + nickname="ao2" + subject="Using the Emulator?" + date="2013-03-04T13:58:18Z" + content=""" +Hi Joey, + +while you wait for some actual Android device have you tried the emulator? + +I've recently started playing with Android without any physical device, and the emulator is pretty responsive with hardware acceleration on (you need to run an x86 AVD). + +Here are some instructions: http://git.ao2.it/android/android-app-development-getting-started.git/blob/HEAD:/android-app-development-getting-started.sh + +Also, are you going to use a WebView connecting to the haskell web server for the WebApp? + +Ciao, + Antonio +"""]] diff --git a/doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png b/doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png new file mode 100644 index 000000000..f9b8c27fd Binary files /dev/null and b/doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png differ diff --git a/doc/design/assistant/blog/day_201__working_web_server.mdwn b/doc/design/assistant/blog/day_201__working_web_server.mdwn new file mode 100644 index 000000000..c9e959a33 --- /dev/null +++ b/doc/design/assistant/blog/day_201__working_web_server.mdwn @@ -0,0 +1,31 @@ +Seems I am not done with the Android porting just yet after all. One more +porting day.. + +Last night I managed to get all of Yesod to build for Android. +I even successfully expanded some Template Haskell used in yesod-form. And +am fairly confident I could manually expand all the TH in there, so it's +actually useable without TH. Most of the TH is just commented out for now. + +However, programs using Yesod didn't link; lots of missing symbols. I have +been fighting to fix those all day today. + +Finally, I managed to build [the yesod-pure demo server](https://gist.github.com/snoyberg/3870834/raw/212f0164de36524291df3ab35788e2b72d8d1e75/fib.hs), +and I have a working web server on Android! It listens for requests, it logs +them correctly, and it replies to requests. I did cripple yesod's routing +code in my hack-n-slash port of it, so it fails to *display* any pages, +but never has "Internal Server Error" in a web browser been such a sweet +sight. ;-) + +At this point, I estimate about 1 or 2 weeks work to get to an Android +webapp. I'd need to: + +1. More carefully port Yesod, manually expanding all Template Haskell + as I went, rather than commenting it all out like I did this time. +2. Either develop a tool to automatically expand Hamlet TH splices + (preferred; seems doable), or convert all the webapp's templates + to not use Hamlet. + +----- + +I've modified 38 Haskell libraries so far to port them to Android. Mostly +small hacks, but eep this is a lot of stuff to keep straight. diff --git a/doc/design/assistant/blog/day_203__procrastination.mdwn b/doc/design/assistant/blog/day_203__procrastination.mdwn new file mode 100644 index 000000000..b6eb262e9 --- /dev/null +++ b/doc/design/assistant/blog/day_203__procrastination.mdwn @@ -0,0 +1,25 @@ +Stuck on a bug or two, I instead built a new Preferences page: + +[[!img /assistant/preferences.png]] + +The main reason I wanted that was to allow enabling debug logging at +runtime. But I've also wanted to expose annex.diskreserve and +annex.numcopies settings to the webapp user. Might as well let them control +whether it auto-starts too. + +Had some difficulty deciding where to put this. It could be considered +additional configuration for the local repository, and so go in the +local repository edit form. However, this stuff can only be configured for +local repositories, and not remotes, and that same form is used to edit +remotes, which would lead to inconsistent UI and complicate the code. +Also, it might grow to include things not tied to any repository, +like choice of key/value backends. So, I put the preferences on their own +page. + +--- + +Also, based on some useful feedback from testing the assistant with a large +number of files, I made the assistant disable git-gc auto packing in +repositories it sets up. (Like fsck, git-gc always seems to run exactly +when you are in a hurry.) Instead, it'll pack at most once a day, and with +a rather higher threshold for the number of loose objects. diff --git a/doc/design/assistant/blog/day_204__deprocrastination.mdwn b/doc/design/assistant/blog/day_204__deprocrastination.mdwn new file mode 100644 index 000000000..6299140e3 --- /dev/null +++ b/doc/design/assistant/blog/day_204__deprocrastination.mdwn @@ -0,0 +1,62 @@ +Tracked down the bug that's been eluding me for days. It was indeed a race, and +could result in a file being transferred into a direct mode repository and +ending up in indirect mode. Was easy to fix once understood, just needed to +update the direct mode mapping before starting the transfer. + +While I was in there, I noticed another potential race, also in direct +mode, where the watcher could decide to rewrite a symlink to fix its +target, and at just the wrong time direct mode content could arrive in its +place, and so get deleted. Fixed that too. + +Seems likely there are some other direct mode races. I spent quite a while +hammering on dealing with the indirect mode races with the assistant +originally. + +----- + +Next on my list is revisiting XMPP. + +Verified that git push over XMPP works between multiple repositories that +are sharing the same XMPP account. It does. + +Seeing the XMPP setup process with fresh eyes, I found several places +wording could be improved. Also, when the user goes in and configures +(or reconfigures) an XMPP account, the next step is to do pairing, +so it now redirects directly to there. + +Next I need to make XMPP get back into sync after a network disconnection +or when the assistant is restarted. This currently doesn't happen until +a XMPP push is received due to a new change being made. + +### back burner: yesod-pure + +Last night I made a yesod-pure branch, and did some exploratory conversion +away from using Hamlet, of the Preferences page I built yesterday. + +I was actually finding writing pure Blaze worked *better* than Hamlet, +at first. Was able to refactor several things into functions that in Hamlet +are duplicated over and over in my templates, and built some stuff that makes +rendering type safe urls in pure Blaze not particularly ungainly. For example, +this makes a submit button and a cancel button that redirects to another page: + +[[!format haskell """ + buttons = toWidget $ \redir -> + "Save Preferences" <>|<> redir ConfigurationR [] +"""]] + +The catch is how to deal with widgets that need to be nested inside other +html. It's not possible to do this both cleanly and maximally +efficiently, with Blaze. For max efficiency, all the html before the widget +should be emitted, and then the widget run, and then all html after it be +emitted. To use Blaze, it would have to instead generate the full html, +then split it around the widget, and then emit the parts, which is less +efficient, doesn't stream, etc. + +I guess that's the core of what Hamlet does; it allows a clean +representation and due to running TH at build time, can convert this into +an efficient (but ugly) html emitter. + +So, I may give up on this experiment. Or I may make the webapp less than +maximally fast at generating html and go on with it. After all, these +sorts of optimisations are mostly aimed at high-volume websites, not local +webapps. diff --git a/doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn b/doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn new file mode 100644 index 000000000..e1d07c8e4 --- /dev/null +++ b/doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn @@ -0,0 +1,12 @@ +Yesterday was all bug fixes, nothing to write about really. + +Today I've been working on getting XMPP remotes to sync more reliably. +I left some big holes when I stopped work on it in November: + +1. The assistant did not sync with XMPP remotes when it started up. +2. .. Or when it detected a network reconnection. +3. There was no way to trigger a full scan for transfers + after receiving a push from an XMPP remote. + +The asynchronous nature of git push over XMPP complicated doing this, but +I've solved all 3 issues today. diff --git a/doc/design/assistant/blog/day_207__XMPP.mdwn b/doc/design/assistant/blog/day_207__XMPP.mdwn new file mode 100644 index 000000000..8419905f1 --- /dev/null +++ b/doc/design/assistant/blog/day_207__XMPP.mdwn @@ -0,0 +1,7 @@ +More XMPP fixes. The most important change is that it now stores important +messages, like push requests, and (re)sends them when a buddy's client +sends XMPP presence. This makes XMPP syncing much more robust, all the +clients do not need to already be connected when messages are initially +sent, but can come and go. Also fixed a bug preventing syncing from working +immediately after XMPP pairing. XMPP seems to be working well now; I only +know of one minor bug. diff --git a/doc/design/assistant/blog/day_208__bugfixes.mdwn b/doc/design/assistant/blog/day_208__bugfixes.mdwn new file mode 100644 index 000000000..41874b918 --- /dev/null +++ b/doc/design/assistant/blog/day_208__bugfixes.mdwn @@ -0,0 +1,17 @@ +Fixed the last XMPP bug I know of. Turns out it was not specific to XMPP at +all; the assistant could forget to sync with any repository on startup +under certain conditions. + +Also fixed bugs in `git annex add` and in the glob matching, and some more. + +I've been working on some screencasts. More on them later.. But while doing +them I found a perfect way to reliably reproduce the webapp hang that +I've been chasing for half a year, and last saw at my presentation in +Australia. Seems the old joke about bugs only reproducible during +presentations is literally true here! + +I have given this bug its [[own page|bugs/webapp_hang]] at last, and have a +tcpdump of it happening and everything. Am working on an hypotheses that it +might be caused by Warp's [slowloris](http://ha.ckers.org/slowloris/) +attack prevention code being falsely triggered by the repeated hits the web +browser makes as the webapp's display is updated. diff --git a/doc/design/assistant/blog/day_209__The_Bug.mdwn b/doc/design/assistant/blog/day_209__The_Bug.mdwn new file mode 100644 index 000000000..b2e87fd8f --- /dev/null +++ b/doc/design/assistant/blog/day_209__The_Bug.mdwn @@ -0,0 +1,23 @@ +> And so we waited. Tick-tock, blink-blink, thirty seconds stretched +> themselves out one by one, a hole in human experience. -- The Bug + +I *think* I've managed to fully track down the [[webapp_hang]]. It is, +apparently, a bug in the Warp web server's code intended to protect against +the [Slowloris](http://ha.ckers.org/slowloris/) attack. It assumes, +incorrectly, that a web browser won't reuse a connection it's left idle for +30 seconds. Some bad error handling keeps a connection open with no thread +to service it, leading to the hang. + + +Have put a 30 minute timeout into place as a workaround, and, unless +a web browser sits on an idle connection for a full 30 minutes and then +tries to reuse it, this should be sufficient. + +I was chasing that bug, quietly, for 6 months. Would see it now and +then, but not be able to reproduce it or get anywhere with analysis. +I had nearly given up. If you enjoy stories like that, read Ellen +Ullman's excellent book The Bug. + +> To discover that between the blinks of the machine’s shuttered eye—going +> on without pause or cease; simulated, imagined, but still not caught—was +> life. diff --git a/doc/design/assistant/blog/day_20__data_transfer_design.mdwn b/doc/design/assistant/blog/day_20__data_transfer_design.mdwn new file mode 100644 index 000000000..4f47ae63c --- /dev/null +++ b/doc/design/assistant/blog/day_20__data_transfer_design.mdwn @@ -0,0 +1,22 @@ +Today is a planning day. I have only a few days left before I'm off to +Nicaragua for [DebConf](http://debconf12.debconf.org/), where I'll only +have smaller chunks of time without interruptions. So it's important to get +some well-defined smallish chunks designed that I can work on later. See +bulleted action items below (now moved to [[syncing]]. Each +should be around 1-2 hours unless it turns out to be 8 hours... :) + +First, worked on writing down a design, and some data types, for data transfer +tracking (see [[syncing]] page). Found that writing down these simple data +types before I started slinging code has clarified things a lot for me. + +Most importantly, I realized that I will need to modify `git-annex-shell` +to record on disk what transfers it's doing, so the assistant can get that +information and use it to both avoid redundant transfers (potentially a big +problem!), and later to allow the user to control them using the web app. + +While eventually the user will be able to use the web app to prioritize +transfers, stop and start, throttle, etc, it's important to get the default +behavior right. So I'm thinking about things like how to prioritize uploads +vs downloads, when it's appropriate to have multiple downloads running at +once, etc. + diff --git a/doc/design/assistant/blog/day_210__spring.mdwn b/doc/design/assistant/blog/day_210__spring.mdwn new file mode 100644 index 000000000..ff34cfbfe --- /dev/null +++ b/doc/design/assistant/blog/day_210__spring.mdwn @@ -0,0 +1,29 @@ +Trying to record screencasts demoing the assistant is really helping me +see things that need to be fixed. + +Got the version of the haskell TLS library in Debian fixed, backporting +some changes to fix a botched security fix that made it reject all +certificates. So WebDAV special remotes will work again on the next release. + +Fixed some more problems around content being dropped when files are +moved to archive directories, and gotten again when files are +moved out. + +Fixed some problems around USB drives. One was a real jaw-dropping +bug: "git annex drop --from usbdrive" when the drive was not +connected still updated the location log to indicate it did not have +the file anymore! (Thank goodness for fsck..) + +I've noticed that moving around files in direct mode repos is inneficient, +because the assistant re-checksums the "new" file. One way to avoid +that would be to have a lookup table from (inode, size, mtime) to +key, but I don't have one, and would like to avoid adding one. + +Instead, I have a cunning plan to deal with this heuristically. If the +assistant can notice a file was removed and another file added at the same +time, it can compare the (inode, size, mtime) to see if it's a rename, and +avoid the checksum overhead. + +The first step to getting there was to make the assistant better at +batching together delete+add events into a single rename commit. I'm happy +to say I've accomplished that, with no perceptable delay to commits. diff --git a/doc/design/assistant/blog/day_211__zooming_along.mdwn b/doc/design/assistant/blog/day_211__zooming_along.mdwn new file mode 100644 index 000000000..fb87077be --- /dev/null +++ b/doc/design/assistant/blog/day_211__zooming_along.mdwn @@ -0,0 +1,24 @@ +Got renaming fully optimised in the assistent in direct mode. I even got it +to work for whole directory renames. I can drag files around all day in the +file manager and the assistant often finishes committing the rename before +the file manager updates. So much better than checksumming every single +renamed file! Also, this means the assistant makes just 1 commit when a +whole directory is renamed. + +Last night I added a feature to `git annex status`. It can now be asked to +only show the status of a single directory, rather than the whole annex. +All the regular file filtering switches work, so some neat commands +are possible. I like `git annex status . --in foo --not --in bar` to see +how much data is in one remote but not another. + +This morning, an important thought about [[bugs/smarter_flood_filling]], +that will avoid unnecessary uploads to transfer remotes when all that's +needed to get the file to its destination is a transfer over the LAN. +I found an easy way to make that work, at least in simple cases. +Hoping to implement it soon. + +Less fun, direct mode turns out to be somewhat buggy when files with +duplicate content are in the repository. Nothing fails, but `git annex +sync` will re-checksum files each time it's run in this situation, and the +assistant will re-checksum files in certian cases. Need to work on this +soon too. diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn b/doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn new file mode 100644 index 000000000..600522d14 --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn @@ -0,0 +1,24 @@ +Last night, revamped the web site, including making a [[/videos]] +page, which includes a new screencast introducing the git-annex assistant. + +Worked on improving my Haskell development environment in vim. +hdevtools is an excellent but tricky thing to get working. Where before +it took around 30 seconds per compile for me to see type errors, +I now see them in under a second each time I save, and can also look up +types of any expression in the file. Since programming in Haskell is +mostly driven by reacting to type errors ;) this should speed me up a lot, +although it's not perfect. Unfortunatly, I got really caught up in tuning +my setup, and only finished doing that at 5:48 am. + +Disasterously late this morning, fixed the assistant's +`~/.ssh/git-annex-shell` wrapper so it will work when the ssh key does +not force a command to be run. Also made the webapp behave better +when it's told to create a git repository that already exists. + +After entirely too little sleep, I found a puzzling bug where copying files +to a local repo fails once the inode cache has been invalidated. This +turned out to involve running a check in the state monad of the wrong +repository. A failure mode I'd never encountered before. + +Only thing I had brains left to do today was to record another screencast, +which is rendering now... diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_1_6ee1f8056eedb6eb18013faf8f5ec212._comment b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_1_6ee1f8056eedb6eb18013faf8f5ec212._comment new file mode 100644 index 000000000..6ad0ab235 --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_1_6ee1f8056eedb6eb18013faf8f5ec212._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl1D_4vD5ueaDw8gRsIYPO3UHRKEpFfg9I" + nickname="Дмитрий" + subject="About development in Vim" + date="2013-03-13T02:18:20Z" + content=""" +Could you describe your vim configuration for haskell development, what plugins do you use, what is in you .vimrc file and maybe even record a screencast of typical \"session\" of work? +"""]] diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_2_07c83d75bb105bb77ada07359ed0ea7a._comment b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_2_07c83d75bb105bb77ada07359ed0ea7a._comment new file mode 100644 index 000000000..06aae6e1b --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_2_07c83d75bb105bb77ada07359ed0ea7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="Global preferences?" + date="2013-03-13T08:00:55Z" + content=""" +I just did a \"cabal install git-annex --bindir=$HOME/bin\" on Ubuntu 12.10 and I don't see the global preferences (where you configure the autostart etc.) from the screencast. How can I enable this? +"""]] diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_3_2c904d33f4f14807fbe718a01e98800a._comment b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_3_2c904d33f4f14807fbe718a01e98800a._comment new file mode 100644 index 000000000..943bd5277 --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_3_2c904d33f4f14807fbe718a01e98800a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-13T16:08:35Z" + content=""" +The global preferences page is a new feature that will be in the next release. You can use a daily build or build from source to try it now. +"""]] diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_4_59ec5c1cab75df87293800a7a03fe9c6._comment b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_4_59ec5c1cab75df87293800a7a03fe9c6._comment new file mode 100644 index 000000000..c3e8f8351 --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_4_59ec5c1cab75df87293800a7a03fe9c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 4" + date="2013-03-13T16:34:46Z" + content=""" +Build from source is too hard for a non-haskell developer, I run into various errors I can not resolve. The daily build gives me \"git-annex: error while loading shared libraries: libyaml-0.so.2: cannot open shared object file: No such file or directory\". For Ubuntu a PPA with daily build would be handy. +"""]] diff --git a/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_5_13893f106e835dcc52e03c7c6740c35b._comment b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_5_13893f106e835dcc52e03c7c6740c35b._comment new file mode 100644 index 000000000..8c6419b1c --- /dev/null +++ b/doc/design/assistant/blog/day_212__accidental_all_nighter/comment_5_13893f106e835dcc52e03c7c6740c35b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-03-13T16:58:04Z" + content=""" +In the standalone linux daily build, you need to use the \"runshell\" script to start a shell environment in which you can run git-annex. +"""]] diff --git a/doc/design/assistant/blog/day_213__costs.mdwn b/doc/design/assistant/blog/day_213__costs.mdwn new file mode 100644 index 000000000..41517a7ab --- /dev/null +++ b/doc/design/assistant/blog/day_213__costs.mdwn @@ -0,0 +1,34 @@ +Got the assistant to check again, just before starting a transfer, if +the remote still wants the object. This should be all that's needed to +handle the case where there is a transfer remote on the internet somewhere, +and a locally paired client on the LAN. As long as the paired repository +has a lower cost value, it will be sent any new file first, and if that +is the only client, the file will not be sent to the transfer remote at +all. + +But.. locally paired repos did not have a lower cost set, at all. +So I made their cost be set to 175 when they're created. Anyone +who already did local pairing should make sure the Repositories +list shows locally paired repositories above transfer remotes. + +Which brought me to needing an easy way to reorder that list of remotes, +which I plan to do by letting the user drag and drop remotes around, +which will change their cost accordingly. Implementing that has two +pain points: + +1. Often a lot of remotes will have the same default cost value. + So how to insert a remote in between two that have cost 100? + This would be easy if git-annex didn't have these cost numbers, + and instead just had an ordered list of remotes.. but it doesn't. + Instead, dragging remotes in the list will sometimes need to change + the costs of others, to make room to insert them in. It's BASIC + renumbering all over again. So I wrote some code to do this with as + little bother as possible. + +2. Drag and drop means javascript. I got the basics going quickly with + jquery-ui, only to get stuck for over an hour on some CSS issue + that made lines from the list display all weird while being dragged. + It is always something like this with javascript.. + +So I've got these 2 peices working, and even have the AJAX call +firing, but it's not quite wired up just yet. Tomorrow. diff --git a/doc/design/assistant/blog/day_214__release_day.mdwn b/doc/design/assistant/blog/day_214__release_day.mdwn new file mode 100644 index 000000000..2ada21308 --- /dev/null +++ b/doc/design/assistant/blog/day_214__release_day.mdwn @@ -0,0 +1,5 @@ +Fighting with javascript all day and racing to get a release out. Unstuck +the OSX and Android autobuilders. Got drag and drop repository list +reordering working great. Tons of changes in this release! + +Also put up a new podcast. diff --git a/doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn b/doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn new file mode 100644 index 000000000..9381ebee2 --- /dev/null +++ b/doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn @@ -0,0 +1,25 @@ +I've reworked the UI of the webapp's dashboard. Now the repository list is +included, above the transfers. I found I was spending a lot of time +switching between the dashboard and repository list, so might as well +combine them into a single screen. Yesod's type safe urls and widgets +made this quite easy to do, despite it being a thousand line commit. +Liking the result ... Even though it does make all my screencasts dated. + +[[!img /assistant/dashboard.png]] + +---- + +Rest of my time was spent on XMPP pairing UI. Using the same pages for both +pairing with a friend and for self-pairing was confusing, so now the two +options are split. + +Now every time an XMPP git push is received or sent, it checks if there's +a cloud repository configured, which is needed to send the contents of +files. If not, it'll display this alert. Hopefully this +will be enough to get users fully set up. + +[[!img /assistant/cloudnudge.png]] + +At this point I'm finally happy enough with the XMPP pairing + cloud +repository setup process to film a screencast of it. As soon as I have +some time & bandwidth someplace quiet. Expect one by the end of the month. diff --git a/doc/design/assistant/blog/day_216__more_bugfixes.mdwn b/doc/design/assistant/blog/day_216__more_bugfixes.mdwn new file mode 100644 index 000000000..a988643ff --- /dev/null +++ b/doc/design/assistant/blog/day_216__more_bugfixes.mdwn @@ -0,0 +1,42 @@ +A long time ago I made Remote be an instance of the Ord typeclass, with an +implementation that compared the costs of Remotes. That seemed like a good +idea at the time, as it saved typing.. But at the time I was still making +custom Read and Show instances too. I've since learned that this is *not* a +good idea, and neither is making custom Ord instances, without deep thought +about the possible sets of values in a type. + +This Ord instance came around and bit me when I put Remotes into a Set, +because now remotes with the same cost appeared to be in the Set even if +they were not. Also affected putting Remotes into a Map. I noticed this +when the webapp got confused about which Remotes were paused. + +Rarely does a bug go this deep. I've fixed it comprehensively, first +removing the Ord instance entirely, and fixing the places that wanted to +order remotes by cost to do it explicitly. Then adding back an Ord instance +that is much more sane. Also by checking the rest of the Ord (and Eq) +instances in the code base (which were all ok). + +While doing that, I found lots of places that kept remotes in Maps and +Sets. All of it was probably subtly broken in one way or another before +this fix, but it would be hard to say exactly how the bugs would +manifest. + +----- + +Also fought some with Google Talk today. Seem to be missing presence +messages sometimes. Ugh. May have fixed it, but I've thought that before.. + +Made --debug include a sanitized dump of the XMPP protocol. + +Made UI changes to encourage user to install git-annex on the server when +adding a ssh server, rather than just funneling them through to rsync. + +Fixed UI glitches in XMPP username/password prompt. + +Switched all forms in the webapp to use POST, to avoid sensitive +information leaking on the url bar. + +---- + +Added an incremental backup group. Repositories in this group only want +files that have not been backed up somewhere else yet. diff --git a/doc/design/assistant/blog/day_216__more_bugfixes/comment_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment b/doc/design/assistant/blog/day_216__more_bugfixes/comment_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment new file mode 100644 index 000000000..7d28cfdbf --- /dev/null +++ b/doc/design/assistant/blog/day_216__more_bugfixes/comment_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR7hb8IaKB3IKZptRukje0yahmhfLOO98" + nickname="Adam" + subject="comment 1" + date="2013-03-17T00:30:26Z" + content=""" +> Made UI changes to encourage user to install git-annex on the server when adding a ssh server, rather than just funneling them through to rsync. + +What's the difference between having git-annex available versus not? +"""]] diff --git a/doc/design/assistant/blog/day_216__more_bugfixes/comment_2_1913d65dfe4ba08379d82a4a2ca91c40._comment b/doc/design/assistant/blog/day_216__more_bugfixes/comment_2_1913d65dfe4ba08379d82a4a2ca91c40._comment new file mode 100644 index 000000000..200846545 --- /dev/null +++ b/doc/design/assistant/blog/day_216__more_bugfixes/comment_2_1913d65dfe4ba08379d82a4a2ca91c40._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI" + nickname="Amitai" + subject="Google Talk silently drops non-Google invites (at least)" + date="2013-03-17T13:44:18Z" + content=""" +Have you seen ? Maybe they're also doing other funny stuff that gets in your way. +"""]] diff --git a/doc/design/assistant/blog/day_216__more_bugfixes/comment_3_92c774599a78540ad398afcd1d05f7ce._comment b/doc/design/assistant/blog/day_216__more_bugfixes/comment_3_92c774599a78540ad398afcd1d05f7ce._comment new file mode 100644 index 000000000..05847a73b --- /dev/null +++ b/doc/design/assistant/blog/day_216__more_bugfixes/comment_3_92c774599a78540ad398afcd1d05f7ce._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR7hb8IaKB3IKZptRukje0yahmhfLOO98" + nickname="Adam" + subject="comment 3" + date="2013-03-25T01:58:23Z" + content=""" +About the UI prompt for the webapp: + +> What's the difference between having git-annex available versus not? + +I can see from the UI that if you make it be a git repository, you get this: + +> All your data will be uploaded to the server, including the full git repository. This is a great choice if you want to set up other devices to use the same server, or share the repository with others. + +Versus an rsync repo: + +> The contents of your files will be stored, fully encrypted, on the server. The server will not store other information about your git repository. This is the best choice if you don't run the server yourself, or have sensitive data. + +Unfortunately I'm looking for a shared server (as per the git repo description), but **also fully encrypted** because I'll be storing sensitive data. +"""]] diff --git a/doc/design/assistant/blog/day_217__nothing.mdwn b/doc/design/assistant/blog/day_217__nothing.mdwn new file mode 100644 index 000000000..95deabd23 --- /dev/null +++ b/doc/design/assistant/blog/day_217__nothing.mdwn @@ -0,0 +1,2 @@ +Is what I planned to do on git-annex today. Instead I fixed several bugs, +but I'm drawing the line at blogging. Oops. diff --git a/doc/design/assistant/blog/day_219__bug_triage.mdwn b/doc/design/assistant/blog/day_219__bug_triage.mdwn new file mode 100644 index 000000000..82494ceca --- /dev/null +++ b/doc/design/assistant/blog/day_219__bug_triage.mdwn @@ -0,0 +1,14 @@ +Triaged some of the older bugs and was able to close a lot of them. + +----- + +Should mention that I will be in Boston this weekend, attending +[LibrePlanet 2013](http://libreplanet.org/wiki/LibrePlanet:Conference/2013). +Drop by and find me, I'll have git-annex stickers! ;) + +----- + +Did some UI work on the webapp. Minor stuff, but stuff that needed to be +fixed up. Like inserting zero-width spaces into filenames displayed in it +so very long filenames always get reasonably wrapped by the browser. +(Perhaps there's a better way to do that with CSS?) diff --git a/doc/design/assistant/blog/day_219__bug_triage/comment_1_c6b977a969cacdce62987a439b7686f5._comment b/doc/design/assistant/blog/day_219__bug_triage/comment_1_c6b977a969cacdce62987a439b7686f5._comment new file mode 100644 index 000000000..5722f7e19 --- /dev/null +++ b/doc/design/assistant/blog/day_219__bug_triage/comment_1_c6b977a969cacdce62987a439b7686f5._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="wrapping css" + date="2013-03-20T20:28:04Z" + content=""" +You can do this in css: + + word-wrap: break-word; + +That should make the text not leave the box. Not sure if this makes it break \"reasonably\" though, eg a two letter word followed by an 200 letter \"word\" would probably leave the two letter word on a line by itself. + +Worth a try though. + +Seems to be well supported on browsers: [http://caniuse.com/#search=wrap](http://caniuse.com/#search=wrap) +"""]] diff --git a/doc/design/assistant/blog/day_21__transfer_tracking.mdwn b/doc/design/assistant/blog/day_21__transfer_tracking.mdwn new file mode 100644 index 000000000..79c0b6438 --- /dev/null +++ b/doc/design/assistant/blog/day_21__transfer_tracking.mdwn @@ -0,0 +1,28 @@ +Worked today on two action items from my last blog post: + +* on-disk transfers in progress information files (read/write/enumerate) +* locking for the files, so redundant transfer races can be detected, + and failed transfers noticed + +That's all done, and used by the `get`, `copy`, and `move` subcommands. + +Also, I made `git-annex status` use that information to display any +file transfers that are currently in progress: + + joey@gnu:~/lib/sound/misc>git annex status + [...] + transfers in progress: + downloading Vic-303.mp3 from leech + +(Webapp, here we come!) + +However... Files being sent or received by `git-annex-shell` don't yet +have this transfer info recorded. The problem is that to do so, +`git-annex-shell` will need to be run with a `--remote=` parameter. But +old versions will of course fail when run with such an unknown parameter. + +This is a problem I last faced in December 2011 when adding the `--uuid=` +parameter. That time I punted and required the remote `git-annex-shell` be +updated to a new enough version to accept it. But as git-annex gets more widely +used and packaged, that's becoming less an option. I need to find a real +solution to this problem. diff --git a/doc/design/assistant/blog/day_220__performance.mdwn b/doc/design/assistant/blog/day_220__performance.mdwn new file mode 100644 index 000000000..a1b7b329a --- /dev/null +++ b/doc/design/assistant/blog/day_220__performance.mdwn @@ -0,0 +1,40 @@ +I've been running some large transfers with the assistant, and looking at +ways to improve performance. (I also found and fixed a zombie process +leak.) + +---- + +One thing I noticed is that the assistant pushes changes to the git-annex +location log quite frequently during a batch transfer. If the files being +transferred are reasonably sized, it'll be pushing once per file transfer. +It would be good to reduce the number of pushes, but the pushes are +important in some network topologies to inform other nodes +when a file gets near to them, so they can get the file too. + +Need to see if I can find a smart way to avoid some of the pushes. +For example, if we've just downloaded a file, and are queuing uploads +of the file to a remote, we probably don't need to push the git-annex +branch to the remote. + +---- + +Another performance problem is that having the webapp open while transfers +are running uses significant CPU just for the browser to update the progress +bar. Unsurprising, since the webapp is sending the browser a new `
` +each time. Updating the DOM instead from javascript would avoid that; +the webapp just needs to send the javascript either a full `
` or a +changed percentage and quantity complete to update a single progress bar. + +I'd prefer to wait on doing that until I'm able to use Fay to generate +Javascript from Haskell, because it would be much more pleasant.. will see. + +---- + +Also a performance problem when performing lots of transfers, particularly +of small files, is that the assistant forks off a `git annex transferkey` +for each transfer, and that has to in turn start up several git commands. + +Today I have been working to change that, so the assistant maintains a +pool of transfer processes, and dispatches each transfer it wants to make +to a process from the pool. I just got all that to build, although untested +so far, in the `transferpools` branch. diff --git a/doc/design/assistant/blog/day_221__this_and_that.mdwn b/doc/design/assistant/blog/day_221__this_and_that.mdwn new file mode 100644 index 000000000..87406547e --- /dev/null +++ b/doc/design/assistant/blog/day_221__this_and_that.mdwn @@ -0,0 +1,28 @@ +Was unsure yesterday if my transferrer pools code would just work, or +would be horribly broken and need a lot of work to get going. It was a +complex change involving both high-level STM code and low-level pipes and +fds. Well, it almost worked 100% first time, I just had a minor issue in +my fd setup to fix. Everything else seems to work perfectly. +Very happy how that went! + +---- + +Improved support and documentation for using the OSX app and Linux +standalone tarball at the command line. Now it's sufficient to just put +their directory into `PATH`, rather than using `runshell`. + +---- + +The webapp's form for adding a removable drive now allows specifying the +directory to use within the drive (default "annex"). + +When the drive's repository already exists, and it's not a repository +that git-annex knows about, it confirms that the user wants +to combine its contents into their repository. + + +(Should probably implement this same check when adding a ssh remote.) + +---- + +Off to Boston! diff --git a/doc/design/assistant/blog/day_222__back.mdwn b/doc/design/assistant/blog/day_222__back.mdwn new file mode 100644 index 000000000..9c3c17094 --- /dev/null +++ b/doc/design/assistant/blog/day_222__back.mdwn @@ -0,0 +1,16 @@ +Back from my trip. Spent today getting caught up. + +Didn't do much while I was away. Pushed out a new release on Saturday. +Made `git annex` usage display nicer. + +Fixed some minor webapp bugs today. The interesting bug was a +race that sometimes caused alerts or other notifications to be +missed and not be immediately displayed if they occurred while +a page was loading. You sometimes had to hit reload to see them, +but not anymore! + +Checked if the `push.default=simple` change in upcoming git release will +affect git-annex. It shouldn't affect the assistant, or `git annex sync`, +since they always list all branches to push explicitly. But if you `git push` +manually, when the default changes that won't include the git-annex branch +in the push any longer. diff --git a/doc/design/assistant/blog/day_222__back/comment_1_f05b48231a1ee0cffba7d66e112e5551._comment b/doc/design/assistant/blog/day_222__back/comment_1_f05b48231a1ee0cffba7d66e112e5551._comment new file mode 100644 index 000000000..f788cc283 --- /dev/null +++ b/doc/design/assistant/blog/day_222__back/comment_1_f05b48231a1ee0cffba7d66e112e5551._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="something for the wishlist maybe?" + date="2013-03-28T08:30:00Z" + content=""" +Something I was wondering with the assistant now getting really smart: would it be possible to have a cli-mode for the assistant that runs in the forground and only until there is nothing to do anymore? Something like a single-run-assistant`? Reason being that in my usecases most often I know exactly when the right moment for a run is - for example after processing a bunch of photographs - and I most definitely don't want a background process to work on those photographs while I do work on them. Or with archival media, I know when I will hook up the archive drives. In allmost all of my scenarios it would be much easier to not run the assistant in the background, but to fire it from the cli at the right moments, letting it work over night and have it shut down automatically when all is synced. +"""]] diff --git a/doc/design/assistant/blog/day_222__back/comment_2_4d5f003ccd81580017ebf0dc31bc9cda._comment b/doc/design/assistant/blog/day_222__back/comment_2_4d5f003ccd81580017ebf0dc31bc9cda._comment new file mode 100644 index 000000000..cc28d5608 --- /dev/null +++ b/doc/design/assistant/blog/day_222__back/comment_2_4d5f003ccd81580017ebf0dc31bc9cda._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-28T15:50:47Z" + content=""" +That's an interesting thought. I think it would be hard to find a clear condition when it was done and could shut down. While there is easy visibility into the transfer queue to tell when file transfers are done, it's harder to tell when it's actively syncing git repositories or scanning for transfers to do, or finding new files to commit. Each thread knows what it's doing, but none of the other threads do. Maybe active threads could hold a lock to indicate they're busy, and this combined with visibility into the various work queues could do the job. +"""]] diff --git a/doc/design/assistant/blog/day_223__progress_revisited.mdwn b/doc/design/assistant/blog/day_223__progress_revisited.mdwn new file mode 100644 index 000000000..9f899899d --- /dev/null +++ b/doc/design/assistant/blog/day_223__progress_revisited.mdwn @@ -0,0 +1,24 @@ +Went out and tried for the second time to record a screencast demoing +setting up syncing between two computers using just Jabber and a cloud +remote. I can't record this one at home, or viewers would think git-annex +was crazy slow, when it's just my dialup. ;) But once again I encountered +bugs, and so I found myself working on progress bars today, unexpectedly. + +Seems there was confusion in different parts of the progress bar code +about whether an update contained the total number of bytes transferred, or +the delta of bytes transferred since the last update. One way this bug +showed up was progress bars that seemed to stick at 0% for a long time. +Happened for most special remotes, although not for rsync or git remotes. +In order to fix it comprehensively, I added a new BytesProcessed data type, +that is explicitly a total quantity of bytes, not a delta. And checked and +fixed all the places that used a delta as that type was knitted into +the code. + +(Note that this doesn't necessarily fix every problem with progress bars. +Particularly, buffering can now cause progress bars to seem to run ahead +of transfers, reaching 100% when data is still being uploaded. Still, +they should be a lot better than before.) + +I've just successfully run through the Jabber + Cloud remote setup process +again, and it seems to be working great now. Maybe I'll still get the +screencast recorded by the end of March. diff --git a/doc/design/assistant/blog/day_224__annex.largefiles.mdwn b/doc/design/assistant/blog/day_224__annex.largefiles.mdwn new file mode 100644 index 000000000..4fab93fb6 --- /dev/null +++ b/doc/design/assistant/blog/day_224__annex.largefiles.mdwn @@ -0,0 +1,23 @@ +Built a feature for power users today. `annex.largefiles` can be +configured to specify what files `git annex add` and the assistant should +put into the annex. It uses the same syntax as [[/preferred_content]], +so arbitrarily complex expressions can be built. + +For example, a game written in C with some large data files could +include only 100kb or larger files, that are not C code: + + annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h) + +The assistant will commit small files to git directly! +`git annex add`, being a lower level tool, skips small files +and leaves it up to you to `git add` them as desired. + +It's even possible to tell the assistant that no file is too large to be +committed directly to git. `git config annex.largefiles 'exclude=*'` +The result should be much like using SparkleShare or dvcs-autosync. + +----- + +Also today, made the remote ssh server checking code in the webapp +deal with servers where the default shell is csh or some other non-POSIX +shell. diff --git a/doc/design/assistant/blog/day_224__annex.largefiles/comment_1_408e4021b18f7ff5548d2d19ab558922._comment b/doc/design/assistant/blog/day_224__annex.largefiles/comment_1_408e4021b18f7ff5548d2d19ab558922._comment new file mode 100644 index 000000000..370f599c2 --- /dev/null +++ b/doc/design/assistant/blog/day_224__annex.largefiles/comment_1_408e4021b18f7ff5548d2d19ab558922._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="Great idea! " + date="2013-03-30T08:00:16Z" + content=""" +This will be perfect for my raw image pool! I use Lightroom, so my photos are only imported once and only in case of DNG are they actually changed, in all other formats LR creates little sidecar XML files with processing instructions. So with this change the side car files can actually be fully Versionen and lage files are kept out of the repo and handled by archiving with annex. Cool! +"""]] diff --git a/doc/design/assistant/blog/day_224__annex.largefiles/comment_2_b24d1da2bc4307ded0216daffb8f9336._comment b/doc/design/assistant/blog/day_224__annex.largefiles/comment_2_b24d1da2bc4307ded0216daffb8f9336._comment new file mode 100644 index 000000000..14fdfed5c --- /dev/null +++ b/doc/design/assistant/blog/day_224__annex.largefiles/comment_2_b24d1da2bc4307ded0216daffb8f9336._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWBvsZvSsAL8P2ye3F0OBStjFCVnOImzM" + nickname="Jarno" + subject="Making "git-annex add" commit largefiles, too?" + date="2013-10-31T00:26:21Z" + content=""" +Is it possible to make `git annex add` also *not* skip largefiles but do an automatic `git add` instead? I'd like to keep .txt, .sh and the like in git directly (for easier diffing) but having to add them separately sounds like trouble. +"""]] diff --git a/doc/design/assistant/blog/day_225__back_from_the_dead.mdwn b/doc/design/assistant/blog/day_225__back_from_the_dead.mdwn new file mode 100644 index 000000000..e550c6b8b --- /dev/null +++ b/doc/design/assistant/blog/day_225__back_from_the_dead.mdwn @@ -0,0 +1,47 @@ +I've posted a poll: [[polls/goals_for_April]] + +---- + +Today added UI to the webapp to delete repositories, which many +users have requested. It can delete the local repository, +with appropriate cautions and sanity checks: + +[[!img /assistant/deleterepository.png]] + +More likely, you'll use it to remove a remote, which is done with no muss +and no fuss, since that doesn't delete any data and the remote can always +be added back if you change your mind. + +It also has an option to fully delete the data on a remote. This doesn't +actually delete the remote right away. All it does is marks the remote +as untrusted[1], and configures it to not want any content. +This causes all the content on it to be sucked off to whatever +other repositories can hold it. + +I had to adjust the preferred content expressions to make that work. For +example, when deleting an archive drive, your local (client) repository +does not normally want to hold all the data it has in "archive" +directories. With the adjusted preferred content expressions, any data on +an untrusted or dead repository is wanted. An interesting result is that +once a client repository has moved content from an untrusted remote, it +will decide it doesn't want it anymore, and shove it out to any other +remote that will accept it. Which is just the behavior we want. All it took +to get all this behavior is adding "or (not copies=semitrusted:1)" to the +preferred content expressions! + +For most special remotes, just sucking the data from them is sufficient to +pretty well delete them. You'd want to delete an Amazon bucket or glacier +once it's empty, and git repositories need to be fully deleted. Since this +would need unique code for each type of special remote, and it would be +code that a) deletes possibly large quantities of data with no real way to +sanity check it and b) doesn't get run and tested very often; it's not +something I'm thrilled about fully automating. However, I would like to +make the assistant detect when all the content has been sucked out of a +remote, and pop up at least a message prompting to finish the deletion. +Future work. + +----- + +[1] I really, really wanted to mark it dead, but letting puns drive code +is probably a bad idea. I had no idea I'd get here when I started +developing this feature this morning.. Honest! diff --git a/doc/design/assistant/blog/day_225__back_from_the_dead/comment_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment b/doc/design/assistant/blog/day_225__back_from_the_dead/comment_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment new file mode 100644 index 000000000..325eff30c --- /dev/null +++ b/doc/design/assistant/blog/day_225__back_from_the_dead/comment_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="99.65.214.16" + subject="Just wondering what I'm missing..." + date="2013-04-02T21:43:33Z" + content=""" +I haven't played around with the preferred content expressions, but what is is that keeps \"or (not copies=semitrusted:1)\" from grabbing all the content from trusted repositories, as well as untrusted or dead ones? +"""]] diff --git a/doc/design/assistant/blog/day_225__back_from_the_dead/comment_2_26125dd9ef2bd10b597d14b2c6180952._comment b/doc/design/assistant/blog/day_225__back_from_the_dead/comment_2_26125dd9ef2bd10b597d14b2c6180952._comment new file mode 100644 index 000000000..384d20f31 --- /dev/null +++ b/doc/design/assistant/blog/day_225__back_from_the_dead/comment_2_26125dd9ef2bd10b597d14b2c6180952._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-03T03:42:40Z" + content=""" +That's some seriously sharp eyes, Andy. Nothing. I forgot it didn't work that way. Now it uses semitrusted+:1 which works the right way. +"""]] diff --git a/doc/design/assistant/blog/day_226__poll_results.mdwn b/doc/design/assistant/blog/day_226__poll_results.mdwn new file mode 100644 index 000000000..e79ff2585 --- /dev/null +++ b/doc/design/assistant/blog/day_226__poll_results.mdwn @@ -0,0 +1,28 @@ +Both the assistant and `git annex drop --auto` refused to drop files from +untrusted repositories. Got that fixed. + +Finally recorded the xmpp pairing screencast. In one perfect take, which +somehow `recordmydesktop` lost the last 3 minutes of. +Argh! Anyway I'm editing it now, so, look for that screencast soon. + +The [[polls/goals_for_April]] poll results are in. + +* There have been no votes at all for working on + cloud remotes. Seems that git-annex supports enough cloud remotes already. +* A lot of people want the Android webapp port to be done, so I will + probably spend some time on that this month. +* Interest in other various features is split. I am surprised how many + want git-remote-gcrypt, compared to the features that would make + syncing use less bandwidth. Doesn't git push over xmpp cover most + of the use cases where git-remote-gcrypt would need to be used with the + assistant? +* Nearly as many people as want features, want me to work on bug + fixing and polishing what's already there. + So I should probably continue to make screencasts, since they often force + me to look at things with fresh eyes and see and fix problems. And of course, + continue working on bugs as they're reported. +* I'm not sure what to make of the 10% who want me to add direct mode support. + Since direct mode is already used by default, perhaps they want + me to take time off? :) (I certainly need to fix the + [[bugs/Direct_mode_keeps_re-checksuming_duplicated_files]] bug, and one other + direct mode bug I discovered yesterday.) diff --git a/doc/design/assistant/blog/day_226__poll_results/comment_1_1ed980472214be6d0a8cf55f37797fda._comment b/doc/design/assistant/blog/day_226__poll_results/comment_1_1ed980472214be6d0a8cf55f37797fda._comment new file mode 100644 index 000000000..f936e68ed --- /dev/null +++ b/doc/design/assistant/blog/day_226__poll_results/comment_1_1ed980472214be6d0a8cf55f37797fda._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="I've voted for git-remote-gcrypt because.." + date="2013-04-02T09:07:23Z" + content=""" +... as important a Windows port seems for git-annex to really take off (IMO), I would welcome encrypted repos for storing stuff on external drives: directory special remotes feel kinda cumbersome for me, I would rather use full blown repos. +"""]] diff --git a/doc/design/assistant/blog/day_226__poll_results/comment_2_6823b0a9a8037f1a5214db4db98fb16e._comment b/doc/design/assistant/blog/day_226__poll_results/comment_2_6823b0a9a8037f1a5214db4db98fb16e._comment new file mode 100644 index 000000000..c6e65adf2 --- /dev/null +++ b/doc/design/assistant/blog/day_226__poll_results/comment_2_6823b0a9a8037f1a5214db4db98fb16e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-02T21:36:50Z" + content=""" +Thanks for reminding me about that use case. I have created a page [[encrypted_git_remotes]] for this. +"""]] diff --git a/doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn b/doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn new file mode 100644 index 000000000..74e9fd82f --- /dev/null +++ b/doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn @@ -0,0 +1,21 @@ +The [[xmpp screencast|videos/git-annex_assistant_remote_sharing]] +is at long last done! + +---- + +Fixed a bug that could cause the assistant to unstage files +from git sometimes. This happened because of a bad optimisation; adding a +file when it's already present and unchanged was optimised to do nothing. +But if the file had just been removed, and was put back, this resulted +in the removal being staged, and the add not being staged. Ugly bug, +although the assistant's daily sanity check automatically restaged the +files. + +Underlying that bug was a more important problem: git-annex does not always +update working tree files atomically. So a crash at just the wrong instant +could cause a file to be deleted from the working tree. I fixed that too; +all changes to files in the working tree should now be staged in a temp +file, which is renamed into place atomically. + +Also made a bunch of improvements to the dashboard's transfer display, and +to the handling of the underlying transfer queue. diff --git a/doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn b/doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn new file mode 100644 index 000000000..f8b450216 --- /dev/null +++ b/doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn @@ -0,0 +1,27 @@ +Getting back to the repository removal handling from Sunday, I made the +assistant detect when a repository that has been marked as unwanted becomes +empty, and finish the removal process. + +I was able to add this to the expensive transfer scan without making it any +more expensive than it already was, since that scan already looks at the +location of all keys. Although when a remote is detected as empty, it then +does one more check, equivilant to `git annex unused`, to find any +remaining objects on the remote, and force them off. + +I think this should work pretty well, but it needs some testing and +probably some UI work. + +---- + +Andy spotted a bug in the preferred content expressions I was using to +handle untrusted remotes. So he saved me several hours dealing with an ugly +bug at some point down the line. I had misread my own preferred content +expression documentation, and `copies=semitrusted:1` was not doing what I +thought it was. Added a new syntax that does what I need, +`copies=semitrusted+:1` + +---- + +The 64 bit linux standalone builds are back. Apparently the 32 bit builds +have stopped working on recent Fedora, for reasons that are unclear. I set +up an autobuilder to produce the 64 bit builds. diff --git a/doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn b/doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn new file mode 100644 index 000000000..87611a97d --- /dev/null +++ b/doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn @@ -0,0 +1,17 @@ +Got caught up on bug reports and made some bug fixes. + +The one bug I was really worried about, a strange file corruption problem +on Android, turned out not to be a bug in git-annex. (Nor is it a bug that +will affect regular users.) + +The only interesting bug fixed was a mixed case hash directory name +collision when a repository is put on a VFAT filesystem (or other +filesystem with similar semantics). I was able to fix that nicely; since +such a repository will be in crippled filesystem mode due to other +limitations of the filesystem, and so won't be using symlinks, +it doesn't need to use the mixed case hash directory names. + +Last night, finished up the repository removal code, and associated UI +tweaks. It works very well. + +Will probably make a release tomorrow. diff --git a/doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn b/doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn new file mode 100644 index 000000000..8f6708e59 --- /dev/null +++ b/doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn @@ -0,0 +1,34 @@ +Well, sometimes you just have to go for the hack. Trying to find a way +to add additional options to git-annex-shell without breaking backwards +compatibility, I noticed that it ignores all options after `--`, because +those tend to be random rsync options due to the way rsync runs it. + +So, I've added a new class of options, that come in between, like +`-- opt=val opt=val ... --` + +The parser for these will not choke on unknown options, unlike normal +getopt. So this let me add the additional info I needed to +pass to git-annex-shell to make it record transfer information. And +if I need to pass more info in the future, that's covered too. + +It's ugly, but since only git-annex runs git-annex-shell, this is an +ugliness only I (and now you, dear reader) have to put up with. + +Note to self: Command-line programs are sometimes an API, particularly +if designed to be called remotely, and so it makes sense consider +whether they are, and design expandability into them from day 1. + +--- + +Anyway, we now have full transfer tracking in git-annex! Both sides of +a transfer know what's being transferred, and from where, and have +the info necessary to interrupt the transfer. + +--- + +Also did some basic groundwork, adding a queue of transfers to perform, +and adding to the daemon's status information a map of currently running +transfers. + +Next up: The daemon will use inotify to notice new and deleted transfer +info files, and update its status info. diff --git a/doc/design/assistant/blog/day_230__Mom.mdwn b/doc/design/assistant/blog/day_230__Mom.mdwn new file mode 100644 index 000000000..66a0c864d --- /dev/null +++ b/doc/design/assistant/blog/day_230__Mom.mdwn @@ -0,0 +1,35 @@ +Made a release today. Releasing has sure gotten easier with all the +autobuilds to use! + +I am now using git-annex to share files with my mom. Here's how the webapp +looks for our family's repository. Soon several of us will be using this +repository. + +[[!img assistant/example.png]] + +We're using XMPP and rsync.net, so pretty standard setup much like +shown in my last screencast. + +Real-world deployments help find bugs, and I found a few: + +* If you're running the webapp in `w3m` on a remote computer to set it up, + some forms are lacking submit buttons. This must be a issue with + Bootstrap, or HTML5, I guess. I switched to `lynx` and it offers a + way to submit forms that lack an explicit button. + +* Progress bars for downloads from encrypted rsync repos don't update + during the actual download, but only when gpg is decrypting the + downloaded file. + +* XMPP pushes sometimes fail still. Especially when your mom's computer + is saturating its limited outgoing network connection uploading hundreds of + photos. I have not yet determined if this is a packet loss/corruption issue, + or if the XMPP messages are getting out of order. My gut feeling is it's + the latter, in which can I can fix this pretty easily by adding sequence + numbers and some buffering for out of order packets. Or perhaps just + make it retry failed pushes when this happens. + + Anyway, I found it was useful to set up a regular git repository on a + server to suppliment the git pushes over XMPP. It's helpful to have + such a git repository anyway, so that clients can push to there when the + other client(s) are not online to be pushed to directly over XMPP. diff --git a/doc/design/assistant/blog/day_230__Mom/comment_1_696bba2246c8a9e6ce4aed3071bcc96c._comment b/doc/design/assistant/blog/day_230__Mom/comment_1_696bba2246c8a9e6ce4aed3071bcc96c._comment new file mode 100644 index 000000000..5b8b8187f --- /dev/null +++ b/doc/design/assistant/blog/day_230__Mom/comment_1_696bba2246c8a9e6ce4aed3071bcc96c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="68.35.120.66" + subject="comment 1" + date="2013-04-05T23:50:14Z" + content=""" +This is probably a Dumb Git Question, but is there a tag in the repo for the new release? I go into my clone and type \"git tag\" and the latest one I see is 4.20130323. +"""]] diff --git a/doc/design/assistant/blog/day_230__Mom/comment_2_2fa295ab6db0828cb725cfcfb6777822._comment b/doc/design/assistant/blog/day_230__Mom/comment_2_2fa295ab6db0828cb725cfcfb6777822._comment new file mode 100644 index 000000000..3f1666d89 --- /dev/null +++ b/doc/design/assistant/blog/day_230__Mom/comment_2_2fa295ab6db0828cb725cfcfb6777822._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="deletions by mistake?" + date="2013-04-06T04:58:09Z" + content=""" +Let's say a family member deletes a file by mistake in a synced diretory? Looks like this kind of error is easy to go unnoticed. What would be a good way to handle this? +"""]] diff --git a/doc/design/assistant/blog/day_230__Mom/comment_3_fafd7abec629290418334ddb015bf62c._comment b/doc/design/assistant/blog/day_230__Mom/comment_3_fafd7abec629290418334ddb015bf62c._comment new file mode 100644 index 000000000..9cfa45aca --- /dev/null +++ b/doc/design/assistant/blog/day_230__Mom/comment_3_fafd7abec629290418334ddb015bf62c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-06T16:26:57Z" + content=""" +Weird, I don't know where the tag went. I've pushed a new one. + +If a file is deleted, it's still there in git, and git-annex hangs onto its contents. You need a git history browser to get it back of course. +"""]] diff --git a/doc/design/assistant/blog/day_230__Mom/comment_4_450cac0f2e82c94fd34b527ae05ef1b8._comment b/doc/design/assistant/blog/day_230__Mom/comment_4_450cac0f2e82c94fd34b527ae05ef1b8._comment new file mode 100644 index 000000000..56c8d3204 --- /dev/null +++ b/doc/design/assistant/blog/day_230__Mom/comment_4_450cac0f2e82c94fd34b527ae05ef1b8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlUbH3eytydcwlWqv8oauE2Jg4NwcV9uA0" + nickname="Anna" + subject="me!" + date="2013-04-06T18:22:30Z" + content=""" +I want in on the family repository! :-) +"""]] diff --git a/doc/design/assistant/blog/day_231__insert_title.mdwn b/doc/design/assistant/blog/day_231__insert_title.mdwn new file mode 100644 index 000000000..6f91b2d36 --- /dev/null +++ b/doc/design/assistant/blog/day_231__insert_title.mdwn @@ -0,0 +1,26 @@ +Finally fixed the bug causing repeated checksumming when a direct mode file +contains duplicate files. I may need to add some cleaning of stale inode +caches eventually. + +Meanwhile, Guilhem made `git annex initremote` use higher quality entropy, +with `--fast` getting back to the old behavior of urandom quality entropy. +The assistant doesn't use high quality entropy since I have no way to +prompt when the user would need to generate more. I did have a fun idea to +deal with this: Make a javascript game, that the user can play while +waiting, which would generate enropy nicely. Maybe one day.. ;) + +Also made a small but significant change to [[archive directory handling|todo/assistant_smarter_archive_directory_handling]]. +Now the assistant syncs files that are in `archive` directories like any +other file, until they reach an archive repository. Then they get dropped +from all the clients. This way, users who don't set up archive repositories +don't need to know about this special case, and users who do want to use +them can, with no extra configuration. + +After recent changes, the preferred content expression for transfer +repositories is becoming a bit unweidly, at 212 characters. Probably +time to add support for macros.. + +`(not (inallgroup=client and copies=client:2) and (((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1))) or (not copies=semitrusted+:1)` + +Still, it's pretty great how much this little language lets me express, so +easily. diff --git a/doc/design/assistant/blog/day_232__headless_webapp.mdwn b/doc/design/assistant/blog/day_232__headless_webapp.mdwn new file mode 100644 index 000000000..a60ab383d --- /dev/null +++ b/doc/design/assistant/blog/day_232__headless_webapp.mdwn @@ -0,0 +1,22 @@ +Developed a way to run the webapp on a remote or headless computer. + +The webapp can now be started on a remote or headless computer, just +specify `--listen=address` to make it listen on an address other than +localhost. It'll print out the URL to open to access it. + +This doesn't use HTTPS yet, because it'd need to generate a +certificate, and even if it generated a self-signed SSL certificate, +there'd be no easy way for the browser to verify it and avoid a MITM. + +So `--listen` is a less secure but easier option; using ssh to forward +the webapp's port to the remote computer is more secure. + +(I do have an idea for a way to do this entirely securely, making +the webapp set up the ssh port forwarding, which I have written down +in [[webapp]].. but it would be rather complicated to implement.) + +---- + +Made the webapp rescan for transfers after it's been used to change a +repository's group. Would have been easy, but I had to chase down a +cache invalidation bug. diff --git a/doc/design/assistant/blog/day_232__headless_webapp/comment_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment b/doc/design/assistant/blog/day_232__headless_webapp/comment_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment new file mode 100644 index 000000000..1b36a9ad8 --- /dev/null +++ b/doc/design/assistant/blog/day_232__headless_webapp/comment_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="Certificate storage" + date="2013-04-09T00:43:12Z" + content=""" +Why not store the certificate within the repository? Either a common one in, e.g. + + .git-annex.key-cert.pem + +or host-specific as per + + .git-annex.key-cert.pem.$HOST + +-- Richard +"""]] diff --git a/doc/design/assistant/blog/day_232__headless_webapp/comment_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment b/doc/design/assistant/blog/day_232__headless_webapp/comment_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment new file mode 100644 index 000000000..67e797243 --- /dev/null +++ b/doc/design/assistant/blog/day_232__headless_webapp/comment_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 2" + date="2013-04-09T07:27:53Z" + content=""" +Can you also set the port via listen= ? +"""]] diff --git a/doc/design/assistant/blog/day_232__headless_webapp/comment_3_ccb9fa22422fb913b6a496ebe65c49fb._comment b/doc/design/assistant/blog/day_232__headless_webapp/comment_3_ccb9fa22422fb913b6a496ebe65c49fb._comment new file mode 100644 index 000000000..e2c00c59e --- /dev/null +++ b/doc/design/assistant/blog/day_232__headless_webapp/comment_3_ccb9fa22422fb913b6a496ebe65c49fb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-09T18:58:40Z" + content=""" +@Richard besides the issues with where to store the private key part, that doesn't help with probably the most common use case for a headless webapp: Setting up a new repository on the remote system, which then might get joined into an existing repository network. +"""]] diff --git a/doc/design/assistant/blog/day_232__headless_webapp/comment_4_ceba4468760a2525960327698431cee2._comment b/doc/design/assistant/blog/day_232__headless_webapp/comment_4_ceba4468760a2525960327698431cee2._comment new file mode 100644 index 000000000..e953233eb --- /dev/null +++ b/doc/design/assistant/blog/day_232__headless_webapp/comment_4_ceba4468760a2525960327698431cee2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-09T19:18:24Z" + content=""" +@Michael you can now! --listen=address:port +"""]] diff --git a/doc/design/assistant/blog/day_233__taxes.mdwn b/doc/design/assistant/blog/day_233__taxes.mdwn new file mode 100644 index 000000000..55273dd4b --- /dev/null +++ b/doc/design/assistant/blog/day_233__taxes.mdwn @@ -0,0 +1,11 @@ +Did my taxes today. Not very pretty. Planning to run them by a professional. + +Reproduced a bug that prevents git-annex from authenticating to the ejabberd +server, and passed the buck upstream with a test case to the author of the +haskell XMPP library. + +Added some animations to the webapp to show when it's busy doing things. + +Made `git annex webapp --listen=address:port` work. + +Added a `annex.web-download-command` setting. diff --git a/doc/design/assistant/blog/day_233__taxes/comment_1_9473ffdc42595af9c293fbcd5a1cdb54._comment b/doc/design/assistant/blog/day_233__taxes/comment_1_9473ffdc42595af9c293fbcd5a1cdb54._comment new file mode 100644 index 000000000..a35e738c1 --- /dev/null +++ b/doc/design/assistant/blog/day_233__taxes/comment_1_9473ffdc42595af9c293fbcd5a1cdb54._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2013-04-10T13:35:30Z" + content=""" +I don't really want to nagging you, but I'm impatiently waiting +for a new build (for linux) to be able to try out your duplicated file fix. + +Please don't delay your next release too much:) + +Laszlo + +"""]] diff --git a/doc/design/assistant/blog/day_233__taxes/comment_2_5feed8d7053ba03812ccda8c61fd9775._comment b/doc/design/assistant/blog/day_233__taxes/comment_2_5feed8d7053ba03812ccda8c61fd9775._comment new file mode 100644 index 000000000..32e4f077f --- /dev/null +++ b/doc/design/assistant/blog/day_233__taxes/comment_2_5feed8d7053ba03812ccda8c61fd9775._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-11T14:57:24Z" + content=""" +You can already try that fix out using the [[install/Linux_standalone]] autobuild. +"""]] diff --git a/doc/design/assistant/blog/day_234__clean_shutdown.mdwn b/doc/design/assistant/blog/day_234__clean_shutdown.mdwn new file mode 100644 index 000000000..61b765b59 --- /dev/null +++ b/doc/design/assistant/blog/day_234__clean_shutdown.mdwn @@ -0,0 +1,29 @@ +Short day because I spent 3 hours this morning explaining free software +and kickstarter to an accountant. And was away until 3 pm, so how did I get +all this done‽ + +Eliot pointed out that shutting down the assistant could leave transfers +running. This happened because `git annex transferkeys` is a separate +process, and so it was left to finish up any transfer that was in +process. I've made shutdown stop all transfers that the +assistant started. (Other paired computers could still be connecting to +make transfers even when the assistant is not running, and those are not +affected.) + +Added sequence numbers to the XMPP messages used for git pushes. While +these numbers are not used yet, they're available for debugging, and will +help me determine if packets are lost or come out of order. So if you have +experienced problems with XMPP syncing sometimes failing, run tonight's +build of the assistant with `--debug` (or turn on debugging in the webapp +configuration screen), and send me a log by email to + + +Changed the way that autobuilds and manual builds report their version +number. It now includes the date of the last commit, and the abbreviated +commit ID, rather than being some random date after the last release. + +Frederik found a bug using the assistant on a FAT filesystem. It didn't +properly handle the files that git uses to stand-in for symlinks in that +situation, and annexed those files. I've fixed this, and even moving +around symlink stand-in files on a FAT filesystem now results in correct +changes to symlinks being committed. diff --git a/doc/design/assistant/blog/day_235__birthday.mdwn b/doc/design/assistant/blog/day_235__birthday.mdwn new file mode 100644 index 000000000..2bd2b0d22 --- /dev/null +++ b/doc/design/assistant/blog/day_235__birthday.mdwn @@ -0,0 +1,31 @@ +Felt like spending my birthday working on git-annex. Thanks again to +everyone who makes it possible for me to work on something I care about +every day. + +---- + +Did some work on `git annex addurl` today. It had gotten broken in direct +mode (I think by an otherwise good and important bugfix). After fixing +that, I made it interoperate with the webapp. So if you have the webapp +open, it will display progress bars for downloads being run by `git annex +addurl`. + +This enhancement meshes nicely with a FlashGot script Andy +contributed, which lets you queue up downloads into your annex from a web +browser. Andy described how to set it up in +[[this_tip|tips/Using_Git-annex_as_a_web_browsing_assistant]]. + +(I also looked briefly into ways to intercept a drag and drop of a link +into the webapp and make it lauch a download for you. It doesn't seem that +browsers allow javascript to override their standard behavior of loading +links that are dropped into them. Probably good to prevent misuse, but it +would be nice here...) + +---- + +Also, I think I have fixed the progress bars displayed when downloading +a file from an encrypted remote. I did this by hooking up existing +download progress metering (that was only being used to display +a download percentage in the console) into the location log, so the +webapp can use it. So that was a *lot* easier than it could have been, +but still a pretty large patch (500+ lines). Haven't tested this; should work. diff --git a/doc/design/assistant/blog/day_235__birthday/comment_1_db558b071067c1e63cde05cca0551094._comment b/doc/design/assistant/blog/day_235__birthday/comment_1_db558b071067c1e63cde05cca0551094._comment new file mode 100644 index 000000000..32c2c5d50 --- /dev/null +++ b/doc/design/assistant/blog/day_235__birthday/comment_1_db558b071067c1e63cde05cca0551094._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawksoT5jmbiZ9UghROilchqy3kNJ1XGqCAo" + nickname="Rob" + subject="Drag and Drop" + date="2013-04-12T03:37:53Z" + content=""" +Is this along the lines of what you are looking for? http://www.dropzonejs.com/ +"""]] diff --git a/doc/design/assistant/blog/day_235__birthday/comment_2_d1a2c1124781118267599457ae9e0512._comment b/doc/design/assistant/blog/day_235__birthday/comment_2_d1a2c1124781118267599457ae9e0512._comment new file mode 100644 index 000000000..e41c083ce --- /dev/null +++ b/doc/design/assistant/blog/day_235__birthday/comment_2_d1a2c1124781118267599457ae9e0512._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="Happy Birthday" + date="2013-04-12T17:52:43Z" + content=""" +Great work! +"""]] diff --git a/doc/design/assistant/blog/day_235__birthday/comment_3_b853508d1d15234958b9f4a39277e45c._comment b/doc/design/assistant/blog/day_235__birthday/comment_3_b853508d1d15234958b9f4a39277e45c._comment new file mode 100644 index 000000000..350ac2bc2 --- /dev/null +++ b/doc/design/assistant/blog/day_235__birthday/comment_3_b853508d1d15234958b9f4a39277e45c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="robconnolly" + ip="118.90.78.117" + subject="comment 3" + date="2013-04-13T03:12:14Z" + content=""" +Thanks for fixing the addurl bug and Happy Birthday! +"""]] diff --git a/doc/design/assistant/blog/day_235__birthday/comment_5_73aad3398a43bc4d28bca9bf635fa757._comment b/doc/design/assistant/blog/day_235__birthday/comment_5_73aad3398a43bc4d28bca9bf635fa757._comment new file mode 100644 index 000000000..969253971 --- /dev/null +++ b/doc/design/assistant/blog/day_235__birthday/comment_5_73aad3398a43bc4d28bca9bf635fa757._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="Just in case it might be helpful..." + date="2013-04-14T05:56:47Z" + content=""" +For whatever reason, dragging links onto the page text in the \"Using drag and drop for selecting\" section of does not trigger the usual page change. I don't really know why--I couldn't get it to work on my own with Firebug. And thanks for git-annex--love it! +"""]] diff --git a/doc/design/assistant/blog/day_236__evil_splicer.mdwn b/doc/design/assistant/blog/day_236__evil_splicer.mdwn new file mode 100644 index 000000000..72c8f51a9 --- /dev/null +++ b/doc/design/assistant/blog/day_236__evil_splicer.mdwn @@ -0,0 +1,29 @@ +Spent today bulding the Evil Splicer, a program that parses `ghc -ddump-splices` +output, and uses it to expand Template Haskell splices in source code. +I hope to use this crazy hack to get the webapp working on Android. + +This was a good opportunity to use the +[Parsec](http://hackage.haskell.org/package/parsec) library for parsing the +ghc output. I've never really used it before, but found it quite nice to +work with. The learning curve, if you already know monads and applicatives, +is about 5 minutes. And instead of ugly regular expressions, you can work +with nice code that's easily composable and refactorable. Even the ugly +bits come out well: + +[[!format haskell """ + {- All lines of the splice result will start with the same + - indent, which is stripped. Any other indentation is preserved. -} + i <- lookAhead indent + result <- unlines <$> many1 (string i >> restOfLine) +"""]] + +Anyway, it works.. sorta. The parser works great! The splices that ghc +outputs are put into the right places in the source files, and formatted in +a way that ghc is able to build. Often though, they contain code that +doesn't actually build as-is. I'm working to fix up the code to get closer +to buildable. + +---- + +Meanwhile, guilhem has made ssh connection caching work for rsync special +remotes! It's very nice to have another developer working on git-annex. :) diff --git a/doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn b/doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn new file mode 100644 index 000000000..01b8195b6 --- /dev/null +++ b/doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn @@ -0,0 +1,29 @@ +Fixed a bug where the locked down ssh key that the assistant sets up to +access the annex on a remote server was being used by ssh *by default* for +all logins to that server. + +That should not have happened. The locked down key is written to a filename +that ssh won't use at all, by default. But, I found code in gnome-keyring +that watches for `~/.ssh/*.pub` to appear, and automatically adds all such +keys to the keyring. In at least some cases, probably when it has no other +key, it then tells ssh to go ahead and use that key. Astounding. + +To avoid this, the assistant will store its keys in `~/.ssh/annex/` +`~/.ssh/git-annex/` instead. gnome-keyring does not look there (verified in +the source). If you use gnome-keyring and have set up a repository on a +remote server with the assistant, I'd recommend moving the keys it set up +and editing `~/.ssh/config` to point to their new location. + +gnome-keyring is not the only piece of software that has a bad +interaction with git-annex. I've been working on a bug that makes git-annex +fail to authenticate to ejabberd. ejabberd 2.1.10 got support for +SCRAM-SHA-1, but its code violates the RFC, and chokes on an address +attribute that the haskell XMPP library provides. I hope to get this fixed +in ejabberd. + + +Also did some more work on the Evil Splicer today, integrating it into the +build of the Android app, and making it support incremental building. +Improved its code generation, and am at the milestone where it creates +valid haskell code for the entire `Assistant/WebApp/Types.hs` file, +where Template Haskell expands 2 lines into 2300 lines of code! diff --git a/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_1_0cb088b732881d1fa92493aa1fd93d43._comment b/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_1_0cb088b732881d1fa92493aa1fd93d43._comment new file mode 100644 index 000000000..e8cc45782 --- /dev/null +++ b/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_1_0cb088b732881d1fa92493aa1fd93d43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="Confusing name for storage directory" + date="2013-04-14T23:55:03Z" + content=""" +`~/.ssh/annex/` would make sense for ssh-annex. I would suggest using `~/.ssh/git-annex/` or similar, instead. +"""]] diff --git a/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_2_b855fd710954beebaafe6d2bd03eb368._comment b/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_2_b855fd710954beebaafe6d2bd03eb368._comment new file mode 100644 index 000000000..cf3e8fbbf --- /dev/null +++ b/doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_2_b855fd710954beebaafe6d2bd03eb368._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-14T23:59:44Z" + content=""" +I agree, change made +"""]] diff --git a/doc/design/assistant/blog/day_238__back_to_Android.mdwn b/doc/design/assistant/blog/day_238__back_to_Android.mdwn new file mode 100644 index 000000000..b07d784fa --- /dev/null +++ b/doc/design/assistant/blog/day_238__back_to_Android.mdwn @@ -0,0 +1,11 @@ +Back to really working toward an Android webapp now. I have been improving +the EvilSplicer, and the build machinery, and build environment all day. +Slow but steady progress. + +First milestone of the day was when I got `yesod-form` to build with all +Template Haskell automatically expanded by the EvilSplicer. (With a few +manual fixups where it's buggy.) + +At this point the Android build with the webapp enabled successfully +builds several files containing Yesod code.. And I suspect I am very close +to getting a first webapp build for Android. diff --git a/doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn b/doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn new file mode 100644 index 000000000..2ca62cfe6 --- /dev/null +++ b/doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn @@ -0,0 +1,28 @@ +Several bug fixes today, and got mostly caught up on recent messages. +Still have a backlog of two known bugs that I cannot reproduce well enough +to have worked on, but I am thinking I will make a release tomorrow. There +have been a lot of changes in the 10 days since the last release. + +---- + +I am, frustratingly, stuck building the webapp on Android with no forward +progress today (and last night) after such a productive day yesterday. + +The expanded Template Haskell code of the webapp fails to compile, +whereever type safe urls are used. + +
+Assistant/WebApp/Types.hs:95:63:
+    Couldn't match expected type `Route WebApp -> t2'
+                with actual type `Text'
+    The function `urender_a1qcK' is applied to three arguments,
+    but its type `Route WebApp -> [(Text, Text)] -> Text' has only two
+    In the expression: urender_a1qcK u_a1qcL [] LogR
+    In the first argument of `toHtml', namely
+      `(\ u_a1qcL -> urender_a1qcK u_a1qcL [] LogR)'
+
+ +My best guess is this is a mismatch between the versions of yesod (or other +libraries) used for the native and cross compiled ghc's. So I've been +slowly trying to get a fully matched set of versions in between working on +bugs. diff --git a/doc/design/assistant/blog/day_23__transfer_watching.mdwn b/doc/design/assistant/blog/day_23__transfer_watching.mdwn new file mode 100644 index 000000000..3e4e27d47 --- /dev/null +++ b/doc/design/assistant/blog/day_23__transfer_watching.mdwn @@ -0,0 +1,25 @@ +Starting to travel, so limited time today. + +Yet Another Thread added to the assistant, all it does is watch for changes +to transfer information files, and update the assistant's map of transfers +currently in progress. Now the assistant will know if some other repository +has connected to the local repo and is sending or receiving a file's +content. + +This seemed really simple to write, it's just 78 lines of code. It worked +100% correctly the first time. :) But it's only so easy because I've got +this shiny new inotify hammer that I keep finding places to use in the +assistant. + +Also, the new thread does some things that caused a similar thread (the +merger thread) to go into a MVar deadlock. Luckily, I spent much of +[day 19](day_19__random_improvements) investigating and fixing that +deadlock, even though it was not a problem at the time. + +So, good.. I'm doing things right and getting to a place where rather +nontrivial features can be added easily. + +-- + +Next up: Enough nonsense with tracking transfers... Time to start actually +transferring content around! diff --git a/doc/design/assistant/blog/day_240__it_builds.mdwn b/doc/design/assistant/blog/day_240__it_builds.mdwn new file mode 100644 index 000000000..dc975af81 --- /dev/null +++ b/doc/design/assistant/blog/day_240__it_builds.mdwn @@ -0,0 +1,37 @@ +Late last night, I successfully built the full webapp for Android! + +That was with several manual modifications to the generated code, which I +still need to automate. And I need to set up the autobuilder properly +still. And I need to find a way to make the webapp open Android's web browser +to URL. So it'll be a while yet until a package is available +to try. But what a milestone! + +The point I was stuck on all day yesterday was generated code that +looked like this: + +[[!format haskell """ +(toHtml + (\ u_a2ehE -> urender_a2ehD u_a2ehE [] + (CloseAlert aid))))); +"""]] + +That just couldn't type check at all. Most puzzling. My best guess is that +`u_a2ehE` is the dictionary GHC passes internally to make a typeclass work, +which somehow leaked out and became visible. Although +I can't rule out that I may have messed something up in my build environment. +The EvilSplicer has a hack in it that finds such code and converts it to +something like this: + +[[!format haskell """ +(toHtml + (flip urender_a2ehD [] + (CloseAlert aid))))); +"""]] + +I wrote some more about the process of the Android port in my personal blog: +[Template Haskell on impossible architectures](http://joeyh.name/blog/entry/Template_Haskell_on_impossible_architectures/) + +---- + +Release day today. The OSX builds are both not available yet for this +release, hopefully will come out soon. diff --git a/doc/design/assistant/blog/day_240__it_builds/comment_1_151840ae0020ea63b2f041488c905386._comment b/doc/design/assistant/blog/day_240__it_builds/comment_1_151840ae0020ea63b2f041488c905386._comment new file mode 100644 index 000000000..a8e489582 --- /dev/null +++ b/doc/design/assistant/blog/day_240__it_builds/comment_1_151840ae0020ea63b2f041488c905386._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Duplicated files resolved" + date="2013-04-18T05:52:35Z" + content=""" +Hi, + +Seems like the duplicated file issue finally resolved in this release, +also the logging is not so detailed, so it does not explode the disk space either. + +I think a new bug introduced in this release, +namely if you create a repository and a backup repository of it (pendrive), then this repository is not in direct mode by default. +(and there is a missing direct = True variable in that repository (/mnt/dat/annex_backup/.git/annex/config)). + +Also I run into resource exhausted bug, and every thread is crashed. +Can git-annex only watch a directory, and not every file in it? + +I will create a bugreport for resource exhausted. + +Best, + Laszlo + + +"""]] diff --git a/doc/design/assistant/blog/day_241__cleanup.mdwn b/doc/design/assistant/blog/day_241__cleanup.mdwn new file mode 100644 index 000000000..077922695 --- /dev/null +++ b/doc/design/assistant/blog/day_241__cleanup.mdwn @@ -0,0 +1,14 @@ +Finished the last EvilSplicer tweak and other fixes to make the +Android webapp build without any hand-holding. + +Currently setting up the Android autobuilder to include the webapp in its +builds. To make this work I had to set up a new chroot with all the right +stuff installed. + +Investigated how to make the Android webapp open a web browser when run. +As far as I can tell (without access to an Android device right now), +`am start -a android.intent.action.VIEW -d http://localhost/etc` should do +it. + +Seems that git 1.8.2 broke the assistant. I've put in a fix but have not +yet tested it. diff --git a/doc/design/assistant/blog/day_241__cleanup/comment_1_0e283cdf66a25b3cc9423fe651084cb9._comment b/doc/design/assistant/blog/day_241__cleanup/comment_1_0e283cdf66a25b3cc9423fe651084cb9._comment new file mode 100644 index 000000000..d9e468f32 --- /dev/null +++ b/doc/design/assistant/blog/day_241__cleanup/comment_1_0e283cdf66a25b3cc9423fe651084cb9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJ2utMQgMEYAOs3Dfc6eZRyUzt4acNXUU" + nickname="David" + subject="am start -a android.intent.action.VIEW -d http://localhost/etc" + date="2013-04-18T22:39:50Z" + content=""" +Just tested the command on an Android device, it works well. +"""]] diff --git a/doc/design/assistant/blog/day_242__more_porting.mdwn b/doc/design/assistant/blog/day_242__more_porting.mdwn new file mode 100644 index 000000000..89fbfea0f --- /dev/null +++ b/doc/design/assistant/blog/day_242__more_porting.mdwn @@ -0,0 +1,4 @@ +Got WebDAV enabled in the Android build. Had to deal with some system calls +not available in Android's libc. + +New poll: [[polls/Android_default_directory]] diff --git a/doc/design/assistant/blog/day_243__in_the_field.mdwn b/doc/design/assistant/blog/day_243__in_the_field.mdwn new file mode 100644 index 000000000..b05ccac9e --- /dev/null +++ b/doc/design/assistant/blog/day_243__in_the_field.mdwn @@ -0,0 +1,21 @@ +Today was not a work day for me, but I did get a chance to install +git-annex in real life while visiting. Was happy to download the standalone +Linux tarball and see that it could be unpacked, and git-annex webapp +started just by clicking around in the GUI. And in very short order got it +set up. + +I was especially pleased to see my laptop noticed this new repository +had appeared on the network via XMPP push, and started immediately +uploading files to my rsync.net transfer repository so the new +repository could get them. + +Did notice that the standalone tarball neglected to install a +FDO menu file. Fixed that, and some other minor issues I noticed. + + +I also got a brief chance to try the Android webapp. It fails to start; +apparently `getaddrinfo` doesn't like the flags passed to it and is +failing. As failure modes go, this isn't at all bad. I can certainly work +around it with some hardcoded port numbers, but I want to fix it the right +way. Have ordered a replacement battery for my dead phone so I can use it +for Android testing. diff --git a/doc/design/assistant/blog/day_244__android_porting.mdwn b/doc/design/assistant/blog/day_244__android_porting.mdwn new file mode 100644 index 000000000..e535c1054 --- /dev/null +++ b/doc/design/assistant/blog/day_244__android_porting.mdwn @@ -0,0 +1,6 @@ +Ported all the C libraries needed for XMPP to Android. (gnutls, +libgcrypt, libgpg-error, nettle, xml2, gsasl, etc). Finally +got it all to link. What a pain. + +Bonus: Local pairing support builds for Android now, seems recent changes to +the network library for WebDAV also fixed it. diff --git a/doc/design/assistant/blog/day_245__misc.mdwn b/doc/design/assistant/blog/day_245__misc.mdwn new file mode 100644 index 000000000..8559ac4f1 --- /dev/null +++ b/doc/design/assistant/blog/day_245__misc.mdwn @@ -0,0 +1,15 @@ +Got the OSX autobuilder back running, and finally got a OSX build up for +the 4.20130417 release. Also fixed the OSX app build machinery to handle +rpath. + +Made the assistant (and `git annex sync`) sync with git remotes that have +`annex-ignore` set. So, `annex-ignore` is only used to prevent using +the annex of a remote, not syncing with it. The benefit of this change +is that it'll make the assistant sync the local git repository with +a git remote that is on a server that does not have git-annex installed. +It can even sync to github. + +Worked around more breakage on misconfigured systems that don't have GECOS +information. + +... And other bug fixes and bug triage. diff --git a/doc/design/assistant/blog/day_245__misc/comment_1_3a2976617bb0cdc206fb1397a2ef1177._comment b/doc/design/assistant/blog/day_245__misc/comment_1_3a2976617bb0cdc206fb1397a2ef1177._comment new file mode 100644 index 000000000..4ee7612f1 --- /dev/null +++ b/doc/design/assistant/blog/day_245__misc/comment_1_3a2976617bb0cdc206fb1397a2ef1177._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="192.76.7.217" + subject="comment 1" + date="2013-04-23T17:11:46Z" + content=""" +If I set my annex-ignore'd respository to `annex-sync = false` will this override the new behaviour? My remote requires mounting a fuse mount, so this change will just result in my seeing lots of sync failure messages in the webapp. +"""]] diff --git a/doc/design/assistant/blog/day_245__misc/comment_2_e0f9704e91fedca8ff26356f354cc1c3._comment b/doc/design/assistant/blog/day_245__misc/comment_2_e0f9704e91fedca8ff26356f354cc1c3._comment new file mode 100644 index 000000000..545da72cd --- /dev/null +++ b/doc/design/assistant/blog/day_245__misc/comment_2_e0f9704e91fedca8ff26356f354cc1c3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-23T20:16:26Z" + content=""" +Yes, setting that, or just clicking to pause syncing to a remote in the webapp will still work. + +Although I don't think you need to.. If the remote is on a filesystem mount point, the assistant will just ignore it when it's not mounted. And will automatically detect when it gets mounted and sync with it, too. Same as USB drives are handled. +"""]] diff --git a/doc/design/assistant/blog/day_245__misc/comment_3_93003a0d0983efbdc046d7459be194b0._comment b/doc/design/assistant/blog/day_245__misc/comment_3_93003a0d0983efbdc046d7459be194b0._comment new file mode 100644 index 000000000..45a3b6adc --- /dev/null +++ b/doc/design/assistant/blog/day_245__misc/comment_3_93003a0d0983efbdc046d7459be194b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 3" + date="2013-04-24T17:09:50Z" + content=""" +It's a userspace fuse mount so the assistant won't know it's a mountpoint unless mounted. Also I don't want the automatic sync since I like to keep this respository manual as a kind of backup. Thanks for the info. +"""]] diff --git a/doc/design/assistant/blog/day_246__bug_treadmill.mdwn b/doc/design/assistant/blog/day_246__bug_treadmill.mdwn new file mode 100644 index 000000000..36ee0c617 --- /dev/null +++ b/doc/design/assistant/blog/day_246__bug_treadmill.mdwn @@ -0,0 +1,18 @@ +There seem to be a steady state of enough bug reports coming in that I can +work on them whenever I'm not working on anything else. As I did all day +today. + +This doesn't bother me if the bug reports are of real bugs that I can +reproduce and fix, but I'm spending a lot of time currently following up to +messages and asking simple questions like "what version number" and "can I +please see the whole log file". And just trying to guess what a vague +problem report means and read people's minds to get to a definite bug +with a test case that I can then fix. + +I've noticed the overall quality of bug reports nosedive over the past +several months. My guess is this means that git-annex has found a less +technical audience. I need to find something to do about this. + +With that whining out of the way ... +I fixed a pretty ugly bug on FAT/Android today, and +I am 100% caught up on messages right now! diff --git a/doc/design/assistant/blog/day_246__bug_treadmill/comment_1_f76f653364fe2b97e85e8356c93b0fce._comment b/doc/design/assistant/blog/day_246__bug_treadmill/comment_1_f76f653364fe2b97e85e8356c93b0fce._comment new file mode 100644 index 000000000..33746ed4a --- /dev/null +++ b/doc/design/assistant/blog/day_246__bug_treadmill/comment_1_f76f653364fe2b97e85e8356c93b0fce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Bugs..." + date="2013-04-23T23:30:47Z" + content=""" +Perhaps if you made a bug report form that asked for the version number (with helpful command to get it printed below), and had a checkbox for \"full log attached\", etc. you might be able to weed out low-value bugs... Not that adding UI to force good bugs really works, but there might be a couple of low-hanging fruit before the diminishing returns kick in. +"""]] diff --git a/doc/design/assistant/blog/day_247__performance_tuning.mdwn b/doc/design/assistant/blog/day_247__performance_tuning.mdwn new file mode 100644 index 000000000..964710b8e --- /dev/null +++ b/doc/design/assistant/blog/day_247__performance_tuning.mdwn @@ -0,0 +1,16 @@ +Working on assistant's performance when it has to add a whole lot of files +(10k to 100k). + +Improved behavior in several ways, including fixing display +of the alert in the webapp when the default inotify limit of 8192 +directories is exceeded. + +Created a new TList data type, a transactional DList. Much nicer +implementation than the TChan based thing it was using to keep track of the +changes, although it only improved runtime and memory usage a little bit. +The way that this is internally storing a function in STM and modifying +that function to add items to the list is way cool. + +Other tuning seems to have decreased the time it would take to import 100k +files from somewhere in the range of a full day (too long to wait to see), +to around 3.5 hours. I don't know if that's good, but it's certainly better. diff --git a/doc/design/assistant/blog/day_248__Internet_Archive.mdwn b/doc/design/assistant/blog/day_248__Internet_Archive.mdwn new file mode 100644 index 000000000..f002939f1 --- /dev/null +++ b/doc/design/assistant/blog/day_248__Internet_Archive.mdwn @@ -0,0 +1,28 @@ +Very productive & long day today, spent adding a new feature to the +webapp: Internet Archive support! + +[[!img /assistant/iaitem.png]] + +git-annex already supported using archive.org via its S3 special remotes, +so this is just a nice UI around that. + +How does it decide which files to publish on archive.org? Well, +the item has a unique name, which is based on the description +field. Any files located in a directory with that name will be uploaded +to that item. (This is done via a new preferred content expression I added.) + +So, you can have one repository with multiple IA items attached, and +sort files between them however you like. +I plan to make a screencast eventually demoing that. + +Another interesting use case, once the Android webapp is done, would be add +a repository on the DCIM directory, set the archive.org repository to +prefer all content, and *bam*, you have a phone or tablet that +auto-publishes and archives every picture it takes. + +Another nice little feature added today is that whenever a file is uploaded +to the Internet Archive, its public url is automatically recorded, same +as if you'd ran `git annex addurl`. So any users who can clone your +repository can download the files from archive.org, without needing any +login or password info. This makes the Internet Archive a nice way to +publish the large files associated with a public git repository. diff --git a/doc/design/assistant/blog/day_249__quiet_day.mdwn b/doc/design/assistant/blog/day_249__quiet_day.mdwn new file mode 100644 index 000000000..28c1e6f3d --- /dev/null +++ b/doc/design/assistant/blog/day_249__quiet_day.mdwn @@ -0,0 +1,7 @@ +Quiet day. Only did minor things, like adding webapp UI for changing the +directory used by Internet Archive remotes, and splitting out an +`enableremote` command from `initremote`. + +My Android development environment is set up and ready to go on my Motorola +Droid. The current Android build of git-annex fails to link at run time, so +my work is cut out for me. Probably broke something while enabling XMPP? diff --git a/doc/design/assistant/blog/day_24__airport_digressions.mdwn b/doc/design/assistant/blog/day_24__airport_digressions.mdwn new file mode 100644 index 000000000..695296974 --- /dev/null +++ b/doc/design/assistant/blog/day_24__airport_digressions.mdwn @@ -0,0 +1,99 @@ +In a series of airport layovers all day. Since I woke up at 3:45 am, +didn't feel up to doing serious new work, so instead I worked through some +OSX support backlog. + +git-annex will now use Haskell's SHA library if the `sha256sum` +command is not available. That library is slow, but it's guaranteed to be +available; git-annex already depended on it to calculate HMACs. + +Then I decided to see if it makes sense to use the SHA library +when adding smaller files. At some point, its slower implementation should +win over needing to fork and parse the output of `sha256sum`. This was +the first time I tried out Haskell's +[Criterion](http://hackage.haskell.org/package/criterion) benchmarker, +and I built this simple benchmark in short order. + +[[!format haskell """ +import Data.Digest.Pure.SHA +import Data.ByteString.Lazy as L +import Criterion.Main +import Common + +testfile :: FilePath +testfile = "/tmp/bar" -- on ram disk + +main = defaultMain + [ bgroup "sha256" + [ bench "internal" $ whnfIO internal + , bench "external" $ whnfIO external + ] + ] + +internal :: IO String +internal = showDigest . sha256 <$> L.readFile testfile + +external :: IO String +external = pOpen ReadFromPipe "sha256sum" [testfile] $ \h -> + fst . separate (== ' ') <$> hGetLine h +"""]] + +The nice thing about benchmarking in Airports is when you're running a +benchmark locally, you don't want to do anything else with the computer, +so can alternate people watching, spacing out, and analizing results. + +100 kb file: + + benchmarking sha256/internal + mean: 15.64729 ms, lb 15.29590 ms, ub 16.10119 ms, ci 0.950 + std dev: 2.032476 ms, lb 1.638016 ms, ub 2.527089 ms, ci 0.950 + + benchmarking sha256/external + mean: 8.217700 ms, lb 7.931324 ms, ub 8.568805 ms, ci 0.950 + std dev: 1.614786 ms, lb 1.357791 ms, ub 2.009682 ms, ci 0.950 + +75 kb file: + + benchmarking sha256/internal + mean: 12.16099 ms, lb 11.89566 ms, ub 12.50317 ms, ci 0.950 + std dev: 1.531108 ms, lb 1.232353 ms, ub 1.929141 ms, ci 0.950 + + benchmarking sha256/external + mean: 8.818731 ms, lb 8.425744 ms, ub 9.269550 ms, ci 0.950 + std dev: 2.158530 ms, lb 1.916067 ms, ub 2.487242 ms, ci 0.950 + +50 kb file: + + benchmarking sha256/internal + mean: 7.699274 ms, lb 7.560254 ms, ub 7.876605 ms, ci 0.950 + std dev: 801.5292 us, lb 655.3344 us, ub 990.4117 us, ci 0.950 + + benchmarking sha256/external + mean: 8.715779 ms, lb 8.330540 ms, ub 9.102232 ms, ci 0.950 + std dev: 1.988089 ms, lb 1.821582 ms, ub 2.181676 ms, ci 0.950 + +10 kb file: + + benchmarking sha256/internal + mean: 1.586105 ms, lb 1.574512 ms, ub 1.604922 ms, ci 0.950 + std dev: 74.07235 us, lb 51.71688 us, ub 108.1348 us, ci 0.950 + + benchmarking sha256/external + mean: 6.873742 ms, lb 6.582765 ms, ub 7.252911 ms, ci 0.950 + std dev: 1.689662 ms, lb 1.346310 ms, ub 2.640399 ms, ci 0.950 + +It's possible to get nice graphical reports out of Criterion, but +this is clear enough, so I stopped here. 50 kb seems a reasonable +cutoff point. + +I also used this to benchmark the SHA256 in Haskell's Crypto package. +Surprisingly, it's a *lot* slower than even the Pure.SHA code. +On a 50 kb file: + + benchmarking sha256/Crypto + collecting 100 samples, 1 iterations each, in estimated 6.073809 s + mean: 69.89037 ms, lb 69.15831 ms, ub 70.71845 ms, ci 0.950 + std dev: 3.995397 ms, lb 3.435775 ms, ub 4.721952 ms, ci 0.950 + + +There's another Haskell library, [SHA2](http://hackage.haskell.org/package/SHA2), +which I should try some time. diff --git a/doc/design/assistant/blog/day_250__stymied.mdwn b/doc/design/assistant/blog/day_250__stymied.mdwn new file mode 100644 index 000000000..f9d50b48c --- /dev/null +++ b/doc/design/assistant/blog/day_250__stymied.mdwn @@ -0,0 +1,23 @@ +Turns out my old Droid has such an old version of Android (2.2) that +it doesn't work with any binaries produced by my haskell cross-compiler. I +think it's using a symbol not in its version of libc. Since upgrading this +particular phone is a ugly process and the hardware is dying anyway (bad +USB power connecter), I have given up on using it, and ordered an Android +tablet instead to use for testing. Until that arrives, no Android. Bah. +Wanted to get the Android app working in April. + +Instead, today I worked on making the webapp require less redundant +password entry when adding multiple repositories using the same cloud +provider. This is especially needed for the Internet Archive, since users +will often want to have quite a few repositories, for different IA items. +Implemented it for box.com, and Amazon too. + +Francois Marier has built an Ubuntu PPA for git-annex, containing the +current version, with the assistant and webapp. It's targeted at Precise, +but I think will probably also work with newer releases. + + +Probably while I'm waiting to work on Android again, I will try to +improve the situation with using a single XMPP account for multiple +repositories. Spent a while today thinking through ways to improve the +design, and have some ideas. diff --git a/doc/design/assistant/blog/day_250__stymied/comment_1_330a10d447ccc3db03fcbfe571dbb404._comment b/doc/design/assistant/blog/day_250__stymied/comment_1_330a10d447ccc3db03fcbfe571dbb404._comment new file mode 100644 index 000000000..26c7d7c7f --- /dev/null +++ b/doc/design/assistant/blog/day_250__stymied/comment_1_330a10d447ccc3db03fcbfe571dbb404._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnLgNOfkl8c6oQu9b42U0Pm_uC4n3Gkgiw" + nickname="Mark" + subject="Thanks!" + date="2013-04-29T01:24:55Z" + content=""" +I was not looking forward to figuring out how to come up with all of those haskell build deps on Precise, so thanks to François Marier for putting this together. (Does Ubuntu/launchpad autobuild all of the architectures, or do they need to be contributed? I see that `armhf` isn't there at the moment...) +"""]] diff --git a/doc/design/assistant/blog/day_251__xmpp_improvements.mdwn b/doc/design/assistant/blog/day_251__xmpp_improvements.mdwn new file mode 100644 index 000000000..7007d7c0d --- /dev/null +++ b/doc/design/assistant/blog/day_251__xmpp_improvements.mdwn @@ -0,0 +1,34 @@ +Took 2 days in a row off, because I noticed I have forgotten to do that +since February, or possibly earlier, not counting trips. Whoops! + +Also, I was feeling overwhelmed with the complexity of fixing XMPP to not +be buggy when there are multiple separate repos using the same XMPP +account. Let my subconscious work on that, and last night it served up the +solution, in detail. Built it today. + +It's only a partial solution, really. If you want to use the same XMPP +account for multiple separate repositories, you cannot use the "Share with +your other devices" option to pair your devices. That's because XMPP +pairing assumes all your devices are using the same XMPP account, in order +to avoid needing to confirm on every device each time you add a new device. +The UI is clear about that, and it avoids complexity, so I'm ok with that. + +But, if you want to instead use "Share with a friend", you now can use the +same XMPP account for as many separate repositories as you like. The +assistant now ignores pushes from repositories it doesn't know about. +Before, it would merge them all together without warning. + +---- + +While I was testing that, I think I found out the real reason why XMPP +pushes have seemed a little unreliable. It turns out to not be an XMPP +issue at all! Instead, the merger was simply not always +noticing when `git receive-pack` updated a ref, and not merging it into +master. That was easily fixed. + +---- + +Adam Spiers has been getting a `.gitignore` query interface suitable for +the assistant to use into `git`, and he tells me it's landed in `next`. +I should soon check that out and get the assistant using it. But first, +Android app! diff --git a/doc/design/assistant/blog/day_252__release_day.mdwn b/doc/design/assistant/blog/day_252__release_day.mdwn new file mode 100644 index 000000000..70c99760a --- /dev/null +++ b/doc/design/assistant/blog/day_252__release_day.mdwn @@ -0,0 +1,6 @@ +Pushed out a release today. Looking back over April, I'm happy with it as a +bug fix and stabilization month. Wish I'd finished the Android app in April, +but let's see what happens tomorrow. + +Recorded part of a screencast on using Archive.org, but `recordmydesktop` +lost the second part. Grr. Will work on that later. diff --git a/doc/design/assistant/blog/day_253__OMG.mdwn b/doc/design/assistant/blog/day_253__OMG.mdwn new file mode 100644 index 000000000..b1cc89fff --- /dev/null +++ b/doc/design/assistant/blog/day_253__OMG.mdwn @@ -0,0 +1,22 @@ +[[!img /android/webapp.png alt="git-annex webapp on Android"]] + +I fixed what I thought was keeping the webapp from working on Android, but +then it started segfaulting every time it was started. Eventually I +determined this segfault happened whenever haskell code called +`getaddrinfo`. I don't know why. This is particularly weird since I had +a demo web server that used `getaddrinfo` working way back in +[[day_201__real_Android_wrapup]]. Anyway, I worked around it by not using +`getaddrinfo` on Android. + +Then I spent 3 hours stuck, because the webapp seemed to run, but +nothing could connect to the port it was on. Was it a firewall? Was +the Haskell threaded runtime's use of `accept()` broken? I went all the way +down to the raw system calls, and back, only to finally notice I had `netstat` +available on my Android. Which showed it was not listening to the port I +thought it was! + +Seems that `ntohs` and `htons` are broken somehow. To get the +screenshot, I fixed up the port manually. Have a build running that +should work around the issue. + +Anyway, the webapp works on Android! diff --git a/doc/design/assistant/blog/day_253__OMG/comment_1_bbdc61092771163e65a90a4755a807d8._comment b/doc/design/assistant/blog/day_253__OMG/comment_1_bbdc61092771163e65a90a4755a807d8._comment new file mode 100644 index 000000000..0fa06b32f --- /dev/null +++ b/doc/design/assistant/blog/day_253__OMG/comment_1_bbdc61092771163e65a90a4755a807d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI" + nickname="Amitai" + subject="Woohoo!" + date="2013-05-03T03:13:25Z" + content=""" +(See above) +"""]] diff --git a/doc/design/assistant/blog/day_254__Android_app_polishing.mdwn b/doc/design/assistant/blog/day_254__Android_app_polishing.mdwn new file mode 100644 index 000000000..cbb6f7f15 --- /dev/null +++ b/doc/design/assistant/blog/day_254__Android_app_polishing.mdwn @@ -0,0 +1,35 @@ +There's a new page [[/Android]] that documents using git-annex on Android +in detail. + +The Android app now opens the webapp when a terminal window is opened. +This is good enough for trying it out easily, but far from ideal. + +Fixed an EvilSplicer bug that corrupted newlines in +the static files served by the webapp. Now the icons in the webapp +display properly, and the javascript works. + +Made the startup screen default to `/sdcard/annex` for the repository +location, and also have a button to set up a camera repository. The camera +repository is put in the "source" preferred content group, so it will only +hang onto photos and videos until they're uploaded off the Android device. + +Quite a lot of other small fixes on Android. At this point I've tested the +following works: + +* Starting webapp. +* Making a repository, adding files. +* All the basic webapp UI. + +However, I was not able to add any remote repository using only the webapp, +due to some more problems with the network stack. + +* Jabber and Webdav don't quite work ("getProtocolByname: does not exist (no + such protocol name: tcp)"). +* SSH server fails. + ("Network/Socket/Types.hsc:(881,3)-(897,61): Non-exhaustive patterns in case") + I suspect it will work if I disable the DNS expansion code. + +So, that's the next thing that needs to be tackled. + +If you'd like to play with it in its current state, I've updated the +Android builds to incorporate all my work so far. diff --git a/doc/design/assistant/blog/day_254__Android_app_polishing/comment_1_37f4ff5227566ce4b3fa69fc32568841._comment b/doc/design/assistant/blog/day_254__Android_app_polishing/comment_1_37f4ff5227566ce4b3fa69fc32568841._comment new file mode 100644 index 000000000..7ba9f9420 --- /dev/null +++ b/doc/design/assistant/blog/day_254__Android_app_polishing/comment_1_37f4ff5227566ce4b3fa69fc32568841._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 1" + date="2013-05-04T05:30:26Z" + content=""" +> The camera repository is put in the \"source\" preferred content group, so it will only hang onto photos and videos until they're uploaded off the Android device. + +This is very nice but I'm wondering if I take a picture that I want to share using an Android app like Facebook, would the picture get deleted before I could share it? + +Would there be a way to access old pictures? For example, to show them to people you meet. + + +"""]] diff --git a/doc/design/assistant/blog/day_254__Android_app_polishing/comment_2_58bbb105bdbb72bba85c3622195f43b9._comment b/doc/design/assistant/blog/day_254__Android_app_polishing/comment_2_58bbb105bdbb72bba85c3622195f43b9._comment new file mode 100644 index 000000000..7311b72e0 --- /dev/null +++ b/doc/design/assistant/blog/day_254__Android_app_polishing/comment_2_58bbb105bdbb72bba85c3622195f43b9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-06T15:08:19Z" + content=""" +As it stands, using the \"source\" repository type will tend to remove the picture from that repository pretty quickly, assuming a fast network connection. I think if you want to do things on your phone with pictures you take, it's best to use \"client\" instead. Perhaps with an archive repository set up, so you can move stuff to an \"archive\" folder when done with it to get it removed from the phone. + +Whether \"source\" is a good default in this case remains to be seen... + +It might also be possible to change \"source\" in some way to make it more useful. For example, if it held onto new files for a day after they were created, you'd have plenty of time to use them before they expire off your phone. I have posted some thoughts about this to [[partial_content]]. +"""]] diff --git a/doc/design/assistant/blog/day_255__Debian_release_day.mdwn b/doc/design/assistant/blog/day_255__Debian_release_day.mdwn new file mode 100644 index 000000000..9c41ab2b2 --- /dev/null +++ b/doc/design/assistant/blog/day_255__Debian_release_day.mdwn @@ -0,0 +1,26 @@ +Created a backport of the latest git-annex release for Debian 7.0 wheezy. +Needed to backport a dozen haskell dependencies, but not too bad. +This will be available in the backports repository once Debian +starts accepting new packages again. I plan to keep the backport up-to-date +as I make new releases. + +The cheap Android tablet I bought to do this last Android push with came +pre-rooted from the factory. This may be why I have not seen this bug: +[[bugs/Android_app_permission_denial_on_startup]]. If you have Android +4.2.2 or a similar version, your testing would be helpful for me to know if +this is a widespread problem. I have an idea about a way to work around the +problem, but it involves writing Java code, and probably polling a file, +ugh. + +Got S3 support to build for Android. Probably fails to work +due to the same network stack problems affecting WebDAV and Jabber. + +Got removable media mount detection working on Android. Bionic has an +amusing stub for `getmntent` that prints out "FIX ME! implement +getmntent()". But, `/proc/mounts` is there, so I just parse it. +Also enabled the app's `WRITE_MEDIA_STORAGE` permission to allow +access to removable media. However, this didn't seem to do anything. :( + +Several fixes to make the Android webapp be able to set up repositories on +remote ssh servers. However, it fails at the last hurdle with what +looks like a `git-annex-shell` communication problem. Almost there.. diff --git a/doc/design/assistant/blog/day_256__8bit.mdwn b/doc/design/assistant/blog/day_256__8bit.mdwn new file mode 100644 index 000000000..1155fd2f8 --- /dev/null +++ b/doc/design/assistant/blog/day_256__8bit.mdwn @@ -0,0 +1,27 @@ +This seems a very auspicious day to have finally gotten the Android app +doing something useful! I've fixed the last bugs with using it to set up a +remote ssh server, which is all I need to make my Android tablet +sync photos I take with a repository on my laptop. + +[[!img /android/DCIM.png alt="git-annex webapp running on Android"]] + +I set this up entirely in the GUI, except for needing to switch to the +terminal twice to enter my laptop's password. + +How fast is it? Even several minute long videos transfer before I can +switch from the camera app to the webapp. To get this screenshot with it in +the process of syncing, I had to take a dozen pictures in a minute. Nice +problem to have. ;) + +Have fun trying this out for yourself after tonight's autobuilds. But a +warning: One of the bugs I fixed today had to be fixed in `git-annex-shell`, +as run on the ssh server that the Android connects to. So the Android app +will only work with ssh servers running a new enough version of git-annex. + +---- + +Worked on geting git-annex into Debian testing, which is needed before +the wheezy backport can go in. Think I've worked around most of the issues +that were keeping it from building on various architectures. + +Caught up on some bug reports and fixed some of them. diff --git a/doc/design/assistant/blog/day_256__8bit/comment_1_f9b50263e3997d4c5b9836a2e0a346d7._comment b/doc/design/assistant/blog/day_256__8bit/comment_1_f9b50263e3997d4c5b9836a2e0a346d7._comment new file mode 100644 index 000000000..b7c54ed58 --- /dev/null +++ b/doc/design/assistant/blog/day_256__8bit/comment_1_f9b50263e3997d4c5b9836a2e0a346d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm8wY171R5c4u_jPmB6LU6n6Px2xePM4sE" + nickname="Efraim" + subject="comment 1" + date="2013-05-07T06:20:35Z" + content=""" +that's amazing. I saw in one of the conference videos that you said you didn't use dropbox, and I wanted to let you know (in case you were curious) that this is one of the features that they have on their android app, that pictures and videos are uploaded to one's dropbox. Two questions, is there a toggle or option somewhere to upload over wifi only? and did you set up the tablet's camera folder as a source directory? +"""]] diff --git a/doc/design/assistant/blog/day_257__rainy_day.mdwn b/doc/design/assistant/blog/day_257__rainy_day.mdwn new file mode 100644 index 000000000..871e5b8b5 --- /dev/null +++ b/doc/design/assistant/blog/day_257__rainy_day.mdwn @@ -0,0 +1,6 @@ +Put in a fix for `getprotobyname` apparently not returning anything for +"tcp" on Android. This might fix all the special remotes there, but I don't +know yet, because I have to rebuild a lot of Haskell libraries to try it. + +So, I spent most of today writing a script to build all the Haskell +libraries for Android from scratch, with all my patches. diff --git a/doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn b/doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn new file mode 100644 index 000000000..e2e544399 --- /dev/null +++ b/doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn @@ -0,0 +1,24 @@ +Fixed a nasty bug that affects at least some FreeBSD systems. It misparsed +the output of `sha256`, and thought every file had a SHA256 of "SHA256". +Added multiple layers of protection against checksum programs not having +the expected output format. + +Lots more building and rebuilding today of Android libs than I wanted to do. +Finally have a completly clean build, which might be able to open TCP +connections. Will test tomorrow. + +In the meantime, I fired up the evil twin of my development laptop. +It's identical, except it runs Windows. + +I installed the Haskell Platform for Windows on it, and removed +some of the bloatware to free up disk space and memory for development. +While a rather disgusting experience, I certainly have a usable Haskell +development environment on this OS a lot faster than I did on Android! +Cabal is happily installing some stuff, and other stuff wants me to install +Cygwin. + +So, the clock on my month of working on a Windows port starts now. Since +I've already done rather a lot of ground work that was necessary for a +Windows port (direct mode, crippled filesystem support), and for general +sanity and to keep everything else from screeching to a halt, I plan to +only spend half my time messing with Windows over the next 30 days. diff --git a/doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn b/doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn new file mode 100644 index 000000000..3f96b1fb0 --- /dev/null +++ b/doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn @@ -0,0 +1,15 @@ +It all came together for Android today. Went from a sort of working app +to a fully working app! + +* rsync.net works. +* Box.com appears to work -- at least it's failing with the same + timeout I get on my linux box here behind the firewall of dialup doom. +* XMPP is working too! + +These all needed various little fixes. Like loading TLS certificates from +where they're stored on Android, and ensuring that totally crazy file +permissions from Android (----rwxr-x for files?!) don't leak out into rsync +repositories. Mostly though, it all just fell into place today. +Wonderful.. + +The Android autobuild is updated with all of today's work, so try it out. diff --git a/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_1_0b4a6e4893b0157e4768b46468dbbb87._comment b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_1_0b4a6e4893b0157e4768b46468dbbb87._comment new file mode 100644 index 000000000..9e1f666aa --- /dev/null +++ b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_1_0b4a6e4893b0157e4768b46468dbbb87._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 1" + date="2013-05-10T23:52:43Z" + content=""" +I have a 'Connection timed out' when I try to set-up my Gtalk account on my Nexus 4 (4.2.2). I tested it at home without a web proxy. + +Here's a screen capture: [http://i.imgur.com/RBcNjSv.png](http://i.imgur.com/RBcNjSv.png). +"""]] diff --git a/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment new file mode 100644 index 000000000..cfe1347bd --- /dev/null +++ b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="I also see the connection timed out" + date="2013-05-15T00:19:34Z" + content=""" +Same Android device and same behavior as the above comment. While the connection attempt was being made, I switched to the terminal window and saw a connection to 173.194.46.86:5222 in the SYN_SENT state (and that connection wasn't there prior to the jabber configuration attempt). + +Even from my desktop, manual connection attempts to 173.194.46.86:5222 timed out. + +Then I ran the same jabber configuration from my desktop and it worked fin. Using netstat, I could see it connected to 74.125.133.125:5222. + +So is the Android version using the wrong address? +"""]] diff --git a/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_3_eed7792f6142f3fc74d3c384bb16559b._comment b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_3_eed7792f6142f3fc74d3c384bb16559b._comment new file mode 100644 index 000000000..245ae7a06 --- /dev/null +++ b/doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_3_eed7792f6142f3fc74d3c384bb16559b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-19T20:56:25Z" + content=""" +For the record, there was a bug with XMPP and SRV records. This got fixed in time for the last release. +"""]] diff --git a/doc/design/assistant/blog/day_25__transfer_queueing.mdwn b/doc/design/assistant/blog/day_25__transfer_queueing.mdwn new file mode 100644 index 000000000..b07e4592e --- /dev/null +++ b/doc/design/assistant/blog/day_25__transfer_queueing.mdwn @@ -0,0 +1,41 @@ +So as not to bury the lead, I've been hard at work on my first day in +Nicaragua, and ** the git-annex assistant fully syncs files (including +their contents) between remotes now !! ** + +Details follow.. + +Made the committer thread queue Upload Transfers when new files +are added to the annex. Currently it tries to transfer the new content +to *every* remote; this inefficiency needs to be addressed later. + +Made the watcher thread queue Download Transfers when new symlinks +appear that point to content we don't have. Typically, that will happen +after an automatic merge from a remote. This needs to be improved as it +currently adds Transfers from every remote, not just those that have the +content. + +This was the second place that needed an ordered list of remotes +to talk to. So I cached such a list in the DaemonStatus state info. +This will also be handy later on, when the webapp is used to add new +remotes, so the assistant can know about them immediately. + +Added YAT (Yet Another Thread), number 15 or so, the transferrer thread +that waits for transfers to be queued and runs them. Currently a naive +implementation, it runs one transfer at a time, and does not do anything +to recover when a transfer fails. + +Actually transferring content requires YAT, so that the transfer +action can run in a copy of the Annex monad, without blocking +all the assistant's other threads from entering that monad while a transfer +is running. This is also necessary to allow multiple concurrent transfers +to run in the future. + +This is a very tricky piece of code, because that thread will modify the +git-annex branch, and its parent thread has to invalidate its cache in +order to see any changes the child thread made. Hopefully that's the extent +of the complication of doing this. The only reason this was possible at all +is that git-annex already support multiple concurrent processes running +and all making independent changes to the git-annex branch, etc. + +After all my groundwork this week, file content transferring is now +fully working! diff --git a/doc/design/assistant/blog/day_25__transfer_queueing/comment_1_59fd4f1ffe96c412f613dc86276e7dbd._comment b/doc/design/assistant/blog/day_25__transfer_queueing/comment_1_59fd4f1ffe96c412f613dc86276e7dbd._comment new file mode 100644 index 000000000..0a5b6c099 --- /dev/null +++ b/doc/design/assistant/blog/day_25__transfer_queueing/comment_1_59fd4f1ffe96c412f613dc86276e7dbd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawldKnauegZulM7X6JoHJs7Gd5PnDjcgx-E" + nickname="Matt" + subject="Source code" + date="2012-07-06T00:12:15Z" + content=""" +Hi Joey, + +Is the source code for git-annex assistant available somewhere? +"""]] diff --git a/doc/design/assistant/blog/day_25__transfer_queueing/comment_2_93bf768a67117e873af5732ecf08dc78._comment b/doc/design/assistant/blog/day_25__transfer_queueing/comment_2_93bf768a67117e873af5732ecf08dc78._comment new file mode 100644 index 000000000..6c0ca0781 --- /dev/null +++ b/doc/design/assistant/blog/day_25__transfer_queueing/comment_2_93bf768a67117e873af5732ecf08dc78._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-07-06T00:21:43Z" + content=""" +It's in the `assistant` branch of git://git-annex.branchable.com/ +"""]] diff --git a/doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn b/doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn new file mode 100644 index 000000000..4fa2ccf5a --- /dev/null +++ b/doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn @@ -0,0 +1,46 @@ +Set up my Windows development environment. For future reference, I've +installed: + +* haskell platform for windows +* cygwin +* gcc and a full C toolchain in cygwin +* git from upstream (probably git-annex will use this) +* git in cygwin (the other git was not visible inside cygwin) +* vim in cygwin +* vim from upstream, as the cygwin vim is not very pleasant to use +* openssh in cygwin (seems to be missing a ssh server) +* rsync in cygwin +* Everything that `cabal install git-annex` is able to install successfully. + This includes all the libraries needed to build regular git-annex, + but not the webapp. Good start though. + +Result basically feels like a linux system that can't decide which way +slashes in paths go. :P I've never used Cygwin before (I last used a +Windows machine in 2003 for that matter), and it's a fairly impressive hack. + +---- + +Fixed up git-annex's configure program to run on Windows (or, at least, in +Cygwin), and have started getting git-annex to build. + +For now, I'm mostly stubbing out functions that use unix stuff. Gotten the +first 44 of 300 source files to build this way. + +Once I get it to build, if only with stubs, I'll have a good +idea about all the things I need to find Windows equivilants of. +Hopefully most of it will be provided by +. + +---- + +So that's the plan. There is a possible shortcut, rather than doing a full +port. It seems like it would probably not be too hard to rebuild ghc inside +Cygwin, and the resulting ghc would probably have a full POSIX emulation +layer going through cygwin. From ghc's documentation, it looks like that's +how ghc used to be built at some point in the past, so it would probably +not be too hard to build it that way. With such a cygwin ghc, git-annex +would probably build with little or no changes. However, it would be a +git-annex targeting Cygwin, and not really a native Windows port. So +it'd see Cygwin's emulated POSIX filesystem paths, etc. That +seems probably not ideal for most windows users.. but if I get really stuck +I may go back and try this method. diff --git a/doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn b/doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn new file mode 100644 index 000000000..8107336f0 --- /dev/null +++ b/doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn @@ -0,0 +1,29 @@ +After working on it all day, git-annex now builds on Windows! + +Even better, `git annex init` works. So does `git annex status`, and +probably more. Not `git annex add` yet, so I wasn't able to try much more. + +I didn't have to add many stubs today, either. Many of the missing Windows +features were only used in code paths that made git-annex faster, but I +could fall back to a slower code path on Windows. + +The things that are most problimatic so far: + +* POSIX file locking. This is used in git-annex in several places to + make it safe when multiple git-annex processes are running. I put in + really horrible dotfile type locking in the Windows code paths, but I + don't trust it at all of course. +* There is, apparently, no way to set an environment variable in Windows + from Haskell. It is only possible to set up a new process' environment + before starting it. Luckily most of the really crucial environment + variable stuff in git-annex is of this latter sort, but there were + a few places I had to stub out code that tries to manipulate git-annex's + own environment. + +The `windows` branch has a diff of 2089 lines. It add 88 ifdefs to the code +base. Only 12 functions are stubbed out on Windows. This could be so much +worse. + +Next step: Get the test suite to build. Currently ifdefed out because it +uses some stuff like `setEnv` and `changeWorkingDirectory` that I don't know +how to do in Windows yet. diff --git a/doc/design/assistant/blog/day_262__DOS_path_separators.mdwn b/doc/design/assistant/blog/day_262__DOS_path_separators.mdwn new file mode 100644 index 000000000..a7f6c07cc --- /dev/null +++ b/doc/design/assistant/blog/day_262__DOS_path_separators.mdwn @@ -0,0 +1,14 @@ +It's remarkable that a bad decision made in 1982 can cause me to waste an +entire day in 2013. Yes, `/` vs `\` fun time. Even though I long ago +converted git-annex to use the haskell `` operator wherever it builds +up paths (which transparently handles either type of separator), I still +spent most of today dealing with it. Including some libraries I use that +get it wrong. Adding to the fun is that git uses `/` internally, even on +Windows, so Windows separated paths have to be converted when being fed +into git. + +Anyway, `git annex add` now works on Windows. So does `git annex find`, +and `git annex whereis`, and probably most query stuff. + +Today was very un-fun and left me with a splitting headache, so I will +certainly *not* be working on the Windows port tomorrow. diff --git a/doc/design/assistant/blog/day_262__DOS_path_separators/comment_1_45ecae90b22e31202c21083980d6b567._comment b/doc/design/assistant/blog/day_262__DOS_path_separators/comment_1_45ecae90b22e31202c21083980d6b567._comment new file mode 100644 index 000000000..a024103a7 --- /dev/null +++ b/doc/design/assistant/blog/day_262__DOS_path_separators/comment_1_45ecae90b22e31202c21083980d6b567._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://jamesjustjames.wordpress.com/" + nickname="purpleidea" + subject="Isn't windows deprecated?" + date="2013-05-13T05:51:20Z" + content=""" +I feel bad for you, however I respect you for keeping your promise to try and hack on Windows. I had to port over some code than ran beautifully on GNU/Linux and it was more trouble than it was worth. In the end it was never used :P + +Cheers! +"""]] diff --git a/doc/design/assistant/blog/day_263_catching_up.mdwn b/doc/design/assistant/blog/day_263_catching_up.mdwn new file mode 100644 index 000000000..b8eadbc96 --- /dev/null +++ b/doc/design/assistant/blog/day_263_catching_up.mdwn @@ -0,0 +1,11 @@ +Spent some time today to get caught up on bug reports and website traffic. +Fixed a few things. + +Did end up working on Windows for a while too. I got `git annex drop` +working. But nothing that moves content quite works yet.. + +I've run into a stumbling block with `rsync`. It thinks that +`C:\repo` is a path on a ssh server named "C". Seems I will need to translate +native windows paths to unix-style paths when running rsync. + +[[!meta date="13 May 2013"]] diff --git a/doc/design/assistant/blog/day_263_catching_up/comment_1_9023da0573dfc81644d68128adb331a7._comment b/doc/design/assistant/blog/day_263_catching_up/comment_1_9023da0573dfc81644d68128adb331a7._comment new file mode 100644 index 000000000..83e7523ff --- /dev/null +++ b/doc/design/assistant/blog/day_263_catching_up/comment_1_9023da0573dfc81644d68128adb331a7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkHscTHMCNvjJ6nLI1VpsBrJFI5FTwhUT4" + nickname="David" + subject="Just use Unix Paths like git does?" + date="2013-05-15T20:43:34Z" + content=""" +Can't you just use unix-style paths for your internal data structures, and wrap/patch the filesystem I/O code to convert between the two? +"""]] diff --git a/doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn b/doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn new file mode 100644 index 000000000..f34e8b15e --- /dev/null +++ b/doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn @@ -0,0 +1,21 @@ +The Windows port can now do everything in the [[walkthrough]]. It can use +both local and remote git repositories. Some special remotes work +(directory at least; probably rsync; likely any other special remote that +can have its dependencies built). Missing features include most special +remotes, gpg encryption, and of course, the assistant. + +Also built a NullSoft installer for git-annex today. This was made very +easy when I found the Haskell ncis library, which provides a DSL embedding +the language used to write NullSoft installers into Haskell. So I didn't +need to learn a new language, yay! And could pull in all my helpful +Haskell utility libraries in the program that builds the installer. + +The only tricky part was: How to get git-annex onto PATH? The standard way +to do this seems to be to use a multiple-hundred line include file. Of +course, that file does not have any declared license.. Instead of that, +I used a hack. The git installer for Windows adds itself to PATH, and is +a pre-requisite for git-annex. So the git-annex installer just installs +it into the same directory as git. + +So.. I'll be including this first stage Windows port, with installer in +the next release. Anyone want to run a Windows autobuilder? diff --git a/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_1_42a7502d6ece75520eb59a76fdb1e2f0._comment b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_1_42a7502d6ece75520eb59a76fdb1e2f0._comment new file mode 100644 index 000000000..e7846d5fb --- /dev/null +++ b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_1_42a7502d6ece75520eb59a76fdb1e2f0._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJ2utMQgMEYAOs3Dfc6eZRyUzt4acNXUU" + nickname="David" + subject="git on windows" + date="2013-05-15T04:26:48Z" + content=""" +Adding git to the PATH variable is an optional step in the msysgit installer, fyi. + +"""]] diff --git a/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment new file mode 100644 index 000000000..1ff6bd542 --- /dev/null +++ b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2013-05-15T22:30:05Z" + content=""" +I was thinking maybe migrating away from gitbuilder to using something like buildbot as it seems to be a better fit for this project than gitbuilder. +"""]] diff --git a/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment new file mode 100644 index 000000000..39d2a837d --- /dev/null +++ b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-15T22:56:27Z" + content=""" +@Jimmy, would be fine with me if it works better +"""]] diff --git a/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_4_9ce106baf28b7f75f7f6febd7bfcea70._comment b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_4_9ce106baf28b7f75f7f6febd7bfcea70._comment new file mode 100644 index 000000000..d3ac0df12 --- /dev/null +++ b/doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_4_9ce106baf28b7f75f7f6febd7bfcea70._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2013-05-16T17:31:40Z" + content=""" +joey, I'll poke at it on the weekend, been meaning to look for an excuse to learn a bit more about buildbot. +"""]] diff --git a/doc/design/assistant/blog/day_265__correctness.mdwn b/doc/design/assistant/blog/day_265__correctness.mdwn new file mode 100644 index 000000000..a4415b444 --- /dev/null +++ b/doc/design/assistant/blog/day_265__correctness.mdwn @@ -0,0 +1,23 @@ +Laid some groundwork for porting the test suite to Windows, and getting it +working in direct mode. That's not complete, but even starting to run the +test suite in direct mode and looking at all the failures (many of them +benign, like files not being symlinks) highlighted something +I have been meaning to look into for quite a while: Why, in direct mode, +`git-annex` doesn't operate on data staged in the index, but requires you +commit changes to files before it'll see them. That's an annoying +difference between direct and indirect modes. + +It turned out that I introduced this behavior back on +[[January 5th|day_163__free_features]], working around a nasty +bug I didn't understand. Bad Joey, should have root caused the bug at the +time! But the commit says I was stuck on it for hours, and it was +presenting as if it was a bug in `git cat-file` itself, so ok. Anyway, +I quickly got to the bottom of it today, fixed the underlying bug (which +was in git-annex, not git itself), and got rid of the workaround and its +undesired consequences. Much better. + +The test suite is turning up some other minor problems with direct mode. +Should have found time to port it earlier. + +Also, may have fixed the issue that was preventing GTalk from working on +Android. (Missing DNS library so it didn't do SRV lookups right.) diff --git a/doc/design/assistant/blog/day_265__correctness/comment_1_e8959a6df87eb92310947e66c7471e97._comment b/doc/design/assistant/blog/day_265__correctness/comment_1_e8959a6df87eb92310947e66c7471e97._comment new file mode 100644 index 000000000..96731a43e --- /dev/null +++ b/doc/design/assistant/blog/day_265__correctness/comment_1_e8959a6df87eb92310947e66c7471e97._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="Android success" + date="2013-05-16T04:14:09Z" + content=""" +I now have my android phone and laptop talking with GTalk and used a remote ssh server to synchronise files. + +Photos are flowing from my phone to my laptop quite happily. Magic. + +Would help to exclude .thumbnails from the DCIM directory on the phone though... +"""]] diff --git a/doc/design/assistant/blog/day_265__correctness/comment_2_0cb953fcc085eedb34e65c227309ede7._comment b/doc/design/assistant/blog/day_265__correctness/comment_2_0cb953fcc085eedb34e65c227309ede7._comment new file mode 100644 index 000000000..cf936cf2a --- /dev/null +++ b/doc/design/assistant/blog/day_265__correctness/comment_2_0cb953fcc085eedb34e65c227309ede7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="GTalk/XMPP" + date="2013-05-19T09:58:51Z" + content=""" +Google seems to be deprecating XMPP and GTalk. Can git-annex assistant use other XMPP services? And does it handle federation correctly? +"""]] diff --git a/doc/design/assistant/blog/day_265__correctness/comment_3_df57628a8969af2995732e7ea2a0fae3._comment b/doc/design/assistant/blog/day_265__correctness/comment_3_df57628a8969af2995732e7ea2a0fae3._comment new file mode 100644 index 000000000..27bee6171 --- /dev/null +++ b/doc/design/assistant/blog/day_265__correctness/comment_3_df57628a8969af2995732e7ea2a0fae3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-19T19:12:59Z" + content=""" +git-annex can use any xmpp server. The only thing that would need to be changed if google talk went away tomorrow is changing some text that suggests entering one's gmail address, to some other text that suggests some other xmpp server to use. + +However, I am skeptical about echo chamber conclusions (and/or tech press) about what google is, or is not doing, or is or is not planning to do. +"""]] diff --git a/doc/design/assistant/blog/day_266__release_day.mdwn b/doc/design/assistant/blog/day_266__release_day.mdwn new file mode 100644 index 000000000..8e373c94c --- /dev/null +++ b/doc/design/assistant/blog/day_266__release_day.mdwn @@ -0,0 +1,6 @@ +Made a release. + +I am firming up some ideas for post-kickstarter. More on that later. + +In the process of setting up a Windows autobuilder, using the same +jenkins installation that is used to autobuild msysgit. diff --git a/doc/design/assistant/blog/day_266__release_day/comment_1_92c8d1d9216b46b07dfe69bbc77a923e._comment b/doc/design/assistant/blog/day_266__release_day/comment_1_92c8d1d9216b46b07dfe69bbc77a923e._comment new file mode 100644 index 000000000..39ff88541 --- /dev/null +++ b/doc/design/assistant/blog/day_266__release_day/comment_1_92c8d1d9216b46b07dfe69bbc77a923e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="Continued work" + date="2013-05-17T07:44:38Z" + content=""" +Can we continue to fund your work in some way? +"""]] diff --git a/doc/design/assistant/blog/day_267__windows_autobuilder.mdwn b/doc/design/assistant/blog/day_267__windows_autobuilder.mdwn new file mode 100644 index 000000000..b9e28438d --- /dev/null +++ b/doc/design/assistant/blog/day_267__windows_autobuilder.mdwn @@ -0,0 +1,9 @@ +git-annex is now autobuilt for Windows on the same Jenkins farm that +builds msysgit. Thanks for Yury V. Zaytsev for providing that! Spent about +half of today setting up the build. + +Got the test suite to pass in direct mode, and indeed in direct mode +on a FAT file system. Had to fix one corner case in direct mode `git annex +add`. Unfortunately it still doesn't work on Android; somehow `git clone` +of a local repository is broken there. Also got the test suite to build, +and run on Windows, though it fails pretty miserably. diff --git a/doc/design/assistant/blog/day_267__windows_autobuilder/comment_1_978b584d86395f2f621b0e1f7c5e70d7._comment b/doc/design/assistant/blog/day_267__windows_autobuilder/comment_1_978b584d86395f2f621b0e1f7c5e70d7._comment new file mode 100644 index 000000000..ccda628ae --- /dev/null +++ b/doc/design/assistant/blog/day_267__windows_autobuilder/comment_1_978b584d86395f2f621b0e1f7c5e70d7._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkDb5BRI8VzliQuKRVM7NwMdudvxiUNPHI" + nickname="Richard" + subject="git annex add on Win7 NTFS" + date="2013-06-14T09:26:24Z" + content=""" +Hello I took latest build from download #243. + +running in CMD or in GIT bash as admin user. + +git annex add, fails on all files. + +Example: +add IS Breast/Changing IP Address of The Server/flowplayer-3.2.4.min.js (checksum...) +git-annex: C:\development storage\.git\annex\objects\e4b\168\SHA256E-s15723--f6950 +bd995674741c600d0465a333f5491d5713e8ac2e3fc57d61cccadba522d.min.js\SHA256E-s15723--f6950bd995674741c600d0465a333f5491d57 +13e8ac2e3fc57d61cccadba522d.min.js.cache: openFile: does not exist (No such file or directory) + +Am I doing something wrong? I somehow understood that this should be ok now. +Thanks for your kind answer +"""]] diff --git a/doc/design/assistant/blog/day_267__windows_autobuilder/comment_2_8f978d2811c8fbf11e3d12f245bdb52b._comment b/doc/design/assistant/blog/day_267__windows_autobuilder/comment_2_8f978d2811c8fbf11e3d12f245bdb52b._comment new file mode 100644 index 000000000..796dea21e --- /dev/null +++ b/doc/design/assistant/blog/day_267__windows_autobuilder/comment_2_8f978d2811c8fbf11e3d12f245bdb52b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 2" + date="2013-06-25T17:12:17Z" + content=""" +That is the same problem that is currently making the test suite fail on the windows autobuilder. + +I don't know what is causing this problem, and have not been able to reproduce it locally in order to debug it. +"""]] diff --git a/doc/design/assistant/blog/day_268__core_monad_change.mdwn b/doc/design/assistant/blog/day_268__core_monad_change.mdwn new file mode 100644 index 000000000..2704bb090 --- /dev/null +++ b/doc/design/assistant/blog/day_268__core_monad_change.mdwn @@ -0,0 +1,9 @@ +Today I had to change the implementation of the Annex monad. The old one +turned out to be buggy around exception handling -- changes to state +recorded by code that ran in an exception handler were discarded when it +threw an exception. Changed from a StateT monad to a ReaderT with +a MVar. Really deep-level change, but it went off without a +hitch! + +Other than that it was a bug catch up day. Almost entirely caught up once +more. diff --git a/doc/design/assistant/blog/day_269__bugfixes.mdwn b/doc/design/assistant/blog/day_269__bugfixes.mdwn new file mode 100644 index 000000000..7cbdb5863 --- /dev/null +++ b/doc/design/assistant/blog/day_269__bugfixes.mdwn @@ -0,0 +1,14 @@ +Worked on several important bug fixes today. One affects automatic merge +confict resolution, and can case data loss in direct mode, so I will be +making a release with the fix tomorrow. + +Practiced TDD today, and good thing too. The new improved test suite +turned up a really subtle bug involving the git-annex branch vector +clocks-ish code, which I also fixed. + +Also, fixes to the OSX autobuilds. One of them had a broken gpg, which is +now fixed. The other one is successfully building again. And, I'm switching +the Linux autobuilds to build against Debian stable, since testing has a +new version of libc now, which would make the autobuilds not work on older +systems. Getting an amd64 chroot into shape is needing rather a lot +of backporting of build dependencies, which I already did for i386. diff --git a/doc/design/assistant/blog/day_26__dying_drives.mdwn b/doc/design/assistant/blog/day_26__dying_drives.mdwn new file mode 100644 index 000000000..109ceb19e --- /dev/null +++ b/doc/design/assistant/blog/day_26__dying_drives.mdwn @@ -0,0 +1,28 @@ +My laptop's SSD died this morning. I had some work from yesterday +committed to the git repo on it, but not pushed as it didn't build. +Luckily I was able to get that off the SSD, which is now a read-only +drive -- even mounting it fails with fsck write errors. + +Wish I'd realized the SSD was dying before the day before my trip to +Nicaragua.. +Getting back to a useful laptop used most of my time and energy today. + +I did manage to fix transfers to not block the rest of the assistant's +threads. Problem was that, without Haskell's threaded runtime, waiting +on something like a rsync command blocks all threads. To fix this, +transfers now are run in separate processes. + +Also added code to allow multiple transfers to run at once. Each transfer +takes up a slot, with the number of free slots tracked by a `QSemN`. +This allows the transfer starting thread to block until a slot frees up, +and then run the transfer. + +This needs to be extended to be aware of transfers initiated by remotes. +The transfer watcher thread should detect those starting and stopping +and update the `QSemN` accordingly. It would also be nice if transfers +initiated by remotes would be delayed when there are no free slots for them +... but I have not thought of a good way to do that. + +There's a bug somewhere in the new transfer code, when two transfers are +queued close together, the second one is lost and doesn't happen. +Would debug this, but I'm spent for the day. diff --git a/doc/design/assistant/blog/day_270__release_and_xmpp.mdwn b/doc/design/assistant/blog/day_270__release_and_xmpp.mdwn new file mode 100644 index 000000000..eb28f97bd --- /dev/null +++ b/doc/design/assistant/blog/day_270__release_and_xmpp.mdwn @@ -0,0 +1,39 @@ +Got the bugfix release out. + +Tobias contributed [[tips/megaannex]], which allows using mega.co.nz as a +special remote. Someone should do this with Flickr, using +[filr](https://github.com/ricardobeat/filr). I have improved the +[[special_remotes/hook]] special remote to make it easier to create +and use reusable programs like megaannex. + +But, I am too busy rewriting lots of the XMPP code to join in the +special remote fun. Spent all last night staring at protocol traces and +tests, and came to the conclusion that it's working well at the basic +communication level, but there are a lot of bugs above that level. This +mostly shows up as one side refusing to push changes made to its tree, +although it will happily merge in changes sent from the other side. + +The NetMessanger code, which handles routing messages to git commands and +queuing other messages, seems to be just wrong. This is code I wrote in the +fall, and have basically not touched since. And it shows. Spent 4 hours +this morning rewriting it. Went all Erlang and implemented message inboxes +using STM. I'm much more confident it won't drop messages on the +floor, which the old code certainly did do sometimes. + +Added a check to avoid unnecessary pushes over XMPP. Unfortunately, this +required changing the protocol in a way that will make previous versions of +git-annex refuse to accept any pushes advertised by this version. Could not +find a way around that, but there were so many unnecessary pushes happening +(and possibly contributing to other problems) that it seemed worth the +upgrade pain. + +Will be beating on XMPP a bit more. There is one problem I was seeing +last night that I cannot reproduce now. It may have been masked or even +fixed by these changes, but I need to verify that, or put in a workaround. +It seemed that sometimes this code in `runPush` would run the setup +and the action, but either the action blocked forever, or an exception +got through and caused the cleanup not to be run. + +[[!format haskell """ + r <- E.bracket_ setup cleanup <~> a +"""]] diff --git a/doc/design/assistant/blog/day_271__more_xmpp.mdwn b/doc/design/assistant/blog/day_271__more_xmpp.mdwn new file mode 100644 index 000000000..14e734a2d --- /dev/null +++ b/doc/design/assistant/blog/day_271__more_xmpp.mdwn @@ -0,0 +1,31 @@ +Tobias has been busy again today, creating a [[/tips/flickrannex]] +special remote! Meanwhile, I'm thinking about providing a +[[more complete interface|/todo/support_for_writing_external_special_remotes]] +so that special remote programs not written in Haskell can do some of the +things the hook special remote's simplicity doesn't allow. + +Finally realized last night that the main problem with the XMPP push code +was an inversion of control. Reworked it so now there are two new threads, +XMPPSendpack and XMPPReceivePack, each with their own queue of push +initiation requests, that run the pushes. This is a lot easier to +understand, probably less buggy, and lets it apply some smarts to squash +duplicate actions and pick the best request to handle next. + +Also made the XMPP client send pings to detect when it has been disconnected +from the server. Currently every 120 seconds, though that may change. Testing +showed that without this, it did not notice (for at least 20 minutes) when +it lost routing to the server. Not sure why -- I'd think the TCP connections +should break and this throw an error -- but this will also handle any idle +disconnection problems that some XMPP servers might have. + +While writing that, I found myself writing this jem using +[async](http://hackage.haskell.org/package/async), which has a comment +much longer than the code, but basically we get 4 threads that are all +linked, so when any dies, all do. + +[[!format haskell """ +pinger `concurrently` sender `concurrently` receiver +"""]] + +Anyway, I need to run some long-running XMPP push tests to see if I've +really ironed out all the bugs. diff --git a/doc/design/assistant/blog/day_272__fuzz_tester.mdwn b/doc/design/assistant/blog/day_272__fuzz_tester.mdwn new file mode 100644 index 000000000..9d352f70a --- /dev/null +++ b/doc/design/assistant/blog/day_272__fuzz_tester.mdwn @@ -0,0 +1,37 @@ +The Android app should work on some more devices now, where hard linking to +busybox didn't work. Now it installs itself using symlinks. + +Pushed a point release so `cabal install git-annex` works again. And, +I'm really happy to see that the 4.20130521 release has autobuilt on all +Debian architectures, and will soon be replacing the old 3.20120629 version +in testing. (Well, once a libffi transition completes..) + +TobiasTheMachine has done it again: [[tips/googledriveannex]] + +----- + +I spent most of today building a fuzz tester for the assistant. `git annex +fuzztest` will (once you find the special runes to allow it to run) create +random files in the repository, move them around, delete them, move +directory trees around, etc. The plan is to use this to run some long +duration tests with eg, XMPP, to make sure the assistant keeps things +in shape after a lot of activity. It logs in machine-readable format, +so if it turns up a bug I may even be able to use it to reproduce the same +bug (fingers crossed). + +I was able to use QuickCheck to generate random data for some parts of the fuzz +tester. (Though the actual file names it uses are not generated using +QuickCheck.) Liked this part: + +[[!format haskell """ +instance Arbitrary FuzzAction where + arbitrary = frequency + [ (100, FuzzAdd <$> arbitrary) + , (10, FuzzDelete <$> arbitrary) + , (10, FuzzMove <$> arbitrary <*> arbitrary) + , (10, FuzzModify <$> arbitrary) + , (10, FuzzDeleteDir <$> arbitrary) + , (10, FuzzMoveDir <$> arbitrary <*> arbitrary) + , (10, FuzzPause <$> arbitrary) + ] +"""]] diff --git a/doc/design/assistant/blog/day_273-274__fun.mdwn b/doc/design/assistant/blog/day_273-274__fun.mdwn new file mode 100644 index 000000000..2fa12003a --- /dev/null +++ b/doc/design/assistant/blog/day_273-274__fun.mdwn @@ -0,0 +1,19 @@ +Got caught up on some bug reports yesterday. The main one was odd behavior +of the assistant when the repository was in manual mode. A recent change to +the preferred content expression caused it. But the expression was not +broken. The problem was in the parser, which got the parentheses wrong +in this case. I had to mostly rewrite the parser, unfortunately. I've tested +the new one fairly extensively -- on the other hand this bug lurked in the +old parser for several years (this same code is used for matching files +with command-line parameters). + +Just as I finished with that, I noticed another bug. Turns out git-cat-file +doesn't reload the index after it's started. So last week's changes to make +git-annex check the state of files in the index won't work when using the +assistant. Luckily there was an easy workaround for this. + +Today I finished up some robustness fixes, and added to the test suite +checks for preferred content expressions, manual mode, etc. + +I've started a stress test, syncing 2 repositories over XMPP, with the fuzz +tester running in each to create lots of changes to keep in sync. diff --git a/doc/design/assistant/blog/day_275__working_hard_or.mdwn b/doc/design/assistant/blog/day_275__working_hard_or.mdwn new file mode 100644 index 000000000..b667ba08a --- /dev/null +++ b/doc/design/assistant/blog/day_275__working_hard_or.mdwn @@ -0,0 +1,12 @@ +Fuzz tester has found several interesting bugs that I've now fixed. It's +even found a bug in my fixes. Most of the problems the fuzz testing has +found have had to do with direct mode merges, and automatic merge conflict +resoltion. Turns out the second level of automatic merge conflict +resolution (where the changes made to resolve a merge conflict themselves +turn out conflict in a later merge) was buggy, for example. + +So, didn't really work a lot today -- was not intending to work at all +actually -- but have still accomplished a lot. + +(Also, Tobias contributed [[tips/dropboxannex]] .. I'll be curious to see +what the use case for that is, if any!) diff --git a/doc/design/assistant/blog/day_276__fuzzing_continues.mdwn b/doc/design/assistant/blog/day_276__fuzzing_continues.mdwn new file mode 100644 index 000000000..d6fc88b05 --- /dev/null +++ b/doc/design/assistant/blog/day_276__fuzzing_continues.mdwn @@ -0,0 +1,12 @@ +The fuzz testing found a file descriptor leak in the XMPP git push code. +The assistant seems to hold up under fuzzing for quite a while now. + +Have started trying to work around some versions of Android not letting +the `am` command be used by regular users to open a web browser on an URL. +Here is my current crazy plan: Hack the terminal emulator's title setting +code, to get a new escape sequence that requests an URL be opened. This +assumes I can just use `startActivity()` from inside the app and it will +work. This may sound a little weird, but it avoids me needing to set up a +new communications channel from the assistant to the Java app. Best of all, +I have to write very little Java code. I last wrote Java code in 1995, so +writing much more is probably a good thing to avoid. diff --git a/doc/design/assistant/blog/day_276__fuzzing_continues/comment_1_f5dd0658511a1063c2eb025b0fe98426._comment b/doc/design/assistant/blog/day_276__fuzzing_continues/comment_1_f5dd0658511a1063c2eb025b0fe98426._comment new file mode 100644 index 000000000..4a54fa188 --- /dev/null +++ b/doc/design/assistant/blog/day_276__fuzzing_continues/comment_1_f5dd0658511a1063c2eb025b0fe98426._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 1" + date="2013-05-28T03:23:50Z" + content=""" +Does the Android application use a [WakeLock](https://developer.android.com/reference/android/os/PowerManager.WakeLock.html) to ensure syncing happens even if the device screen goes off? + +I'm under the impression that it doesn't since it took a very long time to sync the first time (before I used the terminal's options to prevent the phone from sleeping). + +I think that option shouldn't be left on since it would waste the battery and I think the application should block sleep mode only when syncing. + +I might be wrong. I never had to use a WakeLock on Android yet. +"""]] diff --git a/doc/design/assistant/blog/day_276__fuzzing_continues/comment_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment b/doc/design/assistant/blog/day_276__fuzzing_continues/comment_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment new file mode 100644 index 000000000..3a98c8a09 --- /dev/null +++ b/doc/design/assistant/blog/day_276__fuzzing_continues/comment_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-29T16:30:20Z" + content=""" +The terminal has options to take the wake lock, and also the wifi lock, in its menu. + +Currently this has to be managed manually. The assistant does not try to deal with this. +"""]] diff --git a/doc/design/assistant/blog/day_277__private_static_protected_void.mdwn b/doc/design/assistant/blog/day_277__private_static_protected_void.mdwn new file mode 100644 index 000000000..dbe2244a0 --- /dev/null +++ b/doc/design/assistant/blog/day_277__private_static_protected_void.mdwn @@ -0,0 +1,19 @@ +Yeah, Java hacking today. I have something that I think should deal with +the [[bugs/Android_app_permission_denial_on_startup]] problem. Added a "Open +WebApp" item to the terminal's menu, which should behave as advertised. +This is available in the Android daily build now, if your device has that +problem. + +I was not able to get the escape sequence hack to work. I had no difficulty +modifying the terminal to send an intent to open an url when it received a +custom escape sequence. But sending the intent just seemed to lock up the +terminal for a minute without doing anything. No idea why. I had to propigate a +context object in to the terminal emulator through several layers of objects. +Perhaps that doesn't really work despite what I [read on stackoverflow](http://stackoverflow.com/questions/9051849/opening-a-link-in-the-browser/9052208#9052208). + +Anyway, that's all I have time to do. It would be nice if I, or some other +interested developer who is more comfortable with Java, could write a custom +Android frontend app, that embedded a web browser widget for the webapp, +rather than abusing the terminal this way. OTOH, this way does provide the +bonus of a pretty good terminal and git shell environment for Android to go +with git-annex. diff --git a/doc/design/assistant/blog/day_278__winding_down.mdwn b/doc/design/assistant/blog/day_278__winding_down.mdwn new file mode 100644 index 000000000..824feceaf --- /dev/null +++ b/doc/design/assistant/blog/day_278__winding_down.mdwn @@ -0,0 +1,11 @@ +Winding down work for now, as I prepare for a week at the beach starting in +2 days. That will be followed by a talk about git-annex at +[SELF2013](http://www.southeastlinuxfest.org/) in Charlotte NC on June 9th. + +Bits & pieces today. + +Want to get a release out RSN, but I'm waiting for the previous release +to finally reach Debian testing, which should happen on Saturday. Luckily I +hear the beach house has wifi, so I will probably end up cutting the +release from there. Only other thing I might work on next week is updating +to yesod 1.2. diff --git a/doc/design/assistant/blog/day_279__final_release_prep.mdwn b/doc/design/assistant/blog/day_279__final_release_prep.mdwn new file mode 100644 index 000000000..f209c1ccb --- /dev/null +++ b/doc/design/assistant/blog/day_279__final_release_prep.mdwn @@ -0,0 +1,14 @@ +Landed two final changes before the release.. + +First, made git-annex detect if any of the several long-running git process +it talks to have died, and, if yes, restart them. My stress test is reliably +able to get at least `git cat-file` to crash, and while I don't know why (and +obviously should follow up by getting a core dump and stack trace of it), +the assistant needs to deal with this to be robust. + +Secondly, wrote rather a lot of Java code to better open the web browser +when the Android app is started. A thread listens for URLs to be written to +a FIFO. Creating a FIFO from fortran^Wjava code is .. interesting. Glad to +see the back of the `am` command; it did me no favors. + +AFK diff --git a/doc/design/assistant/blog/day_27__robust_transfers.mdwn b/doc/design/assistant/blog/day_27__robust_transfers.mdwn new file mode 100644 index 000000000..49ace417b --- /dev/null +++ b/doc/design/assistant/blog/day_27__robust_transfers.mdwn @@ -0,0 +1,31 @@ +Spent most of the day making file content transfers robust. There were lots +of bugs, hopefully I've fixed most of them. It seems to work well now, +even when I throw a lot of files at it. + +One of the changes also sped up transfers; it no longer roundtrips to the +remote to verify it has a file. The idea here is that when the assistant is +running, repos should typically be fairly tightly synced to their remotes +by it, so some of the extra checks that the `move` command does are +unnecessary. + +Also spent some time trying to use ghc's threaded runtime, but continue to +be baffled by the random hangs when using it. This needs fixing eventually; +all the assistant's threads can potentially be blocked when it's waiting on +an external command it has run. + +Also changed how transfer info files are locked. The lock file is now +separate from the info file, which allows the TransferWatcher thread to +notice when an info file is created, and thus actually track transfers +initiated by remotes. + +--- + +I'm fairly close now to merging the `assistant` branch into `master`. +The data syncing code is very brute-force, but it will work well enough +for a first cut. + +Next I can either add some repository network mapping, and use graph +analysis to reduce the number of data transfers, or I can move on to the +[[webapp]]. Not sure yet which I'll do. It's likely that since DebConf +begins tomorrow I'll put off either of those big things until after the +conference. diff --git a/doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn b/doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn new file mode 100644 index 000000000..612dfc514 --- /dev/null +++ b/doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn @@ -0,0 +1,17 @@ +I didn't plan to work on git-annex much while at DebConf, because the conference +always prevents the kind of concentration I need. But I unexpectedly also had to deal +with [three dead drives](http://joeyh.name/blog/entry/I_am_become_Joey_destroyer_of_drives/) +and illness this week. + +That said, I have been trying to debug a problem with git-annex and Haskell's threaded +runtime all week. It just hangs, randomly. No luck so far isolating why, although I now +have a branch that hangs fairly reliably, and in which I am trying to whittle the entire +git-annex code base (all 18 thousand lines!) into a nice test case. + +This threaded runtime problem doesn't affect the assistant yet, but if I want to use +Yesod in developing the webapp, I'll need the threaded runtime, and using the threaded +runtime in the assistant generally would make it more responsive and less hacky. + +Since this is a task I can work on without much concentration, I'll probably keep beating +on it until I return home. Then I need to spend some quality thinking time on where +to go next in the assistant. diff --git a/doc/design/assistant/blog/day_280__yesod.mdwn b/doc/design/assistant/blog/day_280__yesod.mdwn new file mode 100644 index 000000000..ff02fd02b --- /dev/null +++ b/doc/design/assistant/blog/day_280__yesod.mdwn @@ -0,0 +1,7 @@ +Today marks 1 year since I started working on the git-annex assistant. 280 +solid days of work! + +As a background task here at the beach I've been porting git-annex to yesod +1.2. Finished it today, earlier than expected, and also managed to keep it +building with older versions. Some tricks kept the number of +ifdefs reasonably low. diff --git a/doc/design/assistant/blog/day_280__yesod/comment_1_a42213a8cef71f2b54db18606028136d._comment b/doc/design/assistant/blog/day_280__yesod/comment_1_a42213a8cef71f2b54db18606028136d._comment new file mode 100644 index 000000000..3a99c2210 --- /dev/null +++ b/doc/design/assistant/blog/day_280__yesod/comment_1_a42213a8cef71f2b54db18606028136d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 1" + date="2013-06-04T12:51:20Z" + content=""" +Congrats on the first year Joey! +"""]] diff --git a/doc/design/assistant/blog/day_281__back.mdwn b/doc/design/assistant/blog/day_281__back.mdwn new file mode 100644 index 000000000..03e42c0a5 --- /dev/null +++ b/doc/design/assistant/blog/day_281__back.mdwn @@ -0,0 +1,37 @@ +Slowly getting through the bugs that were opened while I was on vacation and +then I'll try to get to all the comments. 60+ messages to go. + +Got git-annex working better on encfs, which does not support hard links in +paranoid mode. Now git-annex can be used in indirect mode, it doesn't force +direct mode when hard links are not supported. + +Made the Android repository setup special case generate a .gitignore file +to ignore thumbnails. Which will only start working once the assistant +gets .gitignore support. + +----- + +Been thinking today about encrypting XMPP traffic, particularly git push +data. Of course, XMPP is already encrypted, but that doesn't hide it from +those entities who have access to the XMPP server or its encryption key. +So adding client-to-client encryption has been on the TODO list all along. + +OTR would be a great way to do it. But I worry that the confirmation steps +OTR uses to authenticate the recipient would make the XMPP pairing UI harder +to get through. + +Particularly when pairing your own devices over XMPP, with several devices +involved, you'd need to do a lot of cross-confirmations. It would be better +there, I think, to just use a shared secret for authentication. (The need +to enter such a secret on each of your devices before pairing them would +also provide a way to use different repositories with the same XMPP +account, so 2birds1stone.) + +Maybe OTR confirmations would be ok when setting up sharing with a friend. +If OTR was not used there, and it just did a Diffie-Hellman key exchange +during the pairing process, it could be attacked by an active MITM spoofing +attack. The attacker would then know the keys, and could decrypt future +pushes. How likely is such an attack? This goes far beyond what we're +hearing about. Might be best to put in some basic encryption now, so +we don't have to worry about pushes being passively recorded on the +server. Comments appreciated. diff --git a/doc/design/assistant/blog/day_281__back/comment_1_128809c5a2a9f5cc345a10fdbf55be01._comment b/doc/design/assistant/blog/day_281__back/comment_1_128809c5a2a9f5cc345a10fdbf55be01._comment new file mode 100644 index 000000000..a120cc2d3 --- /dev/null +++ b/doc/design/assistant/blog/day_281__back/comment_1_128809c5a2a9f5cc345a10fdbf55be01._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJ2utMQgMEYAOs3Dfc6eZRyUzt4acNXUU" + nickname="David" + subject="comment 1" + date="2013-06-10T23:42:20Z" + content=""" +If you do a D-H key exchange and display the key fingerprint on both devices, that would be a pretty strong disincentive against XMPP servers doing a MitM. You only need one victim to casually notice a discrepancy, and it leaves behind a strong proof of tampering. +"""]] diff --git a/doc/design/assistant/blog/day_281__back/comment_2_6d0bbdf6ebaff9da399804570f0e606d._comment b/doc/design/assistant/blog/day_281__back/comment_2_6d0bbdf6ebaff9da399804570f0e606d._comment new file mode 100644 index 000000000..884b2484e --- /dev/null +++ b/doc/design/assistant/blog/day_281__back/comment_2_6d0bbdf6ebaff9da399804570f0e606d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-10T23:50:27Z" + content=""" +David, along those lines, if a value derived from the D-H key were committed to the git repo, then the MITM would need to maintain two distinct git trees, and translate between them on an ongoing basis. Which is harder. And then if both clients at any point communicated via another channel (ie, local pairing), the forgery would be very noticeable. + +Which is not to say that this is necessarily good enough.. +"""]] diff --git a/doc/design/assistant/blog/day_282-283__caught_up.mdwn b/doc/design/assistant/blog/day_282-283__caught_up.mdwn new file mode 100644 index 000000000..b097e8d24 --- /dev/null +++ b/doc/design/assistant/blog/day_282-283__caught_up.mdwn @@ -0,0 +1,18 @@ +Got caught up on my backlog yesterday. + +Part of adding files in direct mode involved removing write permission from +them temporarily. That turned out to cause problems with some programs that +open a file repeatedly, and was generally against the principle that direct +mode files are always directly available. Happily, I was able to get rid of +that without sacrificing any safety. + +Improved syncing to bare repositories. Normally syncing pushes to a +synced/master branch, which is good for non-bare repositories since git +does not allow pushing to the currently checked out branch. But for bare +repositories, this could leave them without a master branch, so cloning +from them wouldn't work. A funny thing is that git does not really have any +way to tell if a remote repository is bare or not. Anyway, I did put in a +fix, at the expense of pushing twice (but the git data should only be +transferred once anyway). + + diff --git a/doc/design/assistant/blog/day_284__porting.mdwn b/doc/design/assistant/blog/day_284__porting.mdwn new file mode 100644 index 000000000..f0648b0e1 --- /dev/null +++ b/doc/design/assistant/blog/day_284__porting.mdwn @@ -0,0 +1,13 @@ +Today I got to deal with bugs on Android (busted use of `cp` among other +problems), Windows (fixed a strange hang when adding several files), and +Linux (`.desktop` files suck and Wine ships a particularly nasty one). +Pretty diverse! + +Did quite a lot of research and thinking on XMPP encryption yesterday, but +have not run any code yet (except for trying out a D-H exchange in `ghci`). +I have listed several options on the [[XMPP]] page. + +Planning to take a look at +[[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]] +tomorrow; maybe I can come up with a workaround to avoid it behaving so +badly in that case. diff --git a/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn b/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn new file mode 100644 index 000000000..252dc367f --- /dev/null +++ b/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn @@ -0,0 +1,23 @@ +Yay, I fixed the +[[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]] +bug! +At least in direct mode, which thanks to its associated files tracking +knows when a given file has another file in the repository with the same +content. Had not realized the behavior in direct mode was so bad, or the +fix so relatively easy. Pity I can't do the same for indirect mode, but +the problem is much less serious there. + +That was this weekend. Today, I nearly put out a new release (been 2 weeks +since the last one..), but ran out of time in the end, and need to get the +OSX autobuilder fixed first, so have deferred it until Friday. + +However, I did make some improvements today. +Added an `annex.debug` git config setting, so debugging can +be turned on persistently. People seem to expect that to happen when +checking the checkbox in the webapp, so now it does. + +Fixed 3 or 4 bugs in the Windows port. Which actually, has users now, or +at least one user. It's very handy to actually get real world testing of +that port. + +[[!meta date="Mon, 17 Jun 2013 17:14:04 -0400"]] diff --git a/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop/comment_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment b/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop/comment_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment new file mode 100644 index 000000000..41494c02f --- /dev/null +++ b/doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop/comment_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2013-06-26T08:36:33Z" + content=""" +Been pretty bad with keeping the osx builder going, but this should fix it... + + +
+[jtang@x00 build ((cfb577d...))]$ git diff
+diff --git a/.gitignore b/.gitignore
+index 93bd49e..717b58a 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -24,3 +24,5 @@ cabal-dev
+ .virthualenv
+ tags
+ Setup
++*.hi
++*.o
+
+ +The build on OSX leaves some stray files and it complains about it. +"""]] diff --git a/doc/design/assistant/blog/day_286__Windows_test_suite.mdwn b/doc/design/assistant/blog/day_286__Windows_test_suite.mdwn new file mode 100644 index 000000000..f62aa8eb2 --- /dev/null +++ b/doc/design/assistant/blog/day_286__Windows_test_suite.mdwn @@ -0,0 +1,19 @@ +One of my Windows fixes yesterday got the test suite close to sort of +working on Windows, and I spent all day today pounding on it. Fixed +numerous bugs, and worked around some weird Windows behaviors -- like +recursively deleting a directory sometimes fails with a permission denied +error about a file in it, and leaves behind an empty directory. (What!?) +The most important bug I fixed caused CR to leak into files in the +git-annex branch from Windows, during a union merge, which was not a good +thing at all. + +At the end of the day, I only have 6 remaining failing test cases on +Windows. Half of them are some problem where running `git annex sync` +from the test suite stomps on PATH somehow and prevents xargs from working. +The rest are probably real bugs in the directory (again something to do +with recursive directory deletion, hmmm..), hook, and rsync +special remotes on Windows. I'm punting on those 6 for now, they'll be +skipped on Windows. + +Should be worth today's pain to know in the future when I break +something that I've oh-so-painfully gotten working on Windows. diff --git a/doc/design/assistant/blog/day_287__niceness.mdwn b/doc/design/assistant/blog/day_287__niceness.mdwn new file mode 100644 index 000000000..5fc193353 --- /dev/null +++ b/doc/design/assistant/blog/day_287__niceness.mdwn @@ -0,0 +1,13 @@ +Pushed out a release today. While I've somewhat ramped down activity this +month with the Kickstarter period over and summer trips and events ongoing, +looking over the changelog I still see a ton of improvements in the 20 days +since the last release. + +Been doing some work to make the assistant daemon be more `nice`. I don't +want to nice the whole program, because that could make the web interface +unresponsive. What I am able to do, thanks to Linux violating POSIX, is to +`nice` certain expensive operations, including the startup scan and the daily +sanity check. Also, I put in a call to `ionice` (when it's available) +when `git annex assistant --autostart` is run, so the daemon's +disk IO will be prioritized below other IO. Hope this keeps it out of your +way while it does its job. diff --git a/doc/design/assistant/blog/day_288__success_stories.mdwn b/doc/design/assistant/blog/day_288__success_stories.mdwn new file mode 100644 index 000000000..c19f64e1f --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories.mdwn @@ -0,0 +1,32 @@ +Got caught up on a big queue of messages today. Mostly I hear from people +when git-annex is not working for them, or they have a question about using +it. From time to time someone does mention that it's working for them. + +> We have 4 or so machines all synching with each other via the local +> network thing. I'm always amazed when it doesn't just explode :) + +Due to the nature of git-annex, a lot of people can be using it without +anyone knowing about it. Which is great. But these little success stories +can make all the difference. It motivates me to keep pounding out the +development hours, it encourages other people to try it, and it'd be a good +thing to be able to point at if I tried to raise more funding now that I'm +out of Kickstarter money. + +I'm posting my own success story to my main blog: +[git annex and my mom](http://joeyh.name/blog/entry/git_annex_and_my_mom) + +If you have a success story to share, why not blog about it, microblog it, +or just post a comment here, or even send me a private message. Just a +quick note is fine. Thanks! + +---- + +Going through the bug reports and questions today, I ended up fixing +three separate bugs that could break setting up a repo on a remote ssh +server from the webapp. + +Also developed a minimal test case for some gnucash behavior that prevents +the watcher from seeing files it writes out. I understand the problem, +but don't have a fix for that yet. Will have to think about it. (A year ago +today, my blog featured the +[[first_release_of_the_watcher|day_16__more_robust_syncing]].) diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_10_9ddf57b8ae0241268bb33bec1b169e4c._comment b/doc/design/assistant/blog/day_288__success_stories/comment_10_9ddf57b8ae0241268bb33bec1b169e4c._comment new file mode 100644 index 000000000..f53f4b654 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_10_9ddf57b8ae0241268bb33bec1b169e4c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmnG4EuvZWse5hvgrl0XAK-U61e-0iGaao" + nickname="David" + subject="Nothing fancy but..." + date="2013-06-27T16:52:12Z" + content=""" +Hi Joey, + +First, thanks very much for your effort put into git-annex. I store my photos in git-annex and I like it because: + +* I want to store multiple copies of the pictures and I can see where they are, +* I can have a global view of the collection on my laptop without carrying all the files. +* the indirect mode makes it difficult to me to do stupid things. + +So there's nothing fancy, but it works for me very well. From time to time I try the assistant's new features and I'm planning to replace Dropbox eventually. + +Secondly, thanks very much for the dev blog! I was looking forward every morning to see what's coming next, what problems you are facing and how you're planning to solve them. It is simply amazing what you've achieved in the last year and your posts gave me a lot of motivation too (in finishing my thesis :-))! + +Thanks! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_11_50b8a597bd8677608f2ef176443f23f3._comment b/doc/design/assistant/blog/day_288__success_stories/comment_11_50b8a597bd8677608f2ef176443f23f3._comment new file mode 100644 index 000000000..219e1e651 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_11_50b8a597bd8677608f2ef176443f23f3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 11" + date="2013-06-27T18:11:03Z" + content=""" +Excerpt from a [longer comment](http://git-annex.branchable.com/bugs/Problems_with_syncing_gnucash/#comment-7d70d822a0fdf672ba09535f943af7c9) by Florian: + +I know that my expectations in this project are a little bit high and I see how much work it was to get where we are now. Once again thank you for the excellent work done so far. I don't fear to synchronize important data with git-annex. I even use git-annex to backup and synchronize the member database for our club (wannabe hackerspace). +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_12_f2df427cf3608377e9a52d8bdeadb26f._comment b/doc/design/assistant/blog/day_288__success_stories/comment_12_f2df427cf3608377e9a52d8bdeadb26f._comment new file mode 100644 index 000000000..10699c959 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_12_f2df427cf3608377e9a52d8bdeadb26f._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 12" + date="2013-06-27T18:11:45Z" + content=""" +From a mail I received: --[[Joey]] + +Git-annex makes it possible for me to have lots of data. Before I +started using it I had a music library and a few massive tar files, +none of it properly backed up, and occasionally there would be random +corruption (I still have broken mp3s which jump and stutter in places) +because I would carelessly cp them from HDD to HDD. So I'd avoid +actually letting data accumulate; this was inconvenient in itself. +Now git-annex does everything for me. + +Following your development blog, as a novice programmer, has been +really enjoyable and interesting. My only experience of professional +IT has put me of but it's good to see you working through things +methodically and properly. +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_13_8762efed97f21eeba8f0a7be45bd924a._comment b/doc/design/assistant/blog/day_288__success_stories/comment_13_8762efed97f21eeba8f0a7be45bd924a._comment new file mode 100644 index 000000000..3b18645e4 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_13_8762efed97f21eeba8f0a7be45bd924a._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="http://julien.lefrique.name/" + nickname="jlefrique" + subject="Many thanks!" + date="2013-06-27T19:59:47Z" + content=""" +Hi Joey, + +More than ten years ago, I was looking for a software to index the content of all my +CD-ROMs in order to create a kind of \"table of content\". Today there is +git-annex! + +I discovered git-annex few months ago and it really helps me to keep my file +well organized. I missed the first crowd funding campaign but would be happy +to contribute to the next one :D + +I mainly use four different annexes for: + +* my private photos and videos, +* my music collection, +* my other multimedia files (movies...), +* my other files that are too large to be commited into git directly (pdf, binaries...). + +I use git-annex manually via the command line. I started to play with the +assistant on my Android tablet and I plan to install it on my wife's +Macbook to synchronize her data with the NAS. + +A standalone build for arm to run git-annex on my NAS (QNAP 219 PII) would be perfect :-P + +Thank you very much for all your great softwares (yes I also use etckeeper, +some moreutils tools and more recently ikiwiki). + +-Julien + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_14_55e1bb15c3a93d582d110f8173ceefc2._comment b/doc/design/assistant/blog/day_288__success_stories/comment_14_55e1bb15c3a93d582d110f8173ceefc2._comment new file mode 100644 index 000000000..f63dc7b9e --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_14_55e1bb15c3a93d582d110f8173ceefc2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="67.128.198.190" + subject="comment 14" + date="2013-06-28T18:35:55Z" + content=""" +git-annex has been working brilliantly for me. I have been slowly moving content out of the various places I've had it stored (file servers, folders hidden away on all my machines, Dropbox, Google Drive, etc.) into a single git-annex repo. The idea has been to mimic Dropbox's single folder, but with much more flexibility: I sync my working machines, my home fileserver, my VPS (for file access on the go), Android devices, and even a couple of dumb MP3 players from git-annex. Best of all, I have one place to go for all of my files, and if they're not on the device at the moment I need them, they're a download away. I didn't find git-annex until after the first crowdfunding campaign had completed, but if there's another, I would be a happy supporter. + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_15_5749aef8b585b293385b20b75c40f9d8._comment b/doc/design/assistant/blog/day_288__success_stories/comment_15_5749aef8b585b293385b20b75c40f9d8._comment new file mode 100644 index 000000000..cefc5045c --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_15_5749aef8b585b293385b20b75c40f9d8._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="It's been great!" + date="2013-06-29T03:48:08Z" + content=""" +Looks like I started using git-annex in November 2010. + +I'd already been tracking lots of small files in my home directory (settings, scripts, notes, todo list, timesheets, invoices, etc) with git. + +So awesome to get backups, syncing and manual merge conflict resolution. + +git-annex extended that to handle my larger files. git-annex's ability to be selective about what is stored where, allowed my to still be able to git clone my home directory onto small devices (I've got a debian chroot with only 6GB or so, and I installed debian on my new chromebook, that's only got 16GB of disk space (for the whole system.)) + +I love having the full catalog visible on my filesystem with symlinks, and I can just request a file, and git-annex will figure out where to get it from, even if I'm away from home on my laptop. + +I just got a 2nd external hard drive, and I'm delighted with how easy it was to get a backup of everything on there. + +I was able to quickly and safely clear up space on my desktop computer! I'm confident that my data is safe because I've got git-annex configured to make sure there's at least two copies of my videos, and 3 copies of everything else. + +I've finally gone from either keeping hard drives from my past computers or keeping a full copy of the data, to having a proper archiving and backup system for all files I care about. + +I've got over 12,000 files stored on my main annex, and it's perfectly responsive. + +Joey does a great job, and has been very responsive on the rare occasions where I needed help. + +Three cheers! + +-- +Jason +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_16_911c6d2764906cad7d6324835441ed34._comment b/doc/design/assistant/blog/day_288__success_stories/comment_16_911c6d2764906cad7d6324835441ed34._comment new file mode 100644 index 000000000..64d17f872 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_16_911c6d2764906cad7d6324835441ed34._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="thanks!" + date="2013-06-30T13:10:35Z" + content=""" +I'm using git-annex to consolidate all the stuff that accumulated for years on various drives I have. Music I downloaded and bought (don't wanna loose those), photos from 2003 and on, archives of school and work stuff etc. Using it for 6-7 months now, I came to trust git-annex, I very much like the command line robustness it has and I really like that all my files are accessible in a single tree. It would be cool to have some metadata storage (for file dates, tags and such) and maybe spotlight-like search (elastic-search comes to mind).. +Still, without these, it has a great problem-solution fit for me! + +Thanks Joey for all the great work, I really hope you can continue improving it, I would gladly join to a second kickstarter funding! + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_17_eb6aa8af5aa70877255a11d132d51aba._comment b/doc/design/assistant/blog/day_288__success_stories/comment_17_eb6aa8af5aa70877255a11d132d51aba._comment new file mode 100644 index 000000000..0586afab5 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_17_eb6aa8af5aa70877255a11d132d51aba._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="50.23.191.90" + subject="Several annexes managing >3TB. No problems!" + date="2013-07-02T00:12:27Z" + content=""" +I've got an annex with all my DVD ISOs that's nearly 3TB alone, uses the SHA512 hash and gets split over three computers, 6 external SATA drives and 3 USB drives. No errors so far, and the issues with git-annex I've had have all been addressed very quickly (thanks Joey!) and in a non-destructive manner so I don't have to re-init a repo. I also use it to manage my music library, which allows to me to sleep at night without worrying about a corrupted file spreading through all my backups over time since git-annex has a fsck and hashing utility. I can't imagine using anything else for managing collections of files: it offloads the task of keeping track of, getting, verifying, and general management of files so I don't even need to worry about the boring stuff, I just get around to watching/listening to my media collection. + +Thanks for all the work, it's changed my workflow and file management (I get more sleep too)! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_18_9a57de4cea407a73b2d023d85afdccc6._comment b/doc/design/assistant/blog/day_288__success_stories/comment_18_9a57de4cea407a73b2d023d85afdccc6._comment new file mode 100644 index 000000000..1e4277277 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_18_9a57de4cea407a73b2d023d85afdccc6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 18" + date="2013-07-03T15:51:48Z" + content=""" +Another good tweet: --[[Joey]] + +My google Reader replacement: newsbeuter with the data directory stored in an autosynced git-annex repo. + + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_19_1767c86067bee35941004282b96b8e95._comment b/doc/design/assistant/blog/day_288__success_stories/comment_19_1767c86067bee35941004282b96b8e95._comment new file mode 100644 index 000000000..93bfb03e6 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_19_1767c86067bee35941004282b96b8e95._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="176.31.181.25" + subject="Forgot to add..." + date="2013-07-03T19:28:42Z" + content=""" +Forgot to add: I'm horrible at keeping things organized. Git-annex is a huge help with that -- it keeps track of files and the number of their copies. When I first started using it, I had old songs duplicated across 4 drives, while 2 of those drives had old tags and were obsolete, and one drive had the correct tags, but not the correct filenames. Every few years I'd have to go through several TB of media files, hand checking each of them to see what was old, what was unwanted, etc. Once my media libraries got larger than consumer-grade HDD's, I had to find a better solution. Git-annex removes that burden, and keeps things organized for me. Once I get an album or movie I tag/rename it the way I want, throw it in the annex and let my computer do the boring and tedious parts like automatically verifying and making sure there's enough copies. If I change a file, that change propagates through all my repo clones. It wasn't until after I started using git-annex that I realized how stressed out I was getting over simply maintaining a media library. + +If you do another fundraiser you've got my support! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_1_22b28ca3d4d3283ad8c21ae052fb9752._comment b/doc/design/assistant/blog/day_288__success_stories/comment_1_22b28ca3d4d3283ad8c21ae052fb9752._comment new file mode 100644 index 000000000..494cb798a --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_1_22b28ca3d4d3283ad8c21ae052fb9752._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-06-25T22:26:27Z" + content=""" +I've been real quiet cause everything's been working great. :) + +One thing I have not messed with yet is the whole XMPP thing. I mostly don't share between two machines that are online at the same time, I just use git annex for backups and to have content \"optionally\" available. I should give XMPP a try sometime. + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_20_1d47f3e1b9f0081649cedae4288bac83._comment b/doc/design/assistant/blog/day_288__success_stories/comment_20_1d47f3e1b9f0081649cedae4288bac83._comment new file mode 100644 index 000000000..501cf561f --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_20_1d47f3e1b9f0081649cedae4288bac83._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA" + nickname="Joe" + subject="comment 20" + date="2013-07-04T12:41:35Z" + content=""" +I'm using git-annex to make videos, pictures and music available on all my devices (windows, android, linux). It has saved me on trips with my 2yr daughter when she's had meltdowns; I have her favorite movie ready. I quickly exceeded the free dropbox quota and git-annex has replaced the need and gives me greater confidence and control over my data. Thank you! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_21_31d3f58cad83cb1ecc4821a15ca258d8._comment b/doc/design/assistant/blog/day_288__success_stories/comment_21_31d3f58cad83cb1ecc4821a15ca258d8._comment new file mode 100644 index 000000000..99c6c14af --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_21_31d3f58cad83cb1ecc4821a15ca258d8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm0sGxsiJ7yj5iQsF-A5tEl6XKOGQieqEo" + nickname="Matthew" + subject="Writing papers" + date="2013-07-04T15:32:24Z" + content=""" +I'm a graduate student, so I write a lot. I started using git to manage my latex sources a while ago, but I didn't like gumming up my repository with a bunch of figures (large binaries). I was constantly forgetting to scp the latest versions of my figures from here to there (as I do my work on a number of different computers.) Git annex gives me a good way to version the figures and manage them with the same tool I'm using for the text. + +My use case seems pretty far from typical, judging from the other comments here, so I thought I should add my two cents! I'm constantly trying to sell this approach to my fellow students. + +Also, I'm going to slip in a plug for another great Haskell project here -- Pandoc. I work with people who suggest changes to my drafts, but only using Word's \"Track Changes\". So now I'm generating Word docs from Pandoc markdown for my collaborators to edit. When it comes time to publish, I can convert my markdown to latex and clean up the formatting. + +Why are all the really cool projects written in Haskell? :) +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_22_b512bd2bf29dfaab6b36bf204518fdb6._comment b/doc/design/assistant/blog/day_288__success_stories/comment_22_b512bd2bf29dfaab6b36bf204518fdb6._comment new file mode 100644 index 000000000..e7a62fd01 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_22_b512bd2bf29dfaab6b36bf204518fdb6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="git-annex is teh awesome" + date="2013-07-15T12:37:54Z" + content=""" +Just like Git, git-annex is teh awesome. I've used it for almost a year now, and I've never had more control of all my stuff. I store all my valuable (and also not so valuable) files in it, more than a terabyte, and it's rapidly growing. Movies, pictures, recordings, software, podcasts, DVDs and CDs, you name it. It's rock solid with a really good design. Joey says it isn't a backup solution, but I strongly disagree. My data have never been safer. git-annex ensures that I have several copies in different locations, I always know where all the copies are, and the disk space is used way more efficiently now that I don't have unnecessary duplicates everywhere anymore. +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_2_343333356de20e170edb8020faa7400d._comment b/doc/design/assistant/blog/day_288__success_stories/comment_2_343333356de20e170edb8020faa7400d._comment new file mode 100644 index 000000000..768469e3e --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_2_343333356de20e170edb8020faa7400d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Big success!" + date="2013-06-26T07:00:15Z" + content=""" +Annex is working great for me since 8/2012 or something... Using it a lot and the Assistant is awesome! + +If you would raise some more funding, I'd be more than happy to support you once more - really great software! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_3_4e4034bec789543b562ac263df3e21dd._comment b/doc/design/assistant/blog/day_288__success_stories/comment_3_4e4034bec789543b562ac263df3e21dd._comment new file mode 100644 index 000000000..c8ae3d785 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_3_4e4034bec789543b562ac263df3e21dd._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl3A5oeZFLreGhDTFVMOJYIy1auKiTL_ZY" + nickname="Maggie" + subject=":)" + date="2013-06-26T15:04:45Z" + content=""" +Poets aren't humble people. +We revel in our own narcissism. +So being mentioned in my brother's blog +was great for me. + +I am proud of the success of Git Annex. + +(My poems tend to be _much_ better than this.) +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_4_0c52794c77a9b7afc5112f5edf9cb793._comment b/doc/design/assistant/blog/day_288__success_stories/comment_4_0c52794c77a9b7afc5112f5edf9cb793._comment new file mode 100644 index 000000000..f285863f5 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_4_0c52794c77a9b7afc5112f5edf9cb793._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nicolas-schodet.myopenid.com/" + ip="2a01:e35:8ae6:f130:1e4b:d6ff:fe78:1ddb" + subject="Thank you for this great tool!" + date="2013-06-26T18:10:05Z" + content=""" +I use git-annex for my picture collection. I can add pictures from my computers, or my FTP server when someone wants to send me their pictures. Then I push them to my online gallery. Git annex is great to keep all my repository synchronized while not requesting that all my pictures are present on my laptop. Thank you! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_5_7ca419aa3a187857b19268572d5df297._comment b/doc/design/assistant/blog/day_288__success_stories/comment_5_7ca419aa3a187857b19268572d5df297._comment new file mode 100644 index 000000000..1dd6fa4a9 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_5_7ca419aa3a187857b19268572d5df297._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 5" + date="2013-06-26T19:39:15Z" + content=""" +Excerpt from an email I received: --[[Joey]] + +Another story, but without the assistant this time: I've \"designed\" a +small f2f file sharing network with it, I'm using it with a friend to +share accross several computer. This is basically a workflow +with git annex and gitoline, the flexibility of git and the capacities +of git annex just gave us this out of the box. Some specs are here if +you are curious +http://worlddomination.be/ideas/2012/idea-n-21-build-a-f2f-sharing-network-using +-git-annex.html + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_6_3edd56b3b04f19faba8d75cca285a662._comment b/doc/design/assistant/blog/day_288__success_stories/comment_6_3edd56b3b04f19faba8d75cca285a662._comment new file mode 100644 index 000000000..f08fce4b3 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_6_3edd56b3b04f19faba8d75cca285a662._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="andy" + ip="99.127.140.99" + subject="Another success story" + date="2013-06-27T02:03:00Z" + content=""" +I'm using Ubuntu, and I do a clean install about every 6 months when the new versions come out. I also have 2-3 systems I need to keep in sync. I use git annex to store files I want to keep between OS reinstalls, and to sync the various systems I need data on. I also use it to backup data to the cloud and to bup. I have 6+ repos, 235 GB of data, and 31,029 known annex keys (thanks `git annex map` and `git annex status`!); nevertheless git annex is generally pretty cooperative. I'm not using the assistant yet, but I'd like to eventually. I almost don't have to think about the stuff annex handles. It's really fun to install a fresh OS, clone the git annex repo, and have my entire annex directory tree available immediately. + +Thanks Joey! You've done a great job! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_7_146331ae2de25a6dc3595dffab9514de._comment b/doc/design/assistant/blog/day_288__success_stories/comment_7_146331ae2de25a6dc3595dffab9514de._comment new file mode 100644 index 000000000..61d581380 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_7_146331ae2de25a6dc3595dffab9514de._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 7" + date="2013-06-27T06:31:29Z" + content=""" +Amazing tweet I found! --[[Joey]] + +Git-annex now auto-syncing photos from my android phone to a Tor hidden SSH service I control (via @guardianproject's Orbot) #prismbreak + + +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_8_72be9307e75eb120451f3d6ab7c8165e._comment b/doc/design/assistant/blog/day_288__success_stories/comment_8_72be9307e75eb120451f3d6ab7c8165e._comment new file mode 100644 index 000000000..ab482d179 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_8_72be9307e75eb120451f3d6ab7c8165e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk" + nickname="Tim" + subject="Backups" + date="2013-06-27T13:14:43Z" + content=""" +We use rsync and tar to backup to a server on the local network, and since we discoverd git-annex, we use this mechanism to automatically put all this data in both a local bup repo and a remote one. This gives us a daily full backup, with history available, both locally and off-site. Thanks to bup our 4T of data gets deduplicated to about 270G, only a couple of megs get transferred every night, and thanks to git-annex everything just works, like it should! +"""]] diff --git a/doc/design/assistant/blog/day_288__success_stories/comment_9_c27eb0a4181e85a3eed41130402350bf._comment b/doc/design/assistant/blog/day_288__success_stories/comment_9_c27eb0a4181e85a3eed41130402350bf._comment new file mode 100644 index 000000000..cf77845b5 --- /dev/null +++ b/doc/design/assistant/blog/day_288__success_stories/comment_9_c27eb0a4181e85a3eed41130402350bf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlOc-EOD5ZyggsAp6lOnU7x5MxizwLtUXA" + nickname="Hendrik" + subject="more success" + date="2013-06-27T14:09:47Z" + content=""" +Hi, + +I have moved all my photographs to an annex running on a Ubuntu file server while doing photo editing, presenting etc. on my MacBook. The annex is great in selectively moving files between these machines for editing and presentation purposes. I started using it around christmas season last year and added a glacier \"backup\" recently. My statistics: 6 repositories in total, more than 300GB (dedup'd from 380GB), 60.000 local keys. + +What is missing from my point of view (and I would happily join crowd funding): stable windows and android versions, managing selective transfers from the assistant (select folders to be transferred from/to a specific repository), options for running the annex as a server daemon with web GUI (authentication to GUI + fixed URLs, status reports on GUI, etc.). All these would dramatically increase the WAF. +"""]] diff --git a/doc/design/assistant/blog/day_289__back_in_the_swing.mdwn b/doc/design/assistant/blog/day_289__back_in_the_swing.mdwn new file mode 100644 index 000000000..75923f897 --- /dev/null +++ b/doc/design/assistant/blog/day_289__back_in_the_swing.mdwn @@ -0,0 +1,16 @@ +Came up with a fix for the gnucash hard linked file problem that makes the +assistant notice the files gnucash writes. This is not full hard link support; +hard linked files still don't cleanly sync around. But new hard links to +files are noticed and added, which is enough to support gnucash. + +Spent around 4 hours on reproducing and trying to debug +[[bugs/Hanging_on_install_on_Mountain_lion]]. It seems that recent upgrades +of the OSX build machine led to this problem. And indeed, building with an +older version of Yesod and Warp seems to have worked around the problem. So +I updated the OSX build for the last release. I will have to re-install the +new Yesod on my laptop and investigate further -- is this an OSX specific +problem, or does it affect Linux? Urgh, this is the second hang I've +encountered involving Warp.. + +Got several nice [[success stories|day_288__success_stories]], but I don't +think I've seen *yours* yet. ;) Please post! diff --git a/doc/design/assistant/blog/day_290__https_release.mdwn b/doc/design/assistant/blog/day_290__https_release.mdwn new file mode 100644 index 000000000..ea017d217 --- /dev/null +++ b/doc/design/assistant/blog/day_290__https_release.mdwn @@ -0,0 +1,17 @@ +Spent too many hours last night tracking down a bug that caused the webapp +to hang when it got built with the new yesod 1.2 release. Much of that time +was spent figuring out that yesod 1.2 was causing the problem. It turned out to +be a stupid typo in my yesod compatability layer. `liftH = liftH` in +Haskell is an infinite loop, not the stack overflow you get in most +languages. ;) + +Even though it's only been a week since the last release, +that was worth pushing a release out for, which I've just done. +This release is essentially all bug fixes (aside from the automatic +ionice and nicing of the daemon). + +This website is now available over https. Perhaps more importantly, all the +links to download git-annex builds are https by default. + +The [[success_stories|day_288__success_stories]] list is getting really +nice. Only way it could possibly be nicer is if you added your story! Hint. ;) diff --git a/doc/design/assistant/blog/day_291__--all.mdwn b/doc/design/assistant/blog/day_291__--all.mdwn new file mode 100644 index 000000000..0a5584182 --- /dev/null +++ b/doc/design/assistant/blog/day_291__--all.mdwn @@ -0,0 +1,32 @@ +I've felt for a while that git-annex needed better support for managing +the contents of past versions of files that are stored in the annex. I know +some people get confused about whether git-annex even supports old versions +of files (it does, but you should use indirect mode; direct mode doesn't +guarantee old versions of files will be preserved). + +So today I've worked on adding command-line power for managing past +versions: a new `--all` option. + +So, if you want to copy every version of every file in your repository to +an archive, you can run `git annex copy --all --to archive`. +Or if you've got a repository on a drive that's dying, you can run +`git annex copy --all --to newdrive`, and then on the new drive, run `git +annex fsck --all` to check all the data. + +In a bare repository, `--all` is default, so you can run `git annex get` +inside a bare repository and it will try to get every version of every file +that it can from the remotes. + +The tricky thing about `--all` is that since it's operating on objects and +not files, it can't check `.gitattributes` settings, which are tied to the +file name. I worried for a long time that adding `--all` would make +annex.numcopies settings in those files not be honored, and that this would +be a Bad Thing. The solution turns out to be simple: I just didn't +implement `git annex drop --all`! Dropping is the only action that needs to +check numcopies (move can also reduce the number of copies, but explicitly +bypasses numcopies settings). + +I also added an `--unused` option. So if you have a repository that has +been accumulating history, and you'd like to move all file contents not +currently in use to a central server, you can run `git annex unused; git +annex move --unused --to origin` diff --git a/doc/design/assistant/blog/day_291__--all/comment_1_eaa9fef19a035bef9c439e87d47c834b._comment b/doc/design/assistant/blog/day_291__--all/comment_1_eaa9fef19a035bef9c439e87d47c834b._comment new file mode 100644 index 000000000..60cb4abb0 --- /dev/null +++ b/doc/design/assistant/blog/day_291__--all/comment_1_eaa9fef19a035bef9c439e87d47c834b._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 1" + date="2013-07-03T22:16:32Z" + content=""" +Excellent stuff! Another thing I'd like to see is that I find myself doing the following all the time: + + git annex copy --to titan --not --in titan + +Meaning: copy everything to titan that it doesn't already have. This operation is very quick. But I write just: + + git annex copy --to titan + +This operation is extremely slow, since it appears to scan through every file in the repository. Is there a way to have the latter imply the former? I wouldn't ever want to copy a file that it already has anyway... + +"""]] diff --git a/doc/design/assistant/blog/day_291__--all/comment_2_90bbc26bf92048de7cbaf5fb719c9593._comment b/doc/design/assistant/blog/day_291__--all/comment_2_90bbc26bf92048de7cbaf5fb719c9593._comment new file mode 100644 index 000000000..6838ac070 --- /dev/null +++ b/doc/design/assistant/blog/day_291__--all/comment_2_90bbc26bf92048de7cbaf5fb719c9593._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="sfs" + ip="65.204.1.102" + subject="See history of a file" + date="2013-07-07T00:49:35Z" + content=""" +It's great that you are addressing the management of older versions. I am new to git-annex but couldn't find much information about this topic. Is it also possible to make git-annex show you the history of files (with date, size, ...) and where (which repositories) they are stored? Or to retrieve a specific version from a remote repository? + +Thanks for this amazing peace of software! +Stephan +"""]] diff --git a/doc/design/assistant/blog/day_291__--all/comment_3_75006e9909425dcbf86415a9f7c90372._comment b/doc/design/assistant/blog/day_291__--all/comment_3_75006e9909425dcbf86415a9f7c90372._comment new file mode 100644 index 000000000..748db49f3 --- /dev/null +++ b/doc/design/assistant/blog/day_291__--all/comment_3_75006e9909425dcbf86415a9f7c90372._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 3" + date="2013-07-07T17:20:05Z" + content=""" +@john I have considered making copy trust the location log for the remote (which is what your --not --in titan does), but this does change its behavior in a subtly way, and IIRC there were scenarios where this is not desirable. + +@sfs the best way to look at older versions of files is to use `git checkout` to check out an older version of the repository. You can then use `git annex get`, `git annex whereis`, etc like you usually would, on the old version of files. +"""]] diff --git a/doc/design/assistant/blog/day_291__--all/comment_4_5440449bbc5a353f7430f72e19c35e92._comment b/doc/design/assistant/blog/day_291__--all/comment_4_5440449bbc5a353f7430f72e19c35e92._comment new file mode 100644 index 000000000..a4739c5e7 --- /dev/null +++ b/doc/design/assistant/blog/day_291__--all/comment_4_5440449bbc5a353f7430f72e19c35e92._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-07-14T16:03:39Z" + content=""" +@john, @joeyh: I like the fact that normal copy takes some time, but that it _verifies_. Default to save, optimize to quick, imo. +"""]] diff --git a/doc/design/assistant/blog/day_292__bugfixes.mdwn b/doc/design/assistant/blog/day_292__bugfixes.mdwn new file mode 100644 index 000000000..a514afd0e --- /dev/null +++ b/doc/design/assistant/blog/day_292__bugfixes.mdwn @@ -0,0 +1,24 @@ +Actually spread out over several days.. + +I think I have finally comprehensively dealt with all the wacky system +misconfigurations that can make `git commit` complain and refuse to commit. +The last of these is [a system with a FQDN that doesn't have a dot in it](http://git-annex.branchable.com/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/). +I personally think git should just use the hostname as-is in the email +address for commits here -- it's better to be robust. Indeed, I think it +would make more sense if `git commit` never failed, unless it ran out of +disk or the repo is corrupt. But anyway, `git-annex +init` will now detect when the commit fails because of this and put a +workaround in place. + +Fixed a bug in `git annex addurl --pathdepth` when the url's path was +shorter than the amount requested to remove from it. + +Tracked down a bug that prevents git-annex from working on a system with an +old linux kernel. Probably the root cause is that the kernel was built +without EVENTFD support. Found a workaround to get a usable git-annex on +such a system is to build it without the webapp, since that disables the +threaded runtime which triggered the problem. + +Dealt with a lot of Windows bugs. Very happy that it's working well enough +that some users are reporting bugs on it in Windows, and with enough detail +that I have not needed to boot Windows to fix them so far. ;) diff --git a/doc/design/assistant/blog/day_292__bugfixes/comment_1_bbac3878d80f7540d229183c56664784._comment b/doc/design/assistant/blog/day_292__bugfixes/comment_1_bbac3878d80f7540d229183c56664784._comment new file mode 100644 index 000000000..5aafab12d --- /dev/null +++ b/doc/design/assistant/blog/day_292__bugfixes/comment_1_bbac3878d80f7540d229183c56664784._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cweiske.de/" + nickname="cweiske" + subject="comment 1" + date="2013-07-09T06:52:11Z" + content=""" +Thanks for the quick bugfix! +"""]] diff --git a/doc/design/assistant/blog/day_292__bugfixes/comment_2_8c9e5291ceb257f3a938af0ad967c5d7._comment b/doc/design/assistant/blog/day_292__bugfixes/comment_2_8c9e5291ceb257f3a938af0ad967c5d7._comment new file mode 100644 index 000000000..adb161fd0 --- /dev/null +++ b/doc/design/assistant/blog/day_292__bugfixes/comment_2_8c9e5291ceb257f3a938af0ad967c5d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 2" + date="2013-07-09T13:47:20Z" + content=""" +git **used to** use the hostname as-is, but that didn't work out well – many people just kept on committing as `joeyh@kremvax.(none)`, which doesn't make for a good email address or a globally-unique identifier (sometimes by being lazy; sometimes by forgetting to carry their Git config over to a new machine). + +The stricter check was implemented in [8c5b1ae1](https://github.com/gitster/git/commit/8c5b1ae1b26a7512eb29e75391b8b24c0d0439e7) for git v1.8.3. Setting `$EMAIL` or running `git -c user.email=foo@bar` should override it. +"""]] diff --git a/doc/design/assistant/blog/day_292__bugfixes/comment_3_02f875e8edd30f47939249f16d92712b._comment b/doc/design/assistant/blog/day_292__bugfixes/comment_3_02f875e8edd30f47939249f16d92712b._comment new file mode 100644 index 000000000..3d02b447b --- /dev/null +++ b/doc/design/assistant/blog/day_292__bugfixes/comment_3_02f875e8edd30f47939249f16d92712b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 3" + date="2013-07-09T13:48:49Z" + content=""" +(I was wrong about the version; it appears to be v1.7.11.) +"""]] diff --git a/doc/design/assistant/blog/day_293__gpg_builds.mdwn b/doc/design/assistant/blog/day_293__gpg_builds.mdwn new file mode 100644 index 000000000..eb3ccbd25 --- /dev/null +++ b/doc/design/assistant/blog/day_293__gpg_builds.mdwn @@ -0,0 +1,32 @@ +Two gpg fixes today. The OSX Mtn Lion builds were pulling in a build of gpg +that wanted a gpg-agent to be installed in /usr/local or it wouldn't work. +I had to build my own gpg on OSX to work around this. I am pondering making +the OSX dmg builds pull down the gpg source and build their own binary, +so issues on the build system can't affect it. But would really rather not, +since maintaining your own version of every dependency on every +OS is hard (pity about there still being so many OS's without sane package +management). + +On Android, which I have not needed to touch for a month, gpg was built +with --enable-minimal, which turned out to not be necessary and was +limiting the encryption algorythms included, and led to +interoperability problems for some. Fixed that gpg build too. + +Also fixed an ugly bug in the webapp when setting up a rsync repository. +It would configure `~/.ssh/authorized_keys` on the server to force +git-annex-shell to be run. Which doesn't work for rsync. I didn't notice +this before because it doesn't affect ssh servers that already have a ssh +setup that allows accessing them w/o a password. + +Spent a while working on a bug that can occur in a non-utf8 locale +when using special characters in the directory name of a ssh remote. +I was able to reproduce it, but have not worked out how to fix it; encoding +issues like this are always tricky. + +Added something to the walkthrough to help convince people that yes, you +can use tags and branches with git-annex just like with regular git. One of +those things that is so obvious to the developer writing the docs +that it's hard to realize it will be a point of concern. + +Seems like there is a release worth of changes already, so I plan to push +it out tomorrow. diff --git a/doc/design/assistant/blog/day_293__gpg_builds/comment_1_4f152de8ea5aca4ec381d439e2a821f7._comment b/doc/design/assistant/blog/day_293__gpg_builds/comment_1_4f152de8ea5aca4ec381d439e2a821f7._comment new file mode 100644 index 000000000..82563a41d --- /dev/null +++ b/doc/design/assistant/blog/day_293__gpg_builds/comment_1_4f152de8ea5aca4ec381d439e2a821f7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2013-07-09T07:18:09Z" + content=""" +Hi, glad you added the git history and branch info to the walk through. With a 40,000 foot view some of the wording in the docs (whilst correct) may lead to the wrong impression. For example, in the unused data section, there is a sense that it seems bad that data can accumulate and doing a \"git rm\" rather than doing a \"git annex drop\" is a naughty thing to do (I know you don't actually say this). + +I think it needs to made clear that \"removing\" files is more subtle than in a traditional file-system: that there is a choice of deleting from the working tree so that contents remain and can be recovered or removing the file and contents labeled together (a.k.a \"dropping\"). With dropping so pervasive in the docs its easy to think this \"right\" (and only) way. + +I wonder if a \"git annex rm\" which is simply an alias for \"git rm\" might be a good idea for a UI perspective... +"""]] diff --git a/doc/design/assistant/blog/day_293__gpg_builds/comment_2_42f625638638bc875379f6c604d6f673._comment b/doc/design/assistant/blog/day_293__gpg_builds/comment_2_42f625638638bc875379f6c604d6f673._comment new file mode 100644 index 000000000..6f00552e2 --- /dev/null +++ b/doc/design/assistant/blog/day_293__gpg_builds/comment_2_42f625638638bc875379f6c604d6f673._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="LP" + ip="72.227.131.46" + subject="Just to say.." + date="2013-07-10T23:01:56Z" + content=""" +These updates are fantastic. They're great demonstrations of transparency in work, fun to read as a kstarter contributor, and interesting as a copypasta coder. Bravo. +"""]] diff --git a/doc/design/assistant/blog/day_294__release_day.mdwn b/doc/design/assistant/blog/day_294__release_day.mdwn new file mode 100644 index 000000000..b64b91ae5 --- /dev/null +++ b/doc/design/assistant/blog/day_294__release_day.mdwn @@ -0,0 +1,7 @@ +Got the release out, after fixing test suite and windows build breakage. +This release has all the features on the command line side (--all, +--unused, etc), but several bugfixes on the assistant side, and a lot +of Windows bug fixes. + +I've spent this evening adding icons to git-annex on Linux. +Even got the Linux standalone tarball to automatically install icons. diff --git a/doc/design/assistant/blog/day_295__balls_in_the_air.mdwn b/doc/design/assistant/blog/day_295__balls_in_the_air.mdwn new file mode 100644 index 000000000..ebbad2973 --- /dev/null +++ b/doc/design/assistant/blog/day_295__balls_in_the_air.mdwn @@ -0,0 +1,13 @@ +Been keeping several non-coding balls in the air recently, two of which +landed today. + +First, Rsync.net is [offering a discount to all git-annex users](http://www.rsync.net/products/git-annex-pricing.html), +at one third their normal price. +"People using git-annex are clueful and won't be a big support burden for us, +so it's a win-win." +The web app will be updated offer the discount when setting up a rsync.net +repository. + +Secondly, I've recorded an interview today for the Git Minutes podcast, +about git-annex. Went well, looking forward to it going up, probably on +Monday. diff --git a/doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn new file mode 100644 index 000000000..759bde12f --- /dev/null +++ b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn @@ -0,0 +1,41 @@ +Surprise! I'm running a new crowdfunding campaign, which I hope will fund +several more months of git-annex development. + + + +Please don't feel you have to give, but if you do decide to, give +generously. ;) I'm accepting both Paypal and Bitcoin (via CoinBase.com), +and have some rewards that you might enjoy. + +---- + +I came up with two lists of things I hope this campaign will fund. +These are by no means complete lists. First, some general features and +development things: + +* Integrate better with Android. +* Get the assistant and webapp ported to Windows. +* Refine the automated stress testing tools to find and fix more problems + before users ever see them. +* Automatic recovery. Cosmic ray flipped a bit in a file? + USB drive corrupted itself? The assistant should notice these problems, + and fix them. +* Encourage more contributions from others. For example, improve the + special remote plugin interface so it can do everything the native Haskell + interface can do. Eight new cloud storage services were added this year + as plugins, but we can do better! +* Use deltas to reduce bandwidth needed to transfer modified versions of files. + +Secondly, some things to improve security: + +* Add easy support for encrypted git repositories + using [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt), + so you can safely push to a repository on a server you don't control. +* Add support for setting up and using GPG keys in the webapp. +* Add protection to the XMPP protocol to guard against man in the middle + attacks if the XMPP server is compromised. Ie, Google should not be able to + learn about your git-annex repository even if you're using their servers. +* To avoid leaking even the size of your encrypted files to + cloud storage providers, add a mode that stores fixed size chunks. + +It will also, of course, fund ongoing bugfixing, support, etc. diff --git a/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_1_cccad1a5103c504d21d0f8e69bb39e1b._comment b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_1_cccad1a5103c504d21d0f8e69bb39e1b._comment new file mode 100644 index 000000000..71cfd60c4 --- /dev/null +++ b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_1_cccad1a5103c504d21d0f8e69bb39e1b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.73" + subject="Shipping costs" + date="2013-07-15T05:07:07Z" + content=""" +Hi, it doesn't mention anything about offsetting shipping costs for people located outside of the US (like I am). Any chance you could add that? +"""]] diff --git a/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_2_4fef7bd9c8e15cd57df365fadb95717f._comment b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_2_4fef7bd9c8e15cd57df365fadb95717f._comment new file mode 100644 index 000000000..57df8f995 --- /dev/null +++ b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_2_4fef7bd9c8e15cd57df365fadb95717f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.187" + subject="comment 2" + date="2013-07-15T05:26:54Z" + content=""" +Shipping is minimal, either $1 or $1.50 outside the US. It's factored into the reward levels, basically. +"""]] diff --git a/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_3_0b9258a1f5079e53c60138f06d0c63b1._comment b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_3_0b9258a1f5079e53c60138f06d0c63b1._comment new file mode 100644 index 000000000..fc8754502 --- /dev/null +++ b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_3_0b9258a1f5079e53c60138f06d0c63b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3RqHNOKdnMCRF5V4306ON55XyJtQNlpY" + nickname="Marco" + subject="BitSync" + date="2013-07-15T13:11:03Z" + content=""" +How about using torrent to retrive files from a annex, something like BitSync would be great. Nice job Joey! Thank you. +"""]] diff --git a/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_4_46183b97ca904bc06e46569c30db2edc._comment b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_4_46183b97ca904bc06e46569c30db2edc._comment new file mode 100644 index 000000000..3febd091e --- /dev/null +++ b/doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_4_46183b97ca904bc06e46569c30db2edc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="mo' stickers, less problems :)" + date="2013-07-16T09:56:03Z" + content=""" +Hi Joey, since shipping would burn 10-15% of my funding, I added another $10, so you can just batch the stickers together. I hope it's cheaper this way.. Thanks! +"""]] diff --git a/doc/design/assistant/blog/day_297__back_to_work.mdwn b/doc/design/assistant/blog/day_297__back_to_work.mdwn new file mode 100644 index 000000000..c8dbedc45 --- /dev/null +++ b/doc/design/assistant/blog/day_297__back_to_work.mdwn @@ -0,0 +1,16 @@ +It looks like I'm funded for at least the next 9 months! It would still be +nice to get to a year. ;) + +Working to get caught up on recent bug reports.. + +Made `git annex uninit` not nuke anything that's left over in +`.git/annex/objects` after unannexing all the files. After all, that could +be important old versions of files or deleted file, and just because the +user wants to stop using git-annex, doesn't mean git-annex shouldn't try to +protect that data with its dying breath. So it prints out some suggestions +in this case, and leaves it up to the user to decide what to do with the +data. + +Fixed the Android autobuilder, which had stopped including the webapp. + +Looks like another autobuilder will be needed for OSX 10.9. diff --git a/doc/design/assistant/blog/day_297__back_to_work/comment_1_e300feb821bfe7b76b2cec4376d16ffa._comment b/doc/design/assistant/blog/day_297__back_to_work/comment_1_e300feb821bfe7b76b2cec4376d16ffa._comment new file mode 100644 index 000000000..4e0042ed5 --- /dev/null +++ b/doc/design/assistant/blog/day_297__back_to_work/comment_1_e300feb821bfe7b76b2cec4376d16ffa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="uninit" + date="2013-07-16T23:43:38Z" + content=""" +Hah, that bit me in the butt when I first started experimenting with git-annex. I didn't lose anything, but it taught me a very important lesson (that I've had to learn many a time). +"""]] diff --git a/doc/design/assistant/blog/day_298__exceptional.mdwn b/doc/design/assistant/blog/day_298__exceptional.mdwn new file mode 100644 index 000000000..6be34821e --- /dev/null +++ b/doc/design/assistant/blog/day_298__exceptional.mdwn @@ -0,0 +1,21 @@ +Theme today seems to be fun with exceptions. + +Fixed an uncaught exception that could crash the assistant's Watcher thread +if just the right race occurred. + +Also fixed it to not throw an exception if another process is +already transferring a file. What this means is that if you run multiple +`git annex get` processes on the same files, they'll cooperate in each +picking their own files to get and download in parallel. (Also works for +copy, etc.) Especially useful when downloading from an encrypted remote, +since often one process will be decrypting a file while the other is +downloading the next file. There is still room for improvement here; +a -jN option could better handle ensuring N downloads ran concurrently, and +decouple decryption from downloading. But it would need the output layer to +be redone to avoid scrambled output. (All the other stuff to make parallel +git-annex transfers etc work was already in place for a long time.) + +---- + +Campaign update: Now funded for nearly 10 months, and aiming for a year. + diff --git a/doc/design/assistant/blog/day_299__bugfixing.mdwn b/doc/design/assistant/blog/day_299__bugfixing.mdwn new file mode 100644 index 000000000..274615191 --- /dev/null +++ b/doc/design/assistant/blog/day_299__bugfixing.mdwn @@ -0,0 +1,8 @@ +Succeeded fixing a few bugs today, and followed up on a lot of other ones.. + +Fixed checking when content is present in a non-bare repository accessed via +http. + +My changes a few days ago turned out to make uninit leave hard links behind +in .git/annex. Luckily the test suite caught this bug, and it was easily +fixed by making uninit delete objects with 2 or more hard links at the end. diff --git a/doc/design/assistant/blog/day_2__races.mdwn b/doc/design/assistant/blog/day_2__races.mdwn new file mode 100644 index 000000000..19f868a71 --- /dev/null +++ b/doc/design/assistant/blog/day_2__races.mdwn @@ -0,0 +1,45 @@ +Last night I got `git annex watch` to also handle deletion of files. +This was not as tricky as feared; the key is using `git rm --ignore-unmatch`, +which avoids most problematic situations (such as a just deleted file +being added back before git is run). + +Also fixed some races when `git annex watch` is doing its startup scan of +the tree, which might be changed as it's being traversed. Now only one +thread performs actions at a time, so inotify events are queued up during +the scan, and dealt with once it completes. It's worth noting that inotify +can only buffer so many events .. Which might have been a problem except +for a very nice feature of Haskell's inotify interface: It has a thread +that drains the limited inotify buffer and does its own buffering. + +---- + +Right now, `git annex watch` is not as fast as it could be when doing +something like adding a lot of files, or deleting a lot of files. +For each file, it currently runs a git command that updates the index. +I did some work toward coalescing these into one command (which `git annex` +already does normally). It's not quite ready to be turned on yet, +because of some races involving `git add` that become much worse +if it's delayed by event coalescing. + +---- + +And races were the theme of today. Spent most of the day really +getting to grips with all the fun races that can occur between +modification happening to files, and `git annex watch`. The [[inotify]] +page now has a long list of known races, some benign, and several, +all involving adding files, that are quite nasty. + +I fixed one of those races this evening. The rest will probably involve +moving away from using `git add`, which necessarily examines the file +on disk, to directly shoving the symlink into git's index. + +BTW, it turns out that `dvcs-autosync` has grappled with some of these same +races: +I hope that `git annex watch` will be in a better place to deal with them, +since it's only dealing with git, and with a restricted portion of it +relevant to git-annex. + +It's important that `git annex watch` be rock solid. It's the foundation +of the git annex assistant. Users should not need to worry about races +when using it. Most users won't know what race conditions are. If only I +could be so lucky! diff --git a/doc/design/assistant/blog/day_300__new_logo.mdwn b/doc/design/assistant/blog/day_300__new_logo.mdwn new file mode 100644 index 000000000..9e13c4b13 --- /dev/null +++ b/doc/design/assistant/blog/day_300__new_logo.mdwn @@ -0,0 +1,36 @@ +git-annex has a new nicer versions of its [[logo]], thanks to John Lawrence. + +Finally tracked down a week-old bug about the watcher crashing. It turned +out to crash when it encountered a directory containing a character that's +invalid in the current locale. I've noticed that 'ü' is often the character I +get bug reports about. After reproducing the bug I quickly tracked it down +to code in the haskell hinotify library, and sent in a patch. + +Also uploaded a fixed hinotify to Debian, and deployed it to all 3 of the +autobuilder chroots. That took much more time than actually fixing the bug. +Quite a lot of yak shaving went on actually. Oh well. The Linux +autobuilders are updated to use Debian unstable again, which is nice. + +Fixed a bug that prevented annex.diskreserve to be honored when storing +files encrypted in a directory special remote. + +Taught the webapp the difference between initializing a new special remote +and enabling an existing special remote, which fixed some bad behavior when +it got confused. + +---- + +And then for the really fun bug of the day! A user sent me a large file +which badly breaks git annex add. Adding the file causes a symlink to be +set up, but the file's content is not stored in the annex. Indeed, it's +deleted. This is the first data loss bug since January 2012. + +Turns out it was caused by the code that handles the dummy files git uses +in place of symlinks on FAT etc filesystems. Code that had no business +running when `core.symlinks=true`. Code that was prone to false positives +when looking at a tarball of a git-annex repository. So I put in multiple +fixes for this bug. I'll be making a release on Monday. + +---- + +Today's work was sponsored by Mikhail Barabanov. Thanks, Mikhail! diff --git a/doc/design/assistant/blog/day_300__new_logo/comment_1_9fc64e33863b9fce00f6a03417a91e36._comment b/doc/design/assistant/blog/day_300__new_logo/comment_1_9fc64e33863b9fce00f6a03417a91e36._comment new file mode 100644 index 000000000..714fbc825 --- /dev/null +++ b/doc/design/assistant/blog/day_300__new_logo/comment_1_9fc64e33863b9fce00f6a03417a91e36._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://launchpad.net/~mikapflueger" + nickname="mikapflueger" + subject="The dreaded "ü"" + date="2013-07-21T20:56:30Z" + content=""" +Yeah, with the last name of \"Pflüger\" I also usually find bugs having to do with the letter \"ü\". (-; +I guess it is simply one of the more frequent german umlauts, especially in names (the classic \"Müller\", which is one of the most common last names in Germany). And apparently the German cabal strikes here again. +"""]] diff --git a/doc/design/assistant/blog/day_300__new_logo/comment_2_e8aac0298f90004e81492d2c7f85eda0._comment b/doc/design/assistant/blog/day_300__new_logo/comment_2_e8aac0298f90004e81492d2c7f85eda0._comment new file mode 100644 index 000000000..b4bd78e3c --- /dev/null +++ b/doc/design/assistant/blog/day_300__new_logo/comment_2_e8aac0298f90004e81492d2c7f85eda0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Horns?" + date="2013-07-31T19:53:51Z" + content=""" +I don't necessarily mean this as a criticism, just an observation. I wasn't a big fan of the old logo, but this new one looks like it has horns. Or a bit like a pitchfork. +"""]] diff --git a/doc/design/assistant/blog/day_300__new_logo/comment_3_6308c767f6e4bf090102191c91520d04._comment b/doc/design/assistant/blog/day_300__new_logo/comment_3_6308c767f6e4bf090102191c91520d04._comment new file mode 100644 index 000000000..beb5e281e --- /dev/null +++ b/doc/design/assistant/blog/day_300__new_logo/comment_3_6308c767f6e4bf090102191c91520d04._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 3" + date="2013-07-31T20:03:13Z" + content=""" +I think the arrows are a bit too pointy. If someone wants to adjust the svg to make the arrows have a bit more of a rounded feel like in the old logo, that'd be fine by me. +"""]] diff --git a/doc/design/assistant/blog/day_301__direct_unannex.mdwn b/doc/design/assistant/blog/day_301__direct_unannex.mdwn new file mode 100644 index 000000000..c227607d6 --- /dev/null +++ b/doc/design/assistant/blog/day_301__direct_unannex.mdwn @@ -0,0 +1,21 @@ +No release today after all. Unexpected bandwidth failure. Maybe in a few +days.. + +Got unannex and uninit working in direct mode. This is one of the more +subtle parts of git-annex, and took some doing to get it right. +Surprisingly, unannex in direct mode actually turns out to be faster than +in indirect mode. In direct mode it doesn't have to immediately commit the +unannexing, it can just stage it to be committed later. + +Also worked on the ssh connection caching code. The perrennial problem with +that code is that the fifo used to communicate with ssh has a small limit +on its path, somewhere around 100 characters. This had caused problems when +the hostname was rather long. I found a way to avoid needing to be able to +reverse back from the fifo name to the hostname, and this let me take the +md5sum of long hostnames, and use that shorter string for the fifo. + +Also various other bug followups. + +---- + +[Campaign](https://campaign.joeyh.name/) is almost to 1 year! diff --git a/doc/design/assistant/blog/day_302_release_day.mdwn b/doc/design/assistant/blog/day_302_release_day.mdwn new file mode 100644 index 000000000..d9dd9ec55 --- /dev/null +++ b/doc/design/assistant/blog/day_302_release_day.mdwn @@ -0,0 +1,6 @@ +Got the release out. + +I've been working on fleshing out +the [[timeline|/design/assistant]] for the next year. +Including a fairly detailed set of things I want to do around +[[/design/assistant/disaster_recovery]] in the assistant. diff --git a/doc/design/assistant/blog/day_302_release_day/comment_1_fe6e572ba706e95188463d9f3e004d03._comment b/doc/design/assistant/blog/day_302_release_day/comment_1_fe6e572ba706e95188463d9f3e004d03._comment new file mode 100644 index 000000000..86984c478 --- /dev/null +++ b/doc/design/assistant/blog/day_302_release_day/comment_1_fe6e572ba706e95188463d9f3e004d03._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmnG4EuvZWse5hvgrl0XAK-U61e-0iGaao" + nickname="David" + subject="Broken dependencies on Debian wheezy " + date="2013-07-24T07:21:18Z" + content=""" +Hi Joey, +Having installed this release (x86_64) on Debian wheezy I get the following error when I try to run git-annex: + + git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by git-annex) + git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by $HOME/.local/share/git-annex//usr/lib/x86_64-linux-gnu/libidn.so.11) + +etc. for at least a dozen libraries. Different libs try to find different glibc version (2.14, 2.15, 2.16, 2.17). Previous releases were linked with GLIBC_2.13. + + + +"""]] diff --git a/doc/design/assistant/blog/day_303__oops.mdwn b/doc/design/assistant/blog/day_303__oops.mdwn new file mode 100644 index 000000000..639e96de8 --- /dev/null +++ b/doc/design/assistant/blog/day_303__oops.mdwn @@ -0,0 +1,8 @@ +Seems I forgot why I was using debian stable chroots to make the +autobuilds: Lots of people still using old glibc version. Had to rebuild +the stable chroots that I had upgraded to unstable. Wasted several hours.. +I was able to catch up on recent traffic in between. + +Was able to reproduce a bug where `git annex initremote` hung with some +encrypted special remotes. Turns out to be a deadlock when it's not built +with the threaded GHC runtime. So I've forced that runtime to be used. diff --git a/doc/design/assistant/blog/day_304__dropunused_safety.mdwn b/doc/design/assistant/blog/day_304__dropunused_safety.mdwn new file mode 100644 index 000000000..28f5dc13c --- /dev/null +++ b/doc/design/assistant/blog/day_304__dropunused_safety.mdwn @@ -0,0 +1,28 @@ +The big news: Important behavior change in `git annex dropunused`. Now it +checks, just like `git annex drop`, that it's not dropping the last copy of +the file. So to lose data, you have to use `--force`. This continues the +recent theme of making git-annex hold on more tenaciously to old data, and +AFAIK it was the last place data could be removed without `--force`. + +Also a nice little fix to `git annex unused` so it doesn't identify +temporary files as unused if they're being used to download a file. +Fixing it was easy thanks to all the transfer logs and locking +infrastucture built for the assistant. + +Fixed a bug in the assistant where even though syncing to a network +remote was disabled, it would still sync with it every hour, or whenever +a network connection was detected. + +Working on some direct mode scalability problems when thousands of the +identical files are added. Fixing this may involvie replacing the current +simple map files with something more scalable like a sqllite database. + +While tracking that down, I also found a bug with adding a ton of files +in indirect mode, that could make the assistant stall. +Turned out to be a laziness problem. (Worst kind of Haskell bug.) Fixed. + +---- + +Today's sponsor is my sister, Anna Hess, who incidentially just put +the manuscript of her latest ebook in the family's annex prior to its +publication on Amazon this weekend. diff --git a/doc/design/assistant/blog/day_304__dropunused_safety/comment_1_1bbcf6c74b6437c44ff8604401fb1432._comment b/doc/design/assistant/blog/day_304__dropunused_safety/comment_1_1bbcf6c74b6437c44ff8604401fb1432._comment new file mode 100644 index 000000000..d69777090 --- /dev/null +++ b/doc/design/assistant/blog/day_304__dropunused_safety/comment_1_1bbcf6c74b6437c44ff8604401fb1432._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlUbH3eytydcwlWqv8oauE2Jg4NwcV9uA0" + nickname="Anna" + subject="A good day to be the sponsor!" + date="2013-07-27T12:31:27Z" + content=""" +Thanks for mentioning me! I like being responsible for not allowing things to be deleted accidentally --- just my kind of feature. :-) + +As a shameless plug, here's the ebook mentioned above for those of you not privy to the family annex: http://www.amazon.com/Root-Cellar-Vegetables-Simplicity-ebook/dp/B00E6EGS0M/ +"""]] diff --git a/doc/design/assistant/blog/day_305__interesting_bugs.mdwn b/doc/design/assistant/blog/day_305__interesting_bugs.mdwn new file mode 100644 index 000000000..8b76c929d --- /dev/null +++ b/doc/design/assistant/blog/day_305__interesting_bugs.mdwn @@ -0,0 +1,21 @@ +Worked on 3 interesting bugs today. One I noticed myself while doing tests +with adding many thousands of files yesterday. Assistant was delaying +making a last commit of the batch of files, and would only wake up and +commit them after a further change was made. Turns out this bug was +introduced in April while improving commit batching when making very large +commits. I seem to remember someone mentioning this problem at some point, +but I have not been able to find a bug report to close. + +Also tried to reproduce [[this_bug|bugs/utf8]]. Frustrating, because I'm +quite sure I have made changes that will avoid it happening again, +but since I still don't know what the root cause was, I can't let it go. + +The last bug is +[[non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status]] +and is a most strange thing. Still trying to get a handle on multiple +aspects of it. + +Also various other bug triage. Down to only 10 messages in my git-annex +folder. That included merging about a dozen bugs about +local pairing, that all seem to involve git-annex-shell not being found in +path. Something is up with that.. diff --git a/doc/design/assistant/blog/day_306__offtopic.mdwn b/doc/design/assistant/blog/day_306__offtopic.mdwn new file mode 100644 index 000000000..cf96401d5 --- /dev/null +++ b/doc/design/assistant/blog/day_306__offtopic.mdwn @@ -0,0 +1,2 @@ +Technically offtopic, but did a fun side project today: + diff --git a/doc/design/assistant/blog/day_307__buuuugs.mdwn b/doc/design/assistant/blog/day_307__buuuugs.mdwn new file mode 100644 index 000000000..9cc4cae58 --- /dev/null +++ b/doc/design/assistant/blog/day_307__buuuugs.mdwn @@ -0,0 +1,31 @@ +Back to bug squashing. Fixed several, including a long-standing problem on +OSX that made the app icon seem to "bounce" or not work. Followed up on a +bunch more. + +The 4.20130723 git-annex release turns out to have broken support for +running on crippled filesystems (Android, Windows). `git annex sync` will +add dummy symlinks to the annex as if they were regular files, which is +not good! +[Recovery instructions](http://git-annex.branchable.com/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/#comment-5d80649f9da85ac2fb505445a41207f5) +I've updated the Android and Windows builds and recommend an immediate upgrade. +Will make a formal release on Friday. + +Spent some time improving the test suite on Windows, to catch this bug, +and fix a bug that was preventing it from testing `git annex sync` on +Windows. + +---- + +I am getting very frustrated with this "unknown UUID" problem that a dozen +people have reported. So far nobody has given me enough information to +reproduce the problem. It seems to have something to do with +`git-annex-shell` not being found on the remote system that has been either +local paired with or is being used as a ssh server, but I don't yet +understand what. I have spent hours today trying various scenarios to break +git-annex and get this problem to happen. + +I certainly can improve the webapp's behavior when a repository's UUID is +not known. The easiest fix would be to simply not display such +repositories. Or there could be a UI to try to get the UUID. +But I'm more interested in fixing the core problem than putting +in a UI bandaid. diff --git a/doc/design/assistant/blog/day_308__ssh-agent.mdwn b/doc/design/assistant/blog/day_308__ssh-agent.mdwn new file mode 100644 index 000000000..e18ff2ec1 --- /dev/null +++ b/doc/design/assistant/blog/day_308__ssh-agent.mdwn @@ -0,0 +1,16 @@ +Turns out ssh-agent is the cause of the unknown UUID bug! I got a tip +about this from a user, and was quickly able to reproduce the bug that had +eluded me so long. Anyone who has run `ssh-add` and is using ssh-agent +would see the bug. + +It was easy enough to fix as it turns out. Just need to set IdentitiesOnly +in .ssh/config where git-annex has set up its own IdentityFile to ensure +that its special purpose ssh key is used rather than whatever key the +ssh-agent has loaded into it. I do wonder why ssh behaves this way -- why +would I set an IdentityFile for a host if I didn't want ssh to use it? + +Spent the rest of the day cleaning up after the bug. Since this affects so +many people, I automated the clean up process. The webapp will +detect repositories with this problem, and the user just has to click to +clean up. It'll then correct their .ssh/config and re-enable the +repository. diff --git a/doc/design/assistant/blog/day_308__ssh-agent/comment_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment b/doc/design/assistant/blog/day_308__ssh-agent/comment_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment new file mode 100644 index 000000000..a40921ef6 --- /dev/null +++ b/doc/design/assistant/blog/day_308__ssh-agent/comment_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://launchpad.net/~mikapflueger" + nickname="mikapflueger" + subject="Thank you so much!" + date="2013-08-01T01:13:51Z" + content=""" +This behaviour of ssh has bugged me for years now (I even think it is an information leak – ssh offers basically all my public ssh keys to every server I try to connect to, even though that public key might be confidential). Although it had nothing to do with git-annex, you helped me a _lot_ by pointing me towards IdentitiesOnly. Really a nice setting! + +Cheers, + +Mika +"""]] diff --git a/doc/design/assistant/blog/day_309__filenames.mdwn b/doc/design/assistant/blog/day_309__filenames.mdwn new file mode 100644 index 000000000..30c9b516c --- /dev/null +++ b/doc/design/assistant/blog/day_309__filenames.mdwn @@ -0,0 +1,17 @@ +Today was a nice reminder that there are no end of bugs lurking in filename +handling code. + +First, fixed a bug that prevented git-annex from adding +filenames starting with ":", because that is a special character to git. + +Second, discovered that git 1.8.4 rc0 has changed `git-cat-file --batch` in +a way that makes it impossible to operate on filenames containing spaces. +This is, IMHO, a reversion, so hopefully my +[bug report](http://bugs.debian.org/718517) will get it fixed. + +Put in a workaround for that, although using the broken version of git +with a direct mode repository with lots of spaces in file or directory +names is going to really slow down git-annex, since it often has to fork a +new git cat-file process for each file. + +Release day tomorrow.. diff --git a/doc/design/assistant/blog/day_310__release_day.mdwn b/doc/design/assistant/blog/day_310__release_day.mdwn new file mode 100644 index 000000000..1a8a84a66 --- /dev/null +++ b/doc/design/assistant/blog/day_310__release_day.mdwn @@ -0,0 +1,18 @@ +Got the release out, with rather a lot of fiddling to fix broken builds on +various platforms. + +Also released a backport to Debian stable. This backport has the assistant, +although without WebDAV support. Unfortunately it's an old version from +May, since ghc transitions and issues have kept newer versions out of +testing so far. Hope that will clear up soon (probably by dropping haskell +support for s390x), and I can update it to a newer version. +If nothing else it allows using direct mode with Debian stable. + +Pleased that the git-cat-files bug was quickly fixed by Peff and has +already been pulled into Junio's release tree! + +---- + +This evening, I've added an interface around the new improved +`git check-ignore` in git 1.8.4. The assistant can finally honor `.gitignore` +files! diff --git a/doc/design/assistant/blog/day_310__release_day/comment_1_1e008583cebd8e373e83729529914db7._comment b/doc/design/assistant/blog/day_310__release_day/comment_1_1e008583cebd8e373e83729529914db7._comment new file mode 100644 index 000000000..749f77d9d --- /dev/null +++ b/doc/design/assistant/blog/day_310__release_day/comment_1_1e008583cebd8e373e83729529914db7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="This makes me happy :-)" + date="2013-08-04T00:46:25Z" + content=""" +Glad my work was worth the effort. Thanks for that. +"""]] diff --git a/doc/design/assistant/blog/day_311__Windows_porting.mdwn b/doc/design/assistant/blog/day_311__Windows_porting.mdwn new file mode 100644 index 000000000..fe14a6e4b --- /dev/null +++ b/doc/design/assistant/blog/day_311__Windows_porting.mdwn @@ -0,0 +1,10 @@ +Made two big improvements to the Windows port, in just a few hours. +First, got gpg working, and encrypted special remotes work on Windows. +Next, fixed a permissions problem that was breaking removing files +from directory special remotes on Windows. +(Also cleaned up a lot of compiler warnings on Windows.) + +I think I'm almost ready to move the Windows port from alpha to beta +status. The only really bad problem that I know of with using it is that +due to a lack of locking, it's not safe to run multiple git-annex +commands at the same time in Windows. diff --git a/doc/design/assistant/blog/day_311__Windows_porting/comment_1_8e738f54a72557bee1e19970472b925c._comment b/doc/design/assistant/blog/day_311__Windows_porting/comment_1_8e738f54a72557bee1e19970472b925c._comment new file mode 100644 index 000000000..9f4bf2284 --- /dev/null +++ b/doc/design/assistant/blog/day_311__Windows_porting/comment_1_8e738f54a72557bee1e19970472b925c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o" + nickname="Dominik" + subject="That's amazing..." + date="2013-08-17T11:18:05Z" + content=""" +...so pretty soon my bi-directional Mac <-> Win Git-Annex-Assitant sync via rsync.net will work without a VM on Windows :-) +"""]] diff --git a/doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn b/doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn new file mode 100644 index 000000000..40c38aed4 --- /dev/null +++ b/doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn @@ -0,0 +1,30 @@ +Wow, 11 days off! I was busy with first dentistry and then DebConf. + +Yesterday I [visited CERN](http://joeyh.name/blog/entry/words_fail_me/) and +got to talk with some of their IT guys about how they manage their tens of +petabytes of data. Interested to hear they also have the equivilant of a +per-subdirectory annex.numcopies setting. OTOH, they have half a billion +more files than git's index file is likely to be able to scale to support. ;) + +Pushed a release out today despite not having many queued changes. +Also, I got git-annex migrated to Debian testing, and so was also +able to update the wheezy backport to a just 2 week old version. + +Today is also the last day of the [campaign](https://campaign.joeyh.name/)! + +---- + +There has been a ton of discussion about git-annex here at DebConf, +including 3 BoF sessions that mostly focused on it, among other git stuff. +Also, RichiH will be presenting his +"[Gitify Your Life](http://penta.debconf.org/dc13_schedule/events/1025.en.html)" +talk on Friday; you can catch it on the [live stream](http://blog.debconf.org/blog/2013/08/14#hl_dc13_recordings). + +I've also had a continual stream of in-person bug and feature requests. +(Mostly features.) +These have been added to the wiki and I look forward to working on that +backlog when I get home. + +As for coding, I am doing little here, but I do have a branch cooking that +adds some options to `git annex import` to control handling of duplicate +files. diff --git a/doc/design/assistant/blog/day_313__back.mdwn b/doc/design/assistant/blog/day_313__back.mdwn new file mode 100644 index 000000000..28c7f971d --- /dev/null +++ b/doc/design/assistant/blog/day_313__back.mdwn @@ -0,0 +1,34 @@ +Back home. I have some 170 messages of backlog to attend to. Rather than +digging into that on my first day back, I spent some time implementing some +new features. + +`git annex import` has grown three options that help managing importing of +duplicate files in different ways. I started work on that last week, but +didn't have time to find a way to avoid the `--deduplicate` option +checksumming each imported file twice. Unfortunately, I have still not +found a way I'm happy with, so it works but is not as efficient as it could +be. + +`git annex mirror` is a new command suggested to me by someone at DebConf +(they don't seem to have filed the requested todo). It arranges for two +repositories to contain the same set of files, as much as possible (when +numcopies allows). So for example, `git annex mirror --to otherdrive` +will make the otherdrive remote have the same files present and not present +as the local repository. + +I am thinking about expanding `git annex sync` with an option to also sync +data. I know some find it confusing that it only syncs the git metadata +and not the file contents. That still seems to me to be the best and most +flexible behavior, and not one I want to change in any case since +it would be most unexpected if `git annex sync` downloaded a lot of stuff +you don't want. But I can see making `git annex sync --data` download +all the file contents it can, as well as uploading all available file +contents to each remote it syncs with. And `git annex sync --data --auto` +limit that to only the preferred content. Although perhaps +these command lines are too long to be usable? + +---- + +With the campaign more or less over, I only have a little over a week +before it's time to dive into the first big item on the roadmap. Hope +to be through the backlog by then. diff --git a/doc/design/assistant/blog/day_313__back/comment_1_fbf3fdf9688c18156753d446facd942d._comment b/doc/design/assistant/blog/day_313__back/comment_1_fbf3fdf9688c18156753d446facd942d._comment new file mode 100644 index 000000000..7230a1568 --- /dev/null +++ b/doc/design/assistant/blog/day_313__back/comment_1_fbf3fdf9688c18156753d446facd942d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="77.247.181.162" + subject="comment 1" + date="2013-08-20T22:42:46Z" + content=""" +I wouldn't worry about the commands being too long. If they're used often enough, they'll get aliased. + +alias GASDA='git annex sync --data --auto' +"""]] diff --git a/doc/design/assistant/blog/day_314__quvi.mdwn b/doc/design/assistant/blog/day_314__quvi.mdwn new file mode 100644 index 000000000..3c38e427d --- /dev/null +++ b/doc/design/assistant/blog/day_314__quvi.mdwn @@ -0,0 +1,27 @@ +Made some good progress on the backlog today. Fixed some bugs, applied some +patches. Noticing that without me around, things still get followed up +on, to a point, for example incomplete test cases for bugs get corrected so +they work. This is a very good thing. Community! + +I had to stop going through the backlog when I got to one message from +Anarcat mentioning [quvi](http://quvi.sourceforge.net/). That turns +out to be just what is needed to implement the often-requested feature +of `git-annex addurl` supporting YouTube and other similar sites. So I +spent the rest of the day making that work. For example: + +
+% git annex addurl --fast 'http://www.youtube.com/watch?v=1mxPFHBCfuU&list=PL4F80C7D2DC8D9B6C&index=1'
+addurl Star_Wars_X_Wing__Seth_Green__Clare_Grant__and_Mike_Lamond_Join_Wil_on_TableTop_SE2E09.webm ok
+
+ +Yes, that got the video title and used it as the filename, and yes, +I can commit this file and run `git annex get` later, and it will be +able to go download the video! I can even use `git annex fsck --fast` +to make sure YouTube still has my videos. Awesome. + +The great thing about quvi is it takes the url to a video webpage, and +returns an url that can be used to download the actual video file. So it +simplifies ugly flash videos as far out of existence as is possible. +However, since the direct url to the video file may not keep working for long. +addurl actually records the page's url, with an added indication that quvi +should be used to get it. diff --git a/doc/design/assistant/blog/day_314__quvi/comment_1_3fdfb0742cb5422530ddd97b904f2a42._comment b/doc/design/assistant/blog/day_314__quvi/comment_1_3fdfb0742cb5422530ddd97b904f2a42._comment new file mode 100644 index 000000000..797d25101 --- /dev/null +++ b/doc/design/assistant/blog/day_314__quvi/comment_1_3fdfb0742cb5422530ddd97b904f2a42._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="New YouTube problems" + date="2013-09-05T03:45:16Z" + content=""" +Joey, you may notice eventually that YouTube is moving some videos, especially long ones, to a new format called DASH, which splits them up into smaller parts; unfortunately, it also delivers the audio as a separate file, requiring something like ffmpeg to merge it with the video. I don't know anything about quvi, but youtube-dl recently added support for DASH. It's a Python program that's packaged in Debian, but it can also update itself if you install it locally, which is helpful if Debian is frozen... Anyway, if you need it in the future, youtube-dl might be helpful. +"""]] diff --git a/doc/design/assistant/blog/day_315__backlog.mdwn b/doc/design/assistant/blog/day_315__backlog.mdwn new file mode 100644 index 000000000..ec0ee33be --- /dev/null +++ b/doc/design/assistant/blog/day_315__backlog.mdwn @@ -0,0 +1,12 @@ +After a couple days plowing through it, my backlog is down to 30 messages +from 150. And most of what's left is legitimate bugs and todo items. + +Spent a while today on an ugly file descriptor leak in the assistant's +local pairing listener. This was an upstream bug in the network-multicast +library, so while I've written a patch to fix it, the fix isn't quite +deployed yet. The file descriptor leak happens when the assistant is +running and there is no network interface that supports multicast. +I was able to reproduce it by just disconnecting from wifi. + +Meanwhile, guilhem has been working on patches that promise to massively +speed up `git annex unused`! I will be reviewing them tonight. diff --git a/doc/design/assistant/blog/day_316__day_off.mdwn b/doc/design/assistant/blog/day_316__day_off.mdwn new file mode 100644 index 000000000..b26118b17 --- /dev/null +++ b/doc/design/assistant/blog/day_316__day_off.mdwn @@ -0,0 +1,6 @@ +Today was a day off, really. However, I have a job running to try to +build get a version of ghc-android that works on newer Android releases. + +Also, guilhem's `git annex unused` speedup patch landed. The results are +extrordinary -- speedups on the order of 50 to 100 times faster should +not be uncommon. Best of all (for me), it still runs in constant memory! diff --git a/doc/design/assistant/blog/day_317__misc.mdwn b/doc/design/assistant/blog/day_317__misc.mdwn new file mode 100644 index 000000000..e2acf2168 --- /dev/null +++ b/doc/design/assistant/blog/day_317__misc.mdwn @@ -0,0 +1,17 @@ +Spent a while tracking down a bug that causes a crash on OSX when setting +up an XMPP account. I managed to find a small test case that reliably +crashes, and sent it off to the author of the haskell-gnutls bindings, +which had one similar segfault bug fixed before with a similar test case. +Fingers crossed.. + +Just finished tracking down a bug in the Android app that caused its +terminal to spin and consume most CPU (and presumably a lot of battery). +I introduced this bug when adding the code to open urls written to a fifo, +due to misunderstanding how java objects are created, basically. This bug +is bad enough to do a semi-immediate release for; luckily it's just about +time for a release anyway with other improvements, so in the next few +days.. + +Have not managed to get a recent ghc-android to build so far. + +Guilhem fixed some bugs in `git annex unused`. diff --git a/doc/design/assistant/blog/day_36__minimal_test_case.mdwn b/doc/design/assistant/blog/day_36__minimal_test_case.mdwn new file mode 100644 index 000000000..b77da14dd --- /dev/null +++ b/doc/design/assistant/blog/day_36__minimal_test_case.mdwn @@ -0,0 +1,9 @@ +Managed to find a minimal, 20 line test case for at least one of the ways +git-annex was hanging with GHC's threaded runtime. Sent it off to +haskell-cafe for analysis. +[thread](http://thread.gmane.org/gmane.comp.lang.haskell.cafe/99334) + +Further managed to narrow the bug down to MissingH's use of logging code, +that git-annex doesn't use. [bug report](http://bugs.debian.org/681621). +So, I can at least get around this problem with a modified version of +MissingH. Hopefully that was the only thing causing the hangs I was seeing! diff --git a/doc/design/assistant/blog/day_37__back.mdwn b/doc/design/assistant/blog/day_37__back.mdwn new file mode 100644 index 000000000..7aef0b681 --- /dev/null +++ b/doc/design/assistant/blog/day_37__back.mdwn @@ -0,0 +1,64 @@ +Back home and laptop is fixed.. back to work. + +Warmup exercises: + +* Went in to make it queue transfers when a broken symlink is received, + only to find I'd already written code to do that, and forgotten about it. + Heh. Did check that the git-annex branch is always sent first, + which will ensure that code always knows where to transfer a key from. + I had probably not considered this wrinkle when first writing the code; + it worked by accident. + +* Made the assistant check that a remote is known to have a key before + queueing a download from it. + +* Fixed a bad interaction between the `git annex map` command and the + assistant. + +---- + +Tried using a modified version of `MissingH` that doesn't use `HSLogger` +to make git-annex work with the threaded GHC runtime. Unfortunatly, +I am still seeing hangs in at least 3 separate code paths when +running the test suite. I may have managed to fix one of the hangs, +but have not grokked what's causing the others. + +---- + +I now have access to a Mac OSX system, thanks to Kevin M. I've fixed +some portability problems in git-annex with it before, but today I tested +the assistant on it: + +* Found a problem with the kqueue code that prevents incoming pushes from + being noticed. + + The problem was that the newly added git ref file does not trigger an add + event. The kqueue code saw a generic change event for the refs directory, + but since the old file was being deleted and replaced by the new file, + the kqueue code, which already had the old file in its cache, did not notice + the file had been replaced. + + I fixed that by making the kqueue code also track the inode of each file. + Currently that adds the overhead of a stat of each file, which could be + avoided if haskell exposed the inode returned by `readdir`. Room to + optimise this later... + +* Also noticed that the kqueue code was not separating out file deletions + from directory deletions. IIRC Jimmy had once mentioned a problem with file + deletions not being noticed by the assistant, and this could be responsible + for that, although the directory deletion code seems to handle them ok + normally. It was making the transfer watching thread not notice when + any transfers finished, for sure. I fixed this oversight, looking in the + cache to see if there used to be a file or a directory, and running the + appropriate hook. + +Even with these fixes, the assistant does not yet reliably transfer file +contents on OSX. I think the problem is that with kqueue we're not +guaranteed to get an add event, and a deletion event for a transfer +info file -- if it's created and quickly deleted, the code that +synthensizes those events doesn't run in time to know it existed. +Since the transfer code relies on deletion events to tell when transfers +are complete, it stops sending files after the first transfer, if the +transfer ran so quickly it doesn't get the expected events. + +So, will need to work on OSX support some more... diff --git a/doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn b/doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn new file mode 100644 index 000000000..14896fcb1 --- /dev/null +++ b/doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn @@ -0,0 +1,66 @@ +Beating my head against the threaded runtime some more. I can reproduce +one of the hangs consistently by running 1000 git annex add commands +in a loop. It hangs around 1% of the time, reading from `git cat-file`. + +Interestingly, `git cat-file` is not yet running at this point -- +git-annex has forked a child process, but the child has not yet exec'd it. +Stracing the child git-annex, I see it stuck in a futex. Adding tracing, +I see the child never manages to run any code at all. + +This really looks like the problem is once again in MissingH, which uses +`forkProcess`. Which happens to come with a big warning about being very +unsafe, in very subtle ways. Looking at the C code that the newer `process` +library uses when sparning a pipe to a process, it messes around with lots of +things; blocking signals, stopping a timer, etc. Hundreds of lines of C +code to safely start a child process, all doing things that MissingH omits. + +That's the second time I've seemingly isolated a hang in the GHC threaded +runtime to MissingH. + +And so I've started converting git-annex to use the new `process` library, +for running all its external commands. John Goerzen had mentioned `process` +to me once before when I found a nasty bug in MissingH, as the cool new +thing that would probably eliminate the `System.Cmd.Utils` part of MissingH, +but I'd not otherwise heard much about it. (It also seems to have the +benefit of supporting Windows.) + +This is a big change and it's early days, but each time I see a hang, I'm +converting the code to use `process`, and so far the hangs have just gone +away when I do that. + +--- + +Hours later... I've converted *all* of git-annex to use `process`. + +In the er, process, the `--debug` switch stopped printing all the commands +it runs. I may try to restore that later. + +I've not tested everything, but the test suite passes, even when +using the threaded runtime. **MILESTONE** + +Looking forward to getting out of these weeds and back to useful work.. + +--- + +Hours later yet.... The `assistant` branch in git now uses the threaded +runtime. It works beautifully, using proper threads to run file transfers +in. + +That should fix the problem I was seeing on OSX yesterday. Too tired to +test it now. + +-- + +Amazingly, all the assistant's own dozen or so threads and thread +synch variables etc all work great under the threaded runtime. I had +assumed I'd see yet more concurrency problems there when switching to it, +but it all looks good. (Or whatever problems there are are subtle ones?) + +I'm very relieved. The threaded logjam is broken! I had been getting +increasingly worried that not having the threaded runtime available would +make it very difficult to make the assistant perform really well, and cause +problems with the webapp, perhaps preventing me from using Yesod. + +Now it looks like smooth sailing ahead. Still some hard problems, but +it feels like with inotify and kqueue and the threaded runtime all +dealt with, the really hard infrastructure-level problems are behind me. diff --git a/doc/design/assistant/blog/day_3__more_races.mdwn b/doc/design/assistant/blog/day_3__more_races.mdwn new file mode 100644 index 000000000..9c1182842 --- /dev/null +++ b/doc/design/assistant/blog/day_3__more_races.mdwn @@ -0,0 +1,26 @@ +Today I worked on the race conditions, and fixed two of them. Both +were fixed by avoiding using `git add`, which looks at the files currently +on disk. Instead, `git annex watch` injects symlinks directly into git's +index, using `git update-index`. + +There is one bad race condition remaining. If multiple processes have a +file open for write, one can close it, and it will be added to the annex. +But then the other can still write to it. + +---- + +Getting away from race conditions for a while, I made `git annex watch` +not annex `.gitignore` and `.gitattributes` files. + +And, I made it handle running out of inotify descriptors. By default, +`/proc/sys/fs/inotify/max_user_watches` is 8192, and that's how many +directories inotify can watch. Now when it needs more, it will print +a nice message showing how to increase it with `sysctl`. + +FWIW, DropBox also uses inotify and has the same limit. It seems to not +tell the user how to fix it when it goes over. Here's what `git annex +watch` will say: + + Too many directories to watch! (Not watching ./dir4299) + Increase the limit by running: + echo fs.inotify.max_user_watches=81920 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p diff --git a/doc/design/assistant/blog/day_3__more_races/comment_1_d6015338f602b574a3805de5481fc45e._comment b/doc/design/assistant/blog/day_3__more_races/comment_1_d6015338f602b574a3805de5481fc45e._comment new file mode 100644 index 000000000..2d330f332 --- /dev/null +++ b/doc/design/assistant/blog/day_3__more_races/comment_1_d6015338f602b574a3805de5481fc45e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkmtR6oVColYKoU0SjBORLDGrwR10G-mKo" + nickname="Jo-Herman" + subject="Dropbox Inotify" + date="2012-06-06T22:03:29Z" + content=""" +Actually, Dropbox giver you a warning via libnotify inotify. It tends to go away too quickly to properly read though, much less actually copy down the command... +"""]] diff --git a/doc/design/assistant/blog/day_3__more_races/comment_2_4d6b23fc6442e0ee0303523cb69d0fba._comment b/doc/design/assistant/blog/day_3__more_races/comment_2_4d6b23fc6442e0ee0303523cb69d0fba._comment new file mode 100644 index 000000000..523e6d85f --- /dev/null +++ b/doc/design/assistant/blog/day_3__more_races/comment_2_4d6b23fc6442e0ee0303523cb69d0fba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.8.36" + subject="comment 2" + date="2012-06-06T23:25:57Z" + content=""" +When I work on the [[webapp]], I'm planning to make it display this warning, and any other similar warning messages that might come up. +"""]] diff --git a/doc/design/assistant/blog/day_3__more_races/comment_3_03f5b2344c2a47dea60086f217d60f9b._comment b/doc/design/assistant/blog/day_3__more_races/comment_3_03f5b2344c2a47dea60086f217d60f9b._comment new file mode 100644 index 000000000..92f5dcbd6 --- /dev/null +++ b/doc/design/assistant/blog/day_3__more_races/comment_3_03f5b2344c2a47dea60086f217d60f9b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Wording" + date="2012-06-07T03:43:19Z" + content=""" +For the unfamiliar, it's hard to tell if a command like that would persist. I'd suggest being as clear as possible, e.g.: + + Increase the limit for now by running: + sudo sysctl fs.inotify.max_user_watches=81920 + Increase the limit now and automatically at every boot by running: + echo fs.inotify.max_user_watches=81920 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p + +"""]] diff --git a/doc/design/assistant/blog/day_3__more_races/comment_4_860e90e989ec022100001c65e353a91e._comment b/doc/design/assistant/blog/day_3__more_races/comment_4_860e90e989ec022100001c65e353a91e._comment new file mode 100644 index 000000000..05b601eaf --- /dev/null +++ b/doc/design/assistant/blog/day_3__more_races/comment_4_860e90e989ec022100001c65e353a91e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.8.36" + subject="comment 4" + date="2012-06-07T04:48:15Z" + content=""" +Good thought Jim. I've done something like that. +"""]] diff --git a/doc/design/assistant/blog/day_40__dbus.mdwn b/doc/design/assistant/blog/day_40__dbus.mdwn new file mode 100644 index 000000000..049c3ffe0 --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus.mdwn @@ -0,0 +1,100 @@ +Really productive day today, now that I'm out of the threaded runtime +tarpit! + +First, brought back `--debug` logging, better than before! As part of that, I +wrote some 250 lines of code to provide a IMHO more pleasant interface to +`System.Process` (itself only 650 lines of code) that avoids all the +low-level setup, cleanup, and tuple unpacking. Now I can do things like +write to a pipe to a process, and ensure it exits nonzero, this easily: + + withHandle StdinHandle createProcessSuccess (proc "git" ["hash-object", "--stdin"]) $ \h -> + hHutStr h objectdata + +My interface also makes it easy to run nasty background processes, +reading their output lazily. + + lazystring <- withHandle StdoutHandle createBackgroundProcess (proc "find" ["/"]) hGetContents + +Any true Haskellers are shuddering here, I really should be using +conduits or pipes, or something. One day.. + +---- + +The assistant needs to detect when removable drives are attached, and +sync with them. This is a reasonable thing to be working on at this point, +because it'll make the currently incomplete data transfer code fully usable +for the sneakernet use case, and firming that up will probably be a good +step toward handing other use cases involving data transfer over the +network, including cases where network remotes are transientely available. + +So I've been playing with using dbus to detect mount events. +There's a very nice Haskell library to use dbus. + +This simple program will detect removable drives being mounted, and +works on Xfce (as long as you have automounting enabled in its +configuration), and should also work on Gnome, and, probably, KDE: + +[[!format haskell """ +{-# LANGUAGE OverloadedStrings #-} + +import Data.List (sort) +import DBus +import DBus.Client +import Control.Monad + +main = do + client <- connectSession + + listen client mountadded $ \s -> + putStrLn (show s) + + forever $ getLine -- let listener thread run forever + + where + mountadded = matchAny + { matchInterface = Just "org.gtk.Private.RemoteVolumeMonitor" + , matchMember = Just "MountAdded" + } +"""]] + +(Yeah... "org.gtk.Private.RemoteVolumeMonitor". There are so +many things wrong with that string. What does gtk have to do with +mounting a drive? Why is it Private? Bleagh. Should I only match +the "MountAdded" member and not the interface? Seems everyone who does +this relies on google to find other people who have cargo-culted it, +or just runs `dbus-monitor` and picks out things. +There seems to be no canonical list of events. Bleagh.) + +---- + +Spent a while shaving a yak of needing a `getmntent` interface in Haskell. +Found one in a hsshellscript library; since that library is not packaged +in Debian, and I don't really want to depend on it, I extracted just +the mtab and fstab parts of it into a little library in git-annex. + +---- + +I've started putting together a MountWatcher thread. On systems without +dbus (do OSX or the BSDs have dbus?), or if dbus is not running, it polls +`/etc/mtab` every 10 seconds for new mounts. When dbus is available, +it doesn't need the polling, and should notice mounts more quickly. + +Open question: Should it still poll even when dbus is available? Some of us +like to mount our own drives, by hand and may have automounting disabled. It'd +be good if the assistant supported that. This might need a +`annex.no-dbus` setting, but I'd rather avoid needing such manual +configuration. + +One idea is to do polling in addition to dbus, if `/etc/fstab` contains +mount points that seem to be removable drives, on which git remotes lives. +Or it could always do polling in addition to dbus, which is just some extra +work. Or, it could try to introspect dbus to see if mount events will +be generated. + +The MountWatcher so far only detects new mounts and prints out what +happened. Next up: Do something in response to them. + +This will involve manipulating the Annex state to belatedly add the Remote +on the mount point.. tricky. And then, for Git Remotes, it should pull/push +the Remote to sync git data. Finally, for all remotes, it will need to +queue Transfers of file contents from/to the newly available Remote. diff --git a/doc/design/assistant/blog/day_40__dbus/comment_1_43ed2a79629868b018ec9f54a32bcacc._comment b/doc/design/assistant/blog/day_40__dbus/comment_1_43ed2a79629868b018ec9f54a32bcacc._comment new file mode 100644 index 000000000..3670e7dd5 --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus/comment_1_43ed2a79629868b018ec9f54a32bcacc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="dbus vs polling" + date="2012-07-19T17:38:40Z" + content=""" +I am running KDE, dbus, and I like to mount drives by hand; all that without bothering to set up /etc/fstab... Often from CLI so I don't even see the notifications for new drives. + +Especially while on the road, I will use no KDE, but just a tty or three. Still, dbus will be running. + +Long story short, I would need polling for the assistant to work flawlessly in all use cases. +"""]] diff --git a/doc/design/assistant/blog/day_40__dbus/comment_2_6799f2baf6a6ce14b1fa76a8402840c0._comment b/doc/design/assistant/blog/day_40__dbus/comment_2_6799f2baf6a6ce14b1fa76a8402840c0._comment new file mode 100644 index 000000000..832be854a --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus/comment_2_6799f2baf6a6ce14b1fa76a8402840c0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="hamish" + ip="203.0.139.24" + subject="dbus vs polling " + date="2012-07-22T07:13:37Z" + content=""" +I, too, am running a dbus but like to hand mount my filesystems. However, I'd imagine that I am both a minority and that my minority could like the extra control, so perhaps even a \"re-read the mtab /now/\" command that can be manually run after something is manually mounted would suffice + +Is it not possible to use inotify on the mtab? +"""]] diff --git a/doc/design/assistant/blog/day_40__dbus/comment_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment b/doc/design/assistant/blog/day_40__dbus/comment_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment new file mode 100644 index 000000000..a372670b8 --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus/comment_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.169" + subject="comment 3" + date="2012-07-22T16:03:52Z" + content=""" +How did I not think about using my favorite hammer on this problem too? But, no, /proc/mounts cannot be watched with inotify it seems, and of course the BSDs don't seem to have a file at all. + +I think the dbus stuff is sorted out for manual users, see later blog entries. +"""]] diff --git a/doc/design/assistant/blog/day_40__dbus/comment_4_3399ddad951c1a950281bb6941fc3f6f._comment b/doc/design/assistant/blog/day_40__dbus/comment_4_3399ddad951c1a950281bb6941fc3f6f._comment new file mode 100644 index 000000000..9007850e4 --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus/comment_4_3399ddad951c1a950281bb6941fc3f6f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-07-19T18:43:30Z" + content=""" +Joey, yes dbus is available from macports and homebrew, it's not installed by default (or as a dependancy) for most packages in macports. +"""]] diff --git a/doc/design/assistant/blog/day_40__dbus/comment_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment b/doc/design/assistant/blog/day_40__dbus/comment_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment new file mode 100644 index 000000000..38916dd8c --- /dev/null +++ b/doc/design/assistant/blog/day_40__dbus/comment_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://smcv.pseudorandom.co.uk/" + nickname="smcv" + subject="comment 5" + date="2012-07-31T09:58:13Z" + content=""" +It's `org.gtk` because gvfs, GLib and Gtk are all products of gtk.org (there is no separate glib.org). + +It's `Private` because the gvfs developers don't consider its D-Bus interface to be stable API, I believe. The official API for it is the C API in GIO, part of GLib. + +To poll for changes to /proc/mounts on Linux, you open it for reading and poll() for POLLERR (not sure why it gets to be different, but it is). See gio/gunixmounts.c in recent GLib. +"""]] diff --git a/doc/design/assistant/blog/day_41__foo.mdwn b/doc/design/assistant/blog/day_41__foo.mdwn new file mode 100644 index 000000000..99a977f60 --- /dev/null +++ b/doc/design/assistant/blog/day_41__foo.mdwn @@ -0,0 +1,46 @@ +I made the MountWatcher only use dbus if it sees a client connected to dbus +that it knows will send mount events, or if it can start up such a client +via dbus. (Fancy!) Otherwise it falls back to polling. This should be enough +to support users who manually mount things -- if they have gvfs +installed, it'll be used to detect their manual mounts, even when a desktop +is not running, and if they don't have gvfs, they get polling. + +Also, I got the MountWatcher to work with KDE. Found a dbus event that's +emitted when KDE mounts a drive, and this is also used. If anyone with +some other desktop environment wants me to add support for it, and it uses +dbus, it should be easy: Run `dbus-monitor`, plug in a drive, get +it mounted, and send me a transcript. + +Of course, it'd also be nice to support anything similar on OSX that can +provide mount event notifications. Not a priority though, since the polling +code will work. + +--- + +Some OS X fixes today.. + +* Jimmy pointed out that my `getmntent` code broke the build on OSX again. + Sorry about that.. I keep thinking Unix portability nightmares are a 80's + thing, not a 2010's thing. Anyway, adapted a lot of hackish C code + to emulate `getmntent` on BSD systems, and it seems to work. (I actually + think the BSD interface to this is saner than Linux's, but I'd rather have + either one than both, sigh..) +* Kqueue was blocking all the threads on OSX. This is fixed, and the + assistant seems to be working on OSX again. + +---- + +I put together a preliminary page thanking everyone who contributed to the +git-annex Kickstarter. [[/assistant/thanks]] The wall-o-names is scary crazy humbling. + +---- + +Improved `--debug` mode for the assistant, now every thread says whenever +it's doing anything interesting, and also there are timestamps. + +---- + +Had been meaning to get on with syncing to drives when they're mounted, but +got sidetracked with the above. Maybe tomorrow. I did think through it +in some detail as I was waking up this morning, and think I have a pretty +good handle on it. diff --git a/doc/design/assistant/blog/day_41__foo/comment_1_ace21fa257a4c2fd412b6ff2944a23e8._comment b/doc/design/assistant/blog/day_41__foo/comment_1_ace21fa257a4c2fd412b6ff2944a23e8._comment new file mode 100644 index 000000000..e27f7904e --- /dev/null +++ b/doc/design/assistant/blog/day_41__foo/comment_1_ace21fa257a4c2fd412b6ff2944a23e8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnYD2ZzaOz-0anQDrN-Hg8Tvh5_C7wtStk" + nickname="roucaries" + subject="Portability" + date="2012-07-21T20:31:32Z" + content=""" +For portability why not using gnulib ? It will ease porting to windows BTW. + +Bastien +"""]] diff --git a/doc/design/assistant/blog/day_42__the_answer.mdwn b/doc/design/assistant/blog/day_42__the_answer.mdwn new file mode 100644 index 000000000..fd7c4ebb5 --- /dev/null +++ b/doc/design/assistant/blog/day_42__the_answer.mdwn @@ -0,0 +1,27 @@ +Made the MountWatcher update state for remotes located in a drive that +gets mounted. This was tricky code. First I had to make remotes declare +when they're located in a local directory. Then it has to rescan git +configs of git remotes (because the git repo mounted at a mount point may +change), and update all the state that a newly available remote can affect. + +And it works: I plug in a drive containing one of my git remotes, and the +assistant automatically notices it and syncs the git repositories. + +--- + +But, data isn't transferred yet. When a disconnected remote becomes +connected, keys should be transferred in both directions to get back into +sync. + +To that end, added Yet Another Thread; the TransferScanner thread +will scan newly available remotes to find keys, and queue low priority +transfers to get them fully in sync. + +(Later, this will probably also be used for network remotes that become +available when moving between networks. I think network-manager sends +dbus events it could use..) + +This new thread is missing a crucial peice, it doesn't yet have a way to +find the keys that need to be transferred. Doing that efficiently (without +scanning the whole git working copy) is Hard. I'm considering design +possibilities.. diff --git a/doc/design/assistant/blog/day_43__simple_scanner.mdwn b/doc/design/assistant/blog/day_43__simple_scanner.mdwn new file mode 100644 index 000000000..11ee3cca4 --- /dev/null +++ b/doc/design/assistant/blog/day_43__simple_scanner.mdwn @@ -0,0 +1,37 @@ +Milestone: I can run `git annex assistant`, plug in a USB drive, and it +automatically transfers files to get the USB drive and current repo back in +sync. + +I decided to implement the naive scan, to find files needing to be +transferred. So it walks through `git ls-files` and checks each file +in turn. I've deferred less expensive, more sophisticated approaches to later. + +I did some work on the TransferQueue, which now keeps track of the length +of the queue, and can block attempts to add Transfers to it if it gets too +long. This was a nice use of STM, which let me implement that without using +any locking. + +[[!format haskell """ +atomically $ do + sz <- readTVar (queuesize q) + if sz <= wantsz + then enqueue schedule q t (stubInfo f remote) + else retry -- blocks until queuesize changes +"""]] + +Anyway, the point was that, as the scan finds Transfers to do, +it doesn't build up a really long TransferQueue, but instead is blocked +from running further until some of the files get transferred. The resulting +interleaving of the scan thread with transfer threads means that transfers +start fairly quickly upon a USB drive being plugged in, and kind of hides +the innefficiencies of the scanner, which will most of the time be +swamped out by the IO bound large data transfers. + +--- + +At this point, the assistant should do a good job of keeping repositories +in sync, as long as they're all interconnected, or on removable media +like USB drives. There's lots more work to be done to handle use cases +where repositories are not well-connected, but since the assistant's +[[syncing]] now covers at least a couple of use cases, I'm ready to move +on to the next phase. [[Webapp]], here we come! diff --git a/doc/design/assistant/blog/day_44__webapp_basics.mdwn b/doc/design/assistant/blog/day_44__webapp_basics.mdwn new file mode 100644 index 000000000..a8fdb131a --- /dev/null +++ b/doc/design/assistant/blog/day_44__webapp_basics.mdwn @@ -0,0 +1,83 @@ +After an all-nighter, I have `git annex webapp` launching a WebApp! + +It doesn't do anything useful yet, just uses Yesod to display a couple of +hyperlinked pages and a favicon, securely. + +The binary size grew rather alarmingly, BTW. :) Indeed, it's been growing +for months.. + + -rwxr-xr-x 1 root root 9.4M Jul 21 16:59 git-annex-no-assistant-stripped + -rwxr-xr-x 1 joey joey 12M Jul 25 20:54 git-annex-no-webapp-stripped + -rwxr-xr-x 1 joey joey 17M Jul 25 20:52 git-annex-with-webapp-stripped + +---- + +Along the way, some Not Invented Here occurred: + +I didn't use the yesod scaffolded site, because it's a lot of what +seems mostly to be cruft in this use case. And because I don't like +code generated from templates that people are then expected to edit. Ugh. +That's my least favorite part of Yesod. This added some pain, since +I had to do everything the hard way. + +I didn't use [wai-handler-launch](http://hackage.haskell.org/package/wai-handler-launch) +because: + + * It seems broken on IPv6 capable machines (it always opens + `http://127.0.0.1:port/` even though it apparently doesn't always + listen there.. I think it was listening on my machine's ipv6 address + instead. I know, I know; I should file a bug about this..) + * It always uses port 4587, which is **insane**. What if you have two + webapps? + * It requires javascript in the web browser, which + is used to ping the server, and shut it down when the web browser closes + (which behavior is wrong for git-annex anyway, since the daemon should + stay running across browser closes). + * It opens the webapp on web server startup, which is wrong for git-annex; + instead the command `git annex webapp` will open the webapp, + after `git annex assistant` started the web server. + +Instead, I rolled my own WAI webapp laucher, that binds to any free port +on localhost, It does use `xdg-open` to launch the web browser, +like wai-handler-launch (or just `open` on OS X). + +Also, I wrote my own WAI logger, which logs using System.Log.Logger, +instead of to stdout, like `runDebug` does. + +---- + +The webapp only listens for connections from localhost, but that's +not sufficient "security". Instead, I added a secret token to +every url in the webapp, that only `git annex webapp` knows about. + +But, if that token is passed to `xdg-open` on its command line, +it will be briefly visible to local attackers in the parameters of +`xdg-open`.. And if the web browser's not already running, it'll run +with it as a parameter, and be *very* visible. + +So instead, I used a nasty hack. On startup, the assistant +will create a html file, readably only by the user, that redirects +the user to the real site url. Then `git annex webapp` will run +xdg-open on that file. + +---- + +Making Yesod check the `auth=` parameter (to verify that the secret token +is right) is when using Yesod started to pay off. Yesod has a simple +`isAuthorized` method that can be overridden to do your own authentication +like this. + +But Yesod really started to shine when I went to add the `auth=` parameter +to every url in the webapp. There's a `joinPath` method can can be used +to override the default url builder. And every type-safe url in the +application goes through there, so it's perfect for this. + +I just had to be careful to make it not add `auth=` to the url for the +favicon, which is included in the "Permission Denied" error page. That'd be +an amusing security hole.. + +---- + +Next up: Doing some AJAX to get a dynamic view of the state of the daemon, +including currently running transfers, in the webapp. AKA stuff I've never +done before, and that, unlike all this heavy Haskell Yesod, scares me. :) diff --git a/doc/design/assistant/blog/day_44__webapp_basics/comment_1_d5fb67f373038e9f583cb2e1992bef67._comment b/doc/design/assistant/blog/day_44__webapp_basics/comment_1_d5fb67f373038e9f583cb2e1992bef67._comment new file mode 100644 index 000000000..bc1f259e8 --- /dev/null +++ b/doc/design/assistant/blog/day_44__webapp_basics/comment_1_d5fb67f373038e9f583cb2e1992bef67._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="Your security solution is fine" + date="2012-07-27T06:37:03Z" + content=""" +I think making the html file redirect is just fine. desktopcouch does something like this. They talk about it being there to help you find the port number, but it contains the security token too. + +They also have some javascript to delay the redirect for a while so you can bookmark the redirect file. You can click to set a cookie to skip the delay in future. + +It's been a while since I used desktopcouch, but I found an old redirect file laying around. Here it is: + +http://jasonwoof.com/downloads/desktopcouch-redirect.txt + +The code is pretty short, you might find something useful there. + + - Jason +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling.mdwn b/doc/design/assistant/blog/day_45__long_polling.mdwn new file mode 100644 index 000000000..380c55c12 --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling.mdwn @@ -0,0 +1,66 @@ +The webapp now displays actual progress bars, for the actual transfers +that the assistant is making! And it's seriously shiny. + +[[!img full.png]] + +Yes, I used Bootstrap. I can see why so many people are using it, +that the common complaint is everything looks the same. I spent a few hours +mocking up the transfer display part of the WebApp using Bootstrap, and +arrived at something that doesn't entirely suck remarkably quickly. + +The really sweet thing about Bootstrap is that when I resized my browser to +the shape of a cell phone, it magically redrew the WebApp like so: + +[[!img phone.png]] + +--- + +To update the display, the WebApp uses two techniques. On noscript +browsers, it just uses a meta refresh, which is about the best I can do. I +welcome feedback; it might be better to just have an "Update" button in +this case. + +With javascript enabled, it uses long polling, done over AJAX. There are +some other options I considered, including websockets, and server-sent +events. Websockets seem too new, and while there's a WAI module supporting +server-sent events, and even an example of them in the Yesod book, the +module is not packaged for Debian yet. Anyway, long polling is the most +widely supported, so a good starting place. It seems to work fine too, I +don't really anticipate needing the more sophisticated methods. + +(Incidentially, this's the first time I've ever written code that uses AJAX.) + +Currently the status display is rendered in html by the web server, and +just updated into place by javascript. I like this approach since it +keeps the javascript code to a minimum and the pure haskell code to a +maximum. But who knows, I may have to switch to JSON that gets rendered by +javascript, for some reason, later on. + +--- + +I was very happy with Yesod when I managed to factor out a +general purpose widget that adds long-polling and meta-refresh to any +other widget. I was less happy with Yesod when I tried to include +jquery on my static site and it kept serving up a truncated version of it. +Eventually worked around what's seemingly a bug in the default WAI +middleware, by disabling that middleware. + +---- + +Also yesterday I realized there were about 30 comments stuck in moderation on +this website. I thought I had a feed of those, but obviously I didn't. I've +posted them all, and also read them all. + +---- + +Next up is probably some cleanup of bugs and minor todos. Including +figuring out why `watch` has started to segfault on OSX when it was +working fine before. + +After that, I need to build a way to block the long polling request +until the DaemonStatus and/or TransferQueue change from the version +previously displayed by the WebApp. An interesting concurrency problem.. + +Once I have that working, I can reduce the current 3 second delay between +refreshes to a very short delay, and the WebApp will update in +near-realtime as changes come in. diff --git a/doc/design/assistant/blog/day_45__long_polling/comment_1_994bec0978324e268666073e8ff4f6ae._comment b/doc/design/assistant/blog/day_45__long_polling/comment_1_994bec0978324e268666073e8ff4f6ae._comment new file mode 100644 index 000000000..20d3a64e6 --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling/comment_1_994bec0978324e268666073e8ff4f6ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="auth token length" + date="2012-07-27T18:52:19Z" + content=""" +Your auth token looks a little short. Aren't you worried about people brute-forcing it? ;) +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling/comment_2_dfa164c86290899139491acccddd8b2b._comment b/doc/design/assistant/blog/day_45__long_polling/comment_2_dfa164c86290899139491acccddd8b2b._comment new file mode 100644 index 000000000..836fe89e9 --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling/comment_2_dfa164c86290899139491acccddd8b2b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.20" + subject="comment 2" + date="2012-07-27T18:55:51Z" + content=""" +Heh, I consider it overflowing most address fields a bonus, as you don't have to worry when making screenshots. :) + +Of course, it changes each app run too.. +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling/comment_3_5526c9dd4fd87da56cb8456083169f55._comment b/doc/design/assistant/blog/day_45__long_polling/comment_3_5526c9dd4fd87da56cb8456083169f55._comment new file mode 100644 index 000000000..7881bcda5 --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling/comment_3_5526c9dd4fd87da56cb8456083169f55._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmz8d2M0lQDYWLSbDQSjYRHfrQkWKgPu60" + nickname="Alex" + subject="long polling in Widget form" + date="2014-01-16T00:08:12Z" + content=""" +I've been hacking around for a couple days trying to get long polling into a Yesod web app, but I haven't found a composable solution yet. It seems like a thing worthy of generalization. Can you perhaps point me to source in git-annex that would help me take a shot at building a long polling library? +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling/comment_4_91630f5bf162dfd4fbb3920f1318535b._comment b/doc/design/assistant/blog/day_45__long_polling/comment_4_91630f5bf162dfd4fbb3920f1318535b._comment new file mode 100644 index 000000000..53b9f4098 --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling/comment_4_91630f5bf162dfd4fbb3920f1318535b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-16T03:03:48Z" + content=""" +Alex, the long polling is done almost entirely on the javascript side; the yesod handler only needs to block until the next change it wants to display. So I doubt any of what I have would make a useful library. (Although it would be very useful to have a library!) +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling/comment_5_b3e41ba77f21e93a4e086483793bf5ce._comment b/doc/design/assistant/blog/day_45__long_polling/comment_5_b3e41ba77f21e93a4e086483793bf5ce._comment new file mode 100644 index 000000000..d9886216c --- /dev/null +++ b/doc/design/assistant/blog/day_45__long_polling/comment_5_b3e41ba77f21e93a4e086483793bf5ce._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmz8d2M0lQDYWLSbDQSjYRHfrQkWKgPu60" + nickname="Alex" + subject="re: long polling" + date="2014-01-17T20:27:23Z" + content=""" +After poking through git-annex, I had the same realization. I hadn't realized that Yesod (or perhaps more accurately, Warp) is asynchronous above the Application level. I had feared I'd need to write some WAI middleware to accommodate the blocking nature of long polling requests. In retrospect it seems kind of silly: what kind of high-performance webserver doesn't handle requests concurrently? + +I do still think there's a pattern worth encapsulating, even if it won't be long until WebSockets and SSE are widespread enough to be developed against without fallbacks. +"""]] diff --git a/doc/design/assistant/blog/day_45__long_polling/full.png b/doc/design/assistant/blog/day_45__long_polling/full.png new file mode 100644 index 000000000..3963ae1dc Binary files /dev/null and b/doc/design/assistant/blog/day_45__long_polling/full.png differ diff --git a/doc/design/assistant/blog/day_45__long_polling/phone.png b/doc/design/assistant/blog/day_45__long_polling/phone.png new file mode 100644 index 000000000..389334d95 Binary files /dev/null and b/doc/design/assistant/blog/day_45__long_polling/phone.png differ diff --git a/doc/design/assistant/blog/day_46__notification_pools.mdwn b/doc/design/assistant/blog/day_46__notification_pools.mdwn new file mode 100644 index 000000000..483ad95b1 --- /dev/null +++ b/doc/design/assistant/blog/day_46__notification_pools.mdwn @@ -0,0 +1,68 @@ +Focus today was writing a notification broadcaster library. This is a way to +send a notification to a set of clients, any of which can be blocked +waiting for a new notification to arrive. A complication is that any number +of clients may be be dead, and we don't want stale notifications for those +clients to pile up and leak memory. + +It took me 3 tries to find the solution, which turns out to be head-smackingly +simple: An array of SampleVars, one per client. + +Using SampleVars means that clients only see the most recent notification, +but when the notification is just "the assistant's state changed somehow; +display a refreshed rendering of it", that's sufficient. + +---- + +First use of that was to make the thread that woke up every 10 minutes +and checkpointed the daemon status to disk also wait for a notification +that it changed. So that'll be more current, and use less IO. + +---- + +Second use, of course, was to make the WebApp block long polling clients +until there is really a change since the last time the client polled. + +To do that, I made one change to my Yesod routes: + +[[!format diff """ + -/status StatusR GET + +/status/#NotificationId StatusR GET +"""]] + +Now I find another reason to love Yesod, because after doing that, +I hit "make".. and fixed the type error. And hit make.. and fixed +the type error. And then it just freaking worked! Html was generated with +all urls to /status including a `NotificationId`, and the handler for +that route got it and was able to use it: + +[[!format haskell """ + {- Block until there is an updated status to display. -} + b <- liftIO $ getNotificationBroadcaster webapp + liftIO $ waitNotification $ notificationHandleFromId b nid +"""]] + +And now the WebApp is able to display transfers in realtime! +When I have both the WebApp and `git annex get` running on the same screen, +the WebApp displays files that git-annex is transferring about as fast +as the terminal updates. + +The [[progressbars]] still need to be sorted out, but otherwise +the WebApp is a nice live view of file transfers. + +--- + +I also had some fun with Software Transactional Memory. Now when the +assistant moves a transfer from its queue of transfers to do, to its map of +transfers that are currently running, it does so in an atomic transaction. +This will avoid the transfer seeming to go missing (or be listed twice) if +the webapp refreshes at just the wrong point in time. I'm really starting +to get into STM. + +---- + +Next up, I will be making the WebApp maintain a list of notices, displayed +on its sidebar, scrolling new notices into view, and removing ones the user +closes, and ones that expire. This will be used for displaying errors, as +well as other communication with the user (such as displaying a notice +while a git sync is in progress with a remote, etc). Seems worth doing now, +so the basic UI of the WebApp is complete with no placeholders. diff --git a/doc/design/assistant/blog/day_47__alert_messages.mdwn b/doc/design/assistant/blog/day_47__alert_messages.mdwn new file mode 100644 index 000000000..81551fa95 --- /dev/null +++ b/doc/design/assistant/blog/day_47__alert_messages.mdwn @@ -0,0 +1,14 @@ +Some days I spend 2 hours chasing red herrings (like "perhaps my JSON ajax +calls arn't running asynchronoously?") that turn out to be a simple +one-word typo. This was one of them. + +However, I did get the sidebar displaying alert messages, which can be +easily sent to the user from any part of the assistant. This includes +transient alerts of things it's doing, which disappear once the action +finishes, and long-term alerts that are displayed until the user closes +them. It even supports rendering arbitrary Yesod widgets as alerts, so +they can also be used for asking questions, etc. + +Time for a screencast! + + diff --git a/doc/design/assistant/blog/day_48__intro.mdwn b/doc/design/assistant/blog/day_48__intro.mdwn new file mode 100644 index 000000000..2cac85d4d --- /dev/null +++ b/doc/design/assistant/blog/day_48__intro.mdwn @@ -0,0 +1,8 @@ +Lots of WebApp UI improvements, mostly around the behavior when +displaying alert messages. Trying to make the alerts informative +without being intrusively annoying, think I've mostly succeeded now. + +Also, added an intro display. Shown is the display with only one repo; +if there are more repos it also lists them all. + +[[!img screenshot/intro.png]] diff --git a/doc/design/assistant/blog/day_49__first_run_experience.mdwn b/doc/design/assistant/blog/day_49__first_run_experience.mdwn new file mode 100644 index 000000000..437046d34 --- /dev/null +++ b/doc/design/assistant/blog/day_49__first_run_experience.mdwn @@ -0,0 +1,39 @@ +Started work on the interface displayed when the webapp is started +with no existing git-annex repository. All this needs to do is walk the user +through setting up a repository, as simply as possible. + +A tricky part of this is that most of git-annex runs in the Annex monad, +which requires a git-annex repository. Luckily, much of the webapp +does not run in Annex, and it was pretty easy to work around the parts that +do. Dodged a bullet there. + +There will, however, be a tricky transition from this first run webapp, +to a normally fully running git-annex assistant and webapp. I think the +first webapp will have to start up all the normal threads once it makes the +repository, and then redirect the user's web browser to the full webapp. + +Anyway, the UI I've made is very simple: A single prompt, for the +directory where the repository should go. With, eventually, tab completion, +sanity checking (putting the repository in "/" is not good, and making it +all of "$HOME" is probably unwise). + +[[!img screenshot/firstrun.png]] + +Ideally most users will accept the default, which will be something +like `/home/username/Desktop/Annex`, and be through this step in seconds. + +Suggestions for a good default directory name appreciated.. Putting it on a +folder that will appear on the desktop seems like a good idea, when there's +a Desktop directory. I'm unsure if I should name it something specific like +"GitAnnex", or something generic like "Synced". + +Time for the first of probably many polls! + +What should the default directory name used by the git-annex assistant be? + +[[!poll open=no 19 "Annex" 7 "GitAnnex" 1 "~/git-annex/" 10 "Synced" 0 "AutoSynced" 1 "Shared" 10 "something lowercase!" 1 "CowboyNeal" 1 "Annexbox"]] + +(Note: This is a wiki. You can edit this page to add your own +[[ikiwiki/directive/poll]] options!) + +[[!tag polls]] diff --git a/doc/design/assistant/blog/day_49__first_run_experience/comment_1_e146cf06c8dd6303dd6a991f152a73fe._comment b/doc/design/assistant/blog/day_49__first_run_experience/comment_1_e146cf06c8dd6303dd6a991f152a73fe._comment new file mode 100644 index 000000000..9f1d74e67 --- /dev/null +++ b/doc/design/assistant/blog/day_49__first_run_experience/comment_1_e146cf06c8dd6303dd6a991f152a73fe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nico.kaiser.me/" + nickname="Nico Kaiser" + subject="Directory location" + date="2012-08-01T07:51:36Z" + content=""" +I don't think the Annex directory (or whatever it will be called – \"Annex\" seems like a good choice in my opinion) should be inside the \"Desktop\" folder by default. All other xdg-user-dirs (Documents, Downloads, etc.) are in $HOME, and i think Desktop should not be cluttered with folders. +"""]] diff --git a/doc/design/assistant/blog/day_49__first_run_experience/comment_2_5d6adcf6782c02283bef6189582ee467._comment b/doc/design/assistant/blog/day_49__first_run_experience/comment_2_5d6adcf6782c02283bef6189582ee467._comment new file mode 100644 index 000000000..40f75ca0b --- /dev/null +++ b/doc/design/assistant/blog/day_49__first_run_experience/comment_2_5d6adcf6782c02283bef6189582ee467._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.236" + subject="comment 2" + date="2012-08-01T14:04:08Z" + content=""" +Hmm, my thought on putting it under Desktop is that'll let me install git-annex and tell my mom (really!) that files dragged to there are shared. Don't the other xdg directories get used as default save/open locations for things like word processors, so not need to be on the desktop? + +Although that may not be necessary. I've realized I can, at least on linux, easily make a button on the webapp that pops open the directory in the desktop's file manager. + +I guess another way of looking at the question is: Where does dropbox put its folder? +"""]] diff --git a/doc/design/assistant/blog/day_49__first_run_experience/comment_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment b/doc/design/assistant/blog/day_49__first_run_experience/comment_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment new file mode 100644 index 000000000..22eff96b6 --- /dev/null +++ b/doc/design/assistant/blog/day_49__first_run_experience/comment_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawllHWUwOT-UVe5bGkk8G87bpeRAzy-5T7w" + nickname="Rick" + subject="Folder location" + date="2012-08-01T14:18:21Z" + content=""" +I'm of two minds about where the Annex folder should be. + +For beginners, the desktop is ideal. No doubt about it. And more experienced users can override the default path during the install. + +On the other hand, many of the other 'synced folder' services place their folder in the user's home. Both Dropbox and Skydrive do this. It's where I'd put it for consistency, and to keep my desktop free of clutter. + +It's a close call, but if push came to shove, I'd probably go with the user home folder. +"""]] diff --git a/doc/design/assistant/blog/day_49__first_run_experience/comment_4_549b07bb02c07a5b1b95445b01758db2._comment b/doc/design/assistant/blog/day_49__first_run_experience/comment_4_549b07bb02c07a5b1b95445b01758db2._comment new file mode 100644 index 000000000..f261d1c23 --- /dev/null +++ b/doc/design/assistant/blog/day_49__first_run_experience/comment_4_549b07bb02c07a5b1b95445b01758db2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="dhess" + ip="173.247.200.7" + subject="Choose a friendly/unintimidating name" + date="2012-09-13T00:32:15Z" + content=""" +You've already decided to accommodate mom by choosing ~/Desktop as the default location, so you should be consistent: choose a name that means something to people. \"Annex\" and \"GitAnnex\" are good branding, but not very user-friendly. (Contrast with \"Dropbox\", the default folder name for Dropbox -- good branding *and* reasonably meaningful.) + +\"Shared\" is friendly, but implies that you're sharing with other people, which isn't necessarily the case. (You should reserve the name \"Shared\" for a sub-directory of the default directory, anyway, if/when the time comes to implement sharing URLs to your g-a-a objects with other users.) + +I think that \"Synced\" is fine. Most English-speakers will know what it means, and it's a good description of what g-a-a does. + +Don't worry whether we like it or not. Nobody who comments here, nor, likely, anyone who votes, will use the default name anyway ;) +"""]] diff --git a/doc/design/assistant/blog/day_4__speed.mdwn b/doc/design/assistant/blog/day_4__speed.mdwn new file mode 100644 index 000000000..085d9547b --- /dev/null +++ b/doc/design/assistant/blog/day_4__speed.mdwn @@ -0,0 +1,47 @@ +Only had a few hours to work today, but my current focus is speed, and I +have indeed sped up parts of `git annex watch`. + +One thing folks don't realize about git is that despite a rep for being +fast, it can be rather slow in one area: Writing the index. You don't +notice it until you have a lot of files, and the index gets big. So I've +put a lot of effort into git-annex in the past to avoid writing the index +repeatedly, and queue up big index changes that can happen all at once. The +new `git annex watch` was not able to use that queue. Today I reworked the +queue machinery to support the types of direct index writes it needs, and +now repeated index writes are eliminated. + +... Eliminated too far, it turns out, since it doesn't yet *ever* flush +that queue until shutdown! So the next step here will be to have a worker +thread that wakes up periodically, flushes the queue, and autocommits. +(This will, in fact, be the start of the [[syncing]] phase of my roadmap!) +There's lots of room here for smart behavior. Like, if a lot of changes are +being made close together, wait for them to die down before committing. Or, +if it's been idle and a single file appears, commit it immediately, since +this is probably something the user wants synced out right away. I'll start +with something stupid and then add the smarts. + +(BTW, in all my years of programming, I have avoided threads like the nasty +bug-prone plague they are. Here I already have three threads, and am going to +add probably 4 or 5 more before I'm done with the git annex assistant. So +far, it's working well -- I give credit to Haskell for making it easy to +manage state in ways that make it possible to reason about how the threads +will interact.) + +What about the races I've been stressing over? Well, I have an ulterior +motive in speeding up `git annex watch`, and that's to also be able to +**slow it down**. Running in slow-mo makes it easy to try things that might +cause a race and watch how it reacts. I'll be using this technique when +I circle back around to dealing with the races. + +Another tricky speed problem came up today that I also need to fix. On +startup, `git annex watch` scans the whole tree to find files that have +been added or moved etc while it was not running, and take care of them. +Currently, this scan involves re-staging every symlink in the tree. That's +slow! I need to find a way to avoid re-staging symlinks; I may use `git +cat-file` to check if the currently staged symlink is correct, or I may +come up with some better and faster solution. Sleeping on this problem. + +---- + +Oh yeah, I also found one more race bug today. It only happens at startup +and could only make it miss staging file deletions. diff --git a/doc/design/assistant/blog/day_4__speed/comment_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment b/doc/design/assistant/blog/day_4__speed/comment_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment new file mode 100644 index 000000000..fb5b95490 --- /dev/null +++ b/doc/design/assistant/blog/day_4__speed/comment_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawldKnauegZulM7X6JoHJs7Gd5PnDjcgx-E" + nickname="Matt" + subject="open source?" + date="2012-06-09T22:34:30Z" + content=""" +Are you publishing the source code for git-annex assistant somewhere? +"""]] diff --git a/doc/design/assistant/blog/day_4__speed/comment_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment b/doc/design/assistant/blog/day_4__speed/comment_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment new file mode 100644 index 000000000..1fcc197ab --- /dev/null +++ b/doc/design/assistant/blog/day_4__speed/comment_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.126" + subject="comment 2" + date="2012-06-09T23:01:29Z" + content=""" +Yes, it's in [[git|download]] with the rest of git-annex. Currently in the `watch` branch. +"""]] diff --git a/doc/design/assistant/blog/day_50__directory_name.mdwn b/doc/design/assistant/blog/day_50__directory_name.mdwn new file mode 100644 index 000000000..a0e57cae6 --- /dev/null +++ b/doc/design/assistant/blog/day_50__directory_name.mdwn @@ -0,0 +1,20 @@ +Based on the results of yesterday's poll, the WebApp defaults to +`~/Desktop/annex` when run in the home directory. If there's no `Desktop` +directory, it uses just `~/annex`. And if run from some other place than +the home directory, it assumes you want to use cwd. Of course, you can +change this default, but I think it's a good one for most use cases. + +---- + +My work today has all been on making **one second** of the total lifetime +of the WebApp work. It's the very tricky second in between clicking on +"Make repository" and being redirected to a WebApp running in your new +repository. The trickiness involves threads, and MVars, and +multiple web servers, and I don't want to go into details here. +I'd rather forget. ;-) + +Anyway, it works; you can run "git annex webapp" and be walked right +through to having a usable repository! Now I need to see about adding +that to the desktop menus, and making "git annex webapp", when run a second +time, remembering where your repository is. I'll use +`~/.config/git-annex/repository` for storing that. diff --git a/doc/design/assistant/blog/day_50__directory_name/comment_1_782cec95a8558a05b2b38a2d2302214d._comment b/doc/design/assistant/blog/day_50__directory_name/comment_1_782cec95a8558a05b2b38a2d2302214d._comment new file mode 100644 index 000000000..be55932f1 --- /dev/null +++ b/doc/design/assistant/blog/day_50__directory_name/comment_1_782cec95a8558a05b2b38a2d2302214d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-08-01T21:19:03Z" + content=""" +Please use `$XDG_CONFIG_HOME` and fall back to `~/.config` if that's not defined. +"""]] diff --git a/doc/design/assistant/blog/day_50__directory_name/comment_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment b/doc/design/assistant/blog/day_50__directory_name/comment_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment new file mode 100644 index 000000000..a09b721be --- /dev/null +++ b/doc/design/assistant/blog/day_50__directory_name/comment_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://piotr.ozarowski.pl/" + nickname="POX" + subject="XDG" + date="2012-08-02T10:30:55Z" + content=""" +same for XDG_DESKTOP_DIR (for pl_PL ~/.config/user-dirs.dirs file contains XDG_DESKTOP_DIR=\"$HOME/Pulpit\" instead of Desktop) +"""]] diff --git a/doc/design/assistant/blog/day_51__desktop.mdwn b/doc/design/assistant/blog/day_51__desktop.mdwn new file mode 100644 index 000000000..c079a9a91 --- /dev/null +++ b/doc/design/assistant/blog/day_51__desktop.mdwn @@ -0,0 +1,34 @@ +Now installing git-annex automatically generates a freedesktop.org .desktop +file, and installs it, either system-wide (root) or locally (user). So +`Menu -> Internet -> Git Annex` will start up the web app. + +(I don't entirely like putting it on the Internet menu, but the +Accessories menu is not any better (and much more crowded here), +and there's really no menu where it entirely fits.) + +I generated that file by writing a generic library to deal with +freedesktop.org desktop files and locations. Which seemed like overkill at +the time, but then I found myself continuing to use that library. Funny how +that happens. + +So, there's also another .desktop file that's used to autostart the +`git-annex assistant` daemon when the user logs into the desktop. + +This even works when git-annex is installed to the ugly non-PATH location +`.cabal/bin/git-annex` by Cabal! To make that work, it records the path +the binary is at to a freedesktop.org data file, at install time. + +--- + +That should all work in Gnome, KDE, XFCE, etc. Not Mac OSX I'm guessing... + +--- + +Also today, I added a sidebar notification when the assistant notices new +files. To make that work well, I implemented merging of related sidebar +action notifications, so the effect is that there's one notification that +collectes a list of recently added files, and transient notifications that +show up if a really big file is taking a while to checksum. + +I'm pleased that the notification interface is at a point where I was able +to implement all that, entirely in pure functional code. diff --git a/doc/design/assistant/blog/day_52__file_browser.mdwn b/doc/design/assistant/blog/day_52__file_browser.mdwn new file mode 100644 index 000000000..a9762cc09 --- /dev/null +++ b/doc/design/assistant/blog/day_52__file_browser.mdwn @@ -0,0 +1,21 @@ +Today I added a "Files" link in the navbar of the WebApp. It looks like a +regular hyperlink, but clicking on it opens up your desktop's native file +manager, to manage the files in the repository! + +Quite fun to be able to do this kind of thing from a web page. :) + +--- + +Made `git annex init` (and the WebApp) automatically generate a description +of the repo when none is provided. + +--- + +Also worked on the configuration pages some. I don't want to get ahead +of myself by diving into the full configuration stage yet, but I am at +least going to add a configuration screen to clone the repo to a removable +drive. + +After that, the list of transfers on the dashboard needs some love. +I'll probably start by adding UI to cancel running transfers, and then +try to get drag and drop reordering of transfers working. diff --git a/doc/design/assistant/blog/day_52__file_browser/comment_1_cd000c2d56b60cc1f17b221322a32aa7._comment b/doc/design/assistant/blog/day_52__file_browser/comment_1_cd000c2d56b60cc1f17b221322a32aa7._comment new file mode 100644 index 000000000..206b0c70e --- /dev/null +++ b/doc/design/assistant/blog/day_52__file_browser/comment_1_cd000c2d56b60cc1f17b221322a32aa7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cweiske.de/" + nickname="cweiske" + subject="comment 1" + date="2012-08-15T22:02:14Z" + content=""" +I thought that most (if not all) browsers prevent opening local files/directories via web pages. How did you solve that problem? +"""]] diff --git a/doc/design/assistant/blog/day_52__file_browser/comment_2_21d1da67cf9105a545583ba2302c10fb._comment b/doc/design/assistant/blog/day_52__file_browser/comment_2_21d1da67cf9105a545583ba2302c10fb._comment new file mode 100644 index 000000000..9ba5104e2 --- /dev/null +++ b/doc/design/assistant/blog/day_52__file_browser/comment_2_21d1da67cf9105a545583ba2302c10fb._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-08-16T23:34:12Z" + content=""" +Yes, it's surprising to me when I see it work, and I wrote it. :) Since git-annex is running locally on the same system as the browser, it can open the file manager when the user clicks on a link in the web browser. To the web browser, this is just an AJAX request. +"""]] diff --git a/doc/design/assistant/blog/day_54__adding_removable_drives.mdwn b/doc/design/assistant/blog/day_54__adding_removable_drives.mdwn new file mode 100644 index 000000000..8d57518bb --- /dev/null +++ b/doc/design/assistant/blog/day_54__adding_removable_drives.mdwn @@ -0,0 +1,99 @@ +Spent yesterday and today making the WebApp handle adding removable drives. + +While it needs more testing, I think that it's now possible to use the WebApp +for a complete sneakernet usage scenario. + +* Start up the webapp, let it make a local repo. +* Add some files, by clicking to open the file manager, and dragging them in. +* Plug in a drive, and tell the webapp to add it. +* Wait while files sync.. +* Take the drive to another computer, and repeat the process there. + +No command-line needed, and files will automatically be synced between +two or more computers using the drive. + +Sneakernet is only one usage scenario for the git-annex assistant, but I'm +really happy to have one scenario 100% working! + +Indeed, since the assistant and webapp can now actually do something +useful, I'll probably be merging them into `master` soon. + +Details follow.. + +--- + +So, yesterday's part of this was building the configuration page to add +a removable drive. That needs to be as simple as possible, and it currently +consists of a list of things git-annex thinks might be mount points of +removable drives, along with how much free space they have. Pick a drive, +click the pretty button, and away it goes.. + +(I decided to make the page so simple it doesn't even ask where you want +to put the directory on the removable drive. It always puts it in +a "annex" directory. I might add an expert screen later, but experts can +always set this up themselves at the command line too.) + +I also fought with Yesod and Bootstrap rather a lot to make the form look good. +Didn't entirely succeed, and had to file a bug on Yesod about its handling of +check boxes. (Bootstrap also has a bug, IMHO; its drop down lists are not +always sized wide enough for their contents.) + +Ideally this configuration page would listen for mount events, and refresh +its list. I may add that eventually; I didn't have a handy channel it +could use to do that, so defferred it. Another idea is to have the mount +event listener detect removable drives that don't have an annex on them yet, +and pop up an alert with a link to this configuration page. + +---- + +Making the form led to a somewhat interesting problem: How to tell if a mounted +filesystem is a removable drive, or some random thing like `/proc` or +a fuse filesystem. My answer, besides checking that the user can +write to it, was various heuristics, which seem to work ok, at least here.. + +[[!format haskell """ + sane Mntent { mnt_dir = dir, mnt_fsname = dev } + {- We want real disks like /dev/foo, not + - dummy mount points like proc or tmpfs or + - gvfs-fuse-daemon. -} + | not ('/' `elem` dev) = False + {- Just in case: These mount points are surely not + - removable disks. -} + | dir == "/" = False + | dir == "/tmp" = False + | dir == "/run/shm" = False + | dir == "/run/lock" = False +"""]] + +---- + +Today I did all the gritty coding to make it create a git repository on the +removable drive, and tell the Annex monad about it, and ensure it gets synced. + +As part of that, it detects when the removable drive's filesystem doesn't +support symlinks, and makes a bare repository in that case. Another expert +level config option that's left out for now is to always make a bare +repository, or even to make a directory special remote rather than a git +repository at all. (But directory special remotes cannot support the +sneakernet use case by themselves...) + +---- + +Another somewhat interesting problem was what to call the git remotes +that it sets up on the removable drive and the local repository. +Again this could have an expert-level configuration, but the defaults +I chose are to use the hostname as the remote name on the removable drive, +and to use the basename of the mount point of the removable drive as the +remote name in the local annex. + +---- + +Originally, I had thought of this as cloning the repository to the drive. +But, partly due to luck, I started out just doing a `git init` to make +the repository (I had a function lying around to do that..). + +And as I worked on it some more, I realized this is not as simple as a +clone. It's a bi-directional sync/merge, and indeed the removable drive may +have all the data already in it, and the local repository have just been +created. Handling all the edge cases of that (like, the local repository +may not have a "master" branch yet..) was fun! diff --git a/doc/design/assistant/blog/day_54__adding_removable_drives/comment_1_5de4f220a3534f55b1f2208d1d812d63._comment b/doc/design/assistant/blog/day_54__adding_removable_drives/comment_1_5de4f220a3534f55b1f2208d1d812d63._comment new file mode 100644 index 000000000..56f513a38 --- /dev/null +++ b/doc/design/assistant/blog/day_54__adding_removable_drives/comment_1_5de4f220a3534f55b1f2208d1d812d63._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-08-05T23:50:57Z" + content=""" +Using `annex` as default is fine, but even non-technical users will need a way to create different annexes for different usage. Or if two users share one thumb drive and each has their own annex. Long story short, I don't think this is an expert option, but something every user should be able to change immediately. + +A pre-populated text area makes most sense, imo. +"""]] diff --git a/doc/design/assistant/blog/day_54__adding_removable_drives/comment_2_8dae1ed0a70acf9628b88692dc32ac5f._comment b/doc/design/assistant/blog/day_54__adding_removable_drives/comment_2_8dae1ed0a70acf9628b88692dc32ac5f._comment new file mode 100644 index 000000000..b26d9b85f --- /dev/null +++ b/doc/design/assistant/blog/day_54__adding_removable_drives/comment_2_8dae1ed0a70acf9628b88692dc32ac5f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="comment 2" + date="2012-08-06T08:30:47Z" + content=""" ++1 on what Richard said +about the correctly figuring out what are valid mountpoints / devices that can be used, your current code doesn't seem very robust. +check this out https://github.com/Dieterbe/aif/blob/develop/src/core/libs/lib-blockdevices-filesystems.sh#L213 +"""]] diff --git a/doc/design/assistant/blog/day_55__alerts.mdwn b/doc/design/assistant/blog/day_55__alerts.mdwn new file mode 100644 index 000000000..95e52e8ad --- /dev/null +++ b/doc/design/assistant/blog/day_55__alerts.mdwn @@ -0,0 +1,10 @@ +Nothing flashy today; I was up all night trying to download photos taken +by a robot lowered onto Mars by a skycrane. + +Some work on alerts. Added an alert when a file transfer succeeds or fails. +Improved the alert combining code so it handles those alerts, and +simplified it a lot, and made it more efficient. + +Also made the text of action alerts change from present to past tense when +the action finishes. To support that I wrote a fun data type, a `TenseString` +that can be rendered in either tense. diff --git a/doc/design/assistant/blog/day_55__alerts/comment_1_6319045500a8a5e049304fdec5ff4cf4._comment b/doc/design/assistant/blog/day_55__alerts/comment_1_6319045500a8a5e049304fdec5ff4cf4._comment new file mode 100644 index 000000000..67259bf1e --- /dev/null +++ b/doc/design/assistant/blog/day_55__alerts/comment_1_6319045500a8a5e049304fdec5ff4cf4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJ2utMQgMEYAOs3Dfc6eZRyUzt4acNXUU" + nickname="David" + subject="comment 1" + date="2012-08-06T23:48:28Z" + content=""" +I see you are a regular XKCD reader +"""]] diff --git a/doc/design/assistant/blog/day_56__transfer_control.mdwn b/doc/design/assistant/blog/day_56__transfer_control.mdwn new file mode 100644 index 000000000..1ce926897 --- /dev/null +++ b/doc/design/assistant/blog/day_56__transfer_control.mdwn @@ -0,0 +1,8 @@ +A bit under the weather, but got into building buttons to control running +and queued transfers today. The html and javascript side is done, with +each transfer now having a cancel button, as well as a pause/start button. + +Canceling queued transfers works. Canceling running transfers will +need some more work, because killing a thread doesn't kill the processes +being run by that thread. So I'll have to make the assistant run separate +git-annex processes for transfers, that can be individually sent signals. diff --git a/doc/design/assistant/blog/day_57__afk.mdwn b/doc/design/assistant/blog/day_57__afk.mdwn new file mode 100644 index 000000000..c72849ce7 --- /dev/null +++ b/doc/design/assistant/blog/day_57__afk.mdwn @@ -0,0 +1,40 @@ +Probably won't be doing any big coding on the git-annex assistant in the +upcoming week, as I'll be traveling and/or slightly ill enough that I can't +fully get into flow. + +--- + +There was a new Yesod release this week, which required minor changes to +make the webapp build with it. I managed to keep the old version of Yesod +also supported, and plan to keep that working so it can be built with the +version of Yesod available in, eg, Linux distributions. TBD how much pain +that will involve going forward. + +--- + +I'm mulling over how to support stopping/pausing transfers. The problem +is that if the assistant is running a transfer in one thread, and the +webapp is used to cancel it, killing that thread won't necessarily stop the +transfer, because, at least in Haskell's thread model, killing a thread +does not kill processes started by the thread (like rsync). + +So one option is to have the transfer thread run a separate git-annex +process, which will run the actual transfer. And killing that process will +stop the transfer nicely. However, using a separate git-annex process means +a little startup overhead for each file transferred (I don't know if it'd +be enough to matter). Also, there's the problem that git-annex is sometimes +not installed in PATH (wish I understood why cabal does that), which +makes it kind of hard for it to run itself. (It can't simply fork, sadly. +See past horrible pain with forking and threads.) + +The other option is to change the API for git-annex remotes, so that +their `storeKey` and `retrieveKeyFile` methods return a pid of the program +that they run. When they *do* run a program.. not all remotes do. This +seems like it'd make the code in the remotes hairier, and it is also asking +for bugs, when a remote's implementation changes. Or I could go +lower-level, and make every place in the utility libraries that forks a +process record its pid in a per-thread MVar. Still seems to be asking for +bugs. + +Oh well, at least git-annex is already crash-safe, so once I figure out +how to kill a transfer process, I can kill it safely. :) diff --git a/doc/design/assistant/blog/day_57__afk/comment_1_70e1c9f925f040c1700d3e26bab373d5._comment b/doc/design/assistant/blog/day_57__afk/comment_1_70e1c9f925f040c1700d3e26bab373d5._comment new file mode 100644 index 000000000..c83403620 --- /dev/null +++ b/doc/design/assistant/blog/day_57__afk/comment_1_70e1c9f925f040c1700d3e26bab373d5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://claimid.com/strager" + nickname="strager" + subject="comment 1" + date="2012-08-11T04:50:52Z" + content=""" +What if `storeKey`, `retrieveKeyFile`, etc. return an `IO ()` which cancels the operation, if possible? The implementation can be canceled regardless if it uses separate processes or Haskell threads. + +"""]] diff --git a/doc/design/assistant/blog/day_57__afk/comment_2_c70d3faccfcebf47deb25e270498cb56._comment b/doc/design/assistant/blog/day_57__afk/comment_2_c70d3faccfcebf47deb25e270498cb56._comment new file mode 100644 index 000000000..7539ea2de --- /dev/null +++ b/doc/design/assistant/blog/day_57__afk/comment_2_c70d3faccfcebf47deb25e270498cb56._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://claimid.com/strager" + nickname="strager" + subject="comment 2" + date="2012-08-11T04:55:13Z" + content=""" +In fact, making a dedicated data type or some typeclasses may be more appropriate: + + class Cancelable a where cancel :: a -> IO () + class Pauseable a where pause :: a -> IO () + + -- Alternatively: + + data Transfer = Transfer { cancel :: IO (), pause :: IO () } + + -- Or both! + +"""]] diff --git a/doc/design/assistant/blog/day_57__afk/comment_3_89020ebc6d31485339bdea41a872df3c._comment b/doc/design/assistant/blog/day_57__afk/comment_3_89020ebc6d31485339bdea41a872df3c._comment new file mode 100644 index 000000000..ed02b9dce --- /dev/null +++ b/doc/design/assistant/blog/day_57__afk/comment_3_89020ebc6d31485339bdea41a872df3c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 3" + date="2012-08-11T14:41:51Z" + content=""" +That's the lines I was thinking along, and I even made a throwaway branch with some types. But the problem is reworking all the code to do that. Particularly since lots of the code uses generic utility functions that are reused in other, unrelated places and would have to be modified to pass back cancel actions. + +The first case the type checker landed me on when I changed the types was code that downloads an url from the web. Naturally that uses a Utility.Url.download. How to cancel `download`? Depends on its implementation -- it happens to currently shell out to curl, so you have to kill curl, but it could just as easily have used libcurl (other parts of my Utility.Url library do), and then it would need to fork its own thread. So it's an abstraction layer violation problem. + +If I had a month to devote to this one problem, I might manage to come up with some clean solution involving monads, or maybe convert all my code to use conduit or something that might allow managing these effects better. Just a guess.. +"""]] diff --git a/doc/design/assistant/blog/day_57__afk/comment_4_8b1f65f141ffd9813e7f5a3380f7f520._comment b/doc/design/assistant/blog/day_57__afk/comment_4_8b1f65f141ffd9813e7f5a3380f7f520._comment new file mode 100644 index 000000000..c87e447d1 --- /dev/null +++ b/doc/design/assistant/blog/day_57__afk/comment_4_8b1f65f141ffd9813e7f5a3380f7f520._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://claimid.com/strager" + ip="173.228.13.253" + subject="comment 4" + date="2012-08-11T16:08:47Z" + content=""" +> How to cancel download? Depends on its implementation .... So it's an abstraction layer violation problem. + +Precisely why I suggested returning something as generic as `IO ()`: + + -- Current + download :: URLString -> Headers -> [CommandParam] -> FilePath -> IO Bool + + -- Suggestion + data Transfer a = Transfer { run :: IO a, cancel :: IO () } + download :: URLString -> Headers -> [CommandParam] -> FilePath -> Transfer + + transfer <- download ... + -- You can pass `cancel transfer` to another thread + -- which you want to be able to cancel the transfer. + run transfer -- blocking + +I realized while writing this that you may not get any result from e.g. a download while it is occurring (because the function is blocking). Maybe that's where a misunderstanding occurred. I separated the concepts of creating a transfer and starting/canceling it. + +(My idea is starting to feel a bit object-oriented... ;P) + +"""]] diff --git a/doc/design/assistant/blog/day_58__more_transfer_control.mdwn b/doc/design/assistant/blog/day_58__more_transfer_control.mdwn new file mode 100644 index 000000000..08b69a75d --- /dev/null +++ b/doc/design/assistant/blog/day_58__more_transfer_control.mdwn @@ -0,0 +1,26 @@ +Unexpectedly managed a mostly productive day today. + +Went ahead with making the assistant run separate `git-annex` processes for +transfers. This will currently fail if git-annex is not installed in PATH. +(Deferred dealing with that.) + +To stop a transfer, the webapp needs to signal not just the git-annex +process, but all its children. I'm using process groups for this, which is +working, but I'm not extremely happy with. + +Anyway, the webapp's UI can now be used for stopping transfers, and it +wasn't far from there to also implementing pausing of transfers. + +Pausing a transfer is actually the same as stopping it, except a special +signal is sent to the transfer control thread, which keeps running, despite +the git-annex process having been killed, waits for a special resume +signal, and restarts the transfer. This way a paused transfer continues to +occupy a transfer slot, which prevents other queued transfers from running. +This seems to be the behavior that makes sense. + +Still need to wire up the webapp's button for starting a transfer. For a +paused transfer, that will just need to resume it. I have not decided what +the button should do when used on a transfer that is queued but not running +yet. Maybe it forces it to run even if all transfer slots are already in +use? Maybe it stops one of the currently running transfers to free up a +slot? diff --git a/doc/design/assistant/blog/day_59__dinner.mdwn b/doc/design/assistant/blog/day_59__dinner.mdwn new file mode 100644 index 000000000..545125ac6 --- /dev/null +++ b/doc/design/assistant/blog/day_59__dinner.mdwn @@ -0,0 +1,10 @@ +Actually did do some work on the webapp today, just fixing a bug I noticed +in a spare moment. Also managed a bit in the plane earlier this week, +implementing resuming of paused transfers. (Still need to test that.) + +But the big thing today was dinner with one of my major Kickstarter +backers, and as it turned out, "half the Haskell community of San +Francisco" (3 people). Enjoyed talking about git-annex and haskell with +them. + +I'm looking forward to getting back home and back to work on Monday.. diff --git a/doc/design/assistant/blog/day_59__dinner/comment_1_0c1e2d69496473e7e4a2956a2814f5dd._comment b/doc/design/assistant/blog/day_59__dinner/comment_1_0c1e2d69496473e7e4a2956a2814f5dd._comment new file mode 100644 index 000000000..1e10549d3 --- /dev/null +++ b/doc/design/assistant/blog/day_59__dinner/comment_1_0c1e2d69496473e7e4a2956a2814f5dd._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://claimid.com/strager" + ip="173.228.13.253" + subject="comment 1" + date="2012-08-17T15:59:49Z" + content=""" +It was fun to have you here! =] + +"""]] diff --git a/doc/design/assistant/blog/day_5__committing.mdwn b/doc/design/assistant/blog/day_5__committing.mdwn new file mode 100644 index 000000000..562387380 --- /dev/null +++ b/doc/design/assistant/blog/day_5__committing.mdwn @@ -0,0 +1,57 @@ +After a few days otherwise engaged, back to work today. + +My focus was on adding the committing thread mentioned in [[day_4__speed]]. +I got rather further than expected! + +First, I implemented a really dumb thread, that woke up once per second, +checked if any changes had been made, and committed them. Of course, this +rather sucked. In the middle of a large operation like untarring a tarball, +or `rm -r` of a large directory tree, it made lots of commits and made +things slow and ugly. This was not unexpected. + +So next, I added some smarts to it. First, I wanted to stop it waking up +every second when there was nothing to do, and instead blocking wait on a +change occurring. Secondly, I wanted it to know when past changes happened, +so it could detect batch mode scenarios, and avoid committing too +frequently. + +I played around with combinations of various Haskell thread communications +tools to get that information to the committer thread: `MVar`, `Chan`, +`QSem`, `QSemN`. Eventually, I realized all I needed was a simple channel +through which the timestamps of changes could be sent. However, `Chan` +wasn't quite suitable, and I had to add a dependency on +[Software Transactional Memory](http://en.wikipedia.org/wiki/Software_Transactional_Memory), +and use a `TChan`. Now I'm cooking with gas! + +With that data channel available to the committer thread, it quickly got +some very nice smart behavior. Playing around with it, I find it commits +*instantly* when I'm making some random change that I'd want the +git-annex assistant to sync out instantly; and that its batch job detection +works pretty well too. + +There's surely room for improvement, and I made this part of the code +be an entirely pure function, so it's really easy to change the strategy. +This part of the committer thread is so nice and clean, that here's the +current code, for your viewing pleasure: + +[[!format haskell """ +{- Decide if now is a good time to make a commit. + - Note that the list of change times has an undefined order. + - + - Current strategy: If there have been 10 commits within the past second, + - a batch activity is taking place, so wait for later. + -} +shouldCommit :: UTCTime -> [UTCTime] -> Bool +shouldCommit now changetimes + | len == 0 = False + | len > 4096 = True -- avoid bloating queue too much + | length (filter thisSecond changetimes) < 10 = True + | otherwise = False -- batch activity + where + len = length changetimes + thisSecond t = now `diffUTCTime` t <= 1 +"""]] + +Still some polishing to do to eliminate minor inefficiencies and deal +with more races, but this part of the git-annex assistant is now very usable, +and will be going out to my beta testers soon! diff --git a/doc/design/assistant/blog/day_60__taking_stock.mdwn b/doc/design/assistant/blog/day_60__taking_stock.mdwn new file mode 100644 index 000000000..040d0cd7c --- /dev/null +++ b/doc/design/assistant/blog/day_60__taking_stock.mdwn @@ -0,0 +1,40 @@ +As I prepare to dive back into development, now is a good time to review +what I've built so far, and how well I'm keeping up with my planned +[[roadmap|assistant]]. + +I started working two and a half months ago, so am nearing the end of +the three months I originally asked to be funded for on Kickstarter. + +I've built much of what I planned to build in the first three months -- +[[inotify]] is done (and kqueue is basically working, but needs scalability +work), local [[syncing]] is done, the [[webapp]] works, and I've built some +of the first [[configurators]]. It's all functional in a narrow use case +involving syncing to removable drives. + +[[progressbars]] still need to be dealt with, and network syncing needs to +be revisited soon, so that I can start building easy configurators for +further use cases, like using the cloud, or another machine on the local +network. + +I think I'm a little behind my original schedule, but not too bad, +and at the same time, I think I've built things rather more solidly than I +expected them to be at this point. I'm particularly happy with how well +the inotify code works, no matter what is thrown at it, and how nice +the UI in the webapp is shaping up to be. + +---- + +I also need to get started on fulfilling my Kickstarter rewards, and +I was happy to spend some time in the airport working on the main +blocker toward that, a lack of a scalable git-annex logo, which is needed +for printing on swag. + +Turns out that inkscape has some amazing bitmap tracing capabilities. +I was able to come up with this scalable logo in short order, it +actually took longer to add back the colors, as the tracer generated a +black and white version. + +With that roadblock out of the way, I am moving toward ordering large +quantities of usb drives, etc. + +[[logo.svg]] diff --git a/doc/design/assistant/blog/day_60__taking_stock/comment_1_6722f81ee084f1ea9e8fe47f34576397._comment b/doc/design/assistant/blog/day_60__taking_stock/comment_1_6722f81ee084f1ea9e8fe47f34576397._comment new file mode 100644 index 000000000..cfe4fa300 --- /dev/null +++ b/doc/design/assistant/blog/day_60__taking_stock/comment_1_6722f81ee084f1ea9e8fe47f34576397._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="better logo?" + date="2012-08-20T21:22:25Z" + content=""" +Maybe you should contact designers and see what kind of logo they can come up with. Probably something better. +"""]] diff --git a/doc/design/assistant/blog/day_61__network_connection_detection.mdwn b/doc/design/assistant/blog/day_61__network_connection_detection.mdwn new file mode 100644 index 000000000..8ab40f516 --- /dev/null +++ b/doc/design/assistant/blog/day_61__network_connection_detection.mdwn @@ -0,0 +1,36 @@ +Today, added a thread that deals with recovering when there's been a loss +of network connectivity. When the network's down, the normal immediate +syncing of changes of course doesn't work. So this thread detects when the +network comes back up, and does a pull+push to network remotes, and +triggers scanning for file content that needs to be transferred. + +I used dbus again, to detect events generated by both network-manager and +wicd when they've sucessfully brought an interface up. Or, if they're not +available, it polls every 30 minutes. + +When the network comes up, in addition to the git pull+push, it also +currently does a full scan of the repo to find files whose contents +need to be transferred to get fully back into sync. + +I think it'll be ok for some git pulls and pushes to happen when +moving to a new network, or resuming a laptop (or every 30 minutes when +resorting to polling). But the transfer scan is currently really too heavy +to be appropriate to do every time in those situations. I have an idea for +avoiding that scan when the remote's git-annex branch has not changed. But +I need to refine it, to handle cases like this: + +1. a new remote is added +2. file contents start being transferred to (or from it) +3. the network is taken down +4. all the queued transfers fail +5. the network comes back up +6. the transfer scan needs to know the remote was not all in sync + before #3, and so should do a full scan despite the git-annex branch + not having changed + +--- + +Doubled the ram in my netbook, which I use for all development. Yesod needs +rather a lot of ram to compile and link, and this should make me quite a +lot more productive. I was struggling with OOM killing bits of chromium +during my last week of development. diff --git a/doc/design/assistant/blog/day_61__network_connection_detection/comment_1_09b58f41a8d48f218619711ee19511ac._comment b/doc/design/assistant/blog/day_61__network_connection_detection/comment_1_09b58f41a8d48f218619711ee19511ac._comment new file mode 100644 index 000000000..029aec783 --- /dev/null +++ b/doc/design/assistant/blog/day_61__network_connection_detection/comment_1_09b58f41a8d48f218619711ee19511ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="Amazon Glacier" + date="2012-08-23T06:32:24Z" + content=""" +Do you think git-annex could support [Amazon Glacier](http://aws.amazon.com/glacier/) as a backend? +"""]] diff --git a/doc/design/assistant/blog/day_62__smarter_syncing.mdwn b/doc/design/assistant/blog/day_62__smarter_syncing.mdwn new file mode 100644 index 000000000..28fa892d3 --- /dev/null +++ b/doc/design/assistant/blog/day_62__smarter_syncing.mdwn @@ -0,0 +1,21 @@ +Woke up this morning with most of the design for a smarter approach to +[[syncing]] in my head. (This is why I sometimes slip up and tell people I +work on this project 12 hours a day..) + +To keep the current `assistant` branch working while I make changes +that break use cases that are working, I've started +developing in a new branch, `assistant-wip`. + +In it, I've started getting rid of unnecessary expensive transfer scans. + +First optimisation I've done is to detect when a remote that was +disconnected has diverged its `git-annex` branch from the local branch. +Only when that's the case does a new transfer scan need to be done, to find +out what new stuff might be available on that remote, to have caused the +change to its branch, while it was disconnected. + +That broke a lot of stuff. I have a plan to fix it written down in +[[syncing]]. It'll involve keeping track of whether a transfer scan has +ever been done (if not, one should be run), and recording logs when +transfers failed, so those failed transfers can be retried when the +remote gets reconnected. diff --git a/doc/design/assistant/blog/day_63__transfer_retries.mdwn b/doc/design/assistant/blog/day_63__transfer_retries.mdwn new file mode 100644 index 000000000..d668f507b --- /dev/null +++ b/doc/design/assistant/blog/day_63__transfer_retries.mdwn @@ -0,0 +1,26 @@ +Implemented everything I planned out yesterday: Expensive scans are only +done once per remote (unless the remote changed while it was disconnected), +and failed transfers are logged so they can be retried later. + +Changed the TransferScanner to prefer to scan low cost remotes first, +as a crude form of scheduling lower-cost transfers first. + +A whole bunch of interesting syncing scenarios should work now. I have not +tested them all in detail, but to the best of my knowledge, all these +should work: + +* Connect to the network. It starts syncing with a networked remote. + Disconnect the network. Reconnect, and it resumes where it left off. +* Migrate between networks (ie, home to cafe to work). Any transfers + that can only happen on one LAN are retried on each new network you + visit, until they succeed. + +One that is not working, but is soooo close: + +* Plug in a removable drive. Some transfers start. Yank the plug. + Plug it back in. All necessary transfers resume, and it ends up + fully in sync, no matter how many times you yank that cable. + +That's not working because of an infelicity in the MountWatcher. +It doesn't notice when the drive gets unmounted, so it ignores +the new mount event. diff --git a/doc/design/assistant/blog/day_63__transfer_retries/comment_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment b/doc/design/assistant/blog/day_63__transfer_retries/comment_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment new file mode 100644 index 000000000..119aee2c9 --- /dev/null +++ b/doc/design/assistant/blog/day_63__transfer_retries/comment_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-08-23T21:25:48Z" + content=""" +Do encrypted rsync remotes resume quickly as well? + +One thing I noticed was that if a copy --to an encrypted rsync remote gets interrupted it will remove the tmp file and re-encrypt the whole file before resuming rsync. +"""]] diff --git a/doc/design/assistant/blog/day_64__syncing_robustly.mdwn b/doc/design/assistant/blog/day_64__syncing_robustly.mdwn new file mode 100644 index 000000000..ab0090b92 --- /dev/null +++ b/doc/design/assistant/blog/day_64__syncing_robustly.mdwn @@ -0,0 +1,33 @@ +Working toward getting the data syncing to happen robustly, +so a bunch of improvements. + +* Got unmount events to be noticed, so unplugging and replugging + a removable drive will resume the syncing to it. There's really no + good unmount event available on dbus in kde, so it uses a heuristic + there. +* Avoid requeuing a download from a remote that no longer has a key. +* Run a full scan on startup, for multiple reasons, including dealing with + crashes. + +Ran into a strange issue: Occasionally the assistant will run `git-annex +copy` and it will not transfer the requested file. It seems that +when the copy command runs `git ls-files`, it does not see the file +it's supposed to act on in its output. + +Eventually I figured out what's going on: When updating the git-annex +branch, it sets `GIT_INDEX_FILE`, and of course environment settings are +not thread-safe! So there's a race between threads that access +the git-annex branch, and the Transferrer thread, or any other thread +that might expect to look at the normal git index. + +Unfortunatly, I don't have a fix for this yet.. Git's only interface for +using a different index file is `GIT_INDEX_FILE`. It seems I have a lot of +code to tear apart, to push back the setenv until after forking every git +command. :( + +Before I figured out the root problem, I developed a workaround for the +symptom I was seeing. I added a `git-annex transferkey`, which is +optimised to be run by the assistant, and avoids running `git ls-files`, so +avoids the problem. While I plan to fix this environment variable problem +properly, `transferkey` turns out to be so much faster than how it was +using `copy` that I'm going to keep it. diff --git a/doc/design/assistant/blog/day_65__transfer_polish.mdwn b/doc/design/assistant/blog/day_65__transfer_polish.mdwn new file mode 100644 index 000000000..af1c69162 --- /dev/null +++ b/doc/design/assistant/blog/day_65__transfer_polish.mdwn @@ -0,0 +1,33 @@ +Almost done with the data transfer code.. Today I filled in some bits and +peices. + +Made the expensive transfer scan handle multiple remotes in one pass. +So on startup, it only runs once, not N times. And when reconnecting to the +network, when a remote has changed, it scans all network remotes in one +pass, rather than making M redundant passes. + +Got syncing with special remotes all working. Pretty easy actually. Just +had to avoid doing any git repo push/pull with them, while still queueing +data transfers. + +It'll even download anything it can from the web special remote. To support +that, I added generic support for readonly remotes; it'll only download from +those and not try to upload to them. + +(Oh, and I properly fixed the nasty `GIT_INDEX_FILE` environment variable +problem I had the other day.) + +I feel I'm very close to being able to merge the assistant branch into +master now. I'm reasonably confident the data transfer code will work +well now, and manage to get things in sync eventually in all circumstances. +(Unless there are bugs.) All the other core functionality of the assistant +and webapp is working. The only think I might delay because of is the +missing [[progressbars]] in the webapp .. but that's a silly thing to +block the merge on. + +Still, I might spend a day and get a dumb implementation of progress bars +for downloads working first (progress bars for uploads are probably rather +harder). I'd spend longer on progress bars, but there are so many more +exciting things I'm now ready to develop, like automatic configurators +for using your git annex with Amazon S3, rsync.net, and the computer across +the room..! diff --git a/doc/design/assistant/blog/day_66__the_merge.mdwn b/doc/design/assistant/blog/day_66__the_merge.mdwn new file mode 100644 index 000000000..0442865ba --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge.mdwn @@ -0,0 +1,19 @@ +It's done! The assistant branch is merged into master. + +Updated the [[assistant]] page with some screenshots and instructions for +using it. + +Made some cosmetic fixes to the webapp. + +Fixed the transferrer to use `~/.config/git-annex/program` +to find the path to git-annex when running it. (There are ways to find the +path of the currently running program in unux, but they all suck, so I'm +avoiding them this way.) + +Read some OSX launchd documentation, and it seems it'd be pretty easy to +get the assistant to autostart on login on OSX. If someone would like to +test launchd files for me, get in touch. + +----- + +AKA: Procrastinating really hard on those progress bars. ;) diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_10_eeccf4e73cc321542a1fe4780805a81e._comment b/doc/design/assistant/blog/day_66__the_merge/comment_10_eeccf4e73cc321542a1fe4780805a81e._comment new file mode 100644 index 000000000..2e787076d --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_10_eeccf4e73cc321542a1fe4780805a81e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://kevwalke.myopenid.com/" + ip="94.175.38.180" + subject="confirmed!" + date="2012-09-02T07:17:43Z" + content=""" +Got it built and running. Thanks for this. +I can see already that this is going to be a fantastic application. + +Good Work! +-Kev +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_1_a34e89316d1662826848f31061c4e46b._comment b/doc/design/assistant/blog/day_66__the_merge/comment_1_a34e89316d1662826848f31061c4e46b._comment new file mode 100644 index 000000000..be612801e --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_1_a34e89316d1662826848f31061c4e46b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://kevwalke.myopenid.com/" + ip="94.175.38.180" + subject="well done!" + date="2012-08-27T22:08:23Z" + content=""" +absolutely fantastic news! I am itching to try this out now. Thank you! +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_2_09e244d23d05052fa2b11a7181888366._comment b/doc/design/assistant/blog/day_66__the_merge/comment_2_09e244d23d05052fa2b11a7181888366._comment new file mode 100644 index 000000000..874aa5ea6 --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_2_09e244d23d05052fa2b11a7181888366._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://claimid.com/strager" + ip="173.228.13.253" + subject="comment 2" + date="2012-08-28T16:29:56Z" + content=""" +I have a few OS X machines I can test on. Send me details at: strager.nds@gmail.com +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_3_3961a03e167903959b96b054835613f6._comment b/doc/design/assistant/blog/day_66__the_merge/comment_3_3961a03e167903959b96b054835613f6._comment new file mode 100644 index 000000000..4a4d0df40 --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_3_3961a03e167903959b96b054835613f6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-08-28T18:44:28Z" + content=""" +As per usual I'd volunteer to test on OSX as well. +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_4_12a57af9f580918818b4a9f68396d5c4._comment b/doc/design/assistant/blog/day_66__the_merge/comment_4_12a57af9f580918818b4a9f68396d5c4._comment new file mode 100644 index 000000000..6852a805a --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_4_12a57af9f580918818b4a9f68396d5c4._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://kevwalke.myopenid.com/" + ip="77.86.30.139" + subject="building and installing with cabal" + date="2012-08-29T18:15:07Z" + content=""" +So I got round to trying it out. I cloned the latest from the repository@ git://git-annex.branchable.com/ and then followed the instructions on the install page: http://git-annex.branchable.com/install/cabal/ +However I get a dependency problem: + +cabal install --only-dependencies +Resolving dependencies... +cabal: Could not resolve dependencies: +trying: git-annex-3.20120825 (user goal) +trying: git-annex-3.20120825:+oldyesod +trying: git-annex-3.20120825:+currentyesod +next goal: yesod-default (dependency of git-annex-3.20120825:+oldyesod) +rejecting: yesod-default-1.1.0 (conflict: git-annex-3.20120825:oldyesod => +yesod-default(<=1.0.1.1)) +rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0, 0.6.1, 0.5.0, 0.4.1, 0.4.0, +0.3.1 (conflict: git-annex-3.20120825:currentyesod => yesod-default(>=1.1.0)) + +I'm not sure how to proceed from here and would be grateful of any pointers to help get this built +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_5_8ce638960012367c888e018a5f05db19._comment b/doc/design/assistant/blog/day_66__the_merge/comment_5_8ce638960012367c888e018a5f05db19._comment new file mode 100644 index 000000000..f51f5ef52 --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_5_8ce638960012367c888e018a5f05db19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 5" + date="2012-08-29T22:17:01Z" + content=""" +@kevwalke: I fixed that problem today. +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_6_f461b856b940e6914bcd2b681cf9505f._comment b/doc/design/assistant/blog/day_66__the_merge/comment_6_f461b856b940e6914bcd2b681cf9505f._comment new file mode 100644 index 000000000..2232c426b --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_6_f461b856b940e6914bcd2b681cf9505f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://kevwalke.myopenid.com/" + ip="77.86.30.139" + subject="getting new error now." + date="2012-08-30T11:55:49Z" + content=""" +Seems there is still an issue here on fresh install... + +cabal: Error: some packages failed to install: +dbus-0.10 depends on libxml-sax-0.7.2 which failed to install. +libxml-sax-0.7.2 failed during the configure step. The exception was: +ExitFailure +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_7_6e73aca1fc1747d0e742e054b88b5d78._comment b/doc/design/assistant/blog/day_66__the_merge/comment_7_6e73aca1fc1747d0e742e054b88b5d78._comment new file mode 100644 index 000000000..0cb970a4c --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_7_6e73aca1fc1747d0e742e054b88b5d78._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 7" + date="2012-08-30T17:15:58Z" + content=""" +It's hard to tell from that error message what's going on. I'd hope that there was actually a real error message printed earlier than that that. + +For now, I can only guess.. In order to install the haskell libxml-sax library, you need to have the GNOME XML2 library installed, including development headers. On Debian and derivatives, that is `apt-get install libxml2-dev`. + +Alternatively, you can disable use of dbus by passing this to your cabal install: `--flags=-Dbus` +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment b/doc/design/assistant/blog/day_66__the_merge/comment_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment new file mode 100644 index 000000000..f2068146d --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://kevwalke.myopenid.com/" + ip="94.175.38.180" + subject="thanks" + date="2012-09-01T14:44:58Z" + content=""" +That got rid of that error. However now I get the following at the last step: + +Linking dist/build/git-annex/git-annex ... +Installing executable(s) in /home/kev/bin +setup: git-annex.1: does not exist +cabal: Error: some packages failed to install: +git-annex-3.20120826 failed during the final install step. The exception was: +ExitFailure 1 + +There doesn't seem to be any failures further up the output just some warnings. All the other steps complete fine +Thanks for any advice/pointers here +-Kevin +"""]] diff --git a/doc/design/assistant/blog/day_66__the_merge/comment_9_c06dab4d78122c85beeaf300ffc3e376._comment b/doc/design/assistant/blog/day_66__the_merge/comment_9_c06dab4d78122c85beeaf300ffc3e376._comment new file mode 100644 index 000000000..5a2b3c8d1 --- /dev/null +++ b/doc/design/assistant/blog/day_66__the_merge/comment_9_c06dab4d78122c85beeaf300ffc3e376._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 9" + date="2012-09-01T19:32:02Z" + content=""" +I think I've fixed that. +"""]] diff --git a/doc/design/assistant/blog/day_67__progress_bars.mdwn b/doc/design/assistant/blog/day_67__progress_bars.mdwn new file mode 100644 index 000000000..1110a3c3f --- /dev/null +++ b/doc/design/assistant/blog/day_67__progress_bars.mdwn @@ -0,0 +1,10 @@ +Got the webapp's progress bars updating for downloads. Updated +[[progressbars]] with all the options for ways to get progress info. For +downloads, it currently uses the easy, and not very expensive, approach of +periodically polling the sizes of files that are being downloaded. + +For uploads, something more sophisticated will be called for.. + +--- + +The webapp really feels alive now that it has progress bars! diff --git a/doc/design/assistant/blog/day_68__transfers.mdwn b/doc/design/assistant/blog/day_68__transfers.mdwn new file mode 100644 index 000000000..498f0eae4 --- /dev/null +++ b/doc/design/assistant/blog/day_68__transfers.mdwn @@ -0,0 +1,15 @@ +More work on the display and control of transfers. + +* Hide redundant downloads from the transfer display. It seemed simplest + to keep the behavior of queuing downloads from every remote that has a + file, rather than going to some other data structure, but it's clutter + to display those to the user, especially when you often have 7 copies + of each file, like I do. +* When canceling a download, cancel all other queued downloads of that + key too. +* Fixed unsettting of the paused flag when resuming a paused transfer. +* Implemented starting queued transfers by clicking on the start button. +* Spent a long time debugging why pausing, then resuming, and then pausing + a transfer doesn't successfully pause it the second time. I see where + the code is seemingly locking up in a `throwTo`, but I don't understand + why that blocks forever. Urgh.. diff --git a/doc/design/assistant/blog/day_68__transfers/comment_1_5282960c0b553fbc0f411345b9745324._comment b/doc/design/assistant/blog/day_68__transfers/comment_1_5282960c0b553fbc0f411345b9745324._comment new file mode 100644 index 000000000..0921ae855 --- /dev/null +++ b/doc/design/assistant/blog/day_68__transfers/comment_1_5282960c0b553fbc0f411345b9745324._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-08-29T21:24:37Z" + content=""" +It seems to be a bad idea to cancel everything when I cancel a single transfer. + +I may not want to transmit videos and RAW files at the moment, but would still like to know my JPGs are stored in a second location. + +Two obvious approaches, ideally both offered at the same time would be to allow the user to cancel, cancel all to this remote, and cancel all plus allowing them to send transfers to the end of the queue. + +If this is implemented already then sorry; I did _not_ test if this is available before writing this comment. +"""]] diff --git a/doc/design/assistant/blog/day_69__build_fixes.mdwn b/doc/design/assistant/blog/day_69__build_fixes.mdwn new file mode 100644 index 000000000..c3ee34e27 --- /dev/null +++ b/doc/design/assistant/blog/day_69__build_fixes.mdwn @@ -0,0 +1,7 @@ +Short day today. + +* Worked on fixing a number of build failures people reported. +* Solved the problem that was making transfer pause/resume not always work. + Although there is another bug where pausing a transfer sometimes lets + another queued transfer start running. +* Worked on getting the assistant to start on login on OSX. diff --git a/doc/design/assistant/blog/day_6__polish.mdwn b/doc/design/assistant/blog/day_6__polish.mdwn new file mode 100644 index 000000000..ebe8068c3 --- /dev/null +++ b/doc/design/assistant/blog/day_6__polish.mdwn @@ -0,0 +1,50 @@ +Since my last blog, I've been polishing the `git annex watch` command. + +First, I fixed the double commits problem. There's still some extra +committing going on in the `git-annex` branch that I don't understand. It +seems like a shutdown event is somehow being triggered whenever +a git command is run by the commit thread. + +I also made `git annex watch` run as a proper daemon, with locking to +prevent multiple copies running, and a pid file, and everything. +I made `git annex watch --stop` stop it. + +--- + +Then I managed to greatly increase its startup speed. At startup, it +generates "add" events for every symlink in the tree. This is necessary +because it doesn't really know if a symlink is already added, or was +manually added before it starter, or indeed was added while it started up. +Problem was that these events were causing a lot of work staging the +symlinks -- most of which were already correctly staged. + +You'd think it could just check if the same symlink was in the index. +But it can't, because the index is in a constant state of flux. The +symlinks might have just been deleted and re-added, or changed, and +the index still have the old value. + +Instead, I got creative. :) We can't trust what the index says about the +symlink, but if the index happens to contain a symlink that looks right, +we can trust that the SHA1 of its blob is the right SHA1, and reuse it +when re-staging the symlink. Wham! Massive speedup! + +--- + +Then I started running `git annex watch` on my own real git annex repos, +and noticed some problems.. Like it turns normal files already checked into +git into symlinks. And it leaks memory scanning a big tree. Oops.. + +--- + +I put together a quick screencast demoing `git annex watch`. + + + +While making the screencast, I noticed that `git-annex watch` was spinning +in strace, which is bad news for powertop and battery usage. This seems to +be a [GHC bug](http://bugs.debian.org/677096) also affecting Xmonad. I +tried switching to GHC's threaded runtime, which solves that problem, but +causes git-annex to hang under heavy load. Tried to debug that for quite a +while, but didn't get far. Will need to investigate this further.. +Am seeing indications that this problem only affects ghc 7.4.1; in +particular 7.4.2 does not seem to have the problem. diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn b/doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn new file mode 100644 index 000000000..be83daa31 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn @@ -0,0 +1,66 @@ +Today I built the UI in the webapp to set up a ssh or rsync remote. + +This is the most generic type of remote, and so it's surely got the most +complex description. I've tried to word it as clearly as I can; suggestions +most appreciated. Perhaps I should put in a diagram? + +[[!img /assistant/addsshserver.png]] + +The idea is that this will probe the server, using ssh. If `git-annex-shell` +is available there, it'll go on to set up a full git remote. If not, it'll +fall back to setting up a rsync special remote. It'll even fall all the way +back to using `rsync://` protocol if it can't connect by ssh. So the user +can just point it at a server and let it take care of the details, +generally. + +The trickiest part of this will be authentication, of course. I'm relying +on ssh using `ssh-askpass` to prompt for any passwords, etc, when there's +no controlling terminal. But beyond passwords, this has to deal with ssh +keys. + +I'm planning to make it check if you have a ssh key configured already. If +you do, it doesn't touch your ssh configuration. I don't want to get in the +way of people who have a manual configuration or are using MonkeySphere. + +But for a user who has never set up a ssh key, it will prompt asking if +they'd like a key to be set up. If so, it'll generate a key and configure +ssh to only use it with the server.. and as part of its ssh probe, that key +will be added to `authorized_keys`. + +(Obviously, advanced users can skip this entirely; `git remote add +ssh://...` still works..) + +---- + +Also today, fixed more UI glitches in the transfer display. I think +I have them all fixed now, except for the one that needs lots of javascript +to be written to fix it. + +Amusingly, while I was working on UI glitches, it turned out that all the +fixes involved 100% pure code that has nothing to do with UI. The UI was +actually just exposing bugs. + +For example, closing a running transfer +had a bug that weirdly reordered the queue. This turned out to be +due to the transfer queue actually maintaining two versions of the queue, +one in a TChan and one a list. Some unknown bugs caused these to get out of +sync. That was fixed very handily by deleting the TChan, so there's only +one copy of the data. + +I had only been using that TChan because I wanted a way to block while the +queue was empty. But now that I'm more comfortable with STM, I know how +to do that easily using a list: + +[[!format haskell """ + getQueuedTransfer q = atomically $ do + sz <- readTVar (queuesize q) + if sz < 1 + then retry -- blocks until size changes + else ... +"""]] + +Ah, the times before [STM](http://en.wikipedia.org/wiki/Software_transactional_memory) +were dark times indeed. I'm writing more and more STM code lately, building +up more and more complicated and useful transactions. If you use threads and +don't know about STM, it's a great thing to learn, to get out of the dark ages +of dealing with priority inversions, deadlocks, and races. diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_10_2fac85357ac8feccff82beabd3791439._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_10_2fac85357ac8feccff82beabd3791439._comment new file mode 100644 index 000000000..1b4833b12 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_10_2fac85357ac8feccff82beabd3791439._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 10" + date="2012-09-09T16:58:55Z" + content=""" +That's great news. + +I suggest we disregard this comment thread, i'll just follow the proper bug report(which i guess i should have made to begin with). + +Thanks for your good work. + +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_11_e9e496005fd1bf5a10c9e286b83e51fa._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_11_e9e496005fd1bf5a10c9e286b83e51fa._comment new file mode 100644 index 000000000..1477a71db --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_11_e9e496005fd1bf5a10c9e286b83e51fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 11" + date="2012-09-09T17:12:55Z" + content=""" +That bug should be fixed now. +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_1_913e6ae7c8f7db90b9767ec35fc84205._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_1_913e6ae7c8f7db90b9767ec35fc84205._comment new file mode 100644 index 000000000..f797a0249 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_1_913e6ae7c8f7db90b9767ec35fc84205._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="gpg encryption on ssh remotes" + date="2012-09-01T08:25:17Z" + content=""" +I've been playing around with the Assistant in the last few days. + +And besides for gpg encryption it works great. + +But whenever i set up a special remote(done it manually since you hadn't made this yet) it will break, bad. + +Some files will transfer fine, but at some point it will still(the stdout from git-annex webapp shows gpg being stupid). + +I get a huge amount of [git] in my ps auxw. And two git-annex transferkey --to host --file + +It seems to consistently fall on a 9mb file i have. I have found no way to recover from this(killing and restarting git-annex will say 'transfer already in progress'. Deleting the file was to no avail, it still tries to transfer). + +I have done a lot of testing and i've only seen this on special remotes when gpg encryption is enabled(i haven't tried encryption=shared) + +Besides for this issue, the Assistant is looking great. + +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_2_634ca3c236e2062289e7df5f0d77a3c5._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_2_634ca3c236e2062289e7df5f0d77a3c5._comment new file mode 100644 index 000000000..84e780b4b --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_2_634ca3c236e2062289e7df5f0d77a3c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 2" + date="2012-09-02T21:40:17Z" + content=""" +@tobias, when you say \"gpg being stupid\", what exactly do you see at that point? Please paste it. +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment new file mode 100644 index 000000000..741cdfc63 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 3" + date="2012-09-02T23:49:17Z" + content=""" +Updated to the latest trunk, and did some more testing. + +I'll retract the \"gpg being stupid\" comment. it just gives the normal \"(gpg)\". + +There really isn't anything interesting in the stdout(but a lot of defunct git's in ps auxw), but i still can't get any files larger than ~710kbyte to transfer. They just stall. + +http://pastebin.com/ZA8dzxZD <- stdout/stderr +http://pastebin.com/f1J1T79E <- ps auxw | grep git + +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_4_b15499722a655489f9ea60ff9d4c47c6._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_4_b15499722a655489f9ea60ff9d4c47c6._comment new file mode 100644 index 000000000..d78f3d268 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_4_b15499722a655489f9ea60ff9d4c47c6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 4" + date="2012-09-03T08:12:39Z" + content=""" +So, i've let the assistant run since i posted my last message, while i slept. + +But 8 hours later, it still hasn't made any progress. :( + +Again, only see this with gpg encryption enabled, and on files >700kbyte. +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_5_8ea48276f060e75d9f40617d2a1ccd08._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_5_8ea48276f060e75d9f40617d2a1ccd08._comment new file mode 100644 index 000000000..0cbf81e41 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_5_8ea48276f060e75d9f40617d2a1ccd08._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 5" + date="2012-09-04T20:06:17Z" + content=""" +Can you try running the transfer command by hand? The command line is: + +`/home/alansmithee/bin/git-annex transferkey SHA256-s806100--ad2c33a88a665c56d97393fad99b37529afc5947694eab7d9c27f4d178d182f4 --to host1free --file 787kbyte.txt` + +Paste me the full output until it seems to hang (if it hangs this way), and if it does hang you may also need to strace it and send me that.. +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_6_9b8bf7e9fa715977fbeb98087deefd1a._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_6_9b8bf7e9fa715977fbeb98087deefd1a._comment new file mode 100644 index 000000000..c5c2aaa8a --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_6_9b8bf7e9fa715977fbeb98087deefd1a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 6" + date="2012-09-04T21:57:05Z" + content=""" +No joy. + +strace: http://pastebin.com/UYSrZZAg +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_7_42e09eacdc10c7cf579bfc6470b5117c._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_7_42e09eacdc10c7cf579bfc6470b5117c._comment new file mode 100644 index 000000000..5a8e2f9f8 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_7_42e09eacdc10c7cf579bfc6470b5117c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 7" + date="2012-09-06T16:20:49Z" + content=""" +From the strace, I can see it reading the file and feeding it to gpg. Either gpg is stalling after a while, or perhaps it is not reading the output back from gpg. What type of special remote is this (rsync/directory/S3)? Can you provide `strace -f` output for the same command you straced before? +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_8_6c02f31063b3d399d1b4f823bd6543ce._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_8_6c02f31063b3d399d1b4f823bd6543ce._comment new file mode 100644 index 000000000..391ec4437 --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_8_6c02f31063b3d399d1b4f823bd6543ce._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 8" + date="2012-09-06T18:41:47Z" + content=""" +I've tried with rsync and directory(real, mountpoint, and fuse mount), no S3. Same result on all of them. + +Here is an strace -f http://pastebin.com/YqCbi7Ue + +Funny thing is that now i hitting the failure on smaller files(<500kbyte). + +I even did a restart because of that. To see if a clean boot would increate it back to the ~700kbyte, but it made no difference. + +The annex hasn't been idle since last time, but i haven't done anything major in it. In total the annex is 204mb(up from 185mb at the time of my first post about this) +"""]] diff --git a/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment new file mode 100644 index 000000000..cd879bcfd --- /dev/null +++ b/doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 9" + date="2012-09-09T16:52:33Z" + content=""" +Someone else reported what looks like the same problem, here: [[bugs/transferkey_fails_due_to_gpg]] + +I'mm be following up to that bug report. In fact, I think I just managed to replicate the bug! +"""]] diff --git a/doc/design/assistant/blog/day_71__ssh_probing.mdwn b/doc/design/assistant/blog/day_71__ssh_probing.mdwn new file mode 100644 index 000000000..ac5a47380 --- /dev/null +++ b/doc/design/assistant/blog/day_71__ssh_probing.mdwn @@ -0,0 +1,26 @@ +Got ssh probing implemented. It checks if it can connect to the server, and +probes the server to see how it should be used. + +Turned out to need two ssh probes. The first uses the system's existing ssh +configuration, but disables password prompts. If that's able to get in +without prompting for a password, then the user must have set that up, +and doesn't want to be bothered with password prompts, and it'll respect +that configuration. + +Otherwise, it sets up a per-host ssh key, and configures a hostname alias +in `~/.ssh/config` to use that key, and probes using that. +Configuring ssh this way is nice because it avoids changing ssh's +behavior except when git-annex uses it, and it does not open up the server +to arbitrary commands being run without password. + +-- + +Next up will be creating the repositories. When there's a per-host key, +this will also involve setting up `authorized_keys`, locking down the ssh +key to only allow running git-annex-shell or rsync. + +I decided to keep that separate from the ssh probing, even though it means +the user will be prompted twice for their ssh password. It's cleaner and +allows the probing to do other checks -- maybe it'll later check the amount +of free disk space -- and the user should be able to decide after the probe +whether or not to proceed with making the repository. diff --git a/doc/design/assistant/blog/day_71__ssh_probing/comment_1_56a0c29f7454cfca5cc30b2849e6e942._comment b/doc/design/assistant/blog/day_71__ssh_probing/comment_1_56a0c29f7454cfca5cc30b2849e6e942._comment new file mode 100644 index 000000000..606037372 --- /dev/null +++ b/doc/design/assistant/blog/day_71__ssh_probing/comment_1_56a0c29f7454cfca5cc30b2849e6e942._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 1" + date="2013-01-19T07:23:38Z" + content=""" +I'm finding a few circumstances where the per-host key never gets setup. Is there a way to force this probing or key setup to happen? +"""]] diff --git a/doc/design/assistant/blog/day_71__ssh_probing/comment_2_f3bd3e366c92c833c7e217da125481b8._comment b/doc/design/assistant/blog/day_71__ssh_probing/comment_2_f3bd3e366c92c833c7e217da125481b8._comment new file mode 100644 index 000000000..3ce31969d --- /dev/null +++ b/doc/design/assistant/blog/day_71__ssh_probing/comment_2_f3bd3e366c92c833c7e217da125481b8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 2" + date="2013-01-19T16:09:15Z" + content=""" +It'd be best to file a bug report with details. +"""]] diff --git a/doc/design/assistant/blog/day_72__remote_ssh_server_configurator_finished.mdwn b/doc/design/assistant/blog/day_72__remote_ssh_server_configurator_finished.mdwn new file mode 100644 index 000000000..4dfc297b2 --- /dev/null +++ b/doc/design/assistant/blog/day_72__remote_ssh_server_configurator_finished.mdwn @@ -0,0 +1,34 @@ +Decided to only make bare git repos on remote ssh servers. This +configurator is aimed at using a server somewhere, which is probably not +going to be running the assistant. So it doesn't need a non-bare repo, and +there's nothing to keep the checked out branch in a non-bare repo +up-to-date on such a server, anyway. For non-bare repos on locally +accessible boxes, the [[pairing]] configurator will be the thing +to use, instead of this one. + +Note: While the remote ssh configurator works great, and you could even have the +assistant running on multiple computers and use it to point them all at the +same repo on a server, the assistant does not yet support keeping such a +network topology in sync. That needs some of the ideas in [[cloud]] to +happen, so clients can somehow inform each other when there are changes. +Until that happens, the assistant polls only every 30 minutes, so it'll +keep in sync with a 30 minute delay. + +--- + +This configurator can also set up encryped rsync special remotes. Currently +it always encrypts them, using the shared cipher mode of git-annex's +encryption. That avoids issues with gpg key generation and distribution, +and was easy to get working. + +--- + +I feel I'm in a good place now WRT adding repository configurator wizards +to the webapp. This one took about 2.5 days, and involved laying some +groundwork that will be useful for other repository configurators. And it +was probably one of the more complex ones. + +Now I should be able to crank out configurators for things like Amazon S3, +Bup, Rsync.net, etc fairly quickly. First, I need to do a beta release of +the assistant, and start getting feedback from my backers to prioritize +what to work on. diff --git a/doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn b/doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn new file mode 100644 index 000000000..9000636a7 --- /dev/null +++ b/doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn @@ -0,0 +1,17 @@ +Now finished building a special configurator for rsync.net. While +this is just a rsync remote to git-annex, there are some tricky bits to +setting up the ssh key using rsync.net's restricted shell. The configurator +automates that nicely. It took about 3 hours of work, and 49 lines of +rsync.net specific code to build this. + +[[!img /assistant/rsync.net.png]] + +Thanks to rsync.net who heard of my Kickstarter and gave me a really +nice free lifetime account. BTW guys, I wish your restricted shell +supported '&&' in between commands, and returned a nonzero exit status when +the command fails. This would make my error handling work better. + +I've also reworked the repository management page. Nice to see those +configurators start to fill in! + +[[!img /assistant/repositories.png]] diff --git a/doc/design/assistant/blog/day_74__bits_and_peices.mdwn b/doc/design/assistant/blog/day_74__bits_and_peices.mdwn new file mode 100644 index 000000000..c3a71d796 --- /dev/null +++ b/doc/design/assistant/blog/day_74__bits_and_peices.mdwn @@ -0,0 +1,7 @@ +* On OSX, install a launcher plist file, to run the assistant on login, + and a `git-annex-webapp.command` file in the desktop. This is not tested + yet. +* Made the webapp display alerts when the inotify/kqueue layer has a + warning message. +* Handle any crashes of each of the 15 or so named threads by displaying + an alert. (Of course, this should never happen.) diff --git a/doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn b/doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn new file mode 100644 index 000000000..9f2ba4816 --- /dev/null +++ b/doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn @@ -0,0 +1,50 @@ +Started reading about ZeroMQ with the hope that it could do some firewall +traversal thing, to connect mutually-unroutable nodes. Well, it could, but +it'd need a proxy to run on a server both can contact, and lots of +users won't have a server to run that on. The XMPP approach used by +dvcs-autosync is looking like the likeliest way for git-annex to handle +that use case. + +However, ZeroMQ did point in promising directions to handle another use +case I need to support: Local [[pairing]]. In fairly short order, I got +ZeroMQ working over IP Multicast (PGM), with multiple publishers sending +messages that were all seen by multiple clients on the LAN (actually the +WAN; works over OpenVPN too). I had been thinking about using +Avahi/ZeroConf for discovery of systems to pair with, but ZeroMQ is rather +more portable and easy to work with. + +Unfortunatly, I wasn't able to get ZeroMQ to behave reliably enough. +It seems to have some timeout issues the way I'm trying to use it, +or perhaps its haskell bindings are buggy? Anyway, it's really overkill +to use PGM when all I need for git-annex pairing discovery is lossy +UDP Multicast. Haskell has a simple `network-multicast` library for that, +and it works great. + +With discovery out of the way (theoretically), the hard part about +[[pairing]] is going to be verifying that the desired repository is being +paired with, and not some imposter. My plan to deal with this involves a +shared secret, that can be communicated out of band, and HMAC. The webapp +will prompt both parties to enter the same agreed upon secret (which could +be any phrase, ideally with 64 bytes of entropy), and will then use it as +the key for HMAC on the ssh public key. The digest will be sent over the +wire, along with the ssh public key, and the other side can use the shared +secret to verifiy the key is correct. + +The other hard part about [[pairing]] will be finding the best address to +use for git, etc to connect to the other host. If MDNS is available, it's +ideal, but if not the pair may have to rely on local DNS, or even +hard-coded IPs, which will be much less robust. Or, the assistant could +broadcast queries for a peer's current IP address itself, as a poor man's +MDNS. + +All right then! That looks like a good week's worth of work to embark on. + +--- + +Slight detour to package the haskell network-multicast library and upload +to Debian unstable. + +Roughed out a data type that models the whole pairing conversation, +and can be serialized to implement it. And a state machine to run +that conversation. Not yet hooked up to any transport such as multicast +UDP. diff --git a/doc/design/assistant/blog/day_76__pairing.mdwn b/doc/design/assistant/blog/day_76__pairing.mdwn new file mode 100644 index 000000000..0ebf55090 --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing.mdwn @@ -0,0 +1,16 @@ +About half way done with implementing [[pairing]]. The webapp's interface +to prompt for a secret and start pairing is done; the protocol is +implemented; broadcasting of pairing requests is working; added Yet Another +Thread to listen for incoming pairing traffic. + +Very happy with how this came together; starting with defining the protocol +with data types let me rapidly iterate until I had designed a simple, clean, +robust protocol. The implementation works well too; it's even possible to +start pairing, and only then bring up the network interface to the machine +you intended to pair with, and it'll detect the new interface and start +sending requests to it. + +Next, I need to make alerts have a button that performs a stored +IO action. So that the incoming pair request alert can have a button to +respond to the pair request. And then I need to write the code to actually +perform the pairing, including ssh key setup. diff --git a/doc/design/assistant/blog/day_76__pairing/comment_1_09665f269343422cd18051fad1a8c19e._comment b/doc/design/assistant/blog/day_76__pairing/comment_1_09665f269343422cd18051fad1a8c19e._comment new file mode 100644 index 000000000..16956ead2 --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_1_09665f269343422cd18051fad1a8c19e._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="Hogging memory" + date="2012-09-09T15:51:40Z" + content=""" +How do you prefer bugs to be reported? + +I'm having a problem where git-annex (from git, 1e41c0d85ecc24e8656bff79b2fba46c3663a054) is taking over 20GB of RAM after adding a single file. + +To reproduce: + +1. Create a new annex (I used the web app, created an annex at ~/annex) +2. Add box.com as a remote, using encryption (followed , basically `cd ~/annex; git annex initremote box.com type=directory directory=/media/box.com encryption=$GPGID`) +3. copied a file into the annex (ok, I admit, the file was a bit large, 350MB, but still) +4. refreshed the web app, nothing happened +5. closed the web app +6. started git annex assistant inside ~/annex +7. git annex webapp +8. noted that git annex noticed the file, and started transferring +9. wait +10. memory usage for the git-annex process goes beyond 21GB RAM +11. oomkiller kills git-annex +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment b/doc/design/assistant/blog/day_76__pairing/comment_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment new file mode 100644 index 000000000..a2e64671f --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 2" + date="2012-09-09T16:25:52Z" + content=""" +The [[bugs]] page is the place to put bug reports like this so I won't forget them. + +This should certainly not be happening. There are actually two git-annex processes running in the situation you describe; I'd be most curious to know whether the `git annex transfer` process was the one that blew up, or if the `git annex assistant` blew up. Also, it's not clear to me if you enabled the chunksize parameter when setting up the special remote, which could well be a significant detail. +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_3_a8b6a8432da20c468c633da8e7cbc2f3._comment b/doc/design/assistant/blog/day_76__pairing/comment_3_a8b6a8432da20c468c633da8e7cbc2f3._comment new file mode 100644 index 000000000..28439b34f --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_3_a8b6a8432da20c468c633da8e7cbc2f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="comment 3" + date="2012-09-09T17:34:07Z" + content=""" +I'm almost certain that I specified chunksize like in the tip. How do I check? +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_4_36a428a2e1803f4391b821d1892f0cd7._comment b/doc/design/assistant/blog/day_76__pairing/comment_4_36a428a2e1803f4391b821d1892f0cd7._comment new file mode 100644 index 000000000..e46240265 --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_4_36a428a2e1803f4391b821d1892f0cd7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 4" + date="2012-09-09T18:00:48Z" + content=""" +You can see the full configuration with: git show git-annex:remote.log + +(You probably do not want to paste the cipher= part of that here, although it *is* encrypted with your gpg key, unless you are using the shared encryption mode.) +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_5_11f332fe2050d8c1416e71f9e85ba280._comment b/doc/design/assistant/blog/day_76__pairing/comment_5_11f332fe2050d8c1416e71f9e85ba280._comment new file mode 100644 index 000000000..5c93d3d3e --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_5_11f332fe2050d8c1416e71f9e85ba280._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="comment 5" + date="2012-09-10T14:54:17Z" + content=""" +chunksize=2m was defined. I tried again, and the transfers again didn't seem to start. Then I did `killall git-annex`, cleaned the files from the box.com account, and tried again. This time it seems to be working, but the webapp isn't showing progress. Memory usage also stays reasonable, and doesn't seem to grow. Maybe it was just bad handling of unexpected repository state? +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_6_973aeb656b78eca97474ea1a3f5b57b7._comment b/doc/design/assistant/blog/day_76__pairing/comment_6_973aeb656b78eca97474ea1a3f5b57b7._comment new file mode 100644 index 000000000..120a87845 --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_6_973aeb656b78eca97474ea1a3f5b57b7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 6" + date="2012-09-10T17:31:20Z" + content=""" +Re transfer progress not being shown, that's expected as upload progress displays are not yet implemented in the webapp. + +I can't think of a way git-annex would care what was in your box.com repo. It just makes directories as needed, and will overwrite existing files in the rare case they already exist. And ignore any non-git-annex files. + +Are you sure it was git-annex's memory use blowing up, and not the memory use of the davfs2 daemon? +"""]] diff --git a/doc/design/assistant/blog/day_76__pairing/comment_7_03d2b3343f34377a4d6171e06b7609f6._comment b/doc/design/assistant/blog/day_76__pairing/comment_7_03d2b3343f34377a4d6171e06b7609f6._comment new file mode 100644 index 000000000..5aea18576 --- /dev/null +++ b/doc/design/assistant/blog/day_76__pairing/comment_7_03d2b3343f34377a4d6171e06b7609f6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmubB1Sj2rwFoVdZYvGV0ACaQUJQyiJXJI" + nickname="Paul" + subject="comment 7" + date="2012-09-10T17:35:48Z" + content=""" +Positive. I was grepping for git-annex from ps for the mem usage. +"""]] diff --git a/doc/design/assistant/blog/day_77_alert_buttons.mdwn b/doc/design/assistant/blog/day_77_alert_buttons.mdwn new file mode 100644 index 000000000..2c05b495b --- /dev/null +++ b/doc/design/assistant/blog/day_77_alert_buttons.mdwn @@ -0,0 +1,21 @@ +Alerts can now have buttons, that go to some url when clicked. Yay. + +Implementing that was a PITA, because Yesod really only wants its type-safe +urls to be rendered from within its Handler monad. Which most things that +create alerts are not. I managed to work around Yesod's insistence on this +only by using a MVar to store the pure function that Yesod uses internally. +That function can only be obtained once the webapp is running. + +---- + +Fixed a nasty bug where using gpg would cause hangs. I introduced this back +when I was reworking all the code in git-annex that runs processes, so it +would work with threading. In the process a place that had forked a process +to feed input to gpg was lost. Fixed it by spawning a thread to feed gpg. +Luckily I have never released a version of git-annex with that bug, but +the many users who are building from the master branch should update. + +---- + +Made alerts be displayed while pairing is going on, with buttons to cancel +pairing or respond to a pairing request. diff --git a/doc/design/assistant/blog/day_78__pairing_continued.mdwn b/doc/design/assistant/blog/day_78__pairing_continued.mdwn new file mode 100644 index 000000000..74f510715 --- /dev/null +++ b/doc/design/assistant/blog/day_78__pairing_continued.mdwn @@ -0,0 +1,8 @@ +Worked on [[pairing]] all day. It's complicated and I was close to being in +the weeds at times. I think it probably works now, but I have not tested it +at all. Tomorrow, testing, and cleaning up known problems. + +---- + +Also ordered 1.5 terabytes of USB keys and a thousand git-annex stickers +today. diff --git a/doc/design/assistant/blog/day_79__pairing_finished.mdwn b/doc/design/assistant/blog/day_79__pairing_finished.mdwn new file mode 100644 index 000000000..ca4bbc125 --- /dev/null +++ b/doc/design/assistant/blog/day_79__pairing_finished.mdwn @@ -0,0 +1,33 @@ +Tons of pairing work, which culminated today in pairing fully working for +the very first time. And it works great! Type something like "my +hovercraft is full of eels" into two git annex webapps on the same LAN +and the two will find each other, automatically set up ssh keys, and sync +up, like magic. Magic based on math. + +* Revert changes made to `authorized_keys` when the user cancels + a pairing response. Which could happen if the machine that sent the + pairing request originally is no longer on the network. +* Some fixes to handle lossy UDP better. Particularly tricky at the end + of the conversation -- how do both sides reliably know when a + conversation is over when it's over a lossy wire? My solution is just + to remember some conversatons we think are over, and keep saying + "this conversation is over" if we see messages in that conversation. + Works. +* Added a UUID that must be the same in related pairing messages. + This has a nice security feature: It allows detection of brute-force + attacks to guess the shared secret, after the first wrong guess! + In which case the pairing is canceled and a warning printed. +* That led to a thorough security overview, which I've added to + the [[pairing]] page. Added some guards against unusual attacks, + like console poisioning attacks. I feel happy with the security + of pairing now, with the caveats that only I have reviewed it (and + reviewing your own security designs is never ideal), and that the + out-of-band shared secret communication between users is only as good + as they make it. +* Found [a bug](https://github.com/yesodweb/yesod/issues/421) + in Yesod's type safe urls. At least, I think it's a bug. Worked around it. +* Got very stuck trying to close the sockets that are opened to send + multicast pairing messages. Nothing works, down to and including calling + C `close()`. At the moment I have a socket leak. :( + I need to understand the details of multicast sockets better to fix this. + Emailed the author of the library I'm using for help. diff --git a/doc/design/assistant/blog/day_7__bugfixes.mdwn b/doc/design/assistant/blog/day_7__bugfixes.mdwn new file mode 100644 index 000000000..79f36fe98 --- /dev/null +++ b/doc/design/assistant/blog/day_7__bugfixes.mdwn @@ -0,0 +1,45 @@ +Kickstarter is over. Yay! + +Today I worked on the bug where `git annex watch` turned regular files +that were already checked into git into symlinks. So I made it check +if a file is already in git before trying to add it to the annex. + +The tricky part was doing this check quickly. Unless I want to write my +own git index parser (or use one from Hackage), this check requires running +`git ls-files`, once per file to be added. That won't fly if a huge +tree of files is being moved or unpacked into the watched directory. + +Instead, I made it only do the check during `git annex watch`'s initial +scan of the tree. This should be OK, because once it's running, you +won't be adding new files to git anyway, since it'll automatically annex +new files. This is good enough for now, but there are at least two problems +with it: + +* Someone might `git merge` in a branch that has some regular files, + and it would add the merged in files to the annex. +* Once `git annex watch` is running, if you modify a file that was + checked into git as a regular file, the new version will be added + to the annex. + +I'll probably come back to this issue, and may well find myself directly +querying git's index. + +--- + +I've started work to fix the memory leak I see when running `git annex +watch` in a large repository (40 thousand files). As always with a Haskell +memory leak, I crack open [Real World Haskell's chapter on profiling](http://book.realworldhaskell.org/read/profiling-and-optimization.html). + +Eventually this yields a nice graph of the problem: + +[[!img profile.png alt="memory profile"]] + +So, looks like a few minor memory leaks, and one huge leak. Stared +at this for a while and trying a few things, and got a much better result: + +[[!img profile2.png alt="memory profile"]] + +I may come back later and try to improve this further, but it's not bad memory +usage. But, it's still rather slow to start up in such a large repository, +and its initial scan is still doing too much work. I need to optimize +more.. diff --git a/doc/design/assistant/blog/day_7__bugfixes/profile.png b/doc/design/assistant/blog/day_7__bugfixes/profile.png new file mode 100644 index 000000000..702af1ca0 Binary files /dev/null and b/doc/design/assistant/blog/day_7__bugfixes/profile.png differ diff --git a/doc/design/assistant/blog/day_7__bugfixes/profile2.png b/doc/design/assistant/blog/day_7__bugfixes/profile2.png new file mode 100644 index 000000000..4d487d02a Binary files /dev/null and b/doc/design/assistant/blog/day_7__bugfixes/profile2.png differ diff --git a/doc/design/assistant/blog/day_80__default_backend.mdwn b/doc/design/assistant/blog/day_80__default_backend.mdwn new file mode 100644 index 000000000..5b6aa7f98 --- /dev/null +++ b/doc/design/assistant/blog/day_80__default_backend.mdwn @@ -0,0 +1,14 @@ +I've changed the default backend used by git-annex from SHA256 to SHA256E. +Including the filename extension in the key is known to make repositories +more usable on things like MP3 players, and I've recently learned it also +avoids [[forum/Weird_behavior_with_OS_X_Finder_and_Preview.app]]. + +I thought about only changing the default in repositories set up by the +assistant, but it seemed simpler to change the main default. The old +backend is really only better if you might have multiple copies of files +with the same content that have different extensions. + +Fixed the socket leak in pairing that eluded me earlier. + +I've made a new [[polls]] page, and posted a poll: +[[polls/prioritizing_special_remotes]] diff --git a/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn b/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn new file mode 100644 index 000000000..45a7e9f20 --- /dev/null +++ b/doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn @@ -0,0 +1,34 @@ +It's possible for one git annex repository to configure a special remote +that it makes sense for other repositories to also be able to use. Today I +added the UI to support that; in the list of repositories, such +repositories have a "enable" link. + +To enable pre-existing rsync special remotes, the webapp has to do the same +probing and ssh key setup that it does when initially creating them. +Rsync.net is also handled as a special case in that code. There was one +ugly part to this.. When a rsync remote is configured in the webapp, +it uses a mangled hostname like "git-annex-example.com-user", to +make ssh use the key it sets up. That gets stored in the `remote.log`, and so +the enabling code has to unmangle it to get back to the real hostname. + +--- + +Based on the still-running [[prioritizing_special_remotes]] poll, a lot +of people want special remote support for their phone or mp3 player. +(As opposed to running git-annex on an Android phone, which comes later..) +It'd be easy enough to make the webapp set up a directory special remote +on such a device, but that makes consuming some types of content on the +phone difficult (mp3 players seem to handle them ok based on what people tell +me). I need to think more about some of the ideas mentioned in [[android]] +for more suitable ways of storing files. + +One thing's for sure: You won't want the assistant to sync all your files +to your phone! So I also need to start coming up with partial syncing +controls. One idea is for each remote to have a configurable matcher for files +it likes to receive. That could be only mp3 files, or all files inside a +given subdirectory, or all files *not* in a given subdirectory. That means +that when the assistant detects a file has been moved, it'll need to add +(or remove) a queued transfer. Lots of other things could be matched on, +like file size, number of copies, etc. Oh look, I have a +[beautiful library I wrote earlier](http://joeyh.name/blog/entry/happy_haskell_hacker) +that I can reuse! diff --git a/doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn b/doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn new file mode 100644 index 000000000..ed2e4e602 --- /dev/null +++ b/doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn @@ -0,0 +1,26 @@ +Started today doing testing of [[syncing]], and found some bugs and things +it needs to do better. But was quickly sidetracked when I noticed that +`transferkey` was making a commit to the git-annex branch for every file it +transferred, which is too slow and bloats history too much. + +To fix that actually involved fixing a long-standing annoyance; that +read-only git-annex commands like `whereis` sometimes start off with +"(Recording state in git)", when the journal contains some not yet +committed changes to the git-annex branch. I had to carefully think +through the cases to avoid those commits. + +As I was working on that, I found a real nasty lurking bug in the git-annex +branch handling. It's unlikely to happen unless `annex.autocommit=false` is +set, but it could occur when two git-annex processes race one another just +right too. The root of the bug is that `git cat-file --batch` does not +always show changes made to the index after it started. I think it does +in enough cases to have tricked me before, but in general it can't be +trusted to report the current state of the index, but only some past state. + +I was able to fix the bug, by ensuring that changes being made to the +branch are always visible in either the journal or the branch -- never in +the index alone. + +---- + +Hopefully something less low-level tomorrow..! diff --git a/doc/design/assistant/blog/day_83__3-way.mdwn b/doc/design/assistant/blog/day_83__3-way.mdwn new file mode 100644 index 000000000..9411c4c1c --- /dev/null +++ b/doc/design/assistant/blog/day_83__3-way.mdwn @@ -0,0 +1,73 @@ +Syncing works well when the graph of repositories is strongly connected. +Now I'm working on making it work reliably with less connected graphs. + +I've been focusing on and testing a doubly-connected list of repositories, +such as: `A <-> B <-> C` + +---- + +I was seeing a lot of git-annex branch push failures occuring in +this line of repositories topology. Sometimes was is able to recover from +these, but when two repositories were trying to push to one-another at the +same time, and both failed, both would pull and merge, which actually keeps +the git-annex branch still diverged. (The two merge commits differ.) + +A large part of the problem was that it pushed directly into the git-annex +branch on the remote; the same branch the remote modifies. I changed it to +push to `synced/git-annex` on the remote, which avoids most push failures. +Only when A and C are both trying to push into `B/synced/git-annex` at the +same time would one fail, and need to pull, merge, and retry. + +----- + +With that change, git syncing always succeeded in my tests, and without +needing any retries. But with more complex sets of repositories, or more +traffic, it could still fail. + +I want to avoid repeated retries, exponential backoffs, and that kind of +thing. It'd probably be good enough, but I'm not happy with it because +it could take arbitrarily long to get git in sync. + +I've settled on letting it retry once to push to the synced/git-annex +and synced/master branches. If the retry fails, it enters a fallback mode, +which is guaranteed to succeed, as long as the remote is accessible. + +The problem with the fallback mode is it uses really ugly branch names. +Which is why Joachim Breitner and I originally decided on making `git annex +sync` use the single `synced/master` branch, despite the potential for +failed syncs. But in the assistant, the requirements are different, +and I'm ok with the uglier names. + +It does seem to make sense to only use the uglier names as a fallback, +rather than by default. This preserves compatability with `git annex sync`, +and it allows the assistant to delete fallback sync branches after it's +merged them, so the ugliness is temporary. + +--- + +Also worked some today on a bug that prevents C from receiving files +added to A. + +The problem is that file contents and git metadata sync independantly. So C +will probably receive the git metadata from B before B has finished +downloading the file from A. C would normally queue a download of the +content when it sees the file appear, but at this point it has nowhere to +get it from. + +My first stab at this was a failure. I made each download of a file result +in uploads of the file being queued to every remote that doesn't have it +yet. So rather than C downloading from B, B uploads to C. Which works fine, +but then C sees this download from B has finished, and proceeds to try to +re-upload to B. Which rejects it, but notices that this download has +finished, so re-uploads it to C... + +The problem with that approach is that I don't have an event when a download +succeeds, just an event when a download ends. Of course, C could skip +uploading back to the same place it just downloaded from, but loops are +still possible with other network topologies (ie, if D is connected to both +B and C, there would be an upload loop 'B -> C -> D -> B`). So unless I can +find a better event to hook into, this idea is doomed. + +I do have another idea to fix the same problem. C could certainly remember +that it saw a file and didn't know where to get the content from, and then +when it receives a git push of a git-annex branch, try again. diff --git a/doc/design/assistant/blog/day_84__deferred_downloads.mdwn b/doc/design/assistant/blog/day_84__deferred_downloads.mdwn new file mode 100644 index 000000000..0ae684e47 --- /dev/null +++ b/doc/design/assistant/blog/day_84__deferred_downloads.mdwn @@ -0,0 +1,33 @@ +Implemented deferred downloads. So my example from yesterday of three +repositories in a line keep fully in sync now! + +I punted on one problem while doing it. It might be possible to get a really +big list of deferred downloads in some situation. That all lives in memory. +I aim for git-annex to always have a constant upper bound on memory use, +so that's not really acceptable. I have TODOed a reminder to do something +about limiting the size of this list. + +---- + +I also ran into a nasty crash while implementing this, where two threads +were trying to do things to git HEAD at the same time, and so one crashed, +and in a way I don't entirely understand, that crash took down another +thread with a BlockedIndefinitelyOnSTM exception. I think I've fixed +this, but it's bothersome that this is the second time that modifications +to the Merger thread have led to a concurrency related crash that I +have not fully understood. + +My guess is that STM can get confused when it's +retrying, and the thread that was preventing it from completing a +transaction crashes, because it suddenly does not see any other +references to the TVar(s) involved in the transaction. Any GHC STM gurus +out there? + +--- + +Still work to be done on making data transfers to keep fully in sync in all +circumstances. One case I've realized needs work occurs when a USB drive is +plugged in. Files are downloaded from it to keep the repo in sync, but the +repo neglects to queue uploads of those files it just got out to other +repositories it's in contact with. Seems I still need to do something to +detecting when a successful download is done, and queue uploads. diff --git a/doc/design/assistant/blog/day_85__more_foundation_work.mdwn b/doc/design/assistant/blog/day_85__more_foundation_work.mdwn new file mode 100644 index 000000000..25bad3748 --- /dev/null +++ b/doc/design/assistant/blog/day_85__more_foundation_work.mdwn @@ -0,0 +1,17 @@ +Turns out I was able to easily avoid the potential upload loops that would +occur if each time a repo receives a download, it queues uploads to the +repos it's connected to. With that done. I suspect, but have not proven, +that the assistant is able to keep repos arranged in any shape of graph in +sync, as long as it's connected (of course) and each connection is +bi-directional. That's a good start .. or at least a nice improvement from +only strongly connected graphs being kept in sync. + +Eliminated some empty commits that would be made sometimes, which is a nice +optimisation. + +------ + +I wanted to get back to some UI work after this week's deep dive into the +internals. So I filled in a missing piece, the repository switcher in the +upper right corner. Now the webapp's UI allows setting up different +repositories for different purposes, and switching between them. diff --git a/doc/design/assistant/blog/day_86__towards_the_beta.mdwn b/doc/design/assistant/blog/day_86__towards_the_beta.mdwn new file mode 100644 index 000000000..b11dd9bf9 --- /dev/null +++ b/doc/design/assistant/blog/day_86__towards_the_beta.mdwn @@ -0,0 +1,33 @@ +Putting together a shortlist of things I want to sort out before the beta. + +* [[Progress bars|progressbars]] for file uploads. +* No mocked up parts in the webapp's UI. Think I implemented the last of + those yesterday, although there are some unlinked repository configuration + options. +* The basic watching functionality, should work reliably. + There are some known scalability issues with eg, + [[kqueue on OSX|bugs/Issue_on_OSX_with_some_system_limits]] that + need to be dealt with, but needn't block a beta. +* Should keep any configuration of repositories that can be set up using + the webapp in sync whenever it's possible to do so. I think that'll work + after the past few days work. +* Should be easy to install and get running. Of course part of the point + of the beta release is to get it out there, on Hackage, in Debian + unstable, and in the other places that git-annex packagers put it. + As to getting it running, the autostart files and menu items look good + on Linux. The OSX equivilants still need work and testing. +* No howlingly bad bugs. [[This bug|bugs/pasting_into_annex_on_OSX]] is + the one I'm most concerned with currently. OTOH, + [[bugs/watcher_commits_unlocked_files]] can be listed in the errata. + +---- + +So I worked on progress bars for uploads today. Wrote a nice little +parser for rsync's progress output, that parses arbitrary size chunks, +returning any unparsable part. Added a ProgressCallback parameter to +all the backends' upload methods. Wrote a nasty thing that intercepts +rsync's output, currently a character at a time (horrible, but rsync +doesn't output that much, so surprisingly acceptable), and outputs it and +parses it. Hooked all this up, and got it working for uploads to +git remotes. That's 1/10th of the total ways uploads can happen that +have working progress bars. It'll take a while to fill in the rest.. diff --git a/doc/design/assistant/blog/day_87__more_progress_progress.mdwn b/doc/design/assistant/blog/day_87__more_progress_progress.mdwn new file mode 100644 index 000000000..c2b266d6d --- /dev/null +++ b/doc/design/assistant/blog/day_87__more_progress_progress.mdwn @@ -0,0 +1,28 @@ +Worked more on upload progress tracking. I'm fairly happy with its state +now: + +* It's fully implemented for rsync special remotes. + +* Git remotes also fully support it, with the + notable exception of file uploads run by `git-annex-shell recvkey`. That + runs `rsync --server --sender`, and in that mode, rsync refuses to output + progress info. Not sure what to do about this case. Maybe I should + write a parser for the rsync wire protocol that can tell what chunk of the + file is being sent, and shim it in front of the rsync server? That's + rather hardcore, but it seems the best of a bad grab bag of options that + include things like `LD_PRELOAD` hacks. + +* Also optimised the rsync progress bar reader to read whole + chunks of data rather than one byte at a time. + +* Also got progress bars to actually update in the webapp for uploads. + + This turned out to be tricky because kqueue cannot be used to detect when + existing files have been modified. (One of kqueue's worst shortcomings vs + inotify.) Currently on kqueue systems it has to poll. + +I will probably upload add progress tracking to the directory special remote, +which should be very easy (it already implements its own progress bars), +and leave the other special remotes for later. I can add upload progress +tracking to each special remote when I add support for configuring it in +the webapp. diff --git a/doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn b/doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn new file mode 100644 index 000000000..cd3c493c1 --- /dev/null +++ b/doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn @@ -0,0 +1,18 @@ +Short day today, but I again worked only on progress bars. + +* Added upload progress tracking for the directory special remote. +* Some optimisations. +* Added a `git annex-shell transferkey` command. This isn't used yet, + but the plan is to use it to feed back information about how much + of a file has been sent when downloading it. So that the uploader + can display a progress bar. This method avoids needing to parse the rsync + protocol, which is approximately impossible without copying half of rsync. + Happily, git-annex's automatic ssh connection caching will make the small + amount of data this needs to send be efficiently pipelined over the same + ssh connection that rsync is using. + +I probably have less than 10 lines of code to write to finish up +[[progressbars]] for now. Looking forward to getting that behind me, and on +to something more interesting. Even doing mail merge to print labels to +mail out Kickstarter rewards is more interesting than progress bars at this +point. :) diff --git a/doc/design/assistant/blog/day_89__final_polish.mdwn b/doc/design/assistant/blog/day_89__final_polish.mdwn new file mode 100644 index 000000000..4a72a7ff2 --- /dev/null +++ b/doc/design/assistant/blog/day_89__final_polish.mdwn @@ -0,0 +1,24 @@ +Finally wrapped up progress bars; upload progress is now reported in all +situations. + +After all that, I was pleased to find a use for the progress info, beyond +displaying it to the user. Now the assistant uses it to decide whether it +makes sense to immediately retry a failed transfer. This should make it +work nicely, or at least better, with flaky network or drives. + +The webapp crashed on startup when there was no `~/.gitconfig`. +Guess all of us who have tried it so far are actual git users, +but I'm glad I caught this before releasing the beta. + +Jimmy Tang kindly took on making a OS X .app directory for git-annex. +So it now has an icon that will launch the webapp. +[[!img /assistant/osx-app.png]] + +I'm getting lots of contributors to git-annex all of a sudden. I've had 3 +patches this weekend, and 2 of them have been to Haskell code. +Justin Azoff is working on [[todo/incremental_fsck]], and Robie Basak +has [gotten Amazon Glacier working](https://github.com/basak/glacier-cli) +using the hook special remote. + +Started doing some design for [[transfer_control]]. I will start +work on this after releasing the first beta. diff --git a/doc/design/assistant/blog/day_8__speed.mdwn b/doc/design/assistant/blog/day_8__speed.mdwn new file mode 100644 index 000000000..d99add97a --- /dev/null +++ b/doc/design/assistant/blog/day_8__speed.mdwn @@ -0,0 +1,67 @@ +Since last post, I've worked on speeding up `git annex watch`'s startup time +in a large repository. + +The problem was that its initial scan was naively staging every symlink in +the repository, even though most of them are, presumably, staged correctly +already. This was done in case the user copied or moved some symlinks +around while `git annex watch` was not running -- we want to notice and +commit such changes at startup. + +Since I already had the `stat` info for the symlink, it can look at the +`ctime` to see if the symlink was made recently, and only stage it if so. +This sped up startup in my big repo from longer than I cared to wait (10+ +minutes, or half an hour while profiling) to a minute or so. Of course, +inotify events are already serviced during startup, so making it scan +quickly is really only important so people don't think it's a resource hog. +First impressions are important. :) + +But what does "made recently" mean exactly? Well, my answer is possibly +over engineered, but most of it is really groundwork for things I'll need +later anyway. I added a new data structure for tracking the status of the +daemon, which is periodically written to disk by another thread (thread #6!) +to `.git/annex/daemon.status` Currently it looks like this; I anticipate +adding lots more info as I move into the [[syncing]] stage: + + lastRunning:1339610482.47928s + scanComplete:True + +So, only symlinks made after the daemon was last running need to be +expensively staged on startup. Although, as RichiH pointed out, +this fails if the clock is changed. But I have been planning to have a +cleanup thread anyway, that will handle this, and other +potential problems, so I think that's ok. + +Stracing its startup scan, it's fairly tight now. There are some repeated +`getcwd` syscalls that could be optimised out for a minor speedup. + +---- + +Added the sanity check thread. Thread #7! It currently only does one sanity +check per day, but the sanity check is a fairly lightweight job, +so I may make it run more frequently. OTOH, it may never ever find a +problem, so once per day seems a good compromise. + +Currently it's only checking that all files in the tree are properly staged +in git. I might make it `git annex fsck` later, but fscking the whole tree +once per day is a bit much. Perhaps it should only fsck a few files per +day? TBD + +Currently any problems found in the sanity check are just fixed and logged. +It would be good to do something about getting problems that might indicate +bugs fed back to me, in a privacy-respecting way. TBD + +---- + +I also refactored the code, which was getting far too large to all be in +one module. + +I have been thinking about renaming `git annex watch` to `git annex assistant`, +but I think I'll leave the command name as-is. Some users might +want a simple watcher and stager, without the assistant's other features +like syncing and the webapp. So the next stage of the +[[roadmap|design/assistant]] will be a different command that also runs +`watch`. + +At this point, I feel I'm done with the first phase of [[inotify]]. +It has a couple known bugs, but it's ready for brave beta testers to try. +I trust it enough to be running it on my live data. diff --git a/doc/design/assistant/blog/day_8__speed/comment_1_a3dba537b276d5737abc8cb93f1965f4._comment b/doc/design/assistant/blog/day_8__speed/comment_1_a3dba537b276d5737abc8cb93f1965f4._comment new file mode 100644 index 000000000..d0a207c82 --- /dev/null +++ b/doc/design/assistant/blog/day_8__speed/comment_1_a3dba537b276d5737abc8cb93f1965f4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="Battery usage" + date="2012-06-15T09:57:33Z" + content=""" +Complete fsck is good, but once a week probably enough. + +But please see if you can make fsck optional depending on if the machine is running on battery. +"""]] diff --git a/doc/design/assistant/blog/day_90__beta.mdwn b/doc/design/assistant/blog/day_90__beta.mdwn new file mode 100644 index 000000000..fc9bf4a41 --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta.mdwn @@ -0,0 +1,16 @@ +Just released git-annex 3.20120924, which includes beta versions of +the assistant and webapp. Read the [[/assistant/errata]], then give it a +try! + +I've uploaded it to Haskell's cabal, and to Debian unstable, and hope my +helpers for other distributions will update them soon. (Although the +additional dependencies to build the webapp may take a while on some.) +I also hope something can be done to make a prebuilt version available on +OSX soonish. + +I've decided to license the webapp under the +[AGPL](http://www.gnu.org/licenses/agpl-3.0.html). This should not impact +normal users of it, and git-annex can be built without the webapp as a pure +GPL licensed program. This is just insurance to prevent someone turning the +webapp into a propritary web-only service, by requiring that anyone who +does so provide the source of the webapp. diff --git a/doc/design/assistant/blog/day_90__beta/comment_1_5f2a3b18ad7558abe04f51534a29ff13._comment b/doc/design/assistant/blog/day_90__beta/comment_1_5f2a3b18ad7558abe04f51534a29ff13._comment new file mode 100644 index 000000000..6b95e317d --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta/comment_1_5f2a3b18ad7558abe04f51534a29ff13._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="Haskell on MacPorts" + date="2012-09-24T21:09:39Z" + content=""" +FYI, I just came across a [MacPorts ticket](https://trac.macports.org/ticket/35813) to update Haskell to 2012.2.0.0. It would be nice to install git-annex from MacPorts. + +"""]] diff --git a/doc/design/assistant/blog/day_90__beta/comment_2_961c4eba97f4eac75174244d6b2b00c0._comment b/doc/design/assistant/blog/day_90__beta/comment_2_961c4eba97f4eac75174244d6b2b00c0._comment new file mode 100644 index 000000000..ed6c8e2ae --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta/comment_2_961c4eba97f4eac75174244d6b2b00c0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-09-24T21:21:57Z" + content=""" +cool, I haven't been on top of things recently. If haskell-platform gets updated in macports and assuming its easy to package up any dependancies (if any) as macport packages, git-annex should be relatively straightforward to package up +"""]] diff --git a/doc/design/assistant/blog/day_90__beta/comment_3_c76675a4633cbbe347ed42c222918d38._comment b/doc/design/assistant/blog/day_90__beta/comment_3_c76675a4633cbbe347ed42c222918d38._comment new file mode 100644 index 000000000..151a9c257 --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta/comment_3_c76675a4633cbbe347ed42c222918d38._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="A few OS X bugs" + date="2012-09-25T00:50:56Z" + content=""" +Cabal update + +Cabal install git-annex +Seemed to install correctly on OS X 10.7 + +After the installation, an application for git-annex showed up on my desktop. This is the wrong place to put applications in OS X. It should belong in the /Applications Folder. +Launching the git-annex app, the web-browser is opened, and it tells me to make a repository. I entered /Users/[my home folder]/Annex and continued. I then got an internal server error and nothing else happened. The Error: + +uuid [\"-m\"] exited 127 + +Annex was created, and there is a .git folder in it. + +Checking the annex status: +Bret-Air:Annex bret$ git annex status +git-annex: First run: git-annex init + +I'll try it on 10.6 here in just a moment. Let me know if I can provide any more useful information. +"""]] diff --git a/doc/design/assistant/blog/day_90__beta/comment_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment b/doc/design/assistant/blog/day_90__beta/comment_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment new file mode 100644 index 000000000..f6889fe04 --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta/comment_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="comment 4" + date="2012-09-25T00:59:51Z" + content=""" +OS X 10.6 is doing the same thing as on 10.7. +"""]] diff --git a/doc/design/assistant/blog/day_90__beta/comment_5_99fbc9feac62e66a12b0d357cf86ccc1._comment b/doc/design/assistant/blog/day_90__beta/comment_5_99fbc9feac62e66a12b0d357cf86ccc1._comment new file mode 100644 index 000000000..d886d56bb --- /dev/null +++ b/doc/design/assistant/blog/day_90__beta/comment_5_99fbc9feac62e66a12b0d357cf86ccc1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 5" + date="2012-09-25T14:49:31Z" + content=""" +@Bret my best guess (without any error message from the uuid command) is that your uuid doesn't support the -m parameter. I've made the configure step check for this and it'll fall back to uuid without the parameter. +"""]] diff --git a/doc/design/assistant/blog/day_91__break.mdwn b/doc/design/assistant/blog/day_91__break.mdwn new file mode 100644 index 000000000..f2102746d --- /dev/null +++ b/doc/design/assistant/blog/day_91__break.mdwn @@ -0,0 +1,7 @@ +Mostly took a break from working on the assistant today. Instead worked +on adding incremental fsck to git-annex. Well, that will be something +that assistant will use, eventually, probably. + +Jimmy and I have been working on a self-contained OSX app for using the +assistant, that doesn't depend on installing git, etc. More on that +once we have something that works. diff --git a/doc/design/assistant/blog/day_92__S3.mdwn b/doc/design/assistant/blog/day_92__S3.mdwn new file mode 100644 index 000000000..c3f275a86 --- /dev/null +++ b/doc/design/assistant/blog/day_92__S3.mdwn @@ -0,0 +1,23 @@ +Amazon S3 was the second most popular choice in the +[[polls/prioritizing_special_remotes]] poll, and since I'm not sure how +I want to support phone/mp3 players, I did it first. + +So I added a configurator today to easily set up an Amazon S3 repository. +That was straightforward and didn't take long since git-annex already +supported S3. + +The hard part, of course, is key distribution. Since the webapp so far +can only configure the shared encryption method, and not fullblown gpg keys, +I didn't feel it would be secure to store the S3 keys in the git repository. +Anyone with access to that git repo would have full access to S3 ... just not +acceptable. Instead, the webapp stores the keys in a 600 mode file locally, +and they're not distributed at all. + +When the same S3 repository is enabled on another computer, it prompts for +keys then too. I did add a hint about using the IAM Management Console in +this case -- it should be possible to set up users in IAM who can only +access a single bucket, although I have not tried to set that up. + +--- + +Also, more work on the standalone OSX app. diff --git a/doc/design/assistant/blog/day_92__S3/comment_1_eda656247d11cea7fbed2e33137a39e5._comment b/doc/design/assistant/blog/day_92__S3/comment_1_eda656247d11cea7fbed2e33137a39e5._comment new file mode 100644 index 000000000..af610bdb7 --- /dev/null +++ b/doc/design/assistant/blog/day_92__S3/comment_1_eda656247d11cea7fbed2e33137a39e5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-09-26T23:52:50Z" + content=""" +I think a lot of people misinterpreted \"phone/mp3 player\" as \"Android\"; I know I did. + +As you already support directories, MTP would be needed to support the other half of pretty much all phones and media players (other than those made by Apple). MTP is a valley of pain, though. +"""]] diff --git a/doc/design/assistant/blog/day_92__S3/comment_2_8249d2d9521e44c674da3fda74be077a._comment b/doc/design/assistant/blog/day_92__S3/comment_2_8249d2d9521e44c674da3fda74be077a._comment new file mode 100644 index 000000000..fb83b23e4 --- /dev/null +++ b/doc/design/assistant/blog/day_92__S3/comment_2_8249d2d9521e44c674da3fda74be077a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlFd2EbAmGD0FjHmuoerXfT0GO_jPcgvQA" + nickname="Gert" + subject="Single bucket for S3" + date="2012-09-27T09:17:24Z" + content=""" +You can easily do that with IAM, checkout . + +It boils down to creating a policy for each user/bucket. But allow read access to the full bucket list (otherwise the AWS Console won't work). +"""]] diff --git a/doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn b/doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn new file mode 100644 index 000000000..711710fc7 --- /dev/null +++ b/doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn @@ -0,0 +1,23 @@ +Various bug fixes, and work on the OSX app today: + +* Avoid crashing when ssh-keygen fails due to not being able to parse + `authorized_keys`.. seems a lot of people have crufty unparsable + `authorized_keys` files. +* On OSX, for some reason the webapp was failing to start sometimes due + to bind failing with EINVAL. I don't understand why, as that should + only happen if the socket is already bound, which it should not as + it's just been created. I was able to work around this by retrying + with a new socket when bind fails. +* When setting up `authorized_keys` to let `git-annex-shell` be run, + it had been inserting a perl oneliner into it. I changed that + to instead call a `~/.ssh/git-annex-shell` wrapper script that it sets + up. The benefits are it no longer needs perl, and it's less ugly, + and the standalone OSX app can modify the wrapper script to point to + wherever it's installed today (people like to move these things around I + guess). +* Made the standalone OSX app set up autostarting when it's first run. +* Spent rather a long time collecting the licenses of all the software that + will be bundled with the standalone OSX app. Ended up with a file + containing 3954 lines of legalese. Happily, all the software appears + redistributable, and free software; even the couple of OSX system libraries + we're bundling are licensed under the APSL. diff --git a/doc/design/assistant/blog/day_93__easy_install.mdwn b/doc/design/assistant/blog/day_93__easy_install.mdwn new file mode 100644 index 000000000..013b872e1 --- /dev/null +++ b/doc/design/assistant/blog/day_93__easy_install.mdwn @@ -0,0 +1,34 @@ +I hear that people want the git-annex assistant to be easy to install +without messing about building it from source.. + +## on OSX + +So Jimmy and I have been working all week on making an easily installed OSX +app of the assistant. This is a .dmz file that bundles all the dependencies +(git, etc) in, so it can be installed with one click. + +It seems to basically work. You can get it [[here|install/OSX]]. + +Unfortunatly, the [[bugs/pasting_into_annex_on_OSX]] bug resurfaced while +testing this.. So I can't really recommend using it on real data yet. + +Still, any testing you can do is gonna be really helpful. I'm squashing OSX +bugs right and left. + +## on Linux + +First of all, the git-annex assistant is now available in Debian unstable, +and in Arch Linux's AUR. Proper packages. + +For all the other Linux distributions, I have a workaround. It's +a big hack, but it seems to work.. at least on Debian stable. + +I've just put up a [[install/linux_standalone]] tarball, which has **no +library dependencies** apart from glibc, and doesn't even need git to be +installed on your system. + +## on FreeBSD + +The FreeBSD port has been updated to include the git-annex assistant too.. + +[[!meta title="day 94 easy install"]] diff --git a/doc/design/assistant/blog/day_93__easy_install/comment_1_d4f7de723c98577ef28d89ee6b87fd13._comment b/doc/design/assistant/blog/day_93__easy_install/comment_1_d4f7de723c98577ef28d89ee6b87fd13._comment new file mode 100644 index 000000000..57a0c78d7 --- /dev/null +++ b/doc/design/assistant/blog/day_93__easy_install/comment_1_d4f7de723c98577ef28d89ee6b87fd13._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://rjc.pip.verisignlabs.com/" + ip="86.22.66.200" + subject="assistant in Debian" + date="2012-09-30T09:10:17Z" + content=""" +The same version of ghc in Debian repository on i386 and amd64 privides ghc-ghci virtual package while on all the other architectures it doesn't. Is that normal or shall I file a bug? + +What it basically means is that the packages, both git-annex (with assistant) and its build dependencies, for all the other archs cannot be build on Debian porting machines until that is fixed. It already is in the experimental version but until that one gets to unstable there won't be any official debs for all non-Intel architecures. +"""]] diff --git a/doc/design/assistant/blog/day_93__easy_install/comment_2_6337b341c1cfb2132b59704394e57b36._comment b/doc/design/assistant/blog/day_93__easy_install/comment_2_6337b341c1cfb2132b59704394e57b36._comment new file mode 100644 index 000000000..ba027e921 --- /dev/null +++ b/doc/design/assistant/blog/day_93__easy_install/comment_2_6337b341c1cfb2132b59704394e57b36._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 2" + date="2012-09-30T17:11:13Z" + content=""" +The next upload to debian will enable building the assistant on architectures that don't have template haskell and so cannot build the webapp. +"""]] diff --git a/doc/design/assistant/blog/day_95__repository_groups.mdwn b/doc/design/assistant/blog/day_95__repository_groups.mdwn new file mode 100644 index 000000000..5e4bc6d20 --- /dev/null +++ b/doc/design/assistant/blog/day_95__repository_groups.mdwn @@ -0,0 +1,21 @@ +Spent a lot of time this weekend thinking about/stuck on the [[cloud]] +notification problem. Currently IRC is looking like the best way for +repositories to notify one-another when changes are made, but I'm not sure +about using that, and not ready to start on it. + +Instead, laid some groundwork for [[transfer_control]] today. Added +some simple commands to manage groups of repositories, and find files +that are present in repositories in a group. I'm not completely happy +with the syntax for that, and need to think up some good syntax to specify +files that are present in *all* repositories in a group. + +The plan is to have the assistant automatically guess at groups to put new +repositories it makes in (it should be able to make good guesses), +as well as have an interface to change them, and an interface to configure +transfer control using these groups (and other ways of matching files). +And, probably, some canned transfer control recipes for common setups. + +--- + +Collected up the past week's work and made a release today. I'm probably +back to making regular releases every week or two. diff --git a/doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn b/doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn new file mode 100644 index 000000000..a9607bb80 --- /dev/null +++ b/doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn @@ -0,0 +1,24 @@ +Today I revisited something from way back in [[day_7__bugfixes]]. +Back then, it wasn't practical to run `git ls-files` on every +file the watcher noticed, to check if it was already in git. Revisiting +this, I found I could efficiently do that check at the same point it checks +`lsof`. When there's a lot of files being added, they're batched up at that +point, so it won't be calling `git ls-files` repeatedly. + +Result: It's safe to mix use of the assistant with files stored in git +in the normal way. And it's safe to mix use of `git annex unlock` with +the assistant; it won't immediately re-lock files. Yay! + +---- + +Also fixed a crash in the committer, and made `git annex status` display +repository groups. + +---- + +Been thinking through where to store the [[transfer_control]] expressions. +Since repositories need to know about the transfer controls of other +remotes, storing them in `.git/config` isn't right. I thought it might be +nice to configure the expressions in `.gitattributes`, but it seems the +file format doesn't allow complicated multi-word attributes. Instead, +they'll be stored in the git-annex branch. diff --git a/doc/design/assistant/blog/day_96__revisiting_file_adds/comment_1_da3ca47041168b6c82aeb2c18acc5017._comment b/doc/design/assistant/blog/day_96__revisiting_file_adds/comment_1_da3ca47041168b6c82aeb2c18acc5017._comment new file mode 100644 index 000000000..298a95371 --- /dev/null +++ b/doc/design/assistant/blog/day_96__revisiting_file_adds/comment_1_da3ca47041168b6c82aeb2c18acc5017._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="symlinks?" + date="2012-10-03T07:15:21Z" + content=""" +Does that mean that git-annex will no longer need to turn everything into symlinks? I suspect that that will improve behaviour on at least OSX quite a bit. +"""]] diff --git a/doc/design/assistant/blog/day_97__stuffing.mdwn b/doc/design/assistant/blog/day_97__stuffing.mdwn new file mode 100644 index 000000000..595aca1e0 --- /dev/null +++ b/doc/design/assistant/blog/day_97__stuffing.mdwn @@ -0,0 +1,14 @@ +Not a lot of programming today; I spent most of the day stuffing hundreds +of envelopes for this Kickstarter thing you may have heard of. Some post +office is going to be very surprised with all the international mail soon. + +---- + +That said, I did write 184 lines of code. (Actually rather a lot, but it +was mostly pure functional code, so easy to write.) That +pops up your text editor on a file with the the trust and group +configurations of repositories, that's stored in the git-annex branch. +Handy for both viewing that stuff all in one place, and changing it. + +The real reason for doing that is to provide a nice interface for editing +transfer control expressions, which I'll be adding next. diff --git a/doc/design/assistant/blog/day_98__preferred_content.mdwn b/doc/design/assistant/blog/day_98__preferred_content.mdwn new file mode 100644 index 000000000..d1324f69e --- /dev/null +++ b/doc/design/assistant/blog/day_98__preferred_content.mdwn @@ -0,0 +1,44 @@ +Started implementing [[transfer_control]]. Although I'm currently calling +the configuration for it "preferred content expressions". (What a mouthful!) + +I was mostly able to reuse the Limit code (used to handle parameters like +--not --in otherrepo), so it can already build Matchers for preferred content +expressions in my little Domain Specific Language. + +Preferred content expressions can be edited with `git annex vicfg`, which +checks that they parse properly. + +The plan is that the first place to use them is not going to be inside the +assistant, but in commands that use the `--auto` parameter, which will use +them as an additional constraint, in addition to the numcopies setting +already used. Once I get it working there, I'll add it to the assistant. + +Let's say a repo has a preferred content setting of +"(not copies=trusted:2) and (not in=usbdrive)" + +* `git annex get --auto` will get files that have less than 2 trusted + copies, and are not in the usb drive. +* `git annex drop --auto` will drop files that have 2 or more trusted + copies, and are not in the usb drive (assuming numcopies allows dropping + them of course). +* `git annex copy --auto --to thatrepo` run from another repo + will only copy files that have less than 2 trusted copies. (And if that + was run on the usb drive, it'd never copy anything!) + +There is a complication here.. What if the repo with that preferred content +setting is itself trusted? Then when it gets a file, its number of +trusted copies increases, which will make it be dropped again. :-/ + +This is a nuance that the numcopies code already deals with, but it's +much harder to deal with it in these complicated expressions. I need to think +about this; the three ideas I'm working on are: + +1. Leave it to whoever/whatever writes these expressions to write ones + that avoid such problems. Which is ok if I'm the only one writing + pre-canned ones, in practice.. +2. Transform expressions into ones that avoid such problems. (For example, + replace "not copies=trusted:2" with "not (copies=trusted:2 or (in=here and + trusted=here and copies=trusted:3))" +3. Have some of the commands (mostly drop I think) pretend the drop + has already happened, and check if it'd then want to get the file back + again. diff --git a/doc/design/assistant/blog/day_98__preferred_content/comment_1_2136618e3515d0ac6369a41f1934ec2a._comment b/doc/design/assistant/blog/day_98__preferred_content/comment_1_2136618e3515d0ac6369a41f1934ec2a._comment new file mode 100644 index 000000000..b0fcd8c79 --- /dev/null +++ b/doc/design/assistant/blog/day_98__preferred_content/comment_1_2136618e3515d0ac6369a41f1934ec2a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="Ah, the barber paradox" + date="2012-10-05T06:51:11Z" + content=""" +Nice. Would (not in=here) be the simplest paradoxical expression? + +Is just disregarding the target repo completely during checks a possibility? This would interpret (not copies=trusted:X) as \"not in X *other* trusted repositories, no matter whether we are trusted or not\", and (not in=here) just as \"true\". I think this should generally arrive at the same results as the option 2., but by definition of the expression meaing, not by rewriting. + +Alternative 3 (or is my wording different enough to be 3a?) - check that the invariant \"we have all the known files matching our PCE and only these files\" would hold after an operation before actually performing it - could be bistable if done both for gets and drops: + +* (not in=here) and we do not have the file -> get thinks \"if we get it, we have a file not matching the PCE\" -> get does not get it; +* (not in=here) and we do have the file -> drop thinks \"if we drop it, there exists a file matching the PCE which we miss\" -> drop does not drop it. + +This is not necessarily bad. Checking just for drops should be monostable, I guess, but doesn't it look a bit arbitrary? (Though it would be again equivalent to option 2, wouldn't it? So maybe not that arbitrary.) +"""]] diff --git a/doc/design/assistant/blog/day_98__preferred_content/comment_2_5f6db00e69628bf2f72b0e6f2981a49b._comment b/doc/design/assistant/blog/day_98__preferred_content/comment_2_5f6db00e69628bf2f72b0e6f2981a49b._comment new file mode 100644 index 000000000..fa1ce32b8 --- /dev/null +++ b/doc/design/assistant/blog/day_98__preferred_content/comment_2_5f6db00e69628bf2f72b0e6f2981a49b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 2" + date="2012-10-05T15:08:26Z" + content=""" +Yes, I think checking the future only for drops is both stable and equivilant to the other choices. + +Disregarding the target solves the problem for the current set of expressions. There may be future expressions or operations where that does not hold. For example, if move supported --auto (which it does not), you'd need to disregard both sides. + +That method would make it impossible to do some possibly useful things. \"in=here or (not copies=3)\" + +The real problem with it is that existing options like --copies and --in already take all repos into account, so this would potentally lead to two divergent DSLs being used by git-annex, which would probably be confusing. +"""]] diff --git a/doc/design/assistant/blog/day_99_shotgun.mdwn b/doc/design/assistant/blog/day_99_shotgun.mdwn new file mode 100644 index 000000000..77a08f3cb --- /dev/null +++ b/doc/design/assistant/blog/day_99_shotgun.mdwn @@ -0,0 +1,70 @@ +Fixed the assistant to wait on all the zombie processes that would sometimes +pile up. I didn't realize this was as bad as it was. + +Zombies and git-annex have been a problem since I started developing it, +because back then I made some rather poor choices, due to barely knowing +how to write Haskell. So parts of the code that stream input from git commands +don't clean up after them properly. Not normally a problem, because +git-annex reaps the zombies after each file it processes. But this reaping +is not thread-safe; it cannot be used in the assistant. + +If I were starting git-annex today, I'd use one of the new Haskell things like +Conduits, that allow for very clean control over finalization of resources. +But switching it to Conduits now would probably take weeks of work; I've not +yet felt it was worthwhile. (Also it's not clear Conduits are the last, +best thing.) + +For now, it keeps track of the pids it needs to wait on, and all the code +run by the assistant is zombie-free. However, some code for fsck and unused +that I anticipate the assistant using eventually still has some lurking +zombies. + +---- + +Solved the issue with preferred content expressions and dropping that +I mentioned yesterday. My solution was to add a parameter to specify a set +of repositories where content should be assumed not to be present. When +deciding whether to drop, it can put the current repository in, and then +if the expression fails to match, the content can be dropped. + +Using yesterday's example "(not copies=trusted:2) and (not in=usbdrive)", +when the local repo is one of the 2 trusted copies, the drop check will +see only 1 trusted copy, so the expression matches, and so the content will +not be dropped. + +I've not tested my solution, but it type checks. :P I'll wire it up to +`get/drop/move --auto` tomorrow and see how it performs. + +---- + +Would preferred content expressions be more readble if they were inverted +(becoming content filtering expressions)? + +1. "(not copies=trusted:2) and (not in=usbdrive)" becomes + "copies=trusted:2 or in=usbdrive" +2. "smallerthan=10mb and include=*.mp3 and exclude=junk/*" becomes + "largerthan=10mb or exclude=*.mp3" or include=junk/*" +3. "(not group=archival) and (not copies=archival:1)" becomes + "group=archival or copies=archival:1" + +1 and 3 are improved, but 2, less so. It's a trifle weird for "include" +to mean "include in excluded content". + +The other reason not to do this is that currently the expressions +can be fed into `git annex find` on the command line, and it'll come +back with the files that would be kept. + +Perhaps a middle groud is to make "dontwant" be an alias for "not". +Then we can write "dontwant (copies=trusted:2 or in=usbdrive)" + +---- + +A user told me this: + +> I can confirm that the assistant does what it is supposed to do really well. I +> just hooked up my notebook to the network and it starts syncing from notebook to +> fileserver and the assistant on the fileserver also immediately starts syncing +> to the [..] backup + +That makes me happy, it's the first quite so real-world success report I've +heard. diff --git a/doc/design/assistant/blog/day_99_shotgun/comment_1_12bb8f54bb13ea20ac4187a2301d77ca._comment b/doc/design/assistant/blog/day_99_shotgun/comment_1_12bb8f54bb13ea20ac4187a2301d77ca._comment new file mode 100644 index 000000000..eeaefef42 --- /dev/null +++ b/doc/design/assistant/blog/day_99_shotgun/comment_1_12bb8f54bb13ea20ac4187a2301d77ca._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="Include/exclude" + date="2012-10-06T08:40:23Z" + content=""" +It seems that example 2 reads weird for filtering because exclude/include say *what to do* while copies/in say *what to test*. An alias (maybe \"glob\") for include should be acceptable both ways (largerthan=10mb or glob=junk/\* or not glob=\*.mp3). + +That said, I would vote for keeping PCEs. And actually the simple \"not (copies=trusted:2 or in=usbdrive)\" does not read significantly worse than with \"dontwant\". (In *my bikeshed* we would have \"all\" == \"glob=\*\" and \"except\" == \"and not\"). +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness.mdwn b/doc/design/assistant/blog/day_9__correctness.mdwn new file mode 100644 index 000000000..1fa4c09d0 --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness.mdwn @@ -0,0 +1,30 @@ + git merge watch_ + +My cursor has been mentally poised here all day, but I've been reluctant to +merge watch into master. It seems solid, but is it correct? I was able to +think up a lot of races it'd be subject to, and deal with them, but did I +find them all? + +Perhaps I need to do some automated fuzz testing to reassure myself. +I looked into using [genbackupdata](http://liw.fi/genbackupdata/) to that +end. It's not quite what I need, but could be +[moved in that direction](http://bugs.debian.org/677542). Or I could write +my own fuzz tester, but it seems better to use someone else's, because +a) laziness and b) they're less likely to have the same blind spots I do. + +My reluctance to merge isn't helped by the known bugs with files that are +either already open before `git annex watch` starts, or are opened by two +processes at once, and confuse it into annexing the still-open file when one +process closes it. + +I've been thinking about just running `lsof` on every file as it's being +annexed to check for that, but in the end, `lsof` is too slow. Since its +check involves trawling through all of /proc, it takes it a good half a +second to check a file, and adding 25 seconds to the time it takes to +process 100 files is just not acceptable. + +But an option that could work is to run `lsof` after a bunch of new files +have been annexed. It can check a lot of files nearly as fast as a single +one. In the rare case that an annexed file is indeed still open, it could +be moved back out of the annex. Then when its remaining writer finally +closes it, another inotify event would re-annex it. diff --git a/doc/design/assistant/blog/day_9__correctness/comment_1_564a39cb976767e2c0a9c74fabe10be4._comment b/doc/design/assistant/blog/day_9__correctness/comment_1_564a39cb976767e2c0a9c74fabe10be4._comment new file mode 100644 index 000000000..8236002cc --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_1_564a39cb976767e2c0a9c74fabe10be4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="os compatibility" + date="2012-06-15T07:19:23Z" + content=""" +A downside of relying on lsof is that you might be painting yourself into a linux corner: other operating systems might not have a lsof or alternative you can rely on. Especially for Windows this might be a worry. +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness/comment_2_77924e9d50b40f05e792e427a25849a6._comment b/doc/design/assistant/blog/day_9__correctness/comment_2_77924e9d50b40f05e792e427a25849a6._comment new file mode 100644 index 000000000..8744882c9 --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_2_77924e9d50b40f05e792e427a25849a6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="filesystem number of open file handles on a file" + date="2012-06-15T08:21:37Z" + content=""" +wasn't there some filesystem functionality that could tell you the amount of open file handles on a certain file? I thought this was tracked per-file too. +Or maybe i'm just confusing it with the number of hard links (which stat can tell you), anyway something to look into. +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness/comment_3_92bd86cd06d579e23800af2e5c66a291._comment b/doc/design/assistant/blog/day_9__correctness/comment_3_92bd86cd06d579e23800af2e5c66a291._comment new file mode 100644 index 000000000..680f16ecc --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_3_92bd86cd06d579e23800af2e5c66a291._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-06-15T08:58:17Z" + content=""" +I would also be reluctant to use lsof for the sake of non-linux systems or systems that don't have lsof. I've only been playing around with the watch branch of my \"other\" laptop under archlinux. It looks usable, however I would prefer support for OSX before the watch branch gets merged to master ;) +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness/comment_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment b/doc/design/assistant/blog/day_9__correctness/comment_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment new file mode 100644 index 000000000..721875491 --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2012-06-15T10:21:17Z" + content=""" +Corner case, but if the other program finishes writing while you are annexing and your check shows no open files, you are left with bad checksum on a correct file. This \"broken\" file with propagate and the next round of fsck will show that all copies are \"bad\". + +Without verifying if this is viable, could you set the file RO and thus block future writes before starting to annex? +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness/comment_5_208f9dd3e1d92555b05c29159538a901._comment b/doc/design/assistant/blog/day_9__correctness/comment_5_208f9dd3e1d92555b05c29159538a901._comment new file mode 100644 index 000000000..b7fbecc39 --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_5_208f9dd3e1d92555b05c29159538a901._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.135" + subject="comment 5" + date="2012-06-15T15:14:52Z" + content=""" +@wichert All this inotify stuff is entirely linux specific AFAIK anyway, so it's find for workarounds to limitations in inotify functionality to also be linux specific. + +@dieter I think you're thinking of hard links, filesystems don't track number of open file handles afaik. + +@Jimmy, I'm planning to get watch going on freebsd (and hopefully that will also cover OSX), after merging it :) + +@Richard, the file is set RO while it's being annexed, so any lsof would come after that point. +"""]] diff --git a/doc/design/assistant/blog/day_9__correctness/comment_6_90cc6b60718896fb175919417600fdf9._comment b/doc/design/assistant/blog/day_9__correctness/comment_6_90cc6b60718896fb175919417600fdf9._comment new file mode 100644 index 000000000..622b141fd --- /dev/null +++ b/doc/design/assistant/blog/day_9__correctness/comment_6_90cc6b60718896fb175919417600fdf9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.135" + subject="comment 6" + date="2012-06-15T15:23:21Z" + content=""" +But Rich is right, and I was thinking the same thing earlier this morning, that delaying the lsof allows the writer to change the file and exit, and only fsck can detect the problem then. Setting file permissions doesn't help once a process already has it open for write. Which has put me off the delayed lsof idea unfortunately. lsof *could* be run safely during the intial annexing. +"""]] diff --git a/doc/design/assistant/chunks.mdwn b/doc/design/assistant/chunks.mdwn new file mode 100644 index 000000000..6a92731ee --- /dev/null +++ b/doc/design/assistant/chunks.mdwn @@ -0,0 +1,7 @@ +To avoid leaking even the size of your encrypted files to cloud storage +providers, add a mode that stores fixed size chunks. + +May be a useful starting point for [[deltas]]. + +May also allow for downloading different chunks of a file concurrently from +multiple remotes. diff --git a/doc/design/assistant/cloud.mdwn b/doc/design/assistant/cloud.mdwn new file mode 100644 index 000000000..aa0eba382 --- /dev/null +++ b/doc/design/assistant/cloud.mdwn @@ -0,0 +1,45 @@ +The [[syncing]] design assumes the network is connected. But it's often +not in these pre-IPV6 days, so the cloud needs to be used to bridge between +LANS. + +## The cloud notification problem (**done**) + +Alice and Bob have repos, and there is a cloud remote they both share. +Alice adds a file; the assistant transfers it to the cloud remote. +How does Bob find out about it? + +There are two parts to this problem. Bob needs to find out that there's +been a change to Alice's git repo. Then he needs to pull from Alice's git repo, +or some other repo in the cloud she pushed to. Once both steps are done, +the assistant will transfer the file from the cloud to Bob. + +* dvcs-autosync uses xmppp; all repos need to have the same xmpp account + configured, and send self-messages. An alternative would be to have + different accounts that join a channel or message each other. Still needs + account configuration. +* irc could be used. With a default irc network, and an agreed-upon channel, + no configuration should be needed. IRC might be harder to get through + some firewalls, and is prone to netsplits, etc. IRC networks have reasons + to be wary of bots using them. Only basic notifications could be done over + irc, as it has little security. +* When there's a ssh server involved, code could be run on it to notify + logged-in clients. But this is not a general solution to this problem. +* pubsubhubbub does not seem like an option; its hubs want to pull down + a feed over http. + +See [[xmpp]] for design of git-annex's use of xmpp for push notifications. + +## storing git repos in the cloud **done for XMPP** + +Of course, one option is to just use github etc to store the git repo. + +Two things can store git repos in Amazon S3: +* +* + +Another option is to not store the git repo in the cloud, but push/pull +peer-to-peer. When peers cannot directly talk to one-another, this could be +bounced through something like XMPP. This is **done** for [[xmpp]]! + +Another option: Use to store +git repo encrypted on cloud storage. diff --git a/doc/design/assistant/cloud/comment_1_4997778abc171999499487b71b31c9ba._comment b/doc/design/assistant/cloud/comment_1_4997778abc171999499487b71b31c9ba._comment new file mode 100644 index 000000000..1a01afaa3 --- /dev/null +++ b/doc/design/assistant/cloud/comment_1_4997778abc171999499487b71b31c9ba._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkq0-zRhubO6kR9f85-5kALszIzxIokTUw" + nickname="James" + subject="Cloud Service Limitations" + date="2012-06-11T02:15:04Z" + content=""" +Hey Joey! + +I'm not very tech savvy, but here is my question. +I think for all cloud service providers, there is an upload limitation on how big one file may be. +For example, I can't upload a file bigger than 100 MB on box.net. +Does this affect git-annex at all? Will git-annex automatically split the file depending on the cloud provider or will I have to create small RAR archives of one large file to upload them? + +Thanks! +James +"""]] diff --git a/doc/design/assistant/cloud/comment_2_08da8bc74a4845e354dca99184cffd70._comment b/doc/design/assistant/cloud/comment_2_08da8bc74a4845e354dca99184cffd70._comment new file mode 100644 index 000000000..a9b377ea5 --- /dev/null +++ b/doc/design/assistant/cloud/comment_2_08da8bc74a4845e354dca99184cffd70._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.126" + subject="re: cloud" + date="2012-06-11T04:48:08Z" + content=""" +Yes, git-annex has to split files for certian providers. I already added support for this as part of my first pass at supporting box.com, see [[tips/using_box.com_as_a_special_remote]]. +"""]] diff --git a/doc/design/assistant/cloud/comment_3_faafd1266301997b1822d215ec8e8d8c._comment b/doc/design/assistant/cloud/comment_3_faafd1266301997b1822d215ec8e8d8c._comment new file mode 100644 index 000000000..074a3a82c --- /dev/null +++ b/doc/design/assistant/cloud/comment_3_faafd1266301997b1822d215ec8e8d8c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7Oyqusvn0oONFtVhCx5gRAcvPjyRMcBI" + nickname="Michaël" + subject="is ftp an option?" + date="2012-05-30T10:44:12Z" + content=""" +for people only having ftp-access to there storage. +"""]] diff --git a/doc/design/assistant/cloud/comment_4_3eb557d5439831f6e0032944d12c02cf._comment b/doc/design/assistant/cloud/comment_4_3eb557d5439831f6e0032944d12c02cf._comment new file mode 100644 index 000000000..e3879a114 --- /dev/null +++ b/doc/design/assistant/cloud/comment_4_3eb557d5439831f6e0032944d12c02cf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9XEh8pxrJxZxIkyK7lWaA7QG1UWt9lgU" + nickname="Gugelplus" + subject="OwnCloud" + date="2012-08-27T20:43:19Z" + content=""" +“Google drive (attractive because it's free, only 5 gb tho)” + +Just in case somebody also wants their 5GB of disk space in the cloud, consider using some of the [owncloud providers](http://owncloud.org/providers/). They also offer that amount, but they use free software for everything, using standard protocols (WebDav mostly, because is well supported in all OS). + +Git Annex works with them through davfs2, but it would be great if it could support this other program/protocol (OwnCloud/WebDAV) in a more integrated way. +"""]] diff --git a/doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment b/doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment new file mode 100644 index 000000000..f24357fb6 --- /dev/null +++ b/doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://www.klomp.eu/" + ip="95.91.241.82" + subject="Watch also possible with git?" + date="2012-06-15T17:25:30Z" + content=""" +Hi, + +it seems that you put a lot of efforts in handling race conditions. Thats great. I wonder if the watch can also be used with git (i.e. changes are commited into git and not as annex)? I know that other projects follow this idea but why using different tools if the git-annex assistant could handle both... +"""]] diff --git a/doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment b/doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment new file mode 100644 index 000000000..71a9f155d --- /dev/null +++ b/doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawneJXwhacIb0YvvdYFxhlNVpz6Wpg6V7AA" + nickname="Shayne" + subject="comment 11" + date="2012-08-13T00:37:35Z" + content=""" +Yeah definately go with homebrew rather than macports if possible. macports and fink, whilst great systems, have a tendency to sort of create their own alternative-dimension of files within the system that just dont always feel particularly well integrated. As a result \"brew\" has become increasingly more popular to the point its almost ubuquitous now. + +Plus its brew-doctor thing is awesome. + +The best approach though thats agnostic to distro systems is to simply go for a generic installer. +"""]] diff --git a/doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment b/doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment new file mode 100644 index 000000000..b2de673e3 --- /dev/null +++ b/doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4" + nickname="Jörn" + subject="Multiple annexes?" + date="2012-09-20T16:10:29Z" + content=""" +Thank you for this great piece of software which is now becoming even better with the assistant. + +Just one question: will one instance of the assistant be able to track multiple git annex repositories each building up their own network of annexes OR would I need to run multiple instances of the assistant? + +Thanks, +Jörn +"""]] diff --git a/doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment b/doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment new file mode 100644 index 000000000..c121eaf7f --- /dev/null +++ b/doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 13" + date="2012-09-20T16:21:11Z" + content=""" +@Jörn, two days ago I added support in the webapp for multiple independent repositories. So you can create independent repos using it, and switch between them from a menu. Under the hood there are multiple git-annex assistant daemons running, but this is an implementation detail; it's not like these use any more memory or other resources than would a single daemon that managed multiple repositories. +"""]] diff --git a/doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment b/doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment new file mode 100644 index 000000000..b43741feb --- /dev/null +++ b/doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + subject="you rock! & roadmap update?" + date="2012-09-21T04:25:58Z" + content=""" +joey, you rock. I just want to push on that point - it doesn't seem like there's that many tools that do what git-annex is trying to do out there, and you seem to be doing an incredible job at doing it, so this is great, keep going! + +i was wondering - i am glad to see the progress, but it is unclear to me where you actually are in the roadmap. are things going according to plan? are we at month 3? 4? or 1-4? :) just little updates on that roadmap section above would be quite useful! + +thanks again! +"""]] diff --git a/doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment b/doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment new file mode 100644 index 000000000..10b55bbe3 --- /dev/null +++ b/doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 15" + date="2012-09-21T05:25:53Z" + content=""" +We're on month 4 of work, and most of months 1-3 is done well enough for a first pass. Very little of what's listed in month 4 has happened yet, due to my being maybe 2 weeks behind schedule, but bits of [[cloud]] are being planned. + +I've made a small adjustment, I think it'll make sense to spend a month on user-driven features before getting into Android. +"""]] diff --git a/doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment b/doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment new file mode 100644 index 000000000..de5e5b078 --- /dev/null +++ b/doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~gdr-go2" + nickname="gdr-go2" + subject="Maybe a DEB?2" + date="2012-09-27T09:44:14Z" + content=""" +Month 3 was all about easy setup, so I kind of expected to download a deb package and just install it, not to download a whole bunch of haskell libraries. Is there a chance that you will release some packages? +"""]] diff --git a/doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment b/doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment new file mode 100644 index 000000000..ea3f50e61 --- /dev/null +++ b/doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 17" + date="2012-09-27T18:44:11Z" + content=""" +@gdr A package with the assistant is available in Debian unstable. +"""]] diff --git a/doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment b/doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment new file mode 100644 index 000000000..672c2a9d7 --- /dev/null +++ b/doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="for OSX, package managers (homebrew and macports) are really second-class" + date="2013-07-24T07:24:49Z" + content=""" +at least with regards to wide spread use. I agree with Wichert, the average OSX user won't use them. I myself would go with homebrew (because it is far less of a pain than macports), but actually static built binaries that are just dragged from a DMG to your programs folder is the way to go if you can't go osx app store. It's just how most Apple users are wired. PKG would be fine, too, since most will know them, but those are really only needed if you need to place stuff in /Library/Frameworks or things like that. If it can be done as a all-inclusive OSX .app, do it that way and just pack it up in a .DMG. +"""]] diff --git a/doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment b/doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment new file mode 100644 index 000000000..1ef6136b9 --- /dev/null +++ b/doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlnoH5btjn_BLib3_IhES5uMhrzuOiwCYo" + nickname="András" + subject="windows port" + date="2013-07-25T07:50:19Z" + content=""" +I'd love to use the Windows port of the assistant by Christmas. Keep up the good work! :) +"""]] diff --git a/doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment b/doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment new file mode 100644 index 000000000..646a03398 --- /dev/null +++ b/doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-06-02T12:06:37Z" + content=""" +Will statically linked binaries be provided for say Linux, OSX and *BSD? I think having some statically linked binaries will certainly help and appeal to a lot of users. +"""]] diff --git a/doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment b/doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment new file mode 100644 index 000000000..f423c3e10 --- /dev/null +++ b/doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 20" + date="2013-07-25T18:22:51Z" + content=""" +@Georg, DMG have been built for OSX for a long time. See [[install/OSX]] +"""]] diff --git a/doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment b/doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment new file mode 100644 index 000000000..8056eec16 --- /dev/null +++ b/doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-06-04T19:45:00Z" + content=""" +Jimmy, I hope to make it as easy as possible to install. I've been focusing on getting it directly into popular Linux distributions, rather than shipping my own binary. The OSX binary is static, and while I lack a OSX machine, I would like to get it easier to distribute to OSX users. +"""]] diff --git a/doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment b/doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment new file mode 100644 index 000000000..a78fa3343 --- /dev/null +++ b/doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-06-07T20:22:55Z" + content=""" +I'd agree getting it into the main distros is the way to go, if you need OSX binaries, I could volunteer to setup an autobuilder to generate binaries for OSX users, however it would rely on users to have macports with the correct ports installed to use it (things like coreutils etc...) + +"""]] diff --git a/doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment b/doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment new file mode 100644 index 000000000..cd3b5aaef --- /dev/null +++ b/doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 4" + date="2012-06-08T01:56:52Z" + content=""" +I always appreciate your OSX work Jimmy... + +Could it be put into macports? +"""]] diff --git a/doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment b/doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment new file mode 100644 index 000000000..bf8d9709e --- /dev/null +++ b/doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2012-06-08T07:22:34Z" + content=""" +In relation to macports, I often found that haskell in macports are often behind other distros, and I'm not willing to put much effort into maintaining or updating those ports. I found that to build git-annex, installing macports manually and then installing haskell-platform from the upstream to be the best way to get the most up to date dependancies for git-annex. + +fyi in macports ghc is at version 6.10.4 and haskell platform is at version 2009.2, so there are a significant number of ports to update. + +I was thinking about this a bit more and I reckon it might be easier to try and build a self contained .pkg package and have all the needed binaries in a .app styled package, that would work well when the webapp comes along. I will take a look at it in a week or two (currently moving house so I dont have much time) +"""]] diff --git a/doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment b/doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment new file mode 100644 index 000000000..9fa66d6d3 --- /dev/null +++ b/doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 6" + date="2012-06-08T15:21:18Z" + content=""" +It's not much for now... but see I'm ignoring the debian-stable and pristine-tar branches for now, as I am just building and testing on osx 10.7. + +Hope the autobuilder will help you develop the OSX side of things without having direct access to an osx machine! I will try and get gitbuilder to spit out appropriately named tarballs of the compiled binaries in a few days when I have more time. +"""]] diff --git a/doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment b/doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment new file mode 100644 index 000000000..6685c6548 --- /dev/null +++ b/doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.126" + subject="comment 7" + date="2012-06-09T18:07:51Z" + content=""" +Thanks, that's already been useful to me. You might as well skip the debian-specific \"bpo\" tags too. +"""]] diff --git a/doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment b/doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment new file mode 100644 index 000000000..57f354e49 --- /dev/null +++ b/doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawldKnauegZulM7X6JoHJs7Gd5PnDjcgx-E" + nickname="Matt" + subject="Homebrew instead of MacPorts" + date="2012-06-22T04:26:02Z" + content=""" +[Homebrew] is a much better package manager than MacPorts IMO. + +[Homebrew]: http://mxcl.github.com/homebrew/ +"""]] diff --git a/doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment b/doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment new file mode 100644 index 000000000..5e955c2b6 --- /dev/null +++ b/doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="macports" + date="2012-06-12T13:00:34Z" + content=""" +The average OSX user has a) no idea what macports is, and b) will not be able to install it. Anything that requires a user to do anything with a commandline (or really anything other than using a GUI installer) is effectively a dealbreaker. For our use cases OSX is definitely a requirement, but it must only use standard OSX installation methods in order to be usable. Being in the appstore would be ideal, but standard dmg/pkg installers are still common enough that they are also acceptable. + +FWIW this is the same reason many git GUIs were not usable for our OSX users: they required separate installation of the git commandline tools. +"""]] diff --git a/doc/design/assistant/configurators.mdwn b/doc/design/assistant/configurators.mdwn new file mode 100644 index 000000000..4d08ac54a --- /dev/null +++ b/doc/design/assistant/configurators.mdwn @@ -0,0 +1,20 @@ +Add to the [[webapp]] some configuration of git-annex. + +There are some basic settings that pass through to `git config`, things +like how much disk space to leave free, how many copies to ensure are kept +of files, etc. + +The meat of the configuration will be in configuration assistants that walk +through setting up common use cases. + +* Create a repository (run when the web app is started without a configured + repository too). **done** +* Clone this repo to a USB drive or other removable drive. **done** +* Make a bare repo on a remote ssh server **done** +* Clone this repo to another host. (Needs [[pairing]]) **done** +* Set up Amazon S3. **done** +* Set up encrypted rsync remote. **done** +* Rsync.net special case **done** +* Set up gpg encryption key; gpg key distribution. +* I lost my USB drive! +* etc -- many more possibilities diff --git a/doc/design/assistant/deltas.mdwn b/doc/design/assistant/deltas.mdwn new file mode 100644 index 000000000..ff4185a18 --- /dev/null +++ b/doc/design/assistant/deltas.mdwn @@ -0,0 +1,9 @@ +Speed up syncing of modified versions of existing files. + +One simple way is to find the key of the old version of a file that's +being transferred, so it can be used as the basis for rsync, or any +other similar transfer protocol. + +For remotes that don't use rsync, a poor man's version could be had by +chunking each object into multiple parts. Only modified parts need be +transferred. Sort of sub-keys to the main key being stored. diff --git a/doc/design/assistant/deltas/comment_1_bdb477af913c9782c0e8509e6b294b6e._comment b/doc/design/assistant/deltas/comment_1_bdb477af913c9782c0e8509e6b294b6e._comment new file mode 100644 index 000000000..3361de4bf --- /dev/null +++ b/doc/design/assistant/deltas/comment_1_bdb477af913c9782c0e8509e6b294b6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="zsync?" + date="2012-09-10T12:35:45Z" + content=""" +zsync.moria.org.uk may have broken some of the ground here. +"""]] diff --git a/doc/design/assistant/deltas/comment_2_71889d15ba20ebb0fe13080c68162a5b._comment b/doc/design/assistant/deltas/comment_2_71889d15ba20ebb0fe13080c68162a5b._comment new file mode 100644 index 000000000..3ef911b77 --- /dev/null +++ b/doc/design/assistant/deltas/comment_2_71889d15ba20ebb0fe13080c68162a5b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm72W-CH7bzZ8uHvaw1KJGrToPSQDNBnIA" + nickname="Beni" + subject="bup splitting" + date="2013-08-05T17:13:14Z" + content=""" +bup splits files into chunks based on rolling sums. +https://github.com/apenwarr/bup/blob/master/DESIGN +For small changes to big files, this would improve not only transfer speed but also repository size. +And git-annex already supports bup remotes. What's missing? +"""]] diff --git a/doc/design/assistant/desymlink.mdwn b/doc/design/assistant/desymlink.mdwn new file mode 100644 index 000000000..ffa37399d --- /dev/null +++ b/doc/design/assistant/desymlink.mdwn @@ -0,0 +1,145 @@ +While dropbox allows modifying files in the folder, git-annex freezes +them upon creation, using symlinks. + +This is a core design simplification of git-annex. +But it is problematic too: + +* To allow directly editing files in its folder, something like [[todo/smudge]] is + needed, to get rid of the symlinks that stand in for the files. +* OSX seems to have a [[lot_of_problems|bugs/OSX_alias_permissions_and_versions_problem]] + with stupid programs that follow symlinks and present the git-annex + hash filename to the user. +* FAT sucks and doesn't support symlinks at all, so [[Android]] can't + have regular repos on it. + +One approach for this would be to hide the git repo away somewhere, +and have the git-annex assistant watch a regular directory, with +regular files. + +There would have to be a mapping from files to git-annex objects. +And some intelligent way to determine when a file has been changed +and no longer corresponds to its object. (Not expensive hashing every time, +plz.) + +Since this leaves every file open to modification, any such repository +probably needs to be considered untrusted by git-annex. So it doesn't +leave its only copy of a file in such a repository, but instead +syncs it to a proper git-annex repository. + +The assistant would make git commits still, of symlinks. It can already do +that with without actual symlinks existing on disk. More difficult is +handling merging; git merge wants a real repository with files it can +really operate on. The assistant would need to calculate merges on its own, +and update the regular directory to reflect changes made in the merge. + +Another massive problem with this idea is that it doesn't allow for +[[partial_content]]. The symlinks that everyone loves to hate on are what +make it possible for the contents of some files to not be present on +disk, while the files are still in git and can be retreived as desired. +With real files, some other standin for a missing file would be needed. +Perhaps a 0 length, unreadable, unwritable file? On systems that +support symlinks it could be a broken symlink like is used now, that +is converted to a real file when it becomes present. + +## concrete design + +* Enable with annex.direct +* Use .git/ for the git repo, but `.git/annex/objects` won't be used + for object storage. +* `git status` and similar will show all files as type changed, and + `git commit` would be a very bad idea. Just don't support users running + git commands that affect the repository in this mode. Probably. +* However, `git status` and similar also will show deleted and new files, + which will be helpful for the assistant to use when starting up. +* Cache the mtime, size etc of files, and use this to detect when they've been + modified when the assistant was not running. This would only need to be + checked at startup, probably. +* Use dangling symlinks for standins for missing content, as now. + This allows just cloning one of these repositories normally, and then + as the files are synced in, they become real files. +* Maintain a local mapping from keys to files in the tree. This is needed + when sending/receiving/dropping keys to know what file to access. + Note that a key can map to multiple files. And that when a file is + deleted or moved, the mapping needs to be updated. +* May need a reverse mapping, from files in the tree to keys? TBD + (Currently, getting by looking up symlinks using `git cat-file`) + (Needed to make things like `git annex drop` that want to map from the + file back to the key work.) +* The existing watch code detects when a file gets closed, and in this + mode, it could be a new file, or a modified file, or an unchanged file. + For a modified file, can compare mtime, size, etc, to see if it needs + to be re-added. +* The inotify/kqueue interface does not tell us when a file is renamed. + So a rename has to be treated as a delete and an add, so can have a lot + of overhead, to re-hash the file. +* Note that this could be used without the assistant, as a git remote + that content is transferred to and from. Without the assistant, changes + to files in this remote would not be noticed and committed, unless + a git-annex command were added to do so. + Getting it basically working as a remote would be a good 1st step. +* It could also be used without the assistant as a repository that + the user uses directly. Would need some git-annex commands + to merge changes into the repo, update caches, and commit changes. + This could all be done by "git annex sync". + +## TODO + +* kqueue does not deliver an event when an existing file is modified. + This doesn't affect OSX, which uses FSEvents now, but it makes direct + mode assistant not 100% on other BSD's. + +## done + +* `git annex sync` updates the key to files mappings for files changed, + but needs much other work to handle direct mode: + * Generate git commit, without running `git commit`, because it will + want to stage the full files. **done** + * Update location logs for any files deleted by a commit. **done** + * Generate a git merge, without running `git merge` (or possibly running + it in a scratch repo?), because it will stumble over the direct files. + **done** + * Drop contents of files deleted by a merge (including updating the + location log), or if we cannot drop, + move their contents to `.git/annex/objects/`. **no** .. instead, + avoid ever losing file contents in a direct mode merge. If the file is + deleted, its content is moved back to .git/annex/objects, if necessary. + * When a merge adds a symlink pointing at a key that is present in the + repo, replace the symlink with the direct file (either moving out + of `.git/annex/objects/` or hard-linking if the same key is present + elsewhere in the tree. **done** + * handle merge conflicts on direct mode files **done** +* support direct mode in the assistant (many little fixes) + +* Deal with files changing as they're being transferred from a direct mode + repository to another git repository. The remote repo currently will + accept the bad data and update the location log to say it has the key. + + This affects both special remotes and git remotes. + + For special remotes, + it seems the best that could be done is to have an error unwind action + passed to `sendAnnex` that is called if the file is modified as it's + transferred. That would then remove the probably corrupted file from the + remote. (The full transfer would still run, unless there was also a way + to cancel an in progress transfer.) **done** + + (With the above, there is some potential for the bad content being + downloaded from the special remote into another repo. This would only + happen if the other repo for some reason thinks the special remote + has the content. Since the location log would not be updated until the + transfer is successful, this should not happen.) + + For local git remotes, need to check the direct mode file after it's + copied and before it's put into place as a key's content. **done** + (untested) + + `git-annex-shell sendkey` needs to do something if it sent bad + data. This seems to not need protocol changes; it can just detect + the problem and exit nonzero. Would need to do something to clean up + the temp file, which is probably corrupt. (Could in future use it as a + basis for transferring the new key..) **done** + + For git remotes, added a flag to `git-annex-shell recvkey` (using a field + after the "--" to remain back-compat). With this flag, after receiving + the data, the remote fscks the data. This is not optimal, but avoids + needing another round-trip, or a protocol change. diff --git a/doc/design/assistant/desymlink/comment_1_f1bfe250b7f872359f7075998b6e42e3._comment b/doc/design/assistant/desymlink/comment_1_f1bfe250b7f872359f7075998b6e42e3._comment new file mode 100644 index 000000000..5e60ff29e --- /dev/null +++ b/doc/design/assistant/desymlink/comment_1_f1bfe250b7f872359f7075998b6e42e3._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn-KDr_Z4CMkjS0v_TxQ08SzAB5ecHG3K0" + nickname="Glen" + subject="Modifying files in a folder watched by assistant" + date="2012-09-19T14:18:54Z" + content=""" +I think this feature is really important. For my use cases, if I can't modify files that are in the folder that is kept in sync, then I would just use rsync or manually keep copies on multiple systems.. + +I might be missing something, but tried a git annex unlock on the file, but if the assistant is running, it seems to revert this back. + +"""]] diff --git a/doc/design/assistant/desymlink/comment_2_5e876edfe9853645f761b5ed9b5021aa._comment b/doc/design/assistant/desymlink/comment_2_5e876edfe9853645f761b5ed9b5021aa._comment new file mode 100644 index 000000000..b79ae4781 --- /dev/null +++ b/doc/design/assistant/desymlink/comment_2_5e876edfe9853645f761b5ed9b5021aa._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknpbpx4uDElXRzJ4kPXuJU1KdcslOI6go" + nickname="Rodrigo" + subject="I strongly agree with Glen" + date="2012-10-03T14:07:40Z" + content=""" +And if your goal is to build an app \"like dropbox\" it is a must have feature. +Thanks for your work. You are doing great! +"""]] diff --git a/doc/design/assistant/desymlink/comment_3_538561d74371e53c2f8df7f5ebdf58a8._comment b/doc/design/assistant/desymlink/comment_3_538561d74371e53c2f8df7f5ebdf58a8._comment new file mode 100644 index 000000000..40067b25b --- /dev/null +++ b/doc/design/assistant/desymlink/comment_3_538561d74371e53c2f8df7f5ebdf58a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 3" + date="2012-10-05T00:43:11Z" + content=""" +@Glen, for what it's worth, you can now manually \"git annex unlock\" a file and it'll stay unlocked until you manually \"git annex add\" the new version. +"""]] diff --git a/doc/design/assistant/desymlink/comment_4_586ecaa800e6c162377c937da5e65440._comment b/doc/design/assistant/desymlink/comment_4_586ecaa800e6c162377c937da5e65440._comment new file mode 100644 index 000000000..aeb1587ed --- /dev/null +++ b/doc/design/assistant/desymlink/comment_4_586ecaa800e6c162377c937da5e65440._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="unlock not behaving as you describe" + date="2012-11-05T22:35:35Z" + content=""" +@joeyh, + +I'm not seeing the behavior you describe re \"git annex unlock\" when using the assistant. After unlocking and writing the file, git annex assistant commits the changes and recreates the symlink from under me which is annoying. + +I'm running OS X 10.7.5 using the bundled git-annex.app version 3.20121017. +"""]] diff --git a/doc/design/assistant/desymlink/comment_5_8fc703de67814cf2aec2a908852298a4._comment b/doc/design/assistant/desymlink/comment_5_8fc703de67814cf2aec2a908852298a4._comment new file mode 100644 index 000000000..ca4361532 --- /dev/null +++ b/doc/design/assistant/desymlink/comment_5_8fc703de67814cf2aec2a908852298a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 5" + date="2012-11-05T23:40:50Z" + content=""" +Well, you're able to unlock and modify the file -- that's what I fixed. + +Committing changes to files is what the assistant does.. +"""]] diff --git a/doc/design/assistant/desymlink/comment_6_1b473ad89494afb82250af4b6df5f5c9._comment b/doc/design/assistant/desymlink/comment_6_1b473ad89494afb82250af4b6df5f5c9._comment new file mode 100644 index 000000000..fad9cbe98 --- /dev/null +++ b/doc/design/assistant/desymlink/comment_6_1b473ad89494afb82250af4b6df5f5c9._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 6" + date="2012-12-03T05:33:44Z" + content=""" +> One approach for this would be to hide the git repo away somewhere, and have the git-annex assistant watch a regular directory, with regular files. + +I think this would be the single most important feature added to git-annex. +1. It could be used to backup regularly a smb share over the network. +2. For those who dont trust a program who modifies their files directly. +(I had a 3GB permanent data loss, when trying to push a 10GB directory into git annex.) +3. Android + +I do hope the above method will be implemented for Android too, so its like two birds with one stone. +(Im really for option 2 here. I dont like the very idea of modifying my files directly. +Git does not do it either, I have disk space (if not I buy more disks), rather then risquing losing important datas) + +Best, + Laszlo + +"""]] diff --git a/doc/design/assistant/disaster_recovery.mdwn b/doc/design/assistant/disaster_recovery.mdwn new file mode 100644 index 000000000..6fcf95519 --- /dev/null +++ b/doc/design/assistant/disaster_recovery.mdwn @@ -0,0 +1,185 @@ +The assistant should help the user recover their repository when things go +wrong. + +[[!toc ]] + +## dangling lock files + +There are a few ways a git repository can get broken that are easily fixed. +One is left over index.lck files. When a commit to a repository fails, +check that nothing else is using it, fix the problem, and redo the commit. + +* **done** for .git/annex/index.lock, can be handled safely and automatically. +* **done** for .git/index.lock, only when the assistant is starting up. +* What about local remotes, eg removable drives? git-annex does attempt + to commit to the git-annex branch of those. It will use the automatic + fix if any are dangling. It does not commit to the master branch; indeed + a removable drive typically has a bare repository. + However, it does a scan for broken locks anyway if there's a problem + syncing. **done** +* What about git-annex-shell? If the ssh remote has the assistant running, + it can take care of it, and if not, it's a server, and perhaps the user + should be required to fix up if it crashes during a commit. This should + not affect the assistant anyway. +* **done** Seems that refs can also have stale lock files, for example + '/storage/emulated/legacy/DCIM/.git/refs/remotes/flick_phonecamera/synced/git-annex.lock' + All git lock files are now handled (except gc lock files). + +## incremental fsck + +Add webapp UI to enable incremental fsck **done** + +Of course, incremental fsck will run as an niced (and ioniced) background +job. There will need to be a button in the webapp to stop it, in case it's +annoying. **done** + +When fsck finds a damanged file, queue a download of the file from a +remote. **done** + +Detect when a removable drive is connected in the Cronner, and check +and try to run its remote fsck jobs. **done** (Same mechanism will work for +network remotes becoming connected.) + +TODO: If no accessible remote has a file that fsck reported missing, +prompt the user to eg, connect a drive containing it. Or perhaps this is a +special case of a general problem, and the webapp should prompt the user +when any desired file is available on a remote that's not mounted? + +## git-annex-shell remote fsck + +TODO: git-annex-shell fsck support, which would allow cheap fast fscks +of ssh remotes. + +Would be nice; otherwise remote fsck is too expensive (downloads +everything) to have the assistant do. + +Note that Remote.Git already tries to use this, but the assistant does not +call it for non-local remotes. + +## git fsck and repair + +Add git fsck to scheduled self fsck **done** + +TODO: git fsck on ssh remotes? Probably not worth the complexity.. + +TODO: If committing to the repository fails, after resolving any dangling +lock files (see above), it should git fsck. This is difficult, because +git commit will also fail if the commit turns out to be empty, or due to +other transient problems.. So commit failures are currently ignored by the +assistant. + +If git fsck finds problems, launch git repository repair. **done** + +git annex fsck --fast at end of repository repair to ensure +git-annex branch is accurate. **done** + +If syncing with a local repository fails, try to repair it. **done** + +TODO: "Repair" gcrypt remotes, by removing all refs and objects, +and re-pushing. (Since the objects are encrypted data, there is no way +to pull missing ones from anywhere..) +Need to preserve gcrypt-id while doing this! + +TODO: along with displaying alert when there is a problem detected +by consistency check, send an email alert. (Using system MTA?) + +## nudge user to schedule fscks + +Make the webapp encourage users to schedule fscks of their +local repositories. The goal here was that it should not be obnoxious about +repeatedly pestering the user to set that up, but should still encourage +anyone who cares to set it up. + +Maybe: Display a message only once per week, and only after the repository +has existed for at least one full day. But, this will require storing +quite a lot of state. + +Or: Display a message whenever a removable drive is detected to have been +connected. I like this, but what about nudging the main repo? Could do it +every webapp startup, perhaps? **done** + +There should be a "No thanks" button that prevents it nudging again for a +repo. **done** + +## git repository repair + +There are several ways git repositories can get damanged. + +The most common is empty files in .git/annex/objects and commits that refer +to those objects. When the objects have not yet been pushed anywhere. +I've several times recovered from this manually by +removing the bad files and resetting to before the commits that referred to +them. Then re-staging any divergence in the working tree. This could +perhaps be automated. + +As long as the git repository has at least one remote, another method is to +clone the remote, sync from all other remotes, move over .git/config and +.git/annex/objects, and tar up the old broken git repo and `git annex add` +it. This should be automatable and get the user back on their feet. User +could just click a button and have this be done. + +This is useful outside git-annex as well, so make it a +git-recover-repository command. + +### detailed design + +Run `git fsck` and parse output to find bad objects. **done** Note that +fsck may fall over and fail to print out all bad objects, when +files are corrupt. So if the fsck exits nonzero, need to collect all +bad objects it did find, and: + +1. If the local repository contains packs, the packs may be corrupt. + So, start by using `git unpack-objects` to unpack all + packs it can handle (which may include parts of corrupt packs) + back to loose objects. And delete all packs. **done** +2. Delete all loose corrupt objects. **done** + +Repeat until fsck finds no new problems. **done** + +Check if there's a remote. If so, and if the bad objects are all +present on it, can simply get all bad objects from the remote, +and inject them back into .git/objects to recover: + +3. Make a new (bare) clone from the remote. + (Note: git does not seem to provide a way to fetch specific missing + objects from the remote. Also, cannot use `--reference` against + a repository with missing refs. So this seems unavoidably + network-expensive.) **done** +5. Rsync objects over. (Turned out to work better than git-cat-file, + because we don't have to walk the graph to add missing objects.) + **done** +6. If each bad object was able to be repaired this way, we're done! + (If not, can reuse the clone for getting objects from the next remote.) + **done** + +If some missing objects cannot be recovered from remotes, find commits in each +local branch that are broken by all remaining missing objects. Some of this can +be parsed from git fsck output, but for eg blobs, the commits need to +be walked to walk the trees, to find trees that refer to the blobs. **done** + +For each branch that is affected, look in the reflog and/or `git log +$branch` to find the last good commit that predates all broken commits. (If +the head commit of a branch is broken, git log is not going to show +anything useful, but the reflog can be used to find past refs for the +branch -- have to first delete the .git/HEAD file if it points to the +broken ref.) **done** + +The basic idea then is to reset the branch to the last good commit +that was found for it. + +* For the HEAD branch, can just reset it. (If no last good commit was found + for the HEAD branch, reset it to a dummy empty commit.) This will + leave git showing any changes made since then as staged in the index and + uncommitted. Or if the index is missing/corrupt, any files in the tree will + show as modified and uncommitted. User (or git-annex assistant) can then + commit as appropriate. Print appropriate warning message. **done** +* Special handling for git-annex branch and index. **done** +* Remote tracking branches can just be removed, and then `git fetch` + from the remote, which will re-download missing objects from it and + reinstate the tracking branch. **done** +* For other branches, reset them to last good commit, or delete + if none was found. **done** +* (Decided not to touch tags.) + +The index file can still refer to objects that were missing. +Rewrite to remove them. **done** diff --git a/doc/design/assistant/disaster_recovery/comment_1_955dc807196863da23aa8dbd15e04364._comment b/doc/design/assistant/disaster_recovery/comment_1_955dc807196863da23aa8dbd15e04364._comment new file mode 100644 index 000000000..63c7e942d --- /dev/null +++ b/doc/design/assistant/disaster_recovery/comment_1_955dc807196863da23aa8dbd15e04364._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-10-19T15:50:47Z" + content=""" +The restriction on fetching over the Git protocol is, partly, for security reasons – e.g. if one accidentally pushes a commit with private data, and then `push --force`'s a cleaned-up version, Git needs to prevent anyone from downloading the old commit by just giving its SHA1 (e.g. obtained from an IRC/email push notification). So it restricts fetching to the tips of any ref. (I've been told that it could check if the given object is merely *reachable* from any ref, but it doesn't do so for performance reasons.) + +git 1.8 has a minor way to relax this requirement – it allows giving a SHA1 to `git fetch` (although I think the protocol already worked this way), and it allows refs to be hidden server-side but still remain fetchable, so in theory there could be a (hidden) ref for every object, for easy fetching... +"""]] diff --git a/doc/design/assistant/encrypted_git_remotes.mdwn b/doc/design/assistant/encrypted_git_remotes.mdwn new file mode 100644 index 000000000..7d210a292 --- /dev/null +++ b/doc/design/assistant/encrypted_git_remotes.mdwn @@ -0,0 +1,22 @@ +Encrypted git remotes are now possible +using [git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt). + +There are at least two use cases for this in the assistant: + +* Storing an encrypted git repository on a local drive. **done** +* Or on a remote server. This could even allow using github. But more + likely would be a shell server that has git-annex-shell on it so can + also store file contents, and which is not trusted with unencrypted data. + **done** + +git-remote-gcrypt is already usable with git-annex. What's needed is +to make sure it's installed (ie, get it packaged into distros or embedded +into git-annex), and make it easy to set up from the webapp. **done** + +Hmm, this will need gpg key creation, so would also be a good opportunity +to make the webapp allow using that for special remotes too. + +One change is needed in git-annex core.. It currently does not support +storing encrypted files on git remotes, only on special remotes. Perhaps +the way to deal with this is to make it consider git-remote-grypt remotes +to be a special remote type? **done** diff --git a/doc/design/assistant/gpgkeys.mdwn b/doc/design/assistant/gpgkeys.mdwn new file mode 100644 index 000000000..9d1254eb9 --- /dev/null +++ b/doc/design/assistant/gpgkeys.mdwn @@ -0,0 +1,40 @@ +Currently the assistant sets up a shared encryption key, which is checked +into git, so anyone who gets the repository can decrypt files that are +stored encrypted on special remotes. + +To support using gpg keys in the assistant, we need some things: + +1. Help user set up a gpg key if they don't have one. This could be a + special-purpose key dedicated to being used by git-annex. It might be + nice to leave the user with a securely set up general purpose key, + but that would certainly preclude prompting for its password in the + webapp. Indeed, the password prompt is the main problem here. + Best solution would be to get gpg agent working on all supported + platforms. + + Update: For now, git-annex only assists in generating gpg keys that are + intended to only be used to encrypt a repo. + +2. After generating a gpg key, back it up. It might be the only way + some data is accessible. + + One way I'm considering is generating a QR code + of the key, which could be printed to paper. Preliminary results + are good; a 4096 bit secret key fits in a QR code (a secret key + with many subkeys may not). Debian has command-line utilities that + can generate and read such a QR code. + + Another way would be to use shamir secret sharing to split the key into + N peices and send each one to one of the user's repos. + +3. Help user learn the gpg keys of people they want to share their repo + with, and give them access. If the public key was recorded in the git-annex + branch, this could be easily determined when sharing repositories with + friends. Or, use MonkeySphere, or Monkeysign.. + +----- + +Another gpg key security thing is that currently git-annex stores +crypto creds in memory while it's running. Should use locked memory. See + and + diff --git a/doc/design/assistant/gpgkeys/comment_1_a14427f88c9fd8e25ad8708146bb4bff._comment b/doc/design/assistant/gpgkeys/comment_1_a14427f88c9fd8e25ad8708146bb4bff._comment new file mode 100644 index 000000000..610f9bbb6 --- /dev/null +++ b/doc/design/assistant/gpgkeys/comment_1_a14427f88c9fd8e25ad8708146bb4bff._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="gernot" + ip="85.197.15.125" + subject="Paperkey" + date="2013-12-05T11:37:02Z" + content=""" +Regarding backups, have you considered using [paperkey](http://www.jabberwocky.com/software/paperkey/) (also [in Debian](http://packages.debian.org/search?keywords=paperkey))? +It only stores a minimal amount of key data and formats it in a human-readable way. + +The result is mainly meant to be printed but `paperkey` would probably also be a good way to keep the size of QR codes down. + +I've actually recovered a key from a such a printed backup (using OCR) and it worked great thanks to line-wise checksums. +Maybe you could create paperkey PDF files with a proper OCR font through the web app? + +"""]] diff --git a/doc/design/assistant/inotify.mdwn b/doc/design/assistant/inotify.mdwn new file mode 100644 index 000000000..c951f4fe2 --- /dev/null +++ b/doc/design/assistant/inotify.mdwn @@ -0,0 +1,234 @@ +"git annex watch" command, which runs, in the background, watching via +inotify for changes, and automatically annexing new files, etc. Now +available! + +[[!toc]] + +## known bugs + +* Kqueue has to open every directory it watches, so too many directories + will run it out of the max number of open files (typically 1024), and fail. + I may need to fork off multiple watcher processes to handle this. + See [[bug|bugs/Issue_on_OSX_with_some_system_limits]]. (Does not affect + OSX any longer, only other BSDs). + +## beyond Linux + +I'd also like to support OSX and if possible the BSDs. + +* kqueue ([haskell bindings](http://hackage.haskell.org/package/kqueue)) + is supported by FreeBSD, OSX, and other BSDs. + + In kqueue, to watch for changes to a file, you have to have an open file + descriptor to the file. This wouldn't scale. + + Apparently, a directory can be watched, and events are generated when + files are added/removed from it. You then have to scan to find which + files changed. [example](https://developer.apple.com/library/mac/#samplecode/FileNotification/Listings/Main_c.html#//apple_ref/doc/uid/DTS10003143-Main_c-DontLinkElementID_3) + + Gamin does the best it can with just kqueue, supplimented by polling. + The source file `server/gam_kqueue.c` makes for interesting reading. + Using gamin to do the heavy lifting is one option. + ([haskell bindings](http://hackage.haskell.org/package/hlibfam) for FAM; + gamin shares the API) + + kqueue does not seem to provide a way to tell when a file gets closed, + only when it's initially created. Poses problems.. + + * [man page](http://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=0&format=html) + * (good example program) + + *kqueue is now supported* + +* hfsevents ([haskell bindings](http://hackage.haskell.org/package/hfsevents)) + is OSX specific. + + Originally it was only directory level, and you were only told a + directory had changed and not which file. Based on the haskell + binding's code, from OSX 10.7.0, file level events were added. + + This will be harder for me to develop for, since I don't have access to + OSX machines.. + + hfsevents does not seem to provide a way to tell when a file gets closed, + only when it's initially created. Poses problems.. + + * + * (good example program) + * (good example program) + + *hfsevents is now supported* + +* Windows has a Win32 ReadDirectoryChangesW, and perhaps other things. + + It was easy to get watching to work in windows. But there is no lsof, + to check if a file can safely be added. So, need to carefully consider + how to make adding a file safe in windows. + + Without lsof, an InodeCache is generated in "lockdown" (which doesn't + do anything to prevent new writers), and is compared with the stat of the + file after it's ingested (and checksummed). This will detect many changes + to files, which change the size or mtime. + + So, we have 2 cases to worry about. + + 1. A process has the file open for write as it's added, does not change + it until the add is done. + + As long as an event is generated once the file does get closed, this + is fine -- the modified version will be re-added. And such events are + indeed generated on windows. + + 2. A process has the file open for write as it's added, and changes it + in some way that does not affect size or mtime. + + If an event is generated when the file does get closed, this is the + same as a scenario where a process opens the file after it's added, + makes such a change, and closes it. In either case, a file closed + event is generated, and the Watcher will not detect any change + using the inode cache, so will not re-add the file. + + So, this scenario is a potential problem, but it seems at least + unlikely that a program would modify a file without affecting its + mtime. Note that this same scenario can happen even with lsof, and + even on linux (although on linux the InodeCache includes an actual + inode, which might detect the change too). + + Conclusion: It's probably ok to run without lsof on Windows. + + Corrolary: lsof might not generally be needed in direct mode, on + systems that do generate file close events (but not when + eventsCoalesce). + The same arguments given above seem to apply to !Windows. Note that lsof + is needed in indirect mode, as discussed below. + + **windows is now supported** + +## the races + +Many races need to be dealt with by this code. Here are some of them. + +* File is added and then removed before the add event starts. + + Not a problem; The add event does nothing since the file is not present. + +* File is added and then removed before the add event has finished + processing it. + + **Minor problem**; When the add's processing of the file (checksum and so + on) fails due to it going away, there is an ugly error message, but + things are otherwise ok. + +* File is added and then replaced with another file before the annex add + moves its content into the annex. + + Fixed this problem; Now it hard links the file to a temp directory and + operates on the hard link, which is also made unwritable. + +* File is added and then replaced with another file before the annex add + makes its symlink. + + **Minor problem**; The annex add will fail creating its symlink since + the file exists. There is an ugly error message, but the second add + event will add the new file. + +* File is added and then replaced with another file before the annex add + stages the symlink in git. + + Now fixed; `git annex watch` avoids running `git add` because of this + race. Instead, it stages symlinks directly into the index, without + looking at what's currently on disk. + +* Link is moved, fixed link is written by fix event, but then that is + removed by the user and replaced with a file before the event finishes. + + Now fixed; same fix as previous race above. + +* File is removed and then re-added before the removal event starts. + + Not a problem; The removal event does nothing since the file exists, + and the add event replaces it in git with the new one. + +* File is removed and then re-added before the removal event finishes. + + Not a problem; The removal event removes the old file from the index, and + the add event adds the new one. + +* Symlink appears, but is then deleted before it can be processed. + + Leads to an ugly message, otherwise no problem: + + ./me: readSymbolicLink: does not exist (No such file or directory) + + Here `me` is a file that was in a conflicted merge, which got + removed as part of the resolution. This is probably coming from the watcher + thread, which sees the newly added symlink (created by the git merge), + but finds it deleted (by the conflict resolver) by the time it processes it. + +## done + +- on startup, add any files that have appeared since last run **done** +- on startup, fix the symlinks for any renamed links **done** +- on startup, stage any files that have been deleted since last run + (seems to require a `git commit -a` on startup, or at least a + `git add --update`, which will notice deleted files) **done** +- notice new files, and git annex add **done** +- notice renamed files, auto-fix the symlink, and stage the new file location + **done** +- handle cases where directories are moved outside the repo, and stop + watching them **done** +- when a whole directory is deleted or moved, stage removal of its + contents from the index **done** +- notice deleted files and stage the deletion + (tricky; there's a race with add since it replaces the file with a symlink..) + **done** +- Gracefully handle when the default limit of 8192 inotified directories + is exceeded. This can be tuned by root, so help the user fix it. + **done** +- periodically auto-commit staged changes (avoid autocommitting when + lots of changes are coming in) **done** +- coleasce related add/rm events for speed and less disk IO **done** +- don't annex `.gitignore` and `.gitattributes` files **done** +- run as a daemon **done** +- A process has a file open for write, another one closes it, + and so it's added. Then the first process modifies it. + + Or, a process has a file open for write when `git annex watch` starts + up, it will be added to the annex. If the process later continues + writing, it will change content in the annex. + + This changes content in the annex, and fsck will later catch + the inconsistency. + + Possible fixes: + + * Somehow track or detect if a file is open for write by any processes. + `lsof` could be used, although it would be a little slow. + + Here's one way to avoid the slowdown: When a file is being added, + set it read-only, and hard-link it into a quarantine directory, + remembering both filenames. + Then use the batch change mode code to detect batch adds and bundle + them together. + Just before committing, lsof the quarantine directory. Any files in + it that are still open for write can just have their write bit turned + back on and be deleted from quarantine, to be handled when their writer + closes. Files that pass quarantine get added as usual. This avoids + repeated lsof calls slowing down adds, but does add a constant factor + overhead (0.25 seconds lsof call) before any add gets committed. **done** + + * Or, when possible, making a copy on write copy before adding the file + would avoid this. + * Or, as a last resort, make an expensive copy of the file and add that. + * Tracking file opens and closes with inotify could tell if any other + processes have the file open. But there are problems.. It doesn't + seem to differentiate between files opened for read and for write. + And there would still be a race after the last close and before it's + injected into the annex, where it could be opened for write again. + Would need to detect that and undo the annex injection or something. + +- If a file is checked into git as a normal file and gets modified + (or merged, etc), it will be converted into an annexed file. + See [[blog/day_7__bugfixes]]. **done**; we always check ls-files now +- When you `git annex unlock` a file, it will immediately be re-locked. + See [[bugs/watcher_commits_unlocked_files]]. Seems fixed now? diff --git a/doc/design/assistant/inotify/comment_1_3d3ff74447452d65c10ccc3dbfc323cd._comment b/doc/design/assistant/inotify/comment_1_3d3ff74447452d65c10ccc3dbfc323cd._comment new file mode 100644 index 000000000..d042806a1 --- /dev/null +++ b/doc/design/assistant/inotify/comment_1_3d3ff74447452d65c10ccc3dbfc323cd._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://ciffer.net/~svend/" + subject="comment 1" + date="2012-06-04T19:42:07Z" + content=""" +I would find it useful if the watch command could 'git add' new files (instead of 'git annex add') for certain repositories. +"""]] diff --git a/doc/design/assistant/inotify/comment_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment b/doc/design/assistant/inotify/comment_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment new file mode 100644 index 000000000..13ee1523c --- /dev/null +++ b/doc/design/assistant/inotify/comment_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-06-04T19:46:03Z" + content=""" +I think it's already on the list: \"configurable option to only annex files meeting certian size or filename criteria\" -- files not meeting those criteria would just be git added. +"""]] diff --git a/doc/design/assistant/inotify/comment_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment b/doc/design/assistant/inotify/comment_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment new file mode 100644 index 000000000..c1f22c4b8 --- /dev/null +++ b/doc/design/assistant/inotify/comment_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-06-17T08:52:32Z" + content=""" +In relation to OSX support, hfsevents (or supporting hfs is probably a bad idea), its very osx specific and users who are moving usb keys and disks between systems will probably end up using fat32/exfat/vfat disks around. Also if you want I can lower the turn around time for the OSX auto-builder that I have setup to every 1 or 2mins? would that help? +"""]] diff --git a/doc/design/assistant/inotify/comment_4_32be58b4c3b17a4ea539690d2fb45159._comment b/doc/design/assistant/inotify/comment_4_32be58b4c3b17a4ea539690d2fb45159._comment new file mode 100644 index 000000000..d854d91c2 --- /dev/null +++ b/doc/design/assistant/inotify/comment_4_32be58b4c3b17a4ea539690d2fb45159._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.147" + subject="comment 4" + date="2012-06-17T16:39:43Z" + content=""" +hfsevents seems usable, git-annex does not need to watch for file changes on remotes on other media. + +But, trying kqueue first. + +You could perhaps run the autobuilder on a per-commit basis.. +"""]] diff --git a/doc/design/assistant/inotify/comment_5_0cdd3046d90ad2012025d846ece0731e._comment b/doc/design/assistant/inotify/comment_5_0cdd3046d90ad2012025d846ece0731e._comment new file mode 100644 index 000000000..8b075c36f --- /dev/null +++ b/doc/design/assistant/inotify/comment_5_0cdd3046d90ad2012025d846ece0731e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2012-06-17T21:42:59Z" + content=""" +okay, I've gotten gitbuilder to poll the git repo every minute for changes, gitbuilder doesn't build every commit. It doesn't work like that, it checks out the master and builds that. If there is a failure it automatically bisects to find out where the problem first got introduced. Hope the change to the builder helps! +"""]] diff --git a/doc/design/assistant/inotify/comment_6_e197d5d0d853572ec1f2e5985762e60d._comment b/doc/design/assistant/inotify/comment_6_e197d5d0d853572ec1f2e5985762e60d._comment new file mode 100644 index 000000000..76716ddda --- /dev/null +++ b/doc/design/assistant/inotify/comment_6_e197d5d0d853572ec1f2e5985762e60d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnV2c63kDc6X21a1H81me1mIenUCScd2Gs" + nickname="Emanuele" + subject="watch branch?" + date="2012-06-01T19:19:17Z" + content=""" +Hello there? Where can I find more info about this git watch branch? +Keep up the good work! +"""]] diff --git a/doc/design/assistant/inotify/comment_7_00809aaad6b68f189a9cc42af810a0a6._comment b/doc/design/assistant/inotify/comment_7_00809aaad6b68f189a9cc42af810a0a6._comment new file mode 100644 index 000000000..7e1ad7db5 --- /dev/null +++ b/doc/design/assistant/inotify/comment_7_00809aaad6b68f189a9cc42af810a0a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnwfqF4wL6l_O26RyzoBowUMvQ_955Vpao" + nickname="Markus" + subject="comment 7" + date="2014-06-14T06:29:55Z" + content=""" +FWIW: Removing the [raspi-copies-and-fills](https://github.com/simonjhall/copies-and-fills) package ('apt-get purge raspi-copies-and-fills') stops annex from printing the message over and over again. According to the package's description though, you suffer a performance penalty without the package. +"""]] diff --git a/doc/design/assistant/leftovers.mdwn b/doc/design/assistant/leftovers.mdwn new file mode 100644 index 000000000..b8c0f456b --- /dev/null +++ b/doc/design/assistant/leftovers.mdwn @@ -0,0 +1,17 @@ +Things that don't fit anywhere else: + +* Automatically start daemon on boot or when user logs in, using + freedesktop autostart file. **done** +* Somehow get content that is unavailable. This is problematic with inotify, + since we only get an event once the user has tried (and failed) to read + from the file. This is only needed if all the files in the directory + are not kept synced, but in some situations (ie, low disk space phones), + that is likely. +* Drop files that have not been used lately, or meet some other criteria + (as long as there's a copy elsewhere). **done** (via preferred content; + eg archive directories) +* Perhaps automatically dropunused files that have been deleted, + although I cannot see a way to do that, since by the time the inotify + deletion event arrives, the file is deleted, and we cannot see what + its symlink pointed to! Alternatively, perhaps automatically + do an expensive unused/dropunused cleanup process. diff --git a/doc/design/assistant/leftovers/comment_1_b20c88bb3c583a32023c1f6b6dc9486d._comment b/doc/design/assistant/leftovers/comment_1_b20c88bb3c583a32023c1f6b6dc9486d._comment new file mode 100644 index 000000000..3c7e1820d --- /dev/null +++ b/doc/design/assistant/leftovers/comment_1_b20c88bb3c583a32023c1f6b6dc9486d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-10-30T09:07:37Z" + content=""" +I think the automatic dropunused part is handled by the assistant already anyway, but in case it's not: The git repo still knows where the symlink pointed to so it should not be a problem to get that info from the last commit that was 'actively' locally and which contained said symlink. +"""]] diff --git a/doc/design/assistant/more_cloud_providers.mdwn b/doc/design/assistant/more_cloud_providers.mdwn new file mode 100644 index 000000000..16e727657 --- /dev/null +++ b/doc/design/assistant/more_cloud_providers.mdwn @@ -0,0 +1,24 @@ +Git-annex already supports storing large files in +several cloud providers via [[special_remotes]]. +More should be added, such as: + +* Google drive (attractive because it's free, only 5 gb tho) +* Owncloud (has several [providers](http://owncloud.org/providers/); + at least one provides 5 gb free; open DAV based API) +* OpenStack Swift (teh future) +* Box.com (it's free, and current method is hard to set up and a sorta + shakey; a better method would be to use its API) **done** +* Dropbox? That would be ironic.. Via its API, presumably. +* [[Amazon Glacier|todo/special_remote_for_amazon_glacier]] **done** +* Internet Archive **done** +* [nimbus.io](https://nimbus.io/) Fairly low prices ($0.06/GB); + REST API; free software +* Mediafire provides 50gb free and has a REST API. +* Flickr provides 1 tb (!!!!) to free accounts, and can store at least + photos and videos. is a hack + to allow storing any type of file on Flickr. +* mega.co.nz. Already supported via [[tips/megaannex]], would just need + webapp modifications to configure it. May want to use megaannex as-is to + build a non-hook special remote in haskell. + +See poll at [[polls/prioritizing_special_remotes]]. diff --git a/doc/design/assistant/pairing.mdwn b/doc/design/assistant/pairing.mdwn new file mode 100644 index 000000000..d09c644ee --- /dev/null +++ b/doc/design/assistant/pairing.mdwn @@ -0,0 +1,83 @@ +For git-annex to be able to clone its repo to another host, it'd be good to +have some way of pairing devices. + +## security + +Pairing uses its own network protocol, built on top of multicast UDP. + +It's important that pairing securely verifies that the right host is being +paired with. This is accomplied by having a shared secret be entered on +both the hosts that will be paired. Hopefully that secret is communicated +securely out of band. + +(In practice, the security of that communication will vary. To guard against +interception, each pairing session pairs exactly two hosts and then forgets +the shared secret. So an attacker who tries to reuse an intercepted secret +will not succeed in pairing. This does not guard against an intercepted +secret that is used before the legitimate parties finish pairing.) + +Each host can construct messages that the other host can verify using the +shared secret, and so know that, for example, the ssh public key it +received belongs to the right host and has not been altered by a man in the +middle. + +The verification works like this: Take a HMAC SHA1 checksum of the message, +using the shared secret as the HMAC key. Include this checksum after the +message. The other host can then do the same calculation and verify the +checksum. + +Additionally, a UUID is included in the message. Messages that are part of +the same pairing session all share a UUID. And all such messages should +be verifiable as described above. If a message has the same UUID but is +not verifiable, then someone on the network is up to no good. Perhaps +they are trying to brute-force the shared secret. When this is detected, +the pairing session is shut down. (Which would still let an attacker +DOS pairing, but that's not a very interesting attack.) + +The protocol used for pairing consists of 3 messages, a PairReq, and +PairAck, and a PairDone. Let's consider what an attacker could accomplish +by replaying these: + +* PairReq: This would make the webapp pop up an alert about an incoming + pair request. If the user thought it was real and for some reason + entered the right shared secret used in the real one earlier, the + ssh key inside the PairReq would be added to `authorized_keys`. Which + allows the host that originally sent the PairReq to access its git + repository, but doesn't seem to do the attacker any good. +* PairAck: If the host that originally sent + the PairReq is still pairing, it'll add the ssh key from the PairAck, + and start syncing, which again does the attacker no good. +* PairDone: If the host that sent the PairAck is still syncing, it'll + add the ssh key from the PairDone, and start syncing, and stop + sending PairAcks. But probably, it's not syncing, because it would have + seen the original PairDone.. and anyway, this seems to do the attacker no + good. + +So replay attacks don't seem to be a problem. + +So far I've considered security from a third-party attacker, but either the +first or second parties in pairing could also be attackers. Presumably they +trust each other with access to their files as mediated by +[[git-annex-shell]]. However, one could try to get shell access to the +other's computer by sending malicious data in a pairing message. So the +pairing code always checks every data field's content, for example the ssh +public key is rejected if it looks at all unusual. Any control characters +in the pairing message cause it to be rejected, to guard against console +poisoning attacks. Furthermore, git-annex is careful not to expose data to +the shell, and the webapp uses Yesod's type safety to ensure all user input +is escaped before going to the browser. + +## TODO + +* pairing over IPV6 only networks does not work. Haskell's + `network-multicast` library complains "inet_addr: Malformed address: ff02::1" + .. seems it just doesn't support IPv6. The pairing code in git-annex + does support ipv6, apart from this, it's just broadcasting the messages + that fails. (Pairing over mixed networks is fine.) +* If there are three assistants on the network, and 2 pair, the third is + left displaying a "Pair request from foo" alert, until it's close. + Or, if the user clicks the button to pair, it'll get to the + "Pairing in progress" alert, which will show forever (until canceled). + + It should be possible for third parties to tell when pairing is done, + but it's actually rather hard since they don't necessarily share the secret. diff --git a/doc/design/assistant/partial_content.mdwn b/doc/design/assistant/partial_content.mdwn new file mode 100644 index 000000000..cbfbfcea8 --- /dev/null +++ b/doc/design/assistant/partial_content.mdwn @@ -0,0 +1,36 @@ +On a regular system, a reasonable simplifying assumption is that all the +files in the folder will be synced to the system. A user might want to +disable syncing of some subdirectories, for eg, archived files. But in +general, things are simpler to understand and implement if all files sync. + +But, an Android gadget probably cannot hold all a user's files. Indeed, +it's likely that old files will be aggressively dropped from the Android +after syncing to elsewhere, in order to keep enough free space on it for +new files. + +There needs to be a way for the user to browse files not on the gadget and +request they be transferred to it. This could be done as a browser in the +web app, or using a subdirectory full of placeholder files (not symlinks; +see [[Android]]) that start transfer of the real file when accessed. + +---- + +Currently, Android uses the "source" repository type in some +configurations. This makes files be removed as soon as they are sent +somewhere else. + +A compromise that avoids needing UI might be to change "source" so it +retained files for a while after they were created, even after they were +uploaded elsewhere. For example, it could hold onto them for a day. This +would allow the user time to do things with new files before they are +removed from the android device. + +One way to implement that would be a new preferred content expression like +"age(1 day)". But this would need at least a daily full transfer scan to be +run. + +Another way would be to have a way to make drops of files be deferred +for a period of time. This approach would not need to be specific to the +"source" repository type. And seems easy enough to do, just have a +configuration setting for the time interval, and an ordered drop queue +and a thread that waits as needed before dropping. diff --git a/doc/design/assistant/partial_content/comment_1_58c4faa321a5bb71adf9fdee079849f4._comment b/doc/design/assistant/partial_content/comment_1_58c4faa321a5bb71adf9fdee079849f4._comment new file mode 100644 index 000000000..aa65cd6b9 --- /dev/null +++ b/doc/design/assistant/partial_content/comment_1_58c4faa321a5bb71adf9fdee079849f4._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkpEY8WTFDhjIVTWG38Ph7ppmuXUTJAHAg" + nickname="Justin" + subject="selective sync" + date="2012-07-28T04:08:00Z" + content=""" +hey joey + +great work!! + +will partial content work like selective sync in dropbox + +use case: on desktop i have photos/mp3s/docs, but would only want to sync the docs to my netbook + +cheers + +justin +"""]] diff --git a/doc/design/assistant/polls.mdwn b/doc/design/assistant/polls.mdwn new file mode 100644 index 000000000..3457fd245 --- /dev/null +++ b/doc/design/assistant/polls.mdwn @@ -0,0 +1 @@ +[[!inline pages="(page(design/assistant/blog/*) and tagged(design/assistant/polls)) or page(design/assistant/polls/*)" show=0]] diff --git a/doc/design/assistant/polls/2013_user_survey.mdwn b/doc/design/assistant/polls/2013_user_survey.mdwn new file mode 100644 index 000000000..d1bac0ef8 --- /dev/null +++ b/doc/design/assistant/polls/2013_user_survey.mdwn @@ -0,0 +1 @@ +The 2013 git-annex user survey is in progress [[here|/polls/2013]]. diff --git a/doc/design/assistant/polls/Android.mdwn b/doc/design/assistant/polls/Android.mdwn new file mode 100644 index 000000000..78806eac2 --- /dev/null +++ b/doc/design/assistant/polls/Android.mdwn @@ -0,0 +1,18 @@ +Help me choose a goal for the month of December. The last poll showed +a lot of interest in using the git-annex assistant with phones, etc. + +Background: git-annex uses symbolic links in its repositories. This makes it +hard to use with filesystems, such as FAT, that do not support symbolic links. +FAT filesystems are the main storage available on some Android devices that +have a micro-SD card. Other, newer Android devices don't have a SD card and so +avoid this problem. + +I can either work on the idea described in +[[design/assistant/desymlink]], which could solve the symlink problem and +also could lead to a nicer workflow to editing files that are stored in +git-annex. + +Or, I can work on [[Android_porting|design/assistant/android]], and try to +get the assistant working on Android's built-in storage. + +[[!poll open=no 81 "solve the symlink problem first" 17 "port to Android first" 1 "other"]] diff --git a/doc/design/assistant/polls/Android/comment_1_fa6c409833f28c67da105d25f4a440e0._comment b/doc/design/assistant/polls/Android/comment_1_fa6c409833f28c67da105d25f4a440e0._comment new file mode 100644 index 000000000..49b779607 --- /dev/null +++ b/doc/design/assistant/polls/Android/comment_1_fa6c409833f28c67da105d25f4a440e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4yApngiiAJE5iX1MQ0VO_LXjLt4LgdHE" + nickname="Jim" + subject="No mass storage" + date="2012-12-02T03:33:06Z" + content=""" +I would have asked for better FAT support, but my Galaxy Nexus doesn't support mass storage mode, and MTP is not as easy to use nor reliably supported everywhere. So I'd lean towards functionality that stays on the phone as much as possible. +"""]] diff --git a/doc/design/assistant/polls/Android_default_directory.mdwn b/doc/design/assistant/polls/Android_default_directory.mdwn new file mode 100644 index 000000000..ee41fac21 --- /dev/null +++ b/doc/design/assistant/polls/Android_default_directory.mdwn @@ -0,0 +1,7 @@ +What directory should the Android webapp default to creating an annex in? + +Same as the desktop webapp, users will be able to enter a directory they +want the first time they run it, but to save typing on android, anything +that gets enough votes will be included in a list of choices as well. + +[[!poll open=yes expandable=yes 67 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]] diff --git a/doc/design/assistant/polls/Android_default_directory/comment_1_d39655091ac3ed51a9d4325d86b23ad7._comment b/doc/design/assistant/polls/Android_default_directory/comment_1_d39655091ac3ed51a9d4325d86b23ad7._comment new file mode 100644 index 000000000..30b73d184 --- /dev/null +++ b/doc/design/assistant/polls/Android_default_directory/comment_1_d39655091ac3ed51a9d4325d86b23ad7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-04-19T06:29:14Z" + content=""" +While my main use case is a photo repo, I don't think it's wise to default to there. + +Similarly, spamming what amounts to the root dir of \"external\" storage with repos seems like a bad idea. +"""]] diff --git a/doc/design/assistant/polls/Android_default_directory/comment_2_2f1eaae95075db26488517720afd1c63._comment b/doc/design/assistant/polls/Android_default_directory/comment_2_2f1eaae95075db26488517720afd1c63._comment new file mode 100644 index 000000000..b2df3b0a2 --- /dev/null +++ b/doc/design/assistant/polls/Android_default_directory/comment_2_2f1eaae95075db26488517720afd1c63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnE6kFAbud1LWrQuyX76yMYnUjHt9tR-A8" + nickname="Leonardo" + subject="Direct mode" + date="2013-04-20T20:55:09Z" + content=""" +I think direct mode should be the default on Android +"""]] diff --git a/doc/design/assistant/polls/Android_default_directory/comment_3_b484012f60789be73d7d5b338cff6203._comment b/doc/design/assistant/polls/Android_default_directory/comment_3_b484012f60789be73d7d5b338cff6203._comment new file mode 100644 index 000000000..7474d774d --- /dev/null +++ b/doc/design/assistant/polls/Android_default_directory/comment_3_b484012f60789be73d7d5b338cff6203._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-20T23:38:47Z" + content=""" +@Richard, including all of /sdcard seems a reasonable thing to do if you want to back it all up. I don't know how likely anyone would be to want to sync the whole contents though. + +@Leonardo direct mode is the default for all respositories created by the webapp, as well as all repositories on crippled filesystems that cannot support indirect mode. Android webapp thus defaults to direct mode twice over! +"""]] diff --git a/doc/design/assistant/polls/goals_for_April.mdwn b/doc/design/assistant/polls/goals_for_April.mdwn new file mode 100644 index 000000000..53132dd44 --- /dev/null +++ b/doc/design/assistant/polls/goals_for_April.mdwn @@ -0,0 +1,17 @@ +What should I work on in April? I expect I could get perhaps two of these +features done in a month if I'm lucky. I have only 3 more funded months, +and parts of one will be spent working on porting to Windows, so choose wisely! +--[[Joey]] + +[[!poll open=yes expandable=yes 4 "upload and download rate limiting" 15 "get webapp working on Android" 5 "deltas: speed up syncing modified versions of existing files" 8 "encrypted git remotes using git-remote-gcrypt" 0 "add support for more cloud storage remotes" 19 "don't work on features, work on making it easier to install and use" 2 "Handle duplicate files" 6 "direct mode (aka real files instead of symlinks) [already done --joey]" 3 "start windows port now"]] + +References: + +* [[rate_limiting]] +* [[Android]] +* [[deltas]] to speed up syncing modified files (at least for remotes using rsync) +* [[encrypted_git_remotes]] +* [[more_cloud_providers]] (OpenStack Swift, Owncloud, Google drive, + Dropbox, Mediafire, nimbus.io, Mega, etc.) +* [[old poll on "what is preventing me from using git-annex assistant"|what_is_preventing_me_from_using_git-annex_assistant]] + (many of the items on it should be fixed now, but I have plenty of bug reports to chew on still) diff --git a/doc/design/assistant/polls/goals_for_April/comment_1_9f81fa96db5970a4be0828c74a6d2d55._comment b/doc/design/assistant/polls/goals_for_April/comment_1_9f81fa96db5970a4be0828c74a6d2d55._comment new file mode 100644 index 000000000..f63460543 --- /dev/null +++ b/doc/design/assistant/polls/goals_for_April/comment_1_9f81fa96db5970a4be0828c74a6d2d55._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Duplicate files" + date="2013-04-01T07:58:51Z" + content=""" +Having duplicate files is fairly easy. +a) Just a backup of your files, to not have accidental deleting. + +b) Some programs implements UNDO command (Ctrl-Z) as simply copying over the working text file +to a backup directory. + +c) If you tests precompiled programs, like git annex itself, it has identical files across releases. + + +For more info about duplicate files, read hear these two bugreports: + +http://git-annex.branchable.com/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/ +(last comment) + +http://git-annex.branchable.com/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/ +"""]] diff --git a/doc/design/assistant/polls/goals_for_April/comment_2_d8956d220ccacff3d2f6cbeb15718459._comment b/doc/design/assistant/polls/goals_for_April/comment_2_d8956d220ccacff3d2f6cbeb15718459._comment new file mode 100644 index 000000000..8fed65fb0 --- /dev/null +++ b/doc/design/assistant/polls/goals_for_April/comment_2_d8956d220ccacff3d2f6cbeb15718459._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkWG4T4SGZxY-q4Wo8Jbxwb67g4J-WYmQM" + nickname="Mark" + subject="don't work on features option" + date="2013-04-01T14:03:35Z" + content=""" +The \"don't work on features...\" poll entry is a bit vague, so I figured stating my interpretation of it and why I choose it might be a good idea. +I've had git-annex installed for the last few months during which it has been steadily improving, but IMO it still lacks polish. +From time to time I see transient issues: (even on the current version) + +- random download stalling when I know the remote is accessible +- files disappearing then reappearing without an obvious cause +- xmmp hanging + +I do not have any means of replicating these issues (though IIRC some of the recently worked on bugs related to these issues). +In my past experience this indicates that there are all sorts of 'fun' bugs hiding in the source which you seem to be chasing down. +Heck, I could have a simple configuration error from when I set things up on my remote server. +There was little documentation available when I setup my remote server for this and unless I have missed something in the RecentChanges feed, there still is relatively little. +So, some issues with my xmmp daemon, local ssh keys via ssh-agent, or bad $PATH stuff could be causing things to subtlety malfunction at no fault of git-annex. + +Falling back to the command line only tends to be a good response, but outside of the assistant there does not seem to be any manual way to handle the special remotes. +Fair enough, but it would seem logical for error handling to recognize that these are assistant only urls rather than some generic \"bad url\". +Just getting the right error messages while a small touch would be a sign of some polish even though it is a nitpick. + +Perhaps some simple test code run repeatedly to form a stress test could reveal some odd behavior, but I'm not sure myself. + +With all of that said, I like what has been done so far and I'm hoping to see all the nooks of git-annex get the polishing that they deserve. +"""]] diff --git a/doc/design/assistant/polls/goals_for_April/comment_3_aadad6dfd56d068d2e377606910c006f._comment b/doc/design/assistant/polls/goals_for_April/comment_3_aadad6dfd56d068d2e377606910c006f._comment new file mode 100644 index 000000000..f3cea47c8 --- /dev/null +++ b/doc/design/assistant/polls/goals_for_April/comment_3_aadad6dfd56d068d2e377606910c006f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="Ask for more money :-)" + date="2013-04-01T19:01:49Z" + content=""" +This is slightly off topic, but from my perspective this Kickstarter project has been a riotous success, and due to the credibility you have built up from 9 months of consistently high quality work produced in a very transparent and community-oriented fashion, I'd be surprised if you weren't able to raise more money to continue development after the 12 months is up. Assuming you want to of course :) Maybe you need a break or change of scene. But if not, it would be a shame not to continue if the userbase wants it. +"""]] diff --git a/doc/design/assistant/polls/prioritizing_special_remotes.mdwn b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn new file mode 100644 index 000000000..0b99e9918 --- /dev/null +++ b/doc/design/assistant/polls/prioritizing_special_remotes.mdwn @@ -0,0 +1,16 @@ +Background: git-annex supports storing data in various [[special remotes]]. +The git-annex assistant will make it easy to configure these, and easy +configurators have already been built for a few: removable drives, rsync.net, +locally paired systems, and remote servers with rsync. + +Help me prioritize my work: What special remote would you most like +to use with the git-annex assistant? + +[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 10 "Box.com (done)" 73 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 13 "OpenStack SWIFT" 34 "Google Drive"]] + +This poll is ordered with the options I consider easiest to build +listed first. Mostly because git-annex already supports them and they +only need an easy configurator. The ones at the bottom are likely to need +significant work. See [[cloud]] for detailed discussion. + +Have another idea? Absolutely need two or more? Post comments.. diff --git a/doc/design/assistant/polls/prioritizing_special_remotes/comment_1_dd9280df27848a7ff132f5809dab0a79._comment b/doc/design/assistant/polls/prioritizing_special_remotes/comment_1_dd9280df27848a7ff132f5809dab0a79._comment new file mode 100644 index 000000000..0214d4a12 --- /dev/null +++ b/doc/design/assistant/polls/prioritizing_special_remotes/comment_1_dd9280df27848a7ff132f5809dab0a79._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-09-13T08:39:59Z" + content=""" +I've been looking at ceph for various reasons in work, it supports a swift interface as well as it's own restful api. so +1 for swift (and any s3 compatible api). +"""]] diff --git a/doc/design/assistant/polls/prioritizing_special_remotes/comment_2_370e0b9c43486ee96c825f9155eebde4._comment b/doc/design/assistant/polls/prioritizing_special_remotes/comment_2_370e0b9c43486ee96c825f9155eebde4._comment new file mode 100644 index 000000000..4d00922a4 --- /dev/null +++ b/doc/design/assistant/polls/prioritizing_special_remotes/comment_2_370e0b9c43486ee96c825f9155eebde4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2012-09-13T09:07:02Z" + content=""" +Swift has its own API but offers a S3 compatibility layer. Last I tried that layer, it did not work. +"""]] diff --git a/doc/design/assistant/polls/prioritizing_special_remotes/comment_3_883a003b9c552b89f191135c582f99aa._comment b/doc/design/assistant/polls/prioritizing_special_remotes/comment_3_883a003b9c552b89f191135c582f99aa._comment new file mode 100644 index 000000000..83844cd35 --- /dev/null +++ b/doc/design/assistant/polls/prioritizing_special_remotes/comment_3_883a003b9c552b89f191135c582f99aa._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmsz4weoPXV2oEtv3zpo9dOxn_SEPz-7Iw" + nickname="Zooko" + subject="reasons to like Tahoe-LAFS as a special remote" + date="2012-10-12T18:17:42Z" + content=""" +Here are a couple of things which are (I think) unique about the Tahoe-LAFS special remote: + +1. encryption ; All of the data is encrypted before leaving your local system and heading for the server (or for the clouds). This is true even though you don't (I think) have to enter an encryption key into git-annex to access your data. + +(Note: the above implies that you're in danger of permanently losing access to your data, by losing the last copy of the encryption key, if your local git-annex state is lost. This deserves careful consideration.) + +2. erasure-coding ; You can configure Tahoe-LAFS to spread the data out in a RAID-like way across multiple remote storage servers, where each server holds only, say, 1/3 of the data, but there are, say, 10 different servers, where any 3 of them are sufficient to give you full access to your data. Does that make sense it uses less bandwidth and storage space than replication (i.e. putting a complete replica of your data on each of 4 or 5 or 10 different storage servers), but it is more robust than sharding (i.e. putting 1/3 of your data on each of three different servers so that if any one of them goes down you lose 1/3 of your data). +"""]] diff --git a/doc/design/assistant/polls/prioritizing_special_remotes/comment_4_746006c3fffc7f917c4526fd688051f7._comment b/doc/design/assistant/polls/prioritizing_special_remotes/comment_4_746006c3fffc7f917c4526fd688051f7._comment new file mode 100644 index 000000000..713d1d7b5 --- /dev/null +++ b/doc/design/assistant/polls/prioritizing_special_remotes/comment_4_746006c3fffc7f917c4526fd688051f7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnjrMQEhzd8xI81V9BL2jsKlNgVJLD7PKs" + nickname="Pankaj" + subject="Google Music as remote?" + date="2012-10-31T06:07:32Z" + content=""" +A dropbox like folder which syncs with Google Music. Google Music allows uploading upto 20K songs. Also using git-annex , I can ensure that I dont need to store all the duplicate mp3 on my local drive. Only one copy of \"older music\" is \"arvhived\" on GMusic, whereas more recent songs are on my local drive. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant.mdwn b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant.mdwn new file mode 100644 index 000000000..4b4778c1f --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant.mdwn @@ -0,0 +1,16 @@ +My goal for this month is to get more people using the git-annex assistant, +and fix issues that might be blocking you from using it. To do this, +I'd like to get an idea about whether you're already using it, +or what's keeping you from using it. + +If you use `git-annex` at the command line and have no reason to use the +assistant, please instead fill in this poll on behalf of less technically +adept friends or family -- what's preventing you from introducing them to +the assistant? + +[[!poll open=no expandable=yes 8 "I'm using the assistant!" 28 "I need a Windows port" 30 "I need an Android port" 3 "I need an IPhone port (not holding my breath)" 2 "Well, it's still in beta..." 11 "I want to, but have not had the time to try it" 5 "Just inertia. I've got this dropbox/whatever that already works.." 3 "It's too hard to install (please say why in comments)" 2 "Perceived recent increase of bug reports and thus sitting it out." 25 "Initially the lack of direct-mode. Now concerns about the safety of direct mode. Perhaps after the next release." 10 "I haven't always well understood the differences between commandline operation & the assistant, so the differences would confuse me, and I found the command line more understandable & less scary. Now trying to learn to like & trust the assistant. :)" 21 "An Ubuntu PPA would be supercool! Thanks for your great work!!" 18 "Not yet in Debian sid amd64" 6 "Waiting for Fedora/CentOS rpm repository." 2 "throttling transfers, it upsets people when I saturate the connection" 2 "partial content" 1 "Not yet available in macports" 4 "No build yet for Nokia N9" 3 "Using only git-annex webapp to config does not seem to work: Create walkthough?" 5 "No build for OSX 10.6" 5 "Needs more focus on the UI." 1 "Just inertia. I don't have a Dropbox/whatever." 4 "Replaces files with a symlink mess." 2 "configurable option to only annex files meeting certian size or filename criteria" 4 "I'm really confused about how to make it sync with a remote NON-bare repository. I'm even afraid to try `git remote add`, since there is no clear method to completely forget a git-annex remote..." 5 "A build for te raspberry pi would be supercol!" 1 "Would be nice to exclude subfolders from the gui or through a config file" 1 "I wish I had transparently encrypted git repos in the cloud available, like jgit." 1 "too many inodes used in direct mode. maybe it's possible to keep more info as git objects instead?" 2 "I need to be able to restrict in which repo dirs changes get auto-committed" 1 "Provide .deb package" 1 "Better documentation/walkthroughs on using git-annex within an existing git repo. AKA mixed use" 1 "Union mounts to have a single view of file collection on the network" 1 "Ubuntu PPA does not build with webapp" 1 "I set it up, but am confused about what I set up! It would be great to be able to start from scratch." 1 "I need to be able to restrict in which repo dirs changes get auto-committed using a syntax similar to gitignore"]] + +Feel free to write in your own reasons, or add a comment to give me more info. + +Note: Poll is now closed. Nearly all these issues have been dealt with. +Please file bug reports if any of these issues still affect you. diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_10_10a4839a05be39ced54ffbe880a588bb._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_10_10a4839a05be39ced54ffbe880a588bb._comment new file mode 100644 index 000000000..b501be3b8 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_10_10a4839a05be39ced54ffbe880a588bb._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 10" + date="2013-01-11T21:57:29Z" + content=""" +@joey: My usecase is fairly simple. +I have a working directory where I do work +(not programing, but text editing with homecooked spreadsheet/texteditor). + +I work/type on spot/on site. So I'm walking while typing. + +Its easy to do stupid things while you work, +so would be really handy to have a backup automagically on the same computer to prevent mistakes, user errors. +(The last mistake, I did is I copied all my daily files into a \"tmp\" directory, +then I launched my homebrew program which also created a tmp dir then deleted the whole content of it. +I fixed it, but my datas was lost. It is a simple user mistake which could be prevented if I would have a +live backup all the time. Creating a git repo for daily typing is just too much overhead. +It is like you create a git repo for your text messages...) + +So my usecase is a live backup. Or the broken file deleting thing on unix/linux since forever. + +Laszlo + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_11_ac91d866f11c66dd8c86e2cd1a368c85._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_11_ac91d866f11c66dd8c86e2cd1a368c85._comment new file mode 100644 index 000000000..1657d11ad --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_11_ac91d866f11c66dd8c86e2cd1a368c85._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 11" + date="2013-01-11T22:17:07Z" + content=""" +@dzsino: You may want to have a look at [metamonger](https://github.com/RichiH/metamonger) which tries to solve exactly this problem. It's not finished yet, though. + +-- Richard +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment new file mode 100644 index 000000000..fc2b03bac --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="It fails silently and leaves symlinks behind" + date="2013-01-11T23:49:51Z" + content=""" +I dedicated a day to looking into using the assistant and although it's clearly an exciting piece of software it's still pretty hard to get working. To get two machines to sync with one another the options seem to be: + +1. Connect both of them to a XMPP server: That makes metadata sync flawlessly and yet leaves a symlink mess behind. As it turns out that's because XMPP syncs only metadata but nowhere was that stated on the webapp (that I could find) and no error message given +2. So then I tried the sync method with SSH. + +For that you'll need to: + +* Have SSH servers installed on both endpoints (for me that was easy to do but I'm sure most users will have a harder time) +* Make sure both computers are actually on the same broadcast network otherwise they won't see each other (I was testing with a VM behind virtualbox's NAT so initially it didn't work) +* Install the assistant on both sides and make sure both the base program and the shell wrapper are in the PATH. (this was harder to do than needed as in the standalone bundle they're not on the same folder and the shell wrapper needs to be run by the runshell script, so even if you get it in the path it will still fail with missing libraries. An Ubuntu PPA would have solved this I'm sure. + +For some reason I couldn't figure out they still couldn't sync and symlink mess ensued. + +I think there are a few usability issues here: + +1. Direct mode should never overwrite files in a way you can no longer use them just because metadata updates came before content updates. I'd rather have an older version of the file than lose access to it. +2. Error reporting needs to be a lot more explicit to be able to debug these issues +3. At the best of times SSH sync is going to be a problem. In my opinion to be really dropbox-like the sync method for normal users should be to connect all devices to the same XMPP account (this works great now) and then have those assistants automatically reach each other by a direct connection when possible and by something like STUN if NAT punching is needed. The SSH/bup/etc remotes all have their place for advanced setups but being able to tell the user to just connect to XMPP and be done would turn this from \"something I'll spend an afternoon writing puppet manifests to deploy in my personal servers/computers\" to \"something I can explain to a non-technical friend how to use over a phone call and then share files with him\". + +On the XMPP side though, it would work best if you could authenticate a Google XMPP acount through an OAuth workflow instead of asking for the password. I wouldn't give any program my gmail password but I'd easily give it permission to use gtalk on my behalf. + +As I started by saying the assistant (and git-annex in general) is an extremely impressive piece of software that I'm very excited about. I hope it keeps improving at the current pace as there are still a few features I'd love to have (partial content particularly) but by far the thing that's keeping me most from using it is the ability to easily get a reliable sync going that won't leave me with a folder full of symlinks that I don't know what to do about. One of the great things about dropbox is that whenever it isn't running or can't sync for any reason your folder degenerates into a folder like any other on your disk. The right way of thinking about direct mode should be that one, \"a folder like any other that we stream changes from and to on multiple machines\". Right now, with the symlink replacement when sync isn't possible and to a lesser extent the adding of .git folders it doesn't live up to that guarantee. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment new file mode 100644 index 000000000..066859b32 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 13" + date="2013-01-12T08:16:48Z" + content=""" +@Pedro: That is an excellent test, and usecase! + +Indeed, the gui needs a lot more info on it. +Also file integratity is a real fear with this kind of application. + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment new file mode 100644 index 000000000..1ecaff59f --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://launchpad.net/~rubiojr" + nickname="rubiojr" + subject="git-annex PPA" + date="2013-01-15T14:16:35Z" + content=""" +Hey Joey, + +I do maintain a PPA with a more up2date version in fact: + +https://launchpad.net/~rubiojr/+archive/git-annex + +Now that the direct mode is in place, I guess it's probably a good time to backport again. + +Thanks for such a great piece of software. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_15_c437adeaccf0b3d134e0f81c64e25b9f._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_15_c437adeaccf0b3d134e0f81c64e25b9f._comment new file mode 100644 index 000000000..e6e4af37e --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_15_c437adeaccf0b3d134e0f81c64e25b9f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://launchpad.net/~rubiojr" + nickname="rubiojr" + subject="direct mode still 'untrusted'?" + date="2013-01-15T14:23:22Z" + content=""" +BTW, + +Does this still apply? + +\"I'd like git annex direct to set the repository to untrusted, but I didn't do it. Partly because having git annex indirect set it back to semitrusted seems possibly wrong -- the user might not trust a repo even in indirect mode. Or might fully trust it. The docs will encourage users to set direct mode repos to untrusted -- in direct mode you're operating without large swathes of git-annex's carefully constructed safety net. (When the assistant later uses direct mode, it'll untrust the repository automatically.)\" + +http://git-annex.branchable.com/design/assistant/blog/day_151__direct_mode_toggle/ +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_16_6e3fce3a32ab346dc3d0fd4b69967536._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_16_6e3fce3a32ab346dc3d0fd4b69967536._comment new file mode 100644 index 000000000..afda489a1 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_16_6e3fce3a32ab346dc3d0fd4b69967536._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="just one thing" + date="2013-01-16T01:45:54Z" + content=""" +http://git-annex.branchable.com/todo/wishlist:_disable_automatic_commits/ is the only thing I'm waiting for. Will become a very keen beta-tester (maybe even coder) when that happens. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_17_1b7233d88593d0d99b26ea3e7af20d9c._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_17_1b7233d88593d0d99b26ea3e7af20d9c._comment new file mode 100644 index 000000000..278181ad5 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_17_1b7233d88593d0d99b26ea3e7af20d9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 17" + date="2013-01-16T19:38:36Z" + content=""" +@rubiojr I recommend configuring direct mode repos as untrusted if you care about accessing old versions of your files as stored in git. If that is not a concern, direct mode is safe, it's just that it allows editing/deleting any file at any time, even if that's the only copy of the file. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_18_a23d5a0e2718b8e486f036fe8a413b36._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_18_a23d5a0e2718b8e486f036fe8a413b36._comment new file mode 100644 index 000000000..5f82d7ebb --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_18_a23d5a0e2718b8e486f036fe8a413b36._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="comment 18" + date="2013-01-17T12:04:34Z" + content=""" +the \"I haven't always well understood the differences between commandline operation & the assistant, so the differences would confuse me, and I found the command line more understandable & less scary. Now trying to learn to like & trust the assistant.\" fits pretty well for me -- i'd like to use the webapp at least for viewing, but i'm worried that some auto-magic would kick in, and i regularly have uncommitted stuff in at least one git-annex repo. + +a --dry-run flag or similar on the `git annex webapp` would be nice, or a description of what would happen or how to turn that off / make it create other branches / even commit or push something. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment new file mode 100644 index 000000000..35def9374 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmvVKc1ECzZx7EhtLHBP6RWPZewq4x_9I" + nickname="Daniele" + subject="Windows + git ignore like syntax for files to sync" + date="2013-04-19T10:47:36Z" + content=""" +Hi, + +my company would need this for some project. + +But to adopt it I would need: +* windows support (I don't care if now symlink support for now) +* being able to define which files are automatically synced using a syntax similar to the gitignore one +* being able to disable auto-commit (just synching, user should be able to commit on their own) + +thanks + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_1_00a0de8190d946caaeeca3b44646146f._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_1_00a0de8190d946caaeeca3b44646146f._comment new file mode 100644 index 000000000..4bebe748d --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_1_00a0de8190d946caaeeca3b44646146f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="Two reasons" + date="2013-01-10T18:00:05Z" + content=""" +As of right now, the assistant has only secondary benefit over plain git-annex inasmuch there's a lot more code activity. + +As soon as the assistant supports Android, I will use for syncing photos off of my phone and may start to use the assistant on my usual repos as a natural consequence. + +Additionally, there's a subjective feeling of more bugs being reported. That may or may not be true, but as long as there's no Android port, I don't have an actual reason to \"risk\" it. + +-- Richard + +PS: This seems to be the first poll where you can place only one vote while it's the first where I really wanted to vote on two separate items. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_20_199c9807499470771af6cbca6d034cfa._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_20_199c9807499470771af6cbca6d034cfa._comment new file mode 100644 index 000000000..51e1bc4ea --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_20_199c9807499470771af6cbca6d034cfa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 20" + date="2013-04-19T18:01:44Z" + content=""" +You can turn off automatic commits in the webapp by pausing syncing for the local repository. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_21_9185b0e05b1b1997533694da1de83073._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_21_9185b0e05b1b1997533694da1de83073._comment new file mode 100644 index 000000000..5ec65ad98 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_21_9185b0e05b1b1997533694da1de83073._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmH-n1yD04qmSeXKKzYaXFTN1ciFWVb5As" + nickname="Martyn" + subject="Can't seem to get the configuration I am looking for from the webapp" + date="2014-01-02T23:41:44Z" + content=""" +Currently, I have a local server, desktop and laptop (all on the same network). My laptop leaves the house occasionally where I work on it... +Quite simply, I want make the local server the centralised repository and have the desktop + laptop sync up and down to and from the server. The server would act as a backup and file change history between all local repositories on desktop and laptop. So I would sync between trips away. + +Sadly every combination with git-annex webapp fails for a number of reasons, it could be just me but here is what I've experienced: + +a) I want to use direct mode ALL the time or at least be able to configure it without the command line. Currently server side set ups are indirect depending on the repository group. So no symlinks basically. I think \"full backup\" and \"client\" are the only two that do what I was hoping for here. +b) The list of repository group types miss something I'm looking for, I want the \"full backup\" with \"transfer\" for the remote server - I guess? +c) For remote cloud solutions, I would like the files to exist, not just the raw .git/ directory to exist on the server. When I tested it, I couldn't see a way to test on the server itself the integrity of the files (could be my lack of git-annex knowledge :) +d) I would like it if the assistant made it simpler to configure remotes, i.e. right now if I have 2 directories I believe I would need 4 configurations to push/pull locally and remotely to the 1 server with each machine. I've had this working and it's the closest I've got so far, but tedious if I want to do it for 5 directories on 2 machines (that's 20 configurations to add in all unless there is an easier way?) +e) The \"share with other devices\" option seems one of the best right now, but it suffers with the issues of c) AFAICT. Why not have the server just be a remote when unencrypted? + +From some reading up on the command line tools, it seems like it would be easier to set up using those for what I want than using the webapp. +I currently love the webapp, it's just missing some polish and options to do what I need. + +Thanks for the great work so far! :) +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_2_35f6f121e54260cb960211a6e2e51e8e._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_2_35f6f121e54260cb960211a6e2e51e8e._comment new file mode 100644 index 000000000..bf52b9c1c --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_2_35f6f121e54260cb960211a6e2e51e8e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniCRkhl_W87gOK5eElfsef3FoUsUFpAr4" + nickname="Alexandre" + subject="Two assistants with shared transfer repository" + date="2013-01-11T07:17:12Z" + content=""" +I voted for the Windows port, which unfortunately I must use at work. + +But another thing that Dropbox gets right is that you can [sync two clients with one shared repository](http://git-annex.branchable.com/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__) that works without any configuration whether you are home or somewhere else. This use case is covered by sync over XMPP, but there are two small issues with this : +- if I use Google XMPP servers to sync two assistants in the same network, everything goes through the slower Internet link +- if I setup my own XMPP server, well, this is more setup, more open ports, etc. + +It would be nice to have repository pushs on a shared repository notified to the connected clients in the SSH connection. +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment new file mode 100644 index 000000000..0d971c29c --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 3" + date="2013-01-11T09:32:33Z" + content=""" +I've got a few wishes for git-annex… Referring to the poll options: + +- I need an Android port + +I think this is the biggest issue for getting a high WAF. (I want to put our photos in an annex, and getting them auto-magically off her phone would get me massive brownie points.) + +- Initially the lack of direct-mode. Now concerns about the safety of direct mode. Perhaps after the next release. + +The \"potentially unsafe\" sort of comments in the blog make me worry about trusting my data to the direct mode. Saying that I *really* appreciate the honesty of the comments. That is why I want to keep using, and recommend to others, git-annex. + +- I haven't always well understood the differences between commandline operation & the assistant, so the differences would confuse me, and I found the command line more understandable & less scary. Now trying to learn to like & trust the assistant. + +I also have worried about the automatic adding by the assistant - prior to direct mode. + +- throttling transfers, it upsets people when I saturate the connection + +I think a bittorrent option would be ideal. Not public torrents, but torrents between my annexes. + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_4_0d988280865caae498a3b693b6342e37._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_4_0d988280865caae498a3b693b6342e37._comment new file mode 100644 index 000000000..b66cd12f7 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_4_0d988280865caae498a3b693b6342e37._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Two local repositories" + date="2013-01-11T10:31:54Z" + content=""" +Here is my usecase: +I want two local (direct mode) repositories. So basically a working directory and a backup directory to the working one. + +The removable media repository *almost* fulfill this usecase, except you can only select drive and not a directory. +I think it would be relatively simple to implement. (A drive is a directory under linux after all). + +Best, + Laszlo + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_5_ac8fe3768c30dd7999c183500f8567bb._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_5_ac8fe3768c30dd7999c183500f8567bb._comment new file mode 100644 index 000000000..713e8ef7d --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_5_ac8fe3768c30dd7999c183500f8567bb._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="marvin" + ip="91.154.225.32" + subject="SSH keys" + date="2013-01-11T12:02:50Z" + content=""" +Really looking forward to seeing this project go forward and impressed by what you have accomplished. + +I have my own server which I want to use as a repository, so I'll choose \"Remote server\". I want to use direct mode. +Now I can only create an encrypted remote which is fine for me, but I don't know how to sync that with another client using this remote. + +Also with the generated ssh keys I no longer can log into my server normally as it tries to use the generated keys. +The generated keys should also be restricted to only be able to change the repository and nothing else. + +Maybe webdav could be used to create something with better access control and repositories for groups etc. +Also with a simple web upload/download page, similar to dropbox. + +Sorry if my post is long and idiotic, just simple (hopefully constructive) feedback from a simple user :) +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_6_36832de705a2bebf8dc6e65dcd661731._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_6_36832de705a2bebf8dc6e65dcd661731._comment new file mode 100644 index 000000000..525a325f0 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_6_36832de705a2bebf8dc6e65dcd661731._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 6" + date="2013-01-11T15:06:47Z" + content=""" +Laszlo's concern about \"you can only select a drive and not a directory\" relates to a problem I had. + +I have two local directories, ~/annex indirect my main annex, and ~/directannex for playing with direct mode. + +I had hoped to back each up to the same shared drive, but didn't realize there was no option to select a directory within a shared drive, so when I tried to do that through the assistant I inadvertently connected the two by backing them up to the same directory on the shared drive! + +This is probably a \"power user problem\" which has a \"power user solution\" of setting up the separate repository manually. But it did take me by surprise. + +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_7_3618067e473577a112e36970ca71e0ab._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_7_3618067e473577a112e36970ca71e0ab._comment new file mode 100644 index 000000000..bfb1b949c --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_7_3618067e473577a112e36970ca71e0ab._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="Recording file creation dates?" + date="2013-01-11T16:35:27Z" + content=""" +I've just started using git annex, command line feels safer for the time being. One issue I've got with assistant that I had to kill it couple of times when it got confused over something (could be that I used command line git annex at the same time?), shutdown from the UI is welcome. + +More of a git annex issue for me that I lost file creation dates for annexed files, which i don't really mind for most of my content, except really old photos without proper EXIF tags. +I think of git annex as more of a DVR for my digital life, rather than a mere sync tool, so I would welcome some basic metadata facility. Would you consider adding this? +(Really getting carried away, I would want to full text search on file names, ID3 tags, document metadata and text etc. and requesting files based on search hits, spotlight style..) +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_8_07a13b6f000ddc0ac4472b863d8b50bd._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_8_07a13b6f000ddc0ac4472b863d8b50bd._comment new file mode 100644 index 000000000..8bbd57b5d --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_8_07a13b6f000ddc0ac4472b863d8b50bd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 8" + date="2013-01-11T20:02:39Z" + content=""" +@Alexandre, what you want can be achieved by setting up XMPP pairing, and also [[local pairing|assistant/local_pairing_walkthrough]]. Then when computers are on the same network, transfers are done via the LAN. + +@Laszlo, this can be set up without using the webapp. Just make the two repositories, using the webapp. Then go into each and run \"git remote add myotherrepo $path_to_other_repo\". Then assistant will automatically sync them. I *have* thought about adding a configurator for this to the webapp. It would help to know what use cases you're getting at with this. + +@marvin The generated ssh keys are configured to only allow running `git-annex-shell`, which limits it to only acting on the repository. The keys are also configured, in `.ssh/config` to only be used when a particular host alias is used. They should not be used when you just ssh normally to the host. If this is happening to you, please file a bug report with details. + +@dzsino you can get file creation dates out of git using git log :) +"""]] diff --git a/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_9_e15eb407d988fda363296c8b566cc8fb._comment b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_9_e15eb407d988fda363296c8b566cc8fb._comment new file mode 100644 index 000000000..f7dd3eb88 --- /dev/null +++ b/doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_9_e15eb407d988fda363296c8b566cc8fb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Question about git-annex" + date="2013-01-11T21:05:55Z" + content=""" +Not sure where the correct place to ask this is... + +My use case for git-annex is to back up important files (pictures, videos, etc.) on a hard disk at work and one at home. Is there an easy way to do that? I'd like to be able to get git-annex to fill up my phone/laptop with files that it thinks are backed up in <2 of the locations, and ferry them back and forth. They can be deleted to free up space after that, if necessary. + +Thanks for all your work, by the way. I missed the kickstarter, but if there's a simple and direct way to donate (dwolla?, gittip?), I'd love to chip in. +"""]] diff --git a/doc/design/assistant/progressbars.mdwn b/doc/design/assistant/progressbars.mdwn new file mode 100644 index 000000000..50f424508 --- /dev/null +++ b/doc/design/assistant/progressbars.mdwn @@ -0,0 +1,43 @@ +Currently, git-annex takes a very lazy approch to displaying +progress into. It just lets rsync or whatever display the progress +for it, in the terminal. + +Something better is needed for the [[webapp]]. There needs to be a +way for the web app to know what the current progress is of all transfers. + +This is one of those potentially hidden but time consuming problems. + +## downloads + +* Watch temp file as it's coming in and use its size. + Can either poll every .5 seconds or so to check file size, or + could use inotify. **done** +* When easily available, remotes call the MeterUpdate callback as downloads + progress. **done** +* S3 TODO + While it has a download progress bar, `getObject` probably buffers the whole + download in memory before returning. Leaving the progress bar to only + display progress for writing the file out of memory. Fixing this would + involve making hS3 stream better (also avoids it wasting memory). + +## uploads + +Each individual remote type needs to implement its own support for calling +the MeterUpdate callback as the upload progresses. + +* git: **done** +* rsync: **done** +* directory: **done** +* web: Not applicable; does not upload +* webdav: **done** +* S3: **done** +* glacier: **done** +* bup: TODO +* hook: Would require the hook interface to somehow do this, which seems + too complicated. So skipping. + +## communication + +It may be worth using a better communication channel than files on disk for +the transfer progress. Shared memory could be used, or http posts to the +webapp. diff --git a/doc/design/assistant/progressbars/comment_1_3ea263b1f334e8e38e14f00a96202988._comment b/doc/design/assistant/progressbars/comment_1_3ea263b1f334e8e38e14f00a96202988._comment new file mode 100644 index 000000000..4a011f61b --- /dev/null +++ b/doc/design/assistant/progressbars/comment_1_3ea263b1f334e8e38e14f00a96202988._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://abhidg.myopenid.com/" + ip="129.67.132.87" + subject="librsync" + date="2012-06-13T02:14:29Z" + content=""" +There's librsync which might support reporting the progress through its API, but it seems to be in beta. +"""]] diff --git a/doc/design/assistant/rate_limiting.mdwn b/doc/design/assistant/rate_limiting.mdwn new file mode 100644 index 000000000..3ab804329 --- /dev/null +++ b/doc/design/assistant/rate_limiting.mdwn @@ -0,0 +1,57 @@ +Webapp needs a simple speed control knob, especially to avoid saturating +bandwidth on uploads. + +We have basic throttling support in git-annex for rsync, +but none for any special remotes. A good first step would be to expose +this in the webapp, and ensure that `git-annex-shell` also honors it when +sending/receiving data. + +We actually need two speed controls, one for upload and one for download. + +It is probably not necessary to throttle git push/pull operations, as the +data transfers tend to be small. Only throttling file transfers is +essential. + +## possibility: trickle + +Since `git-annex transferkeys` is a separate process, one easy option would +be to run it inside `trickle`. If the user changes the bandwidth limits, +it could kill the transfer and restart it with different trickle options. + +Problem: Not all special remotes support resuming transfers, so this is +suboptimal. (So too are the pause/resume buttons, when using those +remotes!) + +`trickle` is available for OSX as well as Linux and BSDs. + + +It is probably not easily available for Android, as it uses `LD_PRELOAD`. + +## possibility: built in IO limiting + +A cleaner method would be to do the limiting inside git-annex. We already +have metered file IO. It should be possible to make the meter not only report +on the transfer speed, but detect when it's going too fast, and delay. This +will delay the file streaming through the special remote's transfer code, +so should work for a variety of special remotes. (Not for rsync or bup +or git-annex-shell though, so those need to be handled separately.) + +Should work well for uploads at least. I don't know how well it would work +for throttling downloads; the sender may just keep sending data and the +data buffer before it gets to the IO meter. Maybe once the buffers fill the +OS would have the TCP throttled down. Needs investigation; trickle claims +to throttle downloads. + +## communications channels + +There would need to be a communication channel for the assistant to tell +`git annex transferkeys` when the rate limit has changed. It could for +example send it a SIGUSR1, and then leave it up to the process to reload +the git config. Inside the IO meter, we could have an MVar that contains +the current throttle value, so the IO meter could check it each time it's +called and adjust its throttling appropriately. + +Ideally, the assistant could also communicate in the same way with +`git-annex-shell` to tell it when the limit has changed. Since +`git-annex-shell` uses rsync, it would need to abort the transfer, and rely +on the other side retrying to start it up with the new limit. diff --git a/doc/design/assistant/screenshot/firstrun.png b/doc/design/assistant/screenshot/firstrun.png new file mode 100644 index 000000000..7e9d505b4 Binary files /dev/null and b/doc/design/assistant/screenshot/firstrun.png differ diff --git a/doc/design/assistant/screenshot/intro.png b/doc/design/assistant/screenshot/intro.png new file mode 100644 index 000000000..23ed49d67 Binary files /dev/null and b/doc/design/assistant/screenshot/intro.png differ diff --git a/doc/design/assistant/sshpassword.mdwn b/doc/design/assistant/sshpassword.mdwn new file mode 100644 index 000000000..59f981bb1 --- /dev/null +++ b/doc/design/assistant/sshpassword.mdwn @@ -0,0 +1,65 @@ +Currently the assistant sets up dedicated ssh keys, that can just use +git-annex. This is ok. The problem is that the initial 2 connections to the +ssh server when setting up these keys involve a password prompt, which is +done at the console unless the system happens to have a working ssh agent +that can pop up a dialog. That can be confusing. + +It would be nice to have the webapp prompt for the password. Can it be done +securely? + +This might come down to a simple change to the webapp to prompt for the +password, and then rather a lot of pain to make the webapp use HTTPS so we +can be pretty sure noone is sniffing the (localhost) connection. + +## ssh-askpass approach + +* If ssh-askpass is in PATH, or `SSH_ASKPASS` is set, do nothing. + (Unless webapp is run remotely.) + XXX not currently done; the UI would need to omit the password entry + fields in this case. +* Otherwise, have the assistant set `SSH_ASKPASS` to a command that will + cause the webapp to read the password and forward it on. Also, set + DISPLAY to ensure that ssh runs the program. **done** + +Looking at ssh.exe, I think this will even work on Windows; it contains the +code to run ssh-askpass. (It does work on Windows!) + +### securely handling the password + +* Maybe force upgrade webapp to https? Locally, the risk would be that + root could tcpdump and read password, so not large risk. If webapp + is being accessed remotely, absolutely: require https. +* Use hs-securemem to store password. +* Avoid storing password for long. Erase it after webapp setup of remote + is complete. Time out after 10 minutes and erase it. **done** +* If the user is slow, the cached ssh key can exire before they finish. + This results in ssh being given no password, and failing. The UI + now detects this and suggests the user retry. **done** +* Prompt using a html field name that does not trigger web browser password + saving if possible. + +### ssh-askpass shim, and password forwarding + +`SSH_ASKPASS` needs to be set to a program (probably git-annex) +which gets the password from the webapp, and outputs it to stdout. **done** + +Seems to call for the webapp and program to communicate over a local +socket (locked down so only user can access) or environment. +Environment is not as secure (easily snooped by root). +Local socket probably won't work on Windows. Could just use a temp file. + +(Currently uses a temp file with locked down perms that it's careful +to clean up after use.) + +Note that the webapp can probe to see if ssh needs a password, and can +prompt the user for it before running ssh and the ssh-askpass shim. +This avoids some complexity, and perhaps some attack vectors, +if the shim cannot requst an arbitrary password prompt. +(This complexity not needed with the temp file approach..) + +### TODO + +* test on OSX +* test on Android +* remove the vestigial terminal on Windows and Android, since this was the + last thing actually using it (not easy!) diff --git a/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment b/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment new file mode 100644 index 000000000..e71806fa2 --- /dev/null +++ b/doc/design/assistant/sshpassword/comment_1_24399abe0a0c1de271490ee15e064760._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2014-04-29T10:10:04Z" + content=""" +Can you do something similar for gpg-agent? Or do it instead with a ssh supported gpg-agent? +"""]] diff --git a/doc/design/assistant/sshpassword/comment_2_36a811bca209c7ac8a44d64bf8bc5bf3._comment b/doc/design/assistant/sshpassword/comment_2_36a811bca209c7ac8a44d64bf8bc5bf3._comment new file mode 100644 index 000000000..8d9925af2 --- /dev/null +++ b/doc/design/assistant/sshpassword/comment_2_36a811bca209c7ac8a44d64bf8bc5bf3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 2" + date="2014-05-19T15:47:19Z" + content=""" +I don't feel comfortable prompting for gpg passphrases in the webapp. See [[gpgkeys]] for thoughts on this. +"""]] diff --git a/doc/design/assistant/syncing.mdwn b/doc/design/assistant/syncing.mdwn new file mode 100644 index 000000000..df9a771b1 --- /dev/null +++ b/doc/design/assistant/syncing.mdwn @@ -0,0 +1,220 @@ +Once files are added (or removed or moved), need to send those changes to +all the other git clones, at both the git level and the key/value level. + +## misc TODO + +* Test MountWatcher on LXDE. +* Add a hook, so when there's a change to sync, a program can be run + and do its own signaling. +* --debug will show often unnecessary work being done. Optimise. +* Configurablity, including only enabling git syncing but not data transfer; + only uploading new files but not downloading, and only downloading + files in some directories and not others. See for use cases: + [[forum/Wishlist:_options_for_syncing_meta-data_and_data]] +* speed up git syncing by using the cached ssh connection for it too + Will need to use `GIT_SSH`, which needs to point to a command to run, + not a shell command line. Beware that the network connection may have + bounced and the cached ssh connection not be usable. +* Map the network of git repos, and use that map to calculate + optimal transfers to keep the data in sync. Currently a naive flood fill + is done instead. Maybe use XMPP as a side channel to learn about the + network topology? +* Find a more efficient way for the TransferScanner to find the transfers + that need to be done to sync with a remote. Currently it walks the git + working copy and checks each file. That probably needs to be done once, + but further calls to the TransferScanner could eg, look at the delta + between the last scan and the current one in the git-annex branch. +* [[use multiple transfer slots|todo/Slow_transfer_for_a_lot_of_small_files.]] +* The TransferQueue's list of deferred downloads could theoretically + grow without bounds in memory. Limit it to a given number of entries, + and fall back to some other method -- either storing deferred downloads + on disk, or perhaps scheduling a TransferScanner run to get back into sync. + +## More efficient syncing + +See [[syncing/efficiency]] + +## TransferScanner efficiency + +The TransferScanner thread needs to find keys that need to be Uploaded +to a remote, or Downloaded from it. + +How to find the keys to transfer? I'd like to avoid potentially +expensive traversals of the whole git working copy if I can. +(Currently, the TransferScanner does do the naive and possibly expensive +scan of the git working copy.) + +One way would be to do a git diff between the (unmerged) git-annex branches +of the git repo, and its remote. Parse that for lines that add a key to +either, and queue transfers. That should work fairly efficiently when the +remote is a git repository. Indeed, git-annex already does such a diff +when it's doing a union merge of data into the git-annex branch. It +might even be possible to have the union merge and scan use the same +git diff data. + +But that approach has several problems: + +1. The list of keys it would generate wouldn't have associated git + filenames, so the UI couldn't show the user what files were being + transferred. +2. Worse, without filenames, any later features to exclude + files/directories from being transferred wouldn't work. +3. Looking at a git diff of the git-annex branches would find keys + that were added to either side while the two repos were disconnected. + But if the two repos' keys were not fully in sync before they + disconnected (which is quite possible; transfers could be incomplete), + the diff would not show those older out of sync keys. + +The remote could also be a special remote. In this case, I have to either +traverse the git working copy, or perhaps traverse the whole git-annex +branch (which would have the same problems with filesnames not being +available). + +If a traversal is done, should check all remotes, not just +one. Probably worth handling the case where a remote is connected +while in the middle of such a scan, so part of the scan needs to be +redone to check it. + +## done + +1. Can use `git annex sync`, which already handles bidirectional syncing. + When a change is committed, launch the part of `git annex sync` that pushes + out changes. **done**; changes are pushed out to all remotes in parallel +1. Watch `.git/refs/remotes/` for changes (which would be pushed in from + another node via `git annex sync`), and run the part of `git annex sync` + that merges in received changes, and follow it by the part that pushes out + changes (sending them to any other remotes). + [The watching can be done with the existing inotify code! This avoids needing + any special mechanism to notify a remote that it's been synced to.] + **done** +1. Periodically retry pushes that failed. **done** (every half an hour) +1. Also, detect if a push failed due to not being up-to-date, pull, + and repush. **done** +2. Use a git merge driver that adds both conflicting files, + so conflicts never break a sync. **done** + +* on-disk transfers in progress information files (read/write/enumerate) + **done** +* locking for the files, so redundant transfer races can be detected, + and failed transfers noticed **done** +* transfer info for git-annex-shell **done** +* update files as transfers proceed. See [[progressbars]] + (updating for downloads is easy; for uploads is hard) +* add Transfer queue TChan **done** +* add TransferInfo Map to DaemonStatus for tracking transfers in progress. + **done** +* Poll transfer in progress info files for changes (use inotify again! + wow! hammer, meet nail..), and update the TransferInfo Map **done** +* enqueue Transfers (Uploads) as new files are added to the annex by + Watcher. **done** +* enqueue Tranferrs (Downloads) as new dangling symlinks are noticed by + Watcher. **done** + (Note: Needs git-annex branch to be merged before the tree is merged, + so it knows where to download from. Checked and this is the case.) +* Write basic Transfer handling thread. Multiple such threads need to be + able to be run at once. Each will need its own independant copy of the + Annex state monad. **done** +* Write transfer control thread, which decides when to launch transfers. + **done** +* Transfer watching has a race on kqueue systems, which makes finished + fast transfers not be noticed by the TransferWatcher. Which in turn + prevents the transfer slot being freed and any further transfers + from happening. So, this approach is too fragile to rely on for + maintaining the TransferSlots. Instead, need [[todo/assistant_threaded_runtime]], + which would allow running something for sure when a transfer thread + finishes. **done** +* Test MountWatcher on KDE, and add whatever dbus events KDE emits when + drives are mounted. **done** +* It would be nice if, when a USB drive is connected, + syncing starts automatically. Use dbus on Linux? **done** +* Optimisations in 5c3e14649ee7c404f86a1b82b648d896762cbbc2 temporarily + broke content syncing in some situations, which need to be added back. + **done** + + Now syncing a disconnected remote only starts a transfer scan if the + remote's git-annex branch has diverged, which indicates it probably has + new files. But that leaves open the cases where the local repo has + new files; and where the two repos git branches are in sync, but the + content transfers are lagging behind; and where the transfer scan has + never been run. + + Need to track locally whether we're believed to be in sync with a remote. + This includes: + * All local content has been transferred to it successfully. + * The remote has been scanned once for data to transfer from it, and all + transfers initiated by that scan succeeded. + + Note the complication that, if it's initiated a transfer, our queued + transfer will be thrown out as unnecessary. But if its transfer then + fails, that needs to be noticed. + + If we're going to track failed transfers, we could just set a flag, + and use that flag later to initiate a new transfer scan. We need a flag + in any case, to ensure that a transfer scan is run for each new remote. + The flag could be `.git/annex/transfer/scanned/uuid`. + + But, if failed transfers are tracked, we could also record them, in + order to retry them later, without the scan. I'm thinking about a + directory like `.git/annex/transfer/failed/{upload,download}/uuid/`, + which failed transfer log files could be moved to. +* A remote may lose content it had before, so when requeuing + a failed download, check the location log to see if the remote still has + the content, and if not, queue a download from elsewhere. (And, a remote + may get content we were uploading from elsewhere, so check the location + log when queuing a failed Upload too.) **done** +* Fix MountWatcher to notice umounts and remounts of drives. **done** +* Run transfer scan on startup. **done** +* Often several remotes will be queued for full TransferScanner scans, + and the scan does the same thing for each .. so it would be better to + combine them into one scan in such a case. **done** +* The syncing code currently doesn't run for special remotes. While + transfering the git info about special remotes could be a complication, + if we assume that's synced between existing git remotes, it should be + possible for them to do file transfers to/from special remotes. + **done** + +* The transfer code doesn't always manage to transfer file contents. + + Besides reconnection events, there are two places where transfers get queued: + + 1. When the committer commits a file, it queues uploads. + 2. When the watcher sees a broken symlink be created, it queues downloads. + + Consider a doubly-linked chain of three repositories, A B and C. + (C and A do not directly communicate.) + + * File is added to A. + * A uploads its content to B. + * At the same time, A git syncs to B. + * Once B gets the git sync, it git syncs to C. + * When C's watcher sees the file appear, it tries to download it. But if + B had not finished receiving the file from A, C doesn't know B has it, + and cannot download it from anywhere. + + Possible solution: After B receives content, it could queue uploads of it + to all remotes that it doesn't know have it yet, which would include C. + **done** + + In practice, this had the problem that when C receives the content, + it will queue uploads of it, which can send back to B (or to some other repo + that already has the content) and loop, until the git-annex branches catch + up and break the cycle. + + To avoid that problem, incoming uploads should not result in a transfer + info file being written when the key is already present. **done** + + Possible solution: C could record a deferred download. (Similar to a failed + download, but with an unknown source.) When C next receives a git-annex + branch push, it could try to queue deferred downloads. **done** + + Note that this solution won't cover use cases the other does. For example, + connect a USB drive A; B syncs files from it, and then should pass them to C. + If the files are not new, C won't immediatly request them from B. + +* Running the assistant in a fresh clone of a repository, it sometimes + skips downloading a file, while successfully downloading all the rest. + There does not seem to be an error message. This will sometimes reproduce + (in a fresh clone each time) several times in a row, but then stops happening, + which has prevented me from debugging it. + This could possibly have been caused by the bug fixed in 750c4ac6c282d14d19f79e0711f858367da145e4. + Provisionally closed. diff --git a/doc/design/assistant/syncing/comment_1_c70156174ff19b503978d623bd2df36f._comment b/doc/design/assistant/syncing/comment_1_c70156174ff19b503978d623bd2df36f._comment new file mode 100644 index 000000000..019490e61 --- /dev/null +++ b/doc/design/assistant/syncing/comment_1_c70156174ff19b503978d623bd2df36f._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk4YX0PWICfWGRLuncCPufMPDctT7KAYJA" + nickname="betabrain" + subject="selective data syncing" + date="2012-07-24T15:27:08Z" + content=""" +How will the assistant know which files' data to distribute between the repos? + +I'm using git-annex and it's numcopies attribute to maintain a redundant archive spread over different computers and usb drives. Not all drives should get a copy of everything, e.g. the usb drive I take to work should not automatically get a copy of family pictures. + +How about .gitattributes? + +* \* annex.auto-sync-data = false # don't automatically sync the data +* archive/ annex.auto-push-repos = NAS # everything added to archive/ in any repo goes automatically to the NAS remote. +* work/ annex.auto-synced-repos = LAPTOP WORKUSB # everything added to work/ in LAPTOP or WORKUSB gets synced to WORKUSB and LAPTOP +* work/ annex.auto-push-repos = LAPTOP WORKUSB # stuff added to work/ anywhere gets synced to LAPTOP and WORKUSB +* important/ annex.auto-sync-data = true # push data to all repos +* webserver_logs/ annex.remote.WEBSERVER.auto-push-repos = S3 # only the assistant running in WEBSERVER pushes webserver_logs/ to S3 remote +"""]] diff --git a/doc/design/assistant/syncing/comment_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment b/doc/design/assistant/syncing/comment_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment new file mode 100644 index 000000000..a4609d7e1 --- /dev/null +++ b/doc/design/assistant/syncing/comment_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBl7cA6wLDxVNUyLIHvAyCkf8ir3alYpk" + nickname="Tyson" + subject="Bridging LANs" + date="2012-07-10T10:20:59Z" + content=""" +Why rely on the cloud when you can instead use XMPP and jingle to perform NAT traversal for you? AFAIKT, it also means that traffic won't leave your router if the two endpoints are behind the same router. +"""]] diff --git a/doc/design/assistant/syncing/comment_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment b/doc/design/assistant/syncing/comment_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment new file mode 100644 index 000000000..c9118595c --- /dev/null +++ b/doc/design/assistant/syncing/comment_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment @@ -0,0 +1,80 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-07-03T08:26:43Z" + content=""" +On \"git syncing\" point number 9, on OSX you could potentially do this on a semi-regular basis + +
+system_profiler SPNetworkVolumeDataType
+Volumes:
+
+    net:
+
+      Type: autofs
+      Mount Point: /net
+      Mounted From: map -hosts
+      Automounted: Yes
+
+    home:
+
+      Type: autofs
+      Mount Point: /home
+      Mounted From: map auto_home
+      Automounted: Yes
+
+ +and + +
+x00:~ jtang$ system_profiler SPUSBDataType
+USB:
+
+    USB High-Speed Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBEHCI
+      PCI Device ID: 0x0aa9 
+      PCI Revision ID: 0x00b1 
+      PCI Vendor ID: 0x10de 
+      Bus Number: 0x26 
+
+        Hub:
+
+          Product ID: 0x2504
+          Vendor ID: 0x0424  (SMSC)
+          Version: 0.01
+          Speed: Up to 480 Mb/sec
+          Location ID: 0x26200000 / 3
+          Current Available (mA): 500
+          Current Required (mA): 2
+
+            USB to ATA/ATAPI Bridge:
+
+              Capacity: 750.16 GB (750,156,374,016 bytes)
+              Removable Media: Yes
+              Detachable Drive: Yes
+              BSD Name: disk1
+              Product ID: 0x2338
+              Vendor ID: 0x152d  (JMicron Technology Corp.)
+              Version: 1.00
+              Serial Number: 313541813001
+              Speed: Up to 480 Mb/sec
+              Manufacturer: JMicron
+              Location ID: 0x26240000 / 5
+              Current Available (mA): 500
+              Current Required (mA): 2
+              Partition Map Type: MBR (Master Boot Record)
+              S.M.A.R.T. status: Not Supported
+              Volumes:
+                Porta-Disk:
+                  Capacity: 750.16 GB (750,156,341,760 bytes)
+                  Available: 668.42 GB (668,424,208,384 bytes)
+                  Writable: Yes
+                  File System: ExFAT
+....
+
+ +I think its possible to programatically get this information either from the CLI (it dumps out XML output if required) or some development library. There is also DBUS in macports, but I have never had much interaction with it, so I don't know if its good or bad on OSX. +"""]] diff --git a/doc/design/assistant/syncing/efficiency.mdwn b/doc/design/assistant/syncing/efficiency.mdwn new file mode 100644 index 000000000..09bcc11b6 --- /dev/null +++ b/doc/design/assistant/syncing/efficiency.mdwn @@ -0,0 +1,77 @@ +Currently, the git-annex assistant syncs with remotes in a way that is +dumb, and potentially inneficient: + +1. Files are transferred to each reachable remote whose + [[preferred_content]] setting indicates it wants the file. + +2. After each file transfer (upload or download), a git sync + is done to all the remotes, to update location log information. + +## unncessary transfers + +There are network toplogies where #1 is massively inneficient. +For example: + +
+  laptopA-----laptopB-----laptopC
+      \         |             /
+       \---cloud based repo--/
+
+ +When laptopA has a new file, it will first send it to laptopB. It will then +check if the cloud based transfer repository wants a copy. It will, because +laptopC has not yet gotten a copy. So laptopA will proceed with a slow +upload to the cloud, while meanwhile laptopB is sending the file over fast +LAN to laptopC. + +(The more common case with no laptopC happens to work efficiently. +So does the case where laptopA is paired with laptopC.) + +## unncessary syncing + +Less importantly, the constant git syncing after each transfer is rather a +lot of work, and prevents collecting multiple presence changes to the git-annex +branch into larger commits, which would save disk space over time. + +In many cases, this sync is necessary. For example, when a file is uploaded +to a transfer remote, the location change needs to be synced out so that +other clients know to grab it. + +Or, when downloading a file from a drive, the sync lets other locally +paired repositories know we got it, so they can download it from us. +OTOH, this is also a case where a sync is sometimes unnecessary, since +if we're going to upload the file to them after getting it, the sync +only perhaps lets them start downloading it before our transfer queue +reaches a point where we'd upload it. + +It would be good to find a way to detect when syncing is not immediately +necessary, and defer it. + +## mapping + +Mapping the repository network has the potential to get git-annex the +information it needs to avoid unnecessary transfers and/or unncessary +syncing. + +Mapping the network can reuse code in `git annex map`. Once the map is +built, we want to find paths through the network that reach all nodes +eventually, with the least cost. This is a minimum spanning tree problem, +except with a directed graph, so really a Arborescence problem. + +A significant problem in mapping is that nodes are mobile, they can move +between networks over time. This breaks LAN based paths through the +network. Mapping would need a way to detect this. Note that individual +git-annex assistants can tell when they've switched networks by using the +`networkConnectedNotifier`. + +## P2P signaling + +Another approach that might help with these problems is if git-annex +repositories have a non-git out of band signaling mechanism. This could, +for example, be used by laptopB to tell laptopA that it's trying to send +a file directly to laptopC. laptopA could then defer the upload to the +cloud for a while. + +## syncing only requested content + +See [[adhoc_routing]] diff --git a/doc/design/assistant/telehash.mdwn b/doc/design/assistant/telehash.mdwn new file mode 100644 index 000000000..2ecf9ec71 --- /dev/null +++ b/doc/design/assistant/telehash.mdwn @@ -0,0 +1,90 @@ +[Telehash](http://telehash.org/) for secure P2P communication between +git-annex (assistant) repositories. + +## telehash implementation status + +* node.js version seems almost complete +* C version currently lacks channel support and seems buggy (13 Jan 2014) +* No pure haskell implementation of telehash v2. There was one of + telehash v1 (even that seems incomplete). I have pinged its author + to see if he anticipates updating it. +* Rapid development, situation may change in a month or 2. +* Is it secure? A security review should be done by competant people + (not Joey). See +* **Haskell version** + + Development on v2 in haskell is just starting up! + +## implementation basics + +* Add a telehash.log that maps between uuid and telehash address. +* On startup, assistant creates a new telehash keypair if not already + present; stores this locally and generates a telehash address from it, + stored in telehash.log. +* Use telehash for notifications of changes to the repository +* Do git push over telehash. (Pretty easy, may need rate limiting in + situations involving relays.) +* Remove git push over XMPP (which has several problems including + XMPP being an unreliable transport, requiring a separate XMPP account per + repo, and XMPP not being end-to-end encrypted) + +## telehash address discovery + +* Easy way is any set of repos that are already connected can communicate + them via telehash.log. +* Local pairing can be used for telehash address discovery. Could be made + to work without ssh (with content transfer over telehash discussed + below). +* XMPP pairing can also be used for telehash address discovery. (Note that + MITM attacks are possible.) Is it worth keeping XMPP in git-annex just + for this? +* Telehash addresses of repositories can be communicated out of band (eg, + via an OTR session or gpg signed mail), and pasted into the webapp to + initiate a repository pairing that then proceeds entirely over telehash. + Once both sides do this, the pairing can proceed automatically. + +## content transfer over telehash + +* In some circumstances, it would be ok to do annexed content transfer + over telehash. + Need to check if there are MTU problems with large data bodies in + telehash messages. + Probably not when a bridge is being used, due to required rate + limiting in bridging over telehash. Cloud transfer remotes still needed for + those situations. +* On a LAN, telehash can be used to determine the current local IP address + of another computer on the LAN. The 2 could then determine if either uses + ssh and if so use regular git-annex-shell for transfers. Or could do + annexed content transfer directly over telehash. + +## generic git-remote-telehash + +This might turn out to be easy to split off from git-annex, so `git pull` +and `git push` can be used at the command line to access telehash remotes. +Allows using general git entirely decentralized and with end-to-end +encryption. + +## separate daemon? + +See [[git-remote-daemon]] for a design. + +Advantages: + +* `git annex sync` could also use the running daemon +* `git-remote-telehash` could use the running daemon +* c-telehash might end up linked to openssl, which has licence combination + problems with git-annex. A separate process not using git-annex's code + would avoid this. +* Allows the daemon to be written in some other language if necessary + (for example, if c-telehash development stalls and the nodejs version is + already usable) +* Potentially could be generalized to handle other similar protocols. + Or even the xmpp code moved into it. There could even be git-annex native + exchange protocols implemented in such a daemon to allow SSH-less + transfers. +* Security holes in telehash would not need to compromise the entire + git-annex. daemon could be sandboxed in one way or another. + +Disadvantages: + +* Adds some complexity. diff --git a/doc/design/assistant/thanks/comment_1_8b08b5c30e5aea3fc4599f856fd25df5._comment b/doc/design/assistant/thanks/comment_1_8b08b5c30e5aea3fc4599f856fd25df5._comment new file mode 100644 index 000000000..77a0873ee --- /dev/null +++ b/doc/design/assistant/thanks/comment_1_8b08b5c30e5aea3fc4599f856fd25df5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlUbH3eytydcwlWqv8oauE2Jg4NwcV9uA0" + nickname="Anna" + subject="Special" + date="2012-07-20T23:45:15Z" + content=""" +I feel pretty special getting an individualized thank you! Btw, the good news is that your video finally explained what you were working on so that I understood it. :-) +"""]] diff --git a/doc/design/assistant/todo.mdwn b/doc/design/assistant/todo.mdwn new file mode 100644 index 000000000..2b369a2e2 --- /dev/null +++ b/doc/design/assistant/todo.mdwn @@ -0,0 +1,4 @@ +This is a subset of [[/todo]] and [[/bugs]] +for items tagged for the assistant. + +[[!inline pages="tagged(design/assistant) and !link(bugs/done) and !link(bugs/moreinfo)" show=0 archive=yes]] diff --git a/doc/design/assistant/transfer_control.mdwn b/doc/design/assistant/transfer_control.mdwn new file mode 100644 index 000000000..b0a14ed2b --- /dev/null +++ b/doc/design/assistant/transfer_control.mdwn @@ -0,0 +1,123 @@ +Some remotes are too small to sync everything to them. + +The case of a small remote on a gadget that the user interacts with, +such as a phone, where they may want to request it get content +it doesn't currently have, is covered by the [[partial_content]] page. + +But often the remote is just a removable drive or a cloud remote, +that has a limited size. This page is about making the assistant do +something smart with such remotes. + +## TODO + +* The expensive scan currently makes one pass, dropping content at the same + time more uploads and downloads are queued. It would be better to drop as + much content as possible upfront, to keep the total annex size as small + as possible. How to do that without making two expensive scans? +* The TransferWatcher's finishedTransfer function relies on the location + log having been updated after a transfer. But there's a race; if the + log is not updated in time, it will fail to drop unwanted content. + (There's a 10 second sleep there now to avoid the race, but that's hardly + a fix.) + +### dropping no longer preferred content + +When a file is renamed, it might stop being preferred, so +could be checked and dropped. (If there's multiple links to +the same content, this gets tricky. Let's assume there are not.) + +### analysis of changes that can result in content no longer being preferred + +1. The preferred content expression can change, or a new repo is added, or + groups change. Generally, some change to global annex state. Only way to deal + with this is an expensive scan. (The rest of the items below come from + analizing the terminals used in preferred content expressions.) **done** +2. renaming of a file (ie, moved to `archive/`) **done** + (note also that renaming a file can also make it become preferred content + again, and should cause it to be transferred in that case) **done** +3. we get a file (`in`, `copies`) **done** +4. we sent a file (`in`, `copies`) **done** +5. some other repository drops the file (`in`, `copies` .. However, it's + unlikely that an expression would prefer content when *more* copies + exisited, and want to drop it when less do. That's nearly a pathological + case.) +6. `migrate` is used to change a backend (`inbackend`; unlikely) + +That's all! Of these, 1-4 are by far the most important. + +## specifying what data a remote prefers to contain (**done**) + +Imagine a per-remote preferred content setting, that matches things that +should be stored on the remote. + +For example, a MP3 player might use: +`smallerthan(10mb) and filename(*.mp3) and (not filename(junk/*))` + +Adding that as a filter to files sent to a remote should be +straightforward. + +A USB drive that is carried between three laptops and used to sync data +between them might use: `not (in=laptop1 and in=laptop2 and in=laptop3)` + +In this case, transferring data from the usb repo should +check if preferred content settings rejects the data, and if so, drop it +from the repo. So once all three laptops have the data, it is +pruned from the transfer drive. + +## repo groups (**done**) + +Seems like git-annex needs a way to know the groups of repos. Some +groups: + +* enduser: The user interacts with this repo directly. +* archival: This repo accumulates stuff, and once it's in enough archives, + it tends to get removed from other places. +* transfer: This repo is used to transfer data between enduser repos, + it does not hold data for long periods of time, and tends to have a + limited size. + +Add a group.log that can assign repos to these or other groups. (**done**) + +Some examples of using groups: + +* Want to remove content from a repo, if it's not an archival repo, + and the content has reached at least one archival repo: + + `(not group=archival) and (not copies=archival:1)` + + That would make send to configure on all repos, or even set + a global `annex.accept` to it. **done** + +* Make a cloud repo only hold data until all known clients have a copy: + + `not ingroup(enduser)` + +## configuration + +The above is all well and good for those who enjoy boolean algebra, but +how to configure these sorts of expressions in the webapp? + +Currently, we have a simple drop down list to select between a few +predefined groups with pre-defined preferred content recipes. Is this good +enough? + +I think so; useful recipes can be developed on the wiki and included in +git-annex. + +## the state change problem (**done**) + +Imagine that a trusted repo has setting like `not copies=trusted:2` +This means that `git annex get --auto` should get files not in 2 trusted +repos. But once it has, the file is in 3 trusted repos, and so `git annex +drop --auto` should drop it again! + +How to fix? Can it even be fixed? Maybe care has to be taken when +writing expressions, to avoid this problem. One that avoids it: +`not (copies=trusted:2 or (in=here and trusted=here and copies=trusted:3))` + +Or, expressions could be automatically rewritten to avoid the problem. + +Or, perhaps simulation could be used to detect the problem. Before +dropping, check the expression. Then simulate that the drop has happened. +Does the expression now make it want to add it? Then don't drop it! +**done**.. effectively using this approach. diff --git a/doc/design/assistant/transfer_control/comment_1_d5adaef4712913dc0263d4ebafb79320._comment b/doc/design/assistant/transfer_control/comment_1_d5adaef4712913dc0263d4ebafb79320._comment new file mode 100644 index 000000000..54e6a59cc --- /dev/null +++ b/doc/design/assistant/transfer_control/comment_1_d5adaef4712913dc0263d4ebafb79320._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-09-23T21:58:08Z" + content=""" +You could try to do it similar to [RT](http://bestpractical.com/rt/): + +* Implement saved statements, i.e. offer common use cases +* Allow those statements (or aliases? stanzas?) to be loaded in a relatively simple editor with a basic wizard to support the building of new rules +* Offer a free-text input for advanced users. It should be able to parse that and load it into the simple editor. +* Users should be able to save, export, and import those statements. +* Optionally, allow users to dry run the rules by showing them what git-annex needs to do to fulfill the requirements set by the statements. + +"""]] diff --git a/doc/design/assistant/transfer_control/comment_2_3b51474fefa6c0d19055046e06af196d._comment b/doc/design/assistant/transfer_control/comment_2_3b51474fefa6c0d19055046e06af196d._comment new file mode 100644 index 000000000..ec53f7aac --- /dev/null +++ b/doc/design/assistant/transfer_control/comment_2_3b51474fefa6c0d19055046e06af196d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRRUUZo3W7pAoRoST8P_l0PtUBhvYuzDg" + nickname="Lyle" + subject="exactly this use case: cloud remotes too small" + date="2014-01-06T00:31:34Z" + content=""" +I want to store a lot of scientific data in git-annex and have only a specific subset of my often used data in a box.com account so it is quickly synced between computers (my home internet has a limited upload speed). My home server will store all the files as it has effectively unlimited space. + +I basically want the opposite of archive for git-annex-assistant, I'd like to mark the box.com special remote to store every *except* a certain special directory called less used files or whatever, or vise-versa, only store a folder of often used files, the local clients would store everything and my home server would also store everything. + +It seems like transfer control and the groups.log can do this but I'm just not sure how to actually set it up? + +Thanks! +"""]] diff --git a/doc/design/assistant/transfer_control/comment_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment b/doc/design/assistant/transfer_control/comment_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment new file mode 100644 index 000000000..33ab5565b --- /dev/null +++ b/doc/design/assistant/transfer_control/comment_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 3" + date="2014-01-06T15:04:33Z" + content=""" +Just put the box.com remote in the transfer group. There is no need for special subdirectories, the transfer group makes the remote only want files that have not yet reached all the known clients. +"""]] diff --git a/doc/design/assistant/upgrading.mdwn b/doc/design/assistant/upgrading.mdwn new file mode 100644 index 000000000..b1d658c8b --- /dev/null +++ b/doc/design/assistant/upgrading.mdwn @@ -0,0 +1,52 @@ +The assistant should support upgrading itself. + +## non-distro upgrades + +When git-annex was installed from this website, the assistant should poll +periodically (once a day or so) to see if there is a new version. +It downloads, over https, a .info file, which contains a serialized data +type containing upgrade information. The url it's downloaded from is +configured by setting `UPGRADE_LOCATION` when building git-annex on the +autobuilders. + +When a new version is found, the webapp prompts the user to start the +upgrade. (annex.autoupgrade can be set to true to upgrade w/o prompting.) + +The upgrade process is automatic, and rather tricky. The file is downloaded +using git-annex (as a regular key!), and is then unpacked into a new +directory, and the programfile updated to point to it. Then git-annex +restarts itself. + +### manifest files + +To clean up the old installation, a git-annex.MANIFEST file is looked for +in it, and the files listed, as well as empty directories, are deleted. +I don't want to accidentially delete something I didn't ship! + +## restart on upgrade + +When git-annex is installed from a proper distribution package, there is no +need for the above. But, the assistant still needs to notice when git-annex +get upgraded, and offer to restart (or automatically restart when +annex.autoupgrade is set). + +This is done using the DirWatcher, watching the directory containing the +git-annex binary. Or, in the case of a non-distro install, watching the +directory where eg git-annex.linux/ was unpacked. + +When an change is detected, restart. + +## multi-daemon upgrades + +A single system may have multiple assistant daemons running in different +repositories. + +In this case, one daemon should do the non-distro upgrade, and the rest +should notice the upgrade and restart. + +I don't want every daemon trying to download the file at once.. + +Approach: The first new version is installed into a stable directory, based +on its version. So, start the upgrade by making this directory. If upgrade +is already in progress, the directory will already exist. (Remove directory +if upgrade fails.) diff --git a/doc/design/assistant/webapp.mdwn b/doc/design/assistant/webapp.mdwn new file mode 100644 index 000000000..797c9ad30 --- /dev/null +++ b/doc/design/assistant/webapp.mdwn @@ -0,0 +1,65 @@ +The webapp is a web server that displays a shiny interface. + +## performance + +Having the webapp open while transfers are +running uses significant CPU just for the browser to update the progress +bar. Unsurprising, since the webapp is sending the browser a new `
` +each time. Updating the DOM instead from javascript would avoid that; +the webapp just needs to send the javascript either a full `
` or a +changed percentage and quantity complete to update a single progress bar. + +(Another reason to do this is it'll cut down on the refreshes, which +sometimes make browsers ignore clicks on UI elements like the pause button, +if the transfer display refreshes just as the click is made.) + +## other features + +* there could be a UI to export a file, which would make it be served up + over http by the web app +* there could be a UI (some javascript thing) in the web browser to + submit urls to the web app to be added to the annex and downloaded. + See: [[todo/wishlist:_an_"assistant"_for_web-browsing_--_tracking_the_sources_of_the_downloads]] +* Display the `inotify max_user_watches` exceeded message. **done** +* Display something sane when kqueue runs out of file descriptors. +* allow removing git remotes **done** +* allow disabling syncing to here, which should temporarily disable all + local syncing. **done** + +## better headless support + +`--listen` is insecure, and using HTTPS would still not make it 100% secure +as there would be no way for the browser to verify its certificate. + +I do have a better idea, but it'd be hard to implement. +`git annex webapp --remote user@host:dir` could ssh to the remote host, +run the webapp there, listening only on localhost, and then send the +port the webapp chose back over the ssh connection. Then the same +ssh connection could be reused (using ssh connection caching) to set up +port forwarding from a port on the local host to the remote webapp. + +This would need to handle the first run case too, which would require +forwarding a second port once the webapp made the repository and +the second webapp started up. + +## first start **done** + +* make git repo **done** +* generate a nice description like "joey@hostname Desktop/annex" **done** +* record repository that was made, and use it next time run **done** +* write a pid file, to prevent more than one first-start process running + at once **done** + +## security **acceptable/done** + +* Listen only to localhost. **done** +* Instruct the user's web browser to open an url that contains a secret + token. This guards against other users on the same system. **done** + (I would like to avoid passwords or other authentication methods, + it's your local system.) +* Don't pass the url with secret token directly to the web browser, + as that exposes it to `ps`. Instead, write a html file only the user can read, + that redirects to the webapp. **done** +* Alternative for Linux at least would be to write a small program using + GTK+ Webkit, that runs the webapp, and can know what user ran it, avoiding + needing authentication. diff --git a/doc/design/assistant/webapp/comment_1_bab6f6fa720273c0f9700a3765150189._comment b/doc/design/assistant/webapp/comment_1_bab6f6fa720273c0f9700a3765150189._comment new file mode 100644 index 000000000..3e1330f96 --- /dev/null +++ b/doc/design/assistant/webapp/comment_1_bab6f6fa720273c0f9700a3765150189._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="ARM support" + date="2012-07-13T16:51:15Z" + content=""" +The closure of [this](http://hackage.haskell.org/trac/ghc/ticket/5839) ticket hopefully marks the end of TH issues on ARM. As of 7.4.2, GHC's linker has enough ARM support to allow a selection of common packages compile on my PandaBoard. That being said, it hasn't had a whole lot of testing so it's possible I still need to implement a few relocation types. +"""]] diff --git a/doc/design/assistant/webapp/comment_2_3cf0cf460c7869d0cc22940fcc84aec4._comment b/doc/design/assistant/webapp/comment_2_3cf0cf460c7869d0cc22940fcc84aec4._comment new file mode 100644 index 000000000..60d678aba --- /dev/null +++ b/doc/design/assistant/webapp/comment_2_3cf0cf460c7869d0cc22940fcc84aec4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="yatesa" + ip="171.25.193.21" + subject="Secret URL token" + date="2012-06-19T03:41:16Z" + content=""" +> Instruct the user's web browser to open an url that contains a secret token. This guards against other users on the same system. + +How will you implement that? Running \"sensible-browser URL\" would be the obvious way, but the secret URL would show up in a well timed ps listing. (And depending on the browser, ps may show the URL the entire time it's running.) +"""]] diff --git a/doc/design/assistant/webapp/comment_3_428e153135f7a64215730719207d82c4._comment b/doc/design/assistant/webapp/comment_3_428e153135f7a64215730719207d82c4._comment new file mode 100644 index 000000000..7a73799aa --- /dev/null +++ b/doc/design/assistant/webapp/comment_3_428e153135f7a64215730719207d82c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 3" + date="2012-07-26T17:35:18Z" + content=""" +Using twitter-bootstrap for the webapp - this might be a wishlist item, but would it be possible to ensure that the webapp's css uses twitter-bootstrap classes. It would make theming much easier in the long run and it would give you a nice modern look with a low amount of effort. +"""]] diff --git a/doc/design/assistant/webapp/comment_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment b/doc/design/assistant/webapp/comment_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment new file mode 100644 index 000000000..d713e3e8f --- /dev/null +++ b/doc/design/assistant/webapp/comment_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 4" + date="2012-07-26T17:45:28Z" + content=""" +So, Yesod's scaffolded site actually does use bootstrap, but I didn't use the scaffolded site so don't have it. I am not quite to the point of doing any theming of the webapp, but I do have this nice example of how to put in bootstrap right here.. + +By the way, if anyone would like to play with the html templates for the webapp, the main html template is `templates/default-layout.hamlet`. Uses a slightly weird template markup, but plain html will also work. And there's also the `static/` directory; every file in there will be compiled directly into the git-annex binary, and is available at `http://localhost:port/static/$file` in the webapp. See the favicon link in `default-layout.hamlet` of how to construct a type-safe link to a static file: `href=@{StaticR favicon_ico}`. That's all you really need to theme the webapp, without doing any real programming! +"""]] diff --git a/doc/design/assistant/windows.mdwn b/doc/design/assistant/windows.mdwn new file mode 100644 index 000000000..78ab69feb --- /dev/null +++ b/doc/design/assistant/windows.mdwn @@ -0,0 +1,33 @@ +See [[todo/windows_support]].. + +## symlinks + +Apparently new versions of Windows have something very like symlinks. +(Or really, 3 or so things not entirely unlike symlinks and all different.) +Stackoverflow has some details. + +NTFS supports symbolic links two different ways: an [[!wikipedia NTFS symbolic link]] and an [[!wikipedia NTFS_junction_point]]. The former seems like the closest analogue to POSIX symlinks. + +The windows port will not use symlinks. It will only support direct mode. + +## POSIX + +Lots of ifdefs and pain to deal with POSIX calls in the code base. + +Or I could try to use Cygwin. + +## Deeper system integration + +[NTFS Reparse Points](http://msdn.microsoft.com/en-us/library/aa365503%28v=VS.85%29.aspx) allow a program to define how the OS will interpret a file or directory in arbitrary ways. This requires writing a file system filter. + +## Developement environment + +Someone wrote in to say: + +> For Windows Development you can easily qualify +> for Bizspark - http://www.microsoft.com/bizspark/ +> +> This will get you 100% free Windows OS licenses and +> Dev tools, plus a free Azure account for cloud testing. +> (You can also now deploy Linux VMs to Azure as well) +> No money required at all. diff --git a/doc/design/assistant/windows/comment_1_f4b829318b182e1cec29f13babb6498e._comment b/doc/design/assistant/windows/comment_1_f4b829318b182e1cec29f13babb6498e._comment new file mode 100644 index 000000000..0bccc3a35 --- /dev/null +++ b/doc/design/assistant/windows/comment_1_f4b829318b182e1cec29f13babb6498e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlCGROoy62svBUy6P24x1KoGoDWrBq2ErA" + nickname="Steve" + subject="comment 1" + date="2012-08-07T04:15:43Z" + content=""" +NTFS symbolic links should do exactly what you would expect them to do. They can point to files or directories. Junction points are legacy NTFS functionality and reparse points are more like the POSIX mount functionality. + +NTFS symbolic links should work for you, junction point should be avoided, and reparse points would be like using a nuke to kill a fly. The only hang up you might have is that I think all three features require elevated privileges to manage. +"""]] diff --git a/doc/design/assistant/xmpp.mdwn b/doc/design/assistant/xmpp.mdwn new file mode 100644 index 000000000..4bdc58874 --- /dev/null +++ b/doc/design/assistant/xmpp.mdwn @@ -0,0 +1,136 @@ +The git-annex assistant uses XMPP to communicate between peers that +cannot directly talk to one-another. A typical scenario is two users +who share a repository, that is stored in the [[cloud]]. + +### TODO + +* Do git-annex clients sharing an account with regular clients cause confusing + things to happen? + See +* Support registering with XMPP provider from within the webapp, + as clients like pidgin are able to do. +* At least some XMPP servers are lossy (does XMPP guarantee delivery)? + I have seen a log where a push's packet 1 and 3 arrived, but 2 did not. + To deal with this, need at least a 1 packet buffer and ACK or resend + request implemented over top of XMPP. Essentially, TCP over XMPP. :( + +## design goals + +1. Avoid user-visible messages. dvcs-autosync uses XMPP similarly, but + sends user-visible messages. Avoiding user-visible messages lets + the user configure git-annex to use his existing XMPP account + (eg, Google Talk). + +2. Send notifications to buddies. dvcs-autosync sends only self-messages, + but that requires every node have the same XMPP account configured. + git-annex should support that mode, but it should also send notifications + to a user's buddies. (This will also allow for using XMPP for pairing + in the future.) + +3. Don't make account appear active. Just because git-annex is being an XMPP + client, it doesn't mean that it wants to get chat messages, or make the + user appear active when he's not using his chat program. + +## protocol + +To avoid relying on XMPP extensions, git-annex communicates +using presence messages, and chat messages (with empty body tags, +so clients don't display them). + +git-annex sets a negative presence priority, to avoid any regular messages +getting eaten by its clients. It also sets itself extended away. +Note that this means that chat messages always have to be directed at +specific git-annex clients. + +To the presence and chat messages, it adds its own tag as +[extended content](http://xmpp.org/rfcs/rfc6121.html#presence-extended). +The xml namespace is "git-annex" (not an URL because I hate wasting bandwidth). + +To indicate it's pushed changes to a git repo with a given UUID, a message +that is sent to all buddies and other clients using the account (no +explicit pairing needed), it uses a broadcast presence message containing: + + + +Multiple UUIDs can be listed when multiple clients were pushed. If the +git repo does not have a git-annex UUID, an empty string is used. + +To query if other git-annex clients are around, a presence message is used, +containing: + + + +For pairing, a chat message is sent to every known git-annex client, +containing: + + + +### git push over XMPP + +To indicate that we could push over XMPP, a chat message is sent, +to each known client of each XMPP remote. + + + +The shas are omitted by old clients. If present, they are the git shas of +the head and git-annex branches that are available to be pushed. This lets +the receiver check if it's already got them. + +To request that a remote push to us, a chat message can be sent. + + + +When replying to an canpush message, this is directed at the specific +client that indicated it could push. To solicit pushes from all clients, +the message has to be sent directed individually to each client. + +When a peer is ready to send a git push, it sends: + + + +The receiver runs `git receive-pack`, and sends back its output in +one or more chat messages, directed to the client that is pushing: + + + 007b27ca394d26a05d9b6beefa1b07da456caa2157d7 refs/heads/git-annex report-status delete-refs side-band-64k quiet ofs-delta + + +The sender replies with the data from `git push`, in +one or more chat messages, directed to the receiver: + + + data + + +The value of rp and sp used to be empty, but now it's a sequence number. +This indicates the sequence of this packet, counting from 1. The receiver +and sender each have their own sequence numbers. + +When `git receive-pack` exits, the receiver indicates its exit +status with a chat message, directed at the sender: + + + +### security + +Data git-annex sends over XMPP will be visible to the XMPP account's +buddies, and to the XMPP server (and any attacker who has access to the +XMPP server). So it's important to consider the security exposure of using +it. + +Even if git-annex sends only a single bit notification, this lets attackers +know when the user is active and changing files. Although the assistant's other +syncing activities can somewhat mask this. + +As soon as git-annex does anything unlike any other client, an attacker can +see how many clients are connected for a user, and fingerprint the ones +running git-annex, and determine how many clients are running git-annex. + +An attacker can observe the UUIDs used for pushes and pairing, and determine +how many different remotes are being used. + +An attacker could replay push notification messages, reusing UUIDs it's +observed. This would make clients pull repeatedly, perhaps as a DOS. + +The XMPP server, or an attacker with access to it can reconstruct the git +repository from data sent in pushes, in part or in whole. diff --git a/doc/design/assistant/xmpp/comment_1_f20650f93d7f0ca39b9ba3ce0380193f._comment b/doc/design/assistant/xmpp/comment_1_f20650f93d7f0ca39b9ba3ce0380193f._comment new file mode 100644 index 000000000..7ee62eea7 --- /dev/null +++ b/doc/design/assistant/xmpp/comment_1_f20650f93d7f0ca39b9ba3ce0380193f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://meep.pl/" + ip="193.23.174.18" + subject="xmlns" + date="2012-11-11T09:00:01Z" + content=""" +A minor point, but is saving a couple of bytes per message worth using a [deprecated feature](http://www.w3.org/TR/REC-xml-names/#iri-use) of the namespaces specification? This is not technically *breaking* the current specification, since \"git-annex\" is of course still a (relative) URI reference; and anyway chances of problems are, I guess, slim. But is it the lesser of two bugs? + +The shortest moderately sane absolute URI containing \"git-annex\" would probably be \"data:,git-annex\". +"""]] diff --git a/doc/design/assistant/xmpp/comment_2_8c22839a8f5912b4a817415c4a359697._comment b/doc/design/assistant/xmpp/comment_2_8c22839a8f5912b4a817415c4a359697._comment new file mode 100644 index 000000000..5b6ea3946 --- /dev/null +++ b/doc/design/assistant/xmpp/comment_2_8c22839a8f5912b4a817415c4a359697._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="Plans for two factor authentication or oath?" + date="2013-04-15T00:58:04Z" + content=""" +Are there plans to support google's two factor authentication? Right now I have to use an application specific password. +"""]] diff --git a/doc/design/assistant/xmpp/comment_4_773102522f21844cffc841e6cde9229e._comment b/doc/design/assistant/xmpp/comment_4_773102522f21844cffc841e6cde9229e._comment new file mode 100644 index 000000000..f8ddf0a3b --- /dev/null +++ b/doc/design/assistant/xmpp/comment_4_773102522f21844cffc841e6cde9229e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hhm" + ip="108.17.80.177" + subject="file transfer?" + date="2013-04-23T10:22:51Z" + content=""" +Would it be possible to add optional support for transferring files over XMPP (possibly being disabled out-of-the-box so as not to suck up third-party bandwidth)? +"""]] diff --git a/doc/design/assistant/xmpp_security.mdwn b/doc/design/assistant/xmpp_security.mdwn new file mode 100644 index 000000000..a5bd84e04 --- /dev/null +++ b/doc/design/assistant/xmpp_security.mdwn @@ -0,0 +1,29 @@ +Currently [[xmpp]] relies on the SSL connection to the server for security. +The server can see git repository data pushed through it. (Also, the SSL +connection is not pinned or really checked well at all.) + +Add an encryption layer that does not rely on trusting the XMPP server's +security. There are a few options for how to generate the key for eg, +AES encryption: + + * Do a simple Diffie-Hellman shared key generation when starting each XMPP + push session. Would not protect the users from active MITM by the + XMPP server, but would prevent passive data gathering attacks from + getting useful data. Since the key is ephemeral, would provide + Forward Security. + * Do D-H key generation, but at pairing, not push time. Allows for an + optional confirmation step, using eg, BubbleBabble to compare the + keys out of band. ("I see xebeb-dibyb-gycub-kacyb-modib-pudub-sefab-vifuc-bygoc-daguc-gohec-kuxax .. do you too?") + * Prompt both users for a passphrase when XMPP pairing, and + use SPEKE (or similar methods like J-PAKE) to generate a shared key. + Avoids active MITM attacks. Makes pairing harder, especially pairing + between one's own devices, since the passphrase has to be entered on + all devices. Also problimatic when pairing more than 2 devices, + especially when adding a device to the set later, since there + would then be multiple different keys in use. + * Rely on the user's gpg key, and do gpg key verification during XMPP + pairing. Problimatic because who wants to put their gpg key on their + phone? Also, require the users be in the WOT and be gpg literate. + +Update: This seems unlikely to be worth doing. [[Telehash]] is better. +--[[Joey]] diff --git a/doc/design/assistant/xmpp_security/comment_1_c714e86553c02600249795efb224be8a._comment b/doc/design/assistant/xmpp_security/comment_1_c714e86553c02600249795efb224be8a._comment new file mode 100644 index 000000000..92cff201d --- /dev/null +++ b/doc/design/assistant/xmpp_security/comment_1_c714e86553c02600249795efb224be8a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Sagi" + ip="2001:610:1908:8001:25ce:8a0b:53cc:c010" + subject="Why not use OTR?" + date="2013-07-23T23:53:12Z" + content=""" +[OTR](http://www.cypherpunks.ca/otr/) seems a natural fit for end-to-end encryption over xmpp. I can't find Haskell bindings for libotr at this moment, but creating those instead of inventing new protocols might be worth considering. There are also several [native implementations](http://www.cypherpunks.ca/otr/software.php) (Python, Go, Scheme), but I'm not sure if that's worth the effort. + + +"""]] diff --git a/doc/design/caching_database.mdwn b/doc/design/caching_database.mdwn new file mode 100644 index 000000000..9d688a9d4 --- /dev/null +++ b/doc/design/caching_database.mdwn @@ -0,0 +1,124 @@ +* [[metadata]] for views +* [direct mode mappings scale badly with thousands of identical files](/bugs/__34__Adding_4923_files__34___is_really_slow) +* [[bugs/incremental_fsck_should_not_use_sticky_bit]] +* [[todo/wishlist:_pack_metadata_in_direct_mode]] +* [[todo/cache_key_info]] + +What do all these have in common? They could all be improved by +using some kind of database to locally store the information in an +efficient way. + +The database should only function as a cache. It should be able to be +generated and updated by looking at the git repository. + +* Metadata can be updated by looking at the git-annex branch, + either its current state, or the diff between the old and new versions +* Direct mode mappings can be updated by looking at the current branch, + to see which files map to which key. Or the diff between the old + and new versions of the branch. +* Incremental fsck information is not stored in git, but can be + "regenerated" by running fsck again. + (Perhaps doesn't quite fit, but let it slide..) + +Store in the database the Ref of the branch that was used to construct it. +(Update in same transaction as cached data.) + +## implementation plan + +1. Implement for metadata, on a branch, with sqlite. +2. Make sure that builds on all platforms. +3. Add associated file mappings support. This is needed to fully + use the caching database to construct views. +4. Store incremental fsck info in db. +5. Replace .map files with 3. for direct mode. + +## case study: persistent with sqllite + +Here's a non-normalized database schema in persistent's syntax. + +
+CachedKey
+  key Key
+  associatedFiles [FilePath]
+  lastFscked Int Maybe
+  KeyIndex key
+
+CachedMetaData
+  key Key
+  metaDataField MetaDataField
+  metaDataValue MetaDataValue
+
+ +Using the above database schema and persistent with sqlite, I made +a database containing 30k Cache records. This took 5 seconds to create +and was 7 mb on disk. (Would be rather smaller, if a more packed Key +show/read instance were used.) + +Running 1000 separate queries to get 1000 CachedKeys took 0.688s with warm +cache. This was more than halved when all 1000 queries were done inside the +same `runSqlite` call. (Which could be done using a separate thread and some +MVars.) + +(Note that if the database is a cache, there is no need to perform migrations +when querying it. My benchmarks skip `runMigration`. Instead, if the query +fails, the database doesn't exist, or uses an incompatable schema, and the +cache can be rebuilt then. This avoids the problem that persistent's migrations +can sometimes fail.) + +Doubling the db to 60k scaled linearly in disk and cpu and did not affect +query time. + +---- + +Here's a normalized schema: + +
+CachedKey
+  key Key
+  KeyIndex key
+  deriving Show
+
+AssociatedFiles
+  keyId CachedKeyId Eq
+  associatedFile FilePath
+  KeyIdIndex keyId associatedFile
+  deriving Show
+
+CachedMetaField
+  field MetaField
+  FieldIndex field
+
+CachedMetaData
+  keyId CachedKeyId Eq
+  fieldId CachedMetaFieldId Eq
+  metaValue String
+
+LastFscked
+  keyId CachedKeyId Eq
+  localFscked Int Maybe
+
+ +With this, running 1000 joins to get the associated files of 1000 +Keys took 5.6s with warm cache. (When done in the same `runSqlite` call.) Ouch! + +Update: This performance was fixed by adding `KeyIdOutdex keyId associatedFile`, +which adds a uniqueness constraint on the tuple of key and associatedFile. +With this, 1000 queries takes 0.406s. Note that persistent is probably not +actually doing a join at the SQL level, so this could be sped up using +eg, esquelito. + +Update2: Using esquelito to do a join got this down to 0.250s. + +Code: + +Compare the above with 1000 calls to `associatedFiles`, which is approximately +as fast as just opening and reading 1000 files, so will take well under +0.05s with a **cold** cache. + +So, we're looking at nearly an order of magnitude slowdown using sqlite and +persistent for associated files. OTOH, the normalized schema should +perform better when adding an associated file to a key that already has many. + +For metadata, the story is much nicer. Querying for 30000 keys that all +have a particular tag in their metadata takes 0.65s. So fast enough to be +used in views. diff --git a/doc/design/encryption.mdwn b/doc/design/encryption.mdwn new file mode 100644 index 000000000..cc0dd1684 --- /dev/null +++ b/doc/design/encryption.mdwn @@ -0,0 +1,126 @@ +This was the design doc for [[/encryption]] and is preserved for +the curious. For an example of using git-annex with an encrypted S3 remote, +see [[tips/using_Amazon_S3]]. + +[[!toc]] + +## encryption backends + +It makes sense to support multiple encryption backends. So, there +should be a way to tell what backend is responsible for a given filename +in an encrypted remote. (And since special remotes can also store files +unencrypted, differentiate from those as well.) + +The rest of this page will describe a single encryption backend using GPG. +Probably only one will be needed, but who knows? Maybe that backend will +turn out badly designed, or some other encryptor needed. Designing +with more than one encryption backend in mind helps future-proofing. + +## encryption key management + +[[!template id=note text=""" +The basis of this scheme was originally developed by Lars Wirzenius et al +[for Obnam](http://liw.fi/obnam/encryption/). +"""]] + +Data is encrypted by GnuPG, using a symmetric cipher. The cipher is +generated by GnuPG when the special remote is created. By default the +best entropy pool is used, hence the generation may take a while; One +can use `initremote` with `highRandomQuality=false` or `--fast` options +to speed up things, but at the expense of using random numbers of a +lower quality. The generated cipher is then checked into your git +repository, encrypted using one or more OpenPGP public keys. This scheme +allows new OpenPGP private keys to be given access to content that has +already been stored in the remote. + +Different encrypted remotes need to be able to each use different ciphers. +Allowing multiple ciphers to be used within a single remote would add a lot +of complexity, so is not planned to be supported. +Instead, if you want a new cipher, create a new S3 bucket, or whatever. +There does not seem to be much benefit to using the same cipher for +two different encrypted remotes. + +So, the encrypted cipher could just be stored with the rest of a remote's +configuration in `remotes.log` (see [[internals]]). When `git +annex intiremote` makes a remote, it can generate a random symmetric +cipher, and encrypt it with the specified gpg key. To allow another gpg +public key access, update the encrypted cipher to be encrypted to both gpg +keys. + +## filename enumeration + +If the names of files are encrypted or securely hashed, or whatever is +chosen, this makes it harder for git-annex (let alone untrusted third parties!) +to get a list of the files that are stored on a given enrypted remote. +But, does git-annex really ever need to do such an enumeration? + +Apparently not. `git annex unused --from remote` can now check for +unused data that is stored on a remote, and it does so based only on +location log data for the remote. This assumes that the location log is +kept accurately. + +What about `git annex fsck --from remote`? Such a command should be able to, +for each file in the repository, contact the encrypted remote to check +if it has the file. This can be done without enumeration, although it will +mean running gpg once per file fscked, to get the encrypted filename. + +So, the files stored in the remote should be encrypted. But, it needs to +be a repeatable encryption, so they cannot just be gpg encrypted, that +would yeild a new name each time. Instead, HMAC is used. Any hash could +be used with HMAC. SHA-1 is the default, but [[other_hashes|/encryption]] +can be chosen for new remotes. + +It was suggested that it might not be wise to use the same cipher for both +gpg and HMAC. Being paranoid, it's best not to tie the security of one +to the security of the other. So, the encrypted cipher described above is +actually split in two; half is used for HMAC, and half for gpg. + +---- + +Does the HMAC cipher need to be gpg encrypted? Imagine if it were +stored in plainext in the git repository. Anyone who can access +the git repository already knows the actual filenames, and typically also +the content hashes of annexed content. Having access to the HMAC cipher +could perhaps be said to only let them verify that data they already +know. + +While this seems a pretty persuasive argument, I'm not 100% convinced, and +anyway, most times that the HMAC cipher is needed, the gpg cipher is also +needed. Keeping the HMAC cipher encrypted does slow down two things: +dropping content from encrypted remotes, and checking if encrypted remotes +really have content. If it's later determined to be safe to not encrypt the +HMAC cipher, the current design allows changing that, even for existing +remotes. + +## other use of the symmetric cipher + +The symmetric cipher can be used to encrypt other content than the content +sent to the remote. In particular, it may make sense to encrypt whatever +access keys are used by the special remote with the cipher, and store that +in remotes.log. This way anyone whose gpg key has been given access to +the cipher can get access to whatever other credentials are needed to +use the special remote. + +## risks + +A risk of this scheme is that, once the symmetric cipher has been +obtained, it allows full access to all the encrypted content. Indeed +anyone owning a key that used to be granted access could already have +decrypted the cipher and stored a copy. While it is in possible to +remove a key with `keyid-=`, it is designed for a +[[completely_different_purpose|/encryption]] and does not actually revoke +access. + +If git-annex stores the decrypted symmetric cipher in memory, then there +is a risk that it could be intercepted from there by an attacker. Gpg +ameliorates these type of risks by using locked memory. For git-annex, note +that an attacker with local machine access can tell at least all the +filenames and metadata of files stored in the encrypted remote anyway, +and can access whatever content is stored locally. + +This design does not support obfuscating the size of files by chunking +them, as that would have added a lot of complexity, for dubious benefits. +If the untrusted party running the encrypted remote wants to know file sizes, +they could correlate chunks that are accessed together. Encrypting data +changes the original file size enough to avoid it being used as a direct +fingerprint at least. diff --git a/doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment b/doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment new file mode 100644 index 000000000..f2ecc46d0 --- /dev/null +++ b/doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-04-03T20:03:14Z" + content=""" +New encryption keys could be used for different directories/files/patterns/times/whatever. One could then encrypt this new key for the public keys of other people/machines and push them out along with the actual data. This would allow some level of access restriction or future revocation. git-annex would need to keep track of which files can be decrypted with which keys. I am undecided if that information needs to be encrypted or not. + +Encrypted object files should be checksummed in encrypted form so that it's possible to verify integrity without knowing any keys. Same goes for encrypted keys, etc. + +Chunking files in this context seems like needless overkill. This might make sense to store a DVD image on CDs or similar, at some point. But not for encryption, imo. Coming up with sane chunk sizes for all use cases is literally impossible and as you pointed out, correlation by the remote admin is trivial. +"""]] diff --git a/doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment b/doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment new file mode 100644 index 000000000..d5461e23c --- /dev/null +++ b/doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-05T18:41:49Z" + content=""" +I see no use case for verifying encrypted object files w/o access to the encryption key. And possible use cases for not allowing anyone to verify your data. + +If there are to be multiple encryption keys usable within a single encrypted remote, than they would need to be given some kind of name (a since symmetric key is used, there is no pubkey to provide a name), and the name encoded in the files stored in the remote. While certainly doable I'm not sold that adding a layer of indirection is worthwhile. It only seems it would be worthwhile if setting up a new encrypted remote was expensive to do. Perhaps that could be the case for some type of remote other than S3 buckets. +"""]] diff --git a/doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment b/doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment new file mode 100644 index 000000000..d3c483fdf --- /dev/null +++ b/doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-04-05T23:24:17Z" + content=""" +Assuming you're storing your encrypted annex with me and I with you, our regular cron jobs to verify all data will catch corruption in each other's annexes. + +Checksums of the encrypted objects could be optional, mitigating any potential attack scenarios. + +It's not only about the cost of setting up new remotes. It would also be a way to keep data in one annex while making it accessible only in a subset of them. For example, I might need some private letters at work, but I don't want my work machine to be able to access them all. +"""]] diff --git a/doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment b/doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment new file mode 100644 index 000000000..14eb1acac --- /dev/null +++ b/doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-04-07T19:59:30Z" + content=""" +@Richard the easy way to deal with that scenario is to set up a remote that work can access, and only put in it files work should be able to see. Needing to specify which key a file should be encrypted to when putting it in a remote that supported multiple keys would add another level of complexity which that avoids. + +Of course, the right approach is probably to have a separate repository for work. If you don't trust it with seeing file contents, you probably also don't trust it with the contents of your git repository. +"""]] diff --git a/doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment b/doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment new file mode 100644 index 000000000..ff579f49b --- /dev/null +++ b/doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkS6aFVrEwOrDuQBTMXxtGHtueA69NS_jo" + nickname="Hans" + subject="using sshfs + cryptmount is more secure" + date="2012-08-14T13:41:47Z" + content=""" +\"For git-annex, note that an attacker with local machine access can tell at least all the filenames and metadata of files stored in the encrypted remote anyway, and can access whatever content is stored locally.\" + +Better security is given by sshfs + cryptmount, which I used when I recently setup a git-annex repository on a free shell account from a provider I do not trust. + +See http://code.cjb.net/free-secure-online-backup.html for what I did to get a really secure solution. + +Kind regards, + +Hans Ekbrand +"""]] diff --git a/doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment b/doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment new file mode 100644 index 000000000..a2c7013fb --- /dev/null +++ b/doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 6" + date="2012-08-14T14:10:40Z" + content=""" +Hans, + +You are misunderstanding how git-annex encryption works. The \"untrusted host\" and the \"local machine\" are not the same machine. git-annex only transfers pre-encrypted files to the \"untrusted host\". + +You should setup a git-annex encrypted remote and watch how it works so you can see for yourself that it is not insecure. + +Your solution does not provide better security, it accomplishes the same thing as git-annex in a more complicated way. In addition, since you are mounting the image from the client your solution will not work with multiple clients. +"""]] diff --git a/doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment b/doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment new file mode 100644 index 000000000..259214495 --- /dev/null +++ b/doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkS6aFVrEwOrDuQBTMXxtGHtueA69NS_jo" + nickname="Hans" + subject="comment 7" + date="2012-08-15T19:16:10Z" + content=""" +Justin, + +thanks for clearing that up. It's great that git-annex has implemented mechanisms to work securely on untrusted hosts. My solution is thus only interesting for files that are impractical to manage with git-annex (e.g. data for/from applications that need rw-access to a large number of files). And, possibly, for providers that do not provide rsync. + +Your remark that my solution does not work with more than one client, is not entirely accurate. No more than one client can access the repository at any given time, but as long as access is not simultaneous, any number of clients can access the repository. Still, your point is taken, it's a limitation I should mention. + +It would be interesting to compare the performance of individually encrypted files to encrypted image-file. My intuition says that encrypted image-file should be faster, but that's just a guess. +"""]] diff --git a/doc/design/external_special_remote_protocol.mdwn b/doc/design/external_special_remote_protocol.mdwn new file mode 100644 index 000000000..6fe09ff7c --- /dev/null +++ b/doc/design/external_special_remote_protocol.mdwn @@ -0,0 +1,293 @@ +Communication between git-annex and a program implementing an external +special remote uses this protocol. + +[[!toc]] + +## starting the program + +The external special remote program has a name like +`git-annex-remote-$bar`. When +`git annex initremote foo type=external externaltype=$bar` is run, +git-annex finds the appropriate program in PATH. + +The program is started by git-annex when it needs to access the special +remote, and may be left running for a long period of time. This allows +it to perform expensive setup tasks, etc. Note that git-annex may choose to +start multiple instances of the program (eg, when multiple git-annex +commands are run concurrently in a repository). + +## protocol overview + +Communication is via stdin and stdout. Therefore, the external special +remote must avoid doing any prompting, or outputting anything like eg, +progress to stdout. (Such stuff can be sent to stderr instead.) + +The protocol is line based. Messages are sent in either direction, from +git-annex to the special remote, and from the special remote to git-annex. + +In order to avoid confusing interactions, one or the other has control +at any given time, and is responsible for sending requests, while the other +only sends replies to the requests. + +Each protocol line starts with a command, which is followed by the +command's parameters (a fixed number per command), each separated by a +single space. The last parameter may contain spaces. Parameters may be +empty, but the separating spaces are still required in that case. + +## example session + +The special remote is responsible for sending the first message, indicating +the version of the protocol it is using. + + VERSION 1 + +Once it knows the version, git-annex will generally +send a message telling the special remote to start up. +(Or it might send a INITREMOTE, so don't hardcode this order.) + + PREPARE + +The special remote can now ask git-annex for its configuration, as needed, +and check that it's valid. git-annex responds with the configuration values + + GETCONFIG directory + VALUE /media/usbdrive/repo + GETCONFIG automount + VALUE true + +Once the special remote is satisfied with its configuration and is +ready to go, it tells git-annex. + + PREPARE-SUCCESS + +Now git-annex will tell the special remote what to do. Let's suppose +it wants to store a key. + + TRANSFER STORE somekey tmpfile + +The special remote can continue sending messages to git-annex during this +transfer. It will typically send progress messages, indicating how many +bytes have been sent: + + PROGRESS 10240 + PROGRESS 20480 + +Once the key has been stored, the special remote tells git-annex the result: + + TRANSFER-SUCCESS STORE somekey + +Once git-annex is done with the special remote, it will close its stdin. +The special remote program can then exit. + +## git-annex request messages + +These are messages git-annex sends to the special remote program. +None of these messages require an immediate reply. The special +remote can send any messages it likes while handling the requests. + +Once the special remote has finished performing the request, it should +send one of the corresponding replies listed in the next section. + +The following requests *must* all be supported by the special remote. + +* `INITREMOTE` + Request that the remote initialize itself. This is where any one-time + setup tasks can be done, for example creating an Amazon S3 bucket. + Note: This may be run repeatedly over time, as a remote is initialized in + different repositories, or as the configuration of a remote is changed. + (Both `git annex initremote` and `git-annex enableremote` run this.) + So any one-time setup tasks should be done idempotently. +* `PREPARE` + Tells the special remote it's time to prepare itself to be used. + Only INITREMOTE can come before this. +* `TRANSFER STORE|RETRIEVE Key File` + Requests the transfer of a key. For Send, the File is the file to upload; + for Receive the File is where to store the download. + Note that the File should not influence the filename used on the remote. + The filename will not contain any whitespace. + Multiple transfers might be requested by git-annex, but it's fine for the + program to serialize them and only do one at a time. +* `CHECKPRESENT Key` + Requests the remote check if a key is present in it. +* `REMOVE Key` + Requests the remote remove a key's contents. + +The following requests can optionally be supported. If not handled, +replying with `UNSUPPORTED-REQUEST` is acceptable. + +* `GETCOST` + Requests the remote return a use cost. Higher costs are more expensive. + (See Config/Cost.hs for some standard costs.) +* `GETAVAILABILITY` + Requests the remote send back an `AVAILABILITY` reply. + If the remote replies with `UNSUPPORTED-REQUEST`, its availability + is asssumed to be global. So, only remotes that are only reachable + locally need to worry about implementing this. + +More optional requests may be added, without changing the protocol version, +so if an unknown request is seen, reply with `UNSUPPORTED-REQUEST`. + +## special remote replies + +These should be sent only in response to the git-annex request messages. +They do not have to be sent immediately after the request; the special +remote can send its own requests (listed in the next section below) +while it's handling a request. + +* `PREPARE-SUCCESS` + Sent as a response to PREPARE once the special remote is ready for use. +* `PREPARE-FAILURE ErrorMsg` + Sent as a response to PREPARE if the special remote cannot be used. +* `TRANSFER-SUCCESS STORE|RETRIEVE Key` + Indicates the transfer completed successfully. +* `TRANSFER-FAILURE STORE|RETRIEVE Key ErrorMsg` + Indicates the transfer failed. +* `CHECKPRESENT-SUCCESS Key` + Indicates that a key has been positively verified to be present in the + remote. +* `CHECKPRESENT-FAILURE Key` + Indicates that a key has been positively verified to not be present in the + remote. +* `CHECKPRESENT-UNKNOWN Key ErrorMsg` + Indicates that it is not currently possible to verify if the key is + present in the remote. (Perhaps the remote cannot be contacted.) +* `REMOVE-SUCCESS Key` + Indicates the key has been removed from the remote. May be returned if + the remote didn't have the key at the point removal was requested. +* `REMOVE-FAILURE Key ErrorMsg` + Indicates that the key was unable to be removed from the remote. +* `COST Int` + Indicates the cost of the remote. +* `AVAILABILITY GLOBAL|LOCAL` + Indicates if the remote is globally or only locally available. + (Ie stored in the cloud vs on a local disk.) +* `INITREMOTE-SUCCESS` + Indicates the INITREMOTE succeeded and the remote is ready to use. +* `INITREMOTE-FAILURE ErrorMsg` + Indicates that INITREMOTE failed. +* `UNSUPPORTED-REQUEST` + Indicates that the special remote does not know how to handle a request. + +## special remote messages + +These messages may be sent by the special remote at any time that it's +in control. + +* `VERSION Int` + Supported protocol version. Current version is 1. Must be sent first + thing at startup, as until it sees this git-annex does not know how to + talk with the special remote program! +* `PROGRESS Int` + Indicates the current progress of the transfer (in bytes). May be repeated + any number of times during the transfer process, but it's wasteful to + update the progress until at least another 1% of the file has been sent. + This is highly recommended for STORE. (It is optional but good for RETRIEVE.) + (git-annex does not send a reply to this message.) +* `DIRHASH Key` + Gets a two level hash associated with a Key. Something like "abc/def". + This is always the same for any given Key, so can be used for eg, + creating hash directory structures to store Keys in. + (git-annex replies with VALUE followed by the value.) +* `SETCONFIG Setting Value` + Sets one of the special remote's configuration settings. + Normally this is sent during INITREMOTE, which allows these settings + to be stored in the git-annex branch, so will be available if the same + special remote is used elsewhere. (If sent after INITREMOTE, the changed + configuration will only be available while the remote is running.) +* `GETCONFIG Setting` + Gets one of the special remote's configuration settings, which can have + been passed by the user when running `git annex initremote`, or + can have been set by a previous SETCONFIG. Can be run at any time. + (git-annex replies with VALUE followed by the value. If the setting is + not set, the value will be empty.) +* `SETCREDS Setting User Password` + When some form of user and password is needed to access a special remote, + this can be used to securely store them for later use. + (Like SETCONFIG, this is normally sent only during INITREMOTE.) + The Setting indicates which value in a remote's configuration can be + used to store the creds. + Note that creds are normally only stored in the remote's configuration + when it's surely safe to do so; when gpg encryption is used, in which + case the creds will be encrypted using it. If creds are not stored in + the configuration, they'll only be stored in a local file. + (embedcreds can be set to yes by the user or by SETCONFIG to force + the creds to be stored in the remote's configuration). +* `GETCREDS Setting` + Gets any creds that were previously stored in the remote's configuration + or a file. + (git-annex replies with "CREDS User Password". If no creds are found, + User and Password are both empty.) +* `GETUUID` + Queries for the UUID of the special remote being used. + (git-annex replies with VALUE followed by the UUID.) +* `GETGITDIR` + Queries for the path to the git directory of the repository that + is using the external special remote. + (git-annex replies with VALUE followed by the path.) +* `SETWANTED PreferredContentExpression` + Can be used to set the preferred content of a repository. Normally + this is not configured by a special remote, but it may make sense + in some situations to hint at the kind of content that should be stored + in the special remote. Note that if a unparsable expression is set, + git-annex will ignore it. +* `GETWANTED` + Gets the current preferred content setting of the repository. + (git-annex replies with VALUE followed by the preferred content + expression.) +* `SETSTATE Key Value` + Can be used to store some form of state for a Key. The state stored + can be anything this remote needs to store, in any format. + It is stored in the git-annex branch. Note that this means that if + multiple repositories are using the same special remote, and store + different state, whichever one stored the state last will win. Also, + it's best to avoid storing much state, since this will bloat the + git-annex branch. Most remotes will not need to store any state. +* `GETSTATE Key` + Gets any state that has been stored for the key. + (git-annex replies with VALUE followed by the state.) +* `DEBUG message` + Tells git-annex to display the message if --debug is enabled. + +## general messages + +These messages can be sent at any time by either git-annex or the special +remote. + +* `ERROR ErrorMsg` + Generic error. Can be sent at any time if things get too messed up + to continue. When possible, use a more specific reply from the list above. + The special remote program should exit after sending this, as + git-annex will not talk to it any further. If the program receives + an ERROR from git-annex, it can exit with its own ERROR. + +## long running network connections + +Since an external special remote is started only when git-annex needs to +access the remote, and then left running, it's ok to open a network +connection in the PREPARE stage, and continue to use that network +connection as requests are made. + +If you're unable to open a network connection, or the connection closes, +perhaps because the network is down, it's ok to fail to perform any +requests. Or you can try to reconnect when a new request is made. + +Note that the external special remote program may be left running for +quite a long time, especially when the git-annex assistant is using it. +The assistant will detect when the system connects to a network, and will +start a new process the next time it needs to use a remote. + +## TODO + +* When storing encrypted files stream the file up/down the pipe, rather + than using a temp file. Will probably involve less space and disk IO, + and makes the progress display better, since the encryption can happen + concurrently with the transfer. Also, no need to use PROGRESS in this + scenario, since git-annex can see how much data it has sent/received from + the remote. However, \n and probably \0 need to be escaped somehow in the + file data, which adds complication. +* uuid discovery during INITREMOTE. +* Support for splitting files into chunks. +* Support for getting and setting the list of urls that can be associated + with a key. +* Hook into webapp. Needs a way to provide some kind of prompt to the user + in the webapp, etc. diff --git a/doc/design/external_special_remote_protocol/comment_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment b/doc/design/external_special_remote_protocol/comment_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment new file mode 100644 index 000000000..58c337ccd --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 11" + date="2014-01-13T18:45:34Z" + content=""" +I've handled the cloud repo check by making external special remotes be assumed by default to be globally available via the cloud. So no need to do anything in most cases. For remotes that are only available locally, the remote can reply with \"AVAILABILITY LOCAL\" when git-annex sends an AVAILABILITY request. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_12_241e57092d9e5631ac0ec4dd962477a6._comment b/doc/design/external_special_remote_protocol/comment_12_241e57092d9e5631ac0ec4dd962477a6._comment new file mode 100644 index 000000000..b5b3d1bfc --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_12_241e57092d9e5631ac0ec4dd962477a6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="Feature request" + date="2014-01-11T15:41:48Z" + content=""" +The ability to mark a remote as being a \"cloud\" remote. To silence the \"Unable to download files from your other devices. Add a cloud repository\" message in the webapp. + +Maybe as simple as \"SETCONFIG cloud true\", if that is a viable implementation. + + +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_12_e3029c65d34f78272bc11961ebfd8237._comment b/doc/design/external_special_remote_protocol/comment_12_e3029c65d34f78272bc11961ebfd8237._comment new file mode 100644 index 000000000..e8d0dcfe8 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_12_e3029c65d34f78272bc11961ebfd8237._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm_YXzEdPHzbSGVwtmTR7g1BqDtTnIBB5s" + nickname="Matthias" + subject="Chunk it" + date="2014-01-20T16:22:09Z" + content=""" +> TODO: stream the file up/down the pipe, rather than using a temp file + +You might want to use chunked transfer, i.e. a series of \"EXPECT 65536\" followed by that many bytes of binary data and an EOF marker (EXPECT-END or EXPECT 0), instead of escaping three characters (newline, NUL, and the escape prefix) and the additional unnecessary tedious per-character processing that would require. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_13_472748f03ba8dad773da7f35b70cb6e4._comment b/doc/design/external_special_remote_protocol/comment_13_472748f03ba8dad773da7f35b70cb6e4._comment new file mode 100644 index 000000000..f222349c1 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_13_472748f03ba8dad773da7f35b70cb6e4._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 13" + date="2014-02-10T18:22:55Z" + content=""" +First things first: in the documentation, I think `SETCONFIG Setting` should be `SETCONFIG Setting Value`. + +Now a few questions: + +- why have `SETCREDS` and `GETCREDS` have both a username and a password? I'd like to use them to store a OAuth token, but because of this I also have to store a dummy value, which seems weird to me. Is it possible to just do `SETCREDS oauth_token XXXYYY123456`? +- about `PROGRESS`: my remote is sending `PROGRESS xxx` every 64kb uploaded or downloaded, but no upload/download progress is displayed by git-annex. Is this normal? Should I do it myself, or will it be done by a future version of git-annex? + +Joey, thanks a lot for all your work on git-annex :) +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_14_71c3e21a72222250bab933e1c9167fbc._comment b/doc/design/external_special_remote_protocol/comment_14_71c3e21a72222250bab933e1c9167fbc._comment new file mode 100644 index 000000000..095f22537 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_14_71c3e21a72222250bab933e1c9167fbc._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 14" + date="2014-02-11T01:36:51Z" + content=""" +Schnouki, fixed SETCONFIG docs. Note that this is a wiki. :) + +I agree it's a little weird for SETCREDS to have a username and a password. This is just exposing git-annex's existing credential storage which has a tuple of values rather than using, say, a multivalue map. If you only need one it's fine to put in a dummy value for the other one. + +Re PROGRESS, it seems I hooked up the progress stuff, so it was visible in the webapp, but forgot to put up a progress display at the command line. Fixed in git. + +I look forward to seeing your special remote implementation! +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_15_c77386deddc64b2028d9c3a7393d4df7._comment b/doc/design/external_special_remote_protocol/comment_15_c77386deddc64b2028d9c3a7393d4df7._comment new file mode 100644 index 000000000..d8ecdc398 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_15_c77386deddc64b2028d9c3a7393d4df7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 15" + date="2014-02-11T13:44:10Z" + content=""" +Joey, thanks for fixing that so quickly. Indeed it works in the webapp; I'll check the CLI version as soon as possible :) + +I just released the new remote on . It's for [hubiC](https://hubic.com/), a French personal cloud storage service made by OVH that has free 25GB accounts and only charges €10/month for 10TB (VAT included). It's really experimental (hacked it over the weekend), but it seems to work for me so far. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_1_5baff75d278394a8818c348fb4f13b8a._comment b/doc/design/external_special_remote_protocol/comment_1_5baff75d278394a8818c348fb4f13b8a._comment new file mode 100644 index 000000000..aa2e85d90 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_1_5baff75d278394a8818c348fb4f13b8a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="not useful for "plain directory" special remote?" + date="2013-12-16T20:10:16Z" + content=""" +It says: \"Note that the File should not influence the filename used on the remote. The filename used should be derived from the Key.\" + +Thus this interface might not be useful to implement [[todo/New special remote suggeston - clean directory]]? The clean directory special remote would just do that: save $key content on the remote under the filename $file. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_2_70429b7c4f1e4083a9d5a6e2e238056d._comment b/doc/design/external_special_remote_protocol/comment_2_70429b7c4f1e4083a9d5a6e2e238056d._comment new file mode 100644 index 000000000..032136b02 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_2_70429b7c4f1e4083a9d5a6e2e238056d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-16T20:42:23Z" + content=""" +That's not how special remotes work -- they have nothing to do with the symlinks in the work tree, which are managed by git (or git-annex in direct mode). They only store values for keys. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_3_c763e44d06d9f50f0d357889b180b819._comment b/doc/design/external_special_remote_protocol/comment_3_c763e44d06d9f50f0d357889b180b819._comment new file mode 100644 index 000000000..08d405c8e --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_3_c763e44d06d9f50f0d357889b180b819._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="Feature requests" + date="2013-12-28T13:57:35Z" + content=""" +PREPARE-Failure ErrorMsg (matching INITREMOTE-FAILURE ErrorMsg) + +Also, i'd like for the following to overwrite existing credentials/configs +MYFOLDER=\"testfolder\" MYLOGIN=\"login\" MYPASSWORD=\"pword\" MYURL=\"http://webdav/\" git annex enableremote owncloud type=external externaltype=owncloud --debug + +This would also be needed for refreshing oauth. + + +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_4_20ff41d82b5f1872698a5b24adcd0c41._comment b/doc/design/external_special_remote_protocol/comment_4_20ff41d82b5f1872698a5b24adcd0c41._comment new file mode 100644 index 000000000..6597294fb --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_4_20ff41d82b5f1872698a5b24adcd0c41._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 4" + date="2013-12-29T17:50:23Z" + content=""" +Added PREPARE-FAILURE + +git-annex enableremote causes INITREMOTE to be called, so any credentials can be stored etc. (Note that, as with built-in special remotes, credentials are only stored in the git-annex branch when the remote is encrypted. Otherwise, they're stored locally in a .git/annex/creds/ file.) + +Also, I'd recommend using environment variables for passing credentials to initremote/enableremote, because that avoids leaking them in `ps`.. but it probably doesn't make sense to use environment variables for other settings, but instead pass them as parameters of initremote/enableremote, which can be looked up using GETCONFIG. Only exception might be if the setting needs to vary between different machines. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_5_3ee158e548002badae5bf44dc0442626._comment b/doc/design/external_special_remote_protocol/comment_5_3ee158e548002badae5bf44dc0442626._comment new file mode 100644 index 000000000..fcc70a186 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_5_3ee158e548002badae5bf44dc0442626._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="Feature requests" + date="2013-12-31T14:05:07Z" + content=""" +Hook should be able to set default configuration for itself. + +For instance, clean flickr hook will only upload some files(notably pictures). The user shouldn't have to manage that. + +Other hooks have a maximum filesize(though i guess that doesn't matter once splitting works). + +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment b/doc/design/external_special_remote_protocol/comment_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment new file mode 100644 index 000000000..f57bfabbc --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 6" + date="2013-12-31T17:56:34Z" + content=""" +I suppose you're talking about preferred content settings. + +I think that it makes sense for hooks to use existing git-annex plumbing etc when it's available. So a hook could just run `git annex wanted` to manage its preferred content. + +The only problem is that a hook does not currently have a way to discover the UUID of the repository! So I've added a GETUUID to cover this and other use cases. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_7_edb649d0019a061ef7bf6534a444429d._comment b/doc/design/external_special_remote_protocol/comment_7_edb649d0019a061ef7bf6534a444429d._comment new file mode 100644 index 000000000..4e9f91c42 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_7_edb649d0019a061ef7bf6534a444429d._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="comment 7" + date="2013-12-31T18:20:32Z" + content=""" +I think the hook running anything in shell, to interact with git annex, is a mistake. + +I see a lot more potential pitfalls and mistakes(especially crossplatform). + +It should be the existing git annex plumbing (preferred content) as you say. I just really think it should be configurable in the protocol, instead of a having to run a shell command. + +Since you have made this advanced protocol i really see it as a mistake to do anything between the hook and git-annex outside of the protocol, it makes much more sense to have all their interactions happen within the protocol. + +IMO anyways. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment b/doc/design/external_special_remote_protocol/comment_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment new file mode 100644 index 000000000..f9803bee0 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 8" + date="2013-12-31T19:16:16Z" + content=""" +It makes sense to only implement one interface to things, unless there is a reason such as performance to do otherwise. +"""]] diff --git a/doc/design/external_special_remote_protocol/comment_9_15c4cfe064be37cc104dcb6aa049a449._comment b/doc/design/external_special_remote_protocol/comment_9_15c4cfe064be37cc104dcb6aa049a449._comment new file mode 100644 index 000000000..cc3f7dd23 --- /dev/null +++ b/doc/design/external_special_remote_protocol/comment_9_15c4cfe064be37cc104dcb6aa049a449._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 9" + date="2014-01-02T00:15:28Z" + content=""" +Tobias made some good points: + +* git-annex may not be in PATH depending on installation method +* It would in theory be bad if a special remote ran some git-annex command that used the special remote and ran some git-annex command [...]. +* git-annex would need to tell the special remote what git repo it was being used with. + +So, added GETWANTED and SETWANTED. However, if I find myself recapitulating a lot of git-annex's command-line plumbing stuff in this protocol, I will need to revisit this decision and find a better way. Particularly, I narrowly escaped an intractable dependency loop in [[!commit 8e3032df2d5c6ddf07e43de4b3bb89cb578ae048]]. +"""]] diff --git a/doc/design/gcrypt.mdwn b/doc/design/gcrypt.mdwn new file mode 100644 index 000000000..d5b9c064b --- /dev/null +++ b/doc/design/gcrypt.mdwn @@ -0,0 +1,8 @@ +To integrate with git-remote-gcrypt, a key thing is to have a way to map +from the gcrypt-id of an encrypted repository to a git-annex repository +uuid. + +To do this, we'll make a v5 UUID, feeding in the gcrypt-id. +The namespace used is itself a v5 UUID, generated using the URL +namespace and the URL of this page at the time this scheme was +developed: "http://git-annex.branchable.com/design/gcrypt/" diff --git a/doc/design/git-remote-daemon.mdwn b/doc/design/git-remote-daemon.mdwn new file mode 100644 index 000000000..270ceaa47 --- /dev/null +++ b/doc/design/git-remote-daemon.mdwn @@ -0,0 +1,173 @@ +# goals + +* be configured like a regular git remote, with an unusual url + or other configuration +* receive notifications when a remote has received new commits, + and take some action +* optionally, do receive-pack and send-pack to a remote that + is only accessible over an arbitrary network transport + (like assistant does with XMPP) +* optionally, send/receive git-annex objects to remote + over an arbitrary network transport + +# difficulties + +* authentication & configuration +* multiple nodes may be accessible over a single network transport, + with it desirable to sync with any/all of them. For example, with + XMPP, there can be multiple friends synced with. This means that + one git remote can map to multiple remote nodes. Specific to git-annex, + this means that a set of UUIDs known to be associated with the remote + needs to be maintained, while currently each remote can only have one + annex-uuid in .git/config. + +# payoffs + +* support [[assistant/telehash]]! +* Allow running against a normal ssh git remote. This would run + git-annex-shell on the remote, watching for changes, and so be able to + notify when a commit was pushed to the remote repo. This would let the + assistant immediately notice and pull. So the assistant would be fully + usable with a single ssh remote and no other configuration! + **do this first** +* clean up existing XMPP support, make it not a special case, and not + tightly tied to the assistant +* git-remote-daemon could be used independantly of git-annex, + in any git repository. + +# design + +Let git-remote-daemon be the name. Or for git-annex, +`git annex remotedaemon`. + +It runs in one of two ways: + +1. Forked to background, using a named pipe for the control protocol. +2. With --foreground, the control protocol goes over stdio. + +Either way, behavior is the same: + +* Get a list of remotes to act on by looking at .git/config +* Automatically notices when a remote has changes to branches + matching remote.$name.fetch, and pulls them down to the appropriate + location. +* When the control protocol informs it about a new ref that's available, + it offers the ref to any interested remotes. + +# control protocol + +This is an asynchronous protocol. Ie, either side can send any message +at any time, and the other side does not send a reply. + +It is line based and intended to be low volume and not used for large data. + +TODO: Expand with commands for sending/receiving git-annex objects, and +progress during transfer. + +TODO: Will probably need to add something for whatever pairing is done by +the webapp. + +## emitted messages + +* `CONNECTED uri` + + Sent when a connection has been made with a remote. + +* `DISCONNECTED uri` + + Sent when connection with a remote has been lost. + +* `SYNCING uri` + + Indicates that a pull or a push with a remote is in progress. + Always followed by DONESYNCING. + +* `DONESYNCING uri 1|0` + + Indicates that syncing with a remote is done, and either succeeded + (1) or failed (0). + +* `WARNING uri string` + + A message to display to the user about a remote. + +## consumed messages + +* `PAUSE` + + The user has requested a pause. + git-remote-daemon should close connections and idle. + +* `LOSTNET` + + The network connection has been lost. + git-remote-daemon should close connections and idle. + +* `RESUME` + + Undoes PAUSE or LOSTNET. + Start back up network connections. + +* `CHANGED ref ...` + + Indicates that a ref is new or has changed. These can be offered to peers, + and peers that are interested in them can pull the content. + +* `RELOAD` + + Indicates that configs have changed. Daemon should reload .git/config + and/or restart. + + Possible config changes include adding a new remote, removing a remote, + or setting `remote..annex-sync` to configure whether to sync with a + particular remote. + +* `STOP` + + Shut down git-remote-daemon + + (When using stdio, it also should shutdown when it reaches EOF on + stdin.) + +# encryption & authentication + +For simplicity, the network transports have to do their own end-to-end +encryption. Encryption is not part of this design. + +(XMPP does not do end-to-end encryption, but might be supported +transitionally.) + +Ditto for authentication that we're talking to who we intend to talk to. +Any public key data etc used for authentication is part of the remote's +configuration (or hidden away in a secure chmodded file, if necessary). +This design does not concern itself with authenticating the remote node, +it just takes the auth token and uses it. + +For example, in telehash, each node has its own keypair, which is used +or authentication and encryption, and is all that's needed to route +messages to that node. + +# network level protocol + +How do peers communicate with one another over the network? + +This seems to need to be network-layer dependant. Telehash will need +one design, and git-annex-shell on a central ssh server has a very different +(and much simpler) design. + +## ssh + +`git-annex-shell notifychanges` is run, and speaks a simple protocol +over stdio to inform when refs on the remote have changed. + +No pushing is done for CHANGED, since git handles ssh natively. + +TODO: test! + +## telehash + +TODO + +## xmpp + +Reuse [[assistant/xmpp]] diff --git a/doc/design/git-remote-daemon/comment_1_bfa8f33a3fdb6e271dfbdd0378b5d364._comment b/doc/design/git-remote-daemon/comment_1_bfa8f33a3fdb6e271dfbdd0378b5d364._comment new file mode 100644 index 000000000..d93bab090 --- /dev/null +++ b/doc/design/git-remote-daemon/comment_1_bfa8f33a3fdb6e271dfbdd0378b5d364._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="Rolling hash chunking" + date="2014-04-04T14:16:25Z" + content=""" +I am not sure which page is the best for this comment, but this one seems somewhat relevant. + +Given that a future telehash implementation may download files from multiple peers, it might be a good idea to download files in chunks, possibly in parallel. In this case, it might be a good idea to use a rolling hash for chunking (like rsync et al). [There is a package for that on Hackage](http://hackage.haskell.org/package/hash-0.2.0.1/docs/Data-Hash-Rolling.html). + +git-annex could store a list of chunk checksums in `.git/annex/objects/…/SHA….chunks` whenever the repository holds a copy of the file. The checksum list would be a small fraction of the file in size, but all the checksum lists for all the files in a repository might take up too much space to store in the `git-annex` branch. + +When getting an object, git-annex could first download the `.chunks` file from a remote/peer and then proceed to download missing chunks in a BitTorrent-like fashion. + +If git-annex has an idea about what locally present object might be an earlier version of the file, it could compare the checksum lists and only download the parts that have changed (à la rsync). +"""]] diff --git a/doc/design/metadata.mdwn b/doc/design/metadata.mdwn new file mode 100644 index 000000000..10e79b9f8 --- /dev/null +++ b/doc/design/metadata.mdwn @@ -0,0 +1,196 @@ +[[!toc]] + +# metadata + +Attach an arbitrary set of metadata to a key. This consists of any number +of fields. Each field has an unordered set of values. The special field +"tag" has as its values any tags that are set for the key. + +Store in git-annex branch, next to location log files. + +Storage needs to support union merging, including removing an old value +of a field, and adding a new value of a field. + +# filtered branches + +See [[tips/metadata_driven_views]] + +The reason to use specially named filtered branches is because it makes +self-documenting how the repository is currently filtered. + +## unmatched files in filtered branches + +TODO Files not matching the view should be able to be included in +the filtered branch, in a special location, an "other" directory. + +For example, it could make a "other" directory containing files +without a tag when viewing by tag. + +It might be nice, if in a two level view, for the other directories +to nest. For example, `other/2014/file`. However, that leads to a +performance problem: When adding a level to a view, it has to look at each +file in the "other" directory and generate a view for it too. With a lot +of files, that'd be slow. + +Instead, why not replicate the parent branch's directory structure inside +the "other" directory? Then the directory tree only has to be constructed +once, and can be left alone when refining a view. + +## operations while on filtered branch + +* If files are removed and git commit called, git-annex should remove the + relevant metadata from the files. **done** + (Currently, only metadata used for visible subdirs is added and removed + this way.) + (Also, this is not usable in direct mode because deleting the + file.. actually deletes it...) +* If a file is moved into a new subdirectory while in a view branch, + a tag is added with the subdir name. This allows on the fly tagging. + **done** +* `git annex sync` should avoid pushing out the view branch, but + it should check if there are changes to the metadata pulled in, and update + the branch to reflect them. + +## automatically added metadata + +When annex.genmetadata is set, git annex add automatically attaches +some metadata to a file. Currently year and month fields, from its mtime. + +There's also a post-commit-annex hook script. + +## directory hierarchy metadata + +From the original filename used in the master branch, when +constructing a view, generate fields. For example foo/bar/baz.mp3 +would get /=foo, foo/=bar, foo/bar/=baz, and .=mp3. + +Note that dir/=subdir allows a view to use `dir/=*` and only +match one level of subdirs with the glob. So is better than dir=foo/bar +as the metadata. (Alternatively, could do special glob matching.) + +This allows using whatever directory hierarchy exists to inform the view, +without locking the view into using it. + +Complication: When refining a view, it only looks at the filenames in +the view, so it has to map from +those filenames to derive the same metadata, unless there is persistent +storage. Luckily, the filenames used in the views currently include the +subdirs. + +# other uses for metadata + +Uses are not limited to view branches. + +`git annex checkoutmeta year=2014 talk` in a subdir of master could create the +same tree of files filter would. The user can then commit that if desired. +Or, they could run additional commands like `git annex fadd` to refine the +tree of files in the subdir. + +Metadata can be used for configuring numcopies. One way would be a +numcopies=n value attached to a file. But perhaps better would be to make +the numcopies.log allow configuring numcopies based on which files have +other metadata. + +Other programs could query git-annex for the metadata of files in the work +tree, and do whatever it wants with it. + +# filenames + +The hard part of this is actually getting a useful filename to put in the +view branch, since git-annex only has a key which the user will not +want to see. + +* Could use filename metadata for the key, recorded by git-annex add (which + may not correspond to filenames being used in regular git branches like + master for the key). +* Could use the .map files to get a filename, but this is somewhat + arbitrary (.map can contain multiple filenames), and is only + currently supported in direct mode. +* Current approach: Have a reference branch (eg master) and walk it to + find filenames and + keys. Fine as long as it can be done efficiently. Also allows including + the subdirectory a file is in, potentially. cwebber points out that this + is essentially a form of tracking branch. Which implies it will need to + be updatable when the reference branch changes. Should be doable via + diff-tree. + +Note that we have to take care to avoid generating conflicting filenames. +The current approach is to embed the full directory structure inside the +filename in the view branch. + +## union merge properties + +While the storage could just list all the current values of a field on a +line with a timestamp, that's not good enough. Two disconnected +repositories can make changes to the values of a field (setting and +unsetting tags for example) and when this is union merged back together, +the changes need to be able to be replayed in order to determine which +values we end up with. + +To make that work, we log not only when a field is set to a value, +but when a value is unset as well. + +For example, here two different remotes added tags, and then later +a tag was removed: + + 1287290776.765152s tag +foo +bar + 1287290991.152124s tag +baz + 1291237510.141453s tag -bar + +# efficient metadata lookup + +Looking up metadata for view generation so far requires traversing all keys +in the git-annex branch. This is slow. A fast cache is needed. + +TODO + +# direct mode issues + +TODO (direct mode is currently not supported with view branches) + +Checking out a view branch can result in any number of copies of a file +appearing in different directories. No problem in indirect mode, but +in direct mode these are real, expensive copies. + +But, it's worth supporting direct mode! + +So, possible approaches: + +* Before checking out a view branch, calculate how much space will + be used by duplicates and refuse if not enough is free. +* Only check out one file, and omit the copies. Keep track of which + files were omitted, and make sure that when committing on the branch, + that metadata is not removed. Has the downside that files can seem + to randomly move around in the tree as their metadata changes. +* Disallow view branch checkouts that have duplicate files. + This would cripple it some, but perhaps not too badly? + +# gotchas + +* Checking out a view branch can remove the current subdir. May be worth + detecting when this happens and help the user. + **done** + +* Git has a complex set of rules for what is legal in a ref name. + View branch names will need to filter out any illegal stuff. **done** + +* Metadata should be copied to the new key when adding a modified version + of a file. **done** + +* Filesystems that are not case sensative (including case preserving OSX) + will cause problems if view branches try to use different cases for + 2 directories representing a metadata field. + + Solution might be to compare fields names case-insensitively, and + pick one representation consistently. **done** + +* Assistant needs to know about views, so it can update metadata when + files are moved around inside them. TODO + +* What happens if git annex add or the assistant add a new file while on a + view? If the file is not also added to the master branch, it will be lost + when exiting the view. TODO + +* The filename mangling can result in a filename in a view + that is too long for its containing filesystem. Should detect and do + something reasonable to avoid. TODO diff --git a/doc/design/metadata/comment_1_22ed80bd8eabaa836e9dfc2432531f04._comment b/doc/design/metadata/comment_1_22ed80bd8eabaa836e9dfc2432531f04._comment new file mode 100644 index 000000000..493db4339 --- /dev/null +++ b/doc/design/metadata/comment_1_22ed80bd8eabaa836e9dfc2432531f04._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3vKzS4eOWYpKMoYXqMIjNsIg_nYF-loU" + nickname="Konubinix" + subject="Already existing metadata implementation " + date="2014-02-22T21:45:25Z" + content=""" +Hi, + +I love the idea behing storing metadata. + +I suggest to exchange ideas (and maybe code) with projects already implementing metadata systems. + +I have tried several implementations and particularly noticed tmsu (http://tmsu.org/). This tool stores tags into a sqlite database and uses also a SHA-256 fingerprint of the file to be aware of file moves. It provides a fuse view of the tags with the ability to change tags by moving files (like in the git annex metadata view). + +Paul Ruane is particularly responsive on the mailing list and he already supports git annexed files (with SHAE-256 fingerprint) (see the end of the thread https://groups.google.com/forum/#!topic/tmsu/A5EGpnCcJ2w). + +Even if you cannot reuse the project, they are interresting ideas that might be worth looking at like the implications of tags: a file tagged \"film\" being automatically tagged \"video\". + +Tagsistant (http://www.tagsistant.net/) may also be a good source of inspirations. I just don't like the fact that it uses a backstore of tagged files. + +Thanks for reading. +"""]] diff --git a/doc/design/metadata/comment_2_03ae28acedbe1fa45c366b30b58fcf48._comment b/doc/design/metadata/comment_2_03ae28acedbe1fa45c366b30b58fcf48._comment new file mode 100644 index 000000000..c222f75d3 --- /dev/null +++ b/doc/design/metadata/comment_2_03ae28acedbe1fa45c366b30b58fcf48._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2014-02-25T09:51:17Z" + content=""" +Some additional ideas for metadata... + +Instead of having a simplistic scheme like 'field=value' it might be advantageous to consider a scheme like 'attribute=XXX, value=YYY, unit=ZZZ' that way you could do intesting things with the metadata like adding counters to things, and allow for doing interesting queries like give me all 'things' tagged with a unit of \"audio_file\", this assumes one had trawled through an entire annex and then tagged all files based on type with the unix file tool or something like that. + +The above idea is already in use in irods and its a really nice and powerful way to let users add meta-data and to build up more interesting use cases and tools. + +btw, I plan on taking a look at seeing if I can map some of the meta that we have in work into this new git-annex feature to see how well/bad it works. Either way this feature looks cool! +1!!! +"""]] diff --git a/doc/design/metadata/comment_3_ee850df7d3fa4c56194f13a6e3890a30._comment b/doc/design/metadata/comment_3_ee850df7d3fa4c56194f13a6e3890a30._comment new file mode 100644 index 000000000..f77cd8611 --- /dev/null +++ b/doc/design/metadata/comment_3_ee850df7d3fa4c56194f13a6e3890a30._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2014-02-25T09:57:09Z" + content=""" +actually in your mp3 example you could have .... + +ATTRIBUTE=sample_rate, VALUE=22100, UNIT=Hertz + +another example use case is to always be consistent with the AVU order then you could stick in ntriples from RDF to do other cool things by looking up various linked data sources -- see http://www.w3.org/2001/sw/RDFCore/ntriples/ and http://www.freebase.com/, actually this would be quite cool if git-annex examined the mp3's id3 tag, the created an ntriple styled entry can be automatically parsed with the web-based annex gui and automatically pull in additional meta-data from the likes of freebase. I guess the list of ideas can just only get bigger with this potential metadata capability. +"""]] diff --git a/doc/design/metadata/comment_4_c32ade1524487e5fdc6f83b2db39f04c._comment b/doc/design/metadata/comment_4_c32ade1524487e5fdc6f83b2db39f04c._comment new file mode 100644 index 000000000..01f917ef5 --- /dev/null +++ b/doc/design/metadata/comment_4_c32ade1524487e5fdc6f83b2db39f04c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="198.164.160.48" + subject="convenient way to query metadata?" + date="2014-03-15T20:58:28Z" + content=""" +I'd like to be able to do something like \"git annex metadata -q fieldname\" and have that output the value(s) of fieldname. I see I could parse the json output but that isn't too convenient in a shell script. Or have I missed something that already exists? +"""]] diff --git a/doc/design/metadata/comment_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment b/doc/design/metadata/comment_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment new file mode 100644 index 000000000..ca98f7f41 --- /dev/null +++ b/doc/design/metadata/comment_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 5" + date="2014-03-15T21:30:52Z" + content=""" +@bremner, you must be up to something interesting.. Added metadata --get for you. +"""]] diff --git a/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment b/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment new file mode 100644 index 000000000..7be49a6a9 --- /dev/null +++ b/doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="tdussa" + ip="217.84.74.69" + subject="Why not automatically add the whole date?" + date="2014-04-30T20:41:20Z" + content=""" +Hi, + +apologies if I am missing something, but from what I understand, git-annex will automatically add the year and the month from a file's mtime to its metadata if instructed to do so. + +So... What about the day (or the time, for that matter?)? What is the reasoning behind the decision not to add those bits automatically? And, is there a way to get git-annex to add those bits of information automatically as well (besides the obvious way of creating a pre-commit-hook script to that effect)? + +THX & Cheers, +Toby. +"""]] diff --git a/doc/design/preferred_content.mdwn b/doc/design/preferred_content.mdwn new file mode 100644 index 000000000..3972b8b58 --- /dev/null +++ b/doc/design/preferred_content.mdwn @@ -0,0 +1,21 @@ +The [[preferred_content]] expressions didn't have a design document, but +it's a small non-turing complete DSL for expressing which objects a +repository prefers to contain. + +One thing that needs to be written down though is the stability analysis +that must be done of preferred content expressions. + +It's important that when a set of repositories all look at one-another's +preferred content expressions, and copy/move/drop objects to satisfy them, +they end up at a steady state. So, a given preferred content expression +should ideally evaluate to the same answer for each key, from the +perspective of each repository. + +The best way to ensure that is the case is to only use terms in preferred +content expressions that rely on state that is shared between all +repositories. So, state in the git-annex branch, or the master branch +(assuming all repositories have master checked out). + +Since git is eventually consistent, there might be disagreements about +which object belongs where, but once consistency is reached, things will +settle down. diff --git a/doc/design/requests_routing.mdwn b/doc/design/requests_routing.mdwn new file mode 100644 index 000000000..2391cfae9 --- /dev/null +++ b/doc/design/requests_routing.mdwn @@ -0,0 +1,100 @@ +## requesting content + +In some situations, nodes only want particular files, and not everything. +(Or don't have the bandwidth to get everything.) A way to handle this, +that should work in a fully ad-hoc, offline distributed network, +suggested by Vincenzo Tozzi: + +* Nodes generate a request for a specific file they want, committed + to git somewhere. +* This request has a TTL (of eg 3 or 4). +* When syncing, copy the requests that a node has, and decrease their TTL + by 1. Requests with a TTL of 0 have timed out and are not copied. + (So, requests are stored in git, but on eg, per-node branches.) +* Only copy content to nodes that have a request for it (either one + originating with them, or one they copied from another node). +* Each request indicates the requesting node, so once no nodes have an + active request for a particular file, it's ok to drop it from the + transfer nodes (honoring numcopies etc of course). + +## simulation + +A simulation of a network using this method is in [[simroutes.hs]]. + +Question: How efficient is this method? Does the network fill with many +copies that are not needed, before the request is fulfilled? + +## storing requests + +Requests could be stored in the location tracking file. + +Currently: + + time 0|1 uuid1 + time 0|1 uuid2 + +* Use negative numbers for the TTL of a request: + + time -3! uuid1 + time -2 uuid2 + + The `!` indicates that the request originated on + that node. +* To propigate a request, set -1 * (TTL+1) in the line + for the uuid of the repository that is propigating it. + This should be done as part of the git-annex branch merge, + so if a location tracking file is merged, any open requests + get propigated to the current repository automatically. +* When a requested file reaches a node that requested it, + the location is set to 1; this automatically clears the + request. +* When a file has no more originating requests, clear all + the copied requests: + + time 1 uuid1 + time -2 uuid2 + + Becomes: + + time 1 uuid1 + time' 0 uuid2 + +## generating requests + + git annex request [file...] + +Indicates that the file is wanted in the current repository. + +(git annex get could also do this on failure, or suggest doing this) + +## acting on requests + +Add a preferred content expression that looks at request data: + + requestedby=N + +Matches files that have been requested by at least N nodes. + + requested + +Matches files that the current node has requested. + +### Example preferred content expressions + +For an immobile node that accumulates files it requests, and also +temporarily stores files requested by other such nodes: + + present or requestedby=1 + +For a node that only transfers files between the immobile nodes: + + requestedby=1 + +For an immobile node that only accumulates files it requests, but never +stores files requested by other nodes: + + present or requested + +TODO: Would be nice to be able to prioritize files that more nodes are +requesting, or that have some urgent flag set. But currently there is no +way to do that; content is either preferred or not preferred. diff --git a/doc/design/requests_routing/comment_1_421b14a4dd9d6c431e00333057df1627._comment b/doc/design/requests_routing/comment_1_421b14a4dd9d6c431e00333057df1627._comment new file mode 100644 index 000000000..f2e0a857a --- /dev/null +++ b/doc/design/requests_routing/comment_1_421b14a4dd9d6c431e00333057df1627._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 1" + date="2014-05-07T06:27:10Z" + content=""" +“Nodes generate a request for a specific file they want” + +It would be also convenient to be able to “push” a file to another node you do not have direct access to by creating a request for that file on behalf of the node. +"""]] diff --git a/doc/design/requests_routing/simroutes.hs b/doc/design/requests_routing/simroutes.hs new file mode 100644 index 000000000..d91125935 --- /dev/null +++ b/doc/design/requests_routing/simroutes.hs @@ -0,0 +1,402 @@ +-- Simulation of non-flood syncing of content, across a network of nodes. + +module Main where + +import System.Random +import Control.Monad.Random +import Control.Monad +import Control.Applicative +import Data.Ratio +import Data.Ord +import Data.List +import Data.Maybe +import qualified Data.Set as S +import qualified Data.Map.Strict as M + +{- + - Tunable values + -} + +totalFiles :: Int +totalFiles = 100 + +-- How likely is a given file to be wanted by any particular node? +probabilityFilesWanted :: Probability +probabilityFilesWanted = 0.10 + +-- How many different locations can each transfer node move between? +-- (Min, Max) +transferDestinationsRange :: (Int, Int) +transferDestinationsRange = (2, 3) + +-- Controls how likely transfer nodes are to move around in a given step +-- of the simulation. +-- (They actually move slightly less because they may start to move and +-- pick the same location they are at.) +-- (Min, Max) +transferMoveFrequencyRange :: (Probability, Probability) +transferMoveFrequencyRange = (0.10, 1.00) + +-- counts both immobile and transfer nodes as hops, so double Vince's +-- theoretical TTL of 3. +-- (30% loss on mocambos network w/o ttl of 4!) +maxTTL :: TTL +maxTTL = TTL (4 * 2) + +numImmobileNodes :: Int +numImmobileNodes = 10 + +numTransferNodes :: Int +numTransferNodes = 20 + +numSteps :: Int +numSteps = 100 + +-- IO code +main :: IO () +main = do +-- initialnetwork <- evalRandIO (seedFiles totalFiles =<< genNetwork) + initialnetwork <- evalRandIO (seedFiles totalFiles =<< mocambosNetwork) + networks <- evalRandIO (simulate numSteps initialnetwork) + let finalnetwork = last networks + putStrLn $ summarize initialnetwork finalnetwork + putStrLn "location history of file 1:" + print $ trace (traceHaveFile (File 1)) networks + putStrLn "request history of file 1:" + print $ trace (traceWantFile (File 1)) networks +-- Only pure code below :) + +data Network = Network (M.Map NodeName ImmobileNode) [TransferNode] + deriving (Show, Eq) + +data ImmobileNode = ImmobileNode NodeRepo + deriving (Show, Eq) + +type NodeName = String + +type Route = [NodeName] + +data TransferNode = TransferNode + { currentlocation :: NodeName + , possiblelocations :: [NodeName] + , movefrequency :: Probability + , transferrepo :: NodeRepo + } + deriving (Show, Eq) + +data NodeRepo = NodeRepo + { wantFiles :: [Request] + , haveFiles :: S.Set File + , satisfiedRequests :: S.Set Request + } + deriving (Show, Eq) + +data File = File Int + deriving (Show, Eq, Ord) + +randomFile :: (RandomGen g) => Rand g File +randomFile = File <$> getRandomR (0, totalFiles) + +data Request = Request File TTL + deriving (Show, Ord) + +-- compare ignoring TTL +instance Eq Request where + (Request f1 _) == (Request f2 _) = f1 == f2 + +requestedFile :: Request -> File +requestedFile (Request f _) = f + +requestTTL :: Request -> TTL +requestTTL (Request _ ttl) = ttl + +data TTL = TTL Int + deriving (Show, Eq, Ord) + +incTTL :: TTL -> TTL +incTTL (TTL t) = TTL (t + 1) + +decTTL :: TTL -> TTL +decTTL (TTL t) = TTL (t - 1) + +staleTTL :: TTL -> Bool +staleTTL (TTL t) = t < 1 + +-- Origin of a request starts one higher than max, since the TTL +-- will decrement the first time the Request is transferred to another node. +originTTL :: TTL +originTTL = incTTL maxTTL + +randomRequest :: (RandomGen g) => Rand g Request +randomRequest = Request + <$> randomFile + <*> pure originTTL + +type Probability = Float + +randomProbability :: (RandomGen g) => Rand g Probability +randomProbability = getRandomR (0, 1) + +-- Returns the state of the network at each step of the simulation. +simulate :: (RandomGen g) => Int -> Network -> Rand g [Network] +simulate n net = go n [net] + where + go 0 nets = return (reverse nets) + go c (prev:nets) = do + new <- step prev + go (c - 1) (new:prev:nets) + +-- Each step of the simulation, check if each TransferNode wants to move, +-- and if so: +-- 1. It and its current location exchange their Requests. +-- 2. And they exchange any requested files. +-- 3. Move it to a new random location. +-- +-- Note: This implementation does not exchange requests between two +-- TransferNodes that both arrive at the same location at the same step, +-- and then move away in the next step. +step :: (RandomGen g) => Network -> Rand g Network +step (Network immobiles transfers) = go immobiles [] transfers + where + go is c [] = return (Network is c) + go is c (t:ts) = do + r <- randomProbability + if movefrequency t <= r + then case M.lookup (currentlocation t) is of + Nothing -> go is (c ++ [t]) ts + Just currentloc -> do + let (currentloc', t') = merge currentloc t + t'' <- move t' + go (M.insert (currentlocation t) currentloc' is) (c ++ [t'']) ts + else go is (c ++ [t]) ts + +merge :: ImmobileNode -> TransferNode -> (ImmobileNode, TransferNode) +merge (ImmobileNode ir) t@(TransferNode { transferrepo = tr }) = + ( ImmobileNode (go ir tr) + , t { transferrepo = go tr ir } + ) + where + go r1 r2 = r1 + { wantFiles = wantFiles' + , haveFiles = haveFiles' + , satisfiedRequests = satisfiedRequests' `S.union` checkSatisfied wantFiles' haveFiles' + } + where + wantFiles' = foldr addRequest (wantFiles r1) (wantFiles r2) + haveFiles' = S.foldr (addFile wantFiles' satisfiedRequests') (haveFiles r1) (haveFiles r2) + satisfiedRequests' = satisfiedRequests r1 `S.union` satisfiedRequests r2 + +-- Adds a file to the set, when there's a request for it, and the request +-- has not already been satisfied. +addFile :: [Request] -> S.Set Request -> File -> S.Set File -> S.Set File +addFile rs srs f fs + | any (\sr -> f == requestedFile sr) (S.toList srs) = fs + | any (\r -> f == requestedFile r) rs = S.insert f fs + | otherwise = fs + +-- Checks if any requests have been satisfied, and returns them, +-- to be added to satisfidRequests +checkSatisfied :: [Request] -> S.Set File -> S.Set Request +checkSatisfied want have = S.fromList (filter satisfied want) + where + satisfied r = requestTTL r == originTTL && S.member (requestedFile r) have + +-- Decrements TTL, and avoids adding request with a stale TTL, or a +-- request for an already added file with the same or a lower TTL. +addRequest :: Request -> [Request] -> [Request] +addRequest (Request f ttl) rs + | staleTTL ttl' = rs + | any (\r -> requestTTL r >= ttl) similar = rs + | otherwise = r' : other + where + ttl' = decTTL ttl + r' = Request f ttl' + (other, similar) = partition (/= r') rs + +move :: (RandomGen g) => TransferNode -> Rand g TransferNode +move t = do + newloc <- randomfrom (possiblelocations t) + return $ t { currentlocation = newloc } + +genNetwork :: (RandomGen g) => Rand g Network +genNetwork = do + let immobiles = M.fromList (zip (map show [1..]) (replicate numImmobileNodes emptyImmobile)) + transfers <- sequence (replicate numTransferNodes (mkTransfer $ M.keys immobiles)) + return $ Network immobiles transfers + +emptyImmobile :: ImmobileNode +emptyImmobile = ImmobileNode (NodeRepo [] S.empty S.empty) + +mkTransfer :: (RandomGen g) => [NodeName] -> Rand g TransferNode +mkTransfer immobiles = do + -- Transfer nodes are given random routes. May be simplistic. + -- Also, some immobile nodes will not be serviced by any transfer nodes. + numpossiblelocs <- getRandomR transferDestinationsRange + possiblelocs <- sequence (replicate numpossiblelocs (randomfrom immobiles)) + mkTransferBetween possiblelocs + +mkTransferBetween :: (RandomGen g) => [NodeName] -> Rand g TransferNode +mkTransferBetween possiblelocs = do + currentloc <- randomfrom possiblelocs + movefreq <- getRandomR transferMoveFrequencyRange + -- transfer nodes start out with no files or requests in their repo + let repo = (NodeRepo [] S.empty S.empty) + return $ TransferNode currentloc possiblelocs movefreq repo + +randomfrom :: (RandomGen g) => [a] -> Rand g a +randomfrom l = do + i <- getRandomR (1, length l) + return $ l !! (i - 1) + +-- Seeds the network with the given number of files. Each file is added to +-- one of the immobile nodes of the network at random. And, one other node, +-- at random, is selected which wants to get the file. +seedFiles :: (RandomGen g) => Int -> Network -> Rand g Network +seedFiles 0 network = return network +seedFiles n network@(Network m t) = do + (origink, ImmobileNode originr) <- randnode + (destinationk, ImmobileNode destinationr) <- randnode + let file = File n + let origin = ImmobileNode $ originr + { haveFiles = S.insert file (haveFiles originr) } + let destination = ImmobileNode $ destinationr + { wantFiles = Request file originTTL : wantFiles destinationr } + let m' = M.insert origink origin $ + M.insert destinationk destination m + seedFiles (n - 1) (Network m' t) + where + randnode = do + k <- randomfrom (M.keys m) + return (k, fromJust $ M.lookup k m) + +summarize :: Network -> Network -> String +summarize _initial@(Network origis _) _final@(Network is _ts) = format + [ ("Total wanted files", + show (sum (overis (length . findoriginreqs . wantFiles . repo)))) + , ("Wanted files that were not transferred to requesting node", + show (sum (overis (S.size . findunsatisfied . repo)))) + , ("Nodes that failed to get files", + show (map withinitiallocs $ filter (not . S.null . snd) + (M.toList $ M.map (findunsatisfied . repo) is))) + , ("Total number of files on immobile nodes at end", + show (overis (S.size . haveFiles . repo))) + --, ("Immobile nodes at end", show is) + ] + where + findoriginreqs = filter (\r -> requestTTL r == originTTL) + findunsatisfied r = + let wantedfs = S.fromList $ map requestedFile (findoriginreqs (wantFiles r)) + in S.difference wantedfs (haveFiles r) + repo (ImmobileNode r) = r + overis f = map f $ M.elems is + format = unlines . map (\(d, s) -> d ++ ": " ++ s) + + withinitiallocs (name, missingfiles) = (name, S.map addinitialloc missingfiles) + addinitialloc f = (f, M.lookup f initiallocs) + + initiallocs = M.fromList $ + concatMap (\(k, v) -> map (\f -> (f, k)) (S.toList $ haveFiles $ repo v)) $ + M.toList origis + +trace :: (Network -> S.Set NodeName) -> [Network] -> String +trace tracer networks = show $ go [] S.empty $ map tracer networks + where + go c old [] = reverse c + go c old (new:l) = go ((S.toList $ new `S.difference` old):c) new l + +traceHaveFile :: File -> Network -> S.Set NodeName +traceHaveFile f (Network m _) = S.fromList $ M.keys $ + M.filter (\(ImmobileNode r) -> f `S.member` haveFiles r) m + +traceWantFile :: File -> Network -> S.Set NodeName +traceWantFile f (Network m _) = S.fromList $ M.keys $ + M.filter (\(ImmobileNode r) -> any wantf (wantFiles r)) m + where + wantf (Request rf _ttl) = rf == f + +mocambosNetwork :: (RandomGen g) => Rand g Network +mocambosNetwork = do + let major = map (immobilenamed . fst) communities + let minor = map immobilenamed (concatMap snd communities) + majortransfer <- mapM mkTransferBetween majorroutes + minortransfer <- mapM mkTransferBetween (concatMap minorroutes (concat (replicate 5 communities))) + return $ Network + (M.fromList (major++minor)) + (majortransfer ++ minortransfer) + where + immobilenamed name = (name, emptyImmobile) + + -- As a simplification, this only makes 2 hop routes, between minor + -- and major communities; no 3-legged routes. + minorroutes :: (NodeName, [NodeName]) -> [Route] + minorroutes (major, minors) = map (\n -> [major, n]) minors + +communities :: [(NodeName, [NodeName])] +communities = + [ ("Tainá/SP", + [ "badtas" + , "vauedo ribera" + , "cofundo" + , "jao" + , "fazenda" + ] + ) + , ("Odomode/RS", + [ "moradadapaz" + , "pelotas" + ] + ) + , ("MercadoSul/DF", + [ "mesquito" + , "kalungos" + ] + ) + , ("Coco/PE", + [ "xambá" + , "alafin" + , "terreiaos" + ] + ) + , ("Linharinho/ES", + [ "monte alegne" + ] + ) + , ("Boneco/BA", + [ "barroso" + , "lagoa santa" + , "terravista" + ] + ) + , ("Zumbidospalmanes/NA", + [ "allantana" + ] + ) + , ("Casa Pneta/PA", + [ "marajó" + ] + ) + , ("Purarue/PA", + [ "oriaminá" + ] + ) + , ("Madiba/NET", []) + ] + +majorroutes :: [Route] +majorroutes = + -- person's routes + [ ["Tainá/SP", "Odomode/RS"] + , ["Tainá/SP", "MercadoSul/DF"] + , ["MercadoSul/DF", "Boneco/BA"] + , ["MercadoSul/DF", "Zumbidospalmanes/NA"] + , ["Zumbidospalmanes/NA", "Casa Pneta/PA"] + , ["Casa Pneta/PA", "Purarue/PA"] + , ["Casa Pneta/PA", "Linharinho/ES"] + , ["Boneco/BA", "Coco/PE"] + -- internet connections + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + ] diff --git a/doc/design/roadmap.mdwn b/doc/design/roadmap.mdwn new file mode 100644 index 000000000..631280828 --- /dev/null +++ b/doc/design/roadmap.mdwn @@ -0,0 +1,18 @@ +## roadmap + +Now in the +[sustaining git-annex development](https://campaign.joeyh.name/) year +(starting September 2013). + +* Month 1 [[!traillink assistant/encrypted_git_remotes]] +* Month 2 [[!traillink assistant/disaster_recovery]] +* Month 3 [[!traillink direct_mode]] guard [[!traillink assistant/upgrading]] +* Month 4 [[!traillink assistant/windows text="Windows webapp"]], Linux arm, external special remotes +* Month 5 user-driven features and polishing +* Month 6 get Windows out of beta, [[!traillink design/metadata text="metadata and views"]] +* Month 7 user-driven features and polishing +* Month 8 [[!traillink git-remote-daemon]] +* Month 9 Brazil!, [[!traillink assistant/sshpassword]] +* Month 10 polish [[assistant/Windows]] port +* **Month 11 [[!traillink assistant/chunks]], [[!traillink assistant/deltas]], [[!traillink assistant/gpgkeys]] (pick 2?)** +* Month 12 [[!traillink assistant/telehash]] diff --git a/doc/devblog.mdwn b/doc/devblog.mdwn new file mode 100644 index 000000000..aa66b0100 --- /dev/null +++ b/doc/devblog.mdwn @@ -0,0 +1,10 @@ +Work on git-annex is [crowdfunded](https://campaign.joeyh.name/). +Joey blogs about his progress here on a semi-daily basis. + +[[!sidebar content=""" +[[!calendar type="month" pages="page(devblog/*)"]] +[[!calendar type="month" month="-1" pages="page(devblog/*)"]] +[[!calendar type="month" month="-2" pages="page(devblog/*)"]] +"""]] + +[[!inline pages="page(devblog/*)" show=0]] diff --git a/doc/devblog/day_-1__drop_dead.mdwn b/doc/devblog/day_-1__drop_dead.mdwn new file mode 100644 index 000000000..97f7cf1d2 --- /dev/null +++ b/doc/devblog/day_-1__drop_dead.mdwn @@ -0,0 +1,5 @@ +Implemented `git annex forget --drop-dead`, which is finally a way to +remove all references to old repositories that you've marked as dead. + +I've still not merged in the `forget` branch, because I developed this +while slightly ill, and have not tested it very well yet. diff --git a/doc/devblog/day_-3__.mdwn b/doc/devblog/day_-3__.mdwn new file mode 100644 index 000000000..fa1473e06 --- /dev/null +++ b/doc/devblog/day_-3__.mdwn @@ -0,0 +1,29 @@ +John Millikin came through and fixed that haskell-gnutls segfault +on OSX that I developed a reproducible test case for the other day. +It's a bit hard to test, since the bug doesn't always happen, but the +fix is already deployed for Mountain Lion autobuilder. + +However, I then found another way to make haskell-gnutls segfault, more +reliably on OSX, and even sometimes on Linux. Just entering the wrong XMPP +password in the assistant can trigger this crash. Hopefully John will work +his magic again. + +--- + +Meanwhile, I fixed the sync-after-forget problem. Now sync always forces +its push of the git-annex branch (as does the assistant). I considered but +rejected having sync do the kind of uuid-tagged branch push that the +assistant sometimes falls back to if it's failing to do a normal sync. It's +ugly, but worse, it wouldn't work in the workflow where multiple clients +are syncing to a central bare repository, because they'd not pull down the +hidden uuid-tagged branches, and without the assistant running on the +repository, nothing would ever merge their data into the git-annex branch. +Forcing the push of synced/git-annex was easy, once I satisfied myself +that it was always ok to do so. + +Also factored out a module that knows about all the different log files +stored on the git-annex branch, which is all the support infrastructure +that will be needed to make `git annex forget --drop-dead` work. Since this +is basically a routing module, perhaps I'll get around to making it use +a nice bidirectional routing library like +[Zwaluw](http://hackage.haskell.org/package/Zwaluw) one day. diff --git a/doc/devblog/day_-4__forgetting.mdwn b/doc/devblog/day_-4__forgetting.mdwn new file mode 100644 index 000000000..a37b32e33 --- /dev/null +++ b/doc/devblog/day_-4__forgetting.mdwn @@ -0,0 +1,80 @@ +Yesterday I spent making a release, and shopping for a new laptop, since +this one is dying. (Soon I'll be able to compile git-annex fast-ish! Yay!) +And thinking about [[todo/wishlist:_dropping_git-annex_history]]. + +Today, I added the `git annex forget` command. It's currently been lightly +tested, seems to work, and is living in the `forget` branch until I gain +confidence with it. It should be perfectly safe to use, even if it's buggy, +because you can use `git reflog git-annex` to pull out and revert to an old +version of your git-annex branch. So if you're been wanting this feature, +please beta test! + +---- + +I actually implemented something more generic than just forgetting git +history. There's now a whole mechanism for git-annex doing distributed +transitions of whatever sort is needed. + +There were several subtleties involved in distributed transitions: + +First is how to tell when a given transition has already been done on a +branch. At first I was thinking that the transition log should include the +sha of the first commit on the old branch that got rewritten. However, that +would mean that after a single transition had been done, every git-annex +branch merge would need to look up the first commit of the current branch, +to see if it's done the transition yet. That's slow! Instead, transitions +are logged with a timestamp, and as long as a branch contains a transition +with the same timestamp, it's been done. + +A really tricky problem is what to do if the local repository has +transitioned, but a remote has not, and changes keep being made to the +remote. What it does so far is incorporate the changes from the remote into +the index, and re-run the transition code over the whole thing to yeild a +single new commit. This might not be very efficient (once I write the more +full-featured transition code), but it lets the local repo keep up with +what's going on in the remote, without directly merging with it (which +would revert the transition). And once the remote repository has its +git-annex upgraded to one that knows about transitions, it will finish up +the transition on its side automatically, and the two branches will once +again merge. + +Related to the previous problem, we don't want to keep trying to merge +from a remote branch when it's not yet transitioned. So a blacklist is +used, of untransitioned commits that have already been integrated. + +One really subtle thing is that when the user does a transition more +complicated than `git annex forget`, like the `git annex forget --dead` +that I need to implement to forget dead remotes, they're not just telling +git-annex to forget whatever dead remotes it knows right now. They're +actually telling git-annex to perform the transition one time on every +existing clone of the repository, at some point in the future. Repositories +with unfinished transitions could hang around for years, and at some future +point when git-annex runs in the repository again, it would merge in the +current state of the world, and re-do the transition. So you might tell it +to forget dead remotes today, and then the very repository you ran that in +later becomes dead, and a long-slumbering repo wakes up and forgets about +the repo that started the whole process! I hope users don't find this +massively confusing, but that's how the implementation works right now. + +---- + +I think I have at least two more days of work to do to finish up this +feature. + +* I still need to add some extra features like forgetting about dead remotes, + and forgetting about keys that are no longer present on any remote. + +* After `git annex forget`, `git annex sync` + will fail to push the synced/annex branch to remotes, since the branch + is no longer a fast-forward of the old one. I will probably fix this by + making `git annex sync` do a fallback push of a unique branch in this case, + like the assistant already does. Although I may need to adjust that code + to handle this case, too.. + +* For some reason the automatic transitioning code triggers + a "(recovery from race)" commit. This is certainly a bug somewhere, + because you can't have a race with only 1 participant. + +---- + +Today's work was sponsored by Richard Hartmann. diff --git a/doc/devblog/day_-4__forgetting/comment_1_f3cc7a25af4c59fda3924c737a789419._comment b/doc/devblog/day_-4__forgetting/comment_1_f3cc7a25af4c59fda3924c737a789419._comment new file mode 100644 index 000000000..4c926c1af --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_1_f3cc7a25af4c59fda3924c737a789419._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Sandra.Devil" + ip="77.172.73.184" + subject="New laptop" + date="2013-09-01T09:38:32Z" + content=""" +What is the new laptop you are going to use? Specs please :) +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_2_e47476c80af02a2e9cf76c53fdbb8534._comment b/doc/devblog/day_-4__forgetting/comment_2_e47476c80af02a2e9cf76c53fdbb8534._comment new file mode 100644 index 000000000..db2438f97 --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_2_e47476c80af02a2e9cf76c53fdbb8534._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.207.34" + subject="Update one forgetting keys no longer present" + date="2014-02-17T23:21:49Z" + content=""" +I have some repos where due to some hiccups file versions (not in the working tree anymore) were lost and now they come up again and again when fsck is running. +So I would be happy if I could make my repos forget these not available files via \"git annex forget $key\" and perhaps even have a better solution to show all objects with numcopies=0. +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_3_b57956a8ce372d620f21ea9a497e8013._comment b/doc/devblog/day_-4__forgetting/comment_3_b57956a8ce372d620f21ea9a497e8013._comment new file mode 100644 index 000000000..5c0bbc42b --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_3_b57956a8ce372d620f21ea9a497e8013._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-20T18:54:48Z" + content=""" +@stp, It seems to me if you just delete the symlinks in your git repository that point to the lost files, `git annex fsck` will shut up. +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_4_812b630df01ac35254e3c4e677554e2b._comment b/doc/devblog/day_-4__forgetting/comment_4_812b630df01ac35254e3c4e677554e2b._comment new file mode 100644 index 000000000..187545fbc --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_4_812b630df01ac35254e3c4e677554e2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="comment 4" + date="2014-02-20T21:07:41Z" + content=""" +Yeah true if I remove symlinks from the history (as I understand your suggestion) it would work. I just wanted to suggest that it could be something useful for the git annex forget function as it already cleans out old dead repos and other things. +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment b/doc/devblog/day_-4__forgetting/comment_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment new file mode 100644 index 000000000..d83022526 --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 5" + date="2014-02-20T21:14:21Z" + content=""" +You don't need to delete them from the history, just from the branch you're running `git annex fsck` in. +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_6_4f87e2ab119f3cd81266159f02952188._comment b/doc/devblog/day_-4__forgetting/comment_6_4f87e2ab119f3cd81266159f02952188._comment new file mode 100644 index 000000000..4ecbb1ae6 --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_6_4f87e2ab119f3cd81266159f02952188._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="comment 6" + date="2014-02-20T22:19:12Z" + content=""" +As discussed on irc. +Fsck --all does check more then the working tree and therefore for fsck to not complain this would be a worthy feature to be added. (git annex forget $key) +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_7_a865216046aa91a47d0d2b2f0668ea89._comment b/doc/devblog/day_-4__forgetting/comment_7_a865216046aa91a47d0d2b2f0668ea89._comment new file mode 100644 index 000000000..dc142edc0 --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_7_a865216046aa91a47d0d2b2f0668ea89._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="New findings" + date="2014-02-24T12:28:03Z" + content=""" +Another thing I found, which was annoying is that I have objects in my annex not tracked anywhere it seems. +\"git annex fsck --all\" complains about not having access to the object. \"git log --stat -S '$key'\" doesn't have any record. \"git annex fsck\" has no issues and \"git annex unused\" comes up empty too. +I'm not sure where these objects still reside or why how to remove this annoying failure. + +So not only should \"git annex forget $key\" remove references from within all branches, but should also clean up the aforementioned loose objects, which are neither unused, nor available, nor referenced. +"""]] diff --git a/doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment b/doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment new file mode 100644 index 000000000..f0ba50990 --- /dev/null +++ b/doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.207.34" + subject="Any update on cleaning up commands?" + date="2014-03-21T16:32:43Z" + content=""" +Is there any update on cleaning up object/file references to objects/content not at all present and lost. I would love my git annex fsck --all to show current failures and not these old files all the time. +Thanks +"""]] diff --git a/doc/devblog/day_100__git-annex_sync_--content.mdwn b/doc/devblog/day_100__git-annex_sync_--content.mdwn new file mode 100644 index 000000000..f35fbd330 --- /dev/null +++ b/doc/devblog/day_100__git-annex_sync_--content.mdwn @@ -0,0 +1,4 @@ +Spent the day building this new feature, which makes `git annex sync --content` +do the same synchronization of file contents (to satisfy preferred content +settings) that the assistant does. The result has not been tested a lot +yet, but seems to work well. diff --git a/doc/devblog/day_101__old_mistakes.mdwn b/doc/devblog/day_101__old_mistakes.mdwn new file mode 100644 index 000000000..4a37416dc --- /dev/null +++ b/doc/devblog/day_101__old_mistakes.mdwn @@ -0,0 +1,23 @@ +In order to remove some hackishness in `git annex sync --content`, I +finally fixed a bad design decision I made back at the very beginning +(before I really knew haskell) when I built the command seek code, which +had led to a kind of inversion of control. This took most of a night, but +it made a lot of code in git-annex clearer, and it makes the command +seeking code much more flexible in what it can do. Some of the oldest, and +worst code in git-annex was removed in the process. + +Also, I've been reworking the numcopies configuration, to allow for a +[[todo/preferred_content_numcopies_check]]. That will let the assistant, +as well as `git annex sync --content` proactively make copies when +needed in order to satisfy numcopies. + +As part of this, `git config annex.numcopies` is deprecated, and there's a +new `git annex numcopies N` command that sets the numcopies value that will +be used by any clone of a repository. + +I got the preferred content checking of numcopies working too. However, +I am unsure if checking for per-file .gitattributes annex.numcopies +settings will make preferred content expressions be, so I have left +that out for now. + +Today's work was sponsored by Josh Taylor. diff --git a/doc/devblog/day_101__old_mistakes/comment_1_2c6e991efde3296450189b2821f2ccc3._comment b/doc/devblog/day_101__old_mistakes/comment_1_2c6e991efde3296450189b2821f2ccc3._comment new file mode 100644 index 000000000..93fb84aa3 --- /dev/null +++ b/doc/devblog/day_101__old_mistakes/comment_1_2c6e991efde3296450189b2821f2ccc3._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2014-01-21T00:20:34Z" + content=""" +Some more details on + +* when the old mechanism will stop working +* how you will ensure interoperability in repo sets which have different versions installed in different places +* which option weighs more heavily + +would be appreciated. + + +Richard +"""]] diff --git a/doc/devblog/day_101__old_mistakes/comment_2_524690d69056737dd296e4f7626737d2._comment b/doc/devblog/day_101__old_mistakes/comment_2_524690d69056737dd296e4f7626737d2._comment new file mode 100644 index 000000000..9f7ebecf1 --- /dev/null +++ b/doc/devblog/day_101__old_mistakes/comment_2_524690d69056737dd296e4f7626737d2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.249" + subject="comment 2" + date="2014-01-21T02:23:00Z" + content=""" +I don't plan to remove .git/config annex.numcopies support. It is 5 lines of code. + +A fundamental problem with the .git/config annex.numcopies setting is that it can be inconsistently set between repositories. Therefore, there is no worse potential with interoperability if you use differing versions of git-annex that support and do not support the new global numcopies setting. If this was a concern though, you can use .gitattributes to set annex.numcopies for *, which all recent versions of git-annex support. + +The old git/config annex.numcopies setting is overridden as soon as you use `git annex numcopies`. In turn `git annex numcopies` is overridden by any relevant .gitattributes annex.numcopies setting. This is documented on the man page. +"""]] diff --git a/doc/devblog/day_102__cleanups.mdwn b/doc/devblog/day_102__cleanups.mdwn new file mode 100644 index 000000000..27a1badea --- /dev/null +++ b/doc/devblog/day_102__cleanups.mdwn @@ -0,0 +1,10 @@ +Worked on cleaning up and reorganizing all the code that handles numcopies +settings. Much nicer now. Fixed some bugs. + +As expected, making the preferred content numcopies check look at +.gitattributes slows it down significantly. So, exposed both the slow and +accurate check and a faster version that ignores .gitattributes. + +Also worked on the test suite, removing dependencies between tests. +This will let tasty-rerun be used later to run only previously failing +tests. diff --git a/doc/devblog/day_103__unused.mdwn b/doc/devblog/day_103__unused.mdwn new file mode 100644 index 000000000..affb4e532 --- /dev/null +++ b/doc/devblog/day_103__unused.mdwn @@ -0,0 +1,34 @@ +A big missing peice of the assistant is doing something about the content +of old versions of files, and deleted files. In direct mode, editing or +deleting a file necessarily loses its content from the local repository, +but the content can still hang around in other repositories. So, the +assistant needs to do something about that to avoid eating up disk space +unnecessarily. + +I built on recent work, that lets preferred content expressions be matched +against keys with no associated file. This means that I can run unused keys +through all the machinery in the assistant that handles file transfers, and +they'll end being moved to whatever repository wants them. To control which +repositories do want to retain unused files, and which not, I added a +`unused` keyword to preferred content expressions. Client repositories and +transfer repositories do not want to retain unused files, but backup etc +repos do. + +One nice thing about this `unused` preferred content implementation is that +it doesn't slow down normal matching of preferred content expressions at +all. Can you guess why not? See [[!commit 4b55afe9e92c045d72b78747021e15e8dfc16416]] + +So, the assistant will run `git annex unused` on a daily basis, and +cause unused files to flow to repositories that want them. But what if no +repositories do? To guard against filling up the local disk, there's +a `annex.expireunused` configuration setting, that can cause old unused +files to be deleted by the assistant after a number of days. + +I made the assistant check if there seem to be a lot of unused files piling +up. (1000+, or 10% of disk used by them, or more space taken by unused files +than is free.) If so, it'll pop up an alert to nudge the user to configure +annex.expireunused. + +Still need to build the UI to configure that, and test all of this. + +Today's work was sponsored by Samuel Tardieu. diff --git a/doc/devblog/day_104__unused_II.mdwn b/doc/devblog/day_104__unused_II.mdwn new file mode 100644 index 000000000..7dc01c5fd --- /dev/null +++ b/doc/devblog/day_104__unused_II.mdwn @@ -0,0 +1,7 @@ +Built the UI to manage unused files. + +[[!img assistant/unused.png]] + +Testing yesterday's work, I found several problems that prevented the +assistant from moving unused files around, and fixed them. It seems to be +working pretty well now. diff --git a/doc/devblog/day_104__unused_II/comment_1_a693a56123497a39c30cbd35b8e35bce._comment b/doc/devblog/day_104__unused_II/comment_1_a693a56123497a39c30cbd35b8e35bce._comment new file mode 100644 index 000000000..a4893f63a --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_1_a693a56123497a39c30cbd35b8e35bce._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="state of windows" + date="2014-01-28T10:29:41Z" + content=""" +Any idea when this stuff will end in the windows build? I am currently fiddling around with git-annex on windows (btw: great work on that so far!) and the unused files config would be highly valueable to me, since I want to mostly use it to push files out to my server from my work machine or my windows tablet, while preventing to clog up too much space. And since I am lazy, I would love to leave the house keeping to git-annex ;) + +An additional question on the windows build: which of the backends can actually make use of windows proxy settings? I guess if webdav was in the list of supported backends, it would work fine, since it is only http, but since it is missing, which of the others would work through just a standard configured squid proxy? For my work machine this is the only way to reach the outside world, doing https to my web server. +"""]] diff --git a/doc/devblog/day_104__unused_II/comment_2_9833fb9daa50bc838cc46ca2f6c16580._comment b/doc/devblog/day_104__unused_II/comment_2_9833fb9daa50bc838cc46ca2f6c16580._comment new file mode 100644 index 000000000..eeaef05bf --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_2_9833fb9daa50bc838cc46ca2f6c16580._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 2" + date="2014-01-28T20:58:32Z" + content=""" +AFAICS, the Windows build does include WebDAV support. + +I don't know about Windows proxy stuff. If it requires the program to do something, git-annex almost certianly does not do it. +"""]] diff --git a/doc/devblog/day_104__unused_II/comment_3_873a882ec1ddc3be473473cb224a9040._comment b/doc/devblog/day_104__unused_II/comment_3_873a882ec1ddc3be473473cb224a9040._comment new file mode 100644 index 000000000..96b870627 --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_3_873a882ec1ddc3be473473cb224a9040._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="comment 3" + date="2014-01-29T08:22:13Z" + content=""" +well, at least in the assistant there is no selection to add a webdav repository - only box.com, rsync.net, S3, remote ssh, and the archives on glazier or internet archive. It is the binary version from 16th this month. I thought it was still excluded due to the compiler crashes you wrote about, because it doesn't show up in the webapp as option. I was scratching my head anyway about that windows build, because there was nothing about setting up encryption in the configuration in the webapp. + +Proxy support on Windows is kinda like proxy support on linux when you pull the proxy from gnome settings - just it is pulled from the registry. I don't know how Haskell HTTP client libraries handle it, only know it for Python - there the client libraries usually grab proxy settings automatically from the system configuration. + +Another option which could work for me to get through our firewall at work would be ssh - I can use ssh with proxy commands to reach the outside, but didn't yet find the used ssh configs on the windows git-annex installation - it doesn't use the one in ~/.ssh, I added my proxy commands there, but that isn't used. +"""]] diff --git a/doc/devblog/day_104__unused_II/comment_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment b/doc/devblog/day_104__unused_II/comment_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment new file mode 100644 index 000000000..adf3293ff --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="comment 4" + date="2014-01-29T08:26:19Z" + content=""" +Oh, just noticed in the console window of the assistant: + +ssh-keygen: /home/xgwsbae/.ssh/known_hosts: No such file or directory +ssh-keygen: /home/xgwsbae/.ssh/known_hosts: No such file or directory + +Home directory is C:/Users/xgwsbae/ (git bash gives /c/Users/xgwsbae in $HOME) ... looks like something got confuzzled between Windows and Unix there. +"""]] diff --git a/doc/devblog/day_104__unused_II/comment_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment b/doc/devblog/day_104__unused_II/comment_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment new file mode 100644 index 000000000..12849438c --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 5" + date="2014-01-29T17:58:26Z" + content=""" +Some things (not git-annex) default to /home/$USER when appropriate env vars are not set. There is a bug open about that, [[bugs/assistant_using_the_incorrect_path_on_windows?]], although I don't know what it makes sense for git-annex to do to deal with it. + +box.com *is* a webdav repository. It is the only webdav repository the webapp currently supports setting up, although you can configure any webdav remote you like at the command line and the assistant will then be able to use it. + +Will be curious to hear if the http-conduit library used for webdav supports proxies. If not, that would certianly seem a good place to file a bug. Unofrtunately, git-annex uses 2 or 3 other http stacks in other places too. +"""]] diff --git a/doc/devblog/day_104__unused_II/comment_6_0ed4023c9c249024fe0454fc5bab3b14._comment b/doc/devblog/day_104__unused_II/comment_6_0ed4023c9c249024fe0454fc5bab3b14._comment new file mode 100644 index 000000000..d900dc511 --- /dev/null +++ b/doc/devblog/day_104__unused_II/comment_6_0ed4023c9c249024fe0454fc5bab3b14._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="comment 6" + date="2014-01-30T10:52:09Z" + content=""" +Well, according to the hackage documentation of http conduit it seems it at least supports proxies when youre code gives it the proxy host and port. + +But the link about the problem with environment settings helped me to get around my immediate problem by just running annex from the git bash (which is prefereably to me most of the time anyway). So I could set up my annex on my work machine and just tunnel out with ProxyCommand via our ssh gateway. Yay! +"""]] diff --git a/doc/devblog/day_105__locking.mdwn b/doc/devblog/day_105__locking.mdwn new file mode 100644 index 000000000..b41056bb4 --- /dev/null +++ b/doc/devblog/day_105__locking.mdwn @@ -0,0 +1,30 @@ +With yesterday's release, I'm pretty much done with the month's work. Since +there was no particular goal this month, it's been a grab bag of features +and bugfixes. Quite a lot of them in this last release. + +I'll be away the next couple of days.. But got a start today on the next +part of the roadmap, which is planned to be all about Windows and Android +porting. Today, it was all about lock files, mostly on Windows. + +Lock files on Windows are horrific. I especially like that programs that +want to open a file, for any reason, are encouraged in the official +documentation to retry repeatedly if it fails, because some other +random program, like a virus checker, might have opened the file first. + +Turns out Windows does support a shared file read mode. This was +just barely enough for me to implement both shared and exclusive +file locking a-la-flock. + +Couldn't avoid a busy wait in a few places that block on a lock. +Luckily, these are few, and the chances the lock will be taken for a long +time is small. (I did think about trying to watch the file for close events +and detect when the lock was released that way, but it seemed much too +complicated and hard to avoid races.) + +Also, Windows only seems to support mandatory locks, while all locking in +git-annex needs to be advisory locks. Ie, git-annex's locking shouldn't +prevent a program from opening an annexed file! To work around that, +I am using dedicated lock files on Windows. + +Also switched direct mode's annexed object locking to use dedicated lock +files. AFAICS, this was pretty well broken in direct mode before. diff --git a/doc/devblog/day_106__catching_up.mdwn b/doc/devblog/day_106__catching_up.mdwn new file mode 100644 index 000000000..86e7acbae --- /dev/null +++ b/doc/devblog/day_106__catching_up.mdwn @@ -0,0 +1,5 @@ +While I've not been blogging over what amounted to a long weekend, looking +over the changelog, there were quite a few things done. Mostly various +improvements and fixes to `git annex sync --content`. + +Today, got the test suite to pass on Windows 100% again. diff --git a/doc/devblog/day_107__TDD.mdwn b/doc/devblog/day_107__TDD.mdwn new file mode 100644 index 000000000..0ae41f0d6 --- /dev/null +++ b/doc/devblog/day_107__TDD.mdwn @@ -0,0 +1,10 @@ +A more test driven day than usual. Yesterday I noticed a test case was +failing on Windows in a way not related to what it was intended to test, +and fixed the test case to not fail.. But knew I'd need to get to the +bottom of what broke it eventually. + +Digging into that today, I eventually (after rather a long time stuck) +determined the bug involved automatic conflict resolution, but only +happened on systems without symlink support. This let me reproduce it on +FAT outside Windows and do some fast TDD iterations in a much less +unwieldly environment and fix the bug. diff --git a/doc/devblog/day_108__new_use_for_location_tracking.mdwn b/doc/devblog/day_108__new_use_for_location_tracking.mdwn new file mode 100644 index 000000000..62e40672f --- /dev/null +++ b/doc/devblog/day_108__new_use_for_location_tracking.mdwn @@ -0,0 +1,20 @@ +Added a new feature that started out with me wanting a way to undo a +`git-annex drop`, but turned into something rather more powerful. The `--in` +option can now be told to match files that were in a repository at some +point in the past. For example, `git annex get --in=here@{yesterday}` will +get any files that have been dropped over the past day. + +While git-annex's location tracking info is stored in git and thus versioned, +very little of it makes use of past versions of the location tracking info +(only `git annex log`). I'm happy to have finally found a use for it! + +OB Windows porting: Fixed a bug in the symlink calculation code. +Sounds simple; took 2 hours! + +Also various bug triage; updated git version on OSX; forwarded bug about +DAV-0.6 being broken upstream; fixed a bug with initremote in +encryption=pubkey mode. Backlog is 65 messages. + +--- + +Today's work was sponsored by Brock Spratlen. diff --git a/doc/devblog/day_109__elimintating_absNormPath.mdwn b/doc/devblog/day_109__elimintating_absNormPath.mdwn new file mode 100644 index 000000000..a15cb7f09 --- /dev/null +++ b/doc/devblog/day_109__elimintating_absNormPath.mdwn @@ -0,0 +1,18 @@ +git-annex has been using MissingH's `absNormPath` forever, but that's +not very maintained and doesn't work on Windows. I've been +wanting to get rid of it for some time, and finally did today, writing a +`simplifyPath` that does the things git-annex needs and will work with all +the Windows filename craziness, and takes advantage of the more modern +System.FilePath to be quite a simple peice of code. A QuickCheck test found +no important divergences from absNormPath. A good first step to making +git-annex not depend on MissingH at all. + +That fixed one last Windows bug that was disabled in the test suite: +`git annex add ..\subdir\file` will now work. + +I am re-installing the Android autobuilder for 2 reasons: I noticed I had +accidentially lost a patch to make a library use the Android SSL cert directory, +and also a new version of GHC is very near to release and so it makes sense +to update. + +Down to 38 messages in the backlog. diff --git a/doc/devblog/day_10__lazy_Sunday.mdwn b/doc/devblog/day_10__lazy_Sunday.mdwn new file mode 100644 index 000000000..aa6a70918 --- /dev/null +++ b/doc/devblog/day_10__lazy_Sunday.mdwn @@ -0,0 +1,23 @@ +Fixed a typo that broke automatic youtube video support in `addurl`. + +---- + +Now there's an easy way to get an overview of how close your repository +is to meeting the configured numcopies settings (or when it exceeds them). + +
+# time git annex status . 
+[...]
+numcopies stats: 
+	numcopies +0: 6686
+	numcopies +1: 3793
+	numcopies +3: 3156
+	numcopies +2: 2743
+	numcopies -1: 1242
+	numcopies -4: 1098
+	numcopies -3: 1009
+	numcopies +4: 372
+
+ +This does make `git annex status` slow when run on a large directory tree, +so --fast disables that. diff --git a/doc/devblog/day_110__release_prep.mdwn b/doc/devblog/day_110__release_prep.mdwn new file mode 100644 index 000000000..12ba78a4f --- /dev/null +++ b/doc/devblog/day_110__release_prep.mdwn @@ -0,0 +1,25 @@ +Last night I tracked down and fixed a bug in the DAV library that has been +affecting WebDAV remotes. I've been deploying the fix for that today, +including to the android and arm autobuilders. While I finished a clean +reinstall of the android autobuilder, I ran into problems getting a clean +reinstall of the arm autobuilder (some type mismatch error building +yesod-core), so manually fixed its DAV for now. + +The WebDAV fix and other recent fixes makes me want to make a release soon, +probably Monday. + +ObWindows: Fixed git-annex to not crash when run on Windows +in a git repository that has a remote with a unix-style path +like "/foo/bar". Seems that not everything aggrees on whether such a path +is absolute; even sometimes different parts of the same library disagree! + +[[!format haskell """ +import System.FilePath.Windows + +prop_windows_is_sane :: Bool +prop_windows_is_sane = isAbsolute upath || ("C:\\STUFF" upath /= upath) + where upath = "/foo/bar" +"""]] + +Perhaps more interestingly, I've been helping dxtrish port git-annex to +OpenBSD and it seems most of the way there. diff --git a/doc/devblog/day_111__windows_beta_release.mdwn b/doc/devblog/day_111__windows_beta_release.mdwn new file mode 100644 index 000000000..cd880dc0c --- /dev/null +++ b/doc/devblog/day_111__windows_beta_release.mdwn @@ -0,0 +1,6 @@ +Pushed out the new release. This is the first one where I consider the +git-annex command line beta quality on Windows. + +Did some testing of the webapp on Windows, trying out every part of the UI. +I now have eleven todo items involving the webapp listed in +[[todo/windows_support]]. Most of them don't look too bad to fix. diff --git a/doc/devblog/day_112__metadata_design.mdwn b/doc/devblog/day_112__metadata_design.mdwn new file mode 100644 index 000000000..e75d4fc4e --- /dev/null +++ b/doc/devblog/day_112__metadata_design.mdwn @@ -0,0 +1,18 @@ +There's a new design document for letting git-annex store arbitrary +metadata. The really neat thing about this is the user can check out only +files matching the tags or values they care about, and get an automatically +structuted file tree layout that can be dynamically filtered. It's going to +be awesome! [[design/metadata]] + +In the meantime, spent most of today working on Windows. Very good +progress, possibly motivated by wanting to get it over with so I can spend +some time this month on the above. ;) + +* webapp can make box.com and S3 remotes. This just involved fixing a hack + where the webapp set environment variables to communicate creds to + initremote. Can't change environment on Windows (or I don't know how to). +* webapp can make repos on removable drives. +* `git annex assistant --stop` works, although this is not likely to really + be useful +* The source tree now has 0 `func = error "Windows TODO"` type stubbed out + functions to trip over. diff --git a/doc/devblog/day_113__metadata_groundwork.mdwn b/doc/devblog/day_113__metadata_groundwork.mdwn new file mode 100644 index 000000000..4859c4d33 --- /dev/null +++ b/doc/devblog/day_113__metadata_groundwork.mdwn @@ -0,0 +1,9 @@ +Built the core data types, and log for metadata storage. Making metadata +union merge well is tricky, but I have a design I'm happy with, that will +allow distributed changes to metadata. + +Finished up the day with a `git annex metadata` command to get/set metadata +for a file. + +This is all the goundwork needed to begin experimenting with generating +git branches that display different metadata-driven views of annexed files. diff --git a/doc/devblog/day_114__windows_porting.mdwn b/doc/devblog/day_114__windows_porting.mdwn new file mode 100644 index 000000000..2f1cace1b --- /dev/null +++ b/doc/devblog/day_114__windows_porting.mdwn @@ -0,0 +1,8 @@ +Windows porting all day. Fixed a lot of issues with the webapp, +so quite productive. Except for the 2 hours wasted finding a way to kill a +process by PID from Haskell on Windows. + +Last night, made `git annex metadata` able to set metadata on a whole +directory or list of files if desired. And added a `--metadata field=value` +switch (and corresponding preferred content terminal) which limits +git-annex to acting on files with the specified metadata. diff --git a/doc/devblog/day_115__windows_porting.mdwn b/doc/devblog/day_115__windows_porting.mdwn new file mode 100644 index 000000000..a9abe4ad2 --- /dev/null +++ b/doc/devblog/day_115__windows_porting.mdwn @@ -0,0 +1,17 @@ +More Windows porting.. Seem to be getting near an end of the easy stuff, +and also the webapp is getting pretty usable on Windows now, the only +really important thing lacking is XMPP support. + +Made git-annex on Windows set HOME when it's not already set. Several of +the bundled cygwin tools only look at HOME. This was made a lot harder and +uglier due to there not being any way to modify the environment of the +running process.. git-annex has to re-run itself with the fixed +environment. + +Got rsync.net working in the webapp. Although with an extra rsync.net +password prompt on Windows, which I cannot find a way to avoid. + +While testing that, I discovered that openssh 6.5p1 has broken support for +~/.ssh/config Host lines that contain upper case letters! I have filed a +bug about this and put a quick fix in git-annex, which sometimes generated +such lines. diff --git a/doc/devblog/day_116__views.mdwn b/doc/devblog/day_116__views.mdwn new file mode 100644 index 000000000..a7aaf2c93 --- /dev/null +++ b/doc/devblog/day_116__views.mdwn @@ -0,0 +1,54 @@ +Working on building [[design/metadata]] filtered branches. + +Spent most of the day on types and pure code. Finally at the end +I wrote down two actions that I still need to implement to make +it all work: + +[[!format haskell """ +applyView' :: MkFileView -> View -> Annex Git.Branch +updateView :: View -> Git.Ref -> Git.Ref -> Annex Git.Branch +"""]] + +I know how to implement these, more or less. And in most cases +they will be pretty fast. + +The more interesting part is already done. That was the issue of how to +generate filenames in the filter branches. That depends on the `View` being +used to filter and organize the branch, but also on the original filename used +in the reference branch. Each filter branch has a reference branch (such as +"master"), and displays a filtered and metadata-driven reorganized tree +of files from its reference branch. + +[[!format haskell """ +fileViews :: View -> (FilePath -> FileView) -> FilePath -> MetaData -> Maybe [FileView] +"""]] + +So, a view that matches files tagged "haskell" or "git-annex" +and with an author of "J\*" will generate filenames like +"haskell/Joachim/interesting_theoretical_talk.ogg" and +"git-annex/Joey/mytalk.ogg". + +It can also work backwards from these +filenames to derive the MetaData that is encoded in them. + +[[!format haskell """ +fromView :: View -> FileView -> MetaData +"""]] + +So, copying a file to "haskell/Joey/mytalk.ogg" lets it know that +it's gained a "haskell" tag. I knew I was on the right track when +`fromView` turned out to be only 6 lines of code! + +The trickiest part of all this, which I spent most of yesterday thinking +about, is what to do if the master branch has files in subdirectories. It +probably does not makes sense to retain that hierarchical directory +structure in the filtered branch, because we instead have a +non-hierarchical metadata structure to express. (And there would probably +be a lot of deep directory structures containing only one file.) But +throwing away the subdirectory information entirely means that two files +with the same basename and same metadata would have colliding names. + +I eventually decided to embed the subdirectory information into the filenames +used on the filter branch. Currently that is done by converting +`dir/subdir/file.foo` to `file(dir)(subdir).foo`. We'll see how this works +out in practice.. diff --git a/doc/devblog/day_117__views_implemented.mdwn b/doc/devblog/day_117__views_implemented.mdwn new file mode 100644 index 000000000..fa2ae2837 --- /dev/null +++ b/doc/devblog/day_117__views_implemented.mdwn @@ -0,0 +1,76 @@ +Today I built `git annex view`, and `git annex vadd` and a few related +commands. A quick demo: + +
+joey@darkstar:~/lib/talks>ls
+Chaos_Communication_Congress/  FOSDEM/       Linux_Conference_Australia/
+Debian/                        LibrePlanet/  README.md
+joey@darkstar:~/lib/talks>git annex view tag=*
+view  (searching...)
+Switched to branch 'views/_'
+ok
+joey@darkstar:~/lib/talks#_>tree -d
+.
+|-- Debian
+|-- android
+|-- bigpicture
+|-- debhelper
+|-- git
+|-- git-annex
+`-- seen
+
+7 directories
+joey@darkstar:~/lib/talks#_>git annex vadd author=*
+vadd  
+Switched to branch 'views/author=_;_'
+ok
+joey@darkstar:~/lib/talks#author=_;_>tree -d
+.
+|-- Benjamin Mako Hill
+|   `-- bigpicture
+|-- Denis Carikli
+|   `-- android
+|-- Joey Hess
+|   |-- Debian
+|   |-- bigpicture
+|   |-- debhelper
+|   |-- git
+|   `-- git-annex
+|-- Richard Hartmann
+|   |-- git
+|   `-- git-annex
+`-- Stefano Zacchiroli
+    `-- Debian
+
+15 directories
+joey@darkstar:~/lib/talks#author=_;_>git annex vpop
+vpop 1
+Switched to branch 'views/_'
+ok
+joey@darkstar:~/lib/talks#_>git annex vadd tag=git-annex
+vadd  
+Switched to branch 'views/(git-annex)'
+ok
+joey@darkstar:~/lib/talks#(git-annex)>ls
+1025_gitify_your_life_{Debian;2013;DebConf13;high}.ogv@
+git_annex___manage_files_with_git__without_checking_their_contents_into_git_{FOSDEM;2012;lightningtalks}.webm@
+mirror.linux.org.au_linux.conf.au_2013_mp4_gitannex_{Linux_Conference_Australia;2013}.mp4@
+joey@darkstar:~/lib/talks#_>git annex vpop 2
+vpop 2
+Switched to branch 'master'
+ok
+
+ +Not 100% happy with the speed -- the generation of the view branch is close +to optimal, and fast enough (unless the branch has very many matching +files). And `vadd` can be quite fast if the view has already limited the +total number of files to a smallish amount. But `view` has to look at every +file's metadata, and this can take a while in a large repository. Needs indexes. + +It also needs integration with `git annex sync`, so the view branches +update when files are added to the master branch, and moving files around +inside a view and committing them does not yet update their metadata. + +--- + +Today's work was sponsored by Daniel Atlas. diff --git a/doc/devblog/day_118__views_refined.mdwn b/doc/devblog/day_118__views_refined.mdwn new file mode 100644 index 000000000..bfd102f18 --- /dev/null +++ b/doc/devblog/day_118__views_refined.mdwn @@ -0,0 +1,7 @@ +Still working on views. The most important addition today is that +`git annex precommit` notices when files have been moved/copied/deleted +in a view, and updates the metadata to reflect the changes. + +Also wrote some walkthrough documentation: [[tips/metadata_driven_views]]. +And, recorded a screencast demoing views, which I will upload next time +I have bandwidth. diff --git a/doc/devblog/day_119__catching_up.mdwn b/doc/devblog/day_119__catching_up.mdwn new file mode 100644 index 000000000..c49c3e34d --- /dev/null +++ b/doc/devblog/day_119__catching_up.mdwn @@ -0,0 +1,15 @@ +Spent the day catching up on the last week or so's traffic. Ended up +making numerous small big fixes and improvements. Message backlog stands at +44. + +Here's the [[screencast demoing views|videos/git-annex_views_demo]]! + +Added to the design today the idea of +automatically deriving metadata from the location of files in the master +branch's directory tree. Eg, `git annex view tag=* podcasts/=*` in a +repository that has a `podcasts/` directory would make a tree like +"$tag/$podcast". Seems promising. + +So much still to do with views.. I have belatedly added them to +the roadmap for this month; doing Windows and Android in the same month was +too much to expect. diff --git a/doc/devblog/day_119__catching_up/comment_1_8aa413e75cab411b0aec254f0f33ebb9._comment b/doc/devblog/day_119__catching_up/comment_1_8aa413e75cab411b0aec254f0f33ebb9._comment new file mode 100644 index 000000000..9c1ba1e43 --- /dev/null +++ b/doc/devblog/day_119__catching_up/comment_1_8aa413e75cab411b0aec254f0f33ebb9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="Neat!" + date="2014-02-20T21:59:05Z" + content=""" +When the [[metadata design|day_112__metadata_design]] stuff appeared on the blog I didn't understand what you meant by automatically creating new tree layouts. I'm really liking these views and can already imagine how useful it would be to tag my photos by person/place/time. This is awesome! Keep up the good work. +"""]] diff --git a/doc/devblog/day_119__catching_up/comment_2_db31d08690730836ce6277e797fcae1d._comment b/doc/devblog/day_119__catching_up/comment_2_db31d08690730836ce6277e797fcae1d._comment new file mode 100644 index 000000000..532b7a4d5 --- /dev/null +++ b/doc/devblog/day_119__catching_up/comment_2_db31d08690730836ce6277e797fcae1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawneiQ3iR9VXOPEP34u7m_L3Qr28H1nEfE0" + nickname="Ethan" + subject="LFS" + date="2014-02-21T00:03:59Z" + content=""" +You might be interested in the Logic File System at http://www.padator.org/wiki/wiki-LFS/doku.php or http://www.padator.org/papers/ which has a similar idea with views and metadata. +"""]] diff --git a/doc/devblog/day_119__catching_up/comment_3_d44da76b18f53a5f51b46e3e15090a48._comment b/doc/devblog/day_119__catching_up/comment_3_d44da76b18f53a5f51b46e3e15090a48._comment new file mode 100644 index 000000000..9d97aff2d --- /dev/null +++ b/doc/devblog/day_119__catching_up/comment_3_d44da76b18f53a5f51b46e3e15090a48._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 3" + date="2014-02-21T07:05:34Z" + content=""" +I agree with Kevin as to the potential usefulness for photos. Particularly if there's some way of automatically extracting and using tags or other EXIF metadata. +"""]] diff --git a/doc/devblog/day_11__webapp_encrypted_drives.mdwn b/doc/devblog/day_11__webapp_encrypted_drives.mdwn new file mode 100644 index 000000000..677c02491 --- /dev/null +++ b/doc/devblog/day_11__webapp_encrypted_drives.mdwn @@ -0,0 +1,12 @@ +Now the webapp can set up encrypted repositories on removable drives. + +[[assistant/encryptdrive.png]] + +This UI needs some work, and the button to create a new key is not wired +up. Also if you have no gpg agent installed, there will be lots of password +prompts at the console. + +Forked git-remote-gcrypt to fix a bug. Hopefully my patch will be merged; +for now I recommend installing my worked version. + +Today's work was sponsored by Romain Lenglet. diff --git a/doc/devblog/day_120__more_metadata.mdwn b/doc/devblog/day_120__more_metadata.mdwn new file mode 100644 index 000000000..daff68e37 --- /dev/null +++ b/doc/devblog/day_120__more_metadata.mdwn @@ -0,0 +1,17 @@ +When generating a view, there's now a way to reuse part of the directory +hierarchy of the parent branch. For example, `git annex view tag=* podcasts/=*` +makes a view where the first level is the tags, and the second level is +whatever `podcasts/*` directories the files were in. + +Also, year and month metadata can be automatically recorded when +adding files to the annex. I made this only be done when annex.genmetadata +is turned on, to avoid polluting repositories that don't want to use metadata. + +It would be nice if there was a way to add a hook script that's run +when files are added, to collect their metadata. I am not sure yet if +I am going to add that to git-annex though. It's already possible to do via +the regular git `post-commit` hook. Just make it look at the commit to see +what files were added, and then run `git annex metadata` to set their +metadata appropriately. It would be good to at least have an example of +such a script to eg, extract EXIF or ID3 metadata. Perhaps someone can +contribute one? diff --git a/doc/devblog/day_121__special_remote_maintenance.mdwn b/doc/devblog/day_121__special_remote_maintenance.mdwn new file mode 100644 index 000000000..551704885 --- /dev/null +++ b/doc/devblog/day_121__special_remote_maintenance.mdwn @@ -0,0 +1,23 @@ +Turns out that in the last release I broke making box.com, Amazon S3 and +Glacier remotes from the webapp. Fixed that. + +Also, dealt with changes in the haskell DAV library that broke support for +box.com, and worked around an exception handling bug in the library. + +I think I should try to enhance the test suite so it can run live tests +on special remotes, which would at least have caught the some of these +recent problems... + +---- + +Since metadata is tied to a particular key, editing an annexed file, +which causes the key to change, made the metadata seem to get lost. + +I've now fixed this; it copies the metadata from the old version to the new +one. (Taking care to copy the log file identically, so git can reuse its +blob.) + +That meant that `git annex add` has to check every file it adds to see if +there's an old version. Happily, that check is fairly fast; I benchmarked my +laptop running 2500 such checks a second. So it's not going to slow things +down appreciably. diff --git a/doc/devblog/day_122_more_windows_porting.mdwn b/doc/devblog/day_122_more_windows_porting.mdwn new file mode 100644 index 000000000..7b496f670 --- /dev/null +++ b/doc/devblog/day_122_more_windows_porting.mdwn @@ -0,0 +1,4 @@ +More Windows porting. Made the build completely `-Wall` safe on Windows. +Fixed some DOS path separator bugs that were preventing WebDav from +working. Have now tested both box.com and Amazon S3 to be completely +working in the webapp on Windows. diff --git a/doc/devblog/day_123__stuck.mdwn b/doc/devblog/day_123__stuck.mdwn new file mode 100644 index 000000000..c48507cf0 --- /dev/null +++ b/doc/devblog/day_123__stuck.mdwn @@ -0,0 +1,13 @@ +Not a lot accomplished today. Some release prep, followed up to a few bug +reports. + +Split git-annex's .git/annex/tmp into two directories. .git/annex/tmp will +now be used only for partially transferred objects, while +.git/annex/misctmp will be used for everything else. In particular this +allows symlinking .git/annex/tmp to a ram disk, if you want to do that. +(It's not possible for .git/annex/misctmp to be on a different filesystem +from the rest of the repository for various reasons.) + +Beat on Windows XMPP for several more painful hours. Got all the haskell +bindings installed, except for gnuidn. And patched network-client-xmpp to +build without gnuidn. Have not managed to get it to link. diff --git a/doc/devblog/day_124__day_off.mdwn b/doc/devblog/day_124__day_off.mdwn new file mode 100644 index 000000000..c8c8f0109 --- /dev/null +++ b/doc/devblog/day_124__day_off.mdwn @@ -0,0 +1,13 @@ +Did not plan to work on git-annex today.. + +Unexpectedly ended up making the webapp support HTTPS. Not by default, +but if a key and certificate are provided, it'll use them. Great for +using the webapp remotely! See the new tip: [[tips/remote_webapp_setup]]. + +Also removed support for --listen with a port, which was buggy and not +necessary with HTTPS. + +Also fixed several webapp/assistant bugs, including one that let it be run in +a bare git repository. + +And, made the quvi version be probed at runtime, rather than compile time. diff --git a/doc/devblog/day_125__metadata_and_views.mdwn b/doc/devblog/day_125__metadata_and_views.mdwn new file mode 100644 index 000000000..471457355 --- /dev/null +++ b/doc/devblog/day_125__metadata_and_views.mdwn @@ -0,0 +1,11 @@ +Worked on metadata and views. Besides bugfixes, two features of note: + +Made git-annex run a hook script, pre-commit-annex. And I wrote a +sample script that extracts metadata from lots of kinds of files, +including photos and sound files, using extract(1) to do the heavy lifting. +See [[tips/automatically_adding_metadata]]. + +Views can be filtered to not include a tag or a field. +For example, `git annex view tag=* !old year!=2013` + +Today's work was sponsored by Stephan Schulz diff --git a/doc/devblog/day_128__release_prep.mdwn b/doc/devblog/day_128__release_prep.mdwn new file mode 100644 index 000000000..d43d2f877 --- /dev/null +++ b/doc/devblog/day_128__release_prep.mdwn @@ -0,0 +1,27 @@ +Preparing for a release (probably tomorrow or Friday). + +Part of that was updating the autobuilders. Had to deal with the gnutls +security hole fix, and upgrading that on the OSX autobuilder turned out to +be quite complicated due to library version skew. Also, I switched the +linux autobuilders over to building from Debian unstable, rather than +stable. That should be ok to do now that the standalone build bundles all +the libraries it needs... And the arm build has always used unstable, and +has been reported working on a lot of systems. So I think this will be +safe, but have backed up the old autobuilder chroots just in case. + +Also been catching up on bug reports and traffic and +and dealt with quite a lot of things today. Smarter log file +rotation for the assistant, better webapp behavior when git is not +installed, and a fix for the webdav 5 second timeout problem. + +Perhaps the most interesting change is a new `annex.startupscan` setting, +which can be disabled to prevent the assistant from doing the expensive +startup scan. This means it misses noticing any files that changed since it +last run, but this should be useful for those really big repositories. + +(Last night, did more work on the test suite, including even more checking +of merge conflict resolution.) + +---- + +Today's work was sponsored by Michael Alan Dorman. diff --git a/doc/devblog/day_12__gpg_key_generation.mdwn b/doc/devblog/day_12__gpg_key_generation.mdwn new file mode 100644 index 000000000..c79c49f85 --- /dev/null +++ b/doc/devblog/day_12__gpg_key_generation.mdwn @@ -0,0 +1,35 @@ +I decided to keep gpg key generation very simple for now. So it generates a +special-purpose key that is only intended to be used by git-annex. It +hardcodes some key parameters, like RSA and 4096 bits (maximum recommended +by gpg at this time). And there is no password on the key, although you can +of course edit it and set one. This is because anyone who can access the +computer to get the key can also look at the files in your git-annex +repository. Also because I can't rely on gpg-agent being installed +everywhere. All these simplifying assumptions may be revisited later, but +are enough for now for someone who doesn't know about gpg (so doesn't +have a key already) and just wants an encrypted repo on a +removable drive. + +Put together a simple UI to deal with gpg taking quite a while to +generate a key ... + +[[assistant/genkey.png]] + +[[assistant/repoinfo.png]] + +Then I had to patch git-remote-gcrypt again, to have a per-remote +signingkey setting, so that these special-purpose keys get used for signing +their repo. + +Next, need to add support for adding an existing gcrypt repo as a remote +(assuming it's encrypted to an available key). Then, gcrypt repos on ssh +servers.. + +---- + +Also dealt with build breakage caused by a new version of the Haskell DNS +library. + +---- + +Today's work was sponsored by Joseph Liu. diff --git a/doc/devblog/day_12__gpg_key_generation/comment_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment b/doc/devblog/day_12__gpg_key_generation/comment_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment new file mode 100644 index 000000000..d7a6a8631 --- /dev/null +++ b/doc/devblog/day_12__gpg_key_generation/comment_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-09-18T05:00:12Z" + content=""" +Should be \"PGP\" or *at least* \"GnuPG\". +"""]] diff --git a/doc/devblog/day_130__post_release.mdwn b/doc/devblog/day_130__post_release.mdwn new file mode 100644 index 000000000..b6a2af6c8 --- /dev/null +++ b/doc/devblog/day_130__post_release.mdwn @@ -0,0 +1,17 @@ +Release made yesterday, but only finished up the armel build today. +And it turns out the OSX build was missing the webapp, so it's also been +updated today. + +Post release bug triage including: + +Added a nice piece of UI to the webapp on user request: A "Sync now" menu +item in the repository for each repo. (The one for the current repo syncs with +all its remotes.) + +Copying files to a git repository on the same computer turns out to have +had a resource leak issue, that caused 1 zombie process per file. With +some tricky monad state caching, fixed that, and also eliminated 8% of the work +done by git-annex in this case. + +Fixed `git annex unused` in direct mode to not think that files that were +deleted out of the work tree by the user still existed and were unused. diff --git a/doc/devblog/day_131__more_bug_squashing.mdwn b/doc/devblog/day_131__more_bug_squashing.mdwn new file mode 100644 index 000000000..3c256f1fb --- /dev/null +++ b/doc/devblog/day_131__more_bug_squashing.mdwn @@ -0,0 +1,11 @@ +Squashed three or four more bugs today. Unanswered message backlog is down +to 27. + +The most interesting problem today is that the git-repair code was using +too much memory when `git-fsck` output a lot of problems (300 thousand!). I +managed to half the memory use in the worst case (and reduced it much more +in more likely cases). But, don't really feel I can close that bug yet, +since really big, really badly broken repositories can still run it out of +memory. It would be good to find a way to reorganize the code so that the +broken objects list streams through git-repair and never has to all be +buffered in memory at once. But this is not easy. diff --git a/doc/devblog/day_132__database_musings.mdwn b/doc/devblog/day_132__database_musings.mdwn new file mode 100644 index 000000000..76ce14c32 --- /dev/null +++ b/doc/devblog/day_132__database_musings.mdwn @@ -0,0 +1,17 @@ +Updated the Debian stable backport to the last release. Also it seems that +the last release unexpectedly fixed XMPP SIGILL on some OSX machines. +Apparently when I rebuilt all the libraries recently, it somehow fixed that +[[old_unsolved_bug|bugs/Share_with_friends_crash_in_osx]]. + +[RichiH](http://richardhartmann.de/) suggested "wrt ballooning memory on +repair: can you read in broken +stuff and simply stop reading once you reach a certain threshold, then +start repairing, re-run fsck, etc?" .. I had considered that but was +not sure it would work. I think I've gotten it to work. + +Now working on a design for using a [[design/caching_database]] +for some parts of git-annex. My initial benchmarks using SQLite +indicate it would slow down associated file lookups by nearly an order of +magnitude compared with the current ".map files" implementation. +(But would scale better in edge cases). OTOH, using a SQLite +database to index metadata for use in views looks very promising. diff --git a/doc/devblog/day_133__db_and_bugfixes.mdwn b/doc/devblog/day_133__db_and_bugfixes.mdwn new file mode 100644 index 000000000..5ba1df20e --- /dev/null +++ b/doc/devblog/day_133__db_and_bugfixes.mdwn @@ -0,0 +1,20 @@ +Did some more exploration and perf tuning and thinking on caching +databases, and am pretty sure I know how I want to implement it. Will be +several stages, starting with using it for generating views, and ending(?) +with using it for direct mode file mappings. + +Not sure I'm ready to dive into that yet, so instead spent the rest of the +day working on small bugfixes and improvements. Only two significant ones.. + +Made the webapp use a constant time string comparison (from `securemem`) +to check if its auth token is valid. This could help avoid a potential +timing attack to guess the auth token, although that is theoretical. +Just best practice to do this. + +Seems that openssh 6.5p1 had another hidden surprise (in addition to +its now-fixed bug in handing hostnames in `.ssh/config`) -- it broke +the method git-annex was using for stopping a cached ssh connection, +which led to some timeouts for failing DNS lookups. If git-annex seems +to stall for a few seconds at startup/shutdown, that may be why +(--debug will say for sure). I seem to have found a workaround that +avoids this problem. diff --git a/doc/devblog/day_134-135__avoiding_the_turing_tarpit.mdwn b/doc/devblog/day_134-135__avoiding_the_turing_tarpit.mdwn new file mode 100644 index 000000000..d18470ae0 --- /dev/null +++ b/doc/devblog/day_134-135__avoiding_the_turing_tarpit.mdwn @@ -0,0 +1,18 @@ +Added some power and convenience to [[preferred_content]] expressions. + +Before, "standard" was a special case. Now it's a first-class keyword, +so you can do things like "standard or present" to use the standard +preferred content expression, modified to also want any file that happens +to be present. + +Also added a way to write your own reusable preferred content expressions, +tied to groups. To make a repository use them, set its preferred +content to "groupwanted". Of course, "groupwanted" is also a first-class +keyword, so "not groupwanted" or something can also be done. + +While I was at it, I made `vicfg` show the built-in standard preferred +content expressions, for reference. This little IDE should be pretty +self-explanatory, I hope. + +So, preferred content is almost its own little programming language now. +Except I was careful to not allow recursion. ;) diff --git a/doc/devblog/day_136__frustrating_day.mdwn b/doc/devblog/day_136__frustrating_day.mdwn new file mode 100644 index 000000000..9088093d4 --- /dev/null +++ b/doc/devblog/day_136__frustrating_day.mdwn @@ -0,0 +1,10 @@ +The website broke and I spent several hours fixing it, changing the +configuration to not let it break like this again, cleaning up after it, +etc. + +Did manage to make a few minor bugfixes and improvements, but nothing +stunning. + +---- + +I'll be attending LibrePlanet at MIT this weekend. diff --git a/doc/devblog/day_137-138__bug_triage_and_too_much_windows.mdwn b/doc/devblog/day_137-138__bug_triage_and_too_much_windows.mdwn new file mode 100644 index 000000000..28b197356 --- /dev/null +++ b/doc/devblog/day_137-138__bug_triage_and_too_much_windows.mdwn @@ -0,0 +1,15 @@ +Yesterday, worked on cleaning up the todo list. Fixed Windows slash problem +with rsync remotes. Today, more Windows work; it turns out to have been +quite buggy in its handling of non-ASCII characters in filenames. Encoding +stuff is never easy for me, but I eventually managed to find a way to fix +that, although I think there are other filename encoding problems lurking +in git-annex on Windows still to be dealt with. + +Implemented an interesting metadata feature yesterday. It turns out that +metadata can have metadata. Particularly, it can be useful to know when a +field was last set. That was already beeing tracked, internally (to make +union merging work), so I was able to quite cheaply expose it as +"$field-lastchanged" metadata that can be used like any other metadata. + +I've been thinking about how to implement [[todo/required_content]] +expressions, and think I have a reasonably good handle on it. diff --git a/doc/devblog/day_139-140__traveling.mdwn b/doc/devblog/day_139-140__traveling.mdwn new file mode 100644 index 000000000..3025e45b5 --- /dev/null +++ b/doc/devblog/day_139-140__traveling.mdwn @@ -0,0 +1,17 @@ +Yesterday coded up one nice improvement on the plane -- `git annex unannex` +(and `uninit`) is now tons faster. Before it did a git commit after every +file processed, now there's just 1 commit at the end. This required using +some locking to prevent the `pre-commit` hook from running in a confusing +state. + +Today. LibrePlanet and a surprising amount of development. I've +added [[tips/file_manager_integration]], only for Nautilus so far. +The main part of this was adding --notify-start and --notify-finish, which +use dbus desktop notifications to provide feedback. + +(Made possible thanks to Max Rabkin for updating +[fdo-notify](http://hackage.haskell.org/package/fdo-notify) to use the +new dbus library, and ion for developing the initial Nautilus integration +scripts.) + +Today's work and LibrePlanet visit was sponsored by Jürgen Lüters. diff --git a/doc/devblog/day_13__encrypted_sneakernet_working.mdwn b/doc/devblog/day_13__encrypted_sneakernet_working.mdwn new file mode 100644 index 000000000..777da255a --- /dev/null +++ b/doc/devblog/day_13__encrypted_sneakernet_working.mdwn @@ -0,0 +1,13 @@ +Spent basically all of today getting the assistant to be able to handle +gcrypt special remotes that already exist when it's told to add a USB +drive. This was quite tricky! And I did have to skip handling gcrypt repos +that are not git-annex special remotes. + +Anyway, it's now almost easy to set up an encrypted sneakernet +using a USB drive and some computers running the webapp. The only part +that the assistant doesn't help with is gpg key management. + +Plan is to make a release on Friday, and then try to also add support for +encrypted git repositories on remote servers. Tomorrow I will try to get +through some of the communications backlog that has been piling up while I +was head down working on gcrypt. diff --git a/doc/devblog/day_141__f-droid_sprint.mdwn b/doc/devblog/day_141__f-droid_sprint.mdwn new file mode 100644 index 000000000..2a9e30b55 --- /dev/null +++ b/doc/devblog/day_141__f-droid_sprint.mdwn @@ -0,0 +1,3 @@ +Attended at the f-droid sprint at LibrePlanet, and have been getting a +handle on how their build server works with an eye toward adding git-annex +to it. Not entirely successful getting vagrant to build an image yet. diff --git a/doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment b/doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment new file mode 100644 index 000000000..9971f33da --- /dev/null +++ b/doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmJuOOkYYguRbWhXzxihIPBavxITJIMyww" + nickname="Matt" + subject="Excellent News" + date="2014-03-26T14:14:35Z" + content=""" +It will be great to see git-annex on f-droid! +"""]] diff --git a/doc/devblog/day_142__digging_out.mdwn b/doc/devblog/day_142__digging_out.mdwn new file mode 100644 index 000000000..fc2ceea36 --- /dev/null +++ b/doc/devblog/day_142__digging_out.mdwn @@ -0,0 +1,13 @@ +Catching up on conference backlog. 36 messages backlog remains. + +Fixed `git-annex-shell configlist` to automatically initialize a +git remote when a git-annex branch had been pushed to it. This is necessary +for gitolite to be easy to use, and I'm sure it used to work. + +Updated the Debian backport and made a Debian package of the +fdo-notify haskell library used for notifications. + +Applied a patch from Alberto Berti to fix support for tahoe-lafs +1.10. + +And various other bug fixes and small improvements. diff --git a/doc/devblog/day_143__foolish_hiatus.mdwn b/doc/devblog/day_143__foolish_hiatus.mdwn new file mode 100644 index 000000000..f6763dff3 --- /dev/null +++ b/doc/devblog/day_143__foolish_hiatus.mdwn @@ -0,0 +1,20 @@ +Last week's trip was productive, but I came home more tired than I +realized. Found myself being snappy & stressed, so I have been on break. + +I did do a little git-annex dev in the past 5 days. On Saturday I +implemented [[todo/preferred_content]] (although without the active checks +I think it probably ought to have.) Yesterday I had a long conversation +with the Tahoe developers about improving git-annex's tahoe integration. + +Today, I have been wrapping up [building propellor](http://joeyh.name/code/propellor/). +To test its docker support, I used propellor to build and deploy a +container that is a git-annex autobuilder. I'll be replacing the old +autobuilder setup with this shortly, and expect to also publish docker +images for git-annex autobuilders, so anyone who wants to can run their +own autobuilder really easily. + +--- + +I have April penciled in on the roadmap as the month to do telehash. +I don't know if telehash-c is ready for me yet, but it has had a lot of +activity lately, so this schedule may still work out! diff --git a/doc/devblog/day_144__catching_up.mdwn b/doc/devblog/day_144__catching_up.mdwn new file mode 100644 index 000000000..52e25f0d5 --- /dev/null +++ b/doc/devblog/day_144__catching_up.mdwn @@ -0,0 +1,12 @@ +Got caught up on all recent bugs and questions, although I still have a +backlog of 27 older things that I really should find time for. + +Fixed a couple of bugs. One was that the assistant set up ssh +`authorized_keys` that didn't work with the fish shell. + +Also got caught up on the current state of telehash-c. Have not quite +gotten it to work, but it seems pretty close to being able to see it do +something useful for the first time. + +Pushing out a release this evening with a good number of changes left over +from March. diff --git a/doc/devblog/day_144__catching_up/comment_1_311a7245dd12f1a7e432168d16041348._comment b/doc/devblog/day_144__catching_up/comment_1_311a7245dd12f1a7e432168d16041348._comment new file mode 100644 index 000000000..f13ed82ae --- /dev/null +++ b/doc/devblog/day_144__catching_up/comment_1_311a7245dd12f1a7e432168d16041348._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="70.82.37.38" + subject="comment 1" + date="2014-04-02T21:28:15Z" + content=""" +awesome! can't wait to see telehash land! :) +"""]] diff --git a/doc/devblog/day_145__a_plan.mdwn b/doc/devblog/day_145__a_plan.mdwn new file mode 100644 index 000000000..5f18ab806 --- /dev/null +++ b/doc/devblog/day_145__a_plan.mdwn @@ -0,0 +1,16 @@ +I have a plan for this month. While waiting for telehash, I am going to +build [[design/git-remote-daemon]], which is the infrastructure git-annex +will need, to use telehash. Since it's generalized to support other protocols, +I'll be able to start using it before telehash is ready. + +In fact, I plan to first make it work with ssh:// remotes, where +it will talk with git-annex-shell on the remote server. This will let the +assistant immediately know when the server has received a commit, and that +will simplify using the assistant with a ssh server -- no more need for +XMPP in this case! It should also work with git-remote-gcrypt encrypted +repositories, so also covers the case of an untrusted ssh server where +everything is end-to-end encrypted. + +Building the git-annex-shell part of this should be pretty easy, and +building enough of the [[design/git-remote-daemon]] design to support it +also not hard. diff --git a/doc/devblog/day_145__a_plan/comment_1_c0ceea77443be1172527ed8549f000a4._comment b/doc/devblog/day_145__a_plan/comment_1_c0ceea77443be1172527ed8549f000a4._comment new file mode 100644 index 000000000..6bcc18bc2 --- /dev/null +++ b/doc/devblog/day_145__a_plan/comment_1_c0ceea77443be1172527ed8549f000a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="look at mosh" + date="2014-04-04T14:07:51Z" + content=""" +you may want to look at how \"mosh\" handles authentication: http://mosh.mit.edu/ + +from what i understand, it negociates an authentication token using SSH and then uses that to encrypt and authenticate UDP traffic. seems like similar issues here... +"""]] diff --git a/doc/devblog/day_146__halfway_to_git-remote-daemon.mdwn b/doc/devblog/day_146__halfway_to_git-remote-daemon.mdwn new file mode 100644 index 000000000..977123f55 --- /dev/null +++ b/doc/devblog/day_146__halfway_to_git-remote-daemon.mdwn @@ -0,0 +1,17 @@ +Added `git-annex-shell notifychanges` command, which uses inotify (etc) +to detect when git refs have changed, and informs the caller about the +changes. This was relatively easy to write; I reused the existing inotify +code, and factored out code for simple line-based protocols from the +external special remote protocol. Also implemented the git-remote-daemon +protocol. 200 lines of code total. + +Meanwhile, Johan Kiviniemi improved the dbus notifications, making them +work on Ubuntu and adding icons. Awesome! + +There's going to be some fun to get git-annex-shell upgraded so that the +assistant can use this new notify feaure. While I have not started working +on the assistant side of this, you can get a jump by installing today's +upcoming release of git-annex. I had to push this out early because there +was a bug that prevented the webapp from running on non-gnome systems. Since +all changes in this release only affected Linux, today's release will be a +Linux-only release. diff --git a/doc/devblog/day_147__git-annex_remotedaemon.mdwn b/doc/devblog/day_147__git-annex_remotedaemon.mdwn new file mode 100644 index 000000000..0e500ec40 --- /dev/null +++ b/doc/devblog/day_147__git-annex_remotedaemon.mdwn @@ -0,0 +1,5 @@ +Built `git-annex remotedaemon` command today. It's buggy, but it already +works! If you have a new enough git-annex-shell on a remote server, you can +run "git annex remotedaemon" in a git-annex repository, and it will notice +any pushes that get made to that remote from any other clone, and pull down +the changes. diff --git a/doc/devblog/day_148__too_many_documents.mdwn b/doc/devblog/day_148__too_many_documents.mdwn new file mode 100644 index 000000000..3cb5e5baf --- /dev/null +++ b/doc/devblog/day_148__too_many_documents.mdwn @@ -0,0 +1,8 @@ +Various bug triage today. Was not good for much after shuffling paper for +the whole first part of the day, but did get a few little things done. + +Re , git-annex does not use OpenSSL itself, +but when using XMPP, the remote server's key could have been intercepted +using this new technique. Also, the git-annex autobuilds and this website +are served over https -- working on generating new https certificates now. +Be safe out there.. diff --git a/doc/devblog/day_149__remote_control_working.mdwn b/doc/devblog/day_149__remote_control_working.mdwn new file mode 100644 index 000000000..56c108b7b --- /dev/null +++ b/doc/devblog/day_149__remote_control_working.mdwn @@ -0,0 +1,15 @@ +[[design/git-remote-daemon]] is tied into the assistant, and working! +Since it's not really ready yet, this is in the `remotecontrol` branch. + +My test case for this is two client repositories, both running +the assistant. Both have a bare git repository, accessed over ssh, +set up as their only remote, and no other way to keep in touch with +one-another. When I change a file in one repository, +the other one instantly notices the change and syncs. + +This is gonna be *awesome*. Much less need for XMPP. Windows will be fully +usable even without XMPP. Also, most of the work I did today will be fully +reused when the telehash backend gets built. The telehash-c developer is +making noises about it being almost ready for use, too! + +Today's work was sponsored by Frédéric Schütz. diff --git a/doc/devblog/day_149__signal.mdwn b/doc/devblog/day_149__signal.mdwn new file mode 100644 index 000000000..2bcb01a72 --- /dev/null +++ b/doc/devblog/day_149__signal.mdwn @@ -0,0 +1,16 @@ +[[!meta title="day 150 signal"]] + +The git-remote-daemon now robustly handles loss of signal, with +reconnection backoffs. And it detects if the remote ssh server has too +old a version of git-annex-shell and the webapp will display a warning +message. + +[[!img /assistant/connection.png]] + +Also, made the webapp show a network signal bars icon next to both +ssh and xmpp remotes that it's currently connected with. And, updated the +webapp's nudging to set up XMPP to now suggest either an XMPP or a ssh remote. + +I think that the `remotecontrol` branch is nearly ready for merging! + +Today's work was sponsored by Paul Tagliamonte. diff --git a/doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn b/doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn new file mode 100644 index 000000000..2ff1d16dd --- /dev/null +++ b/doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn @@ -0,0 +1,26 @@ +Spent a few hours improving gcrypt in some minor ways, including adding a +--check option that the assistant can use to find out if a given repo is +encrypted with dgit, and also tell if the necessary gpg key is available to +decrypt it. Also merged in a fix to support subkeys, developed by a +git-annex user who is the first person I've heard from who is using gcrypt. +I don't want to maintain gcrypt, so I am glad its author has shown up +again today. + +Got mostly caught up on backlog. The main bug I was able to track down +today is git-annex using a lot of memory in certian repositories. This +turns out to have happened when a really large file was committed right +intoo to the git repository (by mistake or on purpose). Some parts of +git-annex buffer file contents in memory while trying to work out if +they're git-annex keys. Fixed by making it first check if a file in git is +marked as a symlink. Which was really hard to do! + +At least 4 people ran into this bug, which makes me suspect that lots of +people are messing up when using direct mode (probably due to not reading +the documentation, or having `git commit -a` hardwired into their fingers, +and forcing git to commit large files into their repos, rather than having +git-annex manage them. Implementing [[todo/direct_mode_guard]] seems more +urgent now. + +---- + +Today's work was sponsored by Amitai Schlair. diff --git a/doc/devblog/day_15-17__Android_rebuild.mdwn b/doc/devblog/day_15-17__Android_rebuild.mdwn new file mode 100644 index 000000000..758e2d097 --- /dev/null +++ b/doc/devblog/day_15-17__Android_rebuild.mdwn @@ -0,0 +1,67 @@ +Made a release on Friday. But I had to rebuild the OSX and Linux standalone +builds today to fix a bug in them. + +Spent the past **three days** redoing the whole Android build environment. +I've been progressively moving from my first hacked up Android build env to +something more reproducible and sane. Finally I am at the point where I can +run a shell script (well, actually, 3 shell scripts) and get an Android +build chroot. It's still not immune to breaking when new versions of +haskell libs are uploaded, but this is much better, and should be +maintainable going forward. + +This is a good starting point for getting git-annex into the F-Droid app +store, or for trying to build with a newer version of the Android SDK and +NDK, to perhaps get it working on Android 4.3. (Eventually. I am so sick +of building Android stuff right now..) + +Friday was all spent struggling to get ghc-android to build. I had not built +it successfully since February. I finally did, +on Saturday, and I have made my own fork of it which builds using a +known-good snapshot of the current development version of ghc. Building +this in a Debian stable chroot means that there should be no possibility +that upstream changes will break the build again. + +With ghc built, I moved on to building all the haskell libs git-annex +needs. Unfortunately my build script for these also has stopped working +since I made it in April. I failed to pin every package at a defined +version, and things broke. + +So, I redid the build script, and updated all the haskell libs to the +newest versions while I was at it. I have decided not to pin the library +versions (at least until I find a foolproof way to do it), so this new +script will break in the future, but it should break in a way I can fix up +easily by just refreshing a patch. + +The new ghc-android build has a nice feature of at least being able to +compile Template Haskell code (though still not run it at compile time. +This made the patching needed in the Haskell libs quite a lot less. Offset +somewhat by me needing to make general fixes to lots of libs to build with +ghc head. Including some fun with `==#` changing its type from `Bool` to +`Int#`. In all, I think I removed around 2.5 thousand lines of patches! +(Only 6 thousand lines to go...) + +Today I improved ghc-android some more so it cross builds several C libraries +that are needed to build several haskell libraries needed for XMPP. +I had only ever built those once, and done it by hand, and very hackishly. +Now they all build automatically too. + +And, I put together a script that builds the debian stable chroot and +installs ghc-android. + +And, I hacked on the EvilSplicer (which is sadly still needed) to +work with the new ghc/yesod/etc. + +At this point, I have git-annex successfully building, including the APK! + +---- + +In a bored hour waiting for a compile, I also sped up `git annex add` +on OSX by I think a factor of 10. Using cryptohash for hash calculation +now, when external hash programs are not available. It's still a few +percentage points slower than external hash programs, or I'd use it by +default. + +---- + +This period of important drudgery was sponsored by an unknown bitcoin +user, and by Bradley Unterrheiner and Andreas Olsson. diff --git a/doc/devblog/day_151__birthday_bug.mdwn b/doc/devblog/day_151__birthday_bug.mdwn new file mode 100644 index 000000000..251bfb935 --- /dev/null +++ b/doc/devblog/day_151__birthday_bug.mdwn @@ -0,0 +1,18 @@ +Pushed out a new release today, fixing two important bugs, followed by a +second release which fixed the bugs harder. + +Automatic upgrading was broken on OSX. The webapp will tell you upgrading +failed, and you'll need to manually download the .dmg and install it. + +With help from Maximiliano Curia, finally tracked down a bug I have been +chasing for a while where the assistant would start using a lot of CPU +while not seeming to be busy doing anything. Turned out to be triggered by +a scheduled fsck that was configured to run once a month with no particular +day specified. + +That bug turned out to affect users who first scheduled such a fsck job +after the 11th day of the month. So I expedited putting a release out to +avoid anyone else running into it starting tomorrow. + +(Oddly, the 11th day of this month also happens to be my birthday. I did not +expect to have to cut 2 releases today..) diff --git a/doc/devblog/day_152__more_ssh_connection_caching.mdwn b/doc/devblog/day_152__more_ssh_connection_caching.mdwn new file mode 100644 index 000000000..ad472b5e5 --- /dev/null +++ b/doc/devblog/day_152__more_ssh_connection_caching.mdwn @@ -0,0 +1,37 @@ +Made ssh connection caching be used in several more places. `git annex +sync` will use it when pushing/pulling to a remote, as will the assistant. +And `git-annex remotedaemon` also uses connection caching. So, when +a push lands on a ssh remote, the assistant will immediately notice it, and +pull down the change over the same TCP connection used for the +notifications. + +This was a bit of a pain to do. Had to set `GIT_SSH=git-annex` and then +when git invokes git-annex as ssh, it runs ssh with the connection caching +parameters. + +Also, improved the network-manager and wicd code, so it detects when a +connection has gone down. That propagates through to the remote-daemon, +which closes all ssh connections. I need to also find out how to detect +network connections/disconnections on OSX.. + +Otherwise, the remote-control branch seems ready to be merged. But I want +to test it for a while first. + +---- + +Followed up on yesterday's bug with writing some test cases for +Utility.Scheduled, which led to some more bug fixes. Luckily nothing +I need to rush out a release over. In the end, the code got a lot +simpler and clearer. + +[[!format haskell """ +-- Check if the new Day occurs one month or more past the old Day. +oneMonthPast :: Day -> Day -> Bool +new `oneMonthPast` old = fromGregorian y (m+1) d <= new + where + (y,m,d) = toGregorian old +"""]] + +------- + +Today's work was sponsored by Asbjørn Sloth Tønnesen. diff --git a/doc/devblog/day_153__remotedaemon_has_landed.mdwn b/doc/devblog/day_153__remotedaemon_has_landed.mdwn new file mode 100644 index 000000000..5033b32b2 --- /dev/null +++ b/doc/devblog/day_153__remotedaemon_has_landed.mdwn @@ -0,0 +1,10 @@ +After fixing a few bugs in the `remotecontrol` branch, It's landed in +`master`. Try a daily build today, and see if the assistant can keep in +sync using nothing more than a remote ssh repository! + +So, now all the groundwork for telehash is laid too. I only need a +telehash library to start developing on top of. Development on telehash-c +is continuing, but I'm more excited that +[htelehash](https://github.com/alanz/htelehash/tree/v2) +has been revived and is being updated to the v2 protocol, seemingly quite +quickly. diff --git a/doc/devblog/day_153__remotedaemon_has_landed/comment_1_f19ae6b3d6f33a68e4ffe0c32f788745._comment b/doc/devblog/day_153__remotedaemon_has_landed/comment_1_f19ae6b3d6f33a68e4ffe0c32f788745._comment new file mode 100644 index 000000000..5ff090ffd --- /dev/null +++ b/doc/devblog/day_153__remotedaemon_has_landed/comment_1_f19ae6b3d6f33a68e4ffe0c32f788745._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject=" remotedaemon in pre-built tarballs" + date="2014-04-17T07:40:25Z" + content=""" +Hi Joey, + +can you tell me when the pre-built Linux tarballs will include the remotedaemon? +Are they updated on a daily basis? + +Best regards, Georg +"""]] diff --git a/doc/devblog/day_153__remotedaemon_has_landed/comment_2_fbf0c50f772e958af638d2b72dac73f5._comment b/doc/devblog/day_153__remotedaemon_has_landed/comment_2_fbf0c50f772e958af638d2b72dac73f5._comment new file mode 100644 index 000000000..5f81fde5c --- /dev/null +++ b/doc/devblog/day_153__remotedaemon_has_landed/comment_2_fbf0c50f772e958af638d2b72dac73f5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 2" + date="2014-04-17T19:31:30Z" + content=""" +The daily builds are updated on a daily basis, so already include it. + +The release builds are updated on each release, and so do not. +"""]] diff --git a/doc/devblog/day_154__catching_up.mdwn b/doc/devblog/day_154__catching_up.mdwn new file mode 100644 index 000000000..7c49a788e --- /dev/null +++ b/doc/devblog/day_154__catching_up.mdwn @@ -0,0 +1,13 @@ +Worked through message backlog today. Got it down from around 70 to just +37. Was able to fix some bugs, including making the webapp start up more +robustly in some misconfigurations. + +Added a new `findref` command which may be useful in a git `update` hook to +deny pushes of refs if the annexed content has not been sent first. + +---- + +BTW, I also added a new `reinit` command a few days ago, which can be +useful if you're cloning back a deleted repository. + +Also a few days ago, I made `uninit` a *lot* faster. diff --git a/doc/devblog/day_155__missing_bits.mdwn b/doc/devblog/day_155__missing_bits.mdwn new file mode 100644 index 000000000..aa8fd9d4e --- /dev/null +++ b/doc/devblog/day_155__missing_bits.mdwn @@ -0,0 +1,27 @@ +Sometimes you don't notice something is missing for a long time until +it suddenly demands attention. Like today. + +Seems the webapp never had a way to stop using XMPP and delete the XMPP +password. So I added one. + +The new support for instantly noticing changes on a ssh remote forgot to +start up a connection to a new remote after it was created. Fixed that. + +(While doing some testing on Android for unrelated reasons, I noticed that +my android tablet was pushing photos to a ssh server and my laptop +immediately noticed and downloaded them from tere, which is an excellent +demo. I will deploy this on my trip in Brazil next week. Yes, I'm spending +2 weeks in Brazil with git-annex users; more on this later.) + +Finally, it turns out that "installing" git-annex from the standalone +tarball, or DMG, on a server didn't make it usable by the webapp. Because +git-annex shell is not in PATH on the server, and indeed git and rsync may +not be in PATH either if they were installed with the git-annex bundle. +Fixed this by making the bundle install a ~/.ssh/git-annex-wrapper, which +the webapp will detect and use. + +Also, quite a lot of other bug chasing activity. + +---- + +Today's work was sponsored by Thomas Koch. diff --git a/doc/devblog/day_155__missing_bits/comment_1_76424498600ba603946035efffb88023._comment b/doc/devblog/day_155__missing_bits/comment_1_76424498600ba603946035efffb88023._comment new file mode 100644 index 000000000..d9ee528e0 --- /dev/null +++ b/doc/devblog/day_155__missing_bits/comment_1_76424498600ba603946035efffb88023._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 1" + date="2014-04-20T23:58:51Z" + content=""" +thanks! +"""]] diff --git a/doc/devblog/day_156__release_day.mdwn b/doc/devblog/day_156__release_day.mdwn new file mode 100644 index 000000000..7a312b234 --- /dev/null +++ b/doc/devblog/day_156__release_day.mdwn @@ -0,0 +1,14 @@ +I hope this will be a really good release. Didn't get all the way to +[[design/assistant/telehash]] this month, but the remotedaemon is pretty sweet. Updated [[design/roadmap]] +pushes telehash back again. + +The files in this release are now gpg signed, after recently moving the +downloads site to a dedicated server, which has a dedicated gpg key. +You can verify the detached signatures as an additional security check +over trusting SSL. The automatic upgrade code doesn't check the gpg +signatures yet. + +Sören Brunk has ported the webapp to Bootstrap 3. + +The branch is not ready for merging yet (it would break the Debian stable +backports), but that was a nice surprise. diff --git a/doc/devblog/day_157__upgrade_checking.mdwn b/doc/devblog/day_157__upgrade_checking.mdwn new file mode 100644 index 000000000..ff70b8093 --- /dev/null +++ b/doc/devblog/day_157__upgrade_checking.mdwn @@ -0,0 +1,22 @@ +Now git-annex's self-upgrade code will check the gpg signature of a +new version before using it. + +To do this I had to include the gpg public keys into the +git-annex distribution, and that raised the question of which public keys +to include. Currently I have both the dedicated git-annex distribution +signing key, and my own gpg key as a backup in case I somehow misplace the +former. + +Also spent a while looking at the recent logs on the web server. There +seem to be around 600 users of the assistant with +upgrade checking enabled. That breaks down to 68% Linux amd64, 20% Linux +i386, 11% OSX Mavericks, and 0.5% OSX Lion. + +Most are upgrading successfully, but there are a few that seem to +repeatedly fail for some reason. (Not counting the OSX Lion, which will +probably never find an upgrade available.) I hope that someone who is +experiencing an upgrade failure gets in touch with some debug logs. + +In the same time period, around 450 unique hosts manually downloaded a +git-anex distribution. Also compare with Debian popcon, which has 1200 +reporting git-annex users. diff --git a/doc/devblog/day_158__enroute_to_Brazil.mdwn b/doc/devblog/day_158__enroute_to_Brazil.mdwn new file mode 100644 index 000000000..cd9830f2e --- /dev/null +++ b/doc/devblog/day_158__enroute_to_Brazil.mdwn @@ -0,0 +1,10 @@ +Next month the roadmap has me working on [[design/assistant/sshpassword]]. +That will be a nice UI improvement and I'd be very surprised if it takes +more than a week, which is great. + +Getting a jump on it today, investigating using `SSH_ASKPASS`. It seems this +will even work on Windows! Preliminary design in [[design/assistant/sshpassword]]. + +Time to get on a plane to a plane to a plane to Brasilia! + +[[!meta date="Fri, 25 Apr 2014 16:32:36 -0400"]] diff --git a/doc/devblog/day_159__tmp_file_cleanup.mdwn b/doc/devblog/day_159__tmp_file_cleanup.mdwn new file mode 100644 index 000000000..d1ef58109 --- /dev/null +++ b/doc/devblog/day_159__tmp_file_cleanup.mdwn @@ -0,0 +1,12 @@ +Today was mostly spent driving across Brazil, but I had energy this evening +for a little work on git-annex. + +Made the assistant delete old temporary files on startup. I've had +scattered reports of a few users whose `.git/annex/tmp` contained many +files, apparently put there by the assistant when it locks down a file +prior to annexing it. That seems it could possibly be a bug -- or it could +just be unclean shutdowns interrupting the assistant. Anyway, this will +deal with any source of tmp cruft, and I made sure to preserve +tmp files for partially downloaded content. + +[[!meta date="Sun, 27 Apr 2014 22:12:55 -0300"]] diff --git a/doc/devblog/day_160__.mdwn b/doc/devblog/day_160__.mdwn new file mode 100644 index 000000000..2c20d2f0d --- /dev/null +++ b/doc/devblog/day_160__.mdwn @@ -0,0 +1,20 @@ +Reviewed Sören's updated bootstrap3 patch, which appeared while I was +[traveling](http://joeyh.name/blog/entry/the_real_Brazil/). Sören +kindly fixed it to work with Debian stable's old version of Yesod, +which was quite a lot of work. The new new bootstrap3 UI looks nice, +found a few minor issues, but expect to be able to merge it soon. + +Started on [[design/assistant/sshpassword]] groundwork. Added a simple +password cache to the assistant, with automatic expiration, and made +git-annex be able to be run by ssh as the `SSH_ASKPASS` program. + +The main difficulty will be changing the webapp's UI to prompt for the ssh +password when one is needed. There are several code paths in ssh remote +setup where a password might be needed. Since the cached password expires, +it may need to be prompted for at any of those points. Since a new page is +loading, it can't pop up a prompt on the current page; it needs to redirect +to a password prompt page and then redirect back to the action that needed +the password. ...At least, that's one way to do it. +I'm going to sleep on it and hope I dream up a better way. + +[[!meta date="Tue, 29 Apr 2014 18:33:53 -0400"]] diff --git a/doc/devblog/day_161__routing_design.mdwn b/doc/devblog/day_161__routing_design.mdwn new file mode 100644 index 000000000..9c9e65d17 --- /dev/null +++ b/doc/devblog/day_161__routing_design.mdwn @@ -0,0 +1,13 @@ +I've moved out of implementation mode (unable to concentrate enough), and +into high-level design mode. + +[[Syncing efficiency|design/assistant/syncing/efficiency]] has been an open TODO for years, +to find a way to avoid flood filling the network, and find more efficient +ways to ensure data only gets to the nodes that want it. Relatedly, +Android devices often need a way to mark individual files they want to have. +Had a [very productive discussion with Vince and Fernao](http://joeyh.name/blog/entry/who_needs_whiteboards_when_you_have_strange_seed_pods_from_the_jungle/) +and I think we're heading toward a design that will address both these +needs, as well as some more Brazil-specific use cases, about which more +later. + +Today's work was sponsored by Casa do Boneco. diff --git a/doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn b/doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn new file mode 100644 index 000000000..a8f5313ac --- /dev/null +++ b/doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn @@ -0,0 +1,17 @@ +Sören Brunk's massive bootstrap 3 patch has landed! This is a 43 thousand +line diff, with 2 thousand lines after the javascript and CSS libraries are +filtered out. Either way, the biggest patch contributed by anyone to +git-annex so far, and excellent work. + +Meanwhile, I built a [[haskell program|design/assistant/syncing/simroutes.hs]] to simulate +a network of highly distributed git-annex nodes with ad-hoc connections and +the selective file syncing algorythm now documented at the bottom of +[[design/assistant/syncing/efficiency]]. + +Currently around 33% of requested files never get to their destination +in this simulation, but this is probably because its network is randomly +generated, and so contains disconnected islands. So next, some data entry, +from a map that involves an Amazon not in .com, dotted with names of people +I have recently met... :) + + diff --git a/doc/devblog/day_163__request_and_routing_design.mdwn b/doc/devblog/day_163__request_and_routing_design.mdwn new file mode 100644 index 000000000..c11664a06 --- /dev/null +++ b/doc/devblog/day_163__request_and_routing_design.mdwn @@ -0,0 +1,3 @@ +I have a preliminary design for [[design/requests_routing]]. Won't be +working on it immediately, but simulations show it can work well in a large +ad-hoc network. diff --git a/doc/devblog/day_164__back.mdwn b/doc/devblog/day_164__back.mdwn new file mode 100644 index 000000000..48a6ce6f0 --- /dev/null +++ b/doc/devblog/day_164__back.mdwn @@ -0,0 +1,17 @@ +My backlog is massive -- 181 items to answer. Will probably take the rest +of the month to get caught back up. Rather than digging into that yet, +spent today working on the webapp's ssh password prompting. + +I simplified it so the password is entered on the same form as the rest +of the server's information. That made the UI easy to build, but +means that when a user already has a ssh key they want to use, they need +to select "existing ssh key"; the webapp no longer probes to automatically +detect that case. + +Got the ssh password prompting in the webapp basically working, and it's a +*really* nice improvement! I even got it to work on Windows (eventually...). +It's still only in the `sshpassword` branch, since I need to test it more +and probably fix some bugs. In particular, when enabling a remote that +already exists, I think it never prompts for the password yet. + +Today's work was sponsored by Nicola Chiapolini. diff --git a/doc/devblog/day_165__sshpassword_merged.mdwn b/doc/devblog/day_165__sshpassword_merged.mdwn new file mode 100644 index 000000000..4479df733 --- /dev/null +++ b/doc/devblog/day_165__sshpassword_merged.mdwn @@ -0,0 +1,18 @@ +Spent the day testing the sshpasswd branch. A few interesting things: + +* I was able to get rid of 10 lines of Windows specific code for + rsync.net, which had been necessary for console ssh password prompting to + work. Yay! +* git-remote-gcrypt turned out to be broken when there is no controlling + tty. --no-tty has to be passed to gpg to avoid it falling over in this + case, even when a gpg agent is available to be used. I fixed this with + a new release of git-remote-gcrypt. + +Mostly the new branch just worked! And is merged... + +Merged a patch from Robie Basak that adds a new special remote that's sort +of like bup but supports deletion: [[special_remotes/ddar]] + +Backlog: 172 + +Today's work was sponsored by Andrew Cant. diff --git a/doc/devblog/day_166__catching_up.mdwn b/doc/devblog/day_166__catching_up.mdwn new file mode 100644 index 000000000..51878562e --- /dev/null +++ b/doc/devblog/day_166__catching_up.mdwn @@ -0,0 +1,40 @@ +Powered through the backlog today, and got it down to 67! Probably most of +the rest is the hard ones though. + +A theme today was: It's stupid hard to get git-annex-shell installed into +PATH. While that should be the simplest thing in the world, I'm pinned +between two problems: + +1. There's no single portable package format, so all the decades of + development nice ways to get things into PATH don't work for everybody. +2. bash provides not a single dotfile that will work in all circumstances + to configure PATH. In particular, "ssh $host git-annex-shell" causes bash + to helpfully avoid looking at any dotfiles at all. + +Today's flailing to work around that inluded: + +* Merged a patch from Fraser Tweedale to allow `git config remote.origin.annex-shell /not/in/path/git-annex-shell` +* Merged a patch from Justin Lebar to allow symlinking the git-annex-shell + etc from the standalone tarball to a directory that is in PATH. (Only + on Linux, not OSX yet.) +* Improved the warning message git-annex prints when a remote server does + not have git-annex-shell in PATH, suggesting some things the user could + do to try to fix it. + +I've found out why OSX machines were retrying upgrades repeatedly. The +version in the .info file did not match the actual git-annex version for +OSX. I've fixed the info file version, but will need to come up with a +system to avoid such mismatches. + +Made a few other fixes. A notable one is that dragging and dropping +repositories in the webapp to reorder the list (and configure costs) +had been broken since November. + +git-annex 5.20140421 finally got into Debian testing today, so I updated +the backport. I recommend upgrading, especially if you're using the +assistant with a ssh remote, since you'll get all of last month's nice +features that make XMPP unnecessary in that configuration. + +---- + +Today's work was sponsored by Geoffrey Irving. diff --git a/doc/devblog/day_167__growing_the_community_of_git-annex_contributors.mdwn b/doc/devblog/day_167__growing_the_community_of_git-annex_contributors.mdwn new file mode 100644 index 000000000..1408e13e2 --- /dev/null +++ b/doc/devblog/day_167__growing_the_community_of_git-annex_contributors.mdwn @@ -0,0 +1,11 @@ +Released git-annex 5.20140517 today. The changelog for this release +is very unusual, because it's full of contributions from others! There are +as many patches from others in this release as git-annex got in the first +entire two years of its existence. + +I'd like to keep that going. Also, I could really use help triaging bug +reports right now. So I have updated the **[[contribute]]** page with more +info about easy ways to contribute to git-annex. If you read this devblog, +you're an ideal contributor, and you don't need to know how to write +haskell either.. So take a [[look at the page|contribute]] and see if +you can help out. diff --git a/doc/devblog/day_168__backlog_continued.mdwn b/doc/devblog/day_168__backlog_continued.mdwn new file mode 100644 index 000000000..ab1956533 --- /dev/null +++ b/doc/devblog/day_168__backlog_continued.mdwn @@ -0,0 +1,16 @@ +Worked on triaging several bugs. Fixed an easy one, which involved the +assistant choosing the wrong path to a repository that has multiple +remotes. After today, backlog is down to 43, nearly pre-Brazil levels. + +It seems that git-remote-gcrypt [[never quite worked on OSX|bugs/remote_gcrypt_based_repos_and_conflicting_uuids]]. +It looked like it did, but a bug prevented anything being pushed to the remote. +Tracked down and fixed that bug. + +This evening, getting back to working on the armel autobuilder setup +using propellor. The autobuilder will use a pair of docker containers, one +armel and a companion amd64, and their quite complex setup will be *almost* +fully automated (except for the haskell library patching part). + +---- + +Today's work was sponsored by Mica Semrick. diff --git a/doc/devblog/day_169-171__juggling.mdwn b/doc/devblog/day_169-171__juggling.mdwn new file mode 100644 index 000000000..2b34da90a --- /dev/null +++ b/doc/devblog/day_169-171__juggling.mdwn @@ -0,0 +1,14 @@ +Keeping lots of things going these past few days.. + +* Rebootstrapping the armel autobuilder with propellor. + Some qemu instability and the need to update haskell + library patches meant this took a lot of hand-holding. Finally got a + working setup today. +* Designing and ordering new git-annex stickers on clear viynl backing; + have put off sending those to campaign contributors for too long. +* Added a new feature to the webapp: It now remembers the ssh remotes + that it sets up, and makes it easy to enable them elsewhere, the same + as other sorts of remotes. Had a very pleasant surprise building this, + when I was able to reuse all the UI code for enabling rsync and gcrypt + remotes. I think this will be a useful feature as we transition away + from XMPP. diff --git a/doc/devblog/day_172__.mdwn b/doc/devblog/day_172__.mdwn new file mode 100644 index 000000000..7f2595cef --- /dev/null +++ b/doc/devblog/day_172__.mdwn @@ -0,0 +1,7 @@ +Working on moving the android autobuilder to Docker & Propellor, which will +finish containerizing all the autobuilds that I run. Updated +ghc-android to use the released ghc 7.8.2, which will make it build more +reliably. + +Also did bug triage. Bugs are now divided into [[bugs/confirmed]] +and [[bugs/unconfirmed]] categories. diff --git a/doc/devblog/day_173-174__android_rebootstrap.mdwn b/doc/devblog/day_173-174__android_rebootstrap.mdwn new file mode 100644 index 000000000..6029b1870 --- /dev/null +++ b/doc/devblog/day_173-174__android_rebootstrap.mdwn @@ -0,0 +1,8 @@ +With some help from Sören, have been redoing the android build environment +for git-annex. This included making propellor put it in a docker container, +which was easy. But then much struggling with annoying stuff like getting +the gnutls linking to work, and working around some dependency issues on +hackage that make cabal's dependency resolver melt down. +Finally succeeded after much more time than I had wanted to spend on this. + +[[!meta date="Mon May 27 16:36:40 JEST 2014"]] diff --git a/doc/devblog/day_175__encoding_day.mdwn b/doc/devblog/day_175__encoding_day.mdwn new file mode 100644 index 000000000..5e23342d5 --- /dev/null +++ b/doc/devblog/day_175__encoding_day.mdwn @@ -0,0 +1,20 @@ +These themed days are inaverdent, but it happened again: Nearly everything +done today had to do with encoding issues. + +The big news is that it turned out everything written to files in the +git-annex branch had unicode characters truncated to 8 bits. Now fixed so +you should always get out the same thing you put in, no matter what +encoding you use (but please use utf8). This affected things like storing +repository descriptions, but worse, it affected metadata. (Also preferred +content expressions, I suppose.) + +With that fixed, there are still 7 source files left that use Char8 libraries. +There used to be more; nearly every use of those is a bug. I looked over +the remaining uses of it, and there might be a problem with Creds using it. +I should probably make a push to stamp out all remaining uses of Char8. + +Other encoding bugs were less reproducible. + +And just now, Sören made some progress on +[[bugs/Bootstrap3_icons_missing_on_Android]] ... and my current theory +is this is actually caused by an encoding issue too. diff --git a/doc/devblog/day_176__mostly_a_day_off.mdwn b/doc/devblog/day_176__mostly_a_day_off.mdwn new file mode 100644 index 000000000..46bf1c4db --- /dev/null +++ b/doc/devblog/day_176__mostly_a_day_off.mdwn @@ -0,0 +1,8 @@ +Got a handle on the Android webapp static file problems (no, they were not +really encoding problems!), and hopefully +that's all fixed now. Also, only 3 modules use Char8 now. And updated the +git-annex backport. That's all I did today. + +Meanwhile, a complete [[tips/ZSH_completion]] has been contributed by +Schnouki. And, Ben Gamari sent in a patch moving from the deprecated +MonadCatchIO-transformers library to the exceptions library. diff --git a/doc/devblog/day_177__enabling.mdwn b/doc/devblog/day_177__enabling.mdwn new file mode 100644 index 000000000..55a1895aa --- /dev/null +++ b/doc/devblog/day_177__enabling.mdwn @@ -0,0 +1,21 @@ +After making a release yesterday, I've been fixing some bugs in the +webapp, all to do with repository configuration stored on the git-annex +branch. I was led into this by a strange little bug where the webapp stored +configuration in the wrong repo in one situation. From there, I noticed +that often when enabling an existing repository, the webapp would stomp on +its group and preferred content and description, replacing them with +defaults. + +This was a systematic problem, it had to be fixed in several places. And +some of the fixes were quite tricky. For example, when adding a ssh +repository, and it turns out there's already a git-annex repository at the +entered location, it needs to avoid changing its configuration. But also, +the configuration of that repo won't be known until after the first git +pull from it. So it doesn't make sense to show the repository edit form +after enabling such a repository. + +Also worked on a couple other bugs, and further cleaned up the [[bugs]] +page. I think I am finally happy with how the bug list is displayed, +with confirmed/moreinfo/etc tags. + +Today's work was sponsored by François Deppierraz. diff --git a/doc/devblog/day_177__enabling/comment_1_820d29f84dade09b0e7bb7435c52fcb8._comment b/doc/devblog/day_177__enabling/comment_1_820d29f84dade09b0e7bb7435c52fcb8._comment new file mode 100644 index 000000000..05ecdc32d --- /dev/null +++ b/doc/devblog/day_177__enabling/comment_1_820d29f84dade09b0e7bb7435c52fcb8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2014-06-02T13:36:00Z" + content=""" +Can you make the tags be displayed with background colours or some other mechanism for quick visual recognition? All \"done\" are green, all \"moreinfo\" blue(?), etc pp. + + +Thanks, +Richard +"""]] diff --git a/doc/devblog/day_178-179__screencast_and_what_next.mdwn b/doc/devblog/day_178-179__screencast_and_what_next.mdwn new file mode 100644 index 000000000..fe7ba399d --- /dev/null +++ b/doc/devblog/day_178-179__screencast_and_what_next.mdwn @@ -0,0 +1,12 @@ +Yesterday I recorded a new screencast, demoing using the assistant on a +local network with a small server. [[videos/git-annex_assistant_lan]]. +That's the best screencast yet; having a real framing story was nice; +recent improvements to git-annex are taken advantage of without being made +a big deal; and audio and video are improved. (But there are some minor +encoding glitches which I'd have to re-edit it to fix.) + +The [[design/roadmap]] has this month dedicated to improving Android. +But I think what I'd more like to do is whatever makes the assistant usable +by the most people. This might mean doing more on Windows, since I hear +from many who would benefit from that. Or maybe something not related to +porting? diff --git a/doc/devblog/day_178-179__screencast_and_what_next/comment_1_eeba788fed45cb22f9cc2a738ceaa074._comment b/doc/devblog/day_178-179__screencast_and_what_next/comment_1_eeba788fed45cb22f9cc2a738ceaa074._comment new file mode 100644 index 000000000..d5bb0a183 --- /dev/null +++ b/doc/devblog/day_178-179__screencast_and_what_next/comment_1_eeba788fed45cb22f9cc2a738ceaa074._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm8BAEUyzYhORZmMuocRTk4M-3IumDm5VU" + nickname="luciusf0" + subject="Windows Support +1" + date="2014-06-06T21:54:38Z" + content=""" +I just also (like others) wanna state my strong interest in a windows port. Actually it's the only thing which is holding me back of using git-annex for real, as I live and work in a mixed-OS environment. The git-annex features would be the answers to an awful lot of our day-to-day problems, and I cannot wait to have it ready for a production environment. So -> Windows Port +1 +"""]] diff --git a/doc/devblog/day_178-179__screencast_and_what_next/comment_2_d44e67e34615c7b00e29f307556cdd06._comment b/doc/devblog/day_178-179__screencast_and_what_next/comment_2_d44e67e34615c7b00e29f307556cdd06._comment new file mode 100644 index 000000000..defb4a80f --- /dev/null +++ b/doc/devblog/day_178-179__screencast_and_what_next/comment_2_d44e67e34615c7b00e29f307556cdd06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Android" + date="2014-06-08T02:44:45Z" + content=""" +As I don't use Windows and git-annex is already fitting my Linux use cases perfectly, I'd have to vote for Android. FWIW, I have previously posted some thoughts on what would I see as lacking on Android [here](http://git-annex.branchable.com/forum/Controlling_content_on_mobile_device/). +"""]] diff --git a/doc/devblog/day_180__porting.mdwn b/doc/devblog/day_180__porting.mdwn new file mode 100644 index 000000000..27b4eaca1 --- /dev/null +++ b/doc/devblog/day_180__porting.mdwn @@ -0,0 +1,13 @@ +Did work on Windows porting today. First, fixed a reversion in the last +release, that broke the git-annex branch pretty badly on Windows, causing +\r to be written to files on that branch that should never have DOS line +endings. Second, fixed a long-standing bug that prevented getting a file +from a local bare repository on Windows. + +Also refreshed all autobuilders to deal with the gnutls and openssl +security holes-of-the-week. (git-annex uses gnutls only for XMPP, +and does not use openssl itself, but a few programs bundled with it, +like curl, do use openssl.) + +A nice piece of news: OSX Homebrew now contains git-annex, so it can be +easily installed with `brew install git-annex` diff --git a/doc/devblog/day_180__porting/comment_1_133875f4435a298b85ddfb8a2cc11a7a._comment b/doc/devblog/day_180__porting/comment_1_133875f4435a298b85ddfb8a2cc11a7a._comment new file mode 100644 index 000000000..2aa67e823 --- /dev/null +++ b/doc/devblog/day_180__porting/comment_1_133875f4435a298b85ddfb8a2cc11a7a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="Tamschi" + ip="178.27.213.202" + subject="It's still impossible to use the git-annex repository on Windows." + date="2014-06-09T14:44:07Z" + content=""" +Since the bug tracker is in the same repository and branch as the main program (why?), any bugs submitted with a colon in the title will prevent access on NTFS file systems. +There is at least one such instance, I assume it potentially affects blog posts too. +"""]] diff --git a/doc/devblog/day_181__tricky_merge.mdwn b/doc/devblog/day_181__tricky_merge.mdwn new file mode 100644 index 000000000..c6bcaf8d4 --- /dev/null +++ b/doc/devblog/day_181__tricky_merge.mdwn @@ -0,0 +1,8 @@ +Spent most of today improving behavior when a sync or merge is +interrupted in direct mode. It was possible for an interrupt at the wrong +time to leave the merge committed, but the work tree not yet updated. And +then the next sync would make a commit that reverted the merged changes! + +To fix this I had to avoid making any merge commit or indeed updating the +index until after the work tree is updated. It looked intractable for a +while; I'm still surprised I eventually succeeded. diff --git a/doc/devblog/day_182__service.mdwn b/doc/devblog/day_182__service.mdwn new file mode 100644 index 000000000..137725248 --- /dev/null +++ b/doc/devblog/day_182__service.mdwn @@ -0,0 +1,6 @@ +Have for the first time gotten git-annex to run as a proper Windows +service, using nssm. +([details](http://git-annex.branchable.com/todo/windows_support/#comment-a61be55862ea32e3dc30972f905bb987)) +Not quite ready yet though; doesn't run as the right user. + +And a few other windows porting bits. diff --git a/doc/devblog/day_183__rubbing_sticks_together.mdwn b/doc/devblog/day_183__rubbing_sticks_together.mdwn new file mode 100644 index 000000000..ecab37916 --- /dev/null +++ b/doc/devblog/day_183__rubbing_sticks_together.mdwn @@ -0,0 +1,23 @@ +Spent all day on some horrible timestamp issues on legacy systems. + +On FAT, timestamps have a 2s granularity, which is ok, but then Linux adds +a temporary higher resolution cache, which is lost on unmount. This +confused git-annex since the mtimes seemed to change and it had to +re-checksum half the files to get unconfused, which was not good. +I found a way to use the inode sentinal file to detect when on FAT +and put in a workaround, without degrading git-annex everywhere else. + +On Windows, time zones are a utter disaster; it changes the mtime it reports +for files after the time zone has changed. Also there's a bug in the +haskell time library which makes it return old time zone data after a time +zone change. (I just finished developing a fix for that bug..) + +Left with nothing but a few sticks, I rubbed them together, and +actually found a way to deal with this problem too. Scary details in +[[bugs/Windows_file_timestamp_timezone_madness]]. While I've implemented +it, it's stuck on a branch until I find a way to make git-annex notice when +the timezone changes while it's running. + +---- + +Today's work was sponsored by Svenne Krap. diff --git a/doc/devblog/day_184__windows_month.mdwn b/doc/devblog/day_184__windows_month.mdwn new file mode 100644 index 000000000..c99d03e90 --- /dev/null +++ b/doc/devblog/day_184__windows_month.mdwn @@ -0,0 +1,22 @@ +It's officially a Windows porting month. Now that I'm half way through it +and with the last week of the month going to be a vacation, this makes +sense. + +Today, finished up dealing with the timezone/timestamp issues on Windows. +This got stranger and stranger the closer I looked at it. After a timestamp +change, a program that was already running will see one timestamp, while a +program that is started after the change will see another one! My approach +works pretty much no matter how Windows goes insane though, and always +recovers a true timestamp. Yay. + +Also fixed a regression test failure on Windows, which turned out to be +rooted in a bug in the command queue runner, which neglected to pass +along environment overrides on Windows. + +Then I spent 5 hours tracking down a tricky +test suite failure on Windows, which turned out to also +affect FAT and be a recent reversion that has as it's +root cause a [fun bug in git itself](http://marc.info/?l=git&m=140262402204212&w=2). +Put in a not very good workaround. Thank goodness for test suites! + +Also got the arm autobuilder unstuck. Release tomorrow. diff --git a/doc/devblog/day_185__service.mdwn b/doc/devblog/day_185__service.mdwn new file mode 100644 index 000000000..0613ae2bf --- /dev/null +++ b/doc/devblog/day_185__service.mdwn @@ -0,0 +1,6 @@ +More work on [[todo/windows_git-annex_service]], but am stuck with a +permissions problem. + +Fixed a bug that prevented two assistants from syncing when there was only +a uni-directional link between them. Only affected direct mode, and +was introduced back when I added the direct mode guard. diff --git a/doc/devblog/day_186__cracked_it.mdwn b/doc/devblog/day_186__cracked_it.mdwn new file mode 100644 index 000000000..cff6130cb --- /dev/null +++ b/doc/devblog/day_186__cracked_it.mdwn @@ -0,0 +1,8 @@ +After despairing of ever solving this yesterday (and for the past 6 months +really), I've got the webapp running on Windows with no visible DOS box. +Also have the assistant starting up in the background on login. + +It turns out a service was not the way to do. There is a way to write a VB +Script that runs a "DOS" command in a hidden window, and this is what I +used. Amazing how hard it was to work this out, probably partly because I +don't have the Windows vocabulary to know what to look for. diff --git a/doc/devblog/day_186__cracked_it/comment_1_288b736adf392acd0f45667b2980138d._comment b/doc/devblog/day_186__cracked_it/comment_1_288b736adf392acd0f45667b2980138d._comment new file mode 100644 index 000000000..d85798eb8 --- /dev/null +++ b/doc/devblog/day_186__cracked_it/comment_1_288b736adf392acd0f45667b2980138d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="Congratulations!" + date="2014-06-18T09:08:45Z" + content=""" +I really feel with you and I am glad I currently do not need to develop on/for Windows. I wish you good progress with Windows porting, so you can concentrate on the interesting stuff again :) + +Best regards, +Fabian +"""]] diff --git a/doc/devblog/day_186__cracked_it/comment_2_d1d79e93ac420f6b3a6f8a622e8e00bd._comment b/doc/devblog/day_186__cracked_it/comment_2_d1d79e93ac420f6b3a6f8a622e8e00bd._comment new file mode 100644 index 000000000..d6ade5c01 --- /dev/null +++ b/doc/devblog/day_186__cracked_it/comment_2_d1d79e93ac420f6b3a6f8a622e8e00bd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="Claes" + subject="VBScript + wscript to avoid DOS window" + date="2014-06-21T02:09:58Z" + content=""" +I use this technique too, to run cygwin xterm without an ugly DOS box popup. +"""]] diff --git a/doc/devblog/day_186__cracked_it/comment_3_8ca17a51b10b4e4a63d0672d5ce29024._comment b/doc/devblog/day_186__cracked_it/comment_3_8ca17a51b10b4e4a63d0672d5ce29024._comment new file mode 100644 index 000000000..356453e8f --- /dev/null +++ b/doc/devblog/day_186__cracked_it/comment_3_8ca17a51b10b4e4a63d0672d5ce29024._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="Claes" + subject="VBScript + wscript to avoid DOS window" + date="2014-06-21T02:15:04Z" + content=""" +(sorry that I didn't see before that you had run into this annoying problem) +"""]] diff --git a/doc/devblog/day_187__release_prep.mdwn b/doc/devblog/day_187__release_prep.mdwn new file mode 100644 index 000000000..a5207c373 --- /dev/null +++ b/doc/devblog/day_187__release_prep.mdwn @@ -0,0 +1,10 @@ +Last night, got logging to daemon.log working on Windows. Aside from XMPP +not working (but it's near to being deprecated anyway), and some possible +issues with unicode characters in filenames, the Windows port now seems in +pretty good shape for a beta release. + +Today, mostly worked on fixing the release process so the metadata +accurarely reflects the version from the autobuilder that is included in +the release. Turns out there was version skew in the last release (now +manually corrected). This should avoid that happening again, and also +automates more of my release process. diff --git a/doc/devblog/day_187__release_prep/comment_1_206692d16177c2a9ca11c0eeff545697._comment b/doc/devblog/day_187__release_prep/comment_1_206692d16177c2a9ca11c0eeff545697._comment new file mode 100644 index 000000000..a9e982a21 --- /dev/null +++ b/doc/devblog/day_187__release_prep/comment_1_206692d16177c2a9ca11c0eeff545697._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlnoH5btjn_BLib3_IhES5uMhrzuOiwCYo" + nickname="András" + subject="sync options?" + date="2014-06-19T13:16:51Z" + content=""" +What options will we have in this beta for windows <=> windows (local network) and windows <=> linux (remote server) synchronization? I'm interested only in non-cloud sync possibilities. + +(I tried to follow the developments but apparently failed...) + +Also thank you for working on the windows port! + +"""]] diff --git a/doc/devblog/day_187__release_prep/comment_2_961fb35d9cf7d5e518f8d0bddb8626a6._comment b/doc/devblog/day_187__release_prep/comment_2_961fb35d9cf7d5e518f8d0bddb8626a6._comment new file mode 100644 index 000000000..6abcfb7dd --- /dev/null +++ b/doc/devblog/day_187__release_prep/comment_2_961fb35d9cf7d5e518f8d0bddb8626a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 2" + date="2014-06-19T22:13:23Z" + content=""" +windows to linux server (local or remote) to windows will work. +"""]] diff --git a/doc/devblog/day_188__back_sans_laptop.mdwn b/doc/devblog/day_188__back_sans_laptop.mdwn new file mode 100644 index 000000000..080d6176e --- /dev/null +++ b/doc/devblog/day_188__back_sans_laptop.mdwn @@ -0,0 +1,5 @@ +I am back from the beach, but my dev laptop is dead. A replacement is being +shipped, and I have spent today getting my old netbook into a usable state +so I can perhaps do some work using it in the meantime. + +(Backlog is 95 messages.) diff --git a/doc/devblog/day_189__finally_working_again.mdwn b/doc/devblog/day_189__finally_working_again.mdwn new file mode 100644 index 000000000..54b72b52b --- /dev/null +++ b/doc/devblog/day_189__finally_working_again.mdwn @@ -0,0 +1,18 @@ +Finally back to work with a new laptop! + +Did one fairly major feature today: When using git-annex to pull down +podcasts, metadata from the feed is copied into git-annex's metadata store, +if annex.genmetadata is set. Should be great for views etc! + +Worked through a lot of the backlog, which is down to 47 messages now. + +Only other bug fix of note is a fix on Android. A recent change to git made +it try to chmod files, which tends to fail on the horrible /sdcard +filesystem. Patched git to avoid that. + +For some reason the autobuilder box rebooted while I was away, and +somehow the docker containers didn't come back up -- so they got +automatically rebuilt. But I have to manually finish up building the +android and armel ones. Will be babysitting that build this evening. + +Today's work was sponsored by Ævar Arnfjörð Bjarmason. diff --git a/doc/devblog/day_190__fun_fixes.mdwn b/doc/devblog/day_190__fun_fixes.mdwn new file mode 100644 index 000000000..d3895df1f --- /dev/null +++ b/doc/devblog/day_190__fun_fixes.mdwn @@ -0,0 +1,13 @@ +Spent the morning improving behavior when `commit.gpgsign` is set. +Now git-annex will let gpg sign commits that are made when eg, manually +running `git annex sync`, but not commits implicitly made to the git-annex +branch. And any commits made by the assistant are not gpg signed. This was +slightly tricky, since lots of different places in git-annex ran `git +commit`, `git merge` and similar. + +Then got back to a test I left running over vacation, that added millions +of files to a git annex repo. This was able to reproduce a problem where +`git annex add` blew the stack and crashed at the end. There turned out to +be two different memory issues, one was in git-annex and the other is in +Haskell's core `getDirectoryContents`. Was able to entirely fix it, +eventually. diff --git a/doc/devblog/day_191__semidistracted.mdwn b/doc/devblog/day_191__semidistracted.mdwn new file mode 100644 index 000000000..3d4b5b6ef --- /dev/null +++ b/doc/devblog/day_191__semidistracted.mdwn @@ -0,0 +1,7 @@ +Got a bit distracted improving Haskell's directory listing code. + +Only real git-annex work today was fixing [[bugs/Assistant_merge_loop]], +which was caused by changes in the last release (that made direct mode +merging crash/interrupt-safe). This is a kind of ugly bug, that can result +in the assistant making lots of empty commits in direct mode repositories. +So, I plan to make a new release on Monday. diff --git a/doc/devblog/day_192__release_day.mdwn b/doc/devblog/day_192__release_day.mdwn new file mode 100644 index 000000000..ce1a38861 --- /dev/null +++ b/doc/devblog/day_192__release_day.mdwn @@ -0,0 +1,4 @@ +Got the release out. Had to fix various autobuilder issues. The arm autobuilder +is unfortunatly not working currently. + +Updated git-annex to build with a new version of the bloomfilter library. diff --git a/doc/devblog/day_193-194__ugly_bug.mdwn b/doc/devblog/day_193-194__ugly_bug.mdwn new file mode 100644 index 000000000..668b7b2ab --- /dev/null +++ b/doc/devblog/day_193-194__ugly_bug.mdwn @@ -0,0 +1,37 @@ +**Important** A bug [[caused the assistant to sometimes remove all files|bugs/bad_merge_commit_deleting_all_files]] from the git repository. +You should check if your repository is ok. If the bug hit you, it should be +possible to revert the bad commit and recover your files with no data loss. +See the bug report for details. + +This affected git-annex versions since 5.20140613, and only when using the +assistant in direct mode. It should be fixed in today's release, +5.20140709. + +I'm available to help anyone hit by this +unfortunate bug. + +This is another bug in the direct mode merge code. I'm not happy about it. +It's particularly annoying that I can't fix up after it automatically +(because there's no way to know if any given commit in the git history that +deletes all the files is the result of this bug, or a legitimate deletion +of all files). + +The only good thing is that the design of git-annex is pretty robust, and +in this case, despite stupidly committing the deletion of all the files in +the repository, git-annex did take care to preserve all their contents and +so the problem should be able to be resolved without data loss. + +Unfortunately, the main autobuilder is down and I've had to spin up +autobuilders on a different machine (thank goodness that's very automated +now!), and so I have not been able to build the fixed git-annex for android +yet. I hope to get that done later this evening. + +--- + +Yesterday, I fixed a few (much less bad) bugs, and did some thinking about +plans for this month. The [[design/roadmap]] suggests working on some of +[[!traillink design/assistant/chunks]], [[!traillink design/assistant/deltas]] or [[!traillink design/assistant/gpgkeys]]. +I don't know how to do deltas yet really. Chunks is pretty easily done. +The gpg keys stuff is pretty open ended and needs some more work to define +some use cases. But, after today, I am more inclined to want to spend +time on better testing and other means of avoiding this kind of situation. diff --git a/doc/devblog/day_195-196__catching_up.mdwn b/doc/devblog/day_195-196__catching_up.mdwn new file mode 100644 index 000000000..2c04eaa15 --- /dev/null +++ b/doc/devblog/day_195-196__catching_up.mdwn @@ -0,0 +1,13 @@ +Spent past 2 days catching up on backlog and doing bug triage and some +minor bug fixes and features. Backlog is 27, lowest in quite a while so I +feel well on top of things. + +I was saddened to find [this bug](http://git-annex.branchable.com/bugs/files_lost_during_upgrade/#comment-b265c796b1599d2dde649699cb54fa86) +where I almost managed to analize the [[ugy_bug|day_193-194__ugly_bug]]'s race +condition, but not quite (and then went on vacation). BTW, I have not heard +from anyone else who was hit by that bug so far. + +The linux autobuilders are still down; their host server had a disk crash +in an electrical outage. Might be down for a while. I would not mind +setting up a redundant autobuilder if anyone else would like to donate a +linux VM with 4+ gb of ram. diff --git a/doc/devblog/day_197__autobuilder_rescuscitation.mdwn b/doc/devblog/day_197__autobuilder_rescuscitation.mdwn new file mode 100644 index 000000000..12dada287 --- /dev/null +++ b/doc/devblog/day_197__autobuilder_rescuscitation.mdwn @@ -0,0 +1,14 @@ +Yay, the Linux autobuilder is back! Also fixed the Windows build. + +Fixed a reversion that prevented the webapp from starting +properly on Windows, which was introduced by some bad locking when I put in +the hack that makes it log to the log file on that platform. + +Various other minor fixes here and there. There are almost enough +to do a release again soon. + +I've also been trying to bootstrap ghc 7.8 on arm, for Debian. There's a script +that's supposed to allow building 7.8 using 7.6.3, dealing with a linker +problem by using the gold linker. Hopefully that will work since otherwise +Debian could remain stuck with an old ghc or worse lose the arm ports. +Neither would be great for git-annex.. diff --git a/doc/devblog/day_198__branching_out.mdwn b/doc/devblog/day_198__branching_out.mdwn new file mode 100644 index 000000000..cdb3a6d1b --- /dev/null +++ b/doc/devblog/day_198__branching_out.mdwn @@ -0,0 +1,23 @@ +I have mostly been thinking about gcrypt today. +[This issue](https://github.com/blake2-ppc/git-remote-gcrypt/issues/9) +needs to be dealt with. The question is, does it really make sense to +try to hide the people a git repository is encrypted for? I have +[posted some thoughts](http://git-annex.branchable.com/bugs/using_gpg_encryption_with_multiple_keys_fails/?updated#comment-0c4f679d972c63b0b25b6aa5e851af62) +and am coming to the viewpoint that obscuring the identities of users +of a repository is not a problem git-annex should try to solve itself, +although it also shouldn't get in the way of someone who is able and +wants to do that (by using tor, etc). + +Finally, I decided to go ahead and add a gcrypt.publish-participants +setting to git-remote-gcrypt, and make git-annex set that by default when +setting up a gcrypt repository. + +Some promising news from the ghc build on arm. I got a working ghc, and +even ghci works. Which would make the template haskell in the webapp etc +avaialble on arm without the current horrible hacks. Have not managed to +build the debian ghc package successfully yet though. + +Also, fixed a bug that made `git annex sync` not pull/push with a local +repository that had not yet been initialized for use with git-annex. + +Today's work was sponsored by Stanley Yamane. diff --git a/doc/devblog/day_198__branching_out/comment_1_91ce3dc707ba1ba7c5d9e57e20ffce40._comment b/doc/devblog/day_198__branching_out/comment_1_91ce3dc707ba1ba7c5d9e57e20ffce40._comment new file mode 100644 index 000000000..7b9ba45b7 --- /dev/null +++ b/doc/devblog/day_198__branching_out/comment_1_91ce3dc707ba1ba7c5d9e57e20ffce40._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="lex" + ip="2620:149:7:303:796f:ae98:a0a1:94b" + subject="comment 1" + date="2014-07-16T21:13:06Z" + content=""" +glad my bug inspired a blog post about it. =] +"""]] diff --git a/doc/devblog/day_199__ten_minute_cycle.mdwn b/doc/devblog/day_199__ten_minute_cycle.mdwn new file mode 100644 index 000000000..56b48747e --- /dev/null +++ b/doc/devblog/day_199__ten_minute_cycle.mdwn @@ -0,0 +1,6 @@ +Spent hours today in a 10-minute build/test cycle, tracking down a bug that +caused the assistant to crash on Windows after exactly 10 minutes uptime. +Eventually found the cause; this is fallout from last month's work +that got it logging to the debug.log on Windows. + +There was more, but that was the interesting one.. diff --git a/doc/devblog/day_19__moving_on.mdwn b/doc/devblog/day_19__moving_on.mdwn new file mode 100644 index 000000000..7f4cd8244 --- /dev/null +++ b/doc/devblog/day_19__moving_on.mdwn @@ -0,0 +1,37 @@ +Finished moving the Android autobuilder over to the new clean build +environment. Tested the Android app, and it still works. Whew! + +There's a small chance that the issue with the Android app not working on +Android 4.3 has been fixed by this rebuild. I doubt it, but perhaps someone +can download the daily build and give it another try.. + +---- + +I have 7 days left in which I'd like to get remote gcrypt repositories +working in the assistant. I think that should be fairly easy, but a +prerequisite for it is making git-annex-shell support being run on a gcrypt +repository. That's needed so that the assistant's normal locked down ssh +key setup can also be used for gcrypt repositories. + +At the same time, not all gcrypt endpoints will have git-annex-shell +installed, and it *seems* to make sense to leave in the existing support +for running raw rsync and git push commands against such a repository. So +that's going to add some complication. + +It will also complicate git-annex-shell to support gcrypt repos. Basically, +everything it does in git-annex repos will need to be reimplemented in +gcrypt repositories. Generally in a more simple form; for example it +doesn't need to (and can't) update location logs in a gcrypt repo. + +---- + +I also need to find a good UI to present the three available choices +(unencrypted git, encrypted git, encrypted rsync) when setting up a repo +on a ssh server. I don't want to just remove the encrypted rsync option, +because it's useful when using xmpp to sync the git repo, and is simpler to +set up since it uses shared encryption rather than gpg public keys. + +My current thought is to offer just 2 choices, encrypted and non-encrypted. +If they choose encrypted, offer a choice of shared encryption or encrypting +to a specific key. I think I can word this so it's pretty clear what the +tradeoffs are. diff --git a/doc/devblog/day_19__moving_on/comment_1_870106f671f9a055b81e6fc83e0850b5._comment b/doc/devblog/day_19__moving_on/comment_1_870106f671f9a055b81e6fc83e0850b5._comment new file mode 100644 index 000000000..b0ed97bcf --- /dev/null +++ b/doc/devblog/day_19__moving_on/comment_1_870106f671f9a055b81e6fc83e0850b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmW0kg4uiMIhSHeVuvJFyo2VYMl7Qoej0s" + nickname="Chris" + subject="comment 1" + date="2013-09-23T20:58:45Z" + content=""" +The new version of the Android apk doesn't work for me on my Nexus 4. +"""]] diff --git a/doc/devblog/day_19__moving_on/comment_2_fad055c8860385ac6c012f897c96408f._comment b/doc/devblog/day_19__moving_on/comment_2_fad055c8860385ac6c012f897c96408f._comment new file mode 100644 index 000000000..f2e754b3a --- /dev/null +++ b/doc/devblog/day_19__moving_on/comment_2_fad055c8860385ac6c012f897c96408f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-09-24T07:11:31Z" + content=""" +Yeah, no joy on Cyanogenmod 10.2(Android 4.3). + +Would be pretty surprising if it had worked. +"""]] diff --git a/doc/devblog/day_19__moving_on/comment_3_69e47d612159587f080ab761566d1830._comment b/doc/devblog/day_19__moving_on/comment_3_69e47d612159587f080ab761566d1830._comment new file mode 100644 index 000000000..206fdd852 --- /dev/null +++ b/doc/devblog/day_19__moving_on/comment_3_69e47d612159587f080ab761566d1830._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR6E5iUghMWdUGlbA9CCs8DKaoigMjJXw" + nickname="Efraim" + subject="not working on my nexus 4 either" + date="2013-09-24T07:37:28Z" + content=""" +terminal output reads: + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib + +git annex webapp + +u0_a124@mako:/sdcard/git-annex.home $ git annex webpp + +CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) + +1|u0_a124@mako:/sdcard/git-annex.home $ +"""]] diff --git a/doc/devblog/day_1__inauspicious_beginning.mdwn b/doc/devblog/day_1__inauspicious_beginning.mdwn new file mode 100644 index 000000000..b14f763bb --- /dev/null +++ b/doc/devblog/day_1__inauspicious_beginning.mdwn @@ -0,0 +1,11 @@ +I try hard to keep this devblog about git-annex development and not me. +However, it is a shame that what I wanted to be the beginning of my first +real month of work funded by the new campaign has been marred by my home's +internet connection being taken out by a lightning strike, and by illness. +Nearly back on my feet after that, and waiting for my new laptop to +finally get here. + +Today's work: Finished up the `git annex forget` feature and merged it in. +Fixed the bug that was causing the commit race detection code to +incorrectly fire on the commit made by the transition code. Few other bits +and pieces. diff --git a/doc/devblog/day_1__inauspicious_beginning/comment_1_cc4dea43caf3126c6f814b589b701d70._comment b/doc/devblog/day_1__inauspicious_beginning/comment_1_cc4dea43caf3126c6f814b589b701d70._comment new file mode 100644 index 000000000..03e3fec6d --- /dev/null +++ b/doc/devblog/day_1__inauspicious_beginning/comment_1_cc4dea43caf3126c6f814b589b701d70._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="rjc" + ip="86.22.66.200" + subject="laptop" + date="2013-09-04T21:42:52Z" + content=""" +Are you retiring your Dell mini? + +What kind of laptop are you getting? +"""]] diff --git a/doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn b/doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn new file mode 100644 index 000000000..0e4142b7c --- /dev/null +++ b/doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn @@ -0,0 +1,14 @@ +Added support for gcrypt remotes to git-annex-shell. Now gcrypt special +remotes probe when they are set up to see if the remote system has a +suitable git-annex-shell, and if so all commands are sent to it. Kept the +direct rsync mode working as a fallback. + +It turns out I made a bad decision when first adding gcrypt support to +git-annex. To make implementation marginally easier, I decided to not +put objects inside the usual `annex/objects` directory in a gcrypt remote. +But that lack of consistency would have made adding support to +git-annex-shell a lot harder. So, I decided to change this. Which +means that anyone already using gcrypt with git-annex will need to +[[manually_move_files_around|upgrades/gcrypt]]. + +Today's work was sponsored by Tobias Nix. diff --git a/doc/devblog/day_21__bugfix_day.mdwn b/doc/devblog/day_21__bugfix_day.mdwn new file mode 100644 index 000000000..a913fce56 --- /dev/null +++ b/doc/devblog/day_21__bugfix_day.mdwn @@ -0,0 +1,5 @@ +Did various bug fixes and followup today. Amazing how a day can vanish that +way. Made 4 actual improvements. + +I still have 46 messages in unanswered backlog. Although only 8 of +the are from this month. diff --git a/doc/devblog/day_22__gcrypt_on_rsync.net.mdwn b/doc/devblog/day_22__gcrypt_on_rsync.net.mdwn new file mode 100644 index 000000000..2c5951795 --- /dev/null +++ b/doc/devblog/day_22__gcrypt_on_rsync.net.mdwn @@ -0,0 +1,20 @@ +Being still a little unsure of the UI and complexity +for configuring gcrypt on ssh servers, I thought I'd start today with the +special case of gcrypt on rsync.net. Since rsync.net allows running some git +commands, gcrypt can be used to make encrypted git repositories on it. + +Here's the UI I came up with. It's complicated a bit by needing to explain +the tradeoffs between the rsync and gcrypt special remotes. + +[[!img /assistant/rsync.net.encryption.png]] + +This works fine, but I did not get a chance to add support for enabling +existing gcrypt repos on rsync.net. Anyway, most of the changes to make +this work will also make it easier to add general support for gcrypt on ssh +servers. + +Also spent a while fixing a bug in git-remote-gcrypt. Oddly +`gpg --list-keys --fast-list --fingerprint` does not show the fingerprints +of some keys. + +Today's work was sponsored by Cloudier - Thomas Djärv. diff --git a/doc/devblog/day_23__GNU_day.mdwn b/doc/devblog/day_23__GNU_day.mdwn new file mode 100644 index 000000000..4f5b25ca7 --- /dev/null +++ b/doc/devblog/day_23__GNU_day.mdwn @@ -0,0 +1,23 @@ +Worked on making the assistant able to merge in existing encrypted +git repositories from rsync.net. + +This had two parts. First, making the webapp UI where you click to enable a +known special remote work with these encrypted repos. Secondly, handling +the case where a user knows they have an encrypted repository on rsync.net, +so enters in its hostname and path, but git-annex doesn't know about that +special remote. The second case is important, for example, when the +encrypted repository is a backup and you're restoring from it. It wouldn't +do for the assistant, in that case, to make a *new* encrypted repo and +push it over top of your backup! + +Handling that was a neat trick. It has to do quite a lot of probing, including +downloading the whole encrypted git repo so it can decrypt it and merge it, +to find out about the special remote configuration used for it. This all +works with just 2 ssh connections, and only 1 ssh password prompt max. + +Next, on to generalizing this rsync.net specific code to work with +arbitrary ssh servers! + +---- + +Today's work was made possible by [RMS's vision 30 years ago](http://article.olduse.net/771@mit-eddie.UUCP). diff --git a/doc/devblog/day_24__nearly_done_with_gcrypt.mdwn b/doc/devblog/day_24__nearly_done_with_gcrypt.mdwn new file mode 100644 index 000000000..22d3fa70b --- /dev/null +++ b/doc/devblog/day_24__nearly_done_with_gcrypt.mdwn @@ -0,0 +1,23 @@ +So close to being done with gcrypt support.. But still not quite there. + +Today I made the UI changes to support gcrypt when setting up a repository +on a ssh server, and improved the probing and data types so it can tell +which options the server supports. Fairly happy with how that is turning +out. + +Have not yet hooked up the new buttons to make gcrypt repos. While I was +testing that my changes didn't break other stuff, I found a bug in the +webapp that caused it to sometimes fail to transfer one file to/from a +remote that was just added, because the transferrer process didn't know +about the new remote yet, and crashed (and was restarted knowing about it, +so successfully sent any other files). So got sidetracked on fixing that. + +Also did some work to make the gpg bundled with git-annex on OSX be +compatable with the config files written by MacGPG. At first I was going to +hack it to not crash on the options it didn't support, but it turned out +that upgrading to version 1.4.14 actually fixed the problem that was making +it build without support for DNS. + +---- + +Today's work was sponsored by Thomas Hochstein. diff --git a/doc/devblog/day_25__finishing_up_gcrypt.mdwn b/doc/devblog/day_25__finishing_up_gcrypt.mdwn new file mode 100644 index 000000000..9666282d0 --- /dev/null +++ b/doc/devblog/day_25__finishing_up_gcrypt.mdwn @@ -0,0 +1,25 @@ +Long day, but I did finally finish up with gcrypt support. More or less. + +Got both creating and enabling existing gcrypt repositories on ssh servers +working in the webapp. (But I ran out of time to make it detect when the +user is manually entering a gcrypt repo that already exists. Should be easy +so maybe tomorrow.) + +Fixed several bugs in git-annex's gcrypt support that turned up in testing. +Made git-annex ensure that a gcrypt repository does not have +receive.denyNonFastForwards set, because gcrypt relies on always forcing +the push of the branch it stores its manifest on. Fixed a bug in +`git-annex-shell recvkey` when it was receiving a file from an annex in +direct mode. + +Also had to add a new `git annex shell gcryptsetup` command, which is +needed to make setting up a gcrypt repository work when the assistant +has set up a locked-down ssh key that can only run git-annex-shell. Painted +myself into a bit of a corner there. + +And tested, tested, tested. So many possibilities and edge cases in this +part of the code.. + +---- + +Today's work was sponsored by Hendrik Müller Hofstede. diff --git a/doc/devblog/day_26__gcrypt_really_done_this_time.mdwn b/doc/devblog/day_26__gcrypt_really_done_this_time.mdwn new file mode 100644 index 000000000..347e4be5f --- /dev/null +++ b/doc/devblog/day_26__gcrypt_really_done_this_time.mdwn @@ -0,0 +1,17 @@ +Did I say it would be easy to make the webapp detect when a gcrypt repository +already existed and enable it? Well, it wasn't exactly hard, but it took +over 300 lines of code and 3 hours.. + +So, gcrypt support is done for now. The glaring omission is gpg key +management for sharing gcrypt repositories between machines and/or people. +But despite that, I think it's solid, and easy to use, and covers some +great use cases. + +Pushed out a release. + +Now I really need to start thinking about +[[design/assistant/disaster_recovery]]. + +---- + +Today's work was sponsored by Dominik Wagenknecht. diff --git a/doc/devblog/day_27__locking_fun.mdwn b/doc/devblog/day_27__locking_fun.mdwn new file mode 100644 index 000000000..ef0c4131f --- /dev/null +++ b/doc/devblog/day_27__locking_fun.mdwn @@ -0,0 +1,49 @@ +Started the day by getting the builds updated for yesterday's release. This +included making it possible to build git-annex with Debian stable's version +of cryptohash. Also updated the Debian stable backport to the previous +release. + +---- + +The [[design/roadmap]] has this month devoted to improving git-annex's +support for recovering from disasters, broken repos, and so on. Today I've +been working on the first thing on [[the_list|design/assistant/disaster_recovery]], +stale git index lock files. + +It's unfortunate that git uses simple files for locking, and does not use +fcntl or flock to prevent the stale lock file problem. Perhaps they want +it to work on broken NFS systems? The problem with that line of thinking is +is means all non-broken systems end up broken by stale lock files. Not a +good tradeoff IMHO. + +There are actually two lock files that can end up stale when using +git-annex; both `.git/index.lock` and `.git/annex/index.lock`. Today I +concentrated on the latter, because I saw a way to prevent it from ever +being a problem. All updates to that index file are done by git-annex when +committing to the git-annex branch. git-annex already uses fcntl locking +when manipulating its journal. So, that can be extended to also cover +committing to the git-annex branch, and then the git `index.lock` file +is irrelevant, and can just be removed if it exists when a commit is +started. + +To ensure this makes sense, I used the type system to prove that the journal +locking was in effect everywhere I need it to be. Very happy I was able to +do that, although I am very much a novice at using the type system for +interesting proofs. But doing so made it very easily to build up to a point +where I could unlink the `.git/annex/index.lock` and be sure it was safe to do +that. + +---- + +What about stale `.git/index.lock` files? I don't think it's appropriate +for git-annex to generally recover from those, because it would change +regular git command line behavior, and risks breaking something. However, I +do want the assistant to be able to recover if such a file exists when it +is starting up, since that would prevent it from running. Implemented that +also today, although I am less happy with the way the assistant detects +when this lock file is stale, which is somewhat heuristic (but should work +even on networked filesystems with multiple writing machines). + +---- + +Today's work was sponsored by Torbjørn Thorsen. diff --git a/doc/devblog/day_27__locking_fun/comment_1_0eb247235fbf8f563934f3548e1d2e10._comment b/doc/devblog/day_27__locking_fun/comment_1_0eb247235fbf8f563934f3548e1d2e10._comment new file mode 100644 index 000000000..261fa005c --- /dev/null +++ b/doc/devblog/day_27__locking_fun/comment_1_0eb247235fbf8f563934f3548e1d2e10._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="News page not updated" + date="2013-10-04T09:38:21Z" + content=""" +Already for the last three or so releases the News page wasn't updated. :-( I think many people (including me) used this page to check if their version is uptodate. Posting the newest version there motivates people to try the very latest which seems very desirable for the git-annex development. +"""]] diff --git a/doc/devblog/day_27__locking_fun/comment_2_e8b1dfe1b0641e031d05733448b7bc8b._comment b/doc/devblog/day_27__locking_fun/comment_2_e8b1dfe1b0641e031d05733448b7bc8b._comment new file mode 100644 index 000000000..c073f735a --- /dev/null +++ b/doc/devblog/day_27__locking_fun/comment_2_e8b1dfe1b0641e031d05733448b7bc8b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="comment 2" + date="2013-10-04T20:13:37Z" + content=""" +Sorry about that. It turns out my release script was broken. +"""]] diff --git a/doc/devblog/day_27__locking_fun/comment_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment b/doc/devblog/day_27__locking_fun/comment_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment new file mode 100644 index 000000000..39c840e84 --- /dev/null +++ b/doc/devblog/day_27__locking_fun/comment_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 3" + date="2013-10-07T09:17:30Z" + content=""" +Hi, + +Can you please enlighten us mere mortals, when this stale file locking problem occcurs? +The typical situation. I tried to google up, and read locking files on wikipedia, but +still have no exact knowledge when the \"stale\" part happens. + +How it gets outdated without noticing? + +Best, + Laszlo + +"""]] diff --git a/doc/devblog/day_27__locking_fun/comment_4_0759644baf26b75f4e48dbb387d725a5._comment b/doc/devblog/day_27__locking_fun/comment_4_0759644baf26b75f4e48dbb387d725a5._comment new file mode 100644 index 000000000..cbeae8b78 --- /dev/null +++ b/doc/devblog/day_27__locking_fun/comment_4_0759644baf26b75f4e48dbb387d725a5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 4" + date="2013-10-12T23:31:16Z" + content=""" +Git simply creates a file as a lock file, and does not use any form of locking on it, so if the git process dies for any reason before it gets a chance to remove the lock file, a stale lock file remains, and future git commands will fall over it. + +It's really surprisingly bad.. +"""]] diff --git a/doc/devblog/day_28__lazy_saturday.mdwn b/doc/devblog/day_28__lazy_saturday.mdwn new file mode 100644 index 000000000..c2237b28b --- /dev/null +++ b/doc/devblog/day_28__lazy_saturday.mdwn @@ -0,0 +1,17 @@ +Finished up the automatic recovery from stale lock files. Turns out git +has quite a few lock files; the assistant handles them all. + +Improved URL and WORM keys so the filenames used for them +will always work on FAT (which has a crazy assortmeny of illegal +characters). This is a tricky thing to deal with without breaking backwards +compatability, so it's only dealt with when creating new URL or WORM keys. + +----- + +I think my next step in this disaster recovery themed month will be adding +periodic incremental fsck to the assistant. `git annex fsck` can already +do an incremental fsck, so this should mostly involve adding a user +interface to the webapp to configure when it should fsck. For example, you +might choose to run it for up 1 hour every night, with a goal of checking +all your files once per month. Also will need to make the assistant do +something useful when fsck finds a bad file (ie, queue a re-download). diff --git a/doc/devblog/day_29__scheduling.mdwn b/doc/devblog/day_29__scheduling.mdwn new file mode 100644 index 000000000..98c928bf8 --- /dev/null +++ b/doc/devblog/day_29__scheduling.mdwn @@ -0,0 +1,10 @@ +Spent most of the day building some generic types for scheduling recurring +events. Not sure if rolling my own was a good idea, but that's what I did. + +In the incrementalfsck branch, I have hooked this up in `git-annex vicfg`, +which now accepts and parses scheduled events like +"fsck self every day at any time for 60 minutes" and +"fsck self on day 1 of weeks divisible by 2 at 3:45 for 120 minutes", and +stores them in the git-annex branch. The exact syntax is of course subject +to change, but also doesn't matter a whole lot since the webapp will have +a better interface. diff --git a/doc/devblog/day_2__new_laptop.mdwn b/doc/devblog/day_2__new_laptop.mdwn new file mode 100644 index 000000000..000800742 --- /dev/null +++ b/doc/devblog/day_2__new_laptop.mdwn @@ -0,0 +1,8 @@ +Now I can build git-annex twice as fast! And a typical incremental build is +down to 10 seconds, from 51 seconds. + +Spent a productive evening working with Guilhem to get his encryption +patches reviewed and merged. Now there is a way to remove revoked gpg keys, +and there is a new encryption scheme available that uses public key +encryption by default rather than git-annex's usual approach. That's not +for everyone, but it is a good option to have available. diff --git a/doc/devblog/day_2__new_laptop/comment_1_93447dbd4eb09b4db96770644ea663cb._comment b/doc/devblog/day_2__new_laptop/comment_1_93447dbd4eb09b4db96770644ea663cb._comment new file mode 100644 index 000000000..15d19b0c9 --- /dev/null +++ b/doc/devblog/day_2__new_laptop/comment_1_93447dbd4eb09b4db96770644ea663cb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2013-09-05T15:07:44Z" + content=""" +out of curiosity, what laptop model have you choosen finally? + +Laszlo +"""]] diff --git a/doc/devblog/day_2__new_laptop/comment_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment b/doc/devblog/day_2__new_laptop/comment_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment new file mode 100644 index 000000000..052597521 --- /dev/null +++ b/doc/devblog/day_2__new_laptop/comment_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.54" + subject="comment 2" + date="2013-09-06T18:02:08Z" + content=""" +Lenovo Yoga 11s +"""]] diff --git a/doc/devblog/day_30__cronner.mdwn b/doc/devblog/day_30__cronner.mdwn new file mode 100644 index 000000000..f368407ca --- /dev/null +++ b/doc/devblog/day_30__cronner.mdwn @@ -0,0 +1,17 @@ +Lots of progress from yesterday's modest start of building data types for +scheduling. Last night I wrote the hairy calendar code to calculate when +next to run a scheduled event. (This is actually quite superior to `cron`, +which checks every second to see if it should run each event!) Today I +built a "Cronner" thread that handles spawning threads to handle each +scheduled event. It even notices when changes have been made to the its +schedule and stops/starts event threads appropriately. + +Everything is hooked up, building, and there's a good chance it works +without too many bugs, but while I've tested all the pure code (mostly +automatically with quickcheck properties), I have not run the Cronner +thread at all. And there is some tricky stuff in there, like noticing +that the machine was asleep past when it expected to wake up, and deciding +if it should still run a scheduled event, or should wait until next time. +So tomorrow we'll see.. + +Today's work was sponsored by Ethan Aubin. diff --git a/doc/devblog/day_30__cronner/comment_1_53dfd9310e92f5225db52a13e20a46d4._comment b/doc/devblog/day_30__cronner/comment_1_53dfd9310e92f5225db52a13e20a46d4._comment new file mode 100644 index 000000000..dc0c7dfe1 --- /dev/null +++ b/doc/devblog/day_30__cronner/comment_1_53dfd9310e92f5225db52a13e20a46d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-10-09T06:04:15Z" + content=""" +The SysV Unix *cron* learned this same thing [in 1979][1]. + +[1]: http://en.wikipedia.org/wiki/Cron#Multi-user_capability +"""]] diff --git a/doc/devblog/day_30__cronner/comment_2_f98357c6f7a6da23873ac27c2e1e9638._comment b/doc/devblog/day_30__cronner/comment_2_f98357c6f7a6da23873ac27c2e1e9638._comment new file mode 100644 index 000000000..0fc310a78 --- /dev/null +++ b/doc/devblog/day_30__cronner/comment_2_f98357c6f7a6da23873ac27c2e1e9638._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 2" + date="2013-10-11T17:07:24Z" + content=""" +However, if you strace a traditional cron, you will be sad at how it's implemented. So much statting of files, and checking of entries every second.. + +0 polling or redundant calulcation in my code! +"""]] diff --git a/doc/devblog/day_31__blah.mdwn b/doc/devblog/day_31__blah.mdwn new file mode 100644 index 000000000..672adbfd3 --- /dev/null +++ b/doc/devblog/day_31__blah.mdwn @@ -0,0 +1,17 @@ +Some neat stuff is coming up, but today was a pretty blah day for me. +I did get the Cronner tested and working (only had a few little bugs). But +I got stuck for quite a while making the Cronner stop `git-annex fsck` +processes it was running when their jobs get removed. I had some code to do +this that worked when run standalone, but not when run from git-annex. + +After considerable head-scratching, I found out this was due to +`forkProcess` masking aync exceptions, which seems to be probably +[a bug](http://ghc.haskell.org/trac/ghc/ticket/8433). Luckily was able to +work around it. Async exceptions continue to strike me as the worst part of +the worst part of Haskell (the worst part being exceptions in general). + +Was more productive after that.. Got the assistant to automatically queue +re-downloads of any files that fsck throws out due to having bad contents, +and made the webapp display an alert while fscking is running, which will +go to the page to configure fsck schedules. Now all I need to do is +build the UI of that page. diff --git a/doc/devblog/day_32__fsck_config_UI.mdwn b/doc/devblog/day_32__fsck_config_UI.mdwn new file mode 100644 index 000000000..66f4cfd54 --- /dev/null +++ b/doc/devblog/day_32__fsck_config_UI.mdwn @@ -0,0 +1,20 @@ +Last night, built this nice user interface for configuring periodic fscks: + +[[!img assistant/fsckconfig.png]] + +Rather happy that that whole UI needed only 140 lines of code to build. +Though rather more work behind it, as seen in this blog.. + +Today I added some support to git-annex for smart fscking of remotes. +So far only git repos on local drives, but this should get extended to +git-annex-shell for ssh remotes. The assistant can also run periodic fscks +of these. + +Still need to test that, and find a way to make a removable drive's fsck +job run when the drive gets plugged in. That's where picking "any time" +will be useful; it'll let you configure fscking of removable drives when +they're available, as long as they have not been fscked too recently. + +---- + +Today's work was sponsored by Georg Bauer. diff --git a/doc/devblog/day_33__fsck_on_connect.mdwn b/doc/devblog/day_33__fsck_on_connect.mdwn new file mode 100644 index 000000000..36c226008 --- /dev/null +++ b/doc/devblog/day_33__fsck_on_connect.mdwn @@ -0,0 +1,9 @@ +Built everything needed to run a fsck when a remote gets connected. Have +not tested it; only testing is blocking merging the incrementalfsck branch +now. + +Also updated the OSX and Android builds to use a new gpg release (denial of +service security fix), and updated the Debian backport, and did a small +amount of bug fixing. I need to do several more days of bug fixing once +I get this incremental fsck feature wrapped up before moving on to recovery +of corrupt git repositories. diff --git a/doc/devblog/day_34__wrapping_up_fsck.mdwn b/doc/devblog/day_34__wrapping_up_fsck.mdwn new file mode 100644 index 000000000..b66708605 --- /dev/null +++ b/doc/devblog/day_34__wrapping_up_fsck.mdwn @@ -0,0 +1,7 @@ +Fixed a lot of bugs in the assistant's fsck handling today, and merged +it into master. There are some enhancments that could be added to it, +including fscking ssh remotes via git-annex-shell and adding the ability to +schedule events to run every 30 days instead of on a specific day of the +month. But enough on this feature for now. + +Today's work was sponsored by Daniel Brockman. diff --git a/doc/devblog/day_35__anacron_and_bugfixing.mdwn b/doc/devblog/day_35__anacron_and_bugfixing.mdwn new file mode 100644 index 000000000..af021d576 --- /dev/null +++ b/doc/devblog/day_35__anacron_and_bugfixing.mdwn @@ -0,0 +1,15 @@ +While I said I was done with fsck scheduling yesterday, I ended up adding +one more feature to it today: Full anacron style scheduling. So a fsck can +be scheduled to run once per week, or month, or year, and it'll run the +fsck the next time it's available after that much time has passed. The nice +thing about this is I didn't have to change Cronner *at all* to add this, +just improved the Recurrance data type and the code that calculates when +to run events. + +Rest of the day I've been catching up on some bug reports. The main bug I +fixed caused git-annex on Android to hang when adding files. This turns out +to be because it's using a new (unreleased) version of git, and +`git check-attr -z` output format has changed in an incompatable way. + +I am currently 70 messages behind, which includes some ugly looking bug +reports, so I will probably continue with this over the next couple days. diff --git a/doc/devblog/day_36__bugfixing.mdwn b/doc/devblog/day_36__bugfixing.mdwn new file mode 100644 index 000000000..0e31d54bf --- /dev/null +++ b/doc/devblog/day_36__bugfixing.mdwn @@ -0,0 +1 @@ +Productive day, but I'm wiped out. Backlog down to 51. diff --git a/doc/devblog/day_37__long_day.mdwn b/doc/devblog/day_37__long_day.mdwn new file mode 100644 index 000000000..7882a746d --- /dev/null +++ b/doc/devblog/day_37__long_day.mdwn @@ -0,0 +1,6 @@ +A long day of bugfixing. Split into two major parts. First I got back to a +bug I filed in August to do with the assistant misbehaving when run in a +subdirectory of a git repository, and did a nice type-driven fix of the +underlying problem (that also found and fixed some other related bugs that +would not normally occur). Then, spent 4 hours in Windows purgatory working +around crazy path separator issues. diff --git a/doc/devblog/day_38__starting_git_repo_repair.mdwn b/doc/devblog/day_38__starting_git_repo_repair.mdwn new file mode 100644 index 000000000..3808abe38 --- /dev/null +++ b/doc/devblog/day_38__starting_git_repo_repair.mdwn @@ -0,0 +1,11 @@ +Goal for the rest of the month is to build automatic recovery git +repository corruption. Spent today investigating how to do it and came up +with a fairly [[detailed_design|design/assistant/disaster_recovery]]. It +will have two parts, first to handle repository problems that can be fixed +by fetching objects from remotes, and secondly to recover from problems +where data never got sent to a remote, and has been lost. + +In either case, the assistant should be able to detect the problem and +automatically recover well enough to keep running. Since this also affects +non-git-annex repositories, it will also be available in a standalone +`git-recover-repository` command. diff --git a/doc/devblog/day_38__starting_git_repo_repair/comment_1_321468d9686db5dde072500bdaeb7d29._comment b/doc/devblog/day_38__starting_git_repo_repair/comment_1_321468d9686db5dde072500bdaeb7d29._comment new file mode 100644 index 000000000..3a1ce7851 --- /dev/null +++ b/doc/devblog/day_38__starting_git_repo_repair/comment_1_321468d9686db5dde072500bdaeb7d29._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="Idea: checksum left-over files in .git/annex/tmp for potential recovery" + date="2013-10-19T12:30:58Z" + content=""" +This just came to mind when I thought about the second case. I noticed quite often that files were left in .git/annex/tmp (seen on OS X) and sometimes these are the only instances of files on this particular computer. + +(It's on my todo list to file several bug reports about this and other issues on OS X...) +"""]] diff --git a/doc/devblog/day_39__git-recover-repository.mdwn b/doc/devblog/day_39__git-recover-repository.mdwn new file mode 100644 index 000000000..f2c552eef --- /dev/null +++ b/doc/devblog/day_39__git-recover-repository.mdwn @@ -0,0 +1,54 @@ +Built a `git-recover-repository` command today. So far it only does the +detection and deletion of corrupt objects, and retrieves them from remotes +when possible. No handling yet of missing objects that cannot be recovered +from remotes. + +Here's a couple of sample runs where I do bad things to the git +repository and it fixes them: + +
+joey@darkstar:~/tmp/git-annex>chmod 644 .git/objects/pack/*
+joey@darkstar:~/tmp/git-annex>echo > .git/objects/pack/pack-a1a770c1569ac6e2746f85573adc59477b96ebc5.pack 
+joey@darkstar:~/tmp/git-annex>~/src/git-annex/git-recover-repository 
+Running git fsck ...
+git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file? Unpacking all pack files.
+fatal: early EOF
+Unpacking objects: 100% (148/148), done.
+Unpacking objects: 100% (354/354), done.
+Re-running git fsck to see if it finds more problems.
+Re-running git fsck to see if it finds more problems.
+Initialized empty Git repository in /home/joey/tmp/tmprepo.0/.git/
+Trying to recover missing objects from remote origin
+Successfully recovered repository!
+You should run "git fsck" to make sure, but it looks like
+everything was recovered ok.
+
+ +---- + +
+joey@darkstar:~/tmp/git-annex>chmod 644 .git/objects/00/0800742987b9f9c34caea512b413e627dd718e
+joey@darkstar:~/tmp/git-annex>echo > .git/objects/00/0800742987b9f9c34caea512b413e627dd718e
+joey@darkstar:~/tmp/git-annex>~/src/git-annex/git-recover-repository 
+Running git fsck ...
+error: unable to unpack 000800742987b9f9c34caea512b413e627dd718e header
+error: inflateEnd: stream consistency error (no message)
+error: unable to unpack 000800742987b9f9c34caea512b413e627dd718e header
+error: inflateEnd: stream consistency error (no message)
+git fsck found 1 broken objects. Unpacking all pack files.
+removing 1 corrupt loose objects
+Re-running git fsck to see if it finds more problems.
+Re-running git fsck to see if it finds more problems.
+Initialized empty Git repository in /home/joey/tmp/tmprepo.0/.git/
+Trying to recover missing objects from remote origin
+Successfully recovered repository!
+You should run "git fsck" to make sure, but it looks like
+everything was recovered ok.
+
+ +Works great! I need to move this and `git-union-merge` out of the git-annex +source tree sometime. + +---- + +Today's work was sponsored by Francois Marier. diff --git a/doc/devblog/day_3__gcrypt_uuids.mdwn b/doc/devblog/day_3__gcrypt_uuids.mdwn new file mode 100644 index 000000000..3182aca63 --- /dev/null +++ b/doc/devblog/day_3__gcrypt_uuids.mdwn @@ -0,0 +1,63 @@ +Started work on [gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt) +support. + +The first question is, should git-annex leave it up to gcrypt to transport +the data to the encrypted repository on a push/pull? gcrypt hooks into git +nicely to make that just work. However, if I go this route, it limits +the places the encrypted git repositores can be stored to regular git +remotes (and rsync). The alternative is to somehow use gcrypt to +generate/consume the data, but use the git-annex special remotes to store +individual files. Which would allow for a git repo stored on S3, etc. +For now, I am going with the simple option, but I have not ruled out +trying to make the latter work. It seems it would need changes to gcrypt +though. + +Next question: Given a remote that uses gcrypt, how do I determine the +annex.uuid of that repository. I found a nice solutuon to this. gcrypt has +its own gcrypt-id, and I convert it to a UUID in a +[[reproducible, and even standards-compliant way|design/gcrypt]]. So +the same encrypted remote will automatically get the same annex.uuid +wherever it's used. Nice. Does mean that git-annex cannot find a uuid +until `git pull` or `git push` has been used, to let gcrypt get the +gcrypt-id. Implemented that. + +The next step is actually making git-annex store data on gcrypt remotes. +And it needs to store it encrypted of course. It seems best to avoid +needing a `git annex initremote` for these gcrypt remotes, and just have +git-annex automatically encrypt data stored on them. But I don't +know. Without initializing them like a special remote is, I'm limited to +using the gpg keys that gcrypt is configured to encrypt to, and cannot use +the regular git-annex hybrid encryption scheme. Also, I need to generate +and store a nonce anyway to HMAC ecrypt keys. (Or modify gcrypt +to put enough entropy in gcrypt-id that I can use it?) + +Another concern I have is that gcrypt's own encryption scheme is simply +to use a list of public keys to encrypt to. It would be nicer if the +full set of git-annex encryption schemes could be used. Then the webapp +could use shared encryption to avoid needing to make the user set up a gpg +key, or hybrid encryption could be used to add keys later, etc. + +But I see why gcrypt works the way it does. Otherwise, you can't make an +encrypted repo with a friend set as one of the particpants and have them be +able to git clone it. Both hybrid and shared encryption store a secret +inside the repo, which is not accessible if it's encrypted using that +secret. There are use cases where not being able to blindly clone a gcrypt +repo would be ok. For example, you use the assistant to pair with a friend +and then set up an encrypted repo in the cloud for both of you to use. + +Anyway, for now, I will need to deal with +setting up gpg keys etc in the assistant. I don't want to tackle +full [[design/assistant/gpgkeys]] yet. Instead, I think I will start by +adding some simple stuff to the assistant: + +* When adding a USB drive, offer to encrypt the repository on the drive + so that only you can see it. +* When adding a ssh remote make a similar offer. +* Add a UI to add an arbitrary git remote with encryption. + Let the user paste in the url to an empty remote they have, + which could be to eg github. (In most cases this won't be used for + annexed content..) +* When the user has no gpg key, prompt to set one up. (Securely!) +* Maybe have an interface to add another gpg key that can access the gcrypt + repo. Note that this will need to re-encrypt and re-push the whole + git history. diff --git a/doc/devblog/day_40__another_fine_mess.mdwn b/doc/devblog/day_40__another_fine_mess.mdwn new file mode 100644 index 000000000..dfe5bc564 --- /dev/null +++ b/doc/devblog/day_40__another_fine_mess.mdwn @@ -0,0 +1,15 @@ +Solid day of working on repository recovery. Got `git recover-repository +--force` working, which involves fixing up branches that refer to missing +objects. Mostly straightforward traversal of git commits, trees, blobs, to +find when a branch has a problem, and identify an old version of it that +predates the missing object. (Can also find them in the reflog.) + +The main complication turned out to be that `git branch -D` and `git +show-ref` don't behave very well when the commit objects pointed to by refs +are themselves missing. And git has no low-level plumbing that avoids +falling over these problems, so I had to write it myself. + +Testing has turned up one unexpected problem: Git's index can itself refer +to missing objects, and that will break future commits, etc. So I need to +find a way to validate the index, and when it's got problems, +either throw it out, or possibly recover some of the staged data from it. diff --git a/doc/devblog/day_41__onward.mdwn b/doc/devblog/day_41__onward.mdwn new file mode 100644 index 000000000..fd393b734 --- /dev/null +++ b/doc/devblog/day_41__onward.mdwn @@ -0,0 +1,17 @@ +I think that git-recover-repository is ready now. Made it deal with the +index file referencing corrupt objects. The best approach I could think of +for that is to just remove those objects from the index, so the user can +re-add files from their work tree after recovery. + +Now to integrate this git repository repair capability into the git-annex +assistant. I decided to run `git fsck` as part of a scheduled +repository consistency check. It may also make sense for the assistant to +notice when things are going wrong, and suggest an immediate check. I've +started on the webapp UI to run a repository repair when fsck detects +problems. + +[[!img /assistant/brokenrepositoryalert.png]] + +[[!img /assistant/repairrepository.png]] + +[[!meta title="the user interface I hope noone ever sees"]] diff --git a/doc/devblog/day_41__onward/comment_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment b/doc/devblog/day_41__onward/comment_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment new file mode 100644 index 000000000..0457a4bf0 --- /dev/null +++ b/doc/devblog/day_41__onward/comment_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="aarone" + ip="2607:f470:8:d008:290:f5ff:fec3:a9e6" + subject="Email alert" + date="2013-10-22T21:23:24Z" + content=""" +I have at least one git-annex repository where I seldom open the web UI, but rather have the assistant humming along in the background. I think for my use case it would be best to receive an email notification that the assistant had detected a problem, which would prompt me to open the web UI and perform the recovery. +"""]] diff --git a/doc/devblog/day_41__onward/comment_2_33149e424cd5f03fac376288bcc4dfdc._comment b/doc/devblog/day_41__onward/comment_2_33149e424cd5f03fac376288bcc4dfdc._comment new file mode 100644 index 000000000..fd26f9290 --- /dev/null +++ b/doc/devblog/day_41__onward/comment_2_33149e424cd5f03fac376288bcc4dfdc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="excellent idea" + date="2013-10-22T22:13:58Z" + content=""" +Added to my todo. I think it would require the system have an MTA though, I really don't want git-annex to grow to the point it can send email. ;) +"""]] diff --git a/doc/devblog/day_41__onward/comment_3_3b07503bd79089ad3ce3ddd7535ed116._comment b/doc/devblog/day_41__onward/comment_3_3b07503bd79089ad3ce3ddd7535ed116._comment new file mode 100644 index 000000000..1116b4d1b --- /dev/null +++ b/doc/devblog/day_41__onward/comment_3_3b07503bd79089ad3ce3ddd7535ed116._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="Please check if it needs help from the user first" + date="2013-10-23T23:30:10Z" + content=""" +Awesome that you're working on recovery, and recovery automation! + +Please only bother the user if there is a serious problem _and_ it can't be fixed without their help. Otherwise I fear people will learn to ignore your dialog boxes, like they do most dialog boxes. If you want to notify your user that some hard drive corruption happened (and it's been fixed already) then put a little yellow/orange line across somewhere with a warning message. + +When I read to the part about how it can (probably) be fixed automatically, I got a flash of annoyance and thought \"well, then fix it automatically, why are you bothering me?\" + +Please (if you aren't already) check if it can be automatically fixed without help from the user before telling the user about it. Then you can say \"The data to fix this could not be reached, please plug in another repo or something.\" +"""]] diff --git a/doc/devblog/day_42__repair_milestone.mdwn b/doc/devblog/day_42__repair_milestone.mdwn new file mode 100644 index 000000000..61a1bea27 --- /dev/null +++ b/doc/devblog/day_42__repair_milestone.mdwn @@ -0,0 +1,35 @@ +The webapp now fully handles repairing damage to the repository. + +Along with all the git repository repair stuff already built, I added +additional repairs of the git-annex branch and git-annex's index file. +That was pretty easy actually, since git-annex already handles merging +git-annex branches that can sometimes be quite out of date. So when git repo +repair has to throw away recent changes to the git-annex branch, it just +effectively becomes out of date. Added a `git annex fsck --fast` run to +ensure that the git-annex branch reflects the current state of the +repository. + +When the webapp runs a repair, it first stops the assistant from committing +new files. Once the repair is done, that's started back up, and it runs a +startup scan, which is just what is needed in this sitation; it will add +any new files, as well as any old files that the git repository damange +caused to be removed from the index. + +Also made `git annex repair` run the git repository repair code, +for those with a more command-line bent. It can be used in non-git-annex +repos too! + +---- + +So, I'm nearly ready to wrap up working on disaster recovery. Lots has been +accomplished this month. And I have put off making a release for entirely +too long! + +The big missing piece is repair of git remotes located on removable drive. +I may make a release before adding that, but removable drives are probably +where git repository corruption is most likely to occur, so I certainly +need to add that. + +---- + +Today's work was sponsored by Scott Robinson. diff --git a/doc/devblog/day_43__bugfix_day.mdwn b/doc/devblog/day_43__bugfix_day.mdwn new file mode 100644 index 000000000..ad150f512 --- /dev/null +++ b/doc/devblog/day_43__bugfix_day.mdwn @@ -0,0 +1,26 @@ +Got well caught up on bug fixes and traffic. Backlog is down to 40. + +Made the assistant wait for a few seconds before doing the startup +scan when it's autostarted, since the desktop is often busy starting +up at that same time. + +Fixed an ugly bug with chunked webdav and directory special remotes +that caused it to not write a "chunkcount" file when storing data, +so it didn't think the data was present later. I was able to make it +recover nicely from that mistake, by probing for what chunks are actually +present. + +Several people turn out to have had problems with `git annex sync` not +working because receive.denyNonFastForwards is enabled. I made the webapp +not enable it when setting up a ssh repository, and I made `git annex sync` +print out a hint about this when it's failed to push. (I don't think this +problem affects the assistant's own syncing.) + +Made the assistant try to repair a damaged git repository without +prompting. It will only prompt when it fails to fetch all the lost +objects from remotes. + +Glad to see that others have managed to +[get git-annex to build on Max OS X 10.9](http://git-annex.branchable.com/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/#comment-8e8ee5e50506a6fde029d236f4809df8). +Now I just need someone to offer up a ssh account on that OS, and I could +set up an autobuilder for it. diff --git a/doc/devblog/day_44__automatic_removable_drive_repair.mdwn b/doc/devblog/day_44__automatic_removable_drive_repair.mdwn new file mode 100644 index 000000000..444cf5f2e --- /dev/null +++ b/doc/devblog/day_44__automatic_removable_drive_repair.mdwn @@ -0,0 +1,16 @@ +Finally got the assistant to repair git repositories on removable drives, +or other local repos. Mostly this happens entirely automatically, whatever +data in the git repo on the drive has been corrupted can just be copied +to it from `~/annex/.git`. + +And, the assistant will launch a git fsck of such a repo whenever it fails +to sync with it, so the user does not even need to schedule periodic fscks. +Although it's still a good idea, since some git repository problems don't +prevent syncing from happening. + +Watching git annex heal problems like this is quite cool! + +One thing I had to defer till later is repairing corrupted gcrypt +repositories. I don't see a way to do it without deleting all the objects +in the gcrypt repository, and re-pushing everything. And even doing that +is tricky, since the `gcrypt-id` needs to stay the same. diff --git a/doc/devblog/day_45__command_line.mdwn b/doc/devblog/day_45__command_line.mdwn new file mode 100644 index 000000000..fa6a7ffc7 --- /dev/null +++ b/doc/devblog/day_45__command_line.mdwn @@ -0,0 +1,9 @@ +All command line stuff today.. + +Added --want-get and --want-drop, which can be used to test preferred content settings +of a repository. For example `git annex find --in . --want-drop` will list the same +files that `git annex drop --auto` would try to drop. (Also renamed `git annex content` +to `git annex wanted`.) + +Finally laid to rest problems with `git annex unannex` when multiple files point to the +same key. It's a lot slower, but I'll stop getting bug reports about that. diff --git a/doc/devblog/day_46__wrapping_up_the_month.mdwn b/doc/devblog/day_46__wrapping_up_the_month.mdwn new file mode 100644 index 000000000..c6045178c --- /dev/null +++ b/doc/devblog/day_46__wrapping_up_the_month.mdwn @@ -0,0 +1,18 @@ +Spent today reviewing my [[plans_for_the_month|assistant/disaster_recovery]] +and filling in a couple of missing peices. + +Noticed that I had forgotten to make repository repair clean up any stale +git locks, despite writing that code at the beginning of the month, and +added that in. + +Made the webapp notice when a repository that is being used does not have +any consistency checks configured, and encourage the user to set up checks. +This happens when the assistant is started (for the local repository), +and when removable drives containing repositories are plugged in. If the +reminders are annoying, they can be disabled with a couple clicks. + +And I think that just about wraps up the month. (If I get a chance, I would +still like to add recovery of git-remote-gcrypt encrypted git repositories.) + +My [[design/roadmap]] has next month dedicated to user-driven features +and polishing and bugfixing. diff --git a/doc/devblog/day_47__fell_off_the_blogging_wagon.mdwn b/doc/devblog/day_47__fell_off_the_blogging_wagon.mdwn new file mode 100644 index 000000000..fd312a0d8 --- /dev/null +++ b/doc/devblog/day_47__fell_off_the_blogging_wagon.mdwn @@ -0,0 +1,3 @@ +Low activity the past couple of days. Released a new version of git-annex +yesterday. Today fixed three bugs (including a local pairing one that was +pretty compicated) and worked on getting caught up with traffic. diff --git a/doc/devblog/day_48__direct_mode_guard_design.mdwn b/doc/devblog/day_48__direct_mode_guard_design.mdwn new file mode 100644 index 000000000..c047e7f75 --- /dev/null +++ b/doc/devblog/day_48__direct_mode_guard_design.mdwn @@ -0,0 +1,29 @@ +I've been investigating ways to implement a [[/todo/direct_mode_guard]]. +Preventing a stray `git commit -a` or `git add` doing bad things in a +direct mode repository seems increasingly important. + +First, considered moving `.git`, so git won't know it's a git repository. +This doesn't seem *too* hard to do, but there will certainly be unexpected +places that assume `.git` is the directory name. + +I dislike it more and more as I think about it though, because it moves +direct mode git-annex toward being entirely separate from git, and I don't +want to write my own version control system. Nor do I want to complicate +the git ecosystem with tools needing to know about git-annex to work in +such a repository. + +So, I'm happy that one of the other ideas I tried today seems quite +promising. Just set core.bare=true in a direct mode repository. This nicely +blocks all git commands that operate on the working tree from doing +anything, which is just what's needed in direct mode, since they don't know +how to handle the direct mode files. But it lets all git commands and other +tools that don't touch the working tree continue to be used. You can even +run `git log file` in such a repository (surprisingly!) + +It also gives an easy out for anyone who really wants to use git commands +that operate on the work tree of their direct mode repository, by just +passing `-c core.bare=false`. And it's really easy to implement in +git-annex too -- it can just notice if a repo has core.bare and +annex.direct both set, and pass that parameter to every git command it +runs. I should be able to get by with only modifying 2 functions to +implement this. diff --git a/doc/devblog/day_48__direct_mode_guard_design/comment_1_ec0147ccc55bad3a38652383f4098a65._comment b/doc/devblog/day_48__direct_mode_guard_design/comment_1_ec0147ccc55bad3a38652383f4098a65._comment new file mode 100644 index 000000000..3f297d505 --- /dev/null +++ b/doc/devblog/day_48__direct_mode_guard_design/comment_1_ec0147ccc55bad3a38652383f4098a65._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="70.82.37.38" + subject="awesome!" + date="2013-11-05T15:50:15Z" + content=""" +`core.bare=true` seems like an awesome idea!!! it probably means this can be factored into current installs without any change too right? +"""]] diff --git a/doc/devblog/day_49__direct_mode_guard_implementation.mdwn b/doc/devblog/day_49__direct_mode_guard_implementation.mdwn new file mode 100644 index 000000000..ebc0dd494 --- /dev/null +++ b/doc/devblog/day_49__direct_mode_guard_implementation.mdwn @@ -0,0 +1,14 @@ +Long, long day coding up the direct mode guard today. About 90% of the fun +is dealing with `receive.denyCurrentBranch` not preventing pushes that +change the current branch, now that core.bare is set in direct mode. +My current solution to this involves using a special branch when using +direct mode, which nothing will ever push to (hopefully). A much nicer +solution would be to use a `update` hook to deny pushes of the current +branch -- but there are filesystems where repos cannot have git hooks. + +The test suite is falling over, but the `directguard` branch otherwise +seems usable. + +---- + +Today's work was sponsored by Carlo Matteo Capocasa. diff --git a/doc/devblog/day_49__direct_mode_guard_implementation/comment_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment b/doc/devblog/day_49__direct_mode_guard_implementation/comment_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment new file mode 100644 index 000000000..2a77d6d81 --- /dev/null +++ b/doc/devblog/day_49__direct_mode_guard_implementation/comment_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 1" + date="2013-11-06T11:50:00Z" + content=""" +Thanks, Joey! I am very proud! +"""]] diff --git a/doc/devblog/day_4__unexpected_windows_day.mdwn b/doc/devblog/day_4__unexpected_windows_day.mdwn new file mode 100644 index 000000000..6a448c3fc --- /dev/null +++ b/doc/devblog/day_4__unexpected_windows_day.mdwn @@ -0,0 +1,10 @@ +Woke up with a pretty solid plan for gcrypt. It will be structured as a +separate special remote, so `initremote` will be needed, with a gitrepo= +parameter (unless the remote already exists). git-annex will then set up +the git remote, including pushing to it (needed to get a gcrypt-id). + +Didn't feel up to implementing that today. Instead I expectedly spent +the day doing mostly Windows work, including setting up a VM on my new +laptop for development. Including a ssh server in Windows, so I can +script local builds and tests on Windows without ever having to +touch the desktop. Much better! diff --git a/doc/devblog/day_50__grab_bag.mdwn b/doc/devblog/day_50__grab_bag.mdwn new file mode 100644 index 000000000..e38ec065c --- /dev/null +++ b/doc/devblog/day_50__grab_bag.mdwn @@ -0,0 +1,34 @@ +Started by tracking down a strange bug that was apparently +ubuntu-specific and caused git-annex branch changes to get committed to +master. Root cause turned out to failing to recover from an +exception. I'm kicking myself about that, because I remember looking at the +code where the bug was at least twice before and thinking "hmm, should add +exception handling here? nah..". Exceptions are horrible. + +Made a release with a fix for that and a few minor other accumulated +changes since last Friday's release. The pain point of this release is to +fix building without the webapp (so it will propigate to Debian testing, +etc). This release does not include the direct mode guard, so I'll have a +few weeks until the next release to get that tested. + +Fixed the test suite in `directguard`. This branch is now nearly ready to +merge to master, but one command that is badly needed in guarded direct +mode is "git status". So I am planning to rename "git annex status" to +"git annex info", and make "git annex status" display something similar +to "git status". + +Also took half an hour and added optional [[EKG]] support to git-annex. +This is a Haskell library that can add a terrific monitoring console web +UI to any program in 2 lines of code. Here we can see the git-annex +webapp using resources at startup, followed in a few seconds by the +assistant's startup scan of the repository. + +[[!img ekg/ekg.png]] + +BTW, Kevin tells me that the machine used to build git-annex for OSX is +going to be upgraded to 10.9 soon. So, hopefully I'll be making autobuilds +of that. I may have to stop the 10.8.2 autobuilds though. + +---- + +Today's work was sponsored by [Protonet](http://protonet.info/). diff --git a/doc/devblog/day_50__grab_bag/comment_1_01846f6494fe843889391fd09fd127a0._comment b/doc/devblog/day_50__grab_bag/comment_1_01846f6494fe843889391fd09fd127a0._comment new file mode 100644 index 000000000..1c1717180 --- /dev/null +++ b/doc/devblog/day_50__grab_bag/comment_1_01846f6494fe843889391fd09fd127a0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="OS X builds" + date="2013-11-07T05:12:13Z" + content=""" +Joey, were you not interested in my offer of an OS X build server that I've posted elsewhere on this list, and also in e-mail to you? +"""]] diff --git a/doc/devblog/day_50__grab_bag/comment_2_12736014aa2c1af81e4b83072505e7d5._comment b/doc/devblog/day_50__grab_bag/comment_2_12736014aa2c1af81e4b83072505e7d5._comment new file mode 100644 index 000000000..70d7b7cd1 --- /dev/null +++ b/doc/devblog/day_50__grab_bag/comment_2_12736014aa2c1af81e4b83072505e7d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 2" + date="2013-11-07T16:01:00Z" + content=""" +John, must have missed that; can't see to find it anywhere.. +"""]] diff --git a/doc/devblog/day_51__direct_mode_guard_finished.mdwn b/doc/devblog/day_51__direct_mode_guard_finished.mdwn new file mode 100644 index 000000000..9c637aa94 --- /dev/null +++ b/doc/devblog/day_51__direct_mode_guard_finished.mdwn @@ -0,0 +1,6 @@ +Finished the direct mode guard, including the new `git annex status` +command. + +Spent the rest of the day working on various bug fixes. One of them turned +into rather a lot of work to make the webapp's UI better for git +remotes that do not have an annex.uuid. diff --git a/doc/devblog/day_52__slowly_but_surely.mdwn b/doc/devblog/day_52__slowly_but_surely.mdwn new file mode 100644 index 000000000..01019355b --- /dev/null +++ b/doc/devblog/day_52__slowly_but_surely.mdwn @@ -0,0 +1,5 @@ +Been chipping away at my backlog of messages, and it's down to 23 items. + +Finally managed to get ghc to build with a newer version of the NDK. +This *might* mean a solution to git-annex on Android 4.2. I +[need help with testing](http://git-annex.branchable.com/bugs/git-annex_broken_on_Android_4.3/#comment-90b82735cd6090a7765f423b743fffd3). diff --git a/doc/devblog/day_54__android_bisection_minions.mdwn b/doc/devblog/day_54__android_bisection_minions.mdwn new file mode 100644 index 000000000..ed86c68d0 --- /dev/null +++ b/doc/devblog/day_54__android_bisection_minions.mdwn @@ -0,0 +1,9 @@ +Finally found the [root cause](http://git-annex.branchable.com/bugs/git-annex_broken_on_Android_4.3/#comment-452bee7d0a816300ccb4a34f9758134e) +of the Android 4.3/4.4 trouble, and a fix is now in place! + +As a bonus, it looks like I've fixed a problem accessing the +environment on Android that had been worked around in an ugly way before. + +Big thanks to my remote hands Michael Alan, Sören, and subito. All +told they ran 19 separate tests to help me narrow down this tricky +problem, often repeating long command lines on software keyboards. diff --git a/doc/devblog/day_54__android_bisection_minions/comment_1_bea8fbe2b87d4a4865b92fa796298fa0._comment b/doc/devblog/day_54__android_bisection_minions/comment_1_bea8fbe2b87d4a4865b92fa796298fa0._comment new file mode 100644 index 000000000..0f8e58827 --- /dev/null +++ b/doc/devblog/day_54__android_bisection_minions/comment_1_bea8fbe2b87d4a4865b92fa796298fa0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmW0kg4uiMIhSHeVuvJFyo2VYMl7Qoej0s" + nickname="Chris" + subject="Woot!" + date="2013-11-12T15:52:48Z" + content=""" +Thanks for getting this fixed. I'm about to go on a long plane ride, and this will make it a lot easier for me to put movies on my tablet. +"""]] diff --git a/doc/devblog/day_55__fireside_porting.mdwn b/doc/devblog/day_55__fireside_porting.mdwn new file mode 100644 index 000000000..c7469d953 --- /dev/null +++ b/doc/devblog/day_55__fireside_porting.mdwn @@ -0,0 +1,22 @@ +Annoyingly, the Android 4.3 fix breaks git-annex on Android 4.0 (probably +through 4.2), so I now have two separate builds of the Android app. + +--- + +Worked on Windows porting today. I've managed to get the assistant +and watcher (but not yet webapp) to build on Windows. +The `git annex transferrer` interface needs POSIX stuff, and seems to be +the main thing that will need porting for Windows for the assistant to +work, besides of course file change detection. For that, I've hooked up +[Win32-notify](http://hackage.haskell.org/package/Win32-notify). + +So the watcher might work on Windows. +At least in theory. Problem is, while all the code builds ok, +it fails to link: + + ghc.exe: could not execute: C:\Program Files (x86)\Haskell Platform\2012.4.0.0\lib/../mingw/bin/gcc.exe + +I wonder if this is case of too many parameters being passed? + +This happens both on the autobuilder and on my laptop, so I'm stuck here. +Oh well, I was not planning to work on this anyway until February... diff --git a/doc/devblog/day_55__fireside_porting/comment_1_d690a52db82f9594d99ae65fe51e1f1a._comment b/doc/devblog/day_55__fireside_porting/comment_1_d690a52db82f9594d99ae65fe51e1f1a._comment new file mode 100644 index 000000000..74acc8322 --- /dev/null +++ b/doc/devblog/day_55__fireside_porting/comment_1_d690a52db82f9594d99ae65fe51e1f1a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-11-13T06:22:49Z" + content=""" +[ProcExp](http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) may be useful -- it can show process-related syscalls and their return codes _(among other things like file or registry access)_ so it should tell exactly why the exec failed. +"""]] diff --git a/doc/devblog/day_56__git-annex_user_survey.mdwn b/doc/devblog/day_56__git-annex_user_survey.mdwn new file mode 100644 index 000000000..8c1c67994 --- /dev/null +++ b/doc/devblog/day_56__git-annex_user_survey.mdwn @@ -0,0 +1,20 @@ +One of my goals for this month is to get a better sense of how git-annex is +being used, how it's working out for people, and what areas need to be +concentrated on. To start on that, I am doing the +[2013 git-annex user survey](http://git-annex-survey.branchable.com/polls/2013/), similar to the git user +surveys. I will be adding some less general polls later (suggestions for +topics appreciated!), but you can go vote in any or all of 10 polls now. + +---- + +Found a workaround for yesterday's Windows build problem. Seems that only +cabal runs gcc in a way that fails, so `ghc --make` builds is successfully. +However, the watcher doesn't quite work on Windows. It does get events when +files are created, but it seems to then hang before it can add the file to +git, or indeed finish printing out a debug log message about the event. +This looks like it could be a problem with the threaded ghc runtime on +Windows, or something like that. + +Main work today was improving the git repository repair to handle corrupt +index files. The assistant can now start up, detect that the index file is +corrupt, and regenerate it all automatically. diff --git a/doc/devblog/day_57__mavericks.mdwn b/doc/devblog/day_57__mavericks.mdwn new file mode 100644 index 000000000..1031895be --- /dev/null +++ b/doc/devblog/day_57__mavericks.mdwn @@ -0,0 +1,14 @@ +The user survey is producing some interesting and useful results! +Added two more polls: [using with](http://git-annex-survey.branchable.com/polls/2013/using_with/) and [blocking problems](http://git-annex-survey.branchable.com/polls/2013/blocking_problems/) +(There were some load issues so if you were unable to vote yesterday, try +again..) + +Worked on getting the autobuilder for OS X Mavericks set up. Eventually +succeeded, after patching a few packages to work around a cpp that thinks +it should parse haskell files as if they're C code. +Also, Jimmy has resuscitated the OS X Lion autobuilder. + +A not too bad bug in automatic merge conflict resolution has been reported, +so I will need to dig into that tomorrow. Didn't feel up to it today, so +instead have been spending the remaining time finishing up a branch that +switches the test suite to use the tasty test framework. diff --git a/doc/devblog/day_58__urgle.mdwn b/doc/devblog/day_58__urgle.mdwn new file mode 100644 index 000000000..f6d930d80 --- /dev/null +++ b/doc/devblog/day_58__urgle.mdwn @@ -0,0 +1,16 @@ +Fixed two difficult bugs with direct mode. One happened (sometimes) when a +file was deleted and replaced with a directory by the same name and then +those changes were merged into a direct mode repository. + +The other problem was that direct mode did not prevent writes to +.git/annex/objects the way that indirect mode does, so when a file in the +repository was not currently present, writing to the dangling symlink would +follow it and write into the object directory. + +Hmm, I was going to say that it's a pity that direct mode still has so many +bugs being found and fixed, but the last real bug fix to direct mode was +made last May! Instead, I probably have to thank Tim for being a very +thorough tester. + +Finished switching the test suite to use the tasty framework, and prepared +tasty packages for Debian. diff --git a/doc/devblog/day_58__urgle/comment_1_bd279f58f614b103a53215dfb0211007._comment b/doc/devblog/day_58__urgle/comment_1_bd279f58f614b103a53215dfb0211007._comment new file mode 100644 index 000000000..0fec5fa8c --- /dev/null +++ b/doc/devblog/day_58__urgle/comment_1_bd279f58f614b103a53215dfb0211007._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="Is direct mode still using symlinks then?" + date="2013-11-16T16:28:39Z" + content=""" +Is direct mode still using symlinks? I see the bug I opened is still unclosed: + +http://git-annex.branchable.com/bugs/Direct_mode_repositories_still_use_symlinks_sometimes/ + +Any opinion on this? This is still my main problem with replacing dropbox with git-annex. +"""]] diff --git a/doc/devblog/day_59__release_day.mdwn b/doc/devblog/day_59__release_day.mdwn new file mode 100644 index 000000000..469ccec44 --- /dev/null +++ b/doc/devblog/day_59__release_day.mdwn @@ -0,0 +1,11 @@ +Release today, right on bi-weekly schedule. Rather startled +at the size of the changelog for this one; along with the direct mode +guard, it adds support for OS X Mavericks, Android 4.3/4.4, and fixes +numerous bugs. + +Posted another question in the survey, +. + +Spun off git-repair as an independant package from git-annex. Of course, +most of the source code is shared with git-annex. I need to do something +with libraries eventually.. diff --git a/doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn b/doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn new file mode 100644 index 000000000..626b5edaf --- /dev/null +++ b/doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn @@ -0,0 +1,7 @@ +About half way done with a gcrypt special remote. I can initremote it (the +hard part to get working), and can send files to it. Can't yet get files +back, or remove files, and only local repositories work so far, but this is +enough to know it's going to be pretty nice! + +Did find one issue in gcrypt that I may need to develop a patch for: + diff --git a/doc/devblog/day_60__damage_driven_development.mdwn b/doc/devblog/day_60__damage_driven_development.mdwn new file mode 100644 index 000000000..64460e86a --- /dev/null +++ b/doc/devblog/day_60__damage_driven_development.mdwn @@ -0,0 +1,36 @@ +Wrote some evil code you don't want to run today. Git.Destroyer randomly +generates Damage, and applies it to a git repository, in a way that is +reproducible -- applying the same Damage to clones of the same git repo +will always yeild the same result. + +This let me build a test harness for git-repair, which repeatedly clones, +damages, and repairs a repository. And when it fails, I can just ask it to +retry after fixing the bug and it'll re-run every attempt it's logged. + +This is already yeilding improvements to the git-repair code. +The first randomly constructed Damage that it failed to recover +turned out to be a truncated index file that hid some other +corrupted object files from being repaired. + + [Damage Empty (FileSelector 1), + Damage Empty (FileSelector 2), + Damage Empty (FileSelector 3), + Damage Reverse (FileSelector 3), + Damage (ScrambleFileMode 3) (FileSelector 5), + Damage Delete (FileSelector 9), + Damage (PrependGarbage "¥SOH¥STX¥ENQ¥f¥a¥ACK¥b¥DLE¥n") (FileSelector 9), + Damage Empty (FileSelector 12), + Damage (CorruptByte 11 25) (FileSelector 6), + Damage Empty (FileSelector 5), + Damage (ScrambleFileMode 4294967281) (FileSelector 14) + ] + +I need to improve the ranges of files that it damages -- currently QuickCheck +seems to only be selecting one of the first 20 or so files. Also, it's quite +common that it will damage `.git/config` so badly that git thinks it's not +a git repository anymore. I am not sure if that is something `git-repair` +should try to deal with. + +--- + +Today's work was sponsored by the WikiMedia Foundation. diff --git a/doc/devblog/day_61__damage_driven_development__II.mdwn b/doc/devblog/day_61__damage_driven_development__II.mdwn new file mode 100644 index 000000000..605a3878d --- /dev/null +++ b/doc/devblog/day_61__damage_driven_development__II.mdwn @@ -0,0 +1,15 @@ +Pushed out a minor release of git-annex today, mostly to fix build problems +on Debian. No strong reason to upgrade to it otherwise. + +Continued where I left off with the Git.Destroyer. Fixed quite a lot of +edge cases where git repair failed due to things like a corrupted .git/HEAD +file (this makes git think it's not in a git repository), corrupt +git objects that have an unknown object type and so crash git hard, and +an interesting failure mode where git fsck wants to allocate 116 GB of +memory due to a corrupted object size header. Reported that last to the git +list, as well as working around it. + +At the end of the day, I ran a test creating 10000 corrupt git +repositories, and **all** of them were recovered! Any improvements will +probably involve finding new ways to corrupt git repositories that my code +can't think of. ;) diff --git a/doc/devblog/day_62__upgrade_alerts.mdwn b/doc/devblog/day_62__upgrade_alerts.mdwn new file mode 100644 index 000000000..0b3078563 --- /dev/null +++ b/doc/devblog/day_62__upgrade_alerts.mdwn @@ -0,0 +1,22 @@ +Still working on the git repair code. Improved the test suite, which found +some more bugs, and so I've been running tests all day and occasionally +going and fixing a bug in the repair code. The hardest part of repairing a +git repo has turned out to be reliably determining which objects in it are +broken. Bugs in git don't help (but the git devs are going to fix the one I +reported). + +But the interesting new thing today is that I added some upgrade alert code +to the webapp. Ideally everyone would get git-annex and other software as +part of an OS distribution, which would include its own upgrade system -- +But the [survey](http://git-annex-survey.branchable.com/polls/2013/how_installed/) +tells me that a quarter of installs are from the prebuilt binaries I +distribute. + +So, those builds are going to be built with knowledge of an upgrade url, +and will periodically download a small info file (over https) to see if a +newer version is available, and show an alert. + +I think all that's working, though I have not yet put the info files in +place and tested it. The actual upgrade process will be a manual +download and reinstall, to start with, and then perhaps I'll automate it +further, depending on how hard that is on the different platforms. diff --git a/doc/devblog/day_62__upgrade_alerts/comment_1_cdb44aaa1d2a784a72613cbf16038f89._comment b/doc/devblog/day_62__upgrade_alerts/comment_1_cdb44aaa1d2a784a72613cbf16038f89._comment new file mode 100644 index 000000000..cb0bfc08b --- /dev/null +++ b/doc/devblog/day_62__upgrade_alerts/comment_1_cdb44aaa1d2a784a72613cbf16038f89._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="gitannex-install" + date="2013-11-22T07:13:02Z" + content=""" +To install and upgrade the prebuilt binary on Linux I use the fantastic [gitannex-install](https://github.com/zerodogg/scriptbucket/blob/master/gitannex-install) script, together with the upgrade alert this is just great. +"""]] diff --git a/doc/devblog/day_62__upgrade_alerts/comment_2_b08bb946e4760d7f03b45c852c745b2e._comment b/doc/devblog/day_62__upgrade_alerts/comment_2_b08bb946e4760d7f03b45c852c745b2e._comment new file mode 100644 index 000000000..3a5ec5b7d --- /dev/null +++ b/doc/devblog/day_62__upgrade_alerts/comment_2_b08bb946e4760d7f03b45c852c745b2e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="git-annex release annex" + date="2013-11-25T06:15:23Z" + content=""" +Immediate thought: instead of an info file, why not sync a public git repo with releases annexed with URLs? +"""]] diff --git a/doc/devblog/day_63__leverage.mdwn b/doc/devblog/day_63__leverage.mdwn new file mode 100644 index 000000000..6cf8acfa2 --- /dev/null +++ b/doc/devblog/day_63__leverage.mdwn @@ -0,0 +1,24 @@ +The difference picking the right type can make! Last night, I realized that +the where I had a `distributionSha256sum :: String`, I should instead use +`distributionKey :: Key`. This means that when git-annex is eventually +downloading an upgrade, it can treat it as just another Key being +downloaded from the web. So the webapp will show that transfer along with +all the rest, and I can leverage tons of code for a new purpose. For +example, it can simply fsck the key once it's downloaded to verify its +checksum. + +Also, built a DistriutionUpdate program, which I'll run to generate the +info files for a new version. And since I keep git-annex releases in a +git-annex repo, this too leverages a lot of git-annex modules, and ended up +being just 60 easy lines of code. The upgrade notification code is tested +and working now. + +And, I made the assistant detect when the git-annex program binary is +replaced or modified. Used my existing DirWatcher code for that. The plan +is to restart the assistant on upgrade, although I need to add some sanity +checks (eg, reuse the lsof code) first. And yes, this will work even for +`apt-get upgrade`! + +---- + +Today's work was sponsored by Paul Tötterman diff --git a/doc/devblog/day_64__overkill.mdwn b/doc/devblog/day_64__overkill.mdwn new file mode 100644 index 000000000..fd5d66f4e --- /dev/null +++ b/doc/devblog/day_64__overkill.mdwn @@ -0,0 +1,31 @@ +Completely finished up with making the assistant detect when git-annex's +binary has changed and handling the restart. + +It's a bit tricky because during an upgrade there can be two assistant +daemons running at the same time, in the same repository. Although I +disable the watcher of the old one first. Luckily, git-annex has long +supported running multiple concurrent git-annex processes in the same +repository. + +The surprisingly annoying part turned out to be how to make the webapp +redirect the browser to the new url when it's upgraded. Particularly needed +when automatic upgrades are enabled, since the user will not then be taking +any action in the webapp that could result in a redirect. My solution to this +feels like overkill; the webapp does ajax long polling until it gets an +url, and then redirects to it. Had to write javascript code and ugh. + +But, that turned out to also be useful when manually restarting the webapp +(removed some horrible old code that ran a shell script to do it before), +and also when shutting the webapp down. + +[[!img assistant/downloadupgrade.png alt="assistant downloading an upgrade to itself"]] + +Getting back to upgrades, I have the assistant downloading the upgrade, and +running a hook action once the key is transferred. Now all I need is some +platform-specific code to install it. Will probably be hairy, especially on +OSX where I need to somehow unmount the old git-annex dmg and mount the new +one, from within a program running on the old dmg. + +---- + +Today's work was sponsored by Evan Deaubl. diff --git a/doc/devblog/day_64__overkill/comment_1_e1db7678aae37af281d31ae211677786._comment b/doc/devblog/day_64__overkill/comment_1_e1db7678aae37af281d31ae211677786._comment new file mode 100644 index 000000000..b04af39ff --- /dev/null +++ b/doc/devblog/day_64__overkill/comment_1_e1db7678aae37af281d31ae211677786._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="abg" + ip="184.75.210.234" + subject="Upgrade installation in OSX" + date="2013-11-24T00:28:03Z" + content=""" +Hey, + +You don't have to implement any whacky DMG replacement logic for OSX upgrades. No sane user will be using the application from the DMG. They will drag the .app directory to /Applications or some non-standard location and unmount the DMG. So your upgrade logic for OSX should end up looking very similar to the upgrade logic for Linux. +"""]] diff --git a/doc/devblog/day_64__overkill/comment_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment b/doc/devblog/day_64__overkill/comment_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment new file mode 100644 index 000000000..c9e76b577 --- /dev/null +++ b/doc/devblog/day_64__overkill/comment_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmuh_0-Mjz7QkVz7gT_7PRpCgmMcBFkj14" + nickname="Wichert" + subject="Running from DMG is not a sane use-case" + date="2013-11-25T08:23:38Z" + content=""" +I don't think you should bother trying to support upgrades when people are running from a dmg. A DMG is just a disk image, and a format commonly used to distribute software. Running software from a DMG is not something anyone does beyond a quick first test of an application. A more reasonable thing to do, which many applications do now, is to offer to move the application from the DMG to /Applications if you detect someone is running it from a DMG. +"""]] diff --git a/doc/devblog/day_65__wrapping_up_upgrades.mdwn b/doc/devblog/day_65__wrapping_up_upgrades.mdwn new file mode 100644 index 000000000..9faa31a63 --- /dev/null +++ b/doc/devblog/day_65__wrapping_up_upgrades.mdwn @@ -0,0 +1,5 @@ +[[!img assistant/upgradecomplete.png]] + +Upgrades are fully working on Linux. OSX code is written but intested and I +thought of one bug it certainly has on my evening walk. Probably another +hour's work left later this evening to finish it off. diff --git a/doc/devblog/day_66__upgrade_testing.mdwn b/doc/devblog/day_66__upgrade_testing.mdwn new file mode 100644 index 000000000..741ec494e --- /dev/null +++ b/doc/devblog/day_66__upgrade_testing.mdwn @@ -0,0 +1,17 @@ +Upgrades should be working on OSX Mavericks, Linux, and sort of on Android. +This needs more testing, so I have temporarily made the daily builds think +they are an older version than the last git-annex release. So when you +install a daily build, and start the webapp, it should try to upgrade +(really downgrade) to the last release. Tests appreciated. + +Looking over the whole upgrade code base, it took 700 lines of code +to build the whole thing, of which 75 are platform specific (and mostly +come down to just 3 or 4 shell commands). Not bad.. + +---- + +Last night, added support for quvi 0.9, which has a completely changed +command line interface from the 0.4 version. + +Plan to spend tomorrow catching up on bug reports etc and then low activity +for rest of the week. diff --git a/doc/devblog/day_67_thanksgiving_rush.mdwn b/doc/devblog/day_67_thanksgiving_rush.mdwn new file mode 100644 index 000000000..7ac6ba523 --- /dev/null +++ b/doc/devblog/day_67_thanksgiving_rush.mdwn @@ -0,0 +1,19 @@ +My last day before thanksgiving, getting caught up with some recent bug +reports and, quite a rush to get a lot of fixes in. Adding to the fun, +wintery weather means very limited power today. + +It was a very productive day, especially for Android, which hopefully has +XMPP working again (at least it builds..), halved the size of the package, +etc. + +Fixed a stupid bug in the automatic v5 upgrade code; annex.version was not +being set to 5, and so every git annex command was +actually re-running the upgrade. + +Fixed another bug I introduced last Friday, which the test suite luckily +caught, that broke using some local remotes in direct mode. + +Tracked down a behavior that makes `git annex sync` quite slow on +filesystems that don't support symlinks. I need to switch direct mode to +not using `git commit` at all, and use plumbing to make commits there. +Will probably work on this over the holiday. diff --git a/doc/devblog/day_68__bits_and_pieces.mdwn b/doc/devblog/day_68__bits_and_pieces.mdwn new file mode 100644 index 000000000..1caa6e38b --- /dev/null +++ b/doc/devblog/day_68__bits_and_pieces.mdwn @@ -0,0 +1,14 @@ +Made a release yesterday to fix a bug that made git-annex init in a bare +repository set core.bare=false. This bug only affected git-annex 5, it +was introduced when building the direct mode guard. Currently recovering +from it is a [manual (pretty easy) process](http://git-annex.branchable.com/bugs/assistant_creating_.git_directory_inside_bare_repo/#comment-73a8ce8aa100baa7c03861b769fdca29). +Perhas I should automate that, but I mostly wanted to get a fix out +before too many people encountered the bug. + +Today, I made the assistant run batch jobs with ionice and nocache, when +those commands are available. Also, when the assistant transfers files, +that also runs as a batch job. + +Changed how git-annex does commits, avoiding using `git commit` in direct +mode, since in some situations `git commit` (not with `-a`!) wants to +read the contents of files in the work tree, which can be very slow. diff --git a/doc/devblog/day_69__catching_up.mdwn b/doc/devblog/day_69__catching_up.mdwn new file mode 100644 index 000000000..45b1e38e6 --- /dev/null +++ b/doc/devblog/day_69__catching_up.mdwn @@ -0,0 +1,14 @@ +Still working through thanksgiving backlog. Around 55 messages to go. + +Wrote hairy code to automatically fix up bad bare repositories created by +recent versions of git-annex. Managed to do it with only 1 stat call +overhead (per local repository). Will probably keep that code in git-annex +for a year or so, despite the bug only being present for a few weeks, +because the repositories that need to be fixed might be on removable drives +that are rarely used. + +Various other small bug fixes, including dealing with box.com having +changed their WebDAV endpoint url. + +Spent a while evaluating various key/value storage possibilities. +[[bugs/incremental_fsck_should_not_use_sticky_bit]] has the details. diff --git a/doc/devblog/day_6__gcrypt_fully_working.mdwn b/doc/devblog/day_6__gcrypt_fully_working.mdwn new file mode 100644 index 000000000..58abdbb60 --- /dev/null +++ b/doc/devblog/day_6__gcrypt_fully_working.mdwn @@ -0,0 +1,8 @@ +gcrpyt is fully working now. *Most* of the examples in +[[tips/fully_encrypted_git_repositories_with_gcrypt]] should work. + +A few known problems: + +* `git annex sync` refuses to sync with gcrypt remotes. some url parsing issue. +* Swapping two drives with gcrypt repositories on the same mount point doesn't work yet. +* http urls are not supported diff --git a/doc/devblog/day_6__gcrypt_fully_working/comment_1_136bb7537a9ba93d400ce6f6ea1932ac._comment b/doc/devblog/day_6__gcrypt_fully_working/comment_1_136bb7537a9ba93d400ce6f6ea1932ac._comment new file mode 100644 index 000000000..adb298fd3 --- /dev/null +++ b/doc/devblog/day_6__gcrypt_fully_working/comment_1_136bb7537a9ba93d400ce6f6ea1932ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="Converting an rsync special remote to a gcrypt special remote" + date="2013-09-11T17:36:09Z" + content=""" +I'm guessing there is no way to convert an rsync special remote to a gcrypt special remote? It would be cool not to have to upload 100GB across the Atlantic again! +"""]] diff --git a/doc/devblog/day_6__gcrypt_fully_working/comment_2_1f8faa65bbd56a12588b43a5bc822d96._comment b/doc/devblog/day_6__gcrypt_fully_working/comment_2_1f8faa65bbd56a12588b43a5bc822d96._comment new file mode 100644 index 000000000..a6859cf2f --- /dev/null +++ b/doc/devblog/day_6__gcrypt_fully_working/comment_2_1f8faa65bbd56a12588b43a5bc822d96._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 2" + date="2013-09-12T16:53:02Z" + content=""" +Well, rsync and gcrypt use the same locations for annexed content, so it's theoretically possible. + +However, it seems a lot easier to just add a gcrypt remote and let git-annex use the existing rsync remote for the content that is already stored in it. +"""]] diff --git a/doc/devblog/day_70__preliminary_user_survey_analysis.mdwn b/doc/devblog/day_70__preliminary_user_survey_analysis.mdwn new file mode 100644 index 000000000..0202d6c4a --- /dev/null +++ b/doc/devblog/day_70__preliminary_user_survey_analysis.mdwn @@ -0,0 +1,104 @@ +The [2013 git-annex user survey](http://git-annex-survey.branchable.com/polls/2013/) +has been running for several weeks and around 375 people have answered +at least the first question. While I am going to leave it up through the +end of the year, I went over the data today to see what interesting +preliminary conclusions I can draw. + +* 11% build git-annex from source. More than I would have guessed. + +* 20% use the prebuilt versions from the git-annex website. + + This is a number to keep in mind later, when more people have upgraded to + the last release, which checks for upgrades. I can run some stats on + the number of upgrade checks I receive, and multiplying that by 5 would + give a good approximation of the total number of computers running + git-annex. + +* I'm surprised to see so many more Linux (79%) than OSX (15%) users. + Also surprising is there are more Windows (2%) than Android (1%) users. + (Android numbers may be artificially low since many users will use it in + addition to one of the other OSes.) + +* Android and Windows unsurprisingly lead in ports requested, but the + Synology NAS is a surprise runner up, with 5% (more than IOS). + + In theory it would not be too hard to make a standalone arm tarball, + which could be used on such a device, although IIRC the Synology had + problems with a too old linker and libc. It would help if I could make + the standalone tarball not depend on the system linker at all. + + A susprising number (3%) want some kind of port the the Raspberry Pi, which + is weird because I'd think they'd just be using Raspbian on it.. but a + standalone arm tarball would also cover that use case. + +* A minimum of 1664 (probably closer to 2000) git annex repositories are being + used by the 248 people who answered that question. Around 7 repositories + per person average, which is either one repository checked out on 7 + different machines or two repositories on 3 machines, etc. + +* At least 143 terabytes of data are being stored in git-annex. This does + not count redundant data. (It also excludes several hundred terabytes from + one instituion that I don't think are fully online yet.) + Average user has more than half a terabyte of data. + +* 8% of users store scientific data in git-annex! :) A couple of users are + using it for game development assets, and 5% of users are using it for + some form of business data. + +* Only 10% of users are sharing a git-annex repository with at least one + other person. 27% use it by themselves, but want to get others using + their repositories. This probably points to it needing to be easier for + nontechnical users. + +* 61% of git-annex users have good or very good knowledge of git. + This question intentionally used the same wording as the + [general git user survey](https://git.wiki.kernel.org/index.php/GitSurvey2012), + so the results can be compared. The curves have somewhat different + shapes, with git-annex's users being biased more toward the higher + knowledge levels than git's users. + +* The question about how happy users are also used the same wording. + While 74% of users are happy with git-annex, 94% are similarly happy with + git, and a while the median git-annex user is happy, the median git user + is very happy. + + The 10% who wrote in "very enthusiastic, but still often + bitten by quirks (so not very happy yet, but with lots of confidence in + the potential" might have thrown off this comparison some, but they + certianly made their point! + +* 3% of respondants say that a bug is preventing them from using git-annex, + but that they have not reported the bug yet. Frustrating! 1% say that a + bug that's been reported already is blocking them. + +* 18% wrote in that they need the webapp to support using github (etc) + as a central server. I've been moving in that direction with the + encryption and some other changes, so it's probably time to make a UI for + that. + +* 12% want more control over which files are stored locally when using the + assistant. + +* A really surprising thing happened when someone wrote in that I should + work on "not needing twice disk space of repo in direct mode", and 5% of + people then picked this choice. This is some kind of documentation + problem, because of course git-annex never needs 2x disk space, whether + using direct mode or not. That's one of its advantages over git! + +* Somewhere between 59 and 161 of the survey respondants use Debian. + I can compare this with [Debian popularity contest data](http://qa.debian.org/popcon-graph.php?packages=git-annex) + which has 400 active installations and 1000 total installations, + and make guesses about what fraction of all git-annex users have answered + the survey. By making different assumptions I got guesses that varied by + 2 orders of magnitude, so not worth bothering with. Explicitly asking how + many people use each Linux distribution would be a good idea in next + year's survey. + +---- + +Main work today was fixing Android DNS lookups, which was trying to use +/etc/resolv.conf to look up SRV records for XMPP, and had to be changed to +use a getprop command instead. Since I can't remember dealing with this +before (not impossible I made some quick fix to the dns library before and +lost it though), I'm wondering if XMPP was ever usable on Android before. +Cannot remember. May work now, anyway... diff --git a/doc/devblog/day_71__that_was_unexpected.mdwn b/doc/devblog/day_71__that_was_unexpected.mdwn new file mode 100644 index 000000000..92de97b7d --- /dev/null +++ b/doc/devblog/day_71__that_was_unexpected.mdwn @@ -0,0 +1,30 @@ +Had planned to spend all day not working on git-annex and instead getting +caught up on conference videos. However, got a little bit multitasky while +watching those, and started investigating why, last time I worked on +Windows port, git-annex was failing to link. + +A good thing to do while watching conference videos since it involved lots of +test builds with different flags. Eventially solved it. +Building w/o WebDAV avoids crashing the compiler anyhow. + +Thought I'd try the resulting binary and see if perhaps I had forgotten to +use the threaded RTS when I was running ghc by hand to link it last time, +and perhaps that was why threads +[[seemed to have hung|day_56__git-annex_user_survey]] back then. + +It was. This became clear when I saw a "deadlocked indefinitely in MVar" +error message, which tells me that it's at least using the threaded RTS. +So, I fixed that, and a few other minor things, and ran this command +in a DOS prompt box: + + git annex watch --force --foreground --debug + +And I've been making changes to files in that repository, and amazingly, +the watcher is noticing them, and committing them! + +So, I was almost entirely there to a windows port of the watcher a month +ago, and didn't know. It has some rough edges, including not doing anything +to check if a newly created file is open for write when adding it, and +getting the full assistant ported will be more work, and the full webapp +may be a whole other set of problems, but this is a quite nice milestone +for the Windows port. diff --git a/doc/devblog/day_72__windows_webapp_not.mdwn b/doc/devblog/day_72__windows_webapp_not.mdwn new file mode 100644 index 000000000..985afe7c4 --- /dev/null +++ b/doc/devblog/day_72__windows_webapp_not.mdwn @@ -0,0 +1,22 @@ +Got the entire webapp to build on Windows. + +Compiling was easy. One line of code had to be #ifdefed out, and the whole +rest of the webapp UI just built! + +Linking was epic. It seems that I really am runninginto a 32kb command line length +limit, which causes the link command to fail on Windows. git-annex with all +its bells and whistles enabled is just too big. Filed a +[ghc bug report](https://ghc.haskell.org/trac/ghc/ticket/8596), and got back a +helpful response about using to +work around. + +6 hours of slogging through compiling dependencies and fighting with +toolchain later, I have managed to link git-annex with the webapp! + +The process is not automated yet. While I was able to automate +passing gcc a @file with its parameters, gcc then calls collect2, which +calls ld, and both are passed too many parameters. I have not found a way +to get gcc to generate a response file. So I did it manually. Urgh. + +Also, it crashes on startup with `getAddrInfo` failure. But some more +porting is to be expected, now that the windows webapp links.. ;) diff --git a/doc/devblog/day_73__EvilLinker.mdwn b/doc/devblog/day_73__EvilLinker.mdwn new file mode 100644 index 000000000..68aa5d065 --- /dev/null +++ b/doc/devblog/day_73__EvilLinker.mdwn @@ -0,0 +1,28 @@ +Android has the EvilSplicer, now Windows gets the EvilLinker. Fully +automated, and truly horrible solution to the too long command line problem. + +Now when I run `git annex webapp` on windows, it almost manages to open +the web browser. + +At the same time, I worked with Yuri to upgrade the Windows autobuilder to a +newer Haskell platform, which can install Yesod. I have not quite achieved +a successful webapp build on the autobuilder, but it seems close. + +---- + +Here's a nice Haskell exercise for someone. I wrote this quick and dirty +function in the EvilSplicer, but it's crying out for a generalized solution. + +[[!format haskell """ +{- Input contains something like + - c:/program files/haskell platform/foo -LC:/Program Files/Haskell Platform/ -L... + - and the *right* spaces must be escaped with \ + - + - Argh. + -} +escapeDosPaths :: String -> String +escapeDosPaths = replace "Program Files" "Program\\ Files" + . replace "program files" "program\\ files" + . replace "Haskell Platform" "Haskell\\ Platform" + . replace "haskell platform" "haskell\\ platform" +"""]] diff --git a/doc/devblog/day_74__so_close.mdwn b/doc/devblog/day_74__so_close.mdwn new file mode 100644 index 000000000..1f63eaf4d --- /dev/null +++ b/doc/devblog/day_74__so_close.mdwn @@ -0,0 +1,20 @@ +Windows webapp now starts, opens a web browser, and ... crashes. + + + +This is [a bug in warp](https://github.com/yesodweb/wai/issues/202) +or a deep level of the stack. I know that yesod apps have run on Windows +before, so apparently something has changed and introduced this problem. + +Also have a problem with the autobuilder; the EvilSplicer or something +it runs is locking up on that system for reasons not yet determined. + +Looks like I will need to wait a bit longer for the windows webapp, but I +could keep working on porting the assistant in the meantime. + +The most important thing that I need to port is how to check if a file +is being written to at the same time the assistant adds it to the +repository. No real `lsof` equivilant on Windows. I might be able to do +something with exclusive locking to detect if there's a writer (but this +would also block using the file while it was being added). Or I may be able +to avoid the need for this check, at least in direct mode. diff --git a/doc/devblog/day_74__so_close/comment_1_b1aa185734c3d74830b81def4fe63bff._comment b/doc/devblog/day_74__so_close/comment_1_b1aa185734c3d74830b81def4fe63bff._comment new file mode 100644 index 000000000..2abbc8dd3 --- /dev/null +++ b/doc/devblog/day_74__so_close/comment_1_b1aa185734c3d74830b81def4fe63bff._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-12-08T12:52:26Z" + content=""" +Take a look at how Process Hacker implements the \"Search for open handles\" function; it is rather close to `lsof`. (Unlocker probably does it the same way, too.) + +But locking (e.g. I think the \"share mode\" could prevent other programs from writing but not reading) may be more reliable, if a program starts writing to file *after* the lsof check happens... +"""]] diff --git a/doc/devblog/day_75__hallelujah.mdwn b/doc/devblog/day_75__hallelujah.mdwn new file mode 100644 index 000000000..42fb4fdf9 --- /dev/null +++ b/doc/devblog/day_75__hallelujah.mdwn @@ -0,0 +1,8 @@ +I have seen the glory of the webapp running on Windows. + +One of the warp developers pointed me in the right direction and I +developed a fix for the `recv` bug. + +My Windows and MSIE are old and fall over on some of the +javascript, so it's not glorious enough for a screenshot. But large chunks +of it do seem to work. diff --git a/doc/devblog/day_75__hallelujah/comment_1_df04c456e99d47743494a18c1badba8c._comment b/doc/devblog/day_75__hallelujah/comment_1_df04c456e99d47743494a18c1badba8c._comment new file mode 100644 index 000000000..bd83ec1ff --- /dev/null +++ b/doc/devblog/day_75__hallelujah/comment_1_df04c456e99d47743494a18c1badba8c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="comment 1" + date="2013-12-09T19:47:32Z" + content=""" +Yeah! Looking forward to finally introduce git-annex in my heterogeneous network. Thanks and keep up the good work! +"""]] diff --git a/doc/devblog/day_76__results.mdwn b/doc/devblog/day_76__results.mdwn new file mode 100644 index 000000000..4fc71eaa6 --- /dev/null +++ b/doc/devblog/day_76__results.mdwn @@ -0,0 +1,15 @@ +Fixed up a few problems with the Windows webapp, and it's now completely +usable, using any browser other than MSIE. While there are missing +features in the windows port, all the UI for the features it does have +seems to just work in the webapp. + +Fixed a ugly problem with Firefox, which turned out to have been introduced +a while ago by a workaround for an ugly problem in Chrome. Web browsers are +so wonderful, until they're crap. + +Think I've fixed the bug in the EvilLinker that was causing it to hang on +the autobuilder, but still don't have a Windows autobuild with the webapp +just yet. + +Also improved `git annex import` some more, and worked on a bug in git +repository repair, which I will need to spend some more time on tomorrow. diff --git a/doc/devblog/day_77__it_builds.mdwn b/doc/devblog/day_77__it_builds.mdwn new file mode 100644 index 000000000..421bb5efe --- /dev/null +++ b/doc/devblog/day_77__it_builds.mdwn @@ -0,0 +1,8 @@ +Got the Windows autobuilder building the webapp. Have not tried that build +yet myself, but I have high hopes it will work. + +Made other Windows improvements, including making the installer +write a start menu entry file, and adding free disk space checking. + +Spent rest of the day improving git repair code on a real-world corrupted +repository. diff --git a/doc/devblog/day_78__desidetracked.mdwn b/doc/devblog/day_78__desidetracked.mdwn new file mode 100644 index 000000000..5b8ca8a58 --- /dev/null +++ b/doc/devblog/day_78__desidetracked.mdwn @@ -0,0 +1,34 @@ +I've switched over to mostly working on Windows porting in the evenings +when bored, with days spent on other git-annex stuff. So, getting back to +the planned [[design/roadmap]] for this month.. + +Set up a [tip4commit for git-annex](http://tip4commit.com/projects/152). +Anyone who gets a commit merged in will receive a currently small amount of +bitcoin. This would almost be a good way to encourage more committers +other than me, by putting say, half the money I have earmarked for that into +the tip jar. The problem is, I make too many commits myself, so most of the +money would be quickly tipped back out to me! I have gotten in touch with the +tip4commit people, and hope they will give me a way to blacklist +myself from being tipped. + +Designed a [[design/external_special_remote_protocol]] that seems pretty +good for first-class special remotes implemented outside git-annex. +It's moderately complicated on the git-annex side to make it simple and +flexible on the special remote side, but I estimate only a few days to build +it once I have the design finalized. + +# windows + +Tested the autobuilt windows webapp. It works! Sorted out some issues with +the bundled libraries. + +Reworked how `git annex transferkeys` communicates, to make it easier to +port it to Windows. Narrowly managed to avoid needing to write Haskell +bindings to Windows's equivilant of `pipe(2)`. I think the Windows +assistant can transfer keys now. and the webapp UI may even be able to be +used to stop transfers. Needs testing. + +Investigated what I'll need to get XMPP working on Windows. Most of the +libs are available in cygwin, but gsasl would need to be built from source. +Also some kind of space-in-path problem is preventing cabal installing some +of the necessary dependencies. diff --git a/doc/devblog/day_79__catch_up.mdwn b/doc/devblog/day_79__catch_up.mdwn new file mode 100644 index 000000000..0206a0acf --- /dev/null +++ b/doc/devblog/day_79__catch_up.mdwn @@ -0,0 +1,3 @@ +Spent most of today catching up with a weeks's worth of traffic. + +Fixed 2 bugs. Message backlog is 23 messages. diff --git a/doc/devblog/day_7__release_day.mdwn b/doc/devblog/day_7__release_day.mdwn new file mode 100644 index 000000000..f377bb4be --- /dev/null +++ b/doc/devblog/day_7__release_day.mdwn @@ -0,0 +1,10 @@ +Got git annex sync working with gcrypt. So went ahead and made a release +today. Lots of nice new features! + +Unfortunately the linux 64 bit daily build is failing, because my build +host only has 2 gb of memory and it is no longer enough. I am looking for a +new build host, ideally one that doesn't cost me $40/month for 3 gb of ram +and 15 gb of disk. (Extra special ideally one that I can run multiple builds +per day on, rather than the current situation of only building overnight to +avoid loading the machine during the day.) Until this is sorted out, no +new 64 bit linux builds.. diff --git a/doc/devblog/day_7__release_day/comment_1_12bb94d903868ecddb3e348c9c4afeaf._comment b/doc/devblog/day_7__release_day/comment_1_12bb94d903868ecddb3e348c9c4afeaf._comment new file mode 100644 index 000000000..266e843fd --- /dev/null +++ b/doc/devblog/day_7__release_day/comment_1_12bb94d903868ecddb3e348c9c4afeaf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 1" + date="2013-09-09T21:51:47Z" + content=""" +Joey, I'd be happy to host 64-bit builds on both Mac and Linux using my personal Jenkins server (both machines are local and have 16+ GB of RAM). I might even be able to get you SSH jail access to the build tree for the 64-bit Linux build. Just let me know at johnw@fpcomplete.com. +"""]] diff --git a/doc/devblog/day_7__release_day/comment_2_d3e38d6f6bba179dab40d4d75ff061de._comment b/doc/devblog/day_7__release_day/comment_2_d3e38d6f6bba179dab40d4d75ff061de._comment new file mode 100644 index 000000000..96fb5dce3 --- /dev/null +++ b/doc/devblog/day_7__release_day/comment_2_d3e38d6f6bba179dab40d4d75ff061de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-09-10T23:11:27Z" + content=""" +Everything is all setup now to build git-annex on both systems, at most once per hour (if there have been new Git commits), and only between 2am and 4pm. Just contact me on IRC or e-mail and I'll setup you up with credentials so that you can manipulate the jobs and access the build artifacts. +"""]] diff --git a/doc/devblog/day_80__plumbing.mdwn b/doc/devblog/day_80__plumbing.mdwn new file mode 100644 index 000000000..3ef76a373 --- /dev/null +++ b/doc/devblog/day_80__plumbing.mdwn @@ -0,0 +1,9 @@ +Made some improvements to git-annex's plumbing level commands today. Added +new lookupkey and examinekey commands. Also expanded the things that +`git annex find` can report about files. Among other things, the elusive +hash directory locations can now be looked up, which IIRC a few people have +asked for a way to do. + +Also did some work on the linux standalone tarball and OSX app. Both now +include man pages, and it's also now possible to just unpack it and symlink +git-annex into ~/bin or similar to add it to PATH. diff --git a/doc/devblog/day_81__more_standalone.mdwn b/doc/devblog/day_81__more_standalone.mdwn new file mode 100644 index 000000000..646f280c1 --- /dev/null +++ b/doc/devblog/day_81__more_standalone.mdwn @@ -0,0 +1,15 @@ +Made the Linux standalone builds more self-contained, now they include +their own linker and glibc, and ugly hacks to make them be used when +running the included programs. This should make them more portable +to older systems. + +Set up an arm autobuilder. +This autobuilder runs in an Debian armel chroot, using +qemu-user-static (with a patch to make it support some syscalls ghc uses). +No webapp yet; waiting on feedback of how well it works. I *hope* this +build will be usable on eg, Synology NAS and Raspberry PI. + +Also worked on improving the assistant's batching of commits during the +startup scan. And some other followups and bug triage. + +Today's work was sponsored by Hamish Coleman. diff --git a/doc/devblog/day_81__more_standalone/comment_1_25ceb116406b55a8ff28f7b392806bc9._comment b/doc/devblog/day_81__more_standalone/comment_1_25ceb116406b55a8ff28f7b392806bc9._comment new file mode 100644 index 000000000..4a18b79a6 --- /dev/null +++ b/doc/devblog/day_81__more_standalone/comment_1_25ceb116406b55a8ff28f7b392806bc9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="Binaries" + date="2013-12-17T12:49:26Z" + content=""" +Are there binaries for the RPi version anywhere, it would be great to try it. + +Thanks +"""]] diff --git a/doc/devblog/day_82__rpi_and_synology.mdwn b/doc/devblog/day_82__rpi_and_synology.mdwn new file mode 100644 index 000000000..3749f474a --- /dev/null +++ b/doc/devblog/day_82__rpi_and_synology.mdwn @@ -0,0 +1,21 @@ +Fixed a few problems in the [[armel build|install/Linux_standalone]], and +it's been confirmed to work on Raspberry Pi and Synology NAS. Since none of +the fixes were specific to those platforms, it will probably work anywhere +the kernel is new enough. That covers 9+% of the +[missing ports in the user survey](http://git-annex-survey.branchable.com/polls/2013/missing_ports/)! + +Thought through the possible issues with the assistant on Windows not being +able to use lsof. I've convinced myself it's probably safe. (In fact, it +might be safe to stop checking with lsof when using the assistant in direct +mode entirely.) Also did some testing of some specific interesting +circumstances (including 2 concurrent writers to a single file). + +I've been working on adding the webapp to the armel build. This can mostly +reuse the patches and EvilSplicer developed for Android, but it's taking +some babysitting of the build to get yesod etc installer for various reasons. +Will be surprised if I don't get there tomorrow. + +One other thing.. I notice that is up and running. +This was set up by Subito, who offered me the domain, but I suggested he +keep it and set up a pretty start page that points new users at the +relevant parts of the wiki. I think he's done a good job with that! diff --git a/doc/devblog/day_82__rpi_and_synology/comment_1_d154ddcf22027fd06acf9da73e12c006._comment b/doc/devblog/day_82__rpi_and_synology/comment_1_d154ddcf22027fd06acf9da73e12c006._comment new file mode 100644 index 000000000..33bc12e63 --- /dev/null +++ b/doc/devblog/day_82__rpi_and_synology/comment_1_d154ddcf22027fd06acf9da73e12c006._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Attila" + ip="213.163.19.162" + subject="git-annex.org" + date="2013-12-27T14:14:07Z" + content=""" +Minor glitch on git-annex.org: the first link to http://git-annex.branchable.com is missing http:// prefix and so points to http://www.git-annex.org/git-annex.branchable.com +"""]] diff --git a/doc/devblog/day_83__armel_webapp.mdwn b/doc/devblog/day_83__armel_webapp.mdwn new file mode 100644 index 000000000..95c70010b --- /dev/null +++ b/doc/devblog/day_83__armel_webapp.mdwn @@ -0,0 +1,19 @@ +Got the arm webapp to build! (I have not tried to run it.) The build +process for this is quite elaborate; 2 chroots, one amd64 and one armel, +with the same versions of everything installed in each, and git-annex is +built in the first to get the info the EvilSplicer needs to build it in the +second. + +Fixed a nasty bug in the assistant on OSX, where at startup it would follow +symlinks in the repository that pointed to directories outside the +repository, and add the files found there. Didn't cause data loss itself +(in direct mode the assistant doesn't touch the files), but certainly +confusingly breaks things and makes it easy to shoot your foot off. I will +be moving up the next scheduled release because of this bug, probably to +Saturday. + +Looped the git developers in on a problem with git failing on some kernels +due to `RLIMIT_NOFILE` not working. Looks like git will get more robust and +this should make the armel build work on even more embedded devices. + +Today's work was sponsored by Johan Herland. diff --git a/doc/devblog/day_84__ho_uh_oh.mdwn b/doc/devblog/day_84__ho_uh_oh.mdwn new file mode 100644 index 000000000..516ceb532 --- /dev/null +++ b/doc/devblog/day_84__ho_uh_oh.mdwn @@ -0,0 +1,11 @@ +Resurfaced today to fix some problems with the Linux standalone builds +in the Solstice release. The worst of these prevented the amd64 build from +running on some systems, and that build has been updated. The other +problems all involved the binary shimming, and were less serious. + +As part of that work, replaced the hacky shell script that handled the +linux library copying and binary shimming with a haskell program. + +Also worked on some Windows bugs, and fixed a typo in the test suite. +Got my own little present: haskell-tasty finally got out of Incoming, so +the next Debian package build will once again include the test suite. diff --git a/doc/devblog/day_85__external_special_remote_protocol_types.mdwn b/doc/devblog/day_85__external_special_remote_protocol_types.mdwn new file mode 100644 index 000000000..9b3e4d9b1 --- /dev/null +++ b/doc/devblog/day_85__external_special_remote_protocol_types.mdwn @@ -0,0 +1,25 @@ +Only did a few hours today, getting started on implementing the +[[design/external_special_remote_protocol]]. + +Mostly this involved writing down types for the various messages, +and code to parse them. I'm very happy with how the parsing turned out; +nearly all the work is handled by the data types and type classes, +and so only one line of very simple code is needed to parse each message: + +[[!format haskell """ +instance Receivable Response where + parseCommand "PREPARE-SUCCESS" = parse0 PREPARE_SUCCESS + parseCommand "TRANSFER-SUCCESS" = parse2 TRANSFER_SUCCESS + parseCommand "TRANSFER-FAILURE" = parse3 TRANSFER_FAILURE +"""]] + +An especially nice part of this implementation is that it knows exactly how +many parameters each message should have (and their types of course), and so +can both reject invalid messages, and avoid ambiguity in tokenizing the +parameters. For example, the 3rd parameter of TRANSFER-FAILURE is an error +message, and as it's the last parameter, it can contain multiple words. + + *Remote.External> parseMessage "TRANSFER-FAILURE STORE SHA1--foo doesn't work on Christmas" :: Maybe Response + Just (TRANSFER_FAILURE Upload (Key {keyName = "foo", keyBackendName = "SHA1", keySize = Nothing, keyMtime = Nothing}) "doesn't work on Christmas") + +That's the easy groundwork for external special remotes, done. diff --git a/doc/devblog/day_86__external_special_remote_implementation.mdwn b/doc/devblog/day_86__external_special_remote_implementation.mdwn new file mode 100644 index 000000000..c40bfbaea --- /dev/null +++ b/doc/devblog/day_86__external_special_remote_implementation.mdwn @@ -0,0 +1,11 @@ +Built most of the external special remote today. While I've written 600 +lines of code for this, and think it's probably working, and complete +(except for a couple of features), all I know is that it compiles. + +I've also written an [[example external special remote program in shell script|special_remotes/external/example.sh]], +so the next step is to put the two together and see how it works. +I also hope that some people who have built hook special remotes +in the past will update them to the new external special remote interface, +which is quite a lot better. + +Today's work was sponsored by Justine Lam. diff --git a/doc/devblog/day_86__external_special_remote_implementation/comment_1_5116bcf4b60030cb46683df94a75d7ee._comment b/doc/devblog/day_86__external_special_remote_implementation/comment_1_5116bcf4b60030cb46683df94a75d7ee._comment new file mode 100644 index 000000000..358062308 --- /dev/null +++ b/doc/devblog/day_86__external_special_remote_implementation/comment_1_5116bcf4b60030cb46683df94a75d7ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0" + nickname="Milan" + subject="comment 1" + date="2013-12-27T08:44:44Z" + content=""" +Will it support splitting of large files for remotes that limits size of stored file? +"""]] diff --git a/doc/devblog/day_86__external_special_remote_implementation/comment_2_7b6e734f785fbd9db7883b63150023dc._comment b/doc/devblog/day_86__external_special_remote_implementation/comment_2_7b6e734f785fbd9db7883b63150023dc._comment new file mode 100644 index 000000000..7a0c85783 --- /dev/null +++ b/doc/devblog/day_86__external_special_remote_implementation/comment_2_7b6e734f785fbd9db7883b63150023dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2013-12-27T19:12:17Z" + content=""" +That's on the TODO list and the protocol should be easily flexible enough to let it be added. The existing code to handle chunks is a bit of a mess though. +"""]] diff --git a/doc/devblog/day_87__external_special_remotes_done.mdwn b/doc/devblog/day_87__external_special_remotes_done.mdwn new file mode 100644 index 000000000..b8bba606b --- /dev/null +++ b/doc/devblog/day_87__external_special_remotes_done.mdwn @@ -0,0 +1,16 @@ +The [[external_special_remote|special_remotes/external]] interface is now +done, and tested working great! Now we just need all the old hook special +remotes to be converted to use it.. + +I punted on per-special-remote, per-key state storage in the git-annex +branch for now. If I find an example of a remote that needs it (Tahoe-LAFS +may, but still TBD), I'll add it. Added suppport for using the same +credential storage that git-annex uses for S3 and WebDAV credentials. + +The main improvement I'd like to make is to add an interface for transferring +files where the file is streamed to/from the external special remote, +rather than using temp files as it does now. This would be more efficient +(sometimes) and make the progress bars better. But it needs to either use a +named pipe, which is complicated and non-portable, or serialize the file's +contents over a currently line-based protocol, which would be a pain. +Anyway, this can be added later, the protocol is extensible. diff --git a/doc/devblog/day_88__lazy_sunday.mdwn b/doc/devblog/day_88__lazy_sunday.mdwn new file mode 100644 index 000000000..b06c76bd2 --- /dev/null +++ b/doc/devblog/day_88__lazy_sunday.mdwn @@ -0,0 +1,15 @@ +Fixed a bug that could leave a direct mode repository stuck at +annex.version 3. As part of that, v3 indirect mode repositories will be +automatically updated to v5. There's no actual change in that upgrade, it +just simplifies things to have only one supported annex.version. + +Added youtube playlist support to git-annex. Seems I had almost all the +pieces needed, and didn't know it. Only about a dozen lines of code! + +Added PREPARE-FAILURE support to the external special remote interface. + +After I found the cable my kitten stole (her apport level is high), fixed +file transfers to/from Android. This broke because git-annex assistant +tries to use ionice, if it's in PATH, and Android's ionice is not suitable. +It could probably include ionice in the busybox build and use that one, but +I wanted a quick fix for this before the upcoming release. diff --git a/doc/devblog/day_89__reflections.mdwn b/doc/devblog/day_89__reflections.mdwn new file mode 100644 index 000000000..94bbf87e2 --- /dev/null +++ b/doc/devblog/day_89__reflections.mdwn @@ -0,0 +1,18 @@ +Worked on bug report and forum backlog (24 messages left), and made a few +bug fixes. The main one was a fix for a Windows-specific direct mode merge +bug. + +This month didn't go entirely to plan. I had not expected to work on the +Windows assistant and webapp and get it so close to fully working. Nor had +I expected to spend time and make significant progress on porting git-annex +to *Linux* -- particularly to embedded NAS devices! I had hoped to +encourage some others to develop git-annex, but only had one bite from a +student and it didn't work out. Meanwhile, automatically rewarding +committers with bitcoin is an interesting alternative approach to possibly +motivating contributors, and I would like to set that up, but the software +is new and I haven't had time yet. The only thing that went exactly as +planned was the external special remote implementation. + +A special surprise this month is that I have started hearing privately from +several institutions that are starting using git-annex in interesting ways. +Hope I can share details of some of that 2014! diff --git a/doc/devblog/day_8__ill.mdwn b/doc/devblog/day_8__ill.mdwn new file mode 100644 index 000000000..c086a9dc1 --- /dev/null +++ b/doc/devblog/day_8__ill.mdwn @@ -0,0 +1,20 @@ +I've been out sick. However, some things kept happening. Mesar contributed +a build host, and the linux and android builds are now happening, hourly, +there. (Thanks as well to the two other people who also offered hostng.) +And I made a minor release to fix a bug in the test suite that I was pleased +three different people reported. + +Today, my main work was getting git-annex to notice when a gcrypt remote +located on some removable drive mount point is not the same gcrypt remote +that was mounted there before. I was able to finesse this so it +re-configures things to use the new gcrypt remote, as long as it's a +special remote it knows about. (Otherwise it has to ignore the remote.) +So, encrypted repos on removable drives will work just as well as +non-encrypted repos! + +Also spent a while with rsync.net tech support trying to work out why +someone's git-annex apparently opened a lot of concurrent ssh connections +to rsync.net. Have not been able to reproduce the problem though. + +Also, a lot of catch-up to traffic. Still 63 messages backlogged however, +and still not entirely well.. diff --git a/doc/devblog/day_90__slow_start.mdwn b/doc/devblog/day_90__slow_start.mdwn new file mode 100644 index 000000000..09d1f7270 --- /dev/null +++ b/doc/devblog/day_90__slow_start.mdwn @@ -0,0 +1,23 @@ +Various work on Debian, OSX, and Windows stuff. Mostly uninteresting, but +took most of the day. + +Made `git annex mirror --all` work. I can see why I left it out; when the +mirroring wants to drop an object, in --all mode it doesn't have an +associated file in the tree, so it cannot look at the annex.numcopies in +gitattributes. Same reason why `git annex drop --all` is not implemented. +But decided to go ahead and only use other numcopies configuration for +mirroring. + +Added GETWANTED and SETWANTED to the external special remote protocol, and +that is as far as I want to go on adding git-annex plumbing stuff to the +protocol. I expect Tobias will release a boatload of special remotes +updated to the new protocol soon, which seems to prove it has everything +that could reasonably be needed. + +This is a nice public git-annex repository containing a growing collection +of tech conference videos. + +Did some design work on [[todo/untracked_remotes]], which I think will turn +out to be read-only remotes. Being able to clone a repository and use +git-annex in the clone without anything leaking back upstream is often +desirable when using public repository, or a repository with many users. diff --git a/doc/devblog/day_91__wintry_mix.mdwn b/doc/devblog/day_91__wintry_mix.mdwn new file mode 100644 index 000000000..bfa9ddd35 --- /dev/null +++ b/doc/devblog/day_91__wintry_mix.mdwn @@ -0,0 +1,11 @@ +Implemented read-only remotes. This may not cover every use case around +wanting to clone a repository and use git-annex without leaking the +existence of your clone back to it, but I think it hits most of them in a +quite easy way, and allows for some potentially interesting stuff like +partitioned networks of git-annex repositories. + +Zooko and I have been talking things over (for rather too long), +and I think have now agreed on a how a more advanced git-annex +Tahoe-LAFS special remote should work. This includes storing the +tahoe file-caps in the git-annex branch. So, I really need to add that +per-special-remote data storage feature I've been thinking about. diff --git a/doc/devblog/day_92-93__reconnection.mdwn b/doc/devblog/day_92-93__reconnection.mdwn new file mode 100644 index 000000000..aa83bde38 --- /dev/null +++ b/doc/devblog/day_92-93__reconnection.mdwn @@ -0,0 +1,34 @@ +Yesterday, added per-remote, per-key state storage. This is exported via +the external special remote protocol, and I expect to use it at least for +Tahoe Lafs. + +Also, made the assistant write ssh config files with better permissions, +so ssh won't refuse to use them. (The only case I know of where that +happened was on Windows.) + +Today, made `addurl` and `importfeed` honor annex.diskreserve. Found out about +this the hard way, when an importfeed cron job filled up my server with +youtube videos. I should probably also make `import` honor +annex.diskreserve. + +--- + +I've been working, so far inconclusively, on making the assistant +deal with remotes that might open a long duration network connection. +Problem being that if the connection is lost, and the remote is not smart +enough to reconnect, all further use of it could fail. + +In a `restarttransferrer` branch, I have made the assistant start separate +`transferkeys` processes for each remote. So if a remote starts to +fail, the assistant can stop its `transferkeys` process, and restart it, +solving the problem. + +But, if a resource needed for a remote is not available, this degrades to +every transfer attempt to that remote restarting it. So I don't know if this is the +right approach. + +Other approaches being considered include asking that implementors of +external special remotes deal with reconnection themselves (Tobias, do you +deal with this in your remotes?), or making the +assistant only restart failing remotes after it detects there's been +a network connection change. diff --git a/doc/devblog/day_94__leaks.mdwn b/doc/devblog/day_94__leaks.mdwn new file mode 100644 index 000000000..3aa4e1552 --- /dev/null +++ b/doc/devblog/day_94__leaks.mdwn @@ -0,0 +1,12 @@ +Spent ages tracking down a memory leak in the assistant that showed up when +a lot of files were added. Turned out to be a standard haskell laziness +induced problem, fixed by adding strictness annotations. Actually there +were several of them, that leaked at different rates. Eventually, I seem to +have gotten them all fixed: + +Before: [[bugs/import_memleak_from_the_assistant/leakbefore.png]] +After: [[bugs/import_memleak_from_the_assistant/leakafter.png]] + +Also fixed a bug in `git annex add` when the disk was completely full. +In that situation, it could sometimes move the file from the work tree to +.git/annex/objects and fail to put the symlink in place. diff --git a/doc/devblog/day_95__reconnection_revisited.mdwn b/doc/devblog/day_95__reconnection_revisited.mdwn new file mode 100644 index 000000000..b2d5b28a5 --- /dev/null +++ b/doc/devblog/day_95__reconnection_revisited.mdwn @@ -0,0 +1,13 @@ +Taught the assistant to stop reusing an existing `git annex transferkeys` +process after it detects a network connection change. I don't think this is +a complete solution to what to do about long-duration network connections +in remotes. For one thing a remote could take a long time to time out +when the network is disconnected, and block other transfers (eg to +local drives) in the meantime. But at least if a remote loses its network +connection and does not try to reconnect on its own, and so is continually +failing, this will get it back into a working state eventually. + +Also, fixed a problem with the OSX Mavericks build, it seems that the +versions of wget and coreutils stuff that I was including in it were built +by homebrew with full optimisations turned on, so didn't work on some CPUs. +Replaced those with portable builds. diff --git a/doc/devblog/day_95__reconnection_revisited/comment_1_c1106e573fcf9f3d4524c0e4f4254790._comment b/doc/devblog/day_95__reconnection_revisited/comment_1_c1106e573fcf9f3d4524c0e4f4254790._comment new file mode 100644 index 000000000..67618f64d --- /dev/null +++ b/doc/devblog/day_95__reconnection_revisited/comment_1_c1106e573fcf9f3d4524c0e4f4254790._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 1" + date="2014-01-07T16:02:01Z" + content=""" +Thanks for the Mavericks fix! +"""]] diff --git a/doc/devblog/day_95__reconnection_revisited/comment_2_40478739f95e0b56ce0103db6e405ef4._comment b/doc/devblog/day_95__reconnection_revisited/comment_2_40478739f95e0b56ce0103db6e405ef4._comment new file mode 100644 index 000000000..331965e3e --- /dev/null +++ b/doc/devblog/day_95__reconnection_revisited/comment_2_40478739f95e0b56ce0103db6e405ef4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxp2XU8gIribhhGhGuYtU6eMMwHv5gUGI" + nickname="Amitai" + subject="obligatory "bah homebrew, yay pkgsrc" comment" + date="2014-01-12T03:01:17Z" + content=""" +Bah homebrew, yay pkgsrc. + +:-) +"""]] diff --git a/doc/devblog/day_96__catching_up.mdwn b/doc/devblog/day_96__catching_up.mdwn new file mode 100644 index 000000000..c41e962b1 --- /dev/null +++ b/doc/devblog/day_96__catching_up.mdwn @@ -0,0 +1,7 @@ +Been on reduced activity the past several days. I did spend a full day +somewhere in there building the Tahoe LAFS special remote. Also, Tobias has +finished updating his full suite of external special remotes to use the new +interface! + +Worked on closing up the fundraising campaign today (long overdue). +This included adding a new wall-o-names to [[/thanks]]. diff --git a/doc/devblog/day_97__exciting_telehash_possiblities.mdwn b/doc/devblog/day_97__exciting_telehash_possiblities.mdwn new file mode 100644 index 000000000..247794976 --- /dev/null +++ b/doc/devblog/day_97__exciting_telehash_possiblities.mdwn @@ -0,0 +1,20 @@ +If you've been keeping an eye on the [[design/roadmap]], you'll have seen that +[[design/assistant/xmpp_security]] keeps being pushed back. This was because +it's a hard and annoying problem requiring custom crypto and with an +ugly key validation problem built into it too. I've now removed it from the +roadmap entirely, replacing it with a [[design/assistant/telehash]] design. + +I'm excited by the possibilities of using telehash with git-annex. It seems +it would be quite easy to make it significantly more peer-to-peer and +flexible. The only issue is that telehash is still under heavy +development and the C implementation is not even usable yet.. +(I'll probably end up writing Haskell bindings to that.) +So I've pushed it down the roadmap to at least March. + +Spent the rest of the day making some minor improvements to external special +remote protocol and doing some other minor bug fixes and backlog catch up. +My backlog has exploded to nearly 50 messages remaining. + +---- + +Today's work was sponsored by Chad Horohoe. diff --git a/doc/devblog/day_97__exciting_telehash_possiblities/comment_1_7c775d93cbeed0d553e224751d30fbaa._comment b/doc/devblog/day_97__exciting_telehash_possiblities/comment_1_7c775d93cbeed0d553e224751d30fbaa._comment new file mode 100644 index 000000000..78750716e --- /dev/null +++ b/doc/devblog/day_97__exciting_telehash_possiblities/comment_1_7c775d93cbeed0d553e224751d30fbaa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="is telehash udp only?" + date="2014-01-14T14:21:36Z" + content=""" +Is telehash UDP only? + +I like that XMPP works with HTTPS so it also works at work with proxies that only allows http traffic. +"""]] diff --git a/doc/devblog/day_98__old_bug.mdwn b/doc/devblog/day_98__old_bug.mdwn new file mode 100644 index 000000000..565efbdbc --- /dev/null +++ b/doc/devblog/day_98__old_bug.mdwn @@ -0,0 +1,17 @@ +Fixed a bug that one or two people had mentioned years ago, but I was never +able to reproduce myself or get anyone to reproduce in a useful way. It +caused log files that were supposed to be committed to the git-annex branch +to end up in master. Turned out to involve weird stuff when the environment +contains two different settings for a single variable. So was easily fixed +at last. (I'm pretty sure the code would have never had this bug if +Data.AssocList was not buried inside an xml library, which rather +discourages using it when dealing with the environment.) + +Also worked on, and hopefully fixed, another OSX cpu optimisations problem. +This one involving shared libraries that git-annex uses for XMPP. + +Also made the assistant detect corrupt .git/annex/index files on startup +and remove them. It was already able to recover from corrupt .git/index +files. + +Today's work was sponsored by David Wagner. diff --git a/doc/devblog/day_99__catching_up_again.mdwn b/doc/devblog/day_99__catching_up_again.mdwn new file mode 100644 index 000000000..118a21f8d --- /dev/null +++ b/doc/devblog/day_99__catching_up_again.mdwn @@ -0,0 +1,19 @@ +Activity has been a bit low again this week. It seems to make sense to do +weekly releases currently (rather than bi-monthly), and Thursday's +release had only one new feature (Tahoe LAFS) and a bunch of bug fixes. + +Looks like git-annex will get back into Debian testing soon, after various +fixes to make it build on all architectures again, and then the +backport can be updated again too. + +I have been struggling with a problem with the OSX builds, which fail with +a SIGKILL on some machines. It seems that homebrew likes to agressively +optimise things it builds, and while I have had some success with its +`--build-bottle` option, something in the gnutls stack used for XMPP is +still over-optimised. Waiting to hear back from Kevin on cleaning up some +optimised system libraries on the OSX host I use. (Is there some way to make +a clean chrooot on OSX that can be accessed by a non-root user?) + +Today I did some minor work involving the --json switch, and also +a small change (well, under 300 line diff) allowing +--all to be mixed with options like --copies and --in. diff --git a/doc/devblog/day_99__catching_up_again/comment_1_b871bf0606dc29be9b8c2e5dc150f708._comment b/doc/devblog/day_99__catching_up_again/comment_1_b871bf0606dc29be9b8c2e5dc150f708._comment new file mode 100644 index 000000000..933de7873 --- /dev/null +++ b/doc/devblog/day_99__catching_up_again/comment_1_b871bf0606dc29be9b8c2e5dc150f708._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkq2cjugiSvKWiWmcah3CPBqviQV_cin9I" + nickname="Yury" + subject="The world of Mac" + date="2014-01-19T14:13:55Z" + content=""" +I think that there is nothing fundamental about Mac OS X, which would prevent one from making a clean chroot that would work for non-root users. For instance, I believe that jailkit has been reported to work just fine. The problem is that you'll have to rebuild most of the stuff you need from scratch, which is very tedious. Might be easier to find instances where Homebrew has something like -march=native added to the $CFLAGS (not that I particularly fancy Homebrew of all 'missing' package managers on OS X). + +Anyways, it sounds like I'm going to get a Mac Mini donated sometime soon and I'm curious as to what would be the best way to make use of it for the CI system... +"""]] diff --git a/doc/devblog/day_99__catching_up_again/comment_2_c8363d47223e7bb899420e800bde3e27._comment b/doc/devblog/day_99__catching_up_again/comment_2_c8363d47223e7bb899420e800bde3e27._comment new file mode 100644 index 000000000..fb2377845 --- /dev/null +++ b/doc/devblog/day_99__catching_up_again/comment_2_c8363d47223e7bb899420e800bde3e27._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnE6kFAbud1LWrQuyX76yMYnUjHt9tR-A8" + nickname="Leonardo" + subject="Chroots" + date="2014-01-21T13:52:29Z" + content=""" +How about simply having sshd inside the chroot? +"""]] diff --git a/doc/devblog/day_9__Friday_the_13th.mdwn b/doc/devblog/day_9__Friday_the_13th.mdwn new file mode 100644 index 000000000..77d9039eb --- /dev/null +++ b/doc/devblog/day_9__Friday_the_13th.mdwn @@ -0,0 +1,21 @@ +Worked to get git-remote-gcrypt included in every git-annex autobuild +bundle. +(Except Windows; running a shell script there may need some work later..) + +Next I want to work on making the assistant easily able to create encrypted +git repositories on removable drives. Which will involve a UI to select +which gpg key to use, or creating (and backing up!) a gpg key. + +But, I got distracted chasing down some bugs on Windows. These were +quite ugly; more direct mode mapping breakage which resulted in +files not being accessible. Also fsck on Windows failed to detect and fix +the problem. All fixed now. (If you use git-annex on Windows, you should +certainly upgrade and run `git annex fsck`.) + +As with most bugs in the Windows port, the underlying cause turned out to +be stupid: `isSymlink` always returned False on Windows. Which makes sense +from the perspective of Windows not quite having anything entirely like +symlinks. But failed when that was being used to detect when files in the +git tree being merged into the repository had the symlink bit set.. + +Did bug triage. Backlog down to 32 (mostly messages from August). diff --git a/doc/devblog/day_9__Friday_the_13th/comment_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment b/doc/devblog/day_9__Friday_the_13th/comment_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment new file mode 100644 index 000000000..aff4dc264 --- /dev/null +++ b/doc/devblog/day_9__Friday_the_13th/comment_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 1" + date="2013-09-13T22:05:37Z" + content=""" +Windows *does* have something very much like symlinks – they're called *symlinks* (\"symbolic links\") and they are meant to [\"function just like UNIX links\"][1] as the official docs say. + +But on the other hand, yes – `isSymlink` makes less sense on Windows, because symlinks are just a type of reparse points, and there may be several other types (e.g. directory junctions should also be treated like symlinks, but mount points shouldn't...) + +[1]: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365680(v=vs.85).aspx +"""]] diff --git a/doc/devblog/day__126-127__merge_fixes.mdwn b/doc/devblog/day__126-127__merge_fixes.mdwn new file mode 100644 index 000000000..f4a57a09d --- /dev/null +++ b/doc/devblog/day__126-127__merge_fixes.mdwn @@ -0,0 +1,61 @@ +Yesterday I learned of a nasty bug in handling of merges in direct mode. It +turns out that if the remote repository has added a file, and there is a +conflicting file in the local work tree, which has not been added to git, the +local file was overwritten when git-annex did a merge. That's really bad, I'm +very unhappy this bug lurked undetected for so long. + +Understanding the bug was easy. Fixing it turned out to be hard, because +the automatic merge conflict resolution code was quite a mess. In +particular, it wrote files to the work tree, which made it difficult for a +later stage to detect and handle the abovementioned case. Also, the +automatic merge resolution code had weird asymmetric structure that I never +fully understood, and generally needed to be stared at for an hour to begin +to understand it. + +In the process of cleaning that up, I wrote several more tests, +to ensure that every case was handled correctly. Coverage was about 50% +of the cases, and should now be 100%. + +To add to the fun, a while ago I had dealt with a bug on FAT/Windows where +it sometimes lost the symlink bit during automatic merge resolution. Except +it turned out my test case for it had a heisenbug, and I had not actually +fixed it (I think). In any case, my old fix for it was a large part +of the ugliness I was cleaning up, and had to be rewritten. +Fully tracking down and dealing with that took a large part of today. + +Finally this evening, I added support for automatically handling merge +conflicts where one side is an annexed file, and the other side has the +same filename committed to git in the normal way. This is not an important +case, but it's worth it for completeness. There was an unexpected benefit +to doing it; it turned out that the weird asymmetric part of the code went +away. + +The final core of the automatic merge conflict resolver has morphed from +a mess I'd not want to paste here to a quite consise and easy to follow +bit of code. + +[[!format haskell """ + case (kus, kthem) of + -- Both sides of conflict are annexed files + (Just keyUs, Just keyThem) -> resolveby $ + if keyUs == keyThem + then makelink keyUs + else do + makelink keyUs + makelink keyThem + -- Our side is annexed file, other side is not. + (Just keyUs, Nothing) -> resolveby $ do + graftin them file + makelink keyUs + -- Our side is not annexed file, other side is. + (Nothing, Just keyThem) -> resolveby $ do + graftin us file + makelink keyThem + -- Neither side is annexed file; cannot resolve. + (Nothing, Nothing) -> return Nothing +"""]] + +Since the bug that started all this is so bad, I want to make a release +pretty soon.. But I will probably let it soak and whale on the test suite +a bit more first. (This bug is also probably worth backporting to old +versions of git-annex in eg Debian stable.) diff --git a/doc/devblog/moving_blogs.mdwn b/doc/devblog/moving_blogs.mdwn new file mode 100644 index 000000000..f6dac56c9 --- /dev/null +++ b/doc/devblog/moving_blogs.mdwn @@ -0,0 +1,5 @@ +I've started a new page for my devblog, since I'm not focusing extensively +on the assistant and so keeping the blog [[here|design/assistant/blog]] +increasingly felt wrong. Also, my new year of +[crowdfunded development](https://campaign.joeyh.name) +formally starts in September, so a new blog seemed good. diff --git a/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment b/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment new file mode 100644 index 000000000..46df4a7f6 --- /dev/null +++ b/doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://pnijjar.livejournal.com/" + ip="99.236.22.229" + subject="comment 1" + date="2013-08-31T00:05:16Z" + content=""" +Do we need to update our RSS feeds? I appear to be getting your devblog posts in my old feed, but I do not know whether that will continue working. +"""]] diff --git a/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment b/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment new file mode 100644 index 000000000..19b5ae1c6 --- /dev/null +++ b/doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-08-31T10:03:04Z" + content=""" +The old RSS feed will continue working. + +So sit back, relax, and enjoy the show. +"""]] diff --git a/doc/devblog/whither_XMPP.mdwn b/doc/devblog/whither_XMPP.mdwn new file mode 100644 index 000000000..9e99ba1ac --- /dev/null +++ b/doc/devblog/whither_XMPP.mdwn @@ -0,0 +1,30 @@ +Pushed a release today. Rest of day spent beating head against Windows XMPP +brick wall. + +Actually made a lot of progress -- Finally found the right approach, and +got a clean build of the XMPP haskell libraries. But.. ghc fails to +load the libraries when running Template Haskell. +"Misaligned section: 18206e5b". +Filed [a bug report](https://ghc.haskell.org/trac/ghc/ticket/8830), +and I'm sure this alignment problem can be fixed, +but I'm not hopeful about fixing it myself. + +One workaround would be to use the EvilSplicer, building once without the +XMPP library linked in, to get the TH splices expanded, and then a second +time with the XMPP library and no TH. Made a `winsplicehack` branch with +tons of ifdefs that allows doing this. However, several dozen haskell libraries +would need to be patched to get it to work. I have the patches from +Android, but would rather avoid doing all that again on Windows. + +Another workaround would be to move XMPP into a separate process from the +webapp. This is not very appealing either, the IPC between them would be +fairly complicated since the webapp does stuff like show lists of XMPP +buddies, etc. But, one thing this idea has to recommend it is I am already +considering using a separate helper daemon like this for +[[design/assistant/Telehash]]. + +So there could be synergies between XMPP and Telehash support, possibly +leading to some kind of plugin interface in git-annex for this sort of +thing. But then, once Telehash or something like it is available and +working well, I plan to deprecate XMPP entirely. It's been a flakey pain +from the start, so that can't come too soon. diff --git a/doc/direct_mode.mdwn b/doc/direct_mode.mdwn new file mode 100644 index 000000000..749d3a6e2 --- /dev/null +++ b/doc/direct_mode.mdwn @@ -0,0 +1,93 @@ +Normally, git-annex repositories consist of symlinks that are checked into +git, and in turn point at the content of large files that is stored in +`.git/annex/objects/`. Direct mode gets rid of the symlinks. + +The advantage of direct mode is that you can access files directly, +including modifying them. The disadvantage is that most regular git +commands cannot be used in a direct mode repository. + +Normally, git-annex repositories start off in indirect mode. With some +exceptions: + +* Repositories created by the [[assistant]] use direct mode by default. +* Repositories on FAT and other less than stellar filesystems + that don't support things like symlinks will be automatically put + into direct mode. +* Windows always uses direct mode. + +## enabling (and disabling) direct mode + +Any repository can be converted to use direct mode at any time, and if you +decide not to use it, you can convert back to indirect mode just as easily. +Also, you can have one clone of a repository using direct mode, and another +using indirect mode. + +To start using direct mode: + + git annex direct + +To stop using direct mode: + + git annex indirect + +## safety of using direct mode + +With direct mode, you're operating without large swathes of git-annex's +carefully constructed safety net, which ensures that past versions of +files are preserved and can be accessed. +With direct mode, any file can be edited directly, or deleted at any time, +and there's no guarantee that the old version is backed up somewhere else. + +So if you care about preserving the history of files, you're strongly +encouraged to tell git-annex that your direct mode repository cannot be +trusted to retain the content of a file. To do so: + + git annex untrust . + +On the other hand, if you only care about the current versions of files, +and are using git-annex with direct mode to keep files synchronised between +computers, and manage your files, this should not be a concern for you. + +## use a direct mode repository + +You can use most git-annex commands as usual in a direct mode repository. + +Direct mode also works well with the git-annex assistant. + +The most important command to use in a direct mode repository is `git annex +sync`. This will commit any files you have run `git annex add` on, as well +as files that were added earlier and have been modified. It will push +the changes to other repositories for `git annex sync` there to pick up, +and will pull and merge any changes made on other repositories into the +local repository. + +## what doesn't work in direct mode + +A very few git-annex commands don't work in direct mode, and will refuse +to do anything. For example, `git annex unlock` doesn't make sense in +direct mode. + +As for git commands, direct mode prevents using any git command that would +modify or access the work tree. So you cannot `git commit` or `git pull` +(use `git annex sync` for both instead), or run `git status` (use `git +annex status` instead). These git commands will complain "fatal: This +operation must be run in a work tree". + +The reason for this is that git doesn't understand how git-annex uses the +work tree in direct mode. Where git expects the symlinks that get checked +into git to be checked out in the work tree, direct mode instead replaces +them with the actual content of files, as managed by git-annex. + +There are still lots of git commands you can use in direct mode. For +example, you can run `git log` on files, run `git push`, `git fetch`, +`git config`, `git remote add` etc. + +## forcing git to use the work tree in direct mode + +This is for experts only. You can lose data doing this, or check enormous +files directly into your git repository, and it's your fault if you do! +Also, there should be no good reason to need to do this, ever. + +Ok, with the warnings out of the way, all you need to do to make any +git command access the work tree in direct mode is pass it +`-c core.bare=false` diff --git a/doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment b/doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment new file mode 100644 index 000000000..ad1b66bc0 --- /dev/null +++ b/doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://www.gl-como.it/author/valhalla/" + nickname="valhalla" + subject="Direct mode clone of an indirect repo" + date="2013-08-18T08:47:35Z" + content=""" +I too have issues with mixing direct and indirect mode repositories. + + I have a regular, existing repository with ebooks, shared between various clones on proper :) filesystems; now I would need a copy of some of them on an ereader which only offers a FAT filesystem, so it has to be direct mode. + + mount $READER + cd $reader + git clone $REPO + +I get a directory full of small files, the way git manages links on FAT. + + git annex init \"ebook reader\" + +This detects the fact that it is working on a crippled filesystem, enables direct mode and disables ssh connection caching; up to now everything seems to be fine, but then + + git annex get $SOME_BOOK + +seems to work, downloads the file somewhere, but when I try to open $SOME_BOOK it is still the fake link, and the file has been downloaded in its destination, as if the repo wasn't in direct mode. + +I use version 4.20130723 on debian jessie +"""]] diff --git a/doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment b/doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment new file mode 100644 index 000000000..1743d5df9 --- /dev/null +++ b/doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 12" + date="2013-08-23T17:48:54Z" + content=""" +There should be no obstacles to using direct mode on one clone of a git repository, and indirect mode on another clone. The data stored in git for either mode is identical, and I do this myself for some repositories. + +@valhalla, you probably need to run `git annex fsck`, and if that does not solve your problem, you need to file a bug report. +"""]] diff --git a/doc/direct_mode/comment_12_7d507b6f87085a19d8dd5014f580922b._comment b/doc/direct_mode/comment_12_7d507b6f87085a19d8dd5014f580922b._comment new file mode 100644 index 000000000..bc8f00680 --- /dev/null +++ b/doc/direct_mode/comment_12_7d507b6f87085a19d8dd5014f580922b._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + ip="82.247.184.53" + subject="Fixing symlinks to the annex store in direct mode" + date="2014-07-16T06:52:33Z" + content=""" +I have an issue with direct mode: I have tons of symlinks that points to the git-annex store, while in direct mode. After investigation, I found that these files don't seem to be part of the repository. I can check with: + + $ git -c core.bare=false status --porcelain tr.html + ?? Documentation/Mozilla/developer.mozilla.org/tr.html + + $ ls -l tr.html + lrwxrwxrwx 1 mildred mildred 205 10 juin 16:22 tr.html -> ../../../.git/annex/objects/gF/z1/SHA256E-s31895--c873982bd742ba8db6e026afee26b7ab2f75f54f587304d8c2d877db3900c0f6.html/SHA256E-s31895--c873982bd742ba8db6e026afee26b7ab2f75f54f587304d8c2d877db3900c0f6.html + +The link is valid, and is probably pointing to a unused file in the annex store. How to add these files back? + +If I was in indirect mode, I could simply use `git add tr.html` (and **not** `git annex add`). This would stage to the git staging area the symlink, and all would be well. + +I found that in direct mode, the same was true. The command is: + + git -c core.bare=false add tr.html + +The file is added to the repository, and the link is converted to the target file. The question now is why? There is no hook on the add command. Could it be the annex assistant? If that didn't worked, my question would have been: how to checkout a file in direct mode? +"""]] diff --git a/doc/direct_mode/comment_13_5169c5541970d3b3bc1e080e07539b22._comment b/doc/direct_mode/comment_13_5169c5541970d3b3bc1e080e07539b22._comment new file mode 100644 index 000000000..7d15fca6f --- /dev/null +++ b/doc/direct_mode/comment_13_5169c5541970d3b3bc1e080e07539b22._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + ip="82.247.184.53" + subject="Re: Fixing symlinks to the annex store in direct mode" + date="2014-07-16T07:04:08Z" + content=""" +What I said was just wrong. Instead of trying on tr.html, I tried with a copy of that file. But making the copy of that file had the wanted effect, transforming the symlink to the actual file. Probably the assistant monitoring file creation, and transforming indirect file to direct file. Or perhaps the `cp` command follows symlinks by default (I thought it didn't). +"""]] diff --git a/doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment b/doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment new file mode 100644 index 000000000..b8d80cd7e --- /dev/null +++ b/doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 13" + date="2013-08-23T17:50:15Z" + content=""" +@obergix asked: + +> But then, how can a direct repo sync with changes made in other remotes, if there no pull/fetch available. + +The answer is simple: By running `git annex sync`, which handles all that. +"""]] diff --git a/doc/direct_mode/comment_14_03a02e689d92faa596de98e02b2ffe28._comment b/doc/direct_mode/comment_14_03a02e689d92faa596de98e02b2ffe28._comment new file mode 100644 index 000000000..ce47a5eb8 --- /dev/null +++ b/doc/direct_mode/comment_14_03a02e689d92faa596de98e02b2ffe28._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 14" + date="2014-07-16T17:51:28Z" + content=""" +I kinda wish people would post questions to the forum, and not clutter up this page.. + +Anyway, there have been past bugs in the direct mode code that caused some files to not be checked out in direct mode, but stay as symlinks pointing at the content. That can be fixed by running `git annex fsck`. But, I am not aware of any problem that can leave a git-annex symlink that is not checked into git at all. Perhaps you copied the symlink from another location? +"""]] diff --git a/doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment b/doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment new file mode 100644 index 000000000..3a538e00b --- /dev/null +++ b/doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="Git annex copy needed before git annex sync" + date="2013-08-23T19:59:35Z" + content=""" +Thanks for these details @joeyh. But AFAIU, one needs to proceed to the git annex copy before doing the git annex sync, otherwise, symlinks (or files containing the symlink path on SMB) will be created, instead of the plain \"direct\" files that are expected. + +I'm still not sure whether the git annex sync needs to be issued on either of the indirect or direct remotes first, or both, then in which sequence. I think a \"walkthrough\" script would help. +"""]] diff --git a/doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment b/doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment new file mode 100644 index 000000000..d265118a0 --- /dev/null +++ b/doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 15" + date="2013-08-24T15:56:47Z" + content=""" +No, you can sync before you copy, get, or whatever. git-annex will replace the symlinks with the actual files when they arrive at the repository. +"""]] diff --git a/doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment b/doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment new file mode 100644 index 000000000..f89cafe53 --- /dev/null +++ b/doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl2Jj8q2upJL4ZQAc2lp7ugTxJiGtcICv8" + nickname="Michael" + subject="comment 3" + date="2013-02-19T03:03:14Z" + content=""" +So, if I edit a \"content file\" (change a music file's metadata, say), what's the workflow to record that fact and then synchronise it to other repositories? + +I can't do a `git add`, so I don't understand what has to happen as a first step. (Thanks for your quick reply above, BTW.) + + +"""]] diff --git a/doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment b/doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment new file mode 100644 index 000000000..cf5ae2fb6 --- /dev/null +++ b/doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.183" + subject="comment 4" + date="2013-02-19T03:05:35Z" + content=""" +
+git annex add $file
+git annex sync
+git annex copy $file --to otherrepo
+
+"""]] diff --git a/doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment b/doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment new file mode 100644 index 000000000..d4e2962a6 --- /dev/null +++ b/doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="mildred" + ip="2a01:e35:2f7b:8350:225:22ff:fe40:fdfc" + subject="What happens to object database in direct mode?" + date="2013-07-08T13:27:21Z" + content=""" +What happens to the object database (`.git/annex/objects`) when going to direct mode? Are the objects deleted, moved to another location, kept? + +If the objects are kept, does it means that the file on the repository in direct mode is duplicated in the object database? If so, would it be relevant to use `cp --reflink=auto` to populate the working directory to enable copy on write on filesystems that supports it? +"""]] diff --git a/doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment b/doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment new file mode 100644 index 000000000..1cdb9a79c --- /dev/null +++ b/doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 6" + date="2013-07-08T16:11:32Z" + content=""" +`.git/annex/objects` does not typically contain any file contents in direct mode. The file contents are stored directly in the working tree. +"""]] diff --git a/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment b/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment new file mode 100644 index 000000000..d416a01f6 --- /dev/null +++ b/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 7" + date="2013-08-12T18:06:21Z" + content=""" +Would it be safe to add largefiles to gitignore in direct mode? + +Can git-annex still track large files ignored by git? + +Thanks. :-) +"""]] diff --git a/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment b/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment new file mode 100644 index 000000000..72ba16baf --- /dev/null +++ b/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 8" + date="2013-08-12T18:12:32Z" + content=""" +asbraithwaite: +No, as far as I know it can not. +"""]] diff --git a/doc/distributed_version_control.mdwn b/doc/distributed_version_control.mdwn new file mode 100644 index 000000000..ccf82b91c --- /dev/null +++ b/doc/distributed_version_control.mdwn @@ -0,0 +1,21 @@ +In git, there can be multiple clones of a repository, each clone can +be independently modified, and clones can push or pull changes to +one-another to get back in sync. + +git-annex preserves that fundamental distributed nature of git, while +dropping the requirement that, once in sync, each clone contains all the data +that was committed to each other clone. Instead of storing the content +of a file in the repository, git-annex stores a pointer to the content. + +Each git-annex repository is responsible for storing some of the content, +and can copy it to or from other repositories. [[Location_tracking]] +information is committed to git, to let repositories inform other +repositories what file contents they have available. + +--- + +The [[walkthrough]] shows how to create a distributed set of git-annex +repositories with no central repository. + +Prefer a central repository like GitHub? See the +[[tips/centralized_git_repository_tutorial]]. diff --git a/doc/download.mdwn b/doc/download.mdwn new file mode 100644 index 000000000..8c6f5b514 --- /dev/null +++ b/doc/download.mdwn @@ -0,0 +1,40 @@ +The main git repository for git-annex is `git://git-annex.branchable.com/` + +(You can push changes to this wiki from that anonymous git checkout.) + +Other mirrors of the git repository: + +* `git://git.kitenet.net/git-annex` [[gitweb](http://git.kitenet.net/?p=git-annex.git;a=summary)] +* [at github](https://github.com/joeyh/git-annex) + +Releases of git-annex are uploaded +[to hackage](http://hackage.haskell.org/package/git-annex). Get your +tarballs there, if you need them. + +Some operating systems include git-annex in easily prepackaged form and +others need some manual work. See [[install]] for details. + +## git branches + +The git repository has some branches: + +* `ghc7.0` supports versions of ghc older than 7.4, which + had a major change to filename encoding. +* `old-monad-control` is for systems that don't have a newer monad-control + library. +* `no-ifelse` avoids using the IFelse library + (merge it into master if you need it) +* `no-bloom` avoids using bloom filters. (merge it into master if you need it) +* `no-s3` avoids using the S3 library (merge it into master if you need it) +* `debian-stable` contains the latest backport of git-annex to Debian + stable. +* `tweak-fetch` adds support for the git tweak-fetch hook, which has + been proposed and implemented but not yet accepted into git. +* `setup` contains configuration for this website +* `pristine-tar` contains [pristine-tar](http://kitenet.net/~joey/code/pristine-tar) + data to create tarballs of any past git-annex release. + +---- + +Developing git-annex? Patches are very welcome. +You should read [[coding_style]]. diff --git a/doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment b/doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment new file mode 100644 index 000000000..e242230a0 --- /dev/null +++ b/doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3uJkdiJJejvqix9dULvw_Ma7DCtB-6zA" + nickname="Ian" + subject="git clone git://git-annex.branchable.com/ gives an error" + date="2012-08-13T20:57:34Z" + content=""" +Thought you would want to know + +error: unable to create file doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2_however_syb-0.1.0.2_was_excluded_because_json-0.5_requires_syb___62____61__0.3.3.mdwn (File name too long) +fatal: cannot create directory at 'doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2_however_syb-0.1.0.2_was_excluded_because_json-0.5_requires_syb___62____61__0.3.3': File name too long + + +"""]] diff --git a/doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment b/doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment new file mode 100644 index 000000000..d3024217a --- /dev/null +++ b/doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-08-16T23:28:30Z" + content=""" +Ok, I've renamed that long-ish filename. +"""]] diff --git a/doc/ekg.mdwn b/doc/ekg.mdwn new file mode 100644 index 000000000..508fd2e92 --- /dev/null +++ b/doc/ekg.mdwn @@ -0,0 +1,31 @@ +You can `cabal configure -fEKG` to build a git-annex that includes +the EKG remote monitoring interface. + +To access the EKG control panel, go to + while a git-annex command is running. + +This EKG build is mostly useful for debugging resource usage problems. + +[[!img ekg.png caption="git-annex webapp startup, and assistant startup scan"]] + +Note that since only one process can open port 4242 at a time, running +more than one git-annex process with EKG support at the same time can +result in some "resource busy (Address already in use)" messages -- but +git-annex will continue to work. + +---- + +## full profiling + +For the really tricky memory leaks, here's how to make a profiling build of +git-annex. + +1. `cabal configure` with only the flags you really need +2. `cabal build --ghc-options="-prof -auto-all -caf-all"` + This will probably fail due to some missing profiling libraries. + You have to get the profiling versions of all needed haskell libraries + installed somehow. +3. Run git-annex with the special flags `+RTS -hc -p` +4. Reproduce the memory leak problem. +5. If the assistant was run, stop it. +6. `hp2ps -e8in -c git-annex.hp` to generate a .ps graph of memory usage. diff --git a/doc/ekg/ekg.png b/doc/ekg/ekg.png new file mode 100644 index 000000000..a8d16a2d8 Binary files /dev/null and b/doc/ekg/ekg.png differ diff --git a/doc/encryption.mdwn b/doc/encryption.mdwn new file mode 100644 index 000000000..ecc908463 --- /dev/null +++ b/doc/encryption.mdwn @@ -0,0 +1,101 @@ +[[!toc]] + +git-annex mostly does not use encryption. Anyone with access to a git +repository can see all the filenames in it, its history, and can access +any annexed file contents. + +Encryption is needed when using [[special_remotes]] like Amazon S3, where +file content is sent to an untrusted party who does not have access to the +git repository. + +Such an encrypted remote uses strong ([[symmetric|design/encryption]] or +asymmetric) encryption on the contents of files, as well as HMAC hashing +of the filenames. The size of the encrypted files, and access patterns +of the data, should be the only clues to what is stored in such a +remote. + +You should decide whether to use encryption with a special remote before +any data is stored in it. So, `git annex initremote` requires you +to specify "encryption=none" when first setting up a remote in order +to disable encryption. To use encryption, you run +run `git-annex initremote` in one of these ways: + +* `git annex initremote newremote type=... encryption=hybrid keyid=KEYID ...` +* `git annex initremote newremote type=... encryption=shared` +* `git annex initremote newremote type=... encryption=pubkey keyid=KEYID ...` + +## hybrid encryption keys + +The [[hybrid_key_design|design/encryption]] allows additional +encryption keys to be added on to a special remote later. Due to this +flexibility, it is the default and recommended encryption scheme. + + git annex initremote newremote type=... [encryption=hybrid] keyid=KEYID ... + +Here the KEYID(s) are passed to `gpg` to find encryption keys. +Typically, you will say "keyid=2512E3C7" to use a specific gpg key. +Or, you might say "keyid=joey@kitenet.net" to search for matching keys. + +To add a new key and allow it to access all the content that is stored +in the encrypted special remote, just run `git annex +enableremote` specifying the new encryption key: + + git annex enableremote myremote keyid+=788A3F4C + +While a key can later be removed from the list, note that +that will **not** necessarily prevent the owner of the key +from accessing data on the remote (which is by design impossible to prevent, +short of deleting the remote). In fact the only sound use of `keyid-=` is +probably to replace a revoked key: + + git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C + +See also [[encryption_design|design/encryption]] for other security +risks associated with encryption. + +## shared encryption key + +Alternatively, you can configure git-annex to use a shared cipher to +encrypt data stored in a remote. This shared cipher is stored, +**unencrypted** in the git repository. So it's shared among every +clone of the git repository. + + git annex initremote newremote type=... encryption=shared + +The advantage is you don't need to set up gpg keys. The disadvantage is +that this is **insecure** unless you trust every clone of the git +repository with access to the encrypted data stored in the special remote. + +## regular public key encryption + +This alternative simply encrypts the files in the special remotes to one or +more public keys. It might be considered more secure due to its simplicity +and since it's exactly the way everyone else uses gpg. + + git annex initremote newremote type=.... encryption=pubkey keyid=KEYID ... + +A disavantage is that is not easy to later add additional public keys +to the special remote. While the `enableremote` parameters `keyid+=` and +`keyid-=` can be used, they have **no effect** on files that are already +present on the remote. Probably the only use for these parameters is +to replace a revoked key: + + git annex enableremote myremote keyid-=2512E3C7 keyid+=788A3F4C + +But even in this case, since the files are not re-encrypted, the revoked +key has to be kept around to be able to decrypt those files. +(Of course, if the reason for revocation is +that the key has been compromised, it is **insecure** to leave files +encrypted using that old key, and the user should re-encrypt everything.) + +(Because filenames are MAC'ed, a cipher still needs to be +generated (and encrypted to the given key IDs).) + +## MAC algorithm + +The default MAC algorithm to be applied on the filenames is HMACSHA1. A +stronger one, for instance HMACSHA512, one can be chosen upon creation +of the special remote with the option `mac=HMACSHA512`. The available +MAC algorithms are HMACSHA1, HMACSHA224, HMACSHA256, HMACSHA384, and +HMACSHA512. Note that it is not possible to change algorithm for a +non-empty remote. diff --git a/doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment b/doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment new file mode 100644 index 000000000..db93bf63f --- /dev/null +++ b/doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zooko" + ip="75.220.153.232" + subject="Tahoe-LAFS comes with encryption" + date="2011-05-18T04:32:14Z" + content=""" +The Tahoe-LAFS special remote automatically encrypts and adds cryptography integrity checks/digital signatures. For that special remote you should not use the git-annex encryption scheme. + +Tahoe-LAFS encryption generates a new independent key for each file. This means that you can share access to one of the files without thereby sharing access to all of them, and it means that individual files can be deduplicated among multiple users. +"""]] diff --git a/doc/favicon.ico b/doc/favicon.ico new file mode 100644 index 000000000..e754f5a48 Binary files /dev/null and b/doc/favicon.ico differ diff --git a/doc/feeds.mdwn b/doc/feeds.mdwn new file mode 100644 index 000000000..cc63be876 --- /dev/null +++ b/doc/feeds.mdwn @@ -0,0 +1,4 @@ +Aggregating git-annex mentions from elsewhere on the net.. + +* [[!aggregate expirecount=25 name="twitter" feedurl="http://tmp.kitenet.net/git-annex-twitter.rss" url="http://search.twitter.com/search.atom?q=git-annex"]] + diff --git a/doc/footer/column_a.mdwn b/doc/footer/column_a.mdwn new file mode 100644 index 000000000..92c77d840 --- /dev/null +++ b/doc/footer/column_a.mdwn @@ -0,0 +1,7 @@ +### Recent [[news]] + +[[!inline pages="news/* and !*/Discussion" archive=yes show=2 feeds=no]] + +### [[devblog|devblog]] + +[[!inline pages="devblog/* and !*/Discussion" archive=yes show=5 feeds=no]] diff --git a/doc/footer/column_b.mdwn b/doc/footer/column_b.mdwn new file mode 100644 index 000000000..4d2d3dd98 --- /dev/null +++ b/doc/footer/column_b.mdwn @@ -0,0 +1,7 @@ +### Recent [[videos]] + +[[!inline pages="videos/* and !*/Discussion" archive=yes show=2 feeds=no]] + +### Recent [[forum posts|forum]] + +[[!inline pages="forum/* and !*/Discussion" archive=yes show=5 feeds=no]] diff --git a/doc/forum.mdwn b/doc/forum.mdwn new file mode 100644 index 000000000..e8a208ddf --- /dev/null +++ b/doc/forum.mdwn @@ -0,0 +1,8 @@ +This is a place to discuss using git-annex. +If you need help, advice, or anything, post about it here. + +But, please don't post bug reports here. Put them in [[bugs]]. +And please don't make wishlist requests here. Put them in [[todo]]. +(If you post bugs/todo here, it'll just get moved.) + +[[!inline pages="forum/* and !*/Discussion" archive=yes rootpage=forum postformtext="Add a new thread titled:"]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn new file mode 100644 index 000000000..84f92ae7e --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn @@ -0,0 +1,3 @@ +I have 2 clients (laptops) that would (usually) not be online at the same time. Is it possible to use git-annex for syncing these 2 clients through an encrypted server? + +I have tried to set this up with the assistant by using an USB-disk for copying the repository from one client to the other. The server is configured through the assistant as repository group 'transfer'. Now both clients see the encrypted ssh-server, each client copy stuff to the encrypted server, but no files are copied between the 2 clients. (In my case, running git-annex on the server is not an option. I have read through this forum, but it doesn't seem anyone has been able to get it to work.) diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment new file mode 100644 index 000000000..90b47a3a9 --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" + nickname="Charl" + subject="Change the encrypted server repository group to "full backup"" + date="2014-03-23T21:00:01Z" + content=""" +Have you tried changing the repository group of the encrypted server to \"full backup\" instead of \"transfer\"? + +I've just started experimenting with git-annex, and this setup (two possibly remote laptops, one encrypted server) seems to be working after very limited testing. I'm currently importing a larger collection of about 40000 files, will see if it still does (it seems whilst one client is transferring to the remote server, the other client laptop is not beeing synced; it did sync after my first batch of copying however.) +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment new file mode 100644 index 000000000..b50ba4b46 --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" + nickname="Stein Roald" + subject="No success" + date="2014-03-26T19:43:24Z" + content=""" +Thank you, Charl, for your suggestion. I've tried it, without success. (It doesn't seem like that change changed anything on the encrypted ssh-server.) +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment new file mode 100644 index 000000000..1e4206144 --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-26T21:10:39Z" + content=""" +What kind of encrypted remote are you using? An encrypted rsync special remote does not include the git repository, but only the content of the files, so cannot be used in this way. + +If you set up a [[gcrypt special remote|special_remotes/gcrypt]], it will be encrypted and includes the full git repository, as well as the content of the files, so can be used like this. +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment new file mode 100644 index 000000000..4d8915b8d --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" + nickname="Stein Roald" + subject="Need some clarification" + date="2014-03-28T22:49:14Z" + content=""" +OK, thank you Joey for your help, and I think you have made some really excellent software. I've spent a couple of days to configure gpg and understand how to use it (glad I did, it has been on my todo-list for a long time...) + +First to your question: When I started, I just used the git-annex assistant to \"set up a repository on a remote server using ssh\" as a \"transfer repository\". Now I'll use git-remote-gcrypt instead. + +Now I have 2 questions: + +--- + +1) On this webpage: [[https://github.com/joeyh/git-remote-gcrypt]] these are the instructions for setting up a remote for two participants: + + git remote add cryptremote gcrypt::rsync://example.com:repo + git config remote.cryptremote.gcrypt-participants \"KEY1 KEY2\" + git push cryptremote master + +**Question 1:** As I own both computers myself, will syncing between the 2 computers work if I only use 1 KEY (the same KEY on both computers)? + +--- + +2) I am still struggling to understand git-annex assistant and the use of special remotes. Important reasons for using git-annex are backups and moving data to the cloud to free up disk space locally. If I've understood it correctly, git-annex assistant always encrypts data sent to special remotes. And it seems to me that this page [[http://git-annex.branchable.com/special_remotes/]] suggest that git-annex assistant makes it easy to transfer files between different computers that do not communicate directly. I must clearly have misunderstood something, as Joey's comment above seem to state that I can't use the assistant for setting up syncing between computers. + +**Question 2:** If I loose my computer, or it becomes corrupted, how can I get my files back if I don't set up special remotes as a gcrypt special remote? (And if I can't, what is the purpose of the special remotes made by the assistant?) +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment new file mode 100644 index 000000000..8dcddbeef --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Confused" + date="2014-03-31T03:18:41Z" + content=""" +>What kind of encrypted remote are you using? An encrypted rsync special remote does not include the git repository, but only the content of the files, so cannot be used in this way. + +Forgive me, Joey, I've been following your work on the assistant for almost as long as you've been working on it, and I use git a little bit, but I have yet to wrap my head around the complexities of git and how git-annex and the assistant...morph them. I've read all the design docs you've written, but I still don't understand this. From reading the OP it sounds like this is exactly what the encrypted rsync special remote is for: using a transfer repo to sync two devices that don't connect directly to each other. Why would he need to use a gcrypt repo instead? + +Thanks for your patience. I know you get asked these basic questions over and over again. +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment new file mode 100644 index 000000000..5fc4286b2 --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 6" + date="2014-04-02T20:11:35Z" + content=""" +@Adam, an encrypted special remote does not contain the git repository (the gcrypt special remote is an exception to this rule). So you need to use another method to sync the git repository between machines. + +@Stein Roald once you have a clone of the git repository, you have the information that git-annex needs in able to get files from encrypted special remotes. + +Question 1: While gcrypt supports multi-key setups, when you use the git-annex assistant to set up a gcrypt remote it only sets it up to use one key. It's left to you to arrange for this key to be on every computer that needs it. Or use command-line stuff to add additional keys later. + +Question 2: You can certianly use the assistant to set up syncing between computers, but the only setup that currently provides 100% end-to-end enctyption of the git repository is using gcrypt. (Special remotes are 100% end-to-end encrypted, but as I've stated several times, do not contain the git repository data.) +Since you seemed to want 100% end to end encryption I suggested using gcrypt. There are simpler setups, like using XMPP, that encrypt everything but not end-to-end, so the XMPP server could snoop on it. + +If you loose your computer, you can get your files back from any other device where you've set up a clone of that repository. A backup drive, another computer , etc. +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_7_acd64ce1b08a97ddf730622272e9f611._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_7_acd64ce1b08a97ddf730622272e9f611._comment new file mode 100644 index 000000000..f850253b1 --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_7_acd64ce1b08a97ddf730622272e9f611._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkvN0eFnwvgw2JyTSSHw0QouytcxtPLln8" + nickname="Stein Roald" + subject="comment 7" + date="2014-04-03T21:55:14Z" + content=""" +Thanks again, Joey, for your time and for your kind answers. + +I have tried to set up git-annex with 2 laptops, each with their own gpg-key in order to use a remote server with gcrypt (and those laptops have shared the keys with each other). I regularly use git, but so far I haven't been able to get this setup to work. But before I bother the world with these problems, I would be interested in learning how to do the following: + +*Question 3*: How can I use the git-annex assistant to set up a gcrypt remote (with one key)? It doesn't show up as an option as far as I can see (git-annex version: 4.20130815). + +*Promise*: When I get git-annex to work with gcrypt, I'll make a summary on how I did it (and maybe which mistakes I made so others can avoid them). +"""]] diff --git a/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_8_9baacb14fc5eb449cb13e0b4a4995fb0._comment b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_8_9baacb14fc5eb449cb13e0b4a4995fb0._comment new file mode 100644 index 000000000..0ecc2fb3b --- /dev/null +++ b/doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_8_9baacb14fc5eb449cb13e0b4a4995fb0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 8" + date="2014-05-19T16:48:09Z" + content=""" +4.20130815 is too old. Get a current version. +"""]] diff --git a/doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__.mdwn b/doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__.mdwn new file mode 100644 index 000000000..c6c67a291 --- /dev/null +++ b/doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__.mdwn @@ -0,0 +1,12 @@ +Hello, + +I went through several of the questions on the forum but could not find the answer to this. I have the following scenario, which seems very similar to the nomad case. + +I have a server at home with many big media files. I want to keep a subset of these files on my laptop, to watch when I travel. When I'm done watching the files, I want to either delete them (i.e, they should no longer be on any machine) or archive them (i.e., they should remain on the server, but no longer be on the laptop). I think I know how to do this from the command line, but I still have a few questions. + +- How do I drop a file from _every_ repository? If I understood correctly, `git annex drop foo` will only drop foo locally. +- Is it possible to follow this use case using the assistant, or should I use the command line instead (which would be very fine with me)? In particular, how do I choose the file I want to put on the laptop? (It seems `git annex get` is the command line way, is there an assistant equivalent?) +- Can I use both the assistant and the command line at the same time? Is there a description of the command-line version of what the assistant is doing behind the scenes? +- Can the server repository be both a "transfer" repository (to hold the files I haven't watch) and an "archive" repository (to keep the files I've watched and decided to keep), or do I need two repositories (on the server) for that? + +Thanks a lot for any suggestion. diff --git a/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 b/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 new file mode 100644 index 000000000..e29f57657 --- /dev/null +++ b/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 @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-21T22:41:44Z" + content=""" +You can use `git annex drop foo --from remote` to drop the file from the remote. Of course, the remote has to be accessible. You can't drop files from an offline drive that's stored in a safe.. + +What you might be looking for is `git annex drop foo; rm foo`, followed by a git commit, and then later you can run `git annex unused` on a remote and it will let you then easily drop the files you've removed from the repository. This approach of just deleting files when you're done with them also works when using the assistant. + +The assistant isn't really about only keeping a subset of files on your laptop. It would like to get them all, except for ones in \"archive\" directories. +You can configure the assistant to use manual mode, and then it doesn't download any files on its own (so you have to manually `git annex get` them), but it will still handle all the other stuff the assistant does, like automatically committing and syncing changes. + +An archive repository wants one copy of every file that is not already stored in some other archive repository. So an archive repository could certainly be used instead of a transfer repository. (But not a small archive repository; those only want files that are moved to \"archive\" directories.) A better choice might be to make that server be a backup repository. That makes it want *every* file, no matter what, and it follows that it would archive everything, and have everything the client wants available for transferring to it. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..3ae6b94c5 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 2" + date="2013-10-23T10:06:53Z" + content=""" +Thank you for the suggestions and explanations. I'm using a manual repo and I find that it works quite well. +"""]] diff --git a/doc/forum/A_really_stupid_question.mdwn b/doc/forum/A_really_stupid_question.mdwn new file mode 100644 index 000000000..38c7bcb56 --- /dev/null +++ b/doc/forum/A_really_stupid_question.mdwn @@ -0,0 +1,3 @@ +Sorry, but all this wiki and the manpage seem to gloss over the most obvious question: + +What happens when you commit conflicting edits in different repositories? diff --git a/doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment b/doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment new file mode 100644 index 000000000..2a400db3b --- /dev/null +++ b/doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="Good question!" + date="2011-12-20T23:07:25Z" + content=""" +You get a regular git merge conflict, which can be resolved in any of the regular ways, except that conflicting files are just symlinks. + +Example: + +
+$ git pull
+...
+Auto-merging myfile
+CONFLICT (add/add): Merge conflict in myfile
+Automatic merge failed; fix conflicts and then commit the result.
+$ git status
+# On branch master
+# Your branch and 'origin/master' have diverged,
+# and have 1 and 1 different commit(s) each, respectively.
+#
+# Unmerged paths:
+#   (use \"git add/rm ...\" as appropriate to mark resolution)
+#
+#	both added:         myfile
+#
+no changes added to commit (use \"git add\" and/or \"git commit -a\")
+$ git add myfile
+$ git commit -m \"took local version of the conflicting file\"
+
+"""]] diff --git a/doc/forum/A_tiny_filesystem__63__.mdwn b/doc/forum/A_tiny_filesystem__63__.mdwn new file mode 100644 index 000000000..44a397e2f --- /dev/null +++ b/doc/forum/A_tiny_filesystem__63__.mdwn @@ -0,0 +1,7 @@ +First of all, thanks for the amazing work! I've already tried Owncloud, SparkleShare, Unison, rsync and lsycnd. Finally I may have found the real deal. + +My main problem with git-annex right now is that it is not fast/reliable enough. The main issues being: broken links now and then (I've probably done something wrong) and the slow: "startup scans", "consistency checks", "attempting to fix here" and "syncing with server". (50 Giga, Work-Server-Home, setup via webapp assistant) + +Please, tell me if I'm wrong, but I have the impression that git-annex would get much more robust if it was 100% sure that nobody could mess with its file tree. One possibility would be to add the option (when creating a repo) to make a protected filesystem controlled by git-annex only via FUSE (not something like ShareBox). This could be a tiny filesystem (such as loggedfs) that does nothing but make sure that only git-annex can mount/change files. This would definitely add to speed (reducing checks) and stability. + +I'm I being too naive? Most likely there is something I'm overlooking, like the amount of work this would involve. diff --git a/doc/forum/A_tiny_filesystem__63__/comment_1_993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment b/doc/forum/A_tiny_filesystem__63__/comment_1_993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment new file mode 100644 index 000000000..aa246b5ee --- /dev/null +++ b/doc/forum/A_tiny_filesystem__63__/comment_1_993e3f5dbe4bcbb5b7bd9e08ab9554f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-05T22:34:32Z" + content=""" +git-annex can indeed be sped up by preventing modification of files in the tree. you can do this by running \"git annex indirect\" +"""]] diff --git a/doc/forum/A_tiny_filesystem__63__/comment_2_af57591d42868c8aa1cc1eda43ca8b98._comment b/doc/forum/A_tiny_filesystem__63__/comment_2_af57591d42868c8aa1cc1eda43ca8b98._comment new file mode 100644 index 000000000..1d4bc4be7 --- /dev/null +++ b/doc/forum/A_tiny_filesystem__63__/comment_2_af57591d42868c8aa1cc1eda43ca8b98._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-04-07T04:25:43Z" + content=""" +what's wrong with [sharebox](https://github.com/chmduquesne/sharebox-fs), actually? +"""]] diff --git a/doc/forum/A_tiny_filesystem__63__/comment_3_3869c0472b50d7cf5e29ac0720f4f20f._comment b/doc/forum/A_tiny_filesystem__63__/comment_3_3869c0472b50d7cf5e29ac0720f4f20f._comment new file mode 100644 index 000000000..9c1613ca7 --- /dev/null +++ b/doc/forum/A_tiny_filesystem__63__/comment_3_3869c0472b50d7cf5e29ac0720f4f20f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="augusto" + ip="177.98.104.136" + subject="comment 3" + date="2014-04-08T22:46:18Z" + content=""" +When I saw Sharebox's page on Github I had the impression it was vaporware. It has a section named \"Planned Interface\" and there are no updates for quite a while. + +Is it working? How to install/use it? +"""]] diff --git a/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn b/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn new file mode 100644 index 000000000..7b16f6523 --- /dev/null +++ b/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn @@ -0,0 +1,11 @@ +Using the assistant, I have created a repository on my laptop plus a synced repository on a USB disk. Looking into the first repository, I see my files accompanied by a .git directory. However, looking on the USB disk (e.g. /media/usb/annex), all I see is what looks like the content of a .git directory. + +This means that it is difficult to retrieve any file directly from this disk -- it has to be synced to another local repository first. + +Is there any way to change this ? E.g. to have a copy of the working tree, plus a .git directory, on the disk ? + +My use case: I have added plenty of media files to my repository. In addition to using the USB disk as a backup/medium for transfering these files to another computer, I'd like to be able to plug the disk to e.g. a media player and read the files directly from the tree, but it does not work at the moment. + +Is there anything I am missing ? + +Edited: yes, there is something I was missing: the forum entry at [[forum/USB_backup_with_files_visible/]] diff --git a/doc/forum/Accessing_files_in_bare_repository.mdwn b/doc/forum/Accessing_files_in_bare_repository.mdwn new file mode 100644 index 000000000..2ea6ba9d3 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository.mdwn @@ -0,0 +1,5 @@ +I have set up a remote server repository using the git-annex web assistant, accessed via ssh. The repository is a bare one according to the config file in the annex directory on the server. + +I am wondering how I could access any of the files in the repository while logged in to the server - they don't have their usual file names to look for clearly. Is there a way to get a list of the files for starters? I tried using git annex find, but it never returns any files. git annex get followed by a filename of a document in the repository also doesn't work. + +Thanks to help me understand better how to approach this. diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_10_7eb66e3806f9524e043fae2da9d57d64._comment b/doc/forum/Accessing_files_in_bare_repository/comment_10_7eb66e3806f9524e043fae2da9d57d64._comment new file mode 100644 index 000000000..2b9bb8631 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_10_7eb66e3806f9524e043fae2da9d57d64._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 10" + date="2013-05-13T04:08:14Z" + content=""" +I'm not sure what's up. I hope Joey can weigh in. + +\"git annex sync\" ought to go get the symlinks from your remote, and merge them into your master branch, which is currently checked out, so you should see them. :( +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_11_f0165d66865ad14f7eb5d50e900c1df4._comment b/doc/forum/Accessing_files_in_bare_repository/comment_11_f0165d66865ad14f7eb5d50e900c1df4._comment new file mode 100644 index 000000000..abacbc30e --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_11_f0165d66865ad14f7eb5d50e900c1df4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-05-13T17:33:26Z" + content=""" +When the assistant (or git annex sync) pushes to a repository, it creates a `synced/master` branch. So your bare repository has no regular `master` branch. So when you clone it, you get a repository with no branch checked out, which is what git-annex sync complains about. + +There are several solutions. The easiest is to run `git merge origin/synced/master`; then your checkout will have a master branch and you can use `git annex sync` from then on. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_12_0e7ea5161b6da6e9bb9425bdb953de33._comment b/doc/forum/Accessing_files_in_bare_repository/comment_12_0e7ea5161b6da6e9bb9425bdb953de33._comment new file mode 100644 index 000000000..8d083d32d --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_12_0e7ea5161b6da6e9bb9425bdb953de33._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 12" + date="2013-05-14T04:07:37Z" + content=""" +Thanks Joey, this worked. The symlinks are in the directory and I can get the actual file contents (except for one attempt that failed - I'll need to check why that didn't seem to have propagated to the bare repository.) +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_13_f804b9bf71f7d04bd23ce32d813dc340._comment b/doc/forum/Accessing_files_in_bare_repository/comment_13_f804b9bf71f7d04bd23ce32d813dc340._comment new file mode 100644 index 000000000..470541f1d --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_13_f804b9bf71f7d04bd23ce32d813dc340._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 13" + date="2013-06-12T18:56:39Z" + content=""" +Regarding my comment above, I've changed things so now `git annex sync` to a bare repository *does* push to the regular branch. So `git clone` will work without this bother. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_1_6de649d38febd2240eb5b703da77c2d6._comment b/doc/forum/Accessing_files_in_bare_repository/comment_1_6de649d38febd2240eb5b703da77c2d6._comment new file mode 100644 index 000000000..ec14394b8 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_1_6de649d38febd2240eb5b703da77c2d6._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-05-08T13:40:16Z" + content=""" +Do you have git-annex available on the server from the command line? + +If so, the easiest way would probably be to clone the repo in git, and do a \"git annex init\" in it. This would give you a copy of the repo with none of the files in it. It would be tiny, just full of symlinks, no content. Then pull down copies of *only* the individual files you need using \"git annex get.\" + +Maybe set that repo to \"untrusted\" to make sure other repos don't start depending on it to store copies of files to fulfill numcopies. + +When you're done with a copy of a file, just \"git annex drop\" it again so it disappears from this skeletal repo. + +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_2_7e8dd09915ddc3267377e900891cb02c._comment b/doc/forum/Accessing_files_in_bare_repository/comment_2_7e8dd09915ddc3267377e900891cb02c._comment new file mode 100644 index 000000000..9c4df2f05 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_2_7e8dd09915ddc3267377e900891cb02c._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 2" + date="2013-05-10T03:21:57Z" + content=""" +I have git-annex on the VPS. The bare repository is in the directory \"annex\" + +From the user's root directory, I execute: + +git clone annex/ Documents +Cloning into 'Documents'... +done. +warning: remote HEAD refers to nonexistent ref, unable to checkout. + +cd Documents/ +~/Documents$ git annex init 'Documents on VPS' +init Documents on VPS ok +(Recording state in git...) + +Still, when I try to get a file now, or do a git annex find, nothing shows up. + + +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_3_80eae4a73f38d1a7e35f97c33b6401f8._comment b/doc/forum/Accessing_files_in_bare_repository/comment_3_80eae4a73f38d1a7e35f97c33b6401f8._comment new file mode 100644 index 000000000..31aa5b1a3 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_3_80eae4a73f38d1a7e35f97c33b6401f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 3" + date="2013-05-10T04:11:22Z" + content=""" +OK, I'm not sure what is up, but perhaps try \"git annex sync\" and see if that gives you the treeful of symlinks that you want. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_4_5ec13e98d3ecb69426e974d34f712f9b._comment b/doc/forum/Accessing_files_in_bare_repository/comment_4_5ec13e98d3ecb69426e974d34f712f9b._comment new file mode 100644 index 000000000..720d78766 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_4_5ec13e98d3ecb69426e974d34f712f9b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 4" + date="2013-05-10T04:11:53Z" + content=""" +that is, do \"git annex sync\" from within your new clone. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_5_dccbf5793998c6381e23eb8ff6497ebf._comment b/doc/forum/Accessing_files_in_bare_repository/comment_5_dccbf5793998c6381e23eb8ff6497ebf._comment new file mode 100644 index 000000000..d89ab793e --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_5_dccbf5793998c6381e23eb8ff6497ebf._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 5" + date="2013-05-10T04:23:28Z" + content=""" +Thanks for your help. Unfortunately that doesn't do the trick either: + +git annex sync +(merging origin/git-annex into git-annex...) +(Recording state in git...) +commit +ok +git-annex: no branch is checked out + +After this, git annex find still yields no results. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_6_42d923916232c81f3b8bdbefa34a89d3._comment b/doc/forum/Accessing_files_in_bare_repository/comment_6_42d923916232c81f3b8bdbefa34a89d3._comment new file mode 100644 index 000000000..f33b52146 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_6_42d923916232c81f3b8bdbefa34a89d3._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 6" + date="2013-05-10T12:52:48Z" + content=""" +OK, I'm going to guess the problem is there is no \"master\" branch in your cloned repository, because there is no \"master\" branch in a bare remote. (Not sure about this, just guessing.) Try \"git branch\" in your clone. If there is no \"master\" branch, that's the problem. + +If that's true, the right thing to do would probably have been not to clone from it, but to create a fresh git repo and then set your bare repo as a remote. + +You could try doing that -- create a fresh git repo, git annex init it, and then try something like \"git remote add barerepo /path/to/bare/repo\" and then \"git annex sync\" which should pull changes from the bare repo's 'synced/master' branch into your 'synced/master' branch and from there into your master branch, giving you all your symlinks. + +If that works you could declare your previous attempt \"dead\" and you'll be good. + +It *may* also be possible to just fix the clone you've got by creating a master branch, maybe by branching off of synced/master. Do a \"git branch\" and see whether synced/master exists, and just try \"git branch master synced/master\" and then \"git checkout master\" and that might do the job! + +But I'm just throwing ideas around here, so I hope somebody who actually knows what's going on (joey? are you there?) will pipe up. +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_7_43a0a7d222faee582aeb3150a59cef87._comment b/doc/forum/Accessing_files_in_bare_repository/comment_7_43a0a7d222faee582aeb3150a59cef87._comment new file mode 100644 index 000000000..7684b0c46 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_7_43a0a7d222faee582aeb3150a59cef87._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 7" + date="2013-05-12T14:04:29Z" + content=""" +That all sounded very plausible, but for some reason it failed to work for me. I went back to basics and tried getting there by replicating steps 1 to 3 of the walkthrough, but also to no aval. I'll still try one more thing - setting up a local repository on the VPS and syncing it to my main one over XMPP. That seems rather convoluted given the bare repository is on the same server, but who knows... +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_8_ec1024235c1c74c113483a833df84654._comment b/doc/forum/Accessing_files_in_bare_repository/comment_8_ec1024235c1c74c113483a833df84654._comment new file mode 100644 index 000000000..e609a4c90 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_8_ec1024235c1c74c113483a833df84654._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 8" + date="2013-05-12T19:06:14Z" + content=""" +So what *does* show up? Is your repo an empty directory? Or are the symlinks that should point to content there? + +as far as git goes, are you on the master branch? *is* there a master branch? If you do \"git status\" what do you see? + +There's no reason this shouldn't work for you.... +"""]] diff --git a/doc/forum/Accessing_files_in_bare_repository/comment_9_c156b8c1ae0f2905566bbdb13b84e577._comment b/doc/forum/Accessing_files_in_bare_repository/comment_9_c156b8c1ae0f2905566bbdb13b84e577._comment new file mode 100644 index 000000000..43b93b271 --- /dev/null +++ b/doc/forum/Accessing_files_in_bare_repository/comment_9_c156b8c1ae0f2905566bbdb13b84e577._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 9" + date="2013-05-12T23:51:16Z" + content=""" +I get the following: + +frederik@niihau:~/Documents$ git status +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use \"git add\" to track) + +And this is the config: + +frederik@niihau:~/Documents$ cat .git/config +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote \"origin\"] + fetch = +refs/heads/*:refs/remotes/origin/* + url = /home/frederik/annex + annex-uuid = 1648a298-27aa-4cb1-xx-xxx +[annex] + uuid = 4406bd35-9ff7-4008-yy-yyy + version = 3 +[remote \"niihau\"] + url = /home/frederik/annex + fetch = +refs/heads/*:refs/remotes/niihau/* + annex-uuid = 1648a298-27aa-4cb1-xx-xxx + +Not having worked with git before, all this is still very new for me. I have 33M of data in the .git directory, mostly in objects, so it does seem to have synced something already. +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository.mdwn b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository.mdwn new file mode 100644 index 000000000..f09b2ea3d --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository.mdwn @@ -0,0 +1,28 @@ +Hi! + +One of my annex repository has a very strange behavior. Every `git annex` command is very slow. + +I'm using MacOSX Mavericks, and this repository is a network drive, mounted with Samba. It's using direct mode, and the filesystem is crippled. I use *annex* for storing huge files, for example movies. I moved some files in this directory, and used `git annex add`. It was long (as checksum was performed) and I thought that everything was OK. I tried `git log -p`, it was OK too: + + new file mode 120000 + index 0000000..e58c65a + --- /dev/null + +++ b/Movies/movie.mp4 + @@ -0,0 +1 @@ + +../.git/annex/objects/FK/60/SHA256E-s346858581--053dca6a842376ab8022722df306ad5 + \ No newline at end of file + +However it was not. I tried to launch `git annex sync another_repo` (with *another_repo* indirect and on a local disk) and it took ages. Even `git annex list` takes ages, **on every repository linked to this one**. With `ps -A`, I found out that the issue was created by `git --git-dir=/Volumes/SAMBA_REMOTE/.git --work-tree=/Volumes/SAMBA_REMOTE -c core.bare=false checkout -q -B annex/direct/master`. + +**Have you ever noticed this behavior? Have I done something wrong?** + +Here is the output of `git annex version`: + + git-annex version: 5.20131117-gbd514dc + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 4 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/bugs/direct_mode_sync_should_avoid_git_commit.mdwn b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/bugs/direct_mode_sync_should_avoid_git_commit.mdwn new file mode 100644 index 000000000..ec7ce2cce --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/bugs/direct_mode_sync_should_avoid_git_commit.mdwn @@ -0,0 +1 @@ +See [[/bugs/direct_mode_sync_should_avoid_git_commit/]] instead. diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_10_06dae5709750ea1da4f7fdbee4e84efc._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_10_06dae5709750ea1da4f7fdbee4e84efc._comment new file mode 100644 index 000000000..c8feb05b9 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_10_06dae5709750ea1da4f7fdbee4e84efc._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 10" + date="2013-11-26T21:48:11Z" + content=""" +Hmm. Seems to me that `git commit` is trying to download the whole big file from the SMB share. Perhaps just to compare it with the symlink it expects to be there? + +When I try this, in a large direct mode repository with some video from *my* family, `git commit` does not open the file (verified with strace), let alone read it, and so finishes in well under 1 second. + +Aha, I was able to reproduce `git commit` doing that with a repo on a FAT filesystem. git opens the file, and mmaps it, and I guess it proceeds to try to diff it against the symlink standin file it expected to be there. + +This is particularly unfortunate, since `git commit` is only, I think, doing this so that it can print out a \"Changes not staged for commit\" message. Which git-annex sync throws away. There seems to be no git commit option that disables this behavior. + +I think that this calls for making `git annex sync` not use `git commit` any longer, and instead manually build the commit using `git-write-tree` and `git-commit-tree`. Since I don't know if I will get to this before the thanksgiving holiday, I am creating a bug: [[bugs/direct_mode_sync_should_avoid_git_commit]] +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_11_2069c5c41882ae0a1973fb7da583b60e._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_11_2069c5c41882ae0a1973fb7da583b60e._comment new file mode 100644 index 000000000..76ecd13c2 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_11_2069c5c41882ae0a1973fb7da583b60e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 11" + date="2013-11-26T21:57:52Z" + content=""" +Awesome! Thanks for your very efficient investigations. I'll stay tuned to the bug report. + +Happy Thanksgiving! +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_12_b35e3a87c30974eedd71ebe52ecbed96._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_12_b35e3a87c30974eedd71ebe52ecbed96._comment new file mode 100644 index 000000000..282f1fb4c --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_12_b35e3a87c30974eedd71ebe52ecbed96._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 12" + date="2013-11-27T12:08:29Z" + content=""" +I corrected the bug address: See [[/bugs/direct_mode_sync_should_avoid_git_commit/]] +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_13_84e026f9bda87bfd12a3769dcef77f8b._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_13_84e026f9bda87bfd12a3769dcef77f8b._comment new file mode 100644 index 000000000..dfc0db3d2 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_13_84e026f9bda87bfd12a3769dcef77f8b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 13" + date="2013-11-27T12:13:04Z" + content=""" +thanks! +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment new file mode 100644 index 000000000..4dfc762ac --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 14" + date="2013-12-02T20:05:00Z" + content=""" +Should be fixed; the git commit is now avoided. +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_1_ed3534196164c6736a8dbf21c65c119d._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_1_ed3534196164c6736a8dbf21c65c119d._comment new file mode 100644 index 000000000..ed104f488 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_1_ed3534196164c6736a8dbf21c65c119d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T17:26:12Z" + content=""" +If you run git-annex with --debug, it will print out every command it is running. This is useful because A) I can see the commands in context and B) it includes timestamps, which is a little bit more informative than \"it took ages\". (Which can mean anything.) + +Anyway, I figured out the problem. Upgrade from v4 to v5 does what should be a one-time git checkout, but it seems that the auto upgrade code neglected to update annex.version, so it started doing it on every command run in a v4 repo. Fixed in git. You can work around the bug by running \"git config annex.version 5\". +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_2_1e29bcf568f02765c48f0eac6c640673._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_2_1e29bcf568f02765c48f0eac6c640673._comment new file mode 100644 index 000000000..ab0cd9c9d --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_2_1e29bcf568f02765c48f0eac6c640673._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 2" + date="2013-11-26T20:42:03Z" + content=""" +My problem isn't solved. I cloned the repository from my netbook to the SMD drive, and added a file in this new direct annex repository : + + [3singes:/Volumes/Video/Videos/Films] $ git annex add MyFamily.mkv --debug + [2013-11-26 19:52:59 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"MyFamily.mkv\"] + [2013-11-26 19:52:59 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"ls-files\",\"--modified\",\"-z\",\"--\",\"MyFamily.mkv\"] + [2013-11-26 19:52:59 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] + add MyFamily.mkv [2013-11-26 19:52:59 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] + (checksum...) [2013-11-26 19:52:59 CET] read: gsha256sum [\"MyFamily.mkv\"] + [2013-11-26 20:55:35 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] + [2013-11-26 20:55:35 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] + ok + (Recording state in git...) + [2013-11-26 20:55:35 CET] feed: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + [2013-11-26 20:55:35 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] + [2013-11-26 20:55:35 CET] feed: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"update-index\",\"-z\",\"--index-info\"] + [2013-11-26 20:55:35 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-11-26 20:55:36 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"write-tree\"] + [2013-11-26 20:55:36 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"commit-tree\",\"9bdb7b18b44020441ec8dc179e676120e769ff32\",\"-p\",\"refs/heads/git-annex\"] + [2013-11-26 20:55:37 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"update-ref\",\"refs/heads/git-annex\",\"293332232ca4e7428090171b52dcc5b3b80d1df6\"] + +Let's try to sync to my macbookpro annex repository: + + [3singes:/Volumes/Video/Videos/Films] $ git annex sync macbookpro --debug + [2013-11-26 20:57:48 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + [2013-11-26 20:57:48 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-11-26 20:57:49 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..293332232ca4e7428090171b52dcc5b3b80d1df6\",\"--oneline\",\"-n1\"] + [2013-11-26 20:57:49 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..b2146cf0abc7d6a7e5c79d3b133181b56cd77461\",\"--oneline\",\"-n1\"] + [2013-11-26 20:57:49 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c2cf7488b4745d4168491d8e62f5bdc354869133\",\"--oneline\",\"-n1\"] + [2013-11-26 20:57:49 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] + [2013-11-26 20:57:49 CET] read: git [\"config\",\"--null\",\"--list\"] + [2013-11-26 20:57:49 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"ls-files\",\"--stage\",\"-z\",\"--others\",\"--exclude-standard\",\"--\",\"/Volumes/Video/Videos\"] + [2013-11-26 20:57:50 CET] chat: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"cat-file\",\"--batch\"] + (Recording state in git...) + [2013-11-26 20:57:55 CET] feed: xargs [\"-0\",\"git\",\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"add\",\"-f\"] + commit + [2013-11-26 20:57:55 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"commit\",\"-m\",\"git-annex automatic sync\"] + +Now it's 21:41 CET, and it's been stuck for circa 1 hour. +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_3_9ea6803a94b1de15079a3fa20d59c9af._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_3_9ea6803a94b1de15079a3fa20d59c9af._comment new file mode 100644 index 000000000..f2c4fd77e --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_3_9ea6803a94b1de15079a3fa20d59c9af._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-11-26T20:51:59Z" + content=""" +The problem you reported *is* solved. You were not talking about syncing before. + +If your setup is such that `git commit` takes a long time to run, then `git annex sync` is also necessarily going to take a long time to run. +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment new file mode 100644 index 000000000..e9b7655cf --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 4" + date="2013-11-26T20:55:39Z" + content=""" +Thanks for your answer. On the second part of my problem, *why* should `git commit` be slow? It's only committing a file with a line (../.git/annex/...), isn't it? +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_5_57a5b73cff480266355e75c7bdc762c2._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_5_57a5b73cff480266355e75c7bdc762c2._comment new file mode 100644 index 000000000..51e31d9b4 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_5_57a5b73cff480266355e75c7bdc762c2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 5" + date="2013-11-26T21:02:17Z" + content=""" +Err, I read my post again, and I definitely *was* talking about syncing ;-) +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_6_bbcf5e863c8f152e1079536e9011a404._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_6_bbcf5e863c8f152e1079536e9011a404._comment new file mode 100644 index 000000000..4640a91bf --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_6_bbcf5e863c8f152e1079536e9011a404._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 6" + date="2013-11-26T21:04:44Z" + content=""" +I think the most likely reason for git commit to be slow on your setup is that it probably rewrites .git/index. If you have a lot of files in your repository, the index file will be large and rewriting the index file will involve re-transferring it all over the network to the SMB share. + +It's also possible that git commit scans the whole work tree, although I don't think it should -- it's not been told to with -a. + +You may be able to find what's taking a long time by + + strace git --git-dir=/Volumes/Video/Videos/.git --work-tree=/Volumes/Video/Videos -c core.bare=false commit -m \"git-annex automatic sync\" + +(or ltrace) +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_7_fdcd144c22601bdf98ff844254b0120d._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_7_fdcd144c22601bdf98ff844254b0120d._comment new file mode 100644 index 000000000..033a1af45 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_7_fdcd144c22601bdf98ff844254b0120d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 7" + date="2013-11-26T21:07:12Z" + content=""" +If you kept your git repository on your local disk, and used a [[directory special remote|special_remotes/directory]] on the SMB share, you could then `git annex copy --to smbshare` and `git annex get --from smbshare` as desired, which would probably be much more efficient. +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_8_b77243e765b2af7ba71e963fcb5cbbb1._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_8_b77243e765b2af7ba71e963fcb5cbbb1._comment new file mode 100644 index 000000000..273b9d8e9 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_8_b77243e765b2af7ba71e963fcb5cbbb1._comment @@ -0,0 +1,71 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 8" + date="2013-11-26T21:17:38Z" + content=""" +Thanks again for your answers. + +`.git/index` is only 30Ko big. It shouldn't be an issue, even through the network. + +However, I ran `lsof`, and strangely it lock the big file I added before (`/Volumes/Video/Videos/Films/MyFamily.mkv`) + + COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME + git 68047 3singes cwd DIR 46,7 16384 5152641528667254045 /Volumes/Video/Videos + git 68047 3singes txt REG 1,4 3035984 77501447 /Applications/git-annex.app/Contents/MacOS/bundle/git + git 68047 3singes txt REG 46,7 8632 9219631544499731818 /Volumes/Video/Videos/.git/objects/pack/pack-99901c82bacfa26c04f505ceb27c4af9ccda414f.idx + git 68047 3singes txt REG 1,4 403392 77501680 /Applications/git-annex.app/Contents/MacOS/bundle/usr/lib/libpcre.0.dylib + git 68047 3singes txt REG 46,7 4012 8204150806531008435 /Volumes/Video/Videos/.git/objects/pack/pack-bb60a2315b13bda720682a4213507e5ee9ba029f.idx + git 68047 3singes txt REG 46,7 15969 12003107822997399035 /Volumes/Video/Videos/.git/objects/pack/pack-bb60a2315b13bda720682a4213507e5ee9ba029f.pack + git 68047 3singes txt REG 1,4 169392 77501683 /Applications/git-annex.app/Contents/MacOS/bundle/usr/lib/libz.1.dylib + git 68047 3singes txt REG 1,4 2088992 77501673 /Applications/git-annex.app/Contents/MacOS/bundle/usr/lib/libiconv.2.dylib + git 68047 3singes txt REG 1,4 600832 72809225 /usr/lib/dyld + git 68047 3singes txt REG 1,4 342937194 75930310 /private/var/db/dyld/dyld_shared_cache_x86_64 + git 68047 3singes 0u CHR 16,10 0t718314 2413 /dev/ttys010 + git 68047 3singes 1w CHR 3,2 0t0 308 /dev/null + git 68047 3singes 2w CHR 3,2 0t0 308 /dev/null + git 68047 3singes 3u REG 46,7 0 17793593705208135594 /Volumes/Video/Videos/.git/index.lock + git 68047 3singes 4r REG 46,7 15581987050 12221620371912261305 /Volumes/Video/Videos/Films/MyFamily.mkv + git 68047 3singes 8w CHR 3,2 0t0 308 /dev/null + +I'm using MacOSX, so I can only use `dtrace`, which I don't know so much. + +**The process is over, after 1H30:** + + ok + [2013-11-26 22:13:48 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"symbolic-ref\",\"HEAD\"] + [2013-11-26 22:13:48 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"refs/heads/annex/direct/master\"] + [2013-11-26 22:13:48 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/heads/synced/master\"] + [2013-11-26 22:13:49 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/annex/direct/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"] + pull macbookpro + [2013-11-26 22:13:49 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"fetch\",\"macbookpro\"] + From /Users/3singes/Movies/NE PAS SAUVEGARDER/Videos + b2146cf..c2cf748 git-annex -> macbookpro/git-annex + [2013-11-26 22:13:50 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/macbookpro/annex/direct/master\"] + [2013-11-26 22:13:50 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/macbookpro/synced/master\"] + [2013-11-26 22:13:50 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/synced/master..refs/remotes/macbookpro/synced/master\",\"--oneline\",\"-n1\"] + ok + [2013-11-26 22:13:50 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"git-annex\"] + [2013-11-26 22:13:50 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-11-26 22:13:50 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..293332232ca4e7428090171b52dcc5b3b80d1df6\",\"--oneline\",\"-n1\"] + [2013-11-26 22:13:51 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..b2146cf0abc7d6a7e5c79d3b133181b56cd77461\",\"--oneline\",\"-n1\"] + [2013-11-26 22:13:51 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/heads/git-annex..c2cf7488b4745d4168491d8e62f5bdc354869133\",\"--oneline\",\"-n1\"] + [2013-11-26 22:13:51 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"synced/master\"] + [2013-11-26 22:13:51 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"branch\",\"-f\",\"master\"] + [2013-11-26 22:13:51 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/macbookpro/synced/master\"] + [2013-11-26 22:13:51 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/remotes/macbookpro/synced/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"] + [2013-11-26 22:13:51 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/macbookpro/git-annex\"] + [2013-11-26 22:13:51 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"log\",\"refs/remotes/macbookpro/git-annex..git-annex\",\"--oneline\",\"-n1\"] + push macbookpro + [2013-11-26 22:13:52 CET] call: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"push\",\"macbookpro\",\"+git-annex:synced/git-annex\",\"annex/direct/master:synced/master\"] + Counting objects: 9, done. + Delta compression using up to 8 threads. + Compressing objects: 100% (4/4), done. + Writing objects: 100% (5/5), 440 bytes | 0 bytes/s, done. + Total 5 (delta 3), reused 0 (delta 0) + To /Users/3singes/Movies/NE PAS SAUVEGARDER/Videos + c2cf748..2933322 git-annex -> synced/git-annex + [2013-11-26 22:13:57 CET] read: git [\"--git-dir=/Volumes/Video/Videos/.git\",\"--work-tree=/Volumes/Video/Videos\",\"-c\",\"core.bare=false\",\"push\",\"macbookpro\",\"master\"] + ok + +"""]] diff --git a/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_9_cb0815e96ee211d4778f2e7a4274e855._comment b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_9_cb0815e96ee211d4778f2e7a4274e855._comment new file mode 100644 index 000000000..041f3c547 --- /dev/null +++ b/doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_9_cb0815e96ee211d4778f2e7a4274e855._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 9" + date="2013-11-26T21:19:42Z" + content=""" +I thought to a directory special remote, but it doesn't meet my needs: the SMB drive is used by a MediaCenter, so I need the working tree. +"""]] diff --git a/doc/forum/Add_a___34__local__34___remote.mdwn b/doc/forum/Add_a___34__local__34___remote.mdwn new file mode 100644 index 000000000..c35a637a8 --- /dev/null +++ b/doc/forum/Add_a___34__local__34___remote.mdwn @@ -0,0 +1,13 @@ +I have been playing around with annex assistent today (way late as I am one of the Kickstarter backers) and found the following puzzling. + +I am running a fairly new version, my package manager calls it 4.20130323 (git-annex does not seem to have a --version switch). + +I have been playing around with the annex assistent webapp today and have the following questions/observations: + +1) The "remote" server creates a bare git repository as far as I can tell, the "local computer" probably does the right thing (but I cannot run it as the "other box" has no X or browser). Is there any way to remotely create a "local" copy (i.e. non-bare git repository, which can later be managed by the cli?) +2) It seems like git-annex-assistent (webapp) binds to localhost, is it possible to let it bind to either a specific ip-address (or all)? (Yes, I understand the security implications, but the use-case is the box from question 2 - i.e. on local network but no X and no browser). +3) what is being launched when I hit "files", on the video it starts a file-manager on my box nothing happens (and no errors as far as I can tell). + +Thank you in advance + +Svenne diff --git a/doc/forum/Add_a___34__local__34___remote/comment_1_c68ad724b465c4be5243be687168c0b3._comment b/doc/forum/Add_a___34__local__34___remote/comment_1_c68ad724b465c4be5243be687168c0b3._comment new file mode 100644 index 000000000..251e89e03 --- /dev/null +++ b/doc/forum/Add_a___34__local__34___remote/comment_1_c68ad724b465c4be5243be687168c0b3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-08T19:11:33Z" + content=""" +1. If you want to use the cli for managing the repository, why not `git clone` it using the cli as well? Set up a remote in your existing repository pointing at the repository you cloned, and the assistant will push changes to it. This is all that the webapp would do when creating the repository. The webapp does not set up remote non-bare repositories because unless the user is comfortable with the cli, nothing is going to keep them up-to-date. + +2. Setting up the assistant on a headless box is something I need to support better, indeed. I've just now made `git annex webapp --listen=IP` listen on the specified IP address, and output the URL you can connect to from the remote side. Note that this does not yet use HTTPS, so use with caution. + +3. It uses the `xdg-open` program to open a file manager. If `xdg-open` was not in your PATH, it would instead point the web browser at a file:/// URI as a fallback. If it seems to do nothing, this probably means `xdg-open` is in PATH but not working for some reason. Try running `xdg-open /path/to/your/repository` +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn b/doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn new file mode 100644 index 000000000..af138c101 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn @@ -0,0 +1,16 @@ +Hello, + +I am just starting to learn git-annex so forgive me if this is a naive question. + +I have the following repositories: + +1. Home (laptop) +2. Work (mac mini) +3. S3 bucket +4. USB drive, full backup, attached to Home laptop. + +I want to sync files between Home and Work via the S3 bucket. It is not clear to me how to accomplish this through the git-annex assistant. Is this possible? Are there instructions online? + +Thanks in advance! + +Scott diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment new file mode 100644 index 000000000..d68af19f9 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://marco.paga.myopenid.com/" + ip="2001:4dd0:ff00:917b:d575:780:2c27:d982" + subject="Yes, it is possible" + date="2013-08-19T17:59:56Z" + content=""" +You can sync both repos. The simplest way is to have both clients signed on to jabber. This way the clients exchange information when the two are online. + +Additionally you need to have a cloud special remote available on both ends. The cloud repository is needed to push and retrieve data for the clients. You need to configure the cloud as a transfer reposity. The clients as - what else - client. The USB Drive can be used as a backup repository on one or both ends and perhaps even for syncing very large files around. +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment new file mode 100644 index 000000000..9e1d27af4 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://marco.paga.myopenid.com/" + ip="2001:4dd0:ff00:917b:d575:780:2c27:d982" + subject="I forgot to mention" + date="2013-08-19T18:01:47Z" + content=""" +You might want to have a look at this: https://git-annex.branchable.com/assistant/remote_sharing_walkthrough/ +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_3_c3878989f74e740c0ed42f440750f3a4._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_3_c3878989f74e740c0ed42f440750f3a4._comment new file mode 100644 index 000000000..9925f8274 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_3_c3878989f74e740c0ed42f440750f3a4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjQhXk8KAh9yD0p1R6QzT-Sw7FtHE3d54" + nickname="Scott" + subject="comment 3" + date="2013-08-19T18:03:41Z" + content=""" +Great thanks! I'll try it out tonight and report back. +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment new file mode 100644 index 000000000..5e1a39713 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjQhXk8KAh9yD0p1R6QzT-Sw7FtHE3d54" + nickname="Scott" + subject="comment 4" + date="2013-08-20T16:18:24Z" + content=""" +When I try to setup my Jabber client, using my gmail address, the assistant crashes. I thought this might be due to having two-factor authentication enabled so I generated an application specific password and tried that. The assistant still crashes. The log is huge, I am not sure what would be relevant to show here. +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_5_0a1c2dd0929511ff824be8de2c8d85eb._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_5_0a1c2dd0929511ff824be8de2c8d85eb._comment new file mode 100644 index 000000000..2c4927b19 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_5_0a1c2dd0929511ff824be8de2c8d85eb._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://marco.paga.myopenid.com/" + ip="2001:4dd0:ff00:917b:f87b:5579:3820:5db" + subject="Please post the log" + date="2013-08-21T15:49:00Z" + content=""" +I don't know what is going wrong. It is not a bad idea to post the log information. + +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_6_1444c2f89885f028f20a4d3ce225a403._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_6_1444c2f89885f028f20a4d3ce225a403._comment new file mode 100644 index 000000000..21c3d80e3 --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_6_1444c2f89885f028f20a4d3ce225a403._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjQhXk8KAh9yD0p1R6QzT-Sw7FtHE3d54" + nickname="Scott" + subject="comment 6" + date="2013-08-21T20:05:31Z" + content=""" +I tried a different approach and attempted to setup s3 at the command line. This is what I did: + +zombie:annex scott$ export AWS_ACCESS_KEY_ID=\"my key\" +zombie:annex scott$ export AWS_SECRET_ACCESS_KEY=\"my secret key\" +zombie:annex scott$ git annex initremote S3 type=S3 encryption=shared +[2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"show-ref\",\"git-annex\"] +[2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"log\",\"refs/heads/git-annex..da801570f9ed8d28e5a0cea6cc51f1a2003317d6\",\"--oneline\",\"-n1\"] +[2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"log\",\"refs/heads/git-annex..8015f3fed32792b558d16008d20816fab0fc50c2\",\"--oneline\",\"-n1\"] +[2013-08-21 13:03:42 PDT] chat: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"cat-file\",\"--batch\"] +[2013-08-21 13:03:42 PDT] read: git [\"config\",\"--null\",\"--list\"] +initremote S3 (encryption setup) [2013-08-21 13:03:42 PDT] read: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"] +(shared cipher) (checking bucket...) +git-annex: connect: does not exist (Connection refused) +failed +git-annex: initremote: 1 failed +"""]] diff --git a/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_7_1c30944010d541096baff18198a5560d._comment b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_7_1c30944010d541096baff18198a5560d._comment new file mode 100644 index 000000000..7e05bf59a --- /dev/null +++ b/doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_7_1c30944010d541096baff18198a5560d._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjQhXk8KAh9yD0p1R6QzT-Sw7FtHE3d54" + nickname="Scott" + subject="comment 7" + date="2013-08-21T20:07:58Z" + content=""" +Sorry that didnt format properly + + zombie:annex scott$ export AWS_ACCESS_KEY_ID=\"key\" + zombie:annex scott$ export AWS_SECRET_ACCESS_KEY=\"secret\" + zombie:annex scott$ git annex initremote S3 type=S3 encryption=shared + [2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"show-ref\",\"git-annex\"] + [2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"log\",\"refs/heads/git-annex..da801570f9ed8d28e5a0cea6cc51f1a2003317d6\",\"--oneline\",\"-n1\"] + [2013-08-21 13:03:42 PDT] read: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"log\",\"refs/heads/git-annex..8015f3fed32792b558d16008d20816fab0fc50c2\",\"--oneline\",\"-n1\" ] + [2013-08-21 13:03:42 PDT] chat: git [\"--git-dir=/Network/Servers/filer004/vol/office_homes/scott/annex/.git\",\"--work-tree=/Network/Servers/filer004/vol/office_homes/scott/annex\",\"cat-file\",\"--batch\"] + [2013-08-21 13:03:42 PDT] read: git [\"config\",\"--null\",\"--list\"] + initremote S3 (encryption setup) [2013-08-21 13:03:42 PDT] read: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"] + (shared cipher) (checking bucket...) + git-annex: connect: does not exist (Connection refused) + failed + git-annex: initremote: 1 failed +"""]] diff --git a/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook.mdwn b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook.mdwn new file mode 100644 index 000000000..459e73838 --- /dev/null +++ b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook.mdwn @@ -0,0 +1,21 @@ +I need some advice from more experienced users. + +I've created four repositories on my macbook and paired them with repos on my ubuntu desktop. They are all created with the webapp so they might have some configurations that are not optimal for me. + +In fact, when I start my macbook it is unusual for more than an hour because git-annex is reading and writing to and from the disk in the background. + +I don't change much in three of the four repos, only one repo contains my daily work. + +What configuration would enhance my situation? + +The four repos are called: + +- movies +- pictures +- music +- documents (many changes each day) + +I have also problems to switch to the documents repo in the webapp. + +TIA +juh diff --git a/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_1_af8ab0a47cd379fcb1445e50782ad086._comment b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_1_af8ab0a47cd379fcb1445e50782ad086._comment new file mode 100644 index 000000000..a7cb701b6 --- /dev/null +++ b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_1_af8ab0a47cd379fcb1445e50782ad086._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTIL7ubr5opWM69Q5VtCxuxC2H0SSnzic" + nickname="Petr" + subject="Where are your repositories located?" + date="2014-01-14T08:58:31Z" + content=""" +First - Where are the repos actually located ~/Desktop or ~/annex/? Other? + +I can confirm, that like two weeks back I have had similar issue using git-annex-assistant with other synced repos on local LAN and at Box.com. The git-annex processes actually overloaded the CPU and I was forced to kill annex processes to get over. + +I also found myself that NFS mounted shares, linked by symlink to home directory, can slowdown mac finder app as well if NFS has slight delays in response. +"""]] diff --git a/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_2_a7202bcbdda36a3801833d2432db1965._comment b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_2_a7202bcbdda36a3801833d2432db1965._comment new file mode 100644 index 000000000..478d2804f --- /dev/null +++ b/doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_2_a7202bcbdda36a3801833d2432db1965._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 2" + date="2014-01-14T10:23:21Z" + content=""" +All repositories are located in my home folders: +~/Pictures +~/Movies +~/Music +~/Documents + +On my Ubuntu desktop machine and my macbook. They are connected in my local network via WLAN. + +I use different git annex versions on these two machines. Maybe this causes problems. + +On Ubuntu I have +Version: 4.20130815 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +On my macbook: +Version: 5-20140106-gcb3351b + +juh +"""]] diff --git a/doc/forum/Android:_Encrypted_Remotes__63__.mdwn b/doc/forum/Android:_Encrypted_Remotes__63__.mdwn new file mode 100644 index 000000000..b8342392f --- /dev/null +++ b/doc/forum/Android:_Encrypted_Remotes__63__.mdwn @@ -0,0 +1,3 @@ +Hi, + +Does the Android app support encryption at all? The assistant allows me to create encrypted repositories but it just keeps telling me to install git-remote-gcrypt, which did not work. diff --git a/doc/forum/Android:_Encrypted_Remotes__63__/comment_1_6b16cd372a9bd4f99d4c8b09a82ce3ed._comment b/doc/forum/Android:_Encrypted_Remotes__63__/comment_1_6b16cd372a9bd4f99d4c8b09a82ce3ed._comment new file mode 100644 index 000000000..3edcc5f90 --- /dev/null +++ b/doc/forum/Android:_Encrypted_Remotes__63__/comment_1_6b16cd372a9bd4f99d4c8b09a82ce3ed._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-03T19:14:37Z" + content=""" +Encrypted [[special_remotes]] are supported just fine on Android. + +As for storing the [[encrypted git repository itself on a remote|special_remotes/gcrypt]], which is what git-remote-gcrypt is used for, it would need porting that to Android. I don't think that should be very hard (it's just a rather complicated shell script and all the tools it uses are already included in the git-annex bundle). I may eventully end up reimplementing git-remote-gcrypt as part of git-annex in Haskell, since porting it to eg, Windows is likely to be a lot harder.. +"""]] diff --git a/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn new file mode 100644 index 000000000..0392dbb38 --- /dev/null +++ b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn @@ -0,0 +1,3 @@ +While running the Git Annex App on Android, the app causes a constant cpu usage of about 50% when idling. I've seen this behavior on two devices (phone and tablet) with a CM 10.1 nightly build. The app causes this high cpu usage even when it is in the background, not performing any synchronization and managing only one repository containing just one file. Unfortunately I couldn't figure out what causes the cpu usage. The daemon.log file remains unchanged and I couldn't find any other log files. + +Is this expected behavior or unusual high cpu usage? diff --git a/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment new file mode 100644 index 000000000..28f3dfb92 --- /dev/null +++ b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmKKg3Vmzk7KwRGRKjHVdtyoj1JfxLX6NM" + nickname="Tom" + subject="comment 1" + date="2013-10-01T17:38:03Z" + content=""" +I've had this issue as well. Saw a comment on Joey's blog that implies he knows about it and that a fix will be released soon. +"""]] diff --git a/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_2_840fbce18b4fdec21ee557fdf52c366e._comment b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_2_840fbce18b4fdec21ee557fdf52c366e._comment new file mode 100644 index 000000000..eaf42c9e2 --- /dev/null +++ b/doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_2_840fbce18b4fdec21ee557fdf52c366e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 2" + date="2013-10-16T16:57:02Z" + content=""" +This was fixed. + +(Please file bug reports for bugs in the future, so they don't clutter up this forum once fixed.) +"""]] diff --git a/doc/forum/Android_-_ext3__47__4__47__....mdwn b/doc/forum/Android_-_ext3__47__4__47__....mdwn new file mode 100644 index 000000000..5227228a9 --- /dev/null +++ b/doc/forum/Android_-_ext3__47__4__47__....mdwn @@ -0,0 +1 @@ +Is there a good way to use a ext4 formated external sdcard on a rooted android with symlinks. If android mounts it (with the sdcard command i think) symlinks don't work. If i mount it with mount the permissions are a problem because every app has a different user. diff --git a/doc/forum/Android_version_does_not_sync.mdwn b/doc/forum/Android_version_does_not_sync.mdwn new file mode 100644 index 000000000..4c2d288be --- /dev/null +++ b/doc/forum/Android_version_does_not_sync.mdwn @@ -0,0 +1,23 @@ +Hey! + +I have got a Kindle Fire HD (2nd generation) and want to use Git Annex to sync my data round. However, it does not sync my data at all (my other setups, e.g. PC or laptop do work quite well). The reason for that seems to be quite simple, but I do not know how to fix that: + +I always get the warning message: + +> TransferScanner crashed: /storage/emulated/legacy/annex/.git/index: copyFile: does not exist (No such file or directory). + +I found the same error in the log: + +> git-annex: /storage/emulated/legacy/annex/.git/index: copyFile: does not exist (No such file or directory) +> ... +> fatal: Run with no arguments or with -c cmd +> git-annex-shell: git-shell failed + +I am using the latest versions for android and arm (server, raspberry pi) from this site from today (13.07.2014) + +http://git-annex.branchable.com/install/ + +I hope somebody can help me. I tried restaring the TransferScanner, restarting git-annex, restarting the OS, resetting the OS (to shipping defaults), nothing helped. + +Cheers, +Stephan diff --git a/doc/forum/Android_version_does_not_sync/comment_1_ed9e33eef2c6d651847dca9d3f7a63f6._comment b/doc/forum/Android_version_does_not_sync/comment_1_ed9e33eef2c6d651847dca9d3f7a63f6._comment new file mode 100644 index 000000000..589b230c3 --- /dev/null +++ b/doc/forum/Android_version_does_not_sync/comment_1_ed9e33eef2c6d651847dca9d3f7a63f6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="sts" + ip="134.147.119.104" + subject="comment 1" + date="2014-07-14T09:12:13Z" + content=""" +Ok, I checked and the index file was missing and not sure why, but I had to manually sync one time. So I had to go in the annex folder with the command line and make a \"git annex sync\". It works pretty well now, it seems not to automatically sync my data (have to force it with \"Sync Now\"), but at least I can sync data to my tablet and thats awesome :). +"""]] diff --git a/doc/forum/Android_version_does_not_sync/comment_2_4eafd3e989611f835c489b379bd6ec8a._comment b/doc/forum/Android_version_does_not_sync/comment_2_4eafd3e989611f835c489b379bd6ec8a._comment new file mode 100644 index 000000000..bf2b41263 --- /dev/null +++ b/doc/forum/Android_version_does_not_sync/comment_2_4eafd3e989611f835c489b379bd6ec8a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-14T18:21:15Z" + content=""" +How did you create this repository on the android device? Normally a git repository has an index file, unless it has just been manually created with `git init` and has not yet had anything added to it. When the webapp is used to create a repository, it should always leave it with an index file already present. +"""]] diff --git a/doc/forum/Annex_contents_just_disappeared__63__.mdwn b/doc/forum/Annex_contents_just_disappeared__63__.mdwn new file mode 100644 index 000000000..d18e2bf91 --- /dev/null +++ b/doc/forum/Annex_contents_just_disappeared__63__.mdwn @@ -0,0 +1,12 @@ +Joey, + +I have git-annex now to manage many of the repositories on my system. I have them both on my local machine, and on a very large file server, and a backup system on the Internet. + +Today I went to look at a file in one of my annexes and it wasn't there. This really surprised me. But what surprised me most is that around 90% of the files in *all* of my annexes on both my local system and my file server are completely missing. Only the Internet backup system has them. + +How could something like this happen, when I haven't been interacting with these annexes at all during this time? Can you think of any scenario that might lead to this? This is pretty much the absolute worst case scenario for an archival data system. + +I am running on Mac OS X 10.8, using GHC 7.6.3 to build git-annex, and I keep my git-annex binary updated often. + +Thanks, + John diff --git a/doc/forum/Annex_contents_just_disappeared__63__/comment_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment b/doc/forum/Annex_contents_just_disappeared__63__/comment_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment new file mode 100644 index 000000000..fe4edbc27 --- /dev/null +++ b/doc/forum/Annex_contents_just_disappeared__63__/comment_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 1" + date="2013-08-23T03:06:00Z" + content=""" +Wait, I think this comes from a backend switch. I changed my .gitattributes file at one point to read: + +* annex.backend=SHA512E annex.numcopies=2 + +I thought this would just affect new files, not existing annexed content. Could this do it? +"""]] diff --git a/doc/forum/Annex_contents_just_disappeared__63__/comment_2_657f737c5d64d440aa133ddb41408fbc._comment b/doc/forum/Annex_contents_just_disappeared__63__/comment_2_657f737c5d64d440aa133ddb41408fbc._comment new file mode 100644 index 000000000..e30ff02ca --- /dev/null +++ b/doc/forum/Annex_contents_just_disappeared__63__/comment_2_657f737c5d64d440aa133ddb41408fbc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-08-23T03:14:15Z" + content=""" +Yes, that was the problem, sorry to bother you. None of my data is gone, it's just sitting there under unknown names. I can roll back to when it knew the names, and migrate them forward. +"""]] diff --git a/doc/forum/Annex_contents_just_disappeared__63__/comment_3_9b4c35feb14b37d43d053d7430da9abf._comment b/doc/forum/Annex_contents_just_disappeared__63__/comment_3_9b4c35feb14b37d43d053d7430da9abf._comment new file mode 100644 index 000000000..6c40a1cac --- /dev/null +++ b/doc/forum/Annex_contents_just_disappeared__63__/comment_3_9b4c35feb14b37d43d053d7430da9abf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 3" + date="2013-08-23T04:28:45Z" + content=""" +If you change the backend, and then in one repository you run `git annex migrate`, other repositories that have the old keys will not know about the new names. For this reason, then multiple repositories have the files, it's best to run it redundantly in each repository. + +TBH, migration is a bit of a PITA because of this. Best to aovid it in most cases. + +Git-annex will never perform a migration begind your back. You must have run `git annex migrate` at some point. You can check the git history for details. +"""]] diff --git a/doc/forum/Annex_contents_just_disappeared__63__/comment_4_c3625409652bff5f2165260803269a8a._comment b/doc/forum/Annex_contents_just_disappeared__63__/comment_4_c3625409652bff5f2165260803269a8a._comment new file mode 100644 index 000000000..236f8cfde --- /dev/null +++ b/doc/forum/Annex_contents_just_disappeared__63__/comment_4_c3625409652bff5f2165260803269a8a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 4" + date="2013-08-30T06:06:16Z" + content=""" +Just to confirm, this wasn't a git-annex problem at all, but just a misstep during migration as you suggested. + +I think what I'm going to do now is to just wipe the slate clean and start over again, by using `unannex -fast` on all the files, wiping `.git`, and then adding everything back in using my new default backend of SHA512E. The bigger pain is doing the same thing on all the servers where I have this data (to avoid having to upload it again), but in such a way that I'm not replicating file history. I think I should be able to just clone, `mv $OLDREPO/.git/annex/objects objects`, `git annex add objects`, `git rm -r --cached objects`, and then everything should be good without even needing a new commit on the remote machine, just a git-annex sync. +"""]] diff --git a/doc/forum/Annex_dropping_files.mdwn b/doc/forum/Annex_dropping_files.mdwn new file mode 100644 index 000000000..7ec19caa1 --- /dev/null +++ b/doc/forum/Annex_dropping_files.mdwn @@ -0,0 +1,12 @@ +It seems like one of my repos dropped files by itself, my setup involved 3 distributed repos (non bare repos, not using assistant), A/B/C then one client died I've created another one in its place called D cloned from B and marked C as dead. I have now A/B/D. I have updated files in A synced it to D (central) I then tried dropping unused, it listed none (I've dropped the files from A which has full copy) at this point I thought B did not sync to it maybe thats why it did not drop them. I went home sync my laptop B (B dropped its share of unused files) but cental D still show no unused. + +A-D has full copies of the repo +B has partial. + +At this point I checked out a old commit from a week ago, checked where the links for the files are pointing to, they point to no where files are not there. Repo sized reported with du -hcs show both repos are the same size (132GB) looks like D managed to drop unused files by itself. I am wondering what caused this? + +My annex version is, + +git-annex version: 4.20130902-g307537a + +on all clients. diff --git a/doc/forum/Annex_dropping_files/comment_1_62fbea95248fda2ff075b5a8952a728f._comment b/doc/forum/Annex_dropping_files/comment_1_62fbea95248fda2ff075b5a8952a728f._comment new file mode 100644 index 000000000..3844d3f0d --- /dev/null +++ b/doc/forum/Annex_dropping_files/comment_1_62fbea95248fda2ff075b5a8952a728f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T21:01:03Z" + content=""" +If you have just created repository D and have just copied some files to it, then it will only contain those files, and not old deleted files or old versions of files. You can run `git annex copy --all --to D` to copy all those files to D, although if you're only wanting to dropunused them, there is not much point in that.. +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode.mdwn b/doc/forum/Annex_slow_on_Windows__47__direct_mode.mdwn new file mode 100644 index 000000000..57247ac5d --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode.mdwn @@ -0,0 +1,11 @@ +I've been using annex for some weeks now and while I more and more love how it behaves on my Linux machines, I just can't get it working on Windows... + +The setup consists of two Ubuntu machines (one being an always-on server) and a Windows laptop I keep for the occasional moment of gaming. My wife's Windows machine is a candidate to join the annex setup, as well as some other computers I still use every now and then. + +The first thing I started annexing was my pictures folder. It consists of about 40k files and occupies about 350GB. The Ubuntu server is running a hidden service as a substitute for a DynDNS with ssh basically the only thing going out/in. First, I couldn't get annex to properly sync its data via TOR, but when I instead set up a directory special remote on the server (with the annex repository there being "bare", i.e. not containing any actual data) I got them to sync as they should. + +Not the Windows machine though. It's just too slow. It seems that on every sync, every add, every anything it scans... well, everything. I added some files and after an hour I checked the resource monitor which files were being accessed and it seemed to be every last one of the files present in the pictures folder. I'm not sure what's going on there, but it's really getting to the point of being a dealbreaker... I think it's something with annex only supporting direct mode repositories on Windows and all files just lying around (as that's really the only large difference between those setups), although I'm of course not entirely sure. + +I'd really like to run annex in indirect mode on Windows. I can't really find any information on that (except those few "official" pages that just state that annex is running in direct mode on Windows). I know that creating symlinks needs elevated priviledges on Windows, but accepting a prompt seems to be much more realistic than waiting hours for a sync. + +So... Is there any way to get indirect running on Windows? And if there isn't, is there any other way to speed up direct mode / Windows performance? diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_1_d80839f4582fc2a6269db31e30e1dbab._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_1_d80839f4582fc2a6269db31e30e1dbab._comment new file mode 100644 index 000000000..c68c72738 --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_1_d80839f4582fc2a6269db31e30e1dbab._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="Same boat" + date="2014-07-03T19:38:15Z" + content=""" +I'd love to know this too. I'm setting up on 2 Windows 8.1 machines (with a 3rd Windows 7 hopefully joining the party as well as a couple of Linux boxes) but doing anything is really slow. I just ran git annex status on a 50GB, 7000 file Music repo and it took 6 minutes. I've not even setup the remotes yet but as soon as I'd added and sync'd, things slowed down. I'm running on a nippy SSD and CPU usage is around 12%. + +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_2_593e1e01b70a2b6a15ad6bca09a80c7b._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_2_593e1e01b70a2b6a15ad6bca09a80c7b._comment new file mode 100644 index 000000000..0e357f4d6 --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_2_593e1e01b70a2b6a15ad6bca09a80c7b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnOSgFb3l7nL3Fs7Y9gPGJJjFiV7aJ1tek" + nickname="Phil" + subject="comment 2" + date="2014-07-03T19:39:12Z" + content=""" +Fortunately, git annex sync is pretty quick +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_3_c4e4c596f31aa97645fe1e1527dc2c31._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_3_c4e4c596f31aa97645fe1e1527dc2c31._comment new file mode 100644 index 000000000..a97ccda2e --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_3_c4e4c596f31aa97645fe1e1527dc2c31._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 3" + date="2014-07-04T20:57:54Z" + content=""" +Yall need to tell me your git-annex versions. [[devblog/day_183__rubbing_sticks_together]] fixed a horrible slowdown that indeed causes git-annex on windows to unnecessarily look at lots of files. + +Also, is this using the git-annex assistant, or using git-annex at the command line that's being slow? + +As to using symlinks on windows, cygwin's build of git is able to handle them somehow. I have not tried to get it working with git-annex, but it seems at least possible that indirect mode could be accomplished that way. +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_4_92db0b99ada9af15a5383da41397ebd7._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_4_92db0b99ada9af15a5383da41397ebd7._comment new file mode 100644 index 000000000..39e472606 --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_4_92db0b99ada9af15a5383da41397ebd7._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.172.69" + subject="Also in the same boat" + date="2014-07-07T01:12:18Z" + content=""" +Even worse here. git-annex looked (and still looks) so promising for exactly I want (share >100GB photos/data with my girlfriend which are on my private DSL connected server but each of us should only download whatever he currently needs for offline usage and everything should stay consistent, e.g. is one edits, adds or deletes files). However, after long testing in Windows I gave up. I had so many issues and speed was one of them. So I looked again at other solutions (ownCloud pydio) but they are not good either. unison is one thing that just works perfectly but it is not suited to sync huge stuff where just parts are available on one machine. + +I still put much hope in git-annex that it's useable at some point also in Windows. If there would be another of these kickstarters for that, I'd be in. + +One BIG dealbreaker for me is SSH. It popped up a couple of times already there is inconsistency between ssh.exe, plink.exe and %GIT_SSH%. +But the biggest issue is that ssh.exe in Windows does not do connection sharing: For each single file a new SSH session is created! That way it works only for huge files (movies) where the overhead is small. In my tests I had smaller files, that's just unuseable. + +I know it's a conundrum. unison just leaves one ssh connection open, that would be nice. I know however that this requires bigger changes. But what about for example starting something in background (during a git-annex command) that leaves the SSH session open and pumps data via some IPC? + +Last but not least: links. I agree windows links are unuseable. But would it really be real links? What about just basic *.lnk files? + + +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_5_3d628c9db9ebdfd5bff92af105c47719._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_5_3d628c9db9ebdfd5bff92af105c47719._comment new file mode 100644 index 000000000..9b7b166b3 --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_5_3d628c9db9ebdfd5bff92af105c47719._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.172.69" + subject="comment 5" + date="2014-07-07T01:16:21Z" + content=""" +One more thing: integration in TortoiseGit would be sooooooooo great! You would then even be able to let novice computer users use git-annex. + +I added a feature request long time ago but it's on hold: http://code.google.com/p/tortoisegit/issues/detail?id=2166 + +I do hope that git-annex becomes more popular to increase the chance that it will be built into that... + +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_6_db7965fa928c093233769ed52b2fcd43._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_6_db7965fa928c093233769ed52b2fcd43._comment new file mode 100644 index 000000000..90b6094fa --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_6_db7965fa928c093233769ed52b2fcd43._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Idhup" + ip="178.175.139.138" + subject="Connection sharing workaround" + date="2014-07-07T10:20:23Z" + content=""" +I had the same issues but was able to work around most of them. I simply created keypairs on my Windows machines that allowed me to log in to my Ubuntu server. Means that while the overhead does make it smaller (I guess), the whole sync process can simply be run in the background without me having to check for a password prompt for 30 minutes, just to miss the short period during which I can enter it. Also, the actual object storage was moved to a directory special remote on the server, so Windows clients can simply automount a samba share and push the content over that line, which is less of a hazzle. + +Also, the speed issue got *much* better when I added all files. I still had a lot of files just lying around on my Windows machine. Once I added them all, the sync process sped up by several magnitudes. So, if https://git-annex.branchable.com/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/ can be solved, I guess I'm happy on Windows. +"""]] diff --git a/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_7_674f52c5e5484207db403b18efc986c6._comment b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_7_674f52c5e5484207db403b18efc986c6._comment new file mode 100644 index 000000000..2b87a11e0 --- /dev/null +++ b/doc/forum/Annex_slow_on_Windows__47__direct_mode/comment_7_674f52c5e5484207db403b18efc986c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Idhup" + ip="178.175.139.138" + subject="typo" + date="2014-07-07T10:23:23Z" + content=""" +Slower. It's not smaller, it's slower. Gee. +"""]] diff --git a/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__.mdwn b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__.mdwn new file mode 100644 index 000000000..425301a0d --- /dev/null +++ b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__.mdwn @@ -0,0 +1,9 @@ +I'm trying to use git-annex as a way to sync fairly large folders between machines. These folders contain documents, projects, ... + +There are several issues with files that just won't get added to my git-annex repository: + +- files mentioned in .gitignore are not added -- this is good. +- files starting with a dot are not added unless I explicitly mention them to git add -- this is strange, but I can work around it. +- folders called .git/ are not added no matter what I try. git annex add --force doesn't help, either. + +Any idea how I could solve the third issue? It might not even be specific to git-annex... maybe git just works that way... but I'd be grateful for hints. diff --git a/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_1_51f4392e718d857e2f155d6217727a53._comment b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_1_51f4392e718d857e2f155d6217727a53._comment new file mode 100644 index 000000000..3aecd3988 --- /dev/null +++ b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_1_51f4392e718d857e2f155d6217727a53._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq4ClC5EMN1Vq1DpWXAqP5TiDnCK1mSfk" + nickname="Jonas" + subject="comment 1" + date="2014-01-09T22:58:30Z" + content=""" +I just found [this thread](http://git-annex.branchable.com/forum/Tracking_a_directory_with_some_hg_and_git_repositories/) where a user was discouraged from syncing git repositories with annex. + +I've used unison in the past for this. Sure, it would occasionally create a few unneeded object files; but these got removed during the next \"git gc\", and never corrupted a repository... Do people know of any better way to handle this problem? +"""]] diff --git a/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment new file mode 100644 index 000000000..0c933fe31 --- /dev/null +++ b/doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~timo-linux" + nickname="Tim O'Callaghan" + subject="How about automatically adding it as a submodule?" + date="2014-01-11T10:30:57Z" + content=""" +Adding as a submodule and automatically adding the annexe destination as a remote? that should work in most cases.. +"""]] diff --git a/doc/forum/Assistant:_configure_auto-sync.mdwn b/doc/forum/Assistant:_configure_auto-sync.mdwn new file mode 100644 index 000000000..48c4dc455 --- /dev/null +++ b/doc/forum/Assistant:_configure_auto-sync.mdwn @@ -0,0 +1,11 @@ +I have large central repositories of data. Therefore, on each client I want to save part data(to save space of disk). In command line I do + + [...] + git-annex webapp + git-annex drop [DeleteContentDirectory] + [...] + +After this command Assistant performs automatic synchronization getting content of files from this directory(DeleteContentDirectory), but I don't want. I want it's was only symlink of file in this directory. + +How can I configure Assistant which files have to get content on the client? It's possible? + diff --git a/doc/forum/Assistant:_configure_auto-sync/comment_1_c8cabd38114582bbdbad49f2d81959d7._comment b/doc/forum/Assistant:_configure_auto-sync/comment_1_c8cabd38114582bbdbad49f2d81959d7._comment new file mode 100644 index 000000000..34fffb846 --- /dev/null +++ b/doc/forum/Assistant:_configure_auto-sync/comment_1_c8cabd38114582bbdbad49f2d81959d7._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 1" + date="2013-08-26T07:44:22Z" + content=""" +You should set your repository to \"manual\" mode instead of \"client\" mode. + +But then no data will be synced at all by the assistant, only metadata. You would have to do \"get/drop\" manually for commandline for all files. + +Alternatively you could use the special \"archive\" folders that are supported by the assistant. + +"""]] diff --git a/doc/forum/Assistant_Droping_Files.mdwn b/doc/forum/Assistant_Droping_Files.mdwn new file mode 100644 index 000000000..e26edc92d --- /dev/null +++ b/doc/forum/Assistant_Droping_Files.mdwn @@ -0,0 +1,8 @@ +I have a setup as follows, + +3 drives on a remote ssh server regular git annex repos. +One untrusted clone of this repository on my laptop. + +On my laptop in webapp I have set num of copies to 2 (each file does have two copies on the server already). all repos plus laptop is set to manual mode. What happens is whenever I get a file to the laptop it would drop it from the disk on the server. Even though laptop is marked as untrusted this does not happen when using annex at the command line when I do a git annex get . --auto on the server it does not take the files on the untrusted repos into account which is what I want so I can drop files without moving them back to the server. + +Is this the intended behavior or am I doing something wrong? diff --git a/doc/forum/Assistant_loosing_advantages__63__.mdwn b/doc/forum/Assistant_loosing_advantages__63__.mdwn new file mode 100644 index 000000000..113a436bf --- /dev/null +++ b/doc/forum/Assistant_loosing_advantages__63__.mdwn @@ -0,0 +1,10 @@ +Hey, + +I write an article for the univerity about git-annex assistant and I'm a little bit confused about the function of the assistant. +Because an advantage of git-annex is that you can hold different files at different places in one repository, but this isn't anymore, or? The assistant syncs every file to every place of the repository. And this makes it just to another Dropbox (not direct the same) pentant or I'm not correct? + +The transfer group is just for transfer files to other repositories, which are not connected with the network or? + +I'm using ppa, ubuntu 12.04 lts, vers, 2013-12-13 + +JP Lührig diff --git a/doc/forum/Assistant_loosing_advantages__63__/comment_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment b/doc/forum/Assistant_loosing_advantages__63__/comment_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment new file mode 100644 index 000000000..171019b16 --- /dev/null +++ b/doc/forum/Assistant_loosing_advantages__63__/comment_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="good question.." + date="2013-12-19T17:04:53Z" + content=""" +The assistant necessarily simplifies some things git-annex does, so that it can automate them, and this includes keeping files synced to everywhere by default. There are ways to configure the assistant to only keep a subset of files on a computer, including [[archive_directories|assistant/archival_walkthrough]]. Underneath, there is the quite powerful [[preferred_content]] DSL, which can be used to configure lots more interesting behavior about what goes where. So far only some common scenarios have been made easily available in the webappp, but there's potential for lots more configurability here, if a good UI for it is built. + +I think the assistant is probably better than dropbox at handling external removable media, used for backups or archiving. (But I have not evaluated, or actually even used dropbox myself. My goal is *not* to copy dropbox.) And it's better at encryption, and it allows using a variety of cloud services rather than only one provider. +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync.mdwn b/doc/forum/Assistant_not_syncing_to_Rsync.mdwn new file mode 100644 index 000000000..18adc733d --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync.mdwn @@ -0,0 +1,15 @@ +I have 3 remotes for an annex - one on my laptop, one on a USB drive that's plugged in 50% of the time, and an rsync special remote on a friend's machine that I can access using SSH. + +I have tried various things (annex copy, numcopies=3) to make it move data to the rsync remote, but it doesn't seem to want to work. I have tried git annex sync. I added the remote repo using the webapp, and it looked as if it was copying my files for a bit then stopped. I have the remote repo setup as a backup in the webapp. + +The sizes of the directorys: + ~ $ du -sh Documents + 126M Documents + ~ $ du -sh /Volumes/Backup/Documents + 227M /Volumes/Backup/Documents + +and the remote + [c0g@womb Tom]$ du -sh MacDocuments/ + 21M MacDocuments/ + +I'm also curious as to why the usb drive repo is so much bigger than the thing I'm copying, but I'll worry about that later. diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_1_2178a7fc0d66643e84597b0938ef65f2._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_1_2178a7fc0d66643e84597b0938ef65f2._comment new file mode 100644 index 000000000..e701b7cd8 --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_1_2178a7fc0d66643e84597b0938ef65f2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-10T18:36:04Z" + content=""" +What does it say when you run: + + git annex copy --to $rsyncremote +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_2_650651398443e128c2adc6a2a2d320d0._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_2_650651398443e128c2adc6a2a2d320d0._comment new file mode 100644 index 000000000..28d043c6d --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_2_650651398443e128c2adc6a2a2d320d0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjWgG_L90szs6o4E8cBusol57zkcDhg7c" + nickname="Tom" + subject="comment 2" + date="2013-01-10T18:40:13Z" + content=""" +.... +copy FrenchBasicCourserevised-Volume1-StudentText.pdf (checking Womb_MacDocuments...) ok +.... + +for each file in the directory. +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_3_e6d0c9620b148acc72342862a8b4cfef._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_3_e6d0c9620b148acc72342862a8b4cfef._comment new file mode 100644 index 000000000..99b78a73c --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_3_e6d0c9620b148acc72342862a8b4cfef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 3" + date="2013-01-10T18:44:00Z" + content=""" +Sounds like copy works then? + +What version of git-annex do you have installed? A bug was fixed on December 11th, before that the assistant never stored things in repositories configured as backups. +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_4_b91f9febdb8b69d8b487ba4ea08c119a._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_4_b91f9febdb8b69d8b487ba4ea08c119a._comment new file mode 100644 index 000000000..8303babe3 --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_4_b91f9febdb8b69d8b487ba4ea08c119a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjWgG_L90szs6o4E8cBusol57zkcDhg7c" + nickname="Tom" + subject="comment 4" + date="2013-01-10T18:48:16Z" + content=""" +Sorry for lack of extra information: The sizes of the remote folder is still at 21MB, well below even the size of the PDF I posted about (that's about 75MB). Copy claims to work, but I see no network use and the remote repo doesn't grow. I install using cabal on my max yesterday, git-annex version: 3.20130107 + + + +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_5_c5ad7c1546a17d8459c995c9c8c26414._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_5_c5ad7c1546a17d8459c995c9c8c26414._comment new file mode 100644 index 000000000..653b7cc51 --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_5_c5ad7c1546a17d8459c995c9c8c26414._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 5" + date="2013-01-10T18:58:49Z" + content=""" +Ok, so copy is checking if the file is present, and it seems to think it is, so doesn't try again to send it. + +Here's what you need to do: Run `git annex copy FrenchBasicCourserevised-Volume1-StudentText.pdf --to Womb_MacDocuments --debug` + +It'll output something like this: + + copy new (checking rsync...) [2013-01-10 14:51:43 JEST] read: rsync [\"localhost:/tmp/r/f87/4d5/'SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\"] + +Now try running that command at the shell, and check its exit status. For the above, I ran: + + rsync \"localhost:/tmp/r/f87/4d5/'SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\"; echo $? + +It output: + + -rw-r--r-- 0 2013/01/10 14:51:40 SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + 0 + +Compare with the same command but with the filename mangled. + + rsync: link_stat \"/tmp/r/f87/4d5/'SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/mangled'\" failed: No such file or directory (2) + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [Receiver=3.0.9] + 27 + +It seems that rsync might be exiting 0 for content that's not there, in your case. This test will confirm or disprove that hypothesis and might provide some useful debug info. +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_6_4c12587f972eced91c5128d4885800b5._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_6_4c12587f972eced91c5128d4885800b5._comment new file mode 100644 index 000000000..3746fa2e3 --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_6_4c12587f972eced91c5128d4885800b5._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjWgG_L90szs6o4E8cBusol57zkcDhg7c" + nickname="Tom" + subject="comment 6" + date="2013-01-11T07:44:11Z" + content=""" +I did what you said for a file, and checked the remote size as well. Local size of this file was 11.4 meg, remote was 1.3 megabytes. + + copy Paradox Interactive/Crusader Kings II/save games/Yngling/1066_09_15_2.ck2 (checking Womb_MacDocuments...) [2013-01-11 07:30:26 GMT] read: rsync [\"c0g@git- annex-c0g:/raid/Tom/MacDocuments/87f/7f7/'GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7/GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7'\"] + ok + + rsync c0g@git-annex-c0g:/raid/Tom/MacDocuments/87f/7f7/'GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7/GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7' + -rw-r--r-- 1290004 2013/01/10 17:37:14 GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7 + 0 + + ~/Documents ± la Paradox\ Interactive/Crusader\ Kings\ II/save\ games/Yngling + total 44728 + drwx------ 4 c0g staff 136 10 Jan 17:52 . + drwx------ 3 c0g staff 102 10 Nov 20:53 .. + -rw-r--r-- 1 c0g staff 11413707 10 Jan 17:52 1066_09_15.ck2 + -rw-r--r-- 1 c0g staff 11484448 10 Jan 17:52 1066_09_15_2.ck2 + + [c0g@womb GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7]$ ls -la + total 1268 + drwxr-xr-x 2 c0g users 4096 Jan 10 12:37 . + drwxr-xr-x 3 c0g users 4096 Jan 10 12:37 .. + -rw-r--r-- 1 c0g users 1290004 Jan 10 12:37 GPGHMACSHA1--0148d706315885fac29c3a1dc0ec37b2835739a7 + + +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_7_6ecaaee9316bcf0c65688676d60fc055._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_7_6ecaaee9316bcf0c65688676d60fc055._comment new file mode 100644 index 000000000..38f755c86 --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_7_6ecaaee9316bcf0c65688676d60fc055._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjWgG_L90szs6o4E8cBusol57zkcDhg7c" + nickname="Tom" + subject="comment 7" + date="2013-01-11T07:52:17Z" + content=""" +I just compressed the documents folder, and it compresses down to 20 MB... I'm going to guess it stores as a compressed encrypted archive? How embarrasing for me! +"""]] diff --git a/doc/forum/Assistant_not_syncing_to_Rsync/comment_8_daa9a9a6188afa0394833e1b682f7cd4._comment b/doc/forum/Assistant_not_syncing_to_Rsync/comment_8_daa9a9a6188afa0394833e1b682f7cd4._comment new file mode 100644 index 000000000..f0a1c88fc --- /dev/null +++ b/doc/forum/Assistant_not_syncing_to_Rsync/comment_8_daa9a9a6188afa0394833e1b682f7cd4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 8" + date="2013-01-11T17:20:19Z" + content=""" +Aha! Yes, encryption includes compression. + +So, only remaining question is why your USB drive seems to be using 2x the uncompressed file size. One possibility would be it could have old versions of files, or deleted files still stored in it. You could try running \"git annex unused\" in its repository to find them. Other than that, I'm not sure what it could be. You can look around in its .git/annex directory, and compare to your laptop's repository, and perhaps see what's using the space. +"""]] diff --git a/doc/forum/Auto_archiving.mdwn b/doc/forum/Auto_archiving.mdwn new file mode 100644 index 000000000..f32a648c2 --- /dev/null +++ b/doc/forum/Auto_archiving.mdwn @@ -0,0 +1,17 @@ +I've been toying with the idea of auto archiving files (that is - removing them from .) based on a set of rules. + +Git already provides attribute management for files and I put together a simple script that tries to achieve the following: + +* Look for files with X copies (including a local one) +* Verify that the file is not recent (defined as not having been dropped or getted within X days ) +* Verify that the file has an annex.archive attribute +* Archive if the above is met + +Here is the script: +http://pastebin.com/53iLqyPd + +You just add the annex.archive attribute to files via .gitattributes to use + +The script runs in preview mode... exec with autoArchive.sh commit to drop the files. + +Open to thoughts / suggestions diff --git a/doc/forum/Auto_sync_with_music_player.mdwn b/doc/forum/Auto_sync_with_music_player.mdwn new file mode 100644 index 000000000..e4a5543b4 --- /dev/null +++ b/doc/forum/Auto_sync_with_music_player.mdwn @@ -0,0 +1 @@ +I have a music directory under Nexus 5 which is a git-annex repository. If I sync the same with remote repository, newly added songs or modified songs(modifed id3 tags) will not sync with music player. But if I use Android File Transfer to transfer songs, it will sync music player. The songs which are transferred using git-annex will reflect in music player only after restart. Do we have to execute any command which will sync music player. diff --git a/doc/forum/Auto_sync_with_music_player/comment_1_81ad1c15cfd753531c01dae8945d1caf._comment b/doc/forum/Auto_sync_with_music_player/comment_1_81ad1c15cfd753531c01dae8945d1caf._comment new file mode 100644 index 000000000..3ed75f9e9 --- /dev/null +++ b/doc/forum/Auto_sync_with_music_player/comment_1_81ad1c15cfd753531c01dae8945d1caf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T20:40:50Z" + content=""" +This is probably done via intents or a similar interface. git-annex is not yet able to use such android api's, but if there is a command line way to send the message that a file has changed, which there probably is, I could look into making git-annex use it. +"""]] diff --git a/doc/forum/Auto_sync_with_music_player/comment_2_a15e3f298c3d3faa5b3295355f9bb794._comment b/doc/forum/Auto_sync_with_music_player/comment_2_a15e3f298c3d3faa5b3295355f9bb794._comment new file mode 100644 index 000000000..fc0d06968 --- /dev/null +++ b/doc/forum/Auto_sync_with_music_player/comment_2_a15e3f298c3d3faa5b3295355f9bb794._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="67.128.198.190" + subject="Workaround using external app" + date="2014-03-07T14:57:39Z" + content=""" +A workaround for this is using an external app that pings the media scanner to rescan. It's an extra step to remember, but I haven't found it too much of a burden. + +I use this one: , but there are at least a dozen to choose from. + +"""]] diff --git a/doc/forum/Auto_sync_with_music_player/comment_3_99f65a0efaf5d5f9b8ff530acc122860._comment b/doc/forum/Auto_sync_with_music_player/comment_3_99f65a0efaf5d5f9b8ff530acc122860._comment new file mode 100644 index 000000000..b0275abdc --- /dev/null +++ b/doc/forum/Auto_sync_with_music_player/comment_3_99f65a0efaf5d5f9b8ff530acc122860._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-18T19:59:07Z" + content=""" +Turns out there is an open todo about this with details: [[todo/Use_MediaScannerConnection_on_Android]] +"""]] diff --git a/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__.mdwn b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__.mdwn new file mode 100644 index 000000000..50518e33a --- /dev/null +++ b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__.mdwn @@ -0,0 +1,46 @@ +## Use case + +A laptop with a relatively small hard drive has copies of a subset of +all annexed files. When annexed files are changed externally and `git +annex sync` is run on the laptop, the stale local copies are +invalidated and their symlinks break. How can I automatically fetch +the updated versions of these previously locally-cached files? + +Because I only want a subset of files, I can't do + + git annex add --not --in here --and --in superset. + +Because files may be renamed, the +[[tips/automatically_getting_files_on_checkout/]] solution, by making +`dir` specify the subset, will require manually and redundantly +tracking renames. + +## Simple ( (?) ) feature addition to git-annex to support this + +When locally-cached files are invalidated by `git-annex sync`, +git-annex could notify the user, and give them the option to +`git-annex get` the invalidated files. Bonus points if the mechanism +allows this to be done at any point in the future, not just when +running `git-annex sync`. The idea is that git-annex could track +which files, previously cached locally, have been invalidated +*unintentionally* by syncs, and treat them differently from files, +previously cached locally, that have been *intentionally* dropped +using `git-annex drop` or `git-annex move`. + +## More generally + +The ability to specify a collection of files to always cache locally +(something like a numcopies.here=1), which is robust to renames, would +work. The "robust to renames" part seems tricky in git: whereas svn +attaches properties to files, and so properties are propagated by `svn +mv`, I believe git attributes are only specified by patterns in +.gitattributes files. + +## Related questions / possible approaches + +Other forum posts mention [[`git +subtree`|forum/git-subtree_support__63__/]] and [[sparse git +checkouts|forum/sparse_git_checkouts_with_annex/]], but I'm not +familiar with these features and from reading those questions it's +unclear if those approaches will work for me. Does anyone more +familiar see how to adapt one of those features to my use case? diff --git a/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_1_dab1099ee56541c194de319c593f1268._comment b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_1_dab1099ee56541c194de319c593f1268._comment new file mode 100644 index 000000000..fa561ef04 --- /dev/null +++ b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_1_dab1099ee56541c194de319c593f1268._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-06-04T19:56:05Z" + content=""" +Personally, I deal with this problem by having a directory, or directories where I put files that I want to have on my partial checkout laptop, and run `git annex get` in that directory. + +It's not a perfect solution, but I don't know that a perfect solution exists. +"""]] diff --git a/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_2_b5faccf132fb47e3cda778a6600fd9ef._comment b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_2_b5faccf132fb47e3cda778a6600fd9ef._comment new file mode 100644 index 000000000..2cd1001ef --- /dev/null +++ b/doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_2_b5faccf132fb47e3cda778a6600fd9ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlu7K3h7Ry1uDAU_ERYGuqt0LoGNJqGuRo" + nickname="Nathan" + subject="comment 2" + date="2012-06-04T21:01:52Z" + content=""" +Joey, that sounds reasonable; I'll try it. Thanks! +"""]] diff --git a/doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn b/doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn new file mode 100644 index 000000000..60b8e034d --- /dev/null +++ b/doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn @@ -0,0 +1 @@ +Not really important (who reads git annex commit messages anyways ;-)), but nice to have and maybe a nice task for someone who wants to play around with Haskell and git annex: It would be shiny if the auto-commit done by git annex sync would automatically create a sensible commmit message and description. E.g. if just one file is added, it could say „Added blubb“. If a few files are added, it could say „Added blubb, bla and n other files“, based on the file name length, and list the files in the long description. Lots of room for playing around :-) diff --git a/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_1_ea2ec57bc695da4df8a30a35d433959d._comment b/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_1_ea2ec57bc695da4df8a30a35d433959d._comment new file mode 100644 index 000000000..c07dd4999 --- /dev/null +++ b/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_1_ea2ec57bc695da4df8a30a35d433959d._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-02-24T20:52:51Z" + content=""" +Took me a minute to see this is not about [[bugs/wishlist:_more_descriptive_commit_messages_in_git-annex_branch]], but about the \"git-annex automatic sync\" message that is used when committing any changes currently on the master branch before doing the rest of the sync. + +So.. It would be pretty easy to `ls-files` the relevant files before the commit and make a message. Although this would roughly double the commit time in a large tree, since that would walk the whole tree again (git commit -a already does it once). Smarter approaches could be faster.. perhaps it could find unstaged files, stage them, generate the message, and then `git commit` the staged changes. + +But, would this really be useful? It's already easy to get `git log` to show a summary of the changes made in such a commit. So it's often seen as bad form to unnecessarily mention which files a commit changes in the commit message. + +Perhaps more useful would be to expand the current message with details like where the sync is being committed, or what +remotes it's going to sync from, or something like that. +"""]] diff --git a/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_2_af71f53dbbca35d5a5c66ff131887ada._comment b/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_2_af71f53dbbca35d5a5c66ff131887ada._comment new file mode 100644 index 000000000..a71f72b9e --- /dev/null +++ b/doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_2_af71f53dbbca35d5a5c66ff131887ada._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 2" + date="2012-02-24T23:09:03Z" + content=""" +Yes, it is really a minor point. And indeed, \"git log --summary\" is pretty good already. But I’d still think that at least the title could deserves some love. Including the Hostname or the name of the repository there is a good idea as well. +"""]] diff --git a/doc/forum/Automatically_dropping_files.mdwn b/doc/forum/Automatically_dropping_files.mdwn new file mode 100644 index 000000000..dd47d87d6 --- /dev/null +++ b/doc/forum/Automatically_dropping_files.mdwn @@ -0,0 +1,7 @@ +I can make `git-annex` automatically fetch files with the [[/preferred content]] setting and the `--auto` flag, and it works almost exactly like I expect it to work. + +What I am missing is a way to make `git annex drop --auto` drop all files that are not wanted. + +I would like to work with metadata and tags in such a way that I can have clones (with views) that have only exactly those files available which carry a tag (done), and all other files automatically removed from the annex (unless that would be unsafe). + +Does anyone know how to achieve this? diff --git a/doc/forum/Automatically_dropping_files/comment_1_f5fc608f9cb0edf3272b586b62050637._comment b/doc/forum/Automatically_dropping_files/comment_1_f5fc608f9cb0edf3272b586b62050637._comment new file mode 100644 index 000000000..28c9c0a56 --- /dev/null +++ b/doc/forum/Automatically_dropping_files/comment_1_f5fc608f9cb0edf3272b586b62050637._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 1" + date="2014-05-19T15:41:05Z" + content=""" +`git annex drop --auto` *does* automatically drop files that are not wanted, according to your preferred content settings. + +If your preferred content for a repo is `metadata=tag=done`, then only files tagged \"done\" will be kept in the repository. + +Of course, files are only dropped if enough other copies can be verified to exist in other repositories.. +"""]] diff --git a/doc/forum/Automatically_syncronise_centralised_repository.mdwn b/doc/forum/Automatically_syncronise_centralised_repository.mdwn new file mode 100644 index 000000000..fe93a814d --- /dev/null +++ b/doc/forum/Automatically_syncronise_centralised_repository.mdwn @@ -0,0 +1,14 @@ +I would like to use git annex between two locations (work and home) where essentially the two computers are never on at the same time. + +I have set up a special remote (S3) to cater for file transfer between the sites, but still need some way of syncronising the git repositories between them. +I have access to a git server, but which doesn't have git-annex on it. So, I think that is all the components I need to get this working. + +However, I don't want to have to manually sync my computers with the central server, so I would like the assistant to do it for me, in what is essentially the complement of the special remote. + +What is the best way to accomplish this? I guess that this is a general git question, not specific to git annex. +I see some solutions [[http://stackoverflow.com/questions/3583061/automatically-mirror-a-git-repository]], but my git isn't really up to evaluating the options properly. + +So, what do other people do in this situation? + + +--Walter diff --git a/doc/forum/Automatically_syncronise_centralised_repository/comment_1_6a2047daa9faf4309d2ed27d5cc48b76._comment b/doc/forum/Automatically_syncronise_centralised_repository/comment_1_6a2047daa9faf4309d2ed27d5cc48b76._comment new file mode 100644 index 000000000..cbf8f0d04 --- /dev/null +++ b/doc/forum/Automatically_syncronise_centralised_repository/comment_1_6a2047daa9faf4309d2ed27d5cc48b76._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-22T18:58:08Z" + content=""" +The assistant can handle this syncing via a central bare remote. The only problem is that, since your server does not have git-annex installed, that remote will have annex-ignore set on it. That made the assistant not use it for syncing at all. + +I've just committed a change to git that makes the assistant still use such a git remote for syncing the git repository, even though it cannot store file contents there. +"""]] diff --git a/doc/forum/Automatically_syncronise_centralised_repository/comment_2_3be7b45bc2284019f17a81375637a576._comment b/doc/forum/Automatically_syncronise_centralised_repository/comment_2_3be7b45bc2284019f17a81375637a576._comment new file mode 100644 index 000000000..956e6b00a --- /dev/null +++ b/doc/forum/Automatically_syncronise_centralised_repository/comment_2_3be7b45bc2284019f17a81375637a576._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 2" + date="2013-04-22T20:37:59Z" + content=""" +That looks like exactly what I'm after! + +I'm very impressed by the quick response. Keep up the great work! +"""]] diff --git a/doc/forum/Basic_set_up_with_one_remote.mdwn b/doc/forum/Basic_set_up_with_one_remote.mdwn new file mode 100644 index 000000000..669c281d3 --- /dev/null +++ b/doc/forum/Basic_set_up_with_one_remote.mdwn @@ -0,0 +1,14 @@ +Hi, I'm new to git annex and so far it's looking really useful. I'm convinced what I'm trying to achieve is possible, but I can't seem to hit upon the right combination. Here's what I'd like to set up. + +One server with git annex / rsync / ssh access, but configured such that it contains a history of all the files as a full backup. +Two clients WITHOUT ssh access (these are portable machines and I'd rather not open any ports I don't absolutely have to). + +I've used the assistant to set up syncing between all three, using a jabber account to send signals and the server to pass on the files between the machines. This all works beautifully. But what I can't seem to get right is the server / backup aspect. If I set up the server using the assistant as a remote, and set it to "full backup" from the drop down list, it doesn't seem to have any files in the repository except in the .git/annex/objects folder. Which are all cryptic file names and not really accessible. If I run commands such as + +> git annex find + +(which should list all files as far as I can tell) in the server repository, it doesn't list any files at all. As the clients are all set up as direct repositories I can't access any history of the files there, so this doesn't seem to be quite what I'm after. The sync is working, but I really want the backup / history aspect as well. + +Does anyone know if what I want is possible? If so hopefully I'm close and someone can point out where I've gone wrong. I'm not afraid of the command line, but the assistant is a very convenient way to get started. + +Thanks for your help. diff --git a/doc/forum/Basic_set_up_with_one_remote/comment_1_3ad06a0dbebf62e6440f549e77af59b6._comment b/doc/forum/Basic_set_up_with_one_remote/comment_1_3ad06a0dbebf62e6440f549e77af59b6._comment new file mode 100644 index 000000000..c26261107 --- /dev/null +++ b/doc/forum/Basic_set_up_with_one_remote/comment_1_3ad06a0dbebf62e6440f549e77af59b6._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="ssh remote defaults to bare repo" + date="2014-05-06T06:10:06Z" + content=""" +Hi, + +When setting up a ssh remote the default is to create a repo without a human readable file structure. To achieve what you are looking for you have to initialize a git annex repo on the server and then add the remote to the clients. afaik this has to be done using the command line interface. + +If i remember correctly you add remotes with `git remote add ssh://example.com/path/to/annex` + +Cant find the docs atm (I'm commuting and at my final dest) + +"""]] diff --git a/doc/forum/Basic_set_up_with_one_remote/comment_2_59e18e759c907b8adabf8c34eef08065._comment b/doc/forum/Basic_set_up_with_one_remote/comment_2_59e18e759c907b8adabf8c34eef08065._comment new file mode 100644 index 000000000..40ed2c8b5 --- /dev/null +++ b/doc/forum/Basic_set_up_with_one_remote/comment_2_59e18e759c907b8adabf8c34eef08065._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl2I59wfwq505F9W0a6f7sFDcC9neWcc24" + nickname="Andrew" + subject="comment 2" + date="2014-05-06T12:45:05Z" + content=""" +OK that sounds reasonable. I'll give it a go. + +I don't mind so much that the remote is not human readable as I wont be browsing directly on the remote, but what I did find disconcerting is that I didn't seem to be able to access any files. For example if I lose both the client machines, how do I get access to the files on the remote? +"""]] diff --git a/doc/forum/Basic_set_up_with_one_remote/comment_3_5221a713ee3f65fa2740c9fa6cb1db0f._comment b/doc/forum/Basic_set_up_with_one_remote/comment_3_5221a713ee3f65fa2740c9fa6cb1db0f._comment new file mode 100644 index 000000000..43dbb5d63 --- /dev/null +++ b/doc/forum/Basic_set_up_with_one_remote/comment_3_5221a713ee3f65fa2740c9fa6cb1db0f._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl2I59wfwq505F9W0a6f7sFDcC9neWcc24" + nickname="Andrew" + subject="Still missing something" + date="2014-05-06T17:35:20Z" + content=""" +On the server I ran + +git init +git annex init + +On client I ran + +git init +git annex init +git annex direct + +then dropped some files in and ran + +git sync + +This didn't upload any files. I now have a broken link on the server without the actual file. + +When I tried to set up the server in the same way, then used the web assistant to create the repository on the client and then combine it with the manually created repository on the server, it actually worked for the first file. I could see a working link to the file it had just uploaded. But any subsequent files didn't reflect in the file structure. Additional files would show up in the .git/annex/objects folder, but again I have no way to explore these. git annex find showed nothing, git annex status showed only the first file and git log didn't show much. I tried re-adding this remote to a new annex repository, but it didn't give me access to the files or the history of the files. I'm confused! + +Is it me or is this not working as expected? +"""]] diff --git a/doc/forum/Basic_set_up_with_one_remote/comment_4_62e554a546e4b50d211f5f65446fd289._comment b/doc/forum/Basic_set_up_with_one_remote/comment_4_62e554a546e4b50d211f5f65446fd289._comment new file mode 100644 index 000000000..8cbe86666 --- /dev/null +++ b/doc/forum/Basic_set_up_with_one_remote/comment_4_62e554a546e4b50d211f5f65446fd289._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Some guesses" + date="2014-05-06T19:43:02Z" + content=""" +If you don't need human readable file structure on the server you don't have to initialize the annex repo. Just create a \"remote server\" repo with the assistant and set it to \"full backup\" if you want all the files there all the time. Without the \"full backup\" setting I believe only files it thinks someone else needs will be uploaded.* This might solve your problem with symlinks as `git annex sync` syncs metadata, only moving actual data if required. + +I'm not sure if the `git-annex find` command will work on a bare repo I can't test as all my repos are configured so that I can access the files in a normal way. Running `git-annex whereis $file` on the client should allow you to check if a file has been uploaded. + + +*Massive caveat as I'm really not sure +"""]] diff --git a/doc/forum/Behaviour_of_fsck.mdwn b/doc/forum/Behaviour_of_fsck.mdwn new file mode 100644 index 000000000..cd27d49f7 --- /dev/null +++ b/doc/forum/Behaviour_of_fsck.mdwn @@ -0,0 +1,13 @@ +The current behaviour of 'fsck' is a bit verbose. I have an annex'd directory of tarballs for my own build system for "science" applications, there's about ~600 or so blobs in my repo, I do occassionally like to run fsck across all my data to see what files don't meet the min num copies requirement that I have set. + +Would it be better for the default behaviour of fsck when it has not been given a path to only output errors and not bother to show that a file is ok for every single file in a repo. i.e. + + git annex fsck + +should show only 'errors' and maybe a simple indicator showing the status (show a spinner or dots?) and when + + git annex fsck PATH/FILE + +it should have the current behaviour? + +Right now the current fsck behaviour might get annoying for anyone who would want to run fsck with repos with lots of big files. diff --git a/doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment b/doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment new file mode 100644 index 000000000..dc48e2f94 --- /dev/null +++ b/doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-24T17:45:08Z" + content=""" +I tend to agree that the default output of fsck is not quite right. I often use git annex fsck -q. A progress spinner display is a good idea. +"""]] diff --git a/doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment b/doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment new file mode 100644 index 000000000..357b48a23 --- /dev/null +++ b/doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2011-03-26T10:57:41Z" + content=""" +After some thought, perhaps the default fsck output should be at least machine readable and copy and pasteable i.e. + +
+$ git annex fsck
+Files with errors
+
+    file1
+    file2
+
+
+ +so I can then copy the list of borked files and then just paste it into a for loop in my shell to recover the files. it's just an idea. +"""]] diff --git a/doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment b/doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment new file mode 100644 index 000000000..be34473c0 --- /dev/null +++ b/doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-03-28T01:16:21Z" + content=""" +Another nice thing would be a summary of _what_ is wrong. I.e. + + % git fsck + [...] + git-annex: 100 total failed + 50 checksum failed + 50 not enough copies exit + +And the same/similar for all other failure modes. + + +-- RichiH +"""]] diff --git a/doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment b/doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment new file mode 100644 index 000000000..e8c983746 --- /dev/null +++ b/doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-03-25T11:23:04Z" + content=""" +FWIW, I wanted to suggest exactly the same thing. +"""]] diff --git a/doc/forum/Best_approach_for_central_sharing_and_multiple_users.mdwn b/doc/forum/Best_approach_for_central_sharing_and_multiple_users.mdwn new file mode 100644 index 000000000..6fc104cb8 --- /dev/null +++ b/doc/forum/Best_approach_for_central_sharing_and_multiple_users.mdwn @@ -0,0 +1,8 @@ +Just a quick question: Can anyone recomment me a good to handle a centralized repository which is used by different users? + +Requirements: must work in direct mode on both sides, server is Linux, clients are Windows and operated by 2 different users. + +- Should the repository create bare or not? +- Must the repository created on the server or can it also be "pushed" from one client to the server (via SSH on the server)? +- Is there a better way for data transfer than SSH (WebDAV as in SVN)? I am still struggling with an elegant way to handle public keys in windows +- What is the best way to not only keep meta data in sync but also the data each of the users has checked out? diff --git a/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_1_48ffb50b92588daec6887bf08f1b97f5._comment b/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_1_48ffb50b92588daec6887bf08f1b97f5._comment new file mode 100644 index 000000000..17860d037 --- /dev/null +++ b/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_1_48ffb50b92588daec6887bf08f1b97f5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T19:31:52Z" + content=""" +I suggest following this screencast: [[videos/git-annex_assistant_lan]] + +While it talks about a local network, this will also work with a server on the internet. +"""]] diff --git a/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_2_6b9a20f9707da9d2cfc3697a538d6935._comment b/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_2_6b9a20f9707da9d2cfc3697a538d6935._comment new file mode 100644 index 000000000..c77e9a8fd --- /dev/null +++ b/doc/forum/Best_approach_for_central_sharing_and_multiple_users/comment_2_6b9a20f9707da9d2cfc3697a538d6935._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.173.91" + subject="comment 2" + date="2014-07-11T21:56:29Z" + content=""" +Thanks, great work! + +I wanted to avoid the assistant so far because I feel I do not get so much control (particularly which files are synced to the clients) but I think I'll start with the assistant ... + + +"""]] diff --git a/doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn b/doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn new file mode 100644 index 000000000..d6d1206ae --- /dev/null +++ b/doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn @@ -0,0 +1,18 @@ +I have a bunch of removable storage devices and was planning on storing my data across +all of them. I've run into an annoyance, and would like to see if anybody has any +ideas. + +My goal was to have the full file tree on all the devices, but only a subset of the +annexed data. Where I have run into trouble is removing data from the system. It +seems that the "git annex unused" command checks remote branches as well as local ones +when determining whether an object is referred to. + +This means that if I remove a file that is stored locally, "git annex unused" doesn't +report the corresponding object as unused until I either connect and update all +removable storage *or* remove the remote corresponding to the removable storage. I +posted a bug about this inconsistency named +[[bugs/git annex unused considers remote branches which makes it inconsistent]]. + +If I used the removable storage as a special remote, then I wouldn't have this issue, +but I also wouldn't be able to conveniently use the files on it and manage the repo +from it either. diff --git a/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository.mdwn b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository.mdwn new file mode 100644 index 000000000..c126f8373 --- /dev/null +++ b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository.mdwn @@ -0,0 +1,17 @@ +Hi! + +What is the best way to add again the content of file in an direct and crippled annex repository? I'm using such a repository on a SMB drive, with no symbolic links, that's why the repository is in direct mode. + +For example: + +`/disk/annex-rep/a.bin` contains the text `../.git/annex/objects/W3/M8/SHA256E-s4701522386--e486cce01b1870cee394a376a3acc64a608e84e38b85e6c21c29721cf14328e6.bin/SHA256E-s4701522386--e486cce01b1870cee394a376a3acc64a608e84e38b85e6c21c29721cf14328e6.bin` + +and I've got the real content in another directory, outside annex: /disk/a.bin (contains the binary data) + +I imagined this process: +* replace `/disk/annex-rep/a.bin` with `/disk/a.bin`` +* update `git-annex:122/4b8/SHA256E-s4701522386--e486cce01b1870cee394a376a3acc64a608e84e38b85e6c21c29721cf14328e6.bin.log` by adding this repository uuid + +I tried `git annex reinject` but it didn't work. + +Is there another way? diff --git a/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_1_552e74f9573a34ec178f396b83252c3e._comment b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_1_552e74f9573a34ec178f396b83252c3e._comment new file mode 100644 index 000000000..439c985dc --- /dev/null +++ b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_1_552e74f9573a34ec178f396b83252c3e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T19:54:21Z" + content=""" +There's a bug report asking that reinject work in direct mode. I just have not gotten around to it. + +Another way to do it would be to make a temp directory in your annex repository, move or copy the file to there, and `git annex add`. As long as you're not using the WORM backend, the checksum will be used, and so it'll see it's added the content of the file, and make the a.bin file have that content too. + +Off to see if I can easily add direct mode reinject now.. +"""]] diff --git a/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_2_33c57922714f204fc63c260b838f3712._comment b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_2_33c57922714f204fc63c260b838f3712._comment new file mode 100644 index 000000000..afc449ac2 --- /dev/null +++ b/doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_2_33c57922714f204fc63c260b838f3712._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-11-26T20:18:56Z" + content=""" +Turned out to be trivial, so it's supported now. +"""]] diff --git a/doc/forum/Big_repository_vs._multiple_small.mdwn b/doc/forum/Big_repository_vs._multiple_small.mdwn new file mode 100644 index 000000000..c77dd02a5 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small.mdwn @@ -0,0 +1,8 @@ +I am new to git (but extensively used SVN). + +In SVN I could have a big fat repository but only check out sub-trees is it. +Is that also common in git(-annex) / recommended? + +E.g., should I create a big-fat repos with all data I have (personal data, music, videos, ...) and check out only the appropriate subtress or create a repository for each purpose? E.g., one for Fotos, Music, OnTheGoData, ebooks, ... + +What happens if I have a git-annex repository checked out at my laptop (say, d:\Files) and within it, check out another one (e.g. d:\Files\Library)? diff --git a/doc/forum/Big_repository_vs._multiple_small/comment_1_8e21ee3c674ef6e595bdab53dd5c2356._comment b/doc/forum/Big_repository_vs._multiple_small/comment_1_8e21ee3c674ef6e595bdab53dd5c2356._comment new file mode 100644 index 000000000..707a1cca6 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small/comment_1_8e21ee3c674ef6e595bdab53dd5c2356._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2014-04-14T15:32:34Z" + content=""" +In my setup I have one repository for each category (photos documents videos) it is faster then single giant repository plus it makes sharing with other people easier since you can let people clone one category at a time. +"""]] diff --git a/doc/forum/Big_repository_vs._multiple_small/comment_2_656c62351502492d20e8490242e51169._comment b/doc/forum/Big_repository_vs._multiple_small/comment_2_656c62351502492d20e8490242e51169._comment new file mode 100644 index 000000000..22fa76542 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small/comment_2_656c62351502492d20e8490242e51169._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 2" + date="2014-04-15T18:23:13Z" + content=""" +Thank you, that's a good point! + +Does this also mean that a repository in git(-annex) is \"all or nothing\"? + +For example, I cannot share/clone parts of it? Or define access rights within a repository? + +With SVN for example, I have a big repository \"university\" and it contains all stuff of projects/research. Each individual directory is only shared with the persons whom I worked together in this particular project. In short: In git, this should not be that way, right? +"""]] diff --git a/doc/forum/Big_repository_vs._multiple_small/comment_3_e9c44ea364513f090844f46af2ea46a1._comment b/doc/forum/Big_repository_vs._multiple_small/comment_3_e9c44ea364513f090844f46af2ea46a1._comment new file mode 100644 index 000000000..063260ba1 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small/comment_3_e9c44ea364513f090844f46af2ea46a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="Claes" + subject="comment 3" + date="2014-04-17T14:04:31Z" + content=""" +Yeah, git does not have the concept of checking out subdirectories that subversion does. You could, however, have different branches with different content that live in the same repo and therefore share the same git-annex backend, so there could be overlap between what files are in what branch without them using up much extra disk space. +"""]] diff --git a/doc/forum/Big_repository_vs._multiple_small/comment_4_82e13580426dc648688e4c26e7ed91ec._comment b/doc/forum/Big_repository_vs._multiple_small/comment_4_82e13580426dc648688e4c26e7ed91ec._comment new file mode 100644 index 000000000..e79e19814 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small/comment_4_82e13580426dc648688e4c26e7ed91ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 4" + date="2014-04-18T09:16:44Z" + content=""" +with git you can not checkout parts of a repo it is all or nothing but with annex you can download your files dir by dir. When you clone you get symlinks for all files but only the files you want are downloaded. +"""]] diff --git a/doc/forum/Big_repository_vs._multiple_small/comment_5_632aceb71dc6a4a9a4bb03de25a9b21a._comment b/doc/forum/Big_repository_vs._multiple_small/comment_5_632aceb71dc6a4a9a4bb03de25a9b21a._comment new file mode 100644 index 000000000..182263f39 --- /dev/null +++ b/doc/forum/Big_repository_vs._multiple_small/comment_5_632aceb71dc6a4a9a4bb03de25a9b21a._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="divB" + ip="74.61.144.53" + subject="comment 5" + date="2014-04-19T05:38:43Z" + content=""" +Thanks! + +But what to my question regarding checking out a repository within a repository? + +I will most likely have a \"home\" repository which I would check out at first level. + +Then, within one directory I would like to (only locally!) check out another, such as \"Library\". + +Something like mount ... to mount one FS within another mount point. + +For SVN I think there exist externals for that ... + +Does this work? + + + +"""]] diff --git a/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn b/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn new file mode 100644 index 000000000..77b092891 --- /dev/null +++ b/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn @@ -0,0 +1,72 @@ +I've been experiencing problems with Box.com for a few days now and I don't know what's causing them. Is anyone else experiencing anything similar? + +I paste the log. + + [2013-09-02 12:27:26 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "c9e1d5421e78924c21e3d68e84f80a8d1f64f9488020107ca0eeee0c4f10e763.py", keyBackendName = "SHA256E", keySize = Just 1891, keyMtime = Nothing}} + [2013-09-02 12:27:26 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kant.xml Nothing : expensive scan found missing object + [2013-09-02 12:27:26 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing + [2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing + [2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:27:26 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/argecho.py Just 437 + ResponseTimeout + ResponseTimeout + + + [2013-09-02 12:27:44 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "dd3cc45d91430c6f7d68eb807f4ac1561cd0297b11a2de77b5fe66017d125798.py", keyBackendName = "SHA256E", keySize = Just 437, keyMtime = Nothing}} + [2013-09-02 12:27:44 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kgp.dtd Nothing : expensive scan found missing object + [2013-09-02 12:27:44 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing + [2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing + [2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:27:44 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/autosize.py Just 2861 + ResponseTimeout + ResponseTimeout + + + [2013-09-02 12:28:02 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "d6b7940ac68768a8e37e72f248e2d94f19fb0d47062084d9baf0ec08cebbf692.py", keyBackendName = "SHA256E", keySize = Just 2861, keyMtime = Nothing}} + [2013-09-02 12:28:02 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/kgp.py Nothing : expensive scan found missing object + [2013-09-02 12:28:02 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing + [2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing + [2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:28:03 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/builddialectexamples.py Just 1090 + ResponseTimeout + ResponseTimeout + + + [2013-09-02 12:28:21 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "f1492b80d05b96cc7cf2904d461c99d430fa86a4eb1d99f1b155c9147ff4420f.py", keyBackendName = "SHA256E", keySize = Just 1090, keyMtime = Nothing}} + [2013-09-02 12:28:21 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/russiansample.xml Nothing : expensive scan found missing object + [2013-09-02 12:28:21 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing + [2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing + [2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:28:21 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/colorize.py Just 4864 + ResponseTimeout + ResponseTimeout + + + [2013-09-02 12:28:40 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "b577eaf8b6ddbf9fef866c455cae248aec3b22e3f2e91aa2b75ece90f1801689.py", keyBackendName = "SHA256E", keySize = Just 4864, keyMtime = Nothing}} + [2013-09-02 12:28:40 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/stderr.py Nothing : expensive scan found missing object + [2013-09-02 12:28:40 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing + [2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing + [2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:28:40 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/dialect.py Just 4449 + ResponseTimeout + ResponseTimeout + + + [2013-09-02 12:28:58 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9", transferKey = Key {keyName = "c5e5d9b1bee2710c7ed05270a363d3e93270b0fb6779c4c8d59ace06c11db684.py", keyBackendName = "SHA256E", keySize = Just 4449, keyMtime = Nothing}} + [2013-09-02 12:28:58 CEST] TransferScanner: queued Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/kgp/stdout.py Nothing : expensive scan found missing object + [2013-09-02 12:28:58 CEST] Transferrer: Transferring: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing + [2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing + [2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Nothing + + + 100% 0.0 B/s 0s[2013-09-02 12:28:58 CEST] TransferWatcher: transfer starting: Upload UUID "72111b4c-28fe-42fd-a77b-e4cb9240a1c9" Documentos/diveintopython-5.4/py/fibonacci.py Just 532 diff --git a/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days/comment_1_6ca872c241399b9129cf9a18f42ebd43._comment b/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days/comment_1_6ca872c241399b9129cf9a18f42ebd43._comment new file mode 100644 index 000000000..2c7d98b49 --- /dev/null +++ b/doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days/comment_1_6ca872c241399b9129cf9a18f42ebd43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="It works here" + date="2013-09-02T11:47:00Z" + content=""" +I set up a box.com remote a couple of months ago or so just for testing. Haven't used it that much, but I tested it now to see if it still works. No errors or problems. I have pasted the output from a session where I copied a file to box.com, dropped it locally, then got it back from box.com here: . The computer I ran the test on is using the newest git-annex binary (v4.20130827), Ubuntu 10.04.4 LTS. Pretty old distro, but it still works. +"""]] diff --git a/doc/forum/Building_a_Debian_package_of_git-annex.mdwn b/doc/forum/Building_a_Debian_package_of_git-annex.mdwn new file mode 100644 index 000000000..ee222df29 --- /dev/null +++ b/doc/forum/Building_a_Debian_package_of_git-annex.mdwn @@ -0,0 +1,27 @@ +I'd like to have a Debian/Ubuntu package of the latest git-annex (f.e. to have it installed systemwide). In the source I can find the debian/ folder with all needed information to build the package. But it looks like I don't have all needed dependencies on my Ubuntu 12.10: + + user@laptop(pc) ~/src/git/git-annex (git)-[master] % debuild -us -uc + dpkg-buildpackage -rfakeroot -D -us -uc + dpkg-buildpackage: source package git-annex + dpkg-buildpackage: source version 3.20130115 + dpkg-buildpackage: source changed by Joey Hess + dpkg-source --before-build git-annex + dpkg-buildpackage: host architecture amd64 + dpkg-checkbuilddeps: Unmet build dependencies: libghc-dav-dev (>= 0.3) libghc-dbus-dev (>= 0.10.3) libghc-yesod-dev libghc-yesod-static-dev libghc-yesod-default-dev libghc-hamlet-dev libghc-clientsession-dev libghc-warp-dev libghc-wai-dev libghc-wai-logger-dev libghc-case-insensitive-dev libghc-http-types-dev libghc-blaze-builder-dev libghc-crypto-api-dev libghc-network-multicast-dev libghc-network-info-dev libghc-safesemaphore-dev libghc-network-protocol-xmpp-dev (>= 0.4.3-1+b1) libghc-gnutls-dev (>= 0.1.4) libghc-xml-types-dev + dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting + dpkg-buildpackage: warning: (Use -d flag to override.) + debuild: fatal error at line 1357: + dpkg-buildpackage -rfakeroot -D -us -uc failed + user@laptop(pc) ~/src/git/git-annex (git)-[master] % apt-get install libghc-dav-dev libghc-dbus-dev libghc-yesod-dev libghc-yesod-static-dev libghc-yesod- default-dev libghc-hamlet-dev libghc-clientsession-dev libghc-warp-dev libghc-wai-dev libghc-wai-logger-dev libghc-case-insensitive-dev libghc-http-types-dev libghc-blaze-builder-dev libghc-crypto-api-dev libghc-network-multicast-dev libghc-network-info-dev libghc-safesemaphore-dev libghc-network-protocol-xmpp-dev libghc-gnutls-dev libghc-xml-types-dev + Reading package lists... Done + Building dependency tree + Reading state information... Done + E: Unable to locate package libghc-dav-dev + E: Unable to locate package libghc-network-multicast-dev + E: Unable to locate package libghc-network-info-dev + E: Unable to locate package libghc-safesemaphore-dev + +How can I build the package? Or would it be possible for you to build the package and add it to the "Install" page (like the prebuilt linux tarball)? That would be great! + +Cheers and thanks for the hard work, +Tobias diff --git a/doc/forum/Building_a_Debian_package_of_git-annex/comment_1_0848513c46f3efa21bc34784554ae88a._comment b/doc/forum/Building_a_Debian_package_of_git-annex/comment_1_0848513c46f3efa21bc34784554ae88a._comment new file mode 100644 index 000000000..39790c5ff --- /dev/null +++ b/doc/forum/Building_a_Debian_package_of_git-annex/comment_1_0848513c46f3efa21bc34784554ae88a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-16T23:05:13Z" + content=""" +There is a package available already: + +This will install even on Debian stable, I think. +"""]] diff --git a/doc/forum/Building_git-annex-3.20121112-19309.mdwn b/doc/forum/Building_git-annex-3.20121112-19309.mdwn new file mode 100644 index 000000000..68d5e3205 --- /dev/null +++ b/doc/forum/Building_git-annex-3.20121112-19309.mdwn @@ -0,0 +1,78 @@ +Hi, + +I have Problems building git-annex-3.20121112-19309, I rceive the following error: + +... + Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done + final link ... done + + Assistant/Alert.hs:66:30: + Warning: default newline style has changed, using an explicit $newline is recommended + + Assistant/Alert.hs:69:31: + Warning: default newline style has changed, using an explicit $newline is recommended + [157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o ) + [158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o ) + + Assistant/Monad.hs:86:16: + Couldn't match expected type `Assistant a' + with actual type `Reader AssistantData a' + Expected type: (AssistantData -> a) -> Assistant a + Actual type: (AssistantData -> a) -> Reader AssistantData a + In the expression: reader + In an equation for `getAssistant': getAssistant = reader + + Assistant/Monad.hs:93:15: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: st <- reader threadState + In the expression: + do { st <- reader threadState; + liftIO $ runThreadState st a } + + Assistant/Monad.hs:99:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + liftIO $ io $ runAssistant d a } + + Assistant/Monad.hs:105:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ runAssistant d a } + + Assistant/Monad.hs:110:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v -> runAssistant d $ a v } + + Assistant/Monad.hs:115:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v1 v2 -> runAssistant d (a v1 v2) } + + Assistant/Monad.hs:120:12: + Couldn't match expected type `Assistant a0' + with actual type `Reader r0 a1' + In the return type of a call of `reader' + In the first argument of `(>>=)', namely `reader v' + In the expression: reader v >>= liftIO . io + cabal: Error: some packages failed to install: + git-annex-3.20121112 failed during the building phase. The exception was: + ExitFailure 1 diff --git a/doc/forum/Building_git-annex-3.20121112-19309/comment_1_b115e28c77fe748ee6643c41f766beb4._comment b/doc/forum/Building_git-annex-3.20121112-19309/comment_1_b115e28c77fe748ee6643c41f766beb4._comment new file mode 100644 index 000000000..3b75dfeb6 --- /dev/null +++ b/doc/forum/Building_git-annex-3.20121112-19309/comment_1_b115e28c77fe748ee6643c41f766beb4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-18T17:49:57Z" + content=""" +What platform are you building on? + +What version of ghc is installed? + +What version of the haskell mtl library is installed? (`cabal list --installed --simple-output mtl`) +"""]] diff --git a/doc/forum/Building_git-annex-3.20121112-19309/comment_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment b/doc/forum/Building_git-annex-3.20121112-19309/comment_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment new file mode 100644 index 000000000..195f63991 --- /dev/null +++ b/doc/forum/Building_git-annex-3.20121112-19309/comment_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 2" + date="2012-11-19T06:57:54Z" + content=""" +This is an Ubuntu 12.04 system (3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux) + +ghc is 7.4.1 + +mtl info is: + +MonadCatchIO-mtl 0.3.0.5 +mtl 2.0.1.0 + +"""]] diff --git a/doc/forum/Building_git-annex-3.20121112-19309/comment_3_2f30b301c14f3a7fa0f52715d6140353._comment b/doc/forum/Building_git-annex-3.20121112-19309/comment_3_2f30b301c14f3a7fa0f52715d6140353._comment new file mode 100644 index 000000000..d4f48434c --- /dev/null +++ b/doc/forum/Building_git-annex-3.20121112-19309/comment_3_2f30b301c14f3a7fa0f52715d6140353._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-11-25T18:56:01Z" + content=""" +On my Debian system, where it builds ok, I have the same ghc version, but version 2.1.1 of mtl. I suspect your old version of that is the problem. You can try using cabal to install a newer mtl: + +
+  cabal update
+  cabal install mtl
+
+"""]] diff --git a/doc/forum/Building_git-annex-3.20121112-19309/comment_4_1e3c3903a71a2ff7109372aa4dd5742a._comment b/doc/forum/Building_git-annex-3.20121112-19309/comment_4_1e3c3903a71a2ff7109372aa4dd5742a._comment new file mode 100644 index 000000000..1b59c3d2d --- /dev/null +++ b/doc/forum/Building_git-annex-3.20121112-19309/comment_4_1e3c3903a71a2ff7109372aa4dd5742a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 4" + date="2012-11-25T20:26:33Z" + content=""" +I was able to reproduce this build failure with the same old version of mtl you have. I've adjusted the cabal build dependencies to require a newer version. +"""]] diff --git a/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn new file mode 100644 index 000000000..f4878da20 --- /dev/null +++ b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn @@ -0,0 +1,19 @@ +Hi, + +I try to install git-annex master with cabal, so I cloned the git repo and run "cabal install --only-dependencies". This gives me the following error: + + Resolving dependencies... + cabal: Could not resolve dependencies: + trying: git-annex-3.20120826 (user goal) + trying: git-annex-3.20120826:+oldyesod + trying: git-annex-3.20120826:+currentyesod + next goal: yesod-default (dependency of git-annex-3.20120826:+oldyesod) + rejecting: yesod-default-1.1.0 (conflict: git-annex-3.20120826:oldyesod => + yesod-default(<=1.0.1.1)) + rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0, 0.6.1, 0.5.0, 0.4.1, 0.4.0, + 0.3.1 (conflict: git-annex-3.20120826:currentyesod => yesod-default(>=1.1.0)) + +Any idea how to fix this? (PS: I'm running Kubuntu 12.04) + +Cheers, +Tobias diff --git a/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_1_2eb4f410b54a25fcc895893a3c631c43._comment b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_1_2eb4f410b54a25fcc895893a3c631c43._comment new file mode 100644 index 000000000..b18e74f7a --- /dev/null +++ b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_1_2eb4f410b54a25fcc895893a3c631c43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 1" + date="2012-08-29T16:01:00Z" + content=""" +Hmm, cabal is not as smart as I'd hoped it could be. I've removed the support for old version of yesod. +"""]] diff --git a/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_2_44cd6f6dd674df105d6f0b3f320f3236._comment b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_2_44cd6f6dd674df105d6f0b3f320f3236._comment new file mode 100644 index 000000000..4d8b0a8aa --- /dev/null +++ b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_2_44cd6f6dd674df105d6f0b3f320f3236._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 2" + date="2012-08-30T10:01:24Z" + content=""" +thanks, that resolved the dependency trouble. +But now: + + Building git-annex-3.20120826... + Preprocessing executable 'git-annex' for git-annex-3.20120826... + + Utility/Yesod.hs:15:8: + Could not find module `Data.Default' + It is a member of the hidden package `data-default-0.5.0'. + Perhaps you need to add `data-default' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + +"""]] diff --git a/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_3_992af6855901df79a2018a07941cb8b6._comment b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_3_992af6855901df79a2018a07941cb8b6._comment new file mode 100644 index 000000000..09d0dbd9a --- /dev/null +++ b/doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_3_992af6855901df79a2018a07941cb8b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 3" + date="2012-08-30T16:59:07Z" + content=""" +The Data.Default problem is fixed now. +"""]] diff --git a/doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn b/doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn new file mode 100644 index 000000000..996e864c3 --- /dev/null +++ b/doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn @@ -0,0 +1 @@ +I threw together a pair of shell scripts for calculating the cost of a remote using ping times. I don't know how useful this is in practice, but the theory seemed sound to me. If I'm in a hotel room with my two laptops, I'd rather annex try to get a file from the other laptop than from my NAS all the way back home. I'd love to figure out how to also detect if I'm on my VerizonWireless connection at the time and multiply the cost of all connections over the Internet accordingly, but that's down the road. Latest versions of the pair of scripts will be at . I'm interested in feedback, so please fork the git repo on gist and send me changes/updates. Also of note is that these were written for MacOSX. If you're interested in using them on a different linux, pay attention to the format of the summary line of your ping command. diff --git a/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment b/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment new file mode 100644 index 000000000..2a2554f8d --- /dev/null +++ b/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-12-30T23:01:39Z" + content=""" +You may want to use hop count, not ping times, for a rough guesstimate of distance. + +Generally speaking, this is a highly non-trivial problem that's subject to university research projects so unless you find a well-maintained third party tool to solve this problem, it's unlikely that you will find a truly general solution. + +Anyway, look into mtr for your distance measurements. + + +Richard +"""]] diff --git a/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_2_7e04f85c6ba74c18c8dde148aef9bf80._comment b/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_2_7e04f85c6ba74c18c8dde148aef9bf80._comment new file mode 100644 index 000000000..7dc4072eb --- /dev/null +++ b/doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_2_7e04f85c6ba74c18c8dde148aef9bf80._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 2" + date="2013-01-06T11:08:42Z" + content=""" +Yeah, I was debating between ping times (max or avg) and hop count and ultimately went with ping time because of this situation: From my office to my house is ~12 hops but because we peer with the cable modem provider the ping time is still ~5ms. But from my cell modem, it's ~8 hops but ping times of ~200ms. +"""]] diff --git a/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn b/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn new file mode 100644 index 000000000..6d1083dd5 --- /dev/null +++ b/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn @@ -0,0 +1,6 @@ +Is it possible to story ordinary files in the git repository, or is this going to confuse git-annex? In other words, can I safely run + + git add .gitattributes + git commit -m 'remember attributes' .gitattributes + +..., or do I have to use `git-annex add` all time? diff --git a/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__/comment_1_c8f9923d8dc76b8bed25dce5ae09b520._comment b/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__/comment_1_c8f9923d8dc76b8bed25dce5ae09b520._comment new file mode 100644 index 000000000..8873edcde --- /dev/null +++ b/doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__/comment_1_c8f9923d8dc76b8bed25dce5ae09b520._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.12.196.1" + subject="Solved" + date="2011-07-13T16:21:25Z" + content=""" +I got my answer on #vcs-home: Yes, git-annex and git get along fine. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo.mdwn b/doc/forum/Can_Not_Sync_to_Git_Repo.mdwn new file mode 100644 index 000000000..3b5782996 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo.mdwn @@ -0,0 +1 @@ +On one my repos (git repo on github data on S3) I've started getting, `fatal: Cannot force update the current branch` `git-annex: failed to update refs/heads/master` other clones of this repository can sync fine but this one started failing after adding a couple of files. diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_10_e0f82074eb1a4b8258729d9a23a7f421._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_10_e0f82074eb1a4b8258729d9a23a7f421._comment new file mode 100644 index 000000000..bf3cc836a --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_10_e0f82074eb1a4b8258729d9a23a7f421._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="no annex/direct/master branch" + date="2013-12-21T04:19:33Z" + content=""" +Same problem here: + + % git branch -a + git-annex + * master + synced/git-annex + synced/master + remotes/HD02/git-annex + remotes/HD02/master + remotes/HD02/synced/git-annex + remotes/HD02/synced/master + +This is a direct mode repo, too. + +It seems that git-annex didn't properly update the repo. .git/config shows: + + [core] + repositoryformatversion = 0 + filemode = true + bare = false + ... + [annex] + ... + version = 3 + direct = true + +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_11_842aaf685aa843c21bf3eef0b61f8630._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_11_842aaf685aa843c21bf3eef0b61f8630._comment new file mode 100644 index 000000000..a62cd7877 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_11_842aaf685aa843c21bf3eef0b61f8630._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 11" + date="2013-12-29T17:09:26Z" + content=""" +I've found a bug where a repo would for some unknown reason be in direct mode but v3, and so would not be auto-upgraded to v5. This explains at least what Chris Stork shows. But I think not what previous posters are experiencing. I've fixed that bug in git. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_12_b4f8be428a08db01dbd004e1f06dcffd._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_12_b4f8be428a08db01dbd004e1f06dcffd._comment new file mode 100644 index 000000000..883ae6d96 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_12_b4f8be428a08db01dbd004e1f06dcffd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="Bug fix confirmed" + date="2014-01-30T15:29:56Z" + content=""" +Thank you, Joey! +FYI, my repo was automatically converted to version 5 and put on the annex/direct/master branch. +As Joey mentioned, this might only apply to my bug. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_1_80344c54804ddee81d89c0b40731fb9c._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_1_80344c54804ddee81d89c0b40731fb9c._comment new file mode 100644 index 000000000..93c4ce779 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_1_80344c54804ddee81d89c0b40731fb9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Remy" + ip="83.87.167.98" + subject="comment 1" + date="2013-12-02T19:32:18Z" + content=""" +i have the same problem on one of my repo's as well. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_2_1797c2fef5c20e885b56b8a2c6330ff0._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_2_1797c2fef5c20e885b56b8a2c6330ff0._comment new file mode 100644 index 000000000..8d08c3276 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_2_1797c2fef5c20e885b56b8a2c6330ff0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-12-02T19:52:04Z" + content=""" +Post the version of git-annex you're using, and `git annex sync --debug` output. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_3_fb23d640f9634cab2da91848f1848627._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_3_fb23d640f9634cab2da91848f1848627._comment new file mode 100644 index 000000000..10206a898 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_3_fb23d640f9634cab2da91848f1848627._comment @@ -0,0 +1,58 @@ +[[!comment format=mdwn + username="Remy" + ip="83.87.167.98" + subject="comment 3" + date="2013-12-03T08:35:21Z" + content=""" +> git-annex version + + git-annex version: 5.20131117-gbd514dc + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 5 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + + +> git-annex sync --debug bonus_remote + + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"git-annex\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..37a902328b4806d1549bf174241339432105d756\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..5e25b4c5c8c28d48b212c079767827e27819c379\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..2245416c2355c9e00f560bcde15b8856d8f924be\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..18e56479af7031d179cd4f4af4138b15211bea26\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..b74c5b5cfeecfeace64a4b31aabd7163c6c28f42\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..88fd933c3dbb56d2527c19d6b462c61d9213535c\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:07 CET] chat: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"cat-file\",\"--batch\"] + [2013-12-03 09:23:07 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"ls-files\",\"--stage\",\"-z\",\"--others\",\"--exclude-standard\",\"--\",\"/Users/remy/Sync\"] + [2013-12-03 09:23:07 CET] chat: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"cat-file\",\"--batch\"] + commit + [2013-12-03 09:23:13 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"commit\",\"-m\",\"git-annex automatic sync\"] + ok + [2013-12-03 09:23:13 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"symbolic-ref\",\"HEAD\"] + [2013-12-03 09:23:13 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"refs/heads/master\"] + [2013-12-03 09:23:13 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"--verify\",\"-q\",\"refs/heads/synced/master\"] + [2013-12-03 09:23:13 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/master..refs/heads/synced/master\",\"--oneline\",\"-n1\"] + pull bonus_remote + [2013-12-03 09:23:13 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"fetch\",\"bonus_remote\"] + [2013-12-03 09:23:14 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/bonus_remote/master\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/master..refs/remotes/bonus_remote/master\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"--verify\",\"-q\",\"refs/remotes/bonus_remote/synced/master\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/synced/master..refs/remotes/bonus_remote/synced/master\",\"--oneline\",\"-n1\"] + ok + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"git-annex\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..37a902328b4806d1549bf174241339432105d756\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..5e25b4c5c8c28d48b212c079767827e27819c379\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..2245416c2355c9e00f560bcde15b8856d8f924be\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..18e56479af7031d179cd4f4af4138b15211bea26\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..b74c5b5cfeecfeace64a4b31aabd7163c6c28f42\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] read: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"log\",\"refs/heads/git-annex..88fd933c3dbb56d2527c19d6b462c61d9213535c\",\"--oneline\",\"-n1\"] + [2013-12-03 09:23:14 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"branch\",\"-f\",\"synced/master\"] + [2013-12-03 09:23:14 CET] call: git [\"--git-dir=/Users/remy/Sync/.git\",\"--work-tree=/Users/remy/Sync\",\"branch\",\"-f\",\"master\"] + fatal: Cannot force update the current branch. + git-annex: failed to update refs/heads/master +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_4_a947736911e68856f2c3494963063df8._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_4_a947736911e68856f2c3494963063df8._comment new file mode 100644 index 000000000..c2a48b557 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_4_a947736911e68856f2c3494963063df8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmu416zAYgYzbXVZAe30MiXoOWO4z6nGX8" + nickname="Johannes" + subject="comment 4" + date="2013-12-05T16:31:04Z" + content=""" +I have the same problem. \"git annex repair\" does not detect any problems. +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_5_ce0e77143cfd2d578b1e5a71e35060da._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_5_ce0e77143cfd2d578b1e5a71e35060da._comment new file mode 100644 index 000000000..9b80220fb --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_5_ce0e77143cfd2d578b1e5a71e35060da._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="comment 5" + date="2013-12-07T18:14:21Z" + content=""" +I'm experiencing the same problem in one of my repositories on a couple computers now. + +> git-annex version: 5.20131118-gc7e5cde +> build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +> key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +> remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +> local repository version: 3 +> default repository version: 3 +> supported repository versions: 3 5 +> upgrade supported from repository versions: 0 1 2 4 + +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_6_10e114da6a2bb54b860b44767ba1ca94._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_6_10e114da6a2bb54b860b44767ba1ca94._comment new file mode 100644 index 000000000..b605de726 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_6_10e114da6a2bb54b860b44767ba1ca94._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="same here" + date="2013-12-11T19:57:09Z" + content=""" +I'm facing the same situation as the other commenters. + + git-annex version: 5.20131130-gc25be33 + [...] + (merging gitlab/synced/git-annex into git-annex...) + (Recording state in git...) + fatal: Cannot force update the current branch. + git-annex: failed to update refs/heads/master + +Seems to be a problem with the command `git branch -f master` +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_7_415bab6a7ab564e671f42cfad83e0e58._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_7_415bab6a7ab564e671f42cfad83e0e58._comment new file mode 100644 index 000000000..8b1824ede --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_7_415bab6a7ab564e671f42cfad83e0e58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 7" + date="2013-12-12T17:07:37Z" + content=""" +What branch does `git branch` say is checked out? + +If you're using direct mode, you should not have the master branch checked out. Instead you should have an `annex/direct/master` branch that direct mode sets up and automatically switches you to. (Commits are still made to the master branch when syncing.) +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_8_36abd829ea71a44c7cded1123a7c913d._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_8_36abd829ea71a44c7cded1123a7c913d._comment new file mode 100644 index 000000000..66f75327e --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_8_36abd829ea71a44c7cded1123a7c913d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 8" + date="2013-12-14T13:15:13Z" + content=""" +The master branch was checkout out (I don't know why). Checking out the mentioned branch fixed the syncing issue: `git checkout annex/direct/master` +"""]] diff --git a/doc/forum/Can_Not_Sync_to_Git_Repo/comment_9_2fb745aaffe544f97bbdc670261fd4fd._comment b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_9_2fb745aaffe544f97bbdc670261fd4fd._comment new file mode 100644 index 000000000..3bf1df783 --- /dev/null +++ b/doc/forum/Can_Not_Sync_to_Git_Repo/comment_9_2fb745aaffe544f97bbdc670261fd4fd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="etset" + ip="82.155.112.106" + subject="comment 9" + date="2013-12-19T12:45:06Z" + content=""" +I seem to have the same problem. I have two repositories added as ssh remotes to one another with the assistant. `git-annex sync` works on one of these, but not on the other, failing with the same error as above. Also, running `git-annex sync --debug` results in the same output as in Remy's above post. `git-annex repair` doesn't find any problem. Running `git branch` on both shows that neither repository has an `annex/direct/master` branch, and both have `master` checked out. + +One of the repositories has the current version from debian wheezy-backports, 4.20131106~bpo70+1, installed, and the other one had 5.20131130 from unstable as of when I discovered the problem (I upgraded it today, but the problem persists). I'm not sure, but I think those were the versions I used to create the repositores, too. + +Trying to reproduce the problem, I created a new repository via assistant on both computers, the one running 4.20131106~bpo70+1 and the one recently upgraded to 5.20131213. On the 5.* one, a `annex/direct/master` branch was created and checked out, but not on the 4.* one. However, adding each other as ssh remotes with the assistant makes the `annex/direct/master` on 5.* disappear and `master` to be checked out on both. + +Is there anything I can do to fix the repositories? Is there any other info I could provide to help with this? +"""]] diff --git a/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn new file mode 100644 index 000000000..9c0f5c7d7 --- /dev/null +++ b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn @@ -0,0 +1,41 @@ +I'm trying to automate syncing of two repos A and B. My goal is to run `git annex sync` from A and have the working copy of B updated automatically. According to the manual page, `git annex merge` should to the trick. It works just fine when I run it manually in B, but not when I run it from the post-receive hook, as suggested in the manual page. + +Here is a test script that illustrates the issue: + +The output I get: + + [...] + file1 exists after manual git annex merge + [...] + file2 does not exist after git annex merge in post-receive + +From the output I can see that `git annex merge` is run on the remote end, and seems to do it's thing (`file2` is added): + + remote: merge git-annex (merging synced/git-annex into git-annex...) + remote: ok + remote: merge synced/master Updating 6e5bfba..0dcbcfd + remote: Fast-forward + remote: file2 | 1 + + remote: 1 file changed, 1 insertion(+) + remote: create mode 120000 file2 + remote: + remote: ok + +However, the working copy in B does not have the file `file2`. Even worse, `git status` in B shows the file as deleted: + + # On branch master + # Your branch is ahead of 'origin/master' by 2 commits. + # + # Changes not staged for commit: + # (use "git add/rm ..." to update what will be committed) + # (use "git checkout -- ..." to discard changes in working directory) + # + # deleted: file2 + # + no changes added to commit (use "git add" and/or "git commit -a") + +So when running `git annex sync` from B now, the file will be deleted from A as well, which is not what I expected. + +This is on Ubuntu 12.04, using the precompiled git-annex tarball (amd64). + +What am I doing wrong? diff --git a/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_1_8b71cb6772b219c27c17392d5099907a._comment b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_1_8b71cb6772b219c27c17392d5099907a._comment new file mode 100644 index 000000000..cfaff89b1 --- /dev/null +++ b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_1_8b71cb6772b219c27c17392d5099907a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://kallesoderman.myopenid.com/" + ip="85.224.35.48" + subject="Same problem here" + date="2013-08-14T20:20:42Z" + content=""" +I'm trying to achieve [[USB_backup_with_files_visible/]] but can't make the post-recieve or post-update hooks have any effect. The filesystem is vfat so there are some issues with mounting defaults and executables (do the hooks have to be executable?) but regardless of mount options no dice. + + ``git-annex merge`` at the cli works perfectly. I havent been bitten by files being deleted and propagated though. + +Manually merging ruins my \"late for work need to bring data but to tired to think properly\" use case. +"""]] diff --git a/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_2_af2a2634d8d128868022d033d6adb549._comment b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_2_af2a2634d8d128868022d033d6adb549._comment new file mode 100644 index 000000000..0623ed1db --- /dev/null +++ b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_2_af2a2634d8d128868022d033d6adb549._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-23T18:35:01Z" + content=""" +Having just set up which uses a git hook to run `git annex merge`, I can say that the main problems you are likely to run into are: + +1. The hook might be run with the cwd not set to the top of the git repository. cd to the git repository in the hook to fix. +2. The hook might be run with `GIT_DIR` set to a strange value (in my case, it was set to \".\"), which is not the actual .git directory location. Unsetting it fixes that. + +I don't know about how to get git hooks to work on FAT filesystems though. Hooks have to be executable, and most systems probably don't mount such filesystems with executability allowed. +"""]] diff --git a/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_3_31ec762a0684d2ce87d229ed2924db93._comment b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_3_31ec762a0684d2ce87d229ed2924db93._comment new file mode 100644 index 000000000..2a56b57e9 --- /dev/null +++ b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_3_31ec762a0684d2ce87d229ed2924db93._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq495p0WtZDUpxzYN9YnToZGODfCGnqOw" + nickname="Stanis" + subject="comment 3" + date="2013-08-24T13:30:52Z" + content=""" +Thanks joey, that's exactly what was happening. + +Just to repeat it here, if anyone else runs into the same problem, your post-receive hook has to look like this: + + #!/bin/sh + unset GIT_DIR + cd .. + git annex merge + +"""]] diff --git a/doc/forum/Can__39__t_get_jabber_working.mdwn b/doc/forum/Can__39__t_get_jabber_working.mdwn new file mode 100644 index 000000000..6f129ee31 --- /dev/null +++ b/doc/forum/Can__39__t_get_jabber_working.mdwn @@ -0,0 +1,7 @@ +I've been running circles around the "jabber account setup" in assistant. I tried using jabber.org (isode) and jabber.de (openfire), but whatever I do I get thrown back to an Error page + +"Firefox can't establish a connection to the server at 127.0.0.1:61967." + +Assistant definetly tries to connect to the server (LittleSnitch is giving me a hint) and the connections are unblocked. Even after turning LittleSnitch off completely it won't work. On the other hand, I can connect to the servers using Jitsi without any problems. I'd be really thankful for any help. + +David diff --git a/doc/forum/Can__39__t_get_jabber_working/comment_1_def20bf0b3c1a188e4dad5ec67b455d8._comment b/doc/forum/Can__39__t_get_jabber_working/comment_1_def20bf0b3c1a188e4dad5ec67b455d8._comment new file mode 100644 index 000000000..e2491de64 --- /dev/null +++ b/doc/forum/Can__39__t_get_jabber_working/comment_1_def20bf0b3c1a188e4dad5ec67b455d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Edit:" + date="2014-01-14T16:31:05Z" + content=""" +I tried this on a OS X 10.9.1 and OS X 10.8.5 as well as the regular dmg download and the autobuild. +"""]] diff --git a/doc/forum/Can__39__t_get_jabber_working/comment_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment b/doc/forum/Can__39__t_get_jabber_working/comment_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment new file mode 100644 index 000000000..d4b296cd5 --- /dev/null +++ b/doc/forum/Can__39__t_get_jabber_working/comment_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 2" + date="2014-01-14T18:56:44Z" + content=""" +You apprear to be experiencing this bug: [[bugs/Share_with_friends_crash_in_osx]] +"""]] diff --git a/doc/forum/Can__39__t_get_jabber_working/comment_3_852dc402a286e38b77b99f174c33f8d1._comment b/doc/forum/Can__39__t_get_jabber_working/comment_3_852dc402a286e38b77b99f174c33f8d1._comment new file mode 100644 index 000000000..251047f26 --- /dev/null +++ b/doc/forum/Can__39__t_get_jabber_working/comment_3_852dc402a286e38b77b99f174c33f8d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Yes" + date="2014-01-15T01:41:12Z" + content=""" +Will put future comments there. Thanks you. +"""]] diff --git a/doc/forum/Can__39__t_get_jabber_working/comment_4_259741e146906ff70540390bdfe07002._comment b/doc/forum/Can__39__t_get_jabber_working/comment_4_259741e146906ff70540390bdfe07002._comment new file mode 100644 index 000000000..005759caf --- /dev/null +++ b/doc/forum/Can__39__t_get_jabber_working/comment_4_259741e146906ff70540390bdfe07002._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlm_3m5gLhML9bHbZ8FpJ-HBZhWaRfFeO8" + nickname="Corey" + subject="Same bug? OSX 10.9.1" + date="2014-01-23T23:38:32Z" + content=""" +… using Chrome. Connection to 127.0.0.1:XXXXX interrupted when setting up Jabber. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work.mdwn b/doc/forum/Can__39__t_get_pairing_to_work.mdwn new file mode 100644 index 000000000..fc45bffcb --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work.mdwn @@ -0,0 +1,5 @@ +I'm trying to pair my ~/music repositories on my two laptops (Ubuntu 10.04 and 12.04) using the Linux standalone tarball on my home WiFi network. After entering the same passphrase on both machines, nothing happens, both remain in "Pairing in progress" state. + +The router I'm using is, I think, fairly standard, it's a ZyXEL P-2812HNU-F1 with factory settings. + +Are others having the problem too? Any advice where I should start looking for what goes wrong? diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_1_b981977b4fb942fd109c37fcf40f35d7._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_1_b981977b4fb942fd109c37fcf40f35d7._comment new file mode 100644 index 000000000..5e6690354 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_1_b981977b4fb942fd109c37fcf40f35d7._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 1" + date="2012-10-11T23:48:37Z" + content=""" +It's not clear from your description whether you + +a) Started the pairing process independently on both machines... which probably doesn't work. + +b) Started pairing on one machine, and the other one noticed and popped up a pair request alert where +you re-entered the password. + +If b) didn't happen, then the the pairing broadcast is not being seen by the second machine. +You can try using tcpdump or wireshark to see the traffic. The traffic will look like this: + +
+19:45:11.125893 IP 10.1.1.2.43376 > 224.0.0.1.55556: UDP, length 692
+
+ +If all is going well, you should be able to see that on both the machine that's initiating the pairing and the other machine. And every other machine on the network for that matter. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_2_341e2ff6c88ace1b1422e16781edf580._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_2_341e2ff6c88ace1b1422e16781edf580._comment new file mode 100644 index 000000000..541b0e581 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_2_341e2ff6c88ace1b1422e16781edf580._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlZvtBCVyJw4O71OPsdwGpVh6iJ1W-xaPc" + nickname="Kilian" + subject="comment 2" + date="2012-10-17T14:39:58Z" + content=""" +Thanks - it seems to be a problem with my router's firmware. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment new file mode 100644 index 000000000..f1ade11f9 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2012-10-17T17:35:11Z" + content=""" +Well, that's interesting. I wonder if other broadcast network services work over your router? The most common one is probably the avahi/zeroconf services. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_4_169d77b30cea05125068ee1eeb2ef328._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_4_169d77b30cea05125068ee1eeb2ef328._comment new file mode 100644 index 000000000..7725a3a62 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_4_169d77b30cea05125068ee1eeb2ef328._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlZvtBCVyJw4O71OPsdwGpVh6iJ1W-xaPc" + nickname="Kilian" + subject="comment 4" + date="2012-10-18T22:44:40Z" + content=""" +Hmm... using avahi-discover the two machines can indeed see some services offered by each other. A git-annex-assistant specific problem after all? + +So when I initiate a pairing on 192.168.1.63, and run tcpdump on the same machine, it looks like this: + +ke@thot:~/opt/git-annex.linux$ sudo tcpdump -i eth1 host 224.0.0.1 -n +tcpdump: verbose output suppressed, use -v or -vv for full protocol decode +listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes +00:33:47.723989 IP 192.168.1.63.56243 > 224.0.0.1.55556: UDP, length 691 +00:33:49.729242 IP 192.168.1.63.55072 > 224.0.0.1.55556: UDP, length 691 +00:33:51.733358 IP 192.168.1.63.55115 > 224.0.0.1.55556: UDP, length 691 +00:33:53.736730 IP 192.168.1.63.60249 > 224.0.0.1.55556: UDP, length 691 +00:33:55.741641 IP 192.168.1.63.59753 > 224.0.0.1.55556: UDP, length 691 + +The same command (modulo different interface name) on the other machine (192.168.1.59) turns up nothing: + +ke@apis:~/opt/git-annex.linux$ sudo tcpdump -i wlan0 host 224.0.0.1 -n +tcpdump: verbose output suppressed, use -v or -vv for full protocol decode +listening on wlan0, link-type EN10MB (Ethernet), capture size 96 bytes +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_5_70e6c4f4f01277be1767b38ca8374793._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_5_70e6c4f4f01277be1767b38ca8374793._comment new file mode 100644 index 000000000..2b249ab57 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_5_70e6c4f4f01277be1767b38ca8374793._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 5" + date="2012-10-22T16:18:56Z" + content=""" +So, the only difference I can think of is that avahi uses a different multicast address than the one I picked for git-annex. It may be that your router is only letting that one address through even though it's supposed to let a whole range through. + +I've prepared a test build of git-annex that uses the same 224.0.0.251 address avahi does. http://downloads.kitenet.net/tmp/git-annex-standalone-i386.tar.gz (i386 build) +If you can try that and see how it behaves, I'll see if I need to change the address. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_6_2cd014a76fac6e08269dfd8146957418._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_6_2cd014a76fac6e08269dfd8146957418._comment new file mode 100644 index 000000000..49a5a9ac9 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_6_2cd014a76fac6e08269dfd8146957418._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlZvtBCVyJw4O71OPsdwGpVh6iJ1W-xaPc" + nickname="Kilian" + subject="comment 6" + date="2012-10-22T19:44:45Z" + content=""" +Yep, with the test build I see the pair request and can respond to it! + +Pairing doesn't seem to succeed, but that looks like a different issue. I'll try around some more and report back, probably in a new thread. +"""]] diff --git a/doc/forum/Can__39__t_get_pairing_to_work/comment_7_b9b715084d5a5562998b1724699d49e5._comment b/doc/forum/Can__39__t_get_pairing_to_work/comment_7_b9b715084d5a5562998b1724699d49e5._comment new file mode 100644 index 000000000..69d6e12e0 --- /dev/null +++ b/doc/forum/Can__39__t_get_pairing_to_work/comment_7_b9b715084d5a5562998b1724699d49e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 7" + date="2012-10-22T19:49:44Z" + content=""" +All right, I'll change the address. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex.mdwn b/doc/forum/Can__39__t_init_git_annex.mdwn new file mode 100644 index 000000000..85be0e107 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex.mdwn @@ -0,0 +1,15 @@ +It seems I can't initialize git annex: + + $ git annex init "files2" + init files2 + pre-commit hook (/Volumes/project/annex/.git/hooks/pre-commit) already exists, not configuring + + git-annex: waitToSetLock: failed (Operation not supported) + failed + git-annex: init: 1 failed + $ + + + `project` is a remote file server connected via `smb://`. + + Any ideas why and how to fix? diff --git a/doc/forum/Can__39__t_init_git_annex/comment_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment b/doc/forum/Can__39__t_init_git_annex/comment_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment new file mode 100644 index 000000000..273d0c135 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 10" + date="2012-10-16T05:52:08Z" + content=""" +If you need a git repository with your regular file names on the smb share, none of the special remotes will meet your needs. You'd need to find a way to make it support POSIX locking to use git-annex on it in a full git repository. + +But I think that in most cases a directory special remote on such a share, with the git repository kept locally and git-annex used to pull files down to it as needed, would work ok. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_12_fca9ed3707e097bee2cd642424681005._comment b/doc/forum/Can__39__t_init_git_annex/comment_12_fca9ed3707e097bee2cd642424681005._comment new file mode 100644 index 000000000..adc9fba3b --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_12_fca9ed3707e097bee2cd642424681005._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 12" + date="2012-10-16T06:01:44Z" + content=""" +OK; The purpose of putting files on the remote `smb://` partition is to publish these big data files, so other (potentially non-technical) people can download and use them. They'll not be willing to learn how to use git, let alone git-annex. And i have multiple development machines that can generate revisions/updates to these big files. I previously just rsync from/to various development machines to/from this smb partition, but i find sometimes I don't always srync in correct direction. The hope is i can have annex on these development machines, and set the smb:// partition as the remote for these git annex. But it sounds like none of the special remote will have the original form, and a normal remote is not possible on smb:// partition. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_1_a294b5e7e52aa9f66a708866be16f137._comment b/doc/forum/Can__39__t_init_git_annex/comment_1_a294b5e7e52aa9f66a708866be16f137._comment new file mode 100644 index 000000000..2dd0575ec --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_1_a294b5e7e52aa9f66a708866be16f137._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 1" + date="2012-10-16T02:52:26Z" + content=""" +The smb:// is a red flag to me. git-annex relies on POSIX file locking, and I'll bet smb does not provide that, or, perhaps, your samba server needs a configuration change to support it. + +You might consider putting your git annex repository on the local filesystem, and setting up a [[special_remote|special_remotes]] on smb. The [[special_remotes/directory]] special remote is a likely choice. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_2_fcf678d5188821d63b4c9ea5b59474a8._comment b/doc/forum/Can__39__t_init_git_annex/comment_2_fcf678d5188821d63b4c9ea5b59474a8._comment new file mode 100644 index 000000000..c3596a518 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_2_fcf678d5188821d63b4c9ea5b59474a8._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 2" + date="2012-10-16T03:19:43Z" + content=""" +Thanks for getting back so quick; So, after doing + + git annex initremote smb type=directory directory=/Volumes/subproject/ encryption=none + git annex describe smb \"smb://XXXhost.com/subproject\" + +What else do i need to do? Do i need to `git init` and/or `git annex init` in `/Volumes/subproject/`? +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_3_c83f7dea7d5304e226e52eb3c43ef14a._comment b/doc/forum/Can__39__t_init_git_annex/comment_3_c83f7dea7d5304e226e52eb3c43ef14a._comment new file mode 100644 index 000000000..c7680bc93 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_3_c83f7dea7d5304e226e52eb3c43ef14a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 3" + date="2012-10-16T04:12:55Z" + content=""" +Nope, you're set with just those two commands. You can now do things like \"git annex copy --to smb\" +to put files there, and \"git annex get\" will get files from there as necessary. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_4_06a01dd51ffbfd006c0afb8eab40b530._comment b/doc/forum/Can__39__t_init_git_annex/comment_4_06a01dd51ffbfd006c0afb8eab40b530._comment new file mode 100644 index 000000000..421f98e62 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_4_06a01dd51ffbfd006c0afb8eab40b530._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 4" + date="2012-10-16T04:17:11Z" + content=""" +Could i use (some variant of) `git annex sync` to do two-way sync between local and `smb`? +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_5_53c33484bded57abc60f0449331c7b05._comment b/doc/forum/Can__39__t_init_git_annex/comment_5_53c33484bded57abc60f0449331c7b05._comment new file mode 100644 index 000000000..5bbbb7360 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_5_53c33484bded57abc60f0449331c7b05._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 5" + date="2012-10-16T04:23:59Z" + content=""" +`git annex sync` only syncs the git repository, not file contents, and the special remote has no git repo, only file contents. `git annex copy` will avoid transferring things that are already there, so it's the way to go. + +If you want automatic syncing of file contents and lots of other magic including automatic commit of new files, you could try the [[assistant]]. + +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment b/doc/forum/Can__39__t_init_git_annex/comment_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment new file mode 100644 index 000000000..36c0bb5d5 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 6" + date="2012-10-16T04:38:40Z" + content=""" +OK; The reason i ask about `git annex sync` is because I had previously copied the large files onto `smb://` before setting up the `annex` and don't want to unnecessarily transfer large data over Internet again. But now if i do `git annex copy --to smb`, and check what's added/changed in `smb` end, i found + + $ cd /Volumes/subproject + $ ls + 091 383 bigdir1 bigfile1 ... + +The files with numbers in names such as`091`, `383` are being added, the `bigfile1` and `bigdir1` are the ones previously copied there. What are those `091`, `383` etc. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment b/doc/forum/Can__39__t_init_git_annex/comment_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment new file mode 100644 index 000000000..9c29567f6 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 7" + date="2012-10-16T04:52:12Z" + content=""" +That's where it stores files in the directory special remote. You can move the similar contents of /Volumes/subproject/.git/annex/objects/ to the same place as those and then run `git annex fsck --from smb --fast` and it'll learn about those files you already transferred. + +You probably also want to delete /Volumes/subproject/.git afterwards, and any git working tree that was checked out there before; the directory special remote does not use the git repository that you had there before. +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment b/doc/forum/Can__39__t_init_git_annex/comment_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment new file mode 100644 index 000000000..8f37408f7 --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 8" + date="2012-10-16T05:22:54Z" + content=""" +Oh, I see. But what I need on the remote partition `/Volumes/subproject` connected via `smb://` is the actual `bigdir1` and `bigfile`, not the encoded objects. Maybe I should use some other types of special remote? +"""]] diff --git a/doc/forum/Can__39__t_init_git_annex/comment_9_31a45f6a72266190b3ed7a7b02e03d5b._comment b/doc/forum/Can__39__t_init_git_annex/comment_9_31a45f6a72266190b3ed7a7b02e03d5b._comment new file mode 100644 index 000000000..94db3f2fe --- /dev/null +++ b/doc/forum/Can__39__t_init_git_annex/comment_9_31a45f6a72266190b3ed7a7b02e03d5b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZ0g2UAijV7RGrKtWPljCCAYHBJ3pwPvM" + nickname="Meng" + subject="comment 9" + date="2012-10-16T05:33:06Z" + content=""" +Maybe i didn't explain clearly at the beginning: `/Volumes/subproject` is a remote partition connected via smb://. It doesn't have a `.git`. The content I mentioned previously \"copied\" there was copied via `cp -R`. And my local annex is `~/project/subproject` and it does have `.git` and `.git/annex` in it. +"""]] diff --git a/doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn new file mode 100644 index 000000000..d63acdcb8 --- /dev/null +++ b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn @@ -0,0 +1,36 @@ +###Tried to install git-annex.app + +- App hangs up +- Cpu "git" load is 100 +- Had to force quite git-annex + +###Install thru command line: using Brew + +- Installed haskell +- updated cabal +- But when I do: + +` +cabal install git-annex --bindir=$HOME/bin +` + +**I get this** + + Resolving dependencies... + Configuring gnuidn-0.2... + cabal: The program c2hs is required but it could not be found. + Configuring libxml-sax-0.7.3... + cabal: The pkg-config package libxml-2.0 is required but it could not be found. + cabal: Error: some packages failed to install: + git-annex-3.20121127.1 depends on libxml-sax-0.7.3 which failed to install. + gnuidn-0.2 failed during the configure step. The exception was: + ExitFailure 1 + libxml-sax-0.7.3 failed during the configure step. The exception was: + ExitFailure 1 + network-protocol-xmpp-0.4.4 depends on libxml-sax-0.7.3 which failed to install. + +Any help would be greatly appreciated. + +Thanks, + +Carlito diff --git a/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_1_c44023d81e9e4f7c9341af0e4271a1e4._comment b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_1_c44023d81e9e4f7c9341af0e4271a1e4._comment new file mode 100644 index 000000000..43f86c8b0 --- /dev/null +++ b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_1_c44023d81e9e4f7c9341af0e4271a1e4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 1" + date="2012-12-06T18:09:13Z" + content=""" +The lack of c2hs can be dealt with by `cabal install c2hs` (which the install instructions already say to do). + +Nobody currently understands why git commands are spinning and using all CPU when run by the app. This is being tracked at [[bugs/OSX_app_issues]]. +"""]] diff --git a/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment new file mode 100644 index 000000000..904fbb15c --- /dev/null +++ b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlxKQEwwP6J58W0Dmfq0-v0j3LXtT5gNAA" + nickname="Carlito" + subject="Thanks" + date="2012-12-06T19:23:48Z" + content=""" +Thanks joey! + +Sorry missed `cabal install c2hs` in the instruction. But got passed that and still can't install. + + Resolving dependencies... + Configuring libxml-sax-0.7.3... + cabal: The pkg-config package libxml-2.0 is required but it could not be found. + cabal: Error: some packages failed to install: + git-annex-3.20121127.1 depends on libxml-sax-0.7.3 which failed to install. + libxml-sax-0.7.3 failed during the configure step. The exception was: + ExitFailure 1 + network-protocol-xmpp-0.4.4 depends on libxml-sax-0.7.3 which failed to install. + +I tried + + brew install libxml2 + cabal install libxml + +Also I added $HOME/.cabal/bin to my path + +Thanks, + +Carlito +"""]] diff --git a/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_3_b37b2a9906ffb956cca91adb4bb4e521._comment b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_3_b37b2a9906ffb956cca91adb4bb4e521._comment new file mode 100644 index 000000000..dbfff2a84 --- /dev/null +++ b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_3_b37b2a9906ffb956cca91adb4bb4e521._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.162" + subject="comment 3" + date="2012-12-06T21:20:19Z" + content=""" +I can't help with installing libraries on OSX, but you can disable XMPP support in git-annex like this: \"cabal install git-annex -f-XMPP\" +"""]] diff --git a/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_4_afddf16f8faedc78d458835480f10dc3._comment b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_4_afddf16f8faedc78d458835480f10dc3._comment new file mode 100644 index 000000000..c221455fc --- /dev/null +++ b/doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_4_afddf16f8faedc78d458835480f10dc3._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlxKQEwwP6J58W0Dmfq0-v0j3LXtT5gNAA" + nickname="Carlito" + subject="Got it to work!" + date="2012-12-06T22:17:55Z" + content=""" +Had to link it: + + brew install libxml2 + brew link libxml2 + +Thanks for your help. + +Will test out annex and leave any bug reports. +"""]] diff --git a/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__.mdwn b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__.mdwn new file mode 100644 index 000000000..0b49f422f --- /dev/null +++ b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__.mdwn @@ -0,0 +1,76 @@ +Hi, I tried with several git annex versions, on 3 different clients, and using 2 different remotes (an home server and box.com) and trying out different remotes setups but I've been unable to get git annex working as I expected. + + +I used the assistant for setup, I can sync files between clients just fine if they're connected at the same time, but if I sync a file from client A to the remotes when client B is off, and then later I turn off client A and power on client B, I've never been able to successfully sync files. + +on client B, inside .git/annex/daemon.log there's nothing interesting: just messages like: + +```(scanning...) [2014-06-03 14:53:26 CEST] Watcher: Performing startup scan + +Already up-to-date.``` + +`git annex sync` just outputs + +`"commit ok"` + +and `git annex list`: + +``` +here + +|berdario + +||soloud + +|||web + +||||box.com + +||||| + +XX__X IMG_20130202_100444.jpg + +XXX_X cookies.png + +XXX_X dancingllama.png + +XXX_X dario_bertini_cv.pdf + +XX__X steam_latest.deb +``` + +while this is what I get on client A: + +``` +here + +|berdario + +||web + +|||box.com + +|||| + +XX_X IMG_20130202_100444.jpg + +X__X Russian Lesson 5 - Wikibooks, open books for an open world.html + +XX_X cookies.png + +XX_X dancingllama.png + +XX_X dario_bertini_cv.pdf + +XX_X steam_latest.deb +``` + +(they're just a bunch of random files I'm using to test it, both clients are called berdario, soloud is the home server (currently down) and the other working remote is box.com) + +As you can see the russian wikibooks html file is successfully synced with the remotes, but client B is unable to see it... + +I tried to set the remotes as incremental backup, full backup, transfer, client (!?) but none of these settings work. + +Is git annex not what I'm looking for? Is it supposed to work only on contemporarily connected clients? + +Thanks diff --git a/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_1_a3fbae205c0312436f8861f432643811._comment b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_1_a3fbae205c0312436f8861f432643811._comment new file mode 100644 index 000000000..a5baa31f3 --- /dev/null +++ b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_1_a3fbae205c0312436f8861f432643811._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-04T18:21:13Z" + content=""" +your box.com repository only stores encrypted file contents, it does not include the git repository. So you need to either set up XMPP, which will allow the clients to sync while they're turned on, or you need to put a git repository on a remote server, which the clients can use to sync anytime. + +Recent versions of git-annex allow encrypting the git repository. Use the \"remote server\" option in the webapp UI to set it up. +"""]] diff --git a/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_2_de49cf261c644a6e7f6ac881a48d4e6c._comment b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_2_de49cf261c644a6e7f6ac881a48d4e6c._comment new file mode 100644 index 000000000..552a6db2b --- /dev/null +++ b/doc/forum/Can_git_annex___40__mostly__41___be_an_Ubuntu_One___40__or_Dropbox...__41___substitute__63__/comment_2_de49cf261c644a6e7f6ac881a48d4e6c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk0Sr9y7EcI5OhPk4GteZiHVxaoC0DmJ-E" + nickname="Dario" + subject="comment 2" + date="2014-06-05T09:10:40Z" + content=""" +I have set up XMPP already. I thought it was obvious, since otherwise you wouldn't even be able to share a remote with other clients (it would overwrite the contents) + +And the same problem happens with a remote server +"""]] diff --git a/doc/forum/Can_not_delete_Repository.mdwn b/doc/forum/Can_not_delete_Repository.mdwn new file mode 100644 index 000000000..549b47c3d --- /dev/null +++ b/doc/forum/Can_not_delete_Repository.mdwn @@ -0,0 +1,3 @@ +I have one repository that I deleted a while back. When I mark it as dead in command line it disappears from git annex info however when I run webapp it pops back webapp shows it as syncing disabled. When I try to delete it from the webapp it does not delete. I tried shutting down the daemon mark it as dead again then run git annex forget --drop-dead --force but running it makes the repo active again instead of deleting it. + +Repo in question was a S3 repo. I tried deleting it using both its name and uuid. diff --git a/doc/forum/Can_not_delete_Repository/comment_1_b1a9420974e2e50c9c86a379ad62502c._comment b/doc/forum/Can_not_delete_Repository/comment_1_b1a9420974e2e50c9c86a379ad62502c._comment new file mode 100644 index 000000000..050127c24 --- /dev/null +++ b/doc/forum/Can_not_delete_Repository/comment_1_b1a9420974e2e50c9c86a379ad62502c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-21T17:36:03Z" + content=""" +Marking a repository as dead does not mean it is deleted. The way this is supposed to work, using the webapp is you tell it to start deleting the repository, which causes it to mark it as dead, and also, crucially, puts it into the \"unwanted\" group. This does not remove it from the list yet, but it causes all files located in the repository to be moved off it (assuming the repository can still be accessed). + +Then once the webapp detects that the repository is empty it will prompt you to continue the deletion process and truely remove it. It can take quite a while for the webapp to get around to this last step, since it's done during the expensive transfer scan, which it tries to avoid running unnecessarily. + +In any case, you can always edit .git/config and delete the remote, which should make the webapp no longer show it, as long as it's marked as dead. +"""]] diff --git a/doc/forum/Can_not_drop_unused_file.mdwn b/doc/forum/Can_not_drop_unused_file.mdwn new file mode 100644 index 000000000..8ec48eb14 --- /dev/null +++ b/doc/forum/Can_not_drop_unused_file.mdwn @@ -0,0 +1,14 @@ +I have encrypted directory remote on a usb drive over time it accumulated some unused files. I would like to drop them running, + + git annex --unused --from external + +returns a list of unused files when I try to drop them with, + + + git annex dropunused --force --from external 1-XX + +I get, + + dropunused XX (from external...) failed + +I can not seem to get rid of these files. diff --git a/doc/forum/Can_not_drop_unused_file/comment_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment b/doc/forum/Can_not_drop_unused_file/comment_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment new file mode 100644 index 000000000..4a6eacc51 --- /dev/null +++ b/doc/forum/Can_not_drop_unused_file/comment_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 1" + date="2014-01-18T22:39:37Z" + content=""" +One reason it might fail (especially if it's not printing any useful message beyond \"(failed)\") is if it thought the file was present in the repositort, but something has happened to it. + +So, I suggest you try: + +git annex fsck --from external + +Followed by dropping again. + +If that doesn't help, I'd recommend stracing the dropping of one of the unused files, and see what's going wrong toward the end. +"""]] diff --git a/doc/forum/Can_not_drop_unused_file/comment_2_ed1543cff5e6e81ca18c43b716ca8199._comment b/doc/forum/Can_not_drop_unused_file/comment_2_ed1543cff5e6e81ca18c43b716ca8199._comment new file mode 100644 index 000000000..321e10761 --- /dev/null +++ b/doc/forum/Can_not_drop_unused_file/comment_2_ed1543cff5e6e81ca18c43b716ca8199._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-01-19T23:56:17Z" + content=""" +I've tried, + + git annex fsck --from external + +and + + git annex fsck --all --from external + +did not solve the problem. Running, + + strace git annex dropunused 1 --from external --force + +tail of strace produces, + + clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidp + tr=0x7f3a8d6d8a10) = 5746 + rt_sigaction(SIGINT, {0x4e1fb0, [INT], SA_RESTORER|SA_RESTART, 0x7f3a8c8b60b0}, {SIG_D + FL, [], 0}, 8) = 0 + rt_sigaction(SIGHUP, {0x4e1fb0, [HUP], SA_RESTORER|SA_RESTART, 0x7f3a8c8b60b0}, {SIG_D + FL, [], 0}, 8) = 0 + rt_sigaction(SIGTERM, {0x4e1fb0, [TERM], SA_RESTORER|SA_RESTART, 0x7f3a8c8b60b0}, {SIG + _DFL, [], 0}, 8) = 0 + rt_sigaction(SIGQUIT, {0x4e1fb0, [QUIT], SA_RESTORER|SA_RESTART, 0x7f3a8c8b60b0}, {SIG + _DFL, [], 0}, 8) = 0 + rt_sigaction(SIGPIPE, {0x4e1fb0, [PIPE], SA_RESTORER|SA_RESTART, 0x7f3a8c8b60b0}, {SIG + _DFL, [], 0}, 8) = 0 + close(5) = 0 + read(4, \"\", 1) = 0 + close(4) = 0 + wait4(5746, dropunused 1 (from external...) (gpg) failed + git-annex: dropunused: 1 failed + [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 5746 + --- SIGCHLD (Child exited) @ 0 (0) --- + exit_group(1) = ? + +"""]] diff --git a/doc/forum/Can_not_drop_unused_file/comment_3_0c9c9c0ed557af4845a67434c21bb4bc._comment b/doc/forum/Can_not_drop_unused_file/comment_3_0c9c9c0ed557af4845a67434c21bb4bc._comment new file mode 100644 index 000000000..8a1ecfdd2 --- /dev/null +++ b/doc/forum/Can_not_drop_unused_file/comment_3_0c9c9c0ed557af4845a67434c21bb4bc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 3" + date="2014-01-20T16:33:27Z" + content=""" +I see you're using encryption. That could have something to do with the problem. Which type of encryption was used for this special remote? encryption=shared or one of the other options? + +Look through the whole strace output for attempts to access the directory special remote and show those. Or put up the full strace somewhere. +"""]] diff --git a/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn new file mode 100644 index 000000000..684893e84 --- /dev/null +++ b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn @@ -0,0 +1,13 @@ +I'm wondering if it is possible to have remotes that don't have the *content* of git-annex tracked. + +# My use case: + +I have a number of projects that I am working on at any one time. They all are tracking independently by `git` and more recently I am using `git annex` to manage the large files. + +However because I have so many projects I work on one (called `AAA`), move to another, delete `AAA` to save disk space, ...time passes... return to `AAA`. + +Now, prior to `git-annex` I could just clone `AAA` from my central repository folder do work, commit, push, repeat and then delete and there is no indication that I had one, or many copies of `AAA` floating around. Now with `git-annex` there is some trail of me cloning, running `git annex get`, etc. + +Is there some way to set a remote as `untracked`? By that I mean it is classed as `untrusted` - so I can move files around, add them, copy to trusted remotes and delete the whole repository without worrying about losing data - but it also doesn't push any of the git-annex tracking info of where a copy of a file actually is. I don't want to know if any or all of my other `untracked` repositories have a copy of a file or not. + +I don't want my `git annex whereis` polluted with many references to repositories that just don't exist any more. I guess I could set them to dead but that still keeps all of the tracking info around in all the repos, which seems unnecessary... diff --git a/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment new file mode 100644 index 000000000..955c256ca --- /dev/null +++ b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-07T16:27:21Z" + content=""" +This seems like a reasonable request, so I've opened [[todo/untracked_remotes]] + +I will note that if you know the annex.uuid of the previous AAA repository, you can make the new one use that same uuid, just `git config annex.uuid $UUID`. (`git annex fsck --fast` would be a good idea after doing that.) +"""]] diff --git a/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_2_7cde9785886c8450e1475f0b54481ae3._comment b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_2_7cde9785886c8450e1475f0b54481ae3._comment new file mode 100644 index 000000000..92713db01 --- /dev/null +++ b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_2_7cde9785886c8450e1475f0b54481ae3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2014-01-02T17:26:35Z" + content=""" +I have now implemented a way to mark a remote as readonly. This prevents git-annex from pushing anything to the remote, or modifying it in other ways. + +It seems that in your use case, you might want to avoid git-annex sync pushing the git-annex branch, but still push a branch like master. So far, it's up to you to decide which branches to manually push; readonly disables all pushing. +"""]] diff --git a/doc/forum/Cannot_find_git-annex_in_server.mdwn b/doc/forum/Cannot_find_git-annex_in_server.mdwn new file mode 100644 index 000000000..6208c288e --- /dev/null +++ b/doc/forum/Cannot_find_git-annex_in_server.mdwn @@ -0,0 +1,10 @@ +My server is running the precompiled tarball https://downloads.kitenet.net/git-annex/linux/current/ + +git-annex version: 4.20130531-g5df09b5 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +The tarball is untared in "/opt/git-annex.linux" and this location is added to the users path in ".profile", who can launch the webapp as usual and so on. + +But when a git-annex client from another computer tries to stablish a remote server repository with the server via ssh, it will complain "/usr/bin/git-annex", "runshell" and so on are missing. And if the binaries in "/opt/git-annex.linux" are symlinked in "/usr/bin" they will start to miss the other bin and libs in the "/opt/git-annex.linux" source tree. + +As you can understand, I can't put the whole "/opt/git-annex.linux" folder tree in "/usr/bin". Is there any solution to make the precompiled tarball work properly as a git-annex server? diff --git a/doc/forum/Cannot_find_git-annex_in_server/comment_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment b/doc/forum/Cannot_find_git-annex_in_server/comment_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment new file mode 100644 index 000000000..b5685c901 --- /dev/null +++ b/doc/forum/Cannot_find_git-annex_in_server/comment_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-20T15:23:32Z" + content=""" +The standalone tarball does not need to be installed in /usr/bin or any other particular location. I *never* hardcode /usr/bin in anything. + +It seems likely to me that you have not correctly added /opt/git-annex.linux to PATH. You mention `.profile` -- but this is only used +by bash when starting a login shell. So any non-login shells won't have it in path. You need to put something in .bashrc for that. + +Also, to use git-annex on a server, there is no reason at all to install the latest and greatest version. Any version 3 or greater build of git-annex will work fine on a server with newer git-annex versions on clients. So `apt-get install git-annex` is a much easier and nicer way to install it on a server. Most linux distributions have a package of git-annex and an easy way to install it. + +(It would also help if you pasted actual error messages, rather than a summary of an error message.) +"""]] diff --git a/doc/forum/Cannot_find_git-annex_in_server/comment_2_168dda4aed09f90a510bc453e8a7cda7._comment b/doc/forum/Cannot_find_git-annex_in_server/comment_2_168dda4aed09f90a510bc453e8a7cda7._comment new file mode 100644 index 000000000..48c0a65af --- /dev/null +++ b/doc/forum/Cannot_find_git-annex_in_server/comment_2_168dda4aed09f90a510bc453e8a7cda7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmCEE7m7pm6lqvYmgRSESRP9xqmmMm9ox8" + nickname="Daniel" + subject="comment 2" + date="2013-06-20T20:14:25Z" + content=""" +I'd rather use the package from the repositories. But this server is running an openSUSE install and the package manager could not resolve the Haskell dependencies of the unofficial git-annex rpm package. + +Indeed, performing the PATH extension in \".bashrc\", not in \".profile\", solved the issue. I feel like a newbie. Thanks for the express answer! +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn new file mode 100644 index 000000000..351c6f92d --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn @@ -0,0 +1,6 @@ +Hi, I have installed latest version from https://launchpad.net/~rubiojr/+archive/git-annex, that is git-annex version: 3.20121017-ubuntu1ppa1~precise +When running git annex webapp I get + +git-annex: unknown command webapp + +I only installed git-annex. Are there more packages to be installed to make it work? diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_1_9345551f5772c3a6f1490b00e1edbf69._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_1_9345551f5772c3a6f1490b00e1edbf69._comment new file mode 100644 index 000000000..aae67b95e --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_1_9345551f5772c3a6f1490b00e1edbf69._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 1" + date="2013-04-23T08:39:50Z" + content=""" +This version does not have the webapp. Use a newer one (maybe you need the standalone build) +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_2_0b688a442b6a911a0353e73097a24cb6._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_2_0b688a442b6a911a0353e73097a24cb6._comment new file mode 100644 index 000000000..b83eb40ec --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_2_0b688a442b6a911a0353e73097a24cb6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="tomas" + ip="64.103.25.104" + subject="comment 2" + date="2013-04-23T11:50:21Z" + content=""" +According to documentation: +http://git-annex.branchable.com/assistant/ +The git-annex assistant comes as part of git-annex, starting with version 3.20120924. + +So it should be there in 3.20121017, no? +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_3_7e246caa00005560bb489c927c663046._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_3_7e246caa00005560bb489c927c663046._comment new file mode 100644 index 000000000..e2463ba23 --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_3_7e246caa00005560bb489c927c663046._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-23T16:05:31Z" + content=""" +git-annex can be built without the webapp, and if some of the necessary dependencies for the webapp are not available, it will build without it by default. More recent versions than that one let you run `git annex version` and see the build flags, which can all be disabled due to missing dependencies. For example: + + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Sergio does seem to be trying to backport all the dependencies of the webapp, but it looks to me like some of them, particularly haskell-xml-hamlet, have not successfully built yet. +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_4_1d8025aabe8bc72711a77f691f67da5f._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_4_1d8025aabe8bc72711a77f691f67da5f._comment new file mode 100644 index 000000000..4c050f052 --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_4_1d8025aabe8bc72711a77f691f67da5f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="fmarier" + ip="121.98.93.240" + subject="My PPA (Ubuntu Precise) has git-annex 4.20130417" + date="2013-04-27T23:31:54Z" + content=""" +It has the 90+ Haskell packages that are required to build git annex with every backend: https://launchpad.net/~fmarier/+archive/ppa +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_5_7c2f95da65190016192424e7c622122f._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_5_7c2f95da65190016192424e7c622122f._comment new file mode 100644 index 000000000..6821da22d --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_5_7c2f95da65190016192424e7c622122f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Debian Sid PowerPC is also without webapp" + date="2013-05-07T09:44:31Z" + content=""" +Took me a couple of minutes to figure out why git-annex on my old Apple G4 wouldn't recognise the webapp command. Comparing the version command output on AMD64 and PowerPC made it obvious. +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_6_9b8465cefe609e7a696e7573b8892e38._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_6_9b8465cefe609e7a696e7573b8892e38._comment new file mode 100644 index 000000000..b2a6e55bb --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_6_9b8465cefe609e7a696e7573b8892e38._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="tomas" + ip="188.167.111.235" + subject="thanks for the ppa" + date="2013-05-08T10:04:25Z" + content=""" +Thanks François for your work +"""]] diff --git a/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_7_af6472762a598a454ba52ac0caa059aa._comment b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_7_af6472762a598a454ba52ac0caa059aa._comment new file mode 100644 index 000000000..d205e653d --- /dev/null +++ b/doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_7_af6472762a598a454ba52ac0caa059aa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="New location for my PPA" + date="2013-06-15T07:41:03Z" + content=""" +My Ubuntu Precise PPA has moved here: https://launchpad.net/~fmarier/+archive/git-annex + +It contains version 20130601 of git-annex. +"""]] diff --git a/doc/forum/Centralized_repository_with_webapp.mdwn b/doc/forum/Centralized_repository_with_webapp.mdwn new file mode 100644 index 000000000..6a9fb285d --- /dev/null +++ b/doc/forum/Centralized_repository_with_webapp.mdwn @@ -0,0 +1,13 @@ +Hi, + +I'm kind of new to git-annex, I've been following it for a while and tried small task, but never used it in a real situation. +I'm now trying to sync various computers through a central server and I'm having some problems, so I think I might be doing something wrong. + +I have a remote server that I want to use as central server. I use the webapp to configure client 1 to use that server as remote server and using git (so I assume it stores the files and the tree). I then create the client 2 in another computer and doing the exact same steps. +Initially everything seams to work, but after a few modifications in the clients weird things start to happen, files only in one client, some files don't get updated, etc. + +I guess I'm doing something wrong (maybe I need to clone the repo in client 2 instead of creating a new one?) but I can't figure out how to solve it. + +Any tip that could help me? + +Thanks! diff --git a/doc/forum/Centralized_repository_with_webapp/comment_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment b/doc/forum/Centralized_repository_with_webapp/comment_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment new file mode 100644 index 000000000..78866072e --- /dev/null +++ b/doc/forum/Centralized_repository_with_webapp/comment_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-11T15:13:32Z" + content=""" +Your setup is fine as far as it goes. The problem is that a client has no way to know when another client has pushed a change to the centralized repository. It might take quite a while before it decides on its own to go pull changes from there (most often because *it* has now changed a file, and realizes it needs to sync), and so it won't see files the other client has added right away. + +The solution to this is to go to Configuration -> Jabber account, and set both clients up using the same Jabber account. (Or, if these two machines belong to different people, you can pick \"pair with a friend\" to link one with the other over Jabber.) + +Now when one client pushes to the centralized repository, it will immediately send the other a message letting it know something has changed. + +The webapp actually pops up an alert when you add that centralized ssh repository, to nudge you to do this: + +[[/assistant/xmppnudge.png]] + +I'm trying to find ways to make the need to do this more clear... +"""]] diff --git a/doc/forum/Centralized_repository_with_webapp/comment_2_08c84f2703f89dc12982eba9dd2a06d1._comment b/doc/forum/Centralized_repository_with_webapp/comment_2_08c84f2703f89dc12982eba9dd2a06d1._comment new file mode 100644 index 000000000..a6686f6a3 --- /dev/null +++ b/doc/forum/Centralized_repository_with_webapp/comment_2_08c84f2703f89dc12982eba9dd2a06d1._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2013-03-13T23:52:32Z" + content=""" +Hi Joey, + +My problem isn't that the repositories don't sync immediately, they are never up at the same time and I understand that the assistant is not constantly checking for changes, so that's not an issue. +The problem is that with this setup I'm experiencing data loss (files being completely removed from both repos), it has happened a few times, but I cant seam to reproduce it reliably. I'll keep investigating and get back to you if I have a proper bug. +"""]] diff --git a/doc/forum/Change_remote_server_address.mdwn b/doc/forum/Change_remote_server_address.mdwn new file mode 100644 index 000000000..722b4ada4 --- /dev/null +++ b/doc/forum/Change_remote_server_address.mdwn @@ -0,0 +1,6 @@ +Hi again, + +I have a SSH remote server that I registered to my git-annex repository via git-annex assistant. When I go to edit the settings for the repository from within git-annex assistant I noticed I can't edit the server address. If the server IP changes, how should I go about letting git-annex know of this? Can I just (1) shutdown git-annex assistant, (2) edit the 'url' line of the remote entry inside the repository's ``.git/config`` file, and then (3) start up git-annex assistant again? Is this a safe method for doing this? + +Regards, +Blake diff --git a/doc/forum/Change_remote_server_address/comment_1_401c3d2530ac7ba41dd3857ab4737ed5._comment b/doc/forum/Change_remote_server_address/comment_1_401c3d2530ac7ba41dd3857ab4737ed5._comment new file mode 100644 index 000000000..d4e406829 --- /dev/null +++ b/doc/forum/Change_remote_server_address/comment_1_401c3d2530ac7ba41dd3857ab4737ed5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-01T16:35:47Z" + content=""" +Yes, you can certainly edit .git/config in any way you like and the assistant will use the new values when started back up. + +It shouldn't be using a hardcoded IP address normally, unless you manually entered an IP address when setting up that ssh remote. Using DNS is better.. +"""]] diff --git a/doc/forum/Check_if_remote_is_using_GPG__63__.mdwn b/doc/forum/Check_if_remote_is_using_GPG__63__.mdwn new file mode 100644 index 000000000..d719b2feb --- /dev/null +++ b/doc/forum/Check_if_remote_is_using_GPG__63__.mdwn @@ -0,0 +1 @@ +Is there a way to check if a special remote is setup to use GPG? And, if so, see the ID of keys that it is encrypting to? diff --git a/doc/forum/Check_if_remote_is_using_GPG__63__/comment_1_db8ce8ef50fc33a28860ee475988450f._comment b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_1_db8ce8ef50fc33a28860ee475988450f._comment new file mode 100644 index 000000000..ff073cd9a --- /dev/null +++ b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_1_db8ce8ef50fc33a28860ee475988450f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-17T18:59:40Z" + content=""" +You can tell this by looking at remote.log: + +git show git-annex:remote.log + +Remotes that are encrypted will have a big \"cipher=\" block in there, and ones that are encrypted to gpg public keys will have a list of the keys following \"cipherkeys=\" + + +"""]] diff --git a/doc/forum/Check_if_remote_is_using_GPG__63__/comment_2_11c7033904c9c7a1df766e915632c386._comment b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_2_11c7033904c9c7a1df766e915632c386._comment new file mode 100644 index 000000000..a88021352 --- /dev/null +++ b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_2_11c7033904c9c7a1df766e915632c386._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="77.247.182.246" + subject="comment 2" + date="2013-03-17T22:25:58Z" + content=""" +If a special remote was setup using shared encryption, can I change it to using keys by simply doing `initremote myremote encryption=keyid`? Or should I remove the remote and start over? +"""]] diff --git a/doc/forum/Check_if_remote_is_using_GPG__63__/comment_3_a7ab70ad87a334c36761ddb3d830d99b._comment b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_3_a7ab70ad87a334c36761ddb3d830d99b._comment new file mode 100644 index 000000000..f467495b8 --- /dev/null +++ b/doc/forum/Check_if_remote_is_using_GPG__63__/comment_3_a7ab70ad87a334c36761ddb3d830d99b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-18T15:09:53Z" + content=""" +git-annex won't let you change a remote's encryption scheme, as this would make any data stored in the remote using the old scheme be no longer accessible. You need to make a new remote. It should be fine to point the new remote at the same location as the old one, though. +"""]] diff --git a/doc/forum/Check_when_your_last_fsck_was__63__.mdwn b/doc/forum/Check_when_your_last_fsck_was__63__.mdwn new file mode 100644 index 000000000..4a655cc1d --- /dev/null +++ b/doc/forum/Check_when_your_last_fsck_was__63__.mdwn @@ -0,0 +1,4 @@ +Hey Joey, + Is there a way to see when the last fsck was? I know about --incremental and the related options, but sometimes I'd like to know when the last time I fsck'd a file (or even the whole repo) was. There doesn't seem to be a command line option for it, but I know that info is saved somewhere...maybe this could be part of 'git annex status'? + +$(words of gratitude and encouragement) diff --git a/doc/forum/Check_when_your_last_fsck_was__63__/comment_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment b/doc/forum/Check_when_your_last_fsck_was__63__/comment_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment new file mode 100644 index 000000000..ae8ffe42f --- /dev/null +++ b/doc/forum/Check_when_your_last_fsck_was__63__/comment_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T18:50:06Z" + content=""" +You're quite right. that info is stored in `.git/annex/fsckstate`. The timestamp of the file is when the last incremental fsck was started. The contents of the file is the same date, represented as seconds from epoch. + +That is only written to when doing an incremental fsck though. A non-incremental fsck does not touch the file. +"""]] diff --git a/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn new file mode 100644 index 000000000..97299a966 --- /dev/null +++ b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__.mdwn @@ -0,0 +1,5 @@ +I would like to use git-annex with [S3 reduced redundancy storace (RRS)](https://aws.amazon.com/s3/faqs/#rrs_anchor), a cheaper S3 service with an higher chance of seeing your files disappear overnight. This means that git-annex may think that a certain files has been copied to a S3 remote while, in fact, it is no longer there. + +I would like to check that the files S3 are really there and, if some files are not, record that we lost that copy. In the case of S3, either the data is there and it is complete or it is not there at all, so there is no need to check the data itself, just the presence of the files. + +Is there a way to check that all the files that are supposed to be in a S3 remote are still there? diff --git a/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment new file mode 100644 index 000000000..404ba8b87 --- /dev/null +++ b/doc/forum/Checking_for_missing_files_in_S3___40__reduced_redundancy__41__/comment_2_793b3d9f78562f3aecf27dd926bbcf82._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 2" + date="2014-04-24T18:12:59Z" + content=""" +git annex fsck --fast --from $yours3remote +"""]] diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn b/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn new file mode 100644 index 000000000..7a2270d92 --- /dev/null +++ b/doc/forum/Checkout_only_some_files_with_the_assistant.mdwn @@ -0,0 +1,14 @@ +Hi, + +I really like git-annex for sharing contents with all my devices. But i have a problem with the assistant on my phone, i don't know how to git annex get some file but not all. +For example i have this on a remote: + +repository: + - big file1 + - big file2 + - big file3 + +I have this repository on my phone. I would like to be able to checkout out only "big file2" directly within the assistant. +How can i achieve that? + +Thank you. diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment new file mode 100644 index 000000000..85325c60c --- /dev/null +++ b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_1_23d8ab1a05e3e9d3611bd12a4ba70b0c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-24T18:15:15Z" + content=""" +[[preferred_content]] expressions can be used to do that. Works best if all the files you want have some extension or are in a specific directory. + +There are some [[preferred_content/standard_groups]] that might do what you want, particularly the \"manual\" one. +"""]] diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment new file mode 100644 index 000000000..cf35f3541 --- /dev/null +++ b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_2_bf095ff5b5af95b062ae1f7da566a279._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="elfangor" + ip="176.57.244.101" + subject="comment 2" + date="2014-04-28T13:12:07Z" + content=""" +Thanks for your reply. + +The Standard group \"manual\" seems to be what i need. The last thing i'd like to now is, is there a way to do git annex get on the assistant(on the webui) on my phone? (I know i can do this on the shell opened, but it's not that easy to write from the phone.) I guess it's not implemented, and i understand that it should be a lot of work to add a file browser in the ui where you can git annex get, and git annex add from it. + +Thanks again for your answer, really helpfull: I have a better idea on how i will structur my git annex repositories. +"""]] diff --git a/doc/forum/Checkout_only_some_files_with_the_assistant/comment_3_7c026e36e1cdd52053c34638c87d793c._comment b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_3_7c026e36e1cdd52053c34638c87d793c._comment new file mode 100644 index 000000000..ae18c8caf --- /dev/null +++ b/doc/forum/Checkout_only_some_files_with_the_assistant/comment_3_7c026e36e1cdd52053c34638c87d793c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 3" + date="2014-05-19T15:45:57Z" + content=""" +There is not currently any UI to do git-annex get/drop. + +There is some recent work on [[tips/file_manager_integration]] which lets you use a file manager and pick files you want and files to drop. Nobody has gotten it working with android file manager yet AFAIK. +"""]] diff --git a/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn new file mode 100644 index 000000000..f0912fd74 --- /dev/null +++ b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn @@ -0,0 +1,19 @@ +I recently began experimenting with direct mode on a repository where only a very limited number of commands (`git annex sync`, `git annex add .`, etc.) are being used (through desktop buttons). + +Things were working well, and then on another repository in indirect mode I moved a large folder and synced that data with a bare repo, and synced the repo in direct mode with the same bare repo (to get everything in sync). + +At that point, git annex seemed to hang, taking forever to complete, and from looking a processes and files it seemed like it was going nowhere, so I killed it. I wish I had done a bit more diagnostics before that, but unfortunately I didn't. + +At that point, I noticed that the old directory was still there and that there were still many files in it, but the new folder had also been created and there were files there, too. So I thought the transfer was done, and for whatever reason `git annex sync` had just not cleaned up properly. + +In fact, the sync was only half done and the remaining files in the old directory were the only (local) copies (on the direct mode repo). I removed them and then synced again, which actually told git to delete those symlinks. + +When I updated another (indirect mode) repository I noticed this, so I reverted the commit in question and got the symlinks back, no data lost. Then I went back to the direct mode repo, switched to indirect mode because I was worried about direct mode, `git annex sync`ed, then `git annex get` to get the files again from a usb and everything was back to normal. + +Except that when I tried to go back to direct mode in that original repo, I got an error saying that git could not stat a file which is in the old (deleted) folder. Searching around, I noticed that in the `.git/annex/objects` directory, there are many remaining `.map` files with lines referring to the old (deleted) directory. + +Is there any way to "reset" this somehow? I would like to switch back to direct mode, and I'd prefer not to recreate the repo. + +Oh and I'm using version: 4.20130501-g4a5bfb3. + +Thanks! diff --git a/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_1_3440b2e1662d3b113c18283afcbf4520._comment b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_1_3440b2e1662d3b113c18283afcbf4520._comment new file mode 100644 index 000000000..77c0ebbba --- /dev/null +++ b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_1_3440b2e1662d3b113c18283afcbf4520._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkBYpLu_NOj7Uq0-acvLgWhxF8AUEIJbo" + nickname="Chris" + subject="comment 1" + date="2013-05-10T03:50:26Z" + content=""" +Maybe a simpler question: if I delete all the `.map` and `.cache` files that are leftover in the `.git/annex/objects` directory, will that effectively \"reset\" the status so that I can then switch to direct mode? +"""]] diff --git a/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment new file mode 100644 index 000000000..e471f113e --- /dev/null +++ b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkBYpLu_NOj7Uq0-acvLgWhxF8AUEIJbo" + nickname="Chris" + subject="comment 2" + date="2013-05-10T04:01:38Z" + content=""" +After reading [this](http://git-annex.branchable.com/internals/): + +> Also in direct mode, some additional data is stored in these directories. .cache files contain cached file stats used in detecting when a file has changed, and .map files contain a list of file(s) in the work directory that contain the key. + +I decided that indeed, deleting the `.map` and `.cache` files should do the trick, so I deleted them and direct mode works again. + +Still not sure what went wrong with the original sync, but at least I got things back on track. +"""]] diff --git a/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_3_6b9d8c48547f3d0a911310622ba91df7._comment b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_3_6b9d8c48547f3d0a911310622ba91df7._comment new file mode 100644 index 000000000..b7d495dea --- /dev/null +++ b/doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_3_6b9d8c48547f3d0a911310622ba91df7._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-13T18:00:42Z" + content=""" +This sounds like one or more bugs that I should address, but I'm having trouble understanding exactly what you did, from your description, at the level of detail I need to replicate a problem. + +Do you still have a copy of the corrupted repository? Or any error messages to show me? + +It sounds like at least one problem might have been this bug: [[bugs/Unable_to_switch_back_to_direct_mode]] +At least that is fixed in current git. +"""]] diff --git a/doc/forum/Coming_from_git_world.mdwn b/doc/forum/Coming_from_git_world.mdwn new file mode 100644 index 000000000..ee8b844e8 --- /dev/null +++ b/doc/forum/Coming_from_git_world.mdwn @@ -0,0 +1,9 @@ +So i am coming from git world, All documentation and posts seemed to be for media etc. I have a simple question. + +Can i use git annex to manage large files , Which i think i can. But will it work with branching/tagging etc. + +e.g. We currently use git have some large files in git repo.... I am planning to move the large files to use annex. But would like to maintain branches, i.e. each branch might have different version of files and maybe tagged, So i can get back some old version from a branch. + +Is this possible ? I did not get any explicit answer or examples on how this works or even if its supported. + +Also can i use same folder for git and git-annex ? diff --git a/doc/forum/Coming_from_git_world/comment_10_098bef38c2688607e869425a557cc482._comment b/doc/forum/Coming_from_git_world/comment_10_098bef38c2688607e869425a557cc482._comment new file mode 100644 index 000000000..85ba7fe7f --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_10_098bef38c2688607e869425a557cc482._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 10" + date="2013-07-10T17:05:49Z" + content=""" +It has its own ssh server written in java too, which hardcodes the set of commands it supports. AFAICS it would require some java coding to add a command to this, it does not seem to be designed for easy extensability. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_11_98d75a1415e0c3689ab4231855e61233._comment b/doc/forum/Coming_from_git_world/comment_11_98d75a1415e0c3689ab4231855e61233._comment new file mode 100644 index 000000000..3dba0760b --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_11_98d75a1415e0c3689ab4231855e61233._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 11" + date="2013-07-10T20:14:52Z" + content=""" +:( Ahh... So i guess this might not be possible in near future. + +Ill go to plan B, Setup another server which users will connect to for large files which will have git-annex installed. (So a central Repository for git annex). They will need to add another remote in git config. + +Does git annex have a way to manage ssh keys ? (Please can you point me to the location where i can read how git-annex-shell ? ) +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_12_5e7079e9bf3e4d97191333c66ac00e52._comment b/doc/forum/Coming_from_git_world/comment_12_5e7079e9bf3e4d97191333c66ac00e52._comment new file mode 100644 index 000000000..2d7668737 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_12_5e7079e9bf3e4d97191333c66ac00e52._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 12" + date="2013-07-10T21:10:03Z" + content=""" +Yes, a separate repository is one way to go, although I do not think it would be very hard to get gerrit's internal ssh to run git-annex-shell. + +[[git-annex-shell]] is a low-level restricted shell like git-shell, not a login manager, so it has nothing at all to do with ssh keys. Things like gitosis and gitolite can be built on top of git-shell and git-annex-shell and handle ssh key management. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_1_357443dc601ae38784c01cf18552f4d5._comment b/doc/forum/Coming_from_git_world/comment_1_357443dc601ae38784c01cf18552f4d5._comment new file mode 100644 index 000000000..adc65d50f --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_1_357443dc601ae38784c01cf18552f4d5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-08T20:09:54Z" + content=""" +Yes, git-annex would not do very well at adding large file support to git if it did not handle tagging, branches, etc! So of course it does. It's in a sense too obvious a thing to get much mention. And so people sometimes get confused about it. + +The only thing to need to be aware of coming from git is that not every repository will have every version of every file locally available. When you check out a branch, you may need to run `git annex get` to retrieve those versions from origin or elsewhere. + +And, `git annex unused` can be used to find versions of files that no existing tag or branch refers to, and `git annex dropunused` can then delete those versions. If you want to ensure every revision in your git repo is accessible, you should avoid using those two commands; otherwise git-annex will never delete old versions of files. + +The unreleased git master adds a new feature, a --all switch that makes git annex commands operate on all versions of files. While normally `git annex get` will only do what it needs to to get all files in the currently checked out branch, `git annex get --all` will pull down every version of every file in the whole history. Similarly, `git annex copy --all --to origin` will ensure that every locally available version of every file is sent to origin. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment b/doc/forum/Coming_from_git_world/comment_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment new file mode 100644 index 000000000..33d7d44d3 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 2" + date="2013-07-08T20:18:27Z" + content=""" +And yes, you can use the same git repository for files added to git `git add file` and added to git annex `git annex add file` +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_3_09c6bb83a73d34dff2b8bc185a14a1db._comment b/doc/forum/Coming_from_git_world/comment_3_09c6bb83a73d34dff2b8bc185a14a1db._comment new file mode 100644 index 000000000..07023ffe3 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_3_09c6bb83a73d34dff2b8bc185a14a1db._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 3" + date="2013-07-08T23:27:45Z" + content=""" +Awesome!! thanks, As i am kicking the tires, Based on my current scenario, How can i deploy this in my company , So each developer to do the bare minimum, Like just install git annex and it should work. + +i.e. is it possible to avoid the step git remote add backup ? Then they can just do + +$ yum install git-annex +$ cd repo +$ git checkout staging +$ git pull +$ git annex get large_file + +And it then just works. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_4_6c731bb9a8d21dd9ab8c09612b23f908._comment b/doc/forum/Coming_from_git_world/comment_4_6c731bb9a8d21dd9ab8c09612b23f908._comment new file mode 100644 index 000000000..f09281bc4 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_4_6c731bb9a8d21dd9ab8c09612b23f908._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 4" + date="2013-07-09T18:14:07Z" + content=""" +I don't know where you got the \"git remote add backup\" step from. Obviously this is not necessary unless you want to add a remote named \"backup\". + +To use git-annex in a centralized git environment, which it sounds like you have here, you just need to install git-annex on the central git server, and arrange for all the developers to have ssh access to it. Then any git repository that is cloned from that server using ssh as the transport can support git-annex without the user needing to do anything special to set it up. + +This assumes that users have shell accounts on the server. git-annex includes the git-annex-shell program, which is similar to the git-shell in git. User accounts can be locked down to use this restricted shell if giving them full shell access to the server is not desired. + +If the server is using a git repository manager like gitolite or gitosis, those can also be adapted to use git-annex-shell. I got gitolite patched to support it earlier, see [[tips/using_gitolite_with_git-annex]]. + +PS: I'm available for consulting on deploying git-annex in production environments. ;) +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_5_e719d99af5afd90da3d3db692eff28dc._comment b/doc/forum/Coming_from_git_world/comment_5_e719d99af5afd90da3d3db692eff28dc._comment new file mode 100644 index 000000000..ffeaaa6e0 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_5_e719d99af5afd90da3d3db692eff28dc._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 5" + date="2013-07-09T20:32:51Z" + content=""" +Thank you very much!!!!! Yes, Planning to use Centralized repo. Basically what i understood was there will be a git server and separate server for hosting the large files. Its great to know i can use the same server and do not need to explicitly point to the server. + +As we are using Gerrit, What is the general best practice for it. (After i am done with it, I will write a blog post, As i am sure many people with centralized repo's might need this) +Thanks! +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_6_85a42106944dba9995fb3f4bfee3443a._comment b/doc/forum/Coming_from_git_world/comment_6_85a42106944dba9995fb3f4bfee3443a._comment new file mode 100644 index 000000000..840553025 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_6_85a42106944dba9995fb3f4bfee3443a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 6" + date="2013-07-09T20:39:25Z" + content=""" +Yes, the default for a repository accessed using ssh is to also store the large files in that repository. Of course you can set up a second remote to hold the large files if that works better. + +I don't have any personal experience with Gerrit. All I can say is that files managed by git-annex will appear as symlinks. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_7_90623294b910ceca3dc8ebd41b50fc9b._comment b/doc/forum/Coming_from_git_world/comment_7_90623294b910ceca3dc8ebd41b50fc9b._comment new file mode 100644 index 000000000..50b34fb86 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_7_90623294b910ceca3dc8ebd41b50fc9b._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 7" + date="2013-07-09T23:48:17Z" + content=""" +Thanks, So i made some progress, In the gerrit repo server, (which has git-annex installed) + +I ran: + git annex init origin, + +Did a clone of the repo, it had the branch git-annex, So i assumed all is working. + +I did a + git annex add +and + git push + +Then when i try to + git annex copy --to origin + +I get error , But git-annex-shell is installed on the machine: + + $ echo $PATH + /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/gerrit2/bin + $ which git-annex-shell + /usr/bin/git-annex-shell + + + + Gerrit Code Review: git-annex-shell: not found + rsync: connection unexpectedly closed (0 bytes received so far) [sender] + rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6] + + rsync failed -- run git annex again to resume file transfer failed + +Any idea what i need to do to make it work ? +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_8_28dbee30eb54877418f72eb8935302d8._comment b/doc/forum/Coming_from_git_world/comment_8_28dbee30eb54877418f72eb8935302d8._comment new file mode 100644 index 000000000..668cfbd95 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_8_28dbee30eb54877418f72eb8935302d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 8" + date="2013-07-10T16:42:18Z" + content=""" +If gerrit is handling incoming ssh connections, it's probable running its own restricted shell. That shell would need to be configured to spawn git-annex-shell when asked to do so in order for git-annex to transfer files to that repository. +"""]] diff --git a/doc/forum/Coming_from_git_world/comment_9_6edb36ea9535030fa3766937398e5bc7._comment b/doc/forum/Coming_from_git_world/comment_9_6edb36ea9535030fa3766937398e5bc7._comment new file mode 100644 index 000000000..2f1034d17 --- /dev/null +++ b/doc/forum/Coming_from_git_world/comment_9_6edb36ea9535030fa3766937398e5bc7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 9" + date="2013-07-10T16:57:29Z" + content=""" +AFAIK Gerrit relies on jgit implementation of git in java; allowing it to execute helper programs like git-annex-shell may be tricky. +"""]] diff --git a/doc/forum/Comparison_with_other_big_files_solutions.mdwn b/doc/forum/Comparison_with_other_big_files_solutions.mdwn new file mode 100644 index 000000000..cfbd12d29 --- /dev/null +++ b/doc/forum/Comparison_with_other_big_files_solutions.mdwn @@ -0,0 +1,11 @@ +# Comparison + +Based on my understanding of the http://git-annex.branchable.com/not/ page and of some research, +I have made a draft of an [Online excel document][1] that compares different git file solutions. + +Feel free to edit the document and help the community to understand the different solutions out there. + +[1]: https://onedrive.live.com/redir?resid=C66C90783BD2C185!1200&authkey=!ACF-Ol_mG3DwQ2k&ithint=file%2c.xlsx + +Thank you very much, +Alex diff --git a/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__.mdwn b/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__.mdwn new file mode 100644 index 000000000..49f3d75ef --- /dev/null +++ b/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__.mdwn @@ -0,0 +1 @@ +I use git-annex mostly to archive my photos. They're generally large raw files and I am encrypting them going to the S3 special remote. Are there any plans to compress objects before encrypting them? It would save on S3 costs, only add some overhead on get and copy, and I don't think there would be any problems looking up data later. diff --git a/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__/comment_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment b/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__/comment_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment new file mode 100644 index 000000000..7c5f1ecc1 --- /dev/null +++ b/doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__/comment_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 1" + date="2012-12-14T18:53:04Z" + content=""" +gpg compresses encrypted content by default, so all encrypted special remotes get compression for free +"""]] diff --git a/doc/forum/Consistency_Check_for_S3.mdwn b/doc/forum/Consistency_Check_for_S3.mdwn new file mode 100644 index 000000000..0c06f8609 --- /dev/null +++ b/doc/forum/Consistency_Check_for_S3.mdwn @@ -0,0 +1 @@ +Wepapp only allows me to setup consistency checks for the local repo. Non of my computers has full copy of repos. How can I setup annex so that every night for one hour it checks consistency of s3 data? diff --git a/doc/forum/Consistency_Check_for_S3/comment_1_40385806ef1cc082232cd2723a24be1a._comment b/doc/forum/Consistency_Check_for_S3/comment_1_40385806ef1cc082232cd2723a24be1a._comment new file mode 100644 index 000000000..a641ded34 --- /dev/null +++ b/doc/forum/Consistency_Check_for_S3/comment_1_40385806ef1cc082232cd2723a24be1a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-31T19:30:00Z" + content=""" +The webapp does not let you set up a consistency check for data in a S3 remote because the only way to check it would be to download the data, which is expensive in bandwidth and potentially, Amazon S3 fees. +"""]] diff --git a/doc/forum/Consistency_Check_for_S3/comment_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment b/doc/forum/Consistency_Check_for_S3/comment_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment new file mode 100644 index 000000000..d78a1dc52 --- /dev/null +++ b/doc/forum/Consistency_Check_for_S3/comment_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-01-01T01:50:57Z" + content=""" +Is it possible to do it from command line? I was thinking with a time limit I would spread the fsck over a mount run it once a while to make sure all data is actually there when I need it. +"""]] diff --git a/doc/forum/Consistency_Check_for_S3/comment_3_ec9de6882a0eef4d2786e55b583ad020._comment b/doc/forum/Consistency_Check_for_S3/comment_3_ec9de6882a0eef4d2786e55b583ad020._comment new file mode 100644 index 000000000..e0e68fe6d --- /dev/null +++ b/doc/forum/Consistency_Check_for_S3/comment_3_ec9de6882a0eef4d2786e55b583ad020._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2014-01-01T21:05:20Z" + content=""" +Adapting an example from the man page: + +`git annex fsck --incremental-schedule 30d --time-limit 1h --from S3` +"""]] diff --git a/doc/forum/Controlling_content_on_mobile_device.mdwn b/doc/forum/Controlling_content_on_mobile_device.mdwn new file mode 100644 index 000000000..b1f145ccb --- /dev/null +++ b/doc/forum/Controlling_content_on_mobile_device.mdwn @@ -0,0 +1,46 @@ +I have some questions about how to best manage content on mobile +devices. This is probably more of a wishlist discussion, although I +haven't had enough experience with the assistant and preferred content +features enough to know how much of this might already be possible. + +(While I did donate to both campaigns, I also didn't donate at the +"personal git-annex assistant" level, so I also know not to expect +personal undivided attention :) . Any tips would be appreciated.) + +In short, I don't think git-annex really fits with how I'd like to use +it on my Android phone. My current setup is as follows: + +- I have a large repository with various media files. This is stored + on several computers, at least one of which generally has a copy of + everything. I use a centralized bare repo to automatically + synchronize between computers with "`git annex sync origin`" using + cron, and manually control what is on each one using "`copy --to + host`", "`get`", "`drop`", etc. It is *awesome*. + +What I would like for Android is: + +- The phone keeps in sync with the origin repository. + +- On the phone, I'd like to browse through and choose content to get + or drop. I could use the command-line "`get`" and "`drop`" for + this, of course, but being able to do it through the webapp would be + better, as typing on a phone is no fun. + +- From _off_ the phone, I'd like to be able to choose which content + should be _on_ the phone. For example, using the command line or + webapp on my desktop, I'd like to be able to choose media files that + should be downloaded to (or removed from) the phone. However, I + don't want to have to move files between directories in the repository + to achieve this. + +- The only useful content that gets created on the phone is photos and + videos. Those should get uploaded to the main server, but only the + most recent files should remain on the phone by default (say, + anything older than 2 weeks gets dropped). Both on the phone, and + off the phone, I'd be able to override that using the previously + described features, so that certain photos remain on the phone + forever, or get dropped earlier. + +Thoughts? I feel like git-annex is close to being able to do this. + +-jim diff --git a/doc/forum/Controlling_content_on_mobile_device/comment_1_708649b7f30d8619d7b34dcb0ef46515._comment b/doc/forum/Controlling_content_on_mobile_device/comment_1_708649b7f30d8619d7b34dcb0ef46515._comment new file mode 100644 index 000000000..c9cbc9e79 --- /dev/null +++ b/doc/forum/Controlling_content_on_mobile_device/comment_1_708649b7f30d8619d7b34dcb0ef46515._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl_EUsflI4UOGtx0-2yrRJuGAzNyN_5UYY" + nickname="Chris" + subject="comment 1" + date="2014-01-03T16:33:51Z" + content=""" +Jim, + +I have nothing in terms of a solution, but wanted to say thanks for writing this up. This describes precisely the use case I am also seeking on my Android phone. + +-- Chris +"""]] diff --git a/doc/forum/Controlling_content_on_mobile_device/comment_2_dba1a1b0917332a1dee387b1183bd2cb._comment b/doc/forum/Controlling_content_on_mobile_device/comment_2_dba1a1b0917332a1dee387b1183bd2cb._comment new file mode 100644 index 000000000..60aea0bdd --- /dev/null +++ b/doc/forum/Controlling_content_on_mobile_device/comment_2_dba1a1b0917332a1dee387b1183bd2cb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Metadata?" + date="2014-02-21T18:44:10Z" + content=""" +I suspect the new [metadata](http://git-annex.branchable.com/design/metadata/) support could be used to help implement this. +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo.mdwn b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo.mdwn new file mode 100644 index 000000000..c94172535 --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo.mdwn @@ -0,0 +1 @@ +Is it possible to convert a regular git annex repo (git clone then git annex init in the folder), to an rsync remote. I have an annex with alot of remotes which makes the sync operation take a really long time. I would like to convert some of those remotes to rsync. This particular repo has a TB of data so I would like to avoid dropping content from the remote than re download everything. diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment new file mode 100644 index 000000000..46ba67c30 --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-23T18:57:42Z" + content=""" +This is doable. It works best if the remote repo is a bare git repository, because then the filenames line up 100% with the filenames used in a rsync special remote. If the git repo is not bare, the rsync special remote will first try the paths it expects, and only then fall back to the right paths, so a little extra work done. (If this became a big problem, it would not be infesable to move the files around with a script.) + +Anyway, if it's a bare repo, then repo.git/annex/objects is where you want to point the rsync special remote at. With a non-bare repo, repo/.git/annex/objects/ is the location. I'd recommend moving the objects directory out to a new location, and pointing the rsyncurl at that. This way, there's no possibility of git-annex thinking one files accessed 2 ways is 2 copies. + +Of course, you can't use encryption for the rsync special remote. +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_2_76bfb11396dc20a5105376b22e7e773b._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_2_76bfb11396dc20a5105376b22e7e773b._comment new file mode 100644 index 000000000..8ed4f6508 --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_2_76bfb11396dc20a5105376b22e7e773b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-23T19:07:59Z" + content=""" +However, if the only problem is that pushing and pulling with a git repository makes `git annex sync` take too long, another option is setting `git config remote.$foo.annex-sync false`. You can still then use git-annex commands to get and push data to the remote, and can even `git annex sync $foo` from time to time, but it won't slow down the normal `git annex sync`. + +However, this also prevents the assistant from uploading new files to the remote automatically. +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment new file mode 100644 index 000000000..a8040cd3f --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 3" + date="2014-02-23T19:39:28Z" + content=""" +Thanks for the reply, just to make sure I got you right, + +It is indeed a non bare git repo. So I will move the folder repo/.git/annex/objects/ to repo/ + +then run, + +git annex initremote myrsync type=rsync rsyncurl=ssh.example.com:~/repo + +and enable the remote on other annexes (disks are connected to an ssh server there is no encryption setup right now so I do not mind not having it.). And everything should be setup correctly. +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_4_8f5e323b29745591f9f2f0f867353f69._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_4_8f5e323b29745591f9f2f0f867353f69._comment new file mode 100644 index 000000000..c8305aaa9 --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_4_8f5e323b29745591f9f2f0f867353f69._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 4" + date="2014-02-23T19:45:09Z" + content=""" +and as a follow up do I have rename the repos or can I reuse the same names for the repos? +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_5_9824c953694770afa0611ff7276737bf._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_5_9824c953694770afa0611ff7276737bf._comment new file mode 100644 index 000000000..c6052232b --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_5_9824c953694770afa0611ff7276737bf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 5" + date="2014-02-24T19:07:33Z" + content=""" +That looks all-right, although initremote will ask you to tell it what encryption to use, and you'll need to specify `encryption=none` + +One thing I forgot to mention is that the UUID of the new rsync repository won't be the same, so git-annex won't know about the files in there. This can be fixed by `git annex fsck --fast --from myrsync`. Which doesn't re-download all the files, but you still may want to run it on a repository close to or on the server for speed. + +You can re-use the name you're currently using for the git remote for the new rsync special remote if you like. +"""]] diff --git a/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_6_5899741cb7f83e1b22c5ee3509c5ff21._comment b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_6_5899741cb7f83e1b22c5ee3509c5ff21._comment new file mode 100644 index 000000000..8b7c3b52e --- /dev/null +++ b/doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_6_5899741cb7f83e1b22c5ee3509c5ff21._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 6" + date="2014-02-25T09:34:16Z" + content=""" +assuming the remote I am converting is called some-repo should mark it as dead before converting and reinitting as rsync some-repo again? +"""]] diff --git a/doc/forum/Corrupt_Repository_Invalid_Object.mdwn b/doc/forum/Corrupt_Repository_Invalid_Object.mdwn new file mode 100644 index 000000000..af6d8e353 --- /dev/null +++ b/doc/forum/Corrupt_Repository_Invalid_Object.mdwn @@ -0,0 +1,10 @@ +One of my repositories got corrupted. I am not exactly sure how it happened (was running a series of commands) but I think I accidentally ran regular mv instead of git mv. To fix it I deleted the moved file then checkout the original link however this did not fixed the problem. I ended up with a corrupted repo. Now running any command ends with the following error, + + ga sync + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + error: invalid object 040000 6ad564920e3d78d31c9456f5be3869a0319f9f08 for'3fd/d44' + fatal: git-write-tree: error building trees + git-annex: failed to read sha from git write-tree + +Was wondering how to fix this? I did run git fsck and git annex fsck but non fixed the problem. diff --git a/doc/forum/Corrupt_Repository_Invalid_Object/comment_1_b7fd4b6212b50400342931e70684b96c._comment b/doc/forum/Corrupt_Repository_Invalid_Object/comment_1_b7fd4b6212b50400342931e70684b96c._comment new file mode 100644 index 000000000..a62e6d345 --- /dev/null +++ b/doc/forum/Corrupt_Repository_Invalid_Object/comment_1_b7fd4b6212b50400342931e70684b96c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-17T19:47:54Z" + content=""" +git is complaining about one of the files in `.git/objects` being missing or corrupt. + +It's not likely that some accidental command you ran caused this. More likely a disk error or an unclean shutdown could have left the repository in this state. + +You can try running `git annex repair` which should be able to repair git repositories with this kind of damage. + +Or you can just `git clone` the repository from any other place you have it and move over .git/annex/objects and .git/config to the new repository, discarding the damaged one. +"""]] diff --git a/doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn b/doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn new file mode 100644 index 000000000..b4271d172 --- /dev/null +++ b/doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn @@ -0,0 +1,3 @@ +I tried to compile the assitant branch on Ubuntu 12.04. But i depends on the DBus libraryw hich does not compile with some glibberish errors. Is there a way to solve this? + + diff --git a/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment new file mode 100644 index 000000000..0ef2469d3 --- /dev/null +++ b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.119" + subject="comment 1" + date="2012-08-25T13:06:31Z" + content=""" +Hmm, let's see... + +If the gibberish error is ouyay orgotfay otay otay elltay emay utwhay ethay +roreay asway, then we can figure it out, surely.. + +If the gibberish error looks something like Ḩ̶̞̗̓ͯ̅͒ͪͫe̢ͦ̊ͭͭͤͣ̂͏̢̳̦͔̬ͅ ̣̘̹̄̕͢Ç̛͈͔̹̮̗͈͓̞ͨ͂͑ͅo̿ͥͮ̿͢͏̧̹̗̪͇̫m̷̢̞̙͑̊̔ͧ̍ͩ̇̚ę̜͑̀͝s̖̱̝̩̞̻͐͂̐́̂̇̆͂ + +.. your use of cabal +has accidentually summoned Cthulu! Back slowly away from the monitor! + +Otherwise, you might try installing the `libdbus-1-dev` package with apt, +which might make cabal install the haskell dbus bindings successfully. Or +you could just install the `libghc-dbus-dev` package, which contains the +necessary haskell library pre-built. But I don't know if it's in Ubuntu +12.04; it only seems to be available in quantal + + +Or you could even build it with the Makefile, rather than using cabal. +The Makefile has a `-DWITH_DBUS` setting in it that can be removed to build +the fallback mode that doesn't use dbus. + +"""]] diff --git a/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_2_608a30e274e6a691a39f69503720e320._comment b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_2_608a30e274e6a691a39f69503720e320._comment new file mode 100644 index 000000000..02bda9eaa --- /dev/null +++ b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_2_608a30e274e6a691a39f69503720e320._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.119" + subject="comment 2" + date="2012-08-25T13:11:37Z" + content=""" +I fnordgot to mention, cabal can be configured to not build with dbus too. The relevant incantation is: + +cabal install git-annex --flags=\"-Dbus\" +"""]] diff --git a/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_3_791b9978b410c1aff7fd8ef05c38f5f9._comment b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_3_791b9978b410c1aff7fd8ef05c38f5f9._comment new file mode 100644 index 000000000..4097070fd --- /dev/null +++ b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_3_791b9978b410c1aff7fd8ef05c38f5f9._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="Shame on me..." + date="2012-08-25T15:43:19Z" + content=""" +The build error is: + +$ cabal install DBus +Resolving dependencies... +Configuring DBus-0.4... +checking for pkg-config... /usr/bin/pkg-config +checking pkg-config is at least version 0.9.0... yes +checking for DBUS... yes +configure: creating ./config.status +config.status: creating DBus.buildinfo +Building DBus-0.4... +Preprocessing library DBus-0.4... + +DBus/Message.hsc:1:14: + Warning: -XPatternSignatures is deprecated: use -XScopedTypeVariables or pragma {-# LANGUAGE ScopedTypeVariables #-} instead + +DBus/Message.hsc:2:12: + Warning: -fglasgow-exts is deprecated: Use individual extensions instead +[1 of 5] Compiling DBus.Shared ( dist/build/DBus/Shared.hs, dist/build/DBus/Shared.o ) +[2 of 5] Compiling DBus ( dist/build/DBus.hs, dist/build/DBus.o ) + +DBus.hsc:26:49: + Warning: In the use of `mkTyCon' + (imported from Data.Typeable): + Deprecated: \"either derive Typeable, or use mkTyCon3 instead\" +[3 of 5] Compiling DBus.Internal ( dist/build/DBus/Internal.hs, dist/build/DBus/Internal.o ) + +DBus/Internal.hsc:12:27: + Module `Control.Exception' does not export `throwDyn' +cabal: Error: some packages failed to install: +DBus-0.4 failed during the building phase. The exception was: +ExitFailure 1 + +"""]] diff --git a/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_4_8665c95299916138c4af375626d9ec7d._comment b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_4_8665c95299916138c4af375626d9ec7d._comment new file mode 100644 index 000000000..abd154a6b --- /dev/null +++ b/doc/forum/DBus_on_Ubuntu_12.04__63__/comment_4_8665c95299916138c4af375626d9ec7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.119" + subject="in the language of the ancients, small details matter" + date="2012-08-25T15:50:47Z" + content=""" +It seems that to cabal, \"DBus\" and \"dbus\" are different packages, and it seems you should install the latter, which has a current version of 0.10 which works and not some old 0.4 version. +"""]] diff --git a/doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn b/doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn new file mode 100644 index 000000000..16750a1fb --- /dev/null +++ b/doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn @@ -0,0 +1,41 @@ +After testing around git-annex on my mac using ntfs-3g to access the removable harddrive, I conclude that this is very dangerous. + +Here are some example error snippets: + + add man/man1/git-tar-tree.1 + git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/objects/0K/JJ/SHA256E-s3805--948fd508a364e036ec28f5287d11825062aea2c0ed86a3a89ed871edc6ddc7a8.1/: openTempFile: interrupted (Interrupted system call) + failed + + add man/man1/git-bundle.1 + git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/tmp/e3f_804_SHA256E-s8739--569a4b4fe1072e17ff0aa9a2f67d0130b9ec3ed23f96c5a4ea38ada82f50b4aa.1.log: rename: does not exist (No such file or directory) + failed + + add git-core/git-completion.bash failed + add man/man7/gitglossary.7 failed + (Recording state in git...) + + git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/journal/.fuse_hidden00005dd50000010a: removeLink: does not exist (No such file or directory) + failed + git-annex: add: 3 failed + +It's interesting that after each git-annex add ., it would got fewer failures. But in the end it stuck at 2 files. After 60 times doing: git-annex add . + +It went from this: + + git-annex: add: 248 failed + +to this: + + git-annex: add: 2 failed + +Now the repository has 246 objects, let's try to convert it into an indirect one: + + git-annex indirect + ... + git-annex info + ... + annexed files in working tree: 9 + +Only 9 files made into the indirect repository! Remaining files stay as original state. Now it would be a nightmare to try to recover form this mess. + +I discourage anyone from using ntfs-3g on mac for annexing. Especially direct & indirect mode. Bare repo seems to be fine however. diff --git a/doc/forum/DS__95__Store_files_are_not_added.mdwn b/doc/forum/DS__95__Store_files_are_not_added.mdwn new file mode 100644 index 000000000..f0ccf2023 --- /dev/null +++ b/doc/forum/DS__95__Store_files_are_not_added.mdwn @@ -0,0 +1,3 @@ +The "git annex add" command adds new file to the annex. However ".DS_Store" files are ignored by git-annex. Is there a list of files that are being ignored? + +Maybe sometimes it's useful to add .DS_Store extended attribute data to the annex to ensure a complete sync of Mac files... diff --git a/doc/forum/DS__95__Store_files_are_not_added/comment_1_30687306da9bd35ec02a806193c5e240._comment b/doc/forum/DS__95__Store_files_are_not_added/comment_1_30687306da9bd35ec02a806193c5e240._comment new file mode 100644 index 000000000..3402b84c6 --- /dev/null +++ b/doc/forum/DS__95__Store_files_are_not_added/comment_1_30687306da9bd35ec02a806193c5e240._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-08-02T23:29:38Z" + content=""" +git-annex ignores whatever git does. See `git-ls-files` and the gitignore configuration. +"""]] diff --git a/doc/forum/Debugging_Git_Annex.mdwn b/doc/forum/Debugging_Git_Annex.mdwn new file mode 100644 index 000000000..fc4d829a2 --- /dev/null +++ b/doc/forum/Debugging_Git_Annex.mdwn @@ -0,0 +1,4 @@ +Hi, +May I know, how can I debug git-annex code. +I am new to Haskell Platform, I would like to know which IDE can be used to debug haskell code. +Thank You. diff --git a/doc/forum/Debugging_Git_Annex/comment_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment b/doc/forum/Debugging_Git_Annex/comment_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment new file mode 100644 index 000000000..84781a00a --- /dev/null +++ b/doc/forum/Debugging_Git_Annex/comment_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="This is not an easy question to answer..." + date="2012-06-04T19:49:46Z" + content=""" +Do you have a bug in git-annex that you need fixed, or are you just curious? +"""]] diff --git a/doc/forum/Debugging_Git_Annex/comment_2_1d70ff052d00f33c34fd45730ea13040._comment b/doc/forum/Debugging_Git_Annex/comment_2_1d70ff052d00f33c34fd45730ea13040._comment new file mode 100644 index 000000000..017b34b0d --- /dev/null +++ b/doc/forum/Debugging_Git_Annex/comment_2_1d70ff052d00f33c34fd45730ea13040._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="comment 2" + date="2012-06-05T17:19:16Z" + content=""" +Hi, + +I want to replace rsync with aspera-rsync. Whenever there is file transfer between 2 repositories which are in two different hosts, git-annex will use rsync protocol. I am trying to replace that rsync call with aspera-rsync so that transfer can be more faster. Since I am new to Haskell I am finding difficulties to understand the flow of execution. Is there any way I can debug so that I can get the flow? + +Thanks +"""]] diff --git a/doc/forum/Default_text__47__html_handler.mdwn b/doc/forum/Default_text__47__html_handler.mdwn new file mode 100644 index 000000000..a6bf4aaab --- /dev/null +++ b/doc/forum/Default_text__47__html_handler.mdwn @@ -0,0 +1,2 @@ +I've had to change my default `text/html .html` handler from a text editor to a browser to support the opening sequence of `git annex webapp`. any other way around this? perhaps to have it open the page in the default browser rather than the default text/html handler? + diff --git a/doc/forum/Default_text__47__html_handler/comment_1_4730061916c7e12b7a41906152f847ee._comment b/doc/forum/Default_text__47__html_handler/comment_1_4730061916c7e12b7a41906152f847ee._comment new file mode 100644 index 000000000..e2424f1cc --- /dev/null +++ b/doc/forum/Default_text__47__html_handler/comment_1_4730061916c7e12b7a41906152f847ee._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-13T17:25:07Z" + content=""" +Not without exposing the secret token to other users in the system by passing it as a parameter to the browser command. Which is why it uses the method it does. + +But, you can configure it to use a specific browser in the standard git way: + +git config web.browser chromium +"""]] diff --git a/doc/forum/Delete_unused_files__47__metadata.mdwn b/doc/forum/Delete_unused_files__47__metadata.mdwn new file mode 100644 index 000000000..5c6b41399 --- /dev/null +++ b/doc/forum/Delete_unused_files__47__metadata.mdwn @@ -0,0 +1,7 @@ +After moving some files (about 1G, some big and some small files) in and out the annex, I noticed that the size of the repository has grown quite a bit. My empty repository now is over 100 MB (even after "git annex dropunused ..." and "git gc"). + +Most of this size is not Git metadata but many small files in the git-annex branch that seem to hold information about files I deleted (even in the other known repositories). + +So is there a way to get rid of these useless but space consuming information? + +(Maybe there is no (elegant) way to remove the symlink versions from the Git history (is there?), but it would already be nice if those small git-annex metadata files could be removed) diff --git a/doc/forum/Delete_unused_files__47__metadata/comment_1_3efc19895c8dec89b71ae3778b583fea._comment b/doc/forum/Delete_unused_files__47__metadata/comment_1_3efc19895c8dec89b71ae3778b583fea._comment new file mode 100644 index 000000000..c0d779abd --- /dev/null +++ b/doc/forum/Delete_unused_files__47__metadata/comment_1_3efc19895c8dec89b71ae3778b583fea._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-08-07T20:06:26Z" + content=""" +You must have quite a number of files and/or location tracking churn to get the branch that large. + +Removing location tracking files for vanished files from the git-annex branch would not save much space.. Only a very little bit of tree object size going forward. The way the git-annex branch is merged does not really allow deleting files from it. And of course git uses space for even deleted files. + +It'd be possible to delete the git-annex branch entirely, first backing up git-annex:uuid.log git-annex:remote.log and git-annex:trust.log and then making a new, clean branch that those files are added back to. Then run git annex fsck on every clone to repopulate the location tracking info for files that still exit. (Note that this would also lose urls stored by `git-annex addurl`.) +"""]] diff --git a/doc/forum/Delete_unused_files__47__metadata/comment_2_23597d9468347b3d94257f3c02afe1b8._comment b/doc/forum/Delete_unused_files__47__metadata/comment_2_23597d9468347b3d94257f3c02afe1b8._comment new file mode 100644 index 000000000..340debc11 --- /dev/null +++ b/doc/forum/Delete_unused_files__47__metadata/comment_2_23597d9468347b3d94257f3c02afe1b8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-08-08T14:54:42Z" + content=""" +I'm sort of getting into the same issue as I run 'git-annex get .' and 'git annex sync' with one of the annexes that I have on a nightly basis to collect data for back up reasons. But it's good to know there is a work around for it. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__.mdwn b/doc/forum/Detached_git_work_tree__63__.mdwn new file mode 100644 index 000000000..3c1f6ae24 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__.mdwn @@ -0,0 +1,11 @@ +Does git-annex (safely) handle detached work trees? + +That is, in git I can set `GIT_WORK_TREE=/dir/A` and `GIT_DIR=/dir/B` in the environment and have all my .git stuff in /dir/B and all my files in /dir/A. + +I can see this coming in useful for a few situations, but in particular for difficult file systems - like SMB or old implementations of NFS. + +In my particular case I have a Drobo (something like a proprietary NAS). The Drobo is linux based, but by default mounts as a samba share or if you install `unfsd` it can be mounted via NFS. Unfortunately, the nfs is v3 and doesn't allow locks, so git-annex barfs. :-( + +What I'd like to be able to do is have a direct mode annex on the drobo, with the git directory sitting on one of my linux machines. That machine would be the only one that would directly access the drobo data as an annex but other systems that look at the drobo would see what looks like a normal directory structure; for example my media centre - `mythtv` naturally! - would see "normal" names for my music collection, not SHA256 hashes... + +I guess there would be an issue if there were different `GIT_DIR`s pointing to the one `GIT_WORK_TREE`, but that is a caveat emptor IMHO. diff --git a/doc/forum/Detached_git_work_tree__63__/comment_10_656c737772bf92be2c7a2f33bd2bb0f0._comment b/doc/forum/Detached_git_work_tree__63__/comment_10_656c737772bf92be2c7a2f33bd2bb0f0._comment new file mode 100644 index 000000000..0bf9c12f4 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_10_656c737772bf92be2c7a2f33bd2bb0f0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="comment 10" + date="2013-02-24T12:04:21Z" + content=""" +Been using it a few hours now and it works like a charm - first thing I did was get a sitemap of the LCA and FOSDEM talks and use addurl --fast on them, since I've been wanting to do that since I saw the lightning talk last year at FOSDEM. + +Thanks again for making this awesome utility! +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_1_28ac35a325fba250721d9f1b7c994960._comment b/doc/forum/Detached_git_work_tree__63__/comment_1_28ac35a325fba250721d9f1b7c994960._comment new file mode 100644 index 000000000..83721eac3 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_1_28ac35a325fba250721d9f1b7c994960._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:32:51Z" + content=""" +Recent versions of git-annex support these variables. I haven't tested it extensively, but AFAIK it works. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_2_7128c26bbc8efea04a5a317edf0ca9f2._comment b/doc/forum/Detached_git_work_tree__63__/comment_2_7128c26bbc8efea04a5a317edf0ca9f2._comment new file mode 100644 index 000000000..e9154c693 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_2_7128c26bbc8efea04a5a317edf0ca9f2._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="Having issues here" + date="2013-02-23T14:44:15Z" + content=""" +I'm trying to use git-annex with vcsh, and it doesn't seem to be respecting the GIT_WORK_TREE and GIT_DIR variables vcsh sets. If I try it manually, the same happens. + +Any time I try to invoke a git-annex subcommand (init, add) via vcsh (vcsh $repo annex init/add/etc) it spits out an error that \"git-annex: Not in a git repository.\" + +I'd really like this to work, so that I can manage the bigger files in my home with topic-based annexes alongside plain-git repos for dotfiles. + +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_3_a3c22f905748ff2c803e8621c74a87a0._comment b/doc/forum/Detached_git_work_tree__63__/comment_3_a3c22f905748ff2c803e8621c74a87a0._comment new file mode 100644 index 000000000..0e59edd76 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_3_a3c22f905748ff2c803e8621c74a87a0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 3" + date="2013-02-23T15:01:57Z" + content=""" +@Alex, you forgot to say what version of git-annex you are having trouble with. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_4_8063921241760458349e7cb0cadf3d4e._comment b/doc/forum/Detached_git_work_tree__63__/comment_4_8063921241760458349e7cb0cadf3d4e._comment new file mode 100644 index 000000000..b0d8fcd41 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_4_8063921241760458349e7cb0cadf3d4e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="comment 4" + date="2013-02-23T15:07:52Z" + content=""" +3.20130216.1 from Hackage - I packaged it for Exherbo specifically to try this, and installed it about two hours ago. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_5_4510a787255cb03e7d0c3e7b830b7d52._comment b/doc/forum/Detached_git_work_tree__63__/comment_5_4510a787255cb03e7d0c3e7b830b7d52._comment new file mode 100644 index 000000000..693e8ef4d --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_5_4510a787255cb03e7d0c3e7b830b7d52._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 5" + date="2013-02-23T16:44:48Z" + content=""" +So, I found and fixed that bug. It really seems to be working now. Although I've thought that at least twice before! + +There is an important caveat though, with using `GIT_DIR` and/or `GIT_WORK_TREE`. + +git-annex needs to check in symlinks that point at the git repository. If using `GIT_DIR`, those symlinks do not look like \"-> .git/annex/objects/\"; they instead point off to some git repository elsewhere, as a relative path. For example they could look like \"-> ../gitrepo/annex/objects/\". Similar when using `GIT_WORK_TREE`. + +But this is a problem if you want to use the same git repo elsewhere, with a git work tree and repo that are not set up the same relative to one-another, because the links will all be wrong. So, if you decide to use `GIT_DIR` or `GIT_WORK_TREE` with git-annex, any clone of the repository will need to place the git directory in the same place relative to the working tree. + +If you later want to change the relative paths between git directory and work tree, it would need to be changed in all clones of the repository, and then you could use `git annex fix` to update the symlinks. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_6_ffd9c67ecc5b46ae98996018573f5591._comment b/doc/forum/Detached_git_work_tree__63__/comment_6_ffd9c67ecc5b46ae98996018573f5591._comment new file mode 100644 index 000000000..faecbf2f5 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_6_ffd9c67ecc5b46ae98996018573f5591._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="comment 6" + date="2013-02-23T21:23:18Z" + content=""" +Cool, thanks! The caveat shouldn't be much of a problem for my use case - with vcsh, the workdir is always $HOME, and I'm using the recommended mr-based workflow so the gitdir will always be ~/.config/vcsh/repo.d/$name.git in each clone. + +EDIT: fix erroneous path +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_7_36ca007643c983604fc4aed6ec8cb3d2._comment b/doc/forum/Detached_git_work_tree__63__/comment_7_36ca007643c983604fc4aed6ec8cb3d2._comment new file mode 100644 index 000000000..9e5d241a2 --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_7_36ca007643c983604fc4aed6ec8cb3d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="Further possible issues" + date="2013-02-23T23:17:43Z" + content=""" +Mm, looking at the actual code changes it may still not work with vcsh - since multiple GIT_DIRS share one GIT_WORKTREE, some symlinks will point to ~/.config/vcsh/repo.d/foo.git and some will point to ~/.config/vcsh/repo.d/bar.git. When git annex is invoked with GIT_DIR='~/.config/vcsh/repo.d/bar.git', with the changes you made files annexed by ~/.config/vcsh/repo.d/foo.git will still match isLinkToAnnex. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_8_b7a2da4fbace7156e11c48a496a19dc9._comment b/doc/forum/Detached_git_work_tree__63__/comment_8_b7a2da4fbace7156e11c48a496a19dc9._comment new file mode 100644 index 000000000..7d9d13a7a --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_8_b7a2da4fbace7156e11c48a496a19dc9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 8" + date="2013-02-23T23:23:01Z" + content=""" +That should not be a problem, because git-annex only acts on files that `git ls-files` lists. +"""]] diff --git a/doc/forum/Detached_git_work_tree__63__/comment_9_f9fa237a693d28178f0451799209f7e2._comment b/doc/forum/Detached_git_work_tree__63__/comment_9_f9fa237a693d28178f0451799209f7e2._comment new file mode 100644 index 000000000..16702141c --- /dev/null +++ b/doc/forum/Detached_git_work_tree__63__/comment_9_f9fa237a693d28178f0451799209f7e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="comment 9" + date="2013-02-24T00:52:52Z" + content=""" +Alright then, sounds like it should be perfect! Thanks for the quick response! +"""]] diff --git a/doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn b/doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn new file mode 100644 index 000000000..a94281a1f --- /dev/null +++ b/doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn @@ -0,0 +1,24 @@ +I'm starting to experiment with git annex. I'd like to use it for a centralized git repo that will be checked out often, but the clones will rarely need some large binary files (used for testing). Therefore, I've set up a centralized/bare git repo and a clone of that repo using the instructions at [centralized_git_repository_tutorial](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/) and [bare_repositories](http://git-annex.branchable.com/bare_repositories/). I've added some files to the annex in the clone. + +I'm struggling to understand the difference between copy, move, and get. Here's a sequence of commands: + + >> git annex add shared/1bel.maegz + >> git commit -m "added first file" + >> git push + >> git annex move shared/1bel.maegz --to origin + ## Now it no longer exists in my local repo + >> git annex get shared/1bel.maegz + fails. + >> git annex get shared/1bel.maegz --from origin + fails. + >> git annex copy shared/1bel.maegz --from origin + fails. + >> git annex move shared/1bel.maegz --from origin + succeeds! Now I have the file in my clone. + +Each failure message is: + + fatal: Could not switch to '../.git/annex/objects/W8/gZ/SHA256-s99196--62874e9b58e652c9c01e796c2bf38b2234a80e0cef95c185bb7f0857d9765df2': No such file or directory + git-annex: : hGetLine: end of file + +How are copy, move, and get different? Which one *should* I be using to move my large data into the central (bare) repo? Will it then be available to other clones? diff --git a/doc/forum/Difference_between_copy__44___move_and_get__63__/comment_1_26ee8192af3a62178c1ccf17c6da5ca5._comment b/doc/forum/Difference_between_copy__44___move_and_get__63__/comment_1_26ee8192af3a62178c1ccf17c6da5ca5._comment new file mode 100644 index 000000000..fb1aed5da --- /dev/null +++ b/doc/forum/Difference_between_copy__44___move_and_get__63__/comment_1_26ee8192af3a62178c1ccf17c6da5ca5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-09T02:00:11Z" + content=""" +There is no particular reason to use any of copy, move, or get. Use which ever command makes sense at the time. + +The problem you're encoutering is that you have an old, and broken version of git-annex installed. Upgrade and the error message will go away and both get and copy, in your example, will work. +"""]] diff --git a/doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn b/doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn new file mode 100644 index 000000000..8413a6e08 --- /dev/null +++ b/doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn @@ -0,0 +1,6 @@ +Is there likely to be any problem in pointing different annexes to the same special remote (i.e. rsync/box.com/etc.) ? + +As the objects are stored based on their SHA256 key the expectation is that the chance of collision is is small. + +The only problem I can foresee is where the same content is stored in more than one annex and it is deleted in the remote in one annex, but not the other - there won't be any protection against that, but for non-overlapping content this risk should be negligible. + diff --git a/doc/forum/Different_annexes_pointing_to_same_special_remote__63__/comment_1_359f46805e6508d03aadd90429937546._comment b/doc/forum/Different_annexes_pointing_to_same_special_remote__63__/comment_1_359f46805e6508d03aadd90429937546._comment new file mode 100644 index 000000000..282ed82c8 --- /dev/null +++ b/doc/forum/Different_annexes_pointing_to_same_special_remote__63__/comment_1_359f46805e6508d03aadd90429937546._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 1" + date="2013-02-24T21:51:19Z" + content=""" +You're basically right. Additionally, if you use encryption, the keys used on the remote are themselves encrypted and so even the same content will result in different keys. + +With this said, it's easy to use a subdirectory of a rsync or box.com remote, and I'd rather recommend doing that, rather than jumbling multiple repositories data into a single directory. +"""]] diff --git a/doc/forum/Direct_special_remotes.mdwn b/doc/forum/Direct_special_remotes.mdwn new file mode 100644 index 000000000..bf80d57f8 --- /dev/null +++ b/doc/forum/Direct_special_remotes.mdwn @@ -0,0 +1,26 @@ +I have a NAS at home which I access both as AFP/SMB shares and thru ssh/rsync. Now, I'd like to keep on using the shares as before, i.e., browsable via AFP/SMB with conventional file names. Ideally, I'd also like to git-annex some NAS shares, preferably, in direct mode. However, it seems out of the question to install git-annex on the NAS (hopefully, I'm wrong about this in the long run). + +Two **non-special remote setups** would be: + +1. Mount the share and turn it into a direct mode git annex repo. Does anybody have experience with this? I'd suspect this to be very inefficient due to the use of all the files in .git over AFP/SMB. Configuration as a WORM backend seems to be advised? (Edit: Well, I just tried this and 'git annex init' failed as described in this [forum post](http://git-annex.branchable.com/forum/Can__39__t_init_git_annex/). So AFP/SMB seem to be non-starters. :-( Furthermore, AFP/SMB are immediately detected as crippled and set to direct mode automatically.) +2. Same as 1. but with a local GIT_DIR. This should work by having .git on the NAS link to the local GIT_DIR. + +Alternatively, I could treat my NAS as a [**web special remote**](http://git-annex.branchable.com/tips/using_the_web_as_a_special_remote/). Some URL schemes come to mind: + +* **file:** This would benefit from some wish list items ([recursive directory remote setup/addurl](http://git-annex.branchable.com/todo/wishlist:_recursive_directory_remote_setup__47__addurl/)). +* **rsync:** AFAIK not implemented (yet?) as an option for web special remotes. +* **sftp:** (Might also include ssh access.) + +The problem is that the "web semantics" don't really work in my use case: + +* Files might change/move on the NAS. +* I'd like changes (e.g., renamed files) in my local repo to propagate to the NAS. Currently, git-annex would use git push for this purpose IIUC, however that's not available on the NAS... +* the web semantics seem to imply that there is exactly one "web" repository (and the URL is fixed) + +All of these indicate a mismatch between my use case and web special remotes. + +Hence my question: **Would something like a "direct special remote" make sense?** + +As a starting point I'd look at a setup similar to 2. above, i.e., a remote "working copy" with local GIT_DIR. Except that instead of a whole local .git directory a branch in an existing .git dir might be more appropriate... + +--Chris diff --git a/doc/forum/Direct_special_remotes/comment_1_50357130a1c57ad2fab70f71925faf02._comment b/doc/forum/Direct_special_remotes/comment_1_50357130a1c57ad2fab70f71925faf02._comment new file mode 100644 index 000000000..09e977128 --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_1_50357130a1c57ad2fab70f71925faf02._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVICFY2CDP08xdsPr3cgmScomy9HA-1sk" + nickname="Andrew" + subject="comment 1" + date="2013-04-04T00:33:15Z" + content=""" +\"Dumb NAS in direct mode, without git-annex installed\" would greatly expand the possible use cases IMO - it would transform git-annex from a distributed filesystem to a general sync tool. Or maybe I'm dreaming. +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_2_e94a722ca056a068bcc16eb822008602._comment b/doc/forum/Direct_special_remotes/comment_2_e94a722ca056a068bcc16eb822008602._comment new file mode 100644 index 000000000..4b4d8632c --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_2_e94a722ca056a068bcc16eb822008602._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.179.73" + subject="Local rsync ssh remote (I am confused)" + date="2013-04-13T17:54:06Z" + content=""" +If I understand this right, it is not possible to use git-annex as a simple wrapper around rsync. + +My use case is this: I have a music folder on a plug computer running debian squeeze. The plug computer acts as a streaming music server. My wish is to create a local ssh remote to have my laptop git-annex music repo in sync with the plug computer. So ideally I don't want to install git-annex on the plug computer (but git is there so a git bare repo can be used). + +According to the UI, if I use \"Pairing with a local computer\", both computers needs to have git-annex installed. If I try \"Remote server\" either I need both machines git-annex aware or I need the content of the plug computer to be encrypted (which is obviously not what I want in this case). + +Is the use case supported by the UI ? Should I try with the CLI ? + +Thanks for your help + + +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_4_187036bbfee0508e2914afb51ead3c71._comment b/doc/forum/Direct_special_remotes/comment_4_187036bbfee0508e2914afb51ead3c71._comment new file mode 100644 index 000000000..1f6287111 --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_4_187036bbfee0508e2914afb51ead3c71._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.190.181" + subject="comment 4" + date="2013-04-14T09:01:27Z" + content=""" +Thanks ! + +Before trying the CLI, I will install have a go with installing git-annex on the plug computer. + +Do you know by any chance if version 3.20120629~bpo60+2 (the available version on squeeze-backport) will be compatible with the current latest release (4.20130405) ? + +I guess I am asking if version 3 is compatible with version 4. + + +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment b/doc/forum/Direct_special_remotes/comment_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment new file mode 100644 index 000000000..86621a00e --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="comment 4" + date="2013-04-14T01:07:19Z" + content=""" +@pradermecker: I think that the CLI would be able to do what you're describing (to some extent), but the issue is that the filenames it creates will be hashes, and not in the folder pattern that is on your laptop. Of course, if the plug computer uses file metadata to determine file info, and will search a directory tree, then it probably won't care that the files are named strange things. + +As a quick example: + +I have a repo with three files in it: + + $ ls -R + .: + File 1 File 2 File 3 + +I copy those files to a directory remote: + + $ git annex copy --to=test-dir * + copy File 1 (to test-dir...) + ok + copy File 2 (to test-dir...) + ok + copy File 3 (to test-dir...) + ok + (Recording state in git...) + +Then I look at what's in my directory remote: + + $ cd ../remote + $ ls -R + .: + 0d4 d35 f15 + + ./0d4: + d37 + + ./0d4/d37: + SHA256-s7--a940d8aadc02f798331b2d46f1a8ad2c9821783060f4a0810da42bf785855c1c + + ./0d4/d37/SHA256-s7--a940d8aadc02f798331b2d46f1a8ad2c9821783060f4a0810da42bf785855c1c: + SHA256-s7--a940d8aadc02f798331b2d46f1a8ad2c9821783060f4a0810da42bf785855c1c + + ./d35: + 55c + + ./d35/55c: + SHA256-s7--ab1ad6a49c022416008887464b8dc03b523b9e81530cf47d1f6f7712c1b30955 + + ./d35/55c/SHA256-s7--ab1ad6a49c022416008887464b8dc03b523b9e81530cf47d1f6f7712c1b30955: + SHA256-s7--ab1ad6a49c022416008887464b8dc03b523b9e81530cf47d1f6f7712c1b30955 + + ./f15: + 3f2 + + ./f15/3f2: + SHA256-s7--d1993f1115215aa6389e33fa9979fb39bb29e5bed14661baf1cf6af3182f0164 + + ./f15/3f2/SHA256-s7--d1993f1115215aa6389e33fa9979fb39bb29e5bed14661baf1cf6af3182f0164: + SHA256-s7--d1993f1115215aa6389e33fa9979fb39bb29e5bed14661baf1cf6af3182f0164 + +I haven't checked, but I think that the assistant will be able to use a special remote that you create from the CLI once you create it. + +To create a remote without encryption using the CLI, try a command of the form `git annex initremote remote-name blah blah blah encryption=none` +Also see the information at [[special_remotes/directory]], [[special_remotes/rsync]], and [[Repo accessible from \"dumb\" client without git-annex]]. +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_5_69c34c655e4b153dfc0d1b8580091124._comment b/doc/forum/Direct_special_remotes/comment_5_69c34c655e4b153dfc0d1b8580091124._comment new file mode 100644 index 000000000..bad1f635c --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_5_69c34c655e4b153dfc0d1b8580091124._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="comment 4" + date="2013-04-16T07:57:05Z" + content=""" +Not I. Sorry. You might want to make a forum post about this, if you haven't already: [[forum]] +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_6_b054cfc3d3f81873f3faae7eb4f5337c._comment b/doc/forum/Direct_special_remotes/comment_6_b054cfc3d3f81873f3faae7eb4f5337c._comment new file mode 100644 index 000000000..5ade3f1d0 --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_6_b054cfc3d3f81873f3faae7eb4f5337c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-16T17:03:36Z" + content=""" +Version 3.2012* is compatible with the current version. You can install that version anywhere you don't need the full assistant. +"""]] diff --git a/doc/forum/Direct_special_remotes/comment_7_5f9d8a0ef2f13f242594848825d29ee7._comment b/doc/forum/Direct_special_remotes/comment_7_5f9d8a0ef2f13f242594848825d29ee7._comment new file mode 100644 index 000000000..fa1f07daa --- /dev/null +++ b/doc/forum/Direct_special_remotes/comment_7_5f9d8a0ef2f13f242594848825d29ee7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9AR8BqG4RPw_Ov2lnDCJWMuM6WMRobQ" + nickname="Dav" + subject="Curious to know if there's progress on this" + date="2013-12-09T00:49:45Z" + content=""" +The above scenario is also quite interesting to me. Similarly running and old OS (Debian 4.x) on a NAS, and it would be great to be able to access files directly (via direct mode) and manage via git annex, along with a true backup elsewhere. Mostly commenting so I'll get emails for further discussion here. +"""]] diff --git a/doc/forum/Distributing_data_to_a_set_of_drives.mdwn b/doc/forum/Distributing_data_to_a_set_of_drives.mdwn new file mode 100644 index 000000000..406379715 --- /dev/null +++ b/doc/forum/Distributing_data_to_a_set_of_drives.mdwn @@ -0,0 +1 @@ +Here is my situation, Say I have a repo that is 3 TBs (lets call this repo A has full copy of everything.) and I have 3 other drives all 1 TB each lets call them B C D, then I have partial checkouts on my laptops D E. What I would like to do is, have two copies of all files in A and BCD I would like to threat BCD as a group acting like a single repo so A distributes files evenly to drives in group BCD. I also want copies in D and E to not count towards num of files. As for the latter even though I set D and E as untrusted annex still counts copies on those repos If a get a file in D assistant drops a copy from one of the trusted repos A or BCD I have to move it back instead of just dropping it. Also How can I or is it possible to set BCD to act as a group so A distributes files among drives currently I can do this using find/get but it turns it into a math problem every time a add a file to A I have to manually check which disk has most space navigate to it check files with less copies then 2 and get them. diff --git a/doc/forum/Distributing_data_to_a_set_of_drives/comment_1_f1fa72879f4e1db13bf59dea33c91624._comment b/doc/forum/Distributing_data_to_a_set_of_drives/comment_1_f1fa72879f4e1db13bf59dea33c91624._comment new file mode 100644 index 000000000..f0c0a1c2b --- /dev/null +++ b/doc/forum/Distributing_data_to_a_set_of_drives/comment_1_f1fa72879f4e1db13bf59dea33c91624._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 1" + date="2014-05-08T16:56:34Z" + content=""" +I recommend rewriting your comment. Use paragraphs and be more clear and specific. +"""]] diff --git a/doc/forum/Distributing_data_to_a_set_of_drives/comment_2_e13b4e5c1e6f1f503f93d521b504d5c1._comment b/doc/forum/Distributing_data_to_a_set_of_drives/comment_2_e13b4e5c1e6f1f503f93d521b504d5c1._comment new file mode 100644 index 000000000..5843ab177 --- /dev/null +++ b/doc/forum/Distributing_data_to_a_set_of_drives/comment_2_e13b4e5c1e6f1f503f93d521b504d5c1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 2" + date="2014-05-17T17:00:19Z" + content=""" +git-annex doesn't allow bonding repositories like that, but it does have repository groups which can accomplish the same thing. + +For example, if you put B C and D into the archive group, and set the [[preferred_content]] expression to \"standard\", then each repository will only want files that have not yet reached some other archive repository. + +Or, you can make up your own group name, like \"BCD\" and set the preferred content of each repository to something like \"not (copies=BCD:2)\" -- and now it will try to have 2 copies of each file on one of the drives. + +Once it's configured, using either the git-annex assistant, or `git annex sync --content` will copy files around according to the configuration. + +This will tend to fill up the first drive, or the first 2 drives, and only use subsequent drives if files don't fit on the first drive. You can use [[cost]] settings to control which drives files are put on. +"""]] diff --git a/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn new file mode 100644 index 000000000..d5a3d3a92 --- /dev/null +++ b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn @@ -0,0 +1 @@ +Do both friends need to be online in order for Jabber syncing to work? Or will the pushed changes be stored on the Jabber server, so that when the remote machine does come online it can pull them even if the original machine is now offline? diff --git a/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_1_f290dd8547176793934f8077374e1c0a._comment b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_1_f290dd8547176793934f8077374e1c0a._comment new file mode 100644 index 000000000..8df82612a --- /dev/null +++ b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_1_f290dd8547176793934f8077374e1c0a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-02-27T17:54:47Z" + content=""" +Both friends need to be online at the same time to sync with Jabber. + +There are some extensions that store and forward jabber messages, but: + +* They are probably not widely available. +* AFAIK they only forward chat messages. But we try not to use visible messages, because that would prevent + reusing your jabber account with git-annex. +* Most importantly, the git protocol lets the sender and receiver communicate with each other to work out what data to transfer. If one if offline, the best that could be done is to upload the whole git repository! + +If you want the ability for off-line clients to sync up, you should add a shared bare git repository. +"""]] diff --git a/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_2_c358eb51047f333e582bd824be5e0e65._comment b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_2_c358eb51047f333e582bd824be5e0e65._comment new file mode 100644 index 000000000..b3efced0b --- /dev/null +++ b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_2_c358eb51047f333e582bd824be5e0e65._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="24.16.193.140" + subject="comment 2" + date="2013-03-11T19:40:30Z" + content=""" +How would I add a shared bare git repository in the web app? +"""]] diff --git a/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment new file mode 100644 index 000000000..c9a877980 --- /dev/null +++ b/doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-11T19:45:34Z" + content=""" +That's done by the \"Remote server\" option on the Repositories page. + +You need to have git-annex (any old version will do) installed on the server for this to work. + +Of course, a regular git remote will do as well, although the assistant does not set this up. You could even use github for that remote, or a similar service; any remote added with `git remote add` will be used by the assistant. +"""]] diff --git a/doc/forum/Does_git-annex_version_big_files__63__.mdwn b/doc/forum/Does_git-annex_version_big_files__63__.mdwn new file mode 100644 index 000000000..5cbe7d50a --- /dev/null +++ b/doc/forum/Does_git-annex_version_big_files__63__.mdwn @@ -0,0 +1,5 @@ +Hi + +I am trying to understand how git-annex works. Does it version big files at all? + +thanks diff --git a/doc/forum/Does_git-annex_version_big_files__63__/comment_1_0b44003c1dc53adb807298ae452f8004._comment b/doc/forum/Does_git-annex_version_big_files__63__/comment_1_0b44003c1dc53adb807298ae452f8004._comment new file mode 100644 index 000000000..7f403f0cd --- /dev/null +++ b/doc/forum/Does_git-annex_version_big_files__63__/comment_1_0b44003c1dc53adb807298ae452f8004._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-09T18:56:59Z" + content=""" +Yes. Have you read [[How_It_Works]]? +"""]] diff --git a/doc/forum/Does_git-annex_version_big_files__63__/comment_2_ca40b67abd7bd36155d16d0396d7472c._comment b/doc/forum/Does_git-annex_version_big_files__63__/comment_2_ca40b67abd7bd36155d16d0396d7472c._comment new file mode 100644 index 000000000..a753d7e82 --- /dev/null +++ b/doc/forum/Does_git-annex_version_big_files__63__/comment_2_ca40b67abd7bd36155d16d0396d7472c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="karhun" + ip="99.20.248.32" + subject="comment 2" + date="2012-11-09T21:37:19Z" + content=""" +Hi + +Thanks for the pointer. + +The reason I asked about is that it says that \"git-annex allows managing files with git, without checking the file contents into git. \". So I was just trying to understand the mechanic behind the description. If it is not check into the git then probably it is not versioning the files. I assumed that it must be merely a sync tool. + + +"""]] diff --git a/doc/forum/Does_git-annex_version_big_files__63__/comment_3_32de3501feedce51b43ed9dcc399c7a9._comment b/doc/forum/Does_git-annex_version_big_files__63__/comment_3_32de3501feedce51b43ed9dcc399c7a9._comment new file mode 100644 index 000000000..33c4ef7ba --- /dev/null +++ b/doc/forum/Does_git-annex_version_big_files__63__/comment_3_32de3501feedce51b43ed9dcc399c7a9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="karhun" + ip="99.20.248.32" + subject="comment 3" + date="2012-11-12T05:58:16Z" + content=""" +Hi + +I have one more follow up question. + +So git-annex versions files as I understand. Is it possible to use it without file versioning and just use it as a sync tool. I realize that there are example scenarios to demonstrate it however I would like to disable versioning if possible because I am intending to use it on large folders with big binary type files. + +thanks + +"""]] diff --git a/doc/forum/Does_git-annex_version_big_files__63__/comment_4_8c65a7f8bda3c876971c2801fb6a76a1._comment b/doc/forum/Does_git-annex_version_big_files__63__/comment_4_8c65a7f8bda3c876971c2801fb6a76a1._comment new file mode 100644 index 000000000..f7f2e85dc --- /dev/null +++ b/doc/forum/Does_git-annex_version_big_files__63__/comment_4_8c65a7f8bda3c876971c2801fb6a76a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 4" + date="2012-11-12T15:17:53Z" + content=""" +Let's suppose you delete a file from git, and sync the deletion. Later, you can run `git annex unused` and it will find content not needed by any branch of the git repository. And if you choose, you can use `git annex dropunused` to delete that content. +"""]] diff --git a/doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn b/doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn new file mode 100644 index 000000000..872e7d53d --- /dev/null +++ b/doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn @@ -0,0 +1,7 @@ +Out of simple curiosity, how does 'git annex migrate' work? I'm mostly wondering how file integrity is ensured. + +Let's say you want to migrate foo.txt from (say) md5 to sha256. Does git annex simply sha256sum foo.txt and rename it in the .git/objects folder to the new sum? Or does it md5sum foo.txt, verify that it's the not corrupt, then sha256sum it and rename to the new sum? + +You could run into problems if you migrate without first verifying; if the file is corrupt and you simply sha256sum and rename it, then the file wouldn't seem corrupt at your next fsck. + +I'm sure you've considered this during the basic design phase of git-annex, but I'd just like to be sure. I'm kind of paranoid when it comes to data integrity. =P diff --git a/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_1_cef50b32c46f4406c6f918c5866ddc15._comment b/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_1_cef50b32c46f4406c6f918c5866ddc15._comment new file mode 100644 index 000000000..7c819a8ca --- /dev/null +++ b/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_1_cef50b32c46f4406c6f918c5866ddc15._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T18:28:01Z" + content=""" +I actually didn't originally consider this, but it turns out I have wonderful users, and you're at least the second to consider this case. + +So the released git-annex version does already verify the checksum when doing a migration. However, as I was checking this, I noticed +I had left a window between the verification and the generation of the new key for the migration. It's pretty unlikely a file would get corrupted just as it was being migrated, but that's no excuse. I've committed a change that reverses the order; so it generates a new key and then verifies the old one. +"""]] diff --git a/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_2_f389b924c8531b35fdf5dedd10fc8000._comment b/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_2_f389b924c8531b35fdf5dedd10fc8000._comment new file mode 100644 index 000000000..c377d814c --- /dev/null +++ b/doc/forum/Does_migrate_ensure_data_integrity__63__/comment_2_f389b924c8531b35fdf5dedd10fc8000._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="154.51.136.37" + subject="comment 2" + date="2013-05-14T15:54:08Z" + content=""" +An even better solution. Thanks for your time and effort joey! +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn new file mode 100644 index 000000000..aae2bf276 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn @@ -0,0 +1,25 @@ +My Use Case: + +I try basicly to use annex as a raid-like tool (at least thats the first step) + +so I added some big files to it, and then I synced it to a usb-remote. So far all did go well... + +No I startet annex watch daemon... because I thought it would then watch the files and checkin and out at least for the "origin" copy of the files. + +Then I thought lets delete some files I dont need anymore... so... rm.... ^^ + +Maybe I just wanted to see what happens or if that would magicly do what I wanted him to do... ok I knew that it would not delete the file on the usb-drive (backup...) ok... but maybe at least localy... + + +Now what did happen instead of that... the links are gone yes... the files it self are in the .git objects tree, so they did not get deleted, so ok not the way I wanted... have to unlock it first, would make maybe sense... + +So I tried first to get the links back... tried fix, tried unused, tried get... but the links doesnt show up again... + +is there a way to first bring back the links? +is it save or the right way to just git rebase HEAD~3 to bring the links back? + +and then when I want to delete files from all places whats the way to do that... annex unlock -> then delete? or git drop filex --copies=0 or something? + +like I said I try to use is like a more flexible raid thing, this files are to big to really back em up with history... I watch them... and then soon I will often delete them (from everywhere). but other parts stay... I dont delete them then... ^^ + +So maybe I missuse annex for that usecase... try to find that out ;) diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_1_b307bfb0b70d649897f411eb753bd50a._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_1_b307bfb0b70d649897f411eb753bd50a._comment new file mode 100644 index 000000000..739319b71 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_1_b307bfb0b70d649897f411eb753bd50a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.60" + subject="comment 1" + date="2012-09-16T00:14:49Z" + content=""" +You can use any git command you like like `git rebase` or `git revert` to operate on the links. + +git-annex, like git, keeps data for files that have been deleted. + +The `git annex unused` command will find that data and let you remove it. See [[walkthrough/unused_data]]. + + +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_2_58a6a1476274b8c4feb3d43ecd998759._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_2_58a6a1476274b8c4feb3d43ecd998759._comment new file mode 100644 index 000000000..01ad2901d --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_2_58a6a1476274b8c4feb3d43ecd998759._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="thanx for fast help ;)" + date="2012-09-16T16:09:29Z" + content=""" +git-annex version: 3.20120629 + +git annex unused did not show me anything... dont know why... I did only \"rm Directory\" not git rm... but \"git annex watch\" did check it in... I sadly have reverted and droped the file now... but if you want I can try to delete other files the same way to see if annex unused shows them... then I post the hole commands... k I try it now: + +oh I see the directory I wanted to drop did not get dropped because I set numcopies to 2 ;) so I try it again with that file: + +1. rm -r directory +2. ls it is gone (should be ;) ) + +user@host:~/annex/SOFTWARE$ git annex unused +unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking usbdrive/master...) ok +user@host:~/annex/SOFTWARE$ + +Is that like it should be? If so, should unused only show stuff that I delete with git rm? + + +----------------------------------- + +Ok I did read the unused doku you pointed me. So I thought I got it, but I did not: + +If I + +1. rm File +2. in the usb-repos, git pull +both repositories dont have a link to the file. +3. git unused shows nothing +4. it seemed that the link AND the File it links to got deleted: + +-../.git/annex/objects/pM/vq/SHA256-s1066518528--00c5e1b1610c0c2dfab05c7a55aaad + +but the file size is 1gb, both directories dont get smaller... also if I use git gc after that it does not get smaller too. + +Is there a way to really delete files from both repositories. + +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_3_4b857f481db7b2437ac9f8137a8510e2._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_3_4b857f481db7b2437ac9f8137a8510e2._comment new file mode 100644 index 000000000..a1e003ee7 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_3_4b857f481db7b2437ac9f8137a8510e2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.60" + subject="comment 3" + date="2012-09-16T17:08:49Z" + content=""" +> unused . (checking for unused data...) (checking master...) (checking synced +/master...) (checking usbdrive/master...) ok + +It still considers a file's content used while some branch contains the file. So one of the branches it's checking there still has your file in it. Once you get all the branches synced up, the file will become unused. +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_4_828db3bf2863d98c0b0fb4074aa7f066._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_4_828db3bf2863d98c0b0fb4074aa7f066._comment new file mode 100644 index 000000000..20e180107 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_4_828db3bf2863d98c0b0fb4074aa7f066._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="comment 4" + date="2012-09-16T22:51:00Z" + content=""" +hmm Ok I tried now something that seems to did it... after I did checkin and pull the deletion of the soft-link of the file... I addionaly used git annex sync, and then again pushed it from the usb drive... now the unused command finds stuff... + +So am I right now to make that happen: + +1. delete the file in the \"main\" repos +2. git pull from the other repository(s) +3. git annex sync + +4. git annex unused (now it founds something to delete) + +5. git annex dropunused 1-1000 (or some other range) do that in both repositories to delete in on both... and do that maybe as cronjob (from point 2 to 5) or do the last last step only if a drive is nearly full (automaticly or manually...) + +ok so maybe I could use that. + +the advantages over something like rsync are... + +1. I have a history and can reverse some operations (till I do step 5 ^^) +2. I am more flexible in repo/remote types +3. checksums get saved +4. I can have repo with all links but 0 data on a 3rd pc and can \"get\" stuff dynamicly (what is the cheapest transfeir) ot them... aka partial checkouts + +ok I think the 4. advantage buys me ;) + +hope I got it now right with the 5 step instruction. + +keep up your great work, would have tried kickstarter here maybe too for other stuff... but I am no american ;) and eu-guys are not allowed, and I also have no relative in usa ;) but that only as a site note ;) +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment new file mode 100644 index 000000000..14e5b3da3 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 5" + date="2012-09-17T14:12:13Z" + content=""" +That looks right except you shouldn't have to `git pull from the other repository(s)`. The first thing `git annex sync` does is a `git pull`. +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_6_1759bcd5708f591f91b9c410f6dc5c54._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_6_1759bcd5708f591f91b9c410f6dc5c54._comment new file mode 100644 index 000000000..379d728ee --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_6_1759bcd5708f591f91b9c410f6dc5c54._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="comment 6" + date="2012-09-17T23:00:09Z" + content=""" +ok I now at least got it that it is nice to run watch on both repositories... + +but what I dont get is, is the git annex watch commando not a automatic way so that this deamon makes sync command whenever needed? so I have to use git annex sync first on the repos where I delete the file and then again on the repos I want to receive that change... that seemed to work, but why did watch not do that for me??? + + + + +"""]] diff --git a/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_7_2a389f01eb5131042ea1e71a73c9787a._comment b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_7_2a389f01eb5131042ea1e71a73c9787a._comment new file mode 100644 index 000000000..ecc159641 --- /dev/null +++ b/doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_7_2a389f01eb5131042ea1e71a73c9787a._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="comment 7" + date="2012-09-18T00:11:50Z" + content=""" +cd /mnt/data/annex/ && +/usr/bin/git annex sync && +/usr/bin/git annex copy --auto --to usbdrive && +cd /mnt/usb1/annex/ && +/usr/bin/git annex sync && +echo \"synced\" || +echo \"backup of annex failed\" | sendxmpp -t name@server.country + + +ok suprisingly that did not only sync the files but also did remove the file, so you dont need a pull... dont know what I did wrong the other times I tried, does maybe the copy command also \"copies\" the delete commit? + +but annyway that works for me... (for now I do the dropunused command manuelly...) + +that should work as cronjob... +"""]] diff --git a/doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn b/doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn new file mode 100644 index 000000000..39f8c1041 --- /dev/null +++ b/doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn @@ -0,0 +1,19 @@ +I just created a new Annex by doing the following: + + 1. git init + 2. git annex init + 3. git annex add . + 4. git commit -m "Added files" + 5. git annex status + +I see the following: + + local annex keys: 224 + local annex size: 41 gigabytes + known annex keys: 235 + known annex size: 49 gigabytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256: 459 + +Why is there an 8 gigabyte difference here? What/where are those files? What is a bloom filter? diff --git a/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_1_10749c0d76e824217dd1ff8c8a6e42a5._comment b/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_1_10749c0d76e824217dd1ff8c8a6e42a5._comment new file mode 100644 index 000000000..5ab1d55cc --- /dev/null +++ b/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_1_10749c0d76e824217dd1ff8c8a6e42a5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-10-17T12:54:42Z" + content=""" +Those are duplicate files. + +see http://git-annex.branchable.com/tips/finding_duplicate_files/ for how to easily display them. +"""]] diff --git a/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment b/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment new file mode 100644 index 000000000..c1ca018f5 --- /dev/null +++ b/doc/forum/Don__39__t_understand_local_vs._known_keys/comment_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2012-10-17T17:32:52Z" + content=""" +The local keys are files whose content is locally present. +The known keys are annexed files in the current branch, whose content may or may not be present. + +Justin is correct -- if you have the same file in the tree twice, it will be counted twice as known keys. Since git-annex deuplicates, only one local key is needed to store it. + +The bloom filter is a technical implementation detail that allows the potentially expensive status scan to run in constant space. You can read about it on Wikipedia if interested. :) +"""]] diff --git a/doc/forum/Drop_with_assistant.mdwn b/doc/forum/Drop_with_assistant.mdwn new file mode 100644 index 000000000..f8847ab18 --- /dev/null +++ b/doc/forum/Drop_with_assistant.mdwn @@ -0,0 +1,5 @@ +Hi, + +how can I handle *drop* with the assistant? There are some files in my annex that I don't need on my laptop. so i just *drop* them on the command line bevcause I have copies on my server and an external usb drive. But after a while the assistant pulls all the files back in. Can I avoid this and make the *drop* somehow "sticky" until i *get* them over cli? + +Best, Michael diff --git a/doc/forum/Drop_with_assistant/comment_1_048f5a31c549afb19b76a65bddd0cd24._comment b/doc/forum/Drop_with_assistant/comment_1_048f5a31c549afb19b76a65bddd0cd24._comment new file mode 100644 index 000000000..e59c285c2 --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_1_048f5a31c549afb19b76a65bddd0cd24._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-04-11T07:32:50Z" + content=""" +Hi, + +you can set your repository type to 'manual'. + +Best +Karsten +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_2_527d7b6a8efa85b904111f179912d926._comment b/doc/forum/Drop_with_assistant/comment_2_527d7b6a8efa85b904111f179912d926._comment new file mode 100644 index 000000000..d3ffed3f7 --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_2_527d7b6a8efa85b904111f179912d926._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 2" + date="2013-04-11T08:26:01Z" + content=""" +@Karsten But then I would loose all replication features? Or can I mark subfolders as manual? Or would I mix different annexes? +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_3_c50857506869bb1cd306b66acf37fba8._comment b/doc/forum/Drop_with_assistant/comment_3_c50857506869bb1cd306b66acf37fba8._comment new file mode 100644 index 000000000..cd45baeaf --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_3_c50857506869bb1cd306b66acf37fba8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-04-11T13:18:04Z" + content=""" +The trivial way to do this is to set your repository to \"client\" and then when you want to drop a file, create a folder called \"archive\" and drag the file into that folder. The assistant will drop it (if numcopies is satisfied that there are enough copies elsewhere). If you want it back, drag it out of the archive and the assistant will re-fetch it. + +This is how I use git-annex: I have an ssh remote and a usb drive which are both \"backup\" and my laptop is \"client\", and my numcopies is sent to 2. + +Files are always copied to the ssh remote and the usb drive because they're \"backup.\" That fulfills my numcopies=2. At that point, anything in an \"archive\" folder on my laptop will be dropped automatically. + +It means my annex is littered with \"archive\" folders, but it achieves the desired effect. +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_4_1ea37445d5eb96c3efa182e88e07b867._comment b/doc/forum/Drop_with_assistant/comment_4_1ea37445d5eb96c3efa182e88e07b867._comment new file mode 100644 index 000000000..56fcfa254 --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_4_1ea37445d5eb96c3efa182e88e07b867._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 4" + date="2013-04-11T13:39:13Z" + content=""" +A nice feature would be, to be able to put a .annex-manual file into a subfolder and from that point the files would require manual git-annex management. +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_5_c08908ea5232cbe067c73ecd12d0e218._comment b/doc/forum/Drop_with_assistant/comment_5_c08908ea5232cbe067c73ecd12d0e218._comment new file mode 100644 index 000000000..b13392a9c --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_5_c08908ea5232cbe067c73ecd12d0e218._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-11T15:00:10Z" + content=""" +Setting your repository to manual doesn't prevent it syncing changes out to other repositories, it just prevents it from downloading the contents of files it doesn't already have. + + +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_6_015134228cb865f97326fbb7193636ea._comment b/doc/forum/Drop_with_assistant/comment_6_015134228cb865f97326fbb7193636ea._comment new file mode 100644 index 000000000..b57bfdda9 --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_6_015134228cb865f97326fbb7193636ea._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 6" + date="2013-04-12T06:31:17Z" + content=""" +@joey But a *manual* node will still be the middleman between say a remote host and a local usb connected to the node? +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_7_950759930667588f21659cd6d7065fbb._comment b/doc/forum/Drop_with_assistant/comment_7_950759930667588f21659cd6d7065fbb._comment new file mode 100644 index 000000000..c4bd03a9c --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_7_950759930667588f21659cd6d7065fbb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 7" + date="2013-04-12T13:30:24Z" + content=""" +As I understand it, nothing will \"be the middleman\" in the sense of, if annex A has remotes B and C, grabbing content from B in order to give it to C without regards for whether or not A wants it. Annex A doesn't think in terms of moving content from one remote to another remote, only in terms of pulling and pushing to remotes individually. + +I get the \"move content from remote B to C\" effect by setting numcopies=2 and making both remotes \"backup.\" If content is only on remote B, it will migrate to A in order to fulfill numcopies. Then it will migrate to C because of C's preferred content settings. + +(Respecting minimum numcopies is higher priority than respecting preferred content settings, so even if A wouldn't normally \"want\" the content, it will receive it if it needs to in order to fulfill numcopies.) + +I've got A set to \"client\" so content in archive directories disappears once the content is on B and C (because numcopies is fulfilled, and so A's preferred content can take effect.) + +If you had A set to \"manual,\" then it wouldn't automatically drop content once it moved from B to A to C, though. Because it would only drop things manually. + +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_8_773e540e46adc43487323e8d38ceb2d9._comment b/doc/forum/Drop_with_assistant/comment_8_773e540e46adc43487323e8d38ceb2d9._comment new file mode 100644 index 000000000..9f9e0855c --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_8_773e540e46adc43487323e8d38ceb2d9._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-04-16T20:46:09Z" + content=""" +@edheil, you used to be right about the middleman. But I'm continually improving things. :) + +So, consider this situation: + +> A (client) --- B (client) ---- C (archive) + +If a file is created on A, inside an `archive` directory, B wants a copy, since it's not archived yet. Once B gets the copy, it sends it on the C. At that point, B notices that hey, this file was archived and is in an archive directory, and so it no longer wants its copy and drops it. + +(At this point A will also want to drop the file. However, it cannot! This is because git-annex requires positive, direct verification that some other repository has a file before dropping it, and A cannot talk to C to check. +However, if you set C to be trusted, this verification is bypassed, and then A will be able to drop the file as well.) + +This support for middlemen is a new feature, which will be in the next release. You can get it in any recent nightly build. + +Amusingly this feature was built without writing any haskell code.. just fine-tuning the preferred content expressions! + +We can also consider what happens if B is set to manual. In this case, it won't automatically get the file from A. But if you manually get it, then B will send it on to C. And A will drop the file once it hears that C has it. Due to the manual mode, you'll have to manually drop it from B of course. +"""]] diff --git a/doc/forum/Drop_with_assistant/comment_9_d85d120d7219ea6c179c2619a17bdae9._comment b/doc/forum/Drop_with_assistant/comment_9_d85d120d7219ea6c179c2619a17bdae9._comment new file mode 100644 index 000000000..9c9aa439c --- /dev/null +++ b/doc/forum/Drop_with_assistant/comment_9_d85d120d7219ea6c179c2619a17bdae9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 9" + date="2013-04-17T03:37:48Z" + content=""" +Nice! It sounds like there would be another way to accomplish what I'm currently accomplishing by using numcopies=2 and standard client/backup directories. (backup <--> client <--> backup) + +In order to get double backups, I *could* tweak the content settings for my laptop's annex, which is currently set to standard \"client\" mode, so that it's exactly like \"client\" mode except that \"archive\" directories want to drop content which is archived *twice*. (backup <--> tweaked-client <--> backup) + +Then I'd get content automatically copying itself out to two archives, and dropping it when it has done so, without touching numcopies. + +No reason not to keep doing it the way I'm doing it, since it's simpler, but it's cool to see the assistant getting smarter. :) + +"""]] diff --git a/doc/forum/Effectively_replicating_backup_files.mdwn b/doc/forum/Effectively_replicating_backup_files.mdwn new file mode 100644 index 000000000..85d8f4b52 --- /dev/null +++ b/doc/forum/Effectively_replicating_backup_files.mdwn @@ -0,0 +1,25 @@ +I currently use duply/duplicity to back up my networked computers to my home server. I have two external HDDs and, every week or so, I bring one of these home and copy the backup files to the hard drive (I leave them on the server to easily restore files and because I have a large hard drive in that). I use some hand-written scripts to keep a copy these backup files in the cloud (Ubuntu One) until they have been copied to both hard drives, ensuring that there are always two copies of the files somewhere offsite. Out of paranoia, I also have some "standalone backups" that are just huge encrypted archives of important folders (say, my entire Photos directory) as at a certain date - in case for some reason duplicity ever stops working or I need to roll something back to a version years earlier. I am less worried about these standalone backups and manually keep one copy of each somewhere. + +It sounds like Git-Annex could automate things quite nicely (and give me some neat extras, like knowing where they were). This is how I understand I should do it, but please let me know if it is the right approach or if you have any suggestions: + +1. Create a folder on my server called "annex" and make a Git-Annex "large backup" repository in there. +2. Create a folder within that called "archive" and put a "backup" folder within that. I understand that having the backups within an archive folder will mean that they aren't automatically copied to my desktop machines etc. +3. Within that "backup" folder, create two folders, one called "duplicity" and one called "standalone". Put the backups in the respective folders. +4. Set up gcrypt Git-Annex repositories on my two external HDDs as "small backups". This seems to just start copying files across. That surprised me, as the files are in the archive folder and I thought the default was numcopies=1. Is there some autosync option that I need to turn off? Ideally, I would like it to encrypt/decrypt primarily with my server GPG key (which I'm not worried about copying around my computers), but also encrypt to my personal GPG key (where I'd only put my public key on the server, but I know I will not lose the secret key for that). Am I right that to do that I would need to set the repos up manually with: + + git init --bare /mnt/externalHDD1 + + git annex initremote externalHDD1 type=gcrypt gitrepo=/mnt/externalHDD1 keyid=$serverkey keyid=$personalkey + + git annex sync externalHDD1 + + Or should the gitrepo be the location of my main Git-Annex repository? How do I make it sync up with my other repos? + +5. I understand that I would then need to set numcopies=3 in a .gitattributes file in the "archive/backup/duplicity" directory and, say, a numcopies=2 in the "archive/backup/standalone". +6. I could then add a cloud repository as a "transfer" repository and Git-Annex should only keep files on that that are not already in the right number of places (similar to what my scripts are doing now). +7. I have recently upgraded my hard drive, so I have my old 1TB internal hard drive that I will be putting in a cupboard somewhere. I was thinking that I could make this an archive drive for things like one copy of my duplicity/standalone backups. I wouldn't want it to be the only copy of anything. If I just set it as an archive drive, would this work? +8. Are there more clever ways of doing this? I consider my external HDDs and the cloud repo as "offsite" repositories and ideally there would always be one copy of my backups offsite (in addition to at least three overall). There would also ideally be one of each of my files "live" (in most cases my server) that could instantly push files into a cloud repo and then to wherever I am. Is there any ability to put repositories in groups and write rules like that? + +Any thoughts greatly appreciated! + +Aaron diff --git a/doc/forum/Effectively_replicating_backup_files/comment_1_b1ab0da82db076c5244b0dcc95282ddd._comment b/doc/forum/Effectively_replicating_backup_files/comment_1_b1ab0da82db076c5244b0dcc95282ddd._comment new file mode 100644 index 000000000..54f7f782a --- /dev/null +++ b/doc/forum/Effectively_replicating_backup_files/comment_1_b1ab0da82db076c5244b0dcc95282ddd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-07T16:42:14Z" + content=""" +This all sounds reasonable to me. + +gitrepo= is the location of the repository you are setting up with gcrypt, not your existing git-annex repository. + +numcopies configures the lower bound of the number of copies, not the upper bound. There's no \"small backup\" type, you must mean either small archive, or incremental backup. Either type of repository is going to want to have files that have not previously been archived, or backed up. + +You might eventually want to write your own [[preferred_content]] expressions to handle offsite repositories. I'd recommend starting simple and building up. +"""]] diff --git a/doc/forum/Effectively_replicating_backup_files/comment_2_472ab9c973b475f7f3ce7e3934f94281._comment b/doc/forum/Effectively_replicating_backup_files/comment_2_472ab9c973b475f7f3ce7e3934f94281._comment new file mode 100644 index 000000000..668416c04 --- /dev/null +++ b/doc/forum/Effectively_replicating_backup_files/comment_2_472ab9c973b475f7f3ce7e3934f94281._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="comment 2" + date="2013-11-07T19:46:32Z" + content=""" +Thanks Joey! + +> gitrepo= is the location of the repository you are setting up with gcrypt, not your existing git-annex repository. + +Great, thanks. If I set these up outside of the WebApp, what is the best way to link them up to my main repositories? + +> numcopies configures the lower bound of the number of copies, not the upper bound. There's no \"small backup\" type, +> you must mean either small archive, or incremental backup. Either type of repository is going to want to have files +> that have not previously been archived, or backed up. + +Yes, I meant incremental backup. Thanks, understood. The page on preferred content ( http://git-annex.branchable.com/preferred_content/ ) made things a bit clearer. I didn't realise that the incremental backups etc want a copy even if it isn't necessary to satisfy numcopies. Does that mean that once it is on one backup drive, it will not be sent to the other unless I increase numcopies? + +"""]] diff --git a/doc/forum/Effectively_replicating_backup_files/comment_3_826493bd59b81786c1f6a56f1c438004._comment b/doc/forum/Effectively_replicating_backup_files/comment_3_826493bd59b81786c1f6a56f1c438004._comment new file mode 100644 index 000000000..9088de9e7 --- /dev/null +++ b/doc/forum/Effectively_replicating_backup_files/comment_3_826493bd59b81786c1f6a56f1c438004._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2013-11-08T17:06:02Z" + content=""" +The webapp can use remotes that you have configured at the command line just as well as it can use remotes you configure using the webapp. + +Each file only gets backed up to one incremental backup repository. If you have a full backup repository it will (try to) get another copy of every single file. +"""]] diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn b/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn new file mode 100644 index 000000000..614d27688 --- /dev/null +++ b/doc/forum/Encrypted_Content_Remote_Daemon_.mdwn @@ -0,0 +1 @@ +I am currently using rsync.net to keep my notes in sync, both git repo and the content (gpg encrypted) is stored there. Instead of creating two other repos on a server that I have which has git-annex installed where I can actually use remote daemon. Is it possible to create a repo containing both the git repo and the content encrypted from the command line? diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment new file mode 100644 index 000000000..eb97c2680 --- /dev/null +++ b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_1_96f63e509e23c081c48302274e21db78._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-27T00:31:18Z" + content=""" +Why not go all the way and encrypt the git repository stored on the remote server too? [[special_remotes/gcrypt]] + +When you have git-annex-shell installed on the remote server, the remote daemon should work for gcrypt repositories as well as normal non-encrypted git repositories. +"""]] diff --git a/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment new file mode 100644 index 000000000..a699ad640 --- /dev/null +++ b/doc/forum/Encrypted_Content_Remote_Daemon_/comment_2_acd0ffdc3f5079265858073c2af81557._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-04-28T09:14:12Z" + content=""" +I would love to use gcrypt and I tried it but the problem is at every sync it will ask for my pass phrase even though the key used to encrypt the repo is pass phrase less it goes through the keys in my keychain and asks me to unlock all my keys one by one. +"""]] diff --git a/doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn b/doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn new file mode 100644 index 000000000..ea54026f8 --- /dev/null +++ b/doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn @@ -0,0 +1,87 @@ +Hello, + +I hope my understanding of the git-annex webapp is correct, and if not, please correct my wrong thought-pattern. + +I have 2 VPS servers and 5 computers. On the 5 computers, I want to sync one folder (with subfolders and files). All the computers are full-disk encrypted, and it is important for me that when the data leaves my computer, it stays encrypted in one way or another. I want to use the two VPS's as an encrypted ssh full backup repository. + +The computers are rarely on at the same time, some are off for two weeks, others are on more frequent. However, the VPS's are always on. + +Now, is it possible to set up git-annex to support this behaviour? Using an encrypted ssh remote to make sure the folder is in sync on all computers? + +I've set git-annex up on one box, with the two servers as encrypted full backup remotes (without git-annex installed there), and configured my jabber account. That all works, and the files get synced. + +Then I've set up a second computer, while the first one is still on. There I've added my jabber account, and created a local repository. Then I selected "Share with your other devices". It now shows my jabber account on both machines, and I saw a few syncing messages, but then there came errors, "Unable to download files from your other devices". I've attached the log at the bottom of this page. + +It gives me the option to add a Cloud Repository. If I add the encrypted rsync full backup remote VPS there, will it work and keep my files in sync? is there something I'm doing wrong? + +Note that the computers I've set up now are two OS X machines running Mountain Lion, and the servers are CentOS 6. + +Log: + + + [2013-07-15 07:44:17 CEST] main: starting assistant version 4.20130709-g18e5f43 + + (scanning...) [2013-07-15 07:44:17 CEST] Watcher: Performing startup scan + (started...) [2013-07-15 07:45:08 CEST] main: starting assistant version 4.20130709-g18e5f43 + + (scanning...) [2013-07-15 07:45:08 CEST] Watcher: Performing startup scan + (started...) [2013-07-15 07:54:31 CEST] XMPPClient: Pairing with stnl in progress + rercrrrreveeeec:ccccv vvvv:r:::: e rsrrrreoeeeesussssorooooucuuuurerrrrc cccceveeee a vnvvvvaiaaaansnnnnihiiiisesssshdhhhhe eeeed(dddd C (o((((CnCCCConoooonennnnncnnnneteeeecicccctottttiniiiio oooonrnnnn e rsrrrreeeeeestsssse eeeetbtttt y b bbbbypyyyy e peppppereeeee)eeeer + rrrr))))) + + + + + recv: resource vanished (Connection reset by peer) + recv:r errceevcs:vo :ur rercseeos uovruacrneci esv havenadin si(hsCehoden dn( eC(coCtnoinnoennce tcriteoisnoe ntr erbseyes tep teb eybr y)p + epeere)r + ) + [2013-07-15 07:55:00 CEST] XMPPSendPack: Syncing with janwxmpp + Already up-to-date. + recv: resource vanished (Connection reset by peer) + [2013-07-15 07:55:04 CEST] XMPPReceivePack: Syncing with janwxmpp + To xmpp::janwxmpp@gmail.com + * [new branch] git-annex -> refs/synced/0a41c397-09e8-4957-a6f4-2a6846a4f9d8/cmVsc3RubEBnbWFpbC5jb20=/git-annex + * [new branch] master -> refs/synced/0a41c397-09e8-4957-a6f4-2a6846a4f9d8/cmVsc3RubEBnbWFpbC5jb20=/master + [2013-07-15 07:55:25 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-07-15 07:55:25 CEST] XMPPSendPack: Syncing with janwxmpp + recv: resource vanished (Connection reset by peer) + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + [2013-07-15 07:57:25 CEST] XMPPSendPack: Unable to download files from your other devices. + recv: resource vanished (Connection reset by peer) + recv: resource vanished (Connection reset by peer) + recv: resource vanished (Connection reset by peer) + recv: resource vanished (Connection reset by peer) + recv: resource vanished (Connection reset by peer) + + (Recording state in git...) + + (scanning...) [2013-07-15 08:01:36 CEST] Watcher: Performing startup scan + (started...) recvr:rrrrrrre eeeeeeecrcccccccvevvvvvvv:s::::::: o rurrrrrrrereeeeeeescsssssssoeooooooou uuuuuuurvrrrrrrrcaccccccceneeeeeee i vsvvvvvvvahaaaaaaanennnnnnnidiiiiiiis sssssssh(hhhhhhheCeeeeeeedoddddddd n (n(((((((CeCCCCCCCocooooooontnnnnnnnninnnnnnneoeeeeeeecnccccccct tttttttiriiiiiiioeooooooonsnnnnnnn e rtrrrrrrre eeeeeeesbssssssseyeeeeeeet ttttttt p bebbbbbbbyeyyyyyyy r p)pppppppe + eeeeeeeeeeeeeeerrrrrrrr)))))))) + + + + + + + + [2013-07-15 08:44:42 CEST] XMPPSendPack: Syncing with janwxmpp + recv: resource vanished (Connection reset by peer) + recrvre:ec cvrv:e: s roreuesrsocoueur rcvceae n vivasanhnieisdsh he(edCd o (n(CnCoeoncnntneiecoctnti ioronen s reretes sebetyt bpbyey e prpe)ee + err)) + + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + [2013-07-15 08:46:42 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-07-15 08:46:42 CEST] XMPPSendPack: Syncing with janwxmpp + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + [2013-07-15 08:48:42 CEST] XMPPSendPack: Unable to download files from your other devices. diff --git a/doc/forum/Encrypted_ssh_remote__44___synced_folders/comment_1_7b9b4ef614c90e0b222d24678d1b9026._comment b/doc/forum/Encrypted_ssh_remote__44___synced_folders/comment_1_7b9b4ef614c90e0b222d24678d1b9026._comment new file mode 100644 index 000000000..9ebee5f70 --- /dev/null +++ b/doc/forum/Encrypted_ssh_remote__44___synced_folders/comment_1_7b9b4ef614c90e0b222d24678d1b9026._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T19:40:20Z" + content=""" +Yes, you need to add the rsync remote to the second computer. Once it's set up, they will be able to exchange file contents using it, and using XMPP as a control channel. + +If the first computer already has that rsync remote configured, it should push some notes about the existance of that remote to the second one, over XMPP. Then in the webapp, you should just need to click on \"enable\" next to the rsync remote, and it'll prompt for the necessary info to set it up. +"""]] diff --git a/doc/forum/Error_adding_ssh_remote_in_assistant.mdwn b/doc/forum/Error_adding_ssh_remote_in_assistant.mdwn new file mode 100644 index 000000000..e2ef42a19 --- /dev/null +++ b/doc/forum/Error_adding_ssh_remote_in_assistant.mdwn @@ -0,0 +1,15 @@ +I'm trying to add a ssh remote in the web app, but I receive the following error: + + Internal Server Error + + ssh-keygen ["-F","router.eisenacher81.org"] exited 1 + +The console complains about the known_hosts file: + + /home/michael/.ssh/known_hosts is not a valid known_hosts file. + line 44 missing key: AAAAB3NzaC1yc2EAAAABIwAAAIEAtnX75Qa8YVR... + key_read: uudecode AAAAB3NzaC1|1|veTakKhYY3OSqCepiq7WAUK8cxQ=|suoi0YU/lgg781Vz9O7yTao5exY= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA4bTnEFFiKz4+i3S9DWHJVoV8CD1DsVRJRodWdTA86+x58S0l0rUyJgXbGwScMI+xFCrqzpd4Hgoc4ElRykj5SL+7IuB5ZAe+4ILQPeiL9ck/1Q7uoh7vWiURXr92Hz5tjuEe3QI9H iKauXj5yj5mGq1VVXLN1CdfQ99G4zSxK7c= failed + line 73 invalid key: |1|k9vzo7Ftuxf235It5LbrX36p2f0=|rNHdygip... + line 93: invalid hashed name: |1||1|aptgcuUg4ITWhZQLxzRHH8gUIOQ=|Qe2JAlAw++SZosE9ZhQW+fA3twE=... + line 120 missing key: AAAAB3NzaC1yc2EAAAABIwAAAQEAsHa75NfjyB1... + /home/michael/.ssh/known_hosts is not a valid known_hosts file. diff --git a/doc/forum/Error_adding_ssh_remote_in_assistant/comment_1_eecc0660db4083cc91c5330587f74610._comment b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_1_eecc0660db4083cc91c5330587f74610._comment new file mode 100644 index 000000000..c5ca91231 --- /dev/null +++ b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_1_eecc0660db4083cc91c5330587f74610._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-22T12:40:55Z" + content=""" +Looks like you have a corrupt known_hosts file, but I'm pretty sure git-annex did not do it, as it only lets ssh update that as normal. If you delete the problem lines it'll probably work, though you might want to save a copy to investigate what happened. +"""]] diff --git a/doc/forum/Error_adding_ssh_remote_in_assistant/comment_2_3e6aad22e8020b12ff7ef914b75281d1._comment b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_2_3e6aad22e8020b12ff7ef914b75281d1._comment new file mode 100644 index 000000000..85acfcc1e --- /dev/null +++ b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_2_3e6aad22e8020b12ff7ef914b75281d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 2" + date="2012-09-27T15:29:56Z" + content=""" +I've made the assistant ignore ssh-keygen -F failing. +"""]] diff --git a/doc/forum/Error_adding_ssh_remote_in_assistant/comment_3_3ea529e16502071fc0980c6d5c60a036._comment b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_3_3ea529e16502071fc0980c6d5c60a036._comment new file mode 100644 index 000000000..799050de0 --- /dev/null +++ b/doc/forum/Error_adding_ssh_remote_in_assistant/comment_3_3ea529e16502071fc0980c6d5c60a036._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 3" + date="2012-09-27T15:42:19Z" + content=""" +Okay, cleaning up the file worked for me, but I suspect that these invalid entries were created by a valid program. So ignoring errors in the file is \"good enough\". +"""]] diff --git a/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn new file mode 100644 index 000000000..76294b6a6 --- /dev/null +++ b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn @@ -0,0 +1 @@ +I have an external HDD which I setup as a remote manually before I started using the assistant. When I plug it in files sync fine and the git-annex branch gets synced, but the master branch doesn't; git annex sync doesn't do the job and I have to run git pull. This is annoying because it means that portable drive is useless as a backup, since it doesn't have the required metadata; I have to manually git pull to make it a useful backup. How can I make the assistant sync the metadata in--if not the master branch, at least origin/master so I could merge later without the remote available. Thanks. diff --git a/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_1_9a909e3d89061adacbd8ed370520250c._comment b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_1_9a909e3d89061adacbd8ed370520250c._comment new file mode 100644 index 000000000..43fe578e1 --- /dev/null +++ b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_1_9a909e3d89061adacbd8ed370520250c._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-08T21:25:49Z" + content=""" +apologies if I misunderstand your question, but I believe that git-annex puts the metadata in the repository's sync/master branch, which you can merge into the repository's local master either manually or by running \"git annex sync\" in the repository. + +"""]] diff --git a/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_2_0dd489b264374b7b1065b89e1ff7561b._comment b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_2_0dd489b264374b7b1065b89e1ff7561b._comment new file mode 100644 index 000000000..d26707c22 --- /dev/null +++ b/doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_2_0dd489b264374b7b1065b89e1ff7561b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.166.255" + subject="comment 2" + date="2012-12-08T21:57:37Z" + content=""" +It does, which is what one would have expected I guess, but I didn't look. Thanks so much. +"""]] diff --git a/doc/forum/Fast_cloning_a_repo_initially.mdwn b/doc/forum/Fast_cloning_a_repo_initially.mdwn new file mode 100644 index 000000000..52a275786 --- /dev/null +++ b/doc/forum/Fast_cloning_a_repo_initially.mdwn @@ -0,0 +1,3 @@ +Is there any fast way to rsync a direct-mode (assistant) git/annex directory from one machine to another? + +Scenario: I was already using unison to synchronize 40GB between my desktop and laptop. I've added git annex to my desktop, but is there a way to bootstrap on my laptop without needing to re-transfer all the files? (I don't have a .git on my laptop yet but all the files are there already.) diff --git a/doc/forum/Fast_cloning_a_repo_initially/comment_1_0db0caafe30dd1b6f15fb1679dec8f9f._comment b/doc/forum/Fast_cloning_a_repo_initially/comment_1_0db0caafe30dd1b6f15fb1679dec8f9f._comment new file mode 100644 index 000000000..5d4aa3509 --- /dev/null +++ b/doc/forum/Fast_cloning_a_repo_initially/comment_1_0db0caafe30dd1b6f15fb1679dec8f9f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="24.159.78.125" + subject="comment 1" + date="2014-05-23T15:30:23Z" + content=""" +I don't recommend moving direct mode repositories between filesystems, because git-annex relies on the inode as one way to detect if files in a direct mode repo have changed. It will notice that all the inode numbers have changed, and fall back to a mode where it only uses mtime. + +Anyway, your situation is better handled by initializing a repository on the desktop, and a separate one on the laptop. Then add remotes tying the repos together, and git-annex sync will just do the right thing, including not transferring files that have already been synced to both places. +"""]] diff --git a/doc/forum/Fast_cloning_a_repo_initially/comment_2_e17abc209c2b3ba20158be76801ce04a._comment b/doc/forum/Fast_cloning_a_repo_initially/comment_2_e17abc209c2b3ba20158be76801ce04a._comment new file mode 100644 index 000000000..0a07264cd --- /dev/null +++ b/doc/forum/Fast_cloning_a_repo_initially/comment_2_e17abc209c2b3ba20158be76801ce04a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jamieson" + ip="71.11.161.246" + subject="Thanks!" + date="2014-05-23T16:11:35Z" + content=""" +I'll do it that way, thanks!! +"""]] diff --git a/doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn b/doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn new file mode 100644 index 000000000..173cd2d94 --- /dev/null +++ b/doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn @@ -0,0 +1,6 @@ +hi, +i just did git annex unused in 2 repos, one with WORM and one with SHA1. +with WORM i instantly could see which file it was, with SHA1 not. + +so would it be possible to just add the first seen filename to the hashes identifier? the name could just be ignored but it would help with unused to see which file i am searching for. +thanks! diff --git a/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_1_73dc0a9cad486cf2d34faf064c6193b1._comment b/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_1_73dc0a9cad486cf2d34faf064c6193b1._comment new file mode 100644 index 000000000..8a2f9fb00 --- /dev/null +++ b/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_1_73dc0a9cad486cf2d34faf064c6193b1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-16T15:19:25Z" + content=""" +Adding a filename would defeat deduplication. You suggest adding the \"first seen\" filename, but then git-annex would need to maintain a lookup between hashes and hashes with the first seen filename to use when adding new files. + +There is already [[todo/wishlist: option to print more info with 'unused']]. +"""]] diff --git a/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_2_f818b3ecfeb1d1dd83df4668c061718a._comment b/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_2_f818b3ecfeb1d1dd83df4668c061718a._comment new file mode 100644 index 000000000..638492822 --- /dev/null +++ b/doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_2_f818b3ecfeb1d1dd83df4668c061718a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="orb" + ip="178.11.228.69" + subject="comment 2" + date="2013-10-17T21:12:09Z" + content=""" +thanks! (i hope a thanks is wanted, i know people who are just distracted and consider \"thanks\" posts unnecessary) +"""]] diff --git a/doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn b/doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn new file mode 100644 index 000000000..a9d9fb162 --- /dev/null +++ b/doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn @@ -0,0 +1,19 @@ +I'm sitting on a pretty fast connection, and often git-annex isn't using my entire upstream to fill the remotes. + +Lets say i have an annex with 10 x 100mb files. and my git-annex has 5 special remotes that needs to be filled. + +I would like to have git-annex do 5 concurrent uploads(one to each remote). Currently git-annex only uploads to one special-remote at a time (meaning the 4 remaining servers are just waiting). + +It would also be nice to have a per remote number of threads. Especially if adding a directory with 1000 small files in it(say 100bytes each), having 5 transfer threads to each remote would make the sync complete much faster. + + +For now i've made a shell script that i call: + + # for j in `seq -w 0 10`; do echo DOING $j; for i in `curl "http://127.0.0.1:$1/?auth=$2" | grep "continue" | gawk -F\" ' { print $8 } '`; do curl "http://127.0.0.1:$1$i"; sleep 0; done; done + +But it is very rough, and basically just starts all transfers on the page. Which means i currently have 315 active transfers running. whoops. + +I could improve the shell script. But it really would be quite a bit niftier to have it as settings in git-annex. + +Sincerely +Tobias diff --git a/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn b/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn new file mode 100644 index 000000000..0a069340c --- /dev/null +++ b/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn @@ -0,0 +1,5 @@ +I'm not sure of the right place for feature requests; sorry if this is incorrect. + +It occurred to me that it would be neat if running git annex copy --auto copied enough copies of the file to connected remotes that don't have it to fulfil numcopies (if possible). Further coolness could come from choosing the remotes smartly (based, for example, on availability, access cost, remote disk space, trust level... you get the idea) + +Having an option like this would allow the user to use numcopies to backup files to wherever possible, if they don't really care about where those copies go. diff --git a/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing/comment_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment b/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing/comment_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment new file mode 100644 index 000000000..cd834e08d --- /dev/null +++ b/doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing/comment_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.183" + subject="comment 1" + date="2013-02-09T02:32:23Z" + content=""" +You can kind of do this now by: + +for remote in $(git remote); do git annex copy --auto --to $remote; done + +Although without some of the potential smarts of course. +"""]] diff --git a/doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn b/doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn new file mode 100644 index 000000000..2fdab28a7 --- /dev/null +++ b/doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn @@ -0,0 +1 @@ +I would like it if the webapp could support setting up [bare remotes](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/) to assist with syncing between two machines that are never online at the same time. diff --git a/doc/forum/Find_files_that_lack_a_certain_field_in_metadata.mdwn b/doc/forum/Find_files_that_lack_a_certain_field_in_metadata.mdwn new file mode 100644 index 000000000..b0fe9ddaa --- /dev/null +++ b/doc/forum/Find_files_that_lack_a_certain_field_in_metadata.mdwn @@ -0,0 +1,5 @@ +Is there any way to find all files that do not have a certain field assigned in metadata. E.g. I want to find all files that do not have an author field set and + + git-annex find --not --metadata "author=*" + +doesn't give any results. diff --git a/doc/forum/Find_files_that_lack_a_certain_field_in_metadata/comment_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment b/doc/forum/Find_files_that_lack_a_certain_field_in_metadata/comment_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment new file mode 100644 index 000000000..fbfb6ebb6 --- /dev/null +++ b/doc/forum/Find_files_that_lack_a_certain_field_in_metadata/comment_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-21T22:36:51Z" + content=""" +--metadata does not support globs, so your example is asking for all files that don't have an author field with a literal \"*\" value. When I try that command, it lists all files ... as expected. + +It seems that adding glob support to it would get to the result you want, and makes sense to parallel git annex view. Change made in git! +"""]] diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn new file mode 100644 index 000000000..ded094ec1 --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn @@ -0,0 +1,3 @@ +I've made a first attempt at a .app launcher for git-annex webapp for OSX, please see the icon needs to be resized and made to look nicer at somepoint, the launcher assumes that git-annex is in the run time path. + +I would imagine it might be possible to fiddle with the paths and get all the needed components into the .app file for OSX users. diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_1_97c261b9080c5ecc5424683066bbe05b._comment b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_1_97c261b9080c5ecc5424683066bbe05b._comment new file mode 100644 index 000000000..aa2757054 --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_1_97c261b9080c5ecc5424683066bbe05b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-23T15:14:20Z" + content=""" +Aha! I had been fumbling trying to find the right way to do this. Looks very promising. Found the documentation for the file format: + +Where do I install this thing? If I put the git-annex.app directory inside ~/Desktop/, will that put it on the user's desktop? + +Could you make a screenshot? + +I'm guessing that the NSAppleScriptEnabled is not needed, and perhaps the LSMinimumSystemVersionByArchitecture block could also be removed. +"""]] diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_2_ae45f9703b635c235409682cf252d36c._comment b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_2_ae45f9703b635c235409682cf252d36c._comment new file mode 100644 index 000000000..edb8e50c7 --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_2_ae45f9703b635c235409682cf252d36c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 2" + date="2012-09-23T15:17:42Z" + content=""" +Also, is there any global location I can install it when installing as root? +"""]] diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_3_066ca31a2e5dfe55a58092ba85231c7c._comment b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_3_066ca31a2e5dfe55a58092ba85231c7c._comment new file mode 100644 index 000000000..4a48117ee --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_3_066ca31a2e5dfe55a58092ba85231c7c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2012-09-23T15:52:31Z" + content=""" +The .app file can be placed anywhere, typically you would want to bundle it in a .dmg file for the user and the user just \"drags\" it to the /Applications folder. It should be possible to bundle statically linked binaries inside the .app bundle, you might end up having to ship parts of coreutils and a few other applications to make it self contained. + +Anyhow, here is a quick screencast and a screengrab of the app +"""]] diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment new file mode 100644 index 000000000..a18b341f7 --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-09-23T16:00:35Z" + content=""" +Thinking this out a little, I reckon the script _MacOS/git-annex_ could be a bit more clever and get the basedir/basename of where it app is and execute git-annex from the .app bundle, then you wouldn't need to install it as root at all. It would require a bit of work to collect the executables needed. + +Also, I just quickly checked my Lion install, it seems to come with git and uuidgen once xcode and the command line tools are installed. +"""]] diff --git a/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_5_92240b3f8629f1f2bbe1829700082a79._comment b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_5_92240b3f8629f1f2bbe1829700082a79._comment new file mode 100644 index 000000000..e8a6d550f --- /dev/null +++ b/doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_5_92240b3f8629f1f2bbe1829700082a79._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 5" + date="2012-09-23T16:29:19Z" + content=""" +For now I have it generating the shell script, so it contains the path to whereever git-annex's binary is actually installed. + +For root, the app is installed in /Applications/ , for non-root installs I put it in ~/Desktop/ +"""]] diff --git a/doc/forum/Fixing_up_corrupt_annexes.mdwn b/doc/forum/Fixing_up_corrupt_annexes.mdwn new file mode 100644 index 000000000..be6beeca8 --- /dev/null +++ b/doc/forum/Fixing_up_corrupt_annexes.mdwn @@ -0,0 +1,10 @@ +I was wondering how does one recover from... + +
+(Recording state in git...)
+error: invalid object 100644 8f154c946adc039af5240cc650a0a95c840e6fa6 for '041/5a4/SHA256-s6148--7ddcf853e4b16e77ab8c3c855c46867e6ed61c7089c334edf98bbdd3fb3a89ba.log'
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+
+ +The above was caught when i ran a "git annex fsck --fast" to check stash of files" diff --git a/doc/forum/Fixing_up_corrupt_annexes/comment_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment b/doc/forum/Fixing_up_corrupt_annexes/comment_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment new file mode 100644 index 000000000..335cbb51d --- /dev/null +++ b/doc/forum/Fixing_up_corrupt_annexes/comment_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-07-24T22:00:35Z" + content=""" +This is a corrupt git repository. See [[tips/what_to_do_when_a_repository_is_corrupted]] +"""]] diff --git a/doc/forum/Fixing_up_corrupt_annexes/comment_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment b/doc/forum/Fixing_up_corrupt_annexes/comment_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment new file mode 100644 index 000000000..4692338af --- /dev/null +++ b/doc/forum/Fixing_up_corrupt_annexes/comment_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-07-25T06:52:32Z" + content=""" +Ah I was looking at the walkthrough on how to fix the issue, I had not thought about looking at the tips section. That tip fixed the issue for me, thanks. +"""]] diff --git a/doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn b/doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn new file mode 100644 index 000000000..61a8c7905 --- /dev/null +++ b/doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn @@ -0,0 +1,20 @@ +The _views_ functionality has made the file structure dynamic. + +With this in mind would it be possible/suitable to make drag and drop targets for `git-annex get` and `git-annex drop` commands? +This would make available git annex most interesting feature to assistant users. + +I'm not entirely sure it's a good idea but it avoids file manager scripts and should be discoverable and easy to use. + +I see two possibilities: + +1. A folder in the annex root that contains a mirror of the tree but with only the unavailable files. Unavaliable files would then not be displayed in the live tree. Perhaps the folder can be called `remote`? Files can then be dragged from this tree to the live tree to trigger transfer of files. Any error/info gets displayed in the assistant +2. Flat droptargets in the annex root for `drop` and `get` commands. + + +Number one above makes discovering available files a bit cumbersome as you have to navigate down a parallell tree. It does make the available/remote distinction clearer which may be good for assistant users. + +The mechanism could be extended to include a folder or droptarget for each remote. + +The creation of droptargets/action folders could be triggered by a big visible button in the assistant interface **Manage Files** + +Is it messy? diff --git a/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn new file mode 100644 index 000000000..827383f9f --- /dev/null +++ b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn @@ -0,0 +1 @@ +With numcopies it is possible to control how many copies there should be of a file overall in all of the remotes. Is it also possible, using .gitattributes or something else, to force one of the repos (e.g. a server) to contain a copy of all files, or does this have to be done manually? diff --git a/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_1_702b1b94c735f1b9cde16daa77a80c12._comment b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_1_702b1b94c735f1b9cde16daa77a80c12._comment new file mode 100644 index 000000000..d964a253b --- /dev/null +++ b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_1_702b1b94c735f1b9cde16daa77a80c12._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-09-14T20:36:53Z" + content=""" +That is what the \"backup\" preferred content group is for. Depending on how your repos connect to each other it might take some more trickery to make all content migrate to it, but that will make it \"want\" all the files if it can get them. +"""]] diff --git a/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_2_3df7fcbcd482bb9377ead238b314995b._comment b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_2_3df7fcbcd482bb9377ead238b314995b._comment new file mode 100644 index 000000000..e59af71fb --- /dev/null +++ b/doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_2_3df7fcbcd482bb9377ead238b314995b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="Ed's right" + date="2013-09-19T18:56:39Z" + content=""" +What we don't have is something to enforce a particular preferred content setting. Ie, refuse to allow dropping a file from a repo if it's preferred content there. Currently you have to remember to use `git annex drop --auto` to cause the preferred content to be honored. +"""]] diff --git a/doc/forum/GPG_passphrase_handling.mdwn b/doc/forum/GPG_passphrase_handling.mdwn new file mode 100644 index 000000000..b0f82cb89 --- /dev/null +++ b/doc/forum/GPG_passphrase_handling.mdwn @@ -0,0 +1,76 @@ +[[!meta title="GPG passphrase handling on OSX"]] + +Hello! +I'm using OSX 10.9 and have installed gpg (and gpg2, if it matters) through +homebrew and git-annex through cabal. I also installed +https://github.com/joeyh/git-remote-gcrypt like the UI told me. + +Whenever I'm trying to add an encrypted remote through the web UI I get a +lot of "You need a passphrase to unlock the secret key for user:" on stdout +and, obviously, I can't enter my passphrase (If I could I wouldn't make this +post to begin with :)) +Is this behavior normal? What should I do to work around it? +I did also try to not use the web UI by using this command: +git annex initremote rsync.net type=gcrypt gitrepo=user@host:directory encryption=pubkey keyid=X + +Because of this I can't copy files to my remotes. All I get is: +----- +$ git annex copy --to rsync.net +copy MySecretFile (gpg) +You need a passphrase to unlock the secret key for +user: "user" +4096-bit RSA key, ID X, created 2013-10-01 (main key ID Y) + +(checking rsync.net...) (to rsync.net...) gpg: no valid addressees +gpg: [stdin]: encryption failed: No user ID +failed +----- + +Yes, I am using gpg-agent. When other applications ask for my passphrase I get +the pinentry dialog from GPGTools, just like I've configured it in +~/.gnupg/gpg-agent.conf, but this isn't the case with git-annex. + +If I remove GPGTools from /usr/local/bin with: ``brew link --overwrite gnupg && +brew link --overwrite gnupg2'' it works *slightly* better. +I get that pinentry dialog I want but when I do a copy I get: +----- +$ git annex copy --to rsync.net +copy MySecretFile (gpg) (checking rsync.net...) (to rsync.net...) gpg: no valid addressees +gpg: [stdin]: encryption failed: no such user id +failed +----- + +--debug shows me it is executing gpg llke so: +----- +gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] +----- + +$ git annex version +git-annex version: 4.20131024 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +$ gpg --version +gpg (GnuPG) 2.0.22 +libgcrypt 1.5.3 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Home: ~/.gnupg +Supported algorithms: +Pubkey: RSA, ELG, DSA, ?, ? +Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, + CAMELLIA128, CAMELLIA192, CAMELLIA256 +Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 +Compression: Uncompressed, ZIP, ZLIB, BZIP2 + + $ gpg-agent --version +gpg-agent (GnuPG/MacGPG2) 2.0.22 +libgcrypt 1.5.3 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. diff --git a/doc/forum/GPG_passphrase_handling/comment_1_11ba130e8bea6698858d0a1a5b01830f._comment b/doc/forum/GPG_passphrase_handling/comment_1_11ba130e8bea6698858d0a1a5b01830f._comment new file mode 100644 index 000000000..f2709f18c --- /dev/null +++ b/doc/forum/GPG_passphrase_handling/comment_1_11ba130e8bea6698858d0a1a5b01830f._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 1" + date="2013-10-31T00:06:22Z" + content=""" +In fact I just tried this with a key without a passphrase and I STILL get: + +[2013-10-31 01:00:50 CET] Pusher: Syncing with rsync.net +gpg: no valid addressees +gpg: [stdin]: encryption failed: no such user id + +In addition I also noticed a lot of: +git-annex: fd:28: hPutBuf: resource vanished (Broken pipe) +"""]] diff --git a/doc/forum/GPG_passphrase_handling/comment_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment b/doc/forum/GPG_passphrase_handling/comment_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment new file mode 100644 index 000000000..d15248ab7 --- /dev/null +++ b/doc/forum/GPG_passphrase_handling/comment_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 2" + date="2013-10-31T02:42:47Z" + content=""" +I think I have found two ways I can make this happen. + +1) If a filename contains UTF-8 it seems to happen (At least with this specific filename I have right here) + +2) Finder.app does not seem to play nice with git-annex (I got the same error when I tried using Finder to copy files to my git-annex thing) + + + +"""]] diff --git a/doc/forum/GPG_passphrase_handling/comment_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment b/doc/forum/GPG_passphrase_handling/comment_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment new file mode 100644 index 000000000..298e2f13d --- /dev/null +++ b/doc/forum/GPG_passphrase_handling/comment_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T20:39:36Z" + content=""" +There seem to be a lot of different ways to install gpg on OSX, with different results in what works and not. I don't know what's going on with that. Advice from those who understand Mac OS would be appreciated. + +As far as the \"gpg: no valid addressees\" bug goes, I can reproduce it on Linux, and have fixed it. Only affected using gcrypt with encryption=pubkey. + +(Please file bug reports in [[bugs]] in the future, not in the forum!) +"""]] diff --git a/doc/forum/GPG_passphrase_handling/comment_4_8724297f6d7ac140ab395a940bab0d7d._comment b/doc/forum/GPG_passphrase_handling/comment_4_8724297f6d7ac140ab395a940bab0d7d._comment new file mode 100644 index 000000000..983c35c3a --- /dev/null +++ b/doc/forum/GPG_passphrase_handling/comment_4_8724297f6d7ac140ab395a940bab0d7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2013-11-03T13:10:11Z" + content=""" +I would have filed it in the bug section if I knew it was a bug. I just thought I had done something wrong :) +"""]] diff --git a/doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn b/doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn new file mode 100644 index 000000000..bdb8ece69 --- /dev/null +++ b/doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn @@ -0,0 +1 @@ +Is it possible to generate a view of files currently available on the annex? My use case is that I have pretty large repo (couple of TBs) and I have partial checkouts on multiple machines instead of seeing 100s of broken symlinks I would like to just filter filter files that are present on the machine? diff --git a/doc/forum/Getting_started_with_Amazon_S3.mdwn b/doc/forum/Getting_started_with_Amazon_S3.mdwn new file mode 100644 index 000000000..1ee86b57f --- /dev/null +++ b/doc/forum/Getting_started_with_Amazon_S3.mdwn @@ -0,0 +1,28 @@ +I'm just getting started with git-annex and trying to wrap my head around using it with Amazon S3. I am familiar with using git, but things are a bit different as we can't init a repo at S3 directly. + +I've followed http://git-annex.branchable.com/tips/using_Amazon_S3/, and performed: + +`git init`
+Initialized empty Git repository in /home/
+`git annex init`
+init ok
+`git annex initremote s3 type=S3 encryption=FOOBAR bucket=foo`
+initremote s3 (encryption setup with gpg key YGTVT51715TFR) (checking bucket...) (gpg) ok
+`git annex describe s3 "Amazon S3"`
+describe s3 ok
+`git annexx add foo/`
+add foo/bar.txt
+add foo/bar.png
+...etc
+`git annex sync`
+51 files changed, 51 insertions(+)
+create mode 120000 foo/bar.txt
+create mode 120000 foo/bar.png
+...etc
+ + +Looking at http://git-annex.branchable.com/git-annex/, I thought the files added would then be pushed to S3 by git annex sync, but that doesn't seem to be the case. I've also tried variations of got annex copy, like `git annex copy . --to s3`, without any luck. + +Is there a way to push to s3? + +Any help is appreciated! diff --git a/doc/forum/Getting_started_with_Amazon_S3/comment_1_f50883133d5d4903cc95c0dcaa52d052._comment b/doc/forum/Getting_started_with_Amazon_S3/comment_1_f50883133d5d4903cc95c0dcaa52d052._comment new file mode 100644 index 000000000..b2211fa6c --- /dev/null +++ b/doc/forum/Getting_started_with_Amazon_S3/comment_1_f50883133d5d4903cc95c0dcaa52d052._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 1" + date="2012-05-29T19:09:50Z" + content=""" +`git annex sync` only syncs git metadata, not file contents, and metadata is not stored on S3, so it does notthing (much). + +`git annex move . --to s3` or `git annex copy . --to s3` is the right way to send the files to S3. I'm not sure why you say it's not working. I'd try it but Amazon is not letting me sign up for S3 again right now. Can you show what goes wrong with copy? +"""]] diff --git a/doc/forum/Getting_started_with_Amazon_S3/comment_2_e90aa3259d9a12cd67daa27d42d69ab5._comment b/doc/forum/Getting_started_with_Amazon_S3/comment_2_e90aa3259d9a12cd67daa27d42d69ab5._comment new file mode 100644 index 000000000..742e8d446 --- /dev/null +++ b/doc/forum/Getting_started_with_Amazon_S3/comment_2_e90aa3259d9a12cd67daa27d42d69ab5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY" + nickname="Matt" + subject="comment 2" + date="2012-05-30T00:40:45Z" + content=""" +It's strange. I've done some testing on another machine, and this one, and the issue seems to be with adding only certain sub-directories of the git-annex directory. Would it cause an issue with git-annex if a sub-directory was a git repo? +"""]] diff --git a/doc/forum/Getting_started_with_Amazon_S3/comment_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment b/doc/forum/Getting_started_with_Amazon_S3/comment_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment new file mode 100644 index 000000000..450a1513c --- /dev/null +++ b/doc/forum/Getting_started_with_Amazon_S3/comment_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 3" + date="2012-05-30T00:54:38Z" + content=""" +If the subdirectory has a .git, then it's a separate git repo, and inside the directory, all git (and git-annex) commands in it will operate on that nested repo and ignore the outside one. +"""]] diff --git a/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file.mdwn b/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file.mdwn new file mode 100644 index 000000000..9a2c80799 --- /dev/null +++ b/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file.mdwn @@ -0,0 +1,75 @@ +Hello, + +I am trying to wrap my head around annex still. I'm creating a source local git repo, editing an annex file, and then syncing in a second repo. In that second repo I'm trying to figure out how I can get a status notifying me that a file is out of date. + +If I use 'annex sync --content' the files are all up to date, as expected, but what I kind of expected is 'annex status' to say something like 'files out of date, blah blah'. I am spelling out my example below. + +Annex version is 5.20140613 + + +## I create a source and target repo, and I add a git managed file and an annex managed file + + $ mkdir source target + $ cd source + $ git init + $ git annex init + $ cat > gitfile + hi this is my git file + $ cat > annexfile + hi this is my annex file + $ git add gitfile + $ git annex add annexfile + $ git commit -m 'init commit' + $ cd ../target + $ git clone ../source/ . + $ ls -al + total 16 + drwxr-xr-x 170 Jul 15 15:55 . + drwxr-xr-x 136 Jul 15 15:54 .. + drwxr-xr-x 442 Jul 15 15:55 .git + lrwxr-xr-x 180 Jul 15 15:55 annexfile -> .git/annex/objects/Qp/F0/SHA256E-s25--045cf30cb201c6723cb6fad9ca539f639de7f242b87775b876ef9ccb1f577ccf/SHA256E-s25--045cf30cb201c6723cb6fad9ca539f639de7f242b87775b876ef9ccb1f577ccf + -rw-r--r-- 23 Jul 15 15:55 gitfile + $ git annex sync + ... + To [base path]/target/../source/ + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master + ok + $ cat gitfile + hi this is my git file + $ cat annexfile + cat: annexfile: No such file or directory + $ git annex sync --content + $ cat annexfile + hi this is my annex file + +## So far so good. Now I'm going to edit my annexed file in source repo and see if I can find out that the file was edited in the target + + $ cd .. + $ cd source + $ git annex edit annexfile + $ cat > annexfile + wow I changed my annex file + $ git annex add annexfile + $ git commit -m 'changed an annex file' + $ cd .. + $ cd target + $ git pull + $ cat annexfile + cat: annexfile: No such file or directory + $ git annex sync + $ ls + annexfile gitfile + $ cat annexfile + cat: annexfile: No such file or directory + $ git annex status + [no output] + +## Here is where I'd expect something saying 'annexfile is out of date', etc. +## I can infer it because the link is missing, but I'm sure there's a more logical way. + + $ git annex sync --content + $ cat annexfile + wow I changed my annex file + +## After I synced content all is well. diff --git a/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file/comment_1_e323c21d27bb0946993ba1438429c457._comment b/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file/comment_1_e323c21d27bb0946993ba1438429c457._comment new file mode 100644 index 000000000..78b0a9c1e --- /dev/null +++ b/doc/forum/Getting_the_status_of_a_remotely_changed_annex_file/comment_1_e323c21d27bb0946993ba1438429c457._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-16T18:18:00Z" + content=""" +As soon as git-annex syncs with a remote that has made changes to the repository, any new files or files that have been modified, and the content is not yet available in the local repository will be broken symlinks. You can generally easily see a broken symlink by running `ls`, at least with a good `ls` on eg Linux that supports colorization. (Look for the red filenames.) Many file managers also represent broken symlinks in a visual way. + +Or, you can run a command like `git annex whereis $file` and see if it includes \"here\" in the list of locations. + +Or, you can run `git annex find --not --in here` to find all files whose current content is not present. + +The reason `git annex status` doesn't say is that it's focused on showing you which files in the local repository have not yet been committed to git. The `git annex list` command has a similar one line per file output, but puts a \"_\" in the first column (under \"here\") if the file is not locally present. +"""]] diff --git a/doc/forum/Git-Annex_with_Asustor_NAS.mdwn b/doc/forum/Git-Annex_with_Asustor_NAS.mdwn new file mode 100644 index 000000000..8d29ce023 --- /dev/null +++ b/doc/forum/Git-Annex_with_Asustor_NAS.mdwn @@ -0,0 +1,4 @@ +I'd like to use git-annex with my Asustor 302t NAS. It should be treated like a "simple" removable drive. I don't really know how to do this however, when scanning for "removable drives", it can't be found, when I try connecting via SSH, I receive an Error: Permission denied (publickey,password). As there is no way to insert my password before connecting. + +How do I setup a repository on my NAS to be synced with my laptop? +I am using MAC OS X and the git-annex web interface currently. diff --git a/doc/forum/Git-Annex_with_Asustor_NAS/comment_1_44445200e5b716caeec225972a5d5dce._comment b/doc/forum/Git-Annex_with_Asustor_NAS/comment_1_44445200e5b716caeec225972a5d5dce._comment new file mode 100644 index 000000000..ae5ea41e2 --- /dev/null +++ b/doc/forum/Git-Annex_with_Asustor_NAS/comment_1_44445200e5b716caeec225972a5d5dce._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T16:32:05Z" + content=""" +If your NAS is accessed over SSH, it is not a removably drive, clearly. + +Try starting git-annex webapp from a console, you will probably see the ssh password prompt there. Or, install ssh-askpass, or, install a current daily build of git-annex, which will prompt for the ssh password from within the webapp. +"""]] diff --git a/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__.mdwn b/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__.mdwn new file mode 100644 index 000000000..36cfd4d76 --- /dev/null +++ b/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__.mdwn @@ -0,0 +1,6 @@ +Hi, + +I accidentally removed the .git/ folder inside a git annex assistant-monitored folder. When I open the assistant web app it still shows the repository but when I try to select it the page request never returns. What can I do at this point? I was thinking I can remove the repository from the git annex assitant configuration file if it is a plain-text file, but I don't know of its location. Please advise. + +Regards, +Blake diff --git a/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__/comment_1_5baffd4d6994bbcb23614b17777a0ffe._comment b/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__/comment_1_5baffd4d6994bbcb23614b17777a0ffe._comment new file mode 100644 index 000000000..f48337a42 --- /dev/null +++ b/doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__/comment_1_5baffd4d6994bbcb23614b17777a0ffe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-17T16:07:00Z" + content=""" +The file you need is .config/git-annex/autostart in your home directory. + +Once deleted, re-running the assistant should let you re-create the git repository and it'll re-add your files. +"""]] diff --git a/doc/forum/GitBlit_as_a_centralized_repository.mdwn b/doc/forum/GitBlit_as_a_centralized_repository.mdwn new file mode 100644 index 000000000..884392d58 --- /dev/null +++ b/doc/forum/GitBlit_as_a_centralized_repository.mdwn @@ -0,0 +1,2 @@ +Is it possible to use Gitblit as a centralized repository using git-annex? +thanks Gary diff --git a/doc/forum/GitBlit_as_a_centralized_repository/comment_1_06bedf5fbac45415e0cc81f41b25a5a0._comment b/doc/forum/GitBlit_as_a_centralized_repository/comment_1_06bedf5fbac45415e0cc81f41b25a5a0._comment new file mode 100644 index 000000000..91dac6305 --- /dev/null +++ b/doc/forum/GitBlit_as_a_centralized_repository/comment_1_06bedf5fbac45415e0cc81f41b25a5a0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T17:40:20Z" + content=""" +I assume gitblit is something like gitosis or gitolite. These let a user ssh in to a server to access a git repository, but they limit the commands they can run to `git-shell`. In order to use git-annex get/copy to such a repository, it needs to be able to run `git-annex-shell`, which is like git-shell but with more commands available. If gitblit can be made allow git-annex-shell to be run, it will work. +"""]] diff --git a/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn b/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn new file mode 100644 index 000000000..0a3aac911 --- /dev/null +++ b/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn @@ -0,0 +1,11 @@ +Hi, + +I am trying to use Git Annex Assistant on my Fedora Linux computer. I currently have a local repository that assistant monitors, but now I want to use my personal server as a git remote for the repository. I click on Configuration > Remote server and it prompts me for my server login credentials and then click the "Check this server" button. After this I am shown a screen that assistant is "Ready to add remote server" and then states: +> The server can be used as is, but installing git-annex on it would make it work better, and provide more options below. +> +> If you're able to install software on the server, do so and click Retry + +The information shown below this message is regarding encrypting the data (if I have git-annex installed on the server, which I don't). So my question is, what do I do now? There is no button to just add the remote from within git annex assistant? I created a bare repository on my server and added a remote manually inside the repository on my local machine, but git annex assistant doesn't notice it. I'm clueless on what git annex assistant is expecting from me at this point. I would think what I'm trying to do is one of the most common use cases for git annex, but I can't find any documentation or materials on the correct procedure for this. Any help is appreciated. + +Regards, +Blake diff --git a/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__/comment_1_d0a3d0090928790d5a05e9f8e5f05320._comment b/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__/comment_1_d0a3d0090928790d5a05e9f8e5f05320._comment new file mode 100644 index 000000000..5c3a596a5 --- /dev/null +++ b/doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__/comment_1_d0a3d0090928790d5a05e9f8e5f05320._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-21T22:20:53Z" + content=""" +You have two choices: + +1. Install git-annex on your server. You can then use the webapp to set up a git repository, or use the git repository you've already set up. + +2. Don't install git-annex on your server. Select the option in the webapp to use an encrypred rsync repository on your server. (The screen you described the webapp showing had a button to use this option, but you seem to have misread it.) +"""]] diff --git a/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive.mdwn b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive.mdwn new file mode 100644 index 000000000..20e435fcf --- /dev/null +++ b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive.mdwn @@ -0,0 +1,3 @@ +I'm using Git Annex Assistant for the first time, trying to get it to mirror a directory of files from my computer to an external USB drive. I've tried setting up the second repo as a "Removable Drive" in the "full backup" repository group. I've also tried putting it in the "client" group. The result is the same, and Assistant doesn't backup any of my files to the external drive. + +What I get in the external drive in the directory that should contain the repo are the set of files "annex, objects, refs, config, HEAD" and they are NOT in a .git subdirectory. Aside from this I don't see any of the files Git Annex Assistant says it has synced. As this is my first time using the Assistant, I don't know if this is a bug, or if I'm just using it incorrectly. If anyone knows what is going on here, please share. diff --git a/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_1_a1d1ae9488924b08682b355aff51130d._comment b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_1_a1d1ae9488924b08682b355aff51130d._comment new file mode 100644 index 000000000..31ed0999e --- /dev/null +++ b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_1_a1d1ae9488924b08682b355aff51130d._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="This is the expected default behavior" + date="2014-05-17T20:49:06Z" + content=""" +Your files should be on the removable drive but the file structure and file names are following git annex logic and is not meant to be human readable. + +The default assumption (which I question) is that you will use the removable drive to transfer files between git-annex repositories. So by default you cannot read the files on devices that do not have git-annex installed. + +You can configure git-annex to do what you want using the `post-receive` hook. It's a bit complicated and might leave git-annex hogging your drive when you wan't to eject it but see the following: + + - [[forum/USB_backup_with_files_visible/]] + - [[forum/Can't_get_git-annex_merge_to_work_from_git_hook/#comment-d93181e69b8bea54bc03cb335dd1d7c8]] + +The last post on that second link tells you exactly what to put in the `post-receive` hook in the .git/hooks folder on your removable drive. +"""]] diff --git a/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_2_6649077583bc14730a08aaaca7ccb62e._comment b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_2_6649077583bc14730a08aaaca7ccb62e._comment new file mode 100644 index 000000000..059d446e7 --- /dev/null +++ b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_2_6649077583bc14730a08aaaca7ccb62e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnov5q9_Cl4Ps5NoYE08yE01NLSvBANnY8" + nickname="Eric" + subject="comment 2" + date="2014-05-18T09:35:45Z" + content=""" +Okay, I understand now. Probably Assistant should only treat the external drive that way if it's in the \"transfer\" group. +"""]] diff --git a/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_3_f359d9b9356de7ee10b9e725a011cc43._comment b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_3_f359d9b9356de7ee10b9e725a011cc43._comment new file mode 100644 index 000000000..caec25ffd --- /dev/null +++ b/doc/forum/Git_Annex_Assistant_won__39__t_backup_files_to_removable_drive/comment_3_f359d9b9356de7ee10b9e725a011cc43._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnov5q9_Cl4Ps5NoYE08yE01NLSvBANnY8" + nickname="Eric" + subject="comment 3" + date="2014-07-10T05:50:32Z" + content=""" +Actually, I understand the logic behind encouraging bare repositories. +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files.mdwn b/doc/forum/Git_Annex_Sync_Delinks_Files.mdwn new file mode 100644 index 000000000..1ce18dd0b --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files.mdwn @@ -0,0 +1,11 @@ +So, I'm using git-annex to manage a group of external hard drives that I use to store a bunch of big files. + +When syncing tonight, though, it decided to take a whole subdirectory and replace the symlinks with the content directly when merging, or something. + +The remote side is not like that, and I didn't tell it to do anything like that. +It just seems to feel like that's the thing to do, then it syncs and fails because suddenly git has many gigs of objects, which is what git-annex is supposed to solve. + +I've reset master a bunch of times, and it keeps choosing that path, but I don't know why. +I've also reset master and synced/master a few times. I'm not fully sure what that one actually encodes, so I didn't want to touch it too much, but setting it to the same thing as master didn't seem to fix things either. + +Any idea why? diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_1_8b03707777a9d8e38715cb77d2a0addc._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_1_8b03707777a9d8e38715cb77d2a0addc._comment new file mode 100644 index 000000000..ad0605f49 --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_1_8b03707777a9d8e38715cb77d2a0addc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-31T18:06:15Z" + content=""" +Are you using direct mode? + +Before the direct mode guard was put in place, it was not uncommon for users to mistakenly run some command like \"git commit -a\" in a direct mode repository. This happily checks the full large files into git. + +It sounds to me like you've done that. But, you have not provided enough information to make anything more than a vague guess. +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_2_a625e7d88e321532ace103548b31b67b._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_2_a625e7d88e321532ace103548b31b67b._comment new file mode 100644 index 000000000..9dd931053 --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_2_a625e7d88e321532ace103548b31b67b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_W9oOMDiBaU_xLIbeaTF8wW2wJzJ7bfw" + nickname="Christopher" + subject="comment 2" + date="2013-12-31T18:56:58Z" + content=""" +I am not in direct mode. +I don't believe I did anything in the repo. I reset back to a commit and look in the folder and it's all symlinks and nothing in git status says anything about it. + +Then I run `git annex sync` and one of the thing it does is \"Checking out files\" which takes a long time, since it seems to be copying the data into the working directory and commiting it. +I don't know why it's decided to do that. + +What steps can I take to either get you more information or fix things? + +Perhaps relatedly, if I make a mistake with git-annex, is git-reset master and git-reset synced/master the right approach? +Are there other things I should try, etc? + +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_3_5278164dab570755ed58afe466dfad42._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_3_5278164dab570755ed58afe466dfad42._comment new file mode 100644 index 000000000..f3a1ca577 --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_3_5278164dab570755ed58afe466dfad42._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2013-12-31T19:19:15Z" + content=""" +\"Checking out files\" is a message printed by git (not by git-annex) when it is updating the work tree. + +It still seems that you have somehow committed large files directly to git. Perhaps you accidentially ran \"git add\" on a large file. + +git annex sync is probably merging this commit from one of your other repositories. +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_4_e43ede0bdc20de9aa10ab6ce387d8582._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_4_e43ede0bdc20de9aa10ab6ce387d8582._comment new file mode 100644 index 000000000..9b16ea2b0 --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_4_e43ede0bdc20de9aa10ab6ce387d8582._comment @@ -0,0 +1,92 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_W9oOMDiBaU_xLIbeaTF8wW2wJzJ7bfw" + nickname="Christopher" + subject="comment 4" + date="2014-01-01T15:23:17Z" + content=""" +I know that checking of files is a git message, I was just providing it for context. + +I know that my other repos do not have these things checked in, because one of them is offline and not involved in this, and the other repo literally can't contain that much data, which is the biggest reason this is an issue. + +Here are the commits I don't like: + + commit 1ae2410a4bc3e35edbfd9d48a577bcfc7e3a8836 + Author: Christopher Vollick <0@psycoti.ca> + Date: Mon Dec 30 23:22:47 2013 -0500 + + git-annex automatic sync + + :120000 100644 185b311... fd03ae5... T subdir1/other_file0309 + :120000 100644 515e6df... 44f8383... T subdir1/other_file0309 + + commit 7403e3116eb34e2b192dfa3ea4c16e35f82210ba + Author: Christopher Vollick <0@psycoti.ca> + Date: Sat Dec 21 19:12:56 2013 -0500 + + git-annex automatic sync + + :120000 100644 185b311... fd03ae5... T subdir1/other_file0309 + :120000 100644 515e6df... 357d9a7... T subdir1/other_file0309 + :120000 100644 079f69f... 97c785a... T subdir1/file01 + :120000 100644 c69574a... 1589721... T subdir1/file02 + :120000 100644 01d98a4... 154a059... T subdir1/file03 + :120000 100644 6ee02d5... 6857f73... T subdir1/file04 + :120000 100644 aab78e7... 19bae04... T subdir1/file05 + :120000 100644 9f8d11b... bd5b501... T subdir1/file06 + :120000 100644 ca824c1... a9e0b9e... T subdir1/file07 + :120000 100644 c85f526... a6383fc... T subdir1/file08 + :120000 100644 a6d957d... 9b99c99... T subdir1/file09 + :120000 100644 d3de258... d51da9a... T subdir1/file10 + :120000 100644 3cc803e... 8f7945f... T subdir1/other_file0005 + :120000 100644 cd94cca... 1c06cf8... T subdir1/other_file0006 + :120000 100644 1442c98... fee3c1d... T subdir1/other_file0201 + :120000 100644 4131025... f732332... T subdir1/other_file0202 + :120000 100644 865214f... 1178931... T subdir1/other_file0203 + :120000 100644 a0f84e2... 6c39a4a... T subdir1/other_file0204 + :120000 100644 21bf0c1... bbb3c93... T subdir1/other_file0205 + :120000 100644 5f6a5f3... d298a97... T subdir1/other_file0206 + :120000 100644 3d7f034... 4cac0d1... T subdir1/other_file0207 + :120000 100644 ee75d44... d769e8e... T subdir1/other_file0208 + :120000 100644 f381401... 5f1a7f3... T subdir1/other_file0209 + :120000 100644 8b6a409... 1db8c37... T subdir1/other_file0210 + :120000 100644 c6a23f1... 5a9bbf5... T subdir1/other_file0211 + :120000 100644 17a34c7... 068c619... T subdir1/other_file0212 + :120000 100644 3c7fe0a... 356315b... T subdir1/other_file0213 + :120000 100644 4b61d45... e9747e5... T subdir1/other_file0214 + :120000 100644 1c0d845... f7a11d3... T subdir1/other_file0301 + :120000 100644 cdd57b2... fb5512f... T subdir1/other_file0302 + :120000 100644 9bb8ffc... 9b3897d... T subdir1/other_file0303 + :120000 100644 007cfa6... 93e36d7... T subdir1/other_file0304 + :120000 100644 24cf5d3... 9eecff4... T subdir1/other_file0305 + :120000 100644 d9be965... 6c612f4... T subdir1/other_file0306 + :120000 100644 20cd474... 9d1c714... T subdir1/other_file0307 + :120000 100644 3f24532... 9ff7770... T subdir1/other_file0308 + :120000 100644 3939cbe... de9fefd... T subdir1/other_file0308 + :120000 100644 9de87f9... 2242892... T subdir1/other_file0309 + :120000 100644 7250b17... a544af6... T subdir1/other_file0310 + :120000 100644 9de87f9... 2242892... T subdir1/other_file0312 + :120000 100644 14fbe43... f643564... T subdir1/other_file0401 + :120000 100644 0f28f22... e4b5e2c... T subdir1/other_file0402 + :120000 100644 6704647... 4529fb0... T subdir1/other_file0403 + :120000 100644 65b3742... dacc2ce... T subdir1/other_file0404 + :120000 100644 14ad1d6... a4f7dab... T subdir1/other_file0405 + :120000 100644 87bda81... a3b2a0a... T subdir1/other_file0406 + :120000 100644 23fd37b... 7ea3182... T subdir1/other_file0407 + :120000 100644 a82d025... aa0e1f6... T subdir1/other_file0408 + :120000 100644 cd350d3... c225b3d... T subdir1/other_file0409 + :120000 100644 2ce6c3b... 1efffa6... T subdir1/other_file0410 + :120000 100644 3f780d5... 207f8af... T subdir1/other_file0411 + :120000 100644 27ecf10... 4a34b2d... T subdir1/other_file0412 + :120000 100644 5cf1ba0... ab0b15d... T subdir1/other_file0413 + :120000 100644 a1cccd7... 274dbd1... T subdir1/other_file0004 + +Now, the most interesting part here is that commit 7403e3116eb is dated Sat Dec 21. +That is not when I was attempting this. The 30th, shown in 1ae24 is. + +That makes me think that I have failed to reset properly, and so when I'm telling it to sync it's not recomputing the thing, it's just grabbing the thing it did last time. + +Now, I still don't know why it chose to do that, but perhaps it wouldn't choose to do that again if I could figure out how to get it to forget that path. + +Thoughts? + +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_5_dc71987f0e19f04a920561201f9552b4._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_5_dc71987f0e19f04a920561201f9552b4._comment new file mode 100644 index 000000000..03e4d2a9b --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_5_dc71987f0e19f04a920561201f9552b4._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_W9oOMDiBaU_xLIbeaTF8wW2wJzJ7bfw" + nickname="Christopher" + subject="comment 5" + date="2014-01-01T16:37:38Z" + content=""" +Ok, so, looking into it a little more I think I've found that I screwed up updating a ref, so I didn't reset synced/master like I thought I did. + +So, I don't know why it chose to make this choice in the first place, but I was able to reset and manually change my way around it. + +That being said, I don't want to do this a lot, because I'm not fully clear on what the synced branches represent. +Is it that, on repo1, repo2/synced/master is the last thing that pushed over, and that after a sync local synced/master is always master, and before that it's the last sync to anywhere? + +How safe is it to screw around with these things? +"""]] diff --git a/doc/forum/Git_Annex_Sync_Delinks_Files/comment_6_257a89f81858659c4dac4d116e7cf0a3._comment b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_6_257a89f81858659c4dac4d116e7cf0a3._comment new file mode 100644 index 000000000..f293a6030 --- /dev/null +++ b/doc/forum/Git_Annex_Sync_Delinks_Files/comment_6_257a89f81858659c4dac4d116e7cf0a3._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 6" + date="2014-01-01T20:59:32Z" + content=""" +The ` T ` in your `git show --raw` indicates that what was a symlink has been replaced with a regular file, and this has been committed to git. + +It's certainly possible to do that when using git-annex, but you have to go a bit out of your way to so shoot yourself in the foot, because normally the pre-commit hook will detect that, and fix up your commit to not change the type of the file. Something like this: + +[[!format sh \"\"\" +joey@darkstar:~/tmp/r>git annex unlock foo +unlock foo (copying...) ok +joey@darkstar:~/tmp/r>git commit -a --no-verify -m oops +[master 9b63e4e] oops + 1 file changed, 1 deletion(-) + rewrite foo (100%) + mode change 120000 => 100644 +joey@darkstar:~/tmp/r>git show --raw +commit 9b63e4efad1f229ae7713749e9ac2d0f9c286008 +Author: Joey Hess +Date: Wed Jan 1 16:55:19 2014 -0400 + + oops + +:120000 100644 ea46194... e69de29... T foo +\"\"\"]] + +The fact that you seem to have made 2 commits that did this, on the 21st and 30th, makes me wonder if your .git/hooks/pre-commit does not exist, or perhaps you are making some other mistake repeatedly. + +The synced/* branches never have any data that is not stored somewhere else (another branch, possibly in the remote repository), so it should always be ok to delete them. +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols.mdwn b/doc/forum/Git_Annex_Transfer_Protocols.mdwn new file mode 100644 index 000000000..d6a660a2d --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols.mdwn @@ -0,0 +1,9 @@ +Hi, + +May I know, which processes git-annex is using to move/copy/get file content between repositories? +Is it using same processes which git uses, Like send-pack, receive-pack. +I want to use Aspera to move file contents between repositories. +Is it enough if I customize send-pack, receive-pack of git code to do Aspera file transfer or git-annex uses any other transfer mechanism. + +Many Thanks, +Royal Pinto diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_1_a870ec991078c95a6bb683d6962ab56e._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_1_a870ec991078c95a6bb683d6962ab56e._comment new file mode 100644 index 000000000..31c463470 --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_1_a870ec991078c95a6bb683d6962ab56e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.186" + subject="rsync over ssh" + date="2012-05-10T18:18:01Z" + content=""" +Some other protocols such as S3 for special remotes. +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_2_71419376ef50a679ea8f0f9e16991c17._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_2_71419376ef50a679ea8f0f9e16991c17._comment new file mode 100644 index 000000000..2e07aef08 --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_2_71419376ef50a679ea8f0f9e16991c17._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="Protocols to transfer file content" + date="2012-05-10T18:48:40Z" + content=""" +Thanks, Is git annex is using same protocols as normal git to transfer content between normal git repositories? +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_3_fea43664a500111ca99f4043e0dadb14._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_3_fea43664a500111ca99f4043e0dadb14._comment new file mode 100644 index 000000000..6e7b36e31 --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_3_fea43664a500111ca99f4043e0dadb14._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.186" + subject="comment 3" + date="2012-05-10T18:51:56Z" + content=""" +git-annex doesn't transfer git content between git repositories. You use git for that. Well, git-annex sync can run a few git commands for you to do it. +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_4_56fb2dab1d4030c9820be32b495afdf0._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_4_56fb2dab1d4030c9820be32b495afdf0._comment new file mode 100644 index 000000000..fef10cd81 --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_4_56fb2dab1d4030c9820be32b495afdf0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="Git annex content transfer protocols" + date="2012-05-10T19:13:48Z" + content=""" +Sorry if I am not clear. Actually i meant to ask, if i have 2 git repositories which are not special remotes and I am transferring annexed file content between these repositories using git annex command (move or copy) then, which protocol it uses to transfer content? Is it uses git-send-pack git-recieve-pack or some other protocols. +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment new file mode 100644 index 000000000..be25737c1 --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.186" + subject="comment 5" + date="2012-05-10T19:17:22Z" + content=""" +rsync over ssh is used to transfer file contents between repositories. (You can use the -d option to see the commands git-annex runs.) +"""]] diff --git a/doc/forum/Git_Annex_Transfer_Protocols/comment_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment b/doc/forum/Git_Annex_Transfer_Protocols/comment_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment new file mode 100644 index 000000000..b7ef8f33c --- /dev/null +++ b/doc/forum/Git_Annex_Transfer_Protocols/comment_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="comment 6" + date="2012-05-10T19:21:08Z" + content=""" +Ok. This helped me a lot. Thank you +"""]] diff --git a/doc/forum/Git_annex___39__corrupting__39___itself.mdwn b/doc/forum/Git_annex___39__corrupting__39___itself.mdwn new file mode 100644 index 000000000..fe1edc17d --- /dev/null +++ b/doc/forum/Git_annex___39__corrupting__39___itself.mdwn @@ -0,0 +1,34 @@ +Hi, + +Since the I updated to `2013-10-24` `git annex` has corrupted itself twice on my setup. I'm not claiming causality here and thus I haven't filled it as a bug (probably the mistake is mine). + +I use three laptops and one remote ssh server. The motherboard on laptop *T* seems to have broken and I haven't fixed it yet. I have disabled sync to *T* on the webapp dashboard. + +First, one computer, called *W*, broke on Friday. I got the dreaded [serious problem](http://git-annex.branchable.com/devblog/day_41__onward/) screen. `git fsck` reported lots of missing blobs and tree problem, though my data seemed OK. I git cloned the repo from computer *X*. Now, last night both X and W reported the same problem (log below). *W* recovered itself somehow, but *X* is now in a cycle of re-adding all files in the repo and the posting the below error that has to do with computer *T* (IP ending with 107). + +I would appreciate hints on why this suddenly started happen. Computer T has been out of sync for almost 14 days (since the 24th of October I think). + + error: refs/remotes/192.168.1.107_annex/git-annex does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/master does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/synced/git-annex does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/synced/master does not point to a valid object! + error: refs/synced/2ed58ecf-8e8c-44b8-ad34-d42ddfb35315/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/git-annex does not point to a valid object! + error: refs/synced/2ed58ecf-8e8c-44b8-ad34-d42ddfb35315/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/master does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/git-annex does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/master does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/git-annex does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/master does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/git-annex does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/master does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/synced/git-annex does not point to a valid object! + error: refs/remotes/192.168.1.107_annex/synced/master does not point to a valid object! + error: refs/synced/2ed58ecf-8e8c-44b8-ad34-d42ddfb35315/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/git-annex does not point to a valid object! + error: refs/synced/2ed58ecf-8e8c-44b8-ad34-d42ddfb35315/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/master does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/git-annex does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/cmFzbXVzQGNvZGVyb2xsZXJzLmNvbQ==/master does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/git-annex does not point to a valid object! + error: refs/synced/f54b8200-8ec1-43d2-8710-b73ec118addc/master does not point to a valid object! + error: invalid object 100644 1ca66de3cdd9c79cde26a7555cf3b8d26d0e371d for '000/147/SHA256E-s347--1ab8084bf9ae06407ce0a7260a83638ea6e9a028dc59b4815fd60aec61dbd747.txt.log.log' + fatal: git-write-tree: error building trees + TransferScanner crashed: failed to read sha from git write-tree + [2013-11-04 09:45:41 CET] TransferScanner: warning TransferScanner crashed: failed to read sha from git write-tree diff --git a/doc/forum/Git_annex___39__corrupting__39___itself/comment_1_bcf50a215e2f8771e098aadfff4c300c._comment b/doc/forum/Git_annex___39__corrupting__39___itself/comment_1_bcf50a215e2f8771e098aadfff4c300c._comment new file mode 100644 index 000000000..2fe95ab33 --- /dev/null +++ b/doc/forum/Git_annex___39__corrupting__39___itself/comment_1_bcf50a215e2f8771e098aadfff4c300c._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEXAlu8qKv_FHYOv-uEohdGgMY_Lw-Ges" + nickname="Jonas" + subject="Just happened for me as well." + date="2013-11-12T08:10:56Z" + content=""" +This was the first search result when I googled the error message, I'm not sure what has happened (or if it is a problem since I don't change my files that often). + +git-annex version: 4.20131101 + +Also running git annex with one ssh remote ( laptop1 & laptop2 synching through a ssh remote server ). + +Got a bunch of + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/git-annex does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/master does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/git-annex does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/master does not point to a valid object! +when I tried a manual git annex sync, and noticed that I had a bunch of those in the log in the webapp as well... + +The gui doesn't show that anything is wrong, and looking at the log it seems that things are atleast uploading + + [2013-11-12 09:05:46 CET] Committer: Committing changes to git + [2013-11-12 09:05:46 CET] Pusher: Syncing with born + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/git-annex does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/master does not point to a valid object! + Everything up-to-date + + FILE + + 32768 42% 0.00kB/s 0:00:00 + 76972 100% 42.16MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 77056 bytes received 31 bytes 51391.33 bytes/sec + total size is 76972 speedup is 1.00 + [2013-11-12 09:05:48 CET] Transferrer: Uploaded FILE + [2013-11-12 09:05:48 CET] Pusher: Syncing with born + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/git-annex does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/master does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/git-annex does not point to a valid object! + error: refs/synced/dbb70cea-4b83-416f-93af-e59082c4d633/master does not point to a valid object! + To ssh://me@born/annex + 54e04cf..333cf10 git-annex -> synced/git-annex +"""]] diff --git a/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_75f957e7be6c1ad8936c0a2a5374db3e._comment b/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_75f957e7be6c1ad8936c0a2a5374db3e._comment new file mode 100644 index 000000000..80f778bb1 --- /dev/null +++ b/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_75f957e7be6c1ad8936c0a2a5374db3e._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEXAlu8qKv_FHYOv-uEohdGgMY_Lw-Ges" + nickname="Jonas" + subject="comment 3" + date="2013-11-13T09:03:24Z" + content=""" +I did a change of one of the files and that totally broke all other repositories, git fsck reports a lot of missing trees (I'm not sure if it is normal), and git annex fsck started reporting invalid object for another file for some reason, also got a (git annex repair still reports everything is fine though.) + + fatal: git-write-tree: error building trees + git-annex: failed to read sha from git write-tree + + + +I tried following those instructions but I don't think I had a good repository, git annex repair reported everything was ok but git fsck said a lot of trees where missing and it stopped updating. +I noticed I was running different git version (git version 1.7.9.5 on the server and git version 1.8.4.2 on one of the clients), so maybe that was part of the reason. + +I couldn't find out what remote dbb70cea-4b83-416f-93af-e59082c4d633 was supposed to be either, it wasn't any of the active ones and it didn't show up with git annex status either (I've lost a few repositories when I reinstalled my computer). + +I ended up recreating the repository (by copying the raw files) from what I think is the most recent version from one of my computers and hope that it was a error that happened due to upgrades. +"""]] diff --git a/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_ab062b1df3b55fd49852a6220c98249e._comment b/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_ab062b1df3b55fd49852a6220c98249e._comment new file mode 100644 index 000000000..76e9d00de --- /dev/null +++ b/doc/forum/Git_annex___39__corrupting__39___itself/comment_3_ab062b1df3b55fd49852a6220c98249e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 3" + date="2013-11-12T17:19:32Z" + content=""" +I have been getting this too. Here is what I have done to fix it: + +[[tips/recovering_from_a_corrupt_git_repository]] +"""]] diff --git a/doc/forum/Git_annex___39__corrupting__39___itself/comment_4_45974f60a81ed2d00b87ffb1a7963c6f._comment b/doc/forum/Git_annex___39__corrupting__39___itself/comment_4_45974f60a81ed2d00b87ffb1a7963c6f._comment new file mode 100644 index 000000000..4328f5d24 --- /dev/null +++ b/doc/forum/Git_annex___39__corrupting__39___itself/comment_4_45974f60a81ed2d00b87ffb1a7963c6f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-13T20:27:34Z" + content=""" +Many problems of this sort can happen if the disk that the git reposotory is on is losing data that's written to it, or is just removed (or the computer crashes) at the wrong time. `git-annex repair` can be run in the repository to recover from many problems like this, and it's getting better all the time. +"""]] diff --git a/doc/forum/Git_annex_assistant_in_command_line.mdwn b/doc/forum/Git_annex_assistant_in_command_line.mdwn new file mode 100644 index 000000000..9323d2137 --- /dev/null +++ b/doc/forum/Git_annex_assistant_in_command_line.mdwn @@ -0,0 +1,2 @@ +How can I clone a git annex remote (bare repository) created with the webapp in command line ? My goal is to be able to access the files using an ssh connection. + diff --git a/doc/forum/Git_annex_assistant_in_command_line/comment_1_ce05226307ade8db90ada2dbf290bd58._comment b/doc/forum/Git_annex_assistant_in_command_line/comment_1_ce05226307ade8db90ada2dbf290bd58._comment new file mode 100644 index 000000000..e02a4298c --- /dev/null +++ b/doc/forum/Git_annex_assistant_in_command_line/comment_1_ce05226307ade8db90ada2dbf290bd58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:16:27Z" + content=""" +There is no difference between a repository created using the assistant and one created by hand. So you can just `git clone ssh://server/path` or `git remote add foo ssh://server/path` and use it at the command line like any other repository. + +The assistant interoperates perfectly with the command line; you can switch between them at will at any time. +"""]] diff --git a/doc/forum/Git_annex_assistant_on_EC2.mdwn b/doc/forum/Git_annex_assistant_on_EC2.mdwn new file mode 100644 index 000000000..27f20ae46 --- /dev/null +++ b/doc/forum/Git_annex_assistant_on_EC2.mdwn @@ -0,0 +1,5 @@ +With Amazon EC2, it is possible to take a snapshot of the virtual machine and then bring up multiple instances based on the snapshot. + +If I configure git annex assistant to sync a folder to S3, will it work correctly if I spin up multiple instances, all identical git annex assistant configurations? + +My use case is to allow users of my forums to upload attachments with their posts. The attachments are stored locally on disk, but I'm hoping that git annex assistant can help synchroise the attachments across all forum instances (I usually run only 1 instance, but their could be as many as 3 under heavy load). diff --git a/doc/forum/Git_annex_assistant_on_EC2/comment_1_bbdb4611373117a2176c225378110a05._comment b/doc/forum/Git_annex_assistant_on_EC2/comment_1_bbdb4611373117a2176c225378110a05._comment new file mode 100644 index 000000000..cab80f976 --- /dev/null +++ b/doc/forum/Git_annex_assistant_on_EC2/comment_1_bbdb4611373117a2176c225378110a05._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-09-06T22:57:05Z" + content=""" +If you are using ec2 and s3 why don't you just serve the attachments directly from s3? Not sure how git-annex adds anything here. +"""]] diff --git a/doc/forum/Git_annex_assistant_on_EC2/comment_2_614ed11f7134137d6376d36a61c293f5._comment b/doc/forum/Git_annex_assistant_on_EC2/comment_2_614ed11f7134137d6376d36a61c293f5._comment new file mode 100644 index 000000000..dfb629d62 --- /dev/null +++ b/doc/forum/Git_annex_assistant_on_EC2/comment_2_614ed11f7134137d6376d36a61c293f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.251.174" + subject="comment 2" + date="2013-09-07T17:08:27Z" + content=""" +You are going to need to make each repository have a distinct UUID. Otherwise, the assistant will get confused. +"""]] diff --git a/doc/forum/Git_annex_on_Windows.mdwn b/doc/forum/Git_annex_on_Windows.mdwn new file mode 100644 index 000000000..b5ca80bee --- /dev/null +++ b/doc/forum/Git_annex_on_Windows.mdwn @@ -0,0 +1,11 @@ +Hi, +I want to download some files in git and git annex in Windows OS. +I have installed msysgit for git-scm in D:\Git directory, +Now I download git-annex assistant for Windows, and install it +in D:\Git\cmd directory. +But when I run the command "git annex" in git-bash, it says it can not +found the "git annex" command. +My question is that, how should I use git annex in Windows to download files? +For example, git annex get . +Doea anyone has any idear to help me figure it out? +Thanks in advance! diff --git a/doc/forum/Git_annex_on_Windows/comment_1_da24ba0219a164f9ab93fe75dd85127e._comment b/doc/forum/Git_annex_on_Windows/comment_1_da24ba0219a164f9ab93fe75dd85127e._comment new file mode 100644 index 000000000..be50ece07 --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_1_da24ba0219a164f9ab93fe75dd85127e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.251.174" + subject="comment 1" + date="2013-09-07T17:00:03Z" + content=""" +Are you able to run git commands? IIRC msysgit prompts when it's installed about whether you want to put it in the path or not. git-annex just piggybacks on this path setting. It is installed in the same folder as the git.exe and should work as long as that is in path. +Otherwise, consult windows documentation to add git-annex to the path, or you can copy the git-annex.exe to somewhere else I suppose. + +I built a clean Windows system yesterday and have just re-tested it and it does work. +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_2_c0880ce3ee13d388ab5b46a740170845._comment b/doc/forum/Git_annex_on_Windows/comment_2_c0880ce3ee13d388ab5b46a740170845._comment new file mode 100644 index 000000000..bdf30b3b7 --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_2_c0880ce3ee13d388ab5b46a740170845._comment @@ -0,0 +1,50 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQrsXK-icnYXg6kJNd-jDjMgOixnhwE34" + nickname="x" + subject="reply to Comment 1" + date="2013-09-10T13:46:45Z" + content=""" +Thanks for your helpful comment.I add the path to windows, and the +problem disappears now. +But I meet another problem when I download the data using git annex. +I use the command \"git annex get foo.nc\" to download data. The foo.nc +is actually symlink. For example: +foo.nc -> ../../.git/annex/objects/jK/v7/WORM-s16009120-m1337754158-- +foo.nc/WORM-s16009120-m1337754158--foo.nc +Could you help me to figure it out? +Thank you. + +The erro information when using git annex in Windows, is as below: + +$ git annex get tau.nc + + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + +*** Please tell me who you are. + + + +Run + + git config --global user.email \"you@example.com\" + + git config --user.name \"Your Name\" + +to set your account's default identity. + +Omit --global to set the identity only in this repository. + + + +fatal: unable to auto-detect email address (got 'xshao@DELL-PC.(none') + +git-annex :tau.nc not found + +(Recording state in git ...) +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_3_70c22716fde60d14fd0c7e74acf4a224._comment b/doc/forum/Git_annex_on_Windows/comment_3_70c22716fde60d14fd0c7e74acf4a224._comment new file mode 100644 index 000000000..772d9348a --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_3_70c22716fde60d14fd0c7e74acf4a224._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQrsXK-icnYXg6kJNd-jDjMgOixnhwE34" + nickname="x" + subject="Comment3" + date="2013-09-10T15:36:57Z" + content=""" +In addition, because the file is actually symlink direct to the data stored in Amazon S3 +How could I get the URL, given the symlink for git annex. For example: +foo.nc -> ../../.git/annex/objects/jK/v7/WORM-s16009120-m1337754158--foo.nc/WORM-s16009120-m1337754158--foo.nc +Thank you. +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_4_b9232deab6bc5036d7339aa202013218._comment b/doc/forum/Git_annex_on_Windows/comment_4_b9232deab6bc5036d7339aa202013218._comment new file mode 100644 index 000000000..6fd2f8c3d --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_4_b9232deab6bc5036d7339aa202013218._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 4" + date="2013-09-12T20:58:30Z" + content=""" +Once `git annex get` has downloaded the file, it will replace the symlink with the contents of the file. + +If that is not happening, you might try running `git annex fsck` + + +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_5_27af3c431b50b540d2bd1d3af3f21080._comment b/doc/forum/Git_annex_on_Windows/comment_5_27af3c431b50b540d2bd1d3af3f21080._comment new file mode 100644 index 000000000..5db96f08e --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_5_27af3c431b50b540d2bd1d3af3f21080._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 5" + date="2013-09-13T18:03:17Z" + content=""" +Turns out that there was a bug in the Windows port that could lead to the behavior described, and another bug that prevented `git annex fsck` from fixing it. I have fixed both bugs, so you should upgrade and then run `git annex fsck`. +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_6_79fb5ec1b47593ab3355543c5499284a._comment b/doc/forum/Git_annex_on_Windows/comment_6_79fb5ec1b47593ab3355543c5499284a._comment new file mode 100644 index 000000000..c3f2ca2a8 --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_6_79fb5ec1b47593ab3355543c5499284a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alerque.com/" + nickname="Caleb" + subject="path issue" + date="2014-03-20T13:05:34Z" + content=""" +It seems the use of the cmd folder in the Windows git-annex installer no longer meshes with the git install from msysgit. Changing \"cmd\" to \"bin\" during the install process made it work for me. +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_7_75d4450b4608ad0b453bc69159e708de._comment b/doc/forum/Git_annex_on_Windows/comment_7_75d4450b4608ad0b453bc69159e708de._comment new file mode 100644 index 000000000..2d0b3ea3c --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_7_75d4450b4608ad0b453bc69159e708de._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 7" + date="2014-03-20T16:04:36Z" + content=""" +Hmm, putting git-annex.exe in to bin and not cmd with mysysgit 1.8.5.2 will make \"git annex\" work, but \"git-annex\" will not. + +What version of msysgit has the problem with bin? +"""]] diff --git a/doc/forum/Git_annex_on_Windows/comment_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment b/doc/forum/Git_annex_on_Windows/comment_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment new file mode 100644 index 000000000..3a649c501 --- /dev/null +++ b/doc/forum/Git_annex_on_Windows/comment_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 8" + date="2014-03-20T19:50:26Z" + content=""" +I upgraded to msysgit 1.9.0 and git annex works in cmd. + +Did you tell the msysgit installer to \"Run git from the windows command prompt\"? This is the default. If you chose \"Use git bash only\" then git-annex will only work from within git bash. +"""]] diff --git a/doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn b/doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn new file mode 100644 index 000000000..d1fcc74aa --- /dev/null +++ b/doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn @@ -0,0 +1,21 @@ +Hello + +I'm trying Git annex latest builds available in Linux & Android +Here is the scenario :- + +Syncing 2 peer devices running Linux & Android +Devices can access each other directly over Cisco VPN encrypted link + +Currently, syncing files via rsync over webdav (over Cisco VPN) +Everything is working, manual file tracking is an issue. + +Here's where Git annex steps in, +I've configures external jabber account so they can talk to each other. + +But the transfers are super-slow over internet, +I'm guessing Cisco VPN adding 15-20% overhead + SSH adding another 20-30% overhead. + +Since the network link is trusted, is there any way to speed things up assuming Cisco solution +remains in place? + +looking to solve this issue diff --git a/doc/forum/Git_annex_syncing_speed__44___possible__63__/comment_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment b/doc/forum/Git_annex_syncing_speed__44___possible__63__/comment_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment new file mode 100644 index 000000000..eb0e65f80 --- /dev/null +++ b/doc/forum/Git_annex_syncing_speed__44___possible__63__/comment_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-07-12T20:09:32Z" + content=""" +Not sure if it applies to your devices, but I considerably speed up SSH transfers on my raspberry pi by using + + Ciphers arcfour + +in the ssh configuration. +"""]] diff --git a/doc/forum/Git_repos_in_git_annex__63__.mdwn b/doc/forum/Git_repos_in_git_annex__63__.mdwn new file mode 100644 index 000000000..2d16a6659 --- /dev/null +++ b/doc/forum/Git_repos_in_git_annex__63__.mdwn @@ -0,0 +1,7 @@ +Hello, + +A mode of operation that I find comfortable, and from various online posts it seems that so do some others, is putting whole git repositories in dropbox. + +It seems that currently this mode of operations if not supported in a simple manner. (i.e. just add and let assistant do the work). Is there any workaround or possibility to do this? + +Thanks! diff --git a/doc/forum/Git_repos_in_git_annex__63__/comment_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment b/doc/forum/Git_repos_in_git_annex__63__/comment_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment new file mode 100644 index 000000000..fac5ad5b1 --- /dev/null +++ b/doc/forum/Git_repos_in_git_annex__63__/comment_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="68.230.56.163" + subject="comment 1" + date="2013-07-28T02:40:24Z" + content=""" +I'll give this warning upfront: this works for me, but it requires manual intervention, and I wouldn't be surprised if this spectacularly broke with the assistant running in full auto mode. + +I'm currently storing git repos inside of my annex by using a separated git dir, so that git doesn't detect the nested repository and balk at adding it. Doing a git clone or git init with a --separate-git-dir= argument puts what would normally be in .git in that directory, and creates a simple .git file in its place which references the separated git dir. + +When I'm not using the repo, I move the .git file out of the directory, and everything looks like regular files to git-annex. When I want to use it, I move it back in place, and any git operations inside the repo directory use the inner git repo itself. + +Another option I used for a while was to store bare repos in the annex, and doing checkouts from those repos. +"""]] diff --git a/doc/forum/Git_repos_in_git_annex__63__/comment_2_8546341a561a5f55216c2f437f8ec0c2._comment b/doc/forum/Git_repos_in_git_annex__63__/comment_2_8546341a561a5f55216c2f437f8ec0c2._comment new file mode 100644 index 000000000..90d40d8aa --- /dev/null +++ b/doc/forum/Git_repos_in_git_annex__63__/comment_2_8546341a561a5f55216c2f437f8ec0c2._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Many months later..." + date="2014-05-08T16:49:26Z" + content=""" +Here is the relevant bug: + +Here's my scenario: I have been using Dropbox for several years. I want to move to git-annex. + +For some time I used Bazaar repos inside Dropbox. A couple of times I accidentally modified files on one computer before another finished syncing, and the repo became mildly corrupted, but I recovered it okay. + +Recently I switched to git, and so far, so good. I'm careful not to make any changes to my files before Dropbox is finished syncing, so everything works fine. + +But when I add a directory containing a git repo to an annex, git-annex ignores the .git directory, so the repo isn't synced. + +I read this forum thread, and I read the bug report, but there don't appear to be any real solutions. + +This seems like what should be a fairly common use case: a user has a directory of simple text files, like shell scripts or org-mode files. He uses git to version-control them, and he uses Dropbox to sync the files and the git repo automatically between computers. Now the user wants to use git-annex instead, but if he does this, it will mean having to choose between: + +* No longer using git to version-control the files +* Only using git on a single system, which means that he can't make commits or do any other git operations when using other systems +* Keeping separate git repos on each system, and making the same commits manually on each one...which would be a mess +* Keeping separate git repos on each system, and using a script to make commits automatically--which would mean commits wouldn't be any more useful than a simple timed backup script + +I guess I could just use git instead of Dropbox or git-annex, but then I must choose between either: + +* Only being able to sync repos when both systems are online +* Having to store repos in plaintext on remote servers + +This is one of my primary use cases for Dropbox/git-annex. I'd really appreciate any help in figuring this out. Thanks. +"""]] diff --git a/doc/forum/Git_repositories_in_the_annex__63__.mdwn b/doc/forum/Git_repositories_in_the_annex__63__.mdwn new file mode 100644 index 000000000..a18af8c2c --- /dev/null +++ b/doc/forum/Git_repositories_in_the_annex__63__.mdwn @@ -0,0 +1,5 @@ +First of all thanks for the great work. git-annex looks very nice already! + +I wonder if it's possible to add Git repositories to the annex. In my current Dropbox setup I drop some small Git repositories into the Dropbox to keep them in sync on two computers. + +This is obviously not possible with git-annex, as the annex itself is a Git repository and sub-repositories (directories with .git folders) are ignored. But in some cases people might want to be able to drop "anything" into the annex, maybe even Git repositories (e.g. the "nomad" usecase)... diff --git a/doc/forum/Gitolite_problems.mdwn b/doc/forum/Gitolite_problems.mdwn new file mode 100644 index 000000000..15b7d6269 --- /dev/null +++ b/doc/forum/Gitolite_problems.mdwn @@ -0,0 +1,11 @@ +I am having some issues trying to make git-annex work with the latest version of Gitolite, +When running git annex sync, or git annex copy --to I get. +""" +Failed to get annex.uuid configuration of repository origin + +Instead, got: "annex.uuid=\ncore.gcrypt-id=\n" +""" + +Has anyone found any solution to this? Also, I am using the latest version of Gitolite, because I wanted to see whether it would work. +Thanks, Zack. +EDIT: It might also be worthy to note that I did have a go at following the guide on this site. diff --git a/doc/forum/Gitolite_problems/comment_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment b/doc/forum/Gitolite_problems/comment_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment new file mode 100644 index 000000000..b29fdf2a3 --- /dev/null +++ b/doc/forum/Gitolite_problems/comment_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Renaud" + ip="126.10.66.235" + subject="comment 1" + date="2014-01-11T14:29:08Z" + content=""" +I had that problem when I tried to access a newly created remote repository. +It seems git-annex doesn't recognize anymore if the remote repository has been initialized or not. +The workaround I used is create a local repository, initialize it with git annex, `clone --bare` it, add the bare repository as a remote and `git annex sync` it to initialize the bare repository. Then, you can put the bare repository where gitolite usualy keep its repositories and use it normally. +"""]] diff --git a/doc/forum/Gitolite_problems/comment_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment b/doc/forum/Gitolite_problems/comment_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment new file mode 100644 index 000000000..7c4e8662f --- /dev/null +++ b/doc/forum/Gitolite_problems/comment_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqaNwDQ367zpW6cIRviLz6zJZZFODgoEI" + nickname="Zack" + subject="Almost there!" + date="2014-01-12T19:13:29Z" + content=""" +Thanks for the help (I can now clone the repo.), but I now get this. +get file FATAL: bad git-annex-shell command: git-annex-shell 'configlist' '/annex2.git' at /opt/gitolite2/bin/commands/git-annex-shell line 25, line 1. +"""]] diff --git a/doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn b/doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn new file mode 100644 index 000000000..5b7be7157 --- /dev/null +++ b/doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn @@ -0,0 +1,19 @@ +I am in the process of organising all of my documents (pdf/ps/etc.) and putting them into an annex. It seems like the easiest (and smartest?) way for me to manage my 15,000+ document library... (Yeah, I've not read them all!) + +However, one of the issues I have run into is when I want to include something like a software manual... + +I'm not even sure if git-annex is the correct way to handle these sort of document, but... + +What would you do if the URL stays the same, but the file content changes over time? + +For example, the administration manual for R gets updated and re-released for each release of R, but the URL stays the same. + + http://cran.r-project.org/doc/manuals/R-admin.pdf + +I'm not particularly worried about whether my annex version is the most recent, just that if I want to 'annex get' it, it will pull *a* version from somewhere. + +Any thoughts? + +I'd bet that the SHA-hash would change between releases(!) so would a WORM backend be the best approach? It would mess up my one-file-in-multiple-directories (i.e. multiple simlinks to the one SHA-...-.....) approach. + + diff --git a/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_1_05ee6a1b1943ef3c90634e52233bde1c._comment b/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_1_05ee6a1b1943ef3c90634e52233bde1c._comment new file mode 100644 index 000000000..0f0bf2f32 --- /dev/null +++ b/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_1_05ee6a1b1943ef3c90634e52233bde1c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-03T00:57:55Z" + content=""" +The web special remote will happily download files when you `git annex get` even if they don't have the same content that they did before. + +`git annex fsck` will detect such mismatched content to the best ability of the backend (so checking the SHA1, or verifying the file size at least matches if you use WORM), and complain and move such mismatched content aside. `git annex addurl --fast` deserves a special mention; it uses a backend that only records the URL, and so if it's used, fsck cannot later detect such changes. Which might be what you want.. + +For most users, this is one of the reasons `git annex untrust web` is a recommended configuration. Once you untrust the web, any content you download from the web will be kept around in one of your own git-annex repositories, rather than the untrustworthy web being the old copy. +"""]] diff --git a/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_2_48d82e391812d8ec0d4e6562d0607fe7._comment b/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_2_48d82e391812d8ec0d4e6562d0607fe7._comment new file mode 100644 index 000000000..93c43137d --- /dev/null +++ b/doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_2_48d82e391812d8ec0d4e6562d0607fe7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 2" + date="2012-01-03T02:49:18Z" + content=""" +Thanks! `git annex addurl --fast` does exactly what I want it to do. + +Wow. Yet another special backend for me to play with. :-) +"""]] diff --git a/doc/forum/Help_Windows_walkthrough.mdwn b/doc/forum/Help_Windows_walkthrough.mdwn new file mode 100644 index 000000000..dbe61b556 --- /dev/null +++ b/doc/forum/Help_Windows_walkthrough.mdwn @@ -0,0 +1,177 @@ +Hello, + +i am trying to run the walkthrough on Windows 7. When i try to get the contents of a file, i only get a some git annex text string and not the real file. Both repositories are on the same ntfs filesystem. + +C:\tmp>git annex version +git-annex version: 4.20130827-g4f18612 +build flags: Pairing Testsuite S3 WebDAV DNS +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 2 + +C:\tmp\server>git --version +git version 1.8.3.msysgit.0 + + +# walkthrough.bat + + doskey /history > commands.log + mkdir laptop + cd laptop + git init + git annex init laptop + cd .. + + git clone laptop server + cd server + git annex init server + git remote add laptop c:\tmp\laptop + + cd ..\laptop + git remote add server c:\tmp\server + copy ..\1.pdf . + git annex add 1.pdf + git commit -m add + dir + + cd ..\server + dir + git fetch laptop + git merge laptop/master + git annex get 1.pdf + dir + type 1.pdf + + +# walkthrough.log + + C:\tmp>walkthrough.bat + + C:\tmp>doskey /history 1>commands.log + + C:\tmp>mkdir laptop + + C:\tmp>cd laptop + + C:\tmp\laptop>git init + Initialized empty Git repository in C:/tmp/laptop/.git/ + + C:\tmp\laptop>git annex init laptop + init laptop + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + ok + (Recording state in git...) + + C:\tmp\laptop>cd .. + + C:\tmp>git clone laptop server + Cloning into 'server'... + done. + warning: remote HEAD refers to nonexistent ref, unable to checkout. + + + C:\tmp>cd server + + C:\tmp\server>git annex init server + init server + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + ok + (Recording state in git...) + + C:\tmp\server>git remote add laptop c:\tmp\laptop + + C:\tmp\server>cd ..\laptop + + C:\tmp\laptop>git remote add server c:\tmp\server + + C:\tmp\laptop>copy ..\1.pdf . + 1 file(s) copied. + + C:\tmp\laptop>git annex add 1.pdf + add 1.pdf (checksum...) ok + (Recording state in git...) + + C:\tmp\laptop>git commit -m add + [master (root-commit) 7ad1514] add + 1 file changed, 1 insertion(+) + create mode 120000 1.pdf + + C:\tmp\laptop>dir + Volume in drive C has no label. + Volume Serial Number is x + + Directory of C:\tmp\laptop + + 09/01/2013 11:03 AM . + 09/01/2013 11:03 AM .. + 08/30/2013 12:43 PM 37,500 1.pdf + 1 File(s) 37,500 bytes + 2 Dir(s) 7,698,817,024 bytes free + + C:\tmp\laptop>cd ..\server + + C:\tmp\server>dir + Volume in drive C has no label. + Volume Serial Number is x + + Directory of C:\tmp\server + + 09/01/2013 11:03 AM . + 09/01/2013 11:03 AM .. + 0 File(s) 0 bytes + 2 Dir(s) 7,698,817,024 bytes free + + C:\tmp\server>git fetch laptop + remote: Counting objects: 9, done. + remote: Compressing objects: 100% (6/6), done. + remote: Total 8 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (8/8), done. + From c:\tmp\laptop + * [new branch] git-annex -> laptop/git-annex + * [new branch] master -> laptop/master + + C:\tmp\server>git merge laptop/master + + C:\tmp\server>git annex get 1.pdf + get 1.pdf (merging laptop/git-annex origin/git-annex into git-annex...) + (Recording state in git...) + (from laptop...) + 1.pdf + 37500 100% 4.51MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 37573 bytes received 31 bytes 75208.00 bytes/sec + total size is 37500 speedup is 1.00 + ok + (Recording state in git...) + + C:\tmp\server>dir + Volume in drive C has no label. + Volume Serial Number is x + + Directory of C:\tmp\server + + 09/01/2013 11:03 AM . + 09/01/2013 11:03 AM .. + 09/01/2013 11:03 AM 194 1.pdf + 1 File(s) 194 bytes + 2 Dir(s) 7,698,767,872 bytes free + + C:\tmp\server>type 1.pdf + .git/annex/objects/kM/0q/SHA256E-s37500--32d8190c7e189d45f48245a100e4cc981ea1bbc + 02ac8bfa6188db73e41ce06f3.pdf/SHA256E-s37500--32d8190c7e189d45f48245a100e4cc981e + a1bbc02ac8bfa6188db73e41ce06f3.pdfC:\tmp\server> + C:\tmp\server> + diff --git a/doc/forum/Help_Windows_walkthrough/comment_1_5fc22393a1b28235eabb2871ad83d0a7._comment b/doc/forum/Help_Windows_walkthrough/comment_1_5fc22393a1b28235eabb2871ad83d0a7._comment new file mode 100644 index 000000000..95623a645 --- /dev/null +++ b/doc/forum/Help_Windows_walkthrough/comment_1_5fc22393a1b28235eabb2871ad83d0a7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.7" + subject="comment 1" + date="2013-09-03T17:59:03Z" + content=""" +The walkthrough assumes a system that uses indirect mode by default, so it won't work quite right on Windows, which is forced to use direct mode. + +Running `git annex fsck` in the server repository will fix up this situation, but the right thing on Windows is to use `git annex sync` rather than the manual `git fetch + git merge` the walkthrough shows. + +Guess I'll make the walkthrough use sync, although it may make it harder for people to understand what's going on internally. +"""]] diff --git a/doc/forum/Help_on_my_usecase.mdwn b/doc/forum/Help_on_my_usecase.mdwn new file mode 100644 index 000000000..ef670aa25 --- /dev/null +++ b/doc/forum/Help_on_my_usecase.mdwn @@ -0,0 +1,22 @@ +I am using git-annex assistant for a few months now and still don't think I have it all setup correctly. My setup is: + +* Laptop Computer with low storage. Content creator, assistant: file source +* Desktop Computer with medium storage capacity. Consumer, assistant: manual Mode +* 2TB USB HD (EXT4) Backup, assistant: full backup +* 2.5" portable 500GB drive NTFS formatted. transfer to backup: assistant: tried transfer and partial backup +* Root Server on the web, not yet in the mix. Planned: Index only / content creator + +My primary goal is getting the stuff from the Laptop to the 2TB USB drive, syncing the annex with the desktop so I can get files on the desktop from the backup. +What works: + +* Checking stuff into the annex on the Laptop +* When the 2TB drive is connected to the Laptop, stuff is automatically moved there too +* Bare Repo on the 2.5" configured as partial backup automatically backups the data + +What doesn't work: + +* Connecting the 2.5" bare repo to the Desktop to move stuff to the backup drive automatically +* Having a human readable folder Structure on the 2.5" NTFS drive. I'd be ok to have a bare repo plus a special remote on the drive, but I don't know how to configure it +* How do I drop stuff from the bare repo on the 2.5" drive? I think a partial backup should drop content that is in a full backup, but it doesn't + +Thanks for reading this long post. If anyone has any tips on how to configure the assistant, thats much appreciated. diff --git a/doc/forum/Help_on_my_usecase/comment_1_a35b35c7927640f21d47c3df4f91dabb._comment b/doc/forum/Help_on_my_usecase/comment_1_a35b35c7927640f21d47c3df4f91dabb._comment new file mode 100644 index 000000000..25116a7c4 --- /dev/null +++ b/doc/forum/Help_on_my_usecase/comment_1_a35b35c7927640f21d47c3df4f91dabb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-09T18:18:49Z" + content=""" +An incremental backup is supposed to drop content once it reaches a full backup. But, the assistant can only do that if it's able to verify that the full backup drive (or some other repository it can access) has a file, at the same time it's dropping it from the incremental backup drive. If you don't have both the incremental and full backup drives plugged in at the same time, you could consider making git-annex [[trust]] the full backup drive, which would avoid this explicit check. + +It sounds like you want a non-bare git repository on the 2.5\" drive. The assistant does not currently support setting that up, but you can do it by just using `git clone` as shown in the [[walkthrough]]. + +I'm not clear on what doesn't work when you connect the 2.5\" drive to your desktop. +"""]] diff --git a/doc/forum/Help_with_syncing_file_contents.mdwn b/doc/forum/Help_with_syncing_file_contents.mdwn new file mode 100644 index 000000000..28ac22b2e --- /dev/null +++ b/doc/forum/Help_with_syncing_file_contents.mdwn @@ -0,0 +1,68 @@ +Hi everyone, + +everyday I understand more and more how git and git-annex work but I need help with this one. +I guess I have two questions but let me describe the scenario first: + +I have one local repository of mp3s (assume just one file: file1.mp3). +I clone that repository into a remote git-annex repository over ssh and "git annex get" the file contents for file1.mp3. + +I unlock some mp3's locally and modify some mp3 tags. +Then I notify git-annex of these changes +with "git annex add *" +and commit them with "git commit -m 'mp3 tags changed'". +[git annex locks them again and changes the symlinks to point to the changed file in the annex, git commits the changed symlink] + +At this point in time there are two objects in my git annex repository: +hash(file1.mp3) +hash(file1.mp3|with modified tags) +The symlink points now to hash(file1.mp3|with modified tags) + +At this point the remote still does not now of this commit and of the new file contents. +Thus I do "git push" to send the changes to the remote. +The remote now has a BROKEN symlink because it already points to hash(file1.mp3|with modified tags) +but the remote annex's object directory only contains hash(file1.mp3). + +Then I want my remote repository to also have the updated mp3 tags. +The only way I see (without scripting) to have the updated mp3 tags in the remote repository is to do an "git annex get file1.mp3" on the remote repository or an "git annex copy --to remote file1.mp3" at my local repository. However, although the binary differences between both files +file1.mp3 and file1.mp3|with modified tags are small the latter is transferred completely from the local repository to the remote repository. + +This is not a problem when just changing one file, but a problem when I have 10GB's of files and when it takes 2days to upload them to the remote because of a low bandwidth. + +First question: Did I miss something? Does git-annex already provide means to only transmit the diff between the two objects? + +Second question regarding disk space. +I now have a complete history of all changes to file1.mp3 in my git-annex repository. I have the objects that represent every state of file1.mp3 and I can go back to these states when I checkout the respective commits and thereby the symlinks that link to these "old" objects. This history can take up a lot of space. What is the clean way to forget the past? AFAIK "git drop unused" only drops file contents that are not referenced in any commit? + +If one wanted to preserve the entire history but save disk space one could also only store the current content and the patches that allow to reconstruct older versions from the current one. I understand that applying several patches consecutively takes more cpu time but for me going back to an older commit with my binary files only happens rarely. + +This is the algorithm I have in mind for an optimized "git annex get file1": + +On that repository where the file is missing: + +1. Find the newest object that represented the contents of file1 in file1's commit history. + +2. Transmit this object identification hash(object) to the remote that has the current version (the one I am getting from). + +At that remote: + +If the history contains full versions of file contents: + +Create a binary diff between the object identified by hash(object) and the current content of file1. + +If the history contains only the current version and patches to older versions: +Collect all patches that represent the change from hash(object) to the current content of file1. + +If the list of patches is bigger than the current content of file 1 transmit the current content of file1. Otherwise transmit the patch(es) + +On that repository where the file is missing: + +Apply the patch(es) to the latest object to obtain the current object. + +What's your opinion on this? + +Marek + + + + + diff --git a/doc/forum/Help_with_syncing_file_contents/comment_1_7ec34de3140983739080115c82966bf5._comment b/doc/forum/Help_with_syncing_file_contents/comment_1_7ec34de3140983739080115c82966bf5._comment new file mode 100644 index 000000000..87ef6d130 --- /dev/null +++ b/doc/forum/Help_with_syncing_file_contents/comment_1_7ec34de3140983739080115c82966bf5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Possible quick solution with rsync" + date="2013-05-28T10:52:30Z" + content=""" +One could achieve the effect of only transmitting the changes of file contents using rsync. + +On the repository that lacks the current version: + +cp latestversionavailable currentversion +rsync remoterepository/currentversion ./currentversion + + + + + +"""]] diff --git a/doc/forum/Help_with_syncing_file_contents/comment_2_7dba58d3c62d6f64a270298e4e4329a4._comment b/doc/forum/Help_with_syncing_file_contents/comment_2_7dba58d3c62d6f64a270298e4e4329a4._comment new file mode 100644 index 000000000..2d427cccb --- /dev/null +++ b/doc/forum/Help_with_syncing_file_contents/comment_2_7dba58d3c62d6f64a270298e4e4329a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="I should have read git annex unused first" + date="2013-05-28T22:14:46Z" + content=""" +Apparently \"git annex unused\" finds previous versions of the object that are not symlinked anymore. However, if a file is renamed then the oldest version before the rename is not marked as unused. + + +"""]] diff --git a/doc/forum/Help_with_syncing_file_contents/comment_3_b26cfa20dc81517d93e760f4809bdc24._comment b/doc/forum/Help_with_syncing_file_contents/comment_3_b26cfa20dc81517d93e760f4809bdc24._comment new file mode 100644 index 000000000..6293ada24 --- /dev/null +++ b/doc/forum/Help_with_syncing_file_contents/comment_3_b26cfa20dc81517d93e760f4809bdc24._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-29T16:50:35Z" + content=""" +Treating each version of a file as a separate object that is stored and transmitted separately is one of the core simplifying assumptions of git-annex. Among other things it makes it easy to have dumb special remotes that are mere key/value stores. And it keeps it easy to understand. + +I don't consider this a problem as far as storage goes. Disk space is cheap; git-annex allows dropping unused versions of files from repositories that are not on large cheap storage. + +For file transfer, it would be nice to find optimisations that don't require changing this simplifying assumption. This can be done at least for rsync I think. The [[design/assistant/deltas]] page is where the design of this is or will be worked on. +"""]] diff --git a/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___.mdwn b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___.mdwn new file mode 100644 index 000000000..78b10b47a --- /dev/null +++ b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___.mdwn @@ -0,0 +1,6 @@ +Hello. +How can I use git-annex get a list of files in directory that have content? For each such file the result of command + + git-annex get [file] + +will be empty. diff --git a/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_1_e897d8fc10474cf865279dc22f22ecb7._comment b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_1_e897d8fc10474cf865279dc22f22ecb7._comment new file mode 100644 index 000000000..8a0697e09 --- /dev/null +++ b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_1_e897d8fc10474cf865279dc22f22ecb7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 1" + date="2013-12-30T13:15:20Z" + content=""" + git annex find + +that's what you meant? +"""]] diff --git a/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_2_3af326205db6ee04f2a8644baa1dd566._comment b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_2_3af326205db6ee04f2a8644baa1dd566._comment new file mode 100644 index 000000000..6fe18b5cb --- /dev/null +++ b/doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_2_3af326205db6ee04f2a8644baa1dd566._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Alexcei" + ip="92.255.239.77" + subject="comment 2" + date="2013-12-30T13:25:45Z" + content=""" +Yes, this is what I need. I have not seen this command before. Thank you. +"""]] diff --git a/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__.mdwn b/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__.mdwn new file mode 100644 index 000000000..a4bcc4843 --- /dev/null +++ b/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__.mdwn @@ -0,0 +1 @@ +I had accidentally chosen the wrong directory for the repository. What should I do to clean all of git-annex? diff --git a/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__/comment_1_e14757c2c106770c2d7069ace4987b3b._comment b/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__/comment_1_e14757c2c106770c2d7069ace4987b3b._comment new file mode 100644 index 000000000..b051aa704 --- /dev/null +++ b/doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__/comment_1_e14757c2c106770c2d7069ace4987b3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T18:43:08Z" + content=""" +It should be sufficient to delete `/sdcard/git-annex.home` and delete the .git directory inside whatever directory you set up as the repository. +"""]] diff --git a/doc/forum/How_do_I_do_with_.gitrefs__47_____63__.mdwn b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__.mdwn new file mode 100644 index 000000000..d4a2a71b1 --- /dev/null +++ b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__.mdwn @@ -0,0 +1 @@ +There is .gitrefs directory in my annexed repo while I am unaware. Should I do `git add .gitrefs/` or `git annex add .gitrefs/` or just ignore? diff --git a/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_1_5e235af2ea13fd4f6a226c842f69965e._comment b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_1_5e235af2ea13fd4f6a226c842f69965e._comment new file mode 100644 index 000000000..9e8d044a1 --- /dev/null +++ b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_1_5e235af2ea13fd4f6a226c842f69965e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-06T15:44:15Z" + content=""" +AFAIK neither git nor git-annex creates a .gitrefs directory. +"""]] diff --git a/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_2_50d0c643537175b514d5eae604fb5bea._comment b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_2_50d0c643537175b514d5eae604fb5bea._comment new file mode 100644 index 000000000..a812e99b0 --- /dev/null +++ b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_2_50d0c643537175b514d5eae604fb5bea._comment @@ -0,0 +1,51 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.203.53.96" + subject="comment 2" + date="2014-01-11T07:51:57Z" + content=""" +I have noticed a .gitrefs/ directory being added to my git-annex repositories as well. +Two direct-mode git-annex assistant-managed repos have turned up a .gitrefs directory the past month or so, with the directory often returning after I remove it. First occurrance according to git logs is on the 3rd of December. + +The directory looks a lot like .git/refs, as if some tool is trying to do something to .git/refs but has a bug that removes the first /, and then proceeds to copy or recreate the files. + + [0 zerodogg@firefly annexed]$ du -hs .gitrefs .git/refs + 172K .gitrefs + 192K .git/refs + [0 zerodogg@firefly annexed]$ find .gitrefs > /tmp/gitr1 + [0 zerodogg@firefly annexed]$ find .git/refs > /tmp/gitr2 + [0 zerodogg@firefly annexed]$ perl -pi -e 's/^\.git.?refs//' /tmp/gitr* + [0 zerodogg@firefly annexed]$ diff -BrayN --suppress-common-lines /tmp/gitr1 /tmp/gitr2 + > /tags + > /remotes/browncoats + > /remotes/browncoats/master + > /remotes/browncoats/synced + > /remotes/browncoats/synced/master + > /remotes/browncoats/synced/git-annex + > /remotes/browncoats/git-annex + > /remotes/browncoats/annex + > /remotes/browncoats/annex/direct + > /remotes/browncoats/annex/direct/master + /remotes/serenity/master < + /remotes/zoe | /remotes/faerun/annex + /remotes/zoe/master | /remotes/faerun/annex/direct + /remotes/zoe/synced | /remotes/faerunpi + /remotes/zoe/synced/master | /remotes/faerunpi/synced + /remotes/zoe/synced/git-annex | /remotes/faerunpi/annex + /remotes/firefly | /remotes/faerunpi/annex/direct + /remotes/firefly/master < + /remotes/firefly/synced < + /remotes/firefly/synced/master < + /remotes/firefly/synced/git-annex < + /remotes/firefly/git-annex < + /remotes/firefly/annex < + /remotes/firefly/annex/direct < + /remotes/firefly/annex/direct/master < + /remotes/river/master < + > /remotes/origin + > /remotes/origin/synced + > /remotes/hufsa + > /remotes/hufsa/synced + > /synced + +"""]] diff --git a/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_3_3d342c32b14c7edbece596ba970a8415._comment b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_3_3d342c32b14c7edbece596ba970a8415._comment new file mode 100644 index 000000000..8902e004a --- /dev/null +++ b/doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_3_3d342c32b14c7edbece596ba970a8415._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 3" + date="2014-01-15T20:40:35Z" + content=""" +A bug in the git repository repair code caused packed-refs files to be exploded to .gitrefs instead of .git/refs. I have fixed that bug. + +To fix up a repository that this happened to, I'd recommend checking if there are any tags and branches in the .gitrefs directory that have gone missing from .git/refs.. If so, you could move the files back into place (unannexing them first if necessary). Otherwise, deleting .gitrefs would seem to be the thing to do. +"""]] diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn new file mode 100644 index 000000000..c9a5a6c0a --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn @@ -0,0 +1,3 @@ +`git annex dropunused` is simple enough. + +But how do I perform the equivalent procedure on an rsync remote? I'd presume that `git annex copy --to remote` is not sufficient. diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_1_8db3cb5348b845eb99c2c829957db9ea._comment b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_1_8db3cb5348b845eb99c2c829957db9ea._comment new file mode 100644 index 000000000..026d393bb --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_1_8db3cb5348b845eb99c2c829957db9ea._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2013-05-12T23:06:34Z" + content=""" +Oh, sheesh, it's right there at the bottom of http://git-annex.branchable.com/special_remotes/. Oops. +"""]] diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment new file mode 100644 index 000000000..2df92a8a3 --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-13T18:03:23Z" + content=""" +Well, in your defense it's documented there because I can't think of a better place to put it. Maybe you looked in some other places first before finding it there, and I should add a pointer to those places? + +(For the curious, the magic run is just: git annex unused --from remote) +"""]] diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_3_f24d678e4192a70322aa164ed9b71fc8._comment b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_3_f24d678e4192a70322aa164ed9b71fc8._comment new file mode 100644 index 000000000..2b53984c3 --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_3_f24d678e4192a70322aa164ed9b71fc8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 3" + date="2013-05-13T18:56:32Z" + content=""" +I think in general the `git annex command --help` bits could be more thorough. If `git annex dropunused --help` indicated that it took `--from`, that would probably have helped me. +"""]] diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_4_9233decd0aaf9211447f36e0d9346445._comment b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_4_9233decd0aaf9211447f36e0d9346445._comment new file mode 100644 index 000000000..f326cd340 --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_4_9233decd0aaf9211447f36e0d9346445._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-13T18:59:08Z" + content=""" +You might be using an older version. Here's the output of that command in the current version: + +
+Usage: git-annex dropunused NUM|RANGE ... [option ...]
+  -f REMOTE  --from=REMOTE  drop content from a remote
+
+To see additional options common to all commands, run: git annex help options
+
+"""]] diff --git a/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_5_e1deb110f752e5495d5c77ec444abac5._comment b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_5_e1deb110f752e5495d5c77ec444abac5._comment new file mode 100644 index 000000000..e9ca6bc13 --- /dev/null +++ b/doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_5_e1deb110f752e5495d5c77ec444abac5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 5" + date="2013-05-13T19:07:11Z" + content=""" +Ah, rebuilding got me that. That's pretty good! +"""]] diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn new file mode 100644 index 000000000..209e0f6a7 --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn @@ -0,0 +1,16 @@ +Hello, + +I had some trouble adding a remote (the files would not appear when I was copying them to the remote), so I started over and cloned an existing repository. + +Of course, as I started over, I had a duplicate uuid for the remote, which would cause problems when trying to copy (I would have an error "git-annex-shell: expected repository UUID 70582c7b-0b57-4087-a9d1-77b5f5f3c75e but found UUID 335699ea-d5b8-49ff-b207-1571b5969afe"). + +I finally managed to find the wrong uuid in the .git/config file (there was a duplicated entry for the remote) and I'm now able to copy things to the remote repository, and "git annex sync" works well. However I still see a mention of this repository when I do a "git annex whereis": + + cody:games schmitta$ git annex whereis + whereis dungeon_keeper_1.1.0.11.dmg (3 copies) + 1cdfb490-0660-41fb-b7ce-74b89abb9aac -- top + 335699ea-d5b8-49ff-b207-1571b5969afe -- here (cody) + 70582c7b-0b57-4087-a9d1-77b5f5f3c75e + + +Where can I find where this last line come from, and how can I get rid of it? I tried saying that this uuid is dead, but git annex tells me it's not a remote name. diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_1_b3c215cedba51fb47992ef10c60d6acc._comment b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_1_b3c215cedba51fb47992ef10c60d6acc._comment new file mode 100644 index 000000000..80b664dce --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_1_b3c215cedba51fb47992ef10c60d6acc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 1" + date="2014-03-08T06:42:29Z" + content=""" +If it helps, I had a look at \"git annex vicfg\", and there is no mention of the extra UUID there. +"""]] diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_2_85415e1fceb737919cc1cd9f37242458._comment b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_2_85415e1fceb737919cc1cd9f37242458._comment new file mode 100644 index 000000000..a251dade3 --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_2_85415e1fceb737919cc1cd9f37242458._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-12T19:35:26Z" + content=""" +Probably this will fix it: + +`git annex dead 70582c7b-0b57-4087-a9d1-77b5f5f3c75e` +"""]] diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_3_fb3a591dc60182f7922fc2b5c24f50f1._comment b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_3_fb3a591dc60182f7922fc2b5c24f50f1._comment new file mode 100644 index 000000000..bebd8f290 --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_3_fb3a591dc60182f7922fc2b5c24f50f1._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 3" + date="2014-03-13T20:05:53Z" + content=""" +Unfortunately git annex tells me there is no such remote: + + cody:games schmitta$ git annex dead 70582c7b-0b57-4087-a9d1-77b5f5f3c75e + dead 70582c7b-0b57-4087-a9d1-77b5f5f3c75e git-annex: there is no available git remote named \"70582c7b-0b57-4087-a9d1-77b5f5f3c75e\" +"""]] diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment new file mode 100644 index 000000000..99ac0d5a6 --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 4" + date="2014-03-14T17:46:23Z" + content=""" +It seems that the git-annex branch's uuid.log must somehow not list this uuid, but it's used in the location tracking log files. + +The only way I can think of that this could happen is if you had set up a repository, run git-annex init, and then went in and changed the annex.uuid setting to this other uuid, and added files with that misconfiguration. Does that sound like what happened? + +The fix is just as evil as the cause -- you can edit .git/config to add a new, dummy git remote that has annex-uuid set to the problem uuid, and then `git-annex dead` can be used to kill the uuid via that remote. For example: + +[[!format sh \"\"\" +joey@darkstar:~/tmp/x>git annex whereis eep +whereis eep (1 copy) + 00000a6d-e770-4ab9-a640-7d6272e9ffff +ok +joey@darkstar:~/tmp/x>git annex dead 00000a6d-e770-4ab9-a640-7d6272e9ffff +dead 00000a6d-e770-4ab9-a640-7d6272e9ffff git-annex: there is no available git remote named \"00000a6d-e770-4ab9-a640-7d6272e9ffff\" +- exit 1 +joey@darkstar:~/tmp/x>git remote add dummy dummy +joey@darkstar:~/tmp/x>git config remote.dummy.annex-uuid 00000a6d-e770-4ab9-a640-7d6272e9ffff +joey@darkstar:~/tmp/x>git annex dead dummy +dead dummy ok +(Recording state in git...) +joey@darkstar:~/tmp/x>git annex whereis eep +whereis eep (0 copies) failed +\"\"\"]] +"""]] diff --git a/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment new file mode 100644 index 000000000..9807fb7d9 --- /dev/null +++ b/doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 5" + date="2014-03-14T18:11:52Z" + content=""" +Thanks, it worked! + +Regarding how I got into that state, here is what happened: +- I configured a new repository (git init, git annex init) on machine B +- I added that repository as a remote from machine A +- I started pushing files from machine A to machine B, starting with the file that later showed this problem +- I then noticed that, although the files were said to be successfully sent, I could not see them on machine B (no symbolic link was created), even after a \"git annex sync\" there +- I decided to start over, deleting the annex, and creating it from a clone of an existing annex +- This resulted in a duplicated UUID for the same path, which led to this problem + +Maybe some documentation on how to cleanly start over when things get in a bad state would be very useful. + +Thanks again, + +Alan +"""]] diff --git a/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn b/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn new file mode 100644 index 000000000..d574956bf --- /dev/null +++ b/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn @@ -0,0 +1,4 @@ +Hi Joey, + I was wondering how you know when a file in your repo fails a fsck. I'm having trouble finding out since I can't change any of the objects (which is great!). I'd just like to know since I have thousands of files in one of my annexes, and scrolling through my term buffer is unwieldy. I'd assume it would show up when the fsck was done, or in 'git annex status'... + +Thanks! diff --git a/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__/comment_1_1c14981916dd55376d5e9f95023556cb._comment b/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__/comment_1_1c14981916dd55376d5e9f95023556cb._comment new file mode 100644 index 000000000..042a1c46a --- /dev/null +++ b/doc/forum/How_do_you_know_when_something_fails_a_fsck__63__/comment_1_1c14981916dd55376d5e9f95023556cb._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-06-10T14:23:25Z" + content=""" + justin@box:/tmp/f$ git init + Initialized empty Git repository in /tmp/f/.git/ + justin@box:/tmp/f$ git-annex init + init ok + (Recording state in git...) + justin@box:/tmp/f$ cp /etc/motd . + justin@box:/tmp/f$ git-annex add . + add motd (checksum...) ok + (Recording state in git...) + justin@box:/tmp/f$ git-annex fsck + fsck motd (checksum...) ok + justin@box:/tmp/f$ chmod +w motd + justin@box:/tmp/f$ echo hi >> motd + justin@box:/tmp/f$ git-annex fsck + fsck motd + Bad file size (3 B larger); moved to /tmp/f/.git/annex/bad/SHA256-s354--2e724dde1a5dc33bc15580b2aef1ee541ca8047d746fff9bb7917062b871c0bf + + ** No known copies exist of motd + failed + (Recording state in git...) + git-annex: fsck: 1 failed + + +You can also use fsck -q which will only show errors. + +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__.mdwn b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__.mdwn new file mode 100644 index 000000000..a2ac090ad --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__.mdwn @@ -0,0 +1,7 @@ +When starting git-annex assistant with: + + git-annex webapp + +an unwanted web browser is opened. + +How does one change the web browser with which the web interface is displayed? diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_1_f4402eabda2327da3a0bbc64ed3baf9a._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_1_f4402eabda2327da3a0bbc64ed3baf9a._comment new file mode 100644 index 000000000..6369dbd0b --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_1_f4402eabda2327da3a0bbc64ed3baf9a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.60" + subject="comment 1" + date="2012-09-17T15:32:07Z" + content=""" +The web browser is started by running the `xdg-open` program (or just `open` on Mac OS X). + +xdg-open, in turn, runs the desktop environment's kde-open, gvfs-open, exo-open. Which browser these run is configured in the desktop environment's settings. Which is my goal for the web app; it should open the same browser that other applications in the desktop use. + +When there's no desktop environment in use, xdg-open falls back to some default browser, or to what's configured by the BROWSER environment variable. +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment new file mode 100644 index 000000000..ce626fa9f --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlZvtBCVyJw4O71OPsdwGpVh6iJ1W-xaPc" + nickname="Kilian" + subject="comment 2" + date="2012-10-11T21:56:26Z" + content=""" +On my Ubuntu 10.04 machine, ./git-annex-webapp starts Firefox whereas xdg-open starts my configured standard browser, Chrome. + +-ke +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_3_ca75e928c245eb23a02b5f40ec69cbb1._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_3_ca75e928c245eb23a02b5f40ec69cbb1._comment new file mode 100644 index 000000000..b2b605492 --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_3_ca75e928c245eb23a02b5f40ec69cbb1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 3" + date="2012-10-11T23:41:36Z" + content=""" +Recently the webapp has started honoring git's web.browser setting, so if that's set in ~/.gitconfig, it'll use a different browser than xdg-open does. +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_4_1635f136909711295b9b70d1255e0378._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_4_1635f136909711295b9b70d1255e0378._comment new file mode 100644 index 000000000..e6d12ca5d --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_4_1635f136909711295b9b70d1255e0378._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Doesn't use the configured web browser app..." + date="2012-12-04T23:10:43Z" + content=""" +On my system, `xdg-open http://google.com/` opens firefox as desired, but `xdg-open file:///tmp/foo.html` tries to load **wine**! +I'm using xfce, and it seems like exo-open is noticing the `file://` URL, finding the mime type, and looking it up in `~/.local/share/applications/wine-extension-html.desktop`, which was (annoyingly) created by wine. Deleting those files fixes it. + +Not sure how you'd make this better. Maybe give xdg-open a URL like `http://localhost:54896/?authfile=...` that redirects to `file:///tmp/webapp12345.html` that redirects to `http://localhost:54896/?auth=...` ? +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_5_ee0cbe9498c518de98480a2ad229f685._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_5_ee0cbe9498c518de98480a2ad229f685._comment new file mode 100644 index 000000000..8dc9d74ec --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_5_ee0cbe9498c518de98480a2ad229f685._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.72" + subject="comment 5" + date="2012-12-05T01:21:03Z" + content=""" +@Jim, that would be a good technique.. except many browsers prohibit redirecting to file:// urls. + + +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment new file mode 100644 index 000000000..767426fef --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2013-11-15T13:43:06Z" + content=""" +Since git web--browse defaults to firefox on my system (Ubuntu/XMonad), I did this on Ubuntu to get the system default browser. + + git config --global web.browser xdg-open + +"""]] diff --git a/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_7_71ff45948487e9ac8de809a5ccc3d874._comment b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_7_71ff45948487e9ac8de809a5ccc3d874._comment new file mode 100644 index 000000000..115d402ad --- /dev/null +++ b/doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_7_71ff45948487e9ac8de809a5ccc3d874._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="rupi" + ip="80.110.152.13" + subject="xdg-open" + date="2014-02-28T17:48:23Z" + content=""" +Since I discovered the same behavior mentioned above (git annex webapp +tries to use 'winebrowser'). There is an easy way to work with the difference +between http +url and html files: enter preferences for both: + +In ~/.local/share/applications/mimeapps.list: + + [Added Associations] + .. + x-scheme-handler/http=iceweasel.desktop; + x-scheme-handler/https=iceweasel.desktop; + text/html=icewesel.desktop; + + + [Default Applications] + x-scheme-handler/http=iceweasel.desktop + x-scheme-handler/https=iceweasel.desktop + text/html=iceweasel.desktop + + +Your preferred browser might be a different one off course. And I agree that this has to be the most logical place to store that information ever.. + +"""]] diff --git a/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads.mdwn b/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads.mdwn new file mode 100644 index 000000000..8de9cc769 --- /dev/null +++ b/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads.mdwn @@ -0,0 +1,3 @@ +I want to upload and download more than one file at a time to and from the various remotes. + +How do I do that? diff --git a/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads/comment_1_d5559994ee45a5c185a55c9a4d824aa4._comment b/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads/comment_1_d5559994ee45a5c185a55c9a4d824aa4._comment new file mode 100644 index 000000000..41999cf0e --- /dev/null +++ b/doc/forum/How_does_one_change_the_number_of_simultaneous_uploads/comment_1_d5559994ee45a5c185a55c9a4d824aa4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T19:12:10Z" + content=""" +This is not currently supported. See [[todo/Slow_transfer_for_a_lot_of_small_files.]] + + You can click on the button next to individual files in the transfer queue to force concurrent transfers. + + +"""]] diff --git a/doc/forum/How_to_cancel_an_add__63__.mdwn b/doc/forum/How_to_cancel_an_add__63__.mdwn new file mode 100644 index 000000000..e0b0f1c8f --- /dev/null +++ b/doc/forum/How_to_cancel_an_add__63__.mdwn @@ -0,0 +1,5 @@ +What is the safest way to cancel a `git annex add` before the first commit? + +Say I first added a directory with a lot of small files to the annex and then (while watching the endless list of checksum operations) decide I should actually put them in a tar file and annex that instead. + +The problem seems to be that `git annex add` immediately replaces the files with symlinks instead of waiting for a commit, so I can't just `git reset largedir/; tar cvfz largedir.tgz largedir/; git annex add largedir.tgz`. diff --git a/doc/forum/How_to_cancel_an_add__63__/comment_1_f768ce5dc7c76f96ee6eb352f167be44._comment b/doc/forum/How_to_cancel_an_add__63__/comment_1_f768ce5dc7c76f96ee6eb352f167be44._comment new file mode 100644 index 000000000..cef938469 --- /dev/null +++ b/doc/forum/How_to_cancel_an_add__63__/comment_1_f768ce5dc7c76f96ee6eb352f167be44._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T00:50:48Z" + content=""" +Run `git annex unannex` on the files. +"""]] diff --git a/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__.mdwn b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__.mdwn new file mode 100644 index 000000000..70e3eada3 --- /dev/null +++ b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__.mdwn @@ -0,0 +1,2 @@ +git-annex created a gitannexxxxxxxxxxxxxxxxxxxxx folder on S3 and I guess I'm a bit OCD but I'd like to rename it to git-annex. +Of course I can rename it in my S3 console but where does git-annex store that name so I can also change it on my local install of git-annex. diff --git a/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_1_be74d63e1951f515948d232e096b4862._comment b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_1_be74d63e1951f515948d232e096b4862._comment new file mode 100644 index 000000000..3aecea051 --- /dev/null +++ b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_1_be74d63e1951f515948d232e096b4862._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T16:28:40Z" + content=""" +If you look at the [[S3_documentation|special_remotes/S3]] you will see a `bucket` setting that does what you want. You can use `git annex enableremote` to change it. +"""]] diff --git a/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_2_d54a7163cfe9a94b7ba337860958e5c5._comment b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_2_d54a7163cfe9a94b7ba337860958e5c5._comment new file mode 100644 index 000000000..d563d061a --- /dev/null +++ b/doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__/comment_2_d54a7163cfe9a94b7ba337860958e5c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 2" + date="2014-05-16T18:08:11Z" + content=""" +Thanks but I realized there's no way to rename an S3 bucket so giving up on this idea... +"""]] diff --git a/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode.mdwn b/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode.mdwn new file mode 100644 index 000000000..82fc666a0 --- /dev/null +++ b/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode.mdwn @@ -0,0 +1,7 @@ +I am in direct mode (managing music) and have no other repositories than the one I'm in. I would like to delete a file and have git no longer track it at all. + +So far I've manually deleted the file and run "git annex add .", but when I run "git annex status" the file is still marked as deleted. I would like to receive no message whatsoever. + +I tried "git annex drop path" , "git annex unannex path", and everything else I can think of but nothing will get git annex to forget the file. + +I'm sure this is easy, but how do you remove a deleted file in direct mode? diff --git a/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode/comment_1_c6bd2ef90516dde928ff18ded36df625._comment b/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode/comment_1_c6bd2ef90516dde928ff18ded36df625._comment new file mode 100644 index 000000000..9b5881ad6 --- /dev/null +++ b/doc/forum/How_to_completely_remove_tracking_of_a_deleted_file_in_direct_mode/comment_1_c6bd2ef90516dde928ff18ded36df625._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-07-02T16:57:46Z" + content=""" +git annex sync +"""]] diff --git a/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__.mdwn b/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__.mdwn new file mode 100644 index 000000000..0e72582d3 --- /dev/null +++ b/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__.mdwn @@ -0,0 +1,14 @@ +Hello, + +I want to be safe and have two copies of my files on two different backend. Currently I only have a SSH backend, that stores all my data. I have full(root) access to that machine/backend. On my laptop I have only a few bytes of data, because all is moved/copied to that SSH backend. Now, I want to duplicate the data on the SSH backend to a Google Drive account (or any other). How could I do that (without downloading all data from the SSH backend)??? Encryption is not a must. + +I looked into the annex/objects folder on the SSH backend, but there are 3 char length directories compared to what I see on a test Google Drive backend, where only 2 char length directory names are. + +Example SSH backend: [git-annex root]/annex/objects/c10/90a/SHA256E-s445227--14c3f85d6dd3464f116f6a5bbd411012781d36794549d136b18d1914c4158820.jpg/SHA256E-s445227--14c3f85d6dd3464f116f6a5bbd411012781d36794549d136b18d1914c4158820.jpg + +Example Google Drive: [Google Drive root]/annex/W7/xQ/SHA256E-s913904--29f9800b0dd34d4200c4e9ee152b79c3556a9a473848720be7cf83d20eff65a4.JPG + +Is there a way to convert these directory names and do a simpe copy??? + +Thank you, +Bence diff --git a/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__/comment_1_7973928b1aa9e0fcfeb6bf80885441f5._comment b/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__/comment_1_7973928b1aa9e0fcfeb6bf80885441f5._comment new file mode 100644 index 000000000..3c7d07258 --- /dev/null +++ b/doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__/comment_1_7973928b1aa9e0fcfeb6bf80885441f5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.251.174" + subject="comment 1" + date="2013-09-07T17:11:03Z" + content=""" +Just run `git annex copy --all --to remote` + +(Needs git-annex 4.20130709 or newer.) +"""]] diff --git a/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn b/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn new file mode 100644 index 000000000..576d598dd --- /dev/null +++ b/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn @@ -0,0 +1,3 @@ +I use git annex in direct mode and I have renamed a file. What should I do to make git annex understand that the file has just been renamed and not deleted/added? + +The file I renamed is quite big and I would like to avoid having to copy it again to the remotes and I would also like to avoid having to redownload it again in all the repositories. diff --git a/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__/comment_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment b/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__/comment_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment new file mode 100644 index 000000000..6f452acb8 --- /dev/null +++ b/doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__/comment_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:14:18Z" + content=""" +You don't have to do anything special, git-annex automatically detects when a file has been renamed. + +Just `git annex` add the new file, and commit and sync like usual. +"""]] diff --git a/doc/forum/How_to_debug_failing_sync.mdwn b/doc/forum/How_to_debug_failing_sync.mdwn new file mode 100644 index 000000000..ad18aeb55 --- /dev/null +++ b/doc/forum/How_to_debug_failing_sync.mdwn @@ -0,0 +1,5 @@ +I've got a remote I setup while connected to my home network that is no longer syncing when I'm on the same network. I'm not sure how to debug the problem. Any tips? + +I will say that when I edit the repository in the assistant, the url it gives for the "git repository location at" field looks incorrect. It's got an extra "git-annex-" prepended to the hostname. I'm not sure how to alter that. + +I'm using version 5.20140517~bpo70+1, from the wheezy backports. diff --git a/doc/forum/How_to_debug_failing_sync/comment_1_a597b868182e55e5f39394f154740534._comment b/doc/forum/How_to_debug_failing_sync/comment_1_a597b868182e55e5f39394f154740534._comment new file mode 100644 index 000000000..2d89ecda3 --- /dev/null +++ b/doc/forum/How_to_debug_failing_sync/comment_1_a597b868182e55e5f39394f154740534._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-29T18:15:12Z" + content=""" +That extra git-annex- prefix is used in ~/.ssh/config to set up the ssh keys for the repository. So it's normal. + +I suggest that you try running git-annex sync at the command line and paste the output so we can see how it fails. +"""]] diff --git a/doc/forum/How_to_debug_failing_sync/comment_2_db0a5652d76e4e568a4d7808195bc59c._comment b/doc/forum/How_to_debug_failing_sync/comment_2_db0a5652d76e4e568a4d7808195bc59c._comment new file mode 100644 index 000000000..bf707ecb1 --- /dev/null +++ b/doc/forum/How_to_debug_failing_sync/comment_2_db0a5652d76e4e568a4d7808195bc59c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="go8ose" + ip="59.167.191.61" + subject="comment 2" + date="2014-05-30T10:28:38Z" + content=""" +I was shown a password prompt for the remote. Then I realised I was controlling my ~/.ssh/authorized_keys file with puppet, which would have removed the public key that annex would have added to that file. I'm sure that once I fix that up, I'll get it working again. + +Thanks for the CLI suggestion. +"""]] diff --git a/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__.mdwn b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__.mdwn new file mode 100644 index 000000000..7b8e1a0ba --- /dev/null +++ b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__.mdwn @@ -0,0 +1,7 @@ +I'm using git-annex to manage my files. Some of my remotes are available using 2 or 3 methods, for example ssh and nfs, but the nfs access is only possible on my local network, of course. Then, git-annex chooses the fastest method to sync or get the files (nfs, if available, ssh instead, using scores to choose). For now, I define a remote per repository and per access method (example: server-by-ssh, server-by-nfs), but that's not a really git-annex way to do the job, as it is not compliant with the numcopies option, which ckecks that the files in the annex are kept with enough replications (with my current method, many remotes are in fact the same folders on a hard drive). + +Then, my question applies to both git and git-annex, since the remotes are added in git, not git-annex: I wonder if it is possible to define alternative url for a given remote. + +I have tried to use the git remote set --url --add command, but it doesn't really work as I would expect. Indeed, if the nfs url is not reachable, git hangs up and waits. + +Any idea? diff --git a/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_1_52918b5ec25e55837215439fe1bb1a14._comment b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_1_52918b5ec25e55837215439fe1bb1a14._comment new file mode 100644 index 000000000..5bafa57d9 --- /dev/null +++ b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_1_52918b5ec25e55837215439fe1bb1a14._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-08-21T12:42:16Z" + content=""" +I don't think having multiple remotes for the same repository confuses git-annex since it uses the UUID not the url to identify them. +"""]] diff --git a/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment new file mode 100644 index 000000000..859804678 --- /dev/null +++ b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.29" + subject="Justin is right" + date="2012-08-21T15:57:46Z" + content=""" +git-annex doesn't care how many git remotes you have pointing to a given repo, that repo's uuid still only counts as one copy. +"""]] diff --git a/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_3_48c3a80c14a85f27d742482b2ccbe628._comment b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_3_48c3a80c14a85f27d742482b2ccbe628._comment new file mode 100644 index 000000000..7a0054c49 --- /dev/null +++ b/doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_3_48c3a80c14a85f27d742482b2ccbe628._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/speredenn#aaf38" + nickname="Jean-Baptiste Carré" + subject="comment 3" + date="2012-08-21T18:15:48Z" + content=""" +You're totally right: The UUIDs are the same. So it shouldn't matter if there are many repositories pointing to the same folder, as you state it. Thanks a lot! +"""]] diff --git a/doc/forum/How_to_delete_a_remote__63__.mdwn b/doc/forum/How_to_delete_a_remote__63__.mdwn new file mode 100644 index 000000000..6aebaf5f5 --- /dev/null +++ b/doc/forum/How_to_delete_a_remote__63__.mdwn @@ -0,0 +1 @@ +I have a repository with an S3 remote named `cloud`. I now no longer want to use that remote. I've dropped all the data from it (`git annex drop . --from cloud`). How do I tell my repository to forget about the remote? diff --git a/doc/forum/How_to_delete_a_remote__63__/comment_1_8cba186bb67079ff41bf6d0b04613f4a._comment b/doc/forum/How_to_delete_a_remote__63__/comment_1_8cba186bb67079ff41bf6d0b04613f4a._comment new file mode 100644 index 000000000..e60eb3d5d --- /dev/null +++ b/doc/forum/How_to_delete_a_remote__63__/comment_1_8cba186bb67079ff41bf6d0b04613f4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="You can set the trust to "dead"" + date="2013-01-23T19:02:22Z" + content=""" +Simple answer: You can't fully delete a remote - with annex commands. You can mark it as dead. + +You can give this a try as a workaround: [[Truly_purging_dead_repositories/#comment-51ab797094f4c07bf5327fd21cad5835]] +"""]] diff --git a/doc/forum/How_to_delete_a_remote__63__/comment_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment b/doc/forum/How_to_delete_a_remote__63__/comment_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment new file mode 100644 index 000000000..2866710c8 --- /dev/null +++ b/doc/forum/How_to_delete_a_remote__63__/comment_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 2" + date="2013-09-04T06:43:26Z" + content=""" +Recently git-annex has gotten the ability to do this: `git annex forget --drop-dead` + +That prunes all history relating to all dead remotes. You need to be running a git-annex that supports this on all computers you use the repos on, or the pruned history will get merged back in. + +I don't recommend doing this just because you want to \"clean history\". Think of it as something you can do at some point in the future if the .git/objects somehow gets too large or too slow. Put off deleting data until tomorrow if you don't absolutely need to do it today. +"""]] diff --git a/doc/forum/How_to_delete_a_remote__63__/comment_3_e9c5508092ca2983f458b16bf1e07082._comment b/doc/forum/How_to_delete_a_remote__63__/comment_3_e9c5508092ca2983f458b16bf1e07082._comment new file mode 100644 index 000000000..337ef2efe --- /dev/null +++ b/doc/forum/How_to_delete_a_remote__63__/comment_3_e9c5508092ca2983f458b16bf1e07082._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="konubinix" + ip="82.243.233.186" + subject="Dropping dead repositories" + date="2013-09-04T07:40:22Z" + content=""" +Actually, it may be a good idea to remove repositories made for tests purposes. + +I now have 2 dead repositories that are USB_test1 and USB_test2 that I created before knowing I could reuse the annex uuid. + +They are now there and it is difficult to remove them. + +For that special case, the --drop-dead feature is very welcome. +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4.mdwn b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4.mdwn new file mode 100644 index 000000000..c67d4e77f --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4.mdwn @@ -0,0 +1,28 @@ +Git annex is really amazing software, and this cute little scenario is actually Linux's fault. But it's a nasty situation nonetheless, and worth passing on. + +... + +Create a client repository on your laptop and two backup repositories on external USB drives. Keep all repositories mounted and connected. Now drop 60GB of data spread over 30,000 files into your annex, and watch git annex assistant start adding and syncing. So far, so good. + +Now wait a few hours, and watch some kernel crypto code—probably ecryptfs—fall over with a segfault. + +Since your laptop and USB drives are all running ext4, the sudden kernel panic will leave you with hundreds of 0-length files. Because git annex assistant was busily adding and syncing files, those 0-length files are spread randomly throughout all your git repositories (typically in `.git/objects`) and throughout all the associated annexes. Unfortunately, because `git annex assistant` generates _tons_ of commits, this is pretty much unrecoverable using standard git tools unless you're willing to get deep into the repositories' internals. + +So what should you do, if you want to add 10s of 1000s of files and there's some risk of kernel panic or accidentally bumping a USB cable? Here's my recommendation to limit the damage: + +1. Use the command line if possible. +2. Add all your files with your remotes offline. +3. Run `git gc` on your central repository, just on general principals. +4. Mount one repository at a time. +5. Sync the pure git data first, and then make sure that all disk I/O is flushed (`sync; sleep 10` is a good approximation). +6. Use `git annex copy --to` to move the annex data. +7. Unmount the USB repository cleanly and move onto the next one. + +If you _do_ bump a USB cable in the middle of step (6), then: + +1. Run 'git annex fsck' to clean up any garbage files. +2. Try another 'git annex copy --to' where you left off. + +Wiser minds than I are encouraged to suggest optimizations for the recovery steps. + +The theory behind these steps is to only do one thing at a time, and to expose as few remotes as possible to a power failure or crash. A secondary goal is to make sure that pure git operations complete very quickly, limiting the risk that they will be interrupted, because they're the hardest operations to recover from after a crash. diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_1_42ca6cfbbb79fe63514805b8119ac16b._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_1_42ca6cfbbb79fe63514805b8119ac16b._comment new file mode 100644 index 000000000..f6d8396b7 --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_1_42ca6cfbbb79fe63514805b8119ac16b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-07-23T14:45:05Z" + content=""" +It seems to me that it would be better to avoid using kernel features that crash. And, set up a git repository on another machine, which will serve as a real backup if something goes catostrophically wrong. The only potential failure mode then would be if a kernel/hardware issue zeroed some of your files, in direct mode the assistant might commit those new corrupt files and ship them over to the backup. But, if your offsite backup is accumulating old versions of files, you can recover from this by reverting the bad commit. +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_2_c94ce6a9767c624e2445a7d9eea40396._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_2_c94ce6a9767c624e2445a7d9eea40396._comment new file mode 100644 index 000000000..347a95539 --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_2_c94ce6a9767c624e2445a7d9eea40396._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="Well, this is the first time it ever panicked" + date="2013-07-23T16:32:10Z" + content=""" +Well, it's not like my machine kernel panics on a regular basis or anything. :-) This is the first time I ever saw the kernel encryption code do this. I'm running a boring stock install of Ubuntu 12.04 LTS that was preloaded by ZaReason, and I'm using the ecryptfs home directory encryption supplied by Ubuntu. So in this case, \"stop using kernel features that crash\" means \"stop using Ubuntu on supported hardware.\" + +The underlying problem is that ext4 allocates file contents lazily and out-of-order, and it may wait a surprisingly long time before actually flushing data to disk: + +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/317781 +http://linux.bihlman.com/2010/learn-linux-help/how-to-solve-zero-length-file-problem-in-linuxs-ext4-file-system/ + +The problem is that `git annex assistant` and `git` don't sync the disks all that often, and that the assistant can generate huge amounts of complicated disk I/O across multiple volumes for hours on end. All you need to do is go through the walkthrough, create the specified repositories including one on a USB drive, and throw 50GB of data into the annex directory. `git annex assistant` will happily grind away overnight, and it anything prevents ext4 from flushing data, there's a good chance you'll wind up with multiple corrupted repositories with hundreds of `git fsck` errors. + +There are some potential workarounds: + +1. Reconfigure ext4 to run in data write-back mode. This isn't really possible for non-technical users, but it's an excellent idea for large external USB drives. +2. Somehow convince `git` and `git annex assistant` to call `sync` or `fsync` more aggressively on local volumes. +3. Use a remote server for at least one remote, as you suggested. +4. Operate on the repository manually, so that you can ensure that `git`'s data is in a known-good state before trying to copy the annex files. The +annex files are much easier to recover than git's state. + +Anyway, I doubt this is really fixable. And it's not really `git annex`'s fault, in any case. But I'm really glad I had recent backups of all my data last night, which allowed me to checksum everything and start from scratch. + +... + +Leaving aside this incident, `git annex` is one of the nicest pieces of open source software I've seen in a long time, and it's clearly going to change how I use my computer. And thank you for posting the crowd-funding campaign so we can say \"Thanks!\" +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_3_bcda51053b62bbb20ce71a59469e1b26._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_3_bcda51053b62bbb20ce71a59469e1b26._comment new file mode 100644 index 000000000..5cf8c93f3 --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_3_bcda51053b62bbb20ce71a59469e1b26._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2013-07-23T17:17:43Z" + content=""" +`git config core.fsyncobjectfiles true` + +This will make git fsync all the data it writes. Whether it's a good default, I don't know. +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_4_48e5b9eae920e5f13812de8d6f6bc640._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_4_48e5b9eae920e5f13812de8d6f6bc640._comment new file mode 100644 index 000000000..2bac2ca1b --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_4_48e5b9eae920e5f13812de8d6f6bc640._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-07-23T17:38:50Z" + content=""" +I have made the assistant enable the fsync option when it creates a repository on a removable drive. That is, at least in my experience, the thing that most likely needs it. I don't know if it would have saved you in your situation or not. +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_5_787c0bfdc1d309db1486c3a37723a957._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_5_787c0bfdc1d309db1486c3a37723a957._comment new file mode 100644 index 000000000..dd40495ca --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_5_787c0bfdc1d309db1486c3a37723a957._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 5" + date="2013-07-23T17:39:42Z" + content=""" +Oh i've had that type of crash from ecryptfs many times over many different versions of Ubuntu, also before i even encountered git-annex. + +Git-annex might provoke this issue, but it is by no means the only thing that can crash your system when running ecryptfs. + +I highly suggest you try LUKS for a stable experience. + +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_6_8894beb06443f234e9200b03b5f3badf._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_6_8894beb06443f234e9200b03b5f3badf._comment new file mode 100644 index 000000000..149998aaf --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_6_8894beb06443f234e9200b03b5f3badf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 6" + date="2013-07-23T17:54:00Z" + content=""" +If there's an easy way to detect when a directory is inside an ecryptfs volume, I'd be happy to make the assistant automatically enable fsync on it. ;) +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_7_457f62ee3e58f68a55f66c5bde6002fd._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_7_457f62ee3e58f68a55f66c5bde6002fd._comment new file mode 100644 index 000000000..8f545e2eb --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_7_457f62ee3e58f68a55f66c5bde6002fd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="Thank you!" + date="2013-07-23T18:36:22Z" + content=""" +What good idea! I've turned on `core.fsyncobjectfiles`. This should definitely help avoid the worst damage when ext4 filesystems get unmounted while dirty. Thank you very much for addressing this issue so quickly, even if though has more to do with ext4 than git annex. + +develop: Thank you for the suggestion to use LUKS; that's good to know. +"""]] diff --git a/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_8_bd2b412116a66107bc0ff0efd7e39a58._comment b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_8_bd2b412116a66107bc0ff0efd7e39a58._comment new file mode 100644 index 000000000..0d09a9652 --- /dev/null +++ b/doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_8_bd2b412116a66107bc0ff0efd7e39a58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="Detecting ecryptfs" + date="2013-07-23T18:49:08Z" + content=""" +If the string `\" ecryptfs \"` (with surrounding spaces) appears in `/etc/mtab`, then there's at least one ecryptfs volume on the system. More specific parsing will tell you where it's mounted. + +Ubuntu released a new kernels fixing the worst ecryptfs bugs in 12.04 LTS. The current version is OK, but perhaps not exactly great. Some older versions are public menaces with awful data corruption bugs. +"""]] diff --git a/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn new file mode 100644 index 000000000..f06135c24 --- /dev/null +++ b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn @@ -0,0 +1,7 @@ +My annex contains several large files that I have unlocked, edited, and committed again, i.e. the annex contains the version history of those files. However, I don't want the history -- keeping the latest version is good enough for me. Running `git annex unused` won't detect those old versions, though, because they aren't unused as old Git revisions still refer to them. So I wonder: + +1. What is the best way to get rid of the old versions of files in the annex? + +2. What is the best way to detect old versions of files in the annex? + +I guess, I could run `git rebase -i` to squash commits to those files into one commit, thereby getting rid of the references to the old copies, but that approach feels awkward and error prone. Is anyone aware of a better way? diff --git a/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment new file mode 100644 index 000000000..ee4fe2e6c --- /dev/null +++ b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.186.179.173" + subject="comment 1" + date="2012-02-09T18:53:00Z" + content=""" +Sorry for commmenting on my own question ... I think I just figured out that `git annex unused` *does* in fact do what I want. When I tried it, it just didn't show the obsolete versions of the files I edited because I hadn't yet synchronized all repositories, so that was why the obsolete versions were still considered used. +"""]] diff --git a/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_2_5710294c1c8652c12b6df2233255a45e._comment b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_2_5710294c1c8652c12b6df2233255a45e._comment new file mode 100644 index 000000000..576093a87 --- /dev/null +++ b/doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_2_5710294c1c8652c12b6df2233255a45e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-02-09T19:42:28Z" + content=""" +Yes, contents are still considered used while tags or refs refer to them. Including remote tracking branches like `remotes/origin/master` +"""]] diff --git a/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__.mdwn b/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__.mdwn new file mode 100644 index 000000000..d5aa71b44 --- /dev/null +++ b/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__.mdwn @@ -0,0 +1,54 @@ +I've done a `git annex add` and `git commit` on my annex which included some files I don't want to add to the annex. I've tried to reverse it all out, but whenever I `git annex add` something, the unwanted files show up in the git-annex branch. + + git init forgetmenot + cd forgetmenot + git commit -m "create" --allow-empty + git annex init fmn + + echo 'foo' > foo + echo 'bar' > bar + + git annex add + git commit -m "add foo" + + git log --oneline --name-only + # 28634c0 add foo + # bar + # foo + # 4a87050 create + + git log --oneline --name-only git-annex + 74e6969 update + 41d/a26/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c.log + a70/4a5/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730.log + 95285ed update + uuid.log + 2135e07 branch created + +If you now try to get git-annex to forget by reverting *master* and *git-annex* and only adding/commiting *foo*, the master branch ends up correct, but git-annex magically remembers *bar*! + + git reset --hard HEAD^ + git branch -f git-annex git-annex^ + + echo 'foo' > foo + git annex add + git commit -m "add foo" + + git log --oneline --name-only + # 1b4889e add foo + # foo + # 4a87050 create + + git log --oneline --name-only git-annex + # 3d0b9bc update + # 41d/a26/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c.log + # a70/4a5/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730.log + # 2e17a19 update + # uuid.log + # 646776b branch created + +How is git-annex remembering this and how can I get it to completely forget? + +I have tried `git gc --aggressive --prune=all`, `git annex fsck --all` and `git annex drop unused` but somehow, git-annex is remembering bar existed. + +This is an exercise in micro-managing the git-annex branch a bit, but this situation does also cause git-annex to complain about the missing files on fsck (0 out of 2 copies) so it isn't just being a control freak! Honest! :) diff --git a/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__/comment_1_65471c42e163ac8ee6ec109f1397271b._comment b/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__/comment_1_65471c42e163ac8ee6ec109f1397271b._comment new file mode 100644 index 000000000..44b36ba60 --- /dev/null +++ b/doc/forum/How_to_get_git-annex_to_forget_a_commit__63__/comment_1_65471c42e163ac8ee6ec109f1397271b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="CandyAngel" + ip="81.111.193.130" + subject="comment 1" + date="2014-07-17T15:43:03Z" + content=""" +Joey has pointed me to the solution. + +git-annex was remembering these files due to them being present in *.git/annex/index*. + +A simple `rm .git/annex/index` after moving the git-annex branch to the earlier commit prevents the \"ghost\" log files from being recreated and Joey confirmed this is safe to do (git-annex automatically recreates it). +"""]] diff --git a/doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn b/doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn new file mode 100644 index 000000000..49c732e22 --- /dev/null +++ b/doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn @@ -0,0 +1,5 @@ +Hi! + +When I update one repository to/from another, am I to push/pull only the master branch (and other branches I'd have created myself) or also the git-annex branch? + +From what I understand, the git-annex branch is local to one repository and has no interest in being merged in another, but some examples make use of git pull --all (which merges distant git-annex branch into local). diff --git a/doc/forum/How_to_handle_the_git-annex_branch__63__/comment_1_800bd55b322e72f229882d7fd3888b14._comment b/doc/forum/How_to_handle_the_git-annex_branch__63__/comment_1_800bd55b322e72f229882d7fd3888b14._comment new file mode 100644 index 000000000..6c5a5144f --- /dev/null +++ b/doc/forum/How_to_handle_the_git-annex_branch__63__/comment_1_800bd55b322e72f229882d7fd3888b14._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-04-10T16:05:40Z" + content=""" +The git-annex branch is how the annex information for the different repositories is communicated around, so yes, you need to push/pull it. +"""]] diff --git a/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn new file mode 100644 index 000000000..48ad2d1d8 --- /dev/null +++ b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn @@ -0,0 +1,3 @@ +I have git-annex set up with three clients and a transfer repository and everything was working fine, but a couple of days ago I noticed that git-annex was starting to upload to the transfer repository files that where already present on the three clients, and it hasn't stopped since. It's uploading all my files and I don't really know why. + +Is there a way to know why does git-annex think it needs to upload this files? diff --git a/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment new file mode 100644 index 000000000..6cf5541e8 --- /dev/null +++ b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:46:30Z" + content=""" +A few likely reasons: + +* If a 4th client repository had popped up. +* If you have configured a high number of copies, it might only be able to be met by keeping files on the transfer repository. +* Similarly, if a repository that used to have the files has been marked as dead or deleted, more copies might be needed to make up for that. +* For completeness, if the transfer repository accidentially had its type changed to some other kind of repository, like a full backup. + +You can enable debugging (start with --debug or go into the webapp's preferences) and it might say a little more, but the debugging info is not very good. + +The best thing is probably to look at one single file, use `git annex whereis` on the file to see what repositories contain it, and then think about how that interacts with the [[preferred_content_expression_of_the_transfer_repository|preferred_content/standard_groups]]. +"""]] diff --git a/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment new file mode 100644 index 000000000..27f158ea1 --- /dev/null +++ b/doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2014-04-01T08:01:00Z" + content=""" +I thought I had already checked all does possibilities, the repositories where in the correct group and no new repositories had been added. *git annex info* didn't show anything weird and nor did *git annex whereis*. I finally found out *git annex vicfg* and I found two new repositories with no name in the repository groups. It looked something like this: + + # (for ) + group repository-hash = client + # (for ) + group repository-hash = client + + +No idea of how they got there, but setting both of them to unwanted solved the issue. +"""]] diff --git a/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn b/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn new file mode 100644 index 000000000..b39e69d7b --- /dev/null +++ b/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn @@ -0,0 +1,5 @@ +Hi, + +In normal maven release procedure, it re-clones the gitrepo from the tag to do the release from either git or local file, But as git-annex uses symlinks when the repo is clones by maven, it misses the files. Any recommendations how i can make this work ? + +Also would love some data on who is using git-annex in production environment would be good. diff --git a/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__/comment_1_9298aa55771b68873de02e6a7964bbdc._comment b/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__/comment_1_9298aa55771b68873de02e6a7964bbdc._comment new file mode 100644 index 000000000..ca62bd43e --- /dev/null +++ b/doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__/comment_1_9298aa55771b68873de02e6a7964bbdc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T18:20:53Z" + content=""" +If you can find a way to run `git annex get` in the cloned repo, it will copy over the files. Perhaps there is some way to make Maven do that via a hook script or similar? +"""]] diff --git a/doc/forum/How_to_make_a_server_store_the_files.mdwn b/doc/forum/How_to_make_a_server_store_the_files.mdwn new file mode 100644 index 000000000..1af29381f --- /dev/null +++ b/doc/forum/How_to_make_a_server_store_the_files.mdwn @@ -0,0 +1 @@ +How can I make one of my servers keep a copy of the files on the server, so I can easily SFTP in and download the files. I don't want to see the .git folder, I want to see the files synced there. diff --git a/doc/forum/How_to_make_a_server_store_the_files/comment_1_20196067475918e788afa0debc4d5ce5._comment b/doc/forum/How_to_make_a_server_store_the_files/comment_1_20196067475918e788afa0debc4d5ce5._comment new file mode 100644 index 000000000..e65388163 --- /dev/null +++ b/doc/forum/How_to_make_a_server_store_the_files/comment_1_20196067475918e788afa0debc4d5ce5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-07-02T17:18:00Z" + content=""" +Make a non-bare git repository on the server, and make it have a git post-receive hook that runs +\"git annex merge\" +"""]] diff --git a/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn new file mode 100644 index 000000000..1b1ddff46 --- /dev/null +++ b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn @@ -0,0 +1,9 @@ +I have a repository on my laptop with a single remote on a USB drive. Both were created without the assistant. + +The remote holds all the content. My understanding is that this would be a "backup" repository, using the group definitions. + +The local repository generally holds no content. When I want a file, I make sure the remote is available, and then I `git annex get` it. + +This works fine in git annex, but I'm now experimenting with the assistant. As soon as I fire up the assistant, it starts downloading all of the data from the remote. I don't ever want it to automatically get any content from the remote. If it sees new content in the repository, I would like it to push that out to the remote. But never get anything from the remote, and never drop anything that is in the repository. + +How can I setup this behaviour in the assistant? I have set the remote's repository group to "backup". The local repository is not in any group, since none of the groups fit my model for this repo. diff --git a/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_1_fd8b287758ad77b3527ae71017cffabf._comment b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_1_fd8b287758ad77b3527ae71017cffabf._comment new file mode 100644 index 000000000..326158d95 --- /dev/null +++ b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_1_fd8b287758ad77b3527ae71017cffabf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-01-20T08:11:37Z" + content=""" +Run 'git annex vicfg', locate the preferred content setting for your repository, uncomment it and set it to 'present'. Then it shouldn't move content automatically. +"""]] diff --git a/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_2_e8e75b4451aaf55461edf2f3d68797ed._comment b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_2_e8e75b4451aaf55461edf2f3d68797ed._comment new file mode 100644 index 000000000..790567eca --- /dev/null +++ b/doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_2_e8e75b4451aaf55461edf2f3d68797ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-01-24T02:01:00Z" + content=""" +A recent commit allows you to just choose \"manual mode\" in the webapp to get the same effect. +"""]] diff --git a/doc/forum/How_to_rename_a_remote__63__.mdwn b/doc/forum/How_to_rename_a_remote__63__.mdwn new file mode 100644 index 000000000..be2355a07 --- /dev/null +++ b/doc/forum/How_to_rename_a_remote__63__.mdwn @@ -0,0 +1 @@ +I recently created WebDAV remote to my annex which I assumed to be just for testing purposes at the time, so I gave it a strange and long-wided name. It turned out, though, that the remote is stable, works fine, and that I'm going to keep it. Now, I would like to give it a snappier and more descriptive name than the one I originally chose. Is that possible somehow? diff --git a/doc/forum/How_to_rename_a_remote__63__/comment_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment b/doc/forum/How_to_rename_a_remote__63__/comment_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment new file mode 100644 index 000000000..31f44c8f6 --- /dev/null +++ b/doc/forum/How_to_rename_a_remote__63__/comment_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 1" + date="2013-01-18T18:20:43Z" + content=""" +You can rename a git remote with just \"git remote rename \". However, for a special remote, git-remote will fail to rename it unless you first add a dummy remote..fetch value in .git/config. You can remove it later. + +So, for example: + +
+git config remote.$uglyname.fetch dummy
+git remote rename $uglyname $nicename
+git config remote.$nicename.fetch \"\"
+
+ +(The webapp handles doing this when you edit a remote's name, BTW.) + +--- + +There's actually another place the name of a special remote is recorded, in `remote.log`. That name is only used when you use `git annex initremote` though. It actually is possible to change it, by using `initremote` to change the vale of the name field. Example: + +
+git annex initremote $uglyname name=$newname
+
+ +Note that for some types of special remotes, this will require you to re-specify some other configuration. For example, with a directory special remote, it wanted me to include a directory= parameter. +"""]] diff --git a/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__.mdwn b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__.mdwn new file mode 100644 index 000000000..a21d6d6d2 --- /dev/null +++ b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__.mdwn @@ -0,0 +1,65 @@ +I have just done a sync in a direct mode repo: + + git-annex sync sshremote + +It has quite a few conflicts (both sides adding the same file with same content). But somehow the merge won't conclude. Here's some log: + + $ git-annex sync sshremote + commit ok + pull sshremote + warning: no common commits + remote: Counting objects: 32162, done. + remote: Compressing objects: 100% (31192/31192), done. + remote: Total 32162 (delta 3), reused 32162 (delta 3) + Receiving objects: 100% (32162/32162), 3.39 MiB | 1.61 MiB/s, done. + Resolving deltas: 100% (3/3), done. + From sshremote:/repo + * [new branch] annex/direct/master -> sshremote/annex/direct/master + * [new branch] git-annex -> sshremote/git-annex + * [new branch] master -> sshremote/master + * [new branch] synced/master -> sshremote/synced/master + + Auto-merging file1 + CONFLICT (add/add): Merge conflict in file1 + Auto-merging file2 + CONFLICT (add/add): Merge conflict in file2 + Auto-merging file3 + CONFLICT (add/add): Merge conflict in file3 + Auto-merging file4 + CONFLICT (add/add): Merge conflict in file4 + Automatic merge failed; fix conflicts and then commit the result. + file1: needs merge + file2: needs merge + file3: needs merge + file4: needs merge + ^C + +I waited for a few minutes, and checked that both cpu and disk activity is near zero on both server. So I interrupted it, thinking it might be some locking issue. + +But now I cannot sync with the remote anymore because the merge is still in process. How should I resolve the conflicts? I could do it manually if I cannot use annex's auto merge. + + $ git-annex sync sshremote + commit ok + pull sshremote + + fatal: You have not concluded your merge (MERGE_HEAD exists). + Please, commit your changes before you can merge. + + fatal: You have not concluded your merge (MERGE_HEAD exists). + Please, commit your changes before you can merge. + failed + + $ git merge --abort + fatal: This operation must be run in a work tree + +Update: this is running on OSX with: + + git-annex version: 5.20131221-g00d1673 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + diff --git a/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_1_8e2a14842b44844f90c80b862a1b3a6d._comment b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_1_8e2a14842b44844f90c80b862a1b3a6d._comment new file mode 100644 index 000000000..3b1383376 --- /dev/null +++ b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_1_8e2a14842b44844f90c80b862a1b3a6d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T20:31:21Z" + content=""" +I think you can fix at least the immediate problem by deleting the .git/MERGE_HEAD file. + + +"""]] diff --git a/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment new file mode 100644 index 000000000..d8c4ded89 --- /dev/null +++ b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYmMFDdf3GJ9Oba6NCVkzGc4JyB9WavMs" + nickname="Xinruo" + subject="Thanks" + date="2014-01-02T00:41:27Z" + content=""" +That did the trick! +"""]] diff --git a/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_3_93f20519483837c59a75821621e22dee._comment b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_3_93f20519483837c59a75821621e22dee._comment new file mode 100644 index 000000000..7cfc2a7f2 --- /dev/null +++ b/doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_3_93f20519483837c59a75821621e22dee._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2014-01-02T02:05:05Z" + content=""" +AFAICS, git-merge was still running when you ctrl-c'd it. So this is coming before git-annex processes the merge to update the work tree. + +I don't know why it would take so long to run, especially if it was not using CPU or disk. You might try to reproduce the problem, passing --debug to git-annex, and perhaps strace the git-merge process to see what it's doing. +"""]] diff --git a/doc/forum/How_to_restore_symlinks.mdwn b/doc/forum/How_to_restore_symlinks.mdwn new file mode 100644 index 000000000..30fb07001 --- /dev/null +++ b/doc/forum/How_to_restore_symlinks.mdwn @@ -0,0 +1 @@ +Somehow the symlinks have vanished from one directory of my repository. How can I restore them? diff --git a/doc/forum/How_to_restore_symlinks/comment_1_c67e752cf7d5431096fab4b3304790a7._comment b/doc/forum/How_to_restore_symlinks/comment_1_c67e752cf7d5431096fab4b3304790a7._comment new file mode 100644 index 000000000..d9e14dd16 --- /dev/null +++ b/doc/forum/How_to_restore_symlinks/comment_1_c67e752cf7d5431096fab4b3304790a7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="git annex fix" + date="2012-11-24T08:51:19Z" + content=""" +You can try + git annex fix yourDirectory + +Hope that helps. +"""]] diff --git a/doc/forum/How_to_restore_symlinks/comment_2_f9ec6096595e2c149c48924e3b54542f._comment b/doc/forum/How_to_restore_symlinks/comment_2_f9ec6096595e2c149c48924e3b54542f._comment new file mode 100644 index 000000000..689f32126 --- /dev/null +++ b/doc/forum/How_to_restore_symlinks/comment_2_f9ec6096595e2c149c48924e3b54542f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 2" + date="2012-11-25T18:35:56Z" + content=""" +The key thing to realize is that the symlinks used by git-annex are checked into git like any other file would be. So you can use the entire git toolkit to manage them. + +For example, you could run `git status` to see if git shows them as recently deleted, and then use `git checkout $file` to restore the deleted files. + +Or perhaps the deletion has been committed to git, and then you'd use `git log --stat` to find the commit that deleted your files, and `git revert` could be used to undo it. + +(`git annex fix` is not related to this and won't help.) +"""]] diff --git a/doc/forum/How_to_restore_symlinks/comment_3_4ff80729787a2a4e2baf05dd1db37da3._comment b/doc/forum/How_to_restore_symlinks/comment_3_4ff80729787a2a4e2baf05dd1db37da3._comment new file mode 100644 index 000000000..ce0be74b0 --- /dev/null +++ b/doc/forum/How_to_restore_symlinks/comment_3_4ff80729787a2a4e2baf05dd1db37da3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="jbee" + ip="178.25.68.205" + subject="Thanks" + date="2012-11-28T11:52:24Z" + content=""" +> deletion has been committed to git, and then you'd use git log --stat to find the commit that deleted your files, and git revert could be used to undo it. + +That did the trick. + +Thanks Joey, for the answer and the magnificence that is git-annex. +"""]] diff --git a/doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn b/doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn new file mode 100644 index 000000000..981a53ba0 --- /dev/null +++ b/doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn @@ -0,0 +1,5 @@ +I worked out how to retroactively annex a large file that had been checked into a git repo some time ago. I thought this might be useful for others, so I am posting it here. + +> This is a great tip, so I've moved it to +> [[tips|tips/How_to_retroactively_annex_a_file_already_in_a_git_repo]]. +> --[[Joey]] diff --git a/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__.mdwn b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__.mdwn new file mode 100644 index 000000000..8ee5eeea5 --- /dev/null +++ b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__.mdwn @@ -0,0 +1,15 @@ +This seems like something that should be completely obvious, but I've been trying to get it working for a while without success. + +I have a few machines (at least 3) at different locations. I want them all to be synced with a remote server that I have. I've installed git-annex on the server, and setting up the assistant on one of the machines, I can create the remote repository, and all seems to work (it spits out info about syncing... though I don't have any easy way of checking if it's working, as all I have is the one client). + +It says in the webapp that setting up a remote git repository in transfer mode will make it easy to have other clients. But I'm wondering how to set that up. I tried just adding the same server with the same path on another machine, but it doesn't seem to be syncing, and I imagine that it is trying to create a fresh repo there instead of syncing with an existing one. + +So, how do I set this up? I don't mind adding git remotes, ssh keys, etc, manually, but I haven't been able to figure out what I should be doing! My end goal is to have one annex that is synced between the many computers (ala Dropbox, as the assistant is supposed to be). + +Note that the configuration of the test machines: +client 1 - debian, git-annex built from current cabal +server - debian, git-annex from apt +client2 - mac osx, git-annex built from current cabal + +Thanks, +Daniel diff --git a/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_1_bedaf308cfc70b9e751914a400ebcbc2._comment b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_1_bedaf308cfc70b9e751914a400ebcbc2._comment new file mode 100644 index 000000000..b6a884aa5 --- /dev/null +++ b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_1_bedaf308cfc70b9e751914a400ebcbc2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-08T21:29:26Z" + content=""" +Just adding the same server with the same path is the right thing to do, it will use the existing repo. + +Probably the problem you're having is that one client doesn't know when the other client has sent data to the server. I've recently been adding XMPP (Jabber) support to deal with that. That is not yet in a released version of git-annex, but it is available in git master. +"""]] diff --git a/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_2_d665b1514253c8aa487ebf8b2728e3b1._comment b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_2_d665b1514253c8aa487ebf8b2728e3b1._comment new file mode 100644 index 000000000..9cb54839f --- /dev/null +++ b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_2_d665b1514253c8aa487ebf8b2728e3b1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlsfh8P7pN2OBr24ztT_7AyYQLCcVqqa-4" + nickname="Daniel" + subject="comment 2" + date="2012-11-09T17:49:32Z" + content=""" +The master is segfaulting on one of my machines (the mac), but XMMP sounds good in general. + +In the meantime - does git annex sync do what the assistant does? Or is there a command to tell the assistant to check for remote changes? (or a way to get it to auto-poll) +"""]] diff --git a/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_3_aef42387a3673ab6710fb23e878d7e17._comment b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_3_aef42387a3673ab6710fb23e878d7e17._comment new file mode 100644 index 000000000..2249c9964 --- /dev/null +++ b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_3_aef42387a3673ab6710fb23e878d7e17._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T17:57:49Z" + content=""" +I recently dealt with a segfault caused by a bug in the haskell gnutls library. It could be that's what you were seeing. It's fixed in gnutls (>= 0.1.4) + +Yes, you can run `git annex sync` by hand. It does the same syncing of the git repository that the assistant does. I don't think making the assistant poll is a good idea. +"""]] diff --git a/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_4_bfbcc041db472f4808979e6b3d7c4be2._comment b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_4_bfbcc041db472f4808979e6b3d7c4be2._comment new file mode 100644 index 000000000..7bd4870a3 --- /dev/null +++ b/doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_4_bfbcc041db472f4808979e6b3d7c4be2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniCRkhl_W87gOK5eElfsef3FoUsUFpAr4" + nickname="Alexandre" + subject="Simplifying this kind of setup" + date="2012-12-10T14:33:08Z" + content=""" +Maybe it is possible to avoid the XMPP account setup and transferring via XMPP, maybe getting notifications through the SSH connection is possible. + +I'm thinking about a \"git-annex-shell server\" unix socket to which clients would connect using the SSH connection and get update notifications from other clients. +"""]] diff --git a/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__.mdwn b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__.mdwn new file mode 100644 index 000000000..91d7a886b --- /dev/null +++ b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__.mdwn @@ -0,0 +1,40 @@ +I have one Annex meant to be kept in sync across two computers by the assistant. These computers can't connect directly, so I use a transfer repository (at rsync.net) and xmpp. Recently the two repositories have started to diverge: files added here do not appear there and vice versa, files modified here are not updated there and vice versa. It may be related to this bug: [[bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport/]] since one of the two installed versions of git-annex is 5.20140117~bpo70+1, but I do not know whether the divergence started the day I upgraded to this version. + +I tried this: + + git-annex fsck --from rsync.net_annex + +on both machines. No error is reported, but files are missing here and there and files differ here and there. + +I stopped the assistant on both machines and tried to sync with: + + git-annex sync + +and got: + + commit + ok + pull 'XXX' + fatal: Unable to find remote helper for 'xmpp' + failed + push 'XXX' + Pushing to XXX failed + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config) + failed + git-annex: sync: 2 failed + +where 'XXX' stands for my jabber account. I then tried: + + git-annex sync rsync.net_annex + +but got: + + git-annex: cannot sync special remotes: rsync.net_annex + + + +This situation is unfortunate because the user is not made aware of anything failing. The assistant is running, the webapp shows files being uploaded to the transfer repository, but the two repositories are actually diverging. + +How can I synchronize these two repositories? + +Thanks, diff --git a/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_1_1c913395f076ee203caaab057da8afbe._comment b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_1_1c913395f076ee203caaab057da8afbe._comment new file mode 100644 index 000000000..7bf458505 --- /dev/null +++ b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_1_1c913395f076ee203caaab057da8afbe._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="downgrading is not an easy option" + date="2014-01-30T05:44:48Z" + content=""" +In order to check whether this is related to [[https://git-annex.branchable.com/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport/]] I tried to downgrade git-annex to the previous version that was available on wheezy-backports (git-annex_4.20131106~bpo70+1_i386.deb) but then I get: + + git-annex: Repository version 5 is not supported. Upgrade git-annex. + failed + + +"""]] diff --git a/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_2_081793c52bf15c74a7f48a67c49ff818._comment b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_2_081793c52bf15c74a7f48a67c49ff818._comment new file mode 100644 index 000000000..8d4d49a77 --- /dev/null +++ b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_2_081793c52bf15c74a7f48a67c49ff818._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="clean up" + date="2014-01-31T19:55:30Z" + content=""" +ok, now that git-annex has been updated to 5.20140117~bpo70+2 things start flowing again, so it was actually caused by [[http://git-annex.branchable.com/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport/]]. Now there is a certain number of files called 'filename.variant.06b8' for instance. That is a bit messy. + +I do not know wheter/how it would be possible to inform the user that something is going wrong, but certainely it would be better to avoid failing completely silently. + +It would be useful if the webapp could give more precise information about the files the assistant is manipulating. For instance: \"now uploading file 'bla', updating version last uploaded from 'remote' on 'date'\". +"""]] diff --git a/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_3_f8e0376beb486cf8ce52384ff511ecf2._comment b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_3_f8e0376beb486cf8ce52384ff511ecf2._comment new file mode 100644 index 000000000..99bfbba0a --- /dev/null +++ b/doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_3_f8e0376beb486cf8ce52384ff511ecf2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 3" + date="2014-02-07T19:07:11Z" + content=""" +Normally the webapp will tell you whenever it fails to sync with a remote. However, in this case, it had XMPP support compiled right out of it, so had no idea that remote even existed, and never tried to sync with it, so had no failure to report. + + +The \".variant\" files are because you must have made files with the same names in the 2 repositories while they were disconnected. +"""]] diff --git a/doc/forum/Howto_remove_a_repository__63__.mdwn b/doc/forum/Howto_remove_a_repository__63__.mdwn new file mode 100644 index 000000000..4eb4e6869 --- /dev/null +++ b/doc/forum/Howto_remove_a_repository__63__.mdwn @@ -0,0 +1,4 @@ +Hello, + +I have added a few repositories for testing purpose and would like to remove them. +Is it possible to remove a repository through assistant? diff --git a/doc/forum/Howto_remove_a_repository__63__/comment_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment b/doc/forum/Howto_remove_a_repository__63__/comment_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment new file mode 100644 index 000000000..642da6575 --- /dev/null +++ b/doc/forum/Howto_remove_a_repository__63__/comment_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-17T19:05:27Z" + content=""" +There's no UI for it in the assistant. [[Relevant bug report|bugs/The_webapp_doesn't_allow_deleting_repositories]] +"""]] diff --git a/doc/forum/Howto_remove_unused_files.mdwn b/doc/forum/Howto_remove_unused_files.mdwn new file mode 100644 index 000000000..db770457b --- /dev/null +++ b/doc/forum/Howto_remove_unused_files.mdwn @@ -0,0 +1,31 @@ +Hello. + +My case: I have somehow managed to get my repo, with quite much stuff inside it messed up. + +There is single directory 'cities' containing quite many files (>10k) that i would rather see gone (and keep the tar.bz version of it ..). I tried doing + + git drop --force + +that works fine, but the files are still there after sync. + +git annex unused says just 'ok' so i guess it thinks they are still used somewhere. I tried to look where, but i ended up just doing git annex drop -f my_remote_here test_file_name for each of my remotes. This doesnt help. +How can i get rid of these files? Doing git annex fsck shows that + + +So, try to search what is the key: + + % ls -lah cities/diskcache/config.cfg + lrwxrwxrwx 1 XX XXX 190 Nov 29 05:52 cities/diskcache/config.cfg -> ../../../../.git/annex/objects/qm/M6/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce + sundberg@sundberg-MS-7680 ~/git-repository/ubuntu.iso/Archive/Maps + % git log --stat --all -SSHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce/SHA256-s32--4f5ce34d1b0b8d854a315530b2fdcbfa9c3067636a2aa5433a04402db4151dce + commit 51a57a023774ff80408210828f298f5c42a7e0be + Author: XXXX + Date: Sun Dec 9 13:42:40 2012 +0200 + git-annex automatic sync + Archive/Maps/cities/diskcache/config.cfg | 1 + + 1 file changed, 1 insertion(+) + +So how can i deduce what is the remote i should try to clean up ? + + +Thanks! diff --git a/doc/forum/Howto_remove_unused_files/comment_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment b/doc/forum/Howto_remove_unused_files/comment_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment new file mode 100644 index 000000000..b2bf64397 --- /dev/null +++ b/doc/forum/Howto_remove_unused_files/comment_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbv1oKTKhbBp0Ljh_WGU7BFSWWxBr7D3U" + nickname="Pauli" + subject="Just to add" + date="2013-04-02T19:01:09Z" + content=""" + +When i do 'git annex get .' on my usb-remote i get these kind of prints: + + get Archive/Maps/cities/diskcache/voices/slovenian_f/slovenian_female/g5ext_000 (not available) + No other repository is known to contain the file. + failed + + +No repository contains the file? Well why cannot i then get it removed from the listing .. +"""]] diff --git a/doc/forum/Howto_remove_unused_files/comment_2_9b4d198c2d8a52adef3d166a8196fc0d._comment b/doc/forum/Howto_remove_unused_files/comment_2_9b4d198c2d8a52adef3d166a8196fc0d._comment new file mode 100644 index 000000000..ef4219e2f --- /dev/null +++ b/doc/forum/Howto_remove_unused_files/comment_2_9b4d198c2d8a52adef3d166a8196fc0d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbv1oKTKhbBp0Ljh_WGU7BFSWWxBr7D3U" + nickname="Pauli" + subject="comment 2" + date="2013-04-02T19:10:18Z" + content=""" +Just to continue my monolog: doing 'git rm -r cities' followed with git annex sync did the trick. Why didn't i find this anywhere .. +"""]] diff --git a/doc/forum/Howto_remove_unused_files/comment_3_441d10901d5c055ac3ed2a6cb61c075c._comment b/doc/forum/Howto_remove_unused_files/comment_3_441d10901d5c055ac3ed2a6cb61c075c._comment new file mode 100644 index 000000000..ffb941ac8 --- /dev/null +++ b/doc/forum/Howto_remove_unused_files/comment_3_441d10901d5c055ac3ed2a6cb61c075c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-02T21:21:21Z" + content=""" +git-annex adds large file capabilities to git, but it leaves all the regular git commands there for you to use. So the answer to \"how do I do <something I'd normally do with a git command>\" is always \"run the git command\". You only need to use git-annex to add large files to git, and to move their content around between repositories. Hope that helps clear that up. +"""]] diff --git a/doc/forum/Import_options.mdwn b/doc/forum/Import_options.mdwn new file mode 100644 index 000000000..543d1a4ec --- /dev/null +++ b/doc/forum/Import_options.mdwn @@ -0,0 +1,14 @@ +Thank you for adding import options to handle duplicates. Very handy when consolidating data from various sources. + +Can deletion of the source files be decoupled from annex duplication/deduplication options? For example, I would like to import source files without deleting them and at the same time do not import duplicates. + +Better yet, since deletion of source files is potentially dangerous, a delete option could be required for deletion to be performed. Example: + +git annex import --deduplicate --delete_all_source_files +git annex import --deduplicate --delete_source_duplicates + +Also, it would be great to have import "status" option which goes over files to be imported and logs their status ( to be imported, duplicate etc. ) without actually performing any changes. It would be great for testing and trial runs. + +I hope the above make sense. It would make import feature more flexible. + +Cheers, diff --git a/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment b/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment new file mode 100644 index 000000000..3475a0d73 --- /dev/null +++ b/doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w" + nickname="Josef" + subject="wishlist" + date="2013-09-26T11:11:19Z" + content=""" +Posted the above yesterday before realizing that it should probably go to wishlist requests. I am sorry about that. + +Basically it is a request to extend import options and perhaps make the options easier to use/understand. + +Suggested Import Options: + +- source directory, +- destination directory, +- deduplicate in annex ( yes, no ) +- delete source files ( yes, no ) +- trial run ( screen output only ) + +Many thanks for a great product! + +"""]] diff --git a/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment b/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment new file mode 100644 index 000000000..a3e259624 --- /dev/null +++ b/doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w" + nickname="Josef" + subject="Additional Comments" + date="2013-09-30T21:33:31Z" + content=""" +Imported several thousand files to annex and would like to add the following comments: + +- it would be great to have an option to exclude hidden dot files from import, + +- empty directories should be deleted when files located in the directories are deleted, + +- \"git annex add\" seems to process directories and files alphabetically, unfortunately import processes files in a different order, which makes it hard to predict which files are deleted when deduplicating, + +Cheers, + +"""]] diff --git a/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn b/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn new file mode 100644 index 000000000..5643f6b7a --- /dev/null +++ b/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn @@ -0,0 +1,9 @@ +Consider the following two use cases: + +* I have a git-annex repo on a portable medium and carry it around between several machines. I use it on a non-important system with the most current git-annex installed, automagic upgrade happens. I am now forced to upgrade git-annex on all other machines. Bonus points if this happens in the background and I don't even notice it until it's too late. + +* My system crashes and I use a rescue CD to access local data, including git-annex. The rescue CD includes a newer version of git-annex and once my system is restored, I am forced to upgrade git-annex locally. + +My suggestion would be not to upgrade automatically, but to either ask the user if this is OK or to error out and request that they run git annex update by hand. + +Optionally, this could be done via a local config variable which should default to error or ask, not upgrade. diff --git a/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment b/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment new file mode 100644 index 000000000..8420d7bb3 --- /dev/null +++ b/doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-18T00:38:51Z" + content=""" +These are good examples; I think you've convinced me at least for upgrades going forward after v2. I'm not sure we have enough users and outdated git-annex installations to worry about it for v1. + +(Hoping such upgrades are rare anyway.. Part of the point of changes made in v2 was to allow lots of changes to be made later w/o needing a v3.) + +Update: Upgrades from v1 to v2 will no longer be handled automatically +now. +"""]] diff --git a/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__.mdwn b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__.mdwn new file mode 100644 index 000000000..4fb3d05af --- /dev/null +++ b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__.mdwn @@ -0,0 +1,18 @@ +So suppose you put an existing folder under git-annex control, like this: + + cd Archive_of_all_my_files + git init . + git annex init "Archive Folder" + git annex add . + +And now you forget the last step: + + git commit -am "init" + +Instead, you fool around with git. After all, isn't git designed to keep your data safe and make sure there's no way you can accidentally lose it? The only branch that exists is 'git-annex', so you switch to that branch to see what it is: + + git checkout git-annex + +This command switches to the branch git-annex and makes a mess in the working directory. And you can't switch back to master since master does not have any commits. Is there a clean way to go back? I tried 'git checkout --orphan master', but the messy files stayed in the working directory. In the meantime, there should probably be a warning on the walkthrough page. + +I think git / git annex should warn you before switching the branch in this rare situation. diff --git a/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_1_f9decde3955f10148febc4646fba5a68._comment b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_1_f9decde3955f10148febc4646fba5a68._comment new file mode 100644 index 000000000..ed1c52d44 --- /dev/null +++ b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_1_f9decde3955f10148febc4646fba5a68._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T05:28:00Z" + content=""" +Yes, any git repository where there has not been an initial commit made is in an unusal situation. I've often felt this is a design flaw of git; it could start off with an empty root 00000 commit and avoid this complexity. + +There are probably all kinds of fancy git commands that can be used to get out of the situation you describe, but finessing a perfect exit from a situation that has happened in the first 5 minutes of using a new repository seems like overkill. Just run `git annex unannex` to move all your files out of git-annex; run `git rm -rf .` to delete the files from the git-annex branch; run `rm -rf .git`, and you're back where you started with some files and no git repository. + +... And no, neither git nor git-annex make any promises about keeping your data secure until you have both committed it and sent it somewhere else. +"""]] diff --git a/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_2_ed32a48edce4f150bedf24cfe91de254._comment b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_2_ed32a48edce4f150bedf24cfe91de254._comment new file mode 100644 index 000000000..946fcefa7 --- /dev/null +++ b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_2_ed32a48edce4f150bedf24cfe91de254._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 2" + date="2013-07-02T05:29:00Z" + content=""" +Oh and no, I don't think it's useful to bog down the walkthrough with warnings and caveats about this type of thing. +"""]] diff --git a/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_3_ef9618850e5e688bac3c646983f00ed8._comment b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_3_ef9618850e5e688bac3c646983f00ed8._comment new file mode 100644 index 000000000..f29fc8f81 --- /dev/null +++ b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_3_ef9618850e5e688bac3c646983f00ed8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHRhCe3qwVKQ8_NOGGSYJnAMW6FFyKbOc" + nickname="Holger" + subject="comment 3" + date="2013-07-02T05:52:10Z" + content=""" +Thanks for your helpful response. The cleaning procedure that you propose is perfectly fine. + +I wasn't suggesting to put up a big warning sign; I just feel like the walkthrough would be a little smoother if it explained something like: hey, 'git annex add .' just moved all of your precious files to '.git/annex/' and renamed them in a way that may scare you. But don't worry: if, at any point, you want to get them out again and put them back in their original place, just run 'git annex unannex'. +"""]] diff --git a/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_4_4bf460c5826c36b205e418c4f3f7d770._comment b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_4_4bf460c5826c36b205e418c4f3f7d770._comment new file mode 100644 index 000000000..9d5dc042c --- /dev/null +++ b/doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_4_4bf460c5826c36b205e418c4f3f7d770._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 4" + date="2013-10-22T11:28:52Z" + content=""" +I've had this a few times (or situations very similar). + + git init +is now always followed by + + git commit -m \"CREATE GIT REPOSITORY\" --allow-empty + +.. which I should really set as an alias :) +"""]] diff --git a/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn new file mode 100644 index 000000000..9c41acb70 --- /dev/null +++ b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn @@ -0,0 +1,23 @@ +Hey, + +I've found that git annex works great as a way to publish websites to a web server. I can edit my website on my computer, `git annex sync` my working directory to the VPS, and then `git annex get files-I-want-to-publish`. This works great. I can maintain my normal working directory structure on the VPS and I don't have to worry about people seeing files I DIDN'T want to publish, since the dead symlinks just show up as 404s. + +There's one small problem. + +Say: + + 1) I've already published a file using `git annex get file-to-update` + + 2) I update that file on my computer + + 3) I do `git annex sync` + + 4) I do `git annex get file-to-update` + +Between steps 3 and 4, file-to-update goes from being an accessible web resource to being a dead symlink. It's not really a problem for me, as hardly anyone visits my site. But it would be nice if I could make `sync` leave the old symlink to the old file until I `get`ed the new one. + +Is this possible? + +PS: For those who might follow in my footsteps, remember that you probably don't want people reading the contents of your .git dir, so make a re-write rule for this! + +Timothy diff --git a/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__/comment_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__/comment_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment new file mode 100644 index 000000000..0c20b9dd6 --- /dev/null +++ b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__/comment_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-07T16:18:52Z" + content=""" +I'd recommend that you just copy your files to the repository to publish them before running git-annex sync. + +Alternatively, unless your web pages are very large, you can just check them into git directly, still use git-annex sync if you want (and still using git-annex for large files), and avoid the complication of being able to have files that are listed in the repository but whose content is not present. +"""]] diff --git a/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn b/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn new file mode 100644 index 000000000..d85eefc2c --- /dev/null +++ b/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn @@ -0,0 +1,7 @@ +I'd like to have git-annex assistant running so I can use it to sync files, but when I downloaded and ran it the webapp was missing. + +I've recently begun using Trisquel, or rather the KDE version Triskel. The current Trisquel is built from Ubuntu Precise, 12.04, the current LTS version. Thus it seems that I'm a bit behind the current Ubuntu software, and my impression is that this relates to my problem. + +In [a post](http://git-annex.branchable.com/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/) on this forum I read that a version of git-annex was built without the webapp, and that this had since been corrected. It appears from my git-annex version data that I have an older version, though I downloaded it only two days ago, and it's older than the corrected version. Is this because my Ubuntu stuff is out of date? + +More importantly, is there any way I can get webapp running on my current OS, or must I wait until Trisquel gets to 13.04? diff --git a/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise/comment_1_6bd27bd31833336c1df783253378ccae._comment b/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise/comment_1_6bd27bd31833336c1df783253378ccae._comment new file mode 100644 index 000000000..43c8ae525 --- /dev/null +++ b/doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise/comment_1_6bd27bd31833336c1df783253378ccae._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T19:36:27Z" + content=""" +There is a PPA for Ubuntu Precise, which includes the webapp. + +Or you can use the standalone tarball, which works nearly everywhere. +"""]] diff --git a/doc/forum/Let_watch_selectively_annex_files.mdwn b/doc/forum/Let_watch_selectively_annex_files.mdwn new file mode 100644 index 000000000..f56b19452 --- /dev/null +++ b/doc/forum/Let_watch_selectively_annex_files.mdwn @@ -0,0 +1,27 @@ +Hello, + +First of all, thanks to Joey for developing git-annex, good job! + +I have a small feature request: when running git annex watch, new files are automatically added to the annex. It would be nice to let this depend on an attribute: add a file to annex if an attribute is set, otherwise do a regular git add. + +My use-case is the following: I have a repository containing documents I'm working on (mostly LaTeX), which I'd like to be regular files in git (no annex), and a bunch of extra documentation (pdfs) and images, which I'd like to go to the annex. I currently set a git-attribute (addtoannex), and use a shell script to selectively add files to annex as follows: + +Content of .gitattributes: + + *.png addtoannex + *.jpg addtoannex + +Snippet of add script: + + git check-attr addtoannex "$FILE" | grep -q ": set$" + if [ $? -eq 0 ]; then + git annex add "$FILE" + else + git add "$FILE" + fi + +It would be great if the watcher could honour an attribute. + +best regards, + +Tom diff --git a/doc/forum/Let_watch_selectively_annex_files/comment_1_8379de87d16502d9aadf252da01e4d9a._comment b/doc/forum/Let_watch_selectively_annex_files/comment_1_8379de87d16502d9aadf252da01e4d9a._comment new file mode 100644 index 000000000..415b08894 --- /dev/null +++ b/doc/forum/Let_watch_selectively_annex_files/comment_1_8379de87d16502d9aadf252da01e4d9a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-07T18:10:14Z" + content=""" +This has been requested a couple of times in different places. + +The problem with using a git attribute is it only allows basic matching on filenames. Some users would prefer to use the size of the file. So if/when this gets implemented it will probably not use a git attribute, but some other config setting. +"""]] diff --git a/doc/forum/Let_watch_selectively_annex_files/comment_2_2219ff6b4dc927eb2a299cd1af90aed8._comment b/doc/forum/Let_watch_selectively_annex_files/comment_2_2219ff6b4dc927eb2a299cd1af90aed8._comment new file mode 100644 index 000000000..d6cee26d5 --- /dev/null +++ b/doc/forum/Let_watch_selectively_annex_files/comment_2_2219ff6b4dc927eb2a299cd1af90aed8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-11T14:28:56Z" + content=""" +See [[tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant]] +"""]] diff --git a/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn b/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn new file mode 100644 index 000000000..dfe8afe2c --- /dev/null +++ b/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn @@ -0,0 +1,4 @@ +Hi, + +Suppose I have an annexed file whose content is stored on an extenal hard drive. +When the hard drive is mounted, is it possible to have immediately access to this file without transfering it, by modifying the symlink to point to the file content on the hard drive instead of having a broken link? diff --git a/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment b/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment new file mode 100644 index 000000000..ee6ec690e --- /dev/null +++ b/doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T18:25:16Z" + content=""" +See [[todo/union_mounting]] +"""]] diff --git a/doc/forum/Links_or_actual_files__63___Confused__33__.mdwn b/doc/forum/Links_or_actual_files__63___Confused__33__.mdwn new file mode 100644 index 000000000..8d7ef2c17 --- /dev/null +++ b/doc/forum/Links_or_actual_files__63___Confused__33__.mdwn @@ -0,0 +1,21 @@ +I don't think it's a bug or a todo, just a request for clarification. + +So, I installed git-annex first on a Mac, and created the initial repository, and started dropping stuff into it. All fine. + +Created a second repository on an external (but never disconnected, also does Time Machine) drive. All fine. Everything's there. + +Went across the room to my Linux desktop, installed git-annex, and tried to pair it to my Mac's git-annex repo. Hit this bug, installed latest git-annex from tarball and got past that and got the pairing done. Syncing happened, all looked well... + +But when I look in the annex dir on that Linux machine, I now just see symlinks to the actual files in the repo's .git/annex stuff. It kinda works, but it's a bit distracting, especially if you open such a file in any desktop app and you can see it's got the target of the link (some sha-value filename.ext) rather than the sensibly-named link. Including files created and coped into that annex on that machine. (In Nautilus they all show with symlink & lock emblems.) + +Look again at some documentation, and apparently it's supposed to do this + +Which makes me wonder why it *isn't* doing it on the Mac I started the repository on? + +Went to another mac (laptop) and installed git-annex, and set up pairing to the first mac - as far as I can tell, doing the exact same procedure as I did under Linux. TBH through the webapp there's not much scope for doing it a different way. Files sync across... + +And there they are, the actual files, directly in the annex dir, not symlinks. + +(I am by the way confirming this at the commandline, it's not just what Finder/Nautilus may be displaying to me graphically.) + +Now, seeing the actual files in the annex directory is what I *prefer*; but I'm a: confused as to why the Macs are doing it that way but Linux isn't, and b: given the "how it works" link, why everything isn't using the links. diff --git a/doc/forum/Links_or_actual_files__63___Confused__33__/comment_1_779cee2448d7070b1dd636d01296c01e._comment b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_1_779cee2448d7070b1dd636d01296c01e._comment new file mode 100644 index 000000000..0122cf45b --- /dev/null +++ b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_1_779cee2448d7070b1dd636d01296c01e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T17:58:24Z" + content=""" +When you create a git-annex repository using the webapp, it uses [[direct_mode]]. That is not the default if you create a repository by hand at the command line, although you can enable it if you prefer it. +"""]] diff --git a/doc/forum/Links_or_actual_files__63___Confused__33__/comment_2_bccda88697ab7beec0b9fe9ee0230688._comment b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_2_bccda88697ab7beec0b9fe9ee0230688._comment new file mode 100644 index 000000000..c6a851eff --- /dev/null +++ b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_2_bccda88697ab7beec0b9fe9ee0230688._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="webapp/direct" + date="2013-09-12T18:17:51Z" + content=""" +well, i did it using the webapp both times; i've barely scratched at the git-annex commandline so far. + +However... I then tried to repeat it on another linux box (running ubuntu saucy and the version of git-annex in that repo) and it worked as expected: Real files in the annex directory, ie: as I understand it, direct mode. + +So, went back to the first linux box (running ubuntu raring), and cleared everything off, quit and started again, doing the same thing again, and *it* did the direct mode thing itself this time. + +Which I think leaves me with it the way I want it. :-) + +My only guess is, maybe it got set up in non-direct mode when I first started using the older git-annex in the raring repos, before failing with the bad comment in ssh public key bug, at which point I switched to the downloaded-today tarball and just tried to resume. Starting from scratch with the newer version worked. + +I'm sure more questions to come later; am a Dropbox fugitive by way of ownCloud (won't-fix bug on version upgrades) basically trying to replicate that kind of convenience. But those are for other postings. +"""]] diff --git a/doc/forum/Links_or_actual_files__63___Confused__33__/comment_3_c2a9da3f03b55ff294dc0d2010380119._comment b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_3_c2a9da3f03b55ff294dc0d2010380119._comment new file mode 100644 index 000000000..5df67c605 --- /dev/null +++ b/doc/forum/Links_or_actual_files__63___Confused__33__/comment_3_c2a9da3f03b55ff294dc0d2010380119._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 3" + date="2013-09-12T20:22:44Z" + content=""" +Yep, relatively ancient (from last year) versions of the webapp didn't use direct mode by default, and have various bugs as well. +"""]] diff --git a/doc/forum/Local_and_remote_in_direct_mode.mdwn b/doc/forum/Local_and_remote_in_direct_mode.mdwn new file mode 100644 index 000000000..128d8eab6 --- /dev/null +++ b/doc/forum/Local_and_remote_in_direct_mode.mdwn @@ -0,0 +1,7 @@ +I have two machines (A and B ) both have a directory called "inbox" +I want to sync these two directories. So I ran git annex assistant on machine A and set up a remote to B with **ssh** and selected **client: a repository on your computer**. + +The end result is that I have something that looks like a git bare repo on machine B and I have no files on A from machine B. + +What am I doing wrong? What shall I do to achieve my goal? +It is kind of dropbox functionality what I want. (Which I never used for security/policy reasons.) diff --git a/doc/forum/Local_and_remote_in_direct_mode/comment_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment b/doc/forum/Local_and_remote_in_direct_mode/comment_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment new file mode 100644 index 000000000..f7244cabc --- /dev/null +++ b/doc/forum/Local_and_remote_in_direct_mode/comment_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-19T18:05:58Z" + content=""" +The \"Remote server using ssh\" option in the webapp is intended to set up a bare git repository on a server, not a non-bare git repository on a client. + +For what you want, both your computers need to be running the git-annex assistant. + +* If the computers are on the same network, pick the \"Local computer\" option on one to start a pairing process with the other. +* If the computers are not on the same network, but can (apparently) access one-another by ssh, then you're a lucky guy. :) But the webapp doesn't cater to this unusual configuration (unless the local pairing option above works). All you need to do though, it manually add a git remote on each that points to the already existing, git-annex assistant managed repository on the other. Eg: `git remote add B ssh://machineB:/~/annex` +* If the computers are not on the same network, and cannot access each other directly using ssh, you will need +to use the XMPP option, and a transfer remote that both can access. +"""]] diff --git a/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning.mdwn b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning.mdwn new file mode 100644 index 000000000..e7062ff29 --- /dev/null +++ b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning.mdwn @@ -0,0 +1,20 @@ +I have a git annex repository which I use to store versioned binaries in a regular git repository. We also use submodules in the repository (the sources of the versioned binaries) but the binaries are not in the submodules. This has worked great for us. + +Recently, there have been a number of changes (I got a new laptop, moved to fedora 20, renamed the repository, etc...) that happened at once. Now when I checkout a clean working version of the repository and then run git annex get . and then do an unlock and a lock on the file I get the "Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override)" warning. + +I have tried to isolate this as much as possible but can't find what caused this. On a co-worker's laptop it seems to work fine so far. A clean repository didn't fix it. An old repository didn't fix it (though I recall it working there previously on this laptop). It did work and just stopped recently. + + $ git annex version + git-annex version: 5.20140107 + build flags: Assistant Inotify DBus Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt bup directory rsync web glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + + $ git annex lock --debug --verbose vendors/unittest-xml-reporting-1.5.0.tar.gz # (some names changed to protect the innocent) + [2014-02-05 12:54:45 IST] read: git ["--git-dir=/home/user/loppa_deuce/loppa/.git","--work-tree=/home/user/loppa_deuce/loppa","diff","--name-only","--diff-filter=T","-z","--","vendors/unittest-xml-reporting-1.5.0.tar.gz"] + [2014-02-05 12:54:45 IST] chat: git ["--git-dir=/home/user/loppa_deuce/loppa/.git","--work-tree=/home/user/loppa_deuce/loppa","cat-file","--batch"] + [2014-02-05 12:54:45 IST] read: git ["--git-dir=/home/user/loppa_deuce/loppa/.git","--work-tree=/home/user/loppa_deuce/loppa","diff","--name-only","--diff-filter=T","-z","--cached","--","vendors/unittest-xml-reporting-1.5.0.tar.gz"] + lock vendors/unittest-xml-reporting-1.5.0.tar.gz git-annex: Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override) diff --git a/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_1_25a04c7345f5b626aa71524603c833ed._comment b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_1_25a04c7345f5b626aa71524603c833ed._comment new file mode 100644 index 000000000..84f556d65 --- /dev/null +++ b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_1_25a04c7345f5b626aa71524603c833ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmfVOIl06X7NKio-NBYZ-cfw5LFVqHMX8o" + nickname="Daniel" + subject="Hash is the same" + date="2014-02-05T11:13:12Z" + content=""" +I forgot to mention that I also checked the hash of the file to make sure that nothing changed the file and nothing changed. Just quick unlock/lock triggers it. +"""]] diff --git a/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_2_7146a3c69749b9b1001fffc6e7a8bcda._comment b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_2_7146a3c69749b9b1001fffc6e7a8bcda._comment new file mode 100644 index 000000000..cc5e85316 --- /dev/null +++ b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_2_7146a3c69749b9b1001fffc6e7a8bcda._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmfVOIl06X7NKio-NBYZ-cfw5LFVqHMX8o" + nickname="Daniel" + subject="New git-annex package to blame" + date="2014-02-05T14:23:40Z" + content=""" +I downgraded my git-annex version, rechecked out the repository and now everything works. + $ git annex version + git-annex version: 4.20130827 + build flags: Assistant Inotify + +"""]] diff --git a/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_3_fd39e6ceffd9bf0709658c34945d8699._comment b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_3_fd39e6ceffd9bf0709658c34945d8699._comment new file mode 100644 index 000000000..5b23df870 --- /dev/null +++ b/doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_3_fd39e6ceffd9bf0709658c34945d8699._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 3" + date="2014-02-06T17:05:45Z" + content=""" +Recent versions of git-annex have tried to extend the --force option to be needed in any operation that can possibly cause data loss. This includes locking a file, since that throws away any changes. + +Note that `git annex lock` does not check if the file is unmodified. For a few reasons including + +* some backends don't include a checksum +* it would be expensive to check a checksum +* the file could get modified after or during a checksum check, and those modifications would be missed + +If you are sure you want to throw away any changes, use --force as suggested. If not, use `git annex add $file`, and assuming you're using a checksumming backend, it will notice the file has not changed and do what you want `git annex lock $file` to have done in this case. +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX.mdwn b/doc/forum/Looking_at_the_webapp_on_OSX.mdwn new file mode 100644 index 000000000..b2c514d83 --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX.mdwn @@ -0,0 +1,18 @@ +Not logging this in the bugs section, but poking at the new webapp feature... + +
+laplace:annex jtang$ git annex webapp -d
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","git-annex"] 
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","--hash","refs/heads/git-annex"] 
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..731005d121426a38b206c4544da02cdb3b974974","--oneline","-n1"] 
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..d36d8d88847decc2320f0be22892ad94a8abe594","--oneline","-n1"] 
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..57bcddc14d03b61028f7002e2dabcc5181d74f3d","--oneline","-n1"] 
+[2012-07-26 19:02:50 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..372aceaf49b60ebe31cc3fe2e52ba4fbe99c134f","--oneline","-n1"] 
+[2012-07-26 19:02:50 IST] chat: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","cat-file","--batch"] 
+[2012-07-26 19:02:50 IST] read: git ["config","--null","--list"] 
+[2012-07-26 19:02:50 IST] call: open ["file:///Users/jtang/annex/.git/annex/webapp.html"] 
+The file /Users/jtang/annex/.git/annex/webapp.html does not exist.
+git-annex: failed to start web browser on url file:///Users/jtang/annex/.git/annex/webapp.html
+
+ +I would have expected the open command to open up http://localhost:port/ instead of a file on my machine. Anyway, its just an observation on the current state of the webapp feature, not expecting it to work enough for me to test it ;) diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_1_68820f2f469356633c1abb18a47e0c59._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_1_68820f2f469356633c1abb18a47e0c59._comment new file mode 100644 index 000000000..9aa05c8f0 --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_1_68820f2f469356633c1abb18a47e0c59._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 1" + date="2012-07-26T18:17:40Z" + content=""" +This could happen if you already had an old version of git-annex assistant running in that repository. + +Try: + +git annex assistant --stop ; git annex webapp +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_2_4ce86546d8a135df9cfab46b4612fa0b._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_2_4ce86546d8a135df9cfab46b4612fa0b._comment new file mode 100644 index 000000000..b24956b8c --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_2_4ce86546d8a135df9cfab46b4612fa0b._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 2" + date="2012-07-26T20:42:37Z" + content=""" +The last few commits fixed the webapp startup quirk, it doesn't work yet for me as the watch command is probably failing + +
+laplace:annex jtang$ git annex webapp  -d
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"show-ref\",\"git-annex\"] 
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] 
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"log\",\"refs/heads/git-annex..731005d121426a38b206c4544da02cdb3b974974\",\"--oneline\",\"-n1\"] 
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"log\",\"refs/heads/git-annex..d36d8d88847decc2320f0be22892ad94a8abe594\",\"--oneline\",\"-n1\"] 
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"log\",\"refs/heads/git-annex..57bcddc14d03b61028f7002e2dabcc5181d74f3d\",\"--oneline\",\"-n1\"] 
+[2012-07-26 21:41:15 IST] read: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"log\",\"refs/heads/git-annex..372aceaf49b60ebe31cc3fe2e52ba4fbe99c134f\",\"--oneline\",\"-n1\"] 
+[2012-07-26 21:41:15 IST] chat: git [\"--git-dir=/Users/jtang/annex/.git\",\"--work-tree=/Users/jtang/annex\",\"cat-file\",\"--batch\"] 
+[2012-07-26 21:41:15 IST] read: git [\"config\",\"--null\",\"--list\"] 
+git-annex: failed to start git-annex assistant
+
+ +it doesn't segfault or anything, it just states that the assistant command failed to start :P +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_3_6d398a2cceff14a1b774b85ee1725073._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_3_6d398a2cceff14a1b774b85ee1725073._comment new file mode 100644 index 000000000..a139537de --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_3_6d398a2cceff14a1b774b85ee1725073._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 3" + date="2012-07-26T22:07:25Z" + content=""" +I've been improving this code path, so make sure you're current. I just made it wait for longer than the 10 seconds it was waiting before giving up. + +If it still fails, try running `git-annex assistant --debug --foreground` +in one terminal, wait for it to start up, and then run `git annex webapp` in another. +If that still fails, check if `.git/annex/webapp.html` exists. +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_4_5e503787a4b1d3534c5e20da5480b763._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_4_5e503787a4b1d3534c5e20da5480b763._comment new file mode 100644 index 000000000..fde217e63 --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_4_5e503787a4b1d3534c5e20da5480b763._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 4" + date="2012-07-26T22:08:53Z" + content=""" +Oh, wait, you're right, if the assistant process that watch forks off is segfaulting, that error message is about the best we can hope for. You can try the manual startup of the assistant to confirm it's crashing.. +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_5_c735841bc230efc61594ea013fc2902b._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_5_c735841bc230efc61594ea013fc2902b._comment new file mode 100644 index 000000000..47f7be603 --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_5_c735841bc230efc61594ea013fc2902b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2012-07-27T15:53:50Z" + content=""" +I can confirm that the watch command is crashing when i start it up manually. +"""]] diff --git a/doc/forum/Looking_at_the_webapp_on_OSX/comment_6_0e489fbfc89d282e9eb47f1b814ff70c._comment b/doc/forum/Looking_at_the_webapp_on_OSX/comment_6_0e489fbfc89d282e9eb47f1b814ff70c._comment new file mode 100644 index 000000000..901492386 --- /dev/null +++ b/doc/forum/Looking_at_the_webapp_on_OSX/comment_6_0e489fbfc89d282e9eb47f1b814ff70c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 6" + date="2012-07-27T18:21:17Z" + content=""" +FYI, the webapp starts up and sends me to a web browser with the correct page ;) this is after the other issue of [[Watch command as of commit 6cecc26206c4a539999b04664136c6f785211a41 segfaults]] got fixed. +"""]] diff --git a/doc/forum/Lyve_Home.mdwn b/doc/forum/Lyve_Home.mdwn new file mode 100644 index 000000000..b9e091769 --- /dev/null +++ b/doc/forum/Lyve_Home.mdwn @@ -0,0 +1,6 @@ +Lyve Home is an interesting device to store personal photos and videos. It is a 2TB hard drive that stores all your photos. It tries to replicate the files on every device you connect (computer, phone, etc.) and keeps at least two copies of each photo. The photos are not stored in the cloud, Lyve only stores metadata in the cloud. + +http://www.youtube.com/watch?v=sOE5uWqS6YQ + +This is something that could be easily made with git-annex and a small computer, like a Raspberry Pi, and a hard drive. + diff --git a/doc/forum/Make_whereis_output_more_compact.mdwn b/doc/forum/Make_whereis_output_more_compact.mdwn new file mode 100644 index 000000000..5503e716f --- /dev/null +++ b/doc/forum/Make_whereis_output_more_compact.mdwn @@ -0,0 +1,13 @@ +Hi there, + +first of all, great job done on annex! I think I finally found what I was looking for to organize all my data. + +My question: when I do git annex whereis Music, I get a detailed list of every single song and its remote locations. I have tens of thousands of songs, so just typing git annex whereis Music gives me way too much information. +Here is my proposition: in my case, every file of the Music folder resides in the same remote. So, wouldn't it be better to show just one line of output telling me that Music is on remote bla and blub, and then I know that all files in Music are in remotes bla and blub? + +Is that possible now already or would that be a feature request? What do you think? + +Cheers, +Moritz. + +PS: I know that I can specify filters, e.g. git annex whereis --in bla --and --not --in blub. That is great! diff --git a/doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn b/doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn new file mode 100644 index 000000000..29eddaa0c --- /dev/null +++ b/doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn @@ -0,0 +1,10 @@ +With the fundraiser having met its stretch goal of $15,000, I was thinking of how to keep git-annex going beyond another year. What about selling stuff? Not just merch (though being able to buy stickers would be neat), but useful things that would complement the software, like selling hardware for a small remote that you could plug into your home network, or even set up at a friend's house to have online, but offsite. + + +Something like a CubieBoard2 and an HDD for annexes preloaded with all the necessary software and a git-annex apt repo for keeping it updated. Everything would come in a nice little enclosure with a git-annex logo on it; you plug in the power, the ethernet, and boom it's ready to go, with no terminal magic (but it's there if you want it!). You could create them on-demand without having to keep much of a stock (except maybe the enclosure), so there's practically no risk. + + + +Aesthetically, I was thinking of something that exposed as little of the insides as possible. Basically just power, ethernet, and USB ports. + +Maybe material for another Kickstarter? diff --git a/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_1_4a1ba95b7231ba973ddb672d2419e28c._comment b/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_1_4a1ba95b7231ba973ddb672d2419e28c._comment new file mode 100644 index 000000000..03ddae483 --- /dev/null +++ b/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_1_4a1ba95b7231ba973ddb672d2419e28c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="94.126.178.1" + subject="comment 1" + date="2013-07-27T01:56:47Z" + content=""" +Other ideas welcome! +"""]] diff --git a/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_2_7c476ae92e63c991f229708678874ca2._comment b/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_2_7c476ae92e63c991f229708678874ca2._comment new file mode 100644 index 000000000..70e470c85 --- /dev/null +++ b/doc/forum/Making_git-annex_a_self-funded_project__63__/comment_2_7c476ae92e63c991f229708678874ca2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 2" + date="2013-07-28T00:21:39Z" + content=""" +A few people have suggested that idea. I don't know if I want to get into the HW business. +"""]] diff --git a/doc/forum/Making_git-annex_less_necessary.mdwn b/doc/forum/Making_git-annex_less_necessary.mdwn new file mode 100644 index 000000000..086c05139 --- /dev/null +++ b/doc/forum/Making_git-annex_less_necessary.mdwn @@ -0,0 +1,5 @@ +http://git-annex.branchable.com/walkthrough/ says "Git wants to first stage the entire contents of the file in its index. That can be slow for big files (sorta why git-annex exists in the first place)."
+What is git doing that git-annex isn't, other than copying the file to .git/objects rather than just moving it to .git/annex/objects, prepending it with "blob"+length, and compressing it? If git were changed to store the "blob"+length as part of the object filename rather than as part of the object file content, have a config option to use uncompressed objects for large files (and not try to pack them when creating pack files), and were used on a filesystem such as zfs or btrfs which does COW so the copy would be as fast as a move, then what speed advantage would git-annex still have over git? I realize git-annex has more features than just big file handling, and has the worm backend for even faster handling, but I'm just talking about the case with the default sha backend.
+Have such changes been proposed for git? It seems that for anybody already familiar with the git codebase, adding the config option for uncompressed objects and moving the storage location for "blob"+length would be easy changes to make, and I see no downside to them. It wouldn't break backwards compatibility because the object filename being hash."blob".length rather than just hash would indicate that the new object format is in use, and a ".raw" filename extension could be used for uncompressed objects (or more sensibly, in the new format, no additional extension for uncompressed, and ".compressed" for compressed).
+This would also eliminate the need for a git-annex object store separate from the git object store, and the complexities involved with having them separate, and the need for symlinks, and the complexities they cause. I don't think that relying on COW for speed is unreasonable once btrfs becomes the default in major Linux distros (the bsds already have zfs and hammerfs); right now part of what git-annex is doing is just working around the functional deficiency of non-COW filesystems.
+P.S. I recommend a "plain" option for the page type when submitting comments on your wiki, so I don't have to put HTML line break markup at the end of my lines. diff --git a/doc/forum/Making_git-annex_less_necessary/comment_1_03faaa3866778d24cd03887b85dc9954._comment b/doc/forum/Making_git-annex_less_necessary/comment_1_03faaa3866778d24cd03887b85dc9954._comment new file mode 100644 index 000000000..3396643f6 --- /dev/null +++ b/doc/forum/Making_git-annex_less_necessary/comment_1_03faaa3866778d24cd03887b85dc9954._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.245" + subject="comment 1" + date="2012-05-08T18:22:12Z" + content=""" +git's code base makes lots of assumptions hardcoding the size of the hash, etc. (grep its source for magic numbers 40 and 42...) I'd like to see git get parameratised hashes. SHA1 insecurity may evenutally push it in that direction. However, when I asked the git developers about this at the Gittogether last year, there were several ideas floated that would avoid parameterisation, and a lot of good thoughts about problems parameterised hashes would cause. + +Moving data into git proper would still leave the problems unique to large data of not being able to store it all on every clone. Which means a git-annex like thing is needed to track where the data resides and move it around. + +(BTW, in markdown, you separate paragraphs with blank lines. Like in email.) +"""]] diff --git a/doc/forum/Making_git-annex_less_necessary/comment_2_2db02a94dffd525885c9d7fc6c5fa464._comment b/doc/forum/Making_git-annex_less_necessary/comment_2_2db02a94dffd525885c9d7fc6c5fa464._comment new file mode 100644 index 000000000..4b1dbd271 --- /dev/null +++ b/doc/forum/Making_git-annex_less_necessary/comment_2_2db02a94dffd525885c9d7fc6c5fa464._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/IAg3idYGk.joxsJb2WCxl20gig.0.8hS#d5165" + nickname="Kelly" + subject="comment 2" + date="2012-05-10T15:01:15Z" + content=""" +I think my comment a couple days ago got caught in the spam filter, so I'm reposting. +What were the ideas to avoid parameterisation? What were the problems of parameterisation, other than just the current hardcoded assumptions? + +Speaking of hash insecurity, http://static.usenix.org/events/hotos03/tech/full_papers/henson/henson_html/node8.html says compare-by-hash is a bad idea. As I understand, git doesn't have an option of verifying content matches when the hash matches when adding data to the object store (like zfs's \"dedup=verify\" option, which you can use even when using sha256), because the assumption is that the risk of collision (or at least just the risk of accidental collision) is negligible. Would it be worthwhile to add this option to git-annex? + +"""]] diff --git a/doc/forum/Making_git-annex_less_necessary/comment_3_429ec656e0ac02f98843f8d7f3c02d6a._comment b/doc/forum/Making_git-annex_less_necessary/comment_3_429ec656e0ac02f98843f8d7f3c02d6a._comment new file mode 100644 index 000000000..41b7570e1 --- /dev/null +++ b/doc/forum/Making_git-annex_less_necessary/comment_3_429ec656e0ac02f98843f8d7f3c02d6a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/IAg3idYGk.joxsJb2WCxl20gig.0.8hS#d5165" + nickname="Kelly" + subject="comment 2" + date="2012-05-09T01:22:13Z" + content=""" +What were the ideas to avoid parameterisation? What were the problems of parameterisation, other than just the current hardcoded assumptions? + +Speaking of hash insecurity, http://static.usenix.org/events/hotos03/tech/full_papers/henson/henson_html/node8.html says compare-by-hash is a bad idea. As I understand, git doesn't have an option of verifying content matches when the hash matches when adding data to the object store (like zfs's \"dedup=verify\" option, which you can use even when using sha256), because the assumption is that the risk of collision (or at least just the risk of accidental collision) is negligible. Would it be worthwhile to add this option to git-annex? + +"""]] diff --git a/doc/forum/Making_git-annex_less_necessary/comment_4_384813dd022dfd9c1ef14e0f1479a123._comment b/doc/forum/Making_git-annex_less_necessary/comment_4_384813dd022dfd9c1ef14e0f1479a123._comment new file mode 100644 index 000000000..40f0e02b0 --- /dev/null +++ b/doc/forum/Making_git-annex_less_necessary/comment_4_384813dd022dfd9c1ef14e0f1479a123._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/" + nickname="chrysn" + subject="comment 2" + date="2012-05-11T17:40:20Z" + content=""" +from my layman's standpoint, i think it would be feasible. i've suggested this previously, but not pushed it too much. quoting from [[my user page|users/chrysn]]: + +* **would like git-annex to**: not be required any more as git itself learns to use cow filesystems to avoid abundant disk usage and gets better with sparser checkouts (git-annex might then still be a simpler tool that watches over what can be safely dropped for a sparser checkout) + +*concerning hash sizes or parameterized hashes*: the problems with hash sizes could be avoided if instead of putting the objects in the \"normal\" object dir, barefiles would be managed in a similar way as packs are. when a new files gets added, they'd be cow-copied to ``.git/objects/bare/${HA}/${SH}``, and ``.git/objects/bareprefix/${HA}/${SH}`` would contain the \"blob ${SIZE}\0\" prefix that gets concatenated to the object body to form the object itself. + +(maybe it'd even be sufficient to *just store the size* in the bareprefix, as all those objects would be blobs, but then again, some flexibility won't hurt.) + +if the *pack file format* is flexible enough, the bareprefix files can get packed too. for the adventerous user who modifies bigfiles, the pack file mechanisms should be made aware of their presence, and be able to store deltas between them. the operations for applying those deltas would be difficult to optimize, and could be added at a later stage. a typical example could be storing a pdf file -- the pdf file format is designed for appending, so chances are the new version is just the old version plus several k at the end. + +neither of that would affect git's *wire protocol*, so no compatibility problems. (it would be advisable to find a reasonable way to do sparse checkouts, though; something like \"server, pack and send your master, but make it sparse and don't include blobs >1mb\"). +"""]] diff --git a/doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__.mdwn b/doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__.mdwn new file mode 100644 index 000000000..acd9066ec --- /dev/null +++ b/doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__.mdwn @@ -0,0 +1,118 @@ +I have come up with a moderately complex solution to a particular use case that I have and am posting it here in case it is useful to someone else, and to get suggestions on how to improve it. + +#The problem: + +I have a large number of files that are accessed infrequently and stored off-line on DVD-Rs. I need to keep track of which files are on which disc so that when I want a file I can find it. + +#The solution: + +I currently keep a text file to track which files are on which discs. I would like to organize all the files in a proper filesystem using git annex, allowing me better organization and the ability to keep some smaller related files online near the annexed large files. + +#Requirements: + +1) Easily locate the DVD-R containing any specific offline file + +This is easily taken care of with git annex whereis + +2) Automatically de-duplicate stored files with the same contents + +This is taken care of with one of the hash backends (E.G. SHA256) + +3) The DVD-Rs still need to be usable without git or git-annex (E.G. The stored files should retain their normal human readable names) + +This requirement rules out dir and rsync special remotes, they store the files named according to their hash. I have settled on making each disc a separate repo which will satisfy this requirement. + + +#Future goals: + +4) Easily incorporate the current DVD-Rs into the new system + +I haven't found a way to fulfill this goal yet. I have some convoluted ideas, but nothing so easy as mount disc, run git annex command. + + +#The solution in detail +Suppose you have the following tree: + +
+~/mainrepo/thing1/file1.bin
+~/mainrepo/thing1/description1.txt
+~/mainrepo/thing2/file2.bin
+~/mainrepo/thing2/description2.txt
+
+ +You want to store thing1 on disc1 and thing2 on disc2, but you'd like to keep the descriptions online because they are small and useful for figuring out which thing you want later. + +1) Create the main repo and annex the files: + +
+cd ~/mainrepo
+git init
+git annex init mainrepo
+git annex add .
+git commit -m 'added files'
+
+ +2) Create two new unrelated repos and populate them with their respective data and annex: + +
+cd /tmp
+mkdir disc1repo disc2repo
+cd disc1repo
+cp ~/mainrepo/thing1/* .
+git init
+git annex init disc1
+git annex add .
+git commit -m 'added files'
+cd ../disc2repo
+cp ~/mainrepo/thing2/* .
+git init
+git annex init disc2
+git annex add .
+git commit -m 'added files'
+
+ +3) This is optional, but after annexing the files in these new repos, I replace the symlinks pointing into to the .git/annex/objects/ directory with hard links. This makes the DVD-Rs usable from operating systems that can't deal with symlinks. (mkisofs handles hard links correctly) + +
+cd /tmp
+find disc1repo/ disc2repo/ -type l -execdir sh -c "mv -iv {} {}.symlink && ln -L {}.symlink {} && rm {}.symlink" \;
+
+ +4) Burn these repos onto DVD-Rs: + +
+cd /tmp
+#make isos
+mkisofs -volid disc1 -rational-rock -joliet -joliet-long -udf -full-iso9660-filenames -iso-level 3 -o disc1.iso disc1repo/
+mkisofs -volid disc2 -rational-rock -joliet -joliet-long -udf -full-iso9660-filenames -iso-level 3 -o disc2.iso disc2repo/
+#burn the isos (untested command)
+cdrecord -v -dao disc1.iso
+cdrecord -v -dao disc2.iso
+
+ +5) Mount the DVD-Rs and add as a remote and fetch, then drop from the mainrepo: + +
+cd ~/mainrepo
+#disc1
+mount /mnt/cdrom
+git remote add disc1 /mnt/cdrom
+git fetch disc1
+git annex drop thing1/thing1.bin
+umount /mnt/cdrom
+#disc2
+mount /mnt/cdrom
+git remote add disc2 /mnt/cdrom
+git fetch disc2
+git annex drop thing2/thing2.bin
+umount /mnt/cdrom
+
+ +6) Enjoy! You can now find out what disc things are on simply using git annex whereis, and you can git annex get them or simply use them directly from the disc. + + +I'd appreciate any comments and helpful suggestions. Especially how to simplify the process or easily integrate all the things I already have stored on discs. + +Maybe it would be possible to create a special remote using the hooks for the DVD-Rs. + +Even though it is a bit tedious and complicated, the current process could be automated using a script. diff --git a/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 b/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 new file mode 100644 index 000000000..488e9aa7b --- /dev/null +++ b/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 @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="Web remote works" + date="2012-11-25T22:30:46Z" + content=""" +Thanks for the suggestion Joey, I found a way to make the web remotes work for adding the files from existing discs. I wound up adding a symlink farm to the repo with a link for each disk pointing at the mount point. This way when I try to retrieve a file, I see the URL which contains the name of the disc: + + $ git annex get bigfile.bin + get bigfile.bin (from web...) + curl: (37) Couldn't open file /var/tmp/repo/storage/dvd13/bigfile.bin + + Unable to access these remotes: web + + Try making some of these repositories available: + 00000000-0000-0000-0000-000000000001 -- web + failed + git-annex: get: 1 failed + +It took me a while as the version of git-annex in portage was rather old and I just didn't get around to updating git-annex on Gentoo for while. If anybody wants to get git-annex 3.20121112 running under Gentoo I detailed the process I used at + +Now I'll have to try out the assistant! (Though I didn't get the webapp to compile due to a shakespeare-js error) +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..8823ecf41 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="Bad ebuilds" + date="2012-12-01T02:45:37Z" + content=""" +Just an update for anybody that used the ebuilds I created from the link above. They did not create the git-annex-shell symlink which can cause git-annex to start ignoring your remotes. More details and fixed ebuilds are now on the page. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..aa742361d --- /dev/null +++ b/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 @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 12" + date="2013-03-11T10:34:42Z" + content=""" +Without having read this, I've reported a very similar wishlist item at: +[http://git-annex.branchable.com/todo/wishlist:_recursive_directory_remote_setup__47__addurl](http://git-annex.branchable.com/todo/wishlist:_recursive_directory_remote_setup__47__addurl) + +combining a recursive addurl (in my case using --fast) script with the suggestions regarding symlinks here, it's somewhat workable: + + ln -s /media/cdrom /var/tmp/mycdrom123 + ~/utv/scripts/annex-importdir /var/tmp/mycdrom123 + +Ideally though, for optical media it would have a couple of more features (some already noted above): + +* Ability to form a (reasonably) unique identifier from a disc, using the label and the date of creation + * Ability for Annex to identify discs using this and ask for the correct disc if the file does not match (accomodating RW discs where label and date might change, or simply disc copies) + * Example: `not the original disc... trying anyway... file hash mismatch... please enable the remote disc with \"MYLABEL\" and creation date \"2001-01-01\"` +* Option to checksum without importing the actual objects into the annex +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..e406f1b6f --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Have you seen the dar utility?" + date="2012-10-20T19:03:37Z" + content=""" +http://dar.linux.free.fr/doc/index.html + +Would be nice to have this as another remote option for git-annex, since I too would like to have static (and possibly incrementally extended) remotes that span multiple DVDs +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..abff8702e --- /dev/null +++ b/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 @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject=""free-form" special remote / dar utility" + date="2012-10-20T22:11:23Z" + content=""" +dar looks familiar, I'm sure I have run across it in the past. However, it is not suitable in this case; see requirement #3 above that the DVD-Rs be usable without git or git-annex. + +What would work we be some sort of special remote that allows free-form data. Imagine that you create the DVD-R with the files on it, then you mount it and add the mount directory as a free-form special remote. git-annex checksums all the files under the specified directory and stores the relative path to each file somewhere. Then, when you want to fetch a specific hash from the remote it looks up the relative path, adds it to the base directory and transfers it into the local .git/annex/objects/ store. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..973e97319 --- /dev/null +++ b/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 @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.57.104" + subject="Yes, I agree, such a special remote for free-form read-only media would be convnient." + date="2012-10-20T23:58:45Z" + content=""" +I have already stored a lot of large files on DVDs. I did that for arhiving, so I cared that there are several copies. But I want this to be more automated. + +I take my disc (or one created by someone else, without any knowledge of Git), checksum its contents in git-annex, and in the projects where I'm using this content, I can check that the file is archived on at least N discs. + +Also, I might enhance the content -- this would be refected in a Git commit, so then I want also to be able to check that the new version has also ben archived on severeal discs. + +A special remote for such free-form read-only media would be very convenient. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..44d547dd9 --- /dev/null +++ b/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 @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="Some free-form remote ideas" + date="2012-10-21T02:07:40Z" + content=""" +This is starting to get interesting. A free-form remote would definitely simplify my use case, and also solve the \"future goal\" of easily incorporating my already existing DVD-Rs. + +I haven't really looked into the git-annex internals up to this point, but looking at the [[special_remotes/hook]] page there doesn't seem to be a hook for init which would be needed to populate git-annex's index of files in the remote. (git-annex seems to assume that new special remotes are empty) + +Another problem is where to store the hash to path relation information. On a RW remote it would be stored in the remote, but here we need to keep it in the repo somehow. This could be in the git-annex branch, or possibly another branch created specifically for this purpose. + +1) initremote needs to: + +* hash the contents of all the remote's files +* update git-annex's index of the remote's contents +* store the paths to the hashes in the repo + +2) store and remove should just fail. + +3) retrieve and check present seem straight forward. + +The assistant blog mentions adding support for read only remotes but I don't know anything about it: [[design/assistant/blog/day_65__transfer_polish]] (I'm still on 3.20120605) + +Let me know if there is anything I haven't thought of yet. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..b06891cd8 --- /dev/null +++ b/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 @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 5" + date="2012-10-21T05:36:36Z" + content=""" +I encourage playing around with the hook special remote and see how far you can make it go. + +I may be doing something vaguely like this for [[design/assistant/desymlink]], although I'm pretty sure it would still have a git repository associated with the directory of regular files. + +One option is to use the web special remote, with file:// urls. Assuming a given disc will always end up mounted somewhere stable, such as /media/dvd1, /media/dvd2, etc, you could then just `git annex addurl file:///media/dvd1/$file`. `git annex whereis` will show the url, which has enough info to work out the disk to mount. + +The web special remote did not support file:// urls, but I've just fixed that. The only downside is that, while it will identify files duplicated across disks, and `whereis` will show multiple urls for such files, there's only one web special remote, and so it only counts as 1 copy. This could perhaps be improved; git-annex may eventually get support for remotes reporting how many copies of a file they contain. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..ab971dab5 --- /dev/null +++ b/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 @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://www.openid.albertlash.com/openid/" + ip="74.96.185.87" + subject="It works!" + date="2012-10-24T22:00:31Z" + content=""" +This works great! I first tried it with WORM, no-go. I can see why the SHA backends are so powerful, they appear to circumvent the commits which git usually uses for merging. When I first do the merge, it reports this: + +warning: no common commits + +Compared to how I've managed CD/DVD backups in the past, this is a quantum leap forward, and I don't find it convoluted in comparison. Yes, there is dar, but I prefer this method. In my case, its the perfect solution for original files, which in generally are treated as immutable, and not accessed very often. They are usually large, too! I'm using them for digital pictures. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..736fc6ce2 --- /dev/null +++ b/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 @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="web and hook special remotes" + date="2012-10-24T23:26:53Z" + content=""" +Hi Joey, + +Thanks for the advice. I had thought of the web special remote; but as you may have noticed from my example, I don't use automount so my DVDs and CDs all get mounted in the same place. (/mnt/cdrom) so the web special remote won't work for me. + +I'll try to play around with the hook special remote this weekend. I had a thought it might be interesting to have it search for the DVDs in some common places or even by parsing the mounted file systems, and allow an override or augmentation through git config. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..84705d4cd --- /dev/null +++ b/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 @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="no need to merge" + date="2012-10-24T23:52:30Z" + content=""" +Albert, + +Thanks for feedback! I'm glad that somebody else found the method I worked out useful. As I'm going to try and turn it into a proper special remote, let me know if there is any particular use case or feature you'd like me to address. + +Note that in my testing, I found that you don't actually need to merge the DVD's branch into the local branch you are using for git annex to be able to find the files on it that are identical to files in your local branch. + +I haven't played around with cloning the repo, but I will try that this weekend. I'm thinking it *might* be necessary to create local branches from the DVD remotes so that they'll get carried along when you clone the repo. + +As far as the repos on the DVD's not having a shared ancestry with main repo, that was a conscious choice that I made. I wanted to add as little extra data to the DVDs as possible since I usually fill them to the brim anyway. I didn't feel that it would be beneficial for the DVD's to know about the history of the main repo and other files that they don't contain. Furthermore, besides all the links and history, you'd be replicating all the files in the main repo that aren't annexed. + +If you want to avoid the error, but still have a local branch for the DVD repos you should be able to do something like the following: + +WARNING: these commands are untested! +
+git checkout -b disc1 disc1/master
+git checkout -b disc2 disc2/master
+
+ +Working from the original example, you should then get local branches for the DVDs that don't have a common ancestor with your master local repo. I haven't actually tested that though. Testing will have to wait for this weekend. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..5a3f2885c --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.138" + subject="comment 9" + date="2012-10-25T03:33:29Z" + content=""" +@Steve, it seems to me you could still use the web special remote, just pointing it at an url that goes through a symlink to the mount point. +"""]] diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn b/doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn new file mode 100644 index 000000000..30e059743 --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn @@ -0,0 +1,13 @@ +Is it possible to run more than one instance of the assistant in an account? + +A particular example is that I might have two annexes: + +1. for my music, and +2. for some personal documents. + +I would like to have my music annex paired with my work laptop and have all the automagical power of git-annex-assistant working for me. However I don't want to put my personal documents on a work machine, hence the second annex. + +(I think) An ideal world would have the assistant managing both annexes. Is this possible? + + +I know my question is similar to [one annex versus many annexes?](http://git-annex.branchable.com/forum/one_annex_versus_many_annexes__63__/) but I think it is different enough to warrant a new thread... diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_1_ba8c70e4a46441b48ad910625636eee5._comment b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_1_ba8c70e4a46441b48ad910625636eee5._comment new file mode 100644 index 000000000..675b5b71c --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_1_ba8c70e4a46441b48ad910625636eee5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-19T17:08:39Z" + content=""" +If you go to the upper-right menu in the webapp, and select \"New repository\", you can add a separate independant repository. The assistant's autostart will run it on both of them when you log in. +"""]] diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_2_4b4f0a7d84a51ae92536e2c190256069._comment b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_2_4b4f0a7d84a51ae92536e2c190256069._comment new file mode 100644 index 000000000..86fa9ebab --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_2_4b4f0a7d84a51ae92536e2c190256069._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkk3K0AUduAybbBO_LRRGKOe2zcGeezbzI" + nickname="Nathan" + subject="Webapp spins when adding a second annex" + date="2012-11-20T04:55:05Z" + content=""" +I was trying to add a second annex (repository) via the webapp, but it seems like the process never completes: the browser just spins (\"connecting...\"). If I kill the webapp process and restart, I can see the second annex in the list of repositories, but clicking on it gives the same behaviour. Interestingly, the path *is* added to ~/.config/git-annex/autostart, and the webapp does create the path, if needed, and initializes it as a git annex. I've reproduced this on two different machines, both running Ubuntu 12.10 and git annex 3.20121112. + +Is there anything I can do to help debug? +"""]] diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_3_86daadc565f96db5db13b6dbcbc66db3._comment b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_3_86daadc565f96db5db13b6dbcbc66db3._comment new file mode 100644 index 000000000..6ad879d76 --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_3_86daadc565f96db5db13b6dbcbc66db3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-11-25T18:59:37Z" + content=""" +@Nathan at this point, you should have two separate git-annex processes running, one for each repository. You can try opening a shell, changing to the new repository, and running `git annex webapp --debug` to get debugging information on the new one. +"""]] diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment new file mode 100644 index 000000000..78570a08d --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 4" + date="2012-11-28T20:13:11Z" + content=""" +@Nathan, I have just noticed and fixed a problem that could cause this to happen if you were using the standalone tarball (or OSX app) builds. It would not affect git-annex installed by other methods. +"""]] diff --git a/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_5_e94d33be83b45918d1a39d6e16fba4b4._comment b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_5_e94d33be83b45918d1a39d6e16fba4b4._comment new file mode 100644 index 000000000..ae9c5c5b6 --- /dev/null +++ b/doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_5_e94d33be83b45918d1a39d6e16fba4b4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkk3K0AUduAybbBO_LRRGKOe2zcGeezbzI" + nickname="Nathan" + subject="comment 5" + date="2012-12-11T04:15:49Z" + content=""" +Thanks, Joey; I was using the standalone build, and it seems to be behaving better now. +"""]] diff --git a/doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn b/doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn new file mode 100644 index 000000000..60942584b --- /dev/null +++ b/doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn @@ -0,0 +1,5 @@ +I have the webapp setup to manage 4 different repositories. + +One repository had many gigabytes to upload to a remote. As this was moving along, I wanted to check on the status of one of the other repositories. I knew that this second repository had a lot of data to download. When I switched to the second repo in the webapp, I noticed in my network monitor that the amount of upstream bandwidth I was using dropped and the amount of downstream bandwidth increased. I switched back to the first repo, and my downstream bandwidth dropped and the upstream bandwidth increased. + +It looks like git-annex stopped uploading data from the first repo when I switched to the second, and stopped downloading data to the second repo when I switched to the first. Is this correct? I was under the impression that switching repositories in the webapp simply changed the view that I was looking at, but that the assistant would still be managing all the repositories I had setup -- uploading/downloading/syncing concurrently. diff --git a/doc/forum/Managing_multiple_repositories_concurrently__63__/comment_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment b/doc/forum/Managing_multiple_repositories_concurrently__63__/comment_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment new file mode 100644 index 000000000..c1c5cd917 --- /dev/null +++ b/doc/forum/Managing_multiple_repositories_concurrently__63__/comment_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-17T18:53:26Z" + content=""" +Each repository gets its own git-annex assistant daemon, which is entirely separate from the daemons used by other repositories. + +The only affect that switching which repository is in view in the webapp can have is it can start a daemon running on a repository that for some reason did not already have the daemon running. This could happen if it was not set to autostart on login, for example. +"""]] diff --git a/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn b/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn new file mode 100644 index 000000000..82a1c70ba --- /dev/null +++ b/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn @@ -0,0 +1 @@ +My current setup involves 3 computers, one desktop one laptop and a vps. In my current setup I have created annex repos on the server and cloned from it, both machines sync to the server. All three use non base repos. Now I have another annex folder on the desktop that I would like to sync between the three. Both machines are behind NAT so server can not communicate with the machines. In order to init the repo on the vps, I was thinking of setting up a temporary VPN/port forward between the desktop and the VPS then clone from the desktop finally remove the remote section in .git/config on the server so VPS becomes the master again. First of all is there an easier way to do this? if not is it safe to do this? or is it going to cause problems down the line. diff --git a/doc/forum/Manual_Setup_of_a_Central_Repo/comment_1_3a163fd5629dc40423f1290a78ae1c07._comment b/doc/forum/Manual_Setup_of_a_Central_Repo/comment_1_3a163fd5629dc40423f1290a78ae1c07._comment new file mode 100644 index 000000000..e5630b331 --- /dev/null +++ b/doc/forum/Manual_Setup_of_a_Central_Repo/comment_1_3a163fd5629dc40423f1290a78ae1c07._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-26T18:46:06Z" + content=""" +You could certainly do that. I don't think it's the easiest way. + +Note that this is essentially a git question. It really has nothing to do with git-annex, unless you want to use the git-annex assistant, which can sync a repository over XMPP without needing a central git repository at all. + +If I had this problem with git in general, I would make a new empty repository on the server, and push the local repository I have on the one machine to it. Then on the other machine, I would clone from the server. Problem solved, I think? +"""]] diff --git a/doc/forum/Manual_commit_message_in_direct_mode.mdwn b/doc/forum/Manual_commit_message_in_direct_mode.mdwn new file mode 100644 index 000000000..d74c36607 --- /dev/null +++ b/doc/forum/Manual_commit_message_in_direct_mode.mdwn @@ -0,0 +1,3 @@ +I am just returning to git-annex after some time. The last time I was using it, the [[/todo/direct_mode_guard]] was not yet in place, and I could supply my own commit messages even in a direct mode repository using `git commit`. Now that the guard is in place, is there a built-in way to provide a commit message that will be used instead of "git-annex automatic sync" by `git annex sync`? + +I have tried doing a manual commit with `git --git-dir=/path/to/local/.git --work-tree=/path/to/local -c core.bare=false commit -m 'Manual Commit Message'`, and it seems to work. Does this do the same thing as the part of `git annex sync` that commits any outstanding changes before syncing with remotes? diff --git a/doc/forum/Manual_commit_message_in_direct_mode/comment_1_32f95eefec25bb127ed96248446c21b1._comment b/doc/forum/Manual_commit_message_in_direct_mode/comment_1_32f95eefec25bb127ed96248446c21b1._comment new file mode 100644 index 000000000..bb53d4458 --- /dev/null +++ b/doc/forum/Manual_commit_message_in_direct_mode/comment_1_32f95eefec25bb127ed96248446c21b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 1" + date="2014-05-27T16:10:29Z" + content=""" +Yes, you can use the `-c core.bare=false` trick to bypass the direct mode guard if you want to. Just bear in mind that it's very easy to shoot yourself in the foot by passing -a or filenames to git commit, which then checks the whole large file into git.. +"""]] diff --git a/doc/forum/Manual_commit_message_in_direct_mode/comment_2_bf1d10067379c802ac5020d8becd6d35._comment b/doc/forum/Manual_commit_message_in_direct_mode/comment_2_bf1d10067379c802ac5020d8becd6d35._comment new file mode 100644 index 000000000..facb5ce33 --- /dev/null +++ b/doc/forum/Manual_commit_message_in_direct_mode/comment_2_bf1d10067379c802ac5020d8becd6d35._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxvt4mc32O0ctvPGhhII_ZKsHUiaD2o7I" + nickname="William" + subject="comment 2" + date="2014-05-28T04:40:27Z" + content=""" +Joey, thanks for clarifying that. I learned about the perils of using regular git commands in direct mode before the guard was implemented, so I will use with care. Specifying a commit message is really the only case where I am tempted to bypass the the `git annex` subcommands in direct mode. + + +"""]] diff --git a/doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn b/doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn new file mode 100644 index 000000000..49b58e529 --- /dev/null +++ b/doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn @@ -0,0 +1,11 @@ +Hi, + +I've recently set-up a server which uses Southpaw's Tactic DAM system and I've initialised a git-annex directory using the assistant which will manage any files which Tactic puts into the git-annex. I plan to make some remote repositories to Amazon S3, friends and some local machines on my home network. The server is running Ubuntu 64-bit and so I've written an upstart job which runs 'git-annex assistant --autostart' as the user 'git-annex' as this user doesn't log-in and run the xdg autostart .desktop at all. + +I saw that you can set the purpose of each repository which it will sync to and noticed 'Manual Mode.' From the description, it seems it will only work if I do explicit git-annex commands to it which would be perfect for me as I'd like to write tools which run git-annex add/get/drop/etc. manually on some remotes like ones to friends as I don't want them to sync to everything or any files that they produce, only files which they request with a special tool that I'll write and have Tactic marshal the file changes/names/etc. + +I've set those remotes to manual-mode via the assistant and tried copying a file to the remote's directory, but it auto-synced the file anyway. Maybe I'm getting confused at how manual mode works but I'd like to only explicitly set which files to add to the repo by a command and not just 'any' file which gets placed into that directory. If this is more of a wishlist request I guess just move this post into there and I'll reword it as a wish request. + +I don't need to use the assistant if that makes more sense, but I would like to be able to still monitor things as the webapp makes for a great GUI to check for that stuff. I can't wait for the https version of webapp too, I currently run git-annex webapp --listen=: and then run the link it outputs on my desktop machine to manage it from the server. + +Thanks, and this is such a great bit of software, especially as my Internet connection is really bad for 2013 standards, and having the option for friends/remote servers to sync up via an encrypted S3 or box.com account is great! diff --git a/doc/forum/Manual_mode_option_in_assistant_auto-syncs/comment_1_4a0468b6ca2ffff8ef8f19800597567d._comment b/doc/forum/Manual_mode_option_in_assistant_auto-syncs/comment_1_4a0468b6ca2ffff8ef8f19800597567d._comment new file mode 100644 index 000000000..56e68f779 --- /dev/null +++ b/doc/forum/Manual_mode_option_in_assistant_auto-syncs/comment_1_4a0468b6ca2ffff8ef8f19800597567d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T16:20:29Z" + content=""" +In the assistant, putting a repository in manual mode prevents the assistant from automatically downloading every file that is added to other clones of the repository. As you've noticed, it does not prevent the assistant from automatically adding new files that are put into the local repository, or from uploading those files to other clients that want them (ie, clients not themselves set to use manual mode). + +You can prevent the assistant from noticing when you add new files to a repository by clicking on \"syncing enabled\" in the first repository in the list. (The repository labeled as \"here\".) You can then `git annex add` the files you want to add by hand, and manually `copy annex copy` them to other repositories, and manually `git annex sync`. +"""]] diff --git a/doc/forum/Manual_webapp_behaviour_on_ARM.mdwn b/doc/forum/Manual_webapp_behaviour_on_ARM.mdwn new file mode 100644 index 000000000..8b7b8fe27 --- /dev/null +++ b/doc/forum/Manual_webapp_behaviour_on_ARM.mdwn @@ -0,0 +1,15 @@ +Hello, + +I have a Samsung ARM Chromebook running Ubuntu with crouton (chroot in chromeos). I want to use git-annex, and add the chromebook as a second "device" to my already set up git-annex repo on my main pc. That repo is one folder set up with the assistant, and it has one encrypted ssh(rsync) remote. + +I've read that the webapp is not available on ARM, and I've also found a topic with a simple script to replicate git-annex-assistant steps: http://git-annex.branchable.com/forum/Running_assistant_steps_manually/. So, I've used the `cabal` steps to install git-annex manually, which is working. + +I want to use git-annex in a dropbox-like fashion, folder and file sync between these two devices (and maybe later on another encrypted ssh remote). However I'm in need of some guidance regarding the command line usage and such. + +My questions are: + +- How do I "add" the chromebook repo to the existing git-annex setup? +- The machines are not on at the same time. One is my main workstation and the chromebook is my "mobile friend". The encrypted ssh remote is on a VPS, that is always on. + - How do I configure the syncing between the main machine, the chromebook and the encrypted ssh remote on the vps? If possible, bi-directional. + +If it is possible, both explanation and command line examples would help a lot. diff --git a/doc/forum/MegaAnnex_not_working..mdwn b/doc/forum/MegaAnnex_not_working..mdwn new file mode 100644 index 000000000..3eff4b741 --- /dev/null +++ b/doc/forum/MegaAnnex_not_working..mdwn @@ -0,0 +1,32 @@ +When copying to a megaannex remote, it hangs after a while, and I get this: + + copy Boomarks/Android (gpg) Traceback (most recent call last): + File "/usr/local/bin//git-annex-remote-mega", line 511, in + common.startRemote() + File "/home/zack/megaannex/lib/CommonFunctions.py", line 557, in startRemote + sys.modules["__main__"].checkpresent(line) + File "/usr/local/bin//git-annex-remote-mega", line 483, in checkpresent + folder = setFolder(conf["folder"], common.ask("DIRHASH " + line[1])) + File "/usr/local/bin//git-annex-remote-mega", line 401, in setFolder + folder = createFolder(conf["folder"], 2) + File "/usr/local/bin//git-annex-remote-mega", line 378, in createFolder + res = m.create_folder(subject, folder) + File "/usr/lib/python2.7/site-packages/mega/mega.py", line 617, in create_folder + 'i': self.request_id}) + File "/usr/lib/python2.7/site-packages/mega/mega.py", line 110, in _api_request + timeout=self.timeout) + File "/usr/lib/python2.7/site-packages/requests/api.py", line 88, in post + return request('post', url, data=data, **kwargs) + File "/usr/lib/python2.7/site-packages/requests/api.py", line 44, in request + return session.request(method=method, url=url, **kwargs) + File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 354, in request + resp = self.send(prep, **send_kwargs) + File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 460, in send + r = adapter.send(request, **kwargs) + File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 250, in send + raise SSLError(e) + requests.exceptions.SSLError: The read operation timed out + (external special remote protocol error, unexpectedly received "" (unable to parse command)) failed + + +Any help would be appreciated, thanks! diff --git a/doc/forum/MegaAnnex_not_working./comment_1_5aa3fd366d4c78ca79bb58005a49791c._comment b/doc/forum/MegaAnnex_not_working./comment_1_5aa3fd366d4c78ca79bb58005a49791c._comment new file mode 100644 index 000000000..c2e7353db --- /dev/null +++ b/doc/forum/MegaAnnex_not_working./comment_1_5aa3fd366d4c78ca79bb58005a49791c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T19:42:24Z" + content=""" +This looks to me like the connection to Mega fails, so either they have a server down, or a network problem, or perhaps the API that the megaannex remote was relying on might have been removed.. +"""]] diff --git a/doc/forum/Missing_git-annex.linux__47__runshell.mdwn b/doc/forum/Missing_git-annex.linux__47__runshell.mdwn new file mode 100644 index 000000000..3ad7e85c1 --- /dev/null +++ b/doc/forum/Missing_git-annex.linux__47__runshell.mdwn @@ -0,0 +1,44 @@ +Hi, + +I've said up two clients to sync locally as well as over ssh-rsync. + +However, locally one client is complaining about missing `runshell` at a location where `git annex` is not installed. The log is below. On the assistent overview it just says "unfinished repository". Note that I am able to ssh into the other machine and from the other machine I'm also able to ssh into this machine. + + +I'm using the latest prebuild binary package (git-annex-bin at Archlinux AUR). So my `git annex` setup contains + + $> pacman -Ql git-annex-bin + git-annex-bin /usr/ + git-annex-bin /usr/bin/ + git-annex-bin /usr/bin/git-annex + git-annex-bin /usr/bin/git-annex-shell + + $> pacman -Qi git-annex-bin # with chops + Name : git-annex-bin + Version : 4.20130909-1 + Description : Precompiled version of git-annex, webapp and assistant + included. + Architecture : x86_64 + +Here is a log of one event where it fails to transfer. + + [2013-09-28 18:06:38 CEST] TransferScanner: queued Upload NoUUID config/emacs.d/ac-l-dict/amsmath-c-a-* Nothing : expensive scan found missing object + [2013-09-28 18:06:38 CEST] Transferrer: Transferring: Upload NoUUID config/dotfiles/stardict/dic/stardict-oxford-2.4.2/oxford.ifo Nothing + [2013-09-28 18:06:38 CEST] call: git-annex ["transferkeys","--readfd","96","--writefd","94"] + [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","show-ref","git-annex"] + [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","show-ref","--hash","refs/heads/git-annex"] + [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex[","log2","0r1e3f-s/0h9e-ad2s8/ g1i8t-annex..90df78a0910a6f2998655e6:06:38 CEST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2 + ea47d478ea0589b54","--oneline","-n1"] + [2013-09-28 18:06:38 CEST] read: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","log","refs/heads/git-annex..5f6870ed24e5ded1764765bbfef2b85aff046569","--oneline","-n1"] + [2013-09-28 18:06:38 CEST] chat: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","cat-file","--batch"] + [2013-09-28 18:06:38 CEST] read: ssh ["-S","/home/rasmus/annex/.git/annex/ssh/00b8ef4cb08290718ba625d9bd86ca0b","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","rasmus@git-annex-192.168.1.107-rasmus_annex","git-annex-shell 'configlist' '/~/annex/'"] + /home/rasmus/.ssh/git-annex-shell: line 4: /opt/git-annex.linux/runshell: No such file or directory + [2013-09-28 18:06:38 CEST] call: git ["--git-dir=/home/rasmus/annex/.git","--work-tree=/home/rasmus/annex","fetch","--quiet","192.168.1.107_annex"] + [2013-09-28 18:06:38 CEST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2 + [2013-09-28 18:06:38 CEST] 127.0.0.1 GET /log Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 Aurora/26.0a2 + /home/rasmus/.ssh/git-annex-shell: line 4: /opt/git-annex.linux/runshell: No such file or directory + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + git-annex: Unknown UUID diff --git a/doc/forum/Missing_git-annex.linux__47__runshell/comment_1_f29a5105649579ef15e79d983c4e1f8e._comment b/doc/forum/Missing_git-annex.linux__47__runshell/comment_1_f29a5105649579ef15e79d983c4e1f8e._comment new file mode 100644 index 000000000..a10c4aaf0 --- /dev/null +++ b/doc/forum/Missing_git-annex.linux__47__runshell/comment_1_f29a5105649579ef15e79d983c4e1f8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 1" + date="2013-09-30T16:08:40Z" + content=""" +You apparently at one point installed git-annex from the prebuilt tarball, in `/opt/git-annex.linux/`. It set up a ~/.ssh/git-annex-shell that points to this location. If you no longer have it installed that way, you can remove that file. +"""]] diff --git a/doc/forum/Modification_time_of_files_retained_in_synchronized_remote_copies__63__.mdwn b/doc/forum/Modification_time_of_files_retained_in_synchronized_remote_copies__63__.mdwn new file mode 100644 index 000000000..3cd519a6d --- /dev/null +++ b/doc/forum/Modification_time_of_files_retained_in_synchronized_remote_copies__63__.mdwn @@ -0,0 +1,5 @@ +I've noticed how, when files are synchronized/transferred from one repository (annex?) to another by the assistant, the files in the «remote» repository do no retain the modification time of the original files. +From what I know git does not save file-specific metadata (ownership/timestamps/etc.). +Since I've just started using git-annex, and I'd very much like for backup copies to retain the mtime of the originals, I would like to ask whether I am experiencing a malfunction or whether this is expected behaviour. + +Regards diff --git a/doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn new file mode 100644 index 000000000..55d51f21d --- /dev/null +++ b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn @@ -0,0 +1,19 @@ +Is there a way to move a large file without "git annex unlock"ing it (Which takes very long for copying and then rehashing the file)? +Using a simple "mv" or "git mv" results in broken symlinks, if the target directory is on a different hierarchy level: + +Example: + +Initial State: + + $ ls -Hl Pictures: + Pictures/showImages.jpg -> ../.git/annex/objects/90/32/SHA1-s8737--a8bfb285d0ae394cb75c86f1eb9f703fb678a51e/SHA1-s8737--a8bfb285d0ae394cb + +Move: + + $ mv Pictures/showImages.jpg . + +Result: + + $ ls -H showImages.jpg + ls: cannot access showImages.jpg: No such file or directory + diff --git a/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_1_9e3290138133d5a23a80f72342f47ec4._comment b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_1_9e3290138133d5a23a80f72342f47ec4._comment new file mode 100644 index 000000000..d1df9cf51 --- /dev/null +++ b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_1_9e3290138133d5a23a80f72342f47ec4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2012-11-28T13:28:21Z" + content=""" +Just commit, git-annex will fix the symlinks. Or do it manually with 'git annex fix'. +"""]] diff --git a/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_2_232b77894dda51d02cbc34bd25d3213b._comment b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_2_232b77894dda51d02cbc34bd25d3213b._comment new file mode 100644 index 000000000..0559e7954 --- /dev/null +++ b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_2_232b77894dda51d02cbc34bd25d3213b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="Does not work" + date="2012-11-28T14:50:16Z" + content=""" + $ git annex fix + +Does not change anything. and + + $ git annex fix showImages.jpg + git-annex: showImages.jpg not found +"""]] diff --git a/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_3_d35ac1bdb3fa6e303ad92348ba174158._comment b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_3_d35ac1bdb3fa6e303ad92348ba174158._comment new file mode 100644 index 000000000..d4d25a705 --- /dev/null +++ b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_3_d35ac1bdb3fa6e303ad92348ba174158._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 3" + date="2012-11-28T15:03:42Z" + content=""" +In my tests 'git annex fix' works only on symlinks in directories alredy known to git. So if you created a new directory inside your annex, be sure to 'git add' the directory before running 'git annex fix'. + +HTH, +Karsten +"""]] diff --git a/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_4_4b443ec6b47eaabe214d0c2222083e4a._comment b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_4_4b443ec6b47eaabe214d0c2222083e4a._comment new file mode 100644 index 000000000..cf09b261a --- /dev/null +++ b/doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_4_4b443ec6b47eaabe214d0c2222083e4a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 4" + date="2012-11-28T15:14:49Z" + content=""" +Thanks. It seems that the file itself has to be added to git annex to be able to bet git annex fixed! +"""]] diff --git a/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout.mdwn b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout.mdwn new file mode 100644 index 000000000..3ed022b48 --- /dev/null +++ b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout.mdwn @@ -0,0 +1,4 @@ +Hi, +Is there any way I can move or copy file content of older version without doing checkout to that version, by passing commit hash as parameter in move command itself? + +Thank you diff --git a/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_1_f114b75b29123453758b493fae7f5167._comment b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_1_f114b75b29123453758b493fae7f5167._comment new file mode 100644 index 000000000..a53c6bbd6 --- /dev/null +++ b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_1_f114b75b29123453758b493fae7f5167._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafael" + subject="comment 1" + date="2012-05-15T07:59:57Z" + content=""" +I had a similiar question in forum/new_microfeatures/. I would like to fetch/copy all the annexed content from a repo, be it on the current branch, another branch, or corresponds to an old version of a file. A command like \"git annex copy --all --from=source [path]\" would then ensure I have access to all the content I need even if I have later no longer access to source. Sure I could use rsync. +"""]] diff --git a/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_2_e377b7614c2961b460a10e285f3db274._comment b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_2_e377b7614c2961b460a10e285f3db274._comment new file mode 100644 index 000000000..18ff153ad --- /dev/null +++ b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_2_e377b7614c2961b460a10e285f3db274._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.51" + subject="comment 2" + date="2012-05-15T17:00:10Z" + content=""" +Yes, I think that [[todo/add_-all_option]] is the right approach for this. Seems unlikely you'd have some files' hashes handy without having them checked out, but operating on all content makes sense. + +That page discusses some problems implementing it for some commands, but should not pose a problem for `move`. It would also be possible to support `get` and `copy`, except `--auto` couldn't be used with `--all`. Even `fsck` could support it. +"""]] diff --git a/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_3_d251958795ab0867c65cf182e54a6ffe._comment b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_3_d251958795ab0867c65cf182e54a6ffe._comment new file mode 100644 index 000000000..63d1e6800 --- /dev/null +++ b/doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_3_d251958795ab0867c65cf182e54a6ffe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 3" + date="2013-07-03T18:10:29Z" + content=""" +Now the --all option is built. You can, for example, run `git annex copy --all --to backup` +"""]] diff --git a/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant.mdwn b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant.mdwn new file mode 100644 index 000000000..0614554ad --- /dev/null +++ b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant.mdwn @@ -0,0 +1,57 @@ +This post is a personal story, a bug report, and a feature request. + +I discovered `git-annex assistant` by accident a couple of weeks (months?) ago. I was very impressed by the technical smartness and decided it was worth a try. My current configuration (everything done through the assistant web GUI) is: + +* Two machines that act as client repositories and are usually in the same LAN. Both of them run OS X Mountain Lion. +* One transfer repository which was Box.com, but then I switched to Amazon S3 (today, I’ll explain why). +* The repository consists of mixed files and is ~4 GB big (very small plain text files, PDFs, some MP3 files, the biggest files are about 20–50 MB). The Finder reports that the repository is ~40 GB big while `du -sh` reports 4.4 GB. It’s probably just a silly Finder bug, but it would be great to know why this happens. +* I have version 4.20130324 on both clients. The OS X versions seems to be always a little bit behind. It would be great if it could match with other platforms. + +Here are some issues which I think are worth mentioning: + +1. I had some issues with the assistant, because I initially launched it from the mounted DMG. `git-annex assistant` set the environment up, but it configured the wrong paths (to `/Volumes` instead `/Applications` where the bundle later went). This has caused issues with authentication and some ssh keys. `git-annex` was confused which keys to use and I had to manually remove the first ones from the `.ssh/` directory. This could be very confusing for technically not so savvy users, because the error messages in the GUI were confusing. + +2. I’m still very confused about the behavior of `git-annex assistant` when it launches. The application icon bounces in the Dock for quite a long time, then it looks like the process would’ve crashed (I can only *Force Quit* it from the Dock). Then the icon disappears after some minutes / half an hour. I was unsure if the assistant would run if I would *Force Quit* it (yes). The behavior is very strange on OS X. It would be great to have at least a normal icon which bounces a couple of times, stays in the Dock without appearing like a non-responding app, and that launches the web GUI when a user clicks on it. Optimal would be just a menu bar icon which would show the current progress, let me launch the web GUI, check for updates, pause & resume all transfers, and restart & quit `git-annex assistant`. + +3. The initial sync went great and pretty fast. I was also impressed by the speed `git-annex` picks up new changes and synchronizes them to other repositories. After adding the Box.com transfer repository everything got worse. Files that were added to one of the client repositories were never synced to the other machine, despite making sure that the client repositories appeared above the Box.com repository in `git-annex assistant`. The transfer was very slow (that’s probably due to the API rate limits of Box.com) and I got the impression that the files were uploaded multiple times (probably true, because the assistant couldn’t upload them in the first place and then just tried it again giving me the impression that it was stuck in some kind of loop). I tried to manually click on a couple of hundred play buttons in the queue in the hope that there would somewhere appear the item which should’ve been synced to the other machine in the first place. I also attached some log messages to the end of this post which could be helpful. At this point `git-annex assistant` basically stopped working for me. I lived somehow with it in the hope that it would upload everything to Box.com in the upcoming days, but it never got better, even after a couple of weeks (in the meantime we copied files manually over an attached network storage which lived outside of the repository). Today I bit the bullet and switched to Amazon S3. All files were uploaded in a couple of minutes and it looks like this setup would be more reliable. It’ll cost us a couple of $ each month, but it’s OK, because it actually works. + +4. I read somewhere that transfer repositories where meant to keep only files that are not present on all client repositories. With my configuration `git-annex` just uploads everything to the transfer repository (no matter if it’s Box.com or Amazon S3). Is this the correct behavior? Did I get something wrong or is this just not implemented yet? It’s OK in the current version, but it would be great to store only the missing files in the future. + +5. After I switched to Amazon S3 some encrypted file names appear in my queue. They are gone after I restart `git-annex assistant` or when I manually remove them with the `X` button. Is this a bug? + +6. It is confusing that the web GUI shows that the transfer failed when the second machine is offline. While technically this is true, it would be much more assuring to know that the client is just offline. If something fails I get the impression that it is broken, but the client was only unreachable and that’s just a temporary state that’ll get automatically fixed when the client goes online again. Adding green / red lights to the repository with a mouse over description would be probably a good idea. Reporting that the client is unreachable instead of showing the error message would also be more appropriate. + +7. The biggest issue I have now is that `git-annex assistant` randomly crashes on both machines. I don’t know if this is a known issue or if this an OS X only issue, but it is slightly annoying. If you want to make sure that files really synchronized, you’ve to start `git-annex assistant` just to check if it still runs. I hope that this will get fixed as soon as possible. I would love to help you with debug logs, but I don’t know where to look. There’s nothing meaningful in the system log or the debug log. + +8. If the issues with Box.com are because of their API rate limits, I would make this clearer when adding new Box.com repositories or I would remove the feature altogether, because they actually make `git-annex assistant` unusable. + +To sum everything up: my biggest issues so far are the constant crashes and the strange behavior of the Dock icon. I’m still pretty impressed by the technical smartness and that the software is available at all. Thank you very much—Joey—for letting us use this software on a daily basis. I’m glad that you launched the Kickstarter campaign. I don’t know if it’s much of a hassle, but a second Kickstarter to make sure that development will continue would be probably a good idea. I would like to help with logs, but I don’t know how. Please let me know if there’s something I can do. + +**Box.com logs:** + + 87% 16.0KB/s 2s[2013-04-22 15:14:35 CEST] Pusher: Syncing with 10.0.1.4_jcshared + To ssh://rafael@git-annex-10.0.1.4-rafael/~/jc-shared/ + 7428090..f0d2f9e git-annex -> synced/git-annex + 9d2cb35..1f7b678 master -> synced/master + Already up-to-date. + Already up-to-date. + gpg: [stdout]: write error: Broken pipe + gpg: DBG: deflate: iobuf_write failed + gpg: build_packet failed: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: symmetric encryption of `[stdin]' failed: file write error + ResponseTimeout + git-annex: fd:41: hPutBuf: resource vanished (Broken pipe) + ResponseTimeout + (gpg) + 87% 16.0KB/s 2sgpg: [stdout]: write error: Broken pipe + gpg: DBG: deflate: iobuf_write failed + gpg: build_packet failed: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: symmetric encryption of `[stdin]' failed: file write error + ResponseTimeout + git-annex: fd:54: hPutBuf: resource vanished (Broken pipe) + send: resource vanished (Connection reset by peer) + ResponseTimeout diff --git a/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_1_9d4019a54fb508e286a5d6d2660361d9._comment b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_1_9d4019a54fb508e286a5d6d2660361d9._comment new file mode 100644 index 000000000..10e10e06c --- /dev/null +++ b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_1_9d4019a54fb508e286a5d6d2660361d9._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T21:41:31Z" + content=""" +This is a lot of stuff. It would be better to file individual detailed bug reports if you want any of this looked at in depth. Otherwise, I just read it to get an impression of how things are working, or not, for you, and try to hit some of the main points: + +* The OSX app icon behavior is probably because OSX does not realize that this is supposed to be a daemon. I don't know how to fix that. Clicking on the app icon is supposed to launch the web app, and has been reported to do so by others. I have no access to an OSX desktop. + +* Transfer repositories only keep files that have not yet reached all your client repositories. However, it's possible that files + may be uploaded to a transfer repository unnecessarily (if there is some other path for the file to get to the other client + repositories, ie if you've locally paired them). In this case, the file will be uploaded and then later removed from the transfer + repository, without being used. + +* I have never seen encrypted filenames appear in the webapp. I don't see how that could happen TBH. + +* git-annex logs information to `.git/annex/debug.log` within your repository. You can go to Configuration -> Preferences to enable + additional debug logging. I absolutely need these logs to help debug almost any problems with the assistant. + +* \"Clicking a couple of hundred play buttons\" could result in it trying to make a couple of hundred uploads to box.com + at the same time. This is probably not a good idea. + +* The fragment of log you posted shows me some problem that caused gpg to fail to encrypt a file before sending it to somewhere, + but it's lacking all context (and starts when the file transfer is already 87% complete!) so I can't say more. I need to see the whole log to make any informed guesses about what might be going on. +"""]] diff --git a/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_2_109534a45881ce94a4586c8a83945f9f._comment b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_2_109534a45881ce94a4586c8a83945f9f._comment new file mode 100644 index 000000000..33b2aa393 --- /dev/null +++ b/doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_2_109534a45881ce94a4586c8a83945f9f._comment @@ -0,0 +1,85 @@ +[[!comment format=mdwn + username="EmanueleAina" + ip="93.38.211.231" + subject="comment 2" + date="2013-09-11T17:55:14Z" + content=""" +I seem to hit the same issue (`ResponseTimeout`) on box.com, but I don't have any log file under .git/annex. + +The timeout is quite unpredictable, sometimes I'm able to transfer less than 20% of the file while sometimes it fails after reaching 51%. The file is quite big, 6.2G. + +Unfortunately, after the first upload fails, `git-annex` seems to think that the file has been uploaded successfully and will refuse to copy it again. Even `whereis` will list the box.com location. + +I think there are really two bugs: the one triggering the timeouts, and the fact that `git-annex` thinks that the failing upload succeeded and is unable to recover the interrupted upload. + +Here's the log I got on the shell. Let me know how I can provide any additional information needed. Thanks! + + $ git annex copy --verbose --debug home.tar.gz --to box.com + [2013-09-11 17:42:52 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"git-annex\"] + [2013-09-11 17:42:52 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-11 17:42:52 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1e029f92c5c82b094cbe70b55927996c31579e2e\",\"--oneline\",\"-n1\"] + [2013-09-11 17:42:52 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1090c21b121fd8b6e2ab49a772c8eab5235a3930\",\"--oneline\",\"-n1\"] + [2013-09-11 17:42:52 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"cat-file\",\"--batch\"] + [2013-09-11 17:42:52 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"home.tar.gz\"] + copy home.tar.gz (gpg) [2013-09-11 17:42:52 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"] + (checking box.com...) (to box.com...) + [2013-09-11 17:42:57 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"11\",\"--symmetric\",\"--force-mdc\",\"--no-textmode\"] + 35% 660.8KB/s 1h44mResponseTimeout + gpg: [stdout]: write error: Broken pipe + gpg: DBG: deflate: iobuf_write failed + gpg: build_packet failed: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: symmetric encryption of `[stdin]' failed: file write error + git-annex: fd:13: hPutBuf: resource vanished (Broken pipe) + failed + git-annex: copy: 1 failed + $ git annex copy --verbose --debug home.tar.gz --to box.com + [2013-09-11 19:38:26 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"git-annex\"] + [2013-09-11 19:38:26 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-11 19:38:26 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1e029f92c5c82b094cbe70b55927996c31579e2e\",\"--oneline\",\"-n1\"] + [2013-09-11 19:38:26 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1090c21b121fd8b6e2ab49a772c8eab5235a3930\",\"--oneline\",\"-n1\"] + [2013-09-11 19:38:26 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"cat-file\",\"--batch\"] + [2013-09-11 19:38:26 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"home.tar.gz\"] + copy home.tar.gz (gpg) [2013-09-11 19:38:26 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"] + (checking box.com...) ok + $ git annex whereis --verbose --debug home.tar.gz + [2013-09-11 19:38:57 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"git-annex\"] + [2013-09-11 19:38:57 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-11 19:38:57 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1e029f92c5c82b094cbe70b55927996c31579e2e\",\"--oneline\",\"-n1\"] + [2013-09-11 19:38:57 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1090c21b121fd8b6e2ab49a772c8eab5235a3930\",\"--oneline\",\"-n1\"] + [2013-09-11 19:38:57 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"cat-file\",\"--batch\"] + [2013-09-11 19:38:57 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"home.tar.gz\"] + whereis home.tar.gz (2 copies) + d7db543e-5463-11e2-b7dd-9f423f798cc4 -- here (em@ocracy:/data/backup) + e71fa45e-5463-11e2-a14e-93ca09c272da -- box.com + ok + $ git annex fsck --verbose --debug home.tar.gz + [2013-09-11 19:39:05 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"home.tar.gz\"] + [2013-09-11 19:39:05 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] + fsck home.tar.gz [2013-09-11 19:39:05 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"git-annex\"] + [2013-09-11 19:39:05 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-11 19:39:05 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1e029f92c5c82b094cbe70b55927996c31579e2e\",\"--oneline\",\"-n1\"] + [2013-09-11 19:39:05 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1090c21b121fd8b6e2ab49a772c8eab5235a3930\",\"--oneline\",\"-n1\"] + [2013-09-11 19:39:05 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"cat-file\",\"--batch\"] + (checksum...) [2013-09-11 19:39:05 CEST] read: sha256sum [\"/data/backup/.git/annex/objects/mG/kp/SHA256E-s6640317400--dcf0a535728f3f3f787db6339b740a4a6f6529e5ce1d238f28574499a8172670.tar.gz/SHA256E-s6640317400--dcf0a535728f3f3f787db6339b740a4a6f6529e5ce1d238f28574499a8172670.tar.gz\"] + ok + $ git annex fsck --verbose --debug home.tar.gz --from box.com + [2013-09-11 19:42:15 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"git-annex\"] + [2013-09-11 19:42:15 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-11 19:42:15 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1e029f92c5c82b094cbe70b55927996c31579e2e\",\"--oneline\",\"-n1\"] + [2013-09-11 19:42:15 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"log\",\"refs/heads/git-annex..1090c21b121fd8b6e2ab49a772c8eab5235a3930\",\"--oneline\",\"-n1\"] + [2013-09-11 19:42:15 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"cat-file\",\"--batch\"] + [2013-09-11 19:42:15 CEST] read: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"home.tar.gz\"] + [2013-09-11 19:42:15 CEST] chat: git [\"--git-dir=/data/backup/.git\",\"--work-tree=/data/backup\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] + fsck home.tar.gz (gpg) [2013-09-11 19:42:15 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"] + (checking box.com...) + [2013-09-11 19:42:28 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"10\",\"--decrypt\"] + gpg: decrypt_message failed: eof + ok + + + +"""]] diff --git a/doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn b/doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn new file mode 100644 index 000000000..7db19697c --- /dev/null +++ b/doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn @@ -0,0 +1,5 @@ +The instructions for building git-annex on [[install/Debian]] stable don't seem to be valid anymore. + +1. `dpkg-checkbuilddeps` is looking for the wrong packages, e.g. libghc-missingh-dev instead of libghc6-missingh-dev. + +2. Not all dependencies are available in the Squeeze repositories anymore (at least not Crypto and hS3), if I am not mistaken. diff --git a/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment new file mode 100644 index 000000000..e464c84da --- /dev/null +++ b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-26T15:27:49Z" + content=""" +I have updated the instructions. +"""]] diff --git a/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment new file mode 100644 index 000000000..40f570610 --- /dev/null +++ b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="gernot" + ip="213.196.216.21" + subject="comment 2" + date="2011-04-26T18:56:44Z" + content=""" +Thanks for the update, Joey. I think you forgot to change libghc-missingh-dev to libghc6-missingh-dev for the copy & paste instructions though. + +Also, after having checked that I have everything installed I'm still getting this error: + + ... + [15 of 77] Compiling Annex ( Annex.hs, Annex.o ) + + Annex.hs:19:35: + Module `Control.Monad.State' does not export `state' + make[1]: *** [git-annex] Error 1 + make[1]: Leaving directory `/home/gernot/dev/git-annex' + dh_auto_build: make -j1 returned exit code 2 + make: *** [binary] Error 2 + +"""]] diff --git a/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment new file mode 100644 index 000000000..8b4111643 --- /dev/null +++ b/doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-04-26T23:40:33Z" + content=""" +Both problems fixed. +"""]] diff --git a/doc/forum/Need_some_help_to_fix_my_repository.mdwn b/doc/forum/Need_some_help_to_fix_my_repository.mdwn new file mode 100644 index 000000000..e4f6fb593 --- /dev/null +++ b/doc/forum/Need_some_help_to_fix_my_repository.mdwn @@ -0,0 +1,31 @@ +Hi, +first sorry for my poor english it's not my native language. + +I have one repository on my laptop and two repository on usb disk. Made with following walkthrough (creating a repository and adding a remote). + +Yesterday I have a backup of my repository on usb disk before add some file with + +cd /media/usb/annex;git fetch laptop; git merge laptop/master&&git annex get .&&git annex sync + +Now the repository on my usb disk is a mess. +Every file before the commit are lost. +For example : + After the sync : file Z.7z +Z.7z: broken symbolic link to `../../../../.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' + +The file ../../../../.git/annex/objects/2K/49/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 doesn't exist. + +On the repository before the sync (inside the Backup) : +file Z.7z +Z.7z: symbolic link to `../../../../.git/annex/objects/J1/f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4' + +The file ../../../../.git/annex/objects/J1/f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4/SHA256-s696365035--d2dcc67bf2f05fcfc7f42723b2d415d4f057a2eeadc282b40f5bc3724534f2f4 still exist in the repository after the sync. + +3 questions, if somebody could help me : + + - what I do wrong ? + - why the- symlink for every file had change after "cd /media/usb/annex;git fetch laptop; git merge laptop/master&&git annex get .&&git annex sync" + - how could I fix my repository ? recover file from the backup ? how ? Copy every file to start my repository from a new clean state ? + + + diff --git a/doc/forum/Need_some_help_to_fix_my_repository/comment_1_f0d279c530b796b2c93d793f85d147e8._comment b/doc/forum/Need_some_help_to_fix_my_repository/comment_1_f0d279c530b796b2c93d793f85d147e8._comment new file mode 100644 index 000000000..6f9a8078f --- /dev/null +++ b/doc/forum/Need_some_help_to_fix_my_repository/comment_1_f0d279c530b796b2c93d793f85d147e8._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-22T20:00:12Z" + content=""" +1. Use `git log --stat` to find the commit that changed your file `Z.7z` +2. Use `git revert` to revert that commit + +That will put things back the way they were. + +You should then investigate what caused the bad commit to be made. It seems to have involved the file being reset to be 0 bytes in size. +"""]] diff --git a/doc/forum/Need_some_help_to_fix_my_repository/comment_2_a3fcfa1f8eadec5fa8a9efacca174048._comment b/doc/forum/Need_some_help_to_fix_my_repository/comment_2_a3fcfa1f8eadec5fa8a9efacca174048._comment new file mode 100644 index 000000000..bded393bf --- /dev/null +++ b/doc/forum/Need_some_help_to_fix_my_repository/comment_2_a3fcfa1f8eadec5fa8a9efacca174048._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkyQL8VPwrSf8LA0k8PKDWFCEKFH3O5Jds" + nickname="marco" + subject="Brvo" + date="2013-04-22T23:33:10Z" + content=""" +Bravo. Mon Hero. + +You save my data ! I can't find what happen but thanks a lot. +"""]] diff --git a/doc/forum/Need_some_help_to_fix_my_repository/comment_3_7878f9b76ddfa3392c9ec6a1810cb745._comment b/doc/forum/Need_some_help_to_fix_my_repository/comment_3_7878f9b76ddfa3392c9ec6a1810cb745._comment new file mode 100644 index 000000000..67657110a --- /dev/null +++ b/doc/forum/Need_some_help_to_fix_my_repository/comment_3_7878f9b76ddfa3392c9ec6a1810cb745._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="glad I could help" + date="2013-04-23T21:16:47Z" + content=""" +I'm curious if your repository is using direct mode, and is perhaps on a FAT filesystem, or other filesystem that does not support symlinks? + +One way this could have happened is due to a bug in `git annex sync` when used on such a filesystem. I've just fixed this bug in commit 07580dc3dfb2f4d9af9a20bc172cbc32953c49d6 +"""]] diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn new file mode 100644 index 000000000..3584569b6 --- /dev/null +++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn @@ -0,0 +1,23 @@ +I've two huge annex repos (about 100G) with all my photos. +One is on my laptop and it uses indirect mode; the other one is on my NAS and I mount it into a CIFS folder, then it uses direct mode because of the crippled fs. +Each repo is remote of the other one. The NAS repo belongs to backup group with the standard preferred content. +I changed about 1000 photos in my PC repo (mainly renamed them) and I wanted to sync changes to the NAS repo, so I went through this sequence: + +* "git annex add" and "git annex sync" on my PC => OK; + +* "git annex sync" on the NAS repo => it started copying all the content BUT I stopped it because I had not enough time to wait at that very moment; + +* again "git anne sync" on the NAS repo => I had more time to wait BUT it didn't resume the copy from the PC repo, it just said something like "all done, nothing to do" + +* I checked that several files were missing on the NAS that I had modified/renamed on the PC repo so I did "git annex add" again on the PC => nothing new to add, nothing to do; + +* I did again "git annex sync" on the PC repo => it deleted also from my PC repo all the photos that were also missing on the NAS repo; + +* I've also checked for unused files on the PC repo and it now gives about 1000 files. + +So here are my questions: + +1. where was I wrong? + +2. can I restore my photos on my PC repo (which uses indirect mode) ? + diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_1_af0ed0730645c1e3c9a4946acd48c18a._comment b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_1_af0ed0730645c1e3c9a4946acd48c18a._comment new file mode 100644 index 000000000..8f2905c6f --- /dev/null +++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_1_af0ed0730645c1e3c9a4946acd48c18a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-06T18:18:36Z" + content=""" +It's not clear from your description when the files got deleted or why, but you can use `git log --stat` to find out. Then you can `git revert` the problem commit. +"""]] diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_2_12f3c2bb2458b69e6355c8f94bab868f._comment b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_2_12f3c2bb2458b69e6355c8f94bab868f._comment new file mode 100644 index 000000000..4c30d0f4c --- /dev/null +++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_2_12f3c2bb2458b69e6355c8f94bab868f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="feulif" + ip="151.27.145.89" + subject="Thank you" + date="2014-06-08T08:36:40Z" + content=""" +Thank you so much! +That solved my problem and restored my precious photos! + +Now I see there are similar issues in the forum already, but I was searching for the bad keywords (like \"restore unused\") and I could not find them. + +By the way, your software is outstanding. +"""]] diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_3_b233b4daac32c452776e1e3d9a29f2cc._comment b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_3_b233b4daac32c452776e1e3d9a29f2cc._comment new file mode 100644 index 000000000..faec248bf --- /dev/null +++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_3_b233b4daac32c452776e1e3d9a29f2cc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-09T19:44:49Z" + content=""" +What did the bad commit that you ended up reverting look like? + +It seems to me that something must have went wrong due to your interrupting the first sync on the NAS. Perhaps this left it with newly added files not yet moved into place in the tree. So the next time you synced, this would cause it to see that the files seemed to have been deleted and make a commit reflecting that. + +This, then is a bug in how direct mode handles merges. [[bugs/direct_mode_merge_interrupt]] +"""]] diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_4_8e079e92929dcfdf19f6adec16f800e5._comment b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_4_8e079e92929dcfdf19f6adec16f800e5._comment new file mode 100644 index 000000000..0e079a694 --- /dev/null +++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__/comment_4_8e079e92929dcfdf19f6adec16f800e5._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="feulif" + ip="151.27.145.89" + subject="comment 4" + date="2014-06-10T18:43:34Z" + content=""" +Here is the log of the \"bad\" commit: + + commit 38e0e1ef009b820f008b46f53c24d9835ca0f9a6 + Author: me + Date: Wed Jun 4 00:04:37 2014 +0200 + + git-annex automatic sync + + folder/subfolder1/subfolder2/photo.jpg | 1 + + [...] + [...] + [...] + folder/subfolder1/subfolderN/video.MOV | 1 + + 2266 files changed, 2266 insertions(+) + +I stopped (ctrl-c) when it was adding the video. +"""]] diff --git a/doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn b/doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn new file mode 100644 index 000000000..0513e0df8 --- /dev/null +++ b/doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn @@ -0,0 +1,3 @@ +I've started a another project to provide Emacs integration for git-annex: [[https://github.com/jwiegley/git-annex-el]] + +My problem with the existing mode is that it didn't feel at all Emacsy, while my mode just piggy backs on existing paradigms, like using `C-x C-q` in a locked file to make it editable, and allowing you to browse and lock/unlock annexed files from Dired. diff --git a/doc/forum/New_user_misunderstandings.mdwn b/doc/forum/New_user_misunderstandings.mdwn new file mode 100644 index 000000000..d1b1df180 --- /dev/null +++ b/doc/forum/New_user_misunderstandings.mdwn @@ -0,0 +1,24 @@ +New user? Can't figure out the basics? Add it here - what you wanted, what you tried. + +#### I wanted to keep track of some files I had all organized in a directory outside of my ~/annex: + + $ cd ~/annex + $ git annex add /path/to/some/photos + fatal: '/path/to/some/photos' is outside repository + + But git-annex doesn't work that way. I had to do this instead + + $ rsync -a /path/to/some/photos + $ git annex add photos + (Recording state in git...) + $ git annex status + ... lots of helpful info... + +#### I just have the OS/X app, can I do commandline stuff? + +yes + + $ /Applications/git-annex.app/Contents/MacOS/git-annex add photos/ + (Recording state in git...) + +but perhaps there is a better way. diff --git a/doc/forum/New_user_misunderstandings/comment_1_c1785924109b5d5cde9aa3d3460cf955._comment b/doc/forum/New_user_misunderstandings/comment_1_c1785924109b5d5cde9aa3d3460cf955._comment new file mode 100644 index 000000000..b15f5cfb7 --- /dev/null +++ b/doc/forum/New_user_misunderstandings/comment_1_c1785924109b5d5cde9aa3d3460cf955._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 1" + date="2012-12-17T16:21:36Z" + content=""" +For importing your photos, you can use `git annex import /path/to/some/photos` .. this will move them from the given location into the current directory, and add them to the annex. It preserves subdirectory structure too. + +For using the OSX app at the command line, the only thing that is guaranteed to work properly is to run `/Applications/git-annex.app/Contents/MacOS/runshell`, which will modify your PATH and other environment appropriately. +"""]] diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__.mdwn b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__.mdwn new file mode 100644 index 000000000..eb1aa3b50 --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__.mdwn @@ -0,0 +1,5 @@ +I'm brand new to git-annex and am having trouble getting going. I've got an annex and I get messages like "Ran daily sanity check" and "Synced with web", but I can't get connected to a Jabber account. I've been using my Gmail account, which works fine for logging into this forum but gives me the message "Unable to connect to the Jabber server. Maybe you entered the wrong password?" when I try to configure the Jabber account. + +I'm using version 3.20121112ubuntu2. I think a later version might exist but I don't know how to reach it; I've done the standard install for Ubuntu-style OSs (I'm running Kubuntu right now), and that's the git-annex version that arrives. + +Any suggestions? Sorry for the simplistic startup question, but it looks like this will be a great tool once I get it running. diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_1_59158afcedac18a7285d57491b2a468a._comment b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_1_59158afcedac18a7285d57491b2a468a._comment new file mode 100644 index 000000000..45b4a9bdf --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_1_59158afcedac18a7285d57491b2a468a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 1" + date="2013-07-27T22:13:49Z" + content=""" +Since 2012 git-annex has had massive improvements to its Jabber support. See [[/install/Ubuntu]] to get a current version. +"""]] diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_2_2a70ac08bb95774415b09dab7d7f8605._comment b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_2_2a70ac08bb95774415b09dab7d7f8605._comment new file mode 100644 index 000000000..777a23851 --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_2_2a70ac08bb95774415b09dab7d7f8605._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlutNrg7ajiNAfi5gqJfD8crv0aimZa27k" + nickname="Chuck" + subject="Now I'm really confused 8-/" + date="2013-07-28T05:26:02Z" + content=""" +Yes, I followed the directions on that page and executed \"sudo apt-get install git-annex\" on my 13.04 (Raring) system. I did it again just now to verify, and I got the same result from \"git-annex version\", namely \"3.20121112ubuntu2\". Do I need to add a repo for Raring as for Precise? +"""]] diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_3_92a52b523ed4c68b70ddcabc2a050b76._comment b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_3_92a52b523ed4c68b70ddcabc2a050b76._comment new file mode 100644 index 000000000..9b1d95e78 --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_3_92a52b523ed4c68b70ddcabc2a050b76._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmKKg3Vmzk7KwRGRKjHVdtyoj1JfxLX6NM" + nickname="Tom" + subject="comment 3" + date="2013-10-01T18:33:05Z" + content=""" +I've got the same issue on Xubuntu 13.04. I installed using this script: https://github.com/zerodogg/scriptbucket/blob/master/gitannex-install + +`git-annex version` makes no mention of DNS or ADNS + +`host` command is installed on my machine. any suggestions on how best to fix for this setup? +"""]] diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_4_c52a75761ea107f6d69c09bac64f0f0a._comment b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_4_c52a75761ea107f6d69c09bac64f0f0a._comment new file mode 100644 index 000000000..b15edfa5a --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_4_c52a75761ea107f6d69c09bac64f0f0a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmKKg3Vmzk7KwRGRKjHVdtyoj1JfxLX6NM" + nickname="Tom" + subject="comment 4" + date="2013-10-02T21:27:36Z" + content=""" +Update to my comment above - it seems my problem is related to ejabberd as discussed here: + +Think I might change my server to [Prosody](https://prosody.im/) and see what happens then. + + +"""]] diff --git a/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_5_2685e3a87464ccd37d593516d94ba5cf._comment b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_5_2685e3a87464ccd37d593516d94ba5cf._comment new file mode 100644 index 000000000..84d6832ff --- /dev/null +++ b/doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_5_2685e3a87464ccd37d593516d94ba5cf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkr_EUIHZ8CTtOGm-j-guMBzaYuOzrXJwg" + nickname="Christoph" + subject="be aware of the 2-step verification" + date="2013-10-15T20:03:12Z" + content=""" +if you enabled the \"2-step verification\" in our google account (Account -> Security -> 2-step verification: Status: ON) you have to make a \"Application-specific passwords\" for your Jabber login. + +NoXorius +"""]] diff --git a/doc/forum/No_SSL_traffic_for_S3__63__.mdwn b/doc/forum/No_SSL_traffic_for_S3__63__.mdwn new file mode 100644 index 000000000..c2f4e3717 --- /dev/null +++ b/doc/forum/No_SSL_traffic_for_S3__63__.mdwn @@ -0,0 +1,8 @@ +As far I can tell, the encryption mentioned on the wiki for S3 [1] refers to file-level encryption. That is, it encrypts files with GPG before storing them (or after retrieving them) from S3. However, even if I have GPG encryption off, I still want S3 requests to use SSL encryption. As far as I can tell, HTTPS isn't used with S3 remotes. Is there any way to enable it (if so, it should be the default)? + +I am using git-annex version: 3.20120406 + +Cheers, +--acrefoot + +[1] http://git-annex.branchable.com/special_remotes/S3/ diff --git a/doc/forum/No_SSL_traffic_for_S3__63__/comment_1_f509bf273896180e6df8c771438dd093._comment b/doc/forum/No_SSL_traffic_for_S3__63__/comment_1_f509bf273896180e6df8c771438dd093._comment new file mode 100644 index 000000000..808d4c035 --- /dev/null +++ b/doc/forum/No_SSL_traffic_for_S3__63__/comment_1_f509bf273896180e6df8c771438dd093._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-15T20:25:42Z" + content=""" + is a Haskell library for S3, which git-annex uses. It does not support HTTPS. I'm sure its author would appreciate help, or maybe even just gentle motivation. + +FWIW, I think that S3's authorization is designed to be pretty secure even over an un-encrypted transport. +It uses HMAC to sign the request with your AWS credentials securely, and includes a date that is hopefully used to avoid replay attacks. +"""]] diff --git a/doc/forum/No_SSL_traffic_for_S3__63__/comment_2_358635d19c82202c63014ca84de7fc3b._comment b/doc/forum/No_SSL_traffic_for_S3__63__/comment_2_358635d19c82202c63014ca84de7fc3b._comment new file mode 100644 index 000000000..edf1b6338 --- /dev/null +++ b/doc/forum/No_SSL_traffic_for_S3__63__/comment_2_358635d19c82202c63014ca84de7fc3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRIwPkmDOZSpul-Lx61_jUGHh9f_F3od8" + nickname="Michael" + subject="comment 2" + date="2013-01-15T20:47:50Z" + content=""" +The authorization is fine, but it's scary to see your data floating along the wire in plain-text :) +"""]] diff --git a/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn new file mode 100644 index 000000000..b13cab9bf --- /dev/null +++ b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn @@ -0,0 +1,16 @@ +I'm running version 5.20131224-g692aa01 standalone tarball on linux x86_64 (Linux Mint 15). When I run `git-annex status` in the terminal I get no output. + +I've tried: + +* system linked (`ln -s`) the `git-annex`, `git-annex-shell`, and `git-annex-webapp` to `~/bin/` which is on my PATH +* run the `runshell` program from the terminal + +Other things to consider: + +* I've just upgraded the repo from version 3 to version 5 +* Repo was created using git-annex version 3 +* I don't use assistant or the webapp +* Only used from my terminal +* Repo is in indirect mode + +What do I need to do to see the results of `git-annex status`? in my terminal? diff --git a/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_1_b014f1edcb7ce39da9b582683d3b80c0._comment b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_1_b014f1edcb7ce39da9b582683d3b80c0._comment new file mode 100644 index 000000000..cffcbab75 --- /dev/null +++ b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_1_b014f1edcb7ce39da9b582683d3b80c0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-26T23:06:34Z" + content=""" +Run `git annex info` instead. That is what older versions of git-annex called `git annex status` + +Meanwhile, `git annex status` is now like `git status` -- it shows an overview of uncommitted changes in your work tree. +"""]] diff --git a/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_2_24602de6cfe1f3d988c5105e7266a518._comment b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_2_24602de6cfe1f3d988c5105e7266a518._comment new file mode 100644 index 000000000..b09cf9757 --- /dev/null +++ b/doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_2_24602de6cfe1f3d988c5105e7266a518._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="Thanks!" + date="2013-12-27T01:37:36Z" + content=""" +Not sure how I missed that :D +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn b/doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn new file mode 100644 index 000000000..86f8da454 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn @@ -0,0 +1,31 @@ +My situation goes something like this: + +I have a machine with an annex and a number of special remotes (s3, box, and an rsync'd nas). I also have a git remote that's doesn't have git annex on it, so it's just got the git branches. That machine has some problems so I start getting the annex set up on a different machine. These are the steps that I went through: + +* clone from the git remote +* git annex doesn't think this is an actual annex at this point, so `git annex init` it +* Now I can start the webapp `git annex webapp` +* My rsync'd remote works and the assistant starts downloading the files from there (which is great, it's the local network one) but the box and s3 remotes are disabled (sure, not a huge deal). +* Click enable on the box remote, I have to specify that it's a full backup remote +* Things start copying from box as well, so I disable it until everything from the local network is done +* Click enable on the s3 remote and it wants my AWS creds +* Download those and add it +* Set the remote up the same way, as a full backup. + +At this point, all my files have copied from the rsync remote, so I enable the other remotes. + +Now I want to make sure that all the remotes are set up and working properly. + +I turn off the webapp, turn off direct mode (I think it was indirect mode by default, but I'd been playing with things before then), and `git annex drop ` a file that I don't particularly care about. Everything drops successfully. + +I'm able to `git annex get -f ` and from `` successfully, but when I try to get from the s3 remote, it doesn't give me any output and doesn't download the file. + +Having used regular git annex without the assistant before, I try re-initing the remote `git annex initremote `. It complains that there's no type, so I `git annex initremote type=S3`, then it complains about encryption. `git annex initremote type=S3 encryption=shared`. It says it worked, but I `git annex get -f ` still doesn't do anything. + +After more looking around, it turns out that I may have created a second remote with the same name as the original s3 remote... (figure that out). I use the webapp to rename the remotes so they're different, but neither of them will `get -f` successfully. + +At this point, I turn to you and ask what the heck I did wrong. I tried editing the remote.log and uuid.log files to remove the new s3 remote (and I figured out which one was which) from the git-annex branch. I also marked the new s3 remote as dead, but I still can't get access to s3. + +`git annex fsck -f ` doesn't actually seem to hit s3 (I seem to recall that it used to, it calculated checksums), it just checks some git local information. + +I don't mind deleting my current checkout and starting from the clone step again if you think I've made too much of a mess. At least I know I can get my files off my rsync remote and box :) diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_10_ed35a6ec605e8f79ec107856af6d1a46._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_10_ed35a6ec605e8f79ec107856af6d1a46._comment new file mode 100644 index 000000000..eda042c83 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_10_ed35a6ec605e8f79ec107856af6d1a46._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-04-26T20:33:03Z" + content=""" +Oh.. I got confused by you talking about the box remote. Lines you pasted look ok anyway. + +Ok, looking at the S3 remote then... + +> I did notice that initially the s3 remote was named \"annex\". That was probably the web interface's doing, way back when I added it. + +So, you can never change the names used to refer to remotes in remote.log. These names can be different from the names used to refer to the same remotes in .git/config. (Which can vary from repository to repository anyway..) So, if you originally added a s3 remote and called it \"annex\", you still need to use that name when running initremote elsewhere to add that remote to your repository. + +The remote with name \"s3\" added in the 11:26 is a separate s3 remote, and I think one you don't want. (And have marked dead?) + +I think all you need to do is \"git annex initremote annex\" to add the s3 remote you want to your new repository. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_11_e48b6efa42159dc83e1be11bfb54abcd._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_11_e48b6efa42159dc83e1be11bfb54abcd._comment new file mode 100644 index 000000000..41da88a8d --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_11_e48b6efa42159dc83e1be11bfb54abcd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 11" + date="2013-04-26T20:37:51Z" + content=""" +Ah, I see. It looks like that did solve my problem. + +Yes, I did mark the old s3 remote as dead. + +At least now I know how to fix it if it ever happens again. I wonder if I'll ever be able to recreate it... + +Thanks! +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment new file mode 100644 index 000000000..8b13675fe --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-04-26T20:52:36Z" + content=""" +It's easy to recreate. As I understand it, the entire process went something like this: + +git annex initremote annex type=S3 encryption=blahblah # possibly this was done in the webapp? + +git remote rename annex s3 # also possibly done in the webapp + +# clone to different computer, and on the new clone: + +git annex initremote s3 + +git-annex: Specify the type of remote with type= + +git annex initremote s3 type=S3 encryption=blahblah + +The last line creates a *new* remote. + +I'm inclined to think the main confusing thing here is that initremote is used to both create a new special remote, and to configure the repository to use an already existing special remote that was created elsewhere. If you had to use `enableremote` for the latter, +things could be less confusing: + +# clone to different computer, and on the new clone: + +git annex enableremote s3 + +git-annex: No existing special remote named s3. Choose from one of these existing special remotes: annex +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_13_85368b60091dc3ce2efb58013ffe9f83._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_13_85368b60091dc3ce2efb58013ffe9f83._comment new file mode 100644 index 000000000..c51377dbb --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_13_85368b60091dc3ce2efb58013ffe9f83._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 13" + date="2013-04-26T21:16:30Z" + content=""" +I tend to agree with you. At first I liked the idea that initremote could be used to re-initialize a remote, but then I got confused about what the name of that remote was. I suppose git annex status could have told me. I kept wanting to have something like \"git annex remote\" (which would list them) and then \"git annex remote init\" to initialize them. That way the remote actions would follow the same sort of interface as \"git remote\", where you could list, init, create, edit, rename, enable, disable, kill (dead?), etc. The main drawback I see with that is having too many levels to type. + +I really like the idea of having the ability to \"git annex remote show s3\" and it will tell me what the type, uuid, options, etc are for that remote. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_14_e65281bef23e0076936c508728a87897._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_14_e65281bef23e0076936c508728a87897._comment new file mode 100644 index 000000000..31fd9d60b --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_14_e65281bef23e0076936c508728a87897._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 14" + date="2013-04-26T22:25:04Z" + content=""" +Have now split out an enableremote command. + +
+joey@gnu:~/tmp/annex>git annex initremote foo                                 
+git-annex: There is already a special remote named \"foo\". (Use enableremote to enable an existing special remote.)
+joey@gnu:~/tmp/annex>git annex enableremote
+git-annex: Specify the name of the special remote to enable. Known special remotes: foo
+
+ +Also, I wrote something wrong before. It *is* possible to change the name used by initremote (now enableremote). + +With the current release of git-annex: + +`git annex initremote annex name=mys3` + +With the next release: + +`git annex enableremote annex name=mys3` +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment new file mode 100644 index 000000000..d8d754309 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-24T23:56:54Z" + content=""" +What you describe, `git annex get $file --from remote` silently not doing anything, is the expected behavior if the remote doesn't have the file. This allows you to eg, run `git annex get . --from remote` and get all files that the remote does have while skipping the rest. + +Did you ever try looking at `git annex whereis $file` ? +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_2_0cfcc2075bff556b9fde5acc3dc1d599._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_2_0cfcc2075bff556b9fde5acc3dc1d599._comment new file mode 100644 index 000000000..c673737c1 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_2_0cfcc2075bff556b9fde5acc3dc1d599._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 2" + date="2013-04-25T00:20:59Z" + content=""" +When I run `git annex whereis $file` it tells me it's available at box, s3, my rsync remote, the original repo (from the machine I created the annex on), and my temporary usb stick repo (nothing wrong with redundancy...). So it seems that git annex thinks the file is available in the s3 remote, even though it's refusing to download it. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment new file mode 100644 index 000000000..187993a5a --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-25T00:50:01Z" + content=""" +Does the uuid that whereis prints next to the name of the s3 remote match the annex..uuid setting for that remote in .git/config? +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_4_64338d2d77dcbabd16b55eb145f40dc6._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_4_64338d2d77dcbabd16b55eb145f40dc6._comment new file mode 100644 index 000000000..d4a05ce8e --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_4_64338d2d77dcbabd16b55eb145f40dc6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 4" + date="2013-04-25T01:18:00Z" + content=""" +Oh! That might be it! During the whole \"I have two remotes with the name s3\" situation, it seems that both of them in my .git/config ended up with the same uuid, even though the original one had a different uuid. If I change it back, I end up getting an access denied when I try to `git annex get ...`. Progress! + +I thought that you were supposed to do a `git annex initremote s3` from a clone to enable a remote with the credentials stored in the repo. It seems that internally something still thinks that the \"s3\" remote has the new uuid. When I run that command it changes the uuid back to the new (invalid) one. + +Is there a way I can totally remove the bad s3 (which I've partially renamed to s3thefirst) remote from my history/repo (I'm pretty sure it's been synced back up to origin at this point) or properly rename it so it doesn't keep getting confused? Hopefully that will address my problem. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_5_dd66c9ea0c83388f6826751944330d10._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_5_dd66c9ea0c83388f6826751944330d10._comment new file mode 100644 index 000000000..58fba2ca8 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_5_dd66c9ea0c83388f6826751944330d10._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-25T02:14:18Z" + content=""" +Yes, when you run `git annex initremote $remotename` with no other parameters, it enables a remote from the stored configuration. +Which does not include `AWS_SECRET_ACCESS_KEY` and `AWS_ACCESS_KEY_ID`; you need to set those and then +you should not get access denied. + +You seem to say your .git/config contains two remotes with the same name, but I don't think that's possible. + +I don't know how you could end up with two remotes with the same name in `git show git-annex:remote.log`, unless the two were added in separate repositories which were then synced together. Since this is not a usual situation there's not any UI to deal with it. I've just committed a change that will make `initremote` prefer remotes that have not been marked dead when there's a naming comflict. + +However, I'm more curious how this situation came about. I have not been able to reproduce the problem when enabling a S3 remote using the webapp. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_6_dc0c5e395e4c443b7227afdb157194e5._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_6_dc0c5e395e4c443b7227afdb157194e5._comment new file mode 100644 index 000000000..c9c352c35 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_6_dc0c5e395e4c443b7227afdb157194e5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-25T02:18:56Z" + content=""" +What you could do to help track down how this occurred is to check out the `git-annex` branch, and use `git blame` to find out when the second remote with the same name was first added to the `remote.log` file. + +Then you should be able to tell, either from the email address used for that commit, or at least the date of the commit, whether this occurred recently when you enabled the S3 remote in the webapp, or perhaps at some time in the past. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_7_3c0ea4c76cdd889707f7308576e3efa0._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_7_3c0ea4c76cdd889707f7308576e3efa0._comment new file mode 100644 index 000000000..b32532894 --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_7_3c0ea4c76cdd889707f7308576e3efa0._comment @@ -0,0 +1,65 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 7" + date="2013-04-26T19:10:15Z" + content=""" +http://pastebin.com/CM2EfQ21 + +This is what the commit log looks like for the remote.log file. There is some interesting stuff in here. I'll try to highlight the changes without giving too much of the important bits away. + +The I commit at 2013-04-22 11:57 is when I added the box remote: + +0490d177-78e2-421b-a004-47d88ee7a2e3 chunksize=10mb cipher=... davcreds=... embedcreds=yes name=box.com type=webdav url=https://www.box.com/dav/annex timestamp=1366657062.972357s +1d0ab67c-6a43-11e2-9feb-df22c6d1e308 bucket=annex-1d0ab67c-6a43-11e2-9feb-df22c6d1e308 cipher=... datacenter=US host=s3.amazonaws.com name=annex port=80 storageclass=REDUCED_REDUNDANCY type=S3 timestamp=1359484726.520727s + +The contents also includes my nas remote, but I will omit that for brevity's sake. I did notice that initially the s3 remote was named \"annex\". That was probably the web interface's doing, way back when I added it. + +The next commit at 2013-04-24 10:55 seems to have added encryption=shared and highRandomQuality=false to the nas remote (I think this was when I re-enabled the nas remote through the webapp). + +The commit at 2013-04-24 11:05 looks like it added similar stuff to the box remote (added highRandomQuality=false). Probably this was from enabling it then as well. + +At 2013-04-24 11:12 the s3 remote had highRandomQuality=false added also. + +At 2013-04-24 11:26, a new remote was added: + +4d86972d-9b0a-4095-bc50-f9bec8144c30 bucket=s3-4d86972d-9b0a-4095-bc50-f9bec8144c30 cipher=... datacenter=US host=s3.amazonaws.com name=s3 port=80 storageclass=STANDARD type=S3 timestamp=1366828017.8792s + +Very possibly this was me doing a `git annex initremote ...` thinking that the s3 remote was actually named s3 (somehow, I feel like I would have checked that, but I'm going to chalk that up to my own stupidity). + +Then at 2013-04-24 11:35, the new s3 remote was changed... but it seems like only the timestamp was altered. I suspect this was from another command line change, but I don't remember exactly what I did at that point. Probably a reference in a different file was also modified, but I'm not looking at those. + +At 2013-04-24 11:37, again the new s3 remote was changed, but again it was just the timestamp. + +In the merge at 2013-04-24 15:15, a bunch of things happened. This may be where stuff went wrong. I do find it weird because it should have just been a fast forward, given what the history looks like. I suspect that this was caused by a `git annex sync`, but I'm not 100% sure. + +In this commit the following happened: + +* The box remote was duplicated (with different davcreds and one having highRandomQuality=false) +* The annex remote was duplicated (with highRandomQuality=false in one) +* The nas remote was duplicated (one with encryption=shared and highRandomQuality=false and the other without) + +In addition, within that commit, my uuid.log file also had duplication that seems to be where part of the confusion comes from: + +* The 1d0ab67c-6a43-11e2-9feb-df22c6d1e308 remote shows up twice, once named \"annex\" and the other time named \"s3\". +* The 4d86972d-9b0a-4095-bc50-f9bec8144c30 remote is only include once in there, but its name is also \"s3\". +* Other remotes are duplicated, with different timestamps, but no overlapping uuids. + +Then at 2013-04-24 18:13, I think things try to fix themselves: + +* The older box remote (I guess based on timestamp) is removed. Now there's only one. +* The older 1d0ab67c-6a43-11e2-9feb-df22c6d1e308 remote (still named annex) is removed. Now there's only one there too. +* The single 4d86972d-9b0a-4095-bc50-f9bec8144c30 remote is updated with a new timestamp. +* The older nas remote is also removed. + +No duplicates exist in this file and no cross-references exist either. + +The uuid.log file seems to be the place where the annex remote is renamed to s3. I have no idea what caused that, but it was probably me. + +* In 2013-04-24 11:12, everything is fine in the uuid.log file. The annex timestamp is updated, but no problems. +* In 2013-04-24 11:13 (which doesn't show up when I look at the remote.log changes, because it didn't change that), a file's location log is updated and the 1d0ab67c-6a43-11e2-9feb-df22c6d1e308 remote is renamed from annex to s3 in uuid.log, but not in remotes.log. +* In 2013-04-24 11:26, 4d86972d-9b0a-4095-bc50-f9bec8144c30 is added to remotes.log with the name s3 and to uuid.log with the name s3 (which is now a duplicate of the renamed 1d0ab67c-6a43-11e2-9feb-df22c6d1e308, but only in uuid.log). + +All of this seems horribly confusing and I don't envy your trying to unwind it. + +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_8_36519ee4499a19f0864e4fcd264e9933._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_8_36519ee4499a19f0864e4fcd264e9933._comment new file mode 100644 index 000000000..39a1ce51d --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_8_36519ee4499a19f0864e4fcd264e9933._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-04-26T20:06:34Z" + content=""" +Most of this is perfectly normal. The duplication of lines are normal; when two git-annex branches are union merged, it's as if it runs `cat branch1:file branch2:file | uniq > file`. When there are conflicting lines for the same uuid, the one with the newest timestamp is used. + +The description of the remote in uuid.log is also not relevant to this bug. + +This is the key part: + +> The box remote was duplicated (with different davcreds and one having highRandomQuality=false) + +As you note, 2013-04-24 15:15 was a merge. So there must have been two branches before, which had different box remotes with different davcreds. + +It would probably help if you can paste those lines as they looked after that merge (omitting most of the davcreds). + +Also, I'd like to see the box line from the 11:05 commit. +"""]] diff --git a/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_9_85b23f375e53469fb09b24b945b3aba9._comment b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_9_85b23f375e53469fb09b24b945b3aba9._comment new file mode 100644 index 000000000..be9bd3c0d --- /dev/null +++ b/doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_9_85b23f375e53469fb09b24b945b3aba9._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 9" + date="2013-04-26T20:21:05Z" + content=""" +Two box lines after 15:15 merge: + +0490d177-78e2-421b-a004-47d88ee7a2e3 chunksize=10mb cipher=... davcreds=... embedcreds=yes highRandomQuality=false name=box.com type=webdav url=https://www.box.com/dav/annex timestamp=1366826729.945023s +0490d177-78e2-421b-a004-47d88ee7a2e3 chunksize=10mb cipher=... davcreds=... embedcreds=yes name=box.com type=webdav url=https://www.box.com/dav/annex timestamp=1366657062.972357s + +After the 11:05 commit, the box line looked like this: + +0490d177-78e2-421b-a004-47d88ee7a2e3 chunksize=10mb cipher=... davcreds=... embedcreds=yes highRandomQuality=false name=box.com type=webdav url=https://www.box.com/dav/annex timestamp=1366826729.945023s + +I am curious why you want to know about box, when s3 is the one that I'm having trouble with... +"""]] diff --git a/doc/forum/OSX_Mavericks_anyone__63__.mdwn b/doc/forum/OSX_Mavericks_anyone__63__.mdwn new file mode 100644 index 000000000..b19133680 --- /dev/null +++ b/doc/forum/OSX_Mavericks_anyone__63__.mdwn @@ -0,0 +1,3 @@ +Was anyone able to run git annex on Mavericks? + +Didn't have time for qualified troubleshooting, sorry diff --git a/doc/forum/OSX_Mavericks_anyone__63__/comment_1_3075b02aeb57adcbf4addf9fb4c123ba._comment b/doc/forum/OSX_Mavericks_anyone__63__/comment_1_3075b02aeb57adcbf4addf9fb4c123ba._comment new file mode 100644 index 000000000..1657d676d --- /dev/null +++ b/doc/forum/OSX_Mavericks_anyone__63__/comment_1_3075b02aeb57adcbf4addf9fb4c123ba._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://mike.magin.org/" + nickname="mmagin" + subject="a little" + date="2013-10-24T17:02:18Z" + content=""" +Some syncing and copying, nothing other than normal remotes and one S3 remote. +Haven't even done an \"add\" yet. + +Not an assistant user. Still running 4.20130422-gb9341fd on this computer. +"""]] diff --git a/doc/forum/OSX_Mavericks_anyone__63__/comment_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment b/doc/forum/OSX_Mavericks_anyone__63__/comment_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment new file mode 100644 index 000000000..bfc43d682 --- /dev/null +++ b/doc/forum/OSX_Mavericks_anyone__63__/comment_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="Alex" + ip="217.8.62.35" + subject="not at all" + date="2013-10-24T19:50:11Z" + content=""" +I'd love to see an updated OS X build for Mavericks. + +Currently I'm getting this error: + + dyld: Symbol not found: _objc_debug_taggedpointer_mask + Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I + in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + Trace/BPT trap: 5 + +"""]] diff --git a/doc/forum/OSX_Mavericks_anyone__63__/comment_3_7df9ba63cb1f385681242b4b58d6a87c._comment b/doc/forum/OSX_Mavericks_anyone__63__/comment_3_7df9ba63cb1f385681242b4b58d6a87c._comment new file mode 100644 index 000000000..691fd9064 --- /dev/null +++ b/doc/forum/OSX_Mavericks_anyone__63__/comment_3_7df9ba63cb1f385681242b4b58d6a87c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="67.223.19.96" + subject="comment 3" + date="2013-10-24T19:53:08Z" + content=""" +Mavericks is being discussed [[here|bugs/git annex doesn't work in Max OS X 10.9]] +"""]] diff --git a/doc/forum/OSX_Mavericks_anyone__63__/comment_4_740fee31c4ca9d84428f97f63ffc075a._comment b/doc/forum/OSX_Mavericks_anyone__63__/comment_4_740fee31c4ca9d84428f97f63ffc075a._comment new file mode 100644 index 000000000..3ad5c2344 --- /dev/null +++ b/doc/forum/OSX_Mavericks_anyone__63__/comment_4_740fee31c4ca9d84428f97f63ffc075a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Alex" + ip="217.8.62.35" + subject="comment 4" + date="2013-10-24T19:55:56Z" + content=""" +Thanks, Joey! +"""]] diff --git a/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn new file mode 100644 index 000000000..5e417b14c --- /dev/null +++ b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn @@ -0,0 +1,12 @@ +This is a tip for users who wish to use remotes which are based on OSX systems and have used macports to install some of the required utilities for git-annex to work. + +The default behaviour of OSX's sshd is to have a "highly restricted" restricted environment. The defaults that it allows is + + jtang@x00:~ $ ssh x00 echo \$PATH + /usr/bin:/bin:/usr/sbin:/sbin + +One solution is to enable *PermitUserEnvironment yes* in `/etc/sshd_config` and then in your own `~/.ssh/environment` file you could add something like (the below is an example) + + PATH=/Users/jtang/bin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/X11/bin:/Users/jtang/.cabal/bin:/opt/local/libexec/gnubin + +If the above is not done, cloning from the OSX host will fail if git is not installed in /usr/bin (which it probably won't be). diff --git a/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment new file mode 100644 index 000000000..0cbf79c8d --- /dev/null +++ b/doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set/comment_1_a136ff877389f0930c066ba118edd9fd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-24T18:08:00Z" + content=""" +If you use git-annex from the OSX .dmg, it will set up a ~/.ssh/git-annex-shell, which is the only command that is needed when git-annex is using an OSX server as a remote. Since version 5.20140421, the webapp will also use ~/.ssh/git-annex-wrapper, which the .dmg also sets up, to run some commands like git. + +The upshot is that this should not affect git-annex when installed from the .dmg on the OSX server. If you build git-annex from source yourself, you do need to make sure that it and git end up in PATH. +"""]] diff --git a/doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn b/doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn new file mode 100644 index 000000000..537c85d01 --- /dev/null +++ b/doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn @@ -0,0 +1,17 @@ +This isn't really a bug of git-annex, but a problem with haskell-platform/ghc6.12.x so this post might need to be moved to a better place (maybe tips). + +OSX's haskell-platform doesn't have the dynamic libraries available, as far as I know it just isn't supported therefore git-annex will always be statically built on OSX, so wrappers like or [[!google dsocks]] for preloading connect() calls won't work. + +
+jtang@x00:~/annex $ tsocks git annex get .
+dyld: could not load inserted library: /opt/local/lib/libtsocks.dylib
+
+error: git-annex died of signal 5
+
+ +The side effect of this means that users who are behind restrictive firewalls that allow only ssh via a socks proxy, they will need to configure ssh to use something like . + +
+host remotemyhost
+        ProxyCommand connect -S proxy.mydomain:1080 -R local %h %p
+
diff --git a/doc/forum/OpenOffice___47___Libre_Office.mdwn b/doc/forum/OpenOffice___47___Libre_Office.mdwn new file mode 100644 index 000000000..f28ad6259 --- /dev/null +++ b/doc/forum/OpenOffice___47___Libre_Office.mdwn @@ -0,0 +1,5 @@ +I'm trying to use git-annex for keeping my company invoices data. It seems a good idea because it's encrypted and whatnot, I'd never upload them to Dropbox. However, Libre Office refuses to work with files copied to annex-tracked folder. It's likely a flaw in LO/OOo, but maybe someone here knows a way to make the two work together. + +When opening a spreadsheet, I'm getting a "Document in use - document locked by: Unknown User - Open read-only or open a copy" dialog. I tried opening a copy and saving under a different filename , but I can only save once - any subsequent saves to the same filename result in an error. + +A graphic version of my story: http://f.gdr.name/annex-ooo-1.png http://f.gdr.name/annex-ooo-2.png diff --git a/doc/forum/OpenOffice___47___Libre_Office/comment_1_98ed542fedd820d47bf8deb7d3232725._comment b/doc/forum/OpenOffice___47___Libre_Office/comment_1_98ed542fedd820d47bf8deb7d3232725._comment new file mode 100644 index 000000000..68dbee166 --- /dev/null +++ b/doc/forum/OpenOffice___47___Libre_Office/comment_1_98ed542fedd820d47bf8deb7d3232725._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-01-02T19:10:28Z" + content=""" +Files in git-annex are locked normally. You can use `git annex unlock` to unlock a file for editing. Or you can use the new [[direct_mode]]. +"""]] diff --git a/doc/forum/OpenOffice___47___Libre_Office/comment_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment b/doc/forum/OpenOffice___47___Libre_Office/comment_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment new file mode 100644 index 000000000..394f6fb01 --- /dev/null +++ b/doc/forum/OpenOffice___47___Libre_Office/comment_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~gdr-go2" + nickname="gdr-go2" + subject="Thanks" + date="2013-01-02T19:58:44Z" + content=""" +Direct mode has solved the problem. Great new addition. +"""]] diff --git a/doc/forum/Out_of_memory_error_in_fsck__44___whereis__44___find_and_status_cmds.mdwn b/doc/forum/Out_of_memory_error_in_fsck__44___whereis__44___find_and_status_cmds.mdwn new file mode 100644 index 000000000..8c54f49da --- /dev/null +++ b/doc/forum/Out_of_memory_error_in_fsck__44___whereis__44___find_and_status_cmds.mdwn @@ -0,0 +1,5 @@ +Please file bug reports in [[bugs]], not the forum, so they can be closed +when fixed. + +Moved to [[bug report|bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds]]. +--[[Joey]] diff --git a/doc/forum/Overwriting_data_without_getting_it.mdwn b/doc/forum/Overwriting_data_without_getting_it.mdwn new file mode 100644 index 000000000..ccd23b74e --- /dev/null +++ b/doc/forum/Overwriting_data_without_getting_it.mdwn @@ -0,0 +1,3 @@ +My collaborators and I use git annex to track various large data files (among some smaller metadata files managed by ordinary git). Some of these data files need to change completely -- the old ones were just wrong. So I do a git checkout, but don't `git annex get` because it would just be a waste of time and bandwidth. This means that my "data files" are just broken symlinks. Now, I find that by making the necessary directories under `.git/annex/objects/`, I can write to these files in the usual way. The symlinks are preserved, and the files they link to now exist and are full of my corrected data. This seems like it's a problem because the hash has presumably changed. (I'm still a little fuzzy on how exactly git-annex works.) Also, git/git-annex doesn't seem to realize that anything has changed. Is this recoverable? + +Would it have been better to just `git rm` (or something) the original version of the file, commit that, and then add the new data? And if so, how should I go about this now that I've created these many very large files? If not, what would be the preferred way to do this? diff --git a/doc/forum/Overwriting_data_without_getting_it/comment_1_f1c0199ee9bffcc84287370b89361294._comment b/doc/forum/Overwriting_data_without_getting_it/comment_1_f1c0199ee9bffcc84287370b89361294._comment new file mode 100644 index 000000000..a6092b1f2 --- /dev/null +++ b/doc/forum/Overwriting_data_without_getting_it/comment_1_f1c0199ee9bffcc84287370b89361294._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-12T16:57:52Z" + content=""" +I think you're making this more complicated than it needs to be. You don't need to mess around with .git/annex/objects at all. You can replace git-annex symlinks with new files and git annex add the new content. + +For example: + +[[!format sh \"\"\" +joey@gnu:~/tmp/repo>git annex drop --force foo +drop foo ok +(Recording state in git...) +joey@gnu:~/tmp/repo>ls +foo@ +joey@gnu:~/tmp/repo>rm foo +joey@gnu:~/tmp/repo>echo \"new good contents\" > foo +joey@gnu:~/tmp/repo>git annex add foo +add foo (checksum...) ok +(Recording state in git...) +joey@gnu:~/tmp/repo>git commit -m add +[master ec3ed14] add + 1 file changed, 1 insertion(+), 1 deletion(-) +\"\"\"]] +"""]] diff --git a/doc/forum/Overwriting_data_without_getting_it/comment_2_6a1d08dbca206129ef6cf8aa97daeee1._comment b/doc/forum/Overwriting_data_without_getting_it/comment_2_6a1d08dbca206129ef6cf8aa97daeee1._comment new file mode 100644 index 000000000..698d00c35 --- /dev/null +++ b/doc/forum/Overwriting_data_without_getting_it/comment_2_6a1d08dbca206129ef6cf8aa97daeee1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkxmke7K8gEXleVRuQvCK5LHPLIzQA6s0E" + nickname="Michael" + subject="comment 2" + date="2013-06-12T17:14:11Z" + content=""" +Yes, it seems I was making this more complicated than it needed to be. Just a plain rm seems to work. But just to be clear, I never had the data so I don't need to drop it, right? (By which I mean, is there some other function of drop that I don't understand?) +"""]] diff --git a/doc/forum/Overwriting_data_without_getting_it/comment_3_52958e76e506fdbb6b533681ab619b3b._comment b/doc/forum/Overwriting_data_without_getting_it/comment_3_52958e76e506fdbb6b533681ab619b3b._comment new file mode 100644 index 000000000..19292b870 --- /dev/null +++ b/doc/forum/Overwriting_data_without_getting_it/comment_3_52958e76e506fdbb6b533681ab619b3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-06-12T17:15:26Z" + content=""" +Right. I just put the drop in there to get my repository to the state you described. +"""]] diff --git a/doc/forum/Performance_implications_of_triply_nested_objects_directory.mdwn b/doc/forum/Performance_implications_of_triply_nested_objects_directory.mdwn new file mode 100644 index 000000000..7a6e548b1 --- /dev/null +++ b/doc/forum/Performance_implications_of_triply_nested_objects_directory.mdwn @@ -0,0 +1,23 @@ +Posting this in case anyone might find it interesting. + +I had noticed impractical and abysmally slow performance when tracking a huge number of files (150k) in a git-annex. In direct mode, the repo was outright unusable, but even in indirect mode, many operations where painfully slow; even operations beyond the well-known offender, «git annex findunused», e.g., the seemingly harmless «git annex info». + +I also noticed that the performance was hugely improved on my (otherwise comparable) machine running btrfs, and I wondered how this might be. From previous benchmarks, I had gained the impression that ext4 and btrfs are on par, performance-wise, and you choose btrfs for the features rather than performance. Now, after trying to update my back-ups via rsync, I have had an idea how the contrast between the two machines might might be accounted for. Specifically, I noted that, after converting my 150k folder into a git-annex repo, ascertaining that the back-up is current via rsync would take ~15 minutes, where it used to take mere seconds before. This could then only be due to the demands on directory traversal introduced by the annex-layout. + +Accordingly, I wanted to see whether the traversal would be something that explains the difference in performance between btrfs and ext4, so I ran a tiny benchmark, traversing the .git folder on my home drive (ext4, SATA) and the backup drive (btrfs, USB3), and I was astounded by the difference: + +zardoz [ /mnt/bak/m-annex ]$ time tree .git >/dev/null + +tree .git >/dev/null 14,23s user 2,78s system 24% cpu 1:09,69 total + +zardoz [ ~/m-annex ]$ time tree .git >/dev/null + +tree .git >/dev/null 26,40s user 0,96s system 1% cpu 23:37,94 total + +While running, I peeked into the io using iotop, and observed around 500K/s during traversal on ext4 vs. 5M/s on btrfs. + +While I was aquainted with the dogma that file-systems hate to have a single folder with a bazillion files, sources on the net seem to indicate that having lots and lots of sparse folders is even worse, and given the one-file-per-folder structure of the annex objects store, this would then potentially explain the heavy thrashing on ext4. + +Something I am wondering now: Which operations in git-annex (or plain git) incite that sort of directory traversal? One candidate which occurred to me is «git annex unused», and the differences in performance between ext4 and btrfs are on the same order as in the above benchmark. Originally, Joey related somewhere that the search in «unused» is expensive; but if traversal is involved, it could actually be that this has even more impact than searching git history. + +In any case, if anyone wants to track a very large number of files via git-annex, ext4 seems to be not the ideal file-system for this. diff --git a/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_1_068a8f120d188b8fa5d3e5b687fd02dc._comment b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_1_068a8f120d188b8fa5d3e5b687fd02dc._comment new file mode 100644 index 000000000..0a368b3a3 --- /dev/null +++ b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_1_068a8f120d188b8fa5d3e5b687fd02dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-14T18:33:25Z" + content=""" +I'm afraid that you're comparing apples (SATA drives) and oranges (USB drives). +"""]] diff --git a/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_2_cc0f5be21fd1523bdddc7bcf6ff04435._comment b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_2_cc0f5be21fd1523bdddc7bcf6ff04435._comment new file mode 100644 index 000000000..e47565d67 --- /dev/null +++ b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_2_cc0f5be21fd1523bdddc7bcf6ff04435._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zardoz" + ip="78.49.247.112" + subject="comment 2" + date="2014-07-14T19:34:31Z" + content=""" +I suppose you misread something. Note that the 60s traversal was on the (slower) /external/ drive, and the 24minute traversal on the (faster) internal one, so if anything, the results become more pronounced because of the comparison. + +In the meantime I converted the internal drive to btrfs, and the traversal time on SATA is now 30s, as opposed to the >20min on ext. +"""]] diff --git a/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_3_1133795276371c86cdd52b25a8b20c52._comment b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_3_1133795276371c86cdd52b25a8b20c52._comment new file mode 100644 index 000000000..6b875932d --- /dev/null +++ b/doc/forum/Performance_implications_of_triply_nested_objects_directory/comment_3_1133795276371c86cdd52b25a8b20c52._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 3" + date="2014-07-15T07:29:37Z" + content=""" +The ext-community seems to +[corroborate](http://www.redhat.com/archives/ext3-users/2013-March/msg00007.html) +the observation that having many sparse directories scales extremely +poorly, though this still leaves me curious as to how btrfs deals +with. + +One thing I read is that btrfs stores a secondary index on directories +and uses this index in the readdir() syscall; this secondary index +works in such a way that inodes are likely to be traversed in +sequential on-disk order, while for ext, the readdir() results will be +ordered by inode number, yielding a random access pattern. + +I must confess I’ve always liked to think of the file-system as a +cheap data-base, but apparently that is not such a good idea (i. e., +it’s not cheap at all, in the long run). On the other hand (supposing +that operations like «git annex unused» do indeed work by traversing +the object tree), it probably wouldn’t be easy coming up with a scheme +that scales better. For traversal-bound operations, one might maintain +a database, but it would be a hassle to ensure that this in always in +sync with the file-system. + +"""]] diff --git a/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__.mdwn b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__.mdwn new file mode 100644 index 000000000..caa9fc85a --- /dev/null +++ b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__.mdwn @@ -0,0 +1,36 @@ +Hello, + +I've a strange (for me ;-)) problem. +
I'm trying to use git-annex with 2 debian wheezy (packages from backports) +
I've put my ssh pub key on the server in the autorized_keys for my username account (and for the root account to be sure) +my username account is member of the sudo group (not sure it's required) + +I can create an ssh session directly to the server with : + + ssh username@remoteserver.lan -p 62322 + +and work inside this session. + + Sep 14 03:42:35 file sshd[8849]: Accepted publickey for username from 80.201.25.4 port 32969 ssh2 + Sep 14 03:42:35 file sshd[8849]: pam_unix(sshd:session): session opened for user username by (uid=0) + ... + Sep 14 05:13:14 file sshd[8851]: Received disconnect from 80.201.25.4: 11: disconnected by user + Sep 14 05:13:14 file sshd[8849]: pam_unix(sshd:session): session closed for user username + +But when I use the git-annex assistant on the same workstation with the same remote server and port, +
the 1st step is OK, +
but when I've to choose between git or rsync encrypted, I'm choosing git and receive : + + "Permission denied (publickey)." + +On the server I can only see that the ssh session is immediately closed after opened and before the choice git or rsync is made. + + Sep 14 05:13:42 file sshd[8882]: Accepted publickey for username from 80.201.25.4 port 32984 ssh2 + Sep 14 05:13:42 file sshd[8882]: pam_unix(sshd:session): session opened for user username by (uid=0) + Sep 14 05:13:42 file sshd[8886]: Received disconnect from 80.201.25.4: 11: disconnected by user + Sep 14 05:13:42 file sshd[8882]: pam_unix(sshd:session): session closed for user username + +Do you think it's the problem ? or whatelse ... +
and could you guide me to a possible solution ? + +Best regards diff --git a/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_1_6c74f0b43c457fe97b2d8630ca4fde29._comment b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_1_6c74f0b43c457fe97b2d8630ca4fde29._comment new file mode 100644 index 000000000..8d2215772 --- /dev/null +++ b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_1_6c74f0b43c457fe97b2d8630ca4fde29._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2013-11-08T18:24:27Z" + content=""" +The webapp sets up a dedicated ssh public key when you add a ssh repository in there. + +You might see some useful debugging info your your problem in ~/annex/.git/annex/daemon.log +"""]] diff --git a/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_2_b7a384e853e1756a684774348fad29e6._comment b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_2_b7a384e853e1756a684774348fad29e6._comment new file mode 100644 index 000000000..ecf26daa1 --- /dev/null +++ b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_2_b7a384e853e1756a684774348fad29e6._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="Auroch" + ip="87.65.174.80" + subject="OK,thanx for this" + date="2013-11-09T09:10:42Z" + content=""" +The problem is not solve, but with your informations, I think i've found somehting. + +Is it possible that the problem is linked to my situation of port-forwarding ? +The remoteserver is a host (proxmox) with iptable port forwarding 62322 to the real port 22 of the VM hosting the git where I try to connect. + +So could the problem seems to be that some actions are taken on the host and not the VM ... correct ? + + [2013-11-09 09:51:33 CET] read: ssh-keygen [\"-F\",\"bla.remote.tld\"] + [2013-11-09 09:51:33 CET] read: ssh [\"-oNumberOfPasswordPrompts=0\",\"-n\",\"-p\",\"62322\",\"user@bla.remote.tld\",\"sh -c 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi'\"] + [2013-11-09 09:51:35 CET] chat: ssh [\"user@bla.remote.tld\",\"sh -c 'mkdir -p '\\"'\\"'annex'\\"'\\"'&&cd '\\"'\\"'annex'\\"'\\"'&&if [ ! -d .git ]; then git init --bare --shared; fi&&git annex init'\"] + +If it's correct, have you an idea for solving this ? + +best regards + +"""]] diff --git a/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_3_3a8a7f51cb04a92c576549d379b57248._comment b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_3_3a8a7f51cb04a92c576549d379b57248._comment new file mode 100644 index 000000000..546f647ed --- /dev/null +++ b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_3_3a8a7f51cb04a92c576549d379b57248._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-09T18:07:56Z" + content=""" +Well, it does look like your git-annex did not pass the port to the second command. + +What version are you using? I've just tested with a ssh server only listening on 2222 and it used the port throughout. + +You might try upgrading to a recent version. I know that version 4.20130627, at least, had a bug with the ssh port. +"""]] diff --git a/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_4_582ad3ba0c62a77b08a10b37a780c670._comment b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_4_582ad3ba0c62a77b08a10b37a780c670._comment new file mode 100644 index 000000000..c8d8c8b52 --- /dev/null +++ b/doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_4_582ad3ba0c62a77b08a10b37a780c670._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="Auroch" + ip="87.65.174.80" + subject="comment 4" + date="2013-11-09T19:24:54Z" + content=""" +I've the wheezy-backports version + + i 4.20131002~bpo70+1 wheezy-backports 100 + +I'll have to wait an update and I'll come back to you. + +Thanx this amazing work ! + +"""]] diff --git a/doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn b/doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn new file mode 100644 index 000000000..d49081bf3 --- /dev/null +++ b/doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn @@ -0,0 +1 @@ +I'm having trouble installing the latest git-annex. It depends on 'base >= 4.5 && base < 5', but ghc 7.0 only ships base 3.0. I've tried upgrading ghc to 7.4 but that breaks a whole bunch of other things; for example, the Crypto module fails to compile, preventing me from installing ghc. Please fix compatibility with ghc 7.0. diff --git a/doc/forum/Please_fix_compatibility_with_ghc_7.0/comment_1_d1d10217ebd0151e947b3a6cd37399ce._comment b/doc/forum/Please_fix_compatibility_with_ghc_7.0/comment_1_d1d10217ebd0151e947b3a6cd37399ce._comment new file mode 100644 index 000000000..04b8ce675 --- /dev/null +++ b/doc/forum/Please_fix_compatibility_with_ghc_7.0/comment_1_d1d10217ebd0151e947b3a6cd37399ce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-11T15:50:11Z" + content=""" +There is a `ghc7.0` branch in [[git|download]] that is being maintained to work with that version. +"""]] diff --git a/doc/forum/Please_publish_new_releases_not_shorter_than_11_days.mdwn b/doc/forum/Please_publish_new_releases_not_shorter_than_11_days.mdwn new file mode 100644 index 000000000..f67d2d797 --- /dev/null +++ b/doc/forum/Please_publish_new_releases_not_shorter_than_11_days.mdwn @@ -0,0 +1,6 @@ +Hi, +i am following debian testing. The latest git-annex publication has manged to replace the former version on the last possible moment. Now another 10 days waiting. +Would be nice if you can coordinate with testing. + +Thank you for git-annex. +Jürgen diff --git a/doc/forum/Please_publish_new_releases_not_shorter_than_11_days/comment_1_da3d39de5be47ebe8b25a42ed1f36510._comment b/doc/forum/Please_publish_new_releases_not_shorter_than_11_days/comment_1_da3d39de5be47ebe8b25a42ed1f36510._comment new file mode 100644 index 000000000..1fb259c98 --- /dev/null +++ b/doc/forum/Please_publish_new_releases_not_shorter_than_11_days/comment_1_da3d39de5be47ebe8b25a42ed1f36510._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T19:57:24Z" + content=""" +I do coordinate with testing. That version had no possibility of ever reaching testing, since it failed to build on several architectures. +"""]] diff --git a/doc/forum/Podcast_syncing_use-case.mdwn b/doc/forum/Podcast_syncing_use-case.mdwn new file mode 100644 index 000000000..6b3c81cab --- /dev/null +++ b/doc/forum/Podcast_syncing_use-case.mdwn @@ -0,0 +1,34 @@ +I've been trying to use git-annex with the following strategy. + +* Download podcasts into the annex `gpodder-downloads` +* Check the podcasts into the annex using `git annex add`. +* Copy the podcasts over to my mp3 player in the annex `usb-ariaz`. + This is a FAT-formatted mp3 player, so I have been using a bare + repository. +* Move the podcasts to a different annex called `gpodder-on-usbdisk` + to indicate that they have been successfully put on the mp3 player. +* `chmod` the files on the mp3 player to `0600` so that I can delete + them from the player when I am done listening to them. + +Then I go for a run or something and listen to a bunch of podcasts, +deleting them after I have listened to them. When I get back, I would +like to find the files that I have listened to and remove them from +the annexes that are not on the mp3 player. What I have been hoping +is that something like + + ~/gpodder-on-usbdisk $ git annex find --not --in usb-ariaz --print0 | xargs -0 git rm + ~/gpodder-on-usbdisk $ git annex unused + ~/gpodder-on-usbdisk $ git annex dropunused `seq X` + +would work. However, it appears that `git-annex find` does not +actually check to see that the file contents are present, but only +looks at the `git-annex` branch of the `usb-ariaz` repository. Since +I have not changed that with my sneaky deletions, it has no way of +knowing that the files have been deleted. + +Is there any way to do this properly? (And by properly, I don't mean +"don't delete the files". That is really the only way I have of +marking that I have listened to podcasts on this particular mp3 player.) + +I tried setting the `usb-ariaz` repository to be untrusted, but that +did not change the behavior of `git annex find`. diff --git a/doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment b/doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment new file mode 100644 index 000000000..fe396c39f --- /dev/null +++ b/doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-11-27T17:56:31Z" + content=""" +Right, --in goes by git-annex's [[location_tracking]] information; actually checking if a remote still has the files would make --in too expensive in many cases. + +So you need to give `gpodder-on-usbdisk` current information. You can do that by going to `usb-ariaz` and doing a `git annex fsck`. That will find the deleted files and update the location information. Then, back on `gpodder-on-usbdisk`, `git pull usb-ariaz`, and then you can proceed with the commands you showed. +"""]] diff --git a/doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment b/doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment new file mode 100644 index 000000000..97eb3c681 --- /dev/null +++ b/doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cgray.myopenid.com/" + nickname="cgray" + subject="comment 2" + date="2011-11-27T22:10:44Z" + content=""" +Thanks, that works perfectly! +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP.mdwn b/doc/forum/Poor_man__39__s_IMAP.mdwn new file mode 100644 index 000000000..af53ddc19 --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP.mdwn @@ -0,0 +1,6 @@ +I have an e-mail server configured to save my mail in ~/Maildir on an account that is available over ssh. I'd like to keep emailserver:~/Maildir in a two-way sync with laptop:~/Mail/private essentially creating a poor man's IMAP — without setting up and maintaining an actual IMAP server. **Is it an appropriate use of git-annex or would another tool be more fitting? And how do I go about doing it?** I'd like to sync the files, the content, not just information about the files or other meta-data. + +I tried setting it up with the webUI to the assistant but it only offers encrypted storage[1] on the remote server. I looked into setting it up manually but "git-annex does not notice when files are added to remote rsync repositories."[2] + +[1] http://git-annex.branchable.com/bugs/Remote_repositories_have_to_be_setup_encrypted/ +[2] from comments on http://git-annex.branchable.com/special_remotes/rsync/ diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_1_258ff23c462dc88b88ced405c4f5040f._comment b/doc/forum/Poor_man__39__s_IMAP/comment_1_258ff23c462dc88b88ced405c4f5040f._comment new file mode 100644 index 000000000..8965f18be --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_1_258ff23c462dc88b88ced405c4f5040f._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 1" + date="2013-08-14T06:45:56Z" + content=""" +I'd say that git-annex is the wrong tool. + +OfflineIMAP ([[http://offlineimap.org]]) is simple to set up, is easy to secure over ssh and does exactly what you want. + +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_2_c88d1abdda4cb526a6ee45a710c75bc4._comment b/doc/forum/Poor_man__39__s_IMAP/comment_2_c88d1abdda4cb526a6ee45a710c75bc4._comment new file mode 100644 index 000000000..4ab7af46b --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_2_c88d1abdda4cb526a6ee45a710c75bc4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 2" + date="2013-08-14T06:53:04Z" + content=""" +From my massive amount of googling, i.e. 2min, apparently mbsync ([[http://isync.sourceforge.net/mbsync.html]]) is good too. + +I've never used it, so YMMV. +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_3_3847e371db1c2788c075e7dca1fbd33e._comment b/doc/forum/Poor_man__39__s_IMAP/comment_3_3847e371db1c2788c075e7dca1fbd33e._comment new file mode 100644 index 000000000..a8ed31475 --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_3_3847e371db1c2788c075e7dca1fbd33e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://spindritf.myopenid.com/" + nickname="spindritf" + subject="comment 3" + date="2013-08-14T07:30:30Z" + content=""" +Offlineimap connects to an IMAP server and I was hoping to avoid running one. Thanks though. +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment b/doc/forum/Poor_man__39__s_IMAP/comment_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment new file mode 100644 index 000000000..bcb698216 --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 4" + date="2013-08-14T11:11:59Z" + content=""" +IMHO It is not the wrong tool for the job, after all the whole point of assistant is to sync folder across machines. I have a similar setup. I have two folders on two machines plus an encrypted repo on an ssh server. On both folders (local/server) i keep webapp running they sync using the encrypted repo/xmpp. The only downside to this approach is that VPS has two copies of every file one in the folder on in the encrypted git repo. +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_5_d861fa69475ce526841b3195be8ee356._comment b/doc/forum/Poor_man__39__s_IMAP/comment_5_d861fa69475ce526841b3195be8ee356._comment new file mode 100644 index 000000000..d5621bb4a --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_5_d861fa69475ce526841b3195be8ee356._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://spindritf.myopenid.com/" + nickname="spindritf" + subject="comment 5" + date="2013-08-14T18:08:22Z" + content=""" +> IMHO It is not the wrong tool for the job, after all the whole point of assistant is to sync folder across machines. + +That's what I thought. OK, so how do I do it? Should I set up this rsync special remote and run sync every once in a while. When starting the e-mail client for example? +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment b/doc/forum/Poor_man__39__s_IMAP/comment_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment new file mode 100644 index 000000000..7e0720456 --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 6" + date="2013-08-16T09:14:52Z" + content=""" +You can either keep running 2 webapps paired using xmpp running all the time that gives you push like notifications or if you are ok with syncing every once in a while you can have a check mail script that adds files on the server commits them then calls git annex sync locally, + + ssh $1 \"cd /path/to/annex/;git add .;git commit 'Update'\";git annex sync + +should do the trick. The latter method you just need to annex repos no encrypted third repo. Just init your git annex repo on the server and clone on the laptop thats it. +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_7_b3929281dff6078d77f1b9ae42e25bb6._comment b/doc/forum/Poor_man__39__s_IMAP/comment_7_b3929281dff6078d77f1b9ae42e25bb6._comment new file mode 100644 index 000000000..aba4cd0de --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_7_b3929281dff6078d77f1b9ae42e25bb6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 7" + date="2013-08-23T18:30:04Z" + content=""" +I don't feel that git-annex is the best thing to use for this. Maildir has some specific semantics for the filenames used in it that let imap clients resolve inconsistencies, such as a message that was read on machine A, and deleted on machine B. git-annex is unlikely to work as well. + +However, I have to say that the very beginning of this thread has a wrong statement in it. + +> I tried setting it up with the webUI to the assistant but it only offers encrypted storage[1] on the remote server. + +If you install git and git-annex on your remote server, the git-annex assistant will detect this, and offer the choice between a regular git repository, and encrypted storage. If you don't have them installed, it tells you you don't, offers to let you retry once you do install them, and offers encrypted storage as the only option that works given what's installed on the server. + +(Also, the bug you linked to in [1] has nothing at all to do with what you were talking about.) +"""]] diff --git a/doc/forum/Poor_man__39__s_IMAP/comment_8_69506e8c519196f44b9ed15b32f00106._comment b/doc/forum/Poor_man__39__s_IMAP/comment_8_69506e8c519196f44b9ed15b32f00106._comment new file mode 100644 index 000000000..18b99a880 --- /dev/null +++ b/doc/forum/Poor_man__39__s_IMAP/comment_8_69506e8c519196f44b9ed15b32f00106._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="konubinix" + ip="82.243.233.186" + subject="And with a lots of mails?" + date="2013-08-27T06:44:56Z" + content=""" +Hi, + +I have a question quite similar, but for a different purpose. I use OfflineImap for imap synchronisation, but in my current situation, I travel a lot between two places: one connected to the Internet and the other not connected. + +When I am connected to the Internet, I may synchronize mails, then I rsync my ~/Mail directory to a usb key so that I have access to them in the place without connection. The mails filenames may be changed as Joeyh mentioned while I read or delete them. I rsync them back to the usb key before going back to the place with Internet connection, where the OfflineImap synchronization may occur. + +This solution, with rsynced key, works well. But I would love a history of what was done with file names and may be able to retrieve an old mail. + +I figured out that that the git annex was a really good solution for that. + +The main drawback from my point of view is that I have around 100 000 mails (some would say that's \"[Not much mail](http://notmuchmail.org/)\"), and I am afraid that git will be quite slow with that amount of files. + +Did anyone experience an annexed repository with so many items it in? + +Best +"""]] diff --git a/doc/forum/Portable_version_of_git-annex_for_windows.mdwn b/doc/forum/Portable_version_of_git-annex_for_windows.mdwn new file mode 100644 index 000000000..e4c0bb737 --- /dev/null +++ b/doc/forum/Portable_version_of_git-annex_for_windows.mdwn @@ -0,0 +1,22 @@ +Problem: I don't have admin access on all the computers I want to plug my USB with git-annex on. +Solution: Make git & git-annex portable. + +The only catch is I'm not familiar enough with git to be able to actually tell if the more specialized git-annex working properly. The commands execute without crashing so I suspect it's fine but I was hoping someone else more competent could try this out and let me know if I it's working so I can add it to the tips section. Thanks in advance! + +Ingredients: + +* Portable version of msysgit: + +* Windows git-annex installer: + +* 7-zip (portable version optional): + +Steps: + +1. Use 7-zip to extract the contents of the git-annex installer into their own folder. + +2. Extract the portable version of git and copy all files extracted from git-annex installer into the "cmd" folder. + +3. Run it! + +Edit: the markdown is eating my attempts to create a numbered list and making them a paragraph instead. Apologies! diff --git a/doc/forum/Portable_version_of_git-annex_for_windows/comment_1_e5e60fa8d104a09152a8164d5a906aec._comment b/doc/forum/Portable_version_of_git-annex_for_windows/comment_1_e5e60fa8d104a09152a8164d5a906aec._comment new file mode 100644 index 000000000..2d5b22ee8 --- /dev/null +++ b/doc/forum/Portable_version_of_git-annex_for_windows/comment_1_e5e60fa8d104a09152a8164d5a906aec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="rtwolf" + ip="69.165.155.234" + subject="comment 1" + date="2014-01-07T17:38:19Z" + content=""" +Seems windows version of git-annex only runs in direct mode so I got the dreaded \"fatal: this operation must be run in a work tree\" error. Ran \"git config core.bare false\" which fixed it. + +More info on direct mode: +"""]] diff --git a/doc/forum/Portable_version_of_git-annex_for_windows/comment_2_d8d1aa0920351e880ba6678bb97585de._comment b/doc/forum/Portable_version_of_git-annex_for_windows/comment_2_d8d1aa0920351e880ba6678bb97585de._comment new file mode 100644 index 000000000..3602e88c6 --- /dev/null +++ b/doc/forum/Portable_version_of_git-annex_for_windows/comment_2_d8d1aa0920351e880ba6678bb97585de._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="rtwolf" + ip="69.165.155.234" + subject="comment 2" + date="2014-01-07T17:41:25Z" + content=""" +Correction to above. Don't run that command, just use git annex sync instead. + +Also, git annex drop gives just a blank line. Maybe it doesn't work in direct mode either? +"""]] diff --git a/doc/forum/Post-Kickstarter.mdwn b/doc/forum/Post-Kickstarter.mdwn new file mode 100644 index 000000000..d774ca25b --- /dev/null +++ b/doc/forum/Post-Kickstarter.mdwn @@ -0,0 +1,5 @@ +We're nearing the end of the year of development funded by Kickstarter. I'm curious to know what the future of the project looks like. + +I assume that development will decrease from its current levels as you focus more of your energy on activities that put bread on the table, but is git-annex still something that you foresee actively working on or will it be in more of a feature-freeze-bug-fix stage? + +As a backer my only regret is that during the campaign I wasn't able to donate as much as I would have liked. The project has exceeded my expectations since then. I don't know that another Kickstarter campaign is worth the effort, but if you were to ask for donations to fund another month or two or three I would gladly donate. Or perhaps implement a feature-bounty program where users could donate money toward development of a particular feature they would like to see added. Or perhaps you're sick of working for the Internet! diff --git a/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn new file mode 100644 index 000000000..d89bcee29 --- /dev/null +++ b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn @@ -0,0 +1,77 @@ +Hello, + +I have the problem that, while git-annex preserves the file access rights (user, group, others) for the actual file, it does not make sure that others can access this file through the directory tree above said file: + + /tmp $ mkdir test + /tmp $ chown claudius:media test + /tmp $ chmod 750 test + /tmp $ ls -dl test + drwxr-x--- 2 claudius media 40 2012-01-23 19:27 test/ + /tmp $ cd test + /tmp/test $ git init --shared=all + Initialized empty shared Git repository in /tmp/test/.git/ + /tmp/test $ git annex init "test" + init test ok + /tmp/test $ echo 123 > abc + /tmp/test $ chmod 640 abc + /tmp/test $ chown claudius:media abc + /tmp/test $ ls -l + total 4 + -rw-r----- 1 claudius media 4 2012-01-23 19:27 abc + /tmp/test $ git annex add . + add abc (checksum...) ok + (Recording state in git...) + /tmp/test $ ls -l + total 4 + lrwxrwxrwx 1 claudius claudius 176 2012-01-23 19:27 abc -> .git/annex/objects/8F/pj/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b + /tmp/test $ ls -l .git/annex/objects/8F/pj/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b + -r--r----- 1 claudius media 4 2012-01-23 19:27 .git/annex/objects/8F/pj/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b + /tmp/test $ ls -lR .git/annex/objects/ + .git/annex/objects/: + total 0 + drwx--S--- 3 claudius claudius 60 2012-01-23 19:28 8F/ + + .git/annex/objects/8F: + total 0 + drwx--S--- 3 claudius claudius 60 2012-01-23 19:28 pj/ + + .git/annex/objects/8F/pj: + total 0 + dr-x--S--- 2 claudius claudius 60 2012-01-23 19:28 SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b/ + + .git/annex/objects/8F/pj/SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b: + total 4 + -r--r----- 1 claudius media 4 2012-01-23 19:27 SHA256-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b + /tmp/test $ stat .git/annex/objects/ + File: `.git/annex/objects/' + Size: 60 Blocks: 0 IO Block: 4096 directory + Device: 11h/17d Inode: 2365970 Links: 3 + Access: (2700/drwx--S---) Uid: ( 1000/claudius) Gid: ( 1000/claudius) + Access: 2012-01-23 19:28:10.614948386 +0100 + Modify: 2012-01-23 19:28:10.614948386 +0100 + Change: 2012-01-23 19:28:10.614948386 +0100 + Birth: - + +The use case is that I have a rather large collection of music I would like to manage with git-annex in various locations (all of it on my external hard drive, some on my notebook etc. This music is played by MPD, which can access the collection because it is in the "media" group. After changing to git-annex, however, this fails. + +I tried to avoid this specific problem by declaring the git repository to be shared, which does appear to have some effect on the other files in .git: + + /tmp/test $ ls -l .git + total 16 + drwx--S--- 5 claudius claudius 160 2012-01-23 19:28 annex/ + drwxrwsr-x 2 claudius claudius 40 2012-01-23 19:27 branches/ + -rw-rw-r-- 1 claudius claudius 218 2012-01-23 19:27 config + -rw-rw-r-- 1 claudius claudius 73 2012-01-23 19:27 description + -rw-rw-r-- 1 claudius claudius 23 2012-01-23 19:27 HEAD + drwxrwsr-x 2 claudius claudius 220 2012-01-23 19:27 hooks/ + -rw-rw-r-- 1 claudius claudius 104 2012-01-23 19:28 index + drwxrwsr-x 2 claudius claudius 60 2012-01-23 19:27 info/ + drwxrwsr-x 3 claudius claudius 60 2012-01-23 19:27 logs/ + drwxrwsr-x 15 claudius claudius 300 2012-01-23 19:28 objects/ + drwxrwsr-x 4 claudius claudius 80 2012-01-23 19:27 refs/ + +I could obviously try to change the rights of annex/, annex/objects etc., but I would like to avoid having to adapt them each time a new folder is added somewhere below annex/objects/. + +My knowledge of git and especially git-annex is not too good, so it might well be that I missed something obvious. Any hints? :) + +(And thank you, of course, for taking the time to read all this) diff --git a/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment new file mode 100644 index 000000000..d2da5e94d --- /dev/null +++ b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-23T19:00:40Z" + content=""" +You say you started the repo with \"git init --shared\" .. but what that's really meant for is bare repositories, which can have several users pushing into it, not a non-bare repository. + +The strange mode on the directories \"dr-x--S---\" and files \"-r--r-----\" must be due to your umask setting though. My umask is 022 and the directories and files under `.git/annex/objects` are \"drwxr-xr-x\" and \"-r--r--r--\", which allows anyone to read them unless an upper directory blocks it -- and with this umask, none do unless I explicitly remove permissions from one to lock down a repository. + +About mpd, the obvious fix is to run mpd not as a system user but as yourself. I put \"@reboot mpd\" in my crontab to do this. + + +"""]] diff --git a/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_2_9f51947b35ee04e473655e20d56c740a._comment b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_2_9f51947b35ee04e473655e20d56c740a._comment new file mode 100644 index 000000000..5d632ab86 --- /dev/null +++ b/doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_2_9f51947b35ee04e473655e20d56c740a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlB7-aXsqwzOi2BIR_Q4sUF8sjj24H6F3c" + nickname="Claudius" + subject="comment 2" + date="2012-01-23T19:39:17Z" + content=""" +Thank you for your comment! Indeed, setting the umask to, for example, 022 has the desired effect that annex/objects etc. are executable (and in this special case also writable), my previous umask setting was 077; the \"strange\" permissions on the git directories was probably due to --shared=all, and the mode of \"440\" on the files within the git-annex tree is correct (the original file was 640 and stripped of its write permission). + +Using this umask setting and newgrp to switch the default group, I was successfully able to set up the repositories. + +However, I would like to suggest adding the execute bit to the directories below .git/annex/objects/ per default, even if the umask of the current shell differs. As the correct rights are already preserved in the actual files (minus their write permission) together with correct owner and group, the files are still protected the same way as previously, and because +x does not allow directory listings, no additional information can leak out either. Not having to set the umask to something \"sensible\" before operating git-annex would be a huge plus, too :) + +The reason why I am not running MPD as my user is that I am a bit wary of running an application even exposed to the local network as my main user, and I see nothing wrong with running it as its own user. + +Thank you again for your help and the time you put into this project! +"""]] diff --git a/doc/forum/Previous_versions_in_direct_mode__63__.mdwn b/doc/forum/Previous_versions_in_direct_mode__63__.mdwn new file mode 100644 index 000000000..2958346e7 --- /dev/null +++ b/doc/forum/Previous_versions_in_direct_mode__63__.mdwn @@ -0,0 +1,3 @@ +I am in Windows and therefore forced to use direct mode. After reading for a long while I still have not found a way of "git annex get" previous versions. Is this supported? is it only the last version in the repository? + +any chance to use indirect mode in Windows? In theory Windows supports NTFS symlinks, why is this not supported? diff --git a/doc/forum/Previous_versions_in_direct_mode__63__/comment_1_352d460acd5500587e679d934180eee4._comment b/doc/forum/Previous_versions_in_direct_mode__63__/comment_1_352d460acd5500587e679d934180eee4._comment new file mode 100644 index 000000000..b81e6c85e --- /dev/null +++ b/doc/forum/Previous_versions_in_direct_mode__63__/comment_1_352d460acd5500587e679d934180eee4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-24T20:56:00Z" + content=""" +git-annex for windows is targeting being used with msysgit, and msysgit does not seem to support symlinks. That's one good reason. Since cywin's git does support symlinks, it might be possible to get git-annex to use it and support indirect mode. + +Doing anything about this is probably \"patches accepted\" territory for me. I'm mostly interested in porting git-annex to Windows so it can be used on computers owned by non-technical users, to interoperate with git-annex on more capable operating systems. +"""]] diff --git a/doc/forum/Problem_compiling_current_master.mdwn b/doc/forum/Problem_compiling_current_master.mdwn new file mode 100644 index 000000000..d79dcd0b4 --- /dev/null +++ b/doc/forum/Problem_compiling_current_master.mdwn @@ -0,0 +1,12 @@ +While trying to compile the current master I run in the following error: + + Utility/Yesod.hs:21:14: + Couldn't match expected type `String' + with actual type `WidgetFileSettings' + Expected type: String -> Q Exp + Actual type: WidgetFileSettings -> FilePath -> Q Exp + In the expression: widgetFileNoReload + In an equation for `widgetFile': widgetFile = widgetFileNoReload + make: *** [git-annex] Fehler 1 + +I installed all dependencies from the INSTALL document. What is wrong? diff --git a/doc/forum/Problem_compiling_current_master/comment_1_135df61ec850c06e3b48ccfef7b5b031._comment b/doc/forum/Problem_compiling_current_master/comment_1_135df61ec850c06e3b48ccfef7b5b031._comment new file mode 100644 index 000000000..676cc697d --- /dev/null +++ b/doc/forum/Problem_compiling_current_master/comment_1_135df61ec850c06e3b48ccfef7b5b031._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 1" + date="2012-08-29T15:51:15Z" + content=""" +I think you're building with the Makefile, not with cabal, and have the recent yesod 1.1.0 release installed. The Makefile contains a -DWITH_OLD_YESOD that you need to remove in that situation. +"""]] diff --git a/doc/forum/Problem_compiling_current_master/comment_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment b/doc/forum/Problem_compiling_current_master/comment_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment new file mode 100644 index 000000000..61c6f3be6 --- /dev/null +++ b/doc/forum/Problem_compiling_current_master/comment_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 2" + date="2012-08-30T11:32:24Z" + content=""" +That helped now the compile stops at: + + Utility/WebApp.hs:106:9: + Ambiguous occurrence `liftIO' + It could refer to either `Yesod.liftIO', + imported from `Yesod' at Utility/WebApp.hs:14:1-12 + (and originally defined in `transformers-0.2.2.0:Control.Monad.IO.Class') + or `Control.Monad.IO.Class.liftIO', + imported from `Control.Monad.IO.Class' at Utility/WebApp.hs:18:1-29 + make: *** [git-annex] Fehler 1 + + + +"""]] diff --git a/doc/forum/Problem_compiling_current_master/comment_3_b737b3945103c5e2aa798b4e65fbce06._comment b/doc/forum/Problem_compiling_current_master/comment_3_b737b3945103c5e2aa798b4e65fbce06._comment new file mode 100644 index 000000000..12c4b1af0 --- /dev/null +++ b/doc/forum/Problem_compiling_current_master/comment_3_b737b3945103c5e2aa798b4e65fbce06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 3" + date="2012-08-30T17:07:44Z" + content=""" +I've fixed this.. I think. I don't have this problem with the version of yesod I have here. +"""]] diff --git a/doc/forum/Problem_compiling_current_master/comment_4_28c1b335ae388d4e1f22b711ac1c001f._comment b/doc/forum/Problem_compiling_current_master/comment_4_28c1b335ae388d4e1f22b711ac1c001f._comment new file mode 100644 index 000000000..d16e17c13 --- /dev/null +++ b/doc/forum/Problem_compiling_current_master/comment_4_28c1b335ae388d4e1f22b711ac1c001f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmU_2tE75oyG0h2ZPN4lcroIKEMC8G-otE" + nickname="Michael" + subject="comment 4" + date="2012-08-31T08:04:18Z" + content=""" +Success! Now it compiles fine on Ubuntu 12.04 with make. Thank you. +"""]] diff --git a/doc/forum/Problems_syncing_with_box.com.mdwn b/doc/forum/Problems_syncing_with_box.com.mdwn new file mode 100644 index 000000000..e536ccdb6 --- /dev/null +++ b/doc/forum/Problems_syncing_with_box.com.mdwn @@ -0,0 +1,26 @@ +I have a repository synchronized between two PCs and box.com . I chose encryption for box.com. Today on my work computer I changed files, on box.com I see that there are changed files today. When I got home, I still see files with yesterday's date. +One thing to mention is that currently the work PC is not accessible. + +1. How do I debug this problem? I have logging set to debug via web console, saved, restarted daemon, but after restart the debug checkbox is unchecked. +From logs it looks like that after failing to connect to work pc via ssh it gives up: + + [2013-05-09 21:42:52 CEST] main: Syncing with box.com +this is first and last line mentioning box today, I restarted the daemon several times around 22:14 : + + [2013-05-09 22:11:40 CEST] TransferScanner: Syncing with [work pc repo] + Already up-to-date. + + (scanning...) [2013-05-09 22:11:40 CEST] Watcher: Performing startup scan + Already up-to-date. + + (started...) ssh: connect to host [work pc] port 22: No route to host + fatal: The remote end hung up unexpectedly + + +2. where is the configuration for box.com stored? How can I check gpg key ID mentioned at http://git-annex.branchable.com/tips/using_box.com_as_a_special_remote/ +3. how do I manually trigger sync with box.com? git fetch box.com neither git annex sync box.com doesn't work. + + +--- +Version: 4.20130501 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP diff --git a/doc/forum/Problems_syncing_with_box.com/comment_1_8db642849da4d42cd9a43142e2b7cb70._comment b/doc/forum/Problems_syncing_with_box.com/comment_1_8db642849da4d42cd9a43142e2b7cb70._comment new file mode 100644 index 000000000..b60fc03e0 --- /dev/null +++ b/doc/forum/Problems_syncing_with_box.com/comment_1_8db642849da4d42cd9a43142e2b7cb70._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T17:56:35Z" + content=""" +From what you've described, the box.com special remote is the only remote you have connecting your two computers. + +But special remotes are only used to transfer the contents of files. They do not have the content of the git repository. + +You need to set up a git remote that both computers can access. Or you can use the webapp to set up XMPP to sync between the computers directly. If you start the webapp, it will detect you're missing a git remote, and suggest setting up XMPP. [[/assistant/xmppnudge.png]] +"""]] diff --git a/doc/forum/Problems_syncing_with_box.com/comment_2_cd18f33647aebc04af5469e4ce1fbcd2._comment b/doc/forum/Problems_syncing_with_box.com/comment_2_cd18f33647aebc04af5469e4ce1fbcd2._comment new file mode 100644 index 000000000..d156622df --- /dev/null +++ b/doc/forum/Problems_syncing_with_box.com/comment_2_cd18f33647aebc04af5469e4ce1fbcd2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="tomas" + ip="188.167.111.235" + subject="Problems syncing with box.com" + date="2013-05-19T19:56:09Z" + content=""" +Thanks for the answer Joey. +My setup is really 2 PCs that are usually not turned on at the same time (usually) and are unable to connect directly (usually). I've dropped box.com because there are bugs. When I sync a file, I see a broken link sometimes. That happens even in situation when the two PCs see each other. Other repos work as expected. So I assume this is a box.com issue. I tried to remove the box repo from both sides, but it is still in 'cleaning out' state even after few days and a lot of daemon restarts. I also have a queue to box. If I delete the transfers, they would appear later. Any way of sorting that out? +I know that reporting bugs like this is not really efficient. What would be the best way to make it reproducible? E.g. using vagrant and two VMs? + +"""]] diff --git a/doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn b/doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn new file mode 100644 index 000000000..39ebe855c --- /dev/null +++ b/doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn @@ -0,0 +1 @@ +Are there any problems using submodules with git-annex? I have not tried it yet, I'm just asking. diff --git a/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_1_c7a927736d419d3c31c912001ff16ee4._comment b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_1_c7a927736d419d3c31c912001ff16ee4._comment new file mode 100644 index 000000000..3c2f5addb --- /dev/null +++ b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_1_c7a927736d419d3c31c912001ff16ee4._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-07-05T17:04:34Z" + content=""" +I haven't tried it either, but I think it should work ok, as long as you bear in mind that to git-annex, each submodule will be treated as a separate git repository. +"""]] diff --git a/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment new file mode 100644 index 000000000..a9e939834 --- /dev/null +++ b/doc/forum/Problems_using_submodules_with_git-annex__63__/comment_2_26f6581b5969eb2cb77495c40de88951._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + nickname="Mildred" + subject="submodules with git-annex in direct mode" + date="2014-04-27T14:05:20Z" + content=""" +Does this work well even with direct mode ? +How is this managed in direct mode ? + +Coming back from direct mode to indirect mode (required when I want to run git commands) I found that the .gitmodules file was an annex symlink (to .git/annex/objects/...). I just recovered from corrupt repository and may have made mistakes, but is this a risk under normal curcumstances ? +"""]] diff --git a/doc/forum/Problems_when_cloning_a_repository.mdwn b/doc/forum/Problems_when_cloning_a_repository.mdwn new file mode 100644 index 000000000..374aca26e --- /dev/null +++ b/doc/forum/Problems_when_cloning_a_repository.mdwn @@ -0,0 +1,22 @@ +Hi, + +On a linux server I created a (direct) git annex repository: + + $ ls -a + . .. apps attic devel games .git portable tools + +On a Windows client, I want to check it out: + + me@client /cygdrive/c/tmp + $ git clone ssh://me@server/srv/data/bin bin + Cloning into 'bin'... + +But git annex checks only half of it out :-( + + me@client /cygdrive/c/tmp + $ ls -a bin + . .. .git attic games + +Any ideas? Sorry, I am very new to git-annex (and git). + +Thanks! diff --git a/doc/forum/Problems_when_cloning_a_repository/comment_1_191c091c384d8d97d24f8a77e8ff90ee._comment b/doc/forum/Problems_when_cloning_a_repository/comment_1_191c091c384d8d97d24f8a77e8ff90ee._comment new file mode 100644 index 000000000..bb0d294c7 --- /dev/null +++ b/doc/forum/Problems_when_cloning_a_repository/comment_1_191c091c384d8d97d24f8a77e8ff90ee._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="Xyem" + ip="178.79.137.64" + subject="comment 1" + date="2014-05-08T12:50:58Z" + content=""" +What files are in the directories that are missing? +Are they committed into the repository? +"""]] diff --git a/doc/forum/Problems_when_cloning_a_repository/comment_2_74ccbb09677444478074e9eab405fbaf._comment b/doc/forum/Problems_when_cloning_a_repository/comment_2_74ccbb09677444478074e9eab405fbaf._comment new file mode 100644 index 000000000..5f4ee08f7 --- /dev/null +++ b/doc/forum/Problems_when_cloning_a_repository/comment_2_74ccbb09677444478074e9eab405fbaf._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.174.99" + subject="comment 2" + date="2014-05-09T01:02:22Z" + content=""" +Thanks. + +As you can see everything except attic and games is missing. + +As far as I understand, yes, they are committed. How can I check? +On the server I issued + git annex add . + +\"git annex status\" does not output anything. Remember: I use direct mode. +"""]] diff --git a/doc/forum/Problems_when_cloning_a_repository/comment_3_3436e26dd9fe07233a070d4e95d81cdf._comment b/doc/forum/Problems_when_cloning_a_repository/comment_3_3436e26dd9fe07233a070d4e95d81cdf._comment new file mode 100644 index 000000000..65470841a --- /dev/null +++ b/doc/forum/Problems_when_cloning_a_repository/comment_3_3436e26dd9fe07233a070d4e95d81cdf._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.174.99" + subject="comment 3" + date="2014-05-09T06:06:54Z" + content=""" +Finally I found it: https://git-annex.branchable.com/bugs/assistant_doesn__39__t_sync_empty_directories/ + +Empty directories. + +Wow! I was not aware that git is actually a step BACKWARDS in this regard :-( + +That was already a big problem half a century ago in CVS, finally fixed in SVN and git re-introduces the issue? Sad :-( + + +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files.mdwn b/doc/forum/Problems_with_large_numbers_of_files.mdwn new file mode 100644 index 000000000..1dbddd3e2 --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files.mdwn @@ -0,0 +1,8 @@ +I'm trying to use git-annex to archive scientific data. I'm often dealing with large numbers of files, sometimes 10k or more. When I try to git-annex add these files I get this error: + + + Stack space overflow: current size 8388608 bytes. + Use `+RTS -Ksize' to increase it. + + +This is with the latest version of git-annex and a current version of git on OS 10.6.7. After this error occurs, I am unable to un-annex the files and I'm forced to recover from a backup. diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment new file mode 100644 index 000000000..94043a700 --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-04-05T07:27:46Z" + content=""" +Heh, cool, I was thinking throwing about 28million files at git-annex. Let me know how it goes, I suspect you have just run into a default limits OSX problem. + +You probably just need to up some system limits (you will need to read the error messages that first appear) then do something like + +
+# this is really for the run time, you can set these settings in /etc/sysctl.conf
+sudo sysctl -w kern.maxproc=2048
+sudo sysctl -w kern.maxprocperuid=1024
+
+# tell launchd about having higher limits
+sudo echo \"limit maxfiles 1024 unlimited\" >> /etc/launchd.conf
+sudo echo \"limit maxproc 1024 2048\" >> /etc/launchd.conf
+
+ +There are other system limits which you can check by doing a \"ulimit -a\", once you make the above changes, you will need to reboot to make the changes take affect. I am unsure if the above will help as it is an example of what I did on 10.6.6 a few months ago to fix some forking issues. From the error you got you will probably need to increase the stacksize to something bigger or even make it unlimited if you feel lucky, the default stacksize on OSX is 8192, try making it say 10times that size first and see what happens. +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment new file mode 100644 index 000000000..8ea5531f4 --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-05T17:46:03Z" + content=""" +This message comes from ghc's runtime memory manager. Apparently your ghc defaults to limiting the stack to 80 mb. +Mine seems to limit it slightly higher -- I have seen haskell programs successfully grow as large as 350 mb, although generally not intentionally. :) + +Here's how to adjust the limit at runtime, obviously you'd want a larger number: + +
+# git-annex +RTS -K100 -RTS find
+Stack space overflow: current size 100 bytes.
+Use `+RTS -Ksize -RTS' to increase it.
+
+ +I've tried to avoid git-annex using quantities of memory that scale with the number of files in the repo, and I think in general successfully -- I run it on 32 mb and 128 mb machines, FWIW. There are some tricky cases, and haskell makes it easy to accidentally write code that uses much more memory than would be expected. + +One well known case is `git annex unused`, which *has* to build a structure of every annexed file. I have been considering using a bloom filter or something to avoid that. + +Another possible case is when running a command like `git annex add`, and passing it a lot of files/directories. Some code tries to preserve the order of your input after passing it through `git ls-files` (which destroys ordering), and to do so it needs to buffer both the input and the result in ram. + +It's possible to build git-annex with memory profiling and generate some quite helpful profiling data. Edit the Makefile and add this to GHCFLAGS: `-prof -auto-all -caf-all -fforce-recomp` then when running git-annex, add the parameters: `+RTS -p -RTS` , and look for the git-annex.prof file. +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment new file mode 100644 index 000000000..8e4101e37 --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-04-05T18:02:05Z" + content=""" +Oh, you'll need profiling builds of various haskell libraries to build with profiling support. If that's not easily accomplished, if you could show me the form of the command you're running, and also how git annex unannex fails, that would be helpful for investigating. +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment new file mode 100644 index 000000000..bac9fd7ca --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkhdKAhe3l_UyGt5SdfRBPYVwe-9f8P2dM" + nickname="Justin" + subject="comment 4" + date="2011-04-05T21:14:12Z" + content=""" +@joey + +OK, I'll try increasing the stack size and see if that helps. + +For reference, I was running: + +git annex add . + +on a directory containing about 100k files spread over many nested subdirectories. I actually have more than a dozen projects like this that I plan to keep in git annex, possibly in separate repositories if necessary. I could probably tar the data and then archive that, but I like the idea of being able to see the structure of my data even though the contents of the files are on a different machine. + +After the crash, running: + +git annex unannex + +does nothing and returns instantly. What exactly is 'git annex add' doing? I know that it's moving files into the key-value store and adding symlinks, but I don't know what else it does. + +--Justin + + + +If + +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment new file mode 100644 index 000000000..7dcccef2e --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-04-07T16:41:00Z" + content=""" +I think what is happening with \"git annex unannex\" is that \"git annex add\" crashes before it can \"git add\" the symlinks. unannex only looks at files that \"git ls-files\" shows, and so files that are not added to git are not seen. So, this can be recovered from by looking at git status and manually adding the symlinks to git, and then unannex. + +That also suggests that \"git annex add .\" has done something before crashing. That's consistent with you passing it < 2 parameters; it's not just running out of memory trying to expand and preserve order of its parameters (like it might if you ran \"git annex add experiment-1/ experiment-2/\") + +I'm pretty sure I know where the space leak is now. git-annex builds up a queue of git commands, so that it can run git a minimum number of times. Currently, this queue is only flushed at the end. I had been meaning to work on having it flush the queue periodically to avoid it growing without bounds, and I will prioritize doing that. + +(The only other thing that \"git annex add\" does is record location log information.) +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment new file mode 100644 index 000000000..fff8f7cdd --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-04-07T18:09:13Z" + content=""" +I've committed the queue flush improvements, so it will buffer up to 10240 git actions, and then flush the queue. + +There may be other memory leaks at scale (besides the two I mentioned earlier), but this seems promising. I'm well into running `git annex add` on a half million files and it's using 18 mb ram and has flushed the queue several times. This run +will fail due to running out of inodes for the log files, not due to memory. :) +"""]] diff --git a/doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment b/doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment new file mode 100644 index 000000000..7d2ad5eba --- /dev/null +++ b/doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 7" + date="2011-04-08T21:55:36Z" + content=""" +http://xfs.org/index.php/XFS_FAQ#Q:_Performance:_mkfs.xfs_-n_size.3D64k_option +"""]] diff --git a/doc/forum/Pruning_out_unwanted_Git_objects.mdwn b/doc/forum/Pruning_out_unwanted_Git_objects.mdwn new file mode 100644 index 000000000..36397b267 --- /dev/null +++ b/doc/forum/Pruning_out_unwanted_Git_objects.mdwn @@ -0,0 +1,3 @@ +I have a backups repository with a few files in it, that at one point had some huge filesets erroneously added to it. As a result, even though there are only 23,334 annexed files, the number of non-dangling Git objects in the repository comes to 593,584. + +Normally I would use `git filter-branch` to clear out the deadwood in situations like this, since it is a completely private repository. What I'm wondering is, is any such thing possible with git-annex, or is the best option just to start over, copy all the files into the new repository, and then `git-add` them all? diff --git a/doc/forum/Pruning_out_unwanted_Git_objects/comment_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment b/doc/forum/Pruning_out_unwanted_Git_objects/comment_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment new file mode 100644 index 000000000..fbf538afa --- /dev/null +++ b/doc/forum/Pruning_out_unwanted_Git_objects/comment_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 1" + date="2013-08-29T07:23:13Z" + content=""" +Maybe one way to solve this that would be general is to have some kind of `prune-history` command, which keeps only the HEAD and drops everything else. Because there are some repositories that I want to manage with `git-annex` for many reasons, but I don't care about keep history around at all. +"""]] diff --git a/doc/forum/Pruning_out_unwanted_Git_objects/comment_2_7472943c02cfe2808b0d566e06caa1a5._comment b/doc/forum/Pruning_out_unwanted_Git_objects/comment_2_7472943c02cfe2808b0d566e06caa1a5._comment new file mode 100644 index 000000000..0c2646351 --- /dev/null +++ b/doc/forum/Pruning_out_unwanted_Git_objects/comment_2_7472943c02cfe2808b0d566e06caa1a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-08-30T06:18:42Z" + content=""" +This was answered quite thoroughly in:http://git-annex.branchable.com/forum/safely_dropping_git-annex_history/ +"""]] diff --git a/doc/forum/Pruning_out_unwanted_Git_objects/comment_3_6a1e7a83d94394454fc085f6d2728cd7._comment b/doc/forum/Pruning_out_unwanted_Git_objects/comment_3_6a1e7a83d94394454fc085f6d2728cd7._comment new file mode 100644 index 000000000..90951961f --- /dev/null +++ b/doc/forum/Pruning_out_unwanted_Git_objects/comment_3_6a1e7a83d94394454fc085f6d2728cd7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 3" + date="2013-09-04T06:36:15Z" + content=""" +`git annex forget` automates this now. Needs a version of git-annex supporting it installed on *all* the computers you use the repo on. +"""]] diff --git a/doc/forum/Purge_a_remote.mdwn b/doc/forum/Purge_a_remote.mdwn new file mode 100644 index 000000000..f1b04ead2 --- /dev/null +++ b/doc/forum/Purge_a_remote.mdwn @@ -0,0 +1,2 @@ +How could I delete and purge a remote? I want to remove all traces of it +but I can't find out how to achieve this. diff --git a/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment b/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment new file mode 100644 index 000000000..a7eff3a99 --- /dev/null +++ b/doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:17:22Z" + content=""" +In the git-annex webapp, each repository has a settings menu with \"delete repository\". +"""]] diff --git a/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment b/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment new file mode 100644 index 000000000..86827c529 --- /dev/null +++ b/doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 2" + date="2013-11-05T17:46:02Z" + content=""" +When I use that Delete button it seems to still have records of it +because when I delete the repo on the other end and create a new bare +one it complains about some UUID mismatch. +"""]] diff --git a/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment b/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment new file mode 100644 index 000000000..621bda508 --- /dev/null +++ b/doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-05T18:03:26Z" + content=""" +Hmm well, it's true that deleting a repository does not clean out any git remotes that other repositories might have configured using it, and the uuid of the old remote is cached in there. This is only a problem if you put back another repository in the same location as the old one. `git remote remove` should clean that up for you. +"""]] diff --git a/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment b/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment new file mode 100644 index 000000000..afb4dc92e --- /dev/null +++ b/doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2013-11-06T14:24:21Z" + content=""" +That is exactly what I have wanted to do a couple of times now and 'git remote remove' does not seem to remove it all either. +When I try to create a new repository in the same place it still complains about that darn UUID :) + +What is working is to manually add the new UUID to .git/config +"""]] diff --git a/doc/forum/Push__47__Pull_with_the_Assistant.mdwn b/doc/forum/Push__47__Pull_with_the_Assistant.mdwn new file mode 100644 index 000000000..315ad38d8 --- /dev/null +++ b/doc/forum/Push__47__Pull_with_the_Assistant.mdwn @@ -0,0 +1 @@ +If I use git-annex with a centralized bare git repository as [described here](http://git-annex.branchable.com/tips/centralized_git_repository_tutorial/), will the Assistant automatically `git push` and `git pull` the master and git-annex branches? Or does it basically just do a `git annex sync`? diff --git a/doc/forum/Push__47__Pull_with_the_Assistant/comment_1_f7b63d379c2d21794adf8658f546f8a7._comment b/doc/forum/Push__47__Pull_with_the_Assistant/comment_1_f7b63d379c2d21794adf8658f546f8a7._comment new file mode 100644 index 000000000..0477218bc --- /dev/null +++ b/doc/forum/Push__47__Pull_with_the_Assistant/comment_1_f7b63d379c2d21794adf8658f546f8a7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-17T20:25:03Z" + content=""" +The assistant will push, pull, and merge the master and git-annex branches (which is exactly what git annex sync does). + +Additionally, the assistant will transfer file contents to the bare repository, either to make it have a copy of everything, or as needed to transfer to other repositories that also use that bare repository. This behavior is configurable using the webapp. +"""]] diff --git a/doc/forum/Push__47__Pull_with_the_Assistant/comment_2_aec8cc20576e7ffd5a8be4348d1a0073._comment b/doc/forum/Push__47__Pull_with_the_Assistant/comment_2_aec8cc20576e7ffd5a8be4348d1a0073._comment new file mode 100644 index 000000000..20be4c6ce --- /dev/null +++ b/doc/forum/Push__47__Pull_with_the_Assistant/comment_2_aec8cc20576e7ffd5a8be4348d1a0073._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="annexuser" + ip="85.159.236.214" + subject="comment 2" + date="2012-11-17T20:44:53Z" + content=""" +When I make a change in the repository and run a plain old `git annex sync`, it pushes out to any other available annex, but not to my bare hub. If I run `git annex sync` a second time it tells me that I'm ahead of the hub: + + commit + # On branch master + # Your branch is ahead of 'hub/master' by 1 commit. + # + nothing to commit, working directory clean + ok + +In order to push the changes out to the hub I have to do `git push --all`. + +The same thing with pulling. If I make a change on the annex, push it to the hub, and then go to a second annex that knows about the hub but not the first annex, a `git annex sync` does not pull the changes in from the hub. I have to do `git pull` to get them. + +Do I have something setup incorrectly? +"""]] diff --git a/doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn b/doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn new file mode 100644 index 000000000..03676502b --- /dev/null +++ b/doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn @@ -0,0 +1,9 @@ +I want to setup my remote git repo on S3 +Referred to +http://git-annex.branchable.com/tips/using_Amazon_S3/ +http://git-annex.branchable.com/special_remotes/S3/ + +I need support for AWS.config param proxy_uri +http://docs.amazonwebservices.com/AWSRubySDK/latest/AWS.html + +Can some one help? diff --git a/doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn b/doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn new file mode 100644 index 000000000..41a64630d --- /dev/null +++ b/doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn @@ -0,0 +1,43 @@ +Hi, + +Whenever I do a git annex vicfg (as pasted below) the long gone repo 40da403e-6f74-4705-aae0-433aa656b55e keeps automatically being added back into the configuration. Worse in the webapp this manifests itself as a repository list item that's empty of text (and when buttons are clicked there's a complaint about missing UUIDs). + +In addition to removing the lines via git-annex vicfg, I've switched my repository into indirect mode, manually checked out the the git-annex branch and deleted the offending key from the preferred content and group files (it oddly didn't appear in the uuid file). However they keep coming back :-( + +Everything seems to be okay bar this rogue entry which in the web-app irrationally bothers me. + +I'm running the very latest git-annex release. + +Any thoughts? + +Cheers, + +Matt. + + + # git-annex configuration + # + # Changes saved to this file will be recorded in the git-annex branch. + # + # Lines in this file have the format: + # setting uuid = value + + # Repository trust configuration + # (Valid trust levels: trusted semitrusted untrusted dead) + # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current)) + trust 88733342-45ef-420f-8f1b-9a5ed8d8e070 = semitrusted + + # Repository groups + # (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted) + # (Separate group names with spaces) + # (for ) + group 40da403e-6f74-4705-aae0-433aa656b55e = client + # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current)) + group 88733342-45ef-420f-8f1b-9a5ed8d8e070 = client + + # Repository preferred contents + # (for ) + content 40da403e-6f74-4705-aae0-433aa656b55e = standard + # (for mattford63 (matt@descartes.rss.mhs.man.ac.uk:~/current)) + content 88733342-45ef-420f-8f1b-9a5ed8d8e070 = standard + diff --git a/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_1_bd977e864ae89816fa7f4ff69879b15f._comment b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_1_bd977e864ae89816fa7f4ff69879b15f._comment new file mode 100644 index 000000000..983dd8478 --- /dev/null +++ b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_1_bd977e864ae89816fa7f4ff69879b15f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T16:56:42Z" + content=""" +Run: `git annex dead 40da403e-6f74-4705-aae0-433aa656b55e` +"""]] diff --git a/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_2_05749f9e75689d0111339b7126c12300._comment b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_2_05749f9e75689d0111339b7126c12300._comment new file mode 100644 index 000000000..bd56c6670 --- /dev/null +++ b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_2_05749f9e75689d0111339b7126c12300._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2013-07-02T19:48:19Z" + content=""" +Hi, + +I should have mentioned I can't do this either: + + ~/current $ git annex dead 40da403e-6f74-4705-aae0-433aa656b55e + dead 40da403e-6f74-4705-aae0-433aa656b55e git-annex: there is no available git remote named \"40da403e-6f74-4705-aae0-433aa656b55e\" + +I can't quite remember how I removed the remote - it was a whilst back, I think maybe I just edited it out of the git config file.... +"""]] diff --git a/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_3_b1531994eea0fbbf4cb097e604378a53._comment b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_3_b1531994eea0fbbf4cb097e604378a53._comment new file mode 100644 index 000000000..a079e3b12 --- /dev/null +++ b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_3_b1531994eea0fbbf4cb097e604378a53._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 3" + date="2013-07-02T19:58:30Z" + content=""" +It seems that the uuid is present in the group.log and preferred-content.log files in the git-annex branch, but not in the uuid.log file. I missed that in your description before. That's weird, don't know how that could happen. + +However, when I manually configure things this way, I do not see the repository in the webapp. Which makes sense; uuid.log is the canonical list of repositories. + +I guess if I were you I'd manually edit the uuid into uuid.log and then mark it dead. +"""]] diff --git a/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment new file mode 100644 index 000000000..6c5e8835e --- /dev/null +++ b/doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 4" + date="2013-07-02T20:45:29Z" + content=""" +I tried as you suggested. It worked as far in so far that I was able to mark the repository dead. However, I still see an empty line in the web app so perhaps this odd repo isn't the cause (but I'm deeply suspicious of it). Looking at the HTML source the line in the web-app does not have any UUID at all (see the screen shot [here](http://dancingfrog.hopto.org/~matt/git-annex.png)). + +What causes the code to add back a previously deleted repository (I vaguely remember something about this being due to the merge algorithm...and why one can only mark repos as deleted)? Why would it only add back to the group and trust logs and not the UUID? The code that generates the web-app HTML must use something else or things in addition to the UUID log? + +The logs don't really say much - how can I help debug this further? +"""]] diff --git a/doc/forum/Recommended_number_of_repositories.mdwn b/doc/forum/Recommended_number_of_repositories.mdwn new file mode 100644 index 000000000..9e9f2838d --- /dev/null +++ b/doc/forum/Recommended_number_of_repositories.mdwn @@ -0,0 +1,4 @@ +With git it is easy to create one repository per project, and it almost always makes sense to do so. When using git-annex, what is the recommended setup? + +Should one have a single annex containing all files, or is it recommended to create different repositories for things like 'photos', 'music', 'isos' ? + diff --git a/doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment b/doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment new file mode 100644 index 000000000..46ce0e8d5 --- /dev/null +++ b/doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="depends ..." + date="2011-11-04T19:59:24Z" + content=""" +It makes sense to have separate repositories when you have well-defined uses for them. + +I have a separate repository just for music and podcasts, which I can put various places where I have no need of the overhead of a tree of other files. + +If you're using it for whatever arbitrary large files you accumulate, I find it's useful to have them in one repository. This way I can rearrange things as makes sense. It might make sense to have \"photos\" and \"isos\" as categories today, but next year you might prefer to move those under 2011/{photos,isos}. It would certainly make sense to have different repositories for home, work, etc. + +How to split repositories up for a home directory is a general problem that the [vcs-home](http://vcs-home.branchable.com) +project has surely considered at one time or another. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck.mdwn b/doc/forum/Recover_files__44___annex_stuck.mdwn new file mode 100644 index 000000000..b3e46471f --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck.mdwn @@ -0,0 +1,28 @@ +I have a directory with 6TB of data in it. I tried to use git annex to back it up to three 3TB drives, I didn't want to use RAID as it sucks, and I didn't want to use tar as I wanted my files easily available. + +I added my remotes successfully, then I ran ``git annex add .`` + +That mostly worked, although it understandably took ages, although it missed several GB of files here and there. + +Next I tried to do ``git commit -a -m added``, hoping that this would copy all of my files to the remotes. It didn't it just died with the error + + fatal: No HEAD commit to compare with (yet) + fatal: No HEAD commit to compare with (yet) + Stack space overflow: current size 8388608 bytes. + Use `+RTS -Ksize -RTS' to increase it. + +So I freaked out and decided to undo the mess and just go with tar instead, since at this point every git command takes multiple minutes and fails with the same error as above. + +I tried to run ``git anne unannex .``, but I got this error: + +`` +unannex GWAS/by-download-number/27081.log.gz fatal: No HEAD commit to compare with (yet) +`` + +So now I can't do anything without committing the files it seems, and I somehow need to grow the git cache, although when I search online for `+RTS -Ksize -RTS', I get nothing. + +Does anyone know how to increase the cache size, or how to unannex the files without this HEAD error? + +Thanks, + +Mike diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_10_6d85c3ec73ddc0682d9643f4d5eeda70._comment b/doc/forum/Recover_files__44___annex_stuck/comment_10_6d85c3ec73ddc0682d9643f4d5eeda70._comment new file mode 100644 index 000000000..1a8cca600 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_10_6d85c3ec73ddc0682d9643f4d5eeda70._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 10" + date="2014-06-18T20:15:42Z" + content=""" +``git ls-files --cached | wc -l`` returns: 1882028 + +As far as I can tell, the largest objects in .git/objects are 65kb, there are just a bunch of them (257). Also, my repo contains 1,886,125 files and directories total, most in a single directory (after git annex add completed, that one directory contained 8.3GB of symlinks. + +``git-annex add .`` just completed successfully, I am now running ``git commit -a -m added``, it is chugging away and taking its time. + +Is there an obvious upper limit to the number of files or the total size of files that git annex can handle? For example, is 1 million files too many? How about 6TB? or 9TB? For this repo I think I have a little less than 2m files, and the total size of the repo is greater than 6TB. Is that too much? Should I split it into multiple repos? + +I also have a question just about the utility of git-annex for this purpose. I don't need to backup this data, I just want to have it off the big hard drive and onto a bunch of small drives. I have added 3 4TB drives as remotes and I want all of the data stored on them, I will take them offline and put them in a safe. Ideally my file and directory structure will remain intact as symlinks, and then when I want to access a file in the future, I can run ``git annex get ``, connect the drive that git annex tells me to, and then get that file, use it, and then drop it when I am done. From all of my reading it seems like that is a good usage for git annex, but I want to check with you and see if that makes sense to you. Also, can I just run ``git annex drop --auto --numcopies=1`` to get git annex to move all of the files to my remote repositories? + +Thanks for all of your help, and let me know if there are any other debug steps you would like me to run. I am still waiting for git commit to run, and for an exact repo size for you. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_11_52e799bb6f24a1ebed58fad6cebd3a71._comment b/doc/forum/Recover_files__44___annex_stuck/comment_11_52e799bb6f24a1ebed58fad6cebd3a71._comment new file mode 100644 index 000000000..d5fc3e7ae --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_11_52e799bb6f24a1ebed58fad6cebd3a71._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 11" + date="2014-06-18T20:54:31Z" + content=""" +Ok, my suspicion is that the root problem is having a large number of file in a single directory. That would cause the git tree objects to get big, and it may +be that git-annex somewhere buffers a whole tree object in memory, although I cannot think of where off the top of my head. + +git-annex scales to any size of files (limited only by checksumming time unless you use the WORM backend to avoid checksumming). git-annex tries to scale at least as good as git does to a large quantity of files in a repository. git doesn't handle a million files in a repository very fast, due to a number of issues including how the index works. I have never tested git-annex with more than 1 million files, and not all in the same directory. + +Other than the number of files, your use case seems reasonable. `git annex drop` will drop files that you have already copied to enough of the remotes (using eg, `git-annex copy`). + +Above you show a git-annex add failing after 5 files. I suspect you truncated that output, and it processed rather more files. git-annex only says \"(Recording state in git...)\" once it's added all the files, or after it's added around 10 thousand files and still has more to do). It seems to have failed at the point where the files are staged into the index. + +I'm building a 2 million file in one directory repo on a fast server now to see if I can reproduce this. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_12_686a285bc7e950aae67856c47e7cb21e._comment b/doc/forum/Recover_files__44___annex_stuck/comment_12_686a285bc7e950aae67856c47e7cb21e._comment new file mode 100644 index 000000000..0428dfd30 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_12_686a285bc7e950aae67856c47e7cb21e._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 12" + date="2014-06-18T22:28:27Z" + content=""" +Yes, you are right. ``git-annex add`` got through almost all of the files in the first run, which I did a week ago, I am not sure how long it took, several days I think (which is fine, time isn't that important here). + +I re-ran ``git-annex add .`` yesterday after having trouble with ``git commit``, which is when I uncovered these problems. I think you are right that the problem appears when git-annex is staging files into the index. No problems occurred during checksumming or moving files. + +Also, the repo isn't as large as I thought, it if 4.1TB, so it makes sense that the issue is number of files, not files size. + +``git add`` and ``git commit`` are now working fine, all git operations (e.g. ``git status``) are now taking around 30s to 1 min, which is acceptable. + +I am going to try and move the data to the remotes now. Is there anything special I need to do since the remotes are smaller than the current repo? The remotes are just single drives with ext4 filesystems and an empty repo on them. I ideally want to fill each drive as much as possible, and have the current repo contain no files, how do I do that? Can I just run ``git-annex move --to mito_backup1`` and then when it is full run a second command of ``git-annex move --to mito_backup2``. Is it better to use ``git-annex copy`` instead of ``move`` and then use ``drop`` after? + +Thanks! +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_13_a4d62d494b340458e6535d573bade965._comment b/doc/forum/Recover_files__44___annex_stuck/comment_13_a4d62d494b340458e6535d573bade965._comment new file mode 100644 index 000000000..e68933b5c --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_13_a4d62d494b340458e6535d573bade965._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 13" + date="2014-06-18T22:43:08Z" + content=""" +It will be faster to use `git annex move`, assuming you want to only have 1 copy of each file, and not more. git-annex will stop storing files on a drive once it gets close to full (annex.diskreserve), and you can safely interrupt it and switch to the next drive. + +Do you have any special git configuration? In particular I'm curious about any annex.queuesize setting, which if set to something really high would make `git annex add` buffer a lot of filenames and stage them all at once. (However, I just noticed that annex.queuesize didn't cause as large a queue to be used as intended, so it would need to have been set to some really enormous value to run it out of stack space.) + +Also, see [[scalability]]. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_14_c10f0fe1440ccd170804a433db2267ee._comment b/doc/forum/Recover_files__44___annex_stuck/comment_14_c10f0fe1440ccd170804a433db2267ee._comment new file mode 100644 index 000000000..71c8d239d --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_14_c10f0fe1440ccd170804a433db2267ee._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 14" + date="2014-06-18T22:51:28Z" + content=""" +As far as I know I am using the defaults, I didn't customize anything. I am thinking of switching to the WORM backend though as I think it will make things a little faster, but I haven't done that yet. + +Also, I actually compiled cabal-install with the ghc flag ``-rtsopts`` and git-annex with flags ``-rtsopts -with-rtsopts=-K1000m``. Due to the amount of memory available, I am not worried if git-annex leaks memory and uses 1GB of memory during operations, but I have been watching it with htop, and its memory usage is usually very small. + + +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_15_14446cafac6c33a3f95b5344c42c0bef._comment b/doc/forum/Recover_files__44___annex_stuck/comment_15_14446cafac6c33a3f95b5344c42c0bef._comment new file mode 100644 index 000000000..bc1faa82c --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_15_14446cafac6c33a3f95b5344c42c0bef._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 15" + date="2014-06-19T21:19:01Z" + content=""" +Everything seems to be working fine now, but I have another question: + +Is there any way to speed up the copying of many small files? It looks like git-annex is calling rsync for each individual file, which is very fast for large files, but on my directories with many small files, the total speed is working on to just a few MB an hour - it has only transferred 1GB in the last 4 hours. + +I am using the WORM backed with the ``-b WORM`` flag, but I wonder if there is a different move method implemented? For example many calls to ``mv`` will be much faster than many calls to ``rsync``. + +Thanks! +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_16_63c19f58b7e95e39ba25a735bdcc0bcf._comment b/doc/forum/Recover_files__44___annex_stuck/comment_16_63c19f58b7e95e39ba25a735bdcc0bcf._comment new file mode 100644 index 000000000..c55edddf9 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_16_63c19f58b7e95e39ba25a735bdcc0bcf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 16" + date="2014-06-19T22:16:21Z" + content=""" +git-annex could be made to always use cp for local transfers, see Remote/Git.hs rsyncOrCopyFile and change `ifM (sameDeviceIds src dest) (docopy, dorsync)` to just `docopy` + +However, I doubt that will be a significant speedup. It's more likely that the overhead around copying a file and updating the location tracking etc adds up with millions of small files. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_17_8e5c7572ab8d1f0e41fedf6f805b942a._comment b/doc/forum/Recover_files__44___annex_stuck/comment_17_8e5c7572ab8d1f0e41fedf6f805b942a._comment new file mode 100644 index 000000000..4761bcf3a --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_17_8e5c7572ab8d1f0e41fedf6f805b942a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 17" + date="2014-06-21T01:56:48Z" + content=""" +Would git-annex be able to detect if I manually moved some files? At this point it looks like the transfer will take multiple weeks... if I just moved the files from .git/annex directly from one repo to the other I could make the transfer significantly faster, but would that corrupt the repo? +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_18_e5357c63107f79571bd3ff609b4406a7._comment b/doc/forum/Recover_files__44___annex_stuck/comment_18_e5357c63107f79571bd3ff609b4406a7._comment new file mode 100644 index 000000000..0398980b4 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_18_e5357c63107f79571bd3ff609b4406a7._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 18" + date="2014-07-04T18:03:54Z" + content=""" +You can manually move files and use `git annex fsck`, but it is not likely to be any faster. + +--- + +After letting a 2 million file import run while I was away on vacation, I came back to it, and it indeed ran out of memory: + +
+add 999996 ok
+add 999997 ok
+(Recording state in git...)
+[2014-06-21 11:49:28 JEST] feed: xargs [\"-0\",\"git\",\"--git-dir=/home/joey/tmp/r/.git\",\"--work-tree=/home/joey/tmp/r\",\"add\",\"--\"]
+add 999998 ok
+add 999999 ok
+[2014-06-21 11:49:49 JEST] read: git [\"--git-dir=/home/joey/tmp/r/.git\",\"--work-tree=/home/joey/tmp/r\",\"diff\",\"--name-only\",\"--diff-filter=T\",\"-z\",\"--\",\".\"]
+(Recording state in git...)
+[2014-06-21 11:52:24 JEST] feed: xargs [\"-0\",\"git\",\"--git-dir=/home/joey/tmp/r/.git\",\"--work-tree=/home/joey/tmp/r\",\"add\",\"--\"]
+Stack space overflow: current size 8388608 bytes.
+Use `+RTS -Ksize -RTS' to increase it.
+
+"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_19_3316652073710f39965cd49ceea5c4ff._comment b/doc/forum/Recover_files__44___annex_stuck/comment_19_3316652073710f39965cd49ceea5c4ff._comment new file mode 100644 index 000000000..828b07d41 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_19_3316652073710f39965cd49ceea5c4ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 19" + date="2014-07-04T18:18:41Z" + content=""" +[[bugs/runs_of_of_memory_adding_2_million_files]] +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_1_d605f755c363d56cf5f1060ad06ee173._comment b/doc/forum/Recover_files__44___annex_stuck/comment_1_d605f755c363d56cf5f1060ad06ee173._comment new file mode 100644 index 000000000..18c1c0e9b --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_1_d605f755c363d56cf5f1060ad06ee173._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 1" + date="2014-06-18T16:22:13Z" + content=""" +What version of git-annex are you using? And what version of git? Is your git-annex repository in direct mode or indirect mode? +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_2_f3ee184a4d3b8d82a8a362a6c03a54a3._comment b/doc/forum/Recover_files__44___annex_stuck/comment_2_f3ee184a4d3b8d82a8a362a6c03a54a3._comment new file mode 100644 index 000000000..7c46785bf --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_2_f3ee184a4d3b8d82a8a362a6c03a54a3._comment @@ -0,0 +1,54 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="Frustrating" + date="2014-06-18T16:29:31Z" + content=""" +OK, this is a little frustrating. I found this post from three years ago: [[http://git-annex.branchable.com/forum/Problems_with_large_numbers_of_files/]] and I decided to try a newer version of git-annex. + +I uninstalled ghc and haskell from Scientific Linux because all of these Red Hat based distros have ancient packages. + +I installed the latest git from source, the latest ghc linux x86_64 binary, and then the latest haskell platform from source. Then I used cabal to install all dependencies for git annex with ``cabal install --only-dependencies git-annex``. Finally I installed git annex from source. + +I then tried to run ``git-annex add .`` in my directory and got the following error: + + #> git annex add . + add AllStudies.txt.csv.gz ok + add GWAS/action.txt.gz ok + add GWAS/archive/dump2.txt.gz ok + add GWAS/archive/dump3.txt.gz ok + add GWAS/by-download-number/27080.log.gz ok + (Recording state in git...) + Stack space overflow: current size 8388608 bytes. + Use `+RTS -Ksize -RTS' to increase it. + + +Ok, I was hoping that the latest version would just work, no luck. So I did what it told me to: + +``git-annex +RTS -K1000000 -RTS add .`` + +That gave the error: + +`` + git-annex: Most RTS options are disabled. Link with -rtsopts to enable them. +`` + +Grr. + +So I went into the Makefile and added the line ``-rtsopts -with-rtsopts=\"-K1000m\"`` after every call to ghc I could find. I also added ``ghc-options: -with-rtsopts=\"-K100000\"`` to my ~/.cabal/config file. + +Now when I run ``make`` I get this error: + + + if [ \"cabal \" = ./Setup ]; then ghc --make Setup; fi + cabal configure + cabal: Most RTS options are disabled. Link with -rtsopts to enable them. + make: *** [Build/SysConfig.hs] Error 1 + + +Do I have to manually compile the entire Haskell Platform with the -rtsopts flag in order to get this to work? + +I can't find any easy-to-follow information anywhere that shows me how to just increase the memory limit. My server has 48 cores, 192GB of memory, over 1TB of scratch space, and over 60TB of storage. I really want to be able to use git-annex to easily move files from our large RAID arrays onto archive drives, and be able to intelligently get that data back whenever I want, I don't understand why I am being limited to 8MB of memory for this. + +Any advice would be fantastic, thank you. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_3_341b47663d133411587ec70ef2b178c6._comment b/doc/forum/Recover_files__44___annex_stuck/comment_3_341b47663d133411587ec70ef2b178c6._comment new file mode 100644 index 000000000..77a7c93c8 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_3_341b47663d133411587ec70ef2b178c6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="Version" + date="2014-06-18T16:32:32Z" + content=""" +Hi Joeyh, + +Thanks for the reply. I am using git version 2.0.0.390.gcb682f8, not sure what version of git-annex, but I downloaded it from github about 20 minutes ago. + +Thanks! + +-Mike +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_4_66c0d9284d5edbac189a64b03c4fe50a._comment b/doc/forum/Recover_files__44___annex_stuck/comment_4_66c0d9284d5edbac189a64b03c4fe50a._comment new file mode 100644 index 000000000..5d153e248 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_4_66c0d9284d5edbac189a64b03c4fe50a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 4" + date="2014-06-18T16:35:29Z" + content=""" +You can find out the version of git-annex by running: git-annex version + +You can find out if your repository is in direct or indirect mode by running: git config annex.direct +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_5_8b32f6597f447f88bee7a80698fb4df6._comment b/doc/forum/Recover_files__44___annex_stuck/comment_5_8b32f6597f447f88bee7a80698fb4df6._comment new file mode 100644 index 000000000..cf656f3ea --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_5_8b32f6597f447f88bee7a80698fb4df6._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="Versions" + date="2014-06-18T16:40:14Z" + content=""" +``git-annex version`` returns: + + git-annex version: 5.20140618-gc2f1c63 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: unknown + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +``git config annex.direct`` exits with error code 1 and doesn't return any information, however I never explicitly set direct mode, and the repository is all symlinked, so my assumption is that it is in indirect mode. Would direct mode be better for such a large repo? +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_6_4cc81169e99a453cdb6e83e57e638f37._comment b/doc/forum/Recover_files__44___annex_stuck/comment_6_4cc81169e99a453cdb6e83e57e638f37._comment new file mode 100644 index 000000000..52e04dfc8 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_6_4cc81169e99a453cdb6e83e57e638f37._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="Reinstall GHC or Cabal?" + date="2014-06-18T16:49:35Z" + content=""" +Do I need to reinstall ghc or cabal with rtsopts enabled somehow in order to be able to compile git-annex with -K1000m? +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_7_2d104cf4682e04906f8ca0ced7288cf1._comment b/doc/forum/Recover_files__44___annex_stuck/comment_7_2d104cf4682e04906f8ca0ced7288cf1._comment new file mode 100644 index 000000000..6ea7b45f6 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_7_2d104cf4682e04906f8ca0ced7288cf1._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 7" + date="2014-06-18T17:14:40Z" + content=""" +Ok, so the repository is in indirect mode, and this rules out a large quantity of problems that could have been caused by direct mode (no, I don't recommend using direct mode). + +If you want to build git-annex with the +RTS option enabled, you just need to pass -rtsopts to ghc when building git-annex. (Not -with-rtsopts ...) +That *might* let you pump up the memory and bypass whatever the problem is, or at least find out how much memory it's trying to allocate, which might be a useful clue. But I would be much more interested in debugging and fixing the actual problem, since git-annex should not normally need to allocate a 8+ mb chunk of memory. + +The \"No HEAD commit to compare with (yet)\" failure mode was removed from git in 2011. You must have been using old versions of git and git-annex before you upgraded. Perhaps they have left the repository in some broken state. + +What size does `du -hsc .git/objects` report? How about `du -h .git/index`? + +Are git commands that do not involve git-annex still taking a long time to run or failing in some way? (Note that `git commit` has a hook that runs git-annex; you can bypass that with `git commit --no-verify`) +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_8_d356c4fce9f1197e5292f9dedf85bbc9._comment b/doc/forum/Recover_files__44___annex_stuck/comment_8_d356c4fce9f1197e5292f9dedf85bbc9._comment new file mode 100644 index 000000000..df1af4f06 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_8_d356c4fce9f1197e5292f9dedf85bbc9._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmwjQzWgiD7_I3zw-_91rMRf_6qoThupis" + nickname="Mike" + subject="comment 8" + date="2014-06-18T17:31:58Z" + content=""" +The git available through yum is git 1.7.1, which looks like it was released in 2010 or earlier. (I really wish I had a different version of linux on this server). It is possible that in some way screwed up the repo. + +I figured out how to compile cabal and git-annex with rtsopts, so I can now set higher memory levels, but I am happy to help debug the problem too, as I would really love a fully functional git-annex. + +git commands now run quickly, thanks to the new git I think. + +``du -hsc .git/objects`` returns: ``8.1G .git/objects`` + +``du -h .git/index`` returns: ``437M .git/index`` + +I am currently running the command ``git-annex +RTS -K1000m -RTS add .``, it is chugging away doing something, but is not printing any messages yet after 11 minutes of running, it is a 6TB directory though, and there are a lot of concurrent IO operations on that disk right now. + +I am also running ``du -h --max-depth=1`` on the root repo directory, and also ``find | wc -l``, so that I can tell you the exact size of the dir and the total number of files too. These operations combined may take more than an hour though, I will send details when the commands complete. + +Let me know if you want me to stop the ``git-annex +RTS -K1000m -RTS add .`` command and run git-annex some other way. +"""]] diff --git a/doc/forum/Recover_files__44___annex_stuck/comment_9_856c7e1575f5d99530ecd54004315487._comment b/doc/forum/Recover_files__44___annex_stuck/comment_9_856c7e1575f5d99530ecd54004315487._comment new file mode 100644 index 000000000..c092d99f5 --- /dev/null +++ b/doc/forum/Recover_files__44___annex_stuck/comment_9_856c7e1575f5d99530ecd54004315487._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.203" + subject="comment 9" + date="2014-06-18T17:36:44Z" + content=""" +Both of those du's look extremely large. How many files are listed by `git ls-files --cached | wc -l` ? + +I don't think that there's any point in running `git annex add` while you're still having some problem. I am curious though how much memory the git-annex add you have running has used. + +If I were you, I'd look in .git/objects for large files (> 100kb, say). +"""]] diff --git a/doc/forum/Relocating_annex_directory.mdwn b/doc/forum/Relocating_annex_directory.mdwn new file mode 100644 index 000000000..f2e271333 --- /dev/null +++ b/doc/forum/Relocating_annex_directory.mdwn @@ -0,0 +1 @@ +I have around 70 GBs of data spread around 4 repositories on a Linux (Ubuntu) box. My problem is I need to reformat the drive they are on. I would like to move them to an external usb drive temporarily during reinstall then move them back to their original location. When I started with annex I did try to mv annexFolder/ toNewLoc/ which failed leaving behind a corrupt repo. What is a safe way to move an annex folder? My primary connection is a 3G modem so I am trying to avoid re downloading everything. Another thing I am trying to avoid is cloning the repos to the external drive, reinstall, clone it back to the internal drive and mark original and external repos as dead, but AFAIK those dead repos will show up in the output of whereis, so everytime I reformat I gonna have two extra dead repos. diff --git a/doc/forum/Relocating_annex_directory/comment_1_13ff5438baa1db110beb6aab3a783def._comment b/doc/forum/Relocating_annex_directory/comment_1_13ff5438baa1db110beb6aab3a783def._comment new file mode 100644 index 000000000..5136941c5 --- /dev/null +++ b/doc/forum/Relocating_annex_directory/comment_1_13ff5438baa1db110beb6aab3a783def._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-08-16T03:42:00Z" + content=""" +moving the annex should work fine, provided: + +* You are moving it to a proper unix filesystem - NOT fat32 +* The assistant is shutdown. If it is running, bad things will happen. +"""]] diff --git a/doc/forum/Relocating_annex_directory/comment_2_6d88ff03fcf00ae872442e8a86c968ed._comment b/doc/forum/Relocating_annex_directory/comment_2_6d88ff03fcf00ae872442e8a86c968ed._comment new file mode 100644 index 000000000..e7b361675 --- /dev/null +++ b/doc/forum/Relocating_annex_directory/comment_2_6d88ff03fcf00ae872442e8a86c968ed._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-24T18:56:11Z" + content=""" +`git annex whereis` does not show dead repositories. + +Anyway Justin is of course right: Provided the assistant is not running in a repository, the repository is just a collection of files in a directory, and can be moved around, tarred up, untarred, etc just like any other repository. If the assistant is running it may become unhappy if its repository vanishes out from underneath it. +"""]] diff --git a/doc/forum/Remote_server_only_for_the_git_repository.mdwn b/doc/forum/Remote_server_only_for_the_git_repository.mdwn new file mode 100644 index 000000000..12f4c5c78 --- /dev/null +++ b/doc/forum/Remote_server_only_for_the_git_repository.mdwn @@ -0,0 +1,3 @@ +Hi, I'm using git-annex 5.2014012 with the webapp and I've added two repositories: a remote server and a box.com account. When I add a file it is uploaded properly to both remotes as you would expect. + +The problem is that I would like the files to only be uploaded to box.com, and the remote server only store the git repository. Is there any way of saying to git-annex to not sync files to a remote server? diff --git a/doc/forum/Remote_server_only_for_the_git_repository/comment_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment b/doc/forum/Remote_server_only_for_the_git_repository/comment_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment new file mode 100644 index 000000000..c97184cb8 --- /dev/null +++ b/doc/forum/Remote_server_only_for_the_git_repository/comment_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2014-02-06T13:30:33Z" + content=""" +You can tell git-annex to ignore the repo (assuming git repo is called origin) + + git config remote.origin.annex-ignore true +"""]] diff --git a/doc/forum/Remote_server_only_for_the_git_repository/comment_2_a62dec8ab98ac7bd65059a9e425a01e2._comment b/doc/forum/Remote_server_only_for_the_git_repository/comment_2_a62dec8ab98ac7bd65059a9e425a01e2._comment new file mode 100644 index 000000000..d02994628 --- /dev/null +++ b/doc/forum/Remote_server_only_for_the_git_repository/comment_2_a62dec8ab98ac7bd65059a9e425a01e2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2014-02-07T11:36:32Z" + content=""" +Thanks, that seams to be exactly what I need. +Any change of adding this option to the webapp? +"""]] diff --git a/doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn b/doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn new file mode 100644 index 000000000..ce0aedc51 --- /dev/null +++ b/doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn @@ -0,0 +1,29 @@ +Hi, + +I've removed some large files with git remove, but seem to be unable to remove the corresponding annex content. + +Example: + +kheymann@corax:~/annex$ find -name "*s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac" + +./.git/annex/objects/jF/j7/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac + +./.git/annex/objects/jF/j7/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac/SHA256-s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac + +kheymann@corax:~/annex$ git annex dropkey -vvv --backend SHA256 s24576--10daa3d9007edad720dc057e4272a9c6cda930bef34a83e3bc1d93f1c55b9cac + +No output but the files remain in the annex. Git annex fsck and git annex unused run without listing files to be removes. What can I do apart from deleting the files manually from the annex? + +Some info: + + kheymann@corax:~/annex$ git annex version + git-annex version: 3.20121017 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +Any hints? + +Best, +Karsten diff --git a/doc/forum/Removing_files_not_found_by_git_annex_unused/comment_1_420c6230e68de0a0ac7d7da91ac60801._comment b/doc/forum/Removing_files_not_found_by_git_annex_unused/comment_1_420c6230e68de0a0ac7d7da91ac60801._comment new file mode 100644 index 000000000..f932f779c --- /dev/null +++ b/doc/forum/Removing_files_not_found_by_git_annex_unused/comment_1_420c6230e68de0a0ac7d7da91ac60801._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2012-11-09T19:37:24Z" + content=""" +Please ignore my previous post, by following the instructions in the comment in http://git-annex.branchable.com/walkthrough/unused_data/ I was able to get rid of the data. +"""]] diff --git a/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex.mdwn b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex.mdwn new file mode 100644 index 000000000..bcf2a87a3 --- /dev/null +++ b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex.mdwn @@ -0,0 +1,11 @@ +Hi, + +I'm trying to figure out if it's possible to have a remote that allows access from _clients without git-annex_. That is a remote type that presents itself as a client repo. I'm probably missing something obvious. + +Ideally I'd like to use my Nokia N900 phone as a ssh remote from which I can open files on any computer when the device is connected via usb in mass storage mode. This would allow me to access my files when I'm using a computer at work or at a friends house without installing git-annex. The phone has an ext3 partition so links are possible. Naturally I'd have to ensure the files I want are on the device before I leave the house. + +I'd also like to be able to scp files from my ssh remote when on git-annex less devices. Unfortunately the ssh/rsync repo presents no links or normal filenames. + +Git annex, and the assistant is working really smoothly between my local computers and my server on the internet. Setting things up with the webapp is super simple. Great work! + + diff --git a/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_1_077c492fd37d335f74a5c886ff0d524f._comment b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_1_077c492fd37d335f74a5c886ff0d524f._comment new file mode 100644 index 000000000..4e724ff55 --- /dev/null +++ b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_1_077c492fd37d335f74a5c886ff0d524f._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-20T20:20:06Z" + content=""" +This is off the top of my head, so I may be wrong on details: + +An ssh remote, or a USB remote, when you create it with the assistant, is a bare repo. The files in it are not visible or accessible except through a clone of it (such as your client repo). + +You *could* make an SSH remote or USB remote as a *non-bare repo*, in which case the files within it would be visible and accessible just like on a client repo. You could set that up using the command line; the assistant doesn't do it, but once you got it set up on the command line the assistant would use it just like normal. + +There is a catch though. Though potentially available, the files in that repo don't actually show up until you run \"git annex sync\" in that repo. Because git annex does not update the checked out branch of a remote. So you'd have to cd into that repo manually and run \"git annex sync\" to make the latest-and-greatest files available. + +Here's how I'd do this... + +If the git annex assistant is running, turn it off. + +follow the instructions here: http://git-annex.branchable.com/walkthrough/ under \"adding a remote\" on your usb drive. You now have a non-bare remote. + +Fire up the assistant and you'll see that that is now one of your remotes. Configure it to \"backup\" or whatever you want. Let the assistant fill it up with content. + +When you want to take it someplace, get on the command line and \"cd /wherever/my/usb/drive/is/annex\" and then do: \"git annex sync\" -- that will update the links to the content so you can actually see it. + +You now have all your content available on your USB drive. + +You can do a similar process to manually create a non-bare SSH remote, and you can ssh in and run \"git annex sync\" to update its links and make the content available, which you can then retrieve va scp or sftp, or for that matter, you could configure a web server or WebDAV to serve it up if you like. + +The only complication is running git-annex sync to update your links. + +Again, this is all off the top of my head, I haven't looked up or tested anything here so I welcome correction. But I think what you want to do can be pretty straightforward if you're willing to go behind Assistant's back to do the setup work, and run \"git annex sync\" when you need to. +"""]] diff --git a/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_2_00e6576e3e60d2650461eeb0f918e6e5._comment b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_2_00e6576e3e60d2650461eeb0f918e6e5._comment new file mode 100644 index 000000000..64f111921 --- /dev/null +++ b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_2_00e6576e3e60d2650461eeb0f918e6e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 2" + date="2013-01-21T07:02:17Z" + content=""" +An alternative to running git annex sync in the non-bare remote is running an assistant there. +"""]] diff --git a/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_3_c36a9562c53ac683b62fc4471405aa2a._comment b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_3_c36a9562c53ac683b62fc4471405aa2a._comment new file mode 100644 index 000000000..db7dec37f --- /dev/null +++ b/doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_3_c36a9562c53ac683b62fc4471405aa2a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Thanks for the help" + date="2013-01-21T20:40:39Z" + content=""" +I take it all the above requires mounting an sshfs filsystem of the remote client to run the git-annex or the assistant \"locally\" on the desktop or laptop. Or am I missing something. + +For the usb usecase a normal mount would suffice of course. + +The lack of automation means running a rsync script from (or to) the phone is easier. Not as clever though :( and means running a separate \"system\" for distributing files to the phone. + +Thanks again! + +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key.mdwn b/doc/forum/Restricting_SSH_+_supply_key.mdwn new file mode 100644 index 000000000..59dd72fdc --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key.mdwn @@ -0,0 +1,7 @@ +Just two very simple questions: + +1.) Is there a way to restrict the SSH key for git annex by supplying a command= ? Even better, is it also possible to supply a directory in which the repository is? (I do not want chroot - too complicated but a soft check would be sufficient for me). + +2.) Can I tell git and git-ssh which pubkey to use WITHOUT changing system-/user wide config (e.g.., .ssh/*)? If it is indeed not possible, what's the best way to do it in Windows? + +Thanks! diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_10_8bbd0b6488c23ce8b182bd6b1765c94b._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_10_8bbd0b6488c23ce8b182bd6b1765c94b._comment new file mode 100644 index 000000000..2bcf658b9 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_10_8bbd0b6488c23ce8b182bd6b1765c94b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="ooooh" + date="2014-07-16T22:21:36Z" + content=""" +Thank *you* for taking the time to figure that out! + +I agree on moving the .vbs files. I have done so. (Well, you have to run the git-annex-uninstall.exe to remove the old ones, but that shouldn't matter.) +Testing of an autobuild would be appreciated. +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_1_cac35ac1ac0b300ddfac5ffc74291bce._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_1_cac35ac1ac0b300ddfac5ffc74291bce._comment new file mode 100644 index 000000000..edcb5307e --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_1_cac35ac1ac0b300ddfac5ffc74291bce._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T19:41:54Z" + content=""" +1. Yes, use [[git-annex-shell]]. + +2. The best way to do this is to use a dummy hostname in the git url for the remote. Then in .ssh/config, you can add a Host stanza that sets the real Hostname and also specifies the IdentityFile to use for that host. + +Incidentially, the git-annex webapp takes care of both of these things for you automatically when setting up a remote on a ssh server. +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_2_e9803dd1794b4d078efa9435ff5ba295._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_2_e9803dd1794b4d078efa9435ff5ba295._comment new file mode 100644 index 000000000..e3ae82116 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_2_e9803dd1794b4d078efa9435ff5ba295._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.173.91" + subject="comment 2" + date="2014-07-11T21:43:11Z" + content=""" +Hey Joey, + +Cool, that's great! Thanks! + +As for the client side. I assume you probably don't know too much about the git setup on Windows ... but maybe (or someone else has an idea :) + +1.) The ssh client config for git is \"c:\Program Files (x86)\Git\etc\ssh\ssh_config\" which is *very* unhandy since it's system wide! If it would at least be in the user profile ... (as mentioned, within the \".git\" directory of the repository would be the best) + +2.) Even if I create a \"Host\" and use \"IdentityFile\", ssh still queries the agent! This is absolutely unwanted and slows down things! I have a particular key \"git-annex.key\" and *only* this should be tried - no agent. The reason why the agent is especially problematic for me is that I use a special agent which \"locks\" itself after some inactivity and requires to re-enter the passwords. + +Thank you! + +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_3_1c3beb859e76cb69d2bacd2473ec72b7._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_3_1c3beb859e76cb69d2bacd2473ec72b7._comment new file mode 100644 index 000000000..5412405e7 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_3_1c3beb859e76cb69d2bacd2473ec72b7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-14T20:20:28Z" + content=""" +Re the ssh config on Windows, my windows VM has a per-user .ssh/config inside c:\Documents and Settings\$user. This is where the assistant stores configurations so I know it works. + +The soution to ssh still trying to use the agent is probably to set \"IdentitiesOnly yes\" in the stanza for a host. This is what the assistant does, anyway. +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_4_1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_4_1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment new file mode 100644 index 000000000..cba554860 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_4_1c541fc9a44e5cfb13c7d3ef0eeba2c7._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 4" + date="2014-07-15T03:11:18Z" + content=""" +Hi Joey, + +Sorry that I bother so much with this. +Thank you so much for your answer. At least with the command line it works now. I had it in %USERPROFILE%/.ssh/ssh_config (where I think it's supposed to be) rather than %USERPROFILE%/.ssh/config. In this file I have a stanza \"Host annex\" with Hostname, Port and IdentityFile set. When I call \"ssh annex\" from the command line everything works. It seems that it also works when I use e.g. \"git annex sync\" from the command line. + +However, if I use the webapp, the daemon.log is full of: + + Please make sure you have the correct access rights + and the repository exists. + ssh: Could not resolve hostname annex: hostname nor servname provided, or not known + fatal: Could not read from remote repository. + +Is it possible that the assistant ignores the ssh config or does something differently? + +Thanks again! + +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_5_4dbd5605f2638de0a3edfb3886a47938._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_5_4dbd5605f2638de0a3edfb3886a47938._comment new file mode 100644 index 000000000..26792873d --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_5_4dbd5605f2638de0a3edfb3886a47938._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 5" + date="2014-07-15T04:03:16Z" + content=""" +After some debugging I found another weird thing which is I think the reason. If I execute + git annex get file.jpg + +everything works. But if I do + + \"c:\program files (x86)\git\bin\git.exe\" annex get file.jpg + +it fails, claiming it can't connect to host \"annex\". I found that there are 3 (!) git.exe installed. When I choose + + \"c:\program files (x86)\git\cmd\git.exe\" annex get file.jpg + +it works again. When I use \"which git\" in cygwin, it also points me to the \"cmd/git.exe\" version. +So I think this is a bug and git annex assistant should call the executeable in \"cmd\" rather than \"bin\". +Why are there three versions of git.exe at all (one more is in directory libexec/git-core)? + +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_6_a9c5b424a6acb2da152bf87b2e7617bb._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_6_a9c5b424a6acb2da152bf87b2e7617bb._comment new file mode 100644 index 000000000..ef15c43a2 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_6_a9c5b424a6acb2da152bf87b2e7617bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 6" + date="2014-07-15T19:20:13Z" + content=""" +msgit seems to install it in both places, I am not sure why. Either one works ok when I try to use them. The msgit installer puts \"c:\program files (x86)\git\cmd\\" into PATH so I assume that's the one you're supposed to use. +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_7_93b7c2a5947fb6904c88cd5c120e404c._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_7_93b7c2a5947fb6904c88cd5c120e404c._comment new file mode 100644 index 000000000..caeec29e5 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_7_93b7c2a5947fb6904c88cd5c120e404c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 7" + date="2014-07-15T20:33:07Z" + content=""" +Thanks Joey, + +The problem is more that git-annex assistant takes the wrong (which is in \"bin\" rather than \"cmd\"). I think this is a bug. Because this way the connection does not work in git-annex assistant the same way it does not work with the version in \"bin\" ... + +I think when git-annex assistant just calls the git.exe from path (which should be cmd/git.exe) then it should work. + +Regards +Niki + +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_8_beaa350751eca4642545d1b83e528dd7._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_8_beaa350751eca4642545d1b83e528dd7._comment new file mode 100644 index 000000000..0d236d5e5 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_8_beaa350751eca4642545d1b83e528dd7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 8" + date="2014-07-16T18:10:09Z" + content=""" +git-annex only ever runs git from PATH; I never hardcode paths to programs. + +You can verify this by running it with the --debug flag to see the exact commands it runs. +"""]] diff --git a/doc/forum/Restricting_SSH_+_supply_key/comment_9_2faceeaf0d39f82e5d624eae19e4ca53._comment b/doc/forum/Restricting_SSH_+_supply_key/comment_9_2faceeaf0d39f82e5d624eae19e4ca53._comment new file mode 100644 index 000000000..8ed240a81 --- /dev/null +++ b/doc/forum/Restricting_SSH_+_supply_key/comment_9_2faceeaf0d39f82e5d624eae19e4ca53._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="divB" + ip="204.17.143.10" + subject="comment 9" + date="2014-07-16T20:54:54Z" + content=""" +Hi Joey, + +Thanks for taking care about all these Windows troubles (Windows and POSIX is unfortunately a big mess). + +I finally found the issue now and maybe the bug is related to msysgit. I guess you don't know too much about it so I will report to the msysgit folks. + +However, there is still an (easy to fix) \"bug\" related to git-annex I think. I shortly describe the issue and a possible fix: + +1.) As mentioned above, from the 3 git.exe, only the one in \"cmd\" should be called! It seems to be a wrapper for the \"bin\"-version. If the git.exe from \"bin\" is called something with the environment is wrong (e.g., ssh_config can not be found) + +2.) cmd/git.exe is in %PATH% so usually no problem + +3.) However, git-annex-autostart.vbs is in \"bin\" folder. Therefore, when called from there PWD is the \"bin\" folder and when calling \"git.exe\" without absolute path, this overwrites %PATH% because it's the current directory (of course, such behavior does not appear on UNIX). + +4.) Now the git-annex assistant daemon always calls the wrong git.exe resulting in a broken config + + +Short term fix for users: Create a shortcut to git-annex-autostart.vbs and change the working directory to anything else + +Long term fix for git-annex option 1: Do a chdir in the vbs file before calling git. This is not so good because where to? + +Long term fix for git-annex option 2: Just place the vbs files in the parent directory (where \"Git Bash.vbs\" is). This looks like the cleanest solution to me. + + +"""]] diff --git a/doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn new file mode 100644 index 000000000..bed019e41 --- /dev/null +++ b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn @@ -0,0 +1,25 @@ +Is there a way to restrict git-annex-shell to a specific directory? +Currently, if git-annex is paired to a remote repository, it adds this to the authorized_keys: + + + $ cat ~/.ssh/authorized_keys + command="~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3... + + $ cat ~/.ssh/git-annex-shell + #!/bin/sh + set -e + exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND" + +That gives whoever has the pubkey the right to access all repositories of one user. +It would be nice to have a manual way to limit the access to a specific repository like + + + $ cat ~/.ssh/git-annex-shell + #!/bin/sh + set -e + export GIT_ANNEX_SHELL_REPO=~/annex + exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND" + + +Or maybe some chroot hackery is the way to go? + diff --git a/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_1_66544520bff71181e4a03ca583b0b458._comment b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_1_66544520bff71181e4a03ca583b0b458._comment new file mode 100644 index 000000000..141f96494 --- /dev/null +++ b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_1_66544520bff71181e4a03ca583b0b458._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 1" + date="2012-11-05T16:40:39Z" + content=""" +I've added a `GIT_ANNEX_SHELL_DIRECTORY` environment variable, that, if set, prevents git-annex-shell from operating on any other directory. + +I've made the assistant include that setting in `authorized_keys` that it sets up. For example: + + command=\"GIT_ANNEX_SHELL_DIRECTORY=/home/me/annex ~/.ssh/git-annex-shell\" ... +"""]] diff --git a/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_2_2a210255e8535712c71fa183e56ab600._comment b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_2_2a210255e8535712c71fa183e56ab600._comment new file mode 100644 index 000000000..42b6c1758 --- /dev/null +++ b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_2_2a210255e8535712c71fa183e56ab600._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://olg.myid.net/" + ip="93.218.131.119" + subject="comment 2" + date="2012-11-05T23:34:20Z" + content=""" +Wow, thank you for implementing this so quickly! + + +Just one question: As far as I understood git-annex-shell relays all unknown commands to git-shell. In this case are there the same restrictions active, too? + +Thanks again... +"""]] diff --git a/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment new file mode 100644 index 000000000..e198f8e09 --- /dev/null +++ b/doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 3" + date="2012-11-05T23:42:10Z" + content=""" +All commands usually run by `git-shell` have the repository directory as their last parameter, and git-annex-shell depends on that being the case and checks them. It's possible to add some commands to git-shell by putting them in a special directory, and if those commands don't take the directory last, they wouldn't work. +"""]] diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode.mdwn b/doc/forum/Retrieve_previous_version_in_direct_mode.mdwn new file mode 100644 index 000000000..c74b55b36 --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode.mdwn @@ -0,0 +1,5 @@ +I use the assistant with a local directory in direct mode. I have read in different places that direct mode does not ensure that past versions of files are preserved. + +What precisely happens to past versions? Under which conditions are past versions kept? + +How would I go about retrieving the past version of a file in direct mode? diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode/comment_1_ca3a999ed64c42b8df810115de205d2f._comment b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_1_ca3a999ed64c42b8df810115de205d2f._comment new file mode 100644 index 000000000..dce26832b --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_1_ca3a999ed64c42b8df810115de205d2f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-21T22:16:16Z" + content=""" +If you change a direct mode file and that file has not yet been transferred to some other repository, you've changed the only copy of the file, and so you cannot get back the old version. + +Other than that, git-annex always preserves old versions of direct mode files, the same as it preserves old versions of indirect mode files. + +To get back an old version of a file, use `git annex indirect` to get out of direct mode, use regular git commands to check out the version of the repository that has the file you need, and use `git annex get` to retrieve the file if it's not available in the local repository. +"""]] diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode/comment_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment new file mode 100644 index 000000000..47ab2b742 --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Disk space?" + date="2013-11-02T01:33:10Z" + content=""" +Sorry, I'm confused: does using regular client repositories in direct mode still store old versions of files? If so, for how long? I don't have unlimited disk space, and if it stored in git every copy of every file forever, especially large ones, I'd run out of space...and then what? +"""]] diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode/comment_3_699e816c0397f6db924feeab906f1151._comment b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_3_699e816c0397f6db924feeab906f1151._comment new file mode 100644 index 000000000..77fa9b0e7 --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_3_699e816c0397f6db924feeab906f1151._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T17:36:23Z" + content=""" +You can use `git annex unused` and `git annex dropunused` to remove old versions of files. +"""]] diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode/comment_4_d900388753de5870b7b9c0e8b8c06ed7._comment b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_4_d900388753de5870b7b9c0e8b8c06ed7._comment new file mode 100644 index 000000000..deb26163e --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_4_d900388753de5870b7b9c0e8b8c06ed7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 4" + date="2013-11-02T22:30:07Z" + content=""" +Thank you. Just curious, are there plans to put that in the webapp? +"""]] diff --git a/doc/forum/Retrieve_previous_version_in_direct_mode/comment_5_1360b936aa389a0ab5e5e453824b2ece._comment b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_5_1360b936aa389a0ab5e5e453824b2ece._comment new file mode 100644 index 000000000..c921758b4 --- /dev/null +++ b/doc/forum/Retrieve_previous_version_in_direct_mode/comment_5_1360b936aa389a0ab5e5e453824b2ece._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="How to do this on Mac OSX" + date="2014-05-08T22:46:49Z" + content=""" +So I have a local repository on my MBP and a backup repository on S3. +How do I now restore OLD or deleted file versions on my MBP with git-annex assistant? +"""]] diff --git a/doc/forum/Revert_file_linkage_to_original_files.mdwn b/doc/forum/Revert_file_linkage_to_original_files.mdwn new file mode 100644 index 000000000..ba83cfd15 --- /dev/null +++ b/doc/forum/Revert_file_linkage_to_original_files.mdwn @@ -0,0 +1,9 @@ +I've recently found the following problem: + +I really really want to get back my original folder structure - which includes the real files, not the symlinks. I've searched for quite a while, but I simply could not find an acceptable solution... + +So I thought I would like to ask you guys here, if anybody experienced similar problems (or at least knows a solution for my problem)? + +Greetings + +Pethor diff --git a/doc/forum/Revert_file_linkage_to_original_files/comment_1_898ca2c9976e92d22470c7404aa9813f._comment b/doc/forum/Revert_file_linkage_to_original_files/comment_1_898ca2c9976e92d22470c7404aa9813f._comment new file mode 100644 index 000000000..a72a2cfdd --- /dev/null +++ b/doc/forum/Revert_file_linkage_to_original_files/comment_1_898ca2c9976e92d22470c7404aa9813f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-15T09:02:38Z" + content=""" +Sounds like you want to switch to [[direct mode]]. + +(Or possibly to run `git annex unannex`, if you don't want to use git-annex for these files.) +"""]] diff --git a/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn b/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn new file mode 100644 index 000000000..08aa843cf --- /dev/null +++ b/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn @@ -0,0 +1,3 @@ +I have made some mistakes while using `git annex import` in direct mode. Now I see that some files have been erroneously added and there are other problems. I have not yet used `git annex sync`. + +How can I tell git-annex in direct mode (or bare git) to forget about all these changes and revert back to the last known good (pre-import) state? This means also removing the few imported files and recreate their links. diff --git a/doc/forum/Revert_to_a_precedent_state_in_direct_mode/comment_1_1ae9f7defbab44621c3108973a4f683a._comment b/doc/forum/Revert_to_a_precedent_state_in_direct_mode/comment_1_1ae9f7defbab44621c3108973a4f683a._comment new file mode 100644 index 000000000..88f7fc895 --- /dev/null +++ b/doc/forum/Revert_to_a_precedent_state_in_direct_mode/comment_1_1ae9f7defbab44621c3108973a4f683a._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-04T19:03:05Z" + content=""" +I wish that I had a good answer for you, but since you're using direct mode, I really do not! + +You can run this to see the status: + + git -c core.bare=false status + +That's safe. Everything below has a good chance of losing data if not used carefully. + +You can run a command like this to *delete* an unwanted file (that is shown as a new file in the above). + + git -c core.bare=false rm -f unwanted_file + +If the status shows a file as being modified, you can run this to throw away the modified version. This does not put back the old version! It will leave you with a broken symlink. + + git -c core.bare=false reset modified_file + git -c core.bare=false checkout modified_file + git annex fsck + +If you're lucky, you can then `git annex get` to get the old version from some other repository that still has it. +"""]] diff --git a/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn new file mode 100644 index 000000000..4116577bb --- /dev/null +++ b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn @@ -0,0 +1,2 @@ +How can I run the assistant on a server and access the webinterface over the network from my client pc? +The use case I have in mind is that the server can automatically synchronize files, pushed over XMPP. diff --git a/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_1_dd75d78ef63f2689199a302ed1846017._comment b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_1_dd75d78ef63f2689199a302ed1846017._comment new file mode 100644 index 000000000..ec31212e5 --- /dev/null +++ b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_1_dd75d78ef63f2689199a302ed1846017._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-01-17T08:30:54Z" + content=""" +You don't need the webapp to run the assistant, but if you want, you can forward it to your local system. You will find the URL in .git/annex/url and have to extract the port from it (http://127.0.0.1:/.../), afterwards forward that port either via ssh port forwarding or via a webserver acting as a reverse proxy. +"""]] diff --git a/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_2_df654df60c5fa6a84d786d248928a352._comment b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_2_df654df60c5fa6a84d786d248928a352._comment new file mode 100644 index 000000000..ff43a083d --- /dev/null +++ b/doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_2_df654df60c5fa6a84d786d248928a352._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-17T16:29:39Z" + content=""" +If this is a true server, with a static IP (or some dynamic DNS), there is no need to run the assistant on it; clients using the assistant can ssh in and sync data to it directly. + +Anyway, you can git config web.browser to run some script with the url it will be passed to the webapp when the webapp is started. I sometimes configure it to just echo the url out; it'd also be possible to automate +setting up a redirection for a remote browser, I suppose. +"""]] diff --git a/doc/forum/Running_assistant_steps_manually.mdwn b/doc/forum/Running_assistant_steps_manually.mdwn new file mode 100644 index 000000000..b3b683433 --- /dev/null +++ b/doc/forum/Running_assistant_steps_manually.mdwn @@ -0,0 +1,20 @@ +Unfortunately one of the machines that I am running git-annex on is too old to handle the watcher thread. + +The error message is: + + Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents + + +I am however interested in duplicating the assistant steps manually. I'm happy to accept that I won't have the great, auto-magic, coverage, but, how I run the steps that the assistant runs? + +I'm guessing there is a: + + git annex add . + git commit -m "[blah]" + git annex sync + +but how do I get the pushing to backup/transfer/whatever remotes to work? And what order should I do these? + +What I would *like* to do is get a script that runs all of the needed annex steps and then kick it off in a cron job 2-5 times a day. + +Any thoughts? diff --git a/doc/forum/Running_assistant_steps_manually/comment_1_e14e0a1d55d01cb4f67a94bbe349b872._comment b/doc/forum/Running_assistant_steps_manually/comment_1_e14e0a1d55d01cb4f67a94bbe349b872._comment new file mode 100644 index 000000000..6629ff024 --- /dev/null +++ b/doc/forum/Running_assistant_steps_manually/comment_1_e14e0a1d55d01cb4f67a94bbe349b872._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T20:18:11Z" + content=""" +Essentially, you want to run this: + +
+git annex add
+git annex sync
+for remote in $(git remote); do
+    git annex copy --auto --to $remote
+    git annex get --auto --from $remote
+done
+git annex drop --auto
+
+ +Of course this cannot sync with XMPP remotes. Otherwise it will get you to essentially the same place as the assistant. +"""]] diff --git a/doc/forum/Running_assistant_steps_manually/comment_2_3192f614c929b8060d4fbde56a7adec1._comment b/doc/forum/Running_assistant_steps_manually/comment_2_3192f614c929b8060d4fbde56a7adec1._comment new file mode 100644 index 000000000..b6c10ee88 --- /dev/null +++ b/doc/forum/Running_assistant_steps_manually/comment_2_3192f614c929b8060d4fbde56a7adec1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="Looks great" + date="2013-08-29T12:45:10Z" + content=""" +This looks great as I have: + + * A preference for multiple small repositories. + * Old versions for `git-annex` due to being on Ubuntu LTS for my server. + * A Samsung Galaxy Nexus which somehow seems too slow to run the assistant. + +So these steps combined with some locking and maybe `inotify` seem perfect +"""]] diff --git a/doc/forum/Running_out_of__inodes.mdwn b/doc/forum/Running_out_of__inodes.mdwn new file mode 100644 index 000000000..417de18de --- /dev/null +++ b/doc/forum/Running_out_of__inodes.mdwn @@ -0,0 +1,17 @@ +When syncing with a huge git annex repository on usb disk, my small laptop partition runs out of inodes. + +Any workaround for this? + +- Use bare repository? + + Some git annex command are not supported. + This makes managing (particularly adding) files difficult. + +- Use a loop file partition with tiny block size and large inode numbers? + + Operations on a huge git repository are slow. + On a loop file partition will be slower. + +- Maybe shrink the partition and make room for a specific partition for git annex repository? + +Any opinions? diff --git a/doc/forum/Running_out_of__inodes/comment_1_abc73d9ad662ef642337b683bf0a0253._comment b/doc/forum/Running_out_of__inodes/comment_1_abc73d9ad662ef642337b683bf0a0253._comment new file mode 100644 index 000000000..11f2f7b7e --- /dev/null +++ b/doc/forum/Running_out_of__inodes/comment_1_abc73d9ad662ef642337b683bf0a0253._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T20:37:05Z" + content=""" +Define \"huge\"? Checking out a git repository necessarily requires one inode per file in the repository, plus a smaller quantity for the things in .git. A git-annex repository is much the same as any other git repository. + +Even when I make a really tiny 100 mb ext4 filesystem, it defaults to 25000 inodes, which would be enough to contain a checkout of my second largest git-annex repository. + +Anyway, using git branches seems like a reasonable workaround, to the extent I understand your problem. Make a branch with the files in it you want to have available on the small drive, or check out an empty branch on the small drive and `git annex add` files in there. You can merge the branch back into your master branch on the large drive. +"""]] diff --git a/doc/forum/S3_Host_Question.mdwn b/doc/forum/S3_Host_Question.mdwn new file mode 100644 index 000000000..f114d7c93 --- /dev/null +++ b/doc/forum/S3_Host_Question.mdwn @@ -0,0 +1,11 @@ +I have two machines A & B. Each have their our repository. + +On machine A I have created a remotehost (S3) and have synced successfully. + +I am trying to link machine B to the same remote host. I keep getting an error on the initremote command on machine B. + +I tried using the same command as I did on A and it is not working. Is there a different command to link machine B to an existing remote repository? + +Any help is appreciated. + +Rob diff --git a/doc/forum/S3_Host_Question/comment_1_8c8ecea703405753e47e0da5e8325929._comment b/doc/forum/S3_Host_Question/comment_1_8c8ecea703405753e47e0da5e8325929._comment new file mode 100644 index 000000000..b8d63e5fd --- /dev/null +++ b/doc/forum/S3_Host_Question/comment_1_8c8ecea703405753e47e0da5e8325929._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-12-13T08:37:24Z" + content=""" +On machine B you don't initremote you enableremote, + + + git annex enableremote mys3 +"""]] diff --git a/doc/forum/S3_Host_Question/comment_2_3d6fa3147d59a5e0d10b005388b23c7a._comment b/doc/forum/S3_Host_Question/comment_2_3d6fa3147d59a5e0d10b005388b23c7a._comment new file mode 100644 index 000000000..cef33d354 --- /dev/null +++ b/doc/forum/S3_Host_Question/comment_2_3d6fa3147d59a5e0d10b005388b23c7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnKhw0-Tu5oHjeoz_gAP4Nu5V9uo8ta3hM" + nickname="Robert" + subject="unknown special remote" + date="2013-12-13T15:12:37Z" + content=""" +How does machine B know about the remote? Machines A & B are separate and don't share references. Am I missing a step? +"""]] diff --git a/doc/forum/S3_Host_Question/comment_3_797edf3ad41561ab8960f3b28d20611e._comment b/doc/forum/S3_Host_Question/comment_3_797edf3ad41561ab8960f3b28d20611e._comment new file mode 100644 index 000000000..a0dbae5bd --- /dev/null +++ b/doc/forum/S3_Host_Question/comment_3_797edf3ad41561ab8960f3b28d20611e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 3" + date="2013-12-14T09:05:26Z" + content=""" +remote info is recorded in git once you clone the git repo it knows about machine a and s3 repo. +"""]] diff --git a/doc/forum/Same_Jabber_account_for_different_annexes.mdwn b/doc/forum/Same_Jabber_account_for_different_annexes.mdwn new file mode 100644 index 000000000..f58d4abd0 --- /dev/null +++ b/doc/forum/Same_Jabber_account_for_different_annexes.mdwn @@ -0,0 +1 @@ +Is it possible to use the same jabber account for different annexes? I think I've mixed up several repositories by using the same jabber account for synchronizing... diff --git a/doc/forum/Same_Jabber_account_for_different_annexes/comment_1_90c3954fe11980eef42b5f5d34f83488._comment b/doc/forum/Same_Jabber_account_for_different_annexes/comment_1_90c3954fe11980eef42b5f5d34f83488._comment new file mode 100644 index 000000000..e39b7b52b --- /dev/null +++ b/doc/forum/Same_Jabber_account_for_different_annexes/comment_1_90c3954fe11980eef42b5f5d34f83488._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T15:02:40Z" + content=""" +This is a limitation of how jabber is currently used. You need different accounts to sync different repositories over jabber. Supporting using 1 account is the main open todo item on the [[design/assistant/xmpp]] page. +"""]] diff --git a/doc/forum/Same_Jabber_account_for_different_annexes/comment_2_802600b3568e5f94d0550092b22975db._comment b/doc/forum/Same_Jabber_account_for_different_annexes/comment_2_802600b3568e5f94d0550092b22975db._comment new file mode 100644 index 000000000..6be7841ef --- /dev/null +++ b/doc/forum/Same_Jabber_account_for_different_annexes/comment_2_802600b3568e5f94d0550092b22975db._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="paulvt" + ip="2001:1af8:ff19:0:a288:b4ff:fe2c:f600" + subject="Resources" + date="2013-07-13T08:14:35Z" + content=""" +XMPP resources (carrying annex.uuid) cannot be of any help here? +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server.mdwn b/doc/forum/Securing_a_shared_ssh_server.mdwn new file mode 100644 index 000000000..3e0006cb3 --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server.mdwn @@ -0,0 +1,3 @@ +Hi, I'd like to share files with friends, to do so we need a shared server to exchange the files. I could setup an ssh access on one of my servers but I don't want others to have a full access. I assume I can restrict this using a `command='wrapper-around-git'` prefix in `.ssh/authorized_keys`, where `wrapper-around-git` is simply a script that checks if `SSH_ORIGINAL_COMMAND` is an authorised command and runs it. This is exactly the approach used with Mercurial (hg-ssh) and presumably git also relies on this mechanism. + +But to do so, I need to know what commands can be executed over ssh when using git-annex assistant. Could you document about this? Thanks! diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_1_ea971b57d94db5b8d487f728faa5e9a8._comment b/doc/forum/Securing_a_shared_ssh_server/comment_1_ea971b57d94db5b8d487f728faa5e9a8._comment new file mode 100644 index 000000000..f82a57295 --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_1_ea971b57d94db5b8d487f728faa5e9a8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-24T15:35:16Z" + content=""" +The git-annex assistant automatically sets up a ssh key that is locked down this way when you select \"ssh server\" in the webapp. + +The command you need to allow to run is git-annex-shell. This has been designed to be secure. +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_2_421a19f6e1fb40db6ee205daf8e3f867._comment b/doc/forum/Securing_a_shared_ssh_server/comment_2_421a19f6e1fb40db6ee205daf8e3f867._comment new file mode 100644 index 000000000..3d92c8b27 --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_2_421a19f6e1fb40db6ee205daf8e3f867._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 2" + date="2013-05-24T15:47:36Z" + content=""" +Thanks for your quick answer! But this is true only for servers where git-annex is installed. On a server that just does SSH, things must be different. So, I've started to use the SSH `command=` mechanism to log the commands and discovered so far four of them: + + * `sh -c 'echo git-annex-probe...` and `sh -c 'mkdir -p ...` when the server is first connected by a client + * `rsync --server -vre.iLsf --partial-dir .rsync-partial . DIR/` and `rsync --server --sender -e31.14 --inplace . DIR//bd1/469/TEXT` when files are transfered between clients + +I want to derive patterns from this but if you could give them to me (ie, tell me which parts are fixed and which are variable) this will be safer. Moreover, I'm quite sure there are somme commands missing from my logs... By the way, parameter `-e31.14` to `rsync` surprises me because `-e` is supposed to set the remote shell (like `--rsh`). + +Cheers, Franck +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_3_acdbf92f646dbbf691621f08b3d94c26._comment b/doc/forum/Securing_a_shared_ssh_server/comment_3_acdbf92f646dbbf691621f08b3d94c26._comment new file mode 100644 index 000000000..ea48a2caf --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_3_acdbf92f646dbbf691621f08b3d94c26._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-27T19:14:37Z" + content=""" +I am confident that it will be *easier* to install git-annex-shell on your ssh server than it will be to lock down rsync. + +All you need to do is go get the standalone linux tarball of git-annex, untar it, and add its directory to PATH. + +You can google for perl scripts that lock down rsync, but I have never been happy with any of the ones I found. +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_4_67533d08e1b8706b844262e9c483d982._comment b/doc/forum/Securing_a_shared_ssh_server/comment_4_67533d08e1b8706b844262e9c483d982._comment new file mode 100644 index 000000000..107c7b3cc --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_4_67533d08e1b8706b844262e9c483d982._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 4" + date="2013-05-28T06:34:04Z" + content=""" +Thanks, but my server is a synology nas and as you know from another thread of comments, having git-annex work on it is not that simple. ;-) +Moreover, I'd like to be able to use ssh accounts where I don't have a root access and not necessarily git. So, a general method to restrict ssh would interest me. + +But your answer seems to suggest that almost arbitrary rsync commands may be given. If so, I agree that there are few hopes to build a secured jail around this... But if really a limited subset of commands is used, I think it should be possible to check them securely. + +Now on I'm focused on having git-annex work because this looks like the most promising way. But I'll have another question regarding it: I noticed that we can restrict access to a specific repository using an appropriate environnement variable. But it's it possible to provide a list of repositories instead of just one? My collaborators will typically have access to several shares but not to all of them. + +Thanks for your responsiveness, after trying tens of candidates git-annex appears to be the only serious solution to replace Dropbox and I'm really glad that you actively help your users! +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_5_bf193e02b388b4358632a169d2425b5c._comment b/doc/forum/Securing_a_shared_ssh_server/comment_5_bf193e02b388b4358632a169d2425b5c._comment new file mode 100644 index 000000000..d0f78da92 --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_5_bf193e02b388b4358632a169d2425b5c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-29T16:56:37Z" + content=""" +I can't say what options rsync will choose to pass to the server, when the rsync special remote uses rsync. It's up to that command. + +`GIT_ANNEX_SHELL_DIRECTORY` currently only supports specifying one directory. +"""]] diff --git a/doc/forum/Securing_a_shared_ssh_server/comment_6_50d391992cd444080ebc70db30b215c5._comment b/doc/forum/Securing_a_shared_ssh_server/comment_6_50d391992cd444080ebc70db30b215c5._comment new file mode 100644 index 000000000..fce7ab3df --- /dev/null +++ b/doc/forum/Securing_a_shared_ssh_server/comment_6_50d391992cd444080ebc70db30b215c5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 6" + date="2013-05-29T17:41:25Z" + content=""" +OK, I understand now why it is complicated to secure rsync, the best I can hope is to chroot it on a restricted account. Thanks! And the \"currently\" regarding ˋGIT_ANNEX_SHELL_DIRECTORYˋ gives me hope about a future change. :-) +Cheers, Franck +"""]] diff --git a/doc/forum/Sending_requests_across_the_network.mdwn b/doc/forum/Sending_requests_across_the_network.mdwn new file mode 100644 index 000000000..db5322477 --- /dev/null +++ b/doc/forum/Sending_requests_across_the_network.mdwn @@ -0,0 +1,15 @@ +Hi, + +Is it possible to have git-annex send requests across the repository network? Say I have a network topology like this: +Home (annex) <-> Cloud (S3) <-> Laptop (annex) + +Home has all files, cloud has zero, and laptop has subset of files. Let's also assume Laptop can't talk to Home directly (maybe it's behind a NAT), but both Home and Laptop are connected to the internet. +If I'm away on my laptop, can I retrieve a file from Home "through" Cloud? + +That is, Laptop checking its remotes and none of them have the file I want, so it checks remotes of remotes, etc. I'm not sure if git-annex knows the topology (seems likely considering it can generate the graphviz image). It also seems there is a communication medium of Jabber/XMPP where it could communicate between internet-connected git-annex servers (which might not otherwise be able to talk to each other directly)? So the fact that Cloud isn't a git-annex server, just a dumb key/value store would be okay? + +I realize that I could set it up so Home mirrors everything to Cloud and then that eventually mirrors over to Laptop, but let's assume both Cloud and Laptop have small storage capacities, so on-demand fetching would be needed. + +This is basically the same usecase as the USB transfer drive to sync two annexes not on the same network, but automated. + +Thanks! diff --git a/doc/forum/Sending_requests_across_the_network/comment_1_8ff713d4c968705061bf2044ea0fe5a0._comment b/doc/forum/Sending_requests_across_the_network/comment_1_8ff713d4c968705061bf2044ea0fe5a0._comment new file mode 100644 index 000000000..8cb4575c1 --- /dev/null +++ b/doc/forum/Sending_requests_across_the_network/comment_1_8ff713d4c968705061bf2044ea0fe5a0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="preferred content …" + date="2014-07-02T07:26:59Z" + content=""" +Hi + +This can be accomplished with the use of [[/preferred_content/]]. +"""]] diff --git a/doc/forum/Sending_requests_across_the_network/comment_2_cb29e5346a8775d87d30b18b7fc005a7._comment b/doc/forum/Sending_requests_across_the_network/comment_2_cb29e5346a8775d87d30b18b7fc005a7._comment new file mode 100644 index 000000000..87e6976fe --- /dev/null +++ b/doc/forum/Sending_requests_across_the_network/comment_2_cb29e5346a8775d87d30b18b7fc005a7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-07-02T17:25:51Z" + content=""" +The network topology shown has only a S3 special remote connecting the two repositories. This only provides a place to store file contents, it does not allow syncing the contents of git repositories. + +You need either XMPP(Jabber) for that, or a git remote on some other server. Once there is a way for the git repository to sync, the Home repository will see when Laptop is missing a file it wants (configured via the preferred content mentioned above), and upload it to S3. +"""]] diff --git a/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn new file mode 100644 index 000000000..85755e982 --- /dev/null +++ b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn @@ -0,0 +1,13 @@ +I want to setup a rsync special remote on my server with a non-standard ssh port. + +I tried the following steps: + + git annex initremote rsync-encrypted type=rsync rsyncurl=1.2.3.4:/encrypted-annex encryption=AAAAAAAAA + git config remote.rsync-encrypted.annex-rsync-options "-e \'ssh -p 443\'" + +But I just get this error: + + [2012-11-22 21:04:30 CET] read: rsync ["-e","'ssh","-p","443'","--progress","--recursive","--partial","-- partial-dir=.rsync-partial","/home/marco/annex/.git/annex/tmp/rsynctmp/15309/","1.2.3.4:/encrypted-annex"] + Missing trailing-' in remote-shell command. + +I tried some ways to escape the config but I don't have a clue. Anybody? diff --git a/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_1_1eb6990e93ec92cb6fd7dbee59f31072._comment b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_1_1eb6990e93ec92cb6fd7dbee59f31072._comment new file mode 100644 index 000000000..5af84acc0 --- /dev/null +++ b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_1_1eb6990e93ec92cb6fd7dbee59f31072._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 1" + date="2012-11-22T22:44:11Z" + content=""" +Add the host to your .ssh/config like this + +Host myotherpc + HostName 10.0.0.10 + Port 2222 + +"""]] diff --git a/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment new file mode 100644 index 000000000..c336be0d1 --- /dev/null +++ b/doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="~/.ssh/config" + date="2012-11-23T05:08:47Z" + content=""" +Thank you very much. Works like a charm. +"""]] diff --git a/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn b/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn new file mode 100644 index 000000000..53d0e0165 --- /dev/null +++ b/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn @@ -0,0 +1,6 @@ +Hi, + +When using git-annex assistant, is there a possibility to share only certain files or directories from a repository (similar to what Dropbox can do), or do we have to share whole repositories so far? +Could this be a nice wishlist item, or is there a strong reason against adding this feature to git-annex? + +Thanks a lot! diff --git a/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__/comment_1_ec0d56cb31b918023a9184cee168b406._comment b/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__/comment_1_ec0d56cb31b918023a9184cee168b406._comment new file mode 100644 index 000000000..8fa6f7b40 --- /dev/null +++ b/doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__/comment_1_ec0d56cb31b918023a9184cee168b406._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T19:44:57Z" + content=""" +Everyone can see the names of every file that is put into the git repository. Whether the contents of those files is transferred from the machine where they were created to other clones of the repository is configurable using [[preferred_content]], but it's not really intended as an access control mechanism. +"""]] diff --git a/doc/forum/Share_with_friend_copies_only_sym_links.mdwn b/doc/forum/Share_with_friend_copies_only_sym_links.mdwn new file mode 100644 index 000000000..8f31b6337 --- /dev/null +++ b/doc/forum/Share_with_friend_copies_only_sym_links.mdwn @@ -0,0 +1,38 @@ +I just setup git-annex across three macs, using git-annex assistant. I have one repository working fine, which successfully syncs between two of my own accounts on two different machines, via S3. + +Now I'm trying to get the "share with a friend" feature to work. The problem is that only Mac Alias's / sym links are created, for example: + +Machine 1: +- Copy file into ~/annex/ + +Machine 2: +- The file is synced as a sym-link, with a link into a file in .git that doesn't exist. + +The config is: +- Version: 4.20130909-ga29f960 - Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi +- Two macs +- Share with friend over Jabber +- Use Box as the cloud sync service with encryption enabled. Box is setup as a transfer repository. + +I've looked through the logs in .git/annex/daemon.log* and there doesn't look to be any problems. + +This is what the log looks like: + + [2013-09-14 19:55:47 PDT] Committer: Adding 20120101-..084-1.jpg + failed + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) ok + add /Users/nick/Shared/20120101-GOPR0084-1.jpg (checksum...) [2013-09-14 19:55:47 PDT] Committer: Committing changes to git + [2013-09-14 19:55:48 PDT] XMPPSendPack: Syncing with USER2 + Already up-to-date. + To xmpp::USER2@gmail.com + 7b65b15..183b91c git-annex -> refs/synced/6163ef8e-c36a-4b09-919b-9c18ade55234/bmlja2JsYWNrMUBnbWFpbC5jb20=/git-annex + 3104275..96afa09 master -> refs/synced/6163ef8e-c36a-4b09-919b-9c18ade55234/bmlja2JsYWNrMUBnbWFpbC5jb20=/master + [2013-09-14 19:55:49 PDT] XMPPSendPack: Syncing with USER2 + Everything up-to-date + recv: resource vanished (Connection reset by peer) + + +Any ideas what I should look at next? Thanks in advance :-) diff --git a/doc/forum/Share_with_friend_copies_only_sym_links/comment_1_a8d22dfefb219f0c9130cc294364b198._comment b/doc/forum/Share_with_friend_copies_only_sym_links/comment_1_a8d22dfefb219f0c9130cc294364b198._comment new file mode 100644 index 000000000..84217711a --- /dev/null +++ b/doc/forum/Share_with_friend_copies_only_sym_links/comment_1_a8d22dfefb219f0c9130cc294364b198._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 1" + date="2013-09-19T17:41:47Z" + content=""" +git-annex can only share the contents of files with a friend when you both have access to a transfer repository. Your friend's git-annex webapp should detect that it does not have such a repository, and should be displaying an alert like this: + +[[assistant/cloudnudge.png]] +(But in this case it should say \"Unable to download files from YourName\") + +So, you need to give your friend access to the S3 repository that you're already using to keep your 2 computers in sync. Or, set up some other transfer repository that you both can access. + +There is a way in S3 to create another key that can read and write to a S3 bucket. You can then give that key to your friend. + +Or, you could set up a shared git repository on a ssh server you both have access to. Or, set up a box.com remote -- the webapp will offer to store the box.com credentials and share them with your friend. +"""]] diff --git a/doc/forum/Sharing_annex_with_local_clones.mdwn b/doc/forum/Sharing_annex_with_local_clones.mdwn new file mode 100644 index 000000000..756075ef9 --- /dev/null +++ b/doc/forum/Sharing_annex_with_local_clones.mdwn @@ -0,0 +1 @@ +Hi, is there any particular problem with symlinking one .git/annex to share between multiple repos? diff --git a/doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment b/doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment new file mode 100644 index 000000000..892bc50f5 --- /dev/null +++ b/doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="don't do that" + date="2012-03-19T18:23:13Z" + content=""" +Suppose you do that to repos A and B. Now, in A, you `git annex drop` a file that is only present in those repositories. A checks B to make sure it still has a copy of the file. It sees the (same) file there, so assumes it's safe to drop. The file is removed from A, also removing it from B, and losing data. + +It is possible to configure A and B to mutually distrust one-another and avoid this problem, but there will be other problems too. + +Instead, git-annex supports using `cp --reflink=auto`, which on filesystems supporting Copy On Write (eg, btrfs), avoids duplicating contents when A and B are on the same filesystem. +"""]] diff --git a/doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._comment b/doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._comment new file mode 100644 index 000000000..88f495da6 --- /dev/null +++ b/doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnhsaESlYphzLTzpJy5IxxGFxxctIhWYfo" + nickname="Bryon" + subject="comment 2" + date="2012-03-19T18:46:13Z" + content=""" +Ah, OK. Is there a configuration step to set this up, or is this included magic in a new enough git-annex client? +"""]] diff --git a/doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment b/doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment new file mode 100644 index 000000000..3e5fd1154 --- /dev/null +++ b/doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnhsaESlYphzLTzpJy5IxxGFxxctIhWYfo" + nickname="Bryon" + subject="comment 3" + date="2012-03-19T18:55:03Z" + content=""" +Nevermind, found it. (git-annex 0.08) +"""]] diff --git a/doc/forum/Simple_check_out_with_assistant__63__.mdwn b/doc/forum/Simple_check_out_with_assistant__63__.mdwn new file mode 100644 index 000000000..755b237e4 --- /dev/null +++ b/doc/forum/Simple_check_out_with_assistant__63__.mdwn @@ -0,0 +1,2 @@ +I want to use the annex assistant instead of the command line. Which is the recommended method to check out a file that I want to edit? + diff --git a/doc/forum/Simple_check_out_with_assistant__63__/comment_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment b/doc/forum/Simple_check_out_with_assistant__63__/comment_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment new file mode 100644 index 000000000..dbb018b53 --- /dev/null +++ b/doc/forum/Simple_check_out_with_assistant__63__/comment_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaXxj2aPZrtRkWzwswTNep8hFif1cXykw" + nickname="Erik" + subject="Follow-up: check-in" + date="2012-11-08T08:59:14Z" + content=""" +And the obvious follow-up question: How to I check in and sync the file that I just edited? (Note: I want to avoid the command line) +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn b/doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn new file mode 100644 index 000000000..2caf332af --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn @@ -0,0 +1,18 @@ +I have previously been confused by how to have a bit more manual control over where files are (as in [[bugs/git-annex_immediately_re-gets_dropped_files/]]). + +I thought perhaps something like an archive directory would work, but as I might want different computers to have different content, perhaps a per-computer archive repository. + +To that end, I have + +
walter@dionysus:~/annex$ git annex content .
+(exclude=archive/dionysus/* or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1)
+ok
+ +which is a modified version of the archive [[preferred_content]], but with the intention that I change the part after `exclude` to be different for each client. +I also set the group to client for this client (dionysus). + +However, it does not seem to drop files when I move them into `archive/dionysus/`, and I cannot see anything in the logs to suggest why. + +What am I doing wrong here? Or, is this the wrong approach? + +--Walter diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_10_bcb883d46a637dd1a8ef9a92733d202a._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_10_bcb883d46a637dd1a8ef9a92733d202a._comment new file mode 100644 index 000000000..5064de49d --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_10_bcb883d46a637dd1a8ef9a92733d202a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 10" + date="2013-11-08T18:32:12Z" + content=""" +If I could comprehensively fix that bug I would. + +But, it's supposed to already be fixed when using direct mode. Were you using indirect mode when you saw the problem? +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_11_b7a8b9eaf114f883866fbf2be51b622f._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_11_b7a8b9eaf114f883866fbf2be51b622f._comment new file mode 100644 index 000000000..7155b560f --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_11_b7a8b9eaf114f883866fbf2be51b622f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 11" + date="2013-11-09T06:02:36Z" + content=""" +No, this was using direct mode. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_1_6236bcfa9beba705ead3ec2141c5d835._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_1_6236bcfa9beba705ead3ec2141c5d835._comment new file mode 100644 index 000000000..b9f598a1f --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_1_6236bcfa9beba705ead3ec2141c5d835._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 1" + date="2013-09-19T17:57:22Z" + content=""" +That sound like it should work. I suggest you play around with `git annex drop --auto` at the command line. It will probably tell you why it is unable to drop a file if the problem is something like not enough copies located elsewhere. Or, if it doesn't try to drop the file at all, you'll know your preferred content expression makes it want to keep the file. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_2_ea935b37ca93e73c85d04df7c9bf6057._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_2_ea935b37ca93e73c85d04df7c9bf6057._comment new file mode 100644 index 000000000..50f113aa3 --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_2_ea935b37ca93e73c85d04df7c9bf6057._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 2" + date="2013-09-19T22:22:03Z" + content=""" +So, it sort of works... + +I realised that I don't have `archive` repository but instead `backup` ones, so adding that makes `git annex drop --auto` want to drop files in archive/dionysus. + +However, the webapp then gets them. This I don't understand. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment new file mode 100644 index 000000000..41bb0cb58 --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 3" + date="2013-09-20T00:15:07Z" + content=""" +does `git annex get --auto` also get them? +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_4_07a0a754a089c46ff69dc97ea7ba9384._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_4_07a0a754a089c46ff69dc97ea7ba9384._comment new file mode 100644 index 000000000..30e3965af --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_4_07a0a754a089c46ff69dc97ea7ba9384._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 4" + date="2013-09-20T02:41:22Z" + content=""" +I am testing on my laptop, and the content expression there is +`(exclude=archive/kronos/* ) or (not copies=semitrusted+:1)` +to simplify things; I interpret this to mean it wants everything not in archive/kronos, and it wants things there where that's the only copy. + +The problem is that `git annex drop --auto` does indeed drop things, but `git annex get --auto` gets them; surely it should not be possible for that to happen? + +I also tried the preferred content expression of `(exclude=archive/kronos/* )`, and the same thing happens. + +The version of git-annex that I am using is +
git-annex version: 4.20130919-g9be7762
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi
+local repository version: 4
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_5_e884c001a556a0c693d1cc9a97c068ac._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_5_e884c001a556a0c693d1cc9a97c068ac._comment new file mode 100644 index 000000000..50e5cf9af --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_5_e884c001a556a0c693d1cc9a97c068ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 5" + date="2013-09-20T15:31:18Z" + content=""" +Ok. This seems to be a bug in git-annex then. While it's surprisingly difficult to do so, it tries to interpet preferred content expressions in a stable way -- that is, they should not want to get a file when it's missing and then want to drop it when it's present. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_6_3e8674b5857e4994dfbc26be4f4b2855._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_6_3e8674b5857e4994dfbc26be4f4b2855._comment new file mode 100644 index 000000000..eff5d9339 --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_6_3e8674b5857e4994dfbc26be4f4b2855._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 6" + date="2013-09-20T15:36:25Z" + content=""" +I tried to reproduce this behavior, but failed. My configuration was 2 repos, A and B, with B the origin of A. A was configured with \"exclude=archive/kronos/*\" +(also tried \"(exclude=archive/kronos/* ) or (not copies=semitrusted+:1)\") + +
+joey@darkstar:~/tmp/A>git annex get --auto
+joey@darkstar:~/tmp/A>git annex get
+get archive/kronos/foo (from origin...) ok
+(Recording state in git...)
+joey@darkstar:~/tmp/A>git annex drop --auto
+drop archive/kronos/foo ok
+(Recording state in git...)
+joey@darkstar:~/tmp/A>git annex get --auto
+joey@darkstar:~/tmp/A>
+
+ +... Which is how you want it to behave. + +So I wonder if it's something else in your configuration. The best thing to do would be if you can come up with a series of commands I can follow to build repositories that exhibit the problem. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_7_7aeabc2e52a39423e83fbd04560e8f91._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_7_7aeabc2e52a39423e83fbd04560e8f91._comment new file mode 100644 index 000000000..145a913e9 --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_7_7aeabc2e52a39423e83fbd04560e8f91._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 7" + date="2013-09-20T15:37:48Z" + content=""" +Also, please check if you're running into [[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]] +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_8_53b95449cfad2fe0f72d2ad642822c03._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_8_53b95449cfad2fe0f72d2ad642822c03._comment new file mode 100644 index 000000000..d866380f2 --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_8_53b95449cfad2fe0f72d2ad642822c03._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 8" + date="2013-09-20T20:30:52Z" + content=""" +Hmm, that could be it; the same content is both inside and outside the archive directory. + +What I really want to do (because maybe I'm not going about this the best way) is to use the assistant not in manual mode, but allow for some repos not having some files. +I thought by placing them in an archive directory, then they would be dropped, and to get them again, I can just delete from the archive dir, and they will be got (as the file is also outside the archive dir. + +But, if that is not going to work, is there a better way to manage that? + +By the way, I really appreciate all the work you put into this awesome project. +"""]] diff --git a/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_9_a17c102a45e4fc3f101a79acb8eb4081._comment b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_9_a17c102a45e4fc3f101a79acb8eb4081._comment new file mode 100644 index 000000000..56d22c7fd --- /dev/null +++ b/doc/forum/Slightly_finer_control_over_file_whereabouts/comment_9_a17c102a45e4fc3f101a79acb8eb4081._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 9" + date="2013-09-23T21:58:42Z" + content=""" +Thinking about this further, I'm not entirely sure what I want. I think the confusion arises from git-annex sometimes (mostly) caring about file *contents* (ie dependent on the hash of the file), but sometimes (preferred content, not sure of anywhere else) caring about file *location*. + +What I think I actually want is a way of specifying locations that are not synced, such that if the file is changed somewhere (on another computer), the new version should not be downloaded. But, if the same content is in another location as well, the behaviour should be stable, I don't know how that should work though. + +So, perhaps the best strategy is to have an explicit list of locations that I don't want, in the preferred content expression, if it could cope with files being in and out of some location at the same time. I think this would be easiest if I could avoid manually editing the expression all the time, maybe make a file with a list of file locations, if it would be possible for git-annex to handle that? I think it isn't at the moment, and my haskell is non-existent. That way, I could write some helper to add and remove files from this list. For example `dont-want file1 file2 dir1` would add these locations to a file, and `want file1 file2 dir1` would remove them from this list. Actually, I suppose I could make it just create an appropriate preferred-content expression, and then it doesn't need to support some file of locations. + +So, after that ramble, I guess I'm envisaging a preferred content expression like `content=(exclude=path/to/file1 and exclude=path/to/file1 and exclude=path/to/dir1/*) or (some statement about numcopies)`, which I imagine updating whenever I decide I do/don't want some file. The only obstacle to this working is [[bugs/Handling of files inside and outside archive directory at the same time]] (as I understand that bug, could be wrong on the implications of it), meaning (of course) if there are two files with the same content, and I exclude one of them, and not the other, then it both wants and doesn't want the file, and it (and I) get really confused. + +I suppose a short-term (well, slow) solution is to find duplicates of files I don't want, and if that exists either add the duplicate to my content expression (to say I don't want it), or remove the one I don't want from the expression (to say I do). This doesn't work well for when the content of one of the files changes (and so they are no longer duplicates), but I think I would search for them each time I generate the expression, so at that time it would no longer find the duplicate. + +So, @joey, I guess my question is, what are the chances of that bug being resolved somehow? Or if that is not likely to happen soon, I might try to implement my solution outline from the previous two paragraphs. +"""]] diff --git a/doc/forum/Some_mounted_devices_not_detected.mdwn b/doc/forum/Some_mounted_devices_not_detected.mdwn new file mode 100644 index 000000000..6146ef14f --- /dev/null +++ b/doc/forum/Some_mounted_devices_not_detected.mdwn @@ -0,0 +1,3 @@ +Automounted USB devices are not detected by the git-annex webapp on my Debian testing/squeeze installation, only drives with entries in /etc/fstab show up in the device list. Is there any way to tweak/get around this? + +I'm running version 4.20131106 (couldn't manage to build the package for sid). diff --git a/doc/forum/Some_mounted_devices_not_detected/comment_1_0ba07b95f12f57ea63bb450b88430c45._comment b/doc/forum/Some_mounted_devices_not_detected/comment_1_0ba07b95f12f57ea63bb450b88430c45._comment new file mode 100644 index 000000000..5cd472c8e --- /dev/null +++ b/doc/forum/Some_mounted_devices_not_detected/comment_1_0ba07b95f12f57ea63bb450b88430c45._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-24T16:04:23Z" + content=""" +can you post an example line from /proc/mounts for one of these devices? +"""]] diff --git a/doc/forum/Some_mounted_devices_not_detected/comment_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment b/doc/forum/Some_mounted_devices_not_detected/comment_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment new file mode 100644 index 000000000..60512d418 --- /dev/null +++ b/doc/forum/Some_mounted_devices_not_detected/comment_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmyEv6SesaYeke389mHdiHlavirPkGHzHI" + nickname="Albin" + subject="comment 2" + date="2013-11-26T14:35:58Z" + content=""" +I missed your reply on IRC. Sorry for that! + +Here's an example from /proc/mounts: + + /dev/sdf1 /media/SoderUSB ext4 rw,nosuid,nodev,noexec,relatime,errors=remount-ro,data=ordered 0 0 + +"""]] diff --git a/doc/forum/Some_mounted_devices_not_detected/comment_3_06c0db7d670d9b82823102d22db15a36._comment b/doc/forum/Some_mounted_devices_not_detected/comment_3_06c0db7d670d9b82823102d22db15a36._comment new file mode 100644 index 000000000..53c76e210 --- /dev/null +++ b/doc/forum/Some_mounted_devices_not_detected/comment_3_06c0db7d670d9b82823102d22db15a36._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-11-26T19:59:42Z" + content=""" +Hmm, that looks fine. + +Perhaps the user you're running git-annex as cannot write to `/media/SoderUSB` ? The webapp avoids listing places you can't write, since it would fail to make a repository there. (Also because this is an easy way for it to avoid listing `/`, `/usr`, or whatever other OS-level mounts a system might have..) +"""]] diff --git a/doc/forum/Some_mounted_devices_not_detected/comment_4_80820a29361c5be4a94672dacfdefa6f._comment b/doc/forum/Some_mounted_devices_not_detected/comment_4_80820a29361c5be4a94672dacfdefa6f._comment new file mode 100644 index 000000000..03b917a69 --- /dev/null +++ b/doc/forum/Some_mounted_devices_not_detected/comment_4_80820a29361c5be4a94672dacfdefa6f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmyEv6SesaYeke389mHdiHlavirPkGHzHI" + nickname="Albin" + subject="comment 4" + date="2013-11-27T17:33:22Z" + content=""" +Actually, that (write permissions) seems to have been the problem. Thanks! Can't imagine why pmount would not mount a device writable by my user, though. +"""]] diff --git a/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff.mdwn b/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff.mdwn new file mode 100644 index 000000000..3d93d8026 --- /dev/null +++ b/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff.mdwn @@ -0,0 +1,22 @@ +I'm using git-annex to manage my photos on my laptop, and have my NAS (which is just a debian linux system with lots of disks) as one of my remotes. I use my NAS as a backup, and to free up space on my laptop. + +But somehow I now have lots of directories in my main root directory of the photos directory. it looks like [0-9a-f][0-9a-f][0-9a-f], so I have 000, ... a00, ... ddd, ..., all the way to fff. Thousands of them. Each one has a few directories that also match [0-9a-f][0-9a-f][0-9a-f], and each one has a file with names of the git annex object filename. + +e.g.: + + $ cat e1d/760/SHA256-s4061375--7909e266f340ff8bc692e073e776ceda267042adf790275a2d851f2c7eb1ca83.log + 1338931894.759394s 1 1adfa84c-af51-11e1-b075-0b1206d553bc + 1338992164.202818s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + 1339862991.346546s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + 1339946933.224915s 1 224d85b4-b86f-11e1-b11e-3333ce526126 + 1339964057.205993s 1 224d85b4-b86f-11e1-b11e-3333ce526126 + 1343495865.083951s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + 1344788941.403528s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + 1351802706.679542s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + 1362423729.820711s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05 + +My remote (NAS) has these files & directories as well as my laptop. The regular photo directory hierarchy is there as well, the files work, can be copied etc. "git status" say nothing has changed. Those files are tracked by git (they have lot messages). Everything just works, it's just that there's loads of these directories? Can I remove them? How can I clear it up? I can't remember when these directories/files were added, I only noticed it today. + +I don't know if I had my remote (NAS) as a bare git repo and used it as that, then somehow used it as a non-bare one, would that cause this? + +Can I remove them? Where did they come from? What's going on? diff --git a/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff/comment_1_20147b287fd995fa8ac9e868b5974d8a._comment b/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff/comment_1_20147b287fd995fa8ac9e868b5974d8a._comment new file mode 100644 index 000000000..1f5018e34 --- /dev/null +++ b/doc/forum/Somehow_have_lots_of_directories_in_root:_000...ffff/comment_1_20147b287fd995fa8ac9e868b5974d8a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T19:50:38Z" + content=""" +The files that you describe are normally tucked away on the git-annex branch of the git repository, where they're neither seen nor heard. + +The most likely cause of your problem would be if you have done a \"git checkout git-annex\" ... or worse, a \"git merge git-annex\". + +So, check what branch you have checked out, and if it's the git-annex branch, you'll want to change back to master. If you've got master checked out and have these files, you can use `git log --stat` and see if there's a commit that added a bunch of these files to your master branch. Then you can revert that commit. +"""]] diff --git a/doc/forum/Special_remote_public_key_encryption_issue.mdwn b/doc/forum/Special_remote_public_key_encryption_issue.mdwn new file mode 100644 index 000000000..aed35ad31 --- /dev/null +++ b/doc/forum/Special_remote_public_key_encryption_issue.mdwn @@ -0,0 +1,18 @@ +I'm unable to set up a standard architecture: 2 computers sharing some files, talking via a jabber account and transferring files via e.g. box.com. +Steps: + +Computer 1: +a) Install git-annex, open up the assistant, create a new repository, add a jabber account +b) Add a box.com account using +WEBDAV_USERNAME=[username] WEBDAV_PASSWORD=[password] git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex chunksize=75mb encryption=pubkey keyid=[key id]. +All seemed fine. + +Computer 2: +a) same +b) at this point I saw the option of adding box.com as a cloud storage. I clicked enable and got the message + +user error (gpg ["--quiet","--trust-model","always","--decrypt"] exited 2) + +In the meantime, on Computer 1 I saw the same option. I clicked enable and got the same message. + +It all works fine if I use shared encryption. diff --git a/doc/forum/Special_remote_public_key_encryption_issue/comment_1_a9caafea017a3c148f89d4ddeee15a4c._comment b/doc/forum/Special_remote_public_key_encryption_issue/comment_1_a9caafea017a3c148f89d4ddeee15a4c._comment new file mode 100644 index 000000000..6c5a35c3a --- /dev/null +++ b/doc/forum/Special_remote_public_key_encryption_issue/comment_1_a9caafea017a3c148f89d4ddeee15a4c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T18:22:26Z" + content=""" +Which is why the assistant uses shared encryption by default.. + +You have set up a webdav repository using a gpg key that is on computer 1. To be able to access this repository on computer 2 you'll need to either copy the gpg private key from computer 1, or give computer 2 its own key and, on computer 1, add that key as one that can access the webdav repository. +"""]] diff --git a/doc/forum/Special_remote_public_key_encryption_issue/comment_2_adfa582d611ca501e21110282df07315._comment b/doc/forum/Special_remote_public_key_encryption_issue/comment_2_adfa582d611ca501e21110282df07315._comment new file mode 100644 index 000000000..8e2753530 --- /dev/null +++ b/doc/forum/Special_remote_public_key_encryption_issue/comment_2_adfa582d611ca501e21110282df07315._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="hyperio" + ip="62.31.92.216" + subject="Still not working" + date="2014-05-17T12:22:17Z" + content=""" +Thank you for your reply. I copied over the public key from computer 2 to computer 1 and tried to add it using git annex enableremote box.com keyid+=[keyid]. I am then asked for the passphrase for my private key on computer 1. Afterwards I am asked for the passphrase for the private key on computer 2... why? Obviously I don't have it so I get + +gpg: can't query passphrase in batch mode +gpg: decryption failed: secret key not available + +git-annex: user error (gpg [\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--decrypt\"] exited 2) + +Why would I need computer 2's secret key? Or I might just get it completely wrong. +Also, can the passphrase be remembered somewhere, so that I can use the assistant? (otherwise I think it won't work, because I would have to type the passphrase at every synchronisation attempt). + +Sorry for my confusion, thanks for your support. +"""]] diff --git a/doc/forum/Special_remote_public_key_encryption_issue/comment_3_eac16bf98a6e87461ba2f3ab7e990b2b._comment b/doc/forum/Special_remote_public_key_encryption_issue/comment_3_eac16bf98a6e87461ba2f3ab7e990b2b._comment new file mode 100644 index 000000000..692b307b1 --- /dev/null +++ b/doc/forum/Special_remote_public_key_encryption_issue/comment_3_eac16bf98a6e87461ba2f3ab7e990b2b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 3" + date="2014-05-17T17:02:15Z" + content=""" +I dont think it's possible for gpg to prompt for a passphrase when all it has is a public key, so I think you copied the private key too. + +gpg agents can cache your passphrase. +"""]] diff --git a/doc/forum/Special_remote_public_key_encryption_issue/comment_6_097f52aaf178340b3abb5bfc80f0d447._comment b/doc/forum/Special_remote_public_key_encryption_issue/comment_6_097f52aaf178340b3abb5bfc80f0d447._comment new file mode 100644 index 000000000..93fa8b5b9 --- /dev/null +++ b/doc/forum/Special_remote_public_key_encryption_issue/comment_6_097f52aaf178340b3abb5bfc80f0d447._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hyperio" + ip="62.31.92.216" + subject="Still not working" + date="2014-05-17T17:25:39Z" + content=""" +I exported the public key on computer 2 with gpg --armor --export [keyid] and just imported it on computer 1... +"""]] diff --git a/doc/forum/Special_remote_without_chmod.mdwn b/doc/forum/Special_remote_without_chmod.mdwn new file mode 100644 index 000000000..46ace443b --- /dev/null +++ b/doc/forum/Special_remote_without_chmod.mdwn @@ -0,0 +1,12 @@ +Apparently, the tablet computer I'm using (Galaxy Tab 2, non-rooted) does not export the sd cards via mass storage protocol (UMS) any more. In order to be able to use a special remote for my mp3-files, I installed an ftp/ssh server on the tablet device and used curlftpfs/sshfs (fuse file systems) to mount the sd cards on my local Linux machine. In this way, it is is quite easy to setup the special remote (e.g. "git-annex initremote galaxy-tab type=directory directory=$HOME/mnt/galaxy-tab encryption=none"). + +Problems arise, when files are transferred to the special remote. From the logs of the ftp server, I can see that the actual copy operation is successful (the data is written to the file system), but the subsequent "chmod" that changes the permissions to read-only fails. The output on the console of a "git-annex copy -t galaxy-tab" is + + copy 01 some.mp3 (to galaxy-tab...) + failed + git-annex: copy: 1 failed + + +Therefore my question: is it possible to perform a file transfer to a special remote (type=directory) without the final "chmod"-operation? + +Thank you. diff --git a/doc/forum/Special_remote_without_chmod/comment_1_4f5f9506cae72a1f321296fc5a5f339a._comment b/doc/forum/Special_remote_without_chmod/comment_1_4f5f9506cae72a1f321296fc5a5f339a._comment new file mode 100644 index 000000000..225cfa6cb --- /dev/null +++ b/doc/forum/Special_remote_without_chmod/comment_1_4f5f9506cae72a1f321296fc5a5f339a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-25T22:00:12Z" + content=""" +That could be hacked into directory as a configuration setting, but I think it makes more sense to add a proper sftp special remote, and avoid the rather complex stack you're using. +"""]] diff --git a/doc/forum/Ssh_remote_on_NAS.mdwn b/doc/forum/Ssh_remote_on_NAS.mdwn new file mode 100644 index 000000000..27bca5a51 --- /dev/null +++ b/doc/forum/Ssh_remote_on_NAS.mdwn @@ -0,0 +1,34 @@ +Hello, + +I finally have git annex working on my NAS (QNAP TS-119P II) thanks to the stand-alone arm pre-build package. + +I've just extracted all the files on my NAS and I've linked all the exec files from the git-annex.linux folder to links placed in a path folder, so that I can run git annex everywhere on the NAS. + + [~] # git annex version + git-annex version: 5.20140528-g92a0591 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + +Now I'm trying to set it up as an SSH remote of my laptop repository, but I get this error: + + git clone ssh://admin@nas:/share/HDA_DATA/myDir ./ + Cloning into '.'... + admin@nas's password: + sh: git-upload-pack: command not found + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + +I've checked that git-upload-pack is available both on my laptop and on the NAS and the "myDir" folder is supposed to be readable for the admin user on the NAS, even if the user I use on the laptop and on the NAS for git annex is different from the one I use to login. In fact, if I try to scp files from the annex folder then I don't get any permissions error. + + scp admin@192.168.132.66:/share/HDA_DATA/myDir/* ./ + admin@192.168.132.66's password: + doctest 100% 5 0.0KB/s 0.0KB/s 00:00 + doctest2 100% 51 0.1KB/s 0.1KB/s 00:01 + +Is there something else I should look at, in order to fix it and make it work? + +Thanks, +Fabio diff --git a/doc/forum/Ssh_remote_on_NAS/comment_1_1dd8a0d0e70a1fb36fce62e89c99b404._comment b/doc/forum/Ssh_remote_on_NAS/comment_1_1dd8a0d0e70a1fb36fce62e89c99b404._comment new file mode 100644 index 000000000..6563a9bb6 --- /dev/null +++ b/doc/forum/Ssh_remote_on_NAS/comment_1_1dd8a0d0e70a1fb36fce62e89c99b404._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T19:46:05Z" + content=""" +How did you set your PATH? Note that the bash shell provides a lot of dotfiles which you can set the PATH in -- and reuses to read any single one of them when a noninteractive login is made to run a command. + +It might help to install git on the NAS. It's included in the git-annex tarball, but not in a way that will put it on PATH; only in a way that will let git-annex use it. +"""]] diff --git a/doc/forum/Ssh_remote_on_NAS/comment_2_261601313d8825c52322949b8509bc74._comment b/doc/forum/Ssh_remote_on_NAS/comment_2_261601313d8825c52322949b8509bc74._comment new file mode 100644 index 000000000..1cc8fb444 --- /dev/null +++ b/doc/forum/Ssh_remote_on_NAS/comment_2_261601313d8825c52322949b8509bc74._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="feulif" + ip="20.133.1.1" + subject="comment 2" + date="2014-07-15T18:03:56Z" + content=""" +> How did you set your PATH? Note that the bash shell provides a lot of dotfiles which you can set the PATH in -- and reuses to read any single one of them when a noninteractive login is made to run a command. + +Actually I didn't set the PATH: I've just sim-linked executable files from git-annex stand-alone folder to a directory that was in my PATH already. + +> It might help to install git on the NAS. It's included in the git-annex tarball, but not in a way that will put it on PATH; only in a way that will let git-annex use it. + +It was installed, bud I've removed it because it was \"conflicting\" with the one used by git-annex. That is, when I ran any \"git annex ...\" command, git was complaining it could not find git-annex (because my nas was running the installed git binary file). +Without git, I don't have this conflict anymore and I can effectively use git-annex when I'm logged in my NAS, but I still can't add it as an SSH remote. + +"""]] diff --git a/doc/forum/Ssh_remote_on_NAS/comment_3_ed602f4f972b78bce4f62bdfca8cfe47._comment b/doc/forum/Ssh_remote_on_NAS/comment_3_ed602f4f972b78bce4f62bdfca8cfe47._comment new file mode 100644 index 000000000..7ddb9dc8d --- /dev/null +++ b/doc/forum/Ssh_remote_on_NAS/comment_3_ed602f4f972b78bce4f62bdfca8cfe47._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-15T18:55:58Z" + content=""" +I don't think it was a good idea to remove git from the NAS. To set up a git remote, you necessarily need to have git installed on the remote. + +`git annex` should work as long as git-annex is somewhere in PATH -- unless your build of git is very strange and does not check PATH for git-foo commands. +Even if this was the case, you could run `git-annex` instead. +"""]] diff --git a/doc/forum/Standard_groups__47__preferred_contents.mdwn b/doc/forum/Standard_groups__47__preferred_contents.mdwn new file mode 100644 index 000000000..89e2b848c --- /dev/null +++ b/doc/forum/Standard_groups__47__preferred_contents.mdwn @@ -0,0 +1,14 @@ +Sorry that I am not stop asking questions - I am trying to wrap my head around annex still - and I do not fully understand the standard groups/preferred contents yet. + + +First, basic: Is the "preferred content group" an attribute of a repository or of a remote? E.g., when I use assistant, I can set this property for a *remote* repository. Will this property be synced to all other clients then or is it only valid for this particular client? + +Second, I think the standard groups do still not cover what I want and I wonder if this could be done with preferred contents somehow? What I want: + +* Generally only the structure should be synced, no contents (i.e. "manual" is the closest) + +* When I (manually) do "git annex get" on a file this file should be synced whenever it changes locally *or* remotely (until I drop it again). Currently it seems that when it changes remotely, it is "dropped" again so I need to manually use "git annex get" again + +* When I (manually) do "git annex get" on a directory, it should be (recursively) synced whenever it or any file changes locally or remotely (until I drop it again). Currently nothing seems to sync at all in this case (except the meta data) + +Thanks! diff --git a/doc/forum/Starting_assistant_from_CLI.mdwn b/doc/forum/Starting_assistant_from_CLI.mdwn new file mode 100644 index 000000000..8a4bc3d1b --- /dev/null +++ b/doc/forum/Starting_assistant_from_CLI.mdwn @@ -0,0 +1,9 @@ +I am unable to start the git-annex assistant/webapp. + +I use OpenBox as desktop manager and the assistant/webapp is not available through the menu. + +Trying to use the CLI, all my attempts fail with a message saying that it(?) is not a git repository!? Since the video show that on first start the assistant/webapp allows a choice of a directory and then creates it, I am not sure as to what git initialized directory does the assistant/webapp requires in this instance. And I also guess that means invoking the webapp from that directory rather than from the directory that contains the standalone git-annex. + +Any help would be appreciated as git-annex really seems to be the app I am looking for. :) + +Thanks diff --git a/doc/forum/Starting_assistant_from_CLI/comment_1_afd51ddb0f1bb3cac528e1d96829ef83._comment b/doc/forum/Starting_assistant_from_CLI/comment_1_afd51ddb0f1bb3cac528e1d96829ef83._comment new file mode 100644 index 000000000..05c7a12d4 --- /dev/null +++ b/doc/forum/Starting_assistant_from_CLI/comment_1_afd51ddb0f1bb3cac528e1d96829ef83._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2014-04-14T15:35:17Z" + content=""" +running, + + git annex webapp + +should launch the web app. +"""]] diff --git a/doc/forum/Starting_assistant_from_CLI/comment_2_76c34c00cf2065809b15a594023a688b._comment b/doc/forum/Starting_assistant_from_CLI/comment_2_76c34c00cf2065809b15a594023a688b._comment new file mode 100644 index 000000000..d0ce4b28f --- /dev/null +++ b/doc/forum/Starting_assistant_from_CLI/comment_2_76c34c00cf2065809b15a594023a688b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqL3QbH6hrzf4XT-OW5IcMj6zSrMWl2dg" + nickname="Michel" + subject="comment 2" + date="2014-04-14T22:45:23Z" + content=""" +Unfortunately, no, I tried this and many other variants, (I tried again just now, to be sure, and I still get the \"git-annex: Not in a git repository.\" message. + +Thanks for trying to help. It is very much appreciated. + +"""]] diff --git a/doc/forum/Starting_assistant_from_CLI/comment_3_f7826867f78b1adbfc2dad2fad4d6720._comment b/doc/forum/Starting_assistant_from_CLI/comment_3_f7826867f78b1adbfc2dad2fad4d6720._comment new file mode 100644 index 000000000..fbe70c403 --- /dev/null +++ b/doc/forum/Starting_assistant_from_CLI/comment_3_f7826867f78b1adbfc2dad2fad4d6720._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 3" + date="2014-04-17T20:48:56Z" + content=""" +Yes, the webapp is supposed to be able to be started from anywhere. + +1. If you make a git annex repository and run `git annex webapp` from inside it, it'll start up the webapp on that repository. +2. If `~/.config/git-annex/autostart` lists some git repositories, the webapp will start up in the first listed one. +3. Otherwise, the webapp will walk you through making a new repository. + +Most likely problem then is #2. If you used the webapp once, say in ~/annex and then deleted ~/annex/.git directory, it would try to start up in ~/annex, but it's no longer a git repository so it cannot start. This was a bug, so I've fixed it. +You could work around that problem by deleting `~/.config/git-annex/autostart` too. + +If it's some other problem, you can work around it by going the #1 route and making a git repository by hand (\"git init annex; cd annex; git annex init\") and running the webapp in there. +"""]] diff --git a/doc/forum/Starting_assistant_from_CLI/comment_4_fa7055a232a1dcb743db47308f7acf0b._comment b/doc/forum/Starting_assistant_from_CLI/comment_4_fa7055a232a1dcb743db47308f7acf0b._comment new file mode 100644 index 000000000..4eea29c5f --- /dev/null +++ b/doc/forum/Starting_assistant_from_CLI/comment_4_fa7055a232a1dcb743db47308f7acf0b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqL3QbH6hrzf4XT-OW5IcMj6zSrMWl2dg" + nickname="Michel" + subject="comment 4" + date="2014-04-18T00:20:47Z" + content=""" +Thank you. + +The problem was indeed with having a file containing a non-existent ~/.config/git-annex/autostart. + +I can now continue my evaluation of what looks like a very fine and useful piece of software. + +Thanks again for the help. +"""]] diff --git a/doc/forum/Storing_git_repos_in_git-annex.mdwn b/doc/forum/Storing_git_repos_in_git-annex.mdwn new file mode 100644 index 000000000..964040cf0 --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex.mdwn @@ -0,0 +1,27 @@ +I tried to use the [old thread](http://git-annex.branchable.com/forum/Git_repos_in_git_annex__63__/?updated#comment-9fca5cf31ccfd3d78c78cb65f7672340) for this, but threads don't get bumped when they are updated, so I guess I'll have to start a new one... + +Here is the relevant [bug report](http://git-annex.branchable.com/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X). + +Here's my scenario: I have been using Dropbox for several years. I want to move to git-annex. + +For some time I used Bazaar repos inside Dropbox. A couple of times I accidentally modified files on one computer before another finished syncing, and the repo became mildly corrupted, but I recovered it okay. + +Recently I switched from bzr to git, and so far, so good. I'm careful not to make any changes to my files before Dropbox is finished syncing, so everything works fine. + +Now I'm testing git-annex as a replacement for Dropbox again. But when I add a directory containing a git repo to an annex, git-annex ignores the .git directory, so the repo isn't synced. + +I read this forum thread, and I read the bug report, but there don't appear to be any real solutions. + +This seems like what should be a fairly common use case: a user has a directory of simple text files, like shell scripts or org-mode files. He uses git to version-control them, and he uses Dropbox to sync the files and the git repo automatically between computers. Now the user wants to use git-annex instead, but if he does this, it will mean having to choose between: + +* No longer using git to version-control the files +* Only using git on a single system, which means that he can't make commits or do any other git operations when using other systems +* Keeping separate git repos on each system, and making the same commits manually on each one...which would be a mess +* Keeping separate git repos on each system, and using a script to make commits automatically--which would mean commits wouldn't be any more useful than a simple timed backup script + +I guess I could just use git instead of Dropbox or git-annex, but then I must choose between either: + +* Only being able to sync repos when both systems are online +* Having to store repos in plaintext on remote servers + +This is one of my primary use cases for Dropbox/git-annex. I'd really appreciate any help in figuring this out. Thanks. diff --git a/doc/forum/Storing_git_repos_in_git-annex/comment_1_ac7b52c0b0f75d79760ffe6a9b5c8759._comment b/doc/forum/Storing_git_repos_in_git-annex/comment_1_ac7b52c0b0f75d79760ffe6a9b5c8759._comment new file mode 100644 index 000000000..cb5b39ffc --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex/comment_1_ac7b52c0b0f75d79760ffe6a9b5c8759._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T17:29:15Z" + content=""" +Why not just use git the way it's designed: Make a git repository on one computer. Clone to another computer. Commit changes on either whenever you like, and pull/push whenever you like. No need for any dropbox to help git sync, it can do so perfectly well on its own. + +If you have a lot of repositories, see + +I continue to be unimpressed and unmotived by this use case. Posting more forum threads with the same lame reasons won't help. But at least you did say: + +> For some time I used Bazaar repos inside Dropbox. A couple of times I accidentally modified files on one computer before another finished syncing +, and the repo became mildly corrupted, but I recovered it okay. + +> Recently I switched to git, and so far, so good. I'm careful not to make any changes to my files before Dropbox is finished syncing, so everythin +g works fine. + +So, you used dropbox, and corrupted data. But that was ok. And now you're very careful to avoid doing things that will corrupt data. But that's ok. Yeah, that seems like a really good decision, given all the excellent possibilities out there.`` +"""]] diff --git a/doc/forum/Storing_git_repos_in_git-annex/comment_3_3bec1f02ff1a61791e3cbb428c7acb4c._comment b/doc/forum/Storing_git_repos_in_git-annex/comment_3_3bec1f02ff1a61791e3cbb428c7acb4c._comment new file mode 100644 index 000000000..69da79a89 --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex/comment_3_3bec1f02ff1a61791e3cbb428c7acb4c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 3" + date="2014-05-17T00:23:02Z" + content=""" +Well, like Pere, I am rather surprised by your response, Joey. I've been an enthusiastic supporter and follower of git-annex for a long time now, and have been looking forward to using it. I didn't expect a snarky reply...and you said yourself that it was snarky. Maybe you had a bad day or something? :) + +I don't understand why this request or idea is so controversial to you. I have several computers, and I use git to store basic text files like shell scripts and config files--a very common situation. I use Dropbox to sync them automatically between computers. I could use just git, and push/pull manually, but the whole point of having computers is for them to do things for me, automatically. The purpose of the git-annex assistant, as I understand it, is to do exactly that. Doing the push/pull manually would be a step backwards. And giving up manual control of the git repository, losing the ability to track changes to my files, would be a huge step backwards. + +This seems like it must be a very common use case among Linux users, especially ones who use the shell, git, etc. If git-annex isn't good for this situation, what is? Surely there's a better way than opening a shell and running \"git pull\" every time I walk from one computer to the other. +"""]] diff --git a/doc/forum/Storing_git_repos_in_git-annex/comment_4_76ddbd27cc2f3785bb5aaebb0bb6e087._comment b/doc/forum/Storing_git_repos_in_git-annex/comment_4_76ddbd27cc2f3785bb5aaebb0bb6e087._comment new file mode 100644 index 000000000..9d0b024c1 --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex/comment_4_76ddbd27cc2f3785bb5aaebb0bb6e087._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 4" + date="2014-05-17T00:41:04Z" + content=""" +I should have also mentioned, the network topology is an issue that git-annex helps solve. When my computers are on the same LAN, they could obviously sync directly with each other using git. But when they are not on the same network, or when one of them is not online, a transfer repo is needed. Dropbox and git-annex make this simple by handling it for me. + +But if I did all my syncing with git manually, it could end up being quite a mess. If I took my laptop with me and left the house without syncing it first, I'd have to sync with my server on the Internet. But if I forgot to push from my desktop computer before I left, the server would be out-of-date, and I'd be stuck. + +Dropbox handles this for me by automatically syncing as soon as I make changes. git-annex does the same thing, but doesn't work with nested git repos. But giving up the nested git repo would mean giving up version control of my files. As a developer, you understand why that's not an option! :) + +Again, this seems like a very natural problem to run into, and I don't understand why it is controversial to want git-annex to handle this the way Dropbox or other sync software (e.g. SpiderOak, Wuala) can. +"""]] diff --git a/doc/forum/Storing_git_repos_in_git-annex/comment_5_f9520cbc6669622aa342acad35581943._comment b/doc/forum/Storing_git_repos_in_git-annex/comment_5_f9520cbc6669622aa342acad35581943._comment new file mode 100644 index 000000000..95bf6a0d4 --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex/comment_5_f9520cbc6669622aa342acad35581943._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 5" + date="2014-05-18T12:55:47Z" + content=""" +My, 2 cents. I used to do the same keep my git repos in Dropbox. I do not push/pull to dropbox I just keep them in there so they sync between my machines. My use case is that I am in the middle of a change and I need to switch computers (home/office) I can continue where I left of on another machine otherwise you have to make wierd commits with broken code. So IMHO it is perfectly reasonable for a single person to keep his git repo in git-annex assuming I don't use it as a central repo where other people pull push. + +Plus one giant problem with git annex is that there is no way to revert a file in direct repo. It only sync and reverting to old files take a lot of effort (convert to indirect checkout commit save file to a temp location convert back to direct mode place the file back its place.) with a git repo in annex I can just use git to revert files. + +On the other hand, git likes to create a lot of small files and sync them can take a lot of time. annex copies on file at a time. + +That said, at one point I did experiment putting a git repo in annex for testing (using --git-dir option) it did work so it should not be that big of a deal to add the support. +"""]] diff --git a/doc/forum/Storing_git_repos_in_git-annex/comment_9_d5676400e7148b7d3408f2bdb3d54b7d._comment b/doc/forum/Storing_git_repos_in_git-annex/comment_9_d5676400e7148b7d3408f2bdb3d54b7d._comment new file mode 100644 index 000000000..23610fa71 --- /dev/null +++ b/doc/forum/Storing_git_repos_in_git-annex/comment_9_d5676400e7148b7d3408f2bdb3d54b7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="So, you are more clever than your users, isn't?" + date="2014-05-16T18:13:34Z" + content=""" +Joey, your comment is really disappointing. I also use Dropbox as a central git repo and it works great for me. Maybe you find this stupid, but there is a lot of people with good reasons to do so. I agree that this is your software project, thus you have the right not to support this use case, but you don't have the right to treat the users that want this feature as you did in your comment. Next time you do a new crowdfunding campaign, I not sure I'll be between the donors again. +"""]] diff --git a/doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn b/doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn new file mode 100644 index 000000000..e2111f0b9 --- /dev/null +++ b/doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn @@ -0,0 +1,3 @@ +Is there a way to store a file in an annex repo without the assistant trying to commit it? My particular issue is that git annex watch tries to add my .thunderbird folder, and I don't want it in annex. Is that a supported use case? + +Also, for my better understanding, does watch keep track of what files it saw last time and only look for new things on startup? Or does it try to commit anything that's not already in git (whether symlink or not)? diff --git a/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_1_175645a90be0c79221c129308adf643e._comment b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_1_175645a90be0c79221c129308adf643e._comment new file mode 100644 index 000000000..2932efa39 --- /dev/null +++ b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_1_175645a90be0c79221c129308adf643e._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-16T00:10:39Z" + content=""" +wow, are you git annexing your whole home directory? that sounds extreme and problematic, since everything in git annex becomes read-only!! + +This how to make git annex ignore something though: make git ignore it in the first place. + +Stop the git assistant if it's running. + +create a file called \".gitignore\" in the root of your annex directory; add a line to that file for everything you want git (and therefore git annex) to ignore, e.g. \".thunderbird\" + + +e.g.: + + echo '.thunderbird' > '.gitignore' + +check that file into git: + + + git add .gitignore + git commit -m 'check in .gitignore' + +Now you should be able to start up git-annex again and have it ignore .thunderbird, or any other path you put in .gitignore +"""]] diff --git a/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_2_d29f214eadfe3bfd098bbc3bcf07129a._comment b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_2_d29f214eadfe3bfd098bbc3bcf07129a._comment new file mode 100644 index 000000000..395f08d24 --- /dev/null +++ b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_2_d29f214eadfe3bfd098bbc3bcf07129a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="108.92.50.62" + subject="Thanks!" + date="2012-12-16T00:31:09Z" + content=""" +That does what I needed. I'd forgotten about that. :) +"""]] diff --git a/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_3_286b502e7906cca50e9e747db735bc88._comment b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_3_286b502e7906cca50e9e747db735bc88._comment new file mode 100644 index 000000000..f23854cbf --- /dev/null +++ b/doc/forum/Storing_uncontrolled_files_in_an_annex/comment_3_286b502e7906cca50e9e747db735bc88._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 3" + date="2012-12-17T16:32:31Z" + content=""" +AFAIK, the assistant does *not* currently honor .gitgnore completely. There are parts of it that do, and places where running git commands to check .gitignore would be very expensive, and so I've TODOed it for later, as I'll need to write my own .gitignore parser. + +So, use caution.. +"""]] diff --git a/doc/forum/Stupid_mistake:_recoverable__63__.mdwn b/doc/forum/Stupid_mistake:_recoverable__63__.mdwn new file mode 100644 index 000000000..8e25d7081 --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__.mdwn @@ -0,0 +1,31 @@ +Hi, + +I was a bit hasty the other day and did something stupid. I +added a new folder to git annex. Something like + + git annex add my-important folder + +my-important folder contains a lot of files and it took a couple +of minutes to add. When I then tried to do + + git commit -am 'added files' + +per the walkthrough I got an error (9, as I recall). I thought +I'd added too many files or something so I wanted to start over +and perhaps I didn't fully understand the mechanisms of annex I +did the following + + git reset --hard . + +Unfortunately, did replaced my files with a bunch of symlinks, +rather than making git annex forget and go back to the previous +stage as I had hoped. + +I have managed to recover most of my files from backup, but some +of them I still can't recover. Is there any way back? It seems +I still have the files in my git folder. + +Thanks, +Rasmus + +PS: Sorry, I shouldn't have made this text rather than Markdown. diff --git a/doc/forum/Stupid_mistake:_recoverable__63__/comment_1_00ceb3a5e37825c4bbc806f532893706._comment b/doc/forum/Stupid_mistake:_recoverable__63__/comment_1_00ceb3a5e37825c4bbc806f532893706._comment new file mode 100644 index 000000000..ebc8073f7 --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__/comment_1_00ceb3a5e37825c4bbc806f532893706._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-01T18:24:20Z" + content=""" +The file contents are still there in `.git/annex/objects/`. + +When I run `git reset --hard`, it deletes any files that have been added, but not committed. You say you still have symlinks to the content. If so, you can just `git add` the symlinks and be back how git-annex wants things to be. + +If, instead, you are missing the symlinks, then since you never committed the symlinks to git, there is no record anywhere in git of the filenames that go with the file contents. + +What you can do is ask git-annex to put back symlinks to the file contents: + +
+git annex unused
+git annex addunused 1-10000
+
+ +This will make you have a bunch of files in the repository with names starting with \"unused\". You can then rename them manually. + +BTW, I would of course be interested in any error message from `git commit`. +"""]] diff --git a/doc/forum/Stupid_mistake:_recoverable__63__/comment_2_cbedc29678d9b6af3b3c0bb1915d2391._comment b/doc/forum/Stupid_mistake:_recoverable__63__/comment_2_cbedc29678d9b6af3b3c0bb1915d2391._comment new file mode 100644 index 000000000..f552cfb18 --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__/comment_2_cbedc29678d9b6af3b3c0bb1915d2391._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Rasmus" + ip="213.120.148.111" + subject="comment 2" + date="2013-04-01T23:23:55Z" + content=""" +Joey, + +Thanks for your useful tips and for providing this software. It seems incredibly powerful and useful. I made a copy of the folder which I messed up. I will try the tips and report back (I'm on the road right now). + +The other day all the Haskell deps worked out and I managed to build git annex. Hopefully, this will give more reliable results as it seemed that some of my bugs were caused by the 32bit prebuild on 64bit. If I succeed in recreating my files I will try to recreate the error :) +"""]] diff --git a/doc/forum/Stupid_mistake:_recoverable__63__/comment_3_86aa4d92a1330811862da1ba568b3037._comment b/doc/forum/Stupid_mistake:_recoverable__63__/comment_3_86aa4d92a1330811862da1ba568b3037._comment new file mode 100644 index 000000000..b642cde98 --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__/comment_3_86aa4d92a1330811862da1ba568b3037._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="Rasmus" + ip="213.120.148.111" + subject="comment 3" + date="2013-04-02T23:25:45Z" + content=""" +Joey, + +Sorry for asking again, but I haven't been able to resolve this using the symlinks. + +Consider this file + + ElgarCEH.pdf -> ../.git/annex/objects/g6/q8/SHA256E-759787--3ec5f8d64cc4f84dec74ed7f0f7a640b3e672a03faf0f5fc3daf0b823d596f03.pdf/SHA256E-759787--3ec5f8d64cc4f84dec74ed7f0f7a640b3e672a03faf0f5fc3daf0b823d596f03.pdf + +The file that the symlink points to doesn't exist. I'm not sure it should. The file with {.map,.cahce} extensions does exist, in this case + + sh>ls ../.git/annex/objects/g6/q8/SHA256E-s759787--3ec5f8d64cc4f84dec74ed7f0f7a640b3e672a03faf0f5fc3daf0b823d596f03.pdf/ + SHA256E-s759787--3ec5f8d64cc4f84dec74ed7f0f7a640b3e672a03faf0f5fc3daf0b823d596f03.pdf.cache + SHA256E-s759787--3ec5f8d64cc4f84dec74ed7f0f7a640b3e672a03faf0f5fc3daf0b823d596f03.pdf.map + +The content of the .cache file is + + 1703824 411810 1350480334 + +and the content of the .map file is + + documents/ElgarCEH.pdf + +However, for all of the following + + git add ElgarCEH.pdf + git add --force ElgarCEH.pdf + git annex add ElgarCEH.pdf + +the files are not staged, and I get the message usual + + no changes added to commit. + +with `git log`. + +So do I need to something more in order to get `git` to add my symlinks? +"""]] diff --git a/doc/forum/Stupid_mistake:_recoverable__63__/comment_4_6d15bf8a3c3c27cc92957070161675a9._comment b/doc/forum/Stupid_mistake:_recoverable__63__/comment_4_6d15bf8a3c3c27cc92957070161675a9._comment new file mode 100644 index 000000000..97a4cd0db --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__/comment_4_6d15bf8a3c3c27cc92957070161675a9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-02T23:39:48Z" + content=""" +If you `git add` a file and `git commit` says \"no changes added to commit\", what would you think would be the reason? + +I'd think it was because the file was already committed to git. So that must be the case with your symlink. + +You seem to have told git-annex to do something to the content of that file. You could use `git annex whereis` to find where it is, or `git annex get` to get it. (Assuming you have not used `git annex drop --force` on the file to nuke its content earlier.) +"""]] diff --git a/doc/forum/Stupid_mistake:_recoverable__63__/comment_5_f836b9b1d03d94c49e3798961790b2ba._comment b/doc/forum/Stupid_mistake:_recoverable__63__/comment_5_f836b9b1d03d94c49e3798961790b2ba._comment new file mode 100644 index 000000000..d28c247e1 --- /dev/null +++ b/doc/forum/Stupid_mistake:_recoverable__63__/comment_5_f836b9b1d03d94c49e3798961790b2ba._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="Rasmus" + ip="213.120.148.111" + subject="comment 5" + date="2013-04-03T00:45:05Z" + content=""" +> [links not being added]. +Right. Obliviously. Sorry. + + +I think the problem is more severe as all of the files have somehow ended up in the .git/objects folder. I have no idea how, but I have been unsuccessful with both methods (the second methods gives me + + getFileStatus: does not exist (No such file or directory) + +which I guess is related to the fact that my files somehow ended up in the git objects folder rather than the git annex objects folder. + +I appreciated the help. + +Cheers, +Rasmus +"""]] diff --git a/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version.mdwn b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version.mdwn new file mode 100644 index 000000000..1f8730514 --- /dev/null +++ b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version.mdwn @@ -0,0 +1,9 @@ +Hi! + +Just tried various android ssh servers which do work, but have no access to the command line tools shipped with git annex. + +From what I gather from the planning docs, sshd was stripped from the android tools to save space. If this were the case, it (naively) seems to me it would have to be simple to re-enable. + +Rationale: It would make it super convenient to use command line git annex on my phone alongside the assistant, through letting me type on my desktop. Not to mention that the command line tools shipped with git annex are by far the best around for android work. + +Carlo diff --git a/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_1_5c2f376a82458c6387560355940419d3._comment b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_1_5c2f376a82458c6387560355940419d3._comment new file mode 100644 index 000000000..9a39a2e4c --- /dev/null +++ b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_1_5c2f376a82458c6387560355940419d3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T19:42:13Z" + content=""" +sshd was removed from the bundle because it's not needed for git-annex to be used on Android, and it would be very complicated to get it to work. (And would require rooting the device at least for port 22 and probably also since sshd needs to run as root generally.) + +If there are android ssh servers that let you choose which user to log in as, you could log in as the app_NN user corresponding to the git-annex android app, and have all the tools available, once you ran runshell. I belive there's also an equivilant to su on android that lets you change to an app_NN user, although you probably already need root. + +I think it's more usual to use adb in these situations. +"""]] diff --git a/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_2_6321dec0b2f22f841f3cb986e063113f._comment b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_2_6321dec0b2f22f841f3cb986e063113f._comment new file mode 100644 index 000000000..b1ce5a1a5 --- /dev/null +++ b/doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_2_6321dec0b2f22f841f3cb986e063113f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 2" + date="2013-11-03T09:48:53Z" + content=""" +Ah, the \"very complicated to get it to work\" part is what I didn't know, thanks for explaining and or the tips. +"""]] diff --git a/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo.mdwn b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo.mdwn new file mode 100644 index 000000000..223e5eaed --- /dev/null +++ b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo.mdwn @@ -0,0 +1,7 @@ +I work in a distributed startup. We have a master repository on GitHub. At the office we have modern hunky Linux desktops (seriously more powerful than any of our laptops). + +I (and others) have hard deadlines at the end of the day (typically child commitments). If I leave from a meeting or brainstorming session without having pushed all of my work into the cloud then I cannot continue working from home. This is because our office is behind multiple levels of NAT over which we have no control. Hence I am unable to remote into my machine in order to push work up to GitHub or scp it to my laptop. + +Is there a way to get git-annex to sync only files that do not correspond to git objects available from our GitHub repository? Because our source tree is quite large (2.5GB including tests and test data) I would not want git-annex to sync the entire tree. And when I checkout a different branch I would not want git-annex to sync all changes between the previously checked-out branch and the new branch. Rather I would like git-annex to discard any previously synced objects, note the identity of the new branch and the values of all files (object) not available from the upstream state of that branch on GitHub. + +Thanks in advance for any suggestions. diff --git a/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_1_b31d02c97447996495de73705ac39f71._comment b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_1_b31d02c97447996495de73705ac39f71._comment new file mode 100644 index 000000000..b7f343b13 --- /dev/null +++ b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_1_b31d02c97447996495de73705ac39f71._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="gjost" + ip="75.140.92.244" + subject="comment 1" + date="2014-05-20T15:19:35Z" + content=""" +> If I leave from a meeting or brainstorming session without having pushed all of my work into the cloud then I cannot continue working from home. This is because our office is behind multiple levels of NAT over which we have no control. Hence I am unable to remote into my machine in order to push work up to GitHub or scp it to my laptop. + +This is not a git-annex solution, but you could use Pagekite to SSH to your work machine from home. + + +"""]] diff --git a/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_2_098465ae8af32931779d2cd63750d5dc._comment b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_2_098465ae8af32931779d2cd63750d5dc._comment new file mode 100644 index 000000000..95a8721df --- /dev/null +++ b/doc/forum/Sync_only_what_is_not_available_from_my_central_git_repo/comment_2_098465ae8af32931779d2cd63750d5dc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 2" + date="2014-05-21T18:11:45Z" + content=""" +It seems to me that simply running `git annex sync --content` before you go home would do what you need. Have you tried using git-annex? + +Some of the things you're saying don't entirely make sense to me, and so I suspect you're perhaps worrying about problems that don't exist, or that git-annex deals with nicely. +"""]] diff --git a/doc/forum/Sync_with_one_offline_peer.mdwn b/doc/forum/Sync_with_one_offline_peer.mdwn new file mode 100644 index 000000000..6ee05c6e6 --- /dev/null +++ b/doc/forum/Sync_with_one_offline_peer.mdwn @@ -0,0 +1,11 @@ +Hello, + +I use the assistant to set up two repositories A and B synced using jabber. A third repository C on my server is used as rsync transfer. Syncing works fine between both repos when both are online. + +But when either A or B is offline the sync does not happen when it comes online again, though the file was synced to C. + +Is this because C is only a rsync repository and can't hold metadata? How can I achieve that the sync happens also when one of the repositories is offline? + +I also tried using the static build of git annex on my server. It seemed to run fine but during the setup the assistant got an error about too many command line arguments. On A und B I use the ArchLinux AUR build (https://aur.archlinux.org/packages/git-annex-standalone/), on C I use the static build. Could it be a version mismatch? + +Thanks! diff --git a/doc/forum/Sync_with_one_offline_peer/comment_1_3859d842d4f7e2ef44877b05ebe881fb._comment b/doc/forum/Sync_with_one_offline_peer/comment_1_3859d842d4f7e2ef44877b05ebe881fb._comment new file mode 100644 index 000000000..5fe670d35 --- /dev/null +++ b/doc/forum/Sync_with_one_offline_peer/comment_1_3859d842d4f7e2ef44877b05ebe881fb._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 1" + date="2013-09-09T21:49:17Z" + content=""" +Another try on the layout: + +Hello, + +I use the assistant to set up two repositories A and B synced using jabber. A third repository C on my server is used as rsync transfer. Syncing works fine between both repos when both are online. + +But when either A or B is offline the sync does not happen when it comes online again, though the file was synced to C. + +Is this because C is only a rsync repository and can't hold metadata? How can I achieve that the sync happens also when one of the repositories is offline? + +I also tried using the static build of git annex on my server. It seemed to run fine but during the setup the assistant got an error about too many command line arguments. On A und B I use the ArchLinux AUR build (https://aur.archlinux.org/packages/git-annex-standalone/), on C I use the static build. Could it be a version mismatch? + +Thanks! +"""]] diff --git a/doc/forum/Sync_with_one_offline_peer/comment_2_c9ba3983b37b0c1868269616fd81e518._comment b/doc/forum/Sync_with_one_offline_peer/comment_2_c9ba3983b37b0c1868269616fd81e518._comment new file mode 100644 index 000000000..20b82dd3e --- /dev/null +++ b/doc/forum/Sync_with_one_offline_peer/comment_2_c9ba3983b37b0c1868269616fd81e518._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 2" + date="2013-09-12T21:13:36Z" + content=""" +Yes, the rsync repository is not a git repository and so does not hold metadata. If you can install git-annex on your server, you can add a regular git repository there, and then the clients can sync to it even when the other is offline. + +This is also why I an working on adding support for [[special_remotes/gcrypt]] repositories, so you can have a fully encrypted git repository on the server and sync through that. + +> during the setup the assistant got an error about too many command line arguments + +I have never heard about such a problem. You should file a bug report with the details. +"""]] diff --git a/doc/forum/Sync_with_one_offline_peer/comment_3_28b9c003b4560c3ce90c9ebf808b091b._comment b/doc/forum/Sync_with_one_offline_peer/comment_3_28b9c003b4560c3ce90c9ebf808b091b._comment new file mode 100644 index 000000000..332cd83c3 --- /dev/null +++ b/doc/forum/Sync_with_one_offline_peer/comment_3_28b9c003b4560c3ce90c9ebf808b091b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 3" + date="2013-09-13T10:52:33Z" + content=""" +Thanks for your reply. The bug report is at + +I'll be happy to provide any more help if I can! +"""]] diff --git a/doc/forum/Sync_without_jabber_account.mdwn b/doc/forum/Sync_without_jabber_account.mdwn new file mode 100644 index 000000000..b459f3310 --- /dev/null +++ b/doc/forum/Sync_without_jabber_account.mdwn @@ -0,0 +1,9 @@ +Hi, + +It is possible to keep devices sync only using a box.com account as a transfer remote, without Jabber? I can't use Jabber because of firewall restrictions. + +It would be nice to be able to use the transfer remote, in my case box.net, as the sync "provider", for example by polling a file with the needed changes in a pre-defined interval. + +Regards, + +Stone diff --git a/doc/forum/Sync_without_jabber_account/comment_1_3e95ac2e67451f953cf0538094109f8b._comment b/doc/forum/Sync_without_jabber_account/comment_1_3e95ac2e67451f953cf0538094109f8b._comment new file mode 100644 index 000000000..1a601848c --- /dev/null +++ b/doc/forum/Sync_without_jabber_account/comment_1_3e95ac2e67451f953cf0538094109f8b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T19:06:59Z" + content=""" +We don't currently have a way to store a git repository on box.com, and you need such a git repo on a server somewhere if you're not using Jabber. + +Of course you can mount the box.com, using either davfs2 or something else, and put a bare git repository in its directory, and if you set this up on multiple computers, it might just work (or they might both try to write to it at the same time and fail.. I have not tried). +"""]] diff --git a/doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn b/doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn new file mode 100644 index 000000000..71de3ee7c --- /dev/null +++ b/doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn @@ -0,0 +1,10 @@ +Hi, + +i'm thinking to use git-annex to synchronize my virtual machine directory (Virtualbox) between 3 pc. It's quite big: more than 200GB and some of the images are 40Gb in size. + +The synchronization will be over a lan (obviously). It is already in place with 2pc and unison but the configuration of the 3rd pc is cumbersome. +Does anybody have experiences with git-annex and such amount of data? + +Thanks in advance + +Gabriele diff --git a/doc/forum/Synchronize_large_files___40__VM_images__41__/comment_1_619f6ed2d7da5832ab253d61b6dd8044._comment b/doc/forum/Synchronize_large_files___40__VM_images__41__/comment_1_619f6ed2d7da5832ab253d61b6dd8044._comment new file mode 100644 index 000000000..292ee3b7b --- /dev/null +++ b/doc/forum/Synchronize_large_files___40__VM_images__41__/comment_1_619f6ed2d7da5832ab253d61b6dd8044._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-28T18:01:31Z" + content=""" +This volume of data should be no problem for git-annex. + +The only catch would be if you're running those VM images and want to sync them as they're changed. With git-annex, you'd need to `git annex unlock` a file to allow it to be modified, and then `git annex add` it back and commit changes made to it. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks.mdwn b/doc/forum/Syncing_machines_on_different_networks.mdwn new file mode 100644 index 000000000..6851a6c01 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks.mdwn @@ -0,0 +1,9 @@ +I've been using git-annex locally for a couple months. So far I've only used it to keep track of files on my laptop and local usb hard drives. Now I would like to add a network into the picture, and hopefully start to move away from Dropbox. + +I have Dropbox on two computers: my home machine and my work machine. The home machine is only on when I'm at home and the work machine is only on when I'm at work, so the computers are never on at the same time and thus can never communicate directly. What are my options for keeping annexes on these two machines in sync? + +Initially I was hoping that I could use an S3 special remote for this, but I see that special remotes only hold the actual file data, not any of the git stuff. So I can't push my changes to S3 at work and then pull those changes in at home. + +From what I can tell from the documentation, the only way I can handle this problem is to have an annex sitting on a VPS or someplace that both my home and work machines can talk to. Is that correct? That would be ok, but if I'm going to put my annex out there in the cloud somewhere, I want the files to be encrypted. It looks like git-annex only supports encryption of file data with special remotes, not a full annex. Is there no way to have some sort of encrypted git-annex hub? + +I backed the assistant and have been following the development blog, but I haven't tried it out yet. Am I correct in thinking that nothing in the assistant will address this particular issue? diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_1_1c3523c722c178a96b096a68b9be4165._comment b/doc/forum/Syncing_machines_on_different_networks/comment_1_1c3523c722c178a96b096a68b9be4165._comment new file mode 100644 index 000000000..dcc59017b --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_1_1c3523c722c178a96b096a68b9be4165._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2012-11-02T07:21:15Z" + content=""" +I might be thinking too simple, but can't you just put another annex repository on an usbdrive and use it to carry the metadata around? Add it as a remote to both compuers annex repositories and sync when you come/leave. As it does not have to carry the actual data some 100M will usually suffice. Just don't use any special remotes, but simply a cloned git repository. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_2_d7b14ffee65072329cfe9ab08a0dba50._comment b/doc/forum/Syncing_machines_on_different_networks/comment_2_d7b14ffee65072329cfe9ab08a0dba50._comment new file mode 100644 index 000000000..6f0f04496 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_2_d7b14ffee65072329cfe9ab08a0dba50._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.40.225" + subject="comment 2" + date="2012-11-02T19:41:27Z" + content=""" +That's what I've started to do. It gets the job done, but I don't like that I have to remember to plug in the stick and sync to it at the end of the work day, and then plug in the stick and sync from it when I get home. I'm hoping that there is some way to accomplish the syncing automagically, more akin to the Dropbox experience. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment b/doc/forum/Syncing_machines_on_different_networks/comment_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment new file mode 100644 index 000000000..2fa7ac055 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 3" + date="2012-11-04T19:44:11Z" + content=""" +You need two things: + +1. A special remote in the cloud. S3, or rsync.net, or whatever. +2. A git repository hosted in the cloud. You could just use github (paying them if you want to avoid it being public). + +Is it possible to have an encrypted git remote repository? It's not directly supported by git. The way git needs to be able to request arbitrary objects by SHA, kind of prevents encrypting things to any useful level. The only way I can think of to do that would be to use some cloud storage that can be mounted as a filesystem, and store an encrypted filesystem containing the git repo in a file inside that. Not easy. + +The git-annex assistant is going to get around this by not requiring a central git repository and transferring git data peer-to-peer, but that will require both the peers be on the network at the same time. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_4_2ec67428af69d6c0ea051c6a67d58905._comment b/doc/forum/Syncing_machines_on_different_networks/comment_4_2ec67428af69d6c0ea051c6a67d58905._comment new file mode 100644 index 000000000..34d37ce4f --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_4_2ec67428af69d6c0ea051c6a67d58905._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.40.225" + subject="comment 4" + date="2012-11-05T02:07:00Z" + content=""" +Thanks for the feedback. + +I'm thinking the smartest move will be for me to invest in some sort of wall-wart, like a SheevaPlug or RasberryPi. I can use that as the centralized hub and still avoid putting my files on the big bad interwebs. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment b/doc/forum/Syncing_machines_on_different_networks/comment_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment new file mode 100644 index 000000000..c3d9d52b2 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 5" + date="2012-11-05T06:43:25Z" + content=""" +Just a small add-up: I've already used a truecrypt volume file on a dropbox successfully, although not for a git repository. Maybe that's worth a try. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_6_a55982c28d7b90e0b70ec2bb5e594e08._comment b/doc/forum/Syncing_machines_on_different_networks/comment_6_a55982c28d7b90e0b70ec2bb5e594e08._comment new file mode 100644 index 000000000..d5ccdcf87 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_6_a55982c28d7b90e0b70ec2bb5e594e08._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="24.16.193.140" + subject="comment 6" + date="2012-11-05T17:20:50Z" + content=""" +Right now I use Dropbox with encfs. I could do the same thing with git-annex, but it's kind of a hassle. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_7_c519d546e1a2a4e834609f3de3a605b0._comment b/doc/forum/Syncing_machines_on_different_networks/comment_7_c519d546e1a2a4e834609f3de3a605b0._comment new file mode 100644 index 000000000..ea4aeeaf2 --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_7_c519d546e1a2a4e834609f3de3a605b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Quick Cloud Tip" + date="2012-11-21T13:16:54Z" + content=""" +If you have broadband, get a raspberry pi and hook up a thumb drive. Then allow ssh access through your router for really cheap cloud storage. +"""]] diff --git a/doc/forum/Syncing_machines_on_different_networks/comment_8_84a822238ddbaf211cce5f527c3559d3._comment b/doc/forum/Syncing_machines_on_different_networks/comment_8_84a822238ddbaf211cce5f527c3559d3._comment new file mode 100644 index 000000000..78c3190db --- /dev/null +++ b/doc/forum/Syncing_machines_on_different_networks/comment_8_84a822238ddbaf211cce5f527c3559d3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="s3ql" + date="2012-11-29T17:58:35Z" + content=""" +I am achieving success on this issue using afuse to automatically mount an s3ql volume. Though of course you have to manually push and pull from the git repo. +"""]] diff --git a/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__.mdwn b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__.mdwn new file mode 100644 index 000000000..9315d9218 --- /dev/null +++ b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__.mdwn @@ -0,0 +1,4 @@ +I created an "full archive" repo on my local pc and an encrypted "full backup" repo on Box.com. I 'm copying files on the local repo and they are getting encrypted and uploaded to Box. Superb so far :) + +What I am wondering though is, suppose my local pc dies. How do I get the data out of Box unencrypted from a new pc? + diff --git a/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment new file mode 100644 index 000000000..5a5ec3589 --- /dev/null +++ b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-09-22T21:18:17Z" + content=""" +Just clone the repository on another computer or usb drive and enable box.com remote as long as you have the clone of the repo you can download your files back. +"""]] diff --git a/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_2_25cbdf478091af9923090e049c432a7d._comment b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_2_25cbdf478091af9923090e049c432a7d._comment new file mode 100644 index 000000000..69db183e2 --- /dev/null +++ b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_2_25cbdf478091af9923090e049c432a7d._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="John" + ip="109.242.130.160" + subject="comment 2" + date="2013-09-22T22:20:22Z" + content=""" +Thank you Hamza! + +I 'm new on git, so please excuse my trivial questions: + +a) I am using the git-annex assistant, is it something I can do from there or is it command line only? +I googled a bit and from what I can tell, I should make a directory on the usb drive, go there and do +> $ git clone /path/to/fullArchiveRepo + +Would that be correct? + +b) Assuming I 've done it correctly, then I put the USB on a drawer and leave it there for a month. In the meantime, I 've been using the repo on my pc and more files have been archived encrypted on Box.com. Then my local pc dies. When I plug the usb on the new pc, will I be able to recover all the encrypted files, or only those up to 1 month ago? + +c) What is the proper process to use the cloned repo on a new pc? Plug the usb drive, open the git-annex assistant and go through the \"create new repo\" but use the path for the existing repo on the usb? Then add another repo from Box (with the same account and the same directory there? Would that work? + +Thank you for your time & knowledge! :) +"""]] diff --git a/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_3_7e71d355457d6b1a0391d4cdae6895e6._comment b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_3_7e71d355457d6b1a0391d4cdae6895e6._comment new file mode 100644 index 000000000..81de3fc45 --- /dev/null +++ b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_3_7e71d355457d6b1a0391d4cdae6895e6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 3" + date="2013-09-23T00:34:24Z" + content=""" +I do not use the assistant I prefer command line but try adding an USB drive (last I used it it had the option) It should do the clone and init it check the resulting folder if it contains a .git/ folder you have a clone of your git repo. + +a) For manual cloning follow http://git-annex.branchable.com/walkthrough/adding_a_remote/ + +b) you need to keep syncing to the clone too. asistant should automatically sync to that repo. AFAIK asisstant detects when the usb repo is plugged and automatically syncs to it (again I do not use it but I seem to remember one of joey's talks showing that. YMMV) + +If you lose all your repos then you lose the keys to un encrypt files they are gone!, if you have a outdated repo you can get the files back using the key stored in it but without the directory structure. + +Correct workflow depends on how you use annex. I sync 3 computers with annex so if one dies I can clone the repo from another one. But if you are only using it on a single computer I would use a clone on an external usb drive that is always connected, so you have two clones one on the internal disk and one on the external disk so you can survive one of the drives crashing. +"""]] diff --git a/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_4_a73f67f2fcf0762fbd7c8366b3844af6._comment b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_4_a73f67f2fcf0762fbd7c8366b3844af6._comment new file mode 100644 index 000000000..7e649f858 --- /dev/null +++ b/doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_4_a73f67f2fcf0762fbd7c8366b3844af6._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 4" + date="2013-09-23T20:18:38Z" + content=""" +Other good options to supplement an offline backup drive: + +* A clone of the repository on another computer of yours, or on an Adroid tablet or phone. +* An encrypted git repository stored on a remote ssh server. (Supported by recent git-annex releases, although the assistant does not yet have a UI to set this up it's not very hard to do it manually at the command line and then the assistant will use it.) +"""]] diff --git a/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn new file mode 100644 index 000000000..988ec3029 --- /dev/null +++ b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn @@ -0,0 +1,11 @@ +Hello Joey, + +I just want to know if file transfers between three inter-connected repositories somehow gets syncronized. I have a laptop, a local file server in my home and a virtual server on the internet. + +Both my laptop and my file server are configured with a full git repository and connected through pairing and xmpp. The server on the internet is configured as a rsync special remote. + +I want the local file server to hold a copy of everything in my annex, the rsync remote should get everything except the folder "media" (too large to upload and not that important) and the laptop whatever I manually decide (preferred content is set to "present"). + +I have added some files to the repository on the local file server and transferred their content to my laptop by using "git annex get". But when I started the web interface, I saw that those files who are present on both the file server and on the laptop get uploaded to the remote server from both computers, often the same file at the same time. Previously I though the two assistants would somehow talk to each other via xmpp so that doubled effort like that would be avoided. I'm also worried about data consistency because two apparently separate processes rsync to the same remote repository at the same time. + +So my question would be: Is your xmpp protocol designed to deal with situations like this and I did not set it up correctly or is what I'm trying to accomplish simply not (yet) possible? diff --git a/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__/comment_1_ca5192a26950627a1c2efcb55d6d2fa3._comment b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__/comment_1_ca5192a26950627a1c2efcb55d6d2fa3._comment new file mode 100644 index 000000000..dccd1d8d5 --- /dev/null +++ b/doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__/comment_1_ca5192a26950627a1c2efcb55d6d2fa3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:22:33Z" + content=""" +git-annex does not currently prevent multiple uploads of the same file to a rsync special remote. It is able to guard against this when uploading to a git remote, since then the remote runs git-annex-shell, which can detect when an upload is already running. You might want to convert your rsync remote to a git remote. + +I hope that rsyncing the same file twice at the same time is safe, but it's certainly excessively expensive. +"""]] diff --git a/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__.mdwn b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__.mdwn new file mode 100644 index 000000000..627e3b736 --- /dev/null +++ b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__.mdwn @@ -0,0 +1,3 @@ +Sometimes I'm doing something crazy like working in a large GIMP file, and I just want to be able to keep "committing" the changes to the annex but I hate running into the problem of having to keep unlocking the file over and over again while saving. I guess one solution to this might be to use git-annex assistant? But I'm not sure I really want a daemon running, and I don't want this auto-added... I just want to be able to leave the file unlocked while I'm actively working on it, then eventually say "I'm done with this!" and set it back to a state where it's locked. + +Basically, I hate running into "permission denied" errors all the time when I'm saving! I guess I could do some sort of command where I commit to the annex and then immediately unlock again... is there a better way? diff --git a/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_1_3cbe520b184d323219cb402ff046c3b4._comment b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_1_3cbe520b184d323219cb402ff046c3b4._comment new file mode 100644 index 000000000..fac362892 --- /dev/null +++ b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_1_3cbe520b184d323219cb402ff046c3b4._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://identi.ca/cwebber/" + nickname="cwebber" + subject="Reasonable solution?" + date="2012-11-27T21:24:49Z" + content=""" +I think I have built a reasonable solution... this function checks a specific file into git and then immediately unlocks it. + + function git-annex-unlocked-commit { + if [ $# -ne 2 ]; then + echo \"Wrong number of args.\" + return 1 + fi + + if [ ! -e \"$1\" ]; then + echo \"Need a filename!\" + return 1 + fi + + read -p \"Really do an unlocked commit? (y/n): \" + if [ \"$REPLY\" == \"y\" ]; then + git commit $1 -m \"$2\" && git annex unlock $1 + fi + } + +Use it like: + + git-annex-unlocked-commit mediagoblin_postcard.xcf \"Starting to fill in spencer\" +"""]] diff --git a/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_2_6afe7f593e955db2eefe87d9fa01882b._comment b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_2_6afe7f593e955db2eefe87d9fa01882b._comment new file mode 100644 index 000000000..c515372b1 --- /dev/null +++ b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_2_6afe7f593e955db2eefe87d9fa01882b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 2" + date="2012-11-27T21:27:33Z" + content=""" +The only thing I would do differently is \"git annex add\" the file before \"git commit\". This is more efficient for large files since it avoids git looking at the whole file content. +"""]] diff --git a/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_3_209399487fc4f76b29f03ad82dbc2d6f._comment b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_3_209399487fc4f76b29f03ad82dbc2d6f._comment new file mode 100644 index 000000000..c59c7fe6f --- /dev/null +++ b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_3_209399487fc4f76b29f03ad82dbc2d6f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://identi.ca/cwebber/" + nickname="cwebber" + subject="comment 3" + date="2012-11-27T21:30:11Z" + content=""" +Just in case, since I don't see licensing stuff on this wiki: copyright to that code waived under CC0. :) http://creativecommons.org/publicdomain/zero/1.0/ +"""]] diff --git a/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_4_f33fd6f72cb9ad7dd20a04c82199413b._comment b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_4_f33fd6f72cb9ad7dd20a04c82199413b._comment new file mode 100644 index 000000000..ba6baad91 --- /dev/null +++ b/doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_4_f33fd6f72cb9ad7dd20a04c82199413b._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://identi.ca/cwebber/" + nickname="cwebber" + subject="comment 4" + date="2012-11-27T23:58:10Z" + content=""" +Ah, thanks Joey... here's an updated version: + + function git-annex-unlocked-commit { + if [ $# -ne 2 ]; then + echo \"Wrong number of args.\" + return 1 + fi + + if [ ! -e \"$1\" ]; then + echo \"Need a filename!\" + return 1 + fi + + read -p \"Really do an unlocked commit? (y/n): \" + if [ \"$REPLY\" == \"y\" ]; then + git add $1 && git commit $1 -m \"$2\" && git annex unlock $1 + fi + } + +"""]] diff --git a/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn new file mode 100644 index 000000000..898d4870a --- /dev/null +++ b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn @@ -0,0 +1 @@ +In my documents folder I have some Mercurial and Git repositories. Are there any side effects if I track the whole directory with git annex? diff --git a/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_1_9fc3f6c2f7379755e0084a850fa9acd4._comment b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_1_9fc3f6c2f7379755e0084a850fa9acd4._comment new file mode 100644 index 000000000..c61ea9a4d --- /dev/null +++ b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_1_9fc3f6c2f7379755e0084a850fa9acd4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-27T19:05:59Z" + content=""" +I don't recommend using git-annex that way. + +.git directories cannot be checked into git, so will just be skipped. A hg repository will be checked in, but you can get into all kinds of bad situations if making commits to the \"same\" hg repository in two different locations. You will end up having to manually resolve conflicted merges to the files used by your distributed version control system, which defeats the point of using distributed version control. +"""]] diff --git a/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_2_f024d6a105143af1e06aafe49661ee06._comment b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_2_f024d6a105143af1e06aafe49661ee06._comment new file mode 100644 index 000000000..50b94ffaf --- /dev/null +++ b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_2_f024d6a105143af1e06aafe49661ee06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="Thanks!" + date="2013-12-27T20:02:20Z" + content=""" +Ok, I feared that answer. I'll have to change my directory structure. +"""]] diff --git a/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_3_aff0093c38bda8b093f05e8cbe8775e9._comment b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_3_aff0093c38bda8b093f05e8cbe8775e9._comment new file mode 100644 index 000000000..7108ddea3 --- /dev/null +++ b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_3_aff0093c38bda8b093f05e8cbe8775e9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2013-12-27T20:08:07Z" + content=""" +Well, you can always use .gitignore to ignore the whole content of the directory that you don't want git-annex to handle. +"""]] diff --git a/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment new file mode 100644 index 000000000..55f9f2534 --- /dev/null +++ b/doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" + nickname="Charl" + subject="use case: changing workstations mid-way through development session" + date="2014-03-23T21:22:15Z" + content=""" +An important use case for me with automatic synchronization, is being able to change computers mid-way through a development session. I used to do this with dropbox for years: I'd work in a git checkout, then take another laptop to go work elsewhere, and just continue in the \"same\" synchronized git repo. Having to remember to commit and push a long list of repos before changing workstations is error-prone. Also, I prefer to commit when a discrete atom of work has been completed, and to push when a topic branch is good and ready to be merged (for example), not every time that I feel like changing workstations. :) Dropbox never dropped a stitch in all this time. As long as all laptops are in a 1) connected and 2) synced up state, switching is possible. + +The limitation of not being able to sync the .git directories in git checkouts means that this use case can't currently be supported by git-annex (assistant). Is a work-around possible, or is this something that can't ever be supported due to the limitations of git itself? + +"""]] diff --git a/doc/forum/Transfer_remotes.mdwn b/doc/forum/Transfer_remotes.mdwn new file mode 100644 index 000000000..eb03f3166 --- /dev/null +++ b/doc/forum/Transfer_remotes.mdwn @@ -0,0 +1,3 @@ +Hi! + +I have a laptop A on which I setup a box.com special remote as a transfer encrypted repository. It is quite unclear to me how I should configure laptop B to use the same box.com remote and share files between the two machines. diff --git a/doc/forum/Transfer_remotes/comment_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment b/doc/forum/Transfer_remotes/comment_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment new file mode 100644 index 000000000..7b5de17a0 --- /dev/null +++ b/doc/forum/Transfer_remotes/comment_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="Screencast" + date="2013-04-11T09:59:24Z" + content=""" +Maybe this screencasts helps: [git-annex assistant remote sharing](http://git-annex.branchable.com/videos/git-annex_assistant_remote_sharing/) +"""]] diff --git a/doc/forum/Transfer_remotes/comment_2_98930629d398329f1161135464a966a5._comment b/doc/forum/Transfer_remotes/comment_2_98930629d398329f1161135464a966a5._comment new file mode 100644 index 000000000..1ce26e5b2 --- /dev/null +++ b/doc/forum/Transfer_remotes/comment_2_98930629d398329f1161135464a966a5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://cyprio.net/" + nickname="oz" + subject="versions?" + date="2013-04-15T22:50:31Z" + content=""" +Well, in the screencast it seems to work alright. + +I only get a \"Syncing with laptop B\" on one side, nothing more happens. I'm not sure if there is a recommended version to follow this screencast, or if the versions need to match (I'm syncing between macos & linux/debian, and the mac packages are lagging behind). + +My guess is that the assistant is simply \"not there yet\": using git-annex manually works just fine, but the assistant... ew. :/ +"""]] diff --git a/doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn b/doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn new file mode 100644 index 000000000..28c3a1749 --- /dev/null +++ b/doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn @@ -0,0 +1,15 @@ +I'm having trouble install from cabal on Debian-testing since the new beta released. + + % sudo aptitude remove --purge cabal-install + % rm -rf $HOME/.cabal + % sudo aptitude install cabal-install + % cabal update + % cabal install git-annex + +The output all follows this general syntax: + + depends on which failed to install + +On the flip side, I upgrade my Debian to sid and it installed just fine through aptitude. + +(Apologies for my English, and if this is simply a user error) diff --git a/doc/forum/Trouble_installing_from_cabal_on_debian-testing/comment_1_0d3e9d7cffafc34bc212557e8bbb987d._comment b/doc/forum/Trouble_installing_from_cabal_on_debian-testing/comment_1_0d3e9d7cffafc34bc212557e8bbb987d._comment new file mode 100644 index 000000000..d312ba7b1 --- /dev/null +++ b/doc/forum/Trouble_installing_from_cabal_on_debian-testing/comment_1_0d3e9d7cffafc34bc212557e8bbb987d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-25T16:13:08Z" + content=""" +The difficulty with using cabal on Debian testing (and unstable) is that Debian has an older version of Yesod, and I have not managed to get cabal to work with both versions at once. + +If you build using the Makefile, it currently uses the old version of Yesod, so that'll work. + +The [package from unstable](http://packages.debian.org/sid/git-annex) should install ok on testing. +"""]] diff --git a/doc/forum/Truly_purging_dead_repositories.mdwn b/doc/forum/Truly_purging_dead_repositories.mdwn new file mode 100644 index 000000000..8a231439c --- /dev/null +++ b/doc/forum/Truly_purging_dead_repositories.mdwn @@ -0,0 +1 @@ +Since I'm just starting out with git-annex, I've had several false starts in getting things setup nicely between three machines. In the course of so doing, I've ended up with several repositories which no longer exist, and which I've marked dead. However, this is making the "git annex status" report a bit ugly, since these repositories no longer exist and can never exist again. Is there a way to truly purge dead repositories from my annex? I'd be fine with a command that must be ran in tandem on all annexes before doing a sync... diff --git a/doc/forum/Truly_purging_dead_repositories/comment_1_a4c75d49714b3543a9f1617a15d4a2d1._comment b/doc/forum/Truly_purging_dead_repositories/comment_1_a4c75d49714b3543a9f1617a15d4a2d1._comment new file mode 100644 index 000000000..6b778ed56 --- /dev/null +++ b/doc/forum/Truly_purging_dead_repositories/comment_1_a4c75d49714b3543a9f1617a15d4a2d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-18T02:20:25Z" + content=""" +If you really want to, check out the git-annex branch and delete the line from uuid.log, and do this on every repo in tandem. But it seems a lot of bother for something that is entirely hidden except for this one place. +"""]] diff --git a/doc/forum/Truly_purging_dead_repositories/comment_2_3da60a02e7323a204c5c5dd02ba04d6c._comment b/doc/forum/Truly_purging_dead_repositories/comment_2_3da60a02e7323a204c5c5dd02ba04d6c._comment new file mode 100644 index 000000000..8a89eee96 --- /dev/null +++ b/doc/forum/Truly_purging_dead_repositories/comment_2_3da60a02e7323a204c5c5dd02ba04d6c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 2" + date="2012-10-18T02:23:54Z" + content=""" +Another possibilty is to reuse the dead uuids for later repos. You can do this by just setting annex.uuid in .git/config before you run `git annex init`, and then run `git annex fsck`. +"""]] diff --git a/doc/forum/Truly_purging_dead_repositories/comment_3_2576e45436008ff5a7ae5a38cade658e._comment b/doc/forum/Truly_purging_dead_repositories/comment_3_2576e45436008ff5a7ae5a38cade658e._comment new file mode 100644 index 000000000..2b78ab0e0 --- /dev/null +++ b/doc/forum/Truly_purging_dead_repositories/comment_3_2576e45436008ff5a7ae5a38cade658e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Another idea" + date="2012-10-18T05:38:07Z" + content=""" +What if git annex status didnn't show dead repository unless I specified \"git annex status --dead\"? If you're OK with that, I'll try adding it. +"""]] diff --git a/doc/forum/Truly_purging_dead_repositories/comment_4_477e3c213c5a5d4a33afd42a5b94c718._comment b/doc/forum/Truly_purging_dead_repositories/comment_4_477e3c213c5a5d4a33afd42a5b94c718._comment new file mode 100644 index 000000000..3f39803b2 --- /dev/null +++ b/doc/forum/Truly_purging_dead_repositories/comment_4_477e3c213c5a5d4a33afd42a5b94c718._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 4" + date="2013-09-04T06:44:42Z" + content=""" +Status no longer shows dead repositories. + +See also, answer here: +"""]] diff --git a/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__.mdwn b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__.mdwn new file mode 100644 index 000000000..5495e2649 --- /dev/null +++ b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__.mdwn @@ -0,0 +1,18 @@ +Hi, + +Here is my setup: + +* I have a locally networked server Server-A with a large storage hard drive auto-mounted. +* I have two personal client computers: Client-A and Client-B. +* Client-A is my primary (desktop) computer. +* Client-B is my secondary (laptop) computer that I use less often. +* Git-annex is installed on all 3 computers and I use git-annex assistant on both Client-A and Client-B. +* Both Client-A and Client-B need to share the same repository/files. + + +What is the best or recommended git-annex assistant repository configuration for this setup? Ideally I want Server-A to have a full backup of the shared repository. I currently have a client repository for both Client-A and Client-B. Also, both Client-A and Client-B have a "full backup" repository pointing to the same repository hosted on Server-A. Is this OK? Should only one of the the client's have this repository as a "full backup"? Will this current setup also have git annex assistant auto-sync the repositories between the clients? I have both clients setup right now and they have both successfully cloned the shared repository, but I have noticed that they have yet to sync up modifications made on the other client. An alternative setup I can think of would be to have Client-A keep its current configuration and have Client-B switch the "full backup" repository to be just a "transfer" repository. + +I hope my intentions are clear. Please give me your recommendations. + +Regards, +Blake diff --git a/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_1_b8702892280447193e6e80be22a580a0._comment b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_1_b8702892280447193e6e80be22a580a0._comment new file mode 100644 index 000000000..915e7209b --- /dev/null +++ b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_1_b8702892280447193e6e80be22a580a0._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4" + nickname="Blake" + subject="update" + date="2013-10-30T07:19:56Z" + content=""" +It seems both Client-A and Client-B ARE actually syncing with this current setup. I think Client-B was just delayed due to the initial startup scan. So I guess at this point I am more or less asking if having both Client-A and Client-B have the remote repository being a \"full backup\" type is appropriate or if there is a better configuration that achieves what I am hoping to have. + +Regards, +Blake +"""]] diff --git a/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_2_50cafde7e30b928480d1f142ddd763d2._comment b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_2_50cafde7e30b928480d1f142ddd763d2._comment new file mode 100644 index 000000000..4495401b2 --- /dev/null +++ b/doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_2_50cafde7e30b928480d1f142ddd763d2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 2" + date="2013-11-01T16:47:18Z" + content=""" +git-annex keeps track of the repository group on a per repository basis. That is, if the repository on Server-A is a full backup, both Client-A and Client-B will consider it to be one, and use it appropriately. You can't have just Client-A think it's a full backup; this setting will be automatically synced to Client-B. + +Your setup sounds ok, although you might need to set up a XMPP account in order for Client-A and Client-B to immediately message one-another when they have new changes to sync. Otherwise, they might only poll Server-A occasionally for changes. +"""]] diff --git a/doc/forum/USB_backup_with_files_visible.mdwn b/doc/forum/USB_backup_with_files_visible.mdwn new file mode 100644 index 000000000..747de85ff --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible.mdwn @@ -0,0 +1,7 @@ +Quick question: I want to create a repository on my removable USB drive that will acquire all files (eg. "full backup" repository group), but where the files will be visible and usable if you load the drive on another computer. + +How do I do that from within the assistant? + +Thanks, + +Zellyn diff --git a/doc/forum/USB_backup_with_files_visible/comment_1_2832f8ae24dfb0f101e06f7c18283028._comment b/doc/forum/USB_backup_with_files_visible/comment_1_2832f8ae24dfb0f101e06f7c18283028._comment new file mode 100644 index 000000000..c08a0c692 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_1_2832f8ae24dfb0f101e06f7c18283028._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T17:00:41Z" + content=""" +This is not something the assistant really handles yet. The issue is that if you have a non-bare repository on the USB drive, something has to run `git annex sync` in it when changes are pushed to it, to update it to display the files that are in the repository. + +One way to do this is to set up a non-bare repository by hand and add a git post-receive hook that runs `git annex sync` +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_2_6163e01aa441f8435091f026cc6da337._comment b/doc/forum/USB_backup_with_files_visible/comment_2_6163e01aa441f8435091f026cc6da337._comment new file mode 100644 index 000000000..591dc847d --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_2_6163e01aa441f8435091f026cc6da337._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="comment 2" + date="2013-07-02T17:10:59Z" + content=""" +Aah, perfect. I did in fact set up a non-bare git annex on the drive. I was just lacking the `git annex sync` command. Thanks! +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_3_ee92ff320eb5d9a031bdd1896aee0d86._comment b/doc/forum/USB_backup_with_files_visible/comment_3_ee92ff320eb5d9a031bdd1896aee0d86._comment new file mode 100644 index 000000000..98a3c1cc5 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_3_ee92ff320eb5d9a031bdd1896aee0d86._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="post-receive hook looks troublesome" + date="2013-07-03T16:11:13Z" + content=""" +I just tried setting up a post-receive hook with just \"git annex sync\" in it. +The end result is that files (git annex symlinks, really) are getting removed somehow as a result after a couple of git annex sync's done manually. +It would be nice if this actually worked. + +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_4_437c8342c0b65e3a89129800313eb73c._comment b/doc/forum/USB_backup_with_files_visible/comment_4_437c8342c0b65e3a89129800313eb73c._comment new file mode 100644 index 000000000..a45b05b25 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_4_437c8342c0b65e3a89129800313eb73c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 4" + date="2013-07-03T19:54:21Z" + content=""" +Seems to me that any such problems would be caused by the environment variables git sets in the hook, or possibly the current working directory in use when the hook runs. So it might take some finessing to get right. + +Meanwhile, I've committed a change that makes `git annex merge` merge in changes synced to the repo from other repositories. So that can be used the same way `git annex sync` can, but without the added overhead of committing, pushing, and pulling. +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment b/doc/forum/USB_backup_with_files_visible/comment_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment new file mode 100644 index 000000000..20853a4a0 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 5" + date="2013-07-04T05:11:46Z" + content=""" +Oh! git annex merge is very nice. +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_6_add048a16837f7940a859f21426cdbe9._comment b/doc/forum/USB_backup_with_files_visible/comment_6_add048a16837f7940a859f21426cdbe9._comment new file mode 100644 index 000000000..95f749574 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_6_add048a16837f7940a859f21426cdbe9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Confused" + date="2013-11-03T00:13:47Z" + content=""" +Sorry, I'm confused. I set up a Full Backup repo on a second hard drive, but the files are visible in its directory just like in my Client repos' directories. Are the files not supposed to be visible? Is something wrong? +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_7_de227ca9911fe57d7a6d3e037f574fe9._comment b/doc/forum/USB_backup_with_files_visible/comment_7_de227ca9911fe57d7a6d3e037f574fe9._comment new file mode 100644 index 000000000..0f74efac0 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_7_de227ca9911fe57d7a6d3e037f574fe9._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 7" + date="2013-11-03T01:09:16Z" + content=""" +You can set it up that way, but the often confusing behavior (including not being able to umount a drive that has the git-annex assistant deamon running in it!) is why the webapp attempt to steer users toward making bare reposotories on USB drives. + +If you click on \"Add another repository\" -> \"Removable drive\", you get a bare repository. + +If you click on upper-right menu -> \"Add another local repository\" and enter a path, and tell it to combine the repositories, you get a synced non-bare repository, and potentially problems unmounting the drive since you now have 2 assistant daemons running. + +I have now added a further link to the nice removable drive path to that second UI path. +"""]] diff --git a/doc/forum/USB_backup_with_files_visible/comment_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment b/doc/forum/USB_backup_with_files_visible/comment_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment new file mode 100644 index 000000000..6511343e8 --- /dev/null +++ b/doc/forum/USB_backup_with_files_visible/comment_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 8" + date="2013-11-03T01:13:26Z" + content=""" +Thanks for the explanation, Joey. I just posted a [comment](http://git-annex.branchable.com/bugs/Unnecessary_remote_transfers/#comment-f7110e694a9951d8ab546b8dec568bfa) about this on the bug report too. Maybe the problem is simply that the Removable Drive option doesn't allow using internal, non-removable drives. + +BTW, I don't know if this is relevant, but I only see one \"git-annex assistant\" process running. +"""]] diff --git a/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.mdwn b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.mdwn new file mode 100644 index 000000000..6b1c03d9a --- /dev/null +++ b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.mdwn @@ -0,0 +1,22 @@ +1. Set up two computers with a client repository. +2. Add a removable drive repository and set it to transfer group. +3. Start adding files to computer #1 repository. See how the files get synced to the usb drive. +4. Connect the usb drive to computer #2 and see the files getting transferred to computer #2. Everything is looking good. + + +5. Connect the usb drive to computer #1 again. +6. Add a file that is larger than the remaining size of the usb drive, BUT smaller than the original size of the usb drive. +7. The file does not get transferred to the usb drive due to lack of disk space. + +I would expect the assistant to make some space on the usb drive. Removing the files it knows has been transferred to computer #2, and then transfer the new file to the usb drive. But this does not seem to happen. + +Have I missed something about how the transfer group is supposed to work? + + +Using version: +git-annex version: 4.20130802-g0a52f02 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Pre built tar file. + + diff --git a/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_1_0a6f6054d70009979f4a036e24b7c500._comment b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_1_0a6f6054d70009979f4a036e24b7c500._comment new file mode 100644 index 000000000..f298b56cd --- /dev/null +++ b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_1_0a6f6054d70009979f4a036e24b7c500._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T19:22:05Z" + content=""" +The assistant is supposed to remove files from transfer repositories once the file has been transferred to all known clients. This generally seems to work, with all the transfer repositories I've tested it with. Nothing is special about USB drives compared with other transfer repositories. + +Perhaps you have not configured the USB drive as a transfer repository? Or perhaps you have another client repository (even a client repository you had once but have now deleted). +"""]] diff --git a/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_2_f9eef3019fe690e90c1228d62a16f70a._comment b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_2_f9eef3019fe690e90c1228d62a16f70a._comment new file mode 100644 index 000000000..7f761419c --- /dev/null +++ b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_2_f9eef3019fe690e90c1228d62a16f70a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="even a client repository you had once but have now deleted" + date="2014-07-09T22:08:44Z" + content=""" +if this client repository has been deleted, why does it still have an impact? What is the user supposed to do to use a transfer repository if some day another client which was deleted has existed? + +Old repositories seem to remain for ever in the webapp. You can try to delete them with the webapp, they will stay there. You can disable them, they will stay there. If you want to try to delete them again in the webapp, you first have to enable them again and nothing ever happens. There seems to be basically no way to delete repositories which have some day existed... +"""]] diff --git a/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_3_7fb74f7fab6c1baff4ffc270cf15ef0a._comment b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_3_7fb74f7fab6c1baff4ffc270cf15ef0a._comment new file mode 100644 index 000000000..df8333cb3 --- /dev/null +++ b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_3_7fb74f7fab6c1baff4ffc270cf15ef0a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-11T19:29:06Z" + content=""" +The webapp certianly allows deleting repositories. + +But, you can always go in and manually do it: + +
+git annex dead $uuid
+git annex group $uuid unwanted
+
+"""]] diff --git a/doc/forum/Ubuntu_PPA.mdwn b/doc/forum/Ubuntu_PPA.mdwn new file mode 100644 index 000000000..b97cc1aec --- /dev/null +++ b/doc/forum/Ubuntu_PPA.mdwn @@ -0,0 +1,3 @@ +Is there a PPA that Ubuntu people are using to track the latest git-annex? + +The [Ubuntu install page](http://git-annex.branchable.com/install/Ubuntu/) mentions [https://launchpad.net/~rubiojr/+archive/git-annex](https://launchpad.net/~rubiojr/+archive/git-annex) which hasn't been updated for a while. diff --git a/doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment b/doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment new file mode 100644 index 000000000..d91a0d1eb --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmeki7KlfJpAAN9CUmi9EdwhwBmIhDMYuE" + nickname="Marvin" + subject="comment 1" + date="2013-03-11T09:40:43Z" + content=""" +im also looking for a PPA with newer git-annex versions. mostly because of the glacier support... +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment b/doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment new file mode 100644 index 000000000..bc91500c7 --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVICFY2CDP08xdsPr3cgmScomy9HA-1sk" + nickname="Andrew" + subject="comment 2" + date="2013-03-13T02:31:52Z" + content=""" +It's perfectly possible (though slightly messy) to install git-annex on Ubuntu via [[/install/cabal]], though you need to find and install all the required dependencies yourself (haskell, libidn, libgnutls, libgsasl etc). If you want to get crazy with this look at +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment b/doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment new file mode 100644 index 000000000..4c77308d0 --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="fmarier" + ip="121.98.93.240" + subject="My PPA (Ubuntu Precise) has git-annex 4.20130417" + date="2013-04-27T11:12:26Z" + content=""" +I just went through the pain of backporting 90+ Haskell packages from Debian unstable: https://launchpad.net/~fmarier/+archive/ppa +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment b/doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment new file mode 100644 index 000000000..335cc57ba --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="All PPAs are outdated" + date="2013-05-08T17:38:04Z" + content=""" +My work preinstalled Ubuntu machine is now on Raring, and even there the version of git-annex is only 3.20121112ubuntu3; too old to have the webapp option enabled :/ The two PPAs mentioned here aren't configured to build for Raring, so even though the one from François has a build from May 1st (7 days ago), it doesn't help me ;) + +François: mind updating your PPA to support Raring? Thanks much if you do! + +Either that, or I'll take the time some day to do a proper install on this machine (read: Debian). ;-) +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment b/doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment new file mode 100644 index 000000000..0d94ba6f2 --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 5" + date="2013-05-08T23:25:37Z" + content=""" +If you are on raring you can still use + + deb http://ppa.launchpad.net/fmarier/ppa/ubuntu precise main + +It's worked fine for me so far. +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment b/doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment new file mode 100644 index 000000000..8252fe5d9 --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 6" + date="2013-05-20T15:52:40Z" + content=""" +Be careful that the fmarier ppa includes more than just git-annex. +"""]] diff --git a/doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment b/doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment new file mode 100644 index 000000000..849381ec2 --- /dev/null +++ b/doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="New location for my git-annex PPA" + date="2013-06-15T07:42:13Z" + content=""" +My Ubuntu Precise PPA has moved here: https://launchpad.net/~fmarier/+archive/git-annex + +It contains version 20130601 of git-annex. + +As Pedro suggested, it's now in a separate PPA with only git-annex and the 220 Haskell packages it depends on. +"""]] diff --git a/doc/forum/Un-git-annex__63__.mdwn b/doc/forum/Un-git-annex__63__.mdwn new file mode 100644 index 000000000..68e8068fc --- /dev/null +++ b/doc/forum/Un-git-annex__63__.mdwn @@ -0,0 +1,6 @@ +Hi, + +I am using git-annex assistant on my Fedora Linux computer. Everything seems to be working perfectly, however I have noticed that almost all of my files are now symbolic links to cryptic file names located in the .git/ directory. Oddly though it seems files inside git-annex assistant does not move/symbolic link files within git repositories inside my git-annex assist directories. My question is: how can I safely uninstall git-annex from my machine and restore all files to their non-symbolic link states? When I click on the settings drop-down for a repository inside git-annex assistant and choose disable it goes to the same page as the delete option. Any ideas? + +Regards, +Blake diff --git a/doc/forum/Un-git-annex__63__/comment_1_6059265afb66190d325083e0f28bcf33._comment b/doc/forum/Un-git-annex__63__/comment_1_6059265afb66190d325083e0f28bcf33._comment new file mode 100644 index 000000000..907293f99 --- /dev/null +++ b/doc/forum/Un-git-annex__63__/comment_1_6059265afb66190d325083e0f28bcf33._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-10-06T06:45:14Z" + content=""" +\"git annex uninit\" is the command which will revert an entire git annex repository back to a bunch of ordinary files, untracked by git annex (or git). I'm not sure whether there is a way to issue that command from the assistant though. + + +"""]] diff --git a/doc/forum/Un-git-annex__63__/comment_2_fac4bfb81dbbf0dc82059aace261eb51._comment b/doc/forum/Un-git-annex__63__/comment_2_fac4bfb81dbbf0dc82059aace261eb51._comment new file mode 100644 index 000000000..2b1a7381a --- /dev/null +++ b/doc/forum/Un-git-annex__63__/comment_2_fac4bfb81dbbf0dc82059aace261eb51._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlOc-EOD5ZyggsAp6lOnU7x5MxizwLtUXA" + nickname="Hendrik" + subject="comment 2" + date="2013-10-06T18:35:14Z" + content=""" +I had uninit'd my annex several time for testing git-annex. What I discovered was that is worked reliably but for all files that are duplicates. For duplicates only 1 of the files got restored properly. All that was 1 year ago - so your results my differ. I had found a piece of script in the forum / tips sections that will show all duplicates. + +Hope this helps... +"""]] diff --git a/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn new file mode 100644 index 000000000..c299041f0 --- /dev/null +++ b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn @@ -0,0 +1,7 @@ +Hello, + +I was recently evaluating git-annex as a file sync tool, but I've got my files in a state where they are a mess. The short version is that I have a local repo, and then an Encrypted S3 remote. Once I encrypted the files, they got renamed and so forth and the files are now just symbolic links to files within the .git directory somewhere. This has made some of them unusable for me and I need to revert the files back to not being symlinks any longer. How would I go about doing that? + +Thanks, + +Brandon diff --git a/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_1_568dde820c2608d86d05b07444146a26._comment b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_1_568dde820c2608d86d05b07444146a26._comment new file mode 100644 index 000000000..21cf45522 --- /dev/null +++ b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_1_568dde820c2608d86d05b07444146a26._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 1" + date="2013-07-28T00:09:45Z" + content=""" +Run: + +`git annex get $file` +`git annex unannex $file` + +$file will now be back how it was before you used git-annex. Can also run above on whole directories. +"""]] diff --git a/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment new file mode 100644 index 000000000..2e9c387ad --- /dev/null +++ b/doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFsVANDSwNHzCWk-iP2_nXnfYKPJWziE" + nickname="Brandon" + subject="comment 2" + date="2013-07-28T03:26:23Z" + content=""" +Thanks, much appreciated. Got all of my files back successfully. +"""]] diff --git a/doc/forum/Unknown_remote_type_S3.mdwn b/doc/forum/Unknown_remote_type_S3.mdwn new file mode 100644 index 000000000..ae8432286 --- /dev/null +++ b/doc/forum/Unknown_remote_type_S3.mdwn @@ -0,0 +1,5 @@ +I have an annex set up with an s3 special remote. It works fine on one computer. I cloned the annex to a USB stick, plugged the stick into a second computer and cloned the annex to that machine. When I try to `git annex initremote cloud` on the second machine, I get the following error: + + git-annex: Unknown remote type S3 + +The second machine is running git-annex 3.20121017. diff --git a/doc/forum/Unknown_remote_type_S3/comment_1_2aea2cd51286c809427d16519606cd37._comment b/doc/forum/Unknown_remote_type_S3/comment_1_2aea2cd51286c809427d16519606cd37._comment new file mode 100644 index 000000000..80e1b11aa --- /dev/null +++ b/doc/forum/Unknown_remote_type_S3/comment_1_2aea2cd51286c809427d16519606cd37._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-07T18:57:17Z" + content=""" +It's possible to build git-annex without S3 support. I think a few Linux distros ship it this way due to not having all the necessary haskell libraries. +"""]] diff --git a/doc/forum/Unknown_remote_type_S3/comment_2_06f775062cd30767979fe56bcb3cf7bf._comment b/doc/forum/Unknown_remote_type_S3/comment_2_06f775062cd30767979fe56bcb3cf7bf._comment new file mode 100644 index 000000000..75864aedc --- /dev/null +++ b/doc/forum/Unknown_remote_type_S3/comment_2_06f775062cd30767979fe56bcb3cf7bf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="24.16.193.140" + subject="comment 2" + date="2012-11-07T20:12:27Z" + content=""" +That was the issue. Thank you! +"""]] diff --git a/doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn b/doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn new file mode 100644 index 000000000..0c514368a --- /dev/null +++ b/doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn @@ -0,0 +1,13 @@ +I just started using the assistant on an existing annex. I fire up the assistant like so: + + $ git annex webapp + +Everything syncs and looks to be working fine. In another terminal, I then create a new file: + + $ touch testfile.txt + +The assistant sees that file, immediately adds it and syncs. Ok. So now I want to edit that file. + + $ git annex unlock testfile.txt + +As soon as I unlock the file, the assistant re-adds it to the annex and syncs, preventing me from editing the file. How can I edit files with the assistant running? diff --git a/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment b/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment new file mode 100644 index 000000000..f17fc5634 --- /dev/null +++ b/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-11T16:06:42Z" + content=""" +I suspect you have an old build of the assistant. Version 3.20121009 was supposed to fix this. + +I re-tested with current git head today, and found I was able to unlock a file, repeatedly edit it in place without the assistant re-adding it, and then run \"git annex add\" and the assistant auto-committed the changed file. Better behavior than I was expecting in fact -- the ability to repeatedly edit is a pleasant surprise. +"""]] diff --git a/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_2_a76797ee9e05e43af7947508cadd7bed._comment b/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_2_a76797ee9e05e43af7947508cadd7bed._comment new file mode 100644 index 000000000..556720523 --- /dev/null +++ b/doc/forum/Unlock_files_when_assistant_is_running__63__/comment_2_a76797ee9e05e43af7947508cadd7bed._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="annexuser" + ip="24.16.193.140" + subject="comment 2" + date="2012-11-12T20:09:20Z" + content=""" + $ git annex version + git-annex version: 3.20121017 +"""]] diff --git a/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn b/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn new file mode 100644 index 000000000..0d102b0d4 --- /dev/null +++ b/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn @@ -0,0 +1,13 @@ +I'm trying to figure out if git-annex can be used for the following use case: + +- 2 repos in direct mode A and B +- A is on a local filesystem, B could be a NFS mountpoint or ssh +- B contains a number of toplevel directories, A contains a subset of those +- For the subset in A all changes in those directories that happen on A or B should be synced automatically between both repos, including file removals. +- A can decide to not carry a toplevel dir any more, but it must still exist in B. +- A can copy new toplevel dirs from B and those should be synced from then on. + +I've been looking at the docs and played with two test repos, but I cannot seem to make the above work. To me it looks like I would need a possibility include/exclude paths from syncing via a regex. + +Thanks, +Felix diff --git a/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__/comment_1_a0a272a0931b27e5c94b93e42656b62c._comment b/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__/comment_1_a0a272a0931b27e5c94b93e42656b62c._comment new file mode 100644 index 000000000..3e930b542 --- /dev/null +++ b/doc/forum/Use_case_with_syncing_only_a_subset_possible__63__/comment_1_a0a272a0931b27e5c94b93e42656b62c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T20:39:51Z" + content=""" +I guess you might be using the git-annex assistant. If you were just using git-annex at the command line, you could simply only run `git annex get` on the files or directories you wanted to get. + +You can control which directories the git-annex assistant downloads/uploads files for using [[preferred_content]] expressions. Or the easy solution is to use the webapp to put the repository into \"manual mode\" and then manually run `git annex get` as described above to get just the files you want. (And `git annex copy --to remote` to share new files you make.) +"""]] diff --git a/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn new file mode 100644 index 000000000..67e7971d2 --- /dev/null +++ b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn @@ -0,0 +1,3 @@ +I have a question on setting up a new repo. Is it possible to initialize a new repo using files which are already local on say my laptop, instead of downloading them from a S3 remote repository? Sorry if this is unclear. But I'm trying to make use of the files that are local on my laptop so I don's have to go through the ordeal of downloading them from S3. + +I should also mention that I don't have a complete set of all the files locally on the laptop vs. what's already in the S3 repository. diff --git a/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_1_cfb6021a36eee087705967a69967f327._comment b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_1_cfb6021a36eee087705967a69967f327._comment new file mode 100644 index 000000000..0d1f74e83 --- /dev/null +++ b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_1_cfb6021a36eee087705967a69967f327._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-05-27T18:13:43Z" + content=""" +Hi, + +just copy the local File into the annex again, replacing the symlinks. If you have the assistant running, it should re-add the files automatically, otherwise you can 'git annex add' them manually. +"""]] diff --git a/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_2_7268b194ba72331858bc3274996b780e._comment b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_2_7268b194ba72331858bc3274996b780e._comment new file mode 100644 index 000000000..b066c85db --- /dev/null +++ b/doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_2_7268b194ba72331858bc3274996b780e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-27T18:47:17Z" + content=""" +You can also use `git annex reinject` to feed in contents of specific files, without needing to directly touch the files in the repository. + +Or, you can check all the local files into a temporary directory. Either the assistant or a manual `git annex add` will +notice if these files have the same content as files already in the repository. The files will then be available in two locations, the temp directory and wherever it was checked into your repository before. You can then delete the temp directory. +"""]] diff --git a/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn new file mode 100644 index 000000000..d33fda600 --- /dev/null +++ b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn @@ -0,0 +1 @@ +On BTRFS it is possible to use [reflinks / clones](https://en.wikipedia.org/wiki/Btrfs#Cloning). This is the equivalent of hardlinks except that when the file is modified, a copy is performed (copy on write). Perhaps git-annex could detect the availability of this feature and use it in case it is available (and the repository and the file are in the same filesystem). diff --git a/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_1_85806316ed28d7a891f04fab4027141b._comment b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_1_85806316ed28d7a891f04fab4027141b._comment new file mode 100644 index 000000000..b175204e5 --- /dev/null +++ b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_1_85806316ed28d7a891f04fab4027141b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://thkoch2001.myopenid.com/" + nickname="thkoch" + subject="It would also be nice, if git-annex would use btrfs reflinks on unlock" + date="2013-08-24T12:46:40Z" + content=""" +I don't know whether git-annex already does use btrfs reflinks, but I suspect, that I double the size of my git-annex repo folder on disk when I unlink all files. +"""]] diff --git a/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_2_ecb411a2c4d67917b734a90bd460d44b._comment b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_2_ecb411a2c4d67917b734a90bd460d44b._comment new file mode 100644 index 000000000..a4ade5792 --- /dev/null +++ b/doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_2_ecb411a2c4d67917b734a90bd460d44b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-24T15:54:02Z" + content=""" +git-annex has always used cp --reflink=auto, including when it cp's the file in `git annex unlock`. + +You can verify this with --debug. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..37dd1bc24 --- /dev/null +++ b/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 @@ -0,0 +1,11 @@ +I use git everywhere i can to manage versions, but I have a usecase that is probably very common, but i could not see in the howto lists. + +I have a shared fileserver(FS) that is managed by others and is full of the equivalent of binary blobs (media, word docs etc). Binary blobs of course are something that git cannot normally do anything meaningful with. That is diff/patch for managing the evolution of any given file. Binary blobs have a different lifecycle of course, and i see annex as the solution for managing that. + +The remote FS is being used as an SMB server to windows and linux clients. The FS has other capabilities that i can use other than SMB mount including rsync and ssh. As it is running samba it also uses symlinks underneath the the SMB to manage shared folders, which can be seen when mounted in unix mode. This means the FS landscape is different when using samba as compared to rsync and ssh, as some paths may be symlinked in. The symlinks should not effect this use case, but I mention them because I don't know how annex would manage this. + +The basic scenario is that i have a set of project files and folders in tree on the remote FS. I want to use git to pull these binary files from the FS to edit locally while also seein/capturing changes made to files in that tree by other people not using git. Then i want to push my edits back, without effecting the files that i have no responsibility for (but have write access to). + +Think a team of people with various technical capabilities working on changing binary blobs in this remote directory tree. I want to manage my interactions with portions of that remote FS tree via git (annex) with a local mirror (preferably actually containing only the files i care about) so that i can manipulate them locally, clone to other work machines and generally play about with and then push back while watching the whole tree and capturing changes others make (during sync/merge/push/pull?). Because i do not manage it, or own the contents, i also need to be able to maintain the some of the permissions (guid/uid) of the remote and untouched files. + +Can you give me any suggestions? diff --git a/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 b/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 new file mode 100644 index 000000000..7f170975a --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9pq1WH6MWeExXHVQVEsniT3DdFv4AB8" + nickname="Roberto" + subject="My usecase too" + date="2014-01-12T23:43:18Z" + content=""" +Just wanted to thank your for describing my very same use case. Unfortunately I still haven't wrapped my head around git annex to accommodate such scenario. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..576007b62 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~timo-linux" + nickname="Tim O'Callaghan" + subject="Would GIT_DIR or GIT_WORK_TREE be valid for this?" + date="2014-01-14T07:29:31Z" + content=""" +For example if i mounted this filesystem and used annex and GIT_ env variables to watch it? Presumably in direct mode, because i don't want to remove the source files, but i do want to manage my source files. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..9184495b5 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~timo-linux" + nickname="Tim O'Callaghan" + subject="What about annex mirror? " + date="2014-01-14T08:00:42Z" + content=""" +I cannot find any documentation on it, is it appropriate for this situation? +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..d43019ce0 --- /dev/null +++ b/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 @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="Many peoples' use case" + date="2014-01-14T09:39:05Z" + content=""" +Well, a description of this use case is posted every few weeks in different forms. Here are two, including my own: ;-) + +* [[Using git annex with a SMB 47 FTP TV NAS with preconfigured dirs]] +* [[Direct special remotes]] +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..321fa9c53 --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~timo-linux" + nickname="Tim O'Callaghan" + subject="Still have not found a reasonable solution for this myself." + date="2014-02-03T14:34:14Z" + content=""" +And it seems i'm not the only one, So I'd like to bump the topic. + +Can someone at least tell me if it is possible with annex/annex-gui or not? +"""]] diff --git a/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell.mdwn b/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell.mdwn new file mode 100644 index 000000000..d3e2cef00 --- /dev/null +++ b/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell.mdwn @@ -0,0 +1,13 @@ +Hello, + +I'm very excited about Git Annex and Git Annex Assistant. + +One big issue that I have is that I currently have all of my photos (70-80GB) on a HTPC because it has a large hard drive. I have a decent laptop/screen set-up where I would prefer to manage the photos, but the hard drive in there is a small SSD. + +I use Shotwell to manage my photos (currently on the HTPC). I would be happy to keep things simple and only access them on the laptop. I have 100GB of box.com storage (and another 100GB of Mega.co.nz storage, but I don't think that is supported by GAA yet). + +Ideally, what I would like is for a cache of, say, 10GB of my recently-accessed photos to live on my laptop, with the remaining 70GB living on both my HTPC and box.com. If I ever needed the underlying files for non-cached files (say if I was trying to view full-quality versions of them or send them to someone), it could try to pull these from my HTPC over the local network or, if I was "on the road", box.com. As I understand it, Shotwell has its own database and a set of thumbnails etc that you can use to manage and browse your photos while very rarely accessing the underlying photos. + +Is this possible with the existing GAA/Shotwell, or does one or the other require changes? Could I solve the problem by using something like the sharebox Git-Annex FUSE filesystem, so that Shotwell thinks that the files are local, but runs away and grabs them if they are remote? + +I would appreciate any thoughts that anyone has - particularly if anyone has made this work. diff --git a/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell/comment_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment b/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell/comment_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment new file mode 100644 index 000000000..7ec8ac2fc --- /dev/null +++ b/doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell/comment_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-27T19:09:50Z" + content=""" +Mega can be used via [[/tips/megaannex]]. I don't have personal experience with it, but if you set up a repository manually using that, the assistant can use that repository just as it uses any other repository. + +git-annex at the command line is great for small local repositories that pull files from various larger remotes as needed. You just run \"git annex get\" when you want a file and \"git annex drop\" when you want to free disk space. You can also use this mode with the assistant, by configuring the local repository to be in \"manual mode\". + +By default though, the way the assistant handles this kind of use case is with `archive` directories. It tries to move any files in an archive directory away from your local disk, and it tries to get any files not in an archive directory to be locally available. So you can just move files around between directories to control where they are stored. See [[assistant/archival_walkthrough]] for details an an example video. +"""]] diff --git a/doc/forum/Using_Linux_static_builds.mdwn b/doc/forum/Using_Linux_static_builds.mdwn new file mode 100644 index 000000000..ee856f72c --- /dev/null +++ b/doc/forum/Using_Linux_static_builds.mdwn @@ -0,0 +1,25 @@ +Hello, + +I want to use git-annex on a couple of machines that are not under my control (and one that is). For that I use the provided static build, but encountered several problems: + +I suppose the first step for command line use is to execute runshell: + +On one machine: + +flindner@yoko:~> software/git-annex.linux/runshell +/bin/bash: /lib64/libc.so.6: version `GLIBC_2.11' not found (required by /home/flindner/software/git-annex.linux//lib/x86_64-linux-gnu/libreadline.so.6) + +Is there anything I can do about it? + +On the other machine: + +flindner@bladefoam2:~$ software/git-annex.linux/runshell +bash-4.1$ + +It starts a bare, non-configured shell instance. Can I modifiy and source the script to only set the environment and not start up a new shell? + +Another question: If using ssh:// remotes, how can I tell git-annex the first command to set up the environment need in order to execute command via SSH? + +Thanks, + +Florian diff --git a/doc/forum/Using_Linux_static_builds/comment_1_22fd266cbe68af3e754a10f1f1295e9b._comment b/doc/forum/Using_Linux_static_builds/comment_1_22fd266cbe68af3e754a10f1f1295e9b._comment new file mode 100644 index 000000000..b40ae7695 --- /dev/null +++ b/doc/forum/Using_Linux_static_builds/comment_1_22fd266cbe68af3e754a10f1f1295e9b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 1" + date="2012-10-09T15:10:45Z" + content=""" +Yes, it seems glibc 2.11 is the oldest version you can get away with. At least until we get a build machine with some truely ancient libc, but modern versions of everything else. Statically linking libc, or including it in the tarball are unfortunatly not technically possible. + +You don't need to use runshell if you just want to use the assistant. Which is what this static build is really targeted for. If you want to use all of git-annex, you're probably better off installing it properly. +It is possible to use \"runshell git annex\" to run a single command inside the shell. Or even make shell script wrappers that do that.. but it seems more difficult than installing git-annex normally. + +The static build can be used with ssh. The git-annex assistant should set things up properly. If you want to do it by hand, when it does is configure the ssh key to run ~/.ssh/git-annex-shell, and that file is then made a shell script that runs `runshell git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"` +"""]] diff --git a/doc/forum/Using_Linux_static_builds/comment_2_36f69f30117ff8696425a754ab19a08b._comment b/doc/forum/Using_Linux_static_builds/comment_2_36f69f30117ff8696425a754ab19a08b._comment new file mode 100644 index 000000000..4f43034a3 --- /dev/null +++ b/doc/forum/Using_Linux_static_builds/comment_2_36f69f30117ff8696425a754ab19a08b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 2" + date="2012-10-10T10:48:04Z" + content=""" +Installing it properly seems to be quite a bit of effort, given the long list of Haskell dependencies. Most of the machines I plan to use it on are not under my control and seem to be somewhat outdated. What way of installing it properly would you suggest? +"""]] diff --git a/doc/forum/Using_Linux_static_builds/comment_3_64506833dad0202626239e00d1eb6490._comment b/doc/forum/Using_Linux_static_builds/comment_3_64506833dad0202626239e00d1eb6490._comment new file mode 100644 index 000000000..af301bd7e --- /dev/null +++ b/doc/forum/Using_Linux_static_builds/comment_3_64506833dad0202626239e00d1eb6490._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://colberg.org/" + ip="2001:470:1d:4d4:2d4b:7654:2c00:b95c" + subject="comment 3" + date="2012-11-12T05:05:39Z" + content=""" +Hi Florian, + +I maintain a makefile for GNU/Linux systems that builds git-annex from scratch using a single command. + + git clone http://git.colberg.org/packages.git + + nice make -f packages.mk CONCURRENCY_LEVEL=16 PREFIX=$HOME/usr/rhel6-x64_64 install-git-annex + +The makefile fetches pre-compiled GHC 6.x (x86_64), which works on old systems (e.g. RHEL 5), builds a recent GHC 7.x from source, a minimal Haskell environment with cabal-install, and finally git-annex. I have succesfully compiled git-annex on RHEL 5.x and 6.x, and CentOS 6.x. + +If the build fails using the system's GCC, there is also a newer GCC in the same makefile: + + nice make -f packages.mk CONCURRENCY_LEVEL=16 PREFIX=$HOME/usr/rhel6-x64_64 install-gcc + +Regards, +Peter +"""]] diff --git a/doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn new file mode 100644 index 000000000..99ddcc328 --- /dev/null +++ b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn @@ -0,0 +1,9 @@ +Is there a way to sync all (or a subset of) local branches, not just the currently checked out branch? + +Does this make sense at all, or does this show I am missing some important point in git-annex? + +I am asking because I would like to use git-annex to keep git repositories with normal git files (with versioned and branched content) in sync. + +If it's not currently possible, could you provide some pointers on where to start, if I wanted to change to Haskell source? + +Thnx diff --git a/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment new file mode 100644 index 000000000..2b060197b --- /dev/null +++ b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 1" + date="2012-10-29T17:04:30Z" + content=""" +Ok, this is what I have come up with: + +Merges can only be done on checked out branches. That's why the only way to do this without breaking the whole idea of git-annex (sync) is to check out each branch and run it separately. + +What would be the easiest way to do this? Considering possible unsaved changes in worktree and index? + +Maybe simply using git-clone /tmp locally, which uses hardlinks for .git/objects/ which should make it perform ok? + + +"""]] diff --git a/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_2_424b0c6fdfe87ca08f5d408b7684ab08._comment b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_2_424b0c6fdfe87ca08f5d408b7684ab08._comment new file mode 100644 index 000000000..1c4b9445b --- /dev/null +++ b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_2_424b0c6fdfe87ca08f5d408b7684ab08._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 2" + date="2012-10-29T18:52:59Z" + content=""" +It turns out, this is even easier: + +As the behavior of \"git-annex sync\" includes performing a \"git commit -a\", any pending changes in the work tree will be committed anyway. This means, that it is safe to simply checkout and sync any branch, one wants to sync. +"""]] diff --git a/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_3_adaf9114c69f1268330adcebd8018fa0._comment b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_3_adaf9114c69f1268330adcebd8018fa0._comment new file mode 100644 index 000000000..146785ad3 --- /dev/null +++ b/doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_3_adaf9114c69f1268330adcebd8018fa0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 3" + date="2012-11-04T20:08:02Z" + content=""" +Yes, that's right, `git annex sync` handles the current branch, and you can use it on different branches if desired. + +(It is actually possible to merge non-checked out branches, but I have not implemented that for sync.) +"""]] diff --git a/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__.mdwn b/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__.mdwn new file mode 100644 index 000000000..985bff87c --- /dev/null +++ b/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__.mdwn @@ -0,0 +1,36 @@ +I don't know if this is an "unusual setup" or something that should be supported, but it seems like a reasonable use case to me, so here goes: + +I have three systems: a desktop, a laptop, and a little netbook. I have one main annex that is currently synced between the desktop and the laptop at ~/annex on both, and to a secondary, Full Backup repo on the desktop, under /mnt. + +I have some music on my laptop, and I like to sync ~/Music between the laptop and the netbook. So I thought I'd make a new git-annex repo at ~/Music on both and sync them. I want this to be kept separate from ~/annex. + +I also thought it would be good to backup the music, so I thought I'd connect laptop:~/Music to the Full Backup repo at desktop:/mnt. So I paired the repo at laptop:~/Music to the repo at desktop:/mnt. + +So I had set up these repos: + +* desktop: + * /mnt (Full Backup) + * ~/annex (Client) +* laptop: + * ~/annex (Client) + * ~/Music (Client) +* netbook: + * ~/Music (Client) + +As I feared--but I wasn't sure, since I'm new to git-annex--since the desktop:/mnt repo was connected to laptop:~/Music, and desktop:~/mnt was also connected to desktop:~/annex, this caused everything in laptop:~/Music to be synced to desktop:~/annex, because they were part of the same "set" of repos; they were all in the same .git/config files. + +So now I have a few problems: + +1. How do I get all these music files out of my ~/annex repos? I tried removing the remote repos from ~/annex/.git/config and then running 'git-annex unused', but that didn't result in it thinking all the music files were unused. Do I have to delete them all manually? (There are a *lot* of directories from ~/Music now in ~/annex). + +2. It seems that desktop:~/annex/.git is...now over 600 MB, even though few of the actual music files have synced over. Is it possible to clean out ~/annex/.git and restore it to the pre-mess state without starting from scratch? + +3. Is it possible--or reasonable--to use a single Full Backup repo for multiple independent client repos? That is, is it possible to do that without the independent client repos "cross-pollinating"? Or do I need to use separate Full Backup repos for each "set" of client repos? + +4. I'm not sure if this is a separate problem, but I just want to make sure I understand the best way to handle things like this. I wanted to disconnect desktop:~/annex from laptop:~/Music, but I thought that if I used the webapp to "Delete" the laptop:~/Music repo, it would actually start deleting the music files in laptop:~/Music, after moving them to desktop:~/annex. Am I correct that that would have happened? If so, "Deleting" a repo seems like a dangerous operation that should warn and prompt the user. Maybe an "unlink repo" option needs to be available to simply disconnect two repos and leave their respective contents intact. + +I apologize if these are newbie problems. Despite reading every dev blog entry--both before and after the switchover--I'm still new to actually using git-annex. I'm not sure if it's supposed to work this way or if I'm using it wrong. + +If I am using it wrong...well, I can imagine other git-annex newbies doing similar things and ending up with similar messes, so maybe this needs to...be considered or something. :) Since I'm still experimenting with git-annex, I haven't put any "live" data in it, so I can blow away all the annexes and start over, but I would like to learn how to properly fix a situation like this in case I goof up in the future. + +Thanks for your help. diff --git a/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__/comment_1_c61c28600f1079fb03ddabc950307f27._comment b/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__/comment_1_c61c28600f1079fb03ddabc950307f27._comment new file mode 100644 index 000000000..b7119aa2d --- /dev/null +++ b/doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__/comment_1_c61c28600f1079fb03ddabc950307f27._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:14:34Z" + content=""" +1. Turn off the assistant, switch to indirect mode (`git annex indirect`), use `git log --stat` to find the commit(s) that added the music files, and `git revert` the commits, in reverse chronological order. Or delete the files manually. +2. You have merged two git repositories. Without some serious git repository surgery (ie, resetting to an old version and deleting the reflog), the full history of both is going to remain stored in git going forward. However, a simple `git gc` might pack that down to a much smaller amount of disk space. +3. Combining two repositories merges their git histories. You then have two clones of one repository containing the full contents and git history of both. Don't do that if that's not what you want. The webapp is always careful to tell you when an action will combine two repositories. +4. Once you have combined two repositories, you have two synced repositories that contain the same data. Deleting one of them will just delete one copy of the data. It won't result in data loss, but neither will it untangle the two git trees that were previously combined. +"""]] diff --git a/doc/forum/Using_for_Music_repo.mdwn b/doc/forum/Using_for_Music_repo.mdwn new file mode 100644 index 000000000..25f1365fb --- /dev/null +++ b/doc/forum/Using_for_Music_repo.mdwn @@ -0,0 +1,13 @@ +Hi, + +I am looking into using git-annex to sync my Music between 3 sources: desktop, laptop, backup, but I'm not sure if this will work ok. + +I notice on the wiki that: "Normally, the content of files in the annex is prevented from being modified. That's a good thing, because it might be the only copy, you wouldn't want to lose it in a fumblefingered mistake." + +But most music players will download artwork, and some of course will dynamically modify/rename files according to meta data. And I may be downloading and/or playing music on both the desktop and laptop. So obviously I wouldn't want to be manually unlocking individual files here. It would kinda interrupt the music listening experience. So how would this work? + +I am assuming that I would always have to do a git annex add *.mp3 *.flac *.jpg before doing a git annex sync. But can I just keep everything unlocked? Any side effects here? Will this work or should I just use rsync? + +Regards, + +bk diff --git a/doc/forum/Using_for_Music_repo/comment_1_3488ed85ad98f14cb17f229225ece26e._comment b/doc/forum/Using_for_Music_repo/comment_1_3488ed85ad98f14cb17f229225ece26e._comment new file mode 100644 index 000000000..6176f755d --- /dev/null +++ b/doc/forum/Using_for_Music_repo/comment_1_3488ed85ad98f14cb17f229225ece26e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-18T20:01:50Z" + content=""" +You can use [[direct_mode]] to keep all files unlocked all the time. + +You can use the [[assistant]] to automatically commit whatever changes are made to the directory, as well as automatically sync them to your other computers. +"""]] diff --git a/doc/forum/Using_for_Music_repo/comment_2_c794648878cfc77558f8db862271f997._comment b/doc/forum/Using_for_Music_repo/comment_2_c794648878cfc77558f8db862271f997._comment new file mode 100644 index 000000000..9ce874307 --- /dev/null +++ b/doc/forum/Using_for_Music_repo/comment_2_c794648878cfc77558f8db862271f997._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmgXUaPZHcAY8Wv4sTnX88CbJfYdYdKO-Y" + nickname="Boyd" + subject="comment 2" + date="2013-04-18T23:33:10Z" + content=""" +Thanks Joey! Anyway I see that with Fedora, I don't have the 'assistant'. I don't even seem to have the 'direct mode'. Also tried to do a cabal install git-annex, but ran into dependency hell. Oh well, this is goin on the back burner for a while. Looks very promising though! + +Boyd + +[root@zbox Music]# git annex direct +git-annex: Unknown command 'direct' + +Did you mean one of these? + reinject + +[root@zbox Music]# git annex version +git-annex version: 3.20120615 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +[root@zbox Music]# + +"""]] diff --git a/doc/forum/Using_for_Music_repo/comment_3_8c5e820f5ff7d717d64b1fd66927941b._comment b/doc/forum/Using_for_Music_repo/comment_3_8c5e820f5ff7d717d64b1fd66927941b._comment new file mode 100644 index 000000000..842a83052 --- /dev/null +++ b/doc/forum/Using_for_Music_repo/comment_3_8c5e820f5ff7d717d64b1fd66927941b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-19T18:05:49Z" + content=""" +Fedora has an old version of git-annex. You can use the [[install/Linux_standalone]] tarball. +"""]] diff --git a/doc/forum/Using_git-annex_as_a_library.mdwn b/doc/forum/Using_git-annex_as_a_library.mdwn new file mode 100644 index 000000000..3727679dd --- /dev/null +++ b/doc/forum/Using_git-annex_as_a_library.mdwn @@ -0,0 +1 @@ +I am looking to use git-annex as a library/tool to bring syncing to another application. Is there any documentation or open examples of doing something like this? diff --git a/doc/forum/Using_git-annex_as_a_library/comment_1_1f8e74c5856f21c53d5a91892cbef0c6._comment b/doc/forum/Using_git-annex_as_a_library/comment_1_1f8e74c5856f21c53d5a91892cbef0c6._comment new file mode 100644 index 000000000..6ba664aea --- /dev/null +++ b/doc/forum/Using_git-annex_as_a_library/comment_1_1f8e74c5856f21c53d5a91892cbef0c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlaQ9Hd5o_wjCIcfC9MAx8GRli5-LyBang" + nickname="George" + subject="comment 1" + date="2013-06-29T16:07:45Z" + content=""" +I should say specifically interfacing with git-annex +"""]] diff --git a/doc/forum/Using_git-annex_as_a_library/comment_2_11a243fa7d8ac947aa9a798228dbd191._comment b/doc/forum/Using_git-annex_as_a_library/comment_2_11a243fa7d8ac947aa9a798228dbd191._comment new file mode 100644 index 000000000..4177d7d20 --- /dev/null +++ b/doc/forum/Using_git-annex_as_a_library/comment_2_11a243fa7d8ac947aa9a798228dbd191._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 2" + date="2013-06-30T18:08:52Z" + content=""" +I think there are two approaches to doing this. + +1. Use the git-annex command line interface from your program. You can use the --json switch to enable machine-parsable output of many git-annex commands. If something needs work to be more suitable to be used as \"plumbing\" in this way, we can improve it to meet your needs. + +2. Use the git-annex Haskell code as a library for your program. The git-annex assistant is a great example of how far you can take this. It has the benefit that by accessing git-annex's internals, you can sometimes do things more efficiently than by using the CLI. Much of git-annex's code is already well modularized and suitable for use as a library in this way. The build system doesn't currently spit out git-annex libraries, but it would not be hard to make it do so. Of course this would entail writing at least some of your program in Haskell. +"""]] diff --git a/doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment b/doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment new file mode 100644 index 000000000..cda6e0799 --- /dev/null +++ b/doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Alexcei" + ip="92.255.239.77" + subject="comment 3" + date="2014-03-25T05:43:36Z" + content=""" +With version 5.20140127 first approach became impossible. Why did you decide to remove json supported by the majority of command? +"""]] diff --git a/doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment b/doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment new file mode 100644 index 000000000..642fda2fe --- /dev/null +++ b/doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 4" + date="2014-03-26T18:31:30Z" + content=""" +I didn't. I removed the --json options from commands that didn't necessarily output valid json when used with it. There are numerous commands that support --json (find, whereis, info, status, metadata, examinekey), and I'm open to adding it to other commands -- but it's probably not feasible to make commands like `get` output json, since their output includes progress info printed by rsync etc. +"""]] diff --git a/doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn b/doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn new file mode 100644 index 000000000..5eba701bd --- /dev/null +++ b/doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn @@ -0,0 +1,3 @@ +After installing the binary for Mac OS X and including some larger directories, my computer now seems quite busy (for the last days) with the import process. I see a process called git-annex causing the load, so it seems OK. As the git-annex assistant seems to hang quite a bit, I would like to see the progress using a command line interface. However, I cannot use the "git annex" command as I get the message "git: 'annex' is not a git command. See 'git --help'." + +I guess this is my normal git version, installed by homebrew (the OS X version for apt-get) that does not know anything about the installed binary. Can I still use the CLI with this version? Or better, is there or will there be a way to install git-annex from source, or even better using "brew install git-annex"? diff --git a/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment b/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment new file mode 100644 index 000000000..1f51e6c97 --- /dev/null +++ b/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaZYaspvzx1lQiM56UQo-X82BnPiAaiEY" + nickname="Martin" + subject="comment 1" + date="2013-08-19T18:07:04Z" + content=""" +One more question. When running the git-annex binary the webapp opens. After closing the window I cannot access the webapp anymore. Using the IP + port number (http://127.0.0.1:53027/) does not work. Would be handy to have a bookmark for the webapp that works as long as the assistant is running. +"""]] diff --git a/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_2_52d8ffba82e29ac2722a8e43e469cc47._comment b/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_2_52d8ffba82e29ac2722a8e43e469cc47._comment new file mode 100644 index 000000000..b30773cd2 --- /dev/null +++ b/doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_2_52d8ffba82e29ac2722a8e43e469cc47._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaZYaspvzx1lQiM56UQo-X82BnPiAaiEY" + nickname="Martin" + subject="git-annex via comand line" + date="2013-08-19T21:53:11Z" + content=""" +Just found the page how to install the CLI on OS X: http://git-annex.branchable.com/install/OSX/ +That solved all my questions for now. +"""]] diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks.mdwn b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks.mdwn new file mode 100644 index 000000000..3420c129f --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks.mdwn @@ -0,0 +1,8 @@ +Hallo, + +I have got a Samsung Galaxy Note 10.1 I want to sync with a remote ssh-Server, but the tablet only supports exFAT and FAT file Systems, so I cannot use symlinks. + +Does any solution exist for this? + +Mebus + diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_1_b9f202a30ba7e3bc264064d24454c099._comment b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_1_b9f202a30ba7e3bc264064d24454c099._comment new file mode 100644 index 000000000..f5d4b3cdd --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_1_b9f202a30ba7e3bc264064d24454c099._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-22T17:37:44Z" + content=""" +The sad state of affairs that in the supposedly modern 21st century, popular operating systems are regressing in functionality? + +Yes, git-annex can deal with this. `git annex init` will detect when it's run on a crippled filesystem and enable various workarounds, including [[direct_mode]]. + +The git-annex android app deals with all this automatically when creating a repository. +"""]] diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment new file mode 100644 index 000000000..493aaf65e --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="Mebus" + ip="2001:4dd0:ff00:29::2" + subject="comment 2" + date="2013-10-31T23:39:42Z" + content=""" +Hallo, + +I tried it again. + +On the Android tablet I get many files, which have got a size of 200 Bytes. And they should at least be a view kB. + +Why? + +Mebus + + +"""]] diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_3_076f22d05fad140068a540e4d835106f._comment b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_3_076f22d05fad140068a540e4d835106f._comment new file mode 100644 index 000000000..0fb4f61e2 --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_3_076f22d05fad140068a540e4d835106f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-01T16:42:33Z" + content=""" +Files in the git repository whose content has not yet been downloaded will appear as these short placeholder files when using a filesystem that does not support symlinks. Once the files have been downloaded, that is replaced with their actual content. You may need to set up a way to your android tablet to download the files from the place they're being created. +"""]] diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_4_c8446ee1b817f1824fa0df07e742015c._comment b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_4_c8446ee1b817f1824fa0df07e742015c._comment new file mode 100644 index 000000000..cd42b6c15 --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_4_c8446ee1b817f1824fa0df07e742015c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Mebus" + ip="2001:4dd0:ff00:29::2" + subject="comment 4" + date="2013-11-11T20:24:11Z" + content=""" +Does it have to be the place, where they were created or can this also be a central server, I pushed everything to? + +Mebus + + +"""]] diff --git a/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_5_f746c1b85ee8e4b57b6819ccceabd28b._comment b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_5_f746c1b85ee8e4b57b6819ccceabd28b._comment new file mode 100644 index 000000000..676e7b6f1 --- /dev/null +++ b/doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_5_f746c1b85ee8e4b57b6819ccceabd28b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 5" + date="2013-11-13T16:37:46Z" + content=""" +The git-annex app will download the files from any remote you set up that has a copy of the file. A transfer remote in the cloud would work well. +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn new file mode 100644 index 000000000..1e6443038 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn @@ -0,0 +1,5 @@ +I've got a Freebox Revolution set-top box / TV NAS at home, with some preconfigured layou for videos, photos and music. + +I'd like to use it as a git-annex remote, but am afraid there's no support for FTP (authenticated) or SMB shares exported by the NAS (I don't think it supports other protocols even though runs Linux internally, AFAIK). + +Is there any option to store much on that NAS and sync it with git-annex ? diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_1_bd73c8d10028e1b45da9ea8f657e5064._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_1_bd73c8d10028e1b45da9ea8f657e5064._comment new file mode 100644 index 000000000..d5e8d5404 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_1_bd73c8d10028e1b45da9ea8f657e5064._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="Similar to "direct special remotes"" + date="2013-08-16T17:57:26Z" + content=""" +You have a very similar problem as I do. + +See my post where I called this [direct special remotes](http://git-annex.branchable.com/forum/Direct_special_remotes/). +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_2_16c3c994ee8fcb466e52ca0e812e5915._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_2_16c3c994ee8fcb466e52ca0e812e5915._comment new file mode 100644 index 000000000..93eef7322 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_2_16c3c994ee8fcb466e52ca0e812e5915._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="Except I don't have rsync/sftp on the NAS AFAICT" + date="2013-08-17T08:56:37Z" + content=""" +There seemed to be some hope with rsync in your case, but not mine. Thanks anyway for the pointer. +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_3_ac60f6edb76bdd541711e472eec9591a._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_3_ac60f6edb76bdd541711e472eec9591a._comment new file mode 100644 index 000000000..8729a8481 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_3_ac60f6edb76bdd541711e472eec9591a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="Experimenting with a CIFS mount point of the NAS and direct mode" + date="2013-08-17T22:11:19Z" + content=""" +I've been experimenting with a direct mode repo on a CIFS mount of the SMB share of the NAS. + +Unfortunately, it seems I can't propagate changes made on the laptop to the mount point by issueing a git pull or merge, as it is part of the unsafe commands that don't support direct mode (see details in )... direct mode wouldn't be very useful then : I intend to mirror on the NAS the files I've been managing locally. For instance I will sort my photos in subdirs, on the laptop, and intend to mirror that on the NAS. +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_4_2194f0600d9a90f0d9c947ea9cc213a3._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_4_2194f0600d9a90f0d9c947ea9cc213a3._comment new file mode 100644 index 000000000..4a59acdeb --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_4_2194f0600d9a90f0d9c947ea9cc213a3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 4" + date="2013-08-23T17:55:39Z" + content=""" +Just run `git annex sync` to update the direct mode repository on your NAS. +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment new file mode 100644 index 000000000..e014efb86 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment @@ -0,0 +1,48 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="So it seems I have found a sequence that seems to be operating fine" + date="2013-08-23T20:28:45Z" + content=""" +Here's a script, which I think makes it work, using git clone, git annex copy and git annex sync : + # The \"master\" remote which is with default indirect mode, on a Linux FS + BASE1=~/tmp + REPO1=$BASE1/annex-test + + # The \"slave\" remote on the NAS (a Samba server), which has been mounted with cifs, and thus will be in direct mode + BASE2=/mnt/freebox-server/ + REPO2=$BASE2/annex-test + + cd $BASE1 + mkdir $REPO1 + cd $REPO1 + git init + git annex init \"my laptop\" + + cd $REPO1 + cp -Lr ~/some_large_files ./ + git annex add some_large_files + git commit -m \"added\" + + cd $BASE2 + git clone $REPO1 $REPO2 + cd $REPO2 + + git annex init \"freebox server\" + # This is not really needed, but if you want to replicate on a non cifs mount + git annex direct + + cd $REPO1 + git remote add freebox-server $REPO2 + + git annex copy --to freebox-server + git annex sync + + cd $REPO2 + git remote add laptop $REPO1 + #git annex sync + +After this, you should have your .git and plain \"direct\" files on the NAS, mirrored from what's on the laptop. + +Hope this helps. +"""]] diff --git a/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_6_ae323b16ddb9342e91be955408eca3b1._comment b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_6_ae323b16ddb9342e91be955408eca3b1._comment new file mode 100644 index 000000000..44d3f5a85 --- /dev/null +++ b/doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_6_ae323b16ddb9342e91be955408eca3b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 6" + date="2013-08-24T15:58:28Z" + content=""" +You can run any of these operations in any order and it will work. Ie, this is far more complicated and detailed than it needs to be. Just run git-annex commands in any order to do what you want to do. If they don't, file a (detailed) bug report. +"""]] diff --git a/doc/forum/View_performance_with_7__44__000_files.mdwn b/doc/forum/View_performance_with_7__44__000_files.mdwn new file mode 100644 index 000000000..21491c77f --- /dev/null +++ b/doc/forum/View_performance_with_7__44__000_files.mdwn @@ -0,0 +1,26 @@ +I've imported about half of my photos into an annex on an external HDD, +using metadata extensively for EXIF info, including place names. + +Checking out a new view is slower than I expected, at ~6 minutes. +Is this expected behavior, am I pushing the limits of file count already? + +Is there anything I can do to speed things up? + + % ls -1 | wc -l + 7050 + + % git branch -vv + git-annex 4e590d4 update + * master 985ba54 add jen's phone backups + views/Year=_;Month=_;Address=_ 795a58b refs/heads/views/Year=_;Month=_;Address=_ + + % /usr/bin/time -p git annex view "Year=*" "Address=*" + view (searching...) + + Checking out files: 100% (12789/12789), done. + Switched to branch 'views/Year=_;Address=_' + ok + real 376.80 + user 17.98 + sys 9.66 + diff --git a/doc/forum/View_performance_with_7__44__000_files/comment_1_e45ea752100d09d29efb6136a722eab3._comment b/doc/forum/View_performance_with_7__44__000_files/comment_1_e45ea752100d09d29efb6136a722eab3._comment new file mode 100644 index 000000000..cf6f140b2 --- /dev/null +++ b/doc/forum/View_performance_with_7__44__000_files/comment_1_e45ea752100d09d29efb6136a722eab3._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmvzzyDA8uXFz8yokeCrepbh8PwWe_WrjE" + nickname="Michael" + subject="debug output" + date="2014-06-16T14:17:06Z" + content=""" +So after looking for a debug flag, I see that it's spending all its time in cat-file, which I guess is probably not a surprise: + + % /usr/bin/time -p git annex view \"Year=*\" \"Address=*\" -d + view [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"symbolic-ref\",\"HEAD\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"show-ref\",\"refs/heads/master\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"symbolic-ref\",\"HEAD\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"show-ref\",\"refs/heads/master\"] + (searching...) + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"/Volumes/Four TB Backup/Photos\"] + [2014-06-16 06:29:12 PDT] feed: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"update-index\",\"-z\",\"--index-info\"] + [2014-06-16 06:29:12 PDT] chat: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"show-ref\",\"git-annex\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2014-06-16 06:29:12 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"log\",\"refs/heads/git-annex..4e590d433e01886e2823c3316d18b7e3cbafe227\",\"--oneline\",\"-n1\"] + [2014-06-16 06:29:12 PDT] chat: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"cat-file\",\"--batch\"] + [2014-06-16 06:34:54 PDT] read: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"write-tree\"] + [2014-06-16 06:34:55 PDT] chat: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"commit-tree\",\"c0fd1ea9ccae70a7353a2e787089b88115a42b7a\"] + [2014-06-16 06:34:55 PDT] call: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"update-ref\",\"refs/heads/views/Year=_;Address=_\",\"249c37d78e45d1fccfcb00f40337e05cb69fb64c\"] + + [2014-06-16 06:34:55 PDT] call: git [\"--git-dir=/Volumes/Four TB Backup/Photos/.git\",\"--work-tree=/Volumes/Four TB Backup/Photos\",\"checkout\",\"views/Year=_;Address=_\"] + Checking out files: 100% (12789/12789), done. + Switched to branch 'views/Year=_;Address=_' + ok + real 362.14 + user 18.16 + sys 7.70 + +"""]] diff --git a/doc/forum/View_performance_with_7__44__000_files/comment_2_b1942eed65e9b5c046095a094191a38c._comment b/doc/forum/View_performance_with_7__44__000_files/comment_2_b1942eed65e9b5c046095a094191a38c._comment new file mode 100644 index 000000000..91259f335 --- /dev/null +++ b/doc/forum/View_performance_with_7__44__000_files/comment_2_b1942eed65e9b5c046095a094191a38c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-06-16T17:52:34Z" + content=""" +View's don't scale to lots of files yet. Discussed in [[design/caching_database]] +"""]] diff --git a/doc/forum/View_performance_with_7__44__000_files/comment_3_e6e19339c9d72cf8eaae32ef4269e850._comment b/doc/forum/View_performance_with_7__44__000_files/comment_3_e6e19339c9d72cf8eaae32ef4269e850._comment new file mode 100644 index 000000000..01ac676cb --- /dev/null +++ b/doc/forum/View_performance_with_7__44__000_files/comment_3_e6e19339c9d72cf8eaae32ef4269e850._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmvzzyDA8uXFz8yokeCrepbh8PwWe_WrjE" + nickname="Michael" + subject="comment 3" + date="2014-06-16T18:19:20Z" + content=""" +@joeyh, thanks - is that code all up to date here: https://github.com/joeyh/git-annex/tree/database ? + +I'd be interested in helping test it. +"""]] diff --git a/doc/forum/WARNING:_linker:git-annex_has_text_relocations....mdwn b/doc/forum/WARNING:_linker:git-annex_has_text_relocations....mdwn new file mode 100644 index 000000000..2d9ee1324 --- /dev/null +++ b/doc/forum/WARNING:_linker:git-annex_has_text_relocations....mdwn @@ -0,0 +1,7 @@ +I have configured git-annex on my Nexus 5. Even though it works fantastic, it shows some warning messages. + +1: 'git-annex sync' : WARNING: linker: git-annex has text relocations. This is wasting memory and is a security risk. Please fix. + +2: 'git log': error: cannot run less. No such file or directory. + +Both the commands will work has expected with these warnings. What could be the issue here. diff --git a/doc/forum/WARNING:_linker:git-annex_has_text_relocations.../comment_1_fee360353f0b46aab6ee7a902c0837bb._comment b/doc/forum/WARNING:_linker:git-annex_has_text_relocations.../comment_1_fee360353f0b46aab6ee7a902c0837bb._comment new file mode 100644 index 000000000..8d9af9624 --- /dev/null +++ b/doc/forum/WARNING:_linker:git-annex_has_text_relocations.../comment_1_fee360353f0b46aab6ee7a902c0837bb._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T20:38:03Z" + content=""" + +Says that should have been fixed in ndk-r8c's gcc, but git-annex is already built with ndk-r9b. It might be though, that the llvm compiler still has the problem. In any case, I doubt there is a real security issue here, it's probably just a binary exploit hardening thing. + +As for the git log, git users the less pager by default, but of course it's not necessary and so not included on Android. You can `git config core.pager cat` to get around this. +"""]] diff --git a/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__.mdwn b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__.mdwn new file mode 100644 index 000000000..c6cb35912 --- /dev/null +++ b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__.mdwn @@ -0,0 +1,16 @@ +I'm trying to use git-annex as a dropbox-replacement, but I'm hitting unexpected things although I'm doing exactly what I see in the walkthrough screencast and/or the walkthrough commands. I'm using Ubuntu 13.10, installed git-annex with apt-get. It is version 4.20130815. + +1) I launch the webapp and create an ~/annex folder as my initial repo. I copy some small text files in it, I see in webapp that they are added. +2) I add a new "Removable Storage" repo, in my usb drive. I do not touch any other settings, leave it as is. (ie in transfer group for example). It is successfully added to the repo list and I see sync complete and files synced on the webapp. +3) When I check the contents of the usb disk annex folder, I see the following, while I was expecting to see the files I synced instead. + +emre@emrenb:~$ ls /media/emre/348B-78F0/annex/ +annex branches config description HEAD hooks info objects refs + +However, I expect the below which is the content of my ~/annex folder: +emre@emrenb:~$ ls annex/ +unison-sync.log unison-1.log unison-2.log unison.log + +In the walkthrough video, when Joey adds a USB storage, the filenames & thir contents sync to the usb drive. Why doesn't it work for me? + +Note that I tried also android app and also the zipped tarball build. Same result, I never see actual files. diff --git a/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_1_cdac15fec6fc41d5487b7f653fa718a4._comment b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_1_cdac15fec6fc41d5487b7f653fa718a4._comment new file mode 100644 index 000000000..437e2ecdc --- /dev/null +++ b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_1_cdac15fec6fc41d5487b7f653fa718a4._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Default removable storage repo not readable without git annex" + date="2013-10-21T08:50:50Z" + content=""" +Hi, + +Sounds to me you are expecting the files to be readable by a filemanager? By default a removable drive repo is only readable by git-annex. + +The standard use case is to move files between computers with git-annex installed. I agree this is not what you´d expect. + +Read and the last post of for more info. +"""]] diff --git a/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_2_82050b7dc367ca5968ab0306db9bd7e3._comment b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_2_82050b7dc367ca5968ab0306db9bd7e3._comment new file mode 100644 index 000000000..edcc49a35 --- /dev/null +++ b/doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_2_82050b7dc367ca5968ab0306db9bd7e3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 2" + date="2013-10-21T22:29:14Z" + content=""" +Kalle is right (I seem to keep saying that, Kalle!) + +Following the walkthrough commands will get you a non-bare git repository on a removable drive, and you can run \"git annex sync\" in there periodically and see all the files in your repository on the removable drive. The webapp does not make that kind of repository though, and in the screencast I'm showing the normal behavior of the webapp. +"""]] diff --git a/doc/forum/Walkthrough_for_direct_mode__63__.mdwn b/doc/forum/Walkthrough_for_direct_mode__63__.mdwn new file mode 100644 index 000000000..b3fae2944 --- /dev/null +++ b/doc/forum/Walkthrough_for_direct_mode__63__.mdwn @@ -0,0 +1 @@ +Hello Joey, I would be very much interested in a walkthrough for direct mode, as detailed as the one currently published. I see the comments in the current walkthrough on some differences to direct mode, but to me it is not obvious what best practices for git-annex use would be in direct mode, with and without the assistant. For a mix of Linux, OS X and Windows installations in the homes, it may also be interesting to see how to best set up the individual machines. Many thanks - diff --git a/doc/forum/Want_to_stop_using_Git-Annex.mdwn b/doc/forum/Want_to_stop_using_Git-Annex.mdwn new file mode 100644 index 000000000..a076cf1b0 --- /dev/null +++ b/doc/forum/Want_to_stop_using_Git-Annex.mdwn @@ -0,0 +1,9 @@ +Hi + +I created a git annex repo in one of my drives. But now all my files have turned into symbolic links. +I need to remove the git repo and get my files back. How can I do that. + +Some of the softwares am using will not follow symbolic links, so need put the files back properly as soon as possible. + +Please help. +Thank you in advance :) diff --git a/doc/forum/Want_to_stop_using_Git-Annex/comment_1_32e37515bd4f5d22ff9aedd3c9d98046._comment b/doc/forum/Want_to_stop_using_Git-Annex/comment_1_32e37515bd4f5d22ff9aedd3c9d98046._comment new file mode 100644 index 000000000..9937e5d0c --- /dev/null +++ b/doc/forum/Want_to_stop_using_Git-Annex/comment_1_32e37515bd4f5d22ff9aedd3c9d98046._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="Direct mode" + date="2014-06-27T07:36:40Z" + content=""" +Hi + +[[direct_mode/]] is your friend. +"""]] diff --git a/doc/forum/Want_to_stop_using_Git-Annex/comment_2_e29e6d052ef3677ad7d5615721f3fe33._comment b/doc/forum/Want_to_stop_using_Git-Annex/comment_2_e29e6d052ef3677ad7d5615721f3fe33._comment new file mode 100644 index 000000000..0eddeb201 --- /dev/null +++ b/doc/forum/Want_to_stop_using_Git-Annex/comment_2_e29e6d052ef3677ad7d5615721f3fe33._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-07-02T17:04:29Z" + content=""" +git annex uninit +"""]] diff --git a/doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn b/doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn new file mode 100644 index 000000000..3d185ba80 --- /dev/null +++ b/doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn @@ -0,0 +1,12 @@ +Hello, + +I'm not sure about the differences and interactions between watch / assistant / webapp / direct mode. I think I figured the following out, can someone confirm this, and perhaps a few words to the documentation / man page? + +- git annex watch uses inotify to find new files, and runs git annex add on them (it does not do regular git add) +- git annex assistant does the same as watch, but also runs git annex sync for each new file (does it also enable direct mode?) +- git annex webapp does the same as assistant, and also starts a webapp (in my case it immediately started sending files to origin, without asking for confirmation, which was surprising, I guess this is because I have * annex.numcopies=2 set, and there was only one copy. Still I interpreted the documentation as if it would only show me an interface, not start doing things right away.) + +Do these commands do anything else than what I described above? + +best regards, +Tom diff --git a/doc/forum/Watch__47__assistant__47__webapp_documentation/comment_1_adb377589dbae7fc91001df235c6b48e._comment b/doc/forum/Watch__47__assistant__47__webapp_documentation/comment_1_adb377589dbae7fc91001df235c6b48e._comment new file mode 100644 index 000000000..556cf4f9b --- /dev/null +++ b/doc/forum/Watch__47__assistant__47__webapp_documentation/comment_1_adb377589dbae7fc91001df235c6b48e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-07T18:12:17Z" + content=""" +Most of this is explained pretty well on the [[man page|git-annex]]. + +`git annex webapp` doesn't do anything on its own, other than start the assistant if it is not already running, and point your browser at its built-in webapp. Starting the assistant manually will always have the same effect as opening the webapp. + +The assistant syncs files as configured by the preferred content settings of repositories. There's an interface to disable this syncing in the webapp, or change the setting to something that doesn't prefer all content be synced to a repository. This syncing of content is different from `git annex sync`, which only syncs git repository data. It's more like running `git annex copy --auto` + +The assistant enables direct mode when a new repository is created (using the webapp). It does not enable direct mode when run in an existing repository. +"""]] diff --git a/doc/forum/Webapp_not_watching_repos.mdwn b/doc/forum/Webapp_not_watching_repos.mdwn new file mode 100644 index 000000000..b751b6563 --- /dev/null +++ b/doc/forum/Webapp_not_watching_repos.mdwn @@ -0,0 +1 @@ +I am using the webapp to watch 3 repositories. When I run git annex webapp it starts watching one of the repos but unless I switch to other repos it does not start noticing changes after switching to each repo once it works as intended. diff --git a/doc/forum/Webapp_not_watching_repos/comment_1_02735050122afdb6498d91b462d32767._comment b/doc/forum/Webapp_not_watching_repos/comment_1_02735050122afdb6498d91b462d32767._comment new file mode 100644 index 000000000..9b0d61af1 --- /dev/null +++ b/doc/forum/Webapp_not_watching_repos/comment_1_02735050122afdb6498d91b462d32767._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-27T19:02:28Z" + content=""" +Each separate repository needs to have a separate `git annex assistant` process handling it. + +Normally, these would all be started when `git annex assistant --autostart` is run, typically when you log into a desktop environment. + +So, on Linux, this is done via a .desktop file (or you can arrange for the command to be run as the right user at boot if not using a desktop); on OSX it's done via a .plist file. On Windows and Android, nothing handles the autostarting yet. +"""]] diff --git a/doc/forum/Webapp_not_watching_repos/comment_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment b/doc/forum/Webapp_not_watching_repos/comment_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment new file mode 100644 index 000000000..63573b023 --- /dev/null +++ b/doc/forum/Webapp_not_watching_repos/comment_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2013-12-27T22:40:06Z" + content=""" +I don't have a desktop env. just plain xmonad, so the correct sequence to start the webapp is, + + git annex assistant --autostart && git annex webapp + +right? +"""]] diff --git a/doc/forum/Webapp_not_watching_repos/comment_3_b448aa5a95a57a5228b361390e5fc838._comment b/doc/forum/Webapp_not_watching_repos/comment_3_b448aa5a95a57a5228b361390e5fc838._comment new file mode 100644 index 000000000..92fd3cb45 --- /dev/null +++ b/doc/forum/Webapp_not_watching_repos/comment_3_b448aa5a95a57a5228b361390e5fc838._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2013-12-29T17:59:53Z" + content=""" +In this case, I would probably put `git annex assistant --autostart` in `.xinitrc`, or even make a @reboot cron job that starts it. The webapp can then be opened with `git annex webapp` at any time. (The webapp is not a separate process and does not need to be started at login.) +"""]] diff --git a/doc/forum/Webapp_on_ARM.mdwn b/doc/forum/Webapp_on_ARM.mdwn new file mode 100644 index 000000000..c9766dd8c --- /dev/null +++ b/doc/forum/Webapp_on_ARM.mdwn @@ -0,0 +1,6 @@ +Webapp on ARM? +============== + +Since the webapp is apparently now available on Android (not tested yet, but I plan to do it soon ;)), I was wondering what was the status of the webapp on ARM. Does it build, does it work, and if it does would it be possible to enable it in the Debian package for the next release? + +For the record, I'm using git-annex on my NAS (Synology DS413j). I'm using the Debian armel package and running it in an Arch Linux chroot (a very simple setup). It works really well, and I'm extremely satisfied with git-annex. Thanks a lot for all your work, Joey *et al.*! diff --git a/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment b/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment new file mode 100644 index 000000000..00e3fed26 --- /dev/null +++ b/doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.10" + subject="comment 1" + date="2013-07-22T19:13:38Z" + content=""" +To build the WebApp on arm, you need a ghc that supports template haskell on arm. While I have heard persistent rumors of such a thing existing, I have yet to see it. + +It's possible to build the WebApp on arm without that, but it's a complicated process, involving first building on x86 with the same versions of the haskell libraries that you have on the arm system, and then using the EvilSplicer to generate a source tree with the template haskell expanded, which can then be built on arm. This build process is not really suitable for a Debian package. +"""]] diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn new file mode 100644 index 000000000..055a09e2a --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn @@ -0,0 +1,12 @@ +I am having some weird issues with git annex under OS X. I am new to git annex, and am generally familiar with git. I really like the concept of git-annex and am trying to lean how to fit it into my workflow, but Im running into problems. + +I have a folder that I would like to keep in sync across multiple computers and thumb drives. Right now this folder consists of other folders and PDF files. After initializing git and git-annex, all of the files turn into symlinks, as expected. + +Looking at this folder in OSX's finder, none of the symlinks have preview images unfortunately, as expected. Also, when trying to open the file (or symlink, and in this case PDFs) in finder, it opens the console which outputs a bunch of crap and then nothing happens. Right clicking on the symlink in finder and using Open with... the default application to open the symlink to the PDF is OSX's Preview.app, as expected, however for some reason this isn't being used when simple double clicking. If you click on the Preview.app option under the right click menu, Preview.app launches, but never opens the file. Selecting an alternative such as the Skim.app pdf viewer (if installed) successfully launches the application and opens the file. + +My questions are: +1. What is the cause of not being able to launch the file in the correct app by simply double clicking it? Do I have something mis-configued? Is it a bug with git-annex? Is git-annex simply not set up to work with finder yet? +2. How come preview can't open the file but skim can? This might be directly related to the above question, but maybe not. +3. Is it possible to get file previews for the symlinks in your annex folder? Are there plans to enable this kind of thing in the future, if even possible? + +Details about my setup. I am running on a 32-bit Core Duo Macbook pro from 2006, so enviably I have to run 10.6.8 and its the highest OS version I can reach right now. All my CLI packages are installed and up to date with Mac Homebrew. I am running git version 1.7.12. I freshly installed haskell-platform: stable 2012.2.0.0 via homebrew. From there I installed git-annex-3.20120825. diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_1_8c8d86790a9d31518f9bb96a2d2dafee._comment b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_1_8c8d86790a9d31518f9bb96a2d2dafee._comment new file mode 100644 index 000000000..4234eac2b --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_1_8c8d86790a9d31518f9bb96a2d2dafee._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 1" + date="2012-09-09T17:22:58Z" + content=""" +It is unfortunate that certain badly-coded programs fall over on symlinks. In theory, any program that doesn't try to be too smart for its own good will see a symlink as just like the file it links to, and should behave the same. This is the theory that led me to use symlinks in git-annex. But some programs say \"oh, a symlink! Let's see what file that's pointing at, and behave differently!\" I don't understand the mindset that leads to this kind of program being written, unless it's a program like `cp`, that has very good reasons for (at your command) following symlinks or not. + +I know absolutely nothing about Mac OSX, having never used it (except for in a ssh session while porting git-annex to it). But I have seen a similar problem with the FBReader ebook viewer. [Bug report](http://bugs.debian.org/685433) + +I was able to work around that bug by migrating my files to the SHA256E backend. This ensures that the keys stored in git-annex have extensions like .pdf etc, similar to the symlinks that point to them. You might try migrating some of your files too, and see if it makes OSX behave better. Although I thought OSX didn't rely on file extensions to determine file type.. + +Anyway, the command is: + + git annex migrate --backend=SHA256E + +I have been considering switching the default backend to SHA256E to avoid this type of problem. Your testing will be important grist for that decision. +"""]] diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment new file mode 100644 index 000000000..ee09be502 --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://mike.magin.org/" + nickname="mmagin" + subject="comment 2" + date="2012-09-11T15:27:58Z" + content=""" +I've been using git-annex mostly on Mac OS X, and it rapidly caused me to switch to SHA256E. I'd certainly be in favor of it being the default. Aside from [[bugs/fsck thinks file content is bad when it isn't]] (fixed by the time I encountered it), I have had no issues with it so far. +"""]] diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_3_16e6724fa184392d4decbe0c4eb6efe6._comment b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_3_16e6724fa184392d4decbe0c4eb6efe6._comment new file mode 100644 index 000000000..0315feb64 --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_3_16e6724fa184392d4decbe0c4eb6efe6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="comment 3" + date="2012-09-12T09:23:51Z" + content=""" +Sorry for the delayed response. I am in the middle of an apartment move. + +I tried changing my default PDF viewer to Skim to see if that improved anything. Nada. Same thing. Finder opens the terminal and outputs a bunch of nonsense. + +I tried `git annex migrate --backend=SHA256E` and it seemed to really improve things from finders point of view. Still not icon previews, but you can launch every file by double clicking it and preview is able to follow the symlink. + +Note, I am on OS X 10.6. I cant upgrade to 10.7+ due to my laptops aging processor (10.7+ requires 64-bit intel chips) and thus can't test git-annex on a more modern OS version. Someone should test it out on a newer version of OS X before chaining any defaults, however, it seems to really improve things for the setup I have. +"""]] diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_4_e514fe2d4d0ad6a10e281939e6ab4266._comment b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_4_e514fe2d4d0ad6a10e281939e6ab4266._comment new file mode 100644 index 000000000..aa50ab57c --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_4_e514fe2d4d0ad6a10e281939e6ab4266._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 4" + date="2012-09-12T20:32:52Z" + content=""" +I see a migration to SHA256E currently outputs: + +migrate issue.txt (checksum...) (Recording state in git...) +ok + +Is that verifying the existing checksum or re-computing it to re-name the file? If the latter, couldn't the SHA256 to SHA256E migration just rename the file? + +I would be worried about this process hiding data corruption.. If it isn't using the old checksum but instead re-computing a new one then it would be easy to miss the fact that a files checksum changed during this process. +"""]] diff --git a/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment new file mode 100644 index 000000000..254a524aa --- /dev/null +++ b/doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 5" + date="2012-09-14T04:20:27Z" + content=""" +Good catch, I've made it verify the old checksum first. + ++/- E migrations are not currently optimised. +"""]] diff --git a/doc/forum/What_can_be_done_in_case_of_conflict.mdwn b/doc/forum/What_can_be_done_in_case_of_conflict.mdwn new file mode 100644 index 000000000..42167a609 --- /dev/null +++ b/doc/forum/What_can_be_done_in_case_of_conflict.mdwn @@ -0,0 +1,7 @@ +Hi, + +How can I resolve the conflict when it occurs? + +Suppose I have 2 branches (master, current), When I merge these branches or while doing cherry-pick, if I get conflict how can I resolve it? + +Thank You diff --git a/doc/forum/What_can_be_done_in_case_of_conflict/comment_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment b/doc/forum/What_can_be_done_in_case_of_conflict/comment_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment new file mode 100644 index 000000000..6f1d24130 --- /dev/null +++ b/doc/forum/What_can_be_done_in_case_of_conflict/comment_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-04-23T14:29:03Z" + content=""" +You handle conflicts in annexed files the same as you would handle them in other binary files checked into git. + +For example, you might choose to `git rm` or `git add` the file to resolve the conflict. + +[[Previous_discussion|forum/A_really_stupid_question]] +"""]] diff --git a/doc/forum/What_can_be_done_in_case_of_conflict/comment_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment b/doc/forum/What_can_be_done_in_case_of_conflict/comment_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment new file mode 100644 index 000000000..f4293d9c1 --- /dev/null +++ b/doc/forum/What_can_be_done_in_case_of_conflict/comment_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="Resolving conflict" + date="2012-04-24T03:59:31Z" + content=""" +Hi, +Now I am able to resolve the conflict. +Thank you. +"""]] diff --git a/doc/forum/What_can_be_done_in_case_of_conflict/comment_3_017f4bac57a040c496e0c9d068dcfd9e._comment b/doc/forum/What_can_be_done_in_case_of_conflict/comment_3_017f4bac57a040c496e0c9d068dcfd9e._comment new file mode 100644 index 000000000..a0d3ded39 --- /dev/null +++ b/doc/forum/What_can_be_done_in_case_of_conflict/comment_3_017f4bac57a040c496e0c9d068dcfd9e._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYu7QmD7wrbHWkoxuriaA9XcijM-g5vrQ" + nickname="Royal" + subject="Resolving conflict" + date="2012-04-23T15:49:30Z" + content=""" +Thanks for the reply. + +I am executing the following commands. + +git init main +cd main +git annex init main +echo a > a +git annex add a +git commit -m Initial +git annex unlock a +echo aa > a +git annex add a +git commit -m first +git annex unlock a +echo aaa > a +git annex add a +git commit -m second +git log +git cherry-pick + +-------------------- +Error: + +error: could not apply 2be8f38... first +hint: after resolving the conflicts, mark the corrected paths +hint: with 'git add ' or 'git rm ' +hint: and commit the result with 'git commit' + +How can resolve the the above conflict. +If I see the content of the file I will get the content of second commit. +Is there any way I can get the content for first commit(Like in git we have 'theirs' option.) + +Thank you. +"""]] diff --git a/doc/forum/What_happened_to_the_walkthrough__63__.mdwn b/doc/forum/What_happened_to_the_walkthrough__63__.mdwn new file mode 100644 index 000000000..e8098d29a --- /dev/null +++ b/doc/forum/What_happened_to_the_walkthrough__63__.mdwn @@ -0,0 +1 @@ +As of right now (2012-05-24 at 18:00 UTC), the [[Walkthrough]] page is basically empty. Its entire contents are "A walkthrough of the basic features of git-annex." No links (other than the autogenerated "what links to this page" list at the bottom) and no contents. Any idea what happened? diff --git a/doc/forum/What_happened_to_the_walkthrough__63__/comment_1_70db0e3cfb1318e95671c23726e5541d._comment b/doc/forum/What_happened_to_the_walkthrough__63__/comment_1_70db0e3cfb1318e95671c23726e5541d._comment new file mode 100644 index 000000000..cbf852dbf --- /dev/null +++ b/doc/forum/What_happened_to_the_walkthrough__63__/comment_1_70db0e3cfb1318e95671c23726e5541d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-05-24T19:18:55Z" + content=""" +It seems the pages that are supposed to be inlined are not being found even though they are in `doc/walkthrough/`. +"""]] diff --git a/doc/forum/What_happened_to_the_walkthrough__63__/comment_2_f9305dd19b9b5f35e66d915b8c30374b._comment b/doc/forum/What_happened_to_the_walkthrough__63__/comment_2_f9305dd19b9b5f35e66d915b8c30374b._comment new file mode 100644 index 000000000..9720adfbc --- /dev/null +++ b/doc/forum/What_happened_to_the_walkthrough__63__/comment_2_f9305dd19b9b5f35e66d915b8c30374b._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-05-24T20:15:19Z" + content=""" +Broken last night during upgrade, fixed now, thanks for noticing. +"""]] diff --git a/doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__.mdwn b/doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__.mdwn new file mode 100644 index 000000000..870f8913e --- /dev/null +++ b/doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__.mdwn @@ -0,0 +1 @@ +I want to add an existing repository using the assistant. Is that the way? diff --git a/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 b/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 new file mode 100644 index 000000000..0c7044889 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T19:03:30Z" + content=""" +Sure, you can use that menu item. If you try it out and enter in the path of a repository, you'll see that it offers to either let you combine the two repositories together, or leave them as two unconnected repositories with different files managed by the assistant. +"""]] diff --git a/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn b/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn new file mode 100644 index 000000000..6dd5c16df --- /dev/null +++ b/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn @@ -0,0 +1 @@ +Since all the annexed (in indirect mode) files are symlinks to topdir/.git/annex/... moving files among directories at different levels is not that straightforward since symlinks would get broken. And since there is not 'annex mv' command -- what is the best way? (unlock is not the resolution since it copies the file, which might be prohibitively large and inefficient) diff --git a/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__/comment_1_02d305f307b4d2ff7acd98cb36508a2f._comment b/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__/comment_1_02d305f307b4d2ff7acd98cb36508a2f._comment new file mode 100644 index 000000000..9eae8ef7a --- /dev/null +++ b/doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__/comment_1_02d305f307b4d2ff7acd98cb36508a2f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-12T16:42:54Z" + content=""" +You can move the symlinks however you like (git mv, or regular mv and git add). + +To fix up broken symlinks, you can either run `git annex fix`, or just commit the move. The pre-commit hook fixes up links automatically. +"""]] diff --git a/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__.mdwn b/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__.mdwn new file mode 100644 index 000000000..7222e07b5 --- /dev/null +++ b/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__.mdwn @@ -0,0 +1,3 @@ +What is the difference between "local computer" and "remote server" in the assistant's repository configuration menu? How does git-annex treat the targets differently? + + diff --git a/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__/comment_1_68734a118b7dc0c88ba67eca20953a55._comment b/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__/comment_1_68734a118b7dc0c88ba67eca20953a55._comment new file mode 100644 index 000000000..167d008f9 --- /dev/null +++ b/doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__/comment_1_68734a118b7dc0c88ba67eca20953a55._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-01-25T22:39:20Z" + content=""" +Local computer pairs with another computer on your LAN. You don't need an account on that computer, it can belong to someone else and has to be running the webapp as well for them to verify the pairing. + +Remote server is for people with a ssh server out there, and does not require it be running the assistant, or even have git-annex installed. (Though it works better if at least git-annex is installed on it.) +"""]] diff --git a/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__.mdwn b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__.mdwn new file mode 100644 index 000000000..1504d10cd --- /dev/null +++ b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__.mdwn @@ -0,0 +1 @@ +What do I do when I have set up git-annex to back up a folder to an encrypted remote on a vps, and my laptop was stolen? This recently happened, and luckally I had another backup, but what would I do in the case that I have 1 computer using git-annex, backung ip a folder to an encrypted ssh remote on a vps, and I loose the computer? How do I get the data back then? diff --git a/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment new file mode 100644 index 000000000..832c931b4 --- /dev/null +++ b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-07-26T03:57:06Z" + content=""" +I'm glad you had another backup. That is wise. + +When you have a special remote, that does not store your git repository, but only the contents of files. So if you lose all copies of your git repositories, you have lost all record of the file name associated with a file. It's the same as if `fsck` rescued inodes to `lost+found`; you'd have to manually rename the files to new names. + +Then there's the added complication of the encryption. This depends on how it was set up. If you set up the remote using a GPG key (and didn't lose the key too), you can manually use that key to decrypt the files. On the other hand, if it generated its own key and stored it in the git repo (default with the assistant), then when you lose all copies of the git repo, the key is gone, and your encrypted files are useless. +"""]] diff --git a/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment new file mode 100644 index 000000000..308df9a18 --- /dev/null +++ b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2013-07-26T15:04:31Z" + content=""" +I thought the key was checked into .git in any case, but encrypted in the case of GPG. So .git gone => everything gone in any case. +"""]] diff --git a/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_3_bd506e1ca7307660b3b9769eb97beddb._comment b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_3_bd506e1ca7307660b3b9769eb97beddb._comment new file mode 100644 index 000000000..4591a559e --- /dev/null +++ b/doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_3_bd506e1ca7307660b3b9769eb97beddb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2013-07-26T16:45:26Z" + content=""" +Michael, you're right. Thanks for fact checking my late night comment! ;) +"""]] diff --git a/doc/forum/Where_is_the_content__63__.mdwn b/doc/forum/Where_is_the_content__63__.mdwn new file mode 100644 index 000000000..0d79bbb09 --- /dev/null +++ b/doc/forum/Where_is_the_content__63__.mdwn @@ -0,0 +1,8 @@ +On Android 4.4.4, I can install the most recent git annex. I want to join a git annex running on my linux server. Git annex on android seems to be able to contact remote, and it asks if I want to 'merge' with it. I hope that did not mean erase the remote. Anyway, the sync says it is proceeding, but when it is done, I cannot find a folder with remote copies of files. + +I figure either it worked, or it destroyed my remote. + +After new install, I have folders /sdcard/annex and /sdcard/git-annex.home. I don't find a new folder with name of remote repo, don't understand why. + +Help? + diff --git a/doc/forum/Where_is_the_content__63__/comment_1_812e1cf740cbfa449ab3ef4dd5f2df08._comment b/doc/forum/Where_is_the_content__63__/comment_1_812e1cf740cbfa449ab3ef4dd5f2df08._comment new file mode 100644 index 000000000..423bd82d2 --- /dev/null +++ b/doc/forum/Where_is_the_content__63__/comment_1_812e1cf740cbfa449ab3ef4dd5f2df08._comment @@ -0,0 +1,132 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkpIIYg6Fl7OFsOHVPEchZYj68A3dk4lVg" + nickname="Paul" + subject="install log" + date="2014-07-15T12:02:59Z" + content=""" +Installation starting to /data/data/ga.androidterm +ac90d4f57076a59cac3a8017b89ac9b5ab4e5021 +installing busybox +installing git-annex +installing git-shell +installing git-upload-pack +installing git +installing gpg +installing rsync +installing ssh +installing ssh-keygen +linking ./libexec/git-core/git-show to git +linking ./libexec/git-core/git-cherry-pick to git +linking ./libexec/git-core/git-revert to git +linking ./libexec/git-core/git-rerere to git +linking ./libexec/git-core/git to git +linking ./libexec/git-core/git-cat-file to git +linking ./libexec/git-core/git-archive to git +linking ./libexec/git-core/git-apply to git +linking ./libexec/git-core/git-repack to git +linking ./libexec/git-core/git-replace to git +linking ./libexec/git-core/git-verify-pack to git +linking ./libexec/git-core/git-name-rev to git +linking ./libexec/git-core/git-grep to git +linking ./libexec/git-core/git-format-patch to git +linking ./libexec/git-core/git-log to git +linking ./libexec/git-core/git-read-tree to git +linking ./libexec/git-core/git-fast-export to git +linking ./libexec/git-core/git-mktag to git +linking ./libexec/git-core/git-cherry to git +linking ./libexec/git-core/git-stage to git +linking ./libexec/git-core/git-blame to git +linking ./libexec/git-core/git-help to git +linking ./libexec/git-core/git-tag to git +linking ./libexec/git-core/git-column to git +linking ./libexec/git-core/git-clone to git +linking ./libexec/git-core/git-pack-redundant to git +linking ./libexec/git-core/git-rev-list to git +linking ./libexec/git-core/git-ls-files to git +linking ./libexec/git-core/git-update-index to git +linking ./libexec/git-core/git-merge-tree to git +linking ./libexec/git-core/git-shortlog to git +linking ./libexec/git-core/git-pack-refs to git +linking ./libexec/git-core/git-fsck to git +linking ./libexec/git-core/git-mv to git +linking ./libexec/git-core/git-index-pack to git +linking ./libexec/git-core/git-upload-archive to git +linking ./libexec/git-core/git-unpack-file to git +linking ./libexec/git-core/git-merge-recursive to git +linking ./libexec/git-core/git-checkout to git +linking ./libexec/git-core/git-mailsplit to git +linking ./libexec/git-core/git-whatchanged to git +linking ./libexec/git-core/git-remote-fd to git +linking ./libexec/git-core/git-fsck-objects to git +linking ./libexec/git-core/git-diff to git +linking ./libexec/git-core/git-diff-tree to git +linking ./libexec/git-core/git-check-ref-format to git +linking ./libexec/git-core/git-status to git +linking ./libexec/git-core/git-annotate to git +linking ./libexec/git-core/git-bisect--helper to git +linking ./libexec/git-core/git-mktree to git +linking ./libexec/git-core/git-check-ignore to git +linking ./libexec/git-core/git-clean to git +linking ./libexec/git-core/git-merge to git +linking ./libexec/git-core/git-var to git +linking ./libexec/git-core/git-get-tar-commit-id to git +linking ./libexec/git-core/git-remote-ext to git +linking ./libexec/git-core/git-stripspace to git +linking ./libexec/git-core/git-send-pack to git +linking ./libexec/git-core/git-fetch to git +linking ./libexec/git-core/git-ls-remote to git +linking ./libexec/git-core/git-init to git +linking ./libexec/git-core/git-notes to git +linking ./libexec/git-core/git-commit to git +linking ./libexec/git-core/git-receive-pack to git +linking ./libexec/git-core/git-prune to git +linking ./libexec/git-core/git-update-server-info to git +linking ./libexec/git-core/git-gc to git +linking ./libexec/git-core/git-show-ref to git +linking ./libexec/git-core/git-merge-subtree to git +linking ./libexec/git-core/git-describe to git +linking ./libexec/git-core/git-branch to git +linking ./libexec/git-core/git-checkout-index to git +linking ./libexec/git-core/git-prune-packed to git +linking ./libexec/git-core/git-ls-tree to git +linking ./libexec/git-core/git-hash-object to git +linking ./libexec/git-core/git-push to git +linking ./libexec/git-core/git-for-each-ref to git +linking ./libexec/git-core/git-verify-tag to git +linking ./libexec/git-core/git-diff-files to git +linking ./libexec/git-core/git-check-attr to git +linking ./libexec/git-core/git-mailinfo to git +linking ./libexec/git-core/git-check-mailmap to git +linking ./libexec/git-core/git-fetch-pack to git +linking ./libexec/git-core/git-diff-index to git +linking ./libexec/git-core/git-add to git +linking ./libexec/git-core/git-config to git +linking ./libexec/git-core/git-merge-ours to git +linking ./libexec/git-core/git-symbolic-ref to git +linking ./libexec/git-core/git-init-db to git +linking ./libexec/git-core/git-pack-objects to git +linking ./libexec/git-core/git-rm to git +linking ./libexec/git-core/git-write-tree to git +linking ./libexec/git-core/git-show-branch to git +linking ./libexec/git-core/git-fmt-merge-msg to git +linking ./libexec/git-core/git-count-objects to git +linking ./libexec/git-core/git-reset to git +linking ./libexec/git-core/git-reflog to git +linking ./libexec/git-core/git-rev-parse to git +linking ./libexec/git-core/git-update-ref to git +linking ./libexec/git-core/git-patch-id to git +linking ./libexec/git-core/git-commit-tree to git +linking ./libexec/git-core/git-merge-file to git +linking ./libexec/git-core/git-credential to git +linking ./libexec/git-core/git-unpack-objects to git +linking ./libexec/git-core/git-bundle to git +linking ./libexec/git-core/git-merge-index to git +linking ./libexec/git-core/git-remote to git +linking ./libexec/git-core/git-merge-base to git +linking ./bin/git-upload-archive to git +linking ./bin/git-receive-pack to git +linking ./libexec/git-core/git-shell to git-shell +linking ./libexec/git-core/git-upload-pack to git-upload-pack +Installation complete + +"""]] diff --git a/doc/forum/Where_is_the_content__63__/comment_2_5e2cfdfab6c4f84fe7a19447b417b5a7._comment b/doc/forum/Where_is_the_content__63__/comment_2_5e2cfdfab6c4f84fe7a19447b417b5a7._comment new file mode 100644 index 000000000..45b7b024e --- /dev/null +++ b/doc/forum/Where_is_the_content__63__/comment_2_5e2cfdfab6c4f84fe7a19447b417b5a7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-15T18:37:34Z" + content=""" +It'll be in `/sdcard/annex` by defualt, unless you told the webapp to put it somewhere else when it asked where to put the repository. `/sdcard/annex` is a git repository which should contain all the files from the remote (not in any separate subdirectory, that's not how git works). If it does not, you can run commands like `git log --stat` in that repository to see what files have been added/removed, or `git annex status` to check the status of the files. +"""]] diff --git a/doc/forum/Where_is_the_content__63__/comment_3_bd4cbc8f256a94ffde4f57d2c406a9ec._comment b/doc/forum/Where_is_the_content__63__/comment_3_bd4cbc8f256a94ffde4f57d2c406a9ec._comment new file mode 100644 index 000000000..5b736b410 --- /dev/null +++ b/doc/forum/Where_is_the_content__63__/comment_3_bd4cbc8f256a94ffde4f57d2c406a9ec._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkpIIYg6Fl7OFsOHVPEchZYj68A3dk4lVg" + nickname="Paul" + subject="text relocations refusal" + date="2014-07-16T02:19:27Z" + content=""" +I'm afraid I've ruined the remote repo. For directory, I wrote \"mediashare\" because that's where I want copy to go. i don't want it in default \"annex\". In git assistant, it is unclearbwhst directory means. Mount point for cooy of remote? + +Well, this is all I get now... + +1|u0_a127@manta:/sdcard $ cd annex +u0_a127@manta:/sdcard/annex $ git annex status +WARNING: linker: git-annex has text relocations. This is wasting memory and is a security risk. Please fix. + + +"""]] diff --git a/doc/forum/Where_is_the_content__63__/comment_4_a36b35d47472b5db779b0489bf3d4893._comment b/doc/forum/Where_is_the_content__63__/comment_4_a36b35d47472b5db779b0489bf3d4893._comment new file mode 100644 index 000000000..69b929810 --- /dev/null +++ b/doc/forum/Where_is_the_content__63__/comment_4_a36b35d47472b5db779b0489bf3d4893._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-16T20:41:17Z" + content=""" +That warning about text relocations always happens on Android and is not relevant to whatever problem you're having. + +If git-annex status does not print anything else, then it seems you have a git-annex repository in /sdcard/annex. If you entered \"mediashare\" in the webapp, you might have another repository in another location. When you open the webapp, it tells you the location of the repository in the upper-right corner -- \"Repository: $location\" +"""]] diff --git a/doc/forum/Which_cloud_providers_are_supported__63___.mdwn b/doc/forum/Which_cloud_providers_are_supported__63___.mdwn new file mode 100644 index 000000000..9f8afc3fc --- /dev/null +++ b/doc/forum/Which_cloud_providers_are_supported__63___.mdwn @@ -0,0 +1,3 @@ +So Box.net and Amazon is supported, any way to get google drive in there? + +thanks for cool software! diff --git a/doc/forum/Which_cloud_providers_are_supported__63___/comment_1_1f9398840144e0452a2fed9336046547._comment b/doc/forum/Which_cloud_providers_are_supported__63___/comment_1_1f9398840144e0452a2fed9336046547._comment new file mode 100644 index 000000000..9d8f0ecf7 --- /dev/null +++ b/doc/forum/Which_cloud_providers_are_supported__63___/comment_1_1f9398840144e0452a2fed9336046547._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-18T17:40:36Z" + content=""" +[[tips/googledriveannex]] + +See [[special_remotes]] for a full list of things people have gotten to work. +"""]] diff --git a/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__.mdwn b/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__.mdwn new file mode 100644 index 000000000..9ff6f11fb --- /dev/null +++ b/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__.mdwn @@ -0,0 +1,7 @@ +I currently have a pair of hard drives that I store backups etc on and that I would like to use as archive repositories for Git-Annex. I want everything on these to be encrypted, because I can't guarantee physical security of them. + +When I am setting up a removable drive as a repository, there is no option to encrypt to it. I understand that there is a "Directory" special remote, but it seems odd to have to use a different special remote that is not built into the webapp. Wouldn't it be good to have a checkbox for encryption when setting up a removable drive as a repository? + +Is there something that I'm missing here? + +Thanks for a great piece of software! diff --git a/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__/comment_1_4341898d5ae4f09a5b06d24f5fe6192d._comment b/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__/comment_1_4341898d5ae4f09a5b06d24f5fe6192d._comment new file mode 100644 index 000000000..0ddf26666 --- /dev/null +++ b/doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__/comment_1_4341898d5ae4f09a5b06d24f5fe6192d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T19:45:42Z" + content=""" +git-annex stores a clone of the git repository on the removable drive. To encrypt a git remote, you can use the [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt) tool. This will work with git-annex, but it needs integration into the webapp to support setting it up, and further integration so git-annex can detect when a git remote is encrypted and also encrypt the contents of file is stores there. +"""]] diff --git a/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn b/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn new file mode 100644 index 000000000..c250ef7c1 --- /dev/null +++ b/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn @@ -0,0 +1,5 @@ +I created a test remote using the command: + + git annex initremote mybup type=bup encryption=none buprepo=/tmp/mybup + +I can copy files to and from the remote just fine. However, every time I do so it makes changes inside `~/.bup`. If I delete `~/.bup` it will recreate it. Is this expected? Are the files in `~/.bup` of any consequence? diff --git a/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__/comment_1_da9c7c0e93aefc2da7409de5b138d86f._comment b/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__/comment_1_da9c7c0e93aefc2da7409de5b138d86f._comment new file mode 100644 index 000000000..cbb3c8d6d --- /dev/null +++ b/doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__/comment_1_da9c7c0e93aefc2da7409de5b138d86f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Ah" + date="2012-10-18T23:52:03Z" + content=""" +I get now why ~/.bup is being used: -r DIR specifies a local DIR as the bup directory, but ~/.bup is still used for the local temp files. It would be nice, therefore, if BUP_DIR were set in the case that -r specifies a local directory, so that only that directory is used. Unless, of course, that leads to space limitations in the bup directory. Hmm... maybe this should just be left as is in that case. +"""]] diff --git a/doc/forum/Will_git-annex_solve_my_problem__63__.mdwn b/doc/forum/Will_git-annex_solve_my_problem__63__.mdwn new file mode 100644 index 000000000..0aa2ded52 --- /dev/null +++ b/doc/forum/Will_git-annex_solve_my_problem__63__.mdwn @@ -0,0 +1,7 @@ +Here's my current situation: + +I have a box which creates about a dozen files periodically. All files add up to about 1GB in size. The files are text and sorted. I then rsync the files to n servers. The rsync diff algorithm transfers way less than n * 1GB because the files are largely the same. However, this distribution technique is inefficient because I must run n rsync processes in parallel and the rsync diff algorithm takes a lot of CPU. + +How could I use git-annex instead of rsync? + +Because the box producing the new files also has the old files, then presumably git could calculate the diffs for each file once instead of n times as with the rsync solution? Then only the diffs need be distributed to the n servers... using git-annex? And finally the newly updated version of the dozen files needs to be available on each of the n servers. Ideally, the diffs would not mount up over time on either the publishing server or the n servers, thus causing out of disk problems etc. How to deploy git-annex to solve my problem? diff --git a/doc/forum/Will_git-annex_solve_my_problem__63__/comment_1_35acbdd1a7727df204d776c2e8f02b53._comment b/doc/forum/Will_git-annex_solve_my_problem__63__/comment_1_35acbdd1a7727df204d776c2e8f02b53._comment new file mode 100644 index 000000000..a4f27f46e --- /dev/null +++ b/doc/forum/Will_git-annex_solve_my_problem__63__/comment_1_35acbdd1a7727df204d776c2e8f02b53._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-27T22:48:16Z" + content=""" +git-annex will not perform better than rsync. It uses rsync. It also does not yet use old versions of files as a rsync basis when transferring a new version of a file, so is not as efficient in this scenario. +"""]] diff --git a/doc/forum/Will_git-annex_solve_my_problem__63__/comment_2_230256c19ac139dea207d89c06f70782._comment b/doc/forum/Will_git-annex_solve_my_problem__63__/comment_2_230256c19ac139dea207d89c06f70782._comment new file mode 100644 index 000000000..2b7b7e5f7 --- /dev/null +++ b/doc/forum/Will_git-annex_solve_my_problem__63__/comment_2_230256c19ac139dea207d89c06f70782._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaBh9VNJ-RZ26wJZ4BEhMN1IlPT-DK6JA" + nickname="Alex" + subject="Bup" + date="2013-04-03T05:47:41Z" + content=""" +I think bup will solve your use case. Make a local bup repo and backup there then clone that repo n times. If you run git annex on top of bup you can then retrieve the subset of files you need at each destination. This will work best if you don't need every file on every remote or if your network is much slower than local disk access. +"""]] diff --git a/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn new file mode 100644 index 000000000..f458ba72e --- /dev/null +++ b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn @@ -0,0 +1,3 @@ +FAT32 does not support symlinks, so I wonder if there's going to be a problem with that. + +Generally speaking, I am wondering about portability of git annex on windows and on android... diff --git a/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment new file mode 100644 index 000000000..119c9e535 --- /dev/null +++ b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-07T19:13:14Z" + content=""" +See [[bugs/fat_support]]. A bare git repo will have to be used to avoid symlink problems, at least for now. The other problem is that git-annex key files have colons in their filenames. +"""]] diff --git a/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment new file mode 100644 index 000000000..ca599b285 --- /dev/null +++ b/doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-19T15:37:22Z" + content=""" +Now it's fully supported, so long as you put a bare git repo on your key. +"""]] diff --git a/doc/forum/Windows_S3_host_issue.mdwn b/doc/forum/Windows_S3_host_issue.mdwn new file mode 100644 index 000000000..02cd87907 --- /dev/null +++ b/doc/forum/Windows_S3_host_issue.mdwn @@ -0,0 +1,11 @@ +I am trying to connect to dreamhost's objects (S3) platform. I am using the windows version. +Am I specifying the host correctly? Any help is appreciated. + +$ git-annex initremote host="objects.dreamhost.com" cloud keyid=XXXXX type=S3 + +initremote host=objects.dreamhost.com (encryption setup) (hybrid cipher with gpg + key 70827ADCDE25DA0F) (checking bucket...) +git-annex: user error (openTCPConnection: host lookup failure for "host=objects. +dreamhost.com-f5573b49-3668-4f94-a1da-aa55085c45e8.s3.amazonaws.com") +failed +git-annex.exe: initremote: 1 failed diff --git a/doc/forum/Windows_S3_host_issue/comment_1_8c0a1e84713a04a25fdc1f74919d34aa._comment b/doc/forum/Windows_S3_host_issue/comment_1_8c0a1e84713a04a25fdc1f74919d34aa._comment new file mode 100644 index 000000000..7382cafa6 --- /dev/null +++ b/doc/forum/Windows_S3_host_issue/comment_1_8c0a1e84713a04a25fdc1f74919d34aa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T17:38:21Z" + content=""" +No, you cannot quote part of a parameter like that. git-annex thinks you are trying to use a host that includes the quote marks you put around it. + +Since you're using Windows, I can't give any advice on how to use quoting at the shell/cmd prompt. However, I don't see any need for quoting here anyway. +"""]] diff --git a/doc/forum/Windows_S3_host_issue/comment_2_06ecc76797c430b27a2e24776761d043._comment b/doc/forum/Windows_S3_host_issue/comment_2_06ecc76797c430b27a2e24776761d043._comment new file mode 100644 index 000000000..3e918120e --- /dev/null +++ b/doc/forum/Windows_S3_host_issue/comment_2_06ecc76797c430b27a2e24776761d043._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_bIB1Vadfc_GfPLKX_ScfWFCcaGyk8Ac" + nickname="Rob" + subject="Remove quotes" + date="2013-12-13T04:44:22Z" + content=""" +I tried the command with and without quotes it results in the same error. I think the issue is that the host is trying to resolve a concatenation of the hostname and amazon.com when in fact it should be resolving to the host name only. +"""]] diff --git a/doc/forum/Windows_S3_host_issue/comment_3_1715557daa15b9e9e17b4850141e62af._comment b/doc/forum/Windows_S3_host_issue/comment_3_1715557daa15b9e9e17b4850141e62af._comment new file mode 100644 index 000000000..e4645d07b --- /dev/null +++ b/doc/forum/Windows_S3_host_issue/comment_3_1715557daa15b9e9e17b4850141e62af._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-16T17:07:17Z" + content=""" +Looking at this again, you forgot to tell it the name of the remote, so it took the first parameter (host=\"objects.dreamhost.com\" ) as the name. The rest probably follows from that mistake. + +use `git annex initremote mys3 host=...` +"""]] diff --git a/doc/forum/Windows_support.mdwn b/doc/forum/Windows_support.mdwn new file mode 100644 index 000000000..0e9e8dcb6 --- /dev/null +++ b/doc/forum/Windows_support.mdwn @@ -0,0 +1,6 @@ +Hi, + +Do you have any news about Windows support? +Is this something you're currently working on? + +Thanks! diff --git a/doc/forum/Windows_support/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment b/doc/forum/Windows_support/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment new file mode 100644 index 000000000..95323ff99 --- /dev/null +++ b/doc/forum/Windows_support/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-12T06:43:02Z" + content=""" +[[todo/windows_support]] has everything I know about making a windows port. This badly needs someone who understand Windows to dive into it. The question of how to create a symbolic link (or the relevant Windows equivilant) from haskell on Windows +is a good starting point.. +"""]] diff --git a/doc/forum/Windows_usage_instructions.mdwn b/doc/forum/Windows_usage_instructions.mdwn new file mode 100644 index 000000000..0b7b94625 --- /dev/null +++ b/doc/forum/Windows_usage_instructions.mdwn @@ -0,0 +1,25 @@ +Having a spot of bother in setting up for windows usage. + +I'm attempting to have a windows box syncing to a server (over ssh) and a linux box also syncing against that* + +So, on each machine I do + + git init + git annex init + + +On the windows and linux desktops I then do a + + git remote add server serverdetails. + +Now the problem is that if I don't add files to the repos on the machines, they won't sync as there is no branch checked out; and if I do then the first one is fine but the second will fail as it doesn't allow fast-forwards. What am I doing wrong? I've tried making the server repo bare / not bare. + +I'm using the latest nightly windows build, and a build from git from today (29d5bb94b4512cfe3072c9ff840cb0ce9f2af744) + + + + + + + +*Actually I'm trying to do something a little more complex than that, but this is the simplest version I can come up with. diff --git a/doc/forum/Windows_usage_instructions/comment_1_d43dbd9406da3b9747b147715eca94ac._comment b/doc/forum/Windows_usage_instructions/comment_1_d43dbd9406da3b9747b147715eca94ac._comment new file mode 100644 index 000000000..6162b9540 --- /dev/null +++ b/doc/forum/Windows_usage_instructions/comment_1_d43dbd9406da3b9747b147715eca94ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA" + nickname="Joe" + subject="comment 1" + date="2013-06-16T11:29:36Z" + content=""" +This may be related to [this](http://git-annex.branchable.com/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/#comment-a023dca06c2bcb9636d8a332f8e95ae4) +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn b/doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn new file mode 100644 index 000000000..7ec663216 --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn @@ -0,0 +1,5 @@ +**EDIT: Mistakenly posted this thread in the forum. I created a new post in [[todo|todo/Bittorrent-like_features]] + +Do you think it would be possible to have bittorrent-like transfers between remotes, so that no one remote gets pegged too hard with transfers? It would be great if you distribute your files between multiple bandwidth-capped remotes, and want fast down speed. Obviously, this isn't a simple task, but the protocol is already there, it just needs to be adapted for the purpose (and re-written in Haskell...). Maybe some day in the future after the more important stuff gets taken care of? It could be an enticing stretch goal. + +PS: still working on getting BTC, will be donating soon! diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_1_13544d54fb0418af4ca9200cdb045d91._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_1_13544d54fb0418af4ca9200cdb045d91._comment new file mode 100644 index 000000000..73295478f --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_1_13544d54fb0418af4ca9200cdb045d91._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 1" + date="2013-07-19T02:33:36Z" + content=""" +I agree. I mentioned it briefly here: + +[[http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/#comment-5a5d46967b826f602c423d7f72ac6f5e]] + + +I did *briefly* look into torrents and the like, but couldn't work out a way to lock it down so only authorized users could use either the tracker or connect to pull the data down... + +The security aspect is the kicker in my mind. +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_2_9a7dad35bf80c684ad97892420d7370c._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_2_9a7dad35bf80c684ad97892420d7370c._comment new file mode 100644 index 000000000..affd07efd --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_2_9a7dad35bf80c684ad97892420d7370c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="37.130.227.133" + subject="comment 2" + date="2013-07-19T07:38:47Z" + content=""" +Okay I've got some ideas, but they need refining. I should be posting more tomorrow. + +One thing I thought of though, there could be two types of torrent support: + +1. You use a torrent file or magnet link as a special remote URL. This remote is read-only, naturally, and you'd only be able to leech (and seed, I suppose) the file in the torrent. Neat feature maybe. I wasn't previously thinking of this. + +2. This isn't really bittorrent, just inspired by it. You use a bittorrent-type protocol to transfer between your private remotes. You could download from multiple remotes at once to get a file (like leeching, without a tracker, just pre-defined peers...aka remotes), or you could superseed to remotes to push a file, and have the remotes then share the parts of the file amongst themselves to each get a complete copy. Remote groups could possibly be built on, or special groups could be coded in to define the swarm. You update (add/remove) the swarm members locally, and push the changes to each of the old swarm members so they can add/remove other remotes (or themselves) from the swarm. Possibly, you could just push the updated swarm list to one remote already in the swarm, it adopts the new list, and shares it with the rest of the swarm. Each remote does the same. Maybe the swarm list should be GPG-signed and verified before adopted and passed forward? + +The more I think about it, the more awesome I think it could be, but holy shit it would be a LOT of work. +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_3_e5de748bc5da12a4a01e08cde2407dd1._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_3_e5de748bc5da12a4a01e08cde2407dd1._comment new file mode 100644 index 000000000..ba8da25f0 --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_3_e5de748bc5da12a4a01e08cde2407dd1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 3" + date="2013-07-19T07:50:09Z" + content=""" +Personally i think the easiest implementation to make would be smart transfers. + +You have a repo on your laptop, and a repo at work. And you have(say) 5 special remotes in between them that they need to use to transfer data. + +The laptop could upload 5 different files to those repositories. Wouldn't quite be bittorent transfer(not even close). But it would probably be much simpler to implement. And when syncing a lot of files(instead of just one really big one) the speed gain should really be about the same as if all the special remotes used some kind of bittorent thing. + +Just a thought. +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_4_e51530178f1e034c0fdd5c9aa9945567._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_4_e51530178f1e034c0fdd5c9aa9945567._comment new file mode 100644 index 000000000..d3e0d3314 --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_4_e51530178f1e034c0fdd5c9aa9945567._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 4" + date="2013-07-19T07:51:39Z" + content=""" +Of course all files should be uploaded to all remote(to match with numcopies). but the initial push could be spread out over all existing remotes, to facility faster initial download/transfer. +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_5_81ea9c129d8c02097f09ef8c68f1bb11._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_5_81ea9c129d8c02097f09ef8c68f1bb11._comment new file mode 100644 index 000000000..1ef2b25ac --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_5_81ea9c129d8c02097f09ef8c68f1bb11._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="37.130.227.133" + subject="comment 5" + date="2013-07-19T21:23:35Z" + content=""" +Disclaimer: I'm thinking out loud of what could make git-annex even more awesome. I don't expect this to be implemented any time soon. Please pardon any dumbassery. + +Much easier to implement, but having your remotes (optionally!) act like a swarm would be an awesome feature to have because you bring in a lot of new features that optimize storage, bandwidth, and overall traffic usage. This would be made a lot easier if parts of it were implemented in small steps that added a nifty feature. The best part is, each of these could be implemented by themselves, and they're all features that would be really useful. + +Step 1. Concurrent downloads of a file from remotes. + +This would make sense to have, it saves upload traffic on your remotes, and you also get faster DL speeds on the receiving end. + + +Step 2. Implementing part of the super-seeding capabilities. + +You upload pieces of a file to different remotes from your laptop, and on your desktop you can download all those pieces and put them together again to get a complete file. If you *really* wanted to get fancy, you could build in redundancy (ala RAID) so if a remote or two gets lost, you don't lose the entire file. This would be a very efficient use of storage if you have a bunch of free cloud storage accounts (~1GB each) and some big files you want to back up. + + +Step 3. Setting it up so that those remotes could talk to one another and share those pieces. + +This is where it gets more like bittorrent. Useful because you upload one copy and in a few hours, have say, 5 complete copies spread across your remotes. You could add or remove remotes from a swarm locally, and push those changes to those remotes, which then adapt themselves to suit the new rules and share those with other remotes in the swarm (rules should be GPG-signed as a safety precaution). Also, if/when deltas get implemented, you could push that delta to the swarm and have all the remotes adopt it. This is cooler than regular bittorrent because the shared file can be updated. As a safety precaution, the delta could be GPG signed so a corrupt file doesn't contaminate the entire swarm. Each remote could have bandwidth/storage limits set in a dotfile. + +This is a high-level idea of how it might work, and it's also a HUGE set of features to add, but if implemented, you'd be saving a ton of resources, adding new use cases, and making git-annex more flexible. + +"""]] diff --git a/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_6_3b5798414f89686526da3dfa72c0c4f2._comment b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_6_3b5798414f89686526da3dfa72c0c4f2._comment new file mode 100644 index 000000000..7a027c909 --- /dev/null +++ b/doc/forum/Wishlist:_Bittorrent-like_transfers/comment_6_3b5798414f89686526da3dfa72c0c4f2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="37.130.227.133" + subject="comment 6" + date="2013-07-19T21:28:58Z" + content=""" +Obviously, Step 3 would only work on remotes that you have control of processes on, but if given login credentials to cloud storage remotes (potentially dangerous!) they could read/write to something like dropbox or rsync. + +Another thing, this would be completely trackerless. You just use remote groups (or create swarm definitions) and share those with your remotes. It's completely decentralized! +"""]] diff --git a/doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn b/doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn new file mode 100644 index 000000000..4d67f93b1 --- /dev/null +++ b/doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn @@ -0,0 +1,3 @@ +Maybe this explained somewhere else, but what is the purpose of marking files readonly. To me this is an annoyance that doesn't make sense. I want to be able to change my files, having to go through an unlock step, to do that seems like unnecessary work. Interestingly, Microsoft's Team Foundation Server source control does the same thing and I don't like it there either. + +In addition why replace files with symlinks? Why not just leave the real files in place, or do the reverse and put the symlink to the file in the repository. diff --git a/doc/forum/Wishlist:_Don__39__t_make_files_readonly/comment_1_7148527961e2d27793810966588c8d35._comment b/doc/forum/Wishlist:_Don__39__t_make_files_readonly/comment_1_7148527961e2d27793810966588c8d35._comment new file mode 100644 index 000000000..b7a6f55f4 --- /dev/null +++ b/doc/forum/Wishlist:_Don__39__t_make_files_readonly/comment_1_7148527961e2d27793810966588c8d35._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="comment 1" + date="2012-11-22T23:38:33Z" + content=""" +By using symlinks gits problems with big files goes away. You simply can't put 600 GB in a git repo - that's the way I use git-annex. Also having files read only by default eliminates the need to store two copies of all files in one form or another. + + +"""]] diff --git a/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__.mdwn b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__.mdwn new file mode 100644 index 000000000..1a7930fec --- /dev/null +++ b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__.mdwn @@ -0,0 +1,6 @@ +I have a DLink Boxee media player and it can not play content from symbolic links, it needs to access regular media files. Unfortunately unlocking/locking is quite slow for such a large amount of data due to the required data copying, but it should not even be needed since I do not need write access to any file to watch the movie or to play the song. + +Is it currently possible or would it be possible to add a commands like "unlock" which would not copy the file data but simply move files out from the data store into the tree while still keeping the files read only? A corresponding "lock" command would also be needed to restore the normal symbolic link tree structure. + +Update: +I tried the rsync special remote http://git-annex.branchable.com/special_remotes/rsync/ and it works but the file structure created reflects the data store not the view given by the symbolic links. diff --git a/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_1_1cf4ab29dfa2cff59b86305fc0018251._comment b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_1_1cf4ab29dfa2cff59b86305fc0018251._comment new file mode 100644 index 000000000..3ab518714 --- /dev/null +++ b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_1_1cf4ab29dfa2cff59b86305fc0018251._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-07-07T15:27:28Z" + content=""" +The rsync or directory special remotes would work if the media player uses metadata in the files, rather than directory locations. + +Beyond that there is the [[todo/smudge]] idea, which is hoped to be supported sometime. +"""]] diff --git a/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_2_f5ebb7f43dcef861ecc13373fb1e263f._comment b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_2_f5ebb7f43dcef861ecc13373fb1e263f._comment new file mode 100644 index 000000000..960100379 --- /dev/null +++ b/doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_2_f5ebb7f43dcef861ecc13373fb1e263f._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="Solution" + date="2011-07-31T15:24:25Z" + content=""" +Yes, it can read id3-tags and guess titles from movie filenames but it sometimes gets confused by the filename metadata provided by the WORM-backend. + +I think I have a good enough solution to this problem. It's not efficient when it comes to renames but handles adding and deletion just fine + + rsync -vaL --delete source dest + +The -L flag looks at symbolic links and copies the actual data they are pointing to. Of course \"source\" must have all data locally for this to work. + +"""]] diff --git a/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn new file mode 100644 index 000000000..1de06f7cd --- /dev/null +++ b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn @@ -0,0 +1,15 @@ +It would be extremely useful to have some additional ways to select files (for git annex copy/move/get and maybe others) based on the meta-information available to git-annex, rather than just by file or directory name. + +An example of what I'd like to do is this: + + host1$ git annex copy --to usb-drive --missing-on host2 + +This would check location tracking information and copy each file from host1's annex which is not present on host2 onto the usb-drive annex -- i.e. it's what I want when I need to do a sneakernet synchronisation of host1 and host2 (for backup purposes, for example). Note that of course I could copy --to host2, assuming network connectivity, but that would take a long time. + +There's probably other selectors that we can imagine; an obvious one could be --present-on -- useful for judiciously dropping only those files that you have easily available in a local annex (as you may want to keep files that are hard to make available even if --numcopies would nominally be satisfied). + +Other similar ideas for file content selectors: + + * Files that have less than n, exactly n or more than n copies -- for when you need to satisfy your --numcopies policy over sneakernet. + * Files that are present (or not present) on some trusted annex -- for making sure you have trusted copies of everything. + * Boolean combinations of these filters -- "git annex drop --present-on lanserver1 --or --present-on lanserver2" or similar syntax, although obviously doing this in full generality may be quite fiddly. diff --git a/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment new file mode 100644 index 000000000..11b44b809 --- /dev/null +++ b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="filtering based on git-commits" + date="2011-06-23T13:56:35Z" + content=""" +additional filter criteria could come from the git history: + +* `git annex get --touched-in HEAD~5..` to fetch what has recently been worked on +* `git annex get --touched-by chrysn --touched-in version-1.0..HEAD` to fetch what i've been workin on recently (based on regexp or substring match in author; git experts could probably craft much more meaningful expressions) + +these options could also apply to `git annex find` -- actually, looking at the normal file system tools for such tasks, that might even be sufficient (think `git annex find --numcopies-gt 3 --present-on lanserver1 --drop` like `find -iname '*foo*' -delete` + +(i was about to open a new forum discussion for commit-based getting, but this is close enough to be usefully joint in a discussion) +"""]] diff --git a/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_2_97e2ed48bd552d02918c4f98f963e6e1._comment b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_2_97e2ed48bd552d02918c4f98f963e6e1._comment new file mode 100644 index 000000000..787cf8f5d --- /dev/null +++ b/doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_2_97e2ed48bd552d02918c4f98f963e6e1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-09-19T18:46:35Z" + content=""" +This is now almost completely implemented. See [[walkthrough/powerful_file_matching]]. + +"""]] diff --git a/doc/forum/Wishlist:_automatic_reinject.mdwn b/doc/forum/Wishlist:_automatic_reinject.mdwn new file mode 100644 index 000000000..f975c7521 --- /dev/null +++ b/doc/forum/Wishlist:_automatic_reinject.mdwn @@ -0,0 +1,14 @@ +I think it would be useful to supplement the `reinject` command with an automatic +mode which calculates the checksum of the source file and injects the file if it +is known to the repository (without the need to provide a destination filename). +In addition, this could be done recursively if the user provides a directory to +inject. All this can probably be done already with some plumbing, but a simple +`reinject --auto` (or `scour`, or `scavenge`, if you like) would be a nice addition. +Of course this would only work for the checksum backends. + +Example use cases would be: + +* Recovering data from lost+found easily +* Making use of old (pre-git-annex) archival volumes with useful files + scattered among non-useful files +* Sneaker-netting files between disconnected git-annex repositories diff --git a/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn new file mode 100644 index 000000000..7bdd93654 --- /dev/null +++ b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn @@ -0,0 +1,10 @@ +I'm not sure if this _feature_ exists already wrapped or provided as a recipe for users or not yet. But it would be nice to be able to do a + + git annex du [PATH] + +Such that the output that git annex would return is the total disk used locally in the PATH and the theoretical disk used by the PATH if it was fully populated locally. e.g. + + $ git annex du FSL0001_ANALYSIS + $ Local: 1000kb, Annex: 2000kb + +or something along the lines of that? diff --git a/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_1_7abb1155081a23ce4829ee69b2064541._comment b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_1_7abb1155081a23ce4829ee69b2064541._comment new file mode 100644 index 000000000..bff5b2ea7 --- /dev/null +++ b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_1_7abb1155081a23ce4829ee69b2064541._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 1" + date="2012-06-27T12:36:08Z" + content=""" +Use `du -L` for the disk space used locally. The other number is not currently available, but it would be nice to have. I also sometimes would like to have data on which backends are used how much, so making this `git annex status --subdir` is tempting. Unfortunatly, it's current implementation scans `.git/annex/objects` +and not the disk tree (better for accurate numbers due to copies), so it would not be a very easy thing to add. Not massively hard, but not something I can pound out before I start work today.. +"""]] diff --git a/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_2_b4c6ebada7526263e04c70eac312fda9._comment b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_2_b4c6ebada7526263e04c70eac312fda9._comment new file mode 100644 index 000000000..551c685d4 --- /dev/null +++ b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_2_b4c6ebada7526263e04c70eac312fda9._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 2" + date="2012-06-27T12:45:42Z" + content=""" +I have a hacked up version of sharebox that does this.. I need to fix it up and push it to github.. + +the short of it is that you can do + + def calculate_size(path): + annexfile = os.path.basename(os.readlink(path)) + #SHA256-s2007550713--.... + size = annexfile.split(\"-\")[1] + return int(size[1:]) + +to get the size of files.. a 'git-annex du' should be pretty straightforward... +"""]] diff --git a/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_3_ded71b270b94617a8ebb3a713d46a274._comment b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_3_ded71b270b94617a8ebb3a713d46a274._comment new file mode 100644 index 000000000..ddc9ae147 --- /dev/null +++ b/doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_3_ded71b270b94617a8ebb3a713d46a274._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-11T05:27:38Z" + content=""" +You can now use \"git annex status .\" + +Example: + +
+git annex status roms
+directory: roms
+local annex keys: 1
+local annex size: 248 megabytes
+known annex keys: 277
+known annex size: 12 gigabytes
+
+"""]] diff --git a/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__.mdwn b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__.mdwn new file mode 100644 index 000000000..c3f915e7d --- /dev/null +++ b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__.mdwn @@ -0,0 +1 @@ +Logging to file would be nice when running git-annex as a daemon so when something fails or when certain events happens one can look at the logs to see what has failed, unless I'm missing something this probably should be on the wishlist or roadmap. diff --git a/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_1_42aa2b61b880f4048d874210212aa63b._comment b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_1_42aa2b61b880f4048d874210212aa63b._comment new file mode 100644 index 000000000..c0746a5a7 --- /dev/null +++ b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_1_42aa2b61b880f4048d874210212aa63b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.60" + subject="comment 1" + date="2012-06-23T14:30:22Z" + content=""" +The logging format could be improved, but the daemon already logs to .git/annex/daemon.log. It also automatically rotates the log file. +"""]] diff --git a/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_2_3e201039fa0e611554171ee30e69a414._comment b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_2_3e201039fa0e611554171ee30e69a414._comment new file mode 100644 index 000000000..b1a76ce2d --- /dev/null +++ b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_2_3e201039fa0e611554171ee30e69a414._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-06-23T08:00:12Z" + content=""" +actually, scratch that, i found it. it was in _.git/annex/daemon.log_ along with the other bits and pieces +"""]] diff --git a/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_3_d1074724c44f3296cb438b2d526d8728._comment b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_3_d1074724c44f3296cb438b2d526d8728._comment new file mode 100644 index 000000000..eb1862829 --- /dev/null +++ b/doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_3_d1074724c44f3296cb438b2d526d8728._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-07-03T14:48:16Z" + content=""" +Adding a date and timestamp would be a nice start to improving things. +"""]] diff --git a/doc/forum/Wishlist:_mark_remotes_offline.mdwn b/doc/forum/Wishlist:_mark_remotes_offline.mdwn new file mode 100644 index 000000000..046c62210 --- /dev/null +++ b/doc/forum/Wishlist:_mark_remotes_offline.mdwn @@ -0,0 +1,12 @@ +I have several remotes which are not always accessible. For example they can +be on hosts only accessible by LAN or on a portable hard drive which is not +plugged in. When running sync these remotes are checked as well, leading to +unnecessary error messages and possibly git-annex waiting for a few minutes +on each remote for a timeout. + +In this situation it would be useful to mark some remotes as offline +(`git annex offline `), so that git-annex would not even attempt +to contact them. Then, I could configure my system to automatically, for example, +mark a portable hard disk remote online when plugging it in, and offline when +unplugging it, and similarly marking remotes offline and online depending on +whether I have an internet connection or a connection to a specific network. diff --git a/doc/forum/Wishlist:_mark_remotes_offline/comment_1_9e3901f0123abb66034cce95cc5a941a._comment b/doc/forum/Wishlist:_mark_remotes_offline/comment_1_9e3901f0123abb66034cce95cc5a941a._comment new file mode 100644 index 000000000..c24a786c9 --- /dev/null +++ b/doc/forum/Wishlist:_mark_remotes_offline/comment_1_9e3901f0123abb66034cce95cc5a941a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-07-06T13:04:07Z" + content=""" +You can already do this: + + git config remote.foo.annex-ignore true + +There's no need to do anything for portable drives that are sometimes mounted and sometimes not -- git-annex will automatically avoid using repositories in directories that do not currently exist. + +I thought git-annex also had a way to run a command and use its exit status to control whether a repo was +ignored or not, but it seems I never actually implemented that. It might be worth adding, although the command would necessarily run whenever git-annex is transferring data around. +"""]] diff --git a/doc/forum/Wishlist:_mark_remotes_offline/comment_2_d10e3d90cf421ae425e64ab266ea811b._comment b/doc/forum/Wishlist:_mark_remotes_offline/comment_2_d10e3d90cf421ae425e64ab266ea811b._comment new file mode 100644 index 000000000..e14cfa822 --- /dev/null +++ b/doc/forum/Wishlist:_mark_remotes_offline/comment_2_d10e3d90cf421ae425e64ab266ea811b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncBlzaDI248OZGjKQMXrLVQIx4XrZrzFo" + nickname="Perttu" + subject="comment 2" + date="2012-07-07T17:45:43Z" + content=""" +Ah, I didn't read the man page carefully enough. My apologies. + +Setting the ignore status based on an exit status would be +even better, since this avoids re-writing a new config file for +each repository each time I enter or exit my LAN. +"""]] diff --git a/doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn b/doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn new file mode 100644 index 000000000..d1df6628e --- /dev/null +++ b/doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn @@ -0,0 +1,13 @@ +Since _transfer queueing_ and syncing of data works now in the assistant branch (been playing with it), there are times when I really don't want to sync the data, I would like to just sync meta-data and manually do a _get_ on files that I would want or selectively sync data in a subtree. + +It would be nice to have the syncing/watch feature to have the option of syncing only *meta-data* or *meta-data and data*, I think this sort of option was already planned? It would also be nice to be able to automatically sync data for only a subtree. + +My use case is, I have a big stash of files somewhere at home or work, and I want to keep what I am actually using on my laptop and be able to selectively just take a subtree or a set of subtree's of files. I would not always want to suck down all the data but still have the functionally to add files and push them upstream and sync meta-data. + +that is... + +> * Site A: big master annex in a server room with lots of disk (or machines), watches a directory and syncs both data and meta-data, it should always try and pull data from all it's child repos. That way I will always have a master copy of my data somewhere, it would be even nicer if I could have clones of the annex, where each annex is on a different machine which is configured to only sync a subtree of files so I can distribute my annex across different systems and disks. +> * Site A: machine A: syncs Folder A +> * Site A: machine B: syncs Folder B +> * and so on with selectively syncing sites and directories +> * Laptop: has a clone of the annex, and watches a directory, syncs meta-data as usual and only uploads files to a remote (all or a designated one) but it never downloads files automatically or it should only occur inside a selected subtree. diff --git a/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT.mdwn b/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT.mdwn new file mode 100644 index 000000000..847ff01bd --- /dev/null +++ b/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT.mdwn @@ -0,0 +1,5 @@ +Hi Joey, + I recently tried cloning a music annex to a microSD card to play on rockbox (FAT only) with my Sansa Clip, but 'git clone' stops the first time it runs into something with a special character in a file or directory, like a colon in an album title. After this happens, there doesn't seem to be a way to get a full annex file/directory listing for the annex; it only has up to where git failed since FAT can't handle the name. Is it possible for git-annex to replace special characters in directory/filenames with a space or underscore if it's on a crippled filesystem? Also, would it be possible to then clone from that annex to a non-crippled FS, preserving the original filenames with special characters? I've been meaning to ask about this for a while, so I'm a teeny bit fuzzy on the specifics...if you want, I'll reproduce the problem and cough up some more details. + + +PS: I love git-annex! diff --git a/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT/comment_1_5d33bcbd862537f53edd91dcff2b8977._comment b/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT/comment_1_5d33bcbd862537f53edd91dcff2b8977._comment new file mode 100644 index 000000000..42fad62b9 --- /dev/null +++ b/doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT/comment_1_5d33bcbd862537f53edd91dcff2b8977._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-06T21:13:44Z" + content=""" +I think this is a general git question, not specific to git-annex. At the point in time that you run `git clone` on the FAT filesystem, git-annex is not running at all. + +You could ask the git community about this. I know that git already has a core.precomposeunicode setting that is used to work around a somewhat similar problem on Mac OS. + +What git-annex *does* let you do is set up a [[directory_special_remote|special_remote/directory]] on the FAT filesystem. This way, +there is no git repository there, and the filenames stored in git are not used at all on FAT. If your media player looks at mp3 metadata to get song titles, etc and doesn't care about the filenames at all, this would be a good option. +"""]] diff --git a/doc/forum/Workflow_for_adding_files.mdwn b/doc/forum/Workflow_for_adding_files.mdwn new file mode 100644 index 000000000..cb631543f --- /dev/null +++ b/doc/forum/Workflow_for_adding_files.mdwn @@ -0,0 +1,32 @@ +What is the correct way to add/modify files such that the changes are synchronized? + +Suppose I have a server "server" and a windows client "client" (more after some time); everything direct mode. + +I created the repos on the server: + + cd bin + git init + git annex init server + git annex direct + git annex add . + git annex sync + +On the (Windows) client using cygwin: + + git annex clone ssh://me@server:/srv/bin + cd bin + git annex init client + +Then I want to add files on the client: + + git annex add tools + git annex sync + +At this point I wonder that the data is not copied to the server but only metadata! +I then used + + git annex sync --content + +but then everything from the server is leeched as well (as if I could have called "git annex get .") + +What is the intented workflow such that added/modified files on the client always go to the server, modified/new files from the server are always pulled but ONLY if I previously got the file/directory via "get annex get"? diff --git a/doc/forum/Workflow_for_adding_files/comment_1_a60dae97db827bc641d6256d1f382b5f._comment b/doc/forum/Workflow_for_adding_files/comment_1_a60dae97db827bc641d6256d1f382b5f._comment new file mode 100644 index 000000000..9774e69bf --- /dev/null +++ b/doc/forum/Workflow_for_adding_files/comment_1_a60dae97db827bc641d6256d1f382b5f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnJO6OKamxo1HDLwdV-W3KV4GhJ5Qitl9M" + nickname="Frederik" + subject="comment 1" + date="2014-05-15T00:57:23Z" + content=""" +Check the description for manual out on [[http://git-annex.branchable.com/preferred_content/standard_groups/]]. I believe that's what you'll need. +"""]] diff --git a/doc/forum/Workflow_for_adding_files/comment_2_28dd15ac50f79fb07bacf8b8326c7edc._comment b/doc/forum/Workflow_for_adding_files/comment_2_28dd15ac50f79fb07bacf8b8326c7edc._comment new file mode 100644 index 000000000..c11be2667 --- /dev/null +++ b/doc/forum/Workflow_for_adding_files/comment_2_28dd15ac50f79fb07bacf8b8326c7edc._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9SYh6N-JUMkYkW4aOk55zC3Vr9KonDV4" + nickname="Florian" + subject="comment 2" + date="2014-06-18T07:35:31Z" + content=""" +Just to be sure I understood the topic, this would be achieved in putting the repo in the manual transfer group? + +manual + +This gives you nearly full manual control over what content is stored in the repository. This allows using the assistant without it trying to keep a local copy of every file. Instead, you can manually run git annex get, git annex drop, etc to manage content. Only content that is already present is wanted. + +The exception to this manual control is that content that a client repository would not want is not wanted. So, files in archive directories are not wanted once their content has reached an archive repository. + +present and ($client) + +(Where $client is a copy of the preferred content expression used for clients.) +<<< +"""]] diff --git a/doc/forum/XBMC__44___NFS___38___git-annex_.mdwn b/doc/forum/XBMC__44___NFS___38___git-annex_.mdwn new file mode 100644 index 000000000..fc5cd702a --- /dev/null +++ b/doc/forum/XBMC__44___NFS___38___git-annex_.mdwn @@ -0,0 +1,27 @@ +Hi, + +this is not a git-annex problem, but more likely a way some software handles symlinks and/or do file-type detection. + +my setup is a following: +- multiple pc/laptop (linux) +- one NAS (debian) - main repo for music/films/photos - all in git-annex +- a Raspberry Pi (Raspbmc) - connected to the TV + +I want to share all my films/music/.. to the Pi. +So, i setup a r/o NFS and mounted that in the XBMC. +So far this works, I see directories but XBMC do not recognize the media files. +It works, if I "git-annex edit ..." the file. + +My _assumption_ is, that it follows the symlink, finds a file with no extension - and ignores that. +In XBMC-config there is a list of supported filetypes by extension. ( .avi,.mpg,.foo,.bar ) + +What I have think of so far: +- tell XBMC somehow to load all the files (did not work) +- having some kind of (FUSE?) filter, which hides the symlink in a transparent way +- creating via script hard-links in a seperate folder with same structure, mount that. +- using some alternative to NFS ( like ftp, smb ) or a other kind of media-server (server-side) + +any comments, ideas ? +If i find a solution, I'll post it here. + +.ka diff --git a/doc/forum/XBMC__44___NFS___38___git-annex_/comment_1_86480f31d410e903766f82e6ecf83e1c._comment b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_1_86480f31d410e903766f82e6ecf83e1c._comment new file mode 100644 index 000000000..e82522548 --- /dev/null +++ b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_1_86480f31d410e903766f82e6ecf83e1c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="Samba works" + date="2013-05-30T14:22:46Z" + content=""" +I use samba. Just need to set + + unix extensions = no + +which causes samba to handle the symlinks internally. +"""]] diff --git a/doc/forum/XBMC__44___NFS___38___git-annex_/comment_2_d8ed4dd51d3050db691a8abdec24cd42._comment b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_2_d8ed4dd51d3050db691a8abdec24cd42._comment new file mode 100644 index 000000000..0b3cb22c1 --- /dev/null +++ b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_2_d8ed4dd51d3050db691a8abdec24cd42._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-30T15:20:51Z" + content=""" +The default git-annex backend for over a year now is SHA256E, which includes the filename extension in the key to deal with programs that rely on them. If you're not using that backend, you can `git annex migrate` to it. + +Or you can turn on direct mode, which will certainly solve the problem. +"""]] diff --git a/doc/forum/XBMC__44___NFS___38___git-annex_/comment_3_42b80ee51ce25775bf4532f53a8ecfe3._comment b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_3_42b80ee51ce25775bf4532f53a8ecfe3._comment new file mode 100644 index 000000000..00fbf6a20 --- /dev/null +++ b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_3_42b80ee51ce25775bf4532f53a8ecfe3._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="ka7" + ip="2001:7b8:155d:0:222:64ff:fe16:dc52" + subject="comment 3" + date="2013-05-31T15:45:51Z" + content=""" +ah, great. +I'll try the samba way. +And i guess my git-annex is too old (using the git-annex version: 3.20120629~bpo60+2 from debian-backports) +thanks ! +"""]] diff --git a/doc/forum/XBMC__44___NFS___38___git-annex_/comment_4_01767f3f864954cf8080274e206da9d4._comment b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_4_01767f3f864954cf8080274e206da9d4._comment new file mode 100644 index 000000000..58f00af15 --- /dev/null +++ b/doc/forum/XBMC__44___NFS___38___git-annex_/comment_4_01767f3f864954cf8080274e206da9d4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ka7" + ip="2001:7b8:155d:0:222:64ff:fe16:dc52" + subject="comment 4" + date="2013-05-31T18:46:29Z" + content=""" +after a quick check I realized that sha256E is available -- migrate and yepey! +"""]] diff --git a/doc/forum/XMPP_authentication_failure.mdwn b/doc/forum/XMPP_authentication_failure.mdwn new file mode 100644 index 000000000..3c4c41bc2 --- /dev/null +++ b/doc/forum/XMPP_authentication_failure.mdwn @@ -0,0 +1,15 @@ +Hi, + +Not sure if this is a bug or not, so posting it here rather than in the bug tracker. + +Basically, I am unable to add an XMPP identity via the webapp, I continually get the error message: "Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: AuthenticationFailure)" + +I didn't enter the wrong password, I copy/pasted it from my password manager and the same account/password work fine with Pidgin. The log doesn't show anything of interest that I can see. + +Using git annex version 4.20130405 from Debain Unstable. The server is ejabberd running on my VPS with a self signed certificate. + +Anyone got any idea what might be going on? + +Cheers, + +Rob diff --git a/doc/forum/XMPP_authentication_failure/comment_1_19c7c3aa79d209d613d2e061e3129690._comment b/doc/forum/XMPP_authentication_failure/comment_1_19c7c3aa79d209d613d2e061e3129690._comment new file mode 100644 index 000000000..a5862e58f --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_1_19c7c3aa79d209d613d2e061e3129690._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-09T18:31:01Z" + content=""" +I installed ejabberd and was able to trivially reproduce this bug. Pidgin works, git-annex fails, and I just created the user with `ejabberdctl register`. Filed an upstream bug report against the haskell network-protocol-xmpp library, by email, since there's no upstream BTS: +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_2_870059fed451e8377e5d382464ecc34b._comment b/doc/forum/XMPP_authentication_failure/comment_2_870059fed451e8377e5d382464ecc34b._comment new file mode 100644 index 000000000..bcf4e22ac --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_2_870059fed451e8377e5d382464ecc34b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="robconnolly" + ip="203.167.218.84" + subject="comment 2" + date="2013-04-09T23:01:44Z" + content=""" +Excellent, thanks for the quick response/action! +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_3_1a7ff955e9173f13d10b75f203792384._comment b/doc/forum/XMPP_authentication_failure/comment_3_1a7ff955e9173f13d10b75f203792384._comment new file mode 100644 index 000000000..587daa0ed --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_3_1a7ff955e9173f13d10b75f203792384._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-12T22:25:12Z" + content=""" +John has gotten back to me with some analysis. The authentication failure is when SCRAM-SHA-1 is used. Ejabberd is rejecting the client's authentication request with a reason of \"bad-protocol\". It's not clear if ejabberd is broken or if gsasl is generating a bad SCRAM-SHA-1 authentication. We're inclined toward the latter, and will be forwarding this on to ejabberd. + +The only way to turn off this authentication in ejabberd is to configure it to store passwords in plain text, or downgrade to a version older than 2.1.9, which first added it. Note that debian stable contains 2.1.5.3, so is not currently affected, for example. +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_4_d59031ebc0dd3abc1f4c96878328362c._comment b/doc/forum/XMPP_authentication_failure/comment_4_d59031ebc0dd3abc1f4c96878328362c._comment new file mode 100644 index 000000000..e3e927818 --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_4_d59031ebc0dd3abc1f4c96878328362c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-17T13:26:45Z" + content=""" +Upstream bug report, with patch https://support.process-one.net/browse/EJAB-1632 +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_5_c37ef477bef7efdb79dd05dce90dfde6._comment b/doc/forum/XMPP_authentication_failure/comment_5_c37ef477bef7efdb79dd05dce90dfde6._comment new file mode 100644 index 000000000..37a3365d0 --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_5_c37ef477bef7efdb79dd05dce90dfde6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="Wheezy is affected" + date="2013-05-25T12:00:21Z" + content=""" +Now that Wheezy is out, Debian Stable appears to be affected by this issue. It has ejabberd v2.1.10 . + +The patch on the linked bug report doesn't apply cleanly to v2.1.10. I'll try and look at this again tomorrow. +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment b/doc/forum/XMPP_authentication_failure/comment_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment new file mode 100644 index 000000000..fe4ab0744 --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-25T17:57:43Z" + content=""" +Debian has it fixed in 2.1.10-5 but this has unfortunately not made it to the wheezy release. +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_7_14cd9b67806db93c3af055d88c9a910a._comment b/doc/forum/XMPP_authentication_failure/comment_7_14cd9b67806db93c3af055d88c9a910a._comment new file mode 100644 index 000000000..38a873392 --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_7_14cd9b67806db93c3af055d88c9a910a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="comment 7" + date="2013-05-25T20:27:32Z" + content=""" +Ah ha, so it is. I've installed ejabberd from Jessie onto my Wheezy box and now git-annex can authenticate. + +Thank you! +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment b/doc/forum/XMPP_authentication_failure/comment_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment new file mode 100644 index 000000000..2700343ca --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnVTPaZaIfnZqDbkmW97pqxwi2QuZIJAF4" + nickname="Boris" + subject="jabberd also affected" + date="2013-06-25T13:00:46Z" + content=""" +I tried logging in to my local 'jabberd' server and got the same response: + +AuthenticationError \"No supported authentication mechanism\" + +checking the version gives: + + jabberd -v + jabberd14 version 1.6.1.1 + + The following optional features have been enabled: + - support for IPv6. + - support for TLS using GNU TLS + - support for MySQL + - support for PostgreSQL + +-------------- +Can I do anything, investigate something? +"""]] diff --git a/doc/forum/XMPP_authentication_failure/comment_9_fbb9eba65fbb72201f08511945fbcf8c._comment b/doc/forum/XMPP_authentication_failure/comment_9_fbb9eba65fbb72201f08511945fbcf8c._comment new file mode 100644 index 000000000..e019056de --- /dev/null +++ b/doc/forum/XMPP_authentication_failure/comment_9_fbb9eba65fbb72201f08511945fbcf8c._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 9" + date="2013-06-25T17:18:56Z" + content=""" +Boris, that seems like an unrelated problem to the one affecting ejabberd. Different error message. + +"""]] diff --git a/doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__.mdwn b/doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__.mdwn new file mode 100644 index 000000000..f29637c0d --- /dev/null +++ b/doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__.mdwn @@ -0,0 +1,9 @@ +git-annex-assistant is so exciting... + +Can't set up XMPP sharing. The web app says "Wrong Password" for my gmail/home-google-apps/work-google-apps addresses, but they are correct. + +I'd love to send some debug output, can anyone tell me how to get it? Of course if I'm just doing something wrong and you have an FAQ link or similar, feel free to RTFM me :) + +I'm on Ubuntu 12.04 running https://downloads.kitenet.net/git-annex/linux/3.20121112/git-annex-standalone-amd64.tar.gz + +Carlo diff --git a/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 b/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 new file mode 100644 index 000000000..d3f408690 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2012-11-13T14:38:28Z" + content=""" +Just an idea: Do you have two-factor-authorisation set up for your google account, you need to generate an application specific password, as the 'normal' password will not work. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..2c5f408e7 --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 2" + date="2012-11-13T17:21:35Z" + content=""" +@Karsten that seems likely. + +I've made a change so it shows the error message from the XMPP library I'm using. Which may or may not be useful.. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..eab2e796b --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="XMPP" + date="2012-11-13T23:26:50Z" + content=""" +Just tried a fresh jabber.org address, same error. + +Will see if I can get the changed version built. Or are there nightlies? +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..9cdca6fc1 --- /dev/null +++ b/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 @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Now Works! For jabber.org, gmail, but NOT google apps" + date="2012-11-27T11:40:43Z" + content=""" +Hi again! + +With the latest version, 3.20121126, pairing works for both something@gmail.com and something@jabber.org! Yay! + +What still fails is my google apps address, something@somedomain.com, seems to behave same as before. the assistant says + + Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: connect: timeout (Connection timed out)) + +If you would like a google apps address on my domain, so you don't have to set up your own, just let me know. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..58fb0242b --- /dev/null +++ b/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 @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 5" + date="2012-11-27T20:32:47Z" + content=""" +Hmm, I can't think of anything I've changed that would make it work where it didn't before. + +I suspect the google apps problem is because it looks for a SRV record in DNS to find the jabber server, and something is wrong there. Without knowing what \"something@somedomain.com\" is standing for, it's hard to tell. :) + +If you'd like to set me up something to test with, my email address is id@joeyh.name +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..cc633e8fb --- /dev/null +++ b/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 @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2012-11-29T15:37:46Z" + content=""" +Weird, 20121112 works too now. + +Looks like some kind of edge case... I'll let you know if I find it. + +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..de8403c52 --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlutNrg7ajiNAfi5gqJfD8crv0aimZa27k" + nickname="Chuck" + subject="I'm having this problem too" + date="2013-07-21T19:14:21Z" + content=""" +I'm a git-annex newbie looking for Dropbox-like functionality. I've got git-annex and the webapp running on my desktop and laptop, and I believe I've got a Jabber account working since Kopete seems happy with my account info. But when I enter the correct Gmail UID and password I get the above error. + +I'm running the version of git-annex that's current in the standard Ubuntu repos (I'm actually running Kubuntu if that matters), and that version is 20121112ubuntu2. If this is an issue that was fixed in the 20121126 release, how would I get that? Doing the standard install gets me the version I have now... +"""]] diff --git a/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__.mdwn b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__.mdwn new file mode 100644 index 000000000..a9db915da --- /dev/null +++ b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__.mdwn @@ -0,0 +1,45 @@ +Hi, + +Some time ago I asked [[here|git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah]] +about possible improvements in git `copy --fast --to`, since it was painfully slow +on moderately large repos. + +Now I found a way to make it much faster for my particular use case, by +accessing some annex internals. And I realized that maybe commands like `git +annex find --in=repo` do not batch queries to the location log. This is based on +the following timings, on a new repo (only a few commits) and about 30k files. + + > time git annex find --in=skynet > /dev/null + + real 0m55.838s + user 0m30.000s + sys 0m1.583s + + + > time git ls-tree -r git-annex | cut -d ' ' -f 3 | cut -f 1 | git cat-file --batch > /dev/null + + real 0m0.334s + user 0m0.517s + sys 0m0.030s + +Those numbers are on linux (with an already warm file cache) and an ext4 filesystem on a SSD. + +The second command above is feeding a list of objects to a single `git cat-file` +process that cats them all to stdout, preceeding every file dump by the object +being cat-ed. It is a trivial matter to parse this output and use it for +whatever annex needs. + +Above I wrote a `git ls-tree` on the git-annex branch for simplicity, but we could +just as well do a `ls-tree | ... | git cat-file` on HEAD to get the keys for the +annexed files matching some path and then feed those keys to a cat-file on +the git-annex branch. And this still would be an order of magnitude faster than +what currently annex seems to do. + +I'm assuming the bottleneck is in that annex does not batch the `cat-file`, as the rest of logic needed for a find will be fast. Is that right? + +Now, if the queries to the location log for `copy --to` and `find` could be batched this way, the +performance of several useful things to do, like checking how many annexed files +we are missing, would be bastly improved. Hell, I could even put that number on +the command line prompt! + +I'm not yet very fluent in Haskell, but I'm willing to help if this is something that makes sense and can be done. diff --git a/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_1_01cbfc513c790faef3a3ede5315d3589._comment b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_1_01cbfc513c790faef3a3ede5315d3589._comment new file mode 100644 index 000000000..6b4a6b2a0 --- /dev/null +++ b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_1_01cbfc513c790faef3a3ede5315d3589._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-06T22:21:33Z" + content=""" +git-annex uses cat-file --batch, yes. You can verify this with --debug. Or you can read Annex/CatFile.hs and Git/CatFile.hs + +git-annex has to ensure that the git-annex branch is up-to-date and that any info synced into the repository is merged into it. This can require several calls to git log. Your command does not do that. git-annex find also runs `git ls-files --cached`, which has to examine the state of the index and of files on disk, in order to only show files that are in the working tree. Your command also omits that. +"""]] diff --git a/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_2_fe28dfb360caa12d5d5bc186def3eb45._comment b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_2_fe28dfb360caa12d5d5bc186def3eb45._comment new file mode 100644 index 000000000..4ba4c8264 --- /dev/null +++ b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_2_fe28dfb360caa12d5d5bc186def3eb45._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 2" + date="2013-11-06T23:14:03Z" + content=""" +Ok, then I don't understand where annex spends its time. git annex takes 55 +seconds! vs less than a second for a batched query on all the keys in the +location log. Checking that branches are in sync, or traversing the working dir +shouldn't amount the extra 54 seconds! At least not on a recently synced repo +with up to date index and clean working dir. + +> git-annex has to ensure that the git-annex branch is up-to-date and that any info synced into the repository is merged into it. This can require several calls to git log + +Ok, I understand that. Checking that should be typically fast though, isn't it? On a repo that has just been synced, it doesn't need to go very far on the log. + +> git-annex find also runs git ls-files --cached, which has to examine the state of the index and of files on disk, in order to only show files that are in the working tree + +I understand that too. For my particular use case, I know I do the `git copy` when the +repo is in sync and the working dir has no uncommited changes. So I use HEAD to retrieve the keys for +the files in the working tree. I do something like that: + + time git ls-tree -r HEAD | grep -e '^120000' | cut -d ' ' -f 3 | cut -f 1 | git cat-file --batch > /dev/null + + real 0m0.178s + user 0m0.277s + sys 0m0.037s + +That plus some fast parsing of the output gets the list of keys for the files in HEAD in less than a second. Where do the 54 extra seconds hide, then? + +Mm... how does annex retrieve the keys for files in the working tree? Does it follow +the actual symlinks on the filesystem? I can believe that following 30k symlinks may be slow (although not 55 second slow). + +Sorry for being so insistent on this... It is just that I do think the same can be done much faster, and such an improvement in performance would be very interesting, not only for me. +"""]] diff --git a/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_3_9bb30ab62febe4ef63bed49f831a473a._comment b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_3_9bb30ab62febe4ef63bed49f831a473a._comment new file mode 100644 index 000000000..c92be8ad5 --- /dev/null +++ b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_3_9bb30ab62febe4ef63bed49f831a473a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-07T18:12:09Z" + content=""" +It's hard to say until some profiling has actually been done. Comparing apples and oranges, or perhaps better to say, orange blossoms and oranges, is not very useful. +"""]] diff --git a/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_4_7832f0347a41b8204538c01b72487803._comment b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_4_7832f0347a41b8204538c01b72487803._comment new file mode 100644 index 000000000..3e7eb01db --- /dev/null +++ b/doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_4_7832f0347a41b8204538c01b72487803._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 4" + date="2013-11-07T18:40:27Z" + content=""" +Ok, thanks. + +I understand that annex is more sophisticated than what I'm proposing. I'm also +not comparing apples to oranges, what I'm saying is this: All the +logic and checking and git calls that I thought annex needs to do, take +much much less time than those 55 seconds. So either I'm missing something big (about 98% of it in execution time), or +annex is doing something very inefficient. That's all I'm saying, and I was +hoping that you could clarify that, since you already know the code. + +Also I'm sorry for being so annoying. If annex were writen in C, I would either have understood those 55 seconds or sent you a patch making annex faster. Being in +haskell means that it will take me considerably more time and effort. But if I manage to +improve things and if it is ok with you I'll send you patches... eventually. +"""]] diff --git a/doc/forum/__171__Locking__187___files_until_synced.mdwn b/doc/forum/__171__Locking__187___files_until_synced.mdwn new file mode 100644 index 000000000..129927bdc --- /dev/null +++ b/doc/forum/__171__Locking__187___files_until_synced.mdwn @@ -0,0 +1,7 @@ +I’m currently trying to set up a sync which involves an SQLite3 database file that should always be in the same state on all systems at all times (since there is no readily available way of merging the data). Basically, I’m looking for a practical way that gives me some help in making sure the files never drift apart between my remotes. Since I’m forgetful and might forget syncing the repo before going home from the office, I was wondering whether there might be a good way to assist me in this. Has anyone had some good ideas in this direction, or is there a canonical solution? + +It occurred to me one way would be to instate a hook somewhere that links the database to /dev/null in all other remotes (so the software will fail to work if I start it without having synced), but it seems tricky. I guess would have to involve per-remote branches, which will be hard to do, since I need to use direct mode. + +A less complex method might be forcing a sync before shutting down the system resp. when booting up. + +Maybe other folks have had ideas for a practical, yet robust solution. diff --git a/doc/forum/__171__Locking__187___files_until_synced/comment_1_8bf59f47fee0a8d5741fe209b5899863._comment b/doc/forum/__171__Locking__187___files_until_synced/comment_1_8bf59f47fee0a8d5741fe209b5899863._comment new file mode 100644 index 000000000..d327a58b4 --- /dev/null +++ b/doc/forum/__171__Locking__187___files_until_synced/comment_1_8bf59f47fee0a8d5741fe209b5899863._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-08T17:31:53Z" + content=""" +This is something git's distributed nature preludes. You might frankly be better with one of the centralized VCSs that supports locking in this specific case. Or, you can do some kind of \"lock server\" that the clients contact, layering a centralized approach on top of git. +"""]] diff --git a/doc/forum/__171__Locking__187___files_until_synced/comment_2_0c683547a6178e4303f0b1ed1f5605a5._comment b/doc/forum/__171__Locking__187___files_until_synced/comment_2_0c683547a6178e4303f0b1ed1f5605a5._comment new file mode 100644 index 000000000..b76f35da5 --- /dev/null +++ b/doc/forum/__171__Locking__187___files_until_synced/comment_2_0c683547a6178e4303f0b1ed1f5605a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 2" + date="2014-07-09T07:07:27Z" + content=""" +Yea, it’s basically just the isolated one file that needs «locking», so one could just try a different route. The idea with keeping state on a server sounds like a pretty good idea. I could just «echo» via SSH to my webserver some info on who has the file locked; then I could wrap the program that uses the SQLite3 DB in a script that checks whether it’s safe. +"""]] diff --git a/doc/forum/__34__Pairing__34___more_than_two_computers.mdwn b/doc/forum/__34__Pairing__34___more_than_two_computers.mdwn new file mode 100644 index 000000000..099c7a663 --- /dev/null +++ b/doc/forum/__34__Pairing__34___more_than_two_computers.mdwn @@ -0,0 +1,11 @@ +I need some help understanding here. + +We use AeroFS at work to sync the normal user files across computers. I'll quite likely be replacing that with git annex as soon as Windows port is stable enough. + +How it works is that you create a repo, and share it with one or more users. Then AeroFS discovers what other repos are online and if they're on the local network, and syncs from wherever is most convenient. + +This sounds a little like pairing, but with pairing you need to arrange more than 2 devices in a "star" or "chain". This is fine for my own devices, but it becomes brittle if you have lots of devices syncing from each other, which may or may not be online at any given time. The only way around it seems to be to pair each device with each other device, with the labor rising exponentially. + +Is this correct? Best compromise for my use case seems to be to just do a star setup and pair everything with an always-on machine. Do you agree? + +Thanks! Carlo diff --git a/doc/forum/__34__Pairing__34___more_than_two_computers/comment_1_80f7a4bb3c66b11e566043407b611bbf._comment b/doc/forum/__34__Pairing__34___more_than_two_computers/comment_1_80f7a4bb3c66b11e566043407b611bbf._comment new file mode 100644 index 000000000..026681f79 --- /dev/null +++ b/doc/forum/__34__Pairing__34___more_than_two_computers/comment_1_80f7a4bb3c66b11e566043407b611bbf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-22T17:41:58Z" + content=""" +You're basically correct. Typically if you have a central machine, it's a server, so at that point you're not pairing, but are just adding a ssh server, or some other type of remote. + +I think that systems like AeroFS are pretty neat, but my goal is not really to build another one of those. I'd rather make git-annex be able to use such things as [[special_remotes]]. +"""]] diff --git a/doc/forum/__34__Preseeding__34___a_special_remote.mdwn b/doc/forum/__34__Preseeding__34___a_special_remote.mdwn new file mode 100644 index 000000000..4b1342598 --- /dev/null +++ b/doc/forum/__34__Preseeding__34___a_special_remote.mdwn @@ -0,0 +1,5 @@ +I have a remote repository that I have yet to add as a remote into git-annex, but which already contains data that I want git-annex to manage. I already know what the SHA256 hashes and sizes of all the files are, and I can arrange them to match what git-annex will expect. + +Is there a way that I can tell git-annex about the presence of the data, to save me having to download and re-upload everything, in a way that is safe? What I want seems to be similar to "git annex reinject" but for special remotes (and I'll take care of the renaming), but I don't see anything in the manpage that looks likely. + +I can quite easily create and commit the symlinks with correctly predicted names in my master branch. Will git-annex will treat these correctly? diff --git a/doc/forum/__34__Preseeding__34___a_special_remote/comment_1_b0c46d0eba900d0f6169a2c698d7a222._comment b/doc/forum/__34__Preseeding__34___a_special_remote/comment_1_b0c46d0eba900d0f6169a2c698d7a222._comment new file mode 100644 index 000000000..6fae5c62e --- /dev/null +++ b/doc/forum/__34__Preseeding__34___a_special_remote/comment_1_b0c46d0eba900d0f6169a2c698d7a222._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 1" + date="2014-05-21T17:41:22Z" + content=""" +If you also have the files present locally, you can simply do `git annex copy --fast --to remote`. git-annex copy will first check to see if the remote has the file; seeing that it does it will update the location log. + +Another option, if you have shell access on the remote is to simply set up a git repository there, move the files into it and `git annex add` them, and merge that into your local repository. + +There is not currently any way to set the [[location_tracking]] information to tell git-annex that a file has appeared on a remote. Of course, you can modify the git-annex branch manually to do so. See [[internals]]. +"""]] diff --git a/doc/forum/__34__Preseeding__34___a_special_remote/comment_2_5e63f5e6f45c11cc86b293ce8acad77f._comment b/doc/forum/__34__Preseeding__34___a_special_remote/comment_2_5e63f5e6f45c11cc86b293ce8acad77f._comment new file mode 100644 index 000000000..cdbf1e76d --- /dev/null +++ b/doc/forum/__34__Preseeding__34___a_special_remote/comment_2_5e63f5e6f45c11cc86b293ce8acad77f._comment @@ -0,0 +1,65 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkexhIpGcYa22aPQtLm-StpHiF-MHYPh5w" + nickname="Robie" + subject="Solved" + date="2014-06-01T13:55:58Z" + content=""" +Thanks to Joey for pointing me in the right direction. I got this working now. + +There are approximately three steps: + +1. Obtain a mapping of git-annex key to friendly name, and rename all entries +in the special remote to their git-annex keys. + +2. Create and commit symlinks in the `master` branch (or wherever you want them). + +3. Add location tracking entries to the `git-annex` branch for all entries. + +First, I created an \"index\" file describing the contents of my special remote, +in the form \"KEY NAME\" where KEY is the git-annex key (I used SHA256) and NAME +is the name I want to use for each file. + +## Step 1: Map and rename + +In my case I was \"importing\" a ddar remote, so I wrote a quick script +(https://github.com/basak/ddar/blob/master/contrib/git-annex-convert.py) to +generate this index as well as rename all ddar archive members to their +git-annex keys instead. + +## Step 2: Create and commit symlinks + +Then, I created symlinks in my master branch using: + + exec 3> \"$log\";git add \"$log\";done + exec 3<&- + git commit -m'Import knowledge of ddar repository contents' + +## Verifying + +`git-annex fsck --from ddar --fast` checks that the keys expected in the +special remote can be found (replace the special remote name as needed). + +Skipping `--fast` will download all data to verify it. I didn't do this - +instead I just sampled one entry which seemed to be OK. + + + +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn b/doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn new file mode 100644 index 000000000..7485958c0 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn @@ -0,0 +1,5 @@ +One reason to use git-annex is to save disk space by tossing files you don't use that often. + +I can find big files in the repository with git annex find --largerthan=100M, but is there a way to find large *directories*? In an ordinary filesystem I'd use "du -h" with a maxdepth to get an idea of what parts of a directory are taking up my disk space, but obviously that won't work with git annex because all the content is in .git/annex. Any ideas? + +(I can get a listing of file sizes in a directory with the handy -L flag of ls -- "ls -lL" shows me the sizes of the link targets -- but that won't summarize all the sizes of subdirectories. Unless my ls-fu is just weak.) diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_1_a41bd02361aa961e5285aeaf1ea062be._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_1_a41bd02361aa961e5285aeaf1ea062be._comment new file mode 100644 index 000000000..0b69a4142 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_1_a41bd02361aa961e5285aeaf1ea062be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 1" + date="2012-11-28T23:21:11Z" + content=""" +du(1) also accepts the -L option, so if you for example want to find what directories occupies most storage: + + $ du -L | sort -n +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_2_28ba62a546f5cc8f416491423d743d8a._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_2_28ba62a546f5cc8f416491423d743d8a._comment new file mode 100644 index 000000000..019cb8b81 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_2_28ba62a546f5cc8f416491423d743d8a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 2" + date="2012-11-28T23:24:11Z" + content=""" +And if you want to find the biggest files in a directory tree: + + $ find -type l -print0 | xargs -0 du -L | sort -n | tail -500 +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_3_8d97f40c1d14b7230f3656a00a99cf80._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_3_8d97f40c1d14b7230f3656a00a99cf80._comment new file mode 100644 index 000000000..0a11f7cc9 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_3_8d97f40c1d14b7230f3656a00a99cf80._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2012-11-29T02:03:24Z" + content=""" +Sweet! I should have RTFM a bit more. Thanks. :) +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment new file mode 100644 index 000000000..227c74b02 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="comment 4" + date="2012-11-29T23:51:21Z" + content=""" +I've been thinking about writing a sort of git-annex du. I'm surprised to find someone else looking for such a thing. While \"du -L\" will tell you how much space is used by files you actually have, I was interested in knowing (approximately) how much space would be used if you were to git-annex get everything you don't yet have. + +There are many options and variations to think about, such as: + +* do you want to count duplicate files once or as many times as they appear (as if you 'git-annex lock'd them all) +* maybe you want to know how much space is used by files that reside only on a certain remote or set of remotes +* you might want to know how much space would be used by all the files you don't yet have, but not count the files you already have + +All of the backends so so far seem to store the size of the files in the filename, so my plan was to read it out of the links. If anybody has a better idea about how to get the sizes of annexed files or options that would be handy for a git-annex du, let me know. I'll see if I can get the start of something useful this weekend. I'll post here when I have something to share. + +I'm also open to suggestions for the executable name. Right now I'm thinking \"gadu\" for git-annex disk usage. +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment new file mode 100644 index 000000000..021614405 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 5" + date="2012-11-30T00:29:44Z" + content=""" +Steve, that would be a very useful utility. I've been thinking of such a tool, but haven't gotten around to write it yet. It would be practical to have before copying big/many files from another drive. If I've been short of free space, I've executed `du -L` in the source directory, but that's a bit cumbersome. + +And \"gadu\" is a fine name, yes. Goes well along with my \"ga\" shortcut for \"git annex\", which I created two hours after I started using git-annex. I've probably saved thousands of keystrokes because of that. ☺ +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_6_48f6a2761a34b7f991325f1d24e2c5ff._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_6_48f6a2761a34b7f991325f1d24e2c5ff._comment new file mode 100644 index 000000000..1c456e24b --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_6_48f6a2761a34b7f991325f1d24e2c5ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="gadu 0.01 is up" + date="2012-12-08T06:22:50Z" + content=""" +I've got an initial try at gadu up over at I created a separate thread for it: +"""]] diff --git a/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_7_d632baff41b8582f1a79bc5018c68545._comment b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_7_d632baff41b8582f1a79bc5018c68545._comment new file mode 100644 index 000000000..6fa2659f9 --- /dev/null +++ b/doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_7_d632baff41b8582f1a79bc5018c68545._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Also try sizes" + date="2013-01-02T22:05:39Z" + content=""" +The \"sizes\" tool on Hackage is a git-annex aware du-like utility. Just give it the \"-A\" flag to have it interpret annex symlinks as if they were normal files, and to also ignore files inside a .git/annex. +"""]] diff --git a/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory..mdwn b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory..mdwn new file mode 100644 index 000000000..ea0ad80ba --- /dev/null +++ b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory..mdwn @@ -0,0 +1,11 @@ +I tried to "git annex copy --to SSH-REMOTE" it says it sends it: +copy Test (checking SSH-REMOTE...) (to SSH-REMOTE...) +SHA256E-s6--8283daccd02d2b2797da53446d367e39dc0fb1615bcae4274460f44455bd9822 + 6 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 146 bytes received 31 bytes 354.00 bytes/sec +total size is 6 speedup is 0.03 +ok +(Recording state in git...) + +But I can't find it in the working directory. Can anyone help me? diff --git a/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_1_0c0a5999a92bf5880f2113177dc67cc2._comment b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_1_0c0a5999a92bf5880f2113177dc67cc2._comment new file mode 100644 index 000000000..18c41f1c9 --- /dev/null +++ b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_1_0c0a5999a92bf5880f2113177dc67cc2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://www.rfc1149.net/" + nickname="Sam" + subject="comment 1" + date="2013-08-05T09:49:56Z" + content=""" +`git annex copy` will only push objects (content) into git annex private directory. You have to issue a `git annex merge` (or `git annex sync`) on the receiving end, or run `git annex assistant` there to update the working directory. + +Note that you can run `git annex merge` as a post-update hook if you want this to be done automatically. + +"""]] diff --git a/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_2_c18083d9054f66f0bd51d63452af07eb._comment b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_2_c18083d9054f66f0bd51d63452af07eb._comment new file mode 100644 index 000000000..da0a86929 --- /dev/null +++ b/doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_2_c18083d9054f66f0bd51d63452af07eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqaNwDQ367zpW6cIRviLz6zJZZFODgoEI" + nickname="Zack" + subject="It worked!" + date="2013-08-05T09:57:25Z" + content=""" +Thanks for the help, it worked. +"""]] diff --git a/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn new file mode 100644 index 000000000..9bacf28dc --- /dev/null +++ b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn @@ -0,0 +1,7 @@ +I found the command "git annex lock" very slow (much slower than the initial "git annex add" with SHA1), for a not so big directory, when run in a big repo. +It seems that each underlying git command is not fast, so I thought it would be better to run them once with all files as arguments. +I had to stop the lock command, and ran "git checkout ." (I did not change any file), is this a correct alternative? + +Thanks a LOT for this software, one that I missed since a long time (but wasn't able to write)! + +Rafaël diff --git a/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment new file mode 100644 index 000000000..0e2773bda --- /dev/null +++ b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="fixed" + date="2011-05-31T18:51:13Z" + content=""" +Running `git checkout` by hand is fine, of course. + +Underlying problem is that git has some O(N) scalability of operations on the index with regards to the number of files in the repo. So a repo with a whole lot of files will have a big index, and any operation that changes the index, like the `git reset` this needs to do, has to read in the entire index, and write out a new, modified version. It seems that git could be much smarter about its index data structures here, but I confess I don't understand the index's data structures at all. I hope someone takes it on, as git's scalability to number of files in the repo is becoming a new pain point, now that scalability to large files is \"solved\". ;) + +Still, it is possible to speed this up at git-annex's level. Rather than doing a `git reset` followed by a git checkout, it can just `git checkout HEAD -- file`, and since that's one command, it can then be fed into the queueing machinery in git-annex (that exists mostly to work around this git malfescence), and so only a single git command will need to be run to lock multiple files. + +I've just implemented the above. In my music repo, this changed an lock of a CD's worth of files from taking ctrl-c long to 1.75 seconds. Enjoy! + +(Hey, this even speeds up the one file case greatly, since `git reset -- file` is slooooow -- it seems to scan the *entire* repository tree. Yipes.) +"""]] diff --git a/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment new file mode 100644 index 000000000..9e9e778ce --- /dev/null +++ b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 2" + date="2011-05-31T21:43:22Z" + content=""" +Nice! +So if I understand correctly, 'git reset -- file' was there to discard staged (but not commited) changes made to 'file', before checking out, so that it is equivalent to directly 'git checkout HEAD -- file' ? +I'm curious about the \"queueing machinery in git-annex\": does it end up calling the one git command with multiple files as arguments? does it correspond to the message \"(Recording state in git...)\" ? +Thanks! + + +"""]] diff --git a/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment new file mode 100644 index 000000000..87da0c396 --- /dev/null +++ b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-05-31T21:54:23Z" + content=""" +@Rafaël , you're correct on all counts. +"""]] diff --git a/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_4_a4fd212cb066cd53d0d66eb09f3b39a8._comment b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_4_a4fd212cb066cd53d0d66eb09f3b39a8._comment new file mode 100644 index 000000000..ecb5ba913 --- /dev/null +++ b/doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_4_a4fd212cb066cd53d0d66eb09f3b39a8._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="josch" + ip="2001:638:709:5:2ad2:44ff:fe4b:56aa" + subject="thanks a lot!" + date="2014-06-23T15:13:34Z" + content=""" +Thank you for the answer to this problem! + +I put 150k emails in maildir format in git annex. Adding them took a couple of hours and so did the first full sync. But after that things didnt noticibly slow down - that was a surprise! + +What but then I wanted to do a one-time sync using rsync. I didnt find out how to tell rsync to follow symlinks at the destination instead of replacing symlinks with normal files. So I first unlocked the 150k emails (which was moderately quick and probably only I/O bound) and then did the rsync using the --checksum option which worked well as well. The problems started when I wanted to lock the whole thing again. This took ages and even after two days it did not output that it was adding files at all. So I used `find -type f | split -a3 -l100` and then `for f in x*; do echo $f; git annex add `echo \`cat $f\``; rm $f; done`. This started off well and I could finally see files being added. Unfortunately when I came back after a couple of hours, the progress slowed down to a crawl of only one file every few seconds. + +The solution was to just `git checkout -- Mail` everything. This finished in a matter of seconds and left the new mail which was copied over by rsync intact. + +Thanks a lot for the tip! + +Let me hereby also report that git annex seems to work without problems when using it with offlineimap and notmuch. At least I did not run into any problems with that setup yet. +"""]] diff --git a/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__.mdwn b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__.mdwn new file mode 100644 index 000000000..a5492dc86 --- /dev/null +++ b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__.mdwn @@ -0,0 +1,5 @@ +git-annex is seriously cool, however I havent figured out an important detail: +in the short presentation Richard Hartmann mentions the Nomad use case and says "... next time Im online I would like to have file x y z ... " +How can this be achieved exactly? If I do a git annex copy/get then it will want to do it instantly, not queuing it. +thanks a lot! +Aron diff --git a/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment new file mode 100644 index 000000000..0789316dc --- /dev/null +++ b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-07-19T14:41:39Z" + content=""" +What I do for this is maintain a `todo` directory and `cp -a` + `git annex add` files I want to download into this directory. +the `cp -a` maintains the symlinks and `git annex add` fixes them if needed. + +Also this works the same way if the situation is reversed and the machine you want to download the files onto is not online. You can add files to the `todo` directory on the server, then once the client machine is online do a `git annex sync` + `git annex get todo`. +"""]] diff --git a/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_2_e60f2bbc1c058993472fd920edbc75fc._comment b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_2_e60f2bbc1c058993472fd920edbc75fc._comment new file mode 100644 index 000000000..b0a8066ee --- /dev/null +++ b/doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_2_e60f2bbc1c058993472fd920edbc75fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnbBRfl5F8gKRr1ko8Ai6FbEZStXXNF1S4" + nickname="Áron" + subject="comment 2" + date="2012-07-19T22:41:53Z" + content=""" +hmm not bad workaround but still not very comfortable, thanks though. +"""]] diff --git a/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn new file mode 100644 index 000000000..f13aed2c2 --- /dev/null +++ b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn @@ -0,0 +1,17 @@ +i'm getting errors in ``git annex fsck`` on a shared bare git repo with git-annex 3.20120418 local repo version 3: + +``git-annex: ${PATH}/${MYREPO}.git/annex/objects/${HA}/${SH}/SHA1-${HASH}/SHA1-${HASH}: setFileMode: permission denied (Operation not permitted)`` + +the repository is shared among several users in a common group, and the repo is set up with sticky group, and with appropriate umasks, everything should work. + +however, even with the file having permissions -rw-rw-r-- in the directory with permissions drwxrwsr-x, owned by someone else but by a group i'm currently in (as verified by issuing `groups`), i get said error message. + +a strace reveals that the failing syscall is: + +``[pid 17626] chmod("${FILENAME}", 0100555) = -1 EPERM (Operation not permitted)`` + +(maybe related: git annex looks for the file in another ${HA}/${SH} combination (of three digits instead of two digits each) before, i take it this is just a new feature not used by the data in my repo? also, i should add that the repository dates back to git-annex 0.13.) + +as a workaround, i'm currently ``sudo chown``ing all files to me before the check. + +why does fsck try to set permissions even if they are ok? is this a bug in my setup, and if yes, how is a shared repository set up correctly? diff --git a/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_1_3a5202ef2116ebb5559b6f4d920755fc._comment b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_1_3a5202ef2116ebb5559b6f4d920755fc._comment new file mode 100644 index 000000000..5a5cafa72 --- /dev/null +++ b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_1_3a5202ef2116ebb5559b6f4d920755fc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-04-21T16:09:19Z" + content=""" +Well, the modes you show are wrong. Nothing in the annex should be writable. fsck needs to fix those. (It's true that it also always chmods even correct mode files/directories.. I've made a change avoiding that.) + +I have not thought or tried shared git annex repos with multiple unix users writing to them. ([[tips/Using_gitolite_with_git-annex]] would be an alternative.) Seems to me that removing content from the annex would also be a problem, since the directory will need to be chmodded to allow deleting the content from it, and that will fail if it's owned by someone else. Perhaps git-annex needs to honor core.sharedRepository and avoid these nice safeguards on file modes then. +"""]] diff --git a/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_2_86663eeb75b0477f53c45f26c8e4b051._comment b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_2_86663eeb75b0477f53c45f26c8e4b051._comment new file mode 100644 index 000000000..1c9bfbfe4 --- /dev/null +++ b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_2_86663eeb75b0477f53c45f26c8e4b051._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-04-21T23:46:42Z" + content=""" +All right, I've made all the changes so it supports `core.sharedRepository`. +"""]] diff --git a/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_3_c336b2b07cd006d378e5be9639ff17ec._comment b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_3_c336b2b07cd006d378e5be9639ff17ec._comment new file mode 100644 index 000000000..fd75f2f85 --- /dev/null +++ b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_3_c336b2b07cd006d378e5be9639ff17ec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="comment 3" + date="2012-04-23T14:14:28Z" + content=""" +thanks, that's great. will there be a way to have sharedRepository work for shared remotes (rsync, directory) too, or is that better taken care of by acls? + +@not thought of shared repos: we're having our family photo archive spread over our laptops, and backed up on our home storage server and on an rsync+encryption off-site server, with everyone naturally having their own accounts on all systems -- just if you need a use case. +"""]] diff --git a/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment new file mode 100644 index 000000000..568f11330 --- /dev/null +++ b/doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2012-04-23T14:35:39Z" + content=""" +I'm not currently planning to support sharedRepository perms on special remotes. I suppose I could be convinced otherwise, it's perhaps doable for the ones you mention (rsync might be tricky). (bup special remote already supports it of course.) + +thanks for the use case! +"""]] diff --git a/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__.mdwn b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__.mdwn new file mode 100644 index 000000000..19aacf021 --- /dev/null +++ b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__.mdwn @@ -0,0 +1,34 @@ +After a `git annex copy --auto -t m3` I got this error: + + (Recording state in git...) + error: unable to resolve reference refs/heads/git-annex: No such file or directory + fatal: Cannot lock the ref 'refs/heads/git-annex'. + git-annex: git [Param "update-ref",Param "refs/heads/git-annex",Param "d768b20f76ce40157214a713fb0ccb9cfc9134c2"] failed + +I did a `git annex sync m3` and got + + [...] + push m3 + Counting objects: 2976, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (2052/2052), done. + Writing objects: 100% (2379/2379), 392.33 KiB, done. + Total 2379 (delta 1652), reused 460 (delta 316) + Auto packing the repository for optimum performance. + error: bad ref for refs/heads/git-annex + error: bad ref for refs/heads/git-annex + error: bad ref for refs/heads/git-annex + To /media/m3/annex + 87c82c5..06219eb git-annex -> synced/git-annex + be7ff5e..6625634 master -> synced/master + ok + +And then I ran the command git-annex was trying to run: + + $ git update-ref refs/heads/git-annex d768b20f76ce40157214a713fb0ccb9cfc9134c2 + error: Trying to write ref refs/heads/git-annex with nonexistent object d768b20f76ce40157214a713fb0ccb9cfc9134c2 + fatal: Cannot update the ref 'refs/heads/git-annex'. + +`git fsck --full` gives no errors. + +What does this error mean? Should I be worried? Thanks. diff --git a/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_1_e50188896df347f1d92e20a52053aa14._comment b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_1_e50188896df347f1d92e20a52053aa14._comment new file mode 100644 index 000000000..b7ad4a13a --- /dev/null +++ b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_1_e50188896df347f1d92e20a52053aa14._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-01T18:33:37Z" + content=""" +I'm afraid that this looks like a partially corrupted git repository to me. Something seems to have gone wrong with `.git/refs/heads/git-annex`. Also, git object d768b20f76ce40157214a713fb0ccb9cfc9134c2 seems to have been present before, and be gone now. + +I would run `git fsck`, then look at what's happened in `.git/refs/heads`, and if the repository does seem to be damanged, re-clone it. (You can copy over `.git/config` and `.git/annex/` to keep your annexed data in the new clone.) You should probably also run `git annex fsck`, as it could have lost some location log changes. +"""]] diff --git a/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_2_d67793f7c969f64943d1fd54a1208c2b._comment b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_2_d67793f7c969f64943d1fd54a1208c2b._comment new file mode 100644 index 000000000..1dff89121 --- /dev/null +++ b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_2_d67793f7c969f64943d1fd54a1208c2b._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.166.255" + subject="comment 2" + date="2013-04-06T19:06:24Z" + content=""" +Thanks for taking the time to reply. + +1) The corruption spread between repositories so I resorted to restoring from a backup from some days ago, and then I restored newly added files by manually copying the symlinks from the old repo into the new one. Of course I can't update the git-annex branch by hand. I've run `git annex fsck`: does that re-create the location log information for the symlinks that I re-added, at least for the local repository even if it doesn't know about copies elsewhere? + +2) I initially tried to git clone from my restored backup, rather than just moving the restore into place. But then while this clone showed no errors on a `git fsck --full`, any git-annex command, such as `init` (following [this](http://git-annex.branchable.com/tips/what_to_do_when_a_repository_is_corrupted/)), gives the following sort of error: + + error: invalid object 100644 for '' +(unfortunately I lost my xterm so don't have one of my actual errors in full). Can you think of any reason why doing a clone of the backup copy would cause this? Instead I have just mv'd the backup copy into place and it works fine. +"""]] diff --git a/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_3_3523884833b5fd458a35f898797bf897._comment b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_3_3523884833b5fd458a35f898797bf897._comment new file mode 100644 index 000000000..21511d2ec --- /dev/null +++ b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_3_3523884833b5fd458a35f898797bf897._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-08T17:23:24Z" + content=""" +1. I don't understand how corruption could spread between git repositories. git is supposed to use checksums to prevent bad data propigating. I would be running a lot of `git fsck` if I were you. Yes, `git annex fsck` will update location log information for files it finds in the local repository. + +2. Again this looks like something is corrupting your repository when git writes it. Perhaps bad memory? I think you need to get to the root of the problem with the corrupting git repositories. +"""]] diff --git a/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment new file mode 100644 index 000000000..25d07e8ad --- /dev/null +++ b/doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 4" + date="2013-04-17T17:02:11Z" + content=""" +I didn't think that git would let corruption spread either, but it did: the repository m3 which I showed a push to in my original post showed a broken refs/heads/git-annex too. You can see it happening when git tries to repack m3 after pushing to it in my original post. + +I am pretty sure that my HDD on the machine where this first occurred needs replacing; I've marked the remote as untrusted. +"""]] diff --git a/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn new file mode 100644 index 000000000..950b8ee19 --- /dev/null +++ b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn @@ -0,0 +1,16 @@ +Hi, another installation issue on Ubuntu Lucid: + +I started with a clean `~/.cabal` directory and did the following: + + andreas@antares:~$ sudo aptitude install cabal-install + andreas@antares:~$ cabal update + andreas@antares:~$ cabal install git-annex -v --bindir=$HOME/ + +However, I got some dpendancy error: + + cabal: dependencies conflict: base-3.0.3.2 requires syb ==0.1.0.2 however + syb-0.1.0.2 was excluded because json-0.5 requires syb >=0.3.3 + +Any ideas? + +Thanks for your help! diff --git a/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_1_fae6e88115d175239fc55cef4c33fb2c._comment b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_1_fae6e88115d175239fc55cef4c33fb2c._comment new file mode 100644 index 000000000..c04cc335b --- /dev/null +++ b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_1_fae6e88115d175239fc55cef4c33fb2c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-15T19:53:35Z" + content=""" +This is now about different build failure than the bug you reported, which was already fixed. Conflating the two is just confusing. + +The error message about `syb` is because by using cabal-install on an Ubuntu system from 2010, you're mixing the very old versions of some haskell libraries in Ubuntu with the new versions cabal wants to install. The solution is to stop mixing two package management systems -- + +* Either install git-annex without using cabal, and use apt-get to install all its dependencies from Ubuntu, assuming your distribution has all the necessary haskell libraries packaged. +* Or `apt-get remove ghc`, and manually install a current version of [The Haskell Platform](http://hackage.haskell.org/platform/) and use cabal. +"""]] diff --git a/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_2_4c7a75638e8717132ccde949018d6008._comment b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_2_4c7a75638e8717132ccde949018d6008._comment new file mode 100644 index 000000000..3a3106a63 --- /dev/null +++ b/doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_2_4c7a75638e8717132ccde949018d6008._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/fd55c6e3-966a-4626-865f-5d0f73e1eb88" + nickname="Andreas H." + subject="Thanks and sorry" + date="2012-01-15T20:54:55Z" + content=""" +Joey, thanks for you quick help! I'll try the manual haskell-platform install once I have quicker internet again, i.e. tomorrow. + +And sorry for the mess-up; I splitted the post into two. Hope it's clearer now. +"""]] diff --git a/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn new file mode 100644 index 000000000..f6cdb4c66 --- /dev/null +++ b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn @@ -0,0 +1,19 @@ + +So much time gone by after the kickstarter and now I wanted to give it a kick finally. +I set up everything on my linux desktop with no problems at all. + +I configured a ssh remote with shared encryption key. + +Then I tried to use this to share files with a windows Desktop. This is where problems started. + +1. Since there is no jabber sync I need to exchange keys manually. But although I read and googled for hours I just found that it would be there in the git repo somewhere in plain text. I didnt find a command to actually display it on the command line. +2. I need to setup the (existing) ssh remote on windows manually, because I could not make the webapp recognize the ssh-keys from pageant. Also, unfortunately, all examples refer to s3. I didnt even find out which type I had to specify. There seems to be no comprehensive list of repository types for the cmdline and their required arguments respectively at all. The man page says "type=..." for the three-line description of shared encryption setups which appeared like a mockery to me. Since the remote does not have git metadata I also can not use git clone. +3. The docs say initremote would only be used on fresh remotes, not existing ones. But enableremote only enables remotes that are already configured. So what am I to do here? + +Could someone tell me please + +1. How to find the shared key +2. How to add the ssh remote properly +3. Where 1 and 2 are documented + +Thank you! diff --git a/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key/comment_1_811cab17410ba6e07ae7af3249cd98df._comment b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key/comment_1_811cab17410ba6e07ae7af3249cd98df._comment new file mode 100644 index 000000000..7a6eafa7a --- /dev/null +++ b/doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key/comment_1_811cab17410ba6e07ae7af3249cd98df._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T19:28:00Z" + content=""" +Sorry for the delay getting to this post. + +The lack of jabber support on Windows makes this a bit hard to set up. You instead need to make a git repository some place that both the Windows and Linux machines can both connect to. Once git-annex on both systems is syncing with that common git repository, the Windows system will learn about the encrypted remotes you have set up, and then `git annex enableremote` will be able to use them with no problem. + +Of course, if you don't trust your ssh server where you already made an encrypted remote, you may not want to store a un-encrypted git repository on it, and since Windows also doesn't support encrypted git repositories yet, you'd be sort of out of luck. (For now; Windows support is being improved.) + +OTOH, if you just set up that encrypted rsync remote on the ssh server because the ssh server didn't have git-annex installed on it, you can easily also put a git repository on the ssh server, and the combination will be enough to let you sync between the 2 machines. +"""]] diff --git a/doc/forum/__91__announce__93___metadata_extration_utility.mdwn b/doc/forum/__91__announce__93___metadata_extration_utility.mdwn new file mode 100644 index 000000000..3214f36d9 --- /dev/null +++ b/doc/forum/__91__announce__93___metadata_extration_utility.mdwn @@ -0,0 +1,30 @@ +Let me announce 'metatag', a simple metadata extraction utility. + +The Design Idea is to make it completely event driven. There are string matching rules over added metadata, +who invoke engines when matched, which in turn add more metadata and so on. +Thus the whole metadata extraction process is controlled by those easily configurable rules. Processing a file or +directory just starts by adding "/=filename" to the metadata, everything else bootstraps from that. After metadata +got extracted there are exporters which implement different backends for storing this metadata (currently only a +'print' and a 'gitannex' exporter are implemented) + +While still in a infancy state it already works for me. It now needs more rules and engines for metadata extraction +and some more efforts to 'standardize' generated metadata. I'd like to welcome comments and contributions. + +A README about it can be found at + + + +The code is available under git from + + git clone git://git.pipapo.org/metatag + +To make the contribution barrier as low as possible there is a public pushable 'mob' repository where everyone can +send changes too at `git://git.pipapo.org/mob/metatag` + +after installing it, using it on a annexed directory is like + + metatag -r -O gitannex,gitexclude -o gitannex:-stat ./ + +There is a mailinglist for the project, you can subscribe at + + diff --git a/doc/forum/_preferred_content:_lastpresent.mdwn b/doc/forum/_preferred_content:_lastpresent.mdwn new file mode 100644 index 000000000..e8730eb00 --- /dev/null +++ b/doc/forum/_preferred_content:_lastpresent.mdwn @@ -0,0 +1 @@ +Is there any kind of "lastpresent" in the preferred-content expression? If set, git-annex would see if "git log --follow $path -n 1" (or some configurable -n) was present. diff --git a/doc/forum/_preferred_content:_lastpresent/comment_1_7610cd866b256d36646b642eb5f8cae5._comment b/doc/forum/_preferred_content:_lastpresent/comment_1_7610cd866b256d36646b642eb5f8cae5._comment new file mode 100644 index 000000000..d5910c6d0 --- /dev/null +++ b/doc/forum/_preferred_content:_lastpresent/comment_1_7610cd866b256d36646b642eb5f8cae5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-15T20:39:43Z" + content=""" +The idea seems to be to match files that have been deleted. + +I don't see how that could work; preferred content expressions are always matched against files in the working tree. + +Even if it were doable, it would be quite expensive if every preferred content query involved a `git log`... + +What are you trying to achieve with this? +"""]] diff --git a/doc/forum/_preferred_content:_lastpresent/comment_2_d25666a173b78213d583f029fd166d06._comment b/doc/forum/_preferred_content:_lastpresent/comment_2_d25666a173b78213d583f029fd166d06._comment new file mode 100644 index 000000000..4714034c3 --- /dev/null +++ b/doc/forum/_preferred_content:_lastpresent/comment_2_d25666a173b78213d583f029fd166d06._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn1QhtPvsRBV7pfaDW_ZTPFv_ZIxSzQ8Rg" + nickname="Paul Léo" + subject="comment 2" + date="2013-11-16T13:12:35Z" + content=""" +The aim is to be able to have some semi-automatic mode (using \"git-annex wanted . (lastpresent)\"), where file paths which you \"git-annex get\" one time always get updated to the latest version. + +Or, you could also use some variant of it the other way round (using \"git-annex wanted . (notlastpresent)\"): all files would be present by default, but paths which you \"git-annex drop\"ed once wouldn't become present again. +"""]] diff --git a/doc/forum/advantages_of_SHA__42___over_WORM.mdwn b/doc/forum/advantages_of_SHA__42___over_WORM.mdwn new file mode 100644 index 000000000..5b544593f --- /dev/null +++ b/doc/forum/advantages_of_SHA__42___over_WORM.mdwn @@ -0,0 +1,5 @@ +Thanks for creating git-annex. + +I am confused about the advantages of the SHA* backends over WORM. The "backends" page in this wiki says that with WORM, files "can be moved around, but should never be added to or changed". But I don't see any difference to SHA* files as long as the premise of WORM that "any file with the same basename, size, and modification time has the same content" is true. Using "git annex unlock", WORM files can be modified in the same way as SHA* files. + +If the storage I use is dependable (i.e. I don't need SHA checksums for detection of corruption), and I don't need to optimize for the case that the modification date of a file is changed but the contents stay the same, and if it is unlikely that several files will be identical, is there actually any advantage in using SHA*? diff --git a/doc/forum/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment b/doc/forum/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment new file mode 100644 index 000000000..218027ca5 --- /dev/null +++ b/doc/forum/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-08-29T16:10:38Z" + content=""" +You're right -- as long as nothing changes a file without letting the modification time update, editing WORM files is safe. +"""]] diff --git a/doc/forum/alternativeto.net___34__Like__34__.mdwn b/doc/forum/alternativeto.net___34__Like__34__.mdwn new file mode 100644 index 000000000..95e03dc21 --- /dev/null +++ b/doc/forum/alternativeto.net___34__Like__34__.mdwn @@ -0,0 +1,3 @@ +When I went to alternativeto.net I noticed that SpiderOak is a featured application. I decided to search git-annex and see how "Like"-ed it is in comparison... there were 0 "Like"-s. + +I suggest going to and "Like" git-annex. diff --git a/doc/forum/android_binary-only_download.mdwn b/doc/forum/android_binary-only_download.mdwn new file mode 100644 index 000000000..90204fbf4 --- /dev/null +++ b/doc/forum/android_binary-only_download.mdwn @@ -0,0 +1,9 @@ +It would be really neat if there was a way to get just the `git-annex` binary on Android, without getting the entire APK. This can be useful when one is already using their own shell and rootfs, for example I work with this. + +This way, one can just use parts of git-annex, without having to have a whole APK and its dependencies, and the space it takes up, etc. + +So would you be able to add a download link for this? + + + +Thanks for the wonderful project! diff --git a/doc/forum/android_binary-only_download/comment_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment b/doc/forum/android_binary-only_download/comment_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment new file mode 100644 index 000000000..d8e6d81fc --- /dev/null +++ b/doc/forum/android_binary-only_download/comment_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T16:57:43Z" + content=""" +This seems a pretty unusual use case. Can't you just unpack the apk (it's a regular zip file) and get out the parts you want? +"""]] diff --git a/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn new file mode 100644 index 000000000..6c428e375 --- /dev/null +++ b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn @@ -0,0 +1,12 @@ +First off, thanks so much for your hard work, git-annex is amazing. + +I just started using the [web as a special remote](http://git-annex.branchable.com/tips/using_the_web_as_a_special_remote/) feature with the SHA256E backend, and I noticed that although the annexed file has the correct backend prefix (SHA256E) it does not have the extension of the file in the URL. The URL is `https://...IMG_1234.JPG` but the annexed file is `SHA256E-...832c99` with no extension. + +This is fine for most use cases, but I actually access an S3 remote directly from another app (independent of git-annex) to render photos, and in that app I'm using the extensions to figure out file types, so not having that info is slightly inconvenient. + +Is there any way to either: + +1. tell git-annex to preserve the extension of a file on the web in the annexed file, or +2. alternatively, change the annexed filename (add the extension manually) without screwing anything up? + +Any help would be much appreciated, thanks! diff --git a/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_1_d1605a6e3b4d6863f4089218994ce564._comment b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_1_d1605a6e3b4d6863f4089218994ce564._comment new file mode 100644 index 000000000..8b78618a9 --- /dev/null +++ b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_1_d1605a6e3b4d6863f4089218994ce564._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-06T15:43:06Z" + content=""" +You don't say what version of git-annex you're using. I tested with the current version, 4.20130405: + +[[!format sh \"\"\" +joey@gnu:~/tmp/rr>git annex addurl http://localhost/~joey/header_background.png +addurl localhost_~joey_header_background.png (downloading http://localhost/~joey/header_background.png ...) --2013-05-06 11:36:41-- http://localhost/~joey/header_background.png +Resolving localhost (localhost)... ::1, 127.0.0.1, 127.0.1.1 +Connecting to localhost (localhost)|::1|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 53693 (52K) [image/png] +Saving to: ‘/home/joey/tmp/rr/.git/annex/tmp/URL--http&c%%localhost%~joey%header_background.png’ + +100%[======================================>] 53,693 --.-K/s in 0.001s + +2013-05-06 11:36:41 (58.9 MB/s) - '/home/joey/tmp/rr/.git/annex/tmp/URL--http&c%%localhost%~joey%header_background.png' saved [53693/53693] + +(checksum...) ok +(Recording state in git...) +joey@gnu:~/tmp/rr>dir +lrwxrwxrwx 1 joey joey 194 Sep 11 2010 localhost_~joey_header_background.png -> .git/annex/objects/M1/p0/SHA256E-s53693--3f065e8e2db1248765d0753cf483e40ae0eaf9bffe34b0cf738158815d0884e3.png/SHA256E-s53693--3f065e8e2db1248765d0753cf483e40ae0eaf9bffe34b0cf738158815d0884e3.png +\"\"\"]] + +Looks like it's doing the right thing with the extension! +"""]] diff --git a/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_2_d249ff27fa3d9ac3ca32485cdef49930._comment b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_2_d249ff27fa3d9ac3ca32485cdef49930._comment new file mode 100644 index 000000000..3d5814bc6 --- /dev/null +++ b/doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_2_d249ff27fa3d9ac3ca32485cdef49930._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkBYpLu_NOj7Uq0-acvLgWhxF8AUEIJbo" + nickname="Chris" + subject="comment 2" + date="2013-05-07T03:37:24Z" + content=""" +Thanks very much! That's great news. I'm using 3.20120629, I'll just update then. +"""]] diff --git a/doc/forum/archaeology_of_deleted_files.mdwn b/doc/forum/archaeology_of_deleted_files.mdwn new file mode 100644 index 000000000..a4ed66dc8 --- /dev/null +++ b/doc/forum/archaeology_of_deleted_files.mdwn @@ -0,0 +1,36 @@ +Earlier this week, I somehow lost a ton of files from my annex -- by switching on the command line from indirect to direct mode while the assistant was running, I think. I'm not sure. + +Anyway, by "lost" I mean "lost the symlinks to," because git-annex defaults to keeping content around till you tell it otherwise. So I still had the content in the repos on my two backup drives. All I needed was the symlinks back. + +But how to figure out exactly what I lost and get it back? + +I found that out here: + +http://stackoverflow.com/questions/953481/restore-a-deleted-file-in-a-git-repo + +Here's a magical formula you can use to find every single file deletion in the history of your repo: + + git log --diff-filter=D --summary + +That will give you every commit that deleted things, and what was deleted. + +To bring back all the files deleted in a given commit, where COMMITHASH is the commit hash, use this command: + + git checkout COMMITHASH^1 -- . + +to bring back only a specific file: + + git checkout COMMITHASH^1 -- path/to/file.txt + +to bring back only a subdirectory: + + git checkout COMMITHASH^1 -- sub/directory + +that will bring them back into the staging area. You can see which ones just reappeared by typing: + + git status + +then you can actually make the restore permanent by typing: + + git commit -m "I just resurrected some files" + diff --git a/doc/forum/archaeology_of_deleted_files/comment_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment b/doc/forum/archaeology_of_deleted_files/comment_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment new file mode 100644 index 000000000..3647193b8 --- /dev/null +++ b/doc/forum/archaeology_of_deleted_files/comment_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-25T14:07:36Z" + content=""" +seems I inadvertently got caught by Markdown -- I tried to write COMMITHASH-hat-1 and it turned into COMMITHASH superscript 1. + +Tilde (~) would also have worked instead of hat (^) +"""]] diff --git a/doc/forum/archaeology_of_deleted_files/comment_2_c698cd10c8038bac45bd1049506a27c3._comment b/doc/forum/archaeology_of_deleted_files/comment_2_c698cd10c8038bac45bd1049506a27c3._comment new file mode 100644 index 000000000..363d32079 --- /dev/null +++ b/doc/forum/archaeology_of_deleted_files/comment_2_c698cd10c8038bac45bd1049506a27c3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 2" + date="2013-01-25T14:27:47Z" + content=""" +I fixed it for you +"""]] diff --git a/doc/forum/archival_and_multiple_users.mdwn b/doc/forum/archival_and_multiple_users.mdwn new file mode 100644 index 000000000..da451d9fb --- /dev/null +++ b/doc/forum/archival_and_multiple_users.mdwn @@ -0,0 +1,8 @@ +The assistant archival walk-through describes how files get removed from local repo if moved into archive repos. +What if the files in question aren't needed immediately (and can be archived) for one user of a shared repo, but needed by someone else on their own machine? +git-annex directory arrangement propagation wouldn't work for this case, it seems. Could assistant handle this case? + +It looks like having a browser of the directory tree in git-annex assistant webpage with say right-click menu with "get" and "drop" would be the most flexible. + +Or maybe it could be more about integration with Linux etc file browsers (but then it's system specific, unlike with webapp). + diff --git a/doc/forum/archival_and_multiple_users/comment_1_fc4ee256f03a7c189d687caf4a34e21e._comment b/doc/forum/archival_and_multiple_users/comment_1_fc4ee256f03a7c189d687caf4a34e21e._comment new file mode 100644 index 000000000..090091a8a --- /dev/null +++ b/doc/forum/archival_and_multiple_users/comment_1_fc4ee256f03a7c189d687caf4a34e21e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-07-24T15:30:51Z" + content=""" +A feature I would love to see is a file manager integrated with the webapp, so that you could browse your files and retrieve or drop them manually as if you were using the command line. Then you could have your repo set on \"manual\" and not worry about those archive directories. Just manually drop content if you got low on space. + +"""]] diff --git a/doc/forum/archival_and_multiple_users/comment_2_a96d57d4bb567ac9b0b9167d5b1be011._comment b/doc/forum/archival_and_multiple_users/comment_2_a96d57d4bb567ac9b0b9167d5b1be011._comment new file mode 100644 index 000000000..cf97f28fd --- /dev/null +++ b/doc/forum/archival_and_multiple_users/comment_2_a96d57d4bb567ac9b0b9167d5b1be011._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-07-25T18:42:59Z" + content=""" +I believe that the world has enough (or too many) file managers, and do not want to build another one just for git-annex. In any case \"git annex get\" or any GUI wrapping around it is not going to help with the described use case, because the problem is that the files are archived away in my offline drive, while you want to access them in your repository, which does not have access to that drive. + +The way to handle this situation is to copy or move the files you want out of the archive directory, and back to the parent directory. This move of the file will be synced from your repository to all the other repositories. When the repository that does have access to the archive notices this, it will get the files that have been moved out of the archive. Normal assistant syncing will then arrange to get them transferred back to the repository of the user who had wanted them. + +Of course, if the archive is on an offline drive, this won't happen until that drive is plugged back in. +"""]] diff --git a/doc/forum/archival_and_multiple_users/comment_3_bd44634b04732ffb91154c61ef9cf828._comment b/doc/forum/archival_and_multiple_users/comment_3_bd44634b04732ffb91154c61ef9cf828._comment new file mode 100644 index 000000000..20b67976e --- /dev/null +++ b/doc/forum/archival_and_multiple_users/comment_3_bd44634b04732ffb91154c61ef9cf828._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 3" + date="2013-07-25T19:16:20Z" + content=""" +> The way to handle this situation is to copy or move the files you want out of the archive directory, and back to the parent directory. This move of the file will be synced from your repository to all the other repositories. When the repository that does have access to the archive notices this, it will get the files that have been moved out of the archive. Normal assistant syncing will then arrange to get them transferred back to the repository of the user who had wanted them. + +But won't it also transfer the same files into repos of all other users (who didn't want the files)? +On a related note, allowing moving files for everyone could jeopardise integrity of the master archive. Is there a way to limit what kind of ops the users can do (e.g. copy but not move)? + +Re offline drives, the case I was thinking of is actually where each user has access to e.g. special remotes directly. So a manual get/put would solve the problem at hand. + +"""]] diff --git a/doc/forum/archival_and_multiple_users/comment_4_b89a56a5f1cd641f87925c7a5f74bcec._comment b/doc/forum/archival_and_multiple_users/comment_4_b89a56a5f1cd641f87925c7a5f74bcec._comment new file mode 100644 index 000000000..332e0a0a0 --- /dev/null +++ b/doc/forum/archival_and_multiple_users/comment_4_b89a56a5f1cd641f87925c7a5f74bcec._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-07-25T19:23:30Z" + content=""" +Moving files shouldn't jepardize anything. If a user makes a change they shouldn't have made, it can be reverted. + +If you have the archive drive available locally you can set your repository to manual mode and just use `git annex get` on content you want. Or you could set it to be a backup repository and the assistant would get all content. +Or write a custom [[preferred_content]] expression for your repository to make it want files in `archive/stillusing/` + + +"""]] diff --git a/doc/forum/archival_and_multiple_users/comment_5_81293bf5dc8ad4552712c2083fd589c9._comment b/doc/forum/archival_and_multiple_users/comment_5_81293bf5dc8ad4552712c2083fd589c9._comment new file mode 100644 index 000000000..b7b93fdf4 --- /dev/null +++ b/doc/forum/archival_and_multiple_users/comment_5_81293bf5dc8ad4552712c2083fd589c9._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 5" + date="2013-07-26T08:20:21Z" + content=""" +I think i agree that this should be implemented. + +Not only to be able to \"get/drop\" from the assistant without the use of archive folders. + +But mainly because i think this will be needed anyways, to do a \"recover previous version of file\" option. Which should definitely be in the web assistant. + +We can't expect family and friends to figure out all command line stuff, thus they need to use the assistant. And i really think it would be a shame to not have an easy way to recover old versions, when the old versions are actually stored. + +Always think about having a good WAF(Wife acceptance factor). + +Just my 2 bits (and a haircut). + +"""]] diff --git a/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__.mdwn b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__.mdwn new file mode 100644 index 000000000..e48bf4cf6 --- /dev/null +++ b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__.mdwn @@ -0,0 +1,10 @@ +Hi, + +I am trying to understand git-annex, and the walkthroughs on the page did help a lot. I *feel* that git-annex is the solution for my use case: having a large archive, several computers, NAS both at work and at home, being offline during commuting, … + +Everything seems to be clear for me when using the command line version. Using annex assistant looks promising, and it is easy to create repositories that match my usage. But now I see that these repositories are in direct mode by default; and I am not sure how this impacts my ability to work with large files. I do not want to end up with git (without annex) handling huge files. + +So - can somebody explain how direct mode affects this? Can I switch to indirect mode with the assistant? Am I asking the wrong questions? + +thanks, +Ulli diff --git a/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_1_d90d1d599ce557af03c6f0f2ea188212._comment b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_1_d90d1d599ce557af03c6f0f2ea188212._comment new file mode 100644 index 000000000..d762791da --- /dev/null +++ b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_1_d90d1d599ce557af03c6f0f2ea188212._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-09T17:36:01Z" + content=""" +Files in direct mode are stored in the git annex the same way as when using indirect mode. But you're perhaps right to be wary of using direct mode, it's been quite easy to mess up while using it at the command line until very recently when the [[todo/direct_mode_guard]] was implemented. + +You can switch repositories created using the assistant from direct to indirect mode if you like. The assistant works in either mode. +"""]] diff --git a/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_2_58b1af497cab132acb28cb5f9283ec2a._comment b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_2_58b1af497cab132acb28cb5f9283ec2a._comment new file mode 100644 index 000000000..45cec4db5 --- /dev/null +++ b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_2_58b1af497cab132acb28cb5f9283ec2a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Thanks" + date="2013-11-12T08:57:36Z" + content=""" +Ok, thanks for the explanation. I still have to figure out what happens when I annex drop files on a direct repository, and how well all this plays with the Finder on Mac… +"""]] diff --git a/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_3_37d4fd8f69e8066b5aa19454b714e443._comment b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_3_37d4fd8f69e8066b5aa19454b714e443._comment new file mode 100644 index 000000000..71a091930 --- /dev/null +++ b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_3_37d4fd8f69e8066b5aa19454b714e443._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="So what does "git annex drop" do in direct mode?" + date="2013-11-15T15:07:57Z" + content=""" +I just tried a git annex drop on a file in a direct mode repository, and that just did not change anything at all, as far as I can see. Actually I don't know what to expect, but doesn't that mean that I should have to switch to indirect mode in order to be able to drop large files to save space? + +Funny is that git annex drop did not complain at all but just reported \"ok\" after quite a while. And when I tried to drop a file that was not available in any other repository, it failed (which is expected behavior). So what is it what was \"ok\"? + +"""]] diff --git a/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_4_a974e2105774d4f82ad286ff0792ba84._comment b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_4_a974e2105774d4f82ad286ff0792ba84._comment new file mode 100644 index 000000000..587d704d3 --- /dev/null +++ b/doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_4_a974e2105774d4f82ad286ff0792ba84._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 4" + date="2013-11-15T20:33:47Z" + content=""" +Drop in direct mode does the same thing as in indirect mode. + +If you are using git-annex on a crippled filesystem without symlinks, git-annex cannot represent a file whose content has been dropped using a broken symlink, so it instead represents it with a nearly empty file. +"""]] diff --git a/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__.mdwn b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__.mdwn new file mode 100644 index 000000000..c18dfb6ca --- /dev/null +++ b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__.mdwn @@ -0,0 +1,38 @@ +Hi, + +I have a question about encryption keys. +Basically I do not know how to use the data which was copied in case my local +machine dies? + + +## I have done the following: +--- +1. copied my ssh public key to a remote server +1. created a directory and started git annex assistant + + mkdir ~/test_annex + + cd ~/test_annex + + git annex webapp + +1. clicked Repository->Add another local repository +1. Assistant: Where do you want to put this new repository? Me: ~/test_annex "Make Repository" +1. Assistant "Combine repositories?" Me: "Keep repositories separate" +1. clicked "Add another repository" clicked "remote server" +1. filled out "Adding a remote server using ssh" form and clicked "Check this server" +1. choose "Use an encrypted rsync repository on the server" +1. Assistant "Repository created" I select "Full backup" as repository group. + +So far so good. If I now add a file on my local machine into ~/test_annex something not human readable is created on the remote machine. + +What I do not understand is how I use this backup later. I am expecting something along the "hybrid encryption keys" scheme +explained in this wiki. However I was not able to determine which of my gpg keys was used or how the data was encrypted. + +So my question is: "How do I use the encrypted backup remote on a second machine?" + + + + + + diff --git a/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_1_70200f871b9df49261f32752a6bb0e67._comment b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_1_70200f871b9df49261f32752a6bb0e67._comment new file mode 100644 index 000000000..9d457a9d2 --- /dev/null +++ b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_1_70200f871b9df49261f32752a6bb0e67._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-27T21:19:45Z" + content=""" +When you create an encrypted rsync repository using the webapp like that, its encryption key is stored in your git repository, using the [[shared encryption scheme|encryption#index2h2]]. No gpg key needs to be used to decrypt files from the rsync repository; anyone with a clone of your git repository can do so. This has its plusses and its minuses; the webapp picks that type of encryption because it's easy to use. + +So, the answer is to just make a clone of your repository on the other machine, and then you can use it. There are lots of ways to do that; if you stay in the webapp, go to Add Another Repisitory and any of the \"Share with your other devices\", \"Share with a friend\", or \"Local computer\" options are easy ways to do it. + +---- + +Now, if you had, manually, set up a rsync repository encrypted with the [[hybrid encryption key scheme|encryption#index1h2]], to access it from another computer with clone of the repository you would need to have a gpg key that has been given access to the repository. So you would either copy your gpg secret key to the other computer, or if you don't want to trust that other computer with the your main gpg key, you could make another gpg secret key for that computer, and add that key as one of the keys that can access the encrypted repository. (Or, if the computer belonged to a friend, you could just get their gpg key, and add it.) +"""]] diff --git a/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_2_173da510b45f0320ae8aa2df9f14ae7b._comment b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_2_173da510b45f0320ae8aa2df9f14ae7b._comment new file mode 100644 index 000000000..dbf2178f5 --- /dev/null +++ b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_2_173da510b45f0320ae8aa2df9f14ae7b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="Frank" + ip="31.19.114.93" + subject="Comment 2" + date="2013-11-07T19:45:16Z" + content=""" +Thank you very much for the explanation! Have fun! + + + +"""]] diff --git a/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_3_1ecea12a4be5ad09013cddb62df6ab20._comment b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_3_1ecea12a4be5ad09013cddb62df6ab20._comment new file mode 100644 index 000000000..aaf373589 --- /dev/null +++ b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_3_1ecea12a4be5ad09013cddb62df6ab20._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/W6vhceUml87q0GB9MGH1qEeteW8-#ee26a" + nickname="Leandro" + subject="comment 3" + date="2014-05-17T17:39:04Z" + content=""" +So, just to clarify things a little bit: Suppose that you have a remote at box.com (shared encrypted), then the CEO at box.com would eventually be able to decrypt your files easily since the keys are store in the git repository without encryption. Is that right? +"""]] diff --git a/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_4_af4bc222d1479482bd83952353c97f05._comment b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_4_af4bc222d1479482bd83952353c97f05._comment new file mode 100644 index 000000000..7b7b86c30 --- /dev/null +++ b/doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_4_af4bc222d1479482bd83952353c97f05._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 4" + date="2014-05-19T15:38:14Z" + content=""" +No, box.com cannot decrypt your files, because the git repository is not stored on box.com. +"""]] diff --git a/doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn new file mode 100644 index 000000000..0cf3f2726 --- /dev/null +++ b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn @@ -0,0 +1,5 @@ +Debian Squeeze, git version 1.7.10.4, git-annex version 3.20121211 + +The machine has a clone of the annex with preferred content string: `present or include=calibre/* or include=img/* or include=mail/* or include=music/* or include=sounds/*` + +This, I believe, should mean the assistant should never drop anything. However for the past two days it's been moving files to an encrypted rsync remote so that there are two copies (there is another copy on an external HDD) and then it's dropping them from the current annex. I want to keep the files here; can anyone think of any reason why they would be moved away? diff --git a/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_1_6bd240edf1868615024ff11c24c3d52c._comment b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_1_6bd240edf1868615024ff11c24c3d52c._comment new file mode 100644 index 000000000..ad4b23f29 --- /dev/null +++ b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_1_6bd240edf1868615024ff11c24c3d52c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-19T17:19:28Z" + content=""" +I had similar issues when I tried to use \"present\" settings a while back, except it was with adding files. I would add a file and then it would be immediately dropped (because it was not yet \"present\" while it was being added?). I gave up and just started using \"archive\" subdirectories for things I didn't want to be present. Even so I'm having some confusing issues with the assistant. It keeps dropping certain files which are in \"backup\" repositories and therefore should never have anything dropped. I haven't isolated what's going on to the degree I can get a good bug report together. But I'm having a hard time trusting assistant and its content settings to do what I want. I have a couple scripts that do things like: + +git annex copy --not --in=usbdrive --to=usbdrive + +to populate my backup repos, and these seem much more reliable than the assistant. + +"""]] diff --git a/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_2_37c5e9a7669b5b94fbadb8792a765316._comment b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_2_37c5e9a7669b5b94fbadb8792a765316._comment new file mode 100644 index 000000000..58292aa14 --- /dev/null +++ b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_2_37c5e9a7669b5b94fbadb8792a765316._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 2" + date="2012-12-19T18:20:50Z" + content=""" +I've found and fixed a bug in transfer log parsing that could cause the assistant to get confused about the name of the file it had just transferred, and think it was not preferred content and drop it. I think this was causing both problems reported above. +"""]] diff --git a/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_3_87aa4c5942929be81ddc1e2795d56f0e._comment b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_3_87aa4c5942929be81ddc1e2795d56f0e._comment new file mode 100644 index 000000000..f4d6240bc --- /dev/null +++ b/doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_3_87aa4c5942929be81ddc1e2795d56f0e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2012-12-20T00:05:08Z" + content=""" +Thanks, I'll give it another shot! + +"""]] diff --git a/doc/forum/assistant_without_watch__63__.mdwn b/doc/forum/assistant_without_watch__63__.mdwn new file mode 100644 index 000000000..34aa3e441 --- /dev/null +++ b/doc/forum/assistant_without_watch__63__.mdwn @@ -0,0 +1,13 @@ +"watch" is described as + +> With this running as a daemon in the background, you no longer need to manually run git commands when manipulating your files. + +and "assistant" is described as + +> Like watch, but also automatically syncs changes to other remotes. + +I would like the behaviour of assistant, without the watch part: + +I have an archive of large files, which I think would be useful to manage manually using git. But I don't want to manually enforce the "numcopies=" requirement, playing with the assistant and webapp it seems really nice to have it take care of that. + +Is there currently an "assistant-without-watch" option? If not, is it planned? diff --git a/doc/forum/assistant_without_watch__63__/comment_1_be1f7c038426e53209a85ae1119269d5._comment b/doc/forum/assistant_without_watch__63__/comment_1_be1f7c038426e53209a85ae1119269d5._comment new file mode 100644 index 000000000..dc64ef7d2 --- /dev/null +++ b/doc/forum/assistant_without_watch__63__/comment_1_be1f7c038426e53209a85ae1119269d5._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 1" + date="2013-02-22T22:31:29Z" + content=""" +Not quite. + +Recent versions allow you to disable the automatic committing while the assistant is running by setting annex.autocommit=false .. or just by going into the webapp repository list and pausing syncing for the \"here\" repository. + +But, with automatic committing disabled, the assistant doesn't know when new files are added, so will not transfer them. The rest of it still works, so for example if another clone of the repository makes changes +the assistant will merge them in and download the new files. + +To transfer new files you created, you could use `git annex copy --auto --to someremote`, which will only copy them if needed to satisfy numcopies. +"""]] diff --git a/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__.mdwn b/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__.mdwn new file mode 100644 index 000000000..45c43f443 --- /dev/null +++ b/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__.mdwn @@ -0,0 +1,10 @@ +To connect to a remote server I have to tunnel it through a server I have access to. My .ssh/config for this connection looks like this: + + + Host server-at-home + HostName foo.bar.de + User foo + Port 222 + ProxyCommand /usr/bin/ssh me@server-i-have-access-to /bin/nc -w 3700 %h %p + +Is it possible to create a connection using a similar configuration via the git-annex assistant? diff --git a/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__/comment_1_817a3ed424e4fb76fcd33295f2953250._comment b/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__/comment_1_817a3ed424e4fb76fcd33295f2953250._comment new file mode 100644 index 000000000..b3e495dc2 --- /dev/null +++ b/doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__/comment_1_817a3ed424e4fb76fcd33295f2953250._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-11-28T22:08:04Z" + content=""" +You can add/clone from the remote from the command line and webapp will use it. +"""]] diff --git a/doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn b/doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn new file mode 100644 index 000000000..2c1280e51 --- /dev/null +++ b/doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn @@ -0,0 +1,34 @@ +This is a continuation of the conversation from [[the comments|design/assistant/#comment-77e54e7ebfbd944c370173014b535c91]] section in the design of git-assistant. In summary, I've setup an auto builder which should help [[Joey]] have an easier time developing on git-annex on non-linux/debian platforms. This builder is currently running on OSX 10.7 with the 64bit version of Haskell Platform. + +The builder output can be found at , the CGI on this site does not work as my OSX workstation is pushing the output from another location. + +The builder currently tries to build all branches except + +* debian-stable +* pristine-tar +* setup + +It also does not build any of the tags as well, Joey had suggested to ignore the bpo named tags, but for now it's easier for me to not build any tags. To continue on this discussion, if anyone wants to setup a gitbuilder instance, here is the build.sh script that I am using. + +
+#!/bin/bash -x
+
+# Macports
+export PATH=/opt/local/bin:$PATH
+
+# Haskell userland
+export PATH=$PATH:$HOME/.cabal/bin
+
+# Macports gnu
+export PATH=/opt/local/libexec/gnubin:$PATH
+
+make || exit 3
+
+make -q test
+if [ "$?" = 1 ]; then
+        # run "make test", but give it a time limit in case a test gets stuck
+        ../maxtime 1800 make test || exit 4
+fi
+
+ +It's also using the branches-local script for sorting and prioritising the branches to build, this branches-local script can be found at the [autobuild-ceph](https://github.com/ceph/autobuild-ceph/blob/master/branches-local) repository. If there are other people interested in setting up their own instances of gitbuilder for git-annex, please let me know and I will setup an aggregator page to collect status of the builds. The builder runs and updates on a very regular basis. diff --git a/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_1_7e88f815e8d9652ef18ea6d54b118962._comment b/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_1_7e88f815e8d9652ef18ea6d54b118962._comment new file mode 100644 index 000000000..82380cd60 --- /dev/null +++ b/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_1_7e88f815e8d9652ef18ea6d54b118962._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2012-07-02T16:25:55Z" + content=""" +I've some binaries for OSX which can be found at its just the master branch, and it's built on a system that runs macports. Binaries are built and updated whenever there are changes made to the master branch of git-annex. +"""]] diff --git a/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_2_fef17a10226af5671495c2929653c337._comment b/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_2_fef17a10226af5671495c2929653c337._comment new file mode 100644 index 000000000..da3cd6e67 --- /dev/null +++ b/doc/forum/autobuilders_for_git-annex_to_aid_development/comment_2_fef17a10226af5671495c2929653c337._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-09-29T09:01:11Z" + content=""" +I'm currently playing with the autobuilder to get it to do more sensible things so it may be broken for a day or two +"""]] diff --git a/doc/forum/avoid_rehashing_when_converting_existing_backups_into_new_remotes.mdwn b/doc/forum/avoid_rehashing_when_converting_existing_backups_into_new_remotes.mdwn new file mode 100644 index 000000000..34bae17fa --- /dev/null +++ b/doc/forum/avoid_rehashing_when_converting_existing_backups_into_new_remotes.mdwn @@ -0,0 +1,3 @@ +I have two copies of a large collection of photos on two computers. I have been using rsync to keep them synchronized, but I would like to use git annex instead. I finished initializing one repo, and now its time to initialize the other repo before I can sync them up. But it seems redundant that the other repo will compute its own hashes although I know that the two contents are identical. Can't I just copy the keys and tell git annex to assume that any files seen have already been hashed? + +As a start, I cloned the .git from the first machine to the second. But that wasn't enough ... I now have an empty git-annex repo in the second machine. What else is missing? diff --git a/doc/forum/bainstorming:_git_annex_push___38___pull.mdwn b/doc/forum/bainstorming:_git_annex_push___38___pull.mdwn new file mode 100644 index 000000000..8a6c552b8 --- /dev/null +++ b/doc/forum/bainstorming:_git_annex_push___38___pull.mdwn @@ -0,0 +1,28 @@ +Wouldn't it make sense to offer + + git annex pull + +which would basically do + + git pull + git annex get + +and + + git annex push + +which would do + + git annex commit . + git annex put # (the proposed "send to default annex" command) + git commit -a -m "$HOST $(date +%F-%H-%M-%S)" # or similar + git push + +Resulting in commands that are totally analogous to git push & pull: Sync all data from/to a remote. + +> Update: + +This is useful: + + git config [--global] alias.annex-push '!git pull && git annex add . && git annex copy . --to $REMOTE --fast --quiet && git commit -a -m "$HOST $(date +%F--%H-%M-%S-%Z)" && git push' + diff --git a/doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment b/doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment new file mode 100644 index 000000000..3d69e8f29 --- /dev/null +++ b/doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-05T18:05:00Z" + content=""" +Maybe, otoh, part of the point of git-annex is that the data may be too large to pull down all of it. + +I find mr useful as a policy layer over top of git-annex, so \"mr update\" can pull down appropriate quantities of data from +appropriate locations. +"""]] diff --git a/doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment b/doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment new file mode 100644 index 000000000..e0ecc1a81 --- /dev/null +++ b/doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-05T20:52:52Z" + content=""" +No-so-subtle sarcasm taken and acknowledged :) + +Arguably, git-annex should know about any local limits and not have them implemented via mr from the outside. I guess my concern boils down to having git-annex do the right thing all by itself with minimal user interaction. And while I really do appreciate the flexibility of chaining commands, I am a firm believer in exposing the common use cases as easily as possible. + +And yes, I am fully aware that not all annexes are created equal. Point in case, I would never use git annex pull on my laptop, but I would git annex push extensively. + + +"""]] diff --git a/doc/forum/bash_completion.mdwn b/doc/forum/bash_completion.mdwn new file mode 100644 index 000000000..649ad0457 --- /dev/null +++ b/doc/forum/bash_completion.mdwn @@ -0,0 +1 @@ +I wrote more than 2 years ago a bash completion file for git-annex (did I miss an official version?) I just updated it today to match current version of git-annex, it is far from perfect, still incomplete, and probably buggy, but works for me. I tried to attach the file in case it could be useful to someone, but it seems that I can't; is it ok to paste the code directly? diff --git a/doc/forum/bash_completion/comment_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment b/doc/forum/bash_completion/comment_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment new file mode 100644 index 000000000..7f2f0afd0 --- /dev/null +++ b/doc/forum/bash_completion/comment_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 1" + date="2013-10-10T07:08:21Z" + content=""" +I hope it is. I'd love to use it. +"""]] diff --git a/doc/forum/bash_completion/comment_2_6cbe3c825db99bf9188a0de8bb937d5b._comment b/doc/forum/bash_completion/comment_2_6cbe3c825db99bf9188a0de8bb937d5b._comment new file mode 100644 index 000000000..72d5e3fc4 --- /dev/null +++ b/doc/forum/bash_completion/comment_2_6cbe3c825db99bf9188a0de8bb937d5b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 2" + date="2013-10-10T09:22:00Z" + content=""" +it is, please publish. +"""]] diff --git a/doc/forum/bash_completion/comment_3_948c40f1e46ca220d61365aebcd4f6d7._comment b/doc/forum/bash_completion/comment_3_948c40f1e46ca220d61365aebcd4f6d7._comment new file mode 100644 index 000000000..fbe659164 --- /dev/null +++ b/doc/forum/bash_completion/comment_3_948c40f1e46ca220d61365aebcd4f6d7._comment @@ -0,0 +1,136 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkUwqII7LhbatqAQY1T5ZZOdPEFcQJKG6I" + nickname="Rafael" + subject="comment 3" + date="2013-10-13T16:14:34Z" + content=""" +This code needs the bash-completion file for git by Shawn O. Pearce, I think it is distributed by default on debian. Any feed-back or improvement is welcome! I'm far from expert, use at your own risks. + + + #!bash + # + # bash completion support for git-annex + + # depends on git completion file (by Shawn O. Pearce): + [ -n \"$__git_whitespacelist\" ] || . $BASH_COMPLETION_DIR/git + + + # almost copy of __git_aliased_command + # requires 2 arguments: alias and main command (after git) + __git_aliased_subcommand () + { + local word cmdline=$(git --git-dir=\"$(__gitdir)\" \ + config --get \"alias.$1\") + for word in $cmdline; do + case \"$word\" in + \!*) : shell command alias ;; + -*) : option ;; + *=*) : setting env ;; + git) : git itself ;; + \"$2\") : main command + local found=1 ;; + *) + [ -n \"${found-}\" ] && echo \"$word\" + return + esac + done + } + + + _git_annex () + { + _get_comp_words_by_ref -n =: cur words + # $ git annex 2>&1 |sed '1,6d '|grep -v '^$'|grep -v 'commands:$'|cut -c1-12 + local subcommands=\" + add addurl assistant copy drop edit get import importfeed lock + mirror move rmurl sync unlock watch webapp content dead describe + direct enableremote group indirect init initremote semitrust + trust ungroup untrust vicfg addunused dropunused fix forget fsck + merge unused upgrade find help list log map status version + whereis migrate reinject unannex uninit dropkey + \" + # plumbing (to complete?): fromkey fuzztest pre-commit rekey test + # transferkey transferkeys xmppgit + local subcommand=\"$(__git_find_on_cmdline \"$subcommands\")\" + if [ -z \"$subcommand\" ]; then + ## search for aliased subcommand + ## works only if the alias is invoked just after git + ## (simpler, cf _git function) + local maybesubcom maybealias=${words[1]} + [ -n \"$maybealias\" ] && # false with a bash alias='git annex' + [ \"${maybealias:0:1}\" != '-' ] && + maybesubcom=$(__git_aliased_subcommand \"$maybealias\" annex) + for subcommand in $subcommands \"\"; do + [ \"$maybesubcom\" = \"$subcommand\" ] && break + done + [ -z \"$subcommand\" ] && + __gitcomp \"$subcommands\" && + return + fi + case \"$cur\" in + --from=*|--to=*|--trust=*|--semitrust=*|--untrust=*|--in=*) + __gitcomp \"here $(__git_remotes)\" \"\" \"${cur##*=}\" + ;; + --*) + __gitcomp \" + --force --fast --auto --all --unused --quiet --verbose --json --debug + --no-debug --from= --to= --numcopies= --time-limit= --trust= --semitrust= + --untrust= --trust-glacier-inventory --backend= --format= --user-agent= + --exclude= --include= --in= --copies= --inbackend= --inallgroup= + --smallerthan= --largerthan= --not --and --or + \" + ;; + # -*) + # __gitcomp \"-( -) -c\" + # ;; + *) + case \"$subcommand\" in + # subcommands with PATH (currently outputs wrongly \"uninit\", + # and not \"reinject\") + # $ tr ' ' '|' <<< $(git annex 2>&1 |sed '1,6d '|grep -v '^$' | \ + # grep -v 'commands:$'|grep PATH |cut -c1-12) + add|copy|drop|edit|get|import|lock|mirror|move|unlock|fix| \ + fsck|find|list|log|status|whereis|migrate|unannex| \ + fromkey|pre-commit|rekey|reinject) + COMPREPLY=() # complete with paths + ;; + addurl|importfeed|rmurl) # URL commands + COMPREPLY=() # at least works with file://... + ;; + init|uninit|unused|merge|status|map|upgrade|version|assistant| \ + watch|webapp|direct|indirect|vicfg|forget|help) # | plumbing... + COMPREPLY= # no more args expected + # is 'COMPREPLY=' correct? (seems not standard practice...) + ;; + describe|trust|untrust|semitrust|sync|content|dead|group|ungroup) + __gitcomp \"here $(__git_remotes)\" + # TODO: handle git-annex special remotes + ;; + initremote|enableremote) + case \"$cur\" in + type=*) + __gitcomp \"S3 bup directory rsync gcrypt webdav\" \"\" \"${cur##type=}\" + ;; + encryption=*) + __gitcomp \"none hybrid shared pubkey\" \"\" \"${cur##encryption=}\" + ;; + + buprepo=|directory=|rsyncurl=) + COMPREPLY=() + # use COMPREPLY (and compgen below) directly because + # __gitcomp does not handle '*=*' pattern, only '--*=*' + # Writing a __gitannexcomp function may be worth it. + ;; + *) + local initremoteopts=\" + type= encryption= buprepo= directory= rsyncurl= \" + COMPREPLY=($(compgen -W \"$initremoteopts \" -- \"$cur\")) + ;; + esac + ;; + esac + ;; + esac + } + +"""]] diff --git a/doc/forum/bash_completion/comment_4_dbae348b230b780cda91ed8576b8f9fa._comment b/doc/forum/bash_completion/comment_4_dbae348b230b780cda91ed8576b8f9fa._comment new file mode 100644 index 000000000..525a613b0 --- /dev/null +++ b/doc/forum/bash_completion/comment_4_dbae348b230b780cda91ed8576b8f9fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 4" + date="2013-10-15T17:53:21Z" + content=""" +@Rafael, you should put a license on that code.. +"""]] diff --git a/doc/forum/batch_check_on_remote_when_using_copy.mdwn b/doc/forum/batch_check_on_remote_when_using_copy.mdwn new file mode 100644 index 000000000..633b61d6f --- /dev/null +++ b/doc/forum/batch_check_on_remote_when_using_copy.mdwn @@ -0,0 +1,34 @@ +When I copy my local repository with SHA* to a remote repo with SHA*, every single file is checked by itself which seems rather inefficient. When my remote is accessed via ssh, git-annex opens a new connections for every check. If you are not using a ssh key or key agent, this gets tedious... + +For all locked files, either git's built-in mechanisms should be used or, if that's not possible, a few hundred checksums (assuming SHA* backend) should be transfered at once and then checked locally before deciding that to transfer. + +Once all checks are done, one single transfer session should be started. Creating new sessions and waiting for TCP's slowstart to get going is a lot less than efficient. + + +-- RichiH + +> (Use of SHA is irrelevant here, copy does not checksum anything.) +> +> I think what you're seeing is +> that `git annex copy --to remote` is slow, going to the remote repository +> every time to see if it has the file, while `git annex copy --from remote` +> is fast, since it looks at what files are locally present. +> +> That is something I mean to improve. At least `git annex copy --fast --to remote` +> could easily do a fast copy of all files that are known to be missing from +> the remote repository. When local and remote git repos are not 100% in sync, +> relying on that data could miss some files that the remote doesn't have anymore, +> but local doesn't know it dropped. That's why it's a candidate for `--fast`. +> +> I've just implemented that. +> +> While I do hope to improve ssh usage so that it sshs once, and feeds +> `git-annex-shell` a series of commands to run, that is a much longer-term +> thing. --[[Joey]] + +>> FYI, in a repo with 1228 files, all small, repos _completely in sync_. + + % git annex copy . --to foo # 1200 seconds + % git annex copy . --to foo --fast # 20 seconds + +>> RichiH diff --git a/doc/forum/benefit_of_splitting_a_repository.mdwn b/doc/forum/benefit_of_splitting_a_repository.mdwn new file mode 100644 index 000000000..111feb2cf --- /dev/null +++ b/doc/forum/benefit_of_splitting_a_repository.mdwn @@ -0,0 +1,10 @@ +I am evaluating the best strategy to use git-annex to manage my media library. It consists of about 300.000 files totaling 1 TB of data. + +My question is, wheither it would be of advantage to split the repo into several smaller ones (Like Photos, Videos, Musik, Books, ...)? + +Would this affect performance of certain operations? I.e. Operations that have superlinear (O(n^a) with a > 1) complexity? + +I am thinking about "git annex unused", which takes 22 minutes on my machine performed on the full repo. + + +Do you have more interesting information on using git-annex in this scale? diff --git a/doc/forum/benefit_of_splitting_a_repository/comment_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment b/doc/forum/benefit_of_splitting_a_repository/comment_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment new file mode 100644 index 000000000..72ea4f29b --- /dev/null +++ b/doc/forum/benefit_of_splitting_a_repository/comment_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-28T18:16:10Z" + content=""" +`git-annex unused` needs to scan the entire repository. But it uses a bloom filter, so its complexity is O(n) to the number of keys. + +`git annex fsck` scans the entire repository and also reads all available file content. But we have incremental fsck support now. + +The rest of git-annex is designed to have good locality. + +The main problem you are likely to run into is innefficiencies with git's index file. This file records the status of every file in the repository, and commands like `git add` rewrite the whole file. git-annex uses a journal to minimise operations that need to rewrite the git index file, but this won't help you when you're using raw git commands in the repository. + +"""]] diff --git a/doc/forum/benefit_of_splitting_a_repository/comment_2_4e2fed247298d620fee7be883a1e86a6._comment b/doc/forum/benefit_of_splitting_a_repository/comment_2_4e2fed247298d620fee7be883a1e86a6._comment new file mode 100644 index 000000000..c102243f4 --- /dev/null +++ b/doc/forum/benefit_of_splitting_a_repository/comment_2_4e2fed247298d620fee7be883a1e86a6._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 2" + date="2012-12-02T19:24:59Z" + content=""" +The biggest problem I am facing actually is the git pack-objects command, which takes forever. + +I am not starting it manually, but \"git annex sync\" is. + +Any advice on how to make this faster? +Does it make sense at all to pack a bunch of uncompressible simlinks? + +I already tried the delta=false attrigute, without any (major) effect. +"""]] diff --git a/doc/forum/best_practices_for_importing_photos__63__.mdwn b/doc/forum/best_practices_for_importing_photos__63__.mdwn new file mode 100644 index 000000000..2f57f3b35 --- /dev/null +++ b/doc/forum/best_practices_for_importing_photos__63__.mdwn @@ -0,0 +1,13 @@ +What are everyone's tips for importing photos to make best use of metadata and views? + +Let's assume there's no need to be compatible with a photo manager app, but we may be importing lots of duplicates, and while content deduplication is great, I'd like to avoid naming problems too. + +Do you bother to rename your photos? + +Do you use EXIF metadata as git-annex metadata? Selectively or wholesale, with all the redundant tags in EXIF? + +If you do use a photo manager app, do you need to do anything special to make that work? + +Thanks for your responses everyone! + +-mike diff --git a/doc/forum/best_practices_for_importing_photos__63__/comment_1_37f0ae4b552ec2a4a144ddcdc17c8453._comment b/doc/forum/best_practices_for_importing_photos__63__/comment_1_37f0ae4b552ec2a4a144ddcdc17c8453._comment new file mode 100644 index 000000000..3d17874ad --- /dev/null +++ b/doc/forum/best_practices_for_importing_photos__63__/comment_1_37f0ae4b552ec2a4a144ddcdc17c8453._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="Xyem" + ip="178.79.137.64" + subject="comment 1" + date="2014-04-15T14:25:04Z" + content=""" +git-annex's metadata and views made me stop hopping between programs (digikam, tagsistant etc.) to organise my photos (I had even just started working on my own FUSE tagging filesystem which was effectively going to be tagsistant, but with a git-annex'y backend). + +As usual, my method is probably a little odd :) + +Photos are 'git import'ed into a $(uuidgen) directory (so no worries about filename collisions) and tagged with media=Photograph and tag=untagged. Then I go through them and add relevant tags (one of which is \"xbmc\", no prizes for guessing how that works with the views :]) and move them into a more appropriate directory structure, using gqview and its \"sort manager\". This is really nice and fast, due to it only copying/moving symlinks! + +One thing I'm considering doing it putting a shim between git-annex and gqview, so that it generates entries in the sort manager which are appropriate for the current view. So, for example, if the view is location=*, the sort manager would have: + + location=Malta + location=York + +While it wouldn't get updated if I create new tags (by creating directories in the view), it would save a lot of time creating them every time the view changes. +"""]] diff --git a/doc/forum/best_practices_for_importing_photos__63__/comment_2_7f96f0fe0fc073321bd7c5bbd9048425._comment b/doc/forum/best_practices_for_importing_photos__63__/comment_2_7f96f0fe0fc073321bd7c5bbd9048425._comment new file mode 100644 index 000000000..349ee432a --- /dev/null +++ b/doc/forum/best_practices_for_importing_photos__63__/comment_2_7f96f0fe0fc073321bd7c5bbd9048425._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 2" + date="2014-04-17T20:11:59Z" + content=""" +It seems to me that there is a lot of cruft in EXIF that I would not want to bloat my git-annex branch with storing. That's why [[tips/automatically_adding_metadata]] imports only the listed fields. It's easy to add fields later and re-run the metadata importer on your existing files. + +I have not gotten as far as having any best practices to share. :) + +"""]] diff --git a/doc/forum/btsync_equivalent__63__.mdwn b/doc/forum/btsync_equivalent__63__.mdwn new file mode 100644 index 000000000..ce72b10c5 --- /dev/null +++ b/doc/forum/btsync_equivalent__63__.mdwn @@ -0,0 +1,8 @@ +I am using bit torrent sync to sync folders and files between my server, my laptop and my smartphone. +How similar, or different, is git-annex? + +Btsync allows me to sync files with no centralized server, encrypted, with some revision history (but I believe it is basic). + + + +/glattering diff --git a/doc/forum/btsync_equivalent__63__/comment_1_6bfdc6f595a8aa8979a7c2a10925812f._comment b/doc/forum/btsync_equivalent__63__/comment_1_6bfdc6f595a8aa8979a7c2a10925812f._comment new file mode 100644 index 000000000..dd8b17f1a --- /dev/null +++ b/doc/forum/btsync_equivalent__63__/comment_1_6bfdc6f595a8aa8979a7c2a10925812f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 1" + date="2014-01-16T15:55:05Z" + content=""" +Maybe [[telehash|devblog/day_97__exciting_telehash_possiblities/]] is the free and open source answer to btsync? +"""]] diff --git a/doc/forum/cabal_install_fails_on_uuid.mdwn b/doc/forum/cabal_install_fails_on_uuid.mdwn new file mode 100644 index 000000000..606f7954d --- /dev/null +++ b/doc/forum/cabal_install_fails_on_uuid.mdwn @@ -0,0 +1,23 @@ +Hey, so I am trying to compile git-annex through cabal but it fails on building uuid. It gives me this strange error: + + Resolving dependencies... + Configuring uuid-1.3.1... + Building uuid-1.3.1... + Preprocessing library uuid-1.3.1... + [ 1 of 10] Compiling Data.UUID.Builder ( Data/UUID/Builder.hs, dist/build/Data/UUID/Builder.o ) + [ 2 of 10] Compiling Data.Word.Util ( Data/Word/Util.hs, dist/build/Data/Word/Util.o ) + [ 3 of 10] Compiling Data.UUID.Internal ( Data/UUID/Internal.hs, dist/build/Data/UUID/Internal.o ) + Data/UUID/Internal.hs:394:20: Not in scope: `BL.fromStrict' + Data/UUID/Internal.hs:399:48: Not in scope: `BL.toStrict' + cabal: Error: some packages failed to install: + git-annex-4.20131002 depends on uuid-1.3.1 which failed to install. + uuid-1.3.1 failed during the building phase. The exception was: + ExitFailure 1 + +Any advice on how to proceed? + +System is: Debian Wheezy (CrunchBang Waldorf) 64bit + +versions are: + uuid-dev: 2.20.1-5.3 + cabal: 1.14.0 diff --git a/doc/forum/cabal_install_fails_on_uuid/comment_1_2a3963e21bc7ff526124b902cb0b6ad2._comment b/doc/forum/cabal_install_fails_on_uuid/comment_1_2a3963e21bc7ff526124b902cb0b6ad2._comment new file mode 100644 index 000000000..47fe7e5ff --- /dev/null +++ b/doc/forum/cabal_install_fails_on_uuid/comment_1_2a3963e21bc7ff526124b902cb0b6ad2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-22T17:52:10Z" + content=""" +That version of the haskell uuid library installs ok on my Debian sid system. Seems to me you have a too old version of the haskell bytestring library, which added `fromStrict` in version 0.10.0.0. Probably `cabal install bytestring` will fix it up for you, but building git-annex from source using cabal is a complicated thing that can go wrong in many ways. Have you considered one of the prebuilt binaries? +"""]] diff --git a/doc/forum/cabal_install_fails_on_uuid/comment_2_1609525998e2b36c04d67f4d988139c0._comment b/doc/forum/cabal_install_fails_on_uuid/comment_2_1609525998e2b36c04d67f4d988139c0._comment new file mode 100644 index 000000000..0f308df0b --- /dev/null +++ b/doc/forum/cabal_install_fails_on_uuid/comment_2_1609525998e2b36c04d67f4d988139c0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkj7tMEJKcZpNXIFkHAAcNi5qJFSFyjn6o" + nickname="thissideup" + subject="comment 2" + date="2013-10-23T11:15:20Z" + content=""" +I contacted the maintainer of the uuid-package and he fixed the issue in the current release, so everythings fine now. and: everything compiled beautifully. + +But to answer your question: I tend to rather compile things myself if I don't find them (or a current enough version) in the repos - but that's purely personal. ;) +"""]] diff --git a/doc/forum/can_I_only_add_my_own_files__63__.mdwn b/doc/forum/can_I_only_add_my_own_files__63__.mdwn new file mode 100644 index 000000000..555429582 --- /dev/null +++ b/doc/forum/can_I_only_add_my_own_files__63__.mdwn @@ -0,0 +1,27 @@ +Hi, + +[ sorry for the wrong bugreport in the last version of this entry ] + +It seems as if I can only add my own file to the annex, even if I have group write permissions. Is that correct? Can that be circumvented other than copying/deleting the large file? + +Here is some demonstration: + + > git init + > git config user.name dtr + > git config user.email dtrn@dtrn.com + + > dd if/dev/zero of=test2.bin count=1000 + + > ll + -rw-rw-r-- 1 dtr dtr 512000 Sep 16 2013 test2.bin + + > sudo chown someone test2.bin + > ll + -rw-rw-r-- 1 someone dtr 512000 Sep 16 2013 test2.bin + + > git annex init + > git annex add test2.bin + add test2.bin (checksum...) + git-annex: /test-git-annex/.git/annex/objects/Fq/f6/SHA256-s512000--2d4da04b861bb9dbe77c871415931785a18138d6db035f1bbcd0cf8277c6fc23/SHA256-s512000--2d4da04b861bb9dbe77c871415931785a18138d6db035f1bbcd0cf8277c6fc23: setFileMode: permission denied (Operation not permitted) + failed + git-annex: add: 1 failed diff --git a/doc/forum/can_I_only_add_my_own_files__63__/comment_1_767d647af9d0345f337338d6319071fa._comment b/doc/forum/can_I_only_add_my_own_files__63__/comment_1_767d647af9d0345f337338d6319071fa._comment new file mode 100644 index 000000000..80efaf04b --- /dev/null +++ b/doc/forum/can_I_only_add_my_own_files__63__/comment_1_767d647af9d0345f337338d6319071fa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:42:00Z" + content=""" +git-annex needs to be able to lock down files to ensure that nobody can write to them, and to do this it needs to remove the write bit, and you can't remove the write bit from a file you don't own. + +Note that if you configure git's core.sharedRepository when making a repository (git init --shared), then all files in both git and git-annex will be group writable. Put you and the other person you wanted to be able to write to the file in a group, and you can both access the repository. So that's the right way to do it. +"""]] diff --git a/doc/forum/can_I_only_add_my_own_files__63__/comment_2_0c3306ffb38b97b54e1e0436d12c1876._comment b/doc/forum/can_I_only_add_my_own_files__63__/comment_2_0c3306ffb38b97b54e1e0436d12c1876._comment new file mode 100644 index 000000000..5a63a7176 --- /dev/null +++ b/doc/forum/can_I_only_add_my_own_files__63__/comment_2_0c3306ffb38b97b54e1e0436d12c1876._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 2" + date="2013-09-26T06:32:48Z" + content=""" +Thanks a lot. The solution with --shared was really helpful. +"""]] diff --git a/doc/forum/can_git-annex_replace_ddm__63__.mdwn b/doc/forum/can_git-annex_replace_ddm__63__.mdwn new file mode 100644 index 000000000..8d49652c3 --- /dev/null +++ b/doc/forum/can_git-annex_replace_ddm__63__.mdwn @@ -0,0 +1,13 @@ +Hi, +a few years ago I wrote a tool called 'ddm'. The code is overengineered and the script is more complicated then it should be, +but I think it demonstrates some good use cases, and I wonder how well git-annex can fulfill the requirements for those use cases - maybe I should remove ddm and start hacking with git-annex instead. + +To answer this question, you should read the section about the possible dataset types on http://dieter.plaetinck.be/ddm_a_distributed_data_manager.html, and the example at the bottom of that page. it demonstrates the idea behind the "selection" dataset to always try to keep a subset (the most appropriate, based on the output of some script) of files "checked out". +the introduction section on https://github.com/Dieterbe/ddm/raw/358f7cf92c0ba7b336dc97638351d4e324461afa/MANUAL should further clarify things, as well as give some more good use cases (as you can see it's a bit more about [semi-]automated workflows then purely tracking what's where) + +So I'm not sure, maybe the way to go for me is to make git-annex my "housekeeping about which data is where" backend and make ddm into a set of policies and tools on top of git-annex. + +Any input? + +Thanks, +Dieter diff --git a/doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment b/doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment new file mode 100644 index 000000000..eb824971f --- /dev/null +++ b/doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-02-14T22:08:54Z" + content=""" +Yes, there is value in layering something over git-annex to use a policy to choose what goes where. + +I use [mr](http://kitenet.net/~joey/code/mr/) to update and manage all my repositories, and since mr can be made to run arbitrary commands when doing eg, an update, I use its config file as such a policy layer. For example, my podcasts are pulled into my sound repository in a subdirectory; boxes that consume podcasts run \"git pull; git annex get podcasts --exclude=\"*/out/*\"; git annex drop podcasts/*/out\". I move podcasts to \"out\" directories once done with them (I have yet to teach mpd to do that for me..), and the next time I run \"mr update\" to update everything, it pulls down new ones and removes old ones. + +I don't see any obstacle to doing what you want. May be that you'd need better querying facilities in git-annex (so the policy layer can know what is available where), or finer control (--exclude is a good enough hammer for me, but maybe not for you). +"""]] diff --git a/doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment b/doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment new file mode 100644 index 000000000..ab114bb1c --- /dev/null +++ b/doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="comment 2" + date="2011-02-16T21:32:04Z" + content=""" +thanks Joey, + +is it possible to run some git annex command that tells me, for a specific directory, which files are available in an other remote? (and which remote, and which filenames?) +I guess I could run that, do my own policy thingie, and run `git annex get` for the files I want. + +For your podcast use case (and some of my use cases) don't you think git [annex] might actually be overkill? For example your podcasts use case, what value does git annex give over a simple rsync/rm script? +such a script wouldn't even need a data store to store its state, unlike git. it seems simpler and cleaner to me. + +for the mpd thing, check http://alip.github.com/mpdcron/ (bad project name, it's a plugin based \"event handler\") +you should be able to write a simple plugin for mpdcron that does what you want (or even interface with mpd yourself from perl/python/.. to use its idle mode to get events) + +Dieter +"""]] diff --git a/doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment b/doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment new file mode 100644 index 000000000..5cdd6aa0c --- /dev/null +++ b/doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-16T03:01:17Z" + content=""" +Whups, the comment above got stuck in moderation queue for 27 days. I will try to check that more frequently. + +In the meantime, I've implemented \"git annex whereis\" -- enjoy! + +I find keeping my podcasts in the annex useful because it allows me to download individual episodes or poscasts easily when low bandwidth is available (ie, dialup), or over sneakernet. And generally keeps everything organised. +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn new file mode 100644 index 000000000..59ca2e9fc --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn @@ -0,0 +1,18 @@ +I have a remote rsync with gpg encryption and can restore without problems on my thinkpad (FreeBSD) - but not on my MacOSX: + +$ git annex whereis DSC_7615.JPG +whereis DSC_7615.JPG (2 copies) + 6855de17-c8fb-11e1-9948-f0def1c18073 -- thinkpad + e388bcf6-c8fc-11e1-a96f-6ffcbceb4af4 -- backup (rsync xxxx) +ok + +$ git annex get --from backup DSC_7615.JPG +fatal: Could not switch to '../../../.git/annex/objects/Pw/XP/SHA256-s1028494--SHA256': No such file or directory + +git-annex: : hGetLine: end of file +failed +git-annex: get: 1 failed + +$ git annex version +git-annex version: 3.20120629 +local repository version: 3 diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_1_21f0101447623f5a0cf9e72c3ff463bb._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_1_21f0101447623f5a0cf9e72c3ff463bb._comment new file mode 100644 index 000000000..c6c962c40 --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_1_21f0101447623f5a0cf9e72c3ff463bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-08-07T13:11:48Z" + content=""" +Do the remotes in `.git/config` look the same? +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_2_6234ca64bd03a0e15efbe8f5c204338a._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_2_6234ca64bd03a0e15efbe8f5c204338a._comment new file mode 100644 index 000000000..5ae18235b --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_2_6234ca64bd03a0e15efbe8f5c204338a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hannes" + ip="130.226.133.37" + subject="they do" + date="2012-08-07T14:06:55Z" + content=""" +I was also able to copy from the macosx to the rsync backup... +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_3_5ac2b520a907e232984eb513ce088054._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_3_5ac2b520a907e232984eb513ce088054._comment new file mode 100644 index 000000000..d80a01a0b --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_3_5ac2b520a907e232984eb513ce088054._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hannes" + ip="130.226.133.37" + subject="also, fsck works" + date="2012-08-07T14:12:20Z" + content=""" +git annex fsck -fbackup some-local-and-remote-file works fine. +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_4_183dd1c29f66539193e7c0b73f329430._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_4_183dd1c29f66539193e7c0b73f329430._comment new file mode 100644 index 000000000..6ab9ebb25 --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_4_183dd1c29f66539193e7c0b73f329430._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 4" + date="2012-08-07T17:53:35Z" + content=""" +I recently encountered this problem on OSX, and I'm pretty sure I fixed it. But I don't remember the details of how. I'm sorry I don't have more detail, but I recommend trying a newer version of git-annex. + +And if the problem persists, --debug will show the git commands and should help identify the one that's being passed bad parameters. +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_5_c920d04ffe332caed9d223fa0ac42746._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_5_c920d04ffe332caed9d223fa0ac42746._comment new file mode 100644 index 000000000..32420ac66 --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_5_c920d04ffe332caed9d223fa0ac42746._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="remember now" + date="2012-08-07T19:37:22Z" + content=""" +This was a bug in determining the git version at compile time. Fixed in commit bafc50e05e098234d2d22886085d9844fc763e0e which was included in version 3.20120721. +"""]] diff --git a/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_6_7a3cf0853a8ec7b996e19b5e80145d21._comment b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_6_7a3cf0853a8ec7b996e19b5e80145d21._comment new file mode 100644 index 000000000..9ffb376a7 --- /dev/null +++ b/doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_6_7a3cf0853a8ec7b996e19b5e80145d21._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hannes" + ip="130.226.133.37" + subject="awesome, thanks" + date="2012-08-08T12:25:19Z" + content=""" +works with an updated git-annex! +"""]] diff --git a/doc/forum/central_non-bare_and_git_push.mdwn b/doc/forum/central_non-bare_and_git_push.mdwn new file mode 100644 index 000000000..ecc81096e --- /dev/null +++ b/doc/forum/central_non-bare_and_git_push.mdwn @@ -0,0 +1,9 @@ +hi, + +i have a usecase that i think many people have. a cental server which should be non-bare to be able to browse the files also via webdav. +multiple clients behind nat so only pushes via xmpp are possible. + +i set everything up without xmpp, it works but if files are updated, none of the clients gets a git push of course because ssh works only unidirectional. +i couldnt figure out how to set up xmpp push and have a non-bare central repo at the same time because i have to choose between ssh and xmpp git remote on the clients to the server. + +thanks! diff --git a/doc/forum/central_non-bare_and_git_push/comment_1_76d0c73c8985e860eb86333c63be6340._comment b/doc/forum/central_non-bare_and_git_push/comment_1_76d0c73c8985e860eb86333c63be6340._comment new file mode 100644 index 000000000..6bf3d1a5e --- /dev/null +++ b/doc/forum/central_non-bare_and_git_push/comment_1_76d0c73c8985e860eb86333c63be6340._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-07-25T17:05:00Z" + content=""" +Simply set up xmpp on your clients in addition to the central repository you have now. When one client pushes over ssh to the central repo, it will use XMPP to inform other clients of the change. +"""]] diff --git a/doc/forum/clear_box.com_repository.mdwn b/doc/forum/clear_box.com_repository.mdwn new file mode 100644 index 000000000..0de67cf62 --- /dev/null +++ b/doc/forum/clear_box.com_repository.mdwn @@ -0,0 +1 @@ +Using webapp I cannot get rid of box.com repository, it is locked in 'cleaning out' state for more than two weeks. How can I remove the repository from the list? diff --git a/doc/forum/clear_box.com_repository/comment_1_2e839d8f974269c80a9fca183712350f._comment b/doc/forum/clear_box.com_repository/comment_1_2e839d8f974269c80a9fca183712350f._comment new file mode 100644 index 000000000..939e9b893 --- /dev/null +++ b/doc/forum/clear_box.com_repository/comment_1_2e839d8f974269c80a9fca183712350f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-14T16:21:54Z" + content=""" +We need to first understand why it's not finishing the process. Does the box.com repository still contain files? You can find out by running the command: `git annex find --in box.com` (substitute the name of your remote for box.com as needed). +"""]] diff --git a/doc/forum/clear_box.com_repository/comment_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment b/doc/forum/clear_box.com_repository/comment_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment new file mode 100644 index 000000000..9725c96e5 --- /dev/null +++ b/doc/forum/clear_box.com_repository/comment_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="tomas" + ip="188.167.111.235" + subject="comment 2" + date="2013-06-16T13:32:31Z" + content=""" +The result of that command returned without writing any files. +"""]] diff --git a/doc/forum/clear_box.com_repository/comment_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment b/doc/forum/clear_box.com_repository/comment_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment new file mode 100644 index 000000000..6b19da5c7 --- /dev/null +++ b/doc/forum/clear_box.com_repository/comment_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-06-17T17:34:04Z" + content=""" +In that case, I'd expect the assistant will notice it can remove the remote on the next full scan, and prompt you to finish the removal. Full scans are run in a few situations, but the only guaranteed way to run one is to stop and restart the assistant. + +You could also enable debug mode when starting it, I'm sure the log would be useful if it somehow doesn't behave how it should. +"""]] diff --git a/doc/forum/clear_box.com_repository/comment_4_f8c06ac9b23b51cf18d362c260fc47a9._comment b/doc/forum/clear_box.com_repository/comment_4_f8c06ac9b23b51cf18d362c260fc47a9._comment new file mode 100644 index 000000000..a36ca1237 --- /dev/null +++ b/doc/forum/clear_box.com_repository/comment_4_f8c06ac9b23b51cf18d362c260fc47a9._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="tomas" + ip="188.167.111.235" + subject="comment 4" + date="2013-06-17T20:17:30Z" + content=""" +Hi, I cannot enable debug logging via webapp, because after restart the checkbox is unchecked again. I saw nothing at all in logs after restart, the box repo is still hanging there. I would prefer using command line to remove the last traces of this repository. +Another similar question - how do I unassociate two repositories? The web app warns me that about deleting repo, not sure if it would also wipe it out. Is there a CLI command to add and remove the associations (git remote rm?)? Overall great work, but I am lost with the webapp. It is good for learning the concepts, but I would love to know which commands it actually executes on the backend to make the gui -> cli transition easier. + +Version: 4.20130516.1 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +"""]] diff --git a/doc/forum/clear_box.com_repository/comment_5_61d401b29322802cb25896503f3e6514._comment b/doc/forum/clear_box.com_repository/comment_5_61d401b29322802cb25896503f3e6514._comment new file mode 100644 index 000000000..122e054a9 --- /dev/null +++ b/doc/forum/clear_box.com_repository/comment_5_61d401b29322802cb25896503f3e6514._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-06-17T23:53:24Z" + content=""" +Use the --debug switch to enable debugging on startup. +"""]] diff --git a/doc/forum/cloud_services_to_support.mdwn b/doc/forum/cloud_services_to_support.mdwn new file mode 100644 index 000000000..4d6bde1b5 --- /dev/null +++ b/doc/forum/cloud_services_to_support.mdwn @@ -0,0 +1,16 @@ +git-annex can already be used to store data in several cloud services: +Amazon S3, rsync.net, Tahoe-LAFS, The Internet Archive. + +I would like to support as many other cloud services as possible/reasonable. + +* [[swift|todo/wishlist:_swift_backend]] +* Dropbox (I had been reluctant to go there due to it using a non-free client, + which I have no interest in installing, but there is actually an API, + and already a + [haskell module to use it](http://hackage.haskell.org/package/dropbox-sdk). + Would need to register for an API key. + . + Annoyingly, Dropbox reviews each app before granting it production status. + Whoops my interest level dropped by 99%.) + +Post others in the comments. --[[Joey]] diff --git a/doc/forum/cloudcmd.mdwn b/doc/forum/cloudcmd.mdwn new file mode 100644 index 000000000..a572abf1c --- /dev/null +++ b/doc/forum/cloudcmd.mdwn @@ -0,0 +1,6 @@ +Hi, + +Glad to see this project appears to be doing well. I just wanted to mention that there's a similar project called cloudcmd that has many of the same use cases in spirit: https://github.com/briangu/cloudcmd + +Cheers, +Brian diff --git a/doc/forum/commit_current_workdir_state_in_direct_mode.mdwn b/doc/forum/commit_current_workdir_state_in_direct_mode.mdwn new file mode 100644 index 000000000..63945f790 --- /dev/null +++ b/doc/forum/commit_current_workdir_state_in_direct_mode.mdwn @@ -0,0 +1,5 @@ +I'd like to commit the current workdir state in direct mode in a script. This is what git annex watch does but I can not reliably start and stop git annex watch in a cron script. + +Is this already possible with the current api or could we have something like git annex watch --once? + +Thank you, Thomas Koch diff --git a/doc/forum/commit_current_workdir_state_in_direct_mode/comment_1_748481ff00374f570284bd4571584874._comment b/doc/forum/commit_current_workdir_state_in_direct_mode/comment_1_748481ff00374f570284bd4571584874._comment new file mode 100644 index 000000000..50bd6661c --- /dev/null +++ b/doc/forum/commit_current_workdir_state_in_direct_mode/comment_1_748481ff00374f570284bd4571584874._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-31T16:25:34Z" + content=""" +It should be sufficient to run: `git annex add; git annex sync` + +That adds any new files and then commits those along with any changed or deleted files. +"""]] diff --git a/doc/forum/comprehension_question:_repository_vs._working_copy_in_direct_mode.mdwn b/doc/forum/comprehension_question:_repository_vs._working_copy_in_direct_mode.mdwn new file mode 100644 index 000000000..350bcd7bd --- /dev/null +++ b/doc/forum/comprehension_question:_repository_vs._working_copy_in_direct_mode.mdwn @@ -0,0 +1,10 @@ +(I put this in a separate topic because it is a different question) + +I still do not fully understand when (in direct mode!) a file is in the work copy and when in the repository. +Because what git-annex always refers to a "repository" is actually a repository (i.e., the server part for subversion) *and* a work copy (the client part in subversion), right? (except for bare repositories which have only the former) + +When I change a file in the work copy, I still need to "git annex sync", right? But do I also need to "git annex sync --content" to move the changes from the work copy to the repository? + +Because I have a headless server where the annex should also be accessed via samba. When files are added/changed, the annex clients do not see the changes until I manually do a couple of "git annex sync" and "git annex sync --content" (it's not deterministic yet for me how often). + +Is this the intended behavior? If yes, is there a better way to automatically sync the changes on the headless server other than a cron job? diff --git a/doc/forum/confused_about_external_drives.mdwn b/doc/forum/confused_about_external_drives.mdwn new file mode 100644 index 000000000..9fdb5c979 --- /dev/null +++ b/doc/forum/confused_about_external_drives.mdwn @@ -0,0 +1,30 @@ +First off, to get that off my chest: I am not using Gnome, KDE, XFCE or any "desktop manager" (well, not quite true, I use some bits of XFCE, but it's easier to assume I'm not). + +So automounting is always a little tricky for me, and I often use `pmount` to mount external drives and flash cards. + +Now, I have tried to add an external drive as a backup to one of my git-annex repositories. I zero'd the drive, added a GPT partition (I wanted labels), formatted it as `ext4` and then gave it to my user: + + cfdisk /dev/sdd + mkfs -t ext4 /dev/sdd1 + mount /dev/sdd1 /mnt + chown anarcat /mnt + umount /mnt + +Now, at this step I would have assumed the drive would be seen by the webapp, but that wasn't the case. Maybe I wasn't patient enough? In any case, at some point I got tired and went to the commandline to add the drive as a remote. I did the following: + + mkdir -p /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1 + mount /dev/disk/by-id/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1 /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1 + cd /srv/mp3 + git annex remote add backup /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3 + git init /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3 + git annex sync + git annex copy --to backup + +So that worked, and the webapp was now seeing `backup` as yet another repository, but not quite removeable. So failed. Scratching that, I stopped the assistant, and trashed the repository: + + rm -rf /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3 + git remote rm backup + +But now, oddly enough, the webapp would see the external drive after being restarted, and I was able to add that drive. + +What am I doing wrong? how is the assistant finding those drives? --[[anarcat]] diff --git a/doc/forum/confused_about_external_drives/comment_1_8340e5ff17a4846b41789e4966fed70c._comment b/doc/forum/confused_about_external_drives/comment_1_8340e5ff17a4846b41789e4966fed70c._comment new file mode 100644 index 000000000..5b7ca0114 --- /dev/null +++ b/doc/forum/confused_about_external_drives/comment_1_8340e5ff17a4846b41789e4966fed70c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="separation of concerns" + date="2013-12-29T17:57:36Z" + content=""" +It doesn't make sense for the git-annex assistant to try to somehow detect and mount drives. Every OS has its own way to do that. + +The assistant simply detects drives that have been mounted by the OS. + +There is absolutely no problem with manually setting up a git repository on a removable drive and using it with the assistant. This is identical to what the assistant would set up for an external drive (except perhaps being a non-bare repository). The assistant simply detects if any git remote whose url is a directory is inside a mount point when it sees a new device be mounted. +"""]] diff --git a/doc/forum/confused_about_external_drives/comment_2_ad10bd0ec14c16bcad089b3ebe64580e._comment b/doc/forum/confused_about_external_drives/comment_2_ad10bd0ec14c16bcad089b3ebe64580e._comment new file mode 100644 index 000000000..c0eb3d8c2 --- /dev/null +++ b/doc/forum/confused_about_external_drives/comment_2_ad10bd0ec14c16bcad089b3ebe64580e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2013-12-30T17:47:26Z" + content=""" +Fair enough, I guess. However, I must say that it seems that git-annex doesn't actually detect properly externally mounted hard drives. For example, here I have an annex in /srv/foo that is part of my system hard drive (but in a separate /srv partition). Then I made a backup annex in /backup/srv/foo that is on an external hard drive, yet the webapp sees those two repos as under its control - as in, i can choose both in the \"switch repository\" menu. + +Another drive I was able to add using the \"add external drive\" tool in the webapp doesn't show up in that list (and that's fine too!). +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map.mdwn b/doc/forum/confusion_with_remotes__44___map.mdwn new file mode 100644 index 000000000..0ae75d4e9 --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map.mdwn @@ -0,0 +1,113 @@ +I'm starting out with git-annex and running into some confusion with setting up the remotes. + +I have three systems I'm trying to set up (domains edited): + +* psychosis: ssh://psychosis.foo.com/vid +* bacon: ssh://bucket.foo.com/vid +* bucket: ssh://bucket.bar.org/vid + +And one bare repository so that I can have a single place to push/pull: + +* origin: https://git.foo.com/jim/vid.git + +On psychosis: + + psychosis$ git config --list | grep ^remote | sort + remote.bacon.annex-uuid=8f1f0898-f8c1-11e0-9bf2-b387af26ee63 + remote.bacon.fetch=+refs/heads/*:refs/remotes/bacon/* + remote.bacon.url=ssh://bucket.foo.com/vid + remote.bucket.annex-uuid=82814942-f8e0-11e0-b053-e70a61e98e19 + remote.bucket.fetch=+refs/heads/*:refs/remotes/bucket/* + remote.bucket.url=ssh://bucket.bar.org/vid + remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* + remote.origin.url=https://git.foo.com/jim/vid.git + + psychosis$ git annex status + supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL + supported remote types: git S3 bup directory rsync web hook + known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- here (psychosis) + 82814942-f8e0-11e0-b053-e70a61e98e19 -- bucket + local annex keys: 2256 + local annex size: 449 gigabytes + total annex keys: 2256 + total annex size: 449 gigabytes + backend usage: + WORM: 2256 + +**First point of confusion**: Why doesn't "bacon" show up in "git annex status"? I can "git annex copy --to bacon filename" and it will copy it there. Is there some step of setting it up that I missed? I basically just did "git remote add bacon ssh://bucket.foo.com/vid". + +Now I've started setting up the remotes on each host: + +On bacon: + + bacon$ git config --list | grep ^remote | sort + remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* + remote.origin.url=https://git.foo.com/jim/vid.git + remote.psychosis.annex-uuid=09c0b436-f8de-11e0-842f-b7644539d57f + remote.psychosis.fetch=+refs/heads/*:refs/remotes/psychosis/* + remote.psychosis.url=ssh://psychosis.foo.com/vid + + bacon$ git annex status + supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL + supported remote types: git S3 bup directory rsync web hook + known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis + 8f1f0898-f8c1-11e0-9bf2-b387af26ee63 -- here (bacon) + temporary directory size: 366 megabytes (clean up with git-annex unused) + local annex keys: 1 + local annex size: 308 bytes + total annex keys: 2256 + total annex size: 449 gigabytes + backend usage: + WORM: 2256 + +On bucket: + + bucket$ git config --list | grep ^remote | sort + remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* + remote.origin.url=https://git.foo.com/jim/vid.git + remote.psychosis.annex-uuid=09c0b436-f8de-11e0-842f-b7644539d57f + remote.psychosis.fetch=+refs/heads/*:refs/remotes/psychosis/* + remote.psychosis.url=ssh://psychosis.foo.com/vid + + bucket$ git annex status + supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL + supported remote types: git S3 bup directory rsync web hook + known repositories: + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis + 82814942-f8e0-11e0-b053-e70a61e98e19 -- here (bucket) + temporary directory size: 183 megabytes (clean up with git-annex unused) + local annex keys: 3 + local annex size: 550 megabytes + total annex keys: 2256 + total annex size: 449 gigabytes + backend usage: + WORM: 2256 + +But I'm getting weird results if I try to show the map from psychosis: + + psychosis$ git annex map + $ git annex map + map /vid/tv ok + map bacon (sshing...) + ok + map bucket (sshing...) + ok + map origin + failed + map psychosis (sshing...) + jim@psychosis.foo.com's password: + ok + map psychosis (sshing...) + jim@psychosis.foo.com's password: + ok + + running: dot -Tx11 map.dot + +**Second confusion**: it's as if psychosis was considered a new remote each time? +The generated map has psychosis listed with several redundant links: + +![Map](http://jim.sh/~jim/tmp/map.png) + +Is this some bug or do I just need to be hit with the clue bat? diff --git a/doc/forum/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment b/doc/forum/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment new file mode 100644 index 000000000..97de93d9e --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-10-17T19:01:21Z" + content=""" +My guess is that psychosis has not pulled the git-annex branch since bacon was set up (or that bacon's git-annex branch has not been pushed to origin). git-annex status only shows remotes present in git-annex:uuid.log This may be a bug. + +The duplicate links in the map I don't quite understand. I only see duplicate links in my maps when I have the same repository configured as two different git remotes (for example, because the same repository can be accessed two different ways). You don't seem to have that in your config. +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment b/doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment new file mode 100644 index 000000000..a61b126c0 --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-10-17T19:02:50Z" + content=""" +Actually, there is a hint that, while you ran the git annex map on psychosis, it decided to ssh to itself two times. That seems to be where the duplicate links came from, I guess you must have some git remotes you did not show. +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment b/doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment new file mode 100644 index 000000000..4c7722261 --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 3" + date="2011-10-17T19:50:06Z" + content=""" +No extra remotes (that I'm aware of); that output was only edited to change hostnames. + +On all three hosts, \"git push origin\" and \"git pull origin\" say everything is up to date. + +I'm using git-annex 3.20111011 on all hosts (although some were running 3.20110928 when I created the repositories). + +Regarding the multiple links, I've put a copy of the dot file [here](http://jim.sh/~jim/tmp/map.dot). +It shows psychosis in three separate subgraphs, that are just getting rendered together as one, +if that helps clarify anything. + +Wait, I just realized you said \"the git-annex branch\". My origin only has \"master\". +Do you mean the one specifically named \"git-annex\"? I thought that was something that +gets managed automatically, or is it something I need to manually check out and deal with? + +Any other info I could provide? + + +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment b/doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment new file mode 100644 index 000000000..f6e5993c8 --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 4" + date="2011-10-17T20:36:51Z" + content=""" +Ok, after pushing the \"git-annex\" branch to origin, then \"git annex status\" knows all repositories on all hosts, so that part makes sense now. Thanks for the tip. But the \"git annex map\" output hasn't changed. + + + +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment b/doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment new file mode 100644 index 000000000..77a2c4adb --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 5" + date="2011-10-18T04:59:13Z" + content=""" +I think: + +* The first extra edge is because bucket had \"ssh://psychosis.foo.com/vid/\", while +bacon had \"ssh://psychosis.foo.com/vid\" with no trailing slash. That got lost in the hostname/path editing I did, sorry. +Maybe those should be considered matching? +* The second extra edge is because, when running \"git annex map\" from psychosis, it doesn't recognize the remote's +remote URL as pointing back to itself. + +For the second case, after the \"spurious\" SSH, it could still recognize that the repositories are the same by the duplicated annex uuid, which currently shows up in `map.dot` twice. I wonder what it would take to avoid the spurious SSH -- maybe some config that lists \"alternate\" URLs that should be considered the same as the current repository? Or actually list URLs in uuid.log? Fortunately, I think this only affects the map, so it's not a big problem. +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment b/doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment new file mode 100644 index 000000000..412937f3f --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-10-22T01:18:27Z" + content=""" +Hmm, I don't see the spurious ssh edge in the dot file -- that is, I don't see any ssh:// uris in it? +"""]] diff --git a/doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment b/doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment new file mode 100644 index 000000000..85ede3a89 --- /dev/null +++ b/doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 7" + date="2011-10-22T05:25:47Z" + content=""" +I think that's because the SSH was successful (I entered the password and let it connect), so it got the UUID and put that in the .dot instead. The same UUID (for psychosis) then ended up in two different \"subgraph\" stanzas, and Graphviz just plotted them together as one node. + +

Maybe this will clarify: + +

On psychosis, run \"git annex map\" and press ^C at the ssh password prompt: [map-nossh.dot](http://jim.sh/~jim/tmp/map-nossh.dot) +![Map](http://jim.sh/~jim/tmp/map-nossh.png) + +

On psychosis, run \"git annex map\" and type the correct password: [map-goodssh.dot](http://jim.sh/~jim/tmp/map-goodssh.dot) +![Map](http://jim.sh/~jim/tmp/map-goodssh.png) + +As I see it: + +* psychosis (\"localhost\") connects to each of its remotes +* some of them point back to ssh://psychosis +* psychosis doesn't know that ssh://psychosis is itself, so it tries to connect +* if successful: + * psychosis gets put twice in the .dot as if it was two different hosts, one \"local\" and one \"ssh://psychosis\" + * graphviz recognizes it as the same node because the UUID is the same, but graphviz still draws the extra connecting lines +* if unsuccessful: + * ssh://psychosis is shown as an additional host that can't be reached +"""]] diff --git a/doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn b/doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn new file mode 100644 index 000000000..bfc1a6272 --- /dev/null +++ b/doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn @@ -0,0 +1,25 @@ +I've been syncronizing my data since long time, mainly using rsync or unison. Thus I had two 3.5Gb datasets set1 (usb drive, hfs+ partition) and set2 (hdd, ext4 ubuntu 13.04 box) which differed only in 50Mb (new on set1 ). This was double checked using diff -r before doing anything. + +I created a git annex repo in direct mode for set2 from command line, and after that I let the assistant scan it. +After that created the repo for set1 and added it to the assistant. I think here comes my mistake (I think). + +Instead of keeping them apart, at told assistant to sync with set2. +Why I think this was a mistake? Because set2 was indexed and set1 no, and I'm seeing a lot of file moving a copying, which in my humble opinion should not happen. +What I expected it only the difference to be transferred from set1 to set2. +What it seems to be doing is moving away all content in set1, and copying it back from set2. I think it will end correctly, but with a lot of unnecessary and risky operations. + +I think I should have independently added both datasets, let them be scanned and then connect to each other. +So, now the questions: + +1. Is that the correct way to proceed? +2. What if I have to identical files with different modifying times, I hope they are not synced, right? +3. Is it posssible to achieve this behaviour of copying only the 50Mb? + +Thanks in advance and keep up the good work. +Best regards, + Juan + +EDIT: a couple of questions more: + +4. after finishing, set2 ended with a lot of symlinks but only in one subfolder. To prevent this should I put numcopies in 2? +5. This data is composed of input datasets and output simulations. Thus, I need to change them often, but not as often as code and in a very partial way (chunks of 50Mb). For me direct mode is the best (or plain git). However, I was wondering, it is possible to drop some files (even in direct mode) and use simlinks instead? diff --git a/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment new file mode 100644 index 000000000..13e2a58d2 --- /dev/null +++ b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-08-23T16:17:58Z" + content=""" +I did something similar for my videos, I've created the repo on one machine add the video files then cloned it on the other machine then reinjected the files in to the cloned repo. + +http://joeyh.name/blog/entry/moving_my_email_archives_and_packages_to_git-annex/ +"""]] diff --git a/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment new file mode 100644 index 000000000..d1e259afd --- /dev/null +++ b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-23T18:23:52Z" + content=""" +If you need to preserve mtimes, or differentiate between files with identical content but different mtimes, neither git nor git-annex is going to do what you want, since git doesn't care about preserving much file metadata. + +As far as importing two sets of files on two computers, the best thing to do is import each, and then let the two sync up. Otherwise, when you're running the assistant it will start downloading the first set you import to the second computer, before the second set is added there, and do extra work. Although once the duplicate files from the second set land in the second git repository, the assistant will avoid any additional redundant transfers. + +(The assistant never *moves* files, if both repositories are configured to be in the default client repository group. It only copies.) + +I don't understand question #1. \"set2 ended with a lot of symlinks but only in one subfolder\" doesn't make sense to me, or rather I could interpret it to mean any of dozen things (none of which seem likely) + +You can `git annex drop` files in direct mode. However, if you're running the assistant, it will try to get them back. You can configure your repository to be in manual mode to prevent the assistant doing that, or not use the assistant, or configure a [[preferred_content]] expression to make the assistant do something more custom like not try to get files located in a \"olddata\" directory. +"""]] diff --git a/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_3_e29bf8b848da04c761dc601ac979ac14._comment b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_3_e29bf8b848da04c761dc601ac979ac14._comment new file mode 100644 index 000000000..d750e9581 --- /dev/null +++ b/doc/forum/correct_way_to_add_two_preexisting_datasets/comment_3_e29bf8b848da04c761dc601ac979ac14._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="comment 3" + date="2013-08-25T13:00:04Z" + content=""" +Thanks. It is very clear now. I think I got it running. I have 2 direct mode copies in my ubuntu box and in the USB drive and one indirect in my ultrabook (small SSD). +What I meant is that even in direct mode, after sync ended, the set I indexed first ended with the contents of a folder in the .git dir using symlinks. But it might have been a leftover of previous attempts. +I think I got confused by the great amount of flexibility it provides. +Thanks. +"""]] diff --git a/doc/forum/could_not_read_from_remote_repository.mdwn b/doc/forum/could_not_read_from_remote_repository.mdwn new file mode 100644 index 000000000..6103bfd36 --- /dev/null +++ b/doc/forum/could_not_read_from_remote_repository.mdwn @@ -0,0 +1,36 @@ +hi, i'm trying to set up my notebook and desktop pc to sync my documents. so i used local computers in the web app as a sync option, but on my notebook i get the following error: + + [2013-11-26 11:29:03 CET] main: Pairing in progress + X11 forwarding request failed + /home/max/.ssh/git-annex-shell: line 4: exec: git-annex-shell: not found + X11 forwarding request failed on channel 0 + /home/max/.ssh/git-annex-shell: line 4: exec: git-annex-shell: not found + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + [2013-11-26 11:29:31 CET] PairListener: Syncing with desk_Private_Dokumente + X11 forwarding request failed on channel 0 + /home/max/.ssh/git-annex-shell: line 4: exec: git-annex-shell: not found + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + + merge: refs/remotes/desk_Private_Dokumente/master - not something we can merge + + merge: refs/remotes/desk_Private_Dokumente/synced/master - not something we can merge + X11 forwarding request failed + /home/max/.ssh/git-annex-shell: line 4: exec: git-annex-shell: not found + X11 forwarding request failed on channel 0 + /home/max/.ssh/git-annex-shell: line 4: exec: git-annex-shell: not found + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + +my desktop succeeded in adding the repository. + +any idea whats going wrong ? + +thanks diff --git a/doc/forum/could_not_read_from_remote_repository/comment_1_27d4d1556a80c06505ed3d8a9422d082._comment b/doc/forum/could_not_read_from_remote_repository/comment_1_27d4d1556a80c06505ed3d8a9422d082._comment new file mode 100644 index 000000000..aaf094693 --- /dev/null +++ b/doc/forum/could_not_read_from_remote_repository/comment_1_27d4d1556a80c06505ed3d8a9422d082._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T20:18:26Z" + content=""" +The problem seems to be on your desktop computer. /home/max/.ssh/git-annex-shell is a script that is created if you install git-annex from the standalone tarball (assuming you're using linux?). It seems that your desktop has that script, but you must have deleted that instalation of git-annex (perhaps you switched to installing it some other way), so the script doesn't work. As long as you have git-annex-shell in your PATH somehow, you can just remove /home/max/.ssh/git-annex-shell +"""]] diff --git a/doc/forum/could_not_read_from_remote_repository/comment_2_cf7d5e231675921c3d98faab3613c92f._comment b/doc/forum/could_not_read_from_remote_repository/comment_2_cf7d5e231675921c3d98faab3613c92f._comment new file mode 100644 index 000000000..6775d9278 --- /dev/null +++ b/doc/forum/could_not_read_from_remote_repository/comment_2_cf7d5e231675921c3d98faab3613c92f._comment @@ -0,0 +1,49 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="Same error after deleting .ssh/git-annex-shell" + date="2014-06-11T15:53:17Z" + content=""" +Hi, + +I get the error before and after I deleted .ssh/git-annex-shell on my Ubuntu desktop: + + janulrimacbook2:Movies juh$ git annex sync + commit ok + pull sokrates.local_Videos + bash: /home/juh/.ssh/git-annex-shell: Datei oder Verzeichnis nicht gefunden + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + failed + push sokrates.local_Videos + bash: /home/juh/.ssh/git-annex-shell: Datei oder Verzeichnis nicht gefunden + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + + Pushing to sokrates.local_Videos failed. + + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config) + failed + git-annex: sync: 2 failed + +Git-annex version on macbook: + + git-annex version: 5.20140605-gc2add53 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +Git-annex version on Ubuntu desktop: + + git-annex version: 5.20140517 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +"""]] diff --git a/doc/forum/differenc_in_webapp_icons__63__.mdwn b/doc/forum/differenc_in_webapp_icons__63__.mdwn new file mode 100644 index 000000000..3b4f355a1 --- /dev/null +++ b/doc/forum/differenc_in_webapp_icons__63__.mdwn @@ -0,0 +1,4 @@ +Hi, + +I'm wondering what the difference between the network signal and network sync icons are in the web-app? Nothing stands out to me why some repos have one some the other? + diff --git a/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment b/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment new file mode 100644 index 000000000..69777eaff --- /dev/null +++ b/doc/forum/differenc_in_webapp_icons__63__/comment_1_c38e2692b13a1b76777bf88312a03966._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-26T23:03:46Z" + content=""" +The signal icon shows when there's a direct connection to another repositoriry. This leats your repository immediately learn when there is a change, triggering a sync. Without any signal icons, there's no fast syncing when changes are made, so the webapp will prompt for you to set up such a connection. +"""]] diff --git a/doc/forum/do_not_use_git-annex_inside_your_Dropbox.mdwn b/doc/forum/do_not_use_git-annex_inside_your_Dropbox.mdwn new file mode 100644 index 000000000..266990344 --- /dev/null +++ b/doc/forum/do_not_use_git-annex_inside_your_Dropbox.mdwn @@ -0,0 +1,5 @@ +Do not place git-annex enabled git repository inside your Dropbox folder! + +You will encounter broken symlinks and git-annex complaining about lost files. Dropbox [doesn't preserve case of file names](https://www.dropbox.com/help/145/en) and this breaks storage of annexed files (.git/annex/objects/). For possible recovery see . + + diff --git a/doc/forum/do_not_use_git-annex_inside_your_Dropbox/comment_1_5a1dc9da6e6861829e321446ec7991ee._comment b/doc/forum/do_not_use_git-annex_inside_your_Dropbox/comment_1_5a1dc9da6e6861829e321446ec7991ee._comment new file mode 100644 index 000000000..d5da4f000 --- /dev/null +++ b/doc/forum/do_not_use_git-annex_inside_your_Dropbox/comment_1_5a1dc9da6e6861829e321446ec7991ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="sascha" + ip="2a02:8108:5c0:3ec:615a:1ac3:c7b9:a3a9" + subject="so how can i keep in sync a dropbox subfolder with a usbdrive" + date="2014-01-24T04:32:38Z" + content=""" +my usecase is i want to be able to be working on other computers on files that i have on my thumb-usb-drive. Back home i want to sync changes back to the subfolder of my local Dropbox-directory. Any suggestions? +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp.mdwn b/doc/forum/dot_git_slash_annex_slash_tmp.mdwn new file mode 100644 index 000000000..5f1262c7a --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp.mdwn @@ -0,0 +1,5 @@ +When I was checking out disk usage on my home directory, I noticed a bunch of files stored in .git/annex/tmp under their own filenames, rather than in .git/annex/objects. Checking a couple, they seem to be redundant with stuff in .git/annex/objects. + +Is there any way to clean that stuff up? Will the assistant eventually clean it up? + +Thanks! diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_10_14b74438bb1e3e02cff7926d774ba09a._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_10_14b74438bb1e3e02cff7926d774ba09a._comment new file mode 100644 index 000000000..fe7a71dcb --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_10_14b74438bb1e3e02cff7926d774ba09a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 10" + date="2013-06-06T13:16:50Z" + content=""" +Huh, at some point this happened again. Ended up with 8 gigs of files in that tmp dir. Cleaning out again. Yay, disk space! +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_11_b1f717342c1c8ea42a451caa2d936622._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_11_b1f717342c1c8ea42a451caa2d936622._comment new file mode 100644 index 000000000..c882a8573 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_11_b1f717342c1c8ea42a451caa2d936622._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="stoile" + ip="2a01:198:242:0:219:66ff:fef2:c021" + subject="Same problem here" + date="2013-11-16T12:10:55Z" + content=""" +I got the same problem on linux. Under what circumstances does \"git annex unused\" not find files in .git/annex/tmp? Maybe it is possible to improve \"git annex unused\"... +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_12_e2c6ad99333018c8c46e736da416b8ef._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_12_e2c6ad99333018c8c46e736da416b8ef._comment new file mode 100644 index 000000000..153a617b5 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_12_e2c6ad99333018c8c46e736da416b8ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Wow. Found >180 GB of data in annex/tmp" + date="2013-11-24T21:53:29Z" + content=""" +… no wonder my disk was filling up. On Mac OS X 10.9… +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_13_35ae9d6bcb8d9762a92e3564b686ed72._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_13_35ae9d6bcb8d9762a92e3564b686ed72._comment new file mode 100644 index 000000000..0cbeb8f5e --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_13_35ae9d6bcb8d9762a92e3564b686ed72._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 13" + date="2013-12-12T20:01:09Z" + content=""" +The people who are apparently still having this problem need to provide details about the names of the files in the temp directory. Otherwise, I cannot fix whatever problem you are encountering. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_14_92b1e8956513dbf52da31cec3f58e2c5._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_14_92b1e8956513dbf52da31cec3f58e2c5._comment new file mode 100644 index 000000000..b84e663cc --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_14_92b1e8956513dbf52da31cec3f58e2c5._comment @@ -0,0 +1,104 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 14" + date="2014-04-04T11:07:31Z" + content=""" +I just discovered there were 30GB in this tmp directory. Here are the file names. It seems that the file names are partial (they are missing some characters: it seems most file names are missing the last 16 characters and the file extension). As I'm in dire need of disk space, I'm going to delete this files now. + + schmitta@top-wifi ~/D/a/.g/a/tmp (GIT_DIR!)> pwd + /Users/schmitta/Documents/annex/.git/annex/tmp + schmitta@top-wifi ~/D/a/.g/a/tmp (GIT_DIR!)> ls -al + total 73802184 + drwxr-xr-x 91 schmitta staff 3094 16 mar 11:15 . + drwxr-xr-x 34 schmitta staff 1156 4 avr 12:58 .. + -r--r--r--@ 6 schmitta staff 132882914 8 déc 20:17 12426. + -r--r--r--@ 6 schmitta staff 113471066 8 déc 20:15 12426.2- + -r--r--r--@ 6 schmitta staff 148673586 8 déc 20:24 12427. + -r--r--r--@ 6 schmitta staff 96197733 8 déc 20:09 12427.2- + -r--r--r--@ 6 schmitta staff 132882914 8 déc 20:17 12489. + -r--r--r--@ 6 schmitta staff 113471066 8 déc 20:15 12489.2- + -r--r--r--@ 6 schmitta staff 148673586 8 déc 20:24 12490. + -r--r--r--@ 6 schmitta staff 96197733 8 déc 20:09 12490.2- + -r--r--r--@ 6 schmitta staff 132882914 8 déc 20:17 12498. + -r--r--r--@ 6 schmitta staff 113471066 8 déc 20:15 12498.2- + -r--r--r--@ 6 schmitta staff 148673586 8 déc 20:24 12499. + -r--r--r--@ 6 schmitta staff 96197733 8 déc 20:09 12499.2- + -r--r--r--@ 6 schmitta staff 132882914 8 déc 20:17 12504. + -r--r--r--@ 6 schmitta staff 113471066 8 déc 20:15 12504.2- + -r--r--r--@ 6 schmitta staff 148673586 8 déc 20:24 12505. + -r--r--r--@ 6 schmitta staff 96197733 8 déc 20:09 12505.2- + -r--r--r--@ 6 schmitta staff 132882914 8 déc 20:17 12562. + -r--r--r--@ 6 schmitta staff 113471066 8 déc 20:15 12562.2- + -r--r--r--@ 6 schmitta staff 148673586 8 déc 20:24 12563. + -r--r--r--@ 6 schmitta staff 96197733 8 déc 20:09 12563.2- + -r--r--r-- 2 schmitta staff 1237391994 21 déc 19:27 BTSM With Flowerchild Li562 + -r--r--r-- 2 schmitta staff 1097868668 18 déc 13:24 BTSM with Flowerchild 562 + -r--r--r-- 3 schmitta staff 181962494 1 déc 05:19 Cosmos - A Personal Voyage - Episod422 + -r--r--r-- 3 schmitta staff 199341564 17 déc 14:28 Cosmos - A Personal Voyage - Episod423 + -r--r--r-- 3 schmitta staff 196677905 9 jan 08:36 Cosmos - A Personal Voyage - Episod424 + -r--r--r-- 3 schmitta staff 196671683 26 déc 19:36 Cosmos - A Personal Voyage - Episod425 + -r--r--r-- 3 schmitta staff 199297657 19 jan 14:33 Cosmos - A Personal Voyage - Episod426 + -r--r--r-- 3 schmitta staff 194250261 18 jan 17:10 Cosmos - A Personal Voyage - Episod427 + -r--r--r-- 3 schmitta staff 216726281 16 jan 16:26 Cosmos - A Personal Voyage - Episod428 + -r--r--r-- 3 schmitta staff 204634401 16 jan 12:17 Cosmos - A Personal Voyage - Episod429 + -r--r--r-- 3 schmitta staff 179412519 11 jan 11:29 Cosmos - A Personal Voyage - Episod430 + -r--r--r-- 3 schmitta staff 181962494 1 déc 05:19 Cosmos - A Personal Voyage - Episod572 + -r--r--r-- 3 schmitta staff 199341564 17 déc 14:28 Cosmos - A Personal Voyage - Episod573 + -r--r--r-- 3 schmitta staff 196677905 9 jan 08:36 Cosmos - A Personal Voyage - Episod574 + -r--r--r-- 3 schmitta staff 196671683 26 déc 19:36 Cosmos - A Personal Voyage - Episod575 + -r--r--r-- 3 schmitta staff 199297657 19 jan 14:33 Cosmos - A Personal Voyage - Episod576 + -r--r--r-- 3 schmitta staff 194250261 18 jan 17:10 Cosmos - A Personal Voyage - Episod577 + -r--r--r-- 3 schmitta staff 216726281 16 jan 16:26 Cosmos - A Personal Voyage - Episod578 + -r--r--r-- 3 schmitta staff 204634401 16 jan 12:17 Cosmos - A Personal Voyage - Episod579 + -r--r--r-- 3 schmitta staff 179412519 11 jan 11:29 Cosmos - A Personal Voyage - Episod580 + -r--r--r-- 3 schmitta staff 237284500 15 mai 2012 Cosmos - A Personal Voyage - Episode422 + -r--r--r-- 3 schmitta staff 207386296 28 jan 18:39 Cosmos - A Personal Voyage - Episode423 + -r--r--r-- 3 schmitta staff 194659898 28 jan 20:35 Cosmos - A Personal Voyage - Episode424 + -r--r--r-- 3 schmitta staff 221944244 11 jan 07:18 Cosmos - A Personal Voyage - Episode425 + -r--r--r-- 3 schmitta staff 237284500 15 mai 2012 Cosmos - A Personal Voyage - Episode572 + -r--r--r-- 3 schmitta staff 207386296 28 jan 18:39 Cosmos - A Personal Voyage - Episode573 + -r--r--r-- 3 schmitta staff 194659898 28 jan 20:35 Cosmos - A Personal Voyage - Episode574 + -r--r--r-- 3 schmitta staff 221944244 11 jan 07:18 Cosmos - A Personal Voyage - Episode575 + -r--r--r-- 1 schmitta staff 166417358 25 nov 08:47 Icy Plays - Kerbal Space Program - Better Than Starting Mann456 + -r--r--r-- 2 schmitta staff 1110410229 28 déc 00:40 Kerbal Space Program - BTSM With Flowerchild Li562 + -r--r--r-- 1 schmitta staff 898936971 26 déc 06:22 Let's Play Minecraft Better Than Wolves Ep 10 _ HARDCORE _ Ooooh le petit mat572 + -r--r--r-- 1 schmitta staff 816306596 27 déc 05:08 Let's Play Minecraft Better Than Wolves Ep 11 _ HARDCORE _ Un peu de cannabis pour le moral 572 + -r--r--r-- 1 schmitta staff 897143936 27 déc 10:42 Let's Play Minecraft Better Than Wolves Ep 12 _ HARDCORE _ Chaud l'enf572 + -r--r--r-- 1 schmitta staff 922364739 29 déc 08:30 Let's Play Minecraft Better Than Wolves Ep 13 _ HARDCORE _ Walking dea572 + -r--r--r-- 1 schmitta staff 1321555505 1 jan 02:15 Let's Play Minecraft Better Than Wolves Ep 14 l HARDCORE l Couvre572 + -r--r--r-- 1 schmitta staff 889592223 5 jan 02:07 Let's Play Minecraft Better Than Wolves Ep 15 l HARDCORE l Pa572 + -r--r--r-- 1 schmitta staff 153571799 6 jan 03:56 Let's Play Minecraft Better Than Wolves Ep 16 l HARDCORE l Point de s572 + -r--r--r-- 1 schmitta staff 1036932250 9 jan 07:36 Let's Play Minecraft Better Than Wolves Ep 17 l HARDCORE l Satané meuh572 + -r--r--r-- 1 schmitta staff 1289798767 11 jan 22:08 Let's Play Minecraft Better Than Wolves Ep 18 l HARDCORE l Un Moulin572 + -r--r--r-- 1 schmitta staff 1582120875 19 jan 15:39 Let's Play Minecraft Better Than Wolves Ep 19 l HARDCORE l Explosion de ca572 + -r--r--r-- 1 schmitta staff 728469432 13 fév 07:02 Let's Play Minecraft Better Than Wolves Ep 2 _ HARDCORE _ Préparation pour l'explorat422 + -r--r--r-- 1 schmitta staff 911653518 22 jan 13:35 Let's Play Minecraft Better Than Wolves Ep 20 l HARDCORE l Minesha572 + -r--r--r-- 1 schmitta staff 1377428597 28 jan 08:43 Let's Play Minecraft Better Than Wolves Ep 21 l HARDCORE l Terreur en sous-sol o_O !572 + -r--r--r-- 1 schmitta staff 1376224927 4 fév 03:24 Let's Play Minecraft Better Than Wolves Ep 22 l HARDCORE l Machinerie infern572 + -r--r--r-- 1 schmitta staff 1102293665 13 fév 03:56 Let's Play Minecraft Better Than Wolves Ep 23 l HARDCORE l Piston chenil572 + -r--r--r-- 1 schmitta staff 1835677068 19 fév 09:14 Let's Play Minecraft Better Than Wolves Ep 24 l HARDCORE l Piston chenille et o_Oce572 + -r--r--r-- 1 schmitta staff 753740284 30 déc 19:31 Let's Play Minecraft Better Than Wolves Ep 3 _ HARDCORE _ First pioche en fer422 + -r--r--r-- 1 schmitta staff 1019022279 30 déc 18:38 Let's Play Minecraft Better Than Wolves Ep 5 _ HARDCORE _ Fonderie super desi572 + -r--r--r-- 1 schmitta staff 788714805 30 déc 17:47 Let's Play Minecraft Better Than Wolves Ep 6 _ HARDCORE _ Minage de la mor572 + -r--r--r-- 1 schmitta staff 778987710 23 déc 19:56 Let's Play Minecraft Better Than Wolves Ep 7 _ HARDCORE _ Diamant572 + -r--r--r-- 1 schmitta staff 644564981 23 déc 23:06 Let's Play Minecraft Better Than Wolves Ep 8 _ HARDCORE _ Et le poulet ma572 + -r--r--r-- 1 schmitta staff 871173289 24 déc 10:44 Let's Play Minecraft Better Than Wolves Ep 9 _ HARDCORE _ Araignée verte de la jun572 + -r--------@ 4 schmitta staff 149520850 14 aoû 2010 OPLSS10-Mc422 + -r--------@ 4 schmitta staff 95020824 14 aoû 2010 OPLSS10-Mc423 + -r--------@ 4 schmitta staff 98980596 1 sep 2010 OPLSS10-Mc424 + -r--------@ 4 schmitta staff 207525348 1 sep 2010 OPLSS10-Mc425 + -r--------@ 4 schmitta staff 149520850 14 aoû 2010 OPLSS10-Mc534 + -r--------@ 4 schmitta staff 95020824 14 aoû 2010 OPLSS10-Mc535 + -r--------@ 4 schmitta staff 98980596 1 sep 2010 OPLSS10-Mc536 + -r--------@ 4 schmitta staff 207525348 1 sep 2010 OPLSS10-Mc537 + -r--------@ 4 schmitta staff 149520850 14 aoû 2010 OPLSS10-Mc572 + -r--------@ 4 schmitta staff 95020824 14 aoû 2010 OPLSS10-Mc573 + -r--------@ 4 schmitta staff 98980596 1 sep 2010 OPLSS10-Mc574 + -r--------@ 4 schmitta staff 207525348 1 sep 2010 OPLSS10-Mc575 + -r--r--r--@ 2 schmitta staff 150781568 10 mar 13:34 XD300-23_68HighlightsAResearchCntAugHuma469 + -r--r--r--@ 2 schmitta staff 145745487 10 mar 13:36 XD300-24_68HighlightsAResearchCntAugHuma469 + -r--r--r--@ 2 schmitta staff 142414085 10 mar 13:36 XD300-25_68HighlightsAResearchCntAugHuma469 + -r--------@ 2 schmitta staff 548973365 7 jan 20:21 laumond-20120119449.mp4 + -r--r--r--@ 2 schmitta staff 1820482781 8 mar 18:15 salt-020131469 +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_15_839e29d41de9dcc8f01dfdc585a51d12._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_15_839e29d41de9dcc8f01dfdc585a51d12._comment new file mode 100644 index 000000000..36ad14e57 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_15_839e29d41de9dcc8f01dfdc585a51d12._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 15" + date="2014-05-19T15:43:52Z" + content=""" +Since version 5.20140517, the git-annex assistant will automatically clean up stale tmp files on startup. + +If not using the assistant, you can do it yourself.. + +So far, all the tmp files people have been kind enough to share the details about with me seem to be created by the assistant when it locks a file down. I know this can result in dangling files if the computer is rebooted while the assistant is in the middle of doing that. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment new file mode 100644 index 000000000..d00f68144 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-29T19:35:41Z" + content=""" +These are partially downloaded files. You can use `git annex unused` to clean them up. The assistant doesn't yet explicitly clean these up, but it does keep retrying (and when possible, resuming) failed downloads until they succeed, at which point the temp file is moved into the objects directory. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_2_f4cc36c493d7c20fbaf949edd38e1252._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_2_f4cc36c493d7c20fbaf949edd38e1252._comment new file mode 100644 index 000000000..8aeaf63cf --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_2_f4cc36c493d7c20fbaf949edd38e1252._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2012-11-29T19:53:33Z" + content=""" +that's odd... these files are on my client machine, and shouldn't be downloaded from anywhere, just uploaded to other places. There are lots and lots of them. + +git-annex unused only found two files, and there are dozens and dozens of these files in my .git/annex/tmp directory. + +Would it be safe to delete them by hand? + +(The only thing I can think of that might e relevant is, some of these have definitely been moved from place to place within my repo. I use \"git mv\" when I do that. Maybe I messed that up somehow, and git-annex thought they had disappeared and needed to be re-downloaded from a remote repo?) + +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_3_69268f8aa29e807a56248f1fac86aa41._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_3_69268f8aa29e807a56248f1fac86aa41._comment new file mode 100644 index 000000000..d9863375a --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_3_69268f8aa29e807a56248f1fac86aa41._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-11-29T20:22:01Z" + content=""" +No, moving files within the repository is unlikely to be related. + +If you can show me what the filenames look like I'll have a much better chance of getting somewhere, since they do not seem to be filenames that `git annex unused` knows how to deal with, and so I don't know what they could be. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_4_0ffb0c803c232a1587f956f16113aeb7._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_4_0ffb0c803c232a1587f956f16113aeb7._comment new file mode 100644 index 000000000..11da78841 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_4_0ffb0c803c232a1587f956f16113aeb7._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 4" + date="2012-11-29T20:33:09Z" + content=""" +They're the full actual filenames (but not directories) of particular files in my repository, sometimes with numeric suffixes (or rather, numbers before the file suffixes), like this: + +746.DS_Store +747.DS_Store +748.DS_Store +749.DS_Store +Birdplane87712.mp4 +Birdplane87713.mp4 +Bodyrock87712.mp4 +Bodyrock87713.mp4 +Dubstep Violin- Lindsey Stirling- Crystallize746.mp4 +Dubstep Violin- Lindsey Stirling- Crystallize87712.mp4 +Dubstep Violin- Lindsey Stirling- Crystallize87713.mp4 +Handlebars (fan video)87712.mp4 +Handlebars (fan video)87713.mp4 +Handlebars (official)87712.mp4 +Handlebars (official)87713.mp4 + +Most of them are videos, and I've moved videos around a lot in my repository, and made some mistakes doing so from time to time when I was first learning git-annex, and fooling around on the command line -- breaking symlinks and figuring out how to fix that with git-annex fix. + +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_5_c303e28825241733d69fca74f2015fc6._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_5_c303e28825241733d69fca74f2015fc6._comment new file mode 100644 index 000000000..60896ab5c --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_5_c303e28825241733d69fca74f2015fc6._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2012-11-29T20:47:36Z" + content=""" +Oh, another stupid thing I might have done -- + +* added files to the repo, and not realizing it might take assistant a while to recognize and add them all, gotten impatient +* added them myself, but did it with \"import\" instead of \"add\" so I was git-annex importing files from *inside* git-annex, with an assistant process running at the same time. + +Might not be relevant, just trying to think of weird things I've done. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_6_3f0b376e37bd092b8d46c46bb1940e35._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_6_3f0b376e37bd092b8d46c46bb1940e35._comment new file mode 100644 index 000000000..0fc7f5c15 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_6_3f0b376e37bd092b8d46c46bb1940e35._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 6" + date="2012-11-29T20:53:34Z" + content=""" +Ah, I think I know what this is. When the assistant notices a new file appear, it makes a hard link in the temp directory to the new file, and waits for it to stop being written to. + +If the hard link is broken before the assistant is done adding the file to the annex, it looks like it could leave the temp file behind. I've committed a change that should avoid that. + +Since some of these are OSX DS_Store files, and the rest have a strange number added (which git-annex did not do), I suspect you moved them into the annexed directory using the OSX Finder or something like that, and whatever was putting them into the directory first wrote them with the names we see here. Then, while git-annex was still processing them, they got renamed. + +I'd say you can safely delete them. +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_7_615641b3dd176d4b3a5bbfb521098e38._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_7_615641b3dd176d4b3a5bbfb521098e38._comment new file mode 100644 index 000000000..20e8b205f --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_7_615641b3dd176d4b3a5bbfb521098e38._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 7" + date="2012-11-29T22:15:11Z" + content=""" +Sounds likely!! I'll get to deleting, and when I get a chance I'll grab your latest commit and recompile. + +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_8_4600fa9234a787004ea0e0dbb36184b9._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_8_4600fa9234a787004ea0e0dbb36184b9._comment new file mode 100644 index 000000000..3325f598a --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_8_4600fa9234a787004ea0e0dbb36184b9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 8" + date="2012-11-29T22:15:55Z" + content=""" +(thanks very much!) +"""]] diff --git a/doc/forum/dot_git_slash_annex_slash_tmp/comment_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment b/doc/forum/dot_git_slash_annex_slash_tmp/comment_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment new file mode 100644 index 000000000..cc996c825 --- /dev/null +++ b/doc/forum/dot_git_slash_annex_slash_tmp/comment_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl2Jj8q2upJL4ZQAc2lp7ugTxJiGtcICv8" + nickname="Michael" + subject="comment 9" + date="2013-02-20T10:23:12Z" + content=""" +I'm seeing this too, and the number being added to the file name is the PID of the git-annex process. +"""]] diff --git a/doc/forum/downloading_from_moodle.mdwn b/doc/forum/downloading_from_moodle.mdwn new file mode 100644 index 000000000..ad38d7f1f --- /dev/null +++ b/doc/forum/downloading_from_moodle.mdwn @@ -0,0 +1,76 @@ +my school uses moodle for our classes. We have to sign in and then manually click to download each file, assignment and video uploaded. I asked the school's tech administrator if there was a direct way I could access the videos through the ssh access they've given us to one of the servers, but he said it wasn't possible. + +when I click on the link shown, the location I see is: http://moodle.jct.ac.il/mod/resource/view.php?id=135374 +Inspect element gives more information. the response from the server is: + + Remote Address:147.161.6.59:80 + Request URL:http://moodle.jct.ac.il/mod/resource/view.php?id=135374 + Request Method:GET + Status Code:303 See Other + Request Headersview source + Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 + Accept-Encoding:gzip,deflate,sdch + Accept-Language:en-US,en;q=0.8,he;q=0.6 + Connection:keep-alive + Cookie:visid_incap_97364=qJx2WaKqQfGidGf9VfM6QWrnlFIAAAAAQUIPAAAAAAC5EXcbt00vqNu9jdVDwEDN; __utma=98014340.1409421308.1381214363.1381214363.1390387318.2; __utmz=98014340.1381214363.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); MoodleSession5771=7s1cfqfo4ahdtmna5h7vserg97; MOODLEID1_5771=%257F%25D39%2522N%25B4%25AFY + DNT:1 + Host:moodle.jct.ac.il + Referer:http://moodle.jct.ac.il/course/view.php?id=20151 + User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36 + Query String Parametersview sourceview URL encoded + id:135374 + Response Headersview source + Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 + Connection:Keep-Alive + Content-Encoding:gzip + Content-Language:he + Content-Length:503 + Content-Type:text/html + Date:Mon, 16 Jun 2014 12:31:22 GMT + Expires:Thu, 19 Nov 1981 08:52:00 GMT + Keep-Alive:timeout=15, max=100 + Location:http://moodle.jct.ac.il/pluginfile.php/288409/mod_resource/content/0/movie%205773/150151.5773.week1.wmv?forcedownload=1 + Pragma:no-cache + Server:Apache/2.2.14 (Ubuntu) + Vary:Accept-Encoding + X-Powered-By:PHP/5.3.2-1ubuntu4.24 + +this then pulls the following: + + Remote Address:147.161.6.59:80 + Request URL:http://moodle.jct.ac.il/pluginfile.php/288409/mod_resource/content/0/movie%205773/150151.5773.week1.wmv?forcedownload=1 + Request Method:GET + Status Code:200 OK + Request Headersview source + Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 + Accept-Encoding:gzip,deflate,sdch + Accept-Language:en-US,en;q=0.8,he;q=0.6 + Connection:keep-alive + Cookie:visid_incap_97364=qJx2WaKqQfGidGf9VfM6QWrnlFIAAAAAQUIPAAAAAAC5EXcbt00vqNu9jdVDwEDN; __utma=98014340.1409421308.1381214363.1381214363.1390387318.2; __utmz=98014340.1381214363.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); MoodleSession5771=7s1cfqfo4ahdtmna5h7vserg97; MOODLEID1_5771=%257F%25D39%2522N%25B4%25AFY + DNT:1 + Host:moodle.jct.ac.il + Referer:http://moodle.jct.ac.il/course/view.php?id=20151 + User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36 + Query String Parametersview sourceview URL encoded + forcedownload:1 + Response Headersview source + Accept-Ranges:bytes + Cache-Control:max-age=86400 + Connection:Keep-Alive + Content-Disposition:attachment; filename="150151.5773.week1.wmv" + Content-Length:1353673203 + Content-Type:application/x-forcedownload + Date:Mon, 16 Jun 2014 12:31:23 GMT + ETag:675e7d2cffd7a79afd8686c59ff2533f9e3508b7 + Expires:Tue, 17 Jun 2014 12:31:23 GMT + Keep-Alive:timeout=15, max=99 + Last-Modified:Fri, 19 Jul 2013 17:06:54 GMT + Pragma: + Server:Apache/2.2.14 (Ubuntu) + X-Powered-By:PHP/5.3.2-1ubuntu4.24 + +when I right-click on the second one in the inspect element window, I can select "copy as cURL" i get: + + curl 'http://moodle.jct.ac.il/pluginfile.php/288409/mod_resource/content/0/movie%205773/150151.5773.week1.wmv?forcedownload=1' -H 'DNT: 1' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8,he;q=0.6' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://moodle.jct.ac.il/course/view.php?id=20151' -H 'Cookie: visid_incap_97364=qJx2WaKqQfGidGf9VfM6QWrnlFIAAAAAQUIPAAAAAAC5EXcbt00vqNu9jdVDwEDN; __utma=98014340.1409421308.1381214363.1381214363.1390387318.2; __utmz=98014340.1381214363.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); MoodleSession5771=7s1cfqfo4ahdtmna5h7vserg97; MOODLEID1_5771=%257F%25D39%2522N%25B4%25AFY' -H 'Connection: keep-alive' --compressed + +if I append " > week1.wmv" to the end of that output it downloads fine. How can I add this file to a git-annex repo? diff --git a/doc/forum/downloading_from_moodle/comment_1_3f677130d268de4288e87cfa86ea055c._comment b/doc/forum/downloading_from_moodle/comment_1_3f677130d268de4288e87cfa86ea055c._comment new file mode 100644 index 000000000..a489859ad --- /dev/null +++ b/doc/forum/downloading_from_moodle/comment_1_3f677130d268de4288e87cfa86ea055c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-16T17:55:13Z" + content=""" +`git annex addurl` does not support storing cookies needed to access files. I doubt that makes sense anyway, since most login cookies expire. + +So, your best bet seems to just be to `git annex add` the file after you download it. +"""]] diff --git a/doc/forum/downloading_from_moodle/comment_2_dcef60ec144f123dadd165fb602ab950._comment b/doc/forum/downloading_from_moodle/comment_2_dcef60ec144f123dadd165fb602ab950._comment new file mode 100644 index 000000000..152900433 --- /dev/null +++ b/doc/forum/downloading_from_moodle/comment_2_dcef60ec144f123dadd165fb602ab950._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-06-16T17:59:20Z" + content=""" +Another option would be to set up some kind of http proxy that adds the login cookie to requests.. If you really wanted to use `git annex addurl`. +"""]] diff --git a/doc/forum/downloading_from_moodle/comment_3_d3efb767bf9b20f96242dcf64817bd4b._comment b/doc/forum/downloading_from_moodle/comment_3_d3efb767bf9b20f96242dcf64817bd4b._comment new file mode 100644 index 000000000..c9b101225 --- /dev/null +++ b/doc/forum/downloading_from_moodle/comment_3_d3efb767bf9b20f96242dcf64817bd4b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-06-16T18:04:48Z" + content=""" +Actually, a simpler option may be to set `annex.http-headers` in the git config, to the appropriate http headers that set the cookie. +"""]] diff --git a/doc/forum/drop_old_versions_of_a_file.mdwn b/doc/forum/drop_old_versions_of_a_file.mdwn new file mode 100644 index 000000000..95f103dcc --- /dev/null +++ b/doc/forum/drop_old_versions_of_a_file.mdwn @@ -0,0 +1,3 @@ +I have a music repository which has multiple versions of a music file(modified id3 tags etc,.) and in my music player same file is showing two times with two different id3 tags, one is from music directory and another is from .git-annex directory which is a older version(which I don't want to see). + +I was just wondering if there is a way I can drop old version of a file in android(direct mode). diff --git a/doc/forum/drop_old_versions_of_a_file/comment_1_799a413248fb8f98efbf226b1bc4300d._comment b/doc/forum/drop_old_versions_of_a_file/comment_1_799a413248fb8f98efbf226b1bc4300d._comment new file mode 100644 index 000000000..09b01c8a8 --- /dev/null +++ b/doc/forum/drop_old_versions_of_a_file/comment_1_799a413248fb8f98efbf226b1bc4300d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-03-10T17:59:01Z" + content=""" +What you're looking for is `git annex unused` and `git annex dropunused` +"""]] diff --git a/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__.mdwn b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__.mdwn new file mode 100644 index 000000000..2fd18f988 --- /dev/null +++ b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__.mdwn @@ -0,0 +1,24 @@ +I have Ubuntu and Debian systems, playing with git-annex. This is not mission critical data, just testing. I ended up with an extra duplicate of the media files on the laptop. + +The whereis listing is lots and lots like this: + +whereis 00-Unsorted/2008-RobustStats-AmerPsyc.pdf (3 copies) + 67e69242-d57c-4b50-aaf9-74876b899962 + 9e0bc9e4-f8bf-11e3-b9c1-9b4158540a9d -- pols110.pols.ku.edu_mediashare ( +pdf and mp3) + d82d2e6f-9200-49cf-86a3-1d674a768971 -- here (pauljohn@dellap14:~/medias +hare) +ok + +(I'm pretty sure) This happened because I copied the media files to /home/pauljohn/mediashare/manuscripts manually, and then I used the git-annex assistant to set up the remote linkage to same content, from the workstation, and it apparently copied in a whole new set. + +How to clean this up? Without erasing everything and starting over? + +Can I guess? + +Open a terminal and git remove manually 67e69242-d57c-4b50-aaf9-74876b899962 ??? + +Thanks in advance if you care to advise me :) + +Paul Johnson +http://pj.freefaculty.org diff --git a/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_1_bb6d749b758b17178227929bf7327fe1._comment b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_1_bb6d749b758b17178227929bf7327fe1._comment new file mode 100644 index 000000000..d528331ce --- /dev/null +++ b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_1_bb6d749b758b17178227929bf7327fe1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="comment 1" + date="2014-06-24T04:24:12Z" + content=""" +You should first try `git-annex unused` and if that doesn't work just `git-annex drop` the unwanted files. +"""]] diff --git a/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_2_d834df30633f7d5569797ee818cf38c3._comment b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_2_d834df30633f7d5569797ee818cf38c3._comment new file mode 100644 index 000000000..1f2cf2ff5 --- /dev/null +++ b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_2_d834df30633f7d5569797ee818cf38c3._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkpIIYg6Fl7OFsOHVPEchZYj68A3dk4lVg" + nickname="Paul" + subject="please explain" + date="2014-07-01T13:45:08Z" + content=""" +Sorry. I just don't understand. +what am I doing wrong? How to remove extra copy: + +

+whereis WaldTest/Vaeth_WaldTest.pdf (3 copies)
+        67e69242-d57c-4b50-aaf9-74876b899962
+        9e0bc9e4-f8bf-11e3-b9c1-9b4158540a9d -- pols110.pols.ku.edu_mediashare (pdf and mp3)
+        d82d2e6f-9200-49cf-86a3-1d674a768971 -- here (pauljohn@dellap14:~/mediashare)
+ok
+pauljohn@dellap14:~/mediashare/manuscripts$ git annex drop 67e69242-d57c-4b50-aaf9-74876b899962
+git-annex: 67e69242-d57c-4b50-aaf9-74876b899962 not found
+pauljohn@dellap14:~/mediashare/manuscripts$ git annex drop WaldTest/67e69242-d57c-4b50-aaf9-74876b899962
+git-annex: WaldTest/67e69242-d57c-4b50-aaf9-74876b899962 not found
+"""]]
diff --git a/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_3_1e02eff33c9fa7bea03aa6d58b910175._comment b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_3_1e02eff33c9fa7bea03aa6d58b910175._comment
new file mode 100644
index 000000000..b0061a9d0
--- /dev/null
+++ b/doc/forum/duplicated_content___40__user_error__41__._How_to_fix__63__/comment_3_1e02eff33c9fa7bea03aa6d58b910175._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.55"
+ subject="comment 3"
+ date="2014-07-03T19:20:49Z"
+ content="""
+\"67e69242-d57c-4b50-aaf9-74876b899962\" is the UUID of a git annnex repository that git-annex has on record as containing the file. Since it does not have a description set (which normally gets done automatically when setting up the repository), and is not one of the remotes of the repository where you ran `git annex whereis`, it's a bit hard to tell what repository that is.
+
+What I would do in this situation is:
+
+1. Look around my computers for a repository with that UUID. You can run this command in a repository to see its uuid: `git config annex.uuid`  
+2. If I found it, I'd run `git annex describe here \"something sensible\"` and maybe set it up as a remote of other repositories and then `git annex drop` the data from it if desired.
+3. If I was unable to find the repository, I might assume it was one I created before, and have removed. Then I'd tell git-annex that: `git annex dead 67e69242-d57c-4b50-aaf9-74876b899962` (if it turns out I was wrong and the repository turns up later, this can always be reversed by running `git annex semitrust 67e69242-d57c-4b50-aaf9-74876b899962`)
+"""]]
diff --git a/doc/forum/empty_directory_handling.mdwn b/doc/forum/empty_directory_handling.mdwn
new file mode 100644
index 000000000..b806b2e2f
--- /dev/null
+++ b/doc/forum/empty_directory_handling.mdwn
@@ -0,0 +1,3 @@
+I've just tried using git annex assistant for the first time, to synchronize a shared directory between machines. This shared directory contains a collection of bare git repositories for various projects. Unfortunately this doesn't seem to work, as to be recognised as valid bare repos, they need to have the ref/heads and ref/tags subdirectories. git annex assistant fails to synchronise these, as they are empty.
+
+What should I do? How can I make git annex reproduce the source directory structure when synchronising?
diff --git a/doc/forum/empty_directory_handling/comment_1_34ac97b9337b6230ed8a4748203fe543._comment b/doc/forum/empty_directory_handling/comment_1_34ac97b9337b6230ed8a4748203fe543._comment
new file mode 100644
index 000000000..edf4984ea
--- /dev/null
+++ b/doc/forum/empty_directory_handling/comment_1_34ac97b9337b6230ed8a4748203fe543._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 1"
+ date="2014-07-02T17:02:31Z"
+ content="""
+This is not a good idea. See 
+"""]]
diff --git a/doc/forum/empty_directory_handling/comment_2_73a39e28d5a09ac342cb4195d263d91e._comment b/doc/forum/empty_directory_handling/comment_2_73a39e28d5a09ac342cb4195d263d91e._comment
new file mode 100644
index 000000000..250c08adf
--- /dev/null
+++ b/doc/forum/empty_directory_handling/comment_2_73a39e28d5a09ac342cb4195d263d91e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmlO6w9_FAVe3v6MdnkePxaTJqp0RPbGhM"
+ nickname="Tim"
+ subject="comment 2"
+ date="2014-07-04T04:00:25Z"
+ content="""
+Thanks - that thread was helpful. I now realise that what I was trying to do was not sensible, and I'll have to work out another approach.
+"""]]
diff --git a/doc/forum/endless_password_prompt_loop.mdwn b/doc/forum/endless_password_prompt_loop.mdwn
new file mode 100644
index 000000000..bfdd3c1db
--- /dev/null
+++ b/doc/forum/endless_password_prompt_loop.mdwn
@@ -0,0 +1,8 @@
+Hi,
+
+I setup a first repository on local disk, it went fine. Next I tried setting up repo on my nas to clone the files. I installed git-annex on the NAS (it's armel arch) and created the repository via webapp, I entered the password once. Git-annex started syncing the remote repo and after few seconds password pop-up hell broke loose. I was flooded with password-prompt pop-up windows. The synchronization was continuing regardless of correctly/incorrectly entered passwords. What's more, these popups grab the keyboard and you cannot do (appropriate word) with your system.
+
+I checked this topic: http://git-annex.branchable.com/forum/ssh_password/ and ssh config is in place on my computer and on the NAS.
+
+What is causing this and how can I get rid of this?
+
diff --git a/doc/forum/endless_password_prompt_loop/comment_1_cceba12ed25cd671c7cee5a28631163e._comment b/doc/forum/endless_password_prompt_loop/comment_1_cceba12ed25cd671c7cee5a28631163e._comment
new file mode 100644
index 000000000..d162ff3e5
--- /dev/null
+++ b/doc/forum/endless_password_prompt_loop/comment_1_cceba12ed25cd671c7cee5a28631163e._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.152.108.193"
+ subject="comment 1"
+ date="2013-06-25T19:49:25Z"
+ content="""
+What version of git-annex? Did more than one password prompt window somehow appear at the same time? What is doing the ssh password prompting, is it ssh-askpass, or something provided by your desktop environment?
+
+What happens if you manually ssh from your computer to the NAS, using the special hostname that git-annex has configured (you can find this hostname in the `.git/config`). `ssh -v` is generally a good way to track these problems down.
+"""]]
diff --git a/doc/forum/endless_password_prompt_loop/comment_2_f0cb86b45eb289f35197c43f83660a8f._comment b/doc/forum/endless_password_prompt_loop/comment_2_f0cb86b45eb289f35197c43f83660a8f._comment
new file mode 100644
index 000000000..45f87d136
--- /dev/null
+++ b/doc/forum/endless_password_prompt_loop/comment_2_f0cb86b45eb289f35197c43f83660a8f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmUcCZeEK9HKV40JrcHMXAXpPKQPERt7iM"
+ nickname="Włodek"
+ subject="comment 2"
+ date="2013-07-10T22:00:47Z"
+ content="""
+Thanks for the answer. I found out that the public key auth is not working at all and ssh falls back to password auth, this is the reason for password prompts. What I don't know yet is why popups appear despite giving correct password. I'm looking for a solution. This can take some time though because my disk died few days ago = I cannot check versions. Once I've got it solved I'll post back.
+"""]]
diff --git a/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__.mdwn b/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__.mdwn
new file mode 100644
index 000000000..a39951bb5
--- /dev/null
+++ b/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__.mdwn
@@ -0,0 +1,17 @@
+for the command:
+
+    $ git annex info
+
+I get the following output:
+
+   repository mode: direct
+   trusted repositories: error: refs/heads/git-annex does not point to a valid object!
+   error: refs/heads/git-annex does not point to a valid object!
+   error: invalid object 100644 993859515190743e9bed7fc8e697d5ac4e2d03a0 for '01d/56e/SHA256E-s209799168--cb8450b63c699c5f8fb121e51ed7e387258d57c851b256af0e5ceeae9542ffd8.me.avi.log'
+   fatal: git-write-tree: error building trees
+   git-annex: failed to read sha from git write-tree
+
+Please help,
+Yuval Langer.
+
+BTW, the code formatting is kinda weird. Could you help with that as well?
diff --git a/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__/comment_1_d370b044da3bfebf9e4c90ce1e243587._comment b/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__/comment_1_d370b044da3bfebf9e4c90ce1e243587._comment
new file mode 100644
index 000000000..cf7601d40
--- /dev/null
+++ b/doc/forum/error:_refs__47__heads__47__git-annex_does_not_point_to_a_valid_object__33__/comment_1_d370b044da3bfebf9e4c90ce1e243587._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 1"
+ date="2014-05-15T20:22:40Z"
+ content="""
+This means that a git commit's data has gotten lost somehow. You can verify that by trying
+
+    git show 993859515190743e9bed7fc8e697d5ac4e2d03a0
+
+The most common reason for this to happen is if the system is shutdown unexpectedly while git-annex is running. Or, if this repository is on a removable drive, if it got removed before the data could be written.
+
+You can probably fix the problem by running:
+
+    git annex repair
+
+(Code formatting: Use 4 spaces.)
+"""]]
diff --git a/doc/forum/error_in_installation_of_base-4.5.0.0.mdwn b/doc/forum/error_in_installation_of_base-4.5.0.0.mdwn
new file mode 100644
index 000000000..673222ed6
--- /dev/null
+++ b/doc/forum/error_in_installation_of_base-4.5.0.0.mdwn
@@ -0,0 +1,14 @@
+Hi,
+
+I was trying to install git-annex, but then, I got a warning saying that I need to install base-4.5.0.0 first.
+
+So, I did "sudo cabal install base-4.5.0.0". Everything was going well, until I got this error:
+
+config.status: error: cannot find input file: `base.buildinfo.in'
+cabal: Error: some packages failed to install:
+base-4.5.0.0 failed during the configure step. The exception was:
+ExitFailure 1
+
+I tried to look for information on the internet, but I did not find anything useful.
+
+I know that this is not totally related to git-annex, but anyone has any thoughts on this?
diff --git a/doc/forum/error_in_installation_of_base-4.5.0.0/comment_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment
new file mode 100644
index 000000000..5a52a28ab
--- /dev/null
+++ b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 1"
+ date="2012-04-22T05:39:28Z"
+ content="""
+git-annex needs ghc 7.4, that's why it depends on that base version that comes with it. So you either need to upgrade your ghc, or you can build from the `ghc7.0` branch in [[git|download]], like this:
+
+
+git clone git://git-annex.branchable.com/ git-annex
+cd git-annex
+git checkout ghc7.0
+cabal update
+cabal install --only-dependencies
+cabal configure
+cabal build
+cabal install --bindir=$HOME/bin
+
+"""]] diff --git a/doc/forum/error_in_installation_of_base-4.5.0.0/comment_2_3badd64e48fbb174cd7de1ac9589bedf._comment b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_2_3badd64e48fbb174cd7de1ac9589bedf._comment new file mode 100644 index 000000000..3ad1a1138 --- /dev/null +++ b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_2_3badd64e48fbb174cd7de1ac9589bedf._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 2" + date="2012-04-22T14:09:33Z" + content=""" +Thanks for the fast response! + +Unfortunately, I had another problem: + +================================== +Building git-annex-3.20120419... +Utility/libdiskfree.c: In function ‘diskfree’: + +Utility/libdiskfree.c:61:0: + warning: ‘statfs64’ is deprecated (declared at /usr/include/sys/mount.h:379) +[ 6 of 157] Compiling Build.SysConfig ( Build/SysConfig.hs, dist/build/git-annex/git-annex-tmp/Build/SysConfig.o ) +[ 15 of 157] Compiling Utility.Touch ( dist/build/git-annex/git-annex-tmp/Utility/Touch.hs, dist/build/git-annex/git-annex-tmp/Utility/Touch.o ) + +Utility/Touch.hsc:118:21: Not in scope: `noop' +cabal: Error: some packages failed to install: +git-annex-3.20120419 failed during the building phase. The exception was: +ExitFailure 1 +================================== + +I also tried to look for information on the internet, and I did not find anything useful. +Any idea of what happened? + +Thanks again! + +"""]] diff --git a/doc/forum/error_in_installation_of_base-4.5.0.0/comment_3_d8190061ac1c683a7b699cf42e9db694._comment b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_3_d8190061ac1c683a7b699cf42e9db694._comment new file mode 100644 index 000000000..d9de5089e --- /dev/null +++ b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_3_d8190061ac1c683a7b699cf42e9db694._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-04-22T15:23:26Z" + content=""" +That's my fault, I made a change last night that caused the noop problem. Fixed now. +"""]] diff --git a/doc/forum/error_in_installation_of_base-4.5.0.0/comment_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment new file mode 100644 index 000000000..ba9933451 --- /dev/null +++ b/doc/forum/error_in_installation_of_base-4.5.0.0/comment_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 4" + date="2012-04-22T16:08:55Z" + content=""" +Thanks, it worked now! +"""]] diff --git a/doc/forum/example_of_massively_disconnected_operation.mdwn b/doc/forum/example_of_massively_disconnected_operation.mdwn new file mode 100644 index 000000000..00a5d8d6c --- /dev/null +++ b/doc/forum/example_of_massively_disconnected_operation.mdwn @@ -0,0 +1,33 @@ +I found this archival drive that had been offline since October 26th 2010. Since I released git-annex 0.02 on October 27th, this must have been made using the very first release of git-annex, ever. + +So, I synced it back up! :) --[[Joey]] + +
+commit 4151f4595fe6205d4aed653617ab23eb3335130a
+Author: Joey Hess 
+Date:   Tue Oct 26 02:18:03 2010 -0400
+
+joey> git pull
+remote: Counting objects: 428782, done.
+remote: Compressing objects: 100% (280714/280714), done.
+remote: Total 416692 (delta 150923), reused 389593 (delta 125143)
+Receiving objects: 100% (416692/416692), 44.71 MiB | 495 KiB/s, done.
+Resolving deltas: 100% (150923/150923), completed with 818 local objects.
+ * [new branch]      git-annex  -> origin/git-annex
+   1893f9c..9ebcc0e  master     -> origin/master
+Updating 1893f9c..9ebcc0e
+Checking out files: 100% (76884/76884), done.
+joey> git annex version
+git-annex version: 3.20110611
+local repository version: unknown
+default repository version: 3
+supported repository versions: 3
+upgrade supported from repository versions: 0 1 2
+joey> git config annex.version 0
+joey> git annex upgrade
+upgrade . (v0 to v1...) (v1 to v2) (moving content...) (updating symlinks...)  (moving location logs...) (v2 to v3) (merging origin/git-annex into git-annex...)
+
+  git-annex branch created
+  Be sure to push this branch when pushing to remotes.
+ok
+
diff --git a/doc/forum/exclude_files_from_annex.mdwn b/doc/forum/exclude_files_from_annex.mdwn new file mode 100644 index 000000000..c1707afb1 --- /dev/null +++ b/doc/forum/exclude_files_from_annex.mdwn @@ -0,0 +1,10 @@ +I'm wanting to do essentially [[/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/]], that is prevent git-annex from annexing certain files (by extension), and rather manage them in git only. + +This seems to work fine, and the assistant auto-adds them to git, and commits when I make changes, when in indirect mode. + +However, in a direct mode repository, then the files are automatically annexed, and even if I create them in an indirect repo, and then change it, they are annexed. + +Is this expected behaviour? Does the annex.largefiles setting only make sense in indirect mode? + + +--Walter diff --git a/doc/forum/exclude_files_from_annex/comment_1_82e7de5e631bae3b347815586274a936._comment b/doc/forum/exclude_files_from_annex/comment_1_82e7de5e631bae3b347815586274a936._comment new file mode 100644 index 000000000..23ad6aac9 --- /dev/null +++ b/doc/forum/exclude_files_from_annex/comment_1_82e7de5e631bae3b347815586274a936._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T20:29:14Z" + content=""" +I don't seem to be seeing the problem you describe in direct mode: + +[[!format sh \"\"\" + +joey@gnu:~/tmp/r2>git init +joey@gnu:~/tmp/r2>git annex init +joey@gnu:~/tmp/r2>git config annex.largefiles \"largerthan=100kb and not (include=*.c or include=*.h)\" +joey@gnu:~/tmp/r2>git annex direct +joey@gnu:~/tmp/r2>git annex assistant +joey@gnu:~/tmp/r2>dd if=/dev/urandom of=bigfile bs=1M count=1 +1+0 records in +1+0 records out +joey@gnu:~/tmp/r2>echo \"main() { printf(\"hello, world!\n\") }\" > hello.c +\"\"\"]] + +At that point, the bigfile was annexed, and the hello.c file was checked into git as a regular file. + +Are you sure you have annex.largefiles correctly configured to exclude the files you don't want to be annexed? +"""]] diff --git a/doc/forum/exclude_files_from_annex/comment_2_03d4599fdceb3dff184eed82824674bc._comment b/doc/forum/exclude_files_from_annex/comment_2_03d4599fdceb3dff184eed82824674bc._comment new file mode 100644 index 000000000..7d8f6ce77 --- /dev/null +++ b/doc/forum/exclude_files_from_annex/comment_2_03d4599fdceb3dff184eed82824674bc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 2" + date="2013-05-19T21:35:37Z" + content=""" +This seems to have stopped happening, after I installed a newer version (from git) of git-annex. + +I might try and recreate it later, but for now it seems to work as expected. + +Thanks for your help. +"""]] diff --git a/doc/forum/expire_files__44___move_to_other_hosts.mdwn b/doc/forum/expire_files__44___move_to_other_hosts.mdwn new file mode 100644 index 000000000..9ead2f899 --- /dev/null +++ b/doc/forum/expire_files__44___move_to_other_hosts.mdwn @@ -0,0 +1,19 @@ +Before turning this into a 'todo' item i'd like to discuss the possibilities... + +The idea is following: + +Having a Laptop with a rather small SSD or some other mobile device i'd like to move files away which are not needed anymore. +The first thing is that the --to destination should be semi-automatically choosen, including ensuring enough replicas + + git annex move --away + +should pick remotes which are suitable (either by configuration and/or other rules like disk utilization on the remote side). + +I am rather new to git-annex and wondering if there is currently already something which gives similar results, esp not need to hand pick the remotes where to move files. + +Further on there needs to be some way to find out which files are not needed anymore. On a first thought filtering by 'atime' would be nice, but nowadays mounting with noatime/relatime is common which would make this infeasible. To accomplish this, the assistant could (optionally) manage a lazy-atime by setting inotify or fanotify watches on all annexed files in a repository (close_nowrite) and queue/batch atime updates coarsely together. Then atimes on disk are only lazily updated (after some time expires, when the queue becomes full or at shutdown of the assistant), we can afford to loose some atime updates here in case of unexpected shutdowns (i rather wonder why the kernel has no lazy-atime option). + +Then the assistant (or by crontab) one can schedule some regular maintenance. There are certainly plenty of options to consider here, for example a mobile device might prefer only to send files if connected to Wlan, someone wants to move files away until a certain threshold of free disk space is reached etc... + +While at this, the assistant could also watch (fanotify) if someone tries to open a not available (dead symlinked) file, block that request, get the file and then proceed with the request. + diff --git a/doc/forum/expire_files__44___move_to_other_hosts/comment_1_ddcc2a00be1ae96a352d75a443458bcf._comment b/doc/forum/expire_files__44___move_to_other_hosts/comment_1_ddcc2a00be1ae96a352d75a443458bcf._comment new file mode 100644 index 000000000..a23a21494 --- /dev/null +++ b/doc/forum/expire_files__44___move_to_other_hosts/comment_1_ddcc2a00be1ae96a352d75a443458bcf._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T19:14:25Z" + content=""" +I think that you're conflating two different features. + +First, there's the question of determining which remotes should store a file. The [[preferred_content]] expressions are a way to let the user define this in a way that makes sense for their setup. There's also the annex.diskreserve setting, to allow a remote to reject a file if it doesn't have space. The git-annex assistant can automatically apply those, and arrange to transfer files to all remotes that want a copy. Or you can do it on the command line using --auto. Perhaps it would be nice to have a `git annex copy --auto --to any`, to avoid needing to run copy multiple times to send to different remotes. + +Second, there's the concept of expiring files. I don't think relatime would prevent using atime for this (git-annex could just set the atime to 0 when it first gets a file to work around relatime), and I don't like the idea of inotify watching all files just to work around noatime. I suppose that the preferred content expressions could have an atime check operation added to them. Although I guess you could just as well use `find`.. + +(Finally, I don't think there's a good way to block processes that are trying to open files that are not there, without using FuSE. And I don't know that a system that could block any program indefinitely waiting on some large files being pulled down from wherever would be one I'd want to use. This has prevented me from going down that path so far.) +"""]] diff --git a/doc/forum/expire_files__44___move_to_other_hosts/comment_2_7a4c3858c5eae409d04de3f9da43b57e._comment b/doc/forum/expire_files__44___move_to_other_hosts/comment_2_7a4c3858c5eae409d04de3f9da43b57e._comment new file mode 100644 index 000000000..ea1e68074 --- /dev/null +++ b/doc/forum/expire_files__44___move_to_other_hosts/comment_2_7a4c3858c5eae409d04de3f9da43b57e._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="comment 2" + date="2013-07-30T20:29:11Z" + content=""" +I agree here are even more than 2 features involved. + +I'd appreciate a 'git annex copy --auto --to any' like feature. The point is that this should not only copy data until diskreserve is hit but distribute data in some (configureable) way around all remotes. Preferred content is one part of that, available disksize another. The user might also choose destinations depending on location and bandwidth and balance load over multiple servers until enough replicas are distributed. Details have to be worked out. + +Expiring content is another thing, i also thinking its most likely improper to add some atime watching thing to git-annex. Instead of that I am thinking to write a dedicated daemon which handles atime updates in userspace, this then could add some more rules to ignore accesses by other system tools (file indexers, users, etc). This makes such a expire facility completely independent from git annex and a user can choose if/what he likes. + +Filtering out files which are not accessed recently can then be done by 'find' or something similar and piped into 'git annex move/copy/drop'. + +And for your final note: fanotify can block accesses to files, it might be a bit ugly and certainly this is not for everyone, perhaps this could be externalized into some watching daemon too or if integrated to git-annex be treated very carefully and only be used if explicitly configured. + +"""]] diff --git a/doc/forum/exporting_annexed_files.mdwn b/doc/forum/exporting_annexed_files.mdwn new file mode 100644 index 000000000..0b8d6f36b --- /dev/null +++ b/doc/forum/exporting_annexed_files.mdwn @@ -0,0 +1,4 @@ +Is there an easy way to export annexed files out of the repository? (e.g. to make a copy elsewhere, send a file by email...) + +Thanks, +Denis. diff --git a/doc/forum/exporting_annexed_files/comment_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment b/doc/forum/exporting_annexed_files/comment_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment new file mode 100644 index 000000000..69fc46245 --- /dev/null +++ b/doc/forum/exporting_annexed_files/comment_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.135" + subject="comment 1" + date="2012-06-15T19:25:59Z" + content=""" +Sure, you can simply: + + cp annexedfile ~ + +Or just attach the file right from the git repository to an email, like any other file. Should work fine. + +If you wanted to copy a whole directory to export, you'd need to use the -L flag to make cp follow the symlinks and copy the real contents: + + cp -r -L annexeddirectory /media/usbdrive/ +"""]] diff --git a/doc/forum/exporting_annexed_files/comment_2_15dc3024417b5b2ff3544a08beacab34._comment b/doc/forum/exporting_annexed_files/comment_2_15dc3024417b5b2ff3544a08beacab34._comment new file mode 100644 index 000000000..3621f9b89 --- /dev/null +++ b/doc/forum/exporting_annexed_files/comment_2_15dc3024417b5b2ff3544a08beacab34._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://denis.laxalde.org/" + nickname="dlax" + subject="nautilus" + date="2012-06-15T19:57:31Z" + content=""" +Ah! I was fooled by nautilus which is not able to properly handle symlinks when copying. It copies links instead of target [[!gnomebug 623580]]. +"""]] diff --git a/doc/forum/exporting_annexed_files/comment_3_86f0e0f767a84a0f583e121d36cb7d48._comment b/doc/forum/exporting_annexed_files/comment_3_86f0e0f767a84a0f583e121d36cb7d48._comment new file mode 100644 index 000000000..db6f90d88 --- /dev/null +++ b/doc/forum/exporting_annexed_files/comment_3_86f0e0f767a84a0f583e121d36cb7d48._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.135" + subject="comment 3" + date="2012-06-16T03:26:37Z" + content=""" +That nautilous behavior is a bad thing when trying to export files out, but it's a good thing when just moving files around inside your repository... +"""]] diff --git a/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__.mdwn b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__.mdwn new file mode 100644 index 000000000..633ff6f9b --- /dev/null +++ b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__.mdwn @@ -0,0 +1,26 @@ +First, I'm using a 2011 version because i'm getting this kind of errors from cabal install (on Fedora 16 and 17): + + $ cabal install git-annex --bindir=$HOME/.local/bin + Resolving dependencies... + cabal: cannot configure git-annex-3.20120406. It requires base >=4.5 && <5 + For the dependency on base >=4.5 && <5 there are these packages: base-4.5.0.0. + However none of them are available. + base-4.5.0.0 was excluded because of the top level dependency base -any + +So I installed a 2011 version and it worked. + +Now, when I add some files in the git annex repository I get an error: + + $ git annex add Photo\ Library/2010/06/28/IMG_4926.JPG + add Photo Library/2010/06/28/IMG_4926.JPG (checksum...) + git-annex: Photo Library/2010/06/28/IMG_4926.JPG: getFileStatus: does not exist (No such file or directory) + failed + git-annex: add: 1 failed + +None of the other files in the same directory are a problem. The file content is not a problem either as I can move the file elsewhere and git annex add it w/o any problem. It's this file in this directory that causes the problem. + +Something interesting though. If I move the file elsewhere, and git annex add it, there is no problem. Now, if I git mv the file back into its original location, and git annex fix the file, the symbolic link is wrong: instead of pointing to `../../../../.git/annex/objects/somefile` it points to `../../../annex/objects/somefile` (notice the missing `../.git/` part of the path). + +I can fix that by hand, and it works well, but that's very annoying. There are not much files having that bug though. + +[Mildred](http://mildred.fr) diff --git a/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_1_990197bf01351dc1ccbe1940d5084adb._comment b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_1_990197bf01351dc1ccbe1940d5084adb._comment new file mode 100644 index 000000000..7164de760 --- /dev/null +++ b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_1_990197bf01351dc1ccbe1940d5084adb._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://mildred.pip.verisignlabs.com/" + subject="Manually fixing links doesn't even work" + date="2012-04-12T15:46:54Z" + content=""" +I'm just answering myself: manually fixing symlinks doesn't always works. Sometimes the pre-commit hook will just rewrite the link to some wrong path. +"""]] diff --git a/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment new file mode 100644 index 000000000..2fa6cc01a --- /dev/null +++ b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-04-12T16:29:58Z" + content=""" +This bug was fixed in git-annex 3.20120230. You have a few options to get the fix: + +* Upgrade to ghc 7.4, the need for which is the cause of the cabal error message you pasted. +* Manually [[download]] from git, and `git checkout ghc7.0` -- that branch will build with your old ghc and has the fix. +* cherry-pick commit 51338486dcf9ab86de426e41b1eb31af1d3a6c87 +"""]] diff --git a/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_3_692f268218690437138ae0540c879425._comment b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_3_692f268218690437138ae0540c879425._comment new file mode 100644 index 000000000..d5c84b431 --- /dev/null +++ b/doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_3_692f268218690437138ae0540c879425._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://mildred.pip.verisignlabs.com/" + subject="Thank you a lot" + date="2012-04-13T07:28:10Z" + content=""" +Thank you, + +I imagined it was something like that. +I 'm just sorry I posted that on the forum and not on the bugs section (I hadn't discovered it at that time). but now, if people search for this error, they should find this. + +Note for Fedora users: unfortunately GHC 7.4 will not be shipped with Fedora 17 (which is still not released). The [feature page](https://fedoraproject.org/wiki/Features/GHC74) mention it for Fedora 18. I feel like I am using debian ... outdated packages the day of the release. + +And many thanks for this wonderful piece of software. + +Mildred +"""]] diff --git a/doc/forum/faking_location_information.mdwn b/doc/forum/faking_location_information.mdwn new file mode 100644 index 000000000..7c84e12e3 --- /dev/null +++ b/doc/forum/faking_location_information.mdwn @@ -0,0 +1,19 @@ +Hi + +I am using git-annex even if people I exchange data with (currently) don‘t use it for there data. My idea behind this is that I would like to know from where I got a file, whom I gave a file and who does (probably) still have a copy of the file. To do this you need to trick git-annex location tracking feature a bit. I successfully managed to achieve this in a simple data exchange which only consisted of me coping over files to one of my git-annex repos. I did the following to make git-annex believe that the files are in two repos without the need to *copy* them around the repos. + +This is what I did in this simple case: + +1. mounted the drive from someone +2. made a clone of my git-annex repo on the filesystem which should hold the copy of the data +3. initialized the cloned repo with `git annex init "Drive from person X"` +4. imported the files to the cloned repo with `git annex import --duplicate $path_to_files_from_person_x` +5. `git annex sync` in the cloned repo +6. `git annex sync` in main repo +7. `git annex move . --to origin` in the cloned repo + +The impotent part (and the limit) here was that you can not sync these two repos after you moved files to the main repo. The problem is that there will be situations where I will have to sync them also after moving files around (for example if I want to store new files in multiple repos (and not just one main repo), or if I also want to copy files over to drives from someone). + +Note: I have also worked out a solution to allow someone to choose which files he/she would like to get as described [on superuser.com](http://superuser.com/a/717689). + +Are there better ways to fake location information then the thing I came up with (except making multiple repos for one person/drive)? Can multiple remotes be merged to one remote? diff --git a/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn new file mode 100644 index 000000000..ee0b49eb6 --- /dev/null +++ b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory.mdwn @@ -0,0 +1,112 @@ +I'm getting this error, not exactly sure why... Here's the output of running git annex sync in my pictures folder: + + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","git-annex"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--hash","refs/heads/git-annex"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..7bf55ad4463cad9389cbb11e48334d151aacf45f","--oneline","-n1"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..f3331818fc79b6e9523e483b9d97aaec5c8da845","--oneline","-n1"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..6c3bee76aa98f5c789ddf89450b3bd52658171a6","--oneline","-n1"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..9329bf7ae5609b19e81d9605fdc990c87c5816dc","--oneline","-n1"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..ad7115c6108170dc54095f74632db339dbca4cdd","--oneline","-n1"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] chat: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","cat-file","--batch"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["config","--null","--list"] + commit + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","ls-files","--stage","-z","--others","--exclude-standard","--","C:\\Users\\Name\\Pictures"] + [2014-06-29 12:43:59 Mitteleurop├ñische Sommerzeit] chat: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","cat-file","--batch"] + (Recording state in git...) + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","Hochzeit von NameB und NameC/2013-08-18_MVI_0583.MOV"] + fatal: Out of memory? mmap failed: No such file or directory + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","Hochzeit von NameB und NameC/2013-08-18_MVI_0582.MOV"] + fatal: Out of memory? mmap failed: No such file or directory + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","Hochzeit von NameB und NameC/2013-08-18_MVI_0417.MOV"] + fatal: Out of memory? mmap failed: No such file or directory + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","Hochzeit von NameB und NameC/2013-08-17_MVI_9701.MOV"] + fatal: Out of memory? mmap failed: No such file or directory + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2014/Hochzeit von Jana und Stefan/MVI_7168.MOV"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2456.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2452.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2450.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2449.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2448.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2447.JPG"] + [2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2443.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2439.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2436.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2431.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2430.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2425.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2424.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2423.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2421.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2418.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2417.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2416.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2415.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2411.JPG"] + [2014-06-29 12:49:58 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2409.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2406.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2405.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2404.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2403.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2402.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2400.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2394.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2392.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2012/Event/IMG_2390.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0446.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0445.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0444.JPG"] + [2014-06-29 12:49:59 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0443.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0442.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0441.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0440.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0438.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0437.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0436.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0435.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0434.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0433.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0432.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0431.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0368.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0367.JPG"] + [2014-06-29 12:50:00 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0366.JPG"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0365.JPG"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","add","-f","2005/Amsterdam/CIMG0364.JPG"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--head"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","diff-index","-z","--raw","--no-renames","-l0","--cached","HEAD"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","symbolic-ref","HEAD"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--hash","refs/heads/annex/direct/master"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","write-tree"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","rev-parse","ec008c688692d3156b1aececf33a388f43e8c868:"] + ok + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","symbolic-ref","HEAD"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","refs/heads/annex/direct/master"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--verify","-q","refs/heads/synced/master"] + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/annex/direct/master..refs/heads/synced/master","--oneline","-n1"] + pull HomeServerLocal + [2014-06-29 12:50:01 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","fetch","HomeServerLocal"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--verify","-q","refs/remotes/HomeServerLocal/annex/direct/master"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/annex/direct/master..refs/remotes/HomeServerLocal/annex/direct/master","--oneline","-n1"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--verify","-q","refs/remotes/HomeServerLocal/synced/master"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/synced/master..refs/remotes/HomeServerLocal/synced/master","--oneline","-n1"] + ok + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","git-annex"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--hash","refs/heads/git-annex"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..7bf55ad4463cad9389cbb11e48334d151aacf45f","--oneline","-n1"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..f3331818fc79b6e9523e483b9d97aaec5c8da845","--oneline","-n1"] + [2014-06-29 12:50:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..6c3bee76aa98f5c789ddf89450b3bd52658171a6","--oneline","-n1"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..9329bf7ae5609b19e81d9605fdc990c87c5816dc","--oneline","-n1"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/heads/git-annex..ad7115c6108170dc54095f74632db339dbca4cdd","--oneline","-n1"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","branch","-f","synced/master"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","branch","-f","master"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--verify","-q","refs/remotes/HomeServerLocal/synced/master"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/remotes/HomeServerLocal/synced/master..refs/heads/synced/master","--oneline","-n1"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","show-ref","--verify","-q","refs/remotes/HomeServerLocal/git-annex"] + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","log","refs/remotes/HomeServerLocal/git-annex..git-annex","--oneline","-n1"] + push HomeServerLocal + [2014-06-29 12:50:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","push","HomeServerLocal","+git-annex:synced/git-annex","annex/direct/master:synced/master"] + Everything up-to-date + [2014-06-29 12:50:04 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=C:\\Users\\Name\\Pictures\\.git","--work-tree=C:\\Users\\Name\\Pictures","push","HomeServerLocal","master"] + ok + +Any idea? Thanks in advance... diff --git a/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_d98a155fa01d10ecff9058d79290156d._comment b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_d98a155fa01d10ecff9058d79290156d._comment new file mode 100644 index 000000000..989ab1a6a --- /dev/null +++ b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_1_d98a155fa01d10ecff9058d79290156d._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Idhup" + ip="91.58.248.157" + subject="System" + date="2014-06-29T19:26:42Z" + content=""" +Forgot to tell: This is a Win7 x64 system, running git 1.9.2.msysgit.0 and + +git-annex version: 5.20140517-gee56d21 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external +"""]] diff --git a/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_3b9ea7a1254ac5b50a5ab59cd331ec3f._comment b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_3b9ea7a1254ac5b50a5ab59cd331ec3f._comment new file mode 100644 index 000000000..2a575e059 --- /dev/null +++ b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_2_3b9ea7a1254ac5b50a5ab59cd331ec3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-04T17:55:45Z" + content=""" + +"""]] diff --git a/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_5ee300034819c5825c676cd7e3af659f._comment b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_5ee300034819c5825c676cd7e3af659f._comment new file mode 100644 index 000000000..55345537e --- /dev/null +++ b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_3_5ee300034819c5825c676cd7e3af659f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Idhup" + ip="91.58.248.157" + subject="Didn't work" + date="2014-07-06T17:46:01Z" + content=""" +Repacking in cygwin towards a smaller packsize did not help. I shrinked it down to 2 MB per packfile, I still got the errors. + +When checking the debug output, you can see that git crashes when adding some large-ish .mov files. I'm not even sure if git's supposed to add them or if something went wrong with Windows/DirectMode. I executed git reset to remove pending additions that weren't supposed to be there, but to no avail. + +Any ideas on how to fix that? +"""]] diff --git a/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_cf7f5c91d3c15f72d2a714b7362c1197._comment b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_cf7f5c91d3c15f72d2a714b7362c1197._comment new file mode 100644 index 000000000..4b250a3e2 --- /dev/null +++ b/doc/forum/fatal:_Out_of_memory__63___mmap_failed:_No_such_file_or_directory/comment_4_cf7f5c91d3c15f72d2a714b7362c1197._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-10T20:16:28Z" + content=""" +[2014-06-29 12:49:57 Mitteleurop├ñische Sommerzeit] call: git [\"--git-dir=C:\\Users\\Name\\Pictures\\.git\",\"--work-tree=C:\\Users\\Name\\Pictures\",\"add\",\"-f\",\"Hochzeit von NameB und NameC/2013-08-17_MVI_9701.MOV\"] + +When does git-annex in direct mode run \"git add -f\"? In stageDirect, when a file has been modified that is not an annexed file, but already has been committed directly to git. + +This certainly points in the direction of what the problem is with the repository. I think you need to take a look at `git log --stat \"Hochzeit von NameB und NameC/2013-08-18_MVI_0583.MOV\"` and see if it has been committed to git as a symlink or if it is indeed being stored as a Bin file in git. + +Here's how the log would look for a regular git-annexed symlink: + +
+ $somefile | 1 +
+ 1 file changed, 1 insertion(+)
+
+ +And here for a binary file stored in git: + +
+ $somefile | Bin 0 -> 1016920 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+ +If you find the latter in the log, then the author and commit message of the commit adding it would be interesting. + +Hypothesis: Perhaps this repository started off on a Linux or OSX system, and you were using a git-annex older than 5.20131118, when the direct mode guard was added. You might have added this file back then and accidentially committed it directly to git. +"""]] diff --git a/doc/forum/first-time_setup_git-annex.mdwn b/doc/forum/first-time_setup_git-annex.mdwn new file mode 100644 index 000000000..735d74621 --- /dev/null +++ b/doc/forum/first-time_setup_git-annex.mdwn @@ -0,0 +1,7 @@ +I have a git installation on my web server (web faction hosting). It allows me to run repositories from my hosting account. + +What I want is to use git-annex as a dropbox replacement. Specifically, the central repository being my web server and then using local installations on my 2 mac laptops (primarily), access through browser on windows, and access on android as well (browser or some other method). + +I'm looking at the install instructions, walkthrough, etc. What I'm initially not clear on is whether I need to install git-annex on my (linux centOS) webserver and any machine through which I'm accessing the repo? Seems like that would be the case of course, but I wanted to validate. + +Am I going to run into issues that folks might already be able to warn me about? Anything I need to know? diff --git a/doc/forum/first-time_setup_git-annex/comment_1_a58d83ee3a7c2251d9a775847223f8ca._comment b/doc/forum/first-time_setup_git-annex/comment_1_a58d83ee3a7c2251d9a775847223f8ca._comment new file mode 100644 index 000000000..8b86d7b17 --- /dev/null +++ b/doc/forum/first-time_setup_git-annex/comment_1_a58d83ee3a7c2251d9a775847223f8ca._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T18:39:59Z" + content=""" +Sorry it took so long to get back to you. + +You do not necessarily have to have git-annex installed on your web server. But it will open up one of the nicest ways to use git-annex with a server, which is to put a bare git repository on the server, and let git-annex send the contents of large files to that repository. It's fine to install any old version of git-annex on the server, they're all forwards and backwards compatable. + +In any case, you need git-annex installed on any computers where you want to access the repository, certainly. + +"""]] diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it.mdwn b/doc/forum/flickrannex_--_not_sure_I_get_it.mdwn new file mode 100644 index 000000000..fa69d6158 --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it.mdwn @@ -0,0 +1,7 @@ +flickrannex -- is it a way to upload your images to flickr by putting them in a git annex directory, and make them retrievable from it handily that way? + +Or is it a hack to exploit flickr's free storage, by allowing you to somehow wrap your files in images and uploading them? + +My python and knowledge of how git annex's hooks work is not good enough for me to be certain by reading the code. + +Thanks diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it/comment_1_57ea9f26760f970a70f09934d31a79b5._comment b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_1_57ea9f26760f970a70f09934d31a79b5._comment new file mode 100644 index 000000000..3d5da7d37 --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_1_57ea9f26760f970a70f09934d31a79b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-27T01:48:43Z" + content=""" +Little bit of both I think. Pictures uploaded by it are visible on flickr. You can configure a [[preferred_content]] expression so the flickr remote only wants *.jpg etc. Any other file is wrapped inside an image so flickr will accept it. It would probably be a good idea to configure git-annex to `untrust` your repository if using it this way. +"""]] diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it/comment_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment new file mode 100644 index 000000000..cb9b65f6a --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 2" + date="2013-05-27T01:57:25Z" + content=""" +Cool, thanks! I ran into some issues setting it up, I'll take those to github (I hadn't been able to get as far as setting it up with an annex) +"""]] diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it/comment_3_74f143965f48c89a3583acf1b6a7635a._comment b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_3_74f143965f48c89a3583acf1b6a7635a._comment new file mode 100644 index 000000000..21fcde85d --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_3_74f143965f48c89a3583acf1b6a7635a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="I noticed you stopped filing issues on github" + date="2013-06-02T10:38:04Z" + content=""" +Does that mean the hook is working properly for you properly now? + +"""]] diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it/comment_4_493bb86dedfa91ccc0c9be4045953ee4._comment b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_4_493bb86dedfa91ccc0c9be4045953ee4._comment new file mode 100644 index 000000000..dd474ef59 --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_4_493bb86dedfa91ccc0c9be4045953ee4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 4" + date="2013-06-02T20:27:08Z" + content=""" +it is, thank you! working perfectly. +"""]] diff --git a/doc/forum/flickrannex_--_not_sure_I_get_it/comment_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment new file mode 100644 index 000000000..f55a894a8 --- /dev/null +++ b/doc/forum/flickrannex_--_not_sure_I_get_it/comment_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 5" + date="2013-06-02T20:29:48Z" + content=""" +Good :) +"""]] diff --git a/doc/forum/folder_size_question.mdwn b/doc/forum/folder_size_question.mdwn new file mode 100644 index 000000000..51d11ca8b --- /dev/null +++ b/doc/forum/folder_size_question.mdwn @@ -0,0 +1,3 @@ +For test purposes I copied a folder into my local repository to do some tests. +I now had a look at the original folder size and the size of the repository and compared it to the original folder and the repo is about 2x bigger. How come? +=> http://screencast.com/t/Tvqe5P22Ux diff --git a/doc/forum/folder_size_question/comment_1_782cbf836335d86ff29853c34f00fec3._comment b/doc/forum/folder_size_question/comment_1_782cbf836335d86ff29853c34f00fec3._comment new file mode 100644 index 000000000..36bb93df3 --- /dev/null +++ b/doc/forum/folder_size_question/comment_1_782cbf836335d86ff29853c34f00fec3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T17:02:29Z" + content=""" +I don't have bandwidth to watch screencasts, so I can only guess. + +My first guess would be that you used `git add` to check the files into a git repository. This will exactly double the disk space, since each file is now stored in .git/ as well as in the working tree. This is a problem that git-annex solves. + +If you'd like to provide more information (cut and paste of details is useful), I can perhaps make more informed guesses. Or you could use `du` so see which files are taking up more space than you expect. +"""]] diff --git a/doc/forum/folder_size_question/comment_2_391aa62e4d8c496a58be4707522d8edb._comment b/doc/forum/folder_size_question/comment_2_391aa62e4d8c496a58be4707522d8edb._comment new file mode 100644 index 000000000..f031deb81 --- /dev/null +++ b/doc/forum/folder_size_question/comment_2_391aa62e4d8c496a58be4707522d8edb._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 2" + date="2014-05-16T17:15:59Z" + content=""" +I don't recall doing anything besides using the git annex assistant... + +That link is just a screen shot... + +anyway here is more info: + +du -h -s git-annex/* + 38M git-annex/Finance +8.0K git-annex/archive + +BUT if I check the folder git-annex's properties it says: + +45 980 806 bytes (80,4 MB on disk) for 8 420 items + +Is that normal? +"""]] diff --git a/doc/forum/folder_size_question/comment_3_1e850dbe36fafe0505b60dd2ce0bd5d7._comment b/doc/forum/folder_size_question/comment_3_1e850dbe36fafe0505b60dd2ce0bd5d7._comment new file mode 100644 index 000000000..978ffcf51 --- /dev/null +++ b/doc/forum/folder_size_question/comment_3_1e850dbe36fafe0505b60dd2ce0bd5d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-05-16T19:07:10Z" + content=""" +Sounds to me like some GUI thing that is confused in some way. Which is, in my experience not unusual when it comes to GUI things and the actual size of files on disk. I'd trust `du`. +"""]] diff --git a/doc/forum/folder_size_question/comment_4_907f3b1cfe745abf94a6a8ba0dbd4396._comment b/doc/forum/folder_size_question/comment_4_907f3b1cfe745abf94a6a8ba0dbd4396._comment new file mode 100644 index 000000000..a32e9177a --- /dev/null +++ b/doc/forum/folder_size_question/comment_4_907f3b1cfe745abf94a6a8ba0dbd4396._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 4" + date="2014-05-17T10:56:22Z" + content=""" +I thinks its all the small files. + + du -hs /Users/ovi/Sharing/git-annex/ + 77M /Users/ovi/Sharing/git-annex/ + + du -hs /Users/ovi/Sharing/git-annex/Finance/ + 38M /Users/ovi/Sharing/git-annex/Finance/ + + du -hs /Users/ovi/Sharing/git-annex/.git/ + 39M /Users/ovi/Sharing/git-annex/.git/ + +The GUI shows: + 46 136 859 bytes (80,6 MB on disk) for 8 002 items + +And the hidden .git folder shows: + 7 373 616 bytes (41 MB on disk) for 7 625 items + +So apparently there are a lot of very small files, smaller than the blocksize hence the info is skewed? Anyway, I think its alright? +"""]] diff --git a/doc/forum/fsck_gives_false_positives.mdwn b/doc/forum/fsck_gives_false_positives.mdwn new file mode 100644 index 000000000..2fae57c4e --- /dev/null +++ b/doc/forum/fsck_gives_false_positives.mdwn @@ -0,0 +1,6 @@ +Hi, + +I use git-annex 3.20120123 on a debian-testing amd-64 machine with software RAID6 and LVM2 on it. I needed to move the whole `/home` directory to another LV (the new LV is on encrypted PV, the old LV is encrypted and not properly aligned; I'm changing from encrypted `/home` only to encrypted everything except `/boot`), so I have used the `rsync -aAXH` from a `ro` mounted `/home` to a new LV mounted on `/mnt/home_2`. After the move was complete I run the `git annex fsck` on my (4TB of) data. The fsck finds some files bad, and moves them to the `..../bad` directory. So far so good, this is how it should be, right? But then- I have a file with sha1sum of all my files. So - I checked the 'bad' file against that. It was OK. Then I computed the SHA256 of the file - this is used by `git annex fsck`. It was OK, too. So how did it happen, that the file was marked as bad? Do I miss something here? Could it be related to the hardware (HDDs) and silent data corruption? Or is it the undesirable effect of rsync? Or maybe the fsck is at fault here? + +Any ideas? + diff --git a/doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment b/doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment new file mode 100644 index 000000000..c65eaf51d --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-02-14T16:58:33Z" + content=""" +Well, it should only move files to `.git/annex/bad/` if their filesize is wrong, or their checksum is wrong. + +You can try moving a file out of `.git/annex/bad/` and re-run fsck and see if it fails it again. (And if it does, paste in a log!) + +To do that -- +Suppose you have a file `.git/annex/bad/SHA256-s33--5dc45521382f1c7974d9dbfcff1246370404b952` and you know that file `foobar` was supposed to have that content (you can check that `foobar` is a symlink to that SHA value). Then reinject it: + +`git annex reinject .git/annex/bad/SHA256-s33--5dc45521382f1c7974d9dbfcff1246370404b952 foobar` +"""]] diff --git a/doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment b/doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment new file mode 100644 index 000000000..1e0111e67 --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="antymat" + ip="77.190.74.127" + subject="comment 2" + date="2012-02-14T22:48:37Z" + content=""" +Thanks, joey, but I still do not know, why the file that has been (and *is*) OK according to separate sha1 and sha256 checks, has been marked 'bad' by `fsck` and moved to `.git/annex/bad`. What could be a reason for that? Could have `rsync` caused it? I know too little about internal workings of `git-annex` to answer this question. + +But one thing I know for certain - the false positives should *not* happen, unless something *is* wrong with the file. Otherwise, if it is unreliable, if I have to check twice, it is useless. I might as well just keep checksums of all the files and do all checks by hand... +"""]] diff --git a/doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment b/doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment new file mode 100644 index 000000000..bd807f404 --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-02-14T22:57:29Z" + content=""" +All that git annex fsck does is checksum the file and move it away if the checksum fails. + +If bad data was somehow read from the disk that one time, what you describe could occur. I cannot think of any other way it could happen. +"""]] diff --git a/doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment b/doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment new file mode 100644 index 000000000..038d41620 --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="antymat" + ip="77.190.74.127" + subject="comment 4" + date="2012-02-15T07:13:12Z" + content=""" +OK, thanks. I was just wondering - since there are links in git(-annex), and a hard links too, that maybe the issue has been caused by `rsync`. + +I will keep my eye on that and run checks with my own checksum and `fsck` from time to time, and see what happens. I will post my results here, but the whole run (`fsck` or checksum) takes almost 2 days, so I will not do it too often... ;) +"""]] diff --git a/doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment b/doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment new file mode 100644 index 000000000..7f0fbf96a --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2012-02-15T15:22:56Z" + content=""" +The symlinks are in the git repository. So if the rsync damanged one, git would see the change. And nothing that happens to the symlinks can affect fsck. + +git-annex does not use hard links at all. + +fsck corrects mangled file permissions. It is possible to screw up the permissions so badly that it cannot see the files at all (ie, chmod 000 on a file under .git/annex/objects), but then fsck will complain and give up, not move the files to bad. +So I don't see how a botched rsync could result in fsck moving a file with correct content to bad. +"""]] diff --git a/doc/forum/fsck_gives_false_positives/comment_6_1d4fbbd212fa92967abda346323031f4._comment b/doc/forum/fsck_gives_false_positives/comment_6_1d4fbbd212fa92967abda346323031f4._comment new file mode 100644 index 000000000..294778cbf --- /dev/null +++ b/doc/forum/fsck_gives_false_positives/comment_6_1d4fbbd212fa92967abda346323031f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWQTrnPloMWiPFg8Y2Y5g-2IYe26D0KKw" + nickname="Jim" + subject="comment 6" + date="2012-07-07T16:18:06Z" + content=""" +It's also possible you got a one-time DRAM corruption. You have to expect those to happen every so often unless you're using ECC memory. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage.mdwn b/doc/forum/gadu_-_git-annex_disk_usage.mdwn new file mode 100644 index 000000000..c7a20c327 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage.mdwn @@ -0,0 +1,7 @@ +Based on the thread over at I decided to finally write a du like utility for git-annex. A 0.01 version is up over at . It works, but I intend to make it smarter about handling git repos and annexed files, as well as adding more of the options available in the standard du utility. + +Currently it will tally up the sizes of links that look like they are annexed files. I plan to make it actually interact with git and git-annex to verify the files are annexed and enable options like tallying files only from specific remotes, only missing files, not double counting files which are annexed multiple times but stored only once, etc... + +I'll have time to work on this on the weekends, and plan to get my git repo up soon. After gadu is mostly complete I might work on some other tools. + +Releases are signed with a PGP key with fingerprint 5E1A 65D7 D5E9 56F1 C239 43DF C6C8 9A0B 6003 8953 (available on the website) diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_10_f632a62c4dbbf01b29f146893d7725f9._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_10_f632a62c4dbbf01b29f146893d7725f9._comment new file mode 100644 index 000000000..602cc4363 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_10_f632a62c4dbbf01b29f146893d7725f9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="comment 10" + date="2013-01-14T01:54:12Z" + content=""" +No problem, glad to see it is useful. I'm not exactly a web guy, but I want to get some sort of comment/discussion system up there soon so we aren't filling up Joey's web site with semi-offtopic discussion. (also a little beautification is in order) + +Yes, contributions are welcome. GPG/PGP encrypted email is the preferred mode of communication. + +Currently I ask for copyright assignment in case I want to change licenses in the future. I pledge not to go to a non-free license, but the GPL3 license choice was fairly arbitrary. I might want to add the \"or any later version\" clause, for example. There is also potential for a library to be split off which might benefit from something like LGPL licensing or similar. I haven't really studied the licensing situation since GPL3 came around, so I need to take some time to look into it. + +I don't want to have a licensing discussion here though as it would be offtopic. Feel free to email me and we can discuss. + +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_11_73461da2d55d040cb43e0db286975821._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_11_73461da2d55d040cb43e0db286975821._comment new file mode 100644 index 000000000..5f9a8bbec --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_11_73461da2d55d040cb43e0db286975821._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-03-11T05:31:04Z" + content=""" +I don't want to steal gadu's thunder, and I really quite like having an ecosystem of tools develop around git-annex. + +With that said, \"git annex status .\" now shows the disk used for all files in the current directory and below. It also shows the number of keys, and the total amount of disk those keys would use. + +Additionally, you can use all the standard git-annex file limiting options. For example, here I'm finding out how much disk space is used by files located on a *remote* system: + +
+git annex status . --in turtle
+directory: .
+local annex keys: 0
+local annex size: 0 bytes
+known annex keys: 10
+known annex size: 3 gigabytes
+
+"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_12_6c4fb123091bde435c18ac3dfd5a9b77._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_12_6c4fb123091bde435c18ac3dfd5a9b77._comment new file mode 100644 index 000000000..d228e196d --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_12_6c4fb123091bde435c18ac3dfd5a9b77._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-03-11T05:33:09Z" + content=""" +BTW, I think gadu still has its own uses, due to having a du like output, that can list space used by subdirectories. You can do that with git annex status *, but it's much more verbose, and doesn't show a break down by deeper subdirectories. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_1_067d0ffe8900751bd2d2743254ac4d77._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_1_067d0ffe8900751bd2d2743254ac4d77._comment new file mode 100644 index 000000000..9699b6ee6 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_1_067d0ffe8900751bd2d2743254ac4d77._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="0.02 is up" + date="2012-12-08T14:20:16Z" + content=""" +I fixed some bugs that gave the wrong answer occasionally, and made gadu much smarter now. + +It now searches for the .git dir an makes sure the git-annex links are well formed before counting them. +I also added a few more du like options. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment new file mode 100644 index 000000000..04c6c3f65 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 2" + date="2012-12-08T15:35:16Z" + content=""" +Have downloaded v0.02 and experimented a bit, and it seems to work nicely. A couple of things, though: + +- It displays the sizes in 512 byte blocks as default. I find that very confusing, and the standard `du`(1) from GNU coreutils uses 1024kB as default. AFAIK 512 byte blocks is an old way of measuring sizes from the really ancient UNIX days. Traditionally correct, maybe, but not very useful these days. +- When not specifying a path, can it use \"`.`\" as default? +- A human-readable format would've been nice, like 234M or 13G. The `du`(1) from GNU coreutils uses `-h` for this, but that option is already used for `--help`. And that's OK, I think `-h` should be reserved for that purpose. IMHO using `-h` as a synonym for `--human-readable` was a bad choice by coreutils, but it's too late to change that now. + +Is there any Git repository available for git-annex-utils somewhere? That's my preferred way of getting updates and follow the development. + +Anyway, thanks. :) + +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_3_38296fef5a2dc5794c2dc09df676b8c1._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_3_38296fef5a2dc5794c2dc09df676b8c1._comment new file mode 100644 index 000000000..42e4f5a71 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_3_38296fef5a2dc5794c2dc09df676b8c1._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="gadu 0.03 is up" + date="2012-12-09T13:05:10Z" + content=""" +* 1K blocksize is now the default +* \".\" is now the default path +* implemented -B/--block-size option +* --help is no longer -h, it only has a long option like du +* implemented -h/--human-readable option + +du will take up to yottabytes for the --block-size option. I had been fudging the sizes with a size_t thinking 16 exabytes was plenty big enough for now, but since I was implementing --block-size I went ahead and converted everything to use the GNU MP. So libgmp is now a dependency. + +--human-readable probably doesn't have exactly the same output, but I think it is good enough. I tried to make the options work mostly the same as du from core-utils. Let me know if you find other discrepancies. + +I'll see about making the git tree available soon, but it may have to wait until next weekend. I may also look into a forum for the website, or a mailing list. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment new file mode 100644 index 000000000..807dac1b3 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 4" + date="2012-12-09T20:13:47Z" + content=""" +Thanks a lot, Steve. Awesome, got everything on my wishlist. :) A very useful utility, and works perfectly. Will be using this a lot. git-annex-utils is a good name for this, I'm sure if you place it on GitHub or somewhere else you'll get lots of contributions and this could grow to be a project containing many useful utilities for git-annex. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_5_4365cd3031456fac1b563ee72984638e._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_5_4365cd3031456fac1b563ee72984638e._comment new file mode 100644 index 000000000..e2611dbaa --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_5_4365cd3031456fac1b563ee72984638e._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="comment 5" + date="2012-12-10T04:07:53Z" + content=""" +I pay attention to feedback ;) + +I'm not done with it yet, I want to add in some options to limit what gets counted. + +For example: If you have two annexed files that contain the same content using the same backend, they will be stored only once in the .git/annex/objects directory but be counted twice by gadu. + +I want to fix that, but I'll leave an option to keep that behavior if you want. I also want to add options to count or not count files that exist in a certain repo. It will be very easy to add options to only count files that you have or don't have locally as well. + +Making it pay attention to environment variables that git and git-annex do would also be a good idea. (like GIT_DIR, etc...) + +I'm open to good ideas that anybody has, unfortunately I can only work on it on the weekends for now. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_6_2b03d7b857497cb811e992f85700cdcc._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_6_2b03d7b857497cb811e992f85700cdcc._comment new file mode 100644 index 000000000..9b8d04908 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_6_2b03d7b857497cb811e992f85700cdcc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="markus" + ip="79.243.252.165" + subject="Great util!" + date="2012-12-28T17:45:27Z" + content=""" +Hi + +gadu is a great util! The speed increase compared to \"du -smL\" will make it my fav. util for size calc! + +ciao markus +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment new file mode 100644 index 000000000..05f20ddcc --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="sizes has git-annex support" + date="2012-12-30T22:47:42Z" + content=""" +Just to note that I already added git-annex support to my \"sizes\" utility on Hackage several months back. With -A, it shows you storage totals with annex symlinks computed fully resolved. +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_8_fc6ddb4dc075ee42368863c1b026dbf7._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_8_fc6ddb4dc075ee42368863c1b026dbf7._comment new file mode 100644 index 000000000..642ad3d96 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_8_fc6ddb4dc075ee42368863c1b026dbf7._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="git repo is now up" + date="2013-01-01T23:39:33Z" + content=""" +sunny256, the git repo is now accessible at + +Markus, never used the -m option myself. I added it in git it'll be in the next tarball. (I plan to go through the du man page and add all appropriate options soon) + +John, I wasn't aware of your sizes utility. I'll look into it. + +"""]] diff --git a/doc/forum/gadu_-_git-annex_disk_usage/comment_9_f03254e518cbdda73e4b88e72476275d._comment b/doc/forum/gadu_-_git-annex_disk_usage/comment_9_f03254e518cbdda73e4b88e72476275d._comment new file mode 100644 index 000000000..d3ebbae61 --- /dev/null +++ b/doc/forum/gadu_-_git-annex_disk_usage/comment_9_f03254e518cbdda73e4b88e72476275d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="The git-annex-utils repo" + date="2013-01-09T09:39:16Z" + content=""" +Thanks for setting up the git-annex-utils repo, Steve. Will install the newest gadu(1) on my computers now. I'll probably contribute some patches for some utility scripts or programs, if that's OK. What's your preferred way to receive patches? GPG-encrypted mail to your address in the commit log? +"""]] diff --git a/doc/forum/get_and_copy_with_bare_repositories.mdwn b/doc/forum/get_and_copy_with_bare_repositories.mdwn new file mode 100644 index 000000000..846887f96 --- /dev/null +++ b/doc/forum/get_and_copy_with_bare_repositories.mdwn @@ -0,0 +1,7 @@ +is `git annex get` and `git annex copy --to somewhere` expected to work with bare repos? the [[bare repositories]] page doesn't indicate otherwise, but a `git annex get` does plain nothing in my setup. + +if it's supposed not to work, there should be an error message saying that and an indication on the [[bare repositories]], otherwise, how can i trace it down? + +in case it is just unimplemented for lack of use cases: my setup consists of several laptops using parts of a 200gb+ photo collection, a central trusted server that should host everything, and an external encrypted remote backup. clients *should* copy everything they add to both central locations, but i'd prefer the trusted server to sync the two of them too. + +`get` and `copy` usually operate on the current directory, which in case of a bare repo does not contain any relevant files, but i tried explicitly specifying files too. `git annex` should either look them up in master, or always operate on all files (as indexed in the `git-annex` branch) unconditionally. diff --git a/doc/forum/get_and_copy_with_bare_repositories/comment_1_a6e4628c0770e3f5e81348a6f29dd845._comment b/doc/forum/get_and_copy_with_bare_repositories/comment_1_a6e4628c0770e3f5e81348a6f29dd845._comment new file mode 100644 index 000000000..a19dd8631 --- /dev/null +++ b/doc/forum/get_and_copy_with_bare_repositories/comment_1_a6e4628c0770e3f5e81348a6f29dd845._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-13T17:30:31Z" + content=""" +git-annex commands only operate on files in the currently checked out working copy. You can send files to/from bare repos from non-bare repos. But you cannot do anything with them inside the bare repo, just as regular git doesn't let you commit inside a bare repo. + +There is talk about [[todo/add_-all_option]], which would be usable in bare repos. +"""]] diff --git a/doc/forum/get_and_copy_with_bare_repositories/comment_2_652fa1bae5c2bb63dcffcbda97a567c4._comment b/doc/forum/get_and_copy_with_bare_repositories/comment_2_652fa1bae5c2bb63dcffcbda97a567c4._comment new file mode 100644 index 000000000..fdf9f91a2 --- /dev/null +++ b/doc/forum/get_and_copy_with_bare_repositories/comment_2_652fa1bae5c2bb63dcffcbda97a567c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 2" + date="2013-07-03T18:13:25Z" + content=""" +`git annex get` and `git annex copy`, as well as `git annex move` can now be used in a bare repository. In this mode, they behave as if --all were specified, and so operate on every single version of every single file. +"""]] diff --git a/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn new file mode 100644 index 000000000..cc9091ae5 --- /dev/null +++ b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn @@ -0,0 +1,11 @@ +I'm not sure if this is my stupidity or if it's a bug, but + + git annex copy --force --to REMOTE . + +just zip's through really quickly and doesn't actually force a copy to a +remote location. This is just following up on the +[[bugs/git-annex_directory_hashing_problems_on_osx]]. I want to just do a force copy of all my data to my portable disk to really make sure that the data is really there. I would similarly would want to make sure I can force a + + git annex copy --force --from REMOTE . + +to pull down files from a remote. diff --git a/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment new file mode 100644 index 000000000..d2692f26f --- /dev/null +++ b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T16:49:01Z" + content=""" +How remote is REMOTE? If it's a directory on the same computer, then git-annex copy --to is actually quickly checking that each file is present on the remote, and when it is, skipping copying it again. + +If the remote is ssh, git-annex copy talks to the remote to see if it has the file. This makes copy --to slow, as Rich [[complained_before|forum/batch_check_on_remote_when_using_copy]]. :) + +So, copy --to does not trust location tracking information (unless --fast is specified), which means that it should be doing exactly what you want it to do in your situation -- transferring every file that is really not present in the destination repository already. + +Neither does copy --from, by the way. It always checks if each file is present in the current repository's annex before trying to download it. +"""]] diff --git a/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment new file mode 100644 index 000000000..107930319 --- /dev/null +++ b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2011-04-03T16:59:47Z" + content=""" +Remote as in \"another physical machine\". I assumed that + + git annex copy --force --to REMOTE . + +would have not trusted the contents in the current directory (or the remote that is being copied to) and then just go off and re-download/upload all the files and overwrite what is already there. I expected the combination of *--force* and copy *--to* that it would not bother to check if the files are there or not and just copy it regardless of the outcome. +"""]] diff --git a/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment new file mode 100644 index 000000000..c3df21498 --- /dev/null +++ b/doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2011-04-03T17:12:35Z" + content=""" +On second thought maybe the current behaviour is better than what I am suggesting that the force command should do. I guess it's better to be safe than sorry. +"""]] diff --git a/doc/forum/ghost_semitrusted_repositories.mdwn b/doc/forum/ghost_semitrusted_repositories.mdwn new file mode 100644 index 000000000..9e00178b7 --- /dev/null +++ b/doc/forum/ghost_semitrusted_repositories.mdwn @@ -0,0 +1,28 @@ +I had one repo on HDD and another in an USB drive. After mount point changed, I went to the HDD repo folder and tried to use git remote-set url to point it to the new location, however I think I ended in a weird state. git-annex info shows this: + + git-annex info + repository mode: indirect + trusted repositories: 0 + semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 26c0c4ba-6489-4416-a054-670d373f09bd -- juan@invasor.local:/Volumes/sapo_hfs/live/papers + 61158820-db14-45b9-b9f9-8619d956388e -- [usb_papers] + d4456c86-fa2b-43a7-a132-027915390cf6 -- usb_papers + fed56814-08c6-11e3-bf3c-af5da9f7f388 -- sapo [here] + untrusted repositories: 0 + transfers in progress: none + available local disk space: 255.46 gigabytes (+1 megabyte reserved) + local annex keys: 1252 + local annex size: 2.55 gigabytes + annexed files in working tree: 1297 + size of annexed files in working tree: 2.7 gigabytes + bloom filter size: 16 mebibytes (0.3% full) + backend usage: + SHA256E: 2549 + +usb_papers was the original usb repo, and now a new one [usb_papers] shows. webapp shows only sapo[here] and [usb_papers], the other 2 repos are unknown. I was digging around but couldn't find a way to remove them. +Seems that the webapp managed to use the new URL, but said something about "fixing repo". +Any suggestions? +Thanks in advance. +Best regards, + Juan diff --git a/doc/forum/ghost_semitrusted_repositories/comment_1_99bea1a964da9c5603b8cfbdc19bcde8._comment b/doc/forum/ghost_semitrusted_repositories/comment_1_99bea1a964da9c5603b8cfbdc19bcde8._comment new file mode 100644 index 000000000..ced8645e2 --- /dev/null +++ b/doc/forum/ghost_semitrusted_repositories/comment_1_99bea1a964da9c5603b8cfbdc19bcde8._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T19:40:32Z" + content=""" + 61158820-db14-45b9-b9f9-8619d956388e -- [usb_papers] + +This is the git remote you currently have set up. + + d4456c86-fa2b-43a7-a132-027915390cf6 -- usb_papers + +This is the old remote from before. + +Take a look at the repository in the USB drive, and see what its annex.uuid is set to. git-annex doesn't change the UUID after a repository is set up, so the fact that you have two different UUIDs is puzzling. + +If you really wanted to, you could remove the old repository from the list by running: `git annex dead d4456c86-fa2b-43a7-a132-027915390cf6` +But I would want to get to the bottom of what happened before doing that. +"""]] diff --git a/doc/forum/ghost_semitrusted_repositories/comment_2_fe5fe5539d06c6b1ef69f3ed805f1ab4._comment b/doc/forum/ghost_semitrusted_repositories/comment_2_fe5fe5539d06c6b1ef69f3ed805f1ab4._comment new file mode 100644 index 000000000..931783a0e --- /dev/null +++ b/doc/forum/ghost_semitrusted_repositories/comment_2_fe5fe5539d06c6b1ef69f3ed805f1ab4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="web remote" + date="2014-07-15T13:19:42Z" + content=""" +Ok. Got it. And what's up with the web remote? Why is it there, I didn't add that one. +"""]] diff --git a/doc/forum/ghost_semitrusted_repositories/comment_3_588325ef52c80cfc67d1dd80a9d5bd13._comment b/doc/forum/ghost_semitrusted_repositories/comment_3_588325ef52c80cfc67d1dd80a9d5bd13._comment new file mode 100644 index 000000000..1cdceff0d --- /dev/null +++ b/doc/forum/ghost_semitrusted_repositories/comment_3_588325ef52c80cfc67d1dd80a9d5bd13._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-15T18:56:31Z" + content=""" +It's there to represent the world wide web when using eg, `git annex addurl` +"""]] diff --git a/doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn b/doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn new file mode 100644 index 000000000..d32e01a6e --- /dev/null +++ b/doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn @@ -0,0 +1,16 @@ +After spending the whole last night playing with it, I think I have it figured out: + +it runs on my Macbook and I have added a free 50GB box.com account as archive and an S3 bucket as full-backup and set the min. number of file occurrences to keep to 2 so IF I delete anything on my Macbook, this should make sure I definitely have 2 more occurrences of each file on two separate storages. + +BUT here come the problems/questions + +- say I add a folder called: Documents, it has now apparently successfully synced to box.com and S3. I say apparently because there is no tool in the assistant to check +- I can't seem to figure out how to delete the log of the assistant, its getting quite longish +- I can't seem to figure out how to upgrade from 5.20140420 to 5.20140421 +- I move a file from a local repo to the archive folder but nothing happens except git-annex recording the move: (Recording state in git...) /Users/ovi/Sharing/git-annex/Finance/1-564 Erkl. z. Gebiets- u. Steuereigenschaft 08_04.pdf still has writers, not adding [2014-05-09 17:22:43 SAST] Committer: Committing changes to git +- the assistant doesn'T have any kind of gui for retrieving/deleting/finding stuff - I'm no stranger to the command line but I can't figure out how to add the /Applications/gitannex.app.5.20140421/Contents/MacOS to my path and if I go there and run runshell, most git-annex commands tell me: not in a git repository so all I can do right now, is look at things :-/ +- reading the description on the kickstarter page I must say I expected more. This is in no way comparable to Dropbox. + +Don't get me wrong, this is the most promising project of its kind I came across if I can be pointed in the right direction :-) + +P.S. How does it work on the "inside"? i.e. I edit a file and git-annex picks it up and "syncs" - what is synced? The whole file? A diff? How can one restore older versions or even look to see what versions are available? diff --git a/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_1_e661f31acd08a6459842f7f95e5c062b._comment b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_1_e661f31acd08a6459842f7f95e5c062b._comment new file mode 100644 index 000000000..9b524ea3b --- /dev/null +++ b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_1_e661f31acd08a6459842f7f95e5c062b._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="partially solved" + date="2014-05-11T09:32:32Z" + content=""" +I managed to add the path and now I can use git annex command line. +All my other questions and remarks are still open though :-) +"""]] diff --git a/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_2_e71a9d1fcf1f945fec0b7834b6038e91._comment b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_2_e71a9d1fcf1f945fec0b7834b6038e91._comment new file mode 100644 index 000000000..d11f641a6 --- /dev/null +++ b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_2_e71a9d1fcf1f945fec0b7834b6038e91._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYmMFDdf3GJ9Oba6NCVkzGc4JyB9WavMs" + nickname="Xinruo" + subject="comment 2" + date="2014-05-11T15:15:50Z" + content=""" +> say I add a folder called: Documents, it has now apparently successfully synced to box.com and S3. I say apparently because there is no tool in the assistant to check + +From the command line, git annex whereis FILE will tell you which remotes have the file, or git annex list will list out this for a directory + +> I can't seem to figure out how to delete the log of the assistant, its getting quite longish + +They live in .git/annex/daemon.log* + +> I can't seem to figure out how to upgrade from 5.20140420 to 5.20140421 + +> I move a file from a local repo to the archive folder but nothing happens except git-annex recording the move: (Recording state in git...) /Users/ovi/Sharing/git-annex/Finance/1-564 Erkl. z. Gebiets- u. Steuereigenschaft 08_04.pdf still has writers, not adding [2014-05-09 17:22:43 SAST] Committer: Committing changes to git + +It says the pdf still has writers.. Maybe the file is locked by another program? In this case the file is not going to be annexed, I believe, until the lock is revoked. + +"""]] diff --git a/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_3_372d9da8295d093b8b316f0a48b60ee1._comment b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_3_372d9da8295d093b8b316f0a48b60ee1._comment new file mode 100644 index 000000000..93f9ef414 --- /dev/null +++ b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_3_372d9da8295d093b8b316f0a48b60ee1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 3" + date="2014-05-12T11:03:59Z" + content=""" +So basically, I need to check the log for a specific commit and then restore that one? +No way to list i.e. all commits for a folder and restore the whole folder? +Or list all commits for a fiel and then restore that one? + +Still learning all of this, any hints welcome. +"""]] diff --git a/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_4_573537a49e082515bfb1be84c91b5d1b._comment b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_4_573537a49e082515bfb1be84c91b5d1b._comment new file mode 100644 index 000000000..01aac5111 --- /dev/null +++ b/doc/forum/git-annes_assistant_+_MAC_OSX_questions/comment_4_573537a49e082515bfb1be84c91b5d1b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 4" + date="2014-06-21T13:03:11Z" + content=""" +Any feedback on my last questions? +Is there a road map somewhere? Need to figure out if this is going somewhere soon or if I should look for another solution? +Any other kickstarter campaigns you're planning? Wouldn't mind chipping in if it means this goes somewhere fast(er) ;-) +"""]] diff --git a/doc/forum/git-annex:_map:_1_failed.mdwn b/doc/forum/git-annex:_map:_1_failed.mdwn new file mode 100644 index 000000000..10be60ca5 --- /dev/null +++ b/doc/forum/git-annex:_map:_1_failed.mdwn @@ -0,0 +1,12 @@ +What exactly does that mean? +I got that while exploring the git annex command: + +shiny-2:git-annex ovi$ pwd +/Users/ovi/Sharing/git-annex +shiny-2:git-annex ovi$ git annex map +map /Users/ovi/Sharing/git-annex ok + + running: dot -Tx11 /Users/ovi/Sharing/git-annex/.git/annex/map.dot + +failed +git-annex: map: 1 failed diff --git a/doc/forum/git-annex:_map:_1_failed/comment_1_35ff3256e823ab8cfc53276a2123ad5f._comment b/doc/forum/git-annex:_map:_1_failed/comment_1_35ff3256e823ab8cfc53276a2123ad5f._comment new file mode 100644 index 000000000..d1beb5909 --- /dev/null +++ b/doc/forum/git-annex:_map:_1_failed/comment_1_35ff3256e823ab8cfc53276a2123ad5f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T16:29:54Z" + content=""" +`dot` is a command from the graphviz package. Perhaps you do not have it installed. +"""]] diff --git a/doc/forum/git-annex:_map:_1_failed/comment_2_b0826073ebbd2847f4ab0d9bdba2dce5._comment b/doc/forum/git-annex:_map:_1_failed/comment_2_b0826073ebbd2847f4ab0d9bdba2dce5._comment new file mode 100644 index 000000000..b8841dd36 --- /dev/null +++ b/doc/forum/git-annex:_map:_1_failed/comment_2_b0826073ebbd2847f4ab0d9bdba2dce5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 2" + date="2014-05-16T17:21:09Z" + content=""" +indeed I didn't have it... was it stated somewhere that I need it? + +Busy installing it now... going to kill my 3g Connection :-/ + +sudo port install graphviz +---> Computing dependencies for graphviz +---> Dependencies to be installed: autoconf m4 automake fontconfig freetype gd2 jpeg libvpx tiff xpm xorg-libXext xorg-libX11 xorg-kbproto xorg-libXau xorg-xproto xorg-libXdmcp xorg-libxcb xorg-libpthread-stubs xorg-xcb-proto xorg-xextproto xorg-libXt xorg-libsm xorg-libice gts netpbm jasper jbigkit libLASi pango Xft2 xrender xorg-renderproto cairo libpixman xorg-xcb-util gobject-introspection libtool harfbuzz graphite2 poppler curl lcms2 openjpeg15 poppler-data urw-fonts webp xorg-libXaw xorg-libXmu +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment.mdwn b/doc/forum/git-annex___38___ikiwiki_experiment.mdwn new file mode 100644 index 000000000..5b426a180 --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment.mdwn @@ -0,0 +1,28 @@ +Hi, + +I've been experimenting with combining [ikiwiki](http://ikiwiki.info) with git-annex and it seems to work. Thought I'd post my process. I've [commented](http://ikiwiki.info/todo/git-annex_support/discussion/) on the ikiwiki website as well but perhaps it'd be of interest to git-annex folks. + +I have very little understanding of any of the tools involved and have just attempted to make it work using my limited knowledge. I don't use the web interface for ikiwiki which simplifies things. + +The [website in question](http://stockholm.kalleswork.net) just went online and is currently an archive of architectural photographs and the site relies heavily on the ikiwiki osm and album plugins. + +### Setting things up + +To start with I set up the wiki on the server and git clone to into `$wrkdir` on my laptop. I then initialize a git-annex repo in the `$srcdir` on the server. Leaving the `$gitdir` untouched. The `$scrdir` git-annex repo has to be in `direct` mode. Before doing any syncing I add `annex-ignore = true` and `annex-sync = false` to `.git/config` in the origin repo (`$gitdir`): this is to prevent polluting `$gitdir` with git-annex data. The same process is repeated in the `$wrkdir` on the laptop. + +### Pushing and syncing + +With this setup I can then `git add remote $srcdir`, `git add $file` and `git-push` mdwn files and other lightweight data from the laptop. While `git annex-add`, `git-annex sync` and `git-annex copy --to $srcdir` jpg's and other heavy files. All pure git commands work as expected with ikiwiki and the website recompiles etc. + +### Snags + +I'm frequently left with (non-dangling) symlinks in the `$srcdir` despite the annex repo being in direct mode. When this happens `git-annex fsck` sorts things out. + +Uploading image files does require a bit of manual work. But as this is done less frequently it's not much of an issue for me. I'm guessing that by doing things it the correct order (whatever that might be) I could avoid some of the manual work. + +The thing to keep in mind is to never `git-add` the typechanged annexed files in the $srcdir. In general I never use git commands in the $srcdir. + +The main problem is the symlinks though as they demand a manual `git-annex fsck`. I have no idea what causes the symlinks in a direct mode repo. + +Any comments? + diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_1_9f74449ec91577dbf6095f4beafac293._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_1_9f74449ec91577dbf6095f4beafac293._comment new file mode 100644 index 000000000..332f77bcc --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_1_9f74449ec91577dbf6095f4beafac293._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="how about the web interface?" + date="2013-09-25T11:09:58Z" + content=""" +I understand you do not use the web interface - but what if you did? would it commit all those files into git? + +Could we add the git-annex files to a .gitignore file? +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_2_e034585c8b51cc30b35c1f7ae68205bf._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_2_e034585c8b51cc30b35c1f7ae68205bf._comment new file mode 100644 index 000000000..2201813fe --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_2_e034585c8b51cc30b35c1f7ae68205bf._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="comment 2" + date="2013-09-25T11:58:42Z" + content=""" +I have very poor understanding of what ikiwiki actually does behind the scenes including how it uses the $srcdir and $gitdir. + +The only way I could see the web interface working would be to use the git-annex content expressions and having the assistant running on the server. That still doesn't prevent large files from being checked into git though? That all depends on which order ikiwiki can be made to do things. + +I might be able to test on a local wiki but that would have to wait a while. + + +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment new file mode 100644 index 000000000..63919bd22 --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 3" + date="2013-09-25T17:03:29Z" + content=""" +Interesting experiment. + +I don't know why you don't want to let git-annex sync its data to $gitdir. + +The symlinks could be occuring because of a bug in direct mode. (I have fixed many past bugs that caused that.) But just as likely it's because ikiwiki will run `git pull` in the srcdir. + +I think it would make more sense to use the underlay plugin and keep your annexed repository in a separate underlay. This would guarantee ikiwiki doesn't run git commands in there, and would ensure that nothing done with the web interface could mess with the annex. +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_4_55da5c3c41c13b08590ce1ff8117cef6._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_4_55da5c3c41c13b08590ce1ff8117cef6._comment new file mode 100644 index 000000000..6299326a8 --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_4_55da5c3c41c13b08590ce1ff8117cef6._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="comment 4" + date="2013-09-25T18:28:40Z" + content=""" +@Joey + + > I don't know why you don't want to let git-annex sync its data to $gitdir. + +Well neither do I! :) It seemed to be the way to avoid duplicating data while still having the images picked up by the ikiwiki album plugin. Wouldn't the files in the $gitdir end up duplicated in $srcdir? + + > The symlinks could be occuring because of a bug in direct mode. + > (I have fixed many past bugs that caused that.) But just as likely + > it's because ikiwiki will run git pull in the srcdir. + +When you mention it I've had similar problems with my vfat usb annex repos. Using the post-receive merge hook to make files visible for non git-annex devices about town. Nothing I can reliably recreate but I will keep my eye out for bugs. + + > I think it would make more sense to use the underlay plugin and keep + > your annexed repository in a separate underlay. + +Yep that would be ideal. For my usecase the album plugin is vital and I can't understand how album would pick up and deal with images in an underlay dir. This is a bit OT for this site though most of my questions are ikiwiki related. +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_5_f67823351164ddfe7d595685c3679652._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_5_f67823351164ddfe7d595685c3679652._comment new file mode 100644 index 000000000..2701bd4af --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_5_f67823351164ddfe7d595685c3679652._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="comment 5" + date="2013-09-26T06:56:49Z" + content=""" +Turns out using the underlay was a piece of cake! Just mirror the folder structure of the repo in your underlaydir put your jpegs there and off you go. Images are picked up by the album plugin and it all just works. No need to coax git-annex into doing odd stuff. + +Thought I'd post this for other ikiwikers. +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_6_d5cc91164772849d027fed5f962d9000._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_6_d5cc91164772849d027fed5f962d9000._comment new file mode 100644 index 000000000..1d3abdf5d --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_6_d5cc91164772849d027fed5f962d9000._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="step by step?" + date="2013-09-26T09:40:57Z" + content=""" +So how does this actually work in practice? Is the underlay directory a completely disconnected repository? + +Can we have step by step instructions on how to set this up? +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment new file mode 100644 index 000000000..8e387d89a --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="comment 7" + date="2013-09-26T13:05:53Z" + content=""" +@anarcat + + > Can we have step by step instructions on how to set this up? + +[I described the ikiwiki album setup](http://ikiwiki.info/forum/ikiwiki_with_album___38___underlay_plugins/) on the ikiwiki website as there are no git-annex tricks anymore. Just standard behaviour. + + > So how does this actually work in practice? Is the underlay directory a + > completely disconnected repository? + +Yes they are completely separate repos. Really the underlay dir could be managed in any way you like svn, rsync, ftp etc. I didn't expect the album plugin to pick everything up but apparently it does! Perhaps underlays are completely integrated and appear as 'normal' to all of ikiwiki? +"""]] diff --git a/doc/forum/git-annex___38___ikiwiki_experiment/comment_8_86565e5e1508ff1862f88975446650a2._comment b/doc/forum/git-annex___38___ikiwiki_experiment/comment_8_86565e5e1508ff1862f88975446650a2._comment new file mode 100644 index 000000000..473551f65 --- /dev/null +++ b/doc/forum/git-annex___38___ikiwiki_experiment/comment_8_86565e5e1508ff1862f88975446650a2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="comment 8" + date="2013-09-26T13:10:25Z" + content=""" +Yes, I believe that is the way the underlay works - the files are just picked up. + +As for the ikiwiki forum post - maybe you should move it to the \"tips\" section? :) + +Thanks for the documentation!! +"""]] diff --git a/doc/forum/git-annex_across_two_filesystems.mdwn b/doc/forum/git-annex_across_two_filesystems.mdwn new file mode 100644 index 000000000..1e95a793c --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems.mdwn @@ -0,0 +1,30 @@ +Hi everyone, + +I need some suggestions on how to operate git-annex best in my setup. + +I need git-annex mainly for its ability to have directories of all my data on all my nodes but not for the data redundancy it can provide. +I have one node that contains 2 filesystems that I want to merge in one git-annex repository. One filesystem (lets call it SAFE) is on top of a RAID1 between two 1TB hds. The other (BIG) is on top of a 3TB hd. SAFE holds data I do not want to loose (like digital pictures). BIG holds data that I can loose. + +I do not have enough disk space on other nodes to get rid of the RAID1. + +This is how I mount my filesystems: + +SAFE at ~/AllData/ + +BIG at ~/AllData/bigfiles/ + +The root of the git repository is at ~/AllData/ however when I do: + +git-annex add ~/AllData/bigfiles/file1 +It says: +add bigfiles/file1 failed + +I assume that is because of file1 being on a different filesystem. + +Do I have to create two repositories: one for each filesystem or do you have any ideas on how to use git-annex best in this scenario? +Having two repositories also has the disadvantage that I need two repositories on all other nodes am I right? + +Thanks for you suggestions + + + diff --git a/doc/forum/git-annex_across_two_filesystems/comment_1_53167648b8b70b41d19ca662a5f3687e._comment b/doc/forum/git-annex_across_two_filesystems/comment_1_53167648b8b70b41d19ca662a5f3687e._comment new file mode 100644 index 000000000..cd363948c --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems/comment_1_53167648b8b70b41d19ca662a5f3687e._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-22T19:48:55Z" + content=""" +git-annex stores the contents of files inside `.git/annex/objects`. The `git annex add` is failing because it cannot `rename()` the file into that directory, because it is on a different filesystem. Even if it did a more expensive move of the file, it would not do what you want, because all the files would be moved to the `.git/annex/objects` directory, which is stored on your smaller drive. + +The way git-annex is intended to be used with multiple drives is this: + +* Make a separate git repository on each drive. +* Set up git remotes connecting these repositories together. You don't have to connect them all up, but at least make + the git repository on your main filesystem have a remote for each git repository on other drives. +* Use `git annex sync` to keep the git repositories in sync. (Or do it manually with `git pull`) +* When you want a file to be available in the local repository, use `git annex get $file` to get it. +* When your local repository is getting too full, use `git annex drop` or `git annex move` to flush files + out to the other drive(s). + +The [[walkthrough]] goes through an example of adding a removable USB drive this way, but you can do the same thing for +non-removable drives. + +> Having two repositories also has the disadvantage that I need two repositories on all other nodes am I right? + +No -- you combine the two repositories, so any clone of either one contains all the files in both. Other notes then only need one +repository. However, for another node to be able to get files from both repositories on this node, it will need to have two git remotes configured, one for each repository. +"""]] diff --git a/doc/forum/git-annex_across_two_filesystems/comment_2_39adeebc1af9c437f1fc2e00c07509bf._comment b/doc/forum/git-annex_across_two_filesystems/comment_2_39adeebc1af9c437f1fc2e00c07509bf._comment new file mode 100644 index 000000000..ef57bdfec --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems/comment_2_39adeebc1af9c437f1fc2e00c07509bf._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.215.244" + subject="comment 2" + date="2013-04-27T17:14:43Z" + content=""" +It works fine. After it is set up with the client as described, sync is automatic from the Assistant. + +What I find cumbersome is the fact that I need to manually call \"git annex sync\" on the remote (usb or local ssh) to view (generate) the link. Is there a way to avoid this extra step ? + +"""]] diff --git a/doc/forum/git-annex_across_two_filesystems/comment_3_f4e3f28db005301adeef7ccd2c9998fb._comment b/doc/forum/git-annex_across_two_filesystems/comment_3_f4e3f28db005301adeef7ccd2c9998fb._comment new file mode 100644 index 000000000..52a8f5565 --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems/comment_3_f4e3f28db005301adeef7ccd2c9998fb._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="Marek" + subject="I should have thought of this" + date="2013-04-30T19:55:19Z" + content=""" +Thanks joey, I thought of the object storage just yesterday and that the drive where it resides needs to be the big one. + +I think that I will do it as you described with one addition: + +I set up the git-annex repository on my big drive. Lets call that BIG. +Then I set up another on the smaller drive (or raid) and set both to sync. Lets call that RAID. + +BUT: Can I use num copies to tell BIG to only sync files in certain directories to RAID. Or will syncing sync everything regardless? + +Thanks for your help + +"""]] diff --git a/doc/forum/git-annex_across_two_filesystems/comment_4_53fa7ac6f80e3281768a7bfd3d438b34._comment b/doc/forum/git-annex_across_two_filesystems/comment_4_53fa7ac6f80e3281768a7bfd3d438b34._comment new file mode 100644 index 000000000..bab1a8b02 --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems/comment_4_53fa7ac6f80e3281768a7bfd3d438b34._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="Marek" + subject="Another correction" + date="2013-04-30T20:11:57Z" + content=""" +sync just syncs the meta data but not the objects itself right? I have to do an explicit git-annex copy -to or copy -from? + + +"""]] diff --git a/doc/forum/git-annex_across_two_filesystems/comment_5_2e1be54c01970ef3456e8af4aaf00cbf._comment b/doc/forum/git-annex_across_two_filesystems/comment_5_2e1be54c01970ef3456e8af4aaf00cbf._comment new file mode 100644 index 000000000..83644a554 --- /dev/null +++ b/doc/forum/git-annex_across_two_filesystems/comment_5_2e1be54c01970ef3456e8af4aaf00cbf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-30T21:57:13Z" + content=""" +Yes, `git annex sync` only syncs the metadata. + +If you have numcopies set to to, and run `git annex copy --to RAID --auto`, it will only copy files that have less than 2 copies. (Same with `git annex copy --from BIG --auto` or `git annex get --auto`) +"""]] diff --git a/doc/forum/git-annex_and_tagfs.mdwn b/doc/forum/git-annex_and_tagfs.mdwn new file mode 100644 index 000000000..1ef40aea1 --- /dev/null +++ b/doc/forum/git-annex_and_tagfs.mdwn @@ -0,0 +1,14 @@ +Hi, + +Thanks for git-annex, really a great project. +Another related feature which would be useful to have is described by tagfs [3][] [4][], experimental implementations such as [tagfs over fuse][1], and [tagsistant][2] exist, but having a solution within the power of git-annex would really be attractive. + +How hard would this be to implement within the existing infrastructure? +Thanks. + +related post: [[multiple_sym_links___40__for_tagging_photos__41____63__]] + +[1]: http://code.google.com/p/tagfs/ +[2]: www.tagsistant.net/ +[3]: http://site.xam.de/2006/01-tagfs.pdf +[4]: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CE4QFjAF&url=http%3A%2F%2Fweb.mit.edu%2F6.033%2F2011%2Fwwwdocs%2Fwriting-samples%2Fsbezek_dp1.pdf&ei=ILQkUdqxMueR0QWgx4CwDw&usg=AFQjCNE1eWeFxmaxzOLZYVsb0tomqWNQaw&bvm=bv.42661473,d.d2k diff --git a/doc/forum/git-annex_and_tagfs/comment_1_887c74cb61d30198322ef74ebc80f950._comment b/doc/forum/git-annex_and_tagfs/comment_1_887c74cb61d30198322ef74ebc80f950._comment new file mode 100644 index 000000000..95739bd93 --- /dev/null +++ b/doc/forum/git-annex_and_tagfs/comment_1_887c74cb61d30198322ef74ebc80f950._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 1" + date="2013-02-24T21:52:41Z" + content=""" +I welcome people doing this kind of thing with git-annex. Since you can have multiple files linking to the same content easily, it should be a reasonable platform with which to build something like this. +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers.mdwn b/doc/forum/git-annex_assistant_with_2_dedicated_servers.mdwn new file mode 100644 index 000000000..1544b14ef --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers.mdwn @@ -0,0 +1,11 @@ +Hello, + +I am looking for a solution to replicate lots of files between 2 servers (with dedicated IP address) over WAN. (I already looked at GlusterFS, DRBD, Bittorent-Sync and ownCloud, but comments are welcome). Now I am evaluating git-annex but it is (kind of) hard to get the concepts as I am not familiar with git. + +I could already connect the servers by following the steps of "remote sharing walkthrough" but I feel that using a 3rd special node (as "transfer repository" / rsync or ssh) is an overhead and should not be needed. But no matter how hard I tried, I couldn't make the 2 servers do a sync without a special node. + +Could you please give me a hint how to do it? Or even better, some detailed steps. :) + +Thanks, + +David diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_10_533ade2215c879cd46782fd66a97b167._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_10_533ade2215c879cd46782fd66a97b167._comment new file mode 100644 index 000000000..ec7dc0f86 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_10_533ade2215c879cd46782fd66a97b167._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="comment 10" + date="2013-11-16T23:15:49Z" + content=""" +Great. Understood. :) Thanks. + +Although there is one more thing that I don't really understand. Why do we need 2 repositories. In my mind (without knowing git) I thout it would work with one repository, where both server1 and server2 can upload/download files and they got synced through this. + + server1 <-> repository (somewhere, eother server1 or server2) <-> server2 + +Now they use different repositories and I don't get why. Also I don't get how conflict-handling can be done if there are 2 repositories for the 2 transfer-ways. + +Sorry to bother you with this. +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_11_c9ae51d7b772cf7a91d90925f74d2b60._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_11_c9ae51d7b772cf7a91d90925f74d2b60._comment new file mode 100644 index 000000000..f614d066d --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_11_c9ae51d7b772cf7a91d90925f74d2b60._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 11" + date="2013-11-16T23:25:26Z" + content=""" +When using git, each place you access your files is a separate repository. Thus, you have: + +server1 (repository) <--> server2 (repository) +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_12_41fbee0ec9bc890e309bcd48a58c3851._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_12_41fbee0ec9bc890e309bcd48a58c3851._comment new file mode 100644 index 000000000..d707de6e1 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_12_41fbee0ec9bc890e309bcd48a58c3851._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="comment 12" + date="2013-11-18T11:25:06Z" + content=""" +Hello, + +Thanks for your help and explanation. Now I had some time to test git-annex and I had a sad experience. I tried to sync the files from server1 to server2 (as described before). We are talking about 87000 small files (these are maildir folders and each file is an e-mail) with the total size of 19 Gbytes. After a few hours git-annex assistant consumed all memory on both servers ... and then all swap ... and then kernel killed git-annex. The servers have 512 MB RAM and 1 GB swap. + +According to the Scalability page (http://git-annex.branchable.com/scalability/) the \"memory usage should be constant\" and I am sure I didn't run \"git-annex unused\". + +Is this memory consumption normal or it might be a bug? What shall we do? + +Thanks, + +David +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_13_571cffc0beb8ba5fc936db6971cd3d62._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_13_571cffc0beb8ba5fc936db6971cd3d62._comment new file mode 100644 index 000000000..aefe98813 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_13_571cffc0beb8ba5fc936db6971cd3d62._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="comment 13" + date="2013-11-19T09:17:26Z" + content=""" +Please tell me if/how I can help you. For example if you need access to servers to test... +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_14_0fb62af673a4bc8183e8fef048ceedd4._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_14_0fb62af673a4bc8183e8fef048ceedd4._comment new file mode 100644 index 000000000..7a4b80aa9 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_14_0fb62af673a4bc8183e8fef048ceedd4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 14" + date="2013-12-16T20:36:14Z" + content=""" +I see the assistant spike up to around 150 mb when adding a lot of files, then drop back down once it finishes one batch (limited to around 5000 files) and moves on to the next. + +You might need to file a bug report with some more details so I can reproduce the problem. +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_1_53a79af2d8e3abe50b983bf91972b8f2._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_1_53a79af2d8e3abe50b983bf91972b8f2._comment new file mode 100644 index 000000000..f6f058988 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_1_53a79af2d8e3abe50b983bf91972b8f2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-16T17:42:48Z" + content=""" +The [[assistant/remote sharing walkthrough]] assumes that the computers are not servers, so they might not be turned on at the same time, and cannot directly contect each other. + +With 2 servers, it's much simpler. Just add a git remote on each pointing at the git repository on the other server, and run the git-annex assistant on both to keep them in sync. + +You can add the git remote with `git remote add otherserver ssh://otherserver/path/to/repo`, or you can use the webapp to do it (Add another repository -> Remote server) + +(If your WAN puts the servers on the same virtual subnet, ie a VPN, you can also probably use local pairing over the WAN to get to the same setup by a different route.) +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment new file mode 100644 index 000000000..8c4bb5922 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="still need some clarification" + date="2013-11-16T22:02:46Z" + content=""" +Hello, + +Thanks for your reply. I guessed that there is an easier, direct way to do it. But unfortunately I still need some clarification. This is how I tried: + +1. Cleared everything to start from scratch. +2. I started git-annex on server1: screen git annex webapp --listen=server1_ip, opened the webapp and created the local repository /media/mail +3. I configured the XMPP account on server1. +4. Started git-annex on server2: screen git annex webapp --listen=server2_ip, opened the webapp and created the local repository /media/mail +5. I configured the XMPP account on server2. + +And here comes the confusing part: + +6. On server1 I clicked Add another repository / Remote server: and configured ssh server2 to the same folder: /media/mail. I chose client repository group instead of transfer. (I am not sure if I did it right) ... but server1 started sync-ing. +7. On server2 I clicked Add another repository / Remote server: and configured ssh server1 to the same folder: /media/mail. Then I received an error message: + + Failed to make repository + Something went wrong setting up the repository on the remote server. + + Transcript: + + init error: could not lock config file /media/mail-test/mail/.git/config: Permission denied + git-annex: git [Param \"config\",Param \"annex.version\",Param \"3\"] failed + +Cold you please help me where I did wrong? + +Thanks, + +David +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_3_60c39bc8ef74e80e72381d514b6dd223._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_3_60c39bc8ef74e80e72381d514b6dd223._comment new file mode 100644 index 000000000..f9e405b70 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_3_60c39bc8ef74e80e72381d514b6dd223._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-16T22:18:20Z" + content=""" +It seems to me that you probably told git-annex to log into server2 as a user that does not have write access to sever2:/media/mail. Check the username field in the remote repository form. +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_4_6241120b4325c905661ef72881f4d7af._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_4_6241120b4325c905661ef72881f4d7af._comment new file mode 100644 index 000000000..bb7c19389 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_4_6241120b4325c905661ef72881f4d7af._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="still need some clarification" + date="2013-11-16T22:31:07Z" + content=""" +Hey, + +Yes, you were right. The ssh user did not have privileges to read/write the folder. Now I have corrected this issue and things started sync-ing. + +But I am afraid, this is not exactly the thing I wanted to achieve. My goal was to sync from folder to folder ... and not from folder to repository both ways. + +So, what I would like to do is that if I create a file at server1 (e.g. /media/mail/test01.txt) then it should appear at server2 at /media/mail/test01.txt. + +How can I achieve this? + +Thanks a lot. + +David +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_5_cab00b8fa195340f4d3fdaf5af975b57._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_5_cab00b8fa195340f4d3fdaf5af975b57._comment new file mode 100644 index 000000000..179a65a99 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_5_cab00b8fa195340f4d3fdaf5af975b57._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 5" + date="2013-11-16T22:55:34Z" + content=""" +Well, that's what should happen. What behavior are you seeing? What version of git-annex are you using? +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_6_e24df9a1c68724a912b8ac6533d9bd25._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_6_e24df9a1c68724a912b8ac6533d9bd25._comment new file mode 100644 index 000000000..a28e947dd --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_6_e24df9a1c68724a912b8ac6533d9bd25._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="comment 6" + date="2013-11-16T22:58:15Z" + content=""" +Hello, + +Yes, meanwhile files started appearing. :) Maybe I just did not wait enough time. + +So, I have just one more question. Shall I set the remote ssh repositories to client or transfer? I read the docs and understand the difference, but in my case I simply cannot decide. + +Thanks a lot for your hard work and great support. + +David +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_7_ace3dc7c60c710a04b0a587206b341c4._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_7_ace3dc7c60c710a04b0a587206b341c4._comment new file mode 100644 index 000000000..c41fe492f --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_7_ace3dc7c60c710a04b0a587206b341c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 7" + date="2013-11-16T23:04:29Z" + content=""" +In your situation, you do not have or need a repository whose only job is to transfer files between two other client repositories. So the right choice for your repositories is client -- or something else possibly -- but almost certainly not transfer. +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment new file mode 100644 index 000000000..1d0f1db52 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="David" + ip="178.21.48.117" + subject="comment 8" + date="2013-11-16T23:09:32Z" + content=""" +Okay. One last question. Could you please help me understand how this sync works now? + +So for example if I save a file on server1, it gets pushed to server2's repository. But how is it translated back to a normal file from the repository? + +And in this case will this file be on server2's repository as well (so are there 2 copies on server2, one in the repository and one human-readabl)? + +Thanks! +"""]] diff --git a/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_9_ea88e0696f6e25e6904248a323f6cc36._comment b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_9_ea88e0696f6e25e6904248a323f6cc36._comment new file mode 100644 index 000000000..cafac1077 --- /dev/null +++ b/doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_9_ea88e0696f6e25e6904248a323f6cc36._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 9" + date="2013-11-16T23:11:58Z" + content=""" +Since you created these repositories with the webapp, they default to using [[direct_mode]]. git-annex handles putting the files in place when they are transferred to the repository. Only 1 copy is made, there is no separate copy in the repository. +"""]] diff --git a/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS.mdwn b/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS.mdwn new file mode 100644 index 000000000..e2be4fd22 --- /dev/null +++ b/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS.mdwn @@ -0,0 +1,7 @@ +Hi, + +Is there a chance to get a build of git-annex for the Nokia N9 smartphone with Meego Harmattan and later for Sailfish OS (Jolla phone)? +Git is already available for Meego Harmattan: http://www.who.is.free.fr/wiki/doku.php?id=harmattan + +Cheers, +Tobias diff --git a/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS/comment_1_301a51c48c3d54f9d37feace26a772f8._comment b/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS/comment_1_301a51c48c3d54f9d37feace26a772f8._comment new file mode 100644 index 000000000..d6464b679 --- /dev/null +++ b/doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS/comment_1_301a51c48c3d54f9d37feace26a772f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="paulvt" + ip="2001:1af8:ff19:0:a288:b4ff:fe2c:f600" + subject="comment 1" + date="2013-07-13T08:21:29Z" + content=""" +I've just checked and almost all of the depends that Debian Sid on my laptop has, the N9 has. But in the case of build-depends, they are nowhere near since the entire Haskell stack is not available... +"""]] diff --git a/doc/forum/git-annex_communication_channels.mdwn b/doc/forum/git-annex_communication_channels.mdwn new file mode 100644 index 000000000..8c56ac36a --- /dev/null +++ b/doc/forum/git-annex_communication_channels.mdwn @@ -0,0 +1,10 @@ +Thought I'd ask how y'all are finding the current communication by this forum/website/git repo only. + +Would there be a benefit to having an irc channel for git-annex? + +Maybe a mailing list? (Any persuasive reason why it would be better than this forum?) + +Are the existing RSS feeds on this site, for eg, new [[comments]] and posts to this forum, sufficient to keep up with +things? + +--[[Joey]] diff --git a/doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment b/doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment new file mode 100644 index 000000000..163aae02c --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-28T15:48:08Z" + content=""" +No matter what you end up doing, I would appreciate a git-annex-announce@ list. + +I really like the persistence of ikiwiki, but it's not ideal for quick communication. I would be fine with IRC and/or ML. The advantage of a ML over ikiwiki is that it doesn't seem to be as \"wasteful\" to mix normal chat with actual problem-solving. But maybe that's merely my own perception. + +Speaking of RSS: I thought I had added a wishlist item to ikiwiki about providing per-subsite RSS feeds. For example there is no (obvious) way to subscribe to changes in http://git-annex.branchable.com/forum/git-annex_communication_channels/ . + +FWIW, I resorted to tagging my local clone of git-annex to keep track of what I've read, already. + + +-- RichiH +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment b/doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment new file mode 100644 index 000000000..09a2b8c1a --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2011-03-28T18:35:50Z" + content=""" +I think the forums/website currently is sufficient, I do at times wish there was a mailing list or anonymous git push to the wiki as I find editing posts through the web browser is some times tedious (the lack of !fmt or alt-q bugs me at times ;) ). The main advantage of keeping stuff on the site/forum is that everything gets saved and passed on to anyone who checks out the git repo of the code base. +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment b/doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment new file mode 100644 index 000000000..72a48445e --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-03-28T20:47:23Z" + content=""" +Push access to the non-code bits of git-annex' ikiwiki would be very welcome indeed. Given the choice, I would rather edit everything in Vim than in a browser. -- RichiH +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment b/doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment new file mode 100644 index 000000000..d6bba9365 --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="comment 4" + date="2011-04-13T17:53:26Z" + content=""" +.1 cents: Having IRC would be really nice for seeking quick help. E.g. like I was trying to do now, google lead me to this page. +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment b/doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment new file mode 100644 index 000000000..042dcc1f3 --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 5" + date="2011-04-14T11:24:59Z" + content=""" +I would also like an git-annex channel. Would be #git-annex@OFTC ok? +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment b/doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment new file mode 100644 index 000000000..8dfd0f820 --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 6" + date="2011-04-15T19:32:08Z" + content=""" +We seem to be using #vcs-home @ OFTC for now. madduck is fine with it and joeyh pokes his head in there, as well. I just added a CIA bot to #vcs-home and this comment is a test if pushing works. -- RichiH +"""]] diff --git a/doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment b/doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment new file mode 100644 index 000000000..830d678ca --- /dev/null +++ b/doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="anonymous git push" + date="2011-05-19T19:21:51Z" + content=""" +@Jimmy mentioned anonymous git push -- that is now enabled for this wiki. Enjoy! + +I may try to spend more time on #vcs-home -- or I can be summoned there from my other lurking places on irc, I guess. +"""]] diff --git a/doc/forum/git-annex_on_OSX.mdwn b/doc/forum/git-annex_on_OSX.mdwn new file mode 100644 index 000000000..a00548366 --- /dev/null +++ b/doc/forum/git-annex_on_OSX.mdwn @@ -0,0 +1 @@ +See [[install/OSX]]. diff --git a/doc/forum/git-annex_on_Samba_share.mdwn b/doc/forum/git-annex_on_Samba_share.mdwn new file mode 100644 index 000000000..0235820c0 --- /dev/null +++ b/doc/forum/git-annex_on_Samba_share.mdwn @@ -0,0 +1,9 @@ +I want to put my photos into a git-annex repository, syncing it with my girlfriends computer and our NAS. +If possible, I'd like to be able to add files to the NAS and have them synced, so I guess a special remote doesn't work here. + +Unfortunately, git-annex doesn't run on my NAS directly (yet), so I thought of mounting the NAS with CIFS, and creating an annex there that syncs with the local ones. +While this seems to work fine with one computer, I wonder what will happen if I mount the Samba share on my and my girlfriend's computer at the same time. + +In theory, the NAS supports Samba Unix extensions which includes POSIX locking, but a weird bug that prevents you from removing a named pipe from Samba, making git-annex init fail (sent a bug report to Synology). When I disable Unix extensions it works. It then detects a crippled file system though. + +Any thoughts? diff --git a/doc/forum/git-annex_on_Samba_share/comment_1_3e9cfdf2c088e48c967ad08f79966742._comment b/doc/forum/git-annex_on_Samba_share/comment_1_3e9cfdf2c088e48c967ad08f79966742._comment new file mode 100644 index 000000000..dead48316 --- /dev/null +++ b/doc/forum/git-annex_on_Samba_share/comment_1_3e9cfdf2c088e48c967ad08f79966742._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="Update" + date="2013-06-26T17:26:05Z" + content=""" +After reading trough this again, I'd like to rephrase my question. + +Is it safe if two independent assistants access the same repository at the same time (assuming locking works)? + +But, much more important, a big thanks for creating git-annex! I'm using it successfully to keep my files in sync at home and at work and I think it is a really amazing tool. So thanks for the hard work! +"""]] diff --git a/doc/forum/git-annex_on_Samba_share/comment_2_9d3df393b7b727653598453d94dd33db._comment b/doc/forum/git-annex_on_Samba_share/comment_2_9d3df393b7b727653598453d94dd33db._comment new file mode 100644 index 000000000..7b17cb2a2 --- /dev/null +++ b/doc/forum/git-annex_on_Samba_share/comment_2_9d3df393b7b727653598453d94dd33db._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 2" + date="2013-06-26T17:40:21Z" + content=""" +If you're asking if you can run two git-annex assistant programs inside the same repository at the same time, the answer is no. Assuming locking works (grin), the second program will detect the first is running and refuse to start. + +If your question is, can two or more git-annex assistant or other programs, running in separate repositories, access files in the same remote safely at the same time, the answer is yes! You can, for that matter, run multiple git-annex commands at the same time in the same repository, and they're also entirely safe, thanks to some locking it does. + +You should post your story to [[design/assistant/blog/day_288__success_stories]]! +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn new file mode 100644 index 000000000..1a00326d7 --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn @@ -0,0 +1,12 @@ +I am trying to get git-annex working on Ubuntu, specifically 13.04 and now 13.10 (I thought upgrading to a new distro. would fix the issue). + +I have tried: + + * installing via apt-get install git-annex + * installing via cabal (full-build) + +Both times git-annex install successfully with no errors. I then start the webapp and create a repository (which git-annex creates successfully), I then add the folders and files I want it to sync. Git-annex finds the files and says it has began syncing them, but it never moves past the first batch of files it 'says' it had started syncing. I have waited 5+ hours at one point and nothing has changed. Also, the webapp is incredibly slow, it takes 15+ seconds to perform ANY action (such as saving options or viewing the logs). The issue definitely isn't my computer as I am using an high-end SSD, core i7, DDR3 RAM, etc... + +Also the logs produce no errors of any kind and actually show git-annex adding files, most of the log entries say add 'filedirectory/filename.txt' as an example. + +I have gotten this to successfully work on Fedora, but Ubuntu (13.04/13.10) is having serious problems. diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_1_209956f3812450a43986d4ca5e647da6._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_1_209956f3812450a43986d4ca5e647da6._comment new file mode 100644 index 000000000..2c4cbd291 --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_1_209956f3812450a43986d4ca5e647da6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-22T17:57:27Z" + content=""" +I don't really understand the problem you're describing. Is the problem with it uploading the files it's added to another remote? Does it sit there saying \"syncing with $remote\" forever? Or what? + +As to the webapp speed problem, it seems likely to me this is not related to CPU speed or load. It sounds rather like a DNS timeout problem, or an ipv6 to ipv4 fallback problem. Although since the URL to the webapp is http://127.0.0.1, it can't really be either of those.. +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_12a58b8efe545e09b64760c87849839b._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_12a58b8efe545e09b64760c87849839b._comment new file mode 100644 index 000000000..6e2d780ec --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_12a58b8efe545e09b64760c87849839b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEeLtIxQCU0qe4q5lbrZp8AcUSUUcRrkg" + nickname="Zach" + subject="comment 3" + date="2013-10-23T02:01:09Z" + content=""" +The problem is not with a remote annex. The issue I am having is git-annex never finishes syncing. + +Maybe a screenshot will help. http://i.imgur.com/9HSr8bl.png + +It never gets passed the Startup scan. +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_e0f7328603256f25c3be3706ecc9c76c._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_e0f7328603256f25c3be3706ecc9c76c._comment new file mode 100644 index 000000000..413a807ad --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_e0f7328603256f25c3be3706ecc9c76c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 3" + date="2013-10-23T15:27:40Z" + content=""" +Your screenshot shows git-annex is in the process of adding 6244 files. Depending on the size of those files, it could take some time to read their contents in order to calculate a checksum and add them to the repository. This would not normally take hours, unless your disk is very slow or the files are extremely big. + +You might get some useful information if you enable debugging (Configuration -> Preferences -> Enable debug logging) and look at the log. + +(This is not \"syncing\" btw. You have not set up any other repository for it to sync data with.) +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_4_6bb8e4522241556fb82784d9b834cbfe._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_4_6bb8e4522241556fb82784d9b834cbfe._comment new file mode 100644 index 000000000..314d01e89 --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_4_6bb8e4522241556fb82784d9b834cbfe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEeLtIxQCU0qe4q5lbrZp8AcUSUUcRrkg" + nickname="Zach" + subject="comment 4" + date="2013-10-25T20:40:26Z" + content=""" +Everything works, it was just taking a while on one the folders; let it run overnight, and it was done. + +Thanks for the help! +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_5_89a5296b461d400b51006074a13a4560._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_5_89a5296b461d400b51006074a13a4560._comment new file mode 100644 index 000000000..e6508fe54 --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_5_89a5296b461d400b51006074a13a4560._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-10-26T15:53:28Z" + content=""" +Can you confirm that the files in the directory it was adding were so large that it would normally take hours to checksum them all? +"""]] diff --git a/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_6_62daef4b4392c951b914a01b3effac11._comment b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_6_62daef4b4392c951b914a01b3effac11._comment new file mode 100644 index 000000000..4adcc568f --- /dev/null +++ b/doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_6_62daef4b4392c951b914a01b3effac11._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEeLtIxQCU0qe4q5lbrZp8AcUSUUcRrkg" + nickname="Zach" + subject="comment 6" + date="2013-10-26T21:05:07Z" + content=""" +The folder that took a while is actually only 291.5 MB total, containing 25,977 items in total. I know that is the folder that was having some issues because I committed each folder separately. +"""]] diff --git a/doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn b/doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn new file mode 100644 index 000000000..edfd0ad4e --- /dev/null +++ b/doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn @@ -0,0 +1,20 @@ +Hi! + +I can't get git-annex to run on my archlinuxARM sytem. It fails with + + $ git annex test + error: git-annex died of signal 11 + + Its a RaspberryPi (model B I think) so its an ARM11 (armv6h if I'm not mistaken). I use archlinuxarm because I am familiar with the distribution and you can have a very lean system. There is a very crude package for git-annex arm and armv7 that is build like this: https://github.com/archlinuxarm/PKGBUILDs/blob/master/alarm/git-annex/PKGBUILD . Crude, because it just takes the debian package, changes the version of libraries where apropriate and packs it as archlinux package. Two problems: 1) It's not been tested on armv6. 2) The 4.20130417 version does not exist anymore on the debian mirrors. + +1. The debian package is not marked as armv5 or armv7 specific and is runs on the RaspberryPi with Raspbian (but in an pretty old version if I remember correctly). So I would have imagined it runs on armv6h in general.\\ +2. I just did the same magic as in the linked PKGBUILD with a more current version to build the package but it still crashes. Can I get the old version anywhere to check if it works with that? + + +Cheers, + Hannes + +Background for whoever's interested :) +I tried to set up a RaspberryPi to manage my files, contacts and calendars. That shouts out loud for owncloud because of its convenience (caldav, carddav, webdav and a nice interface bundled together). However, compared to git-annex owncloud is unbearably slow (on an RaspberryPi) and lacks git-annex's easy way to keep your files sorted even if you don't have them on your local disk. + +For these reasons I tried to install a hybrid git-annex/owncloud system. There, basically, the files are served by owncloud but at the same time also managed (and served) by git-annex (+ssh). As far as I can see that should not have any noticeable side effects in my use case (mostly single user). I have some external hard drives connected to the RaspberryPi of which I will just symlink the appropriate folders to the owncloud 'files' folder. This way I can also just take the drives with me and still have the same (UUID) git annex repository on them. Any comments? diff --git a/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_1_88fa644df8614c2db0d092b3eb1d3156._comment b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_1_88fa644df8614c2db0d092b3eb1d3156._comment new file mode 100644 index 000000000..516ec0017 --- /dev/null +++ b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_1_88fa644df8614c2db0d092b3eb1d3156._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T16:56:50Z" + content=""" +You seem to be trying to take a binary built for one distribution with one CPU architecture and use it on another distribution on another CPU architecture. It's not very susprising that this does not work. + +Compiling git-annex from source for your particular architecture and distribution should not be difficult. +"""]] diff --git a/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_2_b25ca7520ff7e339ec887a379d5100ee._comment b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_2_b25ca7520ff7e339ec887a379d5100ee._comment new file mode 100644 index 000000000..c0a13cfa4 --- /dev/null +++ b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_2_b25ca7520ff7e339ec887a379d5100ee._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNvX8PQVP5sLzQ78sKpB6VeH3Fu8HvZ5g" + nickname="Jeff" + subject="comment 2" + date="2014-01-26T04:29:09Z" + content=""" +I've actually been having a pretty tough time with it. Could you point me in the right direction? There's not any Haskell infrastructure on Arch ARM yet so I'd either be compiling the whole Haskell Platform or cross-compiling on x86_64 right? +Thanks +Jeff +"""]] diff --git a/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_3_eda0e90c1285396b1ab20ecc04ea6e29._comment b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_3_eda0e90c1285396b1ab20ecc04ea6e29._comment new file mode 100644 index 000000000..5c8f96ac3 --- /dev/null +++ b/doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_3_eda0e90c1285396b1ab20ecc04ea6e29._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.46" + subject="comment 3" + date="2014-01-26T17:59:52Z" + content=""" +Well, yes, the first step will be getting a ghc for the architecture, and then it's just a matter of following [[install/cabal]] +"""]] diff --git a/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch.mdwn b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch.mdwn new file mode 100644 index 000000000..c5d4c40bc --- /dev/null +++ b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch.mdwn @@ -0,0 +1,7 @@ +on a Mac OSX 10.9.1 client I would like to try out git-annex. + +I download the latest Mavericks build, extract from the .dmg and it just does not run. I open the program, one "bounce" on the dock and it is gone, nothing happens. + +I sadly do not have another OSX client to try it on. But nothing shows in the Console.app or anything. + +Am I missing something? diff --git a/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_1_a47174f8438bfaa42fb8067bca77bf4c._comment b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_1_a47174f8438bfaa42fb8067bca77bf4c._comment new file mode 100644 index 000000000..3c9361cbd --- /dev/null +++ b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_1_a47174f8438bfaa42fb8067bca77bf4c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T22:30:00Z" + content=""" +The thing to do is to try to start git-annex from the command line in a terminal. This should get an error message that will help find out what's going wrong. +"""]] diff --git a/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_2_567bb460cec7cd2135386acf4e7dceb4._comment b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_2_567bb460cec7cd2135386acf4e7dceb4._comment new file mode 100644 index 000000000..21141e45e --- /dev/null +++ b/doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_2_567bb460cec7cd2135386acf4e7dceb4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-07T15:17:50Z" + content=""" +Probably this was because the OSX build was missing the webapp. Fixed now. +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn new file mode 100644 index 000000000..82ca06b85 --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn @@ -0,0 +1,24 @@ +Hi all, + +git-annex basically renders my repository unmanageble. What is the +best and save (!) way to recover? + +Here is my situation: + +I have a fairly large repository with ~8000 managed files taking about +65GB of disk space. + +git-annex worked well there. But some programs choke on the +symlinks. So, I converted the repository to direct mode. The +transition worked well. + +Now git status reports a type change for the ~8000 files. + +But as soon as I run + + git commit -m "typechange" even-only-one-of-the-files + +the process `git-annex pre-commit .` eats 3.5GB of ram, where I +usually kill it, as I only have 4GB of ram.... + +-- Andreas diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_1_ff16c7932b60b85c744bafc48bb040e4._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_1_ff16c7932b60b85c744bafc48bb040e4._comment new file mode 100644 index 000000000..23e5e79e8 --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_1_ff16c7932b60b85c744bafc48bb040e4._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-09-18T07:19:49Z" + content=""" +AFAIK in direct mode you are not supposed to commit you just run + + git annex sync + +and it will commit if files are changed. you only add new files annexed files are handled by sync + +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_2_5599cddf579d18f70cab6e48d04ae99d._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_2_5599cddf579d18f70cab6e48d04ae99d._comment new file mode 100644 index 000000000..337c1627f --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_2_5599cddf579d18f70cab6e48d04ae99d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 2" + date="2013-09-18T12:27:38Z" + content=""" +Hi Hamza, + +thanks for that comment. I thought `git annex sync` is just a wrapper around `git commit -a` (among others). + +Using `git annex sync` does not help, as it just means that now `git annex sync` eats all my memory until swapping starts. +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_3_412941e9385f63153b23695641e71deb._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_3_412941e9385f63153b23695641e71deb._comment new file mode 100644 index 000000000..6349500ca --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_3_412941e9385f63153b23695641e71deb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 3" + date="2013-09-19T18:49:05Z" + content=""" +git-annex sync is a wrapper around git commit. But not -a! git commit -a will stage every one of your large files directly into the git repository, wasting much memory and worse, disk space. It is ok to use `git commit` or `git commit --staged` in direct mode after eg `git annex add`. But not `git commit -a` or `git commit even-only-one-of-the-files`. It's best to just use `git annex sync` rather than `git commit`, as it avoids finger memory causing you to run the wrong type of commit command. Please see [[direct_mode]] for the details. + +I was able to make pre-commit take a lot of memory by committing a 1 gb file directly to git. git-annex was buffering the whole file content in memory +due to not thinking to check first if it was a symlink. I have fixed that bug. + +So I think you must have run that command you showed, and you now have a lot of data stored in your git repository that you had meant git-annex to handle. You might need to use git-filter-branch to remove it.. + +This kind of thing is why I need to write the [[todo/direct_mode_guard]]. +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_4_112ad140d9006c530db2121bec24de30._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_4_112ad140d9006c530db2121bec24de30._comment new file mode 100644 index 000000000..e5ebfa328 --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_4_112ad140d9006c530db2121bec24de30._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 4" + date="2013-09-19T20:06:39Z" + content=""" +Let me ask a simple question: All files are regular files (no symlinks). If I can live with loosing the history, is it save to just remove the .git directory and start over? Or do I risk anything? + +PS: .git is about 7GB +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_5_9178023b95683a649355f291165a1467._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_5_9178023b95683a649355f291165a1467._comment new file mode 100644 index 000000000..7f5047ddd --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_5_9178023b95683a649355f291165a1467._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 5" + date="2013-09-19T20:57:18Z" + content=""" +You can safely delete the git repository in the situation you describe. Better yet: Tar it up, and check the tarball into git-annex with the other files when you start over. :) Then if I'm wrong, you still have that data. +"""]] diff --git a/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_6_9251203421c1c3c3aed7828c4b97ecb8._comment b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_6_9251203421c1c3c3aed7828c4b97ecb8._comment new file mode 100644 index 000000000..ebb378e95 --- /dev/null +++ b/doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_6_9251203421c1c3c3aed7828c4b97ecb8._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 6" + date="2013-09-19T22:27:38Z" + content=""" +Thanks a bunch! That is what I did now. Seems good. + +May I additionally suggest a change in the man page of git annex? There I read + + sync [remote ...] + ... + The sync process involves first committing all local changes (git commit -a), ... + ... + +which made me think, I could do `git commit -a` manually as well. +"""]] diff --git a/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn b/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn new file mode 100644 index 000000000..511a0ba0c --- /dev/null +++ b/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn @@ -0,0 +1,12 @@ +Hi, + +I'm on a centos 6.4 64bits & installed git-annex +version : git-annex-3.20120522-2.1.el6.x86_64 + +From my understanding of the help page, I should be able to sync content with : + +git annex sync --content + +but it is not recognized. The help tells me I may be able to use "get" but I'm unclear how... + +Thanks for any help diff --git a/doc/forum/git-annex_sync_content_available_from_which_version__63__/comment_1_104e1b7e7643844f221f85dcbe9c9c4b._comment b/doc/forum/git-annex_sync_content_available_from_which_version__63__/comment_1_104e1b7e7643844f221f85dcbe9c9c4b._comment new file mode 100644 index 000000000..3b7967e32 --- /dev/null +++ b/doc/forum/git-annex_sync_content_available_from_which_version__63__/comment_1_104e1b7e7643844f221f85dcbe9c9c4b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-05T17:32:33Z" + content=""" +This feature was added in 5.20140210, which can be easily seen by reading the changelog. +"""]] diff --git a/doc/forum/git-annex_teams___47___groups.mdwn b/doc/forum/git-annex_teams___47___groups.mdwn new file mode 100644 index 000000000..b499f3a6e --- /dev/null +++ b/doc/forum/git-annex_teams___47___groups.mdwn @@ -0,0 +1,5 @@ +Hi, + +Does git-annex (preferably assistant) have any management of users / groups or teams? Our use case is we have many users which should only have access to certain folders (repos). Is this a planned feature or any manual way to work around this for now? + +Thanks! diff --git a/doc/forum/git-annex_teams___47___groups/comment_1_0450673ab74f184a47ac7bab568d26dc._comment b/doc/forum/git-annex_teams___47___groups/comment_1_0450673ab74f184a47ac7bab568d26dc._comment new file mode 100644 index 000000000..4b77da8f5 --- /dev/null +++ b/doc/forum/git-annex_teams___47___groups/comment_1_0450673ab74f184a47ac7bab568d26dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T17:10:17Z" + content=""" +Anyone with access to a git repository can access all the files stored in it. git-annex does not try to change this, so you need to find a way to have one repository for each group. +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn b/doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn new file mode 100644 index 000000000..1669461bc --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn @@ -0,0 +1,34 @@ +I've been organizing my music collection deleted/replaces some files but git-annex unused does not show any unused files even though they are deleted and all repos are in sync. + + + git log --stat --all -S'SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444' + commit a0fecdc02f7564f8bce9726f6b934fefc11de58b + Date: Thu Sep 12 17:04:53 2013 +0300 + + Deleted + + .../Dido - Sitting On the Roof of the World.mp3 | 1 - + 1 file changed, 1 deletion(-) + + commit 7f216228fc0e6298f0290ee1d8646bc9b16eca10 + Date: Mon Aug 5 03:49:55 2013 +0200 + + Initial Import + + .../Dido - Sitting On the Roof of the World.mp3 | 1 + + 1 file changed, 1 insertion(+)` + +even though the file is deleted its still present in annex objects, + + find .git -name '*5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444*' -exec ls -al '{}' \; + total 7856 + dr-xr-xr-x 2 user user 4096 Sep 9 01:24 . + drwxrwxr-x 3 user user 4096 Sep 9 01:24 .. + -r--r--r-- 1 user user 8034842 Aug 5 04:52 SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3 + -r--r--r-- 1 user user 8034842 Aug 5 04:52 .git/annex/objects/Jz/74/SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3/SHA256E-s8034842--5c3475d7fef6f0c3545721f34e7cbfb6727a00708bdde192f0f1d53af251b444.mp3 + +I got around 200 files that should be deleted but not showing up in unused. I though maybe one of the dead repos is causing the problem so i did a, + + git annex forget --drop-dead + +and synced all repos. Still I can not get them to drop. diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_1_2152cfb09675e46e7492e198dd3ea094._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_1_2152cfb09675e46e7492e198dd3ea094._comment new file mode 100644 index 000000000..72ed0bbe1 --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_1_2152cfb09675e46e7492e198dd3ea094._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T15:34:03Z" + content=""" +The most likely explanation is that you have a branch in git that still contains the deleted file, which will prevent unused from removing it. Try `git branch -a` to see all branches (a tag could also do it). +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_2_97e666dbac9de2a5e688921cba8a42e9._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_2_97e666dbac9de2a5e688921cba8a42e9._comment new file mode 100644 index 000000000..134106482 --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_2_97e666dbac9de2a5e688921cba8a42e9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2013-09-13T15:59:29Z" + content=""" +I did not create tags or branches, running returns, + + git branch -a + + git-annex + * master + synced/git-annex + synced/master + remotes/origin/HEAD -> origin/master + remotes/origin/git-annex + remotes/origin/master + remotes/origin/synced/master + +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_3_d7b0e9515bface28f3650b8aa20ec2f4._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_3_d7b0e9515bface28f3650b8aa20ec2f4._comment new file mode 100644 index 000000000..666172b28 --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_3_d7b0e9515bface28f3650b8aa20ec2f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 3" + date="2013-09-13T16:17:39Z" + content=""" +Depending on your git configuration, `git annex sync` might not be updating certian of these branches, such as remotes/origin/HEAD. You can check the branches out and see which still contains your deleted files. +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_4_5816f6cab42e27e724e735368f693b09._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_4_5816f6cab42e27e724e735368f693b09._comment new file mode 100644 index 000000000..e1a503d23 --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_4_5816f6cab42e27e724e735368f693b09._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 4" + date="2013-09-13T17:57:38Z" + content=""" +Which one of those branches I can safely delete? this is a central repo all other clients drop their stuff here it does not have any remotes (I did clones it from a client then removed origin section from config.) +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_5_8e97f39225515f0bf8b168dfd6a0efab._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_5_8e97f39225515f0bf8b168dfd6a0efab._comment new file mode 100644 index 000000000..1da1f80db --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_5_8e97f39225515f0bf8b168dfd6a0efab._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 5" + date="2013-09-13T18:23:02Z" + content=""" +So this is a bare repository? + +It seems to have had an origin at one point; see the remotes/origin/* branches. If it no longer has that remote, then of course those branches will not be getting updated, and so will contain the old files and that's why unused won't find them. In that case, you could safely remove the remotes/origin/* branches. +"""]] diff --git a/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_6_bef37f8ec9c337387b79ffd6d56fe425._comment b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_6_bef37f8ec9c337387b79ffd6d56fe425._comment new file mode 100644 index 000000000..fe1c94eca --- /dev/null +++ b/doc/forum/git-annex_unused_not_dropping_deleted_files/comment_6_bef37f8ec9c337387b79ffd6d56fe425._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 6" + date="2013-09-13T18:41:30Z" + content=""" +It is a non bare repo, I am using the following setup, + +http://git-annex.branchable.com/forum/Annex_dropping_files/ +"""]] diff --git a/doc/forum/git-assistant_clarification.mdwn b/doc/forum/git-assistant_clarification.mdwn new file mode 100644 index 000000000..472f96c6a --- /dev/null +++ b/doc/forum/git-assistant_clarification.mdwn @@ -0,0 +1,11 @@ +I've noticed that if I'm using git-assistant, it wants to pull down all my files from other repos onto my laptop, even after I've dropped them. (My laptop is set up as "client," my usb drive and an ssh server as "backup".) + +I want to use git annex to save space on my laptop, but of course when I'm running the assistant, it pulls everything down there, even things I've manually dropped. + +Is my "I want to save space, with a partial archive on my laptop" use case simply out of scope for the assistant? So I should just be using the command line for my needs? That's fine if that's the case. + +Or maybe something like this is what I should be doing? http://git-annex.branchable.com/assistant/archival_walkthrough/ ? so instead of manually "git annex drop"-ping files in place, I should set up a directory called "archive" on my machine, from which files will magically disappear and get backed up elsewhere? + +If it's the case that a directory named "archive" in your checkout has the magical property of having the assistant drop and archive its contents, that's awesome, maybe just what I need, but if that behavior is spelled out in so many words anywhere I managed to miss it. + +Apologies for all these questions, just enjoying the software immensely and wanting to get to know it. diff --git a/doc/forum/git-assistant_clarification/comment_1_8f553e59da12f798b854a457b96b5778._comment b/doc/forum/git-assistant_clarification/comment_1_8f553e59da12f798b854a457b96b5778._comment new file mode 100644 index 000000000..03f9dc273 --- /dev/null +++ b/doc/forum/git-assistant_clarification/comment_1_8f553e59da12f798b854a457b96b5778._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2012-11-30T08:26:24Z" + content=""" +I'm second this request. Also, I'm posting this to enable the rss comment subscription button for this post. + +Maybe these design documents are interesting: + + + + +"""]] diff --git a/doc/forum/git-assistant_clarification/comment_2_06cf62b599edea6ad8396776f0081494._comment b/doc/forum/git-assistant_clarification/comment_2_06cf62b599edea6ad8396776f0081494._comment new file mode 100644 index 000000000..90137e722 --- /dev/null +++ b/doc/forum/git-assistant_clarification/comment_2_06cf62b599edea6ad8396776f0081494._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 2" + date="2012-11-30T16:31:21Z" + content=""" +The archive directory is a new feature, but yes, it does work. Just use the webapp to edit the configuration of a remote, put it into the \"small archive\" group, and the contents of archive directories will be sent to it. + +This is a particular application of [[preferred_content]] settings, which give you a large amount of control over which data end up where when using the assistant. +"""]] diff --git a/doc/forum/git-assistant_clarification/comment_3_36f0bd6e7a824e6ef40a309850bb087b._comment b/doc/forum/git-assistant_clarification/comment_3_36f0bd6e7a824e6ef40a309850bb087b._comment new file mode 100644 index 000000000..1cf51c296 --- /dev/null +++ b/doc/forum/git-assistant_clarification/comment_3_36f0bd6e7a824e6ef40a309850bb087b._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2012-11-30T18:49:37Z" + content=""" +Very cool! + +So not only is archive/ a magic subdirectory due to the \"preferred content settings\" for \"client,\" but *every* subdirectory named \"archive\" similarly drops content when possible. That's awesome to know. + +Also if I really wanted to manually manage all my content and still have git-annex assistant running, I could simply use \"present\" for my preferred content settings on my laptop, and it would respect my manual gets and drops. + +Thank you! + +"""]] diff --git a/doc/forum/git-remote-gcrypt.mdwn b/doc/forum/git-remote-gcrypt.mdwn new file mode 100644 index 000000000..eaf5889e7 --- /dev/null +++ b/doc/forum/git-remote-gcrypt.mdwn @@ -0,0 +1 @@ +Back in January Joey [mentioned](http://git-annex.branchable.com/design/assistant/blog/day_179__brief_updates/) the [git-remote-gcrypt](https://github.com/blake2-ppc/git-remote-gcrypt) and possibly adding support for it in the Assistant. I think this would be a great addition. Now that the first big Android push is complete, is there a schedule for this feature? diff --git a/doc/forum/git-remote-gcrypt/comment_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment b/doc/forum/git-remote-gcrypt/comment_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment new file mode 100644 index 000000000..ca38da4cd --- /dev/null +++ b/doc/forum/git-remote-gcrypt/comment_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-07T18:42:37Z" + content=""" +I have not put it on the schedule (and don't think I'll get to it this month), but I have added it to the [[roadmap|design/assistant]]. + +The main use cases it adds are encrypting git remotes on ssh servers, and on USB drives. Both are useful for sure.. + +It also opens the possibility of using github for encrypted git remotes, but with xmpp git push that is not a pressing use case. With significantly more work, encrypted git remotes could be stored on S3 etc, but again xmpp git push covers the same use cases. +"""]] diff --git a/doc/forum/git-remote-gcrypt/comment_2_fdcaf507e14c995636dd93a41e488df3._comment b/doc/forum/git-remote-gcrypt/comment_2_fdcaf507e14c995636dd93a41e488df3._comment new file mode 100644 index 000000000..a20fc7e76 --- /dev/null +++ b/doc/forum/git-remote-gcrypt/comment_2_fdcaf507e14c995636dd93a41e488df3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="comment 2" + date="2013-03-12T09:33:17Z" + content=""" +The use case this is really good for, that XMPP push can't help with, is for when two paired machines are almost never both turned on at once. +"""]] diff --git a/doc/forum/git-remote-gcrypt/comment_3_f4e830f961dbe1c60ddd277b9d888133._comment b/doc/forum/git-remote-gcrypt/comment_3_f4e830f961dbe1c60ddd277b9d888133._comment new file mode 100644 index 000000000..03ac7b0f5 --- /dev/null +++ b/doc/forum/git-remote-gcrypt/comment_3_f4e830f961dbe1c60ddd277b9d888133._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.45.235" + subject="comment 3" + date="2013-05-25T22:58:16Z" + content=""" +I'm still hoping to see this. The feature received some attention on the [April poll](http://git-annex.branchable.com/design/assistant/polls/goals_for_April/). +"""]] diff --git a/doc/forum/git-status_typechange_in_direct_mode.mdwn b/doc/forum/git-status_typechange_in_direct_mode.mdwn new file mode 100644 index 000000000..6438fb890 --- /dev/null +++ b/doc/forum/git-status_typechange_in_direct_mode.mdwn @@ -0,0 +1,48 @@ +Hi all, + +how can I get rid of all those 'typechange' messages in `git status` +when in direct mode? + +Here is an example session: + + > git init + Initialized empty Git repository in /some/path/.git/ + > git config user.name dtrn + > git config user.email drn@drn.com + > git annex init + init ok + (Recording state in git...) + > git annex direct + commit + # On branch master + # + # Initial commit + # + nothing to commit (create/copy files and use "git add" to track) + ok + direct ok + > dd if=/dev/zero of=testfile.bin count=1000 + 1000+0 records in + 1000+0 records out + 512000 bytes (512 kB) copied, 0.00317424 s, 161 MB/s + > git annex add testfile.bin + add testfile.bin (checksum...) ok + (Recording state in git...) + > git commit -m "annexed testfile.bin" + ok + [master (root-commit) 281e740] annexed testfile.bin + 1 file changed, 1 insertion(+) + create mode 120000 testfile.bin + > git status + # On branch master + # Changes not staged for commit: + # (use "git add ..." to update what will be committed) + # (use "git checkout -- ..." to discard changes in working directory) + # + # typechange: testfile.bin + # + no changes added to commit (use "git add" and/or "git commit -a") + + +Regards, +Andreas diff --git a/doc/forum/git-status_typechange_in_direct_mode/comment_1_12c8b67aadbfa2b073e12997a55d49a7._comment b/doc/forum/git-status_typechange_in_direct_mode/comment_1_12c8b67aadbfa2b073e12997a55d49a7._comment new file mode 100644 index 000000000..31e476087 --- /dev/null +++ b/doc/forum/git-status_typechange_in_direct_mode/comment_1_12c8b67aadbfa2b073e12997a55d49a7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 1" + date="2013-09-20T15:24:25Z" + content=""" +These messages are normal in direct mode. + +They happen because git status does not know about git-annex's direct mode. So it sees a file that has a symlink checked into git, but a normal file in place in the working tree. Thus, its type has changed. Short of hacking or wrapping git, or switching to indirect mode ;), there's not much that can be done about this. + +You might want to read [[direct_mode]] for more about this, and some of the problems it can cause when running certian git commands. +"""]] diff --git a/doc/forum/git-status_typechange_in_direct_mode/comment_2_005d1b17f3c2ae192aa30c6e5163989e._comment b/doc/forum/git-status_typechange_in_direct_mode/comment_2_005d1b17f3c2ae192aa30c6e5163989e._comment new file mode 100644 index 000000000..c598b212f --- /dev/null +++ b/doc/forum/git-status_typechange_in_direct_mode/comment_2_005d1b17f3c2ae192aa30c6e5163989e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 2" + date="2013-09-20T20:16:47Z" + content=""" +Thanks for the info and the quick reply. +"""]] diff --git a/doc/forum/git-subtree_support__63__.mdwn b/doc/forum/git-subtree_support__63__.mdwn new file mode 100644 index 000000000..a95277a23 --- /dev/null +++ b/doc/forum/git-subtree_support__63__.mdwn @@ -0,0 +1,9 @@ +Hi, + +I am a happy user of [git-subtree](http://github.com/apenwarr/git-subtree), and I wonder whether it integrates nicely with git-annex? + +My use-case looks like this: I have two annex repositories -- one at home and one at work. The annex at work is a strict subset of the one at home, i.e. all files that I have at work ought to be part of the annex at home, but not the other way round. Now, I realize that I could have one annex and selectively copy files to the checked out copy at work, but I don't want to do that because I don't want to have (broken) symlinks for all kinds of stuff visible on my machine at work that is not supposed to be there (such as MP3 files, etc.). Instead, I would like to use git-subtree to import the work annex into a sub-directory of the one at home, so that both annex are logically separate, but still the one at home always contains everything that the one at work contains. + +Is that possible? + +And if not, is there maybe another way to accomplish this kind of thing? diff --git a/doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment b/doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment new file mode 100644 index 000000000..e4ded4c57 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-03T17:00:53Z" + content=""" +I have no experience using git-subtree, but as long as the home repository has the work one as a git remote, it will automatically merge work's git-annex branch with its own git-annex branch, and so will know what files are present at work, and will be able to get them. + +Probably you won't want to make work have home as a remote, so work's git-annex will not know which files home has, nor will it be able to copy files to home (but home will be able to copy files to work). +"""]] diff --git a/doc/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment b/doc/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment new file mode 100644 index 000000000..9bac6e997 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.188.44.113" + subject="comment 2" + date="2012-01-03T18:11:37Z" + content=""" +The point of git-subtree is that I can import another repository into sub-directory, i.e. I can have a directory called \"work\" that contains all files from the annex I have at work. If I make the other annex a remote and merge its contents, then all contents is going to be merged at the top-level, which is somewhat undesirable in my particular case. +"""]] diff --git a/doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment b/doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment new file mode 100644 index 000000000..83edaf743 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-01-03T18:42:08Z" + content=""" +You can make it a remote without merging its contents. Git will not merge its contents by default unless it's named \"origin\". git-annex will be prefectly happy with that. +"""]] diff --git a/doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment b/doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment new file mode 100644 index 000000000..642f952e4 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.188.44.113" + subject="comment 4" + date="2012-01-03T19:17:36Z" + content=""" +Okay, I see, but is `git annex get --auto .` going to import all those files from the work remote into my home if the `master` branch of that remote isn't merged? +"""]] diff --git a/doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment b/doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment new file mode 100644 index 000000000..5b2f3dad5 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2012-01-03T19:31:45Z" + content=""" +Yes; git-annex uses the git-annex branch independently of the branch you have checked out. You may find [[internals]] interesting reading, but the short answer is it will work. +"""]] diff --git a/doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment b/doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment new file mode 100644 index 000000000..77af85258 --- /dev/null +++ b/doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.188.44.113" + subject="comment 6" + date="2012-01-03T19:47:11Z" + content=""" +Very cool! Thank you for the explanation. +"""]] diff --git a/doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn b/doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn new file mode 100644 index 000000000..3f3b943a0 --- /dev/null +++ b/doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn @@ -0,0 +1,25 @@ +Perhaps stupidly I added some very large bare git repos into a git-annex. + +This took a very long time, used lot's of memory, and then crashed. I didn't catch the error (which is annoying) - sorry about that. IIRC it is the same error if one Ctrl-c's the addition. + +I ran `git annex add .` a second time and eventually killed it (I perhaps should have waited - I now think it was working). + +A `git annex unannex` fixed up some files but somehow I managed to end up with tonnes of files all sym-linked into the git annex object directory but not somehow recognised as annexed files. I'm assuming that they somehow didn't make it into git annex's meta-data layer (or equivalent). + +Commands such as `git annex {fsck,whereis,unannex} weirdfile` immediately returned without error. + +I've now spent a lot of manual time copying the files back. Doing the following, not the cleverest but I was a little panicky about my data... + + find . -type l -exec mv \{} \{}.link \; #Move link names out of the way + find . -type l -exec cp \{} \{}.cp \; #Copy follows links so we can copy target back to link location + find . -type f -name "*.link.cp" | xargs -n 1 rename 's/\.link\.cp//' #Change to original name + find . -type l -exec rm \{} \; #Ditch the links + git annex unused + git annex dropunused `seq 9228` + +9228 files were found to be unused, this gives an idea of the scale of the number of "lost" files for want of a better term. + +A pretty poor bug report as these things go. Anyone any idea what might have happened (it didn't seem space or memory related)? Or how I might have fixed it a little more cleverly? + +For reference I am using stable Debian, git annex version 3.20111011. + diff --git a/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_1_062d0153a379c1ba1df8585b90220d3d._comment b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_1_062d0153a379c1ba1df8585b90220d3d._comment new file mode 100644 index 000000000..e879441ff --- /dev/null +++ b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_1_062d0153a379c1ba1df8585b90220d3d._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2011-12-06T12:50:27Z" + content=""" +Ah HA! Looks like I found the cause of this. + + [matt@rss01:~/files/matt_ford]0> git annex add mhs + add mhs/Accessing_Web_Manager_V10.pdf ok + .... + add mhs/MAHSC Costing Request Form Dual + Organisations - FINAL v20 Oct 2010.xls git-annex: unknown response from git cat-file refs/heads/git-annex:8d5/ed4/WORM-s568832-m1323164214--MAHSC Costing Request Form Dual missing + +Spot the file name with a newline character in it! This causes the error message above. It seems that the files proceeding this badly named file are sym-linked but not registered. + +Perhaps a bug? +"""]] diff --git a/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_2_6fc6be43c488c468a4811cd0a1360225._comment b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_2_6fc6be43c488c468a4811cd0a1360225._comment new file mode 100644 index 000000000..38f2434f4 --- /dev/null +++ b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_2_6fc6be43c488c468a4811cd0a1360225._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-12-06T17:08:37Z" + content=""" +The bug with newlines is now fixed. + +Thought I'd mention how to clean up from interrupting `git annex add`. +When you do that, it doesn't get a chance to `git add` the files it's +added (this is normally done at the end, or sometimes at points in the middle when you're adding a *lot* of files). +Which is also why fsck, whereis, and unannex wouldn't operate on them, since they only deal with files in git. + +So the first step is to manually use `git add` on any symlinks. + +Then, `git commit` as usual. + +At that point, `git annex unannex` would get you back to your starting state. +"""]] diff --git a/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment new file mode 100644 index 000000000..b58f81c5b --- /dev/null +++ b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 3" + date="2011-12-07T07:39:15Z" + content=""" +Ah - very good to know that recovery is easier than the method I used. + +I wonder if it could be made a feature to automatically and safely recover/resume from an interrupted `git add`? +"""]] diff --git a/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_4_c560eae40867512b0af2cbef161fc8ac._comment b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_4_c560eae40867512b0af2cbef161fc8ac._comment new file mode 100644 index 000000000..8fca16cad --- /dev/null +++ b/doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_4_c560eae40867512b0af2cbef161fc8ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-12-07T20:54:51Z" + content=""" +Good idea! I've made `git annex add` recover when ran a second time. +"""]] diff --git a/doc/forum/git_annex_alternative.mdwn b/doc/forum/git_annex_alternative.mdwn new file mode 100644 index 000000000..d7c41e66d --- /dev/null +++ b/doc/forum/git_annex_alternative.mdwn @@ -0,0 +1,10 @@ +I really like git-annex and am thankfull to its creator! + +I especially like the high level of abstraction it provides when handling backups or syncing. + +But git and my ext4 filesystem and HDD just hate the amount of files/folder/symlinks it throws at them and I am asking, what the alternatives are. I am especially looking for the numcopies and "--auto" functionallity. + + +Most alternatives I checked out (eps. distributed redundant filesystems) come up with other burdens or restrictions. + +Do you have any experience with different systems? diff --git a/doc/forum/git_annex_assistant_-_Changing_repository_information.mdwn b/doc/forum/git_annex_assistant_-_Changing_repository_information.mdwn new file mode 100644 index 000000000..c4ef39a8f --- /dev/null +++ b/doc/forum/git_annex_assistant_-_Changing_repository_information.mdwn @@ -0,0 +1 @@ +Here's one thing I don't fully understand yet. If I add a remote repository, like an archive repository on Box—or if I want to change a transfer repository to an archive repository—do I need to add it or change it separately on each of my computers? Or just one? diff --git a/doc/forum/git_annex_assistant_-_Changing_repository_information/comment_1_cde71a410200a7478180748fdcde0352._comment b/doc/forum/git_annex_assistant_-_Changing_repository_information/comment_1_cde71a410200a7478180748fdcde0352._comment new file mode 100644 index 000000000..fa0c61517 --- /dev/null +++ b/doc/forum/git_annex_assistant_-_Changing_repository_information/comment_1_cde71a410200a7478180748fdcde0352._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-17T20:59:43Z" + content=""" +This information is stored on the git-annex branch, and so it is synced between repositories with the rest of git-annex's data. You only need to change it in one place.. But it's also fine to change it in multiple places if necessary. +"""]] diff --git a/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn b/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn new file mode 100644 index 000000000..faebb14a1 --- /dev/null +++ b/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn @@ -0,0 +1,3 @@ +I am trying to share files between my PC at home at that at work using the walkthrough here: http://git-annex.branchable.com/assistant/remote_sharing_walkthrough/. However, I don't have the option on my machine to "Share with other devices". Any ideas why this would be missing? I am using Ubuntu 13.04 if that helps. + +Update: it now works after a software update, I guess I just had an older version of git-annex. Now, I have version 4.20130723. diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn new file mode 100644 index 000000000..37b86c462 --- /dev/null +++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn @@ -0,0 +1,15 @@ +I keep a repo synced between machines over ssh. Assuming all the files are in sync, so no actual file transfer needs to takes place, when I do + +``` +git annex copy --fast --quiet --to blah +``` + +is quite slow, about 10 seconds, using 100% CPU on one core, just to decide nothing needs to be done. On the other hand, doing + +``` + git annex copy --fast --quiet --from blah +``` + +takes about 1 second. + +I'm confused, as it seems to me that, since I'm using --fast, both transactions should use only locally available data, and both should need about the same amount of computing. Am I missing something? Can this be fixed? diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment new file mode 100644 index 000000000..90d429278 --- /dev/null +++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T19:11:38Z" + content=""" +How many files are in the directory tree you're copying? + +`copy --fast --to` does indeed avoid the check to see if the remote already has the file before copying it. + +However, it still needs to look in the location log to see which files are already present on the remote. Whereas `copy --from` can do a single stat of the file on disk to see if it's present in the local repo. Location log lookups are about as fast as I can make them, but they still require requesting info from out of the git repository. If you have a lot of files this otherwise minor difference in speed can stack up.. +"""]] diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_2_8f2567f4c4f6db2078211a87689757d3._comment b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_2_8f2567f4c4f6db2078211a87689757d3._comment new file mode 100644 index 000000000..c0bfe9df2 --- /dev/null +++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_2_8f2567f4c4f6db2078211a87689757d3._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 2" + date="2013-07-17T20:45:17Z" + content=""" +That example I gave: 10 sec vs 1 sec is on a repository of pictures with about 6200 files on a SSD. + +Oh, I think I understand the source of the asymmetry, now! So, `git annex copy --to` queries the location log file by file? I've tested a `git grep` on the git-annex branch as follows + +``` +git grep -e git-annex +``` + +and seems to be quite fast, less than a second on my test repo. Could git annex make use of this to speed up bulk queries to the location log? + +"""]] diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_3_ab98121076b88f351fc8cd9197e6bf64._comment b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_3_ab98121076b88f351fc8cd9197e6bf64._comment new file mode 100644 index 000000000..d5f399b30 --- /dev/null +++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_3_ab98121076b88f351fc8cd9197e6bf64._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 3" + date="2013-07-18T17:39:37Z" + content=""" +Using git grep like that would only be an optimisation when it's acting on every file in the repository. If it's only copying a subdirectory, or a single file, git grep is likely to come out much slower. +"""]] diff --git a/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_4_cb13328add1b7a812efd817ad3dd1a4f._comment b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_4_cb13328add1b7a812efd817ad3dd1a4f._comment new file mode 100644 index 000000000..0c70777a4 --- /dev/null +++ b/doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_4_cb13328add1b7a812efd817ad3dd1a4f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 4" + date="2013-07-18T22:58:24Z" + content=""" +I see. Thanks! +"""]] diff --git a/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied.mdwn b/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied.mdwn new file mode 100644 index 000000000..3bb2fe176 --- /dev/null +++ b/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied.mdwn @@ -0,0 +1,59 @@ +I just spend an hour to understand why the following command did not do anything: + + $ git annex copy --to someremote SomeDirectory + +With SomeDirectory containing a lot of file that are not in the someremote repository. +I just realized that the annex from which I run the command did not contain those files either. + +I then did + + $ git annex get SomeDirectory + +So that now the git annex copy command correctly copies the files to the someremote remote. + +I hope I won't fall into that trap again, but I think it is very annoying not to know why nothing happened. + +Wouldn't it be great if the git annex copy command would indicate why some file are not copied, like: + + $ git annex copy --to someremote SomeDirectory + Cannot copy SomeFile1 since it is not present in here, (hint: run git annex get first) + Cannot copy SomeFile2 since it is not present in here, (hint: run git annex get first) + Cannot copy SomeFile3 since it is not present in here, (hint: run git annex get first) + ... + +May be this kind of information could be provided if the verbose flag is set. + +Another awesome (totally subjectively speaking) way of doing it could be to get the file before copying it + + $ git annex copy --to someremote SomeDirectory + Cannot copy SomeFile1 since it is not present in here, attempting getting it first + get SomeFile1 (from someotherremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + copy SomeFile1 (checking someremote...) (to someremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + Cannot copy SomeFile2 since it is not present in here, attempting getting it first + get SomeFile2 (from someotherremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + copy SomeFile2 (checking someremote...) (to someremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + Cannot copy SomeFile3 since it is not present in here, attempting getting it first + get SomeFile3 (from someotherremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + copy SomeFile3 (checking someremote...) (to someremote...) + SHA256E-s109353088--71734pq1p4qo6qs1p156r48s2290q7p61p1658029p103591nrs1rr708s064p59 + 12,615,808 100% 161.27kB/s 0:01:16 (xfr#1, to-chk=0/1) + ok + +We could also specify from which remote to get the file with + + $ git annex copy --to someremote --from someotherremote SomeDirectory diff --git a/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied/comment_1_75445fc0e01ee99bae1c1f5a60e314bc._comment b/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied/comment_1_75445fc0e01ee99bae1c1f5a60e314bc._comment new file mode 100644 index 000000000..15373be70 --- /dev/null +++ b/doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied/comment_1_75445fc0e01ee99bae1c1f5a60e314bc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 1" + date="2014-02-02T21:13:21Z" + content=""" +I think that this behavior of git-annex is quite useful once you get used to it. It can sometimes trip up new users, but new users would not know about some --explain switch that made it say why it skipped each file. So, I consider this a documentation issue, and I've added a section to the walkthrough to help users learn about it: + + + +As far as copy --from --to, it has been suggested before; I think there is even a todo about it somewhere, but such remote-to-remote transfers are expensive and I would hope it would not normally be used. +"""]] diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__.mdwn b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__.mdwn new file mode 100644 index 000000000..c9dcf2eda --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__.mdwn @@ -0,0 +1,22 @@ +Whenever I try to get a file with a non-English character, git annex gives me trouble that I don't have with English filenames from the same repo. I'm hesitant to file a bug report here since the problem seems to stem from rsync not being able to handle the characters. Here's the output (everything enclosed in pointy brackets are redacted): + + get // (from origin...) + git-annex: /home//Music/.git/annex/transfer/upload/53e11324-041f-11e2-93ca-27250d76416f/SHA256-s7941079--c5a31f15302d57563d8cd35e43ba34669b5485a99b617a83c89fba02fb2ca981: commitBuffer: invalid argument (invalid character) + protocol version mismatch -- is your shell clean? + (see the rsync man page for an explanation) + rsync error: protocol incompatibility (code 2) at compat.c(174) [Receiver=3.0.9] + + git-annex-shell: sendkey: 1 failed + rsync failed -- run git annex again to resume file transfer + + Unable to access these remotes: origin + + Try making some of these repositories available: + 604f093f-a980-4740-a9df-d21b580a2ba4 -- origin () + failed + + + +It spits out similar errors for all files with Japanese/German/French/special characters, and ends with this on the last line: + + git-annex: get: 138 failed diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_1_292ee7c8b37cbd13f03eb67d0359b99e._comment b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_1_292ee7c8b37cbd13f03eb67d0359b99e._comment new file mode 100644 index 000000000..3542dbd22 --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_1_292ee7c8b37cbd13f03eb67d0359b99e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="sauluskahn" + ip="67.171.218.222" + subject="comment 1" + date="2012-09-21T21:40:30Z" + content=""" +Also, git annex is 3.20120825 on both machines, and rsync is 3.0.9 + +Both have no problem handling the characters on their own, but when I try to rsync them I get trouble. +"""]] diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_2_f6341119fcfde5d8160c8f603b1a6fea._comment b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_2_f6341119fcfde5d8160c8f603b1a6fea._comment new file mode 100644 index 000000000..080dba0e9 --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_2_f6341119fcfde5d8160c8f603b1a6fea._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 2" + date="2012-09-21T23:23:04Z" + content=""" +git-annex 3.20120825 is not an actual release, just some version number used in git head. + +This bug, TTBOMK, was introduced in version 3.20120721, and fixed by git commit 0b12db64d834979d49ed378235b0c19b34e4a4d6 last Sunday. +"""]] diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment new file mode 100644 index 000000000..b61eff506 --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 3" + date="2012-09-21T23:23:52Z" + content=""" +I take that back about 3.20120825, it was so a real release! :) Anyway, bug is fixed in git head, and there will be a release along soon with it. +"""]] diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_4_86b61b0484f3f4ecff657e46333b3d4f._comment b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_4_86b61b0484f3f4ecff657e46333b3d4f._comment new file mode 100644 index 000000000..678c13b7a --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_4_86b61b0484f3f4ecff657e46333b3d4f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="sauluskahn" + ip="67.171.218.222" + subject="comment 4" + date="2012-09-22T03:01:02Z" + content=""" +Sounds good, I'll get the next version through cabal and let you know if it's fixed. Thanks for your time! +"""]] diff --git a/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_5_5ffac00d08d26acaba8c3513b24c4d65._comment b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_5_5ffac00d08d26acaba8c3513b24c4d65._comment new file mode 100644 index 000000000..c328519d7 --- /dev/null +++ b/doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_5_5ffac00d08d26acaba8c3513b24c4d65._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="sauluskahn" + ip="67.171.218.222" + subject="comment 5" + date="2012-09-22T03:02:15Z" + content=""" +>I'll let you know if it's *not* fixed. + +Typo. +"""]] diff --git a/doc/forum/git_annex_get_--want-get_another__95__repo.mdwn b/doc/forum/git_annex_get_--want-get_another__95__repo.mdwn new file mode 100644 index 000000000..4ed087876 --- /dev/null +++ b/doc/forum/git_annex_get_--want-get_another__95__repo.mdwn @@ -0,0 +1,68 @@ +Hi, + +Git-annex is really awesome. It has made my life really easier when having to +move files around. + +Yet, I have been struggling with a use case that I cannot get working with git +annex. + +In short, my request is: could it be possible to have --want-get and --want-drop +accept a repository as argument to match the preferred content of that +repository instead of here? + +Now, let me explain why I need this:a + +All my files are stored into a NAS accessible via a local network. + +I have an annex in my desktop computer. Using preferred content (via "git annex +wanted") and "git annex get|drop --auto", I am able to almost automatically +handle what files are put into my computer. What I do is to "git annex wanted" +to indicate what I want to be here and launch a home made script that basically +does "git annex get --auto" and "git annex drop --auto". + +Let's say I have a android phone to which I connect via ssh over adb. It +contains a git repository but few files are in it. It has no wifi and so no +access to the network, meaning no access to the NAS. + +The links between annexes then looks like: + + NAS <-> Computer <-> Phone + +When I want to put a file into my phone, I generally launch "git annex get file" +from my computer (then I get the file from the NAS) and "git annex copy --to +phone file". + +I want to be able to automatise this a bit by playing with preferred content +(like I do with my computer). This means that I want to launch "git annex +wanted" to edit the preferred content of the phone annex and then "git annex get +--auto" and launch "git annex copy --auto --to phone". This way, when I am not +in front of my computer, I can still from my phone run "git annex wanted here +'preferred content'" and hope for my synchronisation scripts (run in my +computer) to put the good files into my phone. + +Obviously those commands won't work since the git annex get --auto command will +only get what my computer wants, not what my phone wants. + +The intuitive (IMHO) way to do would be to launch: + + git annex get --want-get phone + git annex copy --auto --to phone + git annex drop --auto + +With "--want-get repository" meaning, "Matches files that the preferred content +settings for the repository make it want to get.". + +For the time being, I succeed in doing this with + + OLD_WANTED=$(git annex wanted here) + git annex wanted here $(git annex wanted phone) + git annex copy --auto --to phone + git annex wanted ${OLD_WANTED} + git annex drop --auto + +This is complicated and adds two extra commits in the git-annex branch (one for +each setting of git annex wanted) each time I call the script. + +What do you think? + +Thanks for reading. diff --git a/doc/forum/git_annex_get_--want-get_another__95__repo/comment_1_0be0b3981ddd0743ff26cf6d396e521d._comment b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_1_0be0b3981ddd0743ff26cf6d396e521d._comment new file mode 100644 index 000000000..7a58e35d6 --- /dev/null +++ b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_1_0be0b3981ddd0743ff26cf6d396e521d._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-12T17:15:23Z" + content=""" +Well, I suppose this is doable, but the way this scenario is generally handled is to make a transfer repository (which your desktop is serving as here) have a preferred content expression that makes it want files that the client repositories (phones) want, until the files have reached the clients: + +In your case you could have: + + (not inallgroup=phones and ($phone_preferred_content)) or ($desktop_preferred_content) + +Where `$desktop_preferred_content` is whatever files the desktop actually wants on its own, and `$phone_preferred_content` is a copy of the preferred content setting for the phone. + +To make this work, you also need to put your phone in the phones group. +"""]] diff --git a/doc/forum/git_annex_get_--want-get_another__95__repo/comment_2_b1ead1085a87818625579bf1ef151b5d._comment b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_2_b1ead1085a87818625579bf1ef151b5d._comment new file mode 100644 index 000000000..1f8ce270e --- /dev/null +++ b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_2_b1ead1085a87818625579bf1ef151b5d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-12T17:16:59Z" + content=""" +BTW expressing this in the preferred content as above also has the benefit that you can use the new `git annex sync --content` on the desktop and it will automatically get files, copy the right ones to the phone, and drop any then-unwanted files. +"""]] diff --git a/doc/forum/git_annex_get_--want-get_another__95__repo/comment_3_cf2018852c84b0bf1ac061def6f0ac5d._comment b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_3_cf2018852c84b0bf1ac061def6f0ac5d._comment new file mode 100644 index 000000000..c6bd20e1f --- /dev/null +++ b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_3_cf2018852c84b0bf1ac061def6f0ac5d._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3vKzS4eOWYpKMoYXqMIjNsIg_nYF-loU" + nickname="Konubinix" + subject="That does it but not totally" + date="2014-03-13T11:36:02Z" + content=""" +I agree with the fact that it answers my initial question. + +Nevertheless, I guess it is really annoying to have to change the preferred content in two locations each time I change want to modify what is on my phone. +Indeed, I quite often change what should be really present on my phone, depending on several factors (my mood, the time I will have in transports and the phase of the moon). + +The reason why I use \"git annex wanted\" is that it is straightforward: I just launch : \"git annex wanted phone include=some/file\" and that's all. + +With the solution you propose, I would have to each time additionally launch \"git annex wanted here '(not inallgroup=phones and (include=some/file)) or ($desktop_preferred_content)'\" + +Where I probably have to previously launch \"git annex wanted here\" to remember what is the preferred content of my computer (and put it in $desktop_preferred_content). + +Another option would be to run \"git annex vicfg\" and edit both fields manually, but IMHO this appears also to be too complicated relatively to the use case. + +About your second comment, I really enjoy the idea if \"git annex sync --content\", but it is really long in big repositories. I guess it is because I cannot restrict the command to a directory like I do with get, drop, move and copy. + +Besides, the use case wants to get the files whenever they are and copy them only to the phone. With git annex sync --content, the files are also put in the other repositories. + +For the time being, I prefer falling back to explicit commands that are much faster when I know a directory to sync \"git annex get --auto directory && git annex copy --auto --to phone directory\". + +For example, I just tried \"git annex sync --content phone\" and I killed it after 5 minutes and nothing was copied yet. With the set of two commands above, the synchronization of directory (get --to phone directory + drop --from here directory) took about 3 minutes. +"""]] diff --git a/doc/forum/git_annex_get_--want-get_another__95__repo/comment_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment new file mode 100644 index 000000000..25624c2c0 --- /dev/null +++ b/doc/forum/git_annex_get_--want-get_another__95__repo/comment_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3vKzS4eOWYpKMoYXqMIjNsIg_nYF-loU" + nickname="Konubinix" + subject="Precision of the use case" + date="2014-03-13T11:47:59Z" + content=""" +I realized that the directory restriction described earlier is not clear. Let me explain it. + +Say I have a big repository of files with the following structure. + +A/... +B/... +C/... +D/D1/... +D/D2/... +D/D3/... + +Imagine that each of A, B, C and D contains a lot of files. + +Now imagine that I have often put in the preferred content of my phone files in one of D1, D2 or D3. (for instance, include=D/D1/*) + +I implicitly know that I can restrict the command to D, and I can rely on preferred content to know what file from D I have to put into my phone. + +Then, I can run + $ git annex get --auto D + $ git annex copy --auto --to phone D + $ git annex drop --auto D + +This in my use case takes 3 minutes. + +When I run + $ git annex sync --content phone + +git annex goes recursively through A, B and C and that takes a long time (much more than 3 minutes). This time is really wasted since I know I only want to sync files from D. + +I cannot test the behavior of \"git annex sync --content\", but if I restrict the sync to phone, will it take the files from the NAS to put them on the phone? +If I don't precise phone in the command line, it will try to sync with other repositories not in sync that I don't want to be in sync for the time being. +"""]] diff --git a/doc/forum/git_annex_get_creates_a_new_uuid.mdwn b/doc/forum/git_annex_get_creates_a_new_uuid.mdwn new file mode 100644 index 000000000..72dcd9737 --- /dev/null +++ b/doc/forum/git_annex_get_creates_a_new_uuid.mdwn @@ -0,0 +1,6 @@ +From git-annex(1), init should precede any operation of git-annex as a safety feature. + +However git cloning a repo and running `git annex get` created a new uuid for that repo, which got +propagated via sync. + +Is this intended behaviour? diff --git a/doc/forum/git_annex_get_creates_a_new_uuid/comment_1_004c87183968c326058bd3159a5baa0b._comment b/doc/forum/git_annex_get_creates_a_new_uuid/comment_1_004c87183968c326058bd3159a5baa0b._comment new file mode 100644 index 000000000..3a07bf0af --- /dev/null +++ b/doc/forum/git_annex_get_creates_a_new_uuid/comment_1_004c87183968c326058bd3159a5baa0b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T20:24:06Z" + content=""" +From the man page: + +> Until a repository (**or one of its remotes**) has been initialized +> git-annex will refuse to operate on it, to avoid accidentially +> using it in a repository that was not intended tohave an annex. + +So, yes, it assumes that if a repository has a git-annex branch already, git-annex is being used, and no explicit init is necessary. You can still run `git annex init` after the fact if you like. +"""]] diff --git a/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn new file mode 100644 index 000000000..f1aa5cc06 --- /dev/null +++ b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn @@ -0,0 +1 @@ +I just started experimenting with git annex, and I found that I would like to have a way to figure out metadata (well, size. Maybe modification date) of a non-local file. I first checked if there is "git annex ls" (which could list known files in an ls-like way) and found "git annex whereis" as somewhat a replacement, but it does not give metadata information. diff --git a/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_1_7fba10b85f4d9289c7782eccef46949e._comment b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_1_7fba10b85f4d9289c7782eccef46949e._comment new file mode 100644 index 000000000..379b9f976 --- /dev/null +++ b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_1_7fba10b85f4d9289c7782eccef46949e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-11-14T22:46:35Z" + content=""" +When I want that, I ls -l the file and look at the symlink to the key. Ie, in SHA1-s10481423--efc7eec0d711212842cd6bb8f957e1628146d6ed the size is 10481423 bytes. +"""]] diff --git a/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment new file mode 100644 index 000000000..3dd14bf01 --- /dev/null +++ b/doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-11-14T22:48:03Z" + content=""" +It might make sense to put this functionality in git annex find. Perhaps a format string with a %s for example. +"""]] diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__.mdwn b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__.mdwn new file mode 100644 index 000000000..592e26b93 --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__.mdwn @@ -0,0 +1,18 @@ +I'm testing out git-annex between a few computers one being a mac (osx 10.9) and a laptop (linux mint 16). With a vps running git annex as a transfer annex. + +Anyway sync is *almost* working... + +When I add files on my mac's annex they upload, and go to my laptop as they should. + +When I add files on my laptop's annex they upload, and the mac "downloads" them but only creates broken symlinks to the files. + + +I looked in the log and nothing out of the ordinary is happening... is this a bug with the osx version or what? + + +**more info** + +* the symlink on the osx annex is symlinking to a file in .git/annex/objects +* the osx annex changes the aliases to real files every time I restart the git annex daemon + +Thanks! diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_1_6889c4452e636474b4e70798b404fed2._comment b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_1_6889c4452e636474b4e70798b404fed2._comment new file mode 100644 index 000000000..c97f26e86 --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_1_6889c4452e636474b4e70798b404fed2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T17:11:59Z" + content=""" +It sounds like the contents of the files are being successfully transferred. + +It may be that you're using an old and buggy version of git-annex, in which the direct mode code lost track of things and so failed to update the tree correctly when receiving the content of a file. If so, you could fix it by upgrading git-annex and running `git annex fsck`. +"""]] diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_2_978fc11c463a457382fddd668cd1d0dd._comment b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_2_978fc11c463a457382fddd668cd1d0dd._comment new file mode 100644 index 000000000..b3a848ffe --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_2_978fc11c463a457382fddd668cd1d0dd._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="I had this same problem too" + date="2014-01-04T01:00:10Z" + content=""" +I was using the 2013-12-13 build and now I've upgrade to the 2014-01-03 build. git-annex has symlinked some important workspace.xml files to nowhere. One looks like this: + +workspace.xml -> ../../../.git/annex/objects/M2/8W/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml + +The referenced file doesn't exist. Actually, that entire M2 directory doesn't exist. + +This has cost me a lot of time trying to fix this. I tried git-annex fsck and I get this message: + + ** No known copies exist of XXXXXXX/workspace.xml + +\"XXXXXXX\" is a path I needed to obscure + +I can see it in the git-annex repo but it is a reference to a symlink that doesn't exist. Is there any way to get this file back? git-annex whereis tells me it is nowhere. This appears to be real data loss. +"""]] diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_3_4420bd3afaecd7536b02fc08cee82dbe._comment b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_3_4420bd3afaecd7536b02fc08cee82dbe._comment new file mode 100644 index 000000000..3f4ac940e --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_3_4420bd3afaecd7536b02fc08cee82dbe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Sorry for the bad formatting on that last post" + date="2014-01-04T17:16:51Z" + content=""" +I have some additional information that may be helpful. I had git-annex syncing my Mac with a Debian system. It appears that at some point in time the Debian system's NFS connection disconnected and then may have reconnected with sshfs. I don't know if this happened when the syncing issue occurred or not and I can't validate that since the machine was rebooted but it is possible that that caused git-annex on the Mac to choke while syncing and create the phantom symlink. I am experiencing NFS issues at the moment so it may have contributed to this hiccup. +"""]] diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_4_99286f17a87049c303f2aa34c0a90286._comment b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_4_99286f17a87049c303f2aa34c0a90286._comment new file mode 100644 index 000000000..d21d87145 --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_4_99286f17a87049c303f2aa34c0a90286._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 4" + date="2014-01-06T15:48:36Z" + content=""" +@Tim, you do not seem to be having the problem that the OP described. + +It is completely normal for git-annex to represent a file whose content is not present in the repository as a broken symlink. +Typically, git-annex preserves at least one copy of the file in one of your repositories. But if you `git annex add $file; git annex drop --force $file`, you will be left in exactly the situation you describe. + +You can use `git annex log $file` to see a log of which repositories contained a copy of the file in the past, and see what times the file was removed from each repository. This might give clues to what operation caused the last copy of the file to be lose. +"""]] diff --git a/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_5_39bad7441dcea4da4b389700301233de._comment b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_5_39bad7441dcea4da4b389700301233de._comment new file mode 100644 index 000000000..f7975fc0e --- /dev/null +++ b/doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_5_39bad7441dcea4da4b389700301233de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="I'll start another thread" + date="2014-01-06T18:17:44Z" + content=""" +Let me start another thread then and not pollute this one. Thanks! +"""]] diff --git a/doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn b/doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn new file mode 100644 index 000000000..84f9d1125 --- /dev/null +++ b/doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn @@ -0,0 +1,22 @@ +I've set up git annex on my laptop and on a remote server using the gitolite v3 git-annex branch. +When I 'git annex sync' from my laptop (mac OSX) to the server, and 'git annex copy . --to server' all works fine. + +Later, I tried to clone the repository on another machine (linux 2.6.32). again all is well. I 'git annex init' in the new clone and then try to 'git annex sync' -- now I run into problems. + +Specifically, the first request for the configlist (when I do 'git annex --debug sync' all is fine until the configlist request) somehow breaks and my ssh session shows: + +muxserver_listen bind(): Input/output error + +This seems to confuse the client, who now believes that git annex is not installed on the server (it is). + +If I issue the same command as git annex via ssh, all seems to work ok with the caveats below: + +I have a feeling it's related to the -o 'ControlPersist=yes' argument that git-annex appears to be giving ssh. If I include this option when I run via ssh, ssh dies: + +>ssh git@server -o "ControlMaster=auto" -o "ControlPersist=yes" "git-annex-shell 'configlist' '/~/PRJ'" +command-line: line 0: Bad configuration option: ControlPersist + + +(note that it appears to be ok to leave "ControlMaster=auto" in). + +any thoughts? diff --git a/doc/forum/git_annex_sync_dies___40__sometimes__41__/comment_1_48bbac0545bf13bbf04da723e418d037._comment b/doc/forum/git_annex_sync_dies___40__sometimes__41__/comment_1_48bbac0545bf13bbf04da723e418d037._comment new file mode 100644 index 000000000..9445421a4 --- /dev/null +++ b/doc/forum/git_annex_sync_dies___40__sometimes__41__/comment_1_48bbac0545bf13bbf04da723e418d037._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-15T18:16:23Z" + content=""" +Since this seems to be a problem with ssh connection caching, you can disable that: + +git config annex.sshcaching false + +Seems like the problem would be in the version of ssh you have installed on your linux client. Or possibly some interaction between its version and the server's version. + +Since linux 2.6.32 is quite old, I'll bet you have an old ssh too.. what version? +"""]] diff --git a/doc/forum/git_annex_test_on_windows.mdwn b/doc/forum/git_annex_test_on_windows.mdwn new file mode 100644 index 000000000..4e2f8dea6 --- /dev/null +++ b/doc/forum/git_annex_test_on_windows.mdwn @@ -0,0 +1,5 @@ +is it worth sharing back git annex test failures occourring on some windows setup ? +i'm having 3 failures, what kind of report can i produce shall it be of any use ? +is it enough a test log coming from git annex test > test.log 2>&1 ? +thanks again + diff --git a/doc/forum/git_annex_test_on_windows/comment_1_258ac5cfa2f5d24e737d94dc48f06899._comment b/doc/forum/git_annex_test_on_windows/comment_1_258ac5cfa2f5d24e737d94dc48f06899._comment new file mode 100644 index 000000000..d7968c16e --- /dev/null +++ b/doc/forum/git_annex_test_on_windows/comment_1_258ac5cfa2f5d24e737d94dc48f06899._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-15T20:53:17Z" + content=""" +Yes, it's fine to file a bug about test failures. Be sure you try with a current autobuild. + +The redirection you show would work on linux, I don't know about windows. But capturing a transcript of the test output is certainly what I need. +"""]] diff --git a/doc/forum/git_annex_with_local_apache_webdav_server.mdwn b/doc/forum/git_annex_with_local_apache_webdav_server.mdwn new file mode 100644 index 000000000..db489fdfa --- /dev/null +++ b/doc/forum/git_annex_with_local_apache_webdav_server.mdwn @@ -0,0 +1,23 @@ +Hi, + +trying to make git annex work locally with an apache webdav server. + +I have the webdav server working without issue on computers. When we try to init the repository there we get the following error: + +WEBDAV_USERNAME=user WEBDAV_PASSWORD=xxxxxx git annex initremote webdavtest type=webdav url=http://webdavserver/webdavsgare/annextest4 encryption=none +initremote webdavtest (testing WebDAV server...) + +git-annex: WebDAV failed to delete file: "Locked": user error +failed +git-annex: initremote: 1 failed + + +Does anyone have any thoughts? I can post config of webdav if it helps, though the error I receive in the error_log of apache is as follows: + +This resource is locked and an "If:" header was not supplied to allow access to the resource. [423, #0] + +but I can manage the files through command line, web interface and mounted drive with no issue. + +thank you in advance. + +Damien diff --git a/doc/forum/git_annex_with_local_apache_webdav_server/comment_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment b/doc/forum/git_annex_with_local_apache_webdav_server/comment_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment new file mode 100644 index 000000000..7963f64f0 --- /dev/null +++ b/doc/forum/git_annex_with_local_apache_webdav_server/comment_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-02-26T19:40:18Z" + content=""" +The webdav library that git-annex uses does some webdav file locking. When deleting a file, it first locks it. It sounds like your webdav server does not like to delete a file that has been locked. Whether this is in spec I don't know. + +I do know that got rid of all the webdav locking stuff in a revamp of git-annex's webdav support 2 days ago! git-annex does not need locking the way it uses webdav. + +However, the daily builds are still built with an old version of the DAV library, which still does the locking ... and will probably remain like that for some time. To get the new version without locking, you need to build git-annex from its git master on a system with http://hackage.haskell.org/package/DAV version 0.6.1. Building from source with cabal is one way to do it. I'll be releasing a build for Debian unstable in the next day or two. +"""]] diff --git a/doc/forum/git_annex_with_local_apache_webdav_server/comment_2_d8e9237cf6e7f7558f836ba1352f5517._comment b/doc/forum/git_annex_with_local_apache_webdav_server/comment_2_d8e9237cf6e7f7558f836ba1352f5517._comment new file mode 100644 index 000000000..2b60a9967 --- /dev/null +++ b/doc/forum/git_annex_with_local_apache_webdav_server/comment_2_d8e9237cf6e7f7558f836ba1352f5517._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7hS2LGu4sLUxLMdBA16PAMcVO7CDJmjw" + nickname="Damien" + subject="comment 2" + date="2014-03-10T12:16:43Z" + content=""" +I'm curious if anyone has set this up using a local apache webdav server? + +I'm stuck and could use some insight. + +thanks +Damien +"""]] diff --git a/doc/forum/git_pull_remote_git-annex.mdwn b/doc/forum/git_pull_remote_git-annex.mdwn new file mode 100644 index 000000000..349610693 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex.mdwn @@ -0,0 +1,11 @@ +I thought I'd followed the walk through when initially setting up my repos. + +However I find that I have to do the following to sync my annex's. + + git pull remote master + git checkout git-annex + git pull remote git-annex + git checkout master + git annex get . + +Has something gone wrong? I see no mention of syncing git-annex repos in the walk-through... diff --git a/doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment b/doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment new file mode 100644 index 000000000..989ab9bcd --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-06T16:43:29Z" + content=""" +You're taking a very long and strange way to a place that you can reach as follows: + +
+git pull remote
+git annex get .
+
+ +Which is just as shown in [[walkthrough/getting_file_content]]. + +In particular, \"git pull remote\" first fetches all branches from the remote, including the git-annex branch. +When you say \"git pull remote master\", you're preventing it from fetching the git-annex branch. +If for some reason you want the slightly longer way around, it is: + +
+git pull remote master
+git fetch remote git-annex
+git annex get .
+
+ +Or, eqivilantly but with less network connections: + +
+git fetch remote
+git merge remote/master
+git annex get .
+
+ +BTW, notice that this is all bog-standard git branch pulling stuff, not specific to git-annex in the least. +Consult your extensive and friendly git documentation for details. :) +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment b/doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment new file mode 100644 index 000000000..198f95cee --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2011-12-06T23:23:29Z" + content=""" +Doh! Total brain melt on my part. Thanks for the additional info. Not taking my time and reading things properly - kept assuming that the full remote pull failed due to the warning: + + You asked to pull from the remote 'rss', but did not specify + a branch. Because this is not the default configured remote + for your current branch, you must specify a branch on the command line. + +Rookie mistake indeed. +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment b/doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment new file mode 100644 index 000000000..0ead32dad --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 3" + date="2011-12-21T16:06:25Z" + content=""" +hmmmm - I'm still not sure I get this. + +If I'm using a whole bunch of distributed annexs with no central repo, then I can not do a `git pull remote` without either specifying the branch to use or changing default tracked remote via `git branch --set-upstream`. The former like you note doesn't pull the git-annex branch down the latter only works one-at-a-time. + +The docs read to me as though I ought to be able to do a `git pull remote ; git annex get .` using anyone of my distributed annexs. + +Am I doing something wrong? Or is the above correct? +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment b/doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment new file mode 100644 index 000000000..6ba179693 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="I think Matt is right." + date="2011-12-23T14:04:44Z" + content=""" +I got bitten by this too. It seems that the user is expected to fetch +remote git-annex branches themselves, but this is not documented +anywhere. + +The man page says of \"git annex merge\": + + Automatically merges any changes from remotes into the git-annex + branch. + +I am not a git newbie, but even so I had incorrectly assumed that git +annex merge would take care of pulling the git-annex branch from the +remote prior to merging, thereby ensuring all versions of the +git-annex branch would be merged, and that the location tracking data +would be synced across all peer repositories. + +My master branches do not track any specific upstream branch, because +I am operating in a decentralized fashion. Therefore the error +message caused by `git pull $remote` succeeded in encouraging me to +instead use `git pull $remote master`, and this excludes the git-annex +branch from the fetch. Even worse, a git newbie might realise this +and be tempted to do `git pull $remote git-annex`. + +Therefore I think it needs to be explicitly documented that + + git fetch $remote + git merge $remote/master + +is required when the local branch doesn't track an upstream branch. +Or maybe a `--fetch` option could be added to `git annex merge` to +perform the fetch from all remotes before running the merge(s). +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment b/doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment new file mode 100644 index 000000000..c01f24120 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-12-23T16:50:26Z" + content=""" +My goal for `git-annex merge` is that users should not need to know about it, so it should not be doing expensive pulls. + +I hope that `git annex sync` will grow some useful features to support fully distributed git usage, as being discussed in [[pure_git-annex_only_workflow]]. I still use centralized git to avoid these problems myself. +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment b/doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment new file mode 100644 index 000000000..f4b5ebec2 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 6" + date="2011-12-23T17:14:03Z" + content=""" +Extending `git annex sync` would be nice, although auto-commit does not suit every use case, so it would be better not to couple one to the other. +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment b/doc/forum/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment new file mode 100644 index 000000000..dad2c0af2 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 7" + date="2011-12-23T17:24:58Z" + content=""" +P.S. I see you already [fixed the docs](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=a0227e81f9c82afc12ac1bd1cecd63cc0894d751) - thanks! :) +"""]] diff --git a/doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment b/doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment new file mode 100644 index 000000000..5943d9312 --- /dev/null +++ b/doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="git tweak-fetch" + date="2011-12-26T18:50:35Z" + content=""" +The git tweak-fetch hook that I have been developing, and hope will be accepted into git soon, provides some abilities that could be used to make \"git pull remote\" always merge remote/master. Normall, git can only be configured to do that merge automatically for one remote (ie, origin). But the tweak-fetch hook can flag arbitrary branches as needing merge. + +So, it could always flag tracking branches of the currently checked out branch for merge. This would be enabled by some setting, probably, since it's not necessarily the case that everyone wants to auto-merge when they pull like this. (Which is why git doesn't do it by default after all.) + +(The tweak-fetch hook will also entirely eliminate the need to run git annex merge manually, since it can always take care of merging the git-annex branch.) +"""]] diff --git a/doc/forum/git_tag_missing_for_3.20111011.mdwn b/doc/forum/git_tag_missing_for_3.20111011.mdwn new file mode 100644 index 000000000..781d0c91a --- /dev/null +++ b/doc/forum/git_tag_missing_for_3.20111011.mdwn @@ -0,0 +1 @@ +Well, the subject pretty much says it all :) diff --git a/doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment b/doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment new file mode 100644 index 000000000..87cda998b --- /dev/null +++ b/doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="fixed that" + date="2011-10-13T15:36:59Z" + content=""" +:) +"""]] diff --git a/doc/forum/git_unannex_speed.mdwn b/doc/forum/git_unannex_speed.mdwn new file mode 100644 index 000000000..a5e6ad571 --- /dev/null +++ b/doc/forum/git_unannex_speed.mdwn @@ -0,0 +1 @@ +It was fast to git annex a bunch of files. But git unannex seems a lot slower. Is there a faster way to get files out of git annex? Or to replace the symlinks with real files and then I could just remove the .git directory? I shouldn't have put so many in as a test but they are there now. diff --git a/doc/forum/git_unannex_speed/comment_1_10cf326248f4e89e1f75bf97d7574763._comment b/doc/forum/git_unannex_speed/comment_1_10cf326248f4e89e1f75bf97d7574763._comment new file mode 100644 index 000000000..39fc4793c --- /dev/null +++ b/doc/forum/git_unannex_speed/comment_1_10cf326248f4e89e1f75bf97d7574763._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-08-02T16:58:41Z" + content=""" +It currently commits once per file, which is slow. `Command/Unannex.hs` explains why this is necessary. If I think of a way to avoid that, I will. +"""]] diff --git a/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn b/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn new file mode 100644 index 000000000..d9db436c6 --- /dev/null +++ b/doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn @@ -0,0 +1,6 @@ +I propose to add some functionality to git-annex, to automatically "throttle" the data retrieval from amazon glacier to stay within the daily free retrieval allowance. If someone would need to get his/her files faster, there should be an option to disable this throttling (or even better, specify the retrieval rate). + +As far as I understand glacier, this could be implemented using range retrievals. In short range retrievals enable you, to only retrieve a part of an archive in glacier. This can be used to only retrieve / request so much data, that you stay within the free retrieval allowance. ( please see [Q: Why would I retrieve only a range of an archive?](http://aws.amazon.com/glacier/faqs/#Why_would_I_retrieve_only_a_range_of_an_archive) ). + + +This would be somewhat similar to the [smart retrieval feature in cloudberry](http://blog.cloudberrylab.com/2012/12/introducing-smart-restore-for-amazon.html) . diff --git a/doc/forum/handling_MP3_metadata_changes.mdwn b/doc/forum/handling_MP3_metadata_changes.mdwn new file mode 100644 index 000000000..9b6caa27a --- /dev/null +++ b/doc/forum/handling_MP3_metadata_changes.mdwn @@ -0,0 +1,12 @@ +Hello, + +I'm still looking for a way to version control the metadata (title, artist, album name, ...) of my MP3s, I wonder if git annex could help for this problem ? +The method I use now (without git annex) is to export the MP3 metadata to an textual format with one line per tag. +It's this textual file I handles with git. +The problem is to handle the mapping between the orignal file and the export file with file renaming or moving. +I consider to use the checksum of the audio content (without metadata, this checksum never changes) to handle this problem. +Maybe git annex has a different approach (better) to solve this problem ? +How git annex would be use to solve the orignal problem ? + +Regards, +Emmanuel Berry diff --git a/doc/forum/handling_MP3_metadata_changes/comment_1_aa4955fd64ea5aa836f1a591e185c4a2._comment b/doc/forum/handling_MP3_metadata_changes/comment_1_aa4955fd64ea5aa836f1a591e185c4a2._comment new file mode 100644 index 000000000..483c1fb78 --- /dev/null +++ b/doc/forum/handling_MP3_metadata_changes/comment_1_aa4955fd64ea5aa836f1a591e185c4a2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T19:29:53Z" + content=""" +Check out [[metadata]] +"""]] diff --git a/doc/forum/hashing_objects_directories.mdwn b/doc/forum/hashing_objects_directories.mdwn new file mode 100644 index 000000000..5b7708fb5 --- /dev/null +++ b/doc/forum/hashing_objects_directories.mdwn @@ -0,0 +1,27 @@ +I'm wondering how easy the addition of hashing to the directories of the objects would be. + +Currently a tree directory structure becomes a flat two level tree under the .git/annex/objects directory ([[internals]]). This, through the 555 mode on the directory prevents the accidental destruction of content, which is _good_. However file and directory numbers soon add up in there and as such any file-systems with sub directory limitations will quickly realize the limit (certainly quicker than maybe expected). + +Suggestion is therefore to change from + + `.git/annex/objects/SHA1:123456789abcdef0123456789abcdef012345678/SHA1:123456789abcdef0123456789abcdef012345678` + +to + + `.git/annex/objects/SHA1:1/2/3456789abcdef0123456789abcdef012345678/SHA1:123456789abcdef0123456789abcdef012345678` + +or anything in between to a paranoid + + `.git/annex/objects/SHA1:123/456/789/abc/def/012/345/678/9ab/cde/f01/234/5678/SHA1:123456789abcdef0123456789abcdef012345678` + +Also the use of a colon specifically breaks FAT32 ([[bugs/fat_support]]), must it be a colon or could an extra directory be used? i.e. `.git/annex/objects/SHA1/*/...` + +`git annex init` could also create all but the last level directory on initialization. I'm thinking `SHA1/1/1, SHA1/1/2, ..., SHA256/f/f, ..., URL/f/f, ..., WORM/f/f` + +> This is done now with a 2-level hash. It also hashes .git-annex/ log +> files which were the worse problem really. Scales to hundreds of millions +> of files with each dir having 1024 or fewer contents. Example: +> +> `me -> .git/annex/objects/71/9t/WORM-s3-m1300247299--me/WORM-s3-m1300247299--me` +> +> --[[Joey]] diff --git a/doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment b/doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment new file mode 100644 index 000000000..3a19310b6 --- /dev/null +++ b/doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-14T16:12:49Z" + content=""" +My experience is that modern filesystems are not going to have many issues with tens to hundreds of thousands of items in the directory. However, if a transition does happen for FAT support I will consider adding hashing. Although getting a good balanced hash in general without, say, checksumming the filename and taking part of the checksum, is difficult. + +I prefer to keep all the metadata in the filename, as this eases recovery if the files end up in lost+found. So while \"SHA/\" is a nice workaround for the FAT colon problem, I'll be doing something else. (What I'm not sure yet.) + +There is no point in creating unused hash directories on initialization. If anything, with a bad filesystem that just guarantees worst performance from the beginning.. +"""]] diff --git a/doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment b/doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment new file mode 100644 index 000000000..64f1e16b5 --- /dev/null +++ b/doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-03-15T13:52:16Z" + content=""" +Can't you just use an underscore instead of a colon? + +Would it be feasible to split directories dynamically? I.e. start with SHA1_123456789abcdef0123456789abcdef012345678/SHA1_123456789abcdef0123456789abcdef012345678 and, at a certain cut-off point, switch to shorter directory names? This could even be done per subdirectory and based purely on a locally-configured number. Different annexes on different file systems or with different file subsets might even have different thresholds. This would ensure scale while not forcing you to segment from the start. Also, while segmenting with longer directory names means a flatter tree, segments longer than four characters might not make too much sense. Segmenting too often could lead to some directories becoming too populated, bringing us back to the dynamic segmentation. + +All of the above would make merging annexes by hand a _lot_ harder, but I don't know if this is a valid use case. And if all else fails, one could merge everything with the unsegemented directory names and start again from there. + +-- RichiH +"""]] diff --git a/doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment b/doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment new file mode 100644 index 000000000..51deb2f95 --- /dev/null +++ b/doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-16T03:13:39Z" + content=""" +It is unfortunatly not possible to do system-dependant hashing, so long as git-annex stores symlinks to the content in git. + +It might be possible to start without hashing, and add hashing for new files after a cutoff point. It would add complexity. + +I'm currently looking at a 2 character hash directory segment, based on an md5sum of the key, which splits it into 1024 buckets. git uses just 256 buckets for its object directory, but then its objects tend to get packed away. I sorta hope that one level is enough, but guess I could go to 2 levels (objects/ab/cd/key), which would provide 1048576 buckets, probably plenty, as if you are storing more than a million files, you are probably using a modern enough system to have a filesystem that doesn't need hashing. +"""]] diff --git a/doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment b/doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment new file mode 100644 index 000000000..b29eea1b2 --- /dev/null +++ b/doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-03-16T04:06:19Z" + content=""" +The .git-annex/ directory is what really needs hashing. + +Consider that when git looks for changes in there, it has to scan every file in the directory. With hashing, it should be able to more quickly identify just the subdirectories that contained changed files, by the directory mtimes. + +And the real kicker is that when committing there, git has to create a tree object containing every single file, even if only 1 file changed. That will be a lot of extra work; with hashed subdirs it will instead create just 2 or 3 small tree objects leading down to the changed file. (Probably these trees both pack down to similar size pack files, not sure.) +"""]] diff --git a/doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment b/doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment new file mode 100644 index 000000000..c558ee65e --- /dev/null +++ b/doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 5" + date="2011-03-16T15:47:17Z" + content=""" +If you can't segment the names retroactively, it's better to start with segmenting, imo. + +As subdirectories are cheap, going with ab/cd/rest or even ab/cd/ef/rest by default wouldn't hurt. + +Your point about git not needing to create as many tree objects is a kicker indeed. If I were you, I would default to segmentation. +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn b/doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn new file mode 100644 index 000000000..365ad71db --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn @@ -0,0 +1,12 @@ +## Question +Can git-annex run passively with an existing repo? + +## Scenario +We have an existing web application with large binary assets spread throughout modules in the repo. The project is in constant development with weekly deploys to production and there are many developers working on the project. + +## Goal +We need to maintain the directory structure for these assets without actually committing large binaries to the main remote (hosted on GitHub). I need a solution that has a low barrier of entry when on-boarding new developers. I was thinking maybe a script the is executed on every commit that would filter binaries files based on extensions and commit them to the git-annex remote instead. We are flexible on the type of remote storage type (SSH, S3, etc) + +## Notes +I have gone through the last couple months of forum posts and done a bit of Googling but have come up empty. If anyone can point me in the right direction that would be great. +Thanks! diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_1_4cb38d71c943657c5ba0896cd70d2e64._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_1_4cb38d71c943657c5ba0896cd70d2e64._comment new file mode 100644 index 000000000..b98ad6323 --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_1_4cb38d71c943657c5ba0896cd70d2e64._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-06-01T09:21:54Z" + content=""" +Mixing files controlled by git directly and files controlled by git annex is possible, simply 'git annex add' the large files and 'git add' the rest. You will not be able to use direct mode and you should not run the git annex assisstant, as it will add all files to the annex. +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_2_b5e94c10ebbed9125c7e2332f75709ca._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_2_b5e94c10ebbed9125c7e2332f75709ca._comment new file mode 100644 index 000000000..ba321df6b --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_2_b5e94c10ebbed9125c7e2332f75709ca._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9FMhhhM2sJ68Zjx_RmWd8cTdpI-mrkbE" + nickname="Hans" + subject="what about with git-svn?" + date="2013-06-04T08:00:15Z" + content=""" +I'm trying to wrap my head around a similar situation. +I've tested this by git cloning my repo; the symlinks are copied, and end up broken because the annex directory under .git doesn't exist in the new repo. + +So to be specific: can I conclude that when I use git to copy my repo, as long as I don't explicitly use git-annex in the process, I end up with a 'bare' git repo and I don't have to worry about my annexed files coming along? + +Also: anyone know of anything that would be different about using git-svn? (i.e. git svn dcommit to push my changes to an svn repo)? +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_3_2b3b93bbc60fbc24d436231954d6822a._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_3_2b3b93bbc60fbc24d436231954d6822a._comment new file mode 100644 index 000000000..8d2fd0dff --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_3_2b3b93bbc60fbc24d436231954d6822a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-06-04T12:29:04Z" + content=""" +As long as you're not using Direct Mode, then a git-annex repo is just an absolutely ordinary git repo, which happens to contain some symlinks that point to .git/annex/objects/* + + +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment new file mode 100644 index 000000000..e9f22adfd --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9J51AO9t75xN5k0sJgg8taUo4y0a4hpQ" + nickname="Daniel" + subject="comment 4" + date="2013-06-07T23:02:29Z" + content=""" +I'm trying to find a way to prevent developers from adding certain file types to the main repo. Is there something like a pre-add hook that could be used? + +I found this in another forum but I'm not sure how it was intended to be implemented. + +``` +git check-attr addtoannex \"$FILE\" | grep -q \": set$\" +if [ $? -eq 0 ]; then + git annex add \"$FILE\" +else + git add \"$FILE\" +fi +``` + +[http://git-annex.branchable.com/forum/Let_watch_selectively_annex_files/](http://git-annex.branchable.com/forum/Let_watch_selectively_annex_files/) +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_5_96b1eb1e8e9f315c646f4686870f9b52._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_5_96b1eb1e8e9f315c646f4686870f9b52._comment new file mode 100644 index 000000000..6435fc252 --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_5_96b1eb1e8e9f315c646f4686870f9b52._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-06-11T14:30:08Z" + content=""" +I think the most useful thing for people in this thread to know about is [[tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant]]. + +This doesn't solve it at the command line, where you still need to choose between git add and git annex add, but you can use git annex watch to automatically commit small files to git, and large files to the git annex. +"""]] diff --git a/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment new file mode 100644 index 000000000..6220a4416 --- /dev/null +++ b/doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9J51AO9t75xN5k0sJgg8taUo4y0a4hpQ" + nickname="Daniel" + subject="comment 6" + date="2013-06-11T22:28:52Z" + content=""" +This is what I ended up doing. +[https://gist.github.com/ifnull/5761255](https://gist.github.com/ifnull/5761255) + +Basically you just add the extensions of the files you want to exclude to .gitignore_large_binaries and run \"git a .\" instead of \"git add .\" + + ####################### + # Setup + ####################### + mkdir annex-test + cd annex-test + git init + git annex init master + + ####################### + # Fab setup task + ####################### + git config --local core.excludesfile ./.gitignore_large_binaries + git config --local alias.a '! sh ./git-add.sh' + + ####################### + # git a (git-add.sh) + ####################### + + # Generate annex include arg from .gitignore_large_binaries + include_str=\"--include='.lazy'\"; + + while read line + do + if [[ \"$line\" != *\"#\"* ]] && [[ \"$line\" != \"\" ]]; then + include_str=\"$include_str --or --include=${line}\"; + fi + done < \"./.gitignore_large_binaries\" + + # git annex add + git config --local core.excludesfile ./.gitignore; + git annex add $1 $include_str; + + # git add + git config --local core.excludesfile ./.gitignore_large_binaries; + git add $1 +"""]] diff --git a/doc/forum/how_do_i_manually_sync_my_external_drive__63__.mdwn b/doc/forum/how_do_i_manually_sync_my_external_drive__63__.mdwn new file mode 100644 index 000000000..a5685761d --- /dev/null +++ b/doc/forum/how_do_i_manually_sync_my_external_drive__63__.mdwn @@ -0,0 +1,9 @@ +I am working on rehauling my backup scripts here, and I was originally doing an rsync of everything to an external drive, but now I think I can be smarted and skip my annexes in that rsync, and use git-annex superpowers to do the sync instead. + +I have added this to my backup script: + + ( cd /srv/video && git annex copy --to backup . ) + +And it works, so yaaay. :) However, I feel it could be faster. This seems to check each file one at a time, but doesn't git-annex keep a state of the remote internally, which would allow it to copy over only the missing files, without checking if each file is present individually? + +I mean, it's still pretty fast considering the dataset, but I wonder if there isn't some fast/easier way. Keep in mind I am hesitant of using the assistant for this because I am [[confused_about_external_drives]], the [[bugs/webapp takes 100% of the cpu]] and the [[bugs/assistant eats all CPU]]. I would prefer to script this anyways. --[[anarcat]] diff --git a/doc/forum/how_do_i_manually_sync_my_external_drive__63__/comment_1_4fd8722cafd55b0503c802289206645a._comment b/doc/forum/how_do_i_manually_sync_my_external_drive__63__/comment_1_4fd8722cafd55b0503c802289206645a._comment new file mode 100644 index 000000000..290221541 --- /dev/null +++ b/doc/forum/how_do_i_manually_sync_my_external_drive__63__/comment_1_4fd8722cafd55b0503c802289206645a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T20:43:05Z" + content=""" +Pulling location tracking data out of git is unlikely to be faster than statting a single file on the drive, unless the drive is dead slow. + +If you really want to force it to use the location tracking information, use `--not --in backup` +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn new file mode 100644 index 000000000..d16131eea --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn @@ -0,0 +1,14 @@ +I have an encrypted S3 remote with which I recently ran: + +$> git annex move . --from cloud + +which moved all my files to the local repo. When I looked at my S3 bucket, I saw some files left. I then ran: + +$> git annex unused --from cloud + +to get all the unused data. I dropped each unused data from cloud so that now I think git annex believes it has nothing on the cloud remote. + +However there is still one file left on the bucket. Is this normal? (if not I'll create a bug report) +More importantly, how can I decrypt this file so I can run git log -S'KEY' to figure out what it is (I want to make sure I haven't lost any data). + +To be clear, when I currently run 'git annex move . --from cloud' it moves nothing and when I run 'git annex unused --from cloud' it reports no unused data. diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment new file mode 100644 index 000000000..c1eccfb0f --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="comment 1" + date="2013-07-27T22:14:11Z" + content=""" +one more thing, I forgot to mention I use gpg keys for encryption on the remote and not a shared key. +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_2_79340bf3c0691073a9808c5ac2da0a3d._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_2_79340bf3c0691073a9808c5ac2da0a3d._comment new file mode 100644 index 000000000..0cea29414 --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_2_79340bf3c0691073a9808c5ac2da0a3d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 2" + date="2013-07-27T22:30:50Z" + content=""" +I suppose this could happen if you have a tag or a branch or another repository that still refers to the file that's stored in S3. It would then not be found by `unused`. + +git-annex 4.20130709 has a nice new --all switch you can use: `git annex move --all --from cloud` + +If that doesn't move the file, nothing in the entire history of the git repository refers to it. The question then would be how did that file get there. + +It's by [[design|design/encryption]] not possible to get from the name of an encrypted file back to the key, unless you already know all the possible keys that the file could be. It's possible to decrypt the content if you have the gpg key and the git repository, but this space is a bit too small to explain every step in doing so, and I have some nice code that explains how in detail. ;) +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment new file mode 100644 index 000000000..5c8d6356c --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="comment 3" + date="2013-07-27T22:47:14Z" + content=""" +thanks, running + +'git annex move --all --from cloud' + +grabbed the one remaining file from the bucket. +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment new file mode 100644 index 000000000..493fa3ba1 --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-27T22:52:00Z" + content=""" +Great! And it should have also printed out the key it downloaded, if you're curious about looking where that file is used in your git repository. +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment new file mode 100644 index 000000000..042704e52 --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="comment 5" + date="2013-07-27T23:02:19Z" + content=""" +yeah it did print out the name of the file so I was able to verify that it was nothing I was worried about losing. thanks again :D +"""]] diff --git a/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_6_66fe80e634a8f13cce18fe68974ec67a._comment b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_6_66fe80e634a8f13cce18fe68974ec67a._comment new file mode 100644 index 000000000..8e79b4dc2 --- /dev/null +++ b/doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_6_66fe80e634a8f13cce18fe68974ec67a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 6" + date="2013-07-27T23:06:38Z" + content=""" +I'm curious, why didn't `git annex unused --from cloud` show the file? Was it a tag/branch/etc still referring to it? +"""]] diff --git a/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn new file mode 100644 index 000000000..e7de59210 --- /dev/null +++ b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn @@ -0,0 +1,5 @@ +I fear that while using git annex I will at some point accidentally `git add` some small files and not notice it until the only way to fix the problem is to rewrite history. What would be the best way to prevent myself from ever `git add`-ing a file into my annex repository instead of `git annex add`-ing it? + +And secondly, how can I best search in my git annex repository whether I already did this mistake in the past or not? Currently I'm using this which returns everything that's not a symlink or a git submodule: + + git ls-files -s | awk ' $1 != 120000 && $1 != 160000 { print $4 }' diff --git a/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_1_440dcd19ea2512f968858b780c2a2913._comment b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_1_440dcd19ea2512f968858b780c2a2913._comment new file mode 100644 index 000000000..166d549fd --- /dev/null +++ b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_1_440dcd19ea2512f968858b780c2a2913._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="Xyem" + ip="178.79.137.64" + subject="comment 1" + date="2014-06-25T10:35:07Z" + content=""" +I'm not sure if you can prevent 'git add' but you can at least prevent it getting commited with the pre-commit hook. Mine is this: + + #!/bin/sh + + FILES=$(find -name \".git\" -prune -o -type f -not -name \".gitignore\" -print); + FILE_COUNT=$(echo -n \"$FILES\" | wc -l) + + if [ $FILE_COUNT -gt 0 ]; then + echo \"$FILE_COUNT non-symlink files found.\" + echo \"$FILES\" + exit 1 + fi + + # automatically configured by git-annex + git annex pre-commit . +"""]] diff --git a/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_2_e9b70386774996a3d0446faaa3219120._comment b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_2_e9b70386774996a3d0446faaa3219120._comment new file mode 100644 index 000000000..bc8acf020 --- /dev/null +++ b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_2_e9b70386774996a3d0446faaa3219120._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="josch" + ip="2001:638:709:5:2ad2:44ff:fe4b:56aa" + subject="comment 2" + date="2014-06-27T04:50:03Z" + content=""" +Xyem, your method does not work well because it finds all regular files in the whole annex directory and does not only check for those that are to be committed. +"""]] diff --git a/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_3_3dbd76accad2df2fff14b55452c828ef._comment b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_3_3dbd76accad2df2fff14b55452c828ef._comment new file mode 100644 index 000000000..d8f681a1b --- /dev/null +++ b/doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__/comment_3_3dbd76accad2df2fff14b55452c828ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Xyem" + ip="178.79.137.64" + subject="comment 3" + date="2014-06-27T12:02:08Z" + content=""" +That is intentional. In my use case, there should never be any regular files in this particular annex at all. If there are, it means I have missed something! :) +"""]] diff --git a/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents.mdwn b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents.mdwn new file mode 100644 index 000000000..4f24117f6 --- /dev/null +++ b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents.mdwn @@ -0,0 +1,7 @@ +It would be nice to have a way to drop files without leaving broken symlinks around, at least while in direct mode. + +Here is my user case. I have a collection of music CDs ripped in FLAC formats. At the same time I convert all these files to MP3 files to that I can use them in various other devices and to save space. + +The problem is that if I `git annex drop` the FLAC files once they are converted and copied, they leave broken symlinks around; this result in various annoying error messages in almost all the music playback I tried. At the same time, if I `rm` or `git rm` these symlinks, the content of these files will be removed also from the remotes as they are signalled as no longer wanted. + +Couldn't git-annex keep a separate index of files that have been removed but are meant to be kept? diff --git a/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_1_cba76311e146dabb8ffc789bf4c8b714._comment b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_1_cba76311e146dabb8ffc789bf4c8b714._comment new file mode 100644 index 000000000..c490c826a --- /dev/null +++ b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_1_cba76311e146dabb8ffc789bf4c8b714._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://svario.it/gioele" + ip="2001:1418:100:262::2" + subject="Maybe using branches?" + date="2013-05-16T10:22:48Z" + content=""" +A suggestion from #git-annex: + +> <mhameed> i think others are already doing this, using branches, but not sure if we have a writeup/tutorial of it +> +> <mhameed> gioele: instead of working on master branch, switch to laptop branch, git rm the files that are not wanted and commit +> +> <gioele> mhameed: I'm lazy, I'd like git-annex to do that for me :) +"""]] diff --git a/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_2_8d99c50fc1347367ccc0714e8d1af385._comment b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_2_8d99c50fc1347367ccc0714e8d1af385._comment new file mode 100644 index 000000000..f0b20f1a4 --- /dev/null +++ b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_2_8d99c50fc1347367ccc0714e8d1af385._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-19T20:43:43Z" + content=""" +The original poster seems to have a misunderstanding of what git-annex does with the content of files. Deleting a file does not remove the content of the file. You can always use git to check out a previous version of a file, and the content from the annex will still be there (or you can `git annex get` it to get it from whereever git-annex stored the content). + +The only exception to this rule is is you, manually, chose to run `git annex unused` and then `git annex dropunused`. That can delete the contents of files, when no branch or tag refers to them. As long as some branch refers to the content of the files, even if it's not the currently checked out branch, the file content is retained. + +So a branch *is* the \"index of files that have been removed but are wanted to be kept\". + +For example, you could do: + +[[!format sh \"\"\" +git checkout -b keepflacs + +cdrom-rip-command +git annex add *.flac +git commit -m \"ripped a cd\" +flac-convert-command +git annex add *.mp3 +git commit -m \"converted to mp3\" + +git checkout master +git merge keepflacs +git rm *.flac +git commit -m \"removed flac files from this branch. They are still available in the keepflacs branch\" +\"\"\"]] + +As long as you always switch to the keepflacs branch to add flac files, and never merge the master branch into keepflacs, +but only merge keepflacs into master, keepflacs will have every flac file you have ripped. And so git-annex will retain those files +even when you `git annex unused; git-annex dropunused`. + +Or, just make a promise to yourself that you'll never run `git-annex unused`, similarly to how you'd probably never run `rm -rf .git/objects/$rand`, and you don't need the branches; like git, git-annex will retain all data that has ever been checked into it. + +(The branches are still a good idea. For one thing, they let you run `git annex fsck` and other repository maintenance commands with the keepflacs branch checked out.) + +I am going to move this thread to the [[forum]], because it's not really a TODO item, but is something others may want to read. +"""]] diff --git a/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_3_a7a9c55c2ad448179dff5d5b69976c7d._comment b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_3_a7a9c55c2ad448179dff5d5b69976c7d._comment new file mode 100644 index 000000000..39ed8306c --- /dev/null +++ b/doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_3_a7a9c55c2ad448179dff5d5b69976c7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-20T17:46:08Z" + content=""" +Erm, I missed that you want to use direct mode. All this fun with git won't really work in direct mode, and indeed direct mode is not able to guarantee that old versions of modified files are retained. + +Direct mode is nice for some applications involving syncing and less than ideal devices, but not for this. +"""]] diff --git a/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes.mdwn b/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes.mdwn new file mode 100644 index 000000000..cab2ec0c6 --- /dev/null +++ b/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes.mdwn @@ -0,0 +1,5 @@ +I have created two git-annexes (one on my laptop and one on my work pc) The are using nearly the same files with some files existing only on the pc but not on the laptop as they are too large for the laptop. How do I get the two into sync. I found the manual in the tips section but that will create normal git-annexes with all files linked only. However, I would like to have my exiting file structure unchanged (the way the assistant does it by default) + +any ideas? + +Gregor diff --git a/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes/comment_1_7bd0edaf2352293678f0942aaa885d13._comment b/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes/comment_1_7bd0edaf2352293678f0942aaa885d13._comment new file mode 100644 index 000000000..4b3b095c3 --- /dev/null +++ b/doc/forum/howto_to_link_to_existing_direct_mode_git-annexes/comment_1_7bd0edaf2352293678f0942aaa885d13._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T19:11:00Z" + content=""" +The webapp will help you do this, go to Add Another Repository -> Share With Your Other Devices. +"""]] diff --git a/doc/forum/howto_update_feed.mdwn b/doc/forum/howto_update_feed.mdwn new file mode 100644 index 000000000..5323e92eb --- /dev/null +++ b/doc/forum/howto_update_feed.mdwn @@ -0,0 +1,14 @@ +I am using the importfeed [1] functionality. + +How am I supposed to update the feed/feeds? + +I understand that running + + cd annex; git annex importfeed http://url/to/podcast + +a second time will 'do the right thing'. But that is cumbersome as I have to know the url again. Is there sth like git annex updatefeeds? + + + + +[1] http://joeyh.name/blog/entry/git-annex_as_a_podcatcher/ diff --git a/doc/forum/howto_update_feed/comment_1_bec356619f370a618f19a187d09d2e35._comment b/doc/forum/howto_update_feed/comment_1_bec356619f370a618f19a187d09d2e35._comment new file mode 100644 index 000000000..fa87e3494 --- /dev/null +++ b/doc/forum/howto_update_feed/comment_1_bec356619f370a618f19a187d09d2e35._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-26T18:11:07Z" + content=""" +I have purposefully kept a list of feeds out of git-annex. I handle this by having a `feeds` file, which I check into git. Then a cron job runs: `xargs git-annex importfeed < feeds` +"""]] diff --git a/doc/forum/howto_update_feed/comment_2_84dfb80ba3db8d41164eb97022becae3._comment b/doc/forum/howto_update_feed/comment_2_84dfb80ba3db8d41164eb97022becae3._comment new file mode 100644 index 000000000..4f28d8f4e --- /dev/null +++ b/doc/forum/howto_update_feed/comment_2_84dfb80ba3db8d41164eb97022becae3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 2" + date="2013-08-26T19:04:21Z" + content=""" +Thanks for that. I'll do the same ;-) +"""]] diff --git a/doc/forum/howto_update_feed/comment_3_20166db298c10074e062aecad59ffd71._comment b/doc/forum/howto_update_feed/comment_3_20166db298c10074e062aecad59ffd71._comment new file mode 100644 index 000000000..73f48ac9b --- /dev/null +++ b/doc/forum/howto_update_feed/comment_3_20166db298c10074e062aecad59ffd71._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 3" + date="2013-08-28T01:32:38Z" + content=""" +One thing I do slightly differently is put comments in my ```feeds``` file so I know what feed is what... + + # NPR - Wait Wait... Don't Tell Me! + http://www.npr.org/rss/podcast.php?id=35 + # NPR - Car Talk + http://www.npr.org/rss/podcast.php?id=510208 + + +Then I use + + grep -v '^#' feeds| xargs git-annex importfeed --relaxed + +I reckon that makes maintenance easier. +"""]] diff --git a/doc/forum/howto_update_feed/comment_4_f040e31b763fc9a7aa092442b4d6b8e8._comment b/doc/forum/howto_update_feed/comment_4_f040e31b763fc9a7aa092442b4d6b8e8._comment new file mode 100644 index 000000000..f7a35d1b6 --- /dev/null +++ b/doc/forum/howto_update_feed/comment_4_f040e31b763fc9a7aa092442b4d6b8e8._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 4" + date="2013-09-01T18:06:51Z" + content=""" +Yet another solution, keeping it all in one script + + #!/bin/sh + + while IFS= read line + do + test -n \"${line%%#*}\" && echo git annex importfeed --relaxed \"$line\" + done < +joey@darkstar:~/tmp/test>touch foo +joey@darkstar:~/tmp/test>touch bar +joey@darkstar:~/tmp/test>git annex add foo bar + +local annex keys: 1 +known annex keys: 2 +
+ +"""]] diff --git a/doc/forum/known_and_local_annex_keys/comment_2_68f20c881eafe986694bde10571cf1c0._comment b/doc/forum/known_and_local_annex_keys/comment_2_68f20c881eafe986694bde10571cf1c0._comment new file mode 100644 index 000000000..944ec9caf --- /dev/null +++ b/doc/forum/known_and_local_annex_keys/comment_2_68f20c881eafe986694bde10571cf1c0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="77.247.181.165" + subject="comment 2" + date="2013-10-28T18:31:21Z" + content=""" +I don't think I'm stressing too much. Rather, I'm inquiring about why git-annex is giving me wrong (or at least unclear) output that makes me worry about losing data. I plan to trust git-annex with a lot of important files, and in order to do that I want to make sure it's trustworthy. And that's where the inaccurate key numbers get in the way. + +So why do the local and known numbers diverge anyway? Would you consider adjusting the status output to be more accurate, or at least less confusing? I just want to be able to check that every single file in the repo is being backed up. +"""]] diff --git a/doc/forum/known_and_local_annex_keys/comment_3_e195a7091a06ce0427bb28aca9a17d04._comment b/doc/forum/known_and_local_annex_keys/comment_3_e195a7091a06ce0427bb28aca9a17d04._comment new file mode 100644 index 000000000..fd9228b4f --- /dev/null +++ b/doc/forum/known_and_local_annex_keys/comment_3_e195a7091a06ce0427bb28aca9a17d04._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-10-28T19:06:00Z" + content=""" +I have adjusted the labels to be more clear. +"""]] diff --git a/doc/forum/known_and_local_annex_keys/comment_4_d81f0bf7465832cb676fd89f5d53ec18._comment b/doc/forum/known_and_local_annex_keys/comment_4_d81f0bf7465832cb676fd89f5d53ec18._comment new file mode 100644 index 000000000..fccc576d3 --- /dev/null +++ b/doc/forum/known_and_local_annex_keys/comment_4_d81f0bf7465832cb676fd89f5d53ec18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="77.247.181.165" + subject="comment 4" + date="2013-10-28T19:24:12Z" + content=""" +Thanks, I'll check it out. And if you ever got around to introduce a means that can answer the above-mentioned integrity questions, that'd be really awesome. +"""]] diff --git a/doc/forum/linux_standalone_tarballs.mdwn b/doc/forum/linux_standalone_tarballs.mdwn new file mode 100644 index 000000000..1c6380a7d --- /dev/null +++ b/doc/forum/linux_standalone_tarballs.mdwn @@ -0,0 +1 @@ +Just saw that there is now a linux standalone tarball, I've a SL5 (RHEL5) based machine which I can churn out git-annex binaries if there is interest. diff --git a/doc/forum/linux_standalone_tarballs/comment_1_5c3ceb845a45e50784f7098bfbf94df1._comment b/doc/forum/linux_standalone_tarballs/comment_1_5c3ceb845a45e50784f7098bfbf94df1._comment new file mode 100644 index 000000000..64a37f366 --- /dev/null +++ b/doc/forum/linux_standalone_tarballs/comment_1_5c3ceb845a45e50784f7098bfbf94df1._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 1" + date="2012-09-29T16:03:36Z" + content=""" +I'll be curious to see if the standalone tarball works on such a system.. it might need a newer libc +than RHEL5 has. + +Conversely, that'd make it a good system to build the tarball on, so it's built to work with a nice old libc. :) + +I have a machine where I could put chroots to do both 64 bit and 32 bit builds, but I don't know if I'll automate it there. Too lazy.. +"""]] diff --git a/doc/forum/local_pairing_with_2_mac.mdwn b/doc/forum/local_pairing_with_2_mac.mdwn new file mode 100644 index 000000000..814ecc123 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac.mdwn @@ -0,0 +1,27 @@ +Hey ! +I am trying to find ways to use git annex as a tool to share big binary files for our development projects (such as PSD files). +Our team has artists that will not use command line tools so I have been testing git-annex assistant with a lot of hope. +However all the tests I am doing are just failing. °.° ' + +in this thread I would like to focus on what would seem to me as an easy first approach : local pairing. + +So my team and I are on mac. I am just trying to sync 2 computers on the same network. But the process is stuck on the "local pairing in process" step, just after I enter the secret phrase. + +I have enabled sshd (preferences -> remote login) on both computers, checked the firewall to authorize git-annex, so I am probably missing something here. +the logs on my computer does not say anything usefull ([2013-12-04 22:04:34 CET] main: Pairing in progress) but on the other computer I have this : + +git-annex: ssh-keygen failed +[2013-12-04 22:04:33 CET] PairListener: utku@MacBook-Air-de-utku.local:~/Documents/git-test is sending a pair request. +dyld: lazy symbol binding failed: Symbol not found: ___strlcpy_chk + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen + Expected in: /usr/lib/libSystem.B.dylib + +dyld: Symbol not found: ___strlcpy_chk + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen + Expected in: /usr/lib/libSystem.B.dylib + +git-annex: ssh-keygen failed + +Don't know if that helps. I don't know which info I need to provide. + +cheers diff --git a/doc/forum/local_pairing_with_2_mac/comment_10_508585e72c81d197a9a1e193c25a702a._comment b/doc/forum/local_pairing_with_2_mac/comment_10_508585e72c81d197a9a1e193c25a702a._comment new file mode 100644 index 000000000..1d69f41fd --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_10_508585e72c81d197a9a1e193c25a702a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfC02DTOZygFDDvvg0maRciYYMhEIFgkw" + nickname="Utku" + subject="comment 10" + date="2013-12-15T09:51:28Z" + content=""" +unfortunately, it is not working on the computer where ssh was not working +I click an got annex and nothing seems to open +I try to go on the system logs but I see nothing really obvious. The only log that may be related would be : +15/12/13 10:46:23,230 Dock[166]: find_shared_window: WID 21425 +15/12/13 10:46:23,230 Dock[166]: CGSGetWindowTags: Invalid window 0x53b1 + +if you tell me where to look at I can give you something more useful. + +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_1_6ca4fed183340a2902d1d4d91284b772._comment b/doc/forum/local_pairing_with_2_mac/comment_1_6ca4fed183340a2902d1d4d91284b772._comment new file mode 100644 index 000000000..25c97805b --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_1_6ca4fed183340a2902d1d4d91284b772._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T17:47:30Z" + content=""" +What version of OSX is the failing computer running? What version of git-annex? How did you install git-annex on it? +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment b/doc/forum/local_pairing_with_2_mac/comment_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment new file mode 100644 index 000000000..03b06e45a --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfC02DTOZygFDDvvg0maRciYYMhEIFgkw" + nickname="Utku" + subject="comment 2" + date="2013-12-12T20:08:50Z" + content=""" +hello +both computers are on mac os maverick +latest version of git annex, and we used the git annex assistant dmg found on the install section... +I am on a personnal home router so I don't think there is any port that might be blocked by a firewall for local connections... + + +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_3_07fa468aac1288e770487973052bccea._comment b/doc/forum/local_pairing_with_2_mac/comment_3_07fa468aac1288e770487973052bccea._comment new file mode 100644 index 000000000..bab5009f4 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_3_07fa468aac1288e770487973052bccea._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-12T20:37:55Z" + content=""" +It's not a firewall or network problem, what you pasted earlier shows that the ssh-keygen command bundled in the git annex dmg is trying to use a symbol that is not present in your libSystem library. + +I am puzzled why ssh-keygen apparently works on one of your macs and not on the other, if they indeed both have the same build of git-annex installed. + +Please paste output of `otool -L /Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen` on the mac with the problem. +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_4_dc0494213d2b57b5b9a489b096a5b8d0._comment b/doc/forum/local_pairing_with_2_mac/comment_4_dc0494213d2b57b5b9a489b096a5b8d0._comment new file mode 100644 index 000000000..f3f25504a --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_4_dc0494213d2b57b5b9a489b096a5b8d0._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfC02DTOZygFDDvvg0maRciYYMhEIFgkw" + nickname="Utku" + subject="comment 4" + date="2013-12-12T20:58:05Z" + content=""" +so as I don't really know which mac has a problem, here is what I get on both computers (looks they are quite the same): + +/Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen: + /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.0.0) + /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 6.0.0) + /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory (compatibility version 1.0.0, current version 1.0.0) + /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55456.0.0) + @executable_path/O (compatibility version 1.0.0, current version 1.0.0) + @executable_path/P (compatibility version 3.0.0, current version 3.0.0) + @executable_path/B (compatibility version 1.0.0, current version 1.2.5) + @executable_path/L (compatibility version 1.0.0, current version 1.0.0) + /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) + + +/Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen: + /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.0.0) + /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos (compatibility version 5.0.0, current version 6.0.0) + /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory (compatibility version 1.0.0, current version 1.0.0) + /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 55456.0.0) + @executable_path/O (compatibility version 1.0.0, current version 1.0.0) + @executable_path/P (compatibility version 3.0.0, current version 3.0.0) + @executable_path/B (compatibility version 1.0.0, current version 1.2.5) + @executable_path/L (compatibility version 1.0.0, current version 1.0.0) + /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_5_bcac18e137c00d4279774dec51963289._comment b/doc/forum/local_pairing_with_2_mac/comment_5_bcac18e137c00d4279774dec51963289._comment new file mode 100644 index 000000000..063906866 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_5_bcac18e137c00d4279774dec51963289._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 5" + date="2013-12-12T21:40:16Z" + content=""" +Well, I was wrong, we don't know only one of the 2 has the problem. The other one will probably not have run ssh-keygen yet. + +Can you run `/Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen --help` on both of them and see if it manages to print its help, or fails with an error? +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_6_76b62eafda1ecbf88abe288cbe778e17._comment b/doc/forum/local_pairing_with_2_mac/comment_6_76b62eafda1ecbf88abe288cbe778e17._comment new file mode 100644 index 000000000..e9cd8cc32 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_6_76b62eafda1ecbf88abe288cbe778e17._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfC02DTOZygFDDvvg0maRciYYMhEIFgkw" + nickname="Utku" + subject="comment 6" + date="2013-12-12T21:50:15Z" + content=""" +ok so it is ok on my computer, but here is what I got on the other one : +dyld: lazy symbol binding failed: Symbol not found: ___strlcpy_chk + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen + Expected in: /usr/lib/libSystem.B.dylib + +dyld: Symbol not found: ___strlcpy_chk + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/ssh-keygen + Expected in: /usr/lib/libSystem.B.dylib + +Trace/BPT trap: 5 +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_7_13fe788f2e9a823ad2e4844f114675a7._comment b/doc/forum/local_pairing_with_2_mac/comment_7_13fe788f2e9a823ad2e4844f114675a7._comment new file mode 100644 index 000000000..883cb4e14 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_7_13fe788f2e9a823ad2e4844f114675a7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 7" + date="2013-12-12T21:53:56Z" + content=""" +So it does only fail on one machine and not the other. I wonder what is different? + +Can you also try running `/Volumes/git-annex/git-annex.app/Contents/MacOS/bundle/cp` on both? (I think it uses the same symbol.) +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_8_f81b454e9cfc14dcb33148798be55de3._comment b/doc/forum/local_pairing_with_2_mac/comment_8_f81b454e9cfc14dcb33148798be55de3._comment new file mode 100644 index 000000000..b4af1ce69 --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_8_f81b454e9cfc14dcb33148798be55de3._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfC02DTOZygFDDvvg0maRciYYMhEIFgkw" + nickname="Utku" + subject="comment 8" + date="2013-12-12T22:03:54Z" + content=""" +you mean /Applications/git-annex.app/Contents/MacOS/bundle/cp ? + +on both computers it prints : +usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file + cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory + + +/Volumes/git-annex/git-annex.app/Contents/MacOS/bundle/cp doesn't work + +"""]] diff --git a/doc/forum/local_pairing_with_2_mac/comment_9_f7a1ce9627ebfc854dfde2f6c924db80._comment b/doc/forum/local_pairing_with_2_mac/comment_9_f7a1ce9627ebfc854dfde2f6c924db80._comment new file mode 100644 index 000000000..deaf9b68c --- /dev/null +++ b/doc/forum/local_pairing_with_2_mac/comment_9_f7a1ce9627ebfc854dfde2f6c924db80._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 9" + date="2013-12-13T18:52:40Z" + content=""" +As a workaround, I have removed ssh-keygen and ssh from the OSX DMG. AIUI, OSX ships ssh by default anyway. +"""]] diff --git a/doc/forum/location_tracking_cleanup.mdwn b/doc/forum/location_tracking_cleanup.mdwn new file mode 100644 index 000000000..7e2e230af --- /dev/null +++ b/doc/forum/location_tracking_cleanup.mdwn @@ -0,0 +1,24 @@ +I recently started experimenting with git annex, adding files that I've had +floating across several computers to repositories. During the testing I had +a few occasions where I wrecked a repository somehow, and decided to wipe it +and start anew (at this point there was no important files in them so I thought +this is the easiest way). Well, as it turns out this interacts badly with location +tracking, since now `git annex whereis` shows files residing in all those destroyed +repositories, all having same names as some existing repositories. This makes it hard +to follow whether a repo actually has a file, or was the file only seen in some dead +repo with the same name. + +I planned on cleaning this up by looking up the UUIDs of the now stable, existing +repos and untrusting all the dead copies (they should effectively disappear from +git annex´s output then, right?), but I didn't find an easy way to look up the UUID +of the current repository (maybe this could be included in `git annex status`?) +I also noticed that untrust cannot remove the trust based on the UUID -- if I try +it I simply get "there is no git remote named "11908472-...", so I guess untrust +works with git remote names, which I find a bit confusing, since trust.log logs the +trust levels based on the UUID. I could just write into trust.log manually, but I'm +unsure how the changes would get propagated. + +What should I do? As a related wishlist item I would ask for some additional mechanisms +for purging known-dead repositories from the location tracking database. And the ability +to look up the UUID of the current repo, and to use the UUID to specify repositories when +applicable (untrust and describe maybe). diff --git a/doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment b/doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment new file mode 100644 index 000000000..8915ea351 --- /dev/null +++ b/doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-09-30T06:55:34Z" + content=""" +Specifying the UUID was supposed to work, I think I broke it a while ago. Fixed now in git. + +I'm not sure why you need to look up the UUID of the current repository. You can always refer to the current repository as \".\". Anyway, the UUID of the current repository is in `.git/config`, or use `git config annex.uuid`. +"""]] diff --git a/doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment b/doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment new file mode 100644 index 000000000..f612e53a4 --- /dev/null +++ b/doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawncBlzaDI248OZGjKQMXrLVQIx4XrZrzFo" + nickname="Perttu" + subject="comment 2" + date="2011-09-30T11:55:35Z" + content=""" +Thanks for the quick reply :) + +I wanted to look up the UUID of the current repo so that I can find out which repo is alive from the collection of repos with the same name. +I could have looked for it in .git/config though, since it's pretty obvious. I just looked into the git-annex branch and didn't find it there. +Thanks for the tip about using \".\". By the way, could there be some kind of warning about using non-unique names for repos? That would make this +scenario less likely. Or maybe that is a bad idea given the decentralized nature of git. + +By the way, do the trust settings propagate to other repos? If I mark some UUID as untrusted on one computer does it become globally untrusted? +"""]] diff --git a/doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment b/doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment new file mode 100644 index 000000000..c676b9b61 --- /dev/null +++ b/doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-09-30T16:47:27Z" + content=""" +`git annex status` now includes a list of all known repositories. + +Yes, trust setting propigate on git push/pull like any other git-annex information. +"""]] diff --git a/doc/forum/lost_in_walkthrough....mdwn b/doc/forum/lost_in_walkthrough....mdwn new file mode 100644 index 000000000..89f4af026 --- /dev/null +++ b/doc/forum/lost_in_walkthrough....mdwn @@ -0,0 +1,78 @@ +I'm trying to follow the steps of the "walkthrough" but I'm experiencing the following issue: when +I sync one repository and do "git annex get ." I don't get the files from the other repository. +Here is the transcript of the steps I followed - I've put them in a script (ga.sh) so I can replay +them and show them on the shell while executing. +Basically I have two repositories, "/tmp/a/annex" and "/tmp/b/annex", the second cloned from +the first. All the other steps are the same as in the walkthrough. +----------------------------------- +> bash -x ga.sh ++ cd /tmp ++ mkdir a ++ mkdir b ++ cd a ++ mkdir annex ++ cd annex ++ git init +Initialized empty Git repository in /tmp/a/annex/.git/ ++ git annex init a +init a ok +(Recording state in git...) ++ cd /tmp/b ++ git clone /tmp/a/annex +Cloning into 'annex'... +done. +warning: remote HEAD refers to nonexistent ref, unable to checkout. + ++ cd annex ++ git annex init b +init b ok +(Recording state in git...) ++ git remote add a /tmp/a/annex ++ cd /tmp/a/annex ++ git remote add b /tmp/b/annex ++ dd if=/dev/urandom of=first bs=1024 count=1 +1+0 records in +1+0 records out +1024 bytes (1.0 kB) copied, 9.9167e-05 s, 10.3 MB/s ++ dd if=/dev/urandom of=second bs=1024 count=1 +1+0 records in +1+0 records out +1024 bytes (1.0 kB) copied, 0.000241635 s, 4.2 MB/s ++ git annex add . +add first (checksum...) ok +add second (checksum...) ok +(Recording state in git...) ++ git commit -am added +[master (root-commit) 5078564] added + 2 files changed, 2 insertions(+) + create mode 120000 first + create mode 120000 second ++ git mv first e ++ mkdir x ++ git mv second x ++ git commit -m moved +fix x/second ok +(Recording state in git...) +[master 422492d] moved + 3 files changed, 1 insertion(+), 1 deletion(-) + rename first => e (100%) + delete mode 120000 second + create mode 120000 x/second ++ cd /tmp/b/annex ++ git annex sync a +(merging origin/git-annex into git-annex...) +(Recording state in git...) +commit +ok +git-annex: no branch is checked out ++ git annex get . +------------------- + +The last "git annex get ." does not retrieve the files in /tmp/a/annex ... why? +I guess the issue starts when cloning /tmp/a/annex where no commit was done. + +Emanuele + +PS: I'm using git v1.7.9.5 (ubuntu 12.04) and the latest git-annex static binary +downloaded a few minutes ago from the git-annex website. + diff --git a/doc/forum/lost_in_walkthrough.../comment_1_51b703b961ca762f0359e1c169f1ee75._comment b/doc/forum/lost_in_walkthrough.../comment_1_51b703b961ca762f0359e1c169f1ee75._comment new file mode 100644 index 000000000..a5c574b4a --- /dev/null +++ b/doc/forum/lost_in_walkthrough.../comment_1_51b703b961ca762f0359e1c169f1ee75._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T19:32:50Z" + content=""" +I have fixed `git annex sync` to work even when run in a repository with no master branch. +"""]] diff --git a/doc/forum/lost_in_walkthrough.../comment_2_a9de0401a103bdd4401ba2d5983dc54a._comment b/doc/forum/lost_in_walkthrough.../comment_2_a9de0401a103bdd4401ba2d5983dc54a._comment new file mode 100644 index 000000000..4a8110eb4 --- /dev/null +++ b/doc/forum/lost_in_walkthrough.../comment_2_a9de0401a103bdd4401ba2d5983dc54a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn2MI-Ci-bS9W5NITngsBJiL8LqWYcJ458" + nickname="Emanuele" + subject="comment 2" + date="2013-11-02T23:36:54Z" + content=""" +Great thanks! I'm glad my feedback helped improve git-annex! + +af6cef + +"""]] diff --git a/doc/forum/luks_encrypted_disk_support.mdwn b/doc/forum/luks_encrypted_disk_support.mdwn new file mode 100644 index 000000000..e2f9efc06 --- /dev/null +++ b/doc/forum/luks_encrypted_disk_support.mdwn @@ -0,0 +1,3 @@ +Is there a way to easily access, say, a FDE (Full Disk Encrypted) external drive using git-annex? + +My use case is that I do not wish to encrypt each file individually - and find it more reliable to use a real filesystem encryption on this external hard drive. --[[anarcat]] diff --git a/doc/forum/luks_encrypted_disk_support/comment_1_0ea476c778888f34196d9031f72b1844._comment b/doc/forum/luks_encrypted_disk_support/comment_1_0ea476c778888f34196d9031f72b1844._comment new file mode 100644 index 000000000..9fda6b324 --- /dev/null +++ b/doc/forum/luks_encrypted_disk_support/comment_1_0ea476c778888f34196d9031f72b1844._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T17:53:39Z" + content=""" +Mount the drive and put a git repository or directory special remote on it. + +(This question seems to easy.. am I missing something?) +"""]] diff --git a/doc/forum/luks_encrypted_disk_support/comment_2_0af149bfe1868dde0a132c5d835c50df._comment b/doc/forum/luks_encrypted_disk_support/comment_2_0af149bfe1868dde0a132c5d835c50df._comment new file mode 100644 index 000000000..9170502f2 --- /dev/null +++ b/doc/forum/luks_encrypted_disk_support/comment_2_0af149bfe1868dde0a132c5d835c50df._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2013-12-30T17:44:33Z" + content=""" +I guess this is related to [[confused about external drives]] - I would have liked the assistant to propose using the full drive for storing stuff, as opposed to encrypting data with GPG, including prompting me for the crypto password. +"""]] diff --git a/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn new file mode 100644 index 000000000..aef5a58a7 --- /dev/null +++ b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn @@ -0,0 +1,20 @@ +So I got a shiny new rsync.net account, but it's not (yet) big enough for my bloated, kitchen-sink annex. How do I make the best use of it? Well, on the whole small files are more valuable to me than large. Large files are usually replaceable, like ripped DVDs. Small files are more likely to be family photos and such. So I shut down the assistant, and I've been doing a series of these: + + git annex copy --to=rsyncnet --smallerthan 10M --not --in=rsyncnet # I called my remote "rsyncnet" + + git annex copy --to=rsyncnet --smallerthan 20M --not --in=rsyncnet + + git annex copy --to=rsyncnet --smallerthan 40M --not --in=rsyncnet + +until the repo fills up. With a few of these thrown in to check on my progress and what's ahead. + + + git annex status . --in=rsyncnet # how much have I already done? + git annex status . --smallerthan 40M --not --in=rsyncnet # how much will this next command copy? + + +It'd be possible to write a script to do all this automagically but at least this time it's easier to do by hand. + +Just sharing in case anybody's in a similar situation. + +(You could let the assistant do this for you if you configured a preferred content expression designating small files for the rsyncnet remote, of course.) diff --git a/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_1_0ebe509b768d46081db2100f5b712ef7._comment b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_1_0ebe509b768d46081db2100f5b712ef7._comment new file mode 100644 index 000000000..617c87d97 --- /dev/null +++ b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_1_0ebe509b768d46081db2100f5b712ef7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 1" + date="2013-07-26T16:16:04Z" + content=""" +How about + + git annex find . --format='${bytesize} ${file}\n' |sort -n|sed 's/[0-9]* //'|while read file; do git annex copy \"$file\" --to=your_remote; done +"""]] diff --git a/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_2_ef63d893531d93d2eb09f48f8baff4dd._comment b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_2_ef63d893531d93d2eb09f48f8baff4dd._comment new file mode 100644 index 000000000..229a2dda9 --- /dev/null +++ b/doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_2_ef63d893531d93d2eb09f48f8baff4dd._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-07-26T16:44:35Z" + content=""" +Note that you don't need to shut down the assistant; you can run multiple git-annex commands simulantaneously safely. +You will probably want to set that repository to be in the manual group in the assistant though. + +Another way to do it is to make rsync.net a small archive, and move or copy your important files into `archive` directories. + +You can also set up multiple remotes using the same rsync.net account. So you could have a transfer remote that's used to ship files between clients, as well as your archive remote. +"""]] diff --git a/doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn b/doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn new file mode 100644 index 000000000..045dccb82 --- /dev/null +++ b/doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn @@ -0,0 +1 @@ +Is there an easy way for a noob to get the man pages, after installing the prebuilt tarball? diff --git a/doc/forum/man_pages_in_the_prebuilt_linux_tarball/comment_1_a7bc2e84e6d7c0e2de5900685207af78._comment b/doc/forum/man_pages_in_the_prebuilt_linux_tarball/comment_1_a7bc2e84e6d7c0e2de5900685207af78._comment new file mode 100644 index 000000000..01f0109e3 --- /dev/null +++ b/doc/forum/man_pages_in_the_prebuilt_linux_tarball/comment_1_a7bc2e84e6d7c0e2de5900685207af78._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-27T20:27:37Z" + content=""" +Yes, go to http://git-annex.branchable.com/git-annex/ and http://git-annex.branchable.com/git-annex-shell/ + +"""]] diff --git a/doc/forum/managing_multiple_repositories.mdwn b/doc/forum/managing_multiple_repositories.mdwn new file mode 100644 index 000000000..7450b4271 --- /dev/null +++ b/doc/forum/managing_multiple_repositories.mdwn @@ -0,0 +1,3 @@ +I tried about 2 weeks ago using the assistant to create on my netbook and my home laptop 3 repositores, for music, pictures and documents. Since I was also going to be away from home, I set up jabber pairing and box.com for a transfer repository, and then watched everything crash as I didn't know yet about jabber only really working for 1 repository at a time. + +So my new idea is this: one repository at ~/annex, and changing documents, music and pictures to be symlinks to actual documents, music and pictures folders inside ~/annex, allowing me to have just 1 annex to manage. Is this the best way to put everything together if I want to just jabber pairing (and just 1 jabber account)? diff --git a/doc/forum/manual_update_of_.git__47__annex__47__objects.mdwn b/doc/forum/manual_update_of_.git__47__annex__47__objects.mdwn new file mode 100644 index 000000000..9de5779c1 --- /dev/null +++ b/doc/forum/manual_update_of_.git__47__annex__47__objects.mdwn @@ -0,0 +1,8 @@ +Let's suppose that I've manually modified files in .git/annex/objects, +for example I ran an rsync or some other file synchronization software +to copy files. As a result, some objects have disappeared, others have +appeared. After that `git annex whereis .' displays stale information, +it doesn't take the manual modifications to accound. `git annex fsck' +seems to fix this, but it runs the rehashing of all new files, so it's +slow. Is there a fast alternative, which notices all the object file +changes, trusts them, and just updates .git/annex/index quickly? diff --git a/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_1_ea6ec91150c8962e2711631f2422bf3a._comment b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_1_ea6ec91150c8962e2711631f2422bf3a._comment new file mode 100644 index 000000000..f721e21a5 --- /dev/null +++ b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_1_ea6ec91150c8962e2711631f2422bf3a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T17:11:41Z" + content=""" +I do not recommend manually messing with the contents of .git/annex/objects. It is a good way to lose data. + +If you look at the documentation for fsck in git-annex's man page, you will find the answer to your question. +"""]] diff --git a/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment new file mode 100644 index 000000000..5468ed3d0 --- /dev/null +++ b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="rasmus" + ip="109.201.154.177" + subject="But how to clean this folder?" + date="2014-03-20T21:55:26Z" + content=""" +Joey, + +I have sometimes experienced that there is way too much content in the `.git/annex/objects` folder. For instance, my terminal emulator recently crashed during a sync which seemed to create a lot of folders. + +In the annex repo where this happened I now got way too many folders (annex sometimes complain about no. of inodes or something like that) and I don't know how to clean it correctly. + +Here's a \"screenshot\": + + [doc.annex] $ ls -a + . .. documents .git .gitignore + [doc.annex] $ find . -type d | wc -l + 38568 + [doc.annex] $ git annex fsck > /dev/null 2>&1 + [doc.annex] $ find . -type d | wc -l + 38568 + [doc.annex] $ git annex repair > /dev/null 2>&1 + [doc.annex] $ find . -type d | wc -l + 38568 + [doc.annex] $ find documents -type d | wc -l + 1513 + [doc.annex] $ find .git/annex/objects -type d | wc -l + 36712 + +This is a `direct`-mode repo. With `.git/objectcts` I can use `git gc`. How can I tell annex to tidy up? I have tried `fsck`, `repair` and `forget`. + +Any hints on how to deal with this? Other than manually clean up by deleting `.git/annex/objects` and rerunning `fsck`? +"""]] diff --git a/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment new file mode 100644 index 000000000..2271e04ff --- /dev/null +++ b/doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-26T19:09:07Z" + content=""" +1. This followup question seems to have nothing to do with the original question. (The aswer to the original question was `git annex fsck --fast`.) +2. I find it hard to believe that a crashing terminal emulator will create a lot of folders. +3. You show 36k subdirectories in .git/annex/objects. If I make a *tiny* 100 mb ext2 filesystem, it has 26k inodes. A 200 mb filesystem has 50k. So we're talking about a number of directories that is only large when using hardware from 1996. + +I'm not convinced yet that anything is wrong, or that there's anything you can do to improve matters. In any case, see [[todo/wishlist:_pack_metadata_in_direct_mode]]. +"""]] diff --git a/doc/forum/many_remotes.mdwn b/doc/forum/many_remotes.mdwn new file mode 100644 index 000000000..4e463cb3c --- /dev/null +++ b/doc/forum/many_remotes.mdwn @@ -0,0 +1,24 @@ +Thanks Joey for the great work. + +I'm using git annex for my tv-shows and movies Folder. + +I have 3 USB HDD (ext.150Gb,ext.200Gb, ext.2Tb) and a USB Stick (ATV), which are traveling between 3 Devices + +2 Notebooks (Lappi,Kiste) and a Nas. + +First of all, I'm made a mistake and mixed the remote Locations from the tvshows folder with the movies folder and did a git annex sync, ( this happened about two weeks ago) +I think i can't undo this, only unannex will help. + +I've now watched the annex status output and noticed that there are many Remotes, some of them have a timestamp as name. + +see log file at http://pastebin.com/79bRVkK6 + +Running git annex on ubuntu 12.04 + + christian@Lappi:~/Serien$ git annex version + git-annex version: 4.20130417 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS diff --git a/doc/forum/migrate_existing_git_repository_to_git-annex.mdwn b/doc/forum/migrate_existing_git_repository_to_git-annex.mdwn new file mode 100644 index 000000000..f673de765 --- /dev/null +++ b/doc/forum/migrate_existing_git_repository_to_git-annex.mdwn @@ -0,0 +1,66 @@ +I have a large git repository with binary files scattered over different branches. I want to switch to git-annex mainly for performance reasons, but I don't want to loose my history. + +I tried to rewrite the (cloned) repository with git-filter-branch but failed miserably for several reasons: + +* --tree-filter performs its operations in a temporary directory (.git-rewrite/t/) so the symlinks point to the wrong destination (../../.git/annex/). +* annex log files are stored in .git-annex/ instead of .git-rewrite/t/.git-annex/ so the filter operation misses them + +Any suggestions how to proceed? + +EDIT 3/2/2010 +I finally got it working for my purposes. Hardest part was preserving the branches while injecting the new `git annex setup` base commit. + +#### Clone repository + git clone original migrate + cd migrate + git checkout mybranch + git checkout master + git remote rm origin + +#### Inject `git annex setup` base commit and repair branches + git symbolic-ref HEAD refs/heads/newroot + git rm --cached * + git clean -f -d + git annex init master + echo \*.rpm annex.backend=SHA1 >> .gitattributes + git commit -m "store rpms in git annex" .gitattributes + git cherry-pick $(git rev-list --reverse master | head -1) + git rebase --onto newroot newroot master + git rebase --onto master mybranch~1 mybranch + git branch -d newroot + +#### Migrate repository + mkdir .temp + cp .git-annex/* .temp/ + MYWORKDIR=$(pwd) git filter-branch \ + --tag-name-filter cat \ + --tree-filter ' + mkdir -p .git-annex; + cp ${MYWORKDIR}/.temp/* .git-annex/; + for rpm in $(git ls-files | grep "\.rpm$"); do + echo; + git annex add $rpm; + annexdest=$(readlink $rpm); + if [ -e .git-annex/$(basename $annexdest).log ]; then + echo "FOUND $(basename $annexdest).log"; + else + echo "COPY $(basename $annexdest).log"; + cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log .git-annex/; + cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log ${MYWORKDIR}/.temp/; + fi; + ln -sf ${annexdest#../../} $rpm; + done; + git reset HEAD .git-rewrite; + : + ' -- $(git branch | cut -c 3-) + rm -rf .temp + git reset --hard + + +TODO: + +* Find a way to repair branches automatically (detect branch points and run appropriate `git rebase` commands) + +I'll be happy to try any suggestions to improve this migration script. + +P.S. Is there a way to edit comments? diff --git a/doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment new file mode 100644 index 000000000..e88794d62 --- /dev/null +++ b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-02-25T05:16:48Z" + content=""" +I don't know how to approach this yet, but I support the idea -- it would be great if there was a tool that could punch files out of git history and put them in the annex. (Of course with typical git history rewriting caveats.) + +Sounds like it might be enough to add a switch to git-annex that overrides where it considers the top of the git repository to be? +"""]] diff --git a/doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment new file mode 100644 index 000000000..71a40ad8c --- /dev/null +++ b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment @@ -0,0 +1,60 @@ +[[!comment format=mdwn + username="tyger" + ip="80.66.20.180" + subject="comment 2" + date="2011-03-01T14:07:50Z" + content=""" +My current workflow looks like this (I'm still experimenting): + +### Create backup clone for migration + + git clone original migrate + cd migrate + for branch in $(git branch -a | grep remotes/origin | grep -v HEAD); do git checkout --track $branch; done + +### Inject git annex initialization at repository base + + git symbolic-ref HEAD refs/heads/newroot + git rm --cached *.rpm + git clean -f -d + git annex init master + git cherry-pick $(git rev-list --reverse master | head -1) + git rebase --onto newroot newroot master + git rebase master mybranch # how to automate this for all branches? + git branch -d newroot + +### Start migration with tree filter + + echo \*.rpm annex.backend=SHA1 > .git/info/attributes + MYWORKDIR=$(pwd) git filter-branch --tree-filter ' \ + if [ ! -d .git-annex ]; then \ + mkdir .git-annex; \ + cp ${MYWORKDIR}/.git-annex/uuid.log .git-annex/; \ + cp ${MYWORKDIR}/.gitattributes .; \ + fi + for rpm in $(git ls-files | grep \"\.rpm$\"); do \ + echo; \ + git annex add $rpm; \ + annexdest=$(readlink $rpm); \ + if [ -e .git-annex/$(basename $annexdest).log ]; then \ + echo \"FOUND $(basename $annexdest).log\"; \ + else \ + echo \"COPY $(basename $annexdest).log\"; \ + cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log .git-annex/; \ + fi; \ + ln -sf ${annexdest#../../} $rpm; \ + done; \ + git reset HEAD .git-rewrite; \ + : \ + ' -- $(git branch | cut -c 3-) + rm -rf .temp + git reset --hard + + +There are still some drawbacks: + +* git history shows that git annex log files are modified with each checkin +* branches have to be rebased manually before starting migration + + +"""]] diff --git a/doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment new file mode 100644 index 000000000..90bf23b6c --- /dev/null +++ b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="tyger" + ip="80.66.20.180" + subject="comment 3" + date="2011-03-02T08:15:37Z" + content=""" +> Sounds like it might be enough to add a switch to git-annex that overrides where it considers the top of the git repository to be? + +It should sufficient to honor GIT_DIR/GIT_WORK_TREE/GIT_INDEX_FILE environment variables. git filter-branch sets GIT_WORK_TREE to ., but this can be mitigated by starting the filter script with 'GIT_WORK_TREE=$(pwd $GIT_WORK_TREE)'. E.g. GIT_DIR=/home/tyger/repo/.git, GIT_WORK_TREE=/home/tyger/repo/.git-rewrite/t, then git annex should be able to compute the correct relative path or maybe use absolute pathes in symlinks. + +Another problem I observed is that git annex add automatically commits the symlink; this behaviour doesn't work well with filter-tree. git annex commits the wrong path (.git-rewrite/t/LINK instead of LINK). Also filter-tree doesn't expect that the filter script commmits anything; new files in the temporary work tree will be committed by filter-tree on each iteration of the filter script (missing files will be removed). +"""]] diff --git a/doc/forum/migrate_existing_git_repository_to_git-annex/comment_4_057f0079fbee3451ccda08026bab21d4._comment b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_4_057f0079fbee3451ccda08026bab21d4._comment new file mode 100644 index 000000000..e8495560a --- /dev/null +++ b/doc/forum/migrate_existing_git_repository_to_git-annex/comment_4_057f0079fbee3451ccda08026bab21d4._comment @@ -0,0 +1,20 @@ +[[!comment format=sh + username="https://www.google.com/accounts/o8/id?id=AItOawll4Kgp7nMuOKdB0FfbcYZ3KRq7HCS0Slc" + nickname="Laura" + subject="Rebase all branches" + date="2014-01-16T17:47:45Z" + content=""" + +For the portion: git rebase master mybranch # how to automate this for all branches? + +Try this: + +branch_to_ignore='git-annex|master|newroot' +for branch in $(git for-each-ref --sort=-committerdate refs/heads --format='%(refname:short)' | egrep -v $branch_to_ignore ) + do git rebase --onto master \"$branch~\" \"$branch\" + echo \"Rebasing branch $branch onto master....\" +done + +Feel free to add/correct as necessary + +"""]] diff --git a/doc/forum/migration_to_git-annex_and_rsync.mdwn b/doc/forum/migration_to_git-annex_and_rsync.mdwn new file mode 100644 index 000000000..d99dab872 --- /dev/null +++ b/doc/forum/migration_to_git-annex_and_rsync.mdwn @@ -0,0 +1,33 @@ +When migrating large file repositories to git-annex that are backuped in a way that uses an rsync-style mechanism (e.g. [dirvish](http://www.dirvish.org/)) and thus keeps incremental backups small by using hardlinks, space can be saved by manually reflecting the migration on the backup. So, instead of making a last pre-git-annex backup, migrating, and duplicating all backupped data with the next backup, I used the attached migrate.py file below, and it saved me roughly a day of backuping. + +A note on terminology: "migrating" here means migrating from not using git-annex at all to using it, not to the ``git annex migrate`` command, for which a similar but different solution may be created. + +**WARNING**: This is a quickly hacked-together script. It worked for me, but is untested apart from that. It's just a dozen lines of code, so have a look at it and make sure you understand what it does, and what migrate.sh looks like. Take special care as this tampers with your backups, and if something goes wrong, well... + +First, have an up-to-date backup; then, git annex init / add etc as described in the [[walkthrough]]. In the directory in which you use git-annex, run: + + $ python migrate.py > migrate.sh + +Then copy the resulting migrate.sh to the equivalent location inside your backups and run it there. It will move all files that are now symlinked on the master to their new positions according to the symlinks (inside .git/annex/objects), but not create the symlinks (you will do a backup later anyway). + +After that, do a backup as usual. As rsync sees the moved files at their new locations, it will accept them and not duplicate the data. + +**migrate.py**: + + #!/usr/bin/env python + + import os + from pipes import quote + + print "#!/bin/sh" + print "set -e" + print "" + + for (dirpath, dirnames, filenames) in os.walk("."): + for f in filenames: + fn = os.path.join(dirpath, f) + if os.path.islink(fn): + link = os.path.normpath(os.path.join(dirpath, os.readlink(fn))) + assert link.startswith(".git/annex/objects/") + print "mkdir -p %s"%quote(os.path.dirname(link)) + print "mv %s %s"%(quote(fn), quote(link)) diff --git a/doc/forum/misctmp_filling_up.mdwn b/doc/forum/misctmp_filling_up.mdwn new file mode 100644 index 000000000..a633760c9 --- /dev/null +++ b/doc/forum/misctmp_filling_up.mdwn @@ -0,0 +1,11 @@ +My directory .git/annex/misctmp is quite filled up with files like P39923, P33083, and also with 7 characters P310000 up to P331998. The beginning of these filenames may come from the annexed files, which all start with 'P3'. + +There is a total of 12198 of them (4.0TB... yes this repo is quite big ;)). + +Each of those has the content of individual annexed files (about 300-400MB targzipped files). Sometimes they are hard liked to each other, up to 8 copies. + +Since I have copied+dropped the whole repo content to other repos, there should be nothing left locally. I have verified several of those files (the annexed files which are identical to the misctmp/* files), are they indeed are located elsewhere, and not "here". + +So I was wondering if it is safe to remove them, and why are they not listed by git annex unused? + +Thanks for your help!! diff --git a/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment b/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment new file mode 100644 index 000000000..9d1713745 --- /dev/null +++ b/doc/forum/misctmp_filling_up/comment_1_2739dec72fe0950dd070c8fab9fbd751._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 1" + date="2014-04-27T00:16:49Z" + content=""" +You can delete them. + +AFAIK this should only happen if the assistant is interrupted while it's adding files. I plan to make the assistant clean up old tmp files on startup. +"""]] diff --git a/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment b/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment new file mode 100644 index 000000000..5048f601e --- /dev/null +++ b/doc/forum/misctmp_filling_up/comment_2_440081b5e2b9b5b19e8cd5db3649a976._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmdbVIGiDH8KarAGAy8y2FHJD_F990JzXI" + nickname="François" + subject="comment 2" + date="2014-04-27T05:21:48Z" + content=""" +Indeed I had to interrupt the add a few times. + +Thanks! +"""]] diff --git a/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn new file mode 100644 index 000000000..1e2e44cfa --- /dev/null +++ b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn @@ -0,0 +1,3 @@ +A couple times working in an annex manually, I accidentally did "git add" instead of "git annex add" and ended up with files checked into my repo instead of symlinks. So now there is some file content in git, rather than in the annex. Is there any way to root that out, or is it there forever? (My limited knowledge of git says: it's there forever, unless maybe you go into the branches where it lives, do an interactive rebase to the time before it was added, remove that commit, replay history, and then garbage collect, but I have no idea if that would suddenly break git annex, and it sounds painful anyway.) + +If say I were a neat freak and wanted to just start over with a clean annex, I imagine the thing to do would be to just start the hell over -- and if I wanted to do that, the way to go would be to get into a full repository, do a "git annex uninit" and then throw away the .git directory, then do "git init" and "git annex init" and then "git annex add ." ? diff --git a/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_1_752db25abb647804a1cc12c5b247378a._comment b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_1_752db25abb647804a1cc12c5b247378a._comment new file mode 100644 index 000000000..486d43480 --- /dev/null +++ b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_1_752db25abb647804a1cc12c5b247378a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-12-02T05:41:56Z" + content=""" +You can rebase or use git-filter-branch to rewrite history. As long as you don't touch the git-annex branch, git-annex won't care, at all. Have at it! + +Your uninit plan would also work. +"""]] diff --git a/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_2_db6f4959c35732f72e7a90bd9f4c665c._comment b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_2_db6f4959c35732f72e7a90bd9f4c665c._comment new file mode 100644 index 000000000..9c7f35a77 --- /dev/null +++ b/doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_2_db6f4959c35732f72e7a90bd9f4c665c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2012-12-03T15:46:48Z" + content=""" +Thanks! I ended up going with the uninit plan. +"""]] diff --git a/doc/forum/multiple_repositories_single_backup.mdwn b/doc/forum/multiple_repositories_single_backup.mdwn new file mode 100644 index 000000000..10f8c0e43 --- /dev/null +++ b/doc/forum/multiple_repositories_single_backup.mdwn @@ -0,0 +1,6 @@ +hi + +is it possible to have multiple repositories that share single backup directory ? + +for example. +i have mp3, docs on my laptop as separate repositories. i would like to use single backup directory that is on my usb drive. diff --git a/doc/forum/multiple_repositories_single_backup/comment_1_4a479fa78e0b366fcff1a27bc37081de._comment b/doc/forum/multiple_repositories_single_backup/comment_1_4a479fa78e0b366fcff1a27bc37081de._comment new file mode 100644 index 000000000..52da6a272 --- /dev/null +++ b/doc/forum/multiple_repositories_single_backup/comment_1_4a479fa78e0b366fcff1a27bc37081de._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T20:29:26Z" + content=""" +If you set up an identically configured special remote in the same location for each of your separate mp3 and docs repositories, then yes, you can store files for both of them in it. In the unlikely case where you have the same file in both mp3 and docs, only one copy will be stored in the remote. (Unless it's using encryption, which will tend to defeat that.) + +It should work ok, but unless you're trying to get deduplication like that, I don't see any reason to do it rather than having a separate special remote for each of the separate git repositories. + +(Also, I'm talking about special remotes here, not git remotes. If you add the same git remote to 2 separate repositories, then `git annex sync` will connect them all together.) +"""]] diff --git a/doc/forum/multiple_repositories_single_backup/comment_2_bbe19eec0969385a0d4682bf9e9de21a._comment b/doc/forum/multiple_repositories_single_backup/comment_2_bbe19eec0969385a0d4682bf9e9de21a._comment new file mode 100644 index 000000000..bac577ce9 --- /dev/null +++ b/doc/forum/multiple_repositories_single_backup/comment_2_bbe19eec0969385a0d4682bf9e9de21a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 2" + date="2013-12-29T21:34:19Z" + content=""" +thx for reply. i think i will stick with separate directories for every repositiry + +mp3 on laptop -> mp3-backup directory on usb drive +docs on laptop -> docs-backup on usb drive +"""]] diff --git a/doc/forum/multiple_repositories_single_backup/comment_3_1b18ea058e3eb34852055cffe51de176._comment b/doc/forum/multiple_repositories_single_backup/comment_3_1b18ea058e3eb34852055cffe51de176._comment new file mode 100644 index 000000000..4accf7f07 --- /dev/null +++ b/doc/forum/multiple_repositories_single_backup/comment_3_1b18ea058e3eb34852055cffe51de176._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="Using different git branches" + date="2014-01-14T09:12:19Z" + content=""" +This might not be practical (especially for a non-technical user) but wouldn't it be possible to share a (bare) git-annex repo for backup if the other non-bare repos use different branches of the same git repo? (These non-bare repos could also share their .git directory.) Hmm, I don't see this discussed much... +"""]] diff --git a/doc/forum/multiple_routes_to_same_repository.mdwn b/doc/forum/multiple_routes_to_same_repository.mdwn new file mode 100644 index 000000000..a94acac2f --- /dev/null +++ b/doc/forum/multiple_routes_to_same_repository.mdwn @@ -0,0 +1,2 @@ +I am trying to configure the local repo to be connected with remote computer. It can either find this computer on local network using local host name, or go through public IP host where I have ssh tunnel. First confusing thing is, that when setting up remote server, it successfuly establishes connection, but then asks me if the folder should be git or rsync - I believe this step should be skipped if the git repo is already there. Also choosing repository group should be detected from the repo itself. +But the real problem is that I cannot add the public IP repo at all. Is this a known limitation? diff --git a/doc/forum/multiple_routes_to_same_repository/comment_1_26c1734d41d5374f18fc688d862d6b8e._comment b/doc/forum/multiple_routes_to_same_repository/comment_1_26c1734d41d5374f18fc688d862d6b8e._comment new file mode 100644 index 000000000..94eadcd55 --- /dev/null +++ b/doc/forum/multiple_routes_to_same_repository/comment_1_26c1734d41d5374f18fc688d862d6b8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZ9EwisYI1DDev8HXY6zFjPrLKt60-3QI" + nickname="Yo" + subject="comment 1" + date="2013-06-24T12:23:15Z" + content=""" +I believe I have a similar set up as you're trying to achieve. What I did was just add a repository using the public domain name only (DDNS). My home router seems to be smart enough to realize the IP the domain name resolves to is its own, so I get gigabit speeds when at home, and I can still access it when I'm not at home. +"""]] diff --git a/doc/forum/multiple_routes_to_same_repository/comment_2_d119ab485fb2d5512c15372efdb2327d._comment b/doc/forum/multiple_routes_to_same_repository/comment_2_d119ab485fb2d5512c15372efdb2327d._comment new file mode 100644 index 000000000..48cae0211 --- /dev/null +++ b/doc/forum/multiple_routes_to_same_repository/comment_2_d119ab485fb2d5512c15372efdb2327d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 2" + date="2013-06-25T20:05:46Z" + content=""" +I don't see anything that prevents you from adding two repositories that use different names for the same server. +"""]] diff --git a/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn new file mode 100644 index 000000000..c5c6f3a94 --- /dev/null +++ b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn @@ -0,0 +1,11 @@ +I saw a cool page talking about "tagging" photos by using symlinks: http://www.trueelena.org/computers/articles/photo_management_with_git-annex_and_bash.html + +so say I have a photo in git annex, called DSC_3285.JPG, which of course is really a symlink to ../.git/annex/objects/Zk/kj/WORM-s5296770-m1338516288--DSC_3285.JPG/WORM-s5296770-m1338516288--DSC_3285.JPG. + +I want to make an additional link to that photo in a directory called tags/. + +should I link to the symlink (DSC_3285.JPG), or to the annexed file? (../.git/annex/objects/Zk/kj/WORM-s5296770-m1338516288--DSC_3285.JPG/WORM-s5296770-m1338516288--DSC_3285.JPG) + +I might occasionally rename DSC_3285.JPG or edit the photo itself. will the git annex commit hooks update both links, or should I prepare a script to update links in tags/ after I change DSC_3285 or the annexed data? + +thank you. diff --git a/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_1_96beb9ea895c80285748adb940b4f57d._comment b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_1_96beb9ea895c80285748adb940b4f57d._comment new file mode 100644 index 000000000..b4d2433aa --- /dev/null +++ b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_1_96beb9ea895c80285748adb940b4f57d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 1" + date="2012-09-05T19:56:06Z" + content=""" +I'd recommend linking to the annexed file. Which is what `cp -a` does BTW. Then it'll just be a peice of content that is used by more than one filename, which git-annex handles well. However, if you then edited +one file, git-annex would not update the other link to point to the new content. +"""]] diff --git a/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_2_985065c1feed9300631dac7a2701f669._comment b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_2_985065c1feed9300631dac7a2701f669._comment new file mode 100644 index 000000000..a53fe06b5 --- /dev/null +++ b/doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_2_985065c1feed9300631dac7a2701f669._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnh0pv5PyOJH8dHB1Ly2rHJM4nvVd17CZ0" + nickname="Kevin" + subject="comment 2" + date="2012-09-05T19:57:36Z" + content=""" +Thank you very much! (for your answer, and for git annex) +"""]] diff --git a/doc/forum/multiple_urls_for_the_same_UUID.mdwn b/doc/forum/multiple_urls_for_the_same_UUID.mdwn new file mode 100644 index 000000000..2f8106b59 --- /dev/null +++ b/doc/forum/multiple_urls_for_the_same_UUID.mdwn @@ -0,0 +1,26 @@ +I've been doing a sort of experiment but I'm not sure if it's working or, really, how to even tell. + +I have two macbooks that are both configured as clients as well as a USB HDD, an rsync endpoint on a home NAS, and a glacier endpoint. + +For the purposes of this example, lets call the macbooks "chrissy" and "brodie". Chrissy's was initially configured with a remote for brodie with the url as + + ssh://Brodie.88195848.members.btmm.icloud.com./Users/akraut/Desktop/annex + +This allows me to leverage the "Back To My Mac" free IPv6 roaming I get from Apple. Now, occasionally, that dns resolution fails. Since I'm frequently on the same network, I can also use the mDNS address of brodie.local. which is much more reliable. + +So my brilliant/terrible idea was to put this in my git config: + + [remote "brodie"] + url = ssh://Brodie.88195848.members.btmm.icloud.com./Users/akraut/Desktop/annex + fetch = +refs/heads/*:refs/remotes/brodie/* + annex-uuid = BF4BCA6D-9252-4B5B-BE12-36DD755FAF4B + annex-cost-command = /Users/akraut/Desktop/annex/tools/annex-cost6.sh Brodie.88195848.members.btmm.icloud.com. + [remote "brodie-local"] + url = ssh://brodie.local./Users/akraut/Desktop/annex + fetch = +refs/heads/*:refs/remotes/brodie/* + annex-uuid = BF4BCA6D-9252-4B5B-BE12-36DD755FAF4B + annex-cost-command = /Users/akraut/Desktop/annex/tools/annex-cost.sh brodie.local. + +Is there any reason why I shouldn't do this? Is annex smart enough to know that it can reach the same remote through both urls? Will the cost calculations be considered and the "local" url chosen if it's cost is less than the other? + +(I posted the annex-cost.sh stuff at [[forum/Calculating Annex Cost by Ping Times]].) diff --git a/doc/forum/multiple_urls_for_the_same_UUID/comment_1_de7410d8824a864c4d106c9f1afaec3f._comment b/doc/forum/multiple_urls_for_the_same_UUID/comment_1_de7410d8824a864c4d106c9f1afaec3f._comment new file mode 100644 index 000000000..c06cf01c3 --- /dev/null +++ b/doc/forum/multiple_urls_for_the_same_UUID/comment_1_de7410d8824a864c4d106c9f1afaec3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.6" + subject="comment 1" + date="2012-12-30T04:19:48Z" + content=""" +Yes, this is absolutely supported. If it's trying to `get` a file and it fails to access the first remote, it'll even automatically fall back to using the second. I do similar things with my own remote, for example I have a foo that uses ssh with a foo-local that uses NFS. +"""]] diff --git a/doc/forum/multiple_urls_for_the_same_UUID/comment_2_309a86cf7e08448be64357a30d8b56ae._comment b/doc/forum/multiple_urls_for_the_same_UUID/comment_2_309a86cf7e08448be64357a30d8b56ae._comment new file mode 100644 index 000000000..9d0dc9f66 --- /dev/null +++ b/doc/forum/multiple_urls_for_the_same_UUID/comment_2_309a86cf7e08448be64357a30d8b56ae._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="multiple ways to access a special remote?" + date="2013-07-10T05:52:28Z" + content=""" +The use case is like this: an external USB drive could be accessed both locally (as a special directory remote) or it could be mounted remotely (then it would need to be an rsync special remote). +Is there a way to handle this? + +Failing that, can one switch the same remote from being a directory to an rsync without having to --move all of the content? + +Finally, what's the best way to check directory remote's directory= parameter? +"""]] diff --git a/doc/forum/multiple_urls_for_the_same_UUID/comment_3_fa97a45fc1392935fd5e0714db999bc2._comment b/doc/forum/multiple_urls_for_the_same_UUID/comment_3_fa97a45fc1392935fd5e0714db999bc2._comment new file mode 100644 index 000000000..c6f5dfde9 --- /dev/null +++ b/doc/forum/multiple_urls_for_the_same_UUID/comment_3_fa97a45fc1392935fd5e0714db999bc2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 3" + date="2013-07-10T16:38:04Z" + content=""" +@Michael, like I said above, this use case is completely supported. That's why git-annex uses UUIDs to uniquely identify repositories, no matter where or how many urls are used for them. + +Just set up the remotes you need, and if they end up pointing to the same repository by different routes, git-annex will automatically notice. + +--- + +The directory= parameter used when initializing a directory remote is only used to set up the remote in the .git/config file. It is not stored anywhere else, since the directory could be mounted at different locations on different computers, eg when a drive is moved between computers. +"""]] diff --git a/doc/forum/multiple_urls_for_the_same_UUID/comment_4_139178b1ba45b62eec0c89a660c0c81e._comment b/doc/forum/multiple_urls_for_the_same_UUID/comment_4_139178b1ba45b62eec0c89a660c0c81e._comment new file mode 100644 index 000000000..945aa3b6b --- /dev/null +++ b/doc/forum/multiple_urls_for_the_same_UUID/comment_4_139178b1ba45b62eec0c89a660c0c81e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 4" + date="2013-07-10T21:26:06Z" + content=""" +Very cool, thanks Joey. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build.mdwn b/doc/forum/new_linux_arm_tarball_build.mdwn new file mode 100644 index 000000000..e3b9c3de5 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build.mdwn @@ -0,0 +1,12 @@ +I've added an arm build to the autobuilds in [[install/Linux_standalone]]. + +I'm curious to see how this works out. I tried to make it as self-contained +as possible. It should work even on systems that do not use glibc, as long +as the kernel is new enough for the glibc included in it, and supports the +arm EABI. + +If it seems sufficiently useful, I might try to add the webapp to the +build, which would be somewhat complicated, but doable (since I'm building +using qemu, it can run a build on amd64 first to get the TH splices). + +--[[Joey]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_10_5f9735ec62478c99b8c814055206cff0._comment b/doc/forum/new_linux_arm_tarball_build/comment_10_5f9735ec62478c99b8c814055206cff0._comment new file mode 100644 index 000000000..eb3995eb1 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_10_5f9735ec62478c99b8c814055206cff0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmH9ARM62C6zcEpzh2muCs4wq-GkLRntgQ" + nickname="Randy" + subject="raspbian" + date="2014-04-16T10:59:10Z" + content=""" +This works fairly well for me on Raspian. However I am getting the same error as Justin. + + ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so' from /etc/ld.so.preload cannot be preloaded: ignored. + +I'm ignoring the errors for now, but it's a lot of noise that actually makes it slightly difficult to see the important output. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_11_859c44046b00fe885f6878cfe0e46360._comment b/doc/forum/new_linux_arm_tarball_build/comment_11_859c44046b00fe885f6878cfe0e46360._comment new file mode 100644 index 000000000..7be8a6731 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_11_859c44046b00fe885f6878cfe0e46360._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 11" + date="2014-04-17T19:39:41Z" + content=""" +I can't see any good way to prevent ld-linux.so from preloading things listed in `/etc/ld.so.preload`. I don't know why raspbian wants to preload that -- probably for optimisation purposes? + +I could modify the ld-linux.so shipped in the git-annex tarball, but that way lies pointless complication.. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_12_35ade68d62e95036344ad33db3279c21._comment b/doc/forum/new_linux_arm_tarball_build/comment_12_35ade68d62e95036344ad33db3279c21._comment new file mode 100644 index 000000000..ba6468a3f --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_12_35ade68d62e95036344ad33db3279c21._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmH9ARM62C6zcEpzh2muCs4wq-GkLRntgQ" + nickname="Randy" + subject="comment 12" + date="2014-04-18T13:38:13Z" + content=""" +There is no need to modify anything here. The errors were mostly just confusing at first and made me wonder if it was working properly. It is indeed working perfectly! Thanks!!! +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_1_7211ddc626bae97d4140c723c3cf028f._comment b/doc/forum/new_linux_arm_tarball_build/comment_1_7211ddc626bae97d4140c723c3cf028f._comment new file mode 100644 index 000000000..2e91a7a83 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_1_7211ddc626bae97d4140c723c3cf028f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="works on raspbian" + date="2013-12-16T23:26:51Z" + content=""" +This build has been verified to work on raspbian. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_2_fcbe3f7fa9d012b21c7a771553fa9142._comment b/doc/forum/new_linux_arm_tarball_build/comment_2_fcbe3f7fa9d012b21c7a771553fa9142._comment new file mode 100644 index 000000000..9499141fb --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_2_fcbe3f7fa9d012b21c7a771553fa9142._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="works on Synology NAS" + date="2013-12-17T02:52:22Z" + content=""" +Using latest build (fixed some issues). +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_3_2702cdbae4179a7a103d2a7098a8ed5e._comment b/doc/forum/new_linux_arm_tarball_build/comment_3_2702cdbae4179a7a103d2a7098a8ed5e._comment new file mode 100644 index 000000000..ec63cccc9 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_3_2702cdbae4179a7a103d2a7098a8ed5e._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="http://julien.lefrique.name/" + nickname="jlefrique" + subject="QNAP" + date="2013-12-17T07:57:37Z" + content=""" +Hi Joey, + +Thank you for taking the time to setup an ARM build. I am trying to run the last standalone build on a QNAP TS-219PII. I get the following error. Do you have any ideas? + + $ uname -a + Linux willow 2.6.33.2 #1 Fri Mar 1 04:41:48 CST 2013 armv5tel unknown + $ ./runshell + $ cd ../annex + $ git annex version + git-annex version: 5.20131216-g07252d6 + build flags: Assistant Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + $ git annex info + repository mode: indirect + trusted repositories: fatal: cannot get RLIMIT_NOFILE: Bad address + fatal: cannot get RLIMIT_NOFILE: Bad address + fatal: cannot get RLIMIT_NOFILE: Bad address + fatal: cannot get RLIMIT_NOFILE: Bad address + fatal: cannot get RLIMIT_NOFILE: Bad address + fatal: cannot get RLIMIT_NOFILE: Bad address + +I am still using the version 3.8.3 of the QNAP distribution. I will try to update to the last version (4.0.5) to see if it helps. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_4_e1d802fbcc9d699ece5267e80990255a._comment b/doc/forum/new_linux_arm_tarball_build/comment_4_e1d802fbcc9d699ece5267e80990255a._comment new file mode 100644 index 000000000..e95d86b72 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_4_e1d802fbcc9d699ece5267e80990255a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="RLIMIT_NOFILE" + date="2013-12-17T16:05:12Z" + content=""" +This is clearly failing when it runs git. Looking at the git source code, it does have a `RLIMIT_NOFILE` ifdef, so I could disable this, but would have to maintain my own build of git. + +What kernel version is this? Upgrading is likely to fix it. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_5_257b91ecbf5a6040a8e4c9a360c775ba._comment b/doc/forum/new_linux_arm_tarball_build/comment_5_257b91ecbf5a6040a8e4c9a360c775ba._comment new file mode 100644 index 000000000..94ea05a49 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_5_257b91ecbf5a6040a8e4c9a360c775ba._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://julien.lefrique.name/" + nickname="jlefrique" + subject="QNAP kernel" + date="2013-12-17T16:27:21Z" + content=""" +It's kernel 2.6.33.2 (see uname in my previous message). +A new version with kernel 3.4.x is available, I will try to update when the data on my NAS will be (more) safely backup-ed. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_6_bd8cca86a63be7e330111618c1959a74._comment b/doc/forum/new_linux_arm_tarball_build/comment_6_bd8cca86a63be7e330111618c1959a74._comment new file mode 100644 index 000000000..a57d48356 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_6_bd8cca86a63be7e330111618c1959a74._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="Re: RLIMIT_NOFILE" + date="2013-12-19T02:10:45Z" + content=""" +I've passed this problem on to the git developers, and they have quickly developed a patch that will solve it, so I'll just wait for the next git release. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_7_6814bdeca94328fe6c3f407795ff923a._comment b/doc/forum/new_linux_arm_tarball_build/comment_7_6814bdeca94328fe6c3f407795ff923a._comment new file mode 100644 index 000000000..a4b597bdf --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_7_6814bdeca94328fe6c3f407795ff923a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://julien.lefrique.name/" + nickname="jlefrique" + subject="Thanks" + date="2013-12-19T07:20:31Z" + content=""" +That's perfect! +On my side, I upgraded to firmware 4.0.2 but the kernel is still the same. +The kernel 3.4.x is available in the beta of QTS 4.1.0, I will wait the official release to upgrade. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_8_6db99d998ca990494c8f2826ff1ca273._comment b/doc/forum/new_linux_arm_tarball_build/comment_8_6db99d998ca990494c8f2826ff1ca273._comment new file mode 100644 index 000000000..9d58cb11c --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_8_6db99d998ca990494c8f2826ff1ca273._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://renaud.casenave.fr/" + ip="126.10.66.235" + subject="comment 8" + date="2014-02-17T13:15:24Z" + content=""" +Hi, + +You might be happy to know git-annex works well on sailfishOS, even the webapp. +It does segfault when trying to setup a xmpp account, though. +"""]] diff --git a/doc/forum/new_linux_arm_tarball_build/comment_9_2802b24ccb24f1615c9d61904f916d05._comment b/doc/forum/new_linux_arm_tarball_build/comment_9_2802b24ccb24f1615c9d61904f916d05._comment new file mode 100644 index 000000000..fbb0e2f21 --- /dev/null +++ b/doc/forum/new_linux_arm_tarball_build/comment_9_2802b24ccb24f1615c9d61904f916d05._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 9" + date="2014-03-01T19:13:16Z" + content=""" +This seems to work great for me on Raspbian, except I get many errors of the form + + ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so' from /etc/ld.so.preload cannot be preloaded: ignored. + +I've tried, but I haven't been able to figure out why ld doesn't like this particular lib. I can keep ignoring the error, but help would certainly be appreciated! +"""]] diff --git a/doc/forum/new_microfeatures.mdwn b/doc/forum/new_microfeatures.mdwn new file mode 100644 index 000000000..bfe44272a --- /dev/null +++ b/doc/forum/new_microfeatures.mdwn @@ -0,0 +1,59 @@ +I'm soliciting ideas for new small features that let git-annex do things that currently have to be done manually or whatever. + +Here are a few I've been considering: + +--- + +* --numcopies would be a useful command line switch. + > Update: Added. Also allows for things like `git annex drop --numcopies=2` when in a repo that normally needs 3 copies, if you need + > to urgently free up space. +* A way to make `drop` and other commands temporarily trust a given remote, or possibly all remotes. + +Combined, this would allow `git annex drop --numcopies=2 --trust=repoa --trust=repob` to remove files that have been replicated out to the other 2 repositories, which could be offline. (Slightly unsafe, but in this case the files are podcasts so not really.) + +> Update: done --[[Joey]] + +--- + +[[wishlist:_git-annex_replicate]] suggests some way for git-annex to have the smarts to copy content around on its own to ensure numcopies is satisfied. I'd be satisfied with a `git annex copy --to foo --if-needed-by-numcopies` + + > Contrary to the "basic" solution, I would love to have a git annex distribute which is smart enough to simply distribute all data according to certain rules. My ideal, personal use case during the next holidays where I will have two external disks, several SD cards with 32 GB each and a local disk with 20 GB (yes....) would be: + + cd ~/photos.annex # this repository does not have any objects! + git annex inject --bare /path/to/SD/card # this adds softlinks, but does **not** add anything to the index. it would calculate checksums (if enabled) and have to add a temporary location list, though + git annex distribute # this checks the config. it would see that my two external disks have a low cost whereas the two remotes have a higher cost. + # check numcopies. it's 3 + # copy to external disk one (cost x) + # copy to external disk two (cost x) + # copy to remote one (cost x * 2) + # remove file from temporary tracking list + git annex fsck # everything ok. yay! + +Come to think of it, the inject --bare thing is probably not a microfeature. Should I add a new wishlist item for that? -- RichiH + +> I've thought about such things before; does not seem really micro and I'm unsure how well it would work, but it would be worth a [[todo]]. --[[Joey]] + +>> Update: Done as --auto. --[[Joey]] + +--- + +Along similar lines, it might be nice to have a mode where git-annex tries to fill up a disk up to the `annex.diskreserve` with files, preferring files that have relatively few copies. Then as storage prices continue to fall, new large drives could just be plopped in and git-annex used to fill it up in a way that improves the overall redundancy without needing to manually pick and choose. + +> Update: git annex get --auto basically does this; you can tune +> --numcopies on the fly to make it get more files than needed by the +> current numcopies setting. --[[Joey]] + +--- + +If a remote could send on received files to another remote, I could use my own local bandwith efficiently while still having my git-annex repos replicate data. -- RichiH + +--- + +Really micro: + + % grep annex-push .git/config + annex-push = !git pull && git annex add . && git annex copy . --to origin --fast --quiet && git commit -a -m "$HOST $(date +%F--%H-%M-%S-%Z)" && git push + % + +-- RichiH +--[[Joey]] diff --git a/doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment b/doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment new file mode 100644 index 000000000..84fdd325d --- /dev/null +++ b/doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-06-01T17:36:50Z" + content=""" +I've been longing for an automated way of removing references to a remote assuming I know the exact uuid that I want to remove. i.e. I have lost a portable HDD due to a destructive process, I now want to delete all references to copies of data that was on that disk. Unless this feature exists, I would love to see it implemented. +"""]] diff --git a/doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment b/doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment new file mode 100644 index 000000000..4451e20ba --- /dev/null +++ b/doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-06-01T20:24:33Z" + content=""" +@jimmy [[walkthrough/what_to_do_when_you_lose_a_repository]].. I have not seen a convincing argument that removing the location tracking data entirely serves any purpose +"""]] diff --git a/doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment b/doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment new file mode 100644 index 000000000..4bb3aa684 --- /dev/null +++ b/doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="git annex unlock --readonly" + date="2011-06-02T11:34:42Z" + content=""" +This was already asked [here](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=606577), but I have a use case where I need to unlock with the files being hardlinked instead of copied (my fs does not support CoW), even though 'git annex lock' is now much faster ;-) . The idea is that 1) I want the external world see my repo \"as if\" it wasn't annexed (because of its own limitation to deal with soft links), and 2) I know what I do, and am sure that files won't be written to but only read. + +My case is: the repo contains a snapshot A1 of a certain remote directory. Later I want to rsync this dir into a new snapshot A2. Of course, I want to transfer only new or changed files, with the --copy-dest=A1 (or --compare-dest) rsync's options. Unfortunately, rsync won't recognize soft-links from git-annex, and will re-transfer everything. + + +Maybe I'm overusing git-annex ;-) but still, I find it is a legitimate use case, and even though there are workarounds (I don't even remember what I had to do), it would be much more straightforward to have 'git annex unlock --readonly' (or '--readonly-unsafe'?), ... or have rsync take soft-links into account, but I did not see the author ask for microfeatures ideas :) (it was discussed, and only some convoluted workarounds were proposed). Thanks. + + +"""]] diff --git a/doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment b/doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment new file mode 100644 index 000000000..cc98109e6 --- /dev/null +++ b/doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="git annex unused" + date="2011-06-02T11:55:58Z" + content=""" +Before dropping unsused items, sometimes I want to check the content of the files manually. +But currently, from e.g. a sha1 key, I don't know how to find the corresponding file, except with +'find .git/annex/objects -type f -name 'SHA1-s1678--70....', wich is too slow (I'm in the case where \"git log --stat -S'KEY'\" +won't work, either because it is too slow or it was never commited). By the way, +is it documented somewhere how to determine the 2 (nested) sub-directories in which a given +(by name) object is located? + +So I would like 'git-annex unused' be able to give me the list of *paths* to the unused items. +Also, I would really appreciate a command like 'git annex unused --log NUMBER [NUMBER2...]' which would do for me the suggested command +\"git log --stat -S'KEY'\", where NUMBER is from the 'git annex unused' output. +Thanks. +"""]] diff --git a/doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment b/doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment new file mode 100644 index 000000000..f7361f5d1 --- /dev/null +++ b/doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="git annex unused" + date="2011-06-02T19:51:49Z" + content=""" +ps: concerning the command 'find .git/annex/objects -type f -name 'SHA1-s1678--70....' from my previous comment, it is \"significantly\" faster to search for the containing directory which have the same name: 'find .git/annex/objects -maxdepth 2 -mindepth 2 -type d -name 'SHA1-s1678--70....'. I am just curious: what is the need to have each file object in its own directory, itself nested under two more sub-directories? +"""]] diff --git a/doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment b/doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment new file mode 100644 index 000000000..868e9677c --- /dev/null +++ b/doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="git annex fetch" + date="2011-07-03T14:39:41Z" + content=""" +I'm not sure it is worth adding a command for such a small feature, but I would certainly use it: having something like \"git annex fetch remote\" do \"git fetch remote && git annex copy --from=remote\", and \"git annex push remote\" do \"git push remote && git annex copy --to=remote\". And maybe the same for a pull operation? +"""]] diff --git a/doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment b/doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment new file mode 100644 index 000000000..e39e16232 --- /dev/null +++ b/doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="git annex fetch" + date="2011-07-03T17:57:00Z" + content=""" +My last comment is a bit confused. The \"git fetch\" command allows to get all the information from a remote, and it is then possible to merge while being offline (without access to the remote). I would like a \"git annex fetch remote\" command to be able to get all annexed files from remote, so that if I later merge with remote, all annexed files are already here. And \"git annex fetch\" could (optionally) call \"git fetch\" before getting the files. + +It seems also that in my last post, I should have written \"git annex get --from=remote\" instead of \"git annex copy --from=remote\", because \"annex copy --from\" copies all files, even if the local repo already have them (is this the case? if yes, when is it useful?) +"""]] diff --git a/doc/forum/nntp__47__usenet_special_remote.mdwn b/doc/forum/nntp__47__usenet_special_remote.mdwn new file mode 100644 index 000000000..86efa48cf --- /dev/null +++ b/doc/forum/nntp__47__usenet_special_remote.mdwn @@ -0,0 +1,18 @@ +Over the last few weeks i've been working on a seperate python nntp project. But decided that it would be fun to make it usable with git-annex. + +The code is almost complete. One major feature left(make it usable without a mysql/sqlite database, and without fetching headers). And of course a lot of bugfixes. + +I'm wondering if there is any interest in this special remote hook. + +The thought is, buy unlimited usenet account, and you can have a git-annex repository without any upper size limit. You want 100GB, well that'll be 10$ a month, want 100000GB, well that'll be 10$ a month. + +Of course there are plenty of caveats(retention on server, it is doubtfull the data will stay up for more than 4 years.). Because the code is in python3 i had to use a lot of external tools (uudeview, par2, ydecode/yydecode) and parse their output. Which is a horrid horrid solution. Since the code is nearing "beta" stage i might see if i can improve on that(possibly with ctypes), if there is any interest. + +Currently working on freebsd, ubuntu, debian, mac os x(10.7, not tested in 10.8) + +The last feature to be done (and this is UUUUUGLY) is to make it get nzb files from a source like this: http://nzbindex.nl/search/?q=GPGHMACSHA (yes, that is my git-annex repo) instead of from a mysql database. + +So, this is a call to see if anyone is interested, and if anyone proficient in *NIX want to test it out. + +Sincerely +Tobias diff --git a/doc/forum/nntp__47__usenet_special_remote/comment_1_171a0b95b1f95cfd82073e88bdefaab9._comment b/doc/forum/nntp__47__usenet_special_remote/comment_1_171a0b95b1f95cfd82073e88bdefaab9._comment new file mode 100644 index 000000000..ff14f6f2e --- /dev/null +++ b/doc/forum/nntp__47__usenet_special_remote/comment_1_171a0b95b1f95cfd82073e88bdefaab9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T20:49:06Z" + content=""" +I think it's a neat idea. I can't see using it for my own data due to retention, but if I had a use case where I wanted to spread data around and didn't care if it vanished after X months, I can see using it. + +I think you should publish the details, if getting it to a state others can use is not too much work, +"""]] diff --git a/doc/forum/nntp__47__usenet_special_remote/comment_2_48736ed17c98ffcfb13ec00b901b2dd6._comment b/doc/forum/nntp__47__usenet_special_remote/comment_2_48736ed17c98ffcfb13ec00b901b2dd6._comment new file mode 100644 index 000000000..90b264f7b --- /dev/null +++ b/doc/forum/nntp__47__usenet_special_remote/comment_2_48736ed17c98ffcfb13ec00b901b2dd6._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-09-11T07:46:07Z" + content=""" +Only played a tiny bit with this since the initial post. + +I've decided that sql backend should be dropped entirely. Mostly the SQL backend was there because the code does something else entirely, and this was just a test. + +But since there has been no interest it will probably take ages before i actually get this finished :) + +"""]] diff --git a/doc/forum/non-bare_repo_on_cloud_remote.mdwn b/doc/forum/non-bare_repo_on_cloud_remote.mdwn new file mode 100644 index 000000000..3949e18da --- /dev/null +++ b/doc/forum/non-bare_repo_on_cloud_remote.mdwn @@ -0,0 +1,6 @@ +Hi, + +I wondered if it's possible to have a non-bare repo on a cloud remote. I want to have some sort of Dropbox-like workflow were I simply put stuff into a directory on my drive and it gets synced via SSH to a central VPS so I can also always access it via HTTP, for example. + +Regards, +Lukas diff --git a/doc/forum/non-bare_repo_on_cloud_remote/comment_1_da0c023af7c78f1ef1cfe1143a900a9f._comment b/doc/forum/non-bare_repo_on_cloud_remote/comment_1_da0c023af7c78f1ef1cfe1143a900a9f._comment new file mode 100644 index 000000000..17476db0a --- /dev/null +++ b/doc/forum/non-bare_repo_on_cloud_remote/comment_1_da0c023af7c78f1ef1cfe1143a900a9f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.10" + subject="comment 1" + date="2013-07-22T22:04:53Z" + content=""" +Sure you can.. That's how works, which is where people download git-annex builds from! + +[[tips/setup_a_public_repository_on_a_web_site]] +"""]] diff --git a/doc/forum/non-bare_repo_on_cloud_remote/comment_2_71baea93f6caaf7b81a9ac00bee91e5e._comment b/doc/forum/non-bare_repo_on_cloud_remote/comment_2_71baea93f6caaf7b81a9ac00bee91e5e._comment new file mode 100644 index 000000000..145c57120 --- /dev/null +++ b/doc/forum/non-bare_repo_on_cloud_remote/comment_2_71baea93f6caaf7b81a9ac00bee91e5e._comment @@ -0,0 +1,67 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 2" + date="2013-08-08T19:05:07Z" + content=""" +Seems that I don't get it... Here is what I did: + +First, I create a new repo with the assistant on `user@laptop ~/temp/annex-test`, then: + + user@laptop ~/temp/annex-test % echo test1 > test1 + user@laptop ~/temp/annex-test % echo test2 > test2 + + user@server ~/tmp % mkdir annex-test + user@server ~/tmp % cd annex-test + user@server ~/tmp/annex-test % git init + Initialized empty Git repository in /home/tobru/tmp/annex-test/.git/ + user@server ~/tmp/annex-test % git annex init + init ok + (Recording state in git...) + user@server ~/tmp/annex-test % mv .git/hooks/post-update.sample .git/hooks/post-update + user@server ~/tmp/annex-test % cat .git/hooks/post-update + #!/bin/sh + # + # An example hook script to prepare a packed repository for use over + # dumb transports. + # + # To enable this hook, rename this file to \"post-update\". + + exec git update-server-info + user@server ~/tmp/annex-test % chmod +x .git/hooks/post-update + user@server ~/tmp/annex-test % echo '#!/bin/sh\ngit annex merge' > .git/hooks/post-receive + user@server ~/tmp/annex-test % chmod +x .git/hooks/post-receive + + user@laptop ~/temp/annex-test % git remote add server ssh://user@server/home/tobru/tmp/annex-test + user@laptop ~/temp/annex-test % git annex assistant --stop + user@laptop ~/temp/annex-test % git annex sync + commit + ok + pull server + warning: no common commits + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (5/5), done. + From ssh://server.tobru.local/home/tobru/tmp/annex-test + * [new branch] git-annex -> server/git-annex + ok + (merging server/git-annex into git-annex...) + (Recording state in git...) + push server + Counting objects: 27, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (20/20), done. + Writing objects: 100% (25/25), 2.36 KiB, done. + Total 25 (delta 2), reused 0 (delta 0) + remote: merge git-annex (merging synced/git-annex into git-annex...) + remote: ok + To ssh://tobru@server.tobru.local/home/tobru/tmp/annex-test + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master + ok + user@laptop ~/temp/annex-test % git annex assistant + +Now I expect the files `test1` and `test2` to be at `user@server ~/tmp/annex-test`. But they are not displayed. +What am I doing wrong? The main thing I wan't to achieve: Push the files from `laptop` to `server` without adding `laptop` as remote on the server. +"""]] diff --git a/doc/forum/not_finding_git-annex-shell_on_remote.mdwn b/doc/forum/not_finding_git-annex-shell_on_remote.mdwn new file mode 100644 index 000000000..0d743bf78 --- /dev/null +++ b/doc/forum/not_finding_git-annex-shell_on_remote.mdwn @@ -0,0 +1,21 @@ +I have set up an annex on a remote machine and I am connecting via ssh. But, since it is a managed machine, I installed the git-annex binary in my own ~/bin. Well, when I try +$git annex sync + +I get: + $git annex sync +(merging origin/git-annex into git-annex...) +(Recording state in git...) +bash: git-annex-shell: command not found + + Remote origin does not have git-annex installed; setting annex-ignore +commit ok +pull origin + +merge: refs/remotes/origin/master - not something we can merge + +merge: refs/remotes/origin/synced/master - not something we can merge +failed +git-annex: sync: 1 failed + + +The git remote -v looks correct. So, how do I tell git annex on my local machine where to use $HOME/bin in PATH on the remote machine when syncing with remotes? diff --git a/doc/forum/not_finding_git-annex-shell_on_remote/comment_1_84881cad02c251a2515cec50fc22bf16._comment b/doc/forum/not_finding_git-annex-shell_on_remote/comment_1_84881cad02c251a2515cec50fc22bf16._comment new file mode 100644 index 000000000..8441f412a --- /dev/null +++ b/doc/forum/not_finding_git-annex-shell_on_remote/comment_1_84881cad02c251a2515cec50fc22bf16._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Declare path on first line of bashrc?" + date="2014-02-15T18:36:35Z" + content=""" +If i don't misremember some systems including Debian require you to set the path on the very first line of .bashrc for it to work. Can't remember why just now. + +in other words paste the following into the very first line of `$HOME/.bashrc` + +`PATH=$PATH:$HOME/bin:$HOME/bin/git-annex.linux` + +Modify the line above if you haven't installed to `~/bin/git-annex.linux` + + +"""]] diff --git a/doc/forum/not_finding_git-annex-shell_on_remote/comment_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment b/doc/forum/not_finding_git-annex-shell_on_remote/comment_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment new file mode 100644 index 000000000..7acee2035 --- /dev/null +++ b/doc/forum/not_finding_git-annex-shell_on_remote/comment_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac" + nickname="Srinath" + subject="Progress, but still issues" + date="2014-02-17T04:09:23Z" + content=""" +\"I now realize that the git annex system still requires the standard \"add\" and \"commit\" process. But I'm still getting: + +$git annex sync +commit ok +pull origin +remote: Counting objects: 37, done. +remote: Compressing objects: 100% (35/35), done. +remote: Total 36 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (36/36), done. +From ssh://stampede.tacc.utexas.edu/work/02463/srinathv/cesm1_3_beta07/scripts + * [new branch] master -> origin/master + + +merge: refs/remotes/origin/synced/master - not something we can merge +failed +push origin +Counting objects: 11, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (6/6), done. +Writing objects: 100% (8/8), 736 bytes | 0 bytes/s, done. +Total 8 (delta 3), reused 1 (delta 0) +To ssh://srinathv@stampede.tacc.utexas.edu/work/02463/srinathv/cesm1_3_beta07/scripts + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +ok +git-annex: sync: 1 failed + + +So the fails appear, and the suggestion of \"export PATH\" placement did not help, though appreciated. +"""]] diff --git a/doc/forum/not_finding_git-annex-shell_on_remote/comment_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment b/doc/forum/not_finding_git-annex-shell_on_remote/comment_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment new file mode 100644 index 000000000..53419452c --- /dev/null +++ b/doc/forum/not_finding_git-annex-shell_on_remote/comment_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac" + nickname="Srinath" + subject="no more issue" + date="2014-02-17T04:25:31Z" + content=""" +After doing 1 more sync, the error messages are now gone. I wonder if the refs directory needed to be synched correctly. +"""]] diff --git a/doc/forum/not_finding_git-annex-shell_on_remote/comment_4_71ae60efcacdba5e11548923b2c85b95._comment b/doc/forum/not_finding_git-annex-shell_on_remote/comment_4_71ae60efcacdba5e11548923b2c85b95._comment new file mode 100644 index 000000000..12bf8fa75 --- /dev/null +++ b/doc/forum/not_finding_git-annex-shell_on_remote/comment_4_71ae60efcacdba5e11548923b2c85b95._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 4" + date="2014-02-20T19:41:05Z" + content=""" +@Srinath I wonder if the machine you are running git-annex sync on is a Windows machine? I have seen that \" refs/remotes/origin/synced/master - not something we can merge\" intermittently when testing on Windows, but not other times. + +(It's not related to the original PATH configuration problem on your server.) +"""]] diff --git a/doc/forum/not_getting_file_contents.mdwn b/doc/forum/not_getting_file_contents.mdwn new file mode 100644 index 000000000..23150216d --- /dev/null +++ b/doc/forum/not_getting_file_contents.mdwn @@ -0,0 +1 @@ +I have 2 computers successfully exchanging files, but the contexts are incomplete. Used text files, documents, mp3s as tests. Both computers report in the webapp that they are synched and file names are there. But file sizes are wrong by 75% less and contents are unusable. Is there something in the config? Both machines on LinuxMint 13. diff --git a/doc/forum/not_getting_file_contents/comment_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment b/doc/forum/not_getting_file_contents/comment_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment new file mode 100644 index 000000000..e03ec333a --- /dev/null +++ b/doc/forum/not_getting_file_contents/comment_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-11T16:06:59Z" + content=""" +That certainly shouldn't be happening! + +Are these computers syncing via local pairing, or are you using a transfer remote, and if so, which one? +"""]] diff --git a/doc/forum/not_getting_file_contents/comment_2_dc7403e1b551552f9fd00da6a1453570._comment b/doc/forum/not_getting_file_contents/comment_2_dc7403e1b551552f9fd00da6a1453570._comment new file mode 100644 index 000000000..499176b01 --- /dev/null +++ b/doc/forum/not_getting_file_contents/comment_2_dc7403e1b551552f9fd00da6a1453570._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="trilobite" + ip="71.17.134.14" + subject="comment 2" + date="2013-07-11T23:23:41Z" + content=""" +I did this with local synch in home lan. Filenames do travel both directions. Just not contents. They are identifed as symlinks rather than files. +"""]] diff --git a/doc/forum/one_annex_versus_many_annexes__63__.mdwn b/doc/forum/one_annex_versus_many_annexes__63__.mdwn new file mode 100644 index 000000000..cafe2aa9f --- /dev/null +++ b/doc/forum/one_annex_versus_many_annexes__63__.mdwn @@ -0,0 +1,10 @@ +I'm curious how other people are using git-annex: + + * A single annex containing everything they want to keep track of (albeit with some files only available in some remotes). + * Several annexes for different purposes. + +I'm mostly asking because I don't want to get too far into using git-annex without thinking clearly about which is the most suitable choice for me. At present I have things split into two annexes, one for things I really wouldn't want to lose (and some of which are somewhat private), and another for comparatively throwaway items. However, given the possibility of setting different annex.numcopies on different file globs or directories, it seems like it might be kind of silly to make my life more complicated by having more than one annex. + +Primarily, I'm curious if there are some implications of the decision that I haven't considered. It seems like an obvious point that one would want different annexes is if they're used in distinctly different security-level environments (e.g. I'm happy to copy my FLAC (music) files over to my work computer which lives at the office, but I wouldn't want to copy personal financial documents - or even the filenames - there.) + +-Mike diff --git a/doc/forum/one_or_many_annexes__63__.mdwn b/doc/forum/one_or_many_annexes__63__.mdwn new file mode 100644 index 000000000..57b311c18 --- /dev/null +++ b/doc/forum/one_or_many_annexes__63__.mdwn @@ -0,0 +1,7 @@ +Just a question about other peoples' annex usage. I've got one uber-annex (in ~/annex of course) where I keep ALL THE THINGS, movies, music, pictures, whatever. + +It's very big, of course. And I worry about doing anything unusual with it (like trying out direct mode) because, hey, that's all my stuff. + +Like, just now, I tried flipping it into direct mode, and a handful of files stayed symlinks, which weirded me out. (Maybe because I had the assistant running while I switched it, and that caused chaos?) Then I flipped it back to indirect, and a bunch of files were left un-tracked, as real files rather than links! I kind of freaked out, and did a big "git annex add" to add them all back. I haven't left a bug report because it's not something I want to try again experimentally to reproduce, I just want my repo back, you know? + +Anyways, this kind of thing might not happen if I kept multiple small repos. I was wondering if anybody else worked that way, and what advantages/disadvantages you've found compared to having one super-repo. diff --git a/doc/forum/one_or_many_annexes__63__/comment_1_656d96011801d67a45b0b3bb3d70fa63._comment b/doc/forum/one_or_many_annexes__63__/comment_1_656d96011801d67a45b0b3bb3d70fa63._comment new file mode 100644 index 000000000..240f9868f --- /dev/null +++ b/doc/forum/one_or_many_annexes__63__/comment_1_656d96011801d67a45b0b3bb3d70fa63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn7gQ1zZDdWhXy9H51W2krZYShNmKL3qfM" + nickname="Karsten" + subject="comment 1" + date="2013-01-21T21:25:12Z" + content=""" +That's an interesting question. Personally, I have two annexes. One for my \"digital library\": movies, music, ebooks, downloads, everything I want to keep but was not created by me. I don't want to loose them because getting them back would be expensive and cumbersome. The other is my personal archive for Photos and Videos I've taken, which are valuable as they contain many memories which would be impossible to recreate if lost. With the first one, I'm experimenting quite a lot, with the second one I'm very conservative. Hope that helps. +"""]] diff --git a/doc/forum/overmounting_repository_at_home.mdwn b/doc/forum/overmounting_repository_at_home.mdwn new file mode 100644 index 000000000..2bac1994f --- /dev/null +++ b/doc/forum/overmounting_repository_at_home.mdwn @@ -0,0 +1,12 @@ +Consider the following scenario: + +- A Server which holds the full repository +- A Laptop with a small disk, cloned the repository + +Now when i am online i'd just like to mount the repository from the server on over to the client, shadowing the local repository. But when offline and the server is not +mounted the local repository takes place. + +The Question is now what would be a viable concept to get this right. Especially will the assistant become confused when it runs on the server side and locally on the laptop +while the mount is in effect. Would it be sensible not to mount the whole repository tree but only parts like `.git/annex` or `.git/annex/objects`? + +Not tried this yet, but I am wondering whats the most viable approach would be. diff --git a/doc/forum/overmounting_repository_at_home/comment_1_399ac5014c489698e1e45deec4db7311._comment b/doc/forum/overmounting_repository_at_home/comment_1_399ac5014c489698e1e45deec4db7311._comment new file mode 100644 index 000000000..90ce2ae40 --- /dev/null +++ b/doc/forum/overmounting_repository_at_home/comment_1_399ac5014c489698e1e45deec4db7311._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="sounds like a bad idea... but..." + date="2014-06-24T04:18:51Z" + content=""" +From the few details you give, this sounds like a bad idea. git-annex tells different repos apart by using a UUID. You can see this UUID in `.git/config`. + +But if you are really insistent on doing this, you could always system link the folder to the spot you want it, then write a script that mounts the server in an arbitrary location and redoes the system link. I'd try this on a copy of the data or with some data that doesn't matter before going for it. +"""]] diff --git a/doc/forum/overmounting_repository_at_home/comment_2_d006d89ba204568cdee0731b6251ec1a._comment b/doc/forum/overmounting_repository_at_home/comment_2_d006d89ba204568cdee0731b6251ec1a._comment new file mode 100644 index 000000000..2413948b7 --- /dev/null +++ b/doc/forum/overmounting_repository_at_home/comment_2_d006d89ba204568cdee0731b6251ec1a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="comment 2" + date="2014-06-24T14:03:01Z" + content=""" +I know that this is a bad idea right now when done in a naive approach, I am wondering if git-annex could be made aware of this case and how it could be implemented. +A immature idea for example would be only to overmount the .git/annex/objects folder and let the git-annex check if the objects lay on a different device, if so, refuse to do operation on the object store. + +I started this thread to figure out if there is some interest in such functionality and if so, polishing it out to see how it could be done. +"""]] diff --git a/doc/forum/overmounting_repository_at_home/comment_3_3734b50c37cbec675813cbeca7bf4ce9._comment b/doc/forum/overmounting_repository_at_home/comment_3_3734b50c37cbec675813cbeca7bf4ce9._comment new file mode 100644 index 000000000..029e9eba0 --- /dev/null +++ b/doc/forum/overmounting_repository_at_home/comment_3_3734b50c37cbec675813cbeca7bf4ce9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="Already on todo list" + date="2014-06-24T16:58:05Z" + content=""" +As is appears to me, the feature you are suggesting is already on \"the todo list\" as [[union_mounting|todo/union_mounting]]. I would also really appreciate this feature … +"""]] diff --git a/doc/forum/partial_synchronisation._android_phone.mdwn b/doc/forum/partial_synchronisation._android_phone.mdwn new file mode 100644 index 000000000..7abfb24cd --- /dev/null +++ b/doc/forum/partial_synchronisation._android_phone.mdwn @@ -0,0 +1,7 @@ +hi + +i have a repository that is 30 gb large. i would like to sync some content onto my android phone. take mp3's for example. i would like to see whole content on android but my phone does not have that much flash space. i would like to manualy select what folders, files will be copied onto phone. + +this use case may not even refer strictly to android devices but even pc's. for exaple i have small ssd drive on laptop. whole contentis kept on some hudge raid array. i will see whole directory structure but whenever i want a file i will just shedule it for download. + +is it possible ? or maybe i just can not find the answer on project page ? diff --git a/doc/forum/partial_synchronisation._android_phone/comment_1_2a48569277945a9c334bdfc51f8fd01f._comment b/doc/forum/partial_synchronisation._android_phone/comment_1_2a48569277945a9c334bdfc51f8fd01f._comment new file mode 100644 index 000000000..b9c28a122 --- /dev/null +++ b/doc/forum/partial_synchronisation._android_phone/comment_1_2a48569277945a9c334bdfc51f8fd01f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T21:57:05Z" + content=""" +You can either put a repository in manual mode, which requires you run `git annex get` etc to get just the files you want, or you can find or write a [[preferred_content]] expression that matches only the files you want in a repository, and then the assistant will make it contain only those. +"""]] diff --git a/doc/forum/partial_synchronisation._android_phone/comment_2_550ae91c8a1fe060368c4682d37514b6._comment b/doc/forum/partial_synchronisation._android_phone/comment_2_550ae91c8a1fe060368c4682d37514b6._comment new file mode 100644 index 000000000..e549bf7cc --- /dev/null +++ b/doc/forum/partial_synchronisation._android_phone/comment_2_550ae91c8a1fe060368c4682d37514b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 2" + date="2013-12-30T22:13:15Z" + content=""" +thx for reply +"""]] diff --git a/doc/forum/performance_and_multiple_replication_problems.mdwn b/doc/forum/performance_and_multiple_replication_problems.mdwn new file mode 100644 index 000000000..7f2f90fdd --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems.mdwn @@ -0,0 +1,17 @@ +Hi, + +I just was setting um my git-annex repository and started to sync my whole stuff in it. + +Background: I have choosen git-annex to sync my whole stuff (pictures, mp3s, documents, etc) between my pc, notebook and a home-server + +My Problems: +1) When I'm starting the git-annex deamon, the "Performing startup scan" message occurs for hours +2) git-annex synchronizes folders from the server which already on my pc, and that every time I restart the deamon on client + +My Questions: +For 1) is git-annex when running one repository suitable to manage > 100gb and > 50000 files? +For 2) do I have to wait until every tasks are completed (everything is committed) to get rid of multiple downloads of the same folders/files +3) what is the best schema to sync between >2 devices should I use a Mesh or Star Schema (where my server is in the middle) + +Thank You in advance! +Regards J diff --git a/doc/forum/performance_and_multiple_replication_problems/comment_1_a2cdf1a4840f099f6bc941fd8de966c7._comment b/doc/forum/performance_and_multiple_replication_problems/comment_1_a2cdf1a4840f099f6bc941fd8de966c7._comment new file mode 100644 index 000000000..aab0ec17f --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems/comment_1_a2cdf1a4840f099f6bc941fd8de966c7._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-11T15:06:58Z" + content=""" +It sounds like you are using git-annex to sync a *lot* of files. The startup scan is a basic check that there are no new, deleted, or modified files since the last time it ran. This requires a little work, like statting the files, but won't take long for reasonable numbers of files. + +The size of files doesn't affect the length of the scan. I have a repository with on the order of 50k files, and the startup scan takes only a few minutes. One thing that could matter is that my repository is in indirect mode. Direct mode is less efficient. You could try to switch your repository to indirect mode: `git annex indirect` (you can always switch back: `git annex direct`) + +It would be possible to disable that scan, but at the expense of not being able to sync changes made while git-annex is not running. There's also a trick you can use: Start the assistant running in a subdirectory and it will only scan that subdirectory (it will only notice new files in that subdirectory too..) + +I don't quite understand what you mean with problem #2. If files were repeatedly being uploaded or downloaded, that have already been sent, that would be a bug. Please file a bug report with full debug logs if that is the case. + +Which topology is best? I think the best way is to start with the one you like, and if it doesn't work well, add more links between repositories. A star topology will certainly work ok. A mesh can work ok but can be hard to maintain. +"""]] diff --git a/doc/forum/performance_and_multiple_replication_problems/comment_2_e65b360706c66ede6e0e841b2ebbbfbc._comment b/doc/forum/performance_and_multiple_replication_problems/comment_2_e65b360706c66ede6e0e841b2ebbbfbc._comment new file mode 100644 index 000000000..3ce2447bc --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems/comment_2_e65b360706c66ede6e0e841b2ebbbfbc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 2" + date="2013-06-12T00:47:21Z" + content=""" +I have witnessed that second problem as well, to the point where I've stopped autostarting (and hence using) git annex for the moment. I'll try to get some debugging data. +"""]] diff --git a/doc/forum/performance_and_multiple_replication_problems/comment_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment b/doc/forum/performance_and_multiple_replication_problems/comment_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment new file mode 100644 index 000000000..6e4e1b1c6 --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems/comment_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="the startup check is not a small issue" + date="2014-02-25T11:37:15Z" + content=""" +I would like to add that this startup check has probably been a blocker for my use case for a long long time. I tried to use git-annex to synchronize a huge number of files, most of them never changing. My plan was to have a few tens of GB of data which more or less never change in an archive directory and then add from time to time new data (by batches of a few hundreds of files, each of them not necessarily very large) to the annex. Once this new data has been processed or otherwise become less immediately useful, it would be shifted to the archive. It would have been very useful to have such a setup, because the amount of data is too large to be replicated everywhere, especially on a laptop. After finding this post I finally understand that the seemingly never ending \"performing startup scan\" that I observed are probably not due to the assistant somehow hanging, contrary to what I thought. It seems it is just normal operation. The problem is that this normal operation makes it unusable for the use case I was considering, since it does not make much sense to have git-annex scanning about 10^6 files or links on every boot of a laptop. On my workstation this \"startup scan\" has now been running for close to one hour now and is not finished yet, this is not thinkable on laptop boot. + +Maybe an analysis of how well git-annex operation scales with number of files should be part of the documentation, since \"large files\" is not the only issue when trying to sync different computers. One finds references to \"very large number of files\" about annex.queuesize, but \"very large\" has no clear meaning. One also finds a reference to \"1 million files\" being a bit of a git limitation on comments of a bug report . + +Orders of magnitude of the number of files that git-annex is supposed to be able to handle would be very useful. + + +"""]] diff --git a/doc/forum/performance_and_multiple_replication_problems/comment_4_23a6dc7ea569944ca55bd21851dd770d._comment b/doc/forum/performance_and_multiple_replication_problems/comment_4_23a6dc7ea569944ca55bd21851dd770d._comment new file mode 100644 index 000000000..77fe564fc --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems/comment_4_23a6dc7ea569944ca55bd21851dd770d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 4" + date="2014-03-05T22:06:00Z" + content=""" +@maurizio, that's a good motivating example. + +So, I have made `git config annex.startupscan false` disable the startup scan (except for a minor tree walk that needs to be done to get inotify working). + +Of course, if you set that, the assistant won't notice any changes that are made when it's not running. It would work well to set it if the assistant is started at boot and left running until shutdown. + +My goal for git-annex is for it to scale to how ever many files git scales to. So I try to always make git be the limiting factor. I feel that git scales fairly well into the 100k file range. +"""]] diff --git a/doc/forum/performance_and_multiple_replication_problems/comment_5_8df6cc8b72e0e78c7380f7d471124498._comment b/doc/forum/performance_and_multiple_replication_problems/comment_5_8df6cc8b72e0e78c7380f7d471124498._comment new file mode 100644 index 000000000..f881942f9 --- /dev/null +++ b/doc/forum/performance_and_multiple_replication_problems/comment_5_8df6cc8b72e0e78c7380f7d471124498._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 5" + date="2014-07-08T12:26:58Z" + content=""" +Something to keep in mind for some point in the future: btrfs supports an efficient method by which one can inquire exactly which files have changed since a specified point in time, where the point in time is measured by a unit called «generation». + +A program can request the current «generation» index, and later ask btrfs which files have changed after that index, without needing to walk the file-system. This is currently implemented in the user-space program «btrfs filesystem find-new». While it’s called «find-new», this not only find newly created files, but also changed files. + +Currently, it seems one needs to be super-user to use «find-new», because it lists changed files for complete subvolumes, but since generations are stored per-file, in the future there will likely be a user-space method for regular users. +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn new file mode 100644 index 000000000..f70c12702 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn @@ -0,0 +1,12 @@ +This works with bind-mount, I might try with softlinks as well. + +Going through git's data on push/pull can take ages on a spindle disk even +if the repo is rather small in size. This is especially true if you are +used to ssd speeds, but ssd storage is expensive. Storing the annex objects +on a cheap spindle disk and everything else on a ssd makes things a _lot_ +faster. + +> Update: git-annex supports `.git/annex/` being moved to a different disk +> than the rest of the repisitory, but does *not* support individual +> subdirectories, like `.git/annex/objects/` being on a different disk +> than the main `.git/annex/` directory. --[[Joey]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment new file mode 100644 index 000000000..124993bcf --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-02T17:48:29Z" + content=""" +Either option should work fine, but git gc --aggressive will probably avoid most of git's seeking. +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment new file mode 100644 index 000000000..eddc8c631 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-02T21:34:24Z" + content=""" +I'll give it a try as soon as I get rid of this: + + % git annex fsck +fatal: index file smaller than expected +fatal: index file smaller than expected + % git status +fatal: index file smaller than expected + % + +And no, I am not sure where that is coming from all of a sudden... (it might have to do with a hard lockup of the whole system due to a faulty hdd I tested, but I didn't do anything to it for ages before that lock-up. So meh. Also, this is prolly off topic in here) + + +Richard +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment new file mode 100644 index 000000000..fc29236c6 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-04-03T01:48:57Z" + content=""" +For future reference, git can recover from a corrupted index file with `rm .git/index; git reset --mixed`. + +Of course, you lose any staged changes that were in the old index file, and may need to re-stage some files. +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment new file mode 100644 index 000000000..ec0f88d13 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2011-04-03T09:03:22Z" + content=""" +Thanks a lot. I tried various howtos around the net, but none of them worked; yours did. (I tried it in one of the copies of the broken repo which I keep around for obvious reasons). +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_5_7abbbe7db3988a2d239d11b0a4c597e7._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_5_7abbbe7db3988a2d239d11b0a4c597e7._comment new file mode 100644 index 000000000..651fc8144 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_5_7abbbe7db3988a2d239d11b0a4c597e7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="stoile" + ip="2a01:198:242:0:219:66ff:fef2:c021" + subject="Error with .git/annex as a symlink" + date="2013-11-16T12:20:58Z" + content=""" +I had my git annex directory on a ssd and .git/annex on a hdd (using a symlink). I got errors when adding files because a move failed. I forgot to copy the error message. When I had .git/annex/objects on a hdd, everything worked as expected, there were no problems. + +So what exactly will go wrong if I only have this one subdirectory on another filesystem? +"""]] diff --git a/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment new file mode 100644 index 000000000..0c0e3e495 --- /dev/null +++ b/doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="stoile" + ip="2a01:198:242:0:219:66ff:fef2:c021" + subject="Bug report answering my question" + date="2013-11-17T10:28:40Z" + content=""" +My question was answered in . +"""]] diff --git a/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517.mdwn b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517.mdwn new file mode 100644 index 000000000..0d226d5df --- /dev/null +++ b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517.mdwn @@ -0,0 +1,13 @@ + [2014-05-18 22:38:21 SAST] main: starting assistant version 5.20140517-g0aed6d9 + Already up-to-date. + + (scanning...) [2014-05-18 22:38:22 SAST] Watcher: Performing startup scan + gpg: WARNING: unsafe permissions on homedir `/var/folders/m6/zkd11n111m38ff37zbtgq0lr0000gp/T/git-annex-gpg.tmp.0' + gpg: keyring `/Applications/git-annex.app/Contents/MacOS/trustedkeys.gpg' created + gpg: Signature made Sun May 18 04:16:11 2014 SAST using DSA key ID XXXXXXXX + gpg: Can't check signature: public key not found + (started...) + +And still facing: + + git-annex-remote-skydrive is not installed in PATH (/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/usr/bin:/bin:/usr/sbin:/sbin) diff --git a/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_1_807d7da99f732f2fa5f9d3cb1ba9f1a1._comment b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_1_807d7da99f732f2fa5f9d3cb1ba9f1a1._comment new file mode 100644 index 000000000..0cd6a21d9 --- /dev/null +++ b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_1_807d7da99f732f2fa5f9d3cb1ba9f1a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 1" + date="2014-06-21T13:07:51Z" + content=""" +What exactly are safe permissions? +"""]] diff --git a/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_2_92a7509fc42ab2347d57f080081d14b5._comment b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_2_92a7509fc42ab2347d57f080081d14b5._comment new file mode 100644 index 000000000..4767ae75b --- /dev/null +++ b/doc/forum/pgp_issue_in_log_file_after_upgrade_to_5.20140517/comment_2_92a7509fc42ab2347d57f080081d14b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 2" + date="2014-07-03T19:49:03Z" + content=""" +That error message seems to occur when git-annex is trying to upgrade itself to a newer version, but for some reason the temporary directory it uses for gpg allows some other user to write to it. Perhaps because of a wacky umask, I don't know. AFAICS it's only a warning and the upgrade still works, but I have made git-annex force a sane umask when creating this temp directory. +"""]] diff --git a/doc/forum/post-copy__47__sync_hook.mdwn b/doc/forum/post-copy__47__sync_hook.mdwn new file mode 100644 index 000000000..05fbc0b29 --- /dev/null +++ b/doc/forum/post-copy__47__sync_hook.mdwn @@ -0,0 +1,14 @@ +Hi, + +I have the following setup: +- normal git repository with website code. +- git annex repository to hold large set of binary data (pdfs, flashmovies, etc) that belongs to the site. + +I use git annex so I (and other developers) don't need to copy 1.4Gb+ of binary data for every working copy. (Data that is mostly left untouched.) Using git annex copy --to=origin I can simply only add new additions to this media/binary repository, without first pulling all the data. So far so good. + +When commits are pushed to a certain branch on the normal git repository, a post-receive hook exports (GIT_WORK_TREE=/data/site/ git checkout $branch -f) the updated repository to an apache documentroot. Thereby updating the staging server of the website. + +My question is, how can I do the same thing for my git annex repository? Since post-receive fires on receiving the annex hashes, and not the actual files. Those are rsynced, and I cannot find a way to trigger an action after all files are copied by git annex via rsync. + +Any tips? + diff --git a/doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment b/doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment new file mode 100644 index 000000000..04a6f4668 --- /dev/null +++ b/doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-14T16:23:25Z" + content=""" +I've made git-annex-shell run the git `hooks/annex-content` after content is received or dropped. + +Note that the clients need to be running at least git-annex version 3.20120227 , which runs git-annex-shell commit, which runs the hook. + +"""]] diff --git a/doc/forum/preferred_content.mdwn b/doc/forum/preferred_content.mdwn new file mode 100644 index 000000000..b4c215328 --- /dev/null +++ b/doc/forum/preferred_content.mdwn @@ -0,0 +1,11 @@ +Hello all, + +I'm trying to use "preferred content" with git-annex but I suspect that my version doesn't provide it. + +I'm using Debian "wheezy" that packs git-annex 3.20120629. + +I appreciate any help you can give. + +Thanks. + +Zaka. diff --git a/doc/forum/preferred_content/comment_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment b/doc/forum/preferred_content/comment_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment new file mode 100644 index 000000000..24de5840b --- /dev/null +++ b/doc/forum/preferred_content/comment_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-07T18:38:22Z" + content=""" +The first version of git-annex to support preferred content settings was 3.20121009. + +There is a quite up-to-date backport available for Debian stable. +"""]] diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn b/doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn new file mode 100644 index 000000000..3c67a93a5 --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn @@ -0,0 +1,7 @@ +I have my music library in `music/` and some really old files I recently added in `reallyold/`. There are some MP3s in the really old files and some are the same as my library, so of course git annex is only keeping one copy. Now, I have an rsync remote, `ma`, which prefers content from `music/` but doesn't want anything from `reallyold/`. So while right now it is trying to drop stuff, I suspect at some point that it will try to re-add them in virtue of being in `music/`, as I've got a loop. + +I want to eliminate this by using the present keyword to disable dropping for stuff in `reallyold/` and `music/`. Here is my attempt, which doesn't work--I am hoping someone can spot what's wrong. + + (present and include=music/*) or (present and include=reallyold/*) or (exclude=reallyold/* and exclude=video/* and exclude= ...) + +Note that music is included by virtue of not being excluded so it should satisfy the third disjunct. Thanks. diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_1_70da012d96ab576151fe3e081ef905d1._comment b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_1_70da012d96ab576151fe3e081ef905d1._comment new file mode 100644 index 000000000..b5fbd345e --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_1_70da012d96ab576151fe3e081ef905d1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="Ever figure this out?" + date="2013-02-24T22:00:40Z" + content=""" +I find it's useful, when stuck on this kind of thing, to run `git annex find` at the command line passing it parts of the expression and making sure it works, and gradually building up to the complete expression. + +You have to do some conversion due to differences between command line and preferred content expression format. For example `git annex find -\( --in here --and --include \"music/*\" -\)` +"""]] diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment new file mode 100644 index 000000000..09b9d8564 --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="comment 2" + date="2013-03-12T09:34:08Z" + content=""" +Thanks for the tip--I will definitely make another attempt at some point. +"""]] diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_3_fab70c642d5aaf26de05270860281030._comment b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_3_fab70c642d5aaf26de05270860281030._comment new file mode 100644 index 000000000..12c49a89c --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_3_fab70c642d5aaf26de05270860281030._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="Impossible?" + date="2013-06-24T17:48:02Z" + content=""" +I have now investigated this further and believe that what I am trying to do is impossible. Suppose we have a file `song.mp3` in both `music/` and `old/` and the special remote's preferred content expression is set-up to prefer `music/` and not to prefer `old/`. So initially, git-annex won't try to upload the content when it scans `old/song.mp3`, but it will when it scans `music/song.mp3`. Fine. Now consider a later scan. On scanning the filename `music/song.mp3` git-annex will suppose the file was dropped from the remote, and then see it would be preferred again so won't drop it. But then when it gets to scanning the filename `old/song.mp3` it will see that it wouldn't be preferred and will drop the content. So we get the loop. + +In order to stop the unwanted drop here, the preferred content expression must prefer \"files in old/* that is also in music/*\" but since preferred content expressions concern filenames without reference to their contents, this is impossible to express. The expression `include=music/* and include=old/*` will never match anything. +"""]] diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment new file mode 100644 index 000000000..1868e9736 --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 4" + date="2013-06-25T17:22:53Z" + content=""" +spwhitton, your analysis is correct -- except this problem was finessed in git-annex version 4.20130621. Now, when using direct mode, it knows that `old/song.mp3` is also `music/song.mp3`, and so it only drops it if the preferred content expression allows dropping both files. + +Still doesn't work in indirect mode, and I think not likely to in the forseeable future. See [[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]] +"""]] diff --git a/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_5_963558ab261d8a6315402d371e8348f9._comment b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_5_963558ab261d8a6315402d371e8348f9._comment new file mode 100644 index 000000000..f7ae3216a --- /dev/null +++ b/doc/forum/preferred_content_settings_for_multiple_symlinks/comment_5_963558ab261d8a6315402d371e8348f9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="comment 5" + date="2013-06-25T19:47:19Z" + content=""" +I assume you mean that if I use direct mode locally, it will get things right. I didn't think a special remote could ever be in direct mode. + +Thank you for the info. I don't want to lose the safeguards of indirect mode just for this, so I'll stick with my inelegant manual preferred content strings for now. +"""]] diff --git a/doc/forum/public-web-frontend.mdwn b/doc/forum/public-web-frontend.mdwn new file mode 100644 index 000000000..d3fdb9b94 --- /dev/null +++ b/doc/forum/public-web-frontend.mdwn @@ -0,0 +1,16 @@ +Hi, + +Use case: I would like to have a "Public" top-level directory in my annex, which gets files in there published over HTTP on a particular server. + +How I see doing this: + +1. Put my annex to an http server with exported-over-http `/Public/` directory. +2. Configure a `post-update` hook with the following: + + $ git annex fix + +3. Push files on `/Public/` to that annex. + +Does it make sense? If yes, are there any gotchas I should beware of? + +Thanks. diff --git a/doc/forum/public-web-frontend/comment_1_c73bd2dfe020c25eaad1c0707dd2db01._comment b/doc/forum/public-web-frontend/comment_1_c73bd2dfe020c25eaad1c0707dd2db01._comment new file mode 100644 index 000000000..b9f6c9867 --- /dev/null +++ b/doc/forum/public-web-frontend/comment_1_c73bd2dfe020c25eaad1c0707dd2db01._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="should work.." + date="2012-08-05T17:18:47Z" + content=""" +I see no need for `git annex fix` here. + +Web server default configurations may not allow following symlinks outside the web server document root. On apache, it can be enabled with `Options FollowSymLinks` +"""]] diff --git a/doc/forum/public-web-frontend/comment_2_0026d7be6b17e50d86b3b54985882f80._comment b/doc/forum/public-web-frontend/comment_2_0026d7be6b17e50d86b3b54985882f80._comment new file mode 100644 index 000000000..bfb60ede1 --- /dev/null +++ b/doc/forum/public-web-frontend/comment_2_0026d7be6b17e50d86b3b54985882f80._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmdLmVxigDvxiGhnQ34xhyAaxl0CRRe9gs" + nickname="Bryan" + subject="Alternate version - smarter integration with other remotes/web special remote?" + date="2013-03-03T14:19:12Z" + content=""" +I love the idea of pushing files to \"visible\" using annex, but I'm wondering how difficult to would be to make this even fancier. + +For instance, if there are files that were originally imported from the web special remote (and have http:// prefixes, since that's not guaranteed), and they're not actually in the pushed annex, generate a redirect for all of them and write a special remote-local .htaccess file. + +Or, similarly, allow each remote to have some metadata which specifies what, if any, the URL prefix for a directory in annex is. Then, whenever you update a web remote, the auto-generated redirects list could contain not only files not present but with web-remote locations, but also other remotes which have the file under a web-visible path prefix. Bonus for allowing URL prefixes for S3-style remotes that are not encrypted. + +My use case for this sort of fancy is that I have a large server with gobs of space but on a personal (slower) internet connection, and a much smaller hosted instance with much faster bandwidth. With this smarts, I could push and pull large/expected high traffic files to the higher bandwidth/smaller machine ahead of, say, announcing a new feature or sharing a link to a video via e-mail.. or even reactively if the lower-bandwidth server is getting overwhelmed. +"""]] diff --git a/doc/forum/public__44___read_only_annex_without_location_tracking.mdwn b/doc/forum/public__44___read_only_annex_without_location_tracking.mdwn new file mode 100644 index 000000000..88f8b21c2 --- /dev/null +++ b/doc/forum/public__44___read_only_annex_without_location_tracking.mdwn @@ -0,0 +1,7 @@ +I would like to use a public, read only annex to publish photos. I have a server, running gitolite, with git-annex setup, which I use successfully to sync content between my own devices. + +But, with a public annex, I would like the view of the repository available from the server to be that only the server has the content, and not to have, or give out any of the location tracking information about any other annexes? + +A more concrete example would be, how do I get a photo in to git annex locally, and then push this to the server for public access, without publishing information about my local repository? + +From the public annexes I have looked at, this does not appear to be done. So I am unsure if this is even possible, however it seems a desirable thing to do? diff --git a/doc/forum/public__44___read_only_annex_without_location_tracking/comment_1_47262f048a87fd6b781090f880a9bf99._comment b/doc/forum/public__44___read_only_annex_without_location_tracking/comment_1_47262f048a87fd6b781090f880a9bf99._comment new file mode 100644 index 000000000..99ed6f25a --- /dev/null +++ b/doc/forum/public__44___read_only_annex_without_location_tracking/comment_1_47262f048a87fd6b781090f880a9bf99._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-03T19:35:21Z" + content=""" +There's not a way to do it yet. + +The fundamental problem is that there is a variety of information stored on the git-annex branch, including location tracking information that you don't want (locations on non-public repositories), location tracking information you do want (locations on public repositories), urls, metadata, repository configurations and descriptions (some for public and some for non-public repositories). It seems fairly hard to draw a line. And once a line is drawn, there would be two diverged git-annex branches on the public and private repos, and the private repo would need to synthesize an updated version of the public branch every time it synced. + +Instead, the last time this came up, I added the remote..annex-readonly setting. This allows for at least having a private repository (or a whole network of repositories that all communicate together but remain private) that pulls changes from a public repo, but avoids making changes to it. Certainly not a complete solution, since changes have to be contributed to the public repo in some out-of-band way, like perhaps using git-format-patch and git-am. +"""]] diff --git a/doc/forum/public__44___read_only_annex_without_location_tracking/comment_2_ec3ff6487c9e5c89c7e508d72518bd50._comment b/doc/forum/public__44___read_only_annex_without_location_tracking/comment_2_ec3ff6487c9e5c89c7e508d72518bd50._comment new file mode 100644 index 000000000..ad74e6866 --- /dev/null +++ b/doc/forum/public__44___read_only_annex_without_location_tracking/comment_2_ec3ff6487c9e5c89c7e508d72518bd50._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="cbaines" + ip="82.19.50.118" + subject="comment 2" + date="2014-07-03T20:13:20Z" + content=""" +Thanks for your response. + +The method you describe sounds like it might just do. I'll have a try, and see if it works out :) +"""]] diff --git a/doc/forum/pulling_from_encrypted_remote.mdwn b/doc/forum/pulling_from_encrypted_remote.mdwn new file mode 100644 index 000000000..e9486b597 --- /dev/null +++ b/doc/forum/pulling_from_encrypted_remote.mdwn @@ -0,0 +1,12 @@ +Is there a way to pull from an encrypted remote? + +Use case: + +1. Have annex in an encrypted public rsync remote +2. Have USB stick with PGP keys (but not the annex repository) +3. Get to a new computer +4. Set up a new annex using the PGP keys I have. + +1-3 work fine :) However, 4'th is the issue: + +How would I do `git pull ` for an encrypted remote? Is it possible? diff --git a/doc/forum/pulling_from_encrypted_remote/comment_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment b/doc/forum/pulling_from_encrypted_remote/comment_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment new file mode 100644 index 000000000..2da698f4a --- /dev/null +++ b/doc/forum/pulling_from_encrypted_remote/comment_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-07-10T18:14:31Z" + content=""" +You just need to `git clone` the existing repository and make sure the `git remote`s are setup. + +the 'rsync remote' is not actually the annex, it's just a collection of encrypted files with obfuscated names. You need a copy of the actual repository to restore the files. +"""]] diff --git a/doc/forum/pulling_from_encrypted_remote/comment_2_8d0db2ff65ce935c6e68044a3e0721a8._comment b/doc/forum/pulling_from_encrypted_remote/comment_2_8d0db2ff65ce935c6e68044a3e0721a8._comment new file mode 100644 index 000000000..8fd73cd92 --- /dev/null +++ b/doc/forum/pulling_from_encrypted_remote/comment_2_8d0db2ff65ce935c6e68044a3e0721a8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="Thats a fair solution" + date="2012-07-22T13:51:25Z" + content=""" +Until you don't have(access to) an existing repository to clone from. + +I really hope you revisit this when you come to the encryption part of the assistant. + +Btw, I also run FreeBSD if you need a tester on that at some point. + +Sincerely +Tobias Ussing + +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow.mdwn b/doc/forum/pure_git-annex_only_workflow.mdwn new file mode 100644 index 000000000..36648a905 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow.mdwn @@ -0,0 +1,46 @@ +I’m using git annex to manage my movie collection on various devices – my laptop, a NSLU tucked away somewhere with lots of space, some external hard drives. For this use case, I do not need the full power of git as a version control system, so having to run "git commit" and coming up with commit messages is annoying. Also, this makes sense for a version control system, but not for my media collection: + + $ git annex add Hot\ Fuzz\ -\ English.mkv + add Hot Fuzz - English.mkv (checksum...) ok + (Recording state in git...) + $ git commit -m 'another movie added' + [master 851dc8a] another movie added + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 00 Noch nicht gesehen/Hot Fuzz - English.mkv + $ git push jeff + Counting objects: 38, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (20/20), done. + Writing objects: 100% (26/26), 2.00 KiB, done. + Total 26 (delta 11), reused 0 (delta 0) + remote: error: refusing to update checked out branch: refs/heads/master + remote: error: By default, updating the current branch in a non-bare repository + remote: error: is denied, because it will make the index and work tree inconsistent + remote: error: with what you pushed, and will require 'git reset --hard' to match + remote: error: the work tree to HEAD. + remote: error: + remote: error: You can set 'receive.denyCurrentBranch' configuration variable to + remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into + remote: error: its current branch; however, this is not recommended unless you + remote: error: arranged to update its work tree to match what you pushed in some + remote: error: other way. + remote: error: + remote: error: To squelch this message and still keep the default behaviour, set + remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. + To jeff:/mnt/media/Movies + ! [rejected] git-annex -> git-annex (non-fast-forward) + ! [remote rejected] master -> master (branch is currently checked out) + error: failed to push some refs to 'jeff:/mnt/media/Movies' + To prevent you from losing history, non-fast-forward updates were rejected + Merge the remote changes (e.g. 'git pull') before pushing again. See the + 'Note about fast-forwards' section of 'git push --help' for details. + +It seems that to successfully make the new files known to the other side, I have to log into jeff and pull _from_ my current machine. + +What I would like to have is that + +* git annex add does not require a commit afterwards. +* Changes to the files are automatically picked up with the next git-annex call (similar to how etckeeper works). +* Commands "git annex push" and "git annex pull" that will sync the metadata (i.e. the list of files) in both directions without further manual intervention, at least not until the two repositories have diverged in a way that is not possible to merge sensible. + +Summay: git-annex is great. git is not always. Please make it possible to use git annex without having to use git. diff --git a/doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment b/doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment new file mode 100644 index 000000000..dc499cbc9 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="Finally some code" + date="2011-12-29T19:58:31Z" + content=""" +The repository at http://git.nomeata.de/?p=git-annex.git;a=summary contains changes to Commands/Sync.hs (and to the manpage) that implements this behavior. The functionality should be fine; the progress output is not very nice yet, but I’m not sure if I really understood the various Command types. It also should be more easily discoverable how to activate the behavior (by running \"git branch synced/master\") by providing a helpful message, at least unless git annex init creates the branch by default. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment b/doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment new file mode 100644 index 000000000..30932e301 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 11" + date="2011-12-30T21:49:06Z" + content=""" +OMG, my first sizable haskell patch! + +So trying this out.. + +In each repo I want to sync, I first `git branch synced/master` + +Then in each repo, I found I had to pull from each of its remotes, to get the tracking branches that `defaultSyncRemotes` looks for to know those remotes are syncable. This was the surprising thing for me, I had expected sync to somehow work out which remotes were syncable without my explicit pull. And it was not very obvious that sync was not doing its thing before I did that, since it still does a lot of \"stuff\". + +Once set up properly, `git annex sync` fetches from each remote, merges, and then pushes to each remote that has a synced branch. Changes propigate around even when some links are one-directional. Cool! + +So it works fine, but I think more needs to be done to make setting up syncing easier. Ideally, all a user would need to do is run \"git annex sync\" and it syncs from all remotes, without needing to manually set up the synced/master branch. + +While this would lose the ability to control which remotes are synced, I think that being able to `git annex sync origin` and only sync from/to origin is sufficient, for the centralized use case. + +--- + +Code review: + +Why did you make `branch` strict? + +There is a bit of a bug in your use of Command.Merge.start. The git-annex branch merge code only runs once per git-annex run, and often this comes before sync fetches from the remotes, leading to a push conflict. I've fixed this in my \"sync\" branch, along with a few other minor things. + +`mergeRemote` merges from `refs/remotes/foo/synced/master`. But that will only be up-to-date if `git annex sync` has recently been run there. Is there any reason it couldn't merge from `refs/remotes/foo/master`? +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment b/doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment new file mode 100644 index 000000000..5b0259b97 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 12" + date="2011-12-30T23:45:57Z" + content=""" +I have made a new `autosync` branch, where all that the user needs to do is run `git annex sync` and it automatically sets up the synced/master branch. I find this very easy to use, what do you think? + +Note that `autosync` is also pretty smart about not running commands like \"git merge\" and \"git push\" when they would not do anything. So you may find `git annex sync` not showing all the steps you'd expect. The only step a sync always performs now is pulling from the remotes. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment b/doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment new file mode 100644 index 000000000..84515ec6c --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 13" + date="2011-12-31T18:34:31Z" + content=""" +I have merged my autosync branch, the improved sync command will be in this year's last git-annex release! +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment b/doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment new file mode 100644 index 000000000..194415dfb --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 14" + date="2012-01-02T14:02:04Z" + content=""" +Sorry for not replying earlier, but my non-mailinglist-communications-workflows are suboptimal :-) + +> Then in each repo, I found I had to pull from each of its remotes, to get the tracking branches that defaultSyncRemotes looks for to know those remotes are syncable. This was the surprising thing for me, I had expected sync to somehow work out which remotes were syncable without my explicit pull. And it was not very obvious that sync was not doing its thing before I did that, since it still does a lot of \"stuff\". + +Right. But \"git fetch\" ought to be enough. + +Personally, I’d just pull and push everywhere, but you pointed out that it ought to be manageable. The existence of the synced/master branch is the flag that indicates this, so you need to propagate this once. Note that if the branch were already created by \"git annex init\", then this would not be a problem. + +It is not required to use \"git fetch\" once, you can also call \"git annex sync \" once with the remote explicitly mentioned; this would involve a fetch. + +> While this would lose the ability to control which remotes are synced, I think that being able to git annex sync origin and only sync from/to origin is sufficient, for the centralized use case. + +I’d leave this decision to you. But I see that you took the decision already, as your code now creates the synced/master branch when it does not exist (e290f4a8). + +> Why did you make branch strict? + +Because it did not work otherwise :-). It uses pipeRead, which is lazy, and for some reason git and/or your utility functions did not like that the output of the command was not consumed before the next git command was called. I did not investigate further. For better code, I’d suggest to add a function like pipeRead that completely reads the git output before returning, thus avoiding any issues with lazyIO. + +> mergeRemote merges from refs/remotes/foo/synced/master. But that will only be up-to-date if git annex sync has recently been run there. Is there any reason it couldn't merge from refs/remotes/foo/master? + +Hmm, good question. It is probably save to merge from both, and push only to synced/master. But which one first? synced/master can be ahead if the repo was synced to from somewhere else, master can be ahead if there are local changes. Maybe git merge should be called on all remote heads simultaniously, thus generating only one commit for the merge. I don’t know how well that works in practice. + +Thanks for including my code, +Joachim + +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment b/doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment new file mode 100644 index 000000000..a526d5db8 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 15" + date="2012-01-02T16:01:49Z" + content=""" +With a lazy branch, I get \"git-annex: no branch is checked out\". Weird.. my best guess is that it's because this is running at the seek stage, which is unusual, and the value is not used until a later stage and so perhaps the git command gets reaped by some cleanup code before its output is read. + +(pipeRead is lazy because often it's used to read large quantities of data from git that are processed progressively.) + +I did make it merge both branches, separately. It would be possible to do one single merge, but it's probably harder for the user to recover if there are conflicts in an octopus merge. The order of the merges does not seem to me to matter much, barring conflicts it will work either way. Dealing with conflicts during sync is probably a weakness of all this; after the first conflict the rest of the sync will continue failing. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment b/doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment new file mode 100644 index 000000000..def1794a3 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-09T22:56:11Z" + content=""" +First, you need a bare git repository that you can push to, and pull from. This simplifies most git workflow. + +Secondly, I use [mr](http://kitenet.net/~joey/code/mr/), with this in `.mrconfig`: + +
+[DEFAULT]
+lib =
+        annexupdate() {
+                git commit -a -m update || true
+                git pull \"$@\"
+                git annex merge
+                git push || true
+        }
+
+[lib/sound]
+update = annexupdate
+[lib/big]
+update = annexupdate
+
+ +Which makes \"mr update\" in repositories where I rarely care about git details take care of syncing my changes. + +I also make \"mr update\" do a \"git annex get\" of some files in some repositories that I want to always populate. git-annex and mr go well together. :) + +Perhaps my annexupdate above should be available as \"git annex sync\"? +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment b/doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment new file mode 100644 index 000000000..473a0287d --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 2" + date="2011-12-10T16:28:29Z" + content=""" +Thanks for the tips so far. I guess a bare-only repo helps, but as well is something that I don’t _need_ (for my use case), any only have to do because git works like this. + +Also, if I have a mobile device that I want to push to, then I’d have to have two repositories on the device, as I might not be able to reach my main bare repository when traveling, but I cannot push to the „real“ repo on the mobile device from my computer. I guess I am spoiled by darcs, which will happily push to a checked out +remote repository, updating the checkout if possible without conflict. + +If I introduce a central bare repository to push to and from; I’d still have to have the other non-bare repos as remotes, so that git-annex will know about them and their files, right? + +I’d appreciate a \"git annex sync\" that does what you described (commit all, pull, merge, push). Especially if it comes in a \"git annex sync --all\" variant that syncs all reachable repositories. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment b/doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment new file mode 100644 index 000000000..9b6e6d7c4 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-12-10T19:43:04Z" + content=""" +Git can actually push into a non-bare repository, so long as the branch you change there is not a checked out one. Pushing into `remotes/$foo/master` and `remotes/$foo/git-annex` would work, however determining the value that the repository expects for `$foo` is something git cannot do on its own. And of course you'd still have to `git merge remotes/$foo/master` to get the changes. + +Yes, you still keep the non-bare repos as remotes when adding a bare repository, so git-annex knows how to get to them. + +I've made `git annex sync` run the simple script above. Perhaps it can later be improved to sync all repositories. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment b/doc/forum/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment new file mode 100644 index 000000000..1ac9e798a --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 4" + date="2011-12-13T18:16:08Z" + content=""" +I thought about this some more, and I think I have a pretty decent solution that avoids a central bare repository. Instead of pushing to master (which git does not like) or trying to guess the remote branch name on the other side, there is a well-known branch name, say git-annex-master. Then a sync command would do something like this (untested): + + git commit -a -m 'git annex sync' # ideally with a description derived from the diff + git merge git-annex-master + git pull someremote git-annex-master # for all reachable remotes. Or better to use fetch and then merge everything in one command? + git branch -f git-annex-master # (or checkout git-annex-master, merge master, checkout master, but since we merged before this should have the same effect + git annex merge + git push someremote git-annex-master # for all reachable remotes + +The nice things are: One can push to any remote repository, and thus avoid the issue of pushing to a portable device; the merging happens on the master branch, so if it fails to merge automatically, regular git foo can resolve it, and all changes eventually reach every repository. + +What do you think? + +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._comment b/doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._comment new file mode 100644 index 000000000..0847daae9 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 5" + date="2011-12-13T18:47:18Z" + content=""" +After some experimentation, this seems to work better: + + git commit -a -m 'git annex sync' + git merge git-annex-master + for remote in $(git remote) + do + git fetch $remote + git merge $remote git-annex-master + done + git branch -f git-annex-master + git annex merge + for remote in $(git remote) + do + git push $remote git-annex git-annex-master + done + +Maybe this approach can be enhance to skip stuff gracefully if there is no git-annex-master branch and then be added to what \"git annex sync\" does, this way those who want to use the feature can do so by running \"git branch git-annex-master\" once. Or, if you like this and want to make it default, just make git-annex-init create the git-annex-master branch :-) +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment b/doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment new file mode 100644 index 000000000..fc66fbb8e --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-12-13T20:53:23Z" + content=""" +It would be clearer to call \"git-annex-master\" \"synced/master\" (or really \"synced/$current_branch\"). That does highlight that this method of syncing is not particularly specific to git-annex. + +I think this would be annoying to those who do use a central bare repository, because of the unnecessary pushing and pulling to other repos, which could be expensive to do, especially if you have a lot of interconnected repos. So having a way to enable/disable it seems best. + +Maybe you should work up a patch to Command/Sync.hs, since I know you know haskell :) +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment b/doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment new file mode 100644 index 000000000..753a2af16 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 7" + date="2011-12-18T12:08:51Z" + content=""" +I agree on the naming suggestions, and that it does not suit everybody. Maybe I’ll think some more about it. The point is: I’m trying to make live easy for those who do not want to manually create some complicated setup, so if it needs configuration, it is already off that track. But turning the current behavior into something people have to configure is also not well received by the users. + +Given that \"git annex sync\" is a new command, maybe it is fine to have this as a default behavior, and offer an easy way out. The easy way out could be one of two flags that can be set for a repo (or a remote): + +* \"central\", which makes git annex sync only push and pull to and that repo (unless a different remote is given on the command line) +* \"unsynced\", which makes git annex sync skip the repo. + +Maybe central is enough. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment b/doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment new file mode 100644 index 000000000..67953860a --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 8" + date="2011-12-19T18:29:01Z" + content=""" +I don't mind changing the behavior of git-annex sync, certainly.. + +Looking thru git's documentation, I found some existing configuration that could be reused following your idea. +There is a remote.name.skipDefaultUpdate and a remote.name.skipFetchAll. Though both have to do with fetches, not pushes. +Another approach might be to use git's remote group stuff. +"""]] diff --git a/doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment b/doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment new file mode 100644 index 000000000..de656d662 --- /dev/null +++ b/doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 9" + date="2011-12-19T22:56:26Z" + content=""" +Another option that would please the naive user without hindering the more advanced user: \"git annex init\", by default, creates a synced/master branch. \"git annex sync\" will pull from every /sync/master branch it finds, and also push to any /sync/master branch it finds, but will not create any. So by default (at least for new users), this provides simple one-step syncing. + +Advanced users can disable this per-repo by just deleting the synced/master branch. Presumably the logic will be: Every repo that should not be pushed to, because it has access to some central repo, should not have a synced/master branch. Every other repo, including the (or one of the few) central repos, will have the branch. + +This is not the most expressive solution, as it does not allow configuring syncing between arbitrary pairs of repos, but it feels like a good compromise between that and simplicity and transparency. + +I think it's about time that I provide less talk and more code. I’ll see when I find the time :-) +"""]] diff --git a/doc/forum/purge_files_with_no_copies.mdwn b/doc/forum/purge_files_with_no_copies.mdwn new file mode 100644 index 000000000..5761d9290 --- /dev/null +++ b/doc/forum/purge_files_with_no_copies.mdwn @@ -0,0 +1,3 @@ +Hi guys, as a result of some improper handling I am left with a couple of files with no copies scattered all around my repos. Now, while my data loss is unfortunate, it is not tragic. What I would like to do now is to purge all of these files without having to look for them one by one. Is there any easy way to do this? + +Cheers diff --git a/doc/forum/purge_files_with_no_copies/comment_1_12b578689eb8d5d38c06261ec65e2109._comment b/doc/forum/purge_files_with_no_copies/comment_1_12b578689eb8d5d38c06261ec65e2109._comment new file mode 100644 index 000000000..0ea81ecfe --- /dev/null +++ b/doc/forum/purge_files_with_no_copies/comment_1_12b578689eb8d5d38c06261ec65e2109._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 1" + date="2013-09-19T20:59:32Z" + content=""" +This will output all files in your repository that git-annex thinks have no copies left: + +`git annex find --not --copies=1` + +Piping it to git rm is left as an excercise for the reader.. +"""]] diff --git a/doc/forum/question_about_assistant_and___47__archive__47__.mdwn b/doc/forum/question_about_assistant_and___47__archive__47__.mdwn new file mode 100644 index 000000000..af8cee4c9 --- /dev/null +++ b/doc/forum/question_about_assistant_and___47__archive__47__.mdwn @@ -0,0 +1,22 @@ +I have a git-annex repository located at ~/annex which has been set up using git-annex assistant. + +This repository is configured as "client". + +My other repository is a huge USB drive configured as "full archive". + +Now everything seems to work fine except there is one thing I don't understand: + + alip@client:~/annex> git-annex whereis ./archive/kus.png + whereis archive/kus.png (1 copy) + e79a4cf6-4c48-4833-93de-98ba6eb625d6 -- deniz + ok + +Fine, there is only one copy according to git-annex but the file is still present +in **this** client repository: + + alip@client:> du -hs ~/annex/archive + 20G /home/alip/annex/archive/ + +How do I free this space? Am I supposed to call git-annex drop manually? + +git-annex version: 3.20130124 diff --git a/doc/forum/question_about_assistant_and___47__archive__47__/comment_1_97890e26072af9277144651e3fdcada0._comment b/doc/forum/question_about_assistant_and___47__archive__47__/comment_1_97890e26072af9277144651e3fdcada0._comment new file mode 100644 index 000000000..2736016c5 --- /dev/null +++ b/doc/forum/question_about_assistant_and___47__archive__47__/comment_1_97890e26072af9277144651e3fdcada0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-01-30T18:44:52Z" + content=""" +Give this a try: + +http://git-annex.branchable.com/walkthrough/unused_data/ +"""]] diff --git a/doc/forum/question_about_assistant_and___47__archive__47__/comment_2_542bf265e35a976ac76767762d67d617._comment b/doc/forum/question_about_assistant_and___47__archive__47__/comment_2_542bf265e35a976ac76767762d67d617._comment new file mode 100644 index 000000000..00cc06374 --- /dev/null +++ b/doc/forum/question_about_assistant_and___47__archive__47__/comment_2_542bf265e35a976ac76767762d67d617._comment @@ -0,0 +1,104 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 2" + date="2013-01-30T19:14:48Z" + content=""" +I'm seeing the same thing and I think it's a bug. Everything I'm reading says that when you move a file from anywhere into an archive directory, it's supposed to upload it to an archive and drop it locally. + +If I copy the file from outside my annex into the archive directory it will usually do exactly that and I'll end up with a symlink, but not always. Sometimes I'll end up with a file. + +If I move the file from within my annex into the archive, everything gets confused. Here is an example: + + [jchu@april annex(master)]$ mkdir testdir + [jchu@april annex(master)]$ cd testdir/ + [jchu@april testdir(master)]$ ls + [jchu@april testdir(master)]$ cat > test.txt << EOF + > I have a file. It is very nice. + > EOF + [jchu@april testdir(master)]$ ls -l + total 4 + -rw-r--r-- 1 jchu users 33 Jan 30 10:53 test.txt + [jchu@april testdir(master)]$ mkdir archive + [jchu@april testdir(master)]$ mv test.txt archive/ + [jchu@april testdir(master)]$ ls -l + total 0 + drwxr-xr-x 2 jchu users 21 Jan 30 10:54 archive + [jchu@april testdir(master)]$ ls -l archive/ + total 4 + -rw-r--r-- 1 jchu users 33 Jan 30 10:53 test.txt + [jchu@april testdir(master)]$ # Shouldn't this be a symlink? + [jchu@april testdir(master)]$ git show + commit 2fb2cba3fae98e0e0b8b7891b1af0cc655754896 + Author: Jason Chu + Date: Wed Jan 30 10:54:11 2013 -0800 + + diff --git a/testdir/archive/test.txt b/testdir/archive/test.txt + new file mode 120000 + index 0000000..5bd7982 + --- /dev/null + +++ b/testdir/archive/test.txt + @@ -0,0 +1 @@ + +../../.git/annex/objects/x5/Q1/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361dd0d37fc3dab.txt/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad3 + \ No newline at end of file + [jchu@april testdir(master)]$ git show HEAD^ + commit 410f58f782348599d42496db2c9b21cfb2e59124 + Author: Jason Chu + Date: Wed Jan 30 10:54:10 2013 -0800 + + diff --git a/testdir/test.txt b/testdir/test.txt + deleted file mode 120000 + index 82343e3..0000000 + --- a/testdir/test.txt + +++ /dev/null + @@ -1 +0,0 @@ + -../.git/annex/objects/x5/Q1/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361dd0d37fc3dab.txt/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361d + \ No newline at end of file + +From what I can see here, the file was archived properly and the delete in git was issued correctly. The daemon.log shows me that the file was uploaded correctly when it was initially created and then added to the archive directory, but I don't see a direct delete in the log file (even though the git log shows me it happened). + +Now on to the really weird part. If I restart the daemon (or there are other ways to trigger it, but this seems to be the easiest for me), I see that log lines that say testdir/archive/test.txt was dropped (good) but then testdir/test.txt is re-downloaded and appears back in that directory. I wanted the file deleted from testdir, why is it back?!? Since it gets redownloaded and readded, my new logs look like this: + + [jchu@april testdir(master)]$ git show + commit 850464dd2f8ae5cd407a214543afab668d4b34eb + Author: Jason Chu + Date: Wed Jan 30 11:00:03 2013 -0800 + + diff --git a/testdir/archive/test.txt b/testdir/archive/test.txt + deleted file mode 120000 + index 5bd7982..0000000 + --- a/testdir/archive/test.txt + +++ /dev/null + @@ -1 +0,0 @@ + -../../.git/annex/objects/x5/Q1/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361dd0d37fc3dab.txt/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad3 + \ No newline at end of file + [jchu@april testdir(master)]$ git show HEAD^ + commit 8cf9019e66e5a2cb0478e965fda352c742972591 + Author: Jason Chu + Date: Wed Jan 30 11:00:00 2013 -0800 + + diff --git a/testdir/test.txt b/testdir/test.txt + new file mode 120000 + index 0000000..82343e3 + --- /dev/null + +++ b/testdir/test.txt + @@ -0,0 +1 @@ + +../.git/annex/objects/x5/Q1/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361dd0d37fc3dab.txt/SHA256E-s33--1859a57b635b0702dd3813dd7637f11842730b0464c35a4ad361d + \ No newline at end of file + +And the filesystem looks like this: + + [jchu@april testdir(master)]$ ls -lR + .: + total 4 + drwxr-xr-x 2 jchu users 21 Jan 30 11:00 archive + -rw-r--r-- 1 jchu users 33 Jan 30 11:00 test.txt + + ./archive: + total 4 + -rw-r--r-- 1 jchu users 33 Jan 30 11:00 test.txt + +I have 3 remotes set up: a usb drive (client, it was created like that directly by annex when I created a Removable drive repo, it's a bare repo), s3 (archive), and nas (a remote server repo, that connects over ssh and uses rsync). I thought maybe that the usb drive still had a record of testdir/test.txt existing, but the logs in refs/heads/synced/master match. + +It's as if the git annex thinks that the original content is still within a non-archive directory, so the data can't be dropped, but everywhere I look the references to that content are gone. The only way I've found to fix this is to convert to indirect mode and delete the symlinks from there (which seems to work better). It seems to be an interaction between direct mode, the archive, and maybe my filesystem (xfs). +"""]] diff --git a/doc/forum/question_about_assistant_and___47__archive__47__/comment_3_bafe99159df2adcd5fecc0d67bbf05a5._comment b/doc/forum/question_about_assistant_and___47__archive__47__/comment_3_bafe99159df2adcd5fecc0d67bbf05a5._comment new file mode 100644 index 000000000..b1c9e1774 --- /dev/null +++ b/doc/forum/question_about_assistant_and___47__archive__47__/comment_3_bafe99159df2adcd5fecc0d67bbf05a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 3" + date="2013-02-05T17:46:56Z" + content=""" +@alip I've just fixed a bug which made the assistant get location tracking info wrong for files it added in direct mode. That probably explains what you're seeing. You can run `git annex fsck` to fix the location log info, and if you restart the assistant it'll probably then realize the files are locally present and drop them. Of course, the USB drive has to be connected for that to work; git-annex needs to verify the files have been moved to it before it can drop them. +"""]] diff --git a/doc/forum/question_about_assistant_and___47__archive__47__/comment_4_e77fa2992d9302a49a05f514c81612ca._comment b/doc/forum/question_about_assistant_and___47__archive__47__/comment_4_e77fa2992d9302a49a05f514c81612ca._comment new file mode 100644 index 000000000..3f78b4813 --- /dev/null +++ b/doc/forum/question_about_assistant_and___47__archive__47__/comment_4_e77fa2992d9302a49a05f514c81612ca._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 4" + date="2013-02-05T19:05:49Z" + content=""" +@Jason That is a bug. Please don't report what are obviously bugs in the forum! + +I've posted a bug report about it here: [[bugs/direct_mode_renames]] +"""]] diff --git a/doc/forum/rebuild_location_log_from_encrypted_remote.mdwn b/doc/forum/rebuild_location_log_from_encrypted_remote.mdwn new file mode 100644 index 000000000..bf3f0e830 --- /dev/null +++ b/doc/forum/rebuild_location_log_from_encrypted_remote.mdwn @@ -0,0 +1,35 @@ +Hi, + +I apologize, but I can't retrace my steps, so my problem is not replicable. The current situation is: 1 main repo and 1 directory/encrypted special remote. From the main repo, I see 0 available copy of the files I need. But when I do a fsck I do see the file. The problem is that the location log does not seem to get fixed after fsck, as I cannot use git-annex get to obtain the file, even after the fsck command. + +Do you have any suggestions for next diagnostic/repair steps? + +Thanks a lot for your time and answer! + +Vincent + +macbook% git annex fsck foo.zip --from needle +fsck foo.zip (gpg) +You need a passphrase to unlock the secret key for +user: “me ” +2048-bit RSA key, ID ???????, created 2013-01-11 (main key ID ????????) + +(checking needle...) +GPGHMACSHA1--d7036fd17214c06c83d53479dcec9554a7dc2109 + 13815014 100% 14.16MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 13816832 bytes received 42 bytes 9211249.33 bytes/sec +total size is 13815014 speedup is 1.00 +(fixing location log) (checksum...) + ** No known copies exist of foo.zip +failed +(Recording state in git...) +git-annex: fsck: 1 failed + + +macbook% git annex get foo.zip +get foo.zip (not available) + No other repository is known to contain the file. +failed +git-annex: get: 1 failed +macbook% diff --git a/doc/forum/rebuild_location_log_from_encrypted_remote/comment_1_f84f955fed7b96ae6208b6ff2ec650cd._comment b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_1_f84f955fed7b96ae6208b6ff2ec650cd._comment new file mode 100644 index 000000000..af3a41159 --- /dev/null +++ b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_1_f84f955fed7b96ae6208b6ff2ec650cd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-01T19:59:16Z" + content=""" +I think you should try to run `git annex copy --from needle`, which will be able to get the files if needle has them, even if the location log is busted. + +(Sometimes people complain that `git annex copy` goes and checks a remote, which can be unncessarily slow, rather than just trusting the location log ... but this is why it does it!) + +From what I can tell, the fsck downloads some file from the remote, but the download is not entirely successful. One possibility is that it downloads a file, but the file fails to be decrypted, either because you don't have the right encyption key, or because the encrypted file has actually gotten corrupted on the remote. It might be that the same problem will affect `git annex copy --from needle`, but if so it should be more clear what's happening. +"""]] diff --git a/doc/forum/rebuild_location_log_from_encrypted_remote/comment_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment new file mode 100644 index 000000000..10b1c038e --- /dev/null +++ b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLD-g4d-EGXD5KJh1kVKnRX0a9dTnEigg" + nickname="Vincent" + subject="comment 2" + date="2013-12-02T01:28:18Z" + content=""" +Thanks a lot for the quick response! Unfortunately, copy is just silent and does not copy the files over. + +I don't want to waste more of your time on this. I just wish I had kept better track of the steps I took to get myself into this mess... +"""]] diff --git a/doc/forum/rebuild_location_log_from_encrypted_remote/comment_3_06a73ca3dc73399ff000b642cca72de7._comment b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_3_06a73ca3dc73399ff000b642cca72de7._comment new file mode 100644 index 000000000..9cd442427 --- /dev/null +++ b/doc/forum/rebuild_location_log_from_encrypted_remote/comment_3_06a73ca3dc73399ff000b642cca72de7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-02T19:53:11Z" + content=""" +Hmm, it seems I was wrong about copy --from not checking the location log. It does.. Probably to avoid large copies trying to copy a lot of files that are not present in a remote. + +I have now made `git annex copy --force --from remote` do what I said it would do, and that should work in your situation, I think. +"""]] diff --git a/doc/forum/receiving_indirect_renames_on_direct_repo___63__.mdwn b/doc/forum/receiving_indirect_renames_on_direct_repo___63__.mdwn new file mode 100644 index 000000000..51a3aa7b6 --- /dev/null +++ b/doc/forum/receiving_indirect_renames_on_direct_repo___63__.mdwn @@ -0,0 +1,254 @@ +I've been playing with a mixed setup, and I frequentely end up with conflicts which can be ascribed to mixing direct windows repos with indirect linux one(s), and making renames on the indirect ones. +Possibly someone can address what I miss of the git-annex/git interaction. + +#### versions involved #### + +linux: git-annex version: 4.20131024 +win: git-annex version: 4.20131024-gca7b71e + +### Steps to reproduce behaviour ### + +###### 1. On linux, i setup bare origin "casa" and client repo "local": + + [michele@home ~]$ git init --bare casa + Initialized empty Git repository in /home/sambahome/michele/casa/ + [michele@home ~]$ cd casa + [michele@home casa]$ git annex init casa + init casa ok + (Recording state in git...) + [michele@home ~]$ cd ..; git clone casa local + Cloning into 'local'... + done. + warning: remote HEAD refers to nonexistent ref, unable to checkout. + [michele@home ~]$ cd local; git annex init local + init local ok + (Recording state in git...) + [michele@home local]$ echo lintest > lintest + [michele@home local]$ git annex add lintest + add lintest (checksum...) ok + (Recording state in git...) + [michele@home local]$ git annex sync + (merging origin/git-annex into git-annex...) + (Recording state in git...) + commit + ok + pull origin + ok + push origin + Counting objects: 18, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (12/12), done. + Writing objects: 100% (16/16), 1.48 KiB | 0 bytes/s, done. + Total 16 (delta 1), reused 0 (delta 0) + To /home/sambahome/michele/casa + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master + ok + ``` + +###### 2. On windows I clone origin, and I sync empty + + ```cmd + M:\>git clone ssh://michele@home/home/michele/casa win + Cloning into 'win'... + remote: Counting objects: 20, done. + remote: Compressing objects: 100% (15/15), done. + remote: Total 20 (delta 3), reused 0 (delta 0) + Receiving objects: 100% (20/20), done. + Resolving deltas: 100% (3/3), done. + M:\>cd win + M:\win>git annex status + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + repository mode: direct + trusted repositories: (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + 0 + semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 598ecfac-087d-49a3-b48d-beafd0d71805 -- origin (casa) + b2699c17-d0bc-40a0-b447-a64ad109b2a2 -- here (ALICUDI:M:\win) + bd4166eb-296b-4f0f-a3be-6c25e4c7cbb0 -- local + untrusted repositories: 0 + transfers in progress: none + available local disk space: unknown + local annex keys: 0 + local annex size: 0 bytes + known annex keys: 1 + known annex size: 8 bytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256E: 1 + ``` + +###### 3. I copy content from local to win + + ```bash + [michele@home local]$ git annex copy --to origin lintest + copy lintest (to origin...) ok + (Recording state in git...) + [michele@home local]$ git annex sync + ...runs ok... + ``` + +###### 4. and + + ```cmd + M:\win>git annex sync + ...works + M:\win>git annex get . + ...works + M:\win>cat lintest + lintest + ``` + +so far so good. +###### 5. Now the renaming part (performed on linux indirect repo) + + ```bash + [michele@home local]$ git mv lintest renamed + [michele@home local]$ git annex list + here + |origin + ||web + ||| + XX_ renamed + [michele@home local]$ git annex sync + ...works + ``` + +###### 6. now, by issuing sync on windows I start getting a "push issue": + + ``` + M:\win>git annex sync + commit + ok + pull origin + remote: Counting objects: 3, done. + remote: Total 2 (delta 0), reused 0 (delta 0) + Unpacking objects: 100% (2/2), done. + From ssh://home/home/michele/casa + c3b7a63..a0854bf master -> origin/master + c3b7a63..a0854bf synced/master -> origin/synced/master + ok + push origin + Counting objects: 9, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (4/4), done. + Writing objects: 100% (5/5), 484 bytes, done. + Total 5 (delta 1), reused 0 (delta 0) + To ssh://michele@home/home/michele/casa + 6c18669..8cc74a0 git-annex -> synced/git-annex + ! [rejected] master -> synced/master (non-fast-forward) + error: failed to push some refs to 'ssh://michele@home/home/michele/casa' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and merge the remote changes + hint: (e.g. 'git pull') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + failed + git-annex: sync: 1 failed + + M:\win> + ``` + +at this stage I tried to issue a git annex merge, git annex sync, leading to same result. + +somewhere in the forum I read i could try issuing a git pull origin master (this could be the problem). +and the result is as such: + + ``` + M:\win>git pull master + fatal: 'master' does not appear to be a git repository + fatal: The remote end hung up unexpectedly + + M:\win>git pull origin master + From ssh://home/home/michele/casa + * branch master -> FETCH_HEAD + Updating c3b7a63..a0854bf + error: Your local changes to the following files would be overwritten by merge: + lintest + Please, commit your changes or stash them before you can merge. + Aborting + + M:\win>git status + # On branch master + # Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. + # + # Changes not staged for commit: + # (use "git add ..." to update what will be committed) + # (use "git checkout -- ..." to discard changes in working directory) + # + # modified: lintest + # + no changes added to commit (use "git add" and/or "git commit -a") + + M:\win>cat lintest + lintest + ``` + +well, ok it appears modified for some weirdness (crlf?), we can live with it. + + ``` + M:\win>git checkout -->> this replaces files contents with simlink (due to git pull above?) + ``` + +at this stage content is lost, and annex has no knowledge about it. + + ``` + M:\win>git annex fsck + fsck lintest ok + + M:\win>cat lintest + .git/annex/objects/9Z/82/SHA256E-s8--2b721dbe9afe6031cce3004e909dd62e0b4b2f3944438b6a000dffc7ad657715/SHA256E-s8--2b721dbe9afe6031cce3004e90 + M:\win>git annex list + here + |origin + ||web + ||| + XX_ lintest + ``` + +still I cannot sync, but now i can pull origin master: + + ```cmd + M:\win>git pull origin master From ssh://home/home/michele/casa * branch master -> FETCH_HEAD Updating c3b7a63..a0854bf Fast-forward lintest => renamed | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lintest => renamed (100%) + ``` + +this doesnt restore content (annex thinks its already there: + + ``` + M:\win>cat renamed + .git/annex/objects/9Z/82/SHA256E-s8--2b721dbe9afe6031cce3004e909dd62e0b4b2f3944438b6a000dffc7ad657715/SHA256E-s8--2b721dbe9afe6031cce3004e909dd62e0b4b2f3944438b6a000dffc7ad657715 + ``` + +I think my mistake is the use of the ```git checkout``` in direct mode. But why is the file detected as modified in the first place ? + +note: as long as i didn't drop on origin, i still can recover contents by 'forcing' a content refresh: + + ``` + M:\win>git annex get renamed --from origin + get renamed (from origin...) + SHA256E-s8--2b721dbe9afe6031cce3004e909dd62e0b4b2f3944438b6a000dffc7ad657715 + 8 100% 7.81kB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 30 bytes received 153 bytes 8.13 bytes/sec + total size is 8 speedup is 0.04 + ok + (Recording state in git...) + + M:\win>cat renamed + .git/annex/objects/9Z/82/SHA256E-s8--2b721dbe9afe6031cce3004e909dd62e0b4b2f3944438b6a000dffc7ad657715/SHA256E-s8--2b721dbe9afe6031cce3004e909d + M:\win>git annex fsck + fsck renamed (fixing direct mode) (checksum...) ok + + M:\win>cat renamed + lintest +``` + + + + + + diff --git a/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_1_f4b0a14373c75cb752597c832e296bcc._comment b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_1_f4b0a14373c75cb752597c832e296bcc._comment new file mode 100644 index 000000000..7b38c6af4 --- /dev/null +++ b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_1_f4b0a14373c75cb752597c832e296bcc._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-26T19:35:46Z" + content=""" +You should **never, ever, ever** run `git pull`, or `git checkout` inside a direct repository. You need to read [[direct_mode]]. If you do not fully understand it, you should avoid running any git commands that are not `git annex foo` in a direct mode repository. If you forget and do run such git commands, you can generally recover by running `git annex fsck`, although it's possible that the git command you run overwrites your only copy of a file, and so you'd lose it. + +
+To ssh://michele@home/home/michele/casa
+   6c18669..8cc74a0  git-annex -> synced/git-annex
+ ! [rejected]        master -> synced/master (non-fast-forward)
+error: failed to push some refs to 'ssh://michele@home/home/michele/casa'
+
+ +I'll bet that if you look at the `git config` of this repository it failed to push to, you'll find that it has `receive.denyNonFastforwards` set to true. If you unset that, the push should work. +"""]] diff --git a/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_2_8c86dfc99f0b9040402c9d746decda53._comment b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_2_8c86dfc99f0b9040402c9d746decda53._comment new file mode 100644 index 000000000..8b4ff46a4 --- /dev/null +++ b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_2_8c86dfc99f0b9040402c9d746decda53._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI" + nickname="Michele" + subject="still cannot push when remote has renames" + date="2013-10-27T23:06:03Z" + content=""" +now, I went again through docs, and i realized how stupid was issuing a git pull on a direct repo. thanks for your patience. + +but, i double checked the configuration, I assume \"receive.denyNonFastForwards\" is false by default, but anyway I set it up explicitely so that now my git config (on the linux indirect repo - with respect to my previous example, I got rid of the \"extra\" bare repo in the middle) shows: + + $ git config --list + user.email=m@g.com + user.name=michele + core.repositoryformatversion=0 + core.filemode=true + core.bare=false + core.logallrefupdates=true + annex.uuid=d084e0fd-95a7-4c98-a206-fbf2c85b779d + annex.version=3 + receive.denynonfastforwards=false + +still I am receiving the push refusal: + + M:\win>git annex sync + commit + ok + pull origin + ok + push origin + To ssh://michele@home/home/michele/casa + ! [rejected] master -> synced/master (non-fast-forward) + error: failed to push some refs to 'ssh://michele@home/home/michele/casa' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and merge the remote changes + hint: (e.g. 'git pull') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + failed + git-annex: sync: 1 failed + +Same happens with a bare repository in the middle. BTW: the windows \"client\" repository is behind NAT, so that the linux indirect doesn't actively sync against it: could that be source of the problem ? +"""]] diff --git a/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_3_0246fff6c7c75f6be45bd257ec3872a5._comment b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_3_0246fff6c7c75f6be45bd257ec3872a5._comment new file mode 100644 index 000000000..0ffb2a097 --- /dev/null +++ b/doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_3_0246fff6c7c75f6be45bd257ec3872a5._comment @@ -0,0 +1,75 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI" + nickname="Michele" + subject="possible explanation" + date="2013-10-29T11:56:21Z" + content=""" +now, i tried to understand what happens. Instead of issuing the *git annex sync*, I relied on *git pull origin, git merge origin/master*, (I red [[http://git-annex.branchable.com/forum/Help_Windows_walkthrough/]] and I assume that pull origin / merge origin/master would work similarly to the \"download\" part of sync, *except for losing all my direct content*) just to understand what was going on, with a clarifying result: + +while git annex sync fails on push, git pull origin fails on pull: + + M:\win>git pull origin + Updating 5408d6f..c566a69 + error: Your local changes to the following files would be overwritten by merge: + myfile + Please, commit your changes or stash them before you can merge. + Aborting + +note that the file has not been modified locally (just got it through git annex get). +issuing a git diff, reveals: + + M:\win>git diff myfile + diff --git a/myfile b/myfile + index beaf3e8..dc5b4ff 120000 + --- a/myfile + +++ b/myfile + @@ -1 +1 @@ + -.git/annex/objects/z5/v7/SHA256E-s8--6090923ed0931dcc6699f32fb66fa4ba32c10924088b12c66fb4ce35a91ba98c/SHA256E-s8\ No newline at end of file + +linux.1 + (END) + +ok, i follow suggestion, and I perform a git stash. that still wouldn't suffice for git annex sync: + + M:\win>git annex sync + commit + ok + pull origin + ok + push origin + To ssh://michele@home/home/michele/homebase + ! [rejected] master -> synced/master (non-fast-forward) + error: failed to push some refs to 'ssh://michele@home/home/michele/homebase' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and merge the remote changes + hint: (e.g. 'git pull') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + failed + git-annex: sync: 1 failed + +now, i can perform instead a *git pull origin*, since I am confident my content is stashed. + + M:\win>git pull origin + Updating 5408d6f..c566a69 + Fast-forward + myfile => myfile.renamed | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + rename myfile => myfile.renamed (100%) + +merge is not doing anything more: at this stage content has gone (file is a direct-mode symlink nad it cannot be fixed by fsck). +But i can recover it from stash (and I must do it unless I want to get the annex to think i still have content). + + git stash apply + +voilà: the content is there! and the repos seems in good order. +this only adds up that this is possibily a bug in the fact that git reports direct content as modified when indeed it hasn't been modified: but this affects git annex sync only when merging renaming files. +git annex sync now works perfectly . + +to sum it up, I have two questions: + +1) does using stash to circumvent the problem expose me to any risk ? +2) would the behaviour on receiving renames in the abovementioned situation worth to be signaled as a bug ? + + + + +"""]] diff --git a/doc/forum/recover_deleted_files___63__.mdwn b/doc/forum/recover_deleted_files___63__.mdwn new file mode 100644 index 000000000..7bec36968 --- /dev/null +++ b/doc/forum/recover_deleted_files___63__.mdwn @@ -0,0 +1,66 @@ +hi, + +i think of use git-annex as the backbone of a archival systems. at first point no distributed storage, just 1 node. +but now i run into the topic below ( deleted the "named" symlink of the "object" -- how to recover ?) + +maybe someone can enlighten me... + +thanks, +.ka + +// about the version. ( debian-squeeze, bpo ) + +$ git-annex version +git-annex version: 3.20120629~bpo60+2 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 + +// building up a testcase. + +$ git init +Initialized empty Git repository in ...test2/.git/ + +$ git annex init +init ok +(Recording state in git...) + +$ echo "aaa" > 1.txt + +$ echo "bbb" > 2.txt + +$ git-annex add . +add 1.txt (checksum...) ok +add 2.txt (checksum...) ok +(Recording state in git...) + +$ git commit -a -m "added 2 files" +fatal: No HEAD commit to compare with (yet) +fatal: No HEAD commit to compare with (yet) +[master (root-commit) fc2a5d7] added 2 files + Committer: userhere user +Your name and email address were configured automatically based +on your username and hostname. Please check that they are accurate. +... + 2 files changed, 2 insertions(+), 0 deletions(-) + create mode 120000 1.txt + create mode 120000 2.txt + +// ok, so far standard. i have now 2 files - lets delete one. + +$ rm 2.txt +$ ls -l +lrwxrwxrwx 1 xp xp 176 24. Okt 22:55 1.txt -> .git/annex/objects/Z6/7q/SHA256-s4--17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76/SHA256-s4--17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 + +// eek, delete of 2.txt was a bad idea (it was just the symlink) -- try to recover... + +$ git-annex fix +$ git-annex fsck +fsck 1.txt (checksum...) ok +$ ls +1.txt + +// still not here.. how to recover the link to 2.txt ??? +// i still see the content of the file in the object folder +// if I want to use git-annex as the backend of a archival system, this is important. diff --git a/doc/forum/recover_deleted_files___63__/comment_1_d7abb7c45c6ec2723a04f153ed215453._comment b/doc/forum/recover_deleted_files___63__/comment_1_d7abb7c45c6ec2723a04f153ed215453._comment new file mode 100644 index 000000000..646e7ad54 --- /dev/null +++ b/doc/forum/recover_deleted_files___63__/comment_1_d7abb7c45c6ec2723a04f153ed215453._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ciffer.net/~svend/" + ip="2001:1938:81:1ff::2" + subject="git checkout" + date="2012-10-24T22:50:05Z" + content=""" +You can use `git checkout -- file` to restore the link. `git status` will display information for restoring the file. +"""]] diff --git a/doc/forum/recover_deleted_files___63__/comment_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment b/doc/forum/recover_deleted_files___63__/comment_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment new file mode 100644 index 000000000..c99461ae0 --- /dev/null +++ b/doc/forum/recover_deleted_files___63__/comment_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.138" + subject="it's a git repository..." + date="2012-10-25T03:29:20Z" + content=""" +So any git stuff can be used. If you deleted a file, committed it, and want to undo that, you can `git log --stat` to find the commit, and `git revert` it. If you deleted a file, haven't committed yet, and want one more look at it, you can `git stash` to get it back, and `git stash apply` to re-stash the change. Or yeah, just `git checkout` to get back a deleted file you have not committed yet. +"""]] diff --git a/doc/forum/recover_deleted_files___63__/comment_3_376de81c70799bf409be189a48234815._comment b/doc/forum/recover_deleted_files___63__/comment_3_376de81c70799bf409be189a48234815._comment new file mode 100644 index 000000000..89edb17eb --- /dev/null +++ b/doc/forum/recover_deleted_files___63__/comment_3_376de81c70799bf409be189a48234815._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="ka7" + ip="2001:7b8:155d:0:222:64ff:fe16:dc52" + subject="ok, that worked." + date="2012-10-25T20:15:26Z" + content=""" +i think of a kind of \"WORM-library\", so basically just add, not allow to remove content. (at least not for the user thru the mounted device) +- so a script to add/commit -- but as stag-1 check for delete files and get them back. some git magic needed, but should be doable. +- or thru \"samba\" parameters set to add but not delete/overwrite files. (read yes, write yes, delete no) -- to be proved thats possible, but not your job :) ( annex-ing via cron every /5 or via inotify) +so yea, will play for a while and maybe come back with new. thanks to everybody. +<3 git-annex <3 +"""]] diff --git a/doc/forum/recover_deleted_files___63__/comment_4_2e73ac530d65a01768a57058b7220a29._comment b/doc/forum/recover_deleted_files___63__/comment_4_2e73ac530d65a01768a57058b7220a29._comment new file mode 100644 index 000000000..9e9c1b4bf --- /dev/null +++ b/doc/forum/recover_deleted_files___63__/comment_4_2e73ac530d65a01768a57058b7220a29._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXlmnJKsPulm2S_hwwRm3Ky27Zyf-wKMw" + nickname="Chad" + subject="After the fact..." + date="2013-12-22T03:51:36Z" + content=""" +I've run into a situation where I've inadvertently deleted a file from my Andriod-driven annex repo rather than dropping the file. (A set of very large *.flac files, to be exact.) These are now gone from the repo on my laptop and the repo on my workstation. When looking at the `git --log stat' call, I see the addition of these files, but I do not see their deletion. When running `git annex unused', I found references to the *.flac files, their SHA key, and indeed found the commit they were associated with. I have not dropped these unused files. How to I recover them? +"""]] diff --git a/doc/forum/recovering_from_repo_corruption.mdwn b/doc/forum/recovering_from_repo_corruption.mdwn new file mode 100644 index 000000000..42df61b78 --- /dev/null +++ b/doc/forum/recovering_from_repo_corruption.mdwn @@ -0,0 +1,11 @@ +In my current annex config, I have 4 computers with "traditional" git annexes as well as an external drive that is a git annex, an rsync'd backup annex, and a glacier archive. Today, one of the computers got a corrupted git repo. It was complaining that a pack file was invalid. In my attempts to fix it, a commit was logged that deleted every file in the annex. I didn't find this out until I did 'git annex sync' and watched git delete everything, then send all those commits to my other 3 systems and the external drive. *facepalm* + +Fortunately, I had one of those other systems in direct mode and I copied everything from the annex as a backup. Now, when I try to re-add files to the annex, I'm running into some errors. These appear to be "collisions" within the annex part of the .git folder: + + % › git annex add House.netspd + add House.netspd (checksum...) + git-annex: /Users/akraut/Desktop/annex/.git/annex/objects/31/Gw/SHA256E-s167433--41e68ea0adb5a4086a0b7b39d0556b9b86523ffb6b498d58f12f96460da315e9/SHA256E-s167433--41e68ea0adb5a4086a0b7b39d0556b9b86523ffb6b498d58f12f96460da315e9.map.tmp62699: openFile: permission denied (Permission denied) + failed + git-annex: add: 1 failed + +Any ideas on what's going on here? Perhaps how to get things added back in or recovered? It seems all the actual file contents are here, but annex doesn't seem to know they're there anymore. diff --git a/doc/forum/recovering_from_repo_corruption/comment_1_01fc85037e24fc70e5c5329898cf6781._comment b/doc/forum/recovering_from_repo_corruption/comment_1_01fc85037e24fc70e5c5329898cf6781._comment new file mode 100644 index 000000000..ab65b42cb --- /dev/null +++ b/doc/forum/recovering_from_repo_corruption/comment_1_01fc85037e24fc70e5c5329898cf6781._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-26T07:11:35Z" + content=""" +speaking strictly from the git point of view, you can create a new commit that reverses an old commit completely. + + git revert + +creates a new commit which does the exact opposite of the commit you specify. Theoretically it bring everything back to you quick and clean! + + + +"""]] diff --git a/doc/forum/recovering_from_repo_corruption/comment_2_3bd1c0bf25a0e892e711a60f53cd5298._comment b/doc/forum/recovering_from_repo_corruption/comment_2_3bd1c0bf25a0e892e711a60f53cd5298._comment new file mode 100644 index 000000000..c8df9c0a0 --- /dev/null +++ b/doc/forum/recovering_from_repo_corruption/comment_2_3bd1c0bf25a0e892e711a60f53cd5298._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 2" + date="2013-01-26T08:13:34Z" + content=""" +Oh! Good call. That worked, though I did have to sync and revert alternately a few times to get things resolved. I still haven't figured out what exactly happened, though. In two separate instances, the commit message was \"git-annex automatic sync\" +"""]] diff --git a/doc/forum/recovering_from_repo_corruption/comment_3_679dde8ca0081fc6854d6d2e8a42abdb._comment b/doc/forum/recovering_from_repo_corruption/comment_3_679dde8ca0081fc6854d6d2e8a42abdb._comment new file mode 100644 index 000000000..9b724b143 --- /dev/null +++ b/doc/forum/recovering_from_repo_corruption/comment_3_679dde8ca0081fc6854d6d2e8a42abdb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2013-01-26T09:11:00Z" + content=""" +I've fixed the bug that led to the permissions denied error. +"""]] diff --git a/doc/forum/recovery_from_failed_merge.mdwn b/doc/forum/recovery_from_failed_merge.mdwn new file mode 100644 index 000000000..802c66e51 --- /dev/null +++ b/doc/forum/recovery_from_failed_merge.mdwn @@ -0,0 +1,7 @@ +Starting the assistant version 5.20140613 on my repository (~60GB), it performed a merge +with an offline-repository, deleting a large part of the files. +Since the repo is in direct mode, I cannot do a git revert. The other repo is not available anymore + +Any way of getting them back? +Also, du shows me that the .git/annex/objects folder has approximately the size of my repo before the incident. + diff --git a/doc/forum/recovery_from_failed_merge/comment_1_84e5b55d473d16bc9bdba5d88dc29bc3._comment b/doc/forum/recovery_from_failed_merge/comment_1_84e5b55d473d16bc9bdba5d88dc29bc3._comment new file mode 100644 index 000000000..3f61d8cb9 --- /dev/null +++ b/doc/forum/recovery_from_failed_merge/comment_1_84e5b55d473d16bc9bdba5d88dc29bc3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-16T17:58:22Z" + content=""" +All your files are still there.. + +You can either use `git annex indirect` to switch to indirect mode and then `git revert`, or you could git clone the repo to someplace else, do the revert there, and then run `git annex sync` in first the clone and then in the direct mode repo to sync the reversion back. +"""]] diff --git a/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote.mdwn b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote.mdwn new file mode 100644 index 000000000..2c437fe35 --- /dev/null +++ b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote.mdwn @@ -0,0 +1,8 @@ +Hi, + +I switched distribution and cloned my annex from the backup afterwards. getting the files from my backup worked fine, but i have a remote on an external disk and git-annex keeps saying it's unavailable despite it being there. I have the same username and hostname as on my old system so and the remote repo still has the uuid 3d661c5e-c84e-4902-b52e-decbafadfa4f. The only thing that changed is the path, it's know mounted unter /var/run/media/phaer/95... but a symlinked to the path below did not help. Any suggestions? + + 3d661c5e-c84e-4902-b52e-decbafadfa4f -- phaer@kassiopeia:/media/phaer/9502bc14-b83e-471a-95a8-80ff9072a4ab/annex + + +and thank you for this amazing piece of software. diff --git a/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_1_c1962d757dd22f49e774afa13a9862ca._comment b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_1_c1962d757dd22f49e774afa13a9862ca._comment new file mode 100644 index 000000000..1223b2414 --- /dev/null +++ b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_1_c1962d757dd22f49e774afa13a9862ca._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-21T22:24:35Z" + content=""" +It might help if you pasted the actual error message that git-annex shows when you try to use this remote. Along with the part of .git/config that configures this remote. + +In general, git-annex does not are if you've reinstalled your OS, moved things around, etc. As long as the git remote's path points to a repository, git-annex will see it and be able to use it. +"""]] diff --git a/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_2_1f0f4a1dc89643cee81ff7199b55e747._comment b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_2_1f0f4a1dc89643cee81ff7199b55e747._comment new file mode 100644 index 000000000..f38c0c752 --- /dev/null +++ b/doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_2_1f0f4a1dc89643cee81ff7199b55e747._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBhQgaA5QrFwT67-Bo0qPIx0HD9roDrso" + nickname="Paul" + subject="comment 2" + date="2013-11-20T11:20:13Z" + content=""" +The problem was just a missing git remote. Sorry & thanks +"""]] diff --git a/doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn b/doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn new file mode 100644 index 000000000..fc558aad6 --- /dev/null +++ b/doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn @@ -0,0 +1,7 @@ +This falls into the category of "noob questions" I think. + +The one piece of the git-annex assistant puzzle I've never messed with is XMPP pairing. I'm wondering how well a pair of repos can keep in sync with each other if their only connection is via XMPP. Will things go badly if changes are made to one while the other is offline? Do messages get queued up to deliver when they're both online? (Or do they get queued on the server side so they can be delivered even if one of them is online, makes changes, then goes offline, and the other one comes online later?) + +If some xmpp messages don't go through for whatever reason, will the remotes be able to "catch up" with each other later on and make up for lost time? + +Just hoping for a general sense of the limitations of XMPP pairing. TIA. diff --git a/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_1_e0f7aa48d54fc0564f41c3a569c723b7._comment b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_1_e0f7aa48d54fc0564f41c3a569c723b7._comment new file mode 100644 index 000000000..d72cad5b9 --- /dev/null +++ b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_1_e0f7aa48d54fc0564f41c3a569c723b7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T19:27:07Z" + content=""" +Both clients have to be online at the same time for XMPP push to work. Once they're able to see each other, they'll sync up, even if they've diverged since the last sync. + +If you tend to only have one client or the other online, you should set up a git repo on a ssh server. Then clients will drop off their changes there, and the other one will check it when it comes online. (You don't really need to use XMPP at all in this case.) + +The most robust and fast combo is to use XMPP pairing, and also have a git repo on a ssh server. This way, when both clients are online, they'll use XMPP to instantly propagate changes, and when not the server is there to fall back to. +"""]] diff --git a/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_2_4e74039a673c16c0163f2cfb406dc4c3._comment b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_2_4e74039a673c16c0163f2cfb406dc4c3._comment new file mode 100644 index 000000000..b4e329441 --- /dev/null +++ b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_2_4e74039a673c16c0163f2cfb406dc4c3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2013-07-16T23:36:22Z" + content=""" +Thanks, that was exactly the kind of explanation I needed. +"""]] diff --git a/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_3_41ade4fe72804b2f06cd4dbf405c1746._comment b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_3_41ade4fe72804b2f06cd4dbf405c1746._comment new file mode 100644 index 000000000..a212dbd09 --- /dev/null +++ b/doc/forum/reliability__47__completeness_of_XMPP_updates/comment_3_41ade4fe72804b2f06cd4dbf405c1746._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Flo" + ip="141.76.46.31" + subject="Git repositery?" + date="2013-07-19T08:56:04Z" + content=""" +I'm not sure to know what you mean with \"git repository on a SSH server\". I tried to use the assistant to add this git synchronization fall-back if XMPP is not available. However, it synchronizes all files too with this new repository. I tried to make it manual, unwanted, etc. But it stills send all my files on the transfer repository on rsync.net. I don't want that... +"""]] diff --git a/doc/forum/relying_on_git_for_numcopies.mdwn b/doc/forum/relying_on_git_for_numcopies.mdwn new file mode 100644 index 000000000..37b46cf4e --- /dev/null +++ b/doc/forum/relying_on_git_for_numcopies.mdwn @@ -0,0 +1,47 @@ +**<out-of-date-warning>**The main problems this is supposed to solve are addressed in a different way with [[todo/hidden files]] and the `--fast` option introduced in [[batch check on remote when using copy]], so while this is not technically obsolete, the main reasons for it are gone. --[[chrysn]]**</out-of-date-warning>** + +This is a rough sketch of a modification of git-annex to rely more on git commit semantics. It might be flawed due to my lack of understanding of git-annex internals. --[[chrysn]] + +Summary +========= + +Currently, [[location tracking]] is only used for informational purposes unless a repository is [[trust]]ed, in which case there is no checking at all. It is proposed to use the location tracking information as a commitment to keep track of a file until another repository takes over responsibility. + +git's semantics for atomic commits are proposed to be used, which makes sure that before files are actually deleted, another repository has accepted the deletion. + +Modified git-annex-drop behavior +========================== + +The most important (if not only) git-annex command that is affected by this is `git annex drop`. Currently, for dropping a large number of files, every file is checked with another (or multiple, if so configured) host if it's safe to delete. + +The new behavior would be to + +* decrement the location tracking counter for all files to be dropped, +* commit that change, +* try to push it to at least as many repositories that the numcopies constraints are met, +* revert if that fails, +* otherwise really drop the files from the backend. + +Unlike explicit checking, this never looks at the remote backend if the file is really present -- otoh, git-annex already relies on the files in the backend to not be touched by anyone but git-annex itself, and git-annex would only drop them if they were derefed and committed, in which case git would not accept the push. (git by itself would accept a merged push, but even if the reverting step failed due to a power outage or similar, git-annex would, before really deleting files from the backend, check again if the numcopies restraint is still met, and revert its own delete commit as the files are still present anyway.) + +Implications for trust +============== + +The proposed change also changes the semantics of trust. Trust can now be controlled in a finer-grained way between untrusted and semi-trusted, as best illustrated by a use case: + +> Alice takes her netbook with her on a trip through Spain, and will fill most of its disk up with pictures she takes. As she expects to meet some old friends during the first days, she wants to take older pictures with her, which are safely backed up at home, so they can be deleted on demand. +> +> She tells her netbook's repository to dereference the old images (but not other parts of the repository she has not copied anywhere yet) and pushes to the server before leaving. When she adds pictures from her camera to the repository, git-annex can now free up space as needed. + +Dereferencing could be implemented as `git annex drop --no-rm` (or `move --no-rm`), freeing space is similar to `dropunused`. + +A trusted repository with the new semantics would mean that the repository would not accept dropping anything, just as before. + +Advantages / Disadvantages +===================== + +The advantage of this proposal is that the round trips required for dropping something could be greatly reduced. + +There should also be simplifications in the `git annex drop` command as it doesn't need to take care of locking any more (git should already do that between checking if HEAD is a parent of the pushed commit and replacing HEAD). + +Besides being a major change in git-annex (with the requirement to track hosts' git-annex versions for migration, as the new trust system is incompatible with the old one), no disadvantages of that stragegy are known to the author (hoping for discussion below). diff --git a/doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment b/doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment new file mode 100644 index 000000000..83a908da8 --- /dev/null +++ b/doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-02-22T18:44:28Z" + content=""" +I see the following problems with this scheme: + +- Disallows removal of files when disconnected. It's currently safe to force that, as long as + git-annex tells you enough other repos are belived to have the file. Just as long as you + only force on one machine (say your laptop). With your scheme, if you drop a file while + disconnected, any other host could see that the counter is still at N, because your + laptop had the file last time it was online, and can decide to drop the file, and lose the last +version. + +- pushing a changed counter commit to other repos is tricky, because they're not bare, and + the network topology to get the commit pulled into the other repo could vary. + +- Merging counter files issues. If the counter file doesn't automerge, two repos dropping the same file will conflict. But, if it does automerge, it breaks the counter conflict detection. + +- Needing to revert commits is going to be annoying. An actual git revert + could probably not reliably be done. It's need to construct a revert + and commit it as a new commit. And then try to push that to remotes, and + what if *that* push conflicts? + +- I do like the pre-removal dropping somewhat as an alternative to + trust checking. I think that can be done with current git-annex though, + just remove the files from the location log, but keep them in-annex. + Dropping a file only looks at repos that the location log says have a + file; so other repos can have retained a copy of a file secretly like + this, and can safely remove it at any time. I'd need to look into this a bit more to be 100% sure it's safe, but have started [[todo/hidden_files]]. + +- I don't see any reduced round trips. It still has to contact N other + repos on drop. Now, rather than checking that they have a file, it needs + to push a change to them. +"""]] diff --git a/doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment b/doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment new file mode 100644 index 000000000..d9ce8b50e --- /dev/null +++ b/doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="comment 2" + date="2011-02-23T16:43:59Z" + content=""" +i'll comment on each of the points separately, well aware that even a single little leftover issue can show that my plan is faulty: + +* force removal: well, yes -- but the file that is currently force-removed on the laptop could just as well be the last of its kind itself. i see the problem, but am not sure if it's fatal (after all, if we rely on out-of-band knowledge when forcing something, we could just as well ask a little more) +* non-bare repos: pushing is tricky with non-bare repos now just as well; a post-commit hook could auto-accept counter changes. (but pushing causes problems with counters anyway, doesn't it?) +* merging: i'd have them auto-merge. git-annex will have to check the validity of the current state anyway, and a situation in which a counter-decrementing commit is not a fast-forward one would be reverted in the next step (or upon discovery, in case the next step never took place). +* reverting: my wording was bad as \"revert\" is already taken in git-lingo. the correct term for what i was thinking of is \"reset\". (as the commit could not be pushed, it would be rolled back completely). + * we might have to resort to reverting, though, if the commit has already been pused to a first server of many. +* [[todo/hidden files]]: yes, this solves pre-removal dropping :-) +* round trips: it's not the number of servers, it's the number of files (up to 30k in my case). it seems to me that an individual request was made for every single file i wanted to drop (that would be N*M roundtrips for N affected servers and M files, and N roundtrips with git managed numcopies) + +all together, it seems to be a bit more complicated than i imagined, although not completely impossible. a combination of [[todo/hidden files]] and maybe a simpler reduction of the number of requests might though achieve the important goals as well. +"""]] diff --git a/doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment b/doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment new file mode 100644 index 000000000..27076a877 --- /dev/null +++ b/doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="relation to [[todo/branching]]" + date="2011-02-23T21:48:14Z" + content=""" +the non-bare repository issue would go away if this was combined with the \"alternate\" approach to [[todo/branching]]. (with the \"fleshed out proposal\" of branching, this would not work at all for lack of shared commits.) +"""]] diff --git a/doc/forum/remembering_state.mdwn b/doc/forum/remembering_state.mdwn new file mode 100644 index 000000000..3edc193bc --- /dev/null +++ b/doc/forum/remembering_state.mdwn @@ -0,0 +1,5 @@ +so i am wondering how better to remember the state of a repository. + +the use case is this: i have this part of my music collection which i consider to be my "favorites". i would like to have only those on an external hard drive, but also on my portable music player. so i cloned my main music collection to the external hard drive and did `git annex get` on the files i wanted there. now i want to replicate that to the music player - how would i go around doing that? if i clone that repo again, it will all have empty symlinks and i would have to reproduce the same process all over again, which i can script, but it seems a little quirky... + +ideas? --[[anarcat]] diff --git a/doc/forum/remembering_state/comment_1_4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment b/doc/forum/remembering_state/comment_1_4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment new file mode 100644 index 000000000..bc9a07223 --- /dev/null +++ b/doc/forum/remembering_state/comment_1_4a6ac5f50dfa5a17a0f0ccd0c2e7a466._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQeMMI82sfgZ9lim_9GqLkc4fsd0Z3Qt8" + nickname="Ronald" + subject="comment 1" + date="2014-05-14T09:08:22Z" + content=""" +I'm still learning git-annex myself, but I think you can make a new branch 'favorites'. Sort out your favorite music and make a checkout on your external HDD and music player. In the walkthrough you can see how that works. +"""]] diff --git a/doc/forum/remembering_state/comment_2_1b02d3713a2986bc027d166589a11c3f._comment b/doc/forum/remembering_state/comment_2_1b02d3713a2986bc027d166589a11c3f._comment new file mode 100644 index 000000000..3c3f393a6 --- /dev/null +++ b/doc/forum/remembering_state/comment_2_1b02d3713a2986bc027d166589a11c3f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYmMFDdf3GJ9Oba6NCVkzGc4JyB9WavMs" + nickname="Xinruo" + subject="comment 2" + date="2014-05-15T02:07:06Z" + content=""" +I think a better solution is to use http://git-annex.branchable.com/tips/metadata_driven_views/ +You can tag the files as favorites, then use get --metadata tag=favorites to get only favorites files. +"""]] diff --git a/doc/forum/remembering_state/comment_3_b48775ea1e90b061b084f61a4a9baca5._comment b/doc/forum/remembering_state/comment_3_b48775ea1e90b061b084f61a4a9baca5._comment new file mode 100644 index 000000000..2b349527c --- /dev/null +++ b/doc/forum/remembering_state/comment_3_b48775ea1e90b061b084f61a4a9baca5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-05-15T20:01:14Z" + content=""" +While you can certianly use views for this, I tend to do the same with my sound files without view, but just using location tracking info. I have a set of music I'm currently listening to, and want to have more or less the same files on multiple computers as I have on my laptop. With maybe a bit more on some computers with more space. So, I do: + + git annex sync + git annex get --in darkstar + +Where \"darkstar\" is the name of the repository on my laptop. + +Another nice trick that also takes advantage of the location tracking logs is this to get back some files you dropped temporarily to free up space: + + git annex get --in='here@{yesterday}' + + +"""]] diff --git a/doc/forum/remembering_state/comment_4_cbebcc6ed4bdae6815c0576475e96f6a._comment b/doc/forum/remembering_state/comment_4_cbebcc6ed4bdae6815c0576475e96f6a._comment new file mode 100644 index 000000000..c4bf94390 --- /dev/null +++ b/doc/forum/remembering_state/comment_4_cbebcc6ed4bdae6815c0576475e96f6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="70.83.139.100" + subject="comment 4" + date="2014-05-21T18:02:51Z" + content=""" +i like @yesterday, that's a neat trick that would have basically resolved my problem here. thanks! +"""]] diff --git a/doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn b/doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn new file mode 100644 index 000000000..21c756836 --- /dev/null +++ b/doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn @@ -0,0 +1,17 @@ +I've gone through most of the screen casts and lots of documentation, +but my first attempt produced an unexpected result. + +I wanted to use git-annex is a Dropbox-simplistic setting - syncing +a directory between my notebook (OSX) and my desktop (OpenSUSE 12.3). +Running the assistant on OSX and adding a "Remote server" repository, +changing the repository group to client produced a bare repository +on the desktop. + +Am I missing something obvious? + +I've tried a few different version of git-annex, most recently + + git-annex version: 4.20130727-g9399845 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +but it remains the same. diff --git a/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_1_234241460f6c75a8376b303b8dd4e882._comment b/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_1_234241460f6c75a8376b303b8dd4e882._comment new file mode 100644 index 000000000..41e599c6d --- /dev/null +++ b/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_1_234241460f6c75a8376b303b8dd4e882._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmg8DSRA425Aik2clIuge8Jj-s7VJltsBI" + nickname="Tommy" + subject="comment 1" + date="2013-07-28T06:05:48Z" + content=""" +I found a partial answer on http://git-annex.branchable.com/forum/Add_a___34__local__34___remote : +\"The webapp does not set up remote non-bare repositories because unless the user is comfortable with the cli, nothing is going to keep them up-to-date.\" + +So, clearly \"Remote server\" isn't what I want, but my \"desktop\" is headless and using jabber seems a silly complication when I have a perfectly fine ssh connection. This isn't as trivial as I had expected. +"""]] diff --git a/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_2_42dfc382d07af2a4f29c76016084f87c._comment b/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_2_42dfc382d07af2a4f29c76016084f87c._comment new file mode 100644 index 000000000..84a2f36d6 --- /dev/null +++ b/doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_2_42dfc382d07af2a4f29c76016084f87c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T18:56:00Z" + content=""" +Make a non-bare git repository on your server. Run `git annex init` in it. Run `git annex assistant` in it. + +Now on your notebook, you can tell the assistant to use a remote ssh server, and point it at that directory. It will see the repository already exists, and use it, rather than making a new bare repository. The assistant daemon you've run on the server will notice when changes are pushed to the directory, and update it. + +You can further set up XMPP, so that the server can tell the notebook if you make any modifications to the server. You can do this by running `git annex webapp --listen=IPADDRESS` on the server, and opening the url it prints out. But this is optional, only needed if you're going to be editing files on the server. +"""]] diff --git a/doc/forum/repo_corruption_in_usb_external_drive.mdwn b/doc/forum/repo_corruption_in_usb_external_drive.mdwn new file mode 100644 index 000000000..989126837 --- /dev/null +++ b/doc/forum/repo_corruption_in_usb_external_drive.mdwn @@ -0,0 +1,41 @@ +I'm sorry to ask this again, but I'm not being able to find my previous message regarding this issue. I'm finding very hard to find older posts in forums. Is there a way to search for all my posted messages? +Anyway, after some automount problems (changed mount point name), my usb repo (direct) ended in a weird state. +See for instance the screenshot: + +In addition making a git-annex info gives the following: + + * repository mode: direct + * trusted repositories: error: refs/heads/master does not point to a valid object! + * error: refs/heads/synced/git-annex does not point to a valid object! + * error: refs/heads/synced/master does not point to a valid object! + * error: refs/remotes/sapo/annex/direct/master does not point to a valid object! + * error: refs/remotes/sapo/git-annex does not point to a valid object! + * error: refs/remotes/sapo/master does not point to a valid object! + * error: refs/synced/1912d5a7-3929-47f0-8e25-a071d7079cc4/git-annex does not point to a valid object! + * error: refs/synced/1912d5a7-3929-47f0-8e25-a071d7079cc4/master does not point to a valid object! + * error: refs/heads/master does not point to a valid object! + * error: refs/heads/synced/git-annex does not point to a valid object! + * error: refs/heads/synced/master does not point to a valid object! + * error: refs/remotes/sapo/annex/direct/master does not point to a valid object! + * error: refs/remotes/sapo/git-annex does not point to a valid object! + * error: refs/remotes/sapo/master does not point to a valid object! + * error: refs/synced/1912d5a7-3929-47f0-8e25-a071d7079cc4/git-annex does not point to a valid object! + * error: refs/synced/1912d5a7-3929-47f0-8e25-a071d7079cc4/master does not point to a valid object! + * fatal: index file smaller than expected + * git-annex: failed to read sha from git write-tree + + +What should I do? delete the usb repo and start again. Thank god this is just a trial. + +What happens if a file gets corrupted. Lets say it is corrupted in repo A, and fine in repo B. Will the good copy be overridden? + +git-repair takes a long time and seems to be stuck there, or maybe it just takes a long time (10Gb repo). Is this normal? + > git-annex repair + Running git fsck ... + Initialized empty Git repository in /tmp/tmprepo.1/.git/ + Trying to recover missing objects from remote sapo. + Unpacking all pack files. + Unpacking objects: 100% (348848/348848), done. + + +Thanks in advance. diff --git a/doc/forum/repo_corruption_in_usb_external_drive/comment_1_d9122bb0cc3551d92877c299a25b9c9e._comment b/doc/forum/repo_corruption_in_usb_external_drive/comment_1_d9122bb0cc3551d92877c299a25b9c9e._comment new file mode 100644 index 000000000..ff325983d --- /dev/null +++ b/doc/forum/repo_corruption_in_usb_external_drive/comment_1_d9122bb0cc3551d92877c299a25b9c9e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-15T18:50:29Z" + content=""" +It's normal for git-repair to take a long time. + +git-annex uses checksums to detect if a file gets corrupted. +"""]] diff --git a/doc/forum/reserving_space_with_directory_special_remotes.mdwn b/doc/forum/reserving_space_with_directory_special_remotes.mdwn new file mode 100644 index 000000000..fea762c39 --- /dev/null +++ b/doc/forum/reserving_space_with_directory_special_remotes.mdwn @@ -0,0 +1,2 @@ +Can diskreserve be done with directory special remotes? +Where should such per directory remote setting be put? diff --git a/doc/forum/reserving_space_with_directory_special_remotes/comment_1_cd17b624704d93b51931023f69573323._comment b/doc/forum/reserving_space_with_directory_special_remotes/comment_1_cd17b624704d93b51931023f69573323._comment new file mode 100644 index 000000000..83ef649ea --- /dev/null +++ b/doc/forum/reserving_space_with_directory_special_remotes/comment_1_cd17b624704d93b51931023f69573323._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-10T23:50:53Z" + content=""" +Not currently supported. I've added a todo: [[todo/free_space_checking_for_local_special_remotes]] +"""]] diff --git a/doc/forum/reserving_space_with_directory_special_remotes/comment_2_877ca1be23d1484a8a30cdaeb6630053._comment b/doc/forum/reserving_space_with_directory_special_remotes/comment_2_877ca1be23d1484a8a30cdaeb6630053._comment new file mode 100644 index 000000000..c34052ae3 --- /dev/null +++ b/doc/forum/reserving_space_with_directory_special_remotes/comment_2_877ca1be23d1484a8a30cdaeb6630053._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2013-07-10T23:56:08Z" + content=""" +I was looking at git-annex git and saw this and thought it might be supported. + +commit 5cc76098ca7b702772ccf37a47f03da088148003 +Author: Joey Hess +Date: Fri Apr 20 16:24:44 2012 -0400 + + Directory special remotes now check annex.diskreserve. + +"""]] diff --git a/doc/forum/reserving_space_with_directory_special_remotes/comment_3_65910eeaf3c6fcfd03f22c2957293232._comment b/doc/forum/reserving_space_with_directory_special_remotes/comment_3_65910eeaf3c6fcfd03f22c2957293232._comment new file mode 100644 index 000000000..245849c5f --- /dev/null +++ b/doc/forum/reserving_space_with_directory_special_remotes/comment_3_65910eeaf3c6fcfd03f22c2957293232._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 3" + date="2013-07-11T16:17:36Z" + content=""" +Shows what I know! It is supported. Repurposed the bug report to allow configuring a different diskreserve for the remote than the main annex.diskreserve.. +"""]] diff --git a/doc/forum/retrieving_previous_versions.mdwn b/doc/forum/retrieving_previous_versions.mdwn new file mode 100644 index 000000000..7626b7935 --- /dev/null +++ b/doc/forum/retrieving_previous_versions.mdwn @@ -0,0 +1,7 @@ +Hi, + +This might be a stupid question, but I did not find any information about it. +Can I retrieve previous versions of a file? +Let's say, I wanna do a "git annex get file", but considering a specific commit id. Is it possible? Are all the versions of the files kept inside .git/annex/objects? + +Thanks! diff --git a/doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment b/doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment new file mode 100644 index 000000000..ab2ecee31 --- /dev/null +++ b/doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-04-24T21:14:15Z" + content=""" +To get to a specific version of a file, you need to have a tag or a branch that includes that version of the file. Check out the branch and `git annex get $file`. + +(Of course, even without a tag or branch, old file versions are retained, unless dropped with `unused`/`dropunused`. +So you could even `git checkout $COMMITID`.) +"""]] diff --git a/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn new file mode 100644 index 000000000..2a22d6ee7 --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn @@ -0,0 +1,13 @@ +When trying to setup an rsync.net repo I always get the following error: + +Permission denied, please try again. +Permission denied, please try again. +Received disconnect from 114.xxx.xxx.xxx: 2: Too many authentication failures for 2***** + +I can ssh into the account without any problems and couldn't find anything, which would have helped me any further. +Any ideas? Is the problem sitting in front of the computer? Is it a bug? + +Thanks. +David + +This is happening on Mavericks (10.9) diff --git a/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment new file mode 100644 index 000000000..d29f6482c --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="comment 1" + date="2014-04-02T15:58:57Z" + content=""" +This problem also exists, when connecting to other ssh remote servers. +The error msg would be: + + Failed to ssh to the server. Transcript: Permission denied, please try again. Received disconnect from 80.xxx.xxx.xxx: 2: Too many authentication failures for ssh-xxxxxx-git-annex-assist +"""]] diff --git a/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment new file mode 100644 index 000000000..3181c4fe0 --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 2" + date="2014-04-02T19:41:29Z" + content=""" +What version of git-annex? + +Do you have ssh-askpass installed? + +You might try running git webapp from a terminal, in case ssh is unable to prompt for the password in a window using ssh-askpass. +"""]] diff --git a/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_3_84aceb9a9d3e5bd14c044861f47e3b9d._comment b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_3_84aceb9a9d3e5bd14c044861f47e3b9d._comment new file mode 100644 index 000000000..ef70eea48 --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_3_84aceb9a9d3e5bd14c044861f47e3b9d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="comment 3" + date="2014-04-03T00:31:14Z" + content=""" +I'm running Version: 5.20140318-gdcf93d0. Do I have to install a ssh-askpass manually? I only found one thread referring to ssh-askpass, but didn't really know what to do with that information. So, no I don't have it installed as far as I know... _I_ never did anyway... + +Do I need it? Did I miss something in the docs? +"""]] diff --git a/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_4_2cd17d01edeb230197865e6ea0884de0._comment b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_4_2cd17d01edeb230197865e6ea0884de0._comment new file mode 100644 index 000000000..bfb4c2d74 --- /dev/null +++ b/doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_4_2cd17d01edeb230197865e6ea0884de0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 4" + date="2014-05-19T16:46:55Z" + content=""" +I suggest you upgrade to yesterday's release. It moves ssh password prompting during repository setup into a field in the webapp, so should avoid this class of problems. +"""]] diff --git a/doc/forum/rsync_asking_for_an_unknown_password.mdwn b/doc/forum/rsync_asking_for_an_unknown_password.mdwn new file mode 100644 index 000000000..1126c31ea --- /dev/null +++ b/doc/forum/rsync_asking_for_an_unknown_password.mdwn @@ -0,0 +1,60 @@ +Hello, + +I am on OS X, using version 5.20140613. I installed using brew. + +I have a really simple example where I'm trying to use local rsync to test transfer between two repos. It keeps asking me for a password over and over. I do not know what password it is. + +I'm literally doing just this: + + $ cd annex-tests + $ mkdir target + $ mkdir source + $ cat > source/text + hi this is a test + $ cd source + $ git init + Initialized empty Git repository in /Users/me/Documents/annex-tests/source/.git/ + $ git annex init + init ok + (Recording state in git...) + $ git annex initremote rsync-login type=rsync rsyncurl=me@localhost:/Users/me/Documents/annex-tests/target encryption=none + initremote rsync-login ok + (Recording state in git...) + $ git annex describe rsync-login "test rsync url with a login" + describe rsync-login ok + (Recording state in git...) + $ git annex add text + add text ok + (Recording state in git...) + $ git annex sync rsync-login --content + commit ok + copy text copy text (checking rsync-login...) Password: + Password: + Password: + Password: + Password: + +I try a blank password, I try my login password, I tried 'none' (the encryption type), I try everything.. no dice + +So right off the bat let me explain a few things. + +1 - Why not use rsa keys? Because I was having the exact same problem and I wanted to make it even easier and use login/password + +2 - Why not use the webapp since a few forum posts say you can set passwords in there? because my annex doesn't seem to recognize the command. + + $ git annex webapp + git-annex: unknown command webapp + +3 - I verified my rsync command/url appears ok by doing the following. The password for that command is as expected, it is my username password: + + $ cat > test2 + hi test + $ rsync test2 me@localhost:/Users/me/Documents/annex-tests/target + Password: + $ cat /Users/me/Documents/annex-tests/target/test2 + hi test + + +Any help will be appreciated! + + diff --git a/doc/forum/rsync_asking_for_an_unknown_password/comment_1_f23d1c04a27625089eaef5b4bb7f8456._comment b/doc/forum/rsync_asking_for_an_unknown_password/comment_1_f23d1c04a27625089eaef5b4bb7f8456._comment new file mode 100644 index 000000000..b76183872 --- /dev/null +++ b/doc/forum/rsync_asking_for_an_unknown_password/comment_1_f23d1c04a27625089eaef5b4bb7f8456._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T18:41:32Z" + content=""" +Re brew not being built with support for the webapp, I suggest you file a bug on brew about this. IIRC they were, or were planning to include the webapp in the build. They may have lost track of that. + +Now, what does rsyncurl=me@localhost:/Users/me/Documents/annex-tests/target say? It says to use rsync with the \"url\" me@localhost:/Users/me/Documents/annex-tests/target. What does rsync do with that url? It tries to ssh into localhost, as user \"me\". There's no magic here. I don't know why your login password isn't working, but you can verify by passing --debug to git-annex that it just runs rsync with the url you've given it. + +BTW, are you sure you want to use a rsync special remote at all, rather than a regular git remote using ssh? +"""]] diff --git a/doc/forum/rsync_asking_for_an_unknown_password/comment_2_ce4b399fdb2f04e30bd8a951994f1c80._comment b/doc/forum/rsync_asking_for_an_unknown_password/comment_2_ce4b399fdb2f04e30bd8a951994f1c80._comment new file mode 100644 index 000000000..494aaa235 --- /dev/null +++ b/doc/forum/rsync_asking_for_an_unknown_password/comment_2_ce4b399fdb2f04e30bd8a951994f1c80._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3JJvaarUKd7xShCMze_kpHVcuCzFrWTI" + nickname="Lucas" + subject="comment 2" + date="2014-07-15T16:18:01Z" + content=""" +Well I got the password issue straightened out (was me, don't ask). + +Both the rsync and git via ssh are working well, thanks! +"""]] diff --git a/doc/forum/rsync_over_ssh__63__.mdwn b/doc/forum/rsync_over_ssh__63__.mdwn new file mode 100644 index 000000000..9c0c9add6 --- /dev/null +++ b/doc/forum/rsync_over_ssh__63__.mdwn @@ -0,0 +1,2 @@ +[Walkthrough](http://git-annex.branchable.com/walkthrough/using_ssh_remotes/) says that when using ssh remotes rsync is used for transfering files. Is rsync used via ssh or unsecure? +-- Michael K. diff --git a/doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment b/doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment new file mode 100644 index 000000000..2b9fc9552 --- /dev/null +++ b/doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-06T15:59:37Z" + content=""" +Everything is done over ssh unless both repos are on the same system (or unless you NFS mount a repo) +"""]] diff --git a/doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment b/doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment new file mode 100644 index 000000000..49003937b --- /dev/null +++ b/doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://m-f-k.myopenid.com/" + ip="92.194.43.135" + subject="comment 2" + date="2011-03-06T16:33:19Z" + content=""" +Great! This was the only thing about git-annex which could have kept me from using it. --Michael +"""]] diff --git a/doc/forum/rsync_remote_is_not_available_from_a_cloned_repo/comment_1_2e340c5a6473f165dc06cc35db38e5c0._comment b/doc/forum/rsync_remote_is_not_available_from_a_cloned_repo/comment_1_2e340c5a6473f165dc06cc35db38e5c0._comment new file mode 100644 index 000000000..2b6ff45df --- /dev/null +++ b/doc/forum/rsync_remote_is_not_available_from_a_cloned_repo/comment_1_2e340c5a6473f165dc06cc35db38e5c0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="hannes" + ip="130.226.142.243" + subject="original repo git annex version" + date="2012-07-08T11:55:42Z" + content=""" +is 3.20120629 +"""]] diff --git a/doc/forum/rsyncing_.git__47__annex__47__objects.mdwn b/doc/forum/rsyncing_.git__47__annex__47__objects.mdwn new file mode 100644 index 000000000..876b5e04a --- /dev/null +++ b/doc/forum/rsyncing_.git__47__annex__47__objects.mdwn @@ -0,0 +1,24 @@ +In short: is it safe to rsync .git/annex/objects/ to other clones? + +I'm in the process of migrating a lot of my files to a new backend. Most them +still use the old non-file-size-tracking SHA1 backend from when WORM was the +default. I have multiple clones that each use about 460 GB of their 500 GB +drives. + +I've noticed that git-annex creates hardlinks to migrated content in +.git/annex/objects, so I'm able to migrate all content despite only having 40 +GB of free space. Excellent. + +Now I'm planning to `rsync -a --hard-links .git/annex/objects/ +${CLONE}/.git/annex/objects/` to recreate the hardlinks and save space on the +clones as well. If I `fsck` afterwards, this should be fine, right? + +I've tried this with a test repository and it works but I'd like to be extra +sure that I'm not missing something crucial. + +The alternatives that I'm aware of are: + + * making space first: `git annex dropunused "1-20000"` and `git annex get .` + * running `git annex migrate` in each clone. + +I expect rsync to be safer and faster than these alternatives. diff --git a/doc/forum/rsyncing_.git__47__annex__47__objects/comment_1_25eb9f7be5730337b9efd96dce9efd2e._comment b/doc/forum/rsyncing_.git__47__annex__47__objects/comment_1_25eb9f7be5730337b9efd96dce9efd2e._comment new file mode 100644 index 000000000..8d9e22a7e --- /dev/null +++ b/doc/forum/rsyncing_.git__47__annex__47__objects/comment_1_25eb9f7be5730337b9efd96dce9efd2e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-16T17:36:48Z" + content=""" +As long as you fsck afterwards, this is fine. + +You might want to `git annex fsck --all` in case you have objects for old versions of files. +"""]] diff --git a/doc/forum/rsyncing_.git__47__annex__47__objects/comment_2_d7ceae666c8a1951021d3c6e6ac39a11._comment b/doc/forum/rsyncing_.git__47__annex__47__objects/comment_2_d7ceae666c8a1951021d3c6e6ac39a11._comment new file mode 100644 index 000000000..f9c449f5e --- /dev/null +++ b/doc/forum/rsyncing_.git__47__annex__47__objects/comment_2_d7ceae666c8a1951021d3c6e6ac39a11._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="gernot" + ip="89.0.237.214" + subject="comment 2" + date="2013-11-18T15:09:59Z" + content=""" +Thanks for the confirmation, Joey! I also wouldn't have thought of `--all`. +"""]] diff --git a/doc/forum/s3_vs_ssh_Performance_Problems.mdwn b/doc/forum/s3_vs_ssh_Performance_Problems.mdwn new file mode 100644 index 000000000..5176e196f --- /dev/null +++ b/doc/forum/s3_vs_ssh_Performance_Problems.mdwn @@ -0,0 +1,8 @@ +I backup/sync my music using annex. I used to have one repo with 3 clones, one full copy on my vps, one full copy and one partial copy on my laptops. I decided to move all data to s3. Declared my vps repo dead, purged history (I do not care about history for this particular repo) pushed the git repo to a different computer (bare repo no data) and data to s3 (gpg encrypted). I've just finished uploading all files (around 200gb) couple files failed during the initial upload so I did a `git annex copy --quiet --to mys3 --fast` this command used to take 15 20 secs on my laptop when sending data to vps using ssh but now it took 2 hours to complete (pushing mem usage to 90%). + +I have one other repo (1.5gb in size 42k files using indirect mode, data gpg encrypted on s3) using the same setup except this repos content has always been on s3 i had the same behavior on this repo too. adding a file and running a copy to push content to s3 took couple hours even if I add a single 1kb file. I used to blame my hard drive, damn thing is slow but now I think this is related to s3. is there any workaround for this? + +Both machines are using, + + git-annex version: 4.20130913-gd20a4f2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi diff --git a/doc/forum/s3_vs_ssh_Performance_Problems/comment_1_65f064f09d7850abecab97007b0d30f0._comment b/doc/forum/s3_vs_ssh_Performance_Problems/comment_1_65f064f09d7850abecab97007b0d30f0._comment new file mode 100644 index 000000000..aa3e06cc0 --- /dev/null +++ b/doc/forum/s3_vs_ssh_Performance_Problems/comment_1_65f064f09d7850abecab97007b0d30f0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2013-11-21T04:09:15Z" + content=""" +Is + + git annex copy --not --in mys3 --to mys3 . + +any faster? +"""]] diff --git a/doc/forum/s3_vs_ssh_Performance_Problems/comment_2_baaf2384d9196077268e9ca9bbe3b871._comment b/doc/forum/s3_vs_ssh_Performance_Problems/comment_2_baaf2384d9196077268e9ca9bbe3b871._comment new file mode 100644 index 000000000..f54e49b2b --- /dev/null +++ b/doc/forum/s3_vs_ssh_Performance_Problems/comment_2_baaf2384d9196077268e9ca9bbe3b871._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2013-11-21T17:47:57Z" + content=""" +No difference. Both take roughly the same time but I did time a couple of runs with both commands they usually take 3 to 5 minutes to complete. Maybe git did something behind the scenes like gc? But still slower than it used to be. My other repo (one with 42k files) still takes a 2 hours. +"""]] diff --git a/doc/forum/s3_vs_ssh_Performance_Problems/comment_3_dc44be42070c073d150c476406e9b425._comment b/doc/forum/s3_vs_ssh_Performance_Problems/comment_3_dc44be42070c073d150c476406e9b425._comment new file mode 100644 index 000000000..cbd460818 --- /dev/null +++ b/doc/forum/s3_vs_ssh_Performance_Problems/comment_3_dc44be42070c073d150c476406e9b425._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 3" + date="2013-11-22T20:21:11Z" + content=""" +Well it's not related to s3... that copy command won't even do any network traffic if there is nothing to copy. I have a similarly configured annex with 4500 files and that command takes 10 seconds to run. + +I do remember there being a recent fix that reduced the algorithmic complexity of an operation, but I forget which. +"""]] diff --git a/doc/forum/s3_vs_ssh_Performance_Problems/comment_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment b/doc/forum/s3_vs_ssh_Performance_Problems/comment_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment new file mode 100644 index 000000000..2e4cda634 --- /dev/null +++ b/doc/forum/s3_vs_ssh_Performance_Problems/comment_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 4" + date="2013-12-12T20:14:01Z" + content=""" +You mentioned something about high memory usage when copying. How much memory are we talking about? + +Have you run `git annex forget` in this repository before? It kind of sounds like you have, and it might be possible that it's repeatedly trying to forget old history for some reason. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history.mdwn b/doc/forum/safely_dropping_git-annex_history.mdwn new file mode 100644 index 000000000..a6d8e6677 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history.mdwn @@ -0,0 +1,20 @@ +the git-annex branch of a repository i've had running since 2010 has grown to unmanagable dimensions (5gb in a fresh clone of the git-annex branch, while the master branch has merely 40mb, part of which is due to checked-in files), resulting in git-annex-merges to take in the order of magnitude of 15 minutes. getting an initial clone of the git-annex branch (not the data) takes hours alone in the "remote: Counting objects" phase (admittedly, the origin server is limited in ram, so it spends its time swapping the git process back and forth). + +is there a recommended way for how to reset the git-annex branch in a coordinated way? of course, this would have to happen on all copies of the repo at the same time. + +the workflow i currently imagine is + +* rename all copies of the repository (the_repo → the_repo-old, the_repo.git → the_repo-old.git) +* clone the old origin repository to a new origin with --single-branch. (this would be *the* oportunity to ``git filter-branch --prune-empty --index-filter 'git rm --cached --ignore-unmatch .git-annex -r' master`` as well, to get rid of commits of pre-whatever versions) +* ``git annex init`` on the master repository +* clone it to all the other copies and ``git annex init`` there +* set all the configuration options (untrusted repos etc) again +* either + * ``git annex reinject`` the files that are already present on the respective machines, or + * move the .git/annex/objects files over from the original locations, and use ``git annex fsck`` to make git-annex discover which files it already has, if that works. (i have numcopies=2, thus i'd dare to move instead of copy even when trying this out the first time. complete copies, even of partially checked out clones, will exceed the capacities of most clients) + +my questions in that endeavor are: + +* is there already a standard workflow for this? +* if not, will the above do the trick? +* can anything be done to avoid such problems in future? diff --git a/doc/forum/safely_dropping_git-annex_history/comment_10_a4b93a3fbc98d9b86e942f95e0039862._comment b/doc/forum/safely_dropping_git-annex_history/comment_10_a4b93a3fbc98d9b86e942f95e0039862._comment new file mode 100644 index 000000000..b24a058f6 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_10_a4b93a3fbc98d9b86e942f95e0039862._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 10" + date="2013-07-20T20:03:20Z" + content=""" +Since you seem to have found a way that works, I'm only answering for completeness: To resolve a conflicted merge on the git-annex branch, you can just add all lines present in either side of the merge, in any order. This won't necessarily be the most minimal resolution, but it is guaranteed to always be a valid one. There is a git-union-merge program in the git-annex source (not built by default) that can do that when merging any set of branches. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_11_383882fafd32f25ed22b5eb2fb3691b9._comment b/doc/forum/safely_dropping_git-annex_history/comment_11_383882fafd32f25ed22b5eb2fb3691b9._comment new file mode 100644 index 000000000..fbfe64156 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_11_383882fafd32f25ed22b5eb2fb3691b9._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="propagating squashed history to other remotes" + date="2013-08-12T01:44:59Z" + content=""" +The easiest method seems to be to force-push git-annex and master to other remotes, e.g. + + git push -f myremote git-annex:refs/heads/git-annex + +Before doing this, make sure location logs etc had a chance to propagate across all remotes. + +It's a good idea to remove synched/ branches before doing git-annex sync on the repos with rewritten history, too: + git branch -D synced/master + git branch -D synced/annex + + +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_12_47794a2abf29bf4ea2763ff89d872ab4._comment b/doc/forum/safely_dropping_git-annex_history/comment_12_47794a2abf29bf4ea2763ff89d872ab4._comment new file mode 100644 index 000000000..5c0931604 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_12_47794a2abf29bf4ea2763ff89d872ab4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4830:1600:187::2" + subject="comment 12" + date="2013-09-04T06:38:00Z" + content=""" +`git annex forget` automates this now, without needing to force-push or have a flag day. Needs a version of git-annex supporting it installed on *all* the computers you use the repo on. Repos notice they need to forget when git annex is run in them, and do, automatically. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_1_4fd76d10a93fe01588fce7a621f9254d._comment b/doc/forum/safely_dropping_git-annex_history/comment_1_4fd76d10a93fe01588fce7a621f9254d._comment new file mode 100644 index 000000000..e46f7291a --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_1_4fd76d10a93fe01588fce7a621f9254d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 1" + date="2012-10-31T16:03:55Z" + content=""" +Yes, you can use fsck like that. I outlined a similar approach [here](http://git-annex.branchable.com/forum/Delete_unused_files__47__metadata/#comment-e2bd822214df96606a60e8aee2c8637a), and I think you don't even need to make new git repositories, just delete the old branch and git gc it -- but I've not heard of anyone doing this yet. + +So, since 2010, your repo must have gone through at least one and probably two repository format changes, which bloated the git branch. Hopefully we'll have no more of those. My largest repo that also went through that is under 150 mb however. + +There was a recent bug fix where `git annex copy` unnecessarily updated location log even when the file was already copied. That kind of thing can bloat the repository, especially if you had that in a cron job... You might find `git annex log` useful to look through history of files and see if there have been a lot of location changes logged for whatever reason. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_2_10ecf3220ffcbbe94ba09da225458f18._comment b/doc/forum/safely_dropping_git-annex_history/comment_2_10ecf3220ffcbbe94ba09da225458f18._comment new file mode 100644 index 000000000..21befd41a --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_2_10ecf3220ffcbbe94ba09da225458f18._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="worked well" + date="2012-11-04T12:23:56Z" + content=""" +the procedure i outlined originally worked well for me; the method chosen for reinjection was moving over the .git/annex/objects directory and doing a ``git annex fsck``. + +special care had to be taken of the special remote (rsync+gpg) -- i guess that's why they are called special ;-) . as described in the forum post you linked, i had to copy over remote.log and the uuid.log line from the old git-annex branch -- otherwise, a ``git annex initremote`` would have generated a new hmac, effectively resetting the remote repo. + +the formerly 5gb git-annex branch (admittedly not ``git gc``'d recently, but that just wasn't feasible any more) shrunk down to around 25mb of current location information. i'll keep an eye on how it's growing to see if the problem is inherent or if it was just old bugs causing trouble. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_3_e3beb8acb075faaeef6c052aecbf0a41._comment b/doc/forum/safely_dropping_git-annex_history/comment_3_e3beb8acb075faaeef6c052aecbf0a41._comment new file mode 100644 index 000000000..fbcbdbc4f --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_3_e3beb8acb075faaeef6c052aecbf0a41._comment @@ -0,0 +1,50 @@ +[[!comment format=mdwn + username="http://vjt.myopenid.com/" + nickname="vjt" + subject="drop "content removed from annex" history" + date="2013-06-18T02:12:01Z" + content=""" +Joey, + +dropping the git-annex branch and subsequent fsck worked. Moreover, as I turned my repository in containing over 700k objects due to a silly cycle of `git annex add` / `git annex unannex`, bloating *both* `git-annex` and `master` history, to clean up I successfully performed a squashed rebase of master onto itself. + +Here's what I did, in detail: + + $ git checkout git-annex + $ cp *.log .. + $ git checkout master + $ git br -D git-annex + $ git br -D synced/git-annex + $ git checkout + $ git checkout -b git-annex + $ cp ../*.log . + $ + $ git add *.log + $ git commit --amend -m 'Init' + +With this, I got rid of the many `update` commits. Now, the fun part: + + $ git checkout master + $ git rebase -i + + $ :wq + +Rebase went fine, and I was left with a clean master. I brought also `synced/master` up to date: + + $ git checkout synced/master + $ git reset --hard master + +Now I re-created all the location links with fsck: + + $ git annex fsck + +And eventually, got rid of the redundant history: + + $ git reflog expire --expire=now --expire-unreachable=now --all + $ git gc --prune=now + $ git repack + $ git prune + +yay, 500k objects less ^_^'. + +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_4_61a5fe2e7e47c60a8b237ea69404a37f._comment b/doc/forum/safely_dropping_git-annex_history/comment_4_61a5fe2e7e47c60a8b237ea69404a37f._comment new file mode 100644 index 000000000..d257e6f62 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_4_61a5fe2e7e47c60a8b237ea69404a37f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="would git annex fsck also recreate location tracking info for special remotes?" + date="2013-07-17T17:02:50Z" + content=""" +Suppose I want to drop history like discussed in this entry. How well does this deal with special (e.g. directory on an offline disk) remotes? +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment b/doc/forum/safely_dropping_git-annex_history/comment_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment new file mode 100644 index 000000000..aafa8fa1b --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 5" + date="2013-07-17T17:06:39Z" + content=""" +Also, would simply squashing git-annex branch history (without fsck etc) work? +This seems easier. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_6_410a7296c2cee16d3d5bb618a5a41c1d._comment b/doc/forum/safely_dropping_git-annex_history/comment_6_410a7296c2cee16d3d5bb618a5a41c1d._comment new file mode 100644 index 000000000..05ac27361 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_6_410a7296c2cee16d3d5bb618a5a41c1d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 6" + date="2013-07-17T18:57:12Z" + content=""" +You can use `git annex fsck --from remote` to verify that every file location tracking thinks is on the remote still is. It's innefficient though -- it has to download the whole file to check the special remote still has the right content! That transfer can be avoided by adding --fast. + +This is documented in the man page. :) +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_7_42cf492fc98a9eba8176387749ef12e0._comment b/doc/forum/safely_dropping_git-annex_history/comment_7_42cf492fc98a9eba8176387749ef12e0._comment new file mode 100644 index 000000000..5c10b988c --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_7_42cf492fc98a9eba8176387749ef12e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 7" + date="2013-07-17T18:59:03Z" + content=""" +I don't see any reason why squashing git-annex branch history would not work. If you squash it to the same sha in each clone, things would be very happy, but even if you squash it to different shas, the union merge should result in those different versions of the same data automatically merging together. +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_8_c0327ada073d8b69535f71b4dc6aa57e._comment b/doc/forum/safely_dropping_git-annex_history/comment_8_c0327ada073d8b69535f71b4dc6aa57e._comment new file mode 100644 index 000000000..120e4daef --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_8_c0327ada073d8b69535f71b4dc6aa57e._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="git annex merge driver?" + date="2013-07-19T17:04:53Z" + content=""" + +I've tried rebasing git-annex branch, and I hit a bunch of conflicts (both in uuid.log and for individual content file logs) of the form: + +

+<<<<<<< HEAD
+1369615760.859476s 1 016d9095-0cbc-4734-a498-4e0421e257d7
+=======
+1369615760.845334s 1 016d9095-0cbc-4734-a498-4e0421e257d7
+>>>>>>> 52e60e8... update
+1369615359.195672s 1 38c359dc-a7d9-498d-a818-2e9beae995b8
+
+ +As I understand, git-annex has a special timestamp-based merge driver to deal with these. Is there a way to use that with git rebase? + +"""]] diff --git a/doc/forum/safely_dropping_git-annex_history/comment_9_f83d6090aea2b7d5d54c876df940cbad._comment b/doc/forum/safely_dropping_git-annex_history/comment_9_f83d6090aea2b7d5d54c876df940cbad._comment new file mode 100644 index 000000000..cbfd67850 --- /dev/null +++ b/doc/forum/safely_dropping_git-annex_history/comment_9_f83d6090aea2b7d5d54c876df940cbad._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="git checkout --orphan" + date="2013-07-19T17:49:37Z" + content=""" +Instead of rebase, --orphan seems to be the right answer for pruning history: create a new git-annex orphan branch and git add and commit the files. So: +

+
+git status 
+
+# verify there are no uncommitted or untracked files
+
+# master branch
+git branch -m old-master
+git checkout --orphan master
+git add .
+git commit -m 'first commit'
+
+# git annex branch
+git branch -m git-annex old-git-annex
+git checkout git-annex
+git checkout --orphan git-annex
+git add .
+git commit -m 'first commit'
+git checkout master
+
+# at this point, you may want to double-check that everything is still OK
+
+# finally, remove branches and clean up the objects:
+git branch -D old-master old-git-annex
+git reflog expire --expire=now --all
+git prune
+git gc
+
+
+ +The repo remains functional and .git is smaller. + +"""]] diff --git a/doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn b/doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn new file mode 100644 index 000000000..60014a7f5 --- /dev/null +++ b/doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn @@ -0,0 +1 @@ +This is just a comment on git-annex building on haskell platform 2011.2.0.0 on archlinux. It just works. diff --git a/doc/forum/shared_cipher_tries_to_use_gpg.mdwn b/doc/forum/shared_cipher_tries_to_use_gpg.mdwn new file mode 100644 index 000000000..ccaa0c59d --- /dev/null +++ b/doc/forum/shared_cipher_tries_to_use_gpg.mdwn @@ -0,0 +1,10 @@ +I tried + + git annex initremote encsharedtest type=directory encryption=shared directory=/home/lee/gitannexplay + +and got errors: + + initremote encsharedtest gpg: error reading key: public key not found + +Looks like it thinks "shared" should be the name of a key rather than an instruction to use the shared cipher. +Am I doing something wrong? diff --git a/doc/forum/shared_cipher_tries_to_use_gpg/comment_1_760961eaaa7d5c254dd71c5792437c9e._comment b/doc/forum/shared_cipher_tries_to_use_gpg/comment_1_760961eaaa7d5c254dd71c5792437c9e._comment new file mode 100644 index 000000000..e97118b8a --- /dev/null +++ b/doc/forum/shared_cipher_tries_to_use_gpg/comment_1_760961eaaa7d5c254dd71c5792437c9e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-23T19:51:03Z" + content=""" +That's the right syntax, and it works when I try it, even if I move my `~/.gnupg` directory away. + +You sure you have a new enough git-annex for the shared cipher feature? It appeared in version 3.20120430 + +You could try passing the `--debug` option to see what it's trying to do with gpg when it fails. +"""]] diff --git a/doc/forum/shared_cipher_tries_to_use_gpg/comment_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment b/doc/forum/shared_cipher_tries_to_use_gpg/comment_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment new file mode 100644 index 000000000..7c36e7cf4 --- /dev/null +++ b/doc/forum/shared_cipher_tries_to_use_gpg/comment_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlFUH5H4OUj9vMJIoXQs8bheiptgANQ6fU" + nickname="lee" + subject="A little too old" + date="2012-10-23T20:47:40Z" + content=""" +That's the problem, then. I have 3.20120406. For my purposes a gpg key with no passphrase works, though. Thanks. +"""]] diff --git a/doc/forum/something_really_good_happened_with_3.20130124.mdwn b/doc/forum/something_really_good_happened_with_3.20130124.mdwn new file mode 100644 index 000000000..73b283822 --- /dev/null +++ b/doc/forum/something_really_good_happened_with_3.20130124.mdwn @@ -0,0 +1,5 @@ +The web app used to be unresponsive without manual refreshes. Now it's all snappy and responsive and quickly reflects what the assistant is doing. + +It used to be a complete crapshoot whether the assistant actually shut down when you told it to (either on the command line or through the webapp). I used to have to manually kill leftover assistants and child processes routinely. Now... you want it gone, and it's gone instantly, every time. + +Something really good happened with this last version, thank you joey! diff --git a/doc/forum/something_really_good_happened_with_3.20130124/comment_1_1712bddd2f483a353f6313aa626445f1._comment b/doc/forum/something_really_good_happened_with_3.20130124/comment_1_1712bddd2f483a353f6313aa626445f1._comment new file mode 100644 index 000000000..e0a4907c6 --- /dev/null +++ b/doc/forum/something_really_good_happened_with_3.20130124/comment_1_1712bddd2f483a353f6313aa626445f1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-01-25T22:35:00Z" + content=""" +We fixed some broken javascript that only worked in all the browsers I tried, but not yours. It's always been this cool, just glad you can also experience it now! +"""]] diff --git a/doc/forum/sparse_git_checkouts_with_annex.mdwn b/doc/forum/sparse_git_checkouts_with_annex.mdwn new file mode 100644 index 000000000..97d2f445d --- /dev/null +++ b/doc/forum/sparse_git_checkouts_with_annex.mdwn @@ -0,0 +1,31 @@ +I checked in my music collection into git annex (about 25000 files) and i'm really impressed by the performance of git annex (after i've done an git-repack). Now i'm also moving my movies into the same git-annex, but i have the following layout of my disk drives: + +* small raid-1 for important stuff (music, documents), which is also backupped (aka: raid) +* big bulk data store (aka: media) + +In the git-annex the following layout of files is used: + +* documents/ <- on raid +* music/ <- on raid +* videos/ <- on media + +Now i didn't simply clone the raid-annex to media, but did an sparse-checkout (possible since version 1.7.0) + +* raid: .git-annex/, documents/ and music +* media: .git-annex/, videos/ + +As you can see i have to checkout the .git-annex directory with the file-logs twice which slows down git operations. Everything else works fine until now. git-annex doesn't have any problem, that only a part of the symlinks are present, which is really great. Is there a possibility to sparse checkout the .git-annex directory also? Perhaps splitting the log files in .git-annex/ into N subfolders, corresponding to the toplevel subfolders, like this? + +Before: + + $ ls .git-annex + 00 01 02.... + +After: + + $ ls .git-annex + documents/ music/ videos/ + $ ls .git-annex/documents + 00 01 02.... + +This would make it possible to checkout only the part of the log files which i'm interested in. diff --git a/doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment b/doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment new file mode 100644 index 000000000..7adf4fc4d --- /dev/null +++ b/doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-07T16:32:04Z" + content=""" +That's awesome, I had not heard of git sparse checkouts before. + +It does not make sense to tie the log files to the directory of the corresponding files, as then the logs would have to move when the files are moved, which would be a PITA and likely make merging log file changes very complex. Also, of course, multiple files in different locations can point at the same content, which has the same log file. And, to cap it off, git-annex can need to access the log file for a given key without having the slightest idea what file in the repository might point to it, and it would be very expensive to scan the whole repository to find out what that file is in order to lookup the filename of the log file. + +The most likely change in git-annex that will make this better is in [[this_todo_item|todo/branching]] -- but it's unknown how to do it yet. +"""]] diff --git a/doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment b/doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment new file mode 100644 index 000000000..d8088a2d8 --- /dev/null +++ b/doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-07T16:33:30Z" + content=""" +BTW, git-annex unused *will* have a problem that not all the symlinks are present. It will suggest dropping content belonging to the excluded symlinks. +"""]] diff --git a/doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment b/doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment new file mode 100644 index 000000000..1b849ef89 --- /dev/null +++ b/doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 3" + date="2011-04-08T07:31:03Z" + content=""" +So perhaps checking if git-status (or similar) complains about missing files is a possible solution for this? +"""]] diff --git a/doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment b/doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment new file mode 100644 index 000000000..9280fc51d --- /dev/null +++ b/doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 4" + date="2011-04-08T07:54:37Z" + content=""" +And something else i've done is, that i symlinked the video/ directory from the media annex to the normal raid annex + + ln -s ~/media/annex/video ~/annex + +And it's working out great. + + ~annex $ git annex whereis video/series/episode1.avi + whereis video/series/episode1.avi(1 copy) + f210b45a-60d3-11e0-b593-3318d96f2520 -- Trantor - Media + ok + +I really like this, perhaps it is a good idea to store all log files in every repo, but maybe there is a possibilitiy to to pack multiple log files into one single file, where not only the time, the present bit and the annex-repository is stored, but also the file key. I don't know if this format would also be merged correctly by the union merge driver. + +"""]] diff --git a/doc/forum/special_remote_for_IMAP.mdwn b/doc/forum/special_remote_for_IMAP.mdwn new file mode 100644 index 000000000..2aa956551 --- /dev/null +++ b/doc/forum/special_remote_for_IMAP.mdwn @@ -0,0 +1,44 @@ +I have implemented a special remote that stores files as email messages on an imap server. You need to install three utilities that the hooks invoke to deal with the email: mutt, imaputils, and munpack. I use mutt to send the email with the file as a mime attachment; imaputils talks to the imap server to check for and retrieve the message containing the desired file; and munpack extracts and decodes the attachment to get our file back. + +Several programs could be used in place of mutt, but the latter has a convenient command-line option for attaching files; mutt is of course available in the repositories of most linux distributions. + +imaputils is a perl program available at http://sourceforge.net/projects/imaputils/ +It has several perl library dependencies that you might need to download using the cpan tool. +What imaputils does for you is provide a command line tool for interacting with the mail server. You can search for mail with a particular subject (for example), delete mail, retrieve messages, and in general do anything that you can do with a mail client such as mutt, but from the command line rather than a curses interface. This allows you to in turn write scripts that talk to imap servers. + +munpack is part of the mpack package. This is included in the Ubuntu and Debian repositories, and can probably be easily obtained for most linuxes. munpack extracts and decodes mime attachments from the command line. + +I define the special remote with + + git annex initremote hogneygmail type=hook encryption=gitannex hooktype=hogneygmail + +The pgp key "gitannex" is a key established just for this purpose, that has no passphrase. This allows me to use encryption transparently. You could also use encryption=shared if your version of git-annex is recent enough. I also did + + git annex untrust hogneygmail + +Here are the hooks: + + hogneygmail-store-hook = mutt -n -s $ANNEX_KEY -a $ANNEX_FILE -- {email address} < /dev/null + hogneygmail-checkpresent-hook = "(imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --count | grep -q \"1 messages\" -) && echo $ANNEX_KEY" + hogneygmail-retrieve-hook = "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --display | munpack -fq && mv $ANNEX_KEY $ANNEX_FILE; rm $ANNEX_KEY.desc" + hogneygmail-remove-hook = "imaputils.pl --conf {imap config file} --subject $ANNEX_KEY --delete" + +The bits inside of the curly brackets, for example {email address}, are what you need to specialize for your particular case (removing the brackets as well). The {imap config file} is a file that contains some configuration for imaputils. In my case it contains + + ssl + pass {password} + host {mail host} + user {mail username} + box {name of mailbox to check} + +The first line tells imaputils to use ssl, and the third line is the address of the mail host. I include my username and password so I won't need to type these in repeatedly. Of course this means that you need to protect this file carefully. + + + +The operation of the hooks is pretty straightforward. The store-hook attaches the file to an otherwise empty email message with a subject equal to the name of the key, and mails it off. Note that if you use encryption then the keys generated by git-annex here will not be the same ones you see on your local disc. The checkpresent-hook asks the imap server how many emails have the subject equal to the key we are looking for; only if the reply contains "1 messages" are we sure the right one is there. The retrieve-hook uses the "--display" option to imaputils to stream the message, pipes it to munpack to silently extract the attachment (which is our (encrypted) file), and moves the result into the file contents. It then cleans up by deleting the .desc file that I can't prevent munpack from leaving on the disk, even when the message is blank. The remove-hook passes the "-- delete" option to imaputils to supposedly delete the target message from the mail server. + +I've performed very limited testing of this, and my knowledge of git and, especially, git-annex is very primitive, so I'm sure this could be vastly improved. In my testing with gmail this seems to work fine, except that messages do not get deleted from the server - I don't know why. + +I've developed this as an experiment and proof of concept, and have no knowledge of whether actually using this is in accord with the terms of service of gmail or any other mail service you might be using, nor whether it is safe or a good idea. + +-- Lee diff --git a/doc/forum/special_remote_for_IMAP/comment_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment b/doc/forum/special_remote_for_IMAP/comment_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment new file mode 100644 index 000000000..8d81dcfd0 --- /dev/null +++ b/doc/forum/special_remote_for_IMAP/comment_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="Neat idea" + date="2012-10-26T18:35:21Z" + content=""" +I imagine that most mail servers have a maximum attachment size; that seems the most likely problem with using this. + +The directory special remote has support for splitting up keys into chunks to work around file size limits. It would be good, I suppose, to add that to the hook special remote too. +"""]] diff --git a/doc/forum/special_remote_for_IMAP/comment_2_9c46fe8a857aa7a5ce797288144386bd._comment b/doc/forum/special_remote_for_IMAP/comment_2_9c46fe8a857aa7a5ce797288144386bd._comment new file mode 100644 index 000000000..50358ea53 --- /dev/null +++ b/doc/forum/special_remote_for_IMAP/comment_2_9c46fe8a857aa7a5ce797288144386bd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlFUH5H4OUj9vMJIoXQs8bheiptgANQ6fU" + nickname="lee" + subject="chunking" + date="2012-10-26T22:05:16Z" + content=""" +That's a good point. But the splitting could easily be added to the hooks, and wouldn't need to be built in to git-annex. +"""]] diff --git a/doc/forum/special_remote_for_IMAP/comment_3_27e3b644df6942ce4c103236d0d5cb1b._comment b/doc/forum/special_remote_for_IMAP/comment_3_27e3b644df6942ce4c103236d0d5cb1b._comment new file mode 100644 index 000000000..b5d9137e6 --- /dev/null +++ b/doc/forum/special_remote_for_IMAP/comment_3_27e3b644df6942ce4c103236d0d5cb1b._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 3" + date="2013-05-22T09:53:47Z" + content=""" +I had to change the checkpresent hook to: + + hogneygmail-checkpresent-hook = (imaputils.pl --subject $ANNEX_KEY --count | grep -q \\"1 messages\\" -) && echo $ANNEX_KEY || exit 0 + +Also, i have 5 files more than 30MB in size, that refuse to transfer. + + postdrop: warning: uid=1001: File too large + sendmail: fatal: tou(1001): message file too big + Error sending message, child exited 75 (Deferred.). + Could not send the message. + + store hook exited nonzero! + failed + +This really needs some split operations to support large files. + +"""]] diff --git a/doc/forum/special_remote_for_iPods.mdwn b/doc/forum/special_remote_for_iPods.mdwn new file mode 100644 index 000000000..eddda5936 --- /dev/null +++ b/doc/forum/special_remote_for_iPods.mdwn @@ -0,0 +1,5 @@ +I know versions of this question have been asked before, but I'm looking for a different answer. + +I would like a braindead special remote that can be used with devices such as portable music players. No symbolic links, no hashing, no rewriting of the filenames. The remote can be untrusted, file identity can be checked with just the filename and maybe the size. The "directory" special remote with the WORM backend seems to come closest, but does too much. + +Should I just try to roll it using hooks? diff --git a/doc/forum/special_remote_for_iPods/comment_1_37cc3dc740341cc663074fd3bfb85947._comment b/doc/forum/special_remote_for_iPods/comment_1_37cc3dc740341cc663074fd3bfb85947._comment new file mode 100644 index 000000000..35ac105c1 --- /dev/null +++ b/doc/forum/special_remote_for_iPods/comment_1_37cc3dc740341cc663074fd3bfb85947._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 1" + date="2012-10-05T00:39:43Z" + content=""" +I've been thinking in similar directions on this page: [[design/assistant/desymlink]] +"""]] diff --git a/doc/forum/speed_up_assistant_startup_on_large_repositories.mdwn b/doc/forum/speed_up_assistant_startup_on_large_repositories.mdwn new file mode 100644 index 000000000..e43476c7b --- /dev/null +++ b/doc/forum/speed_up_assistant_startup_on_large_repositories.mdwn @@ -0,0 +1 @@ +Starting the assistant on a repository with a huge amount of files (f.e. `annexed files in working tree: 22087`) takes a very long time. Is there a way to speed it up? F.e. just checking the file stamps and comparing them with the last assistant run time? Checking if the files are modified could be done with the regular repository check. Thoughts? diff --git a/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_1_5ba637a0f6d01ba24fe25e6265134e0a._comment b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_1_5ba637a0f6d01ba24fe25e6265134e0a._comment new file mode 100644 index 000000000..0abe4dec8 --- /dev/null +++ b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_1_5ba637a0f6d01ba24fe25e6265134e0a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:43:26Z" + content=""" +Checking the time stamps is what it does. + +How long is a very long time? +"""]] diff --git a/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_2_d65746697977f8971a4b59f5b413f926._comment b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_2_d65746697977f8971a4b59f5b413f926._comment new file mode 100644 index 000000000..e6915d232 --- /dev/null +++ b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_2_d65746697977f8971a4b59f5b413f926._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio" + nickname="Tobias" + subject="measuring how-to" + date="2013-11-08T16:55:58Z" + content=""" +How can I measure how much time the startup scan takes? I tried to find it out using the debug log, but couldn't find any usable notice when the startup scan was finished. Maybe this two lines? + + [...] + [2013-11-08 16:00:45 CET] Watcher: Performing startup scan + [...] + [2013-11-08 16:15:30 CET] Watcher: watching +"""]] diff --git a/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_3_be6c4fe5a0c745688438b716973791cc._comment b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_3_be6c4fe5a0c745688438b716973791cc._comment new file mode 100644 index 000000000..d3fe6ef4c --- /dev/null +++ b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_3_be6c4fe5a0c745688438b716973791cc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2013-11-08T17:04:23Z" + content=""" +That's right. + +15 minutes is certainly a very long time. + +Is this on a slow spinning disk? USB disk? +"""]] diff --git a/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_4_a07472338a08c068a9b88b2176fc2bee._comment b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_4_a07472338a08c068a9b88b2176fc2bee._comment new file mode 100644 index 000000000..41e69ab1e --- /dev/null +++ b/doc/forum/speed_up_assistant_startup_on_large_repositories/comment_4_a07472338a08c068a9b88b2176fc2bee._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 4" + date="2013-11-17T17:28:06Z" + content=""" +The mentioned repository is stored on spinning disk. +Maybe it would help to store the .git directory on an SSD, but I'm not sure how to do it. +"""]] diff --git a/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer.mdwn b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer.mdwn new file mode 100644 index 000000000..f40b08324 --- /dev/null +++ b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer.mdwn @@ -0,0 +1,28 @@ +I setup a local git annex repo and tried to pair it with an empty repo on my notebook. All done via the webapp. + +But pairing failed somehow, because I get this error while transfer seems to go on forever. + + ssh_exchange_identification: read: Connection reset by peer + ssh_exchange_identification: read: Connection reset by peer + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + +The webapp shows the remote repo as "unfinished repository". + +I can access the other computer via ssh and an other git-annex repo pairing between the two computers work fine. + +UPDATE: In the meantime I setup another paired repo on these two computers. Everything works fine. + +I added the repos from scratch again and the same errors occurs again. The repositories which do not pair are the Documents folder on my desktop and on my macbook. Is there something special with macs documents folder? + + [2013-12-31 10:53:23 CET] PushRetrier: Syncing with macbook.local_Documents + fatal: 'macbook.local_Documents' does not appear to be a git repository + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + + +juh diff --git a/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_1_87b9540e37abb16c0ec7605f5ab204a5._comment b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_1_87b9540e37abb16c0ec7605f5ab204a5._comment new file mode 100644 index 000000000..b44c0c3b5 --- /dev/null +++ b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_1_87b9540e37abb16c0ec7605f5ab204a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Uic1ohv6" + ip="62.253.227.100" + subject="Are you using encfs?" + date="2014-01-09T16:30:50Z" + content=""" +I've seen similar error messages when the local annex was on an encfs-mounted decrypted directory. Seemingly git-annex tries to create SSH sockets in .git, and this goes wrong at least in some such situations. +"""]] diff --git a/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_2_bd3383c142bf93d9cd496cb668d7782c._comment b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_2_bd3383c142bf93d9cd496cb668d7782c._comment new file mode 100644 index 000000000..719b66eb7 --- /dev/null +++ b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_2_bd3383c142bf93d9cd496cb668d7782c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 2" + date="2014-01-14T21:16:14Z" + content=""" +I tried using git-annex on encfs to see if I could reproduce this problem, and I could not get exactly this error, but I certianly did see it cause problems with the ssh connection caching socket. + +It would be a good idea to `git config annex.sshcaching false` in repositories stored on encfs. + +Actually, given other reports of problems caused by encfs, it would be a good idea to not use git-annex on encfs. There are better ways to encrypt your files. +"""]] diff --git a/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_3_9b1911ae6468d09dae74ab1a60d2757b._comment b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_3_9b1911ae6468d09dae74ab1a60d2757b._comment new file mode 100644 index 000000000..59f0f9f96 --- /dev/null +++ b/doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_3_9b1911ae6468d09dae74ab1a60d2757b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnPgn611P6ym5yyL0BS8rUzO0_ZKRldMt0" + nickname="Samuel" + subject="What are those ?" + date="2014-01-31T07:37:49Z" + content=""" +Hi, + +Could you please indicate what other means of file encryption systems you have in mind? + +The others I know are at a partition level (cryptsetup, LUKS) and are less pratical to setup than a simple encfs. +"""]] diff --git a/doc/forum/ssh_key_setup_woes_in_Android.mdwn b/doc/forum/ssh_key_setup_woes_in_Android.mdwn new file mode 100644 index 000000000..87e2dd25f --- /dev/null +++ b/doc/forum/ssh_key_setup_woes_in_Android.mdwn @@ -0,0 +1,15 @@ +I'm trying to set up a ssh remote on Android using the latest 5.20140421. For some +reason the assistant fails to set up passwordless login on the remote server. It +adds the required line in `.ssh/authorized_keys` on the server side, but it still +keeps asking for the password for every connection. Nothing suspicious appears in +the assistant's log. Also, if I set up a ssh remote on a different directory on the +same server, a new key is generated and added to `authorized_keys`, but the passwordless +login still doesn't work. + +I didn't file a bug since this would make for a very lousy bug report. How could I +look more into what's causing this? Where should the generated keys reside on the +Android filesystem? + +I think it would be useful for the assistant to check that the generated ssh keys are +working properly, and inform the user and/or try to set them up again if there is a +problem, instead of silently falling back to asking for the login password on the console. diff --git a/doc/forum/ssh_key_setup_woes_in_Android/comment_1_f16fbff27a449409699f3dbcf9590622._comment b/doc/forum/ssh_key_setup_woes_in_Android/comment_1_f16fbff27a449409699f3dbcf9590622._comment new file mode 100644 index 000000000..1b2d9a185 --- /dev/null +++ b/doc/forum/ssh_key_setup_woes_in_Android/comment_1_f16fbff27a449409699f3dbcf9590622._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 1" + date="2014-05-19T15:50:34Z" + content=""" +There have been recent improvements in the assistant's handling of ssh keys. This includes no more prompting for ssh keys in the console, ever. Instead, the ssh remote setup would presumably fail if the ssh key didn't work for some reason. + +To debug your problem, you need to use the shell. I would first try running \"git annex get\" or \"git annex copy\" or \"git annex drop\" on a file, and verify that it prompts for the ssh password. Then, take a look at /sdcard/git-annex.home/.ssh/config, and see if you can ssh to the special hostname set up there, from android, and if it asks for a password. If so, ssh -v might be interesting, as it should show it presenting the ssh key to the server. +"""]] diff --git a/doc/forum/ssh_password.mdwn b/doc/forum/ssh_password.mdwn new file mode 100644 index 000000000..855e5992f --- /dev/null +++ b/doc/forum/ssh_password.mdwn @@ -0,0 +1,3 @@ +Currently I have my netbook running git annex and a raspberry pi as a remote storage set up as a git repository. I currently have it set up so that from the terminal i can just do 'ssh pi@mypi -p XXX -C' and it has the password saved. Currently I'm having a problem that any time I add a file to my annex folder on my netbook I have to reenter my password for ssh-askpass for it to upload the file. Once that file is uploaded, it looks to me like it closes the connection and then reopens it and asks for my password again. + +I'm looking in ~/.ssh/ and I'm sure that something there needs to be edited or copied, I'm not really sure what though. Any suggestions? diff --git a/doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment b/doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment new file mode 100644 index 000000000..7ef938330 --- /dev/null +++ b/doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 1" + date="2013-05-30T00:08:52Z" + content=""" +It sounds like you don't have the ssh-agent set up properly in your environment. + +Try starting the git annex agent from the command line and see if that helps. If it works then it is a problem with environment variables. +"""]] diff --git a/doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment b/doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment new file mode 100644 index 000000000..b7a47c9fe --- /dev/null +++ b/doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-30T15:49:27Z" + content=""" +If you set this repository up using the git-annex webapp, and choosing \"remote ssh server\", it will generate a new ssh key, stored in `~/.ssh/git-annex/`, and it will configure `~/.ssh/config` to use this key for a special made-up hostname which is used in the url for the git remote. On the server, it will set up `~/.ssh/authorized_keys` to allow this ssh key to connect without a password and run git-annex-shell. + +I don't know if you used the webapp to set this up. If not, you can try to replicate this setup on your own. If you did and it's not working, you now know where all the peices it sets up are, to figure out what went wrong. +"""]] diff --git a/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__.mdwn b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__.mdwn new file mode 100644 index 000000000..06b58f973 --- /dev/null +++ b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__.mdwn @@ -0,0 +1,3 @@ +Hi, + +I own a computer that I use as a home server. I'm just getting started with git-annex, and I was trying to add an ssh remote. It connected fine, but only gave me the "encrypted rsync" option. I'd like to be able to access these files on the server as well, but the "use a git repository" option didn't show up. How do I enable this? diff --git a/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_1_7244794579a191a677190c60758f32e7._comment b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_1_7244794579a191a677190c60758f32e7._comment new file mode 100644 index 000000000..14e51e79a --- /dev/null +++ b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_1_7244794579a191a677190c60758f32e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmR-xG9O2HWoybxYZPVbYVYxwitfcfDgtE" + nickname="Charles" + subject="comment 1" + date="2013-09-09T00:29:14Z" + content=""" +Oh actually, I just clicked the available option and it gave me a \"connection refused\" due to my using a port other than 22. I edited the .ssh/config, but it decided to use 22 anyway? +"""]] diff --git a/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_2_277cf12907bd7c5930eb4f137b115e29._comment b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_2_277cf12907bd7c5930eb4f137b115e29._comment new file mode 100644 index 000000000..55f50b3f5 --- /dev/null +++ b/doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_2_277cf12907bd7c5930eb4f137b115e29._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmR-xG9O2HWoybxYZPVbYVYxwitfcfDgtE" + nickname="Charles" + subject="comment 2" + date="2013-09-09T14:50:42Z" + content=""" +Never mind, I simply didn't have git-annex installed on the other computer. I'm going to make a thread in bugs about assistant always assuming port 22, you can delete this thread. +"""]] diff --git a/doc/forum/ssh_vs_cifs__47__webdav.mdwn b/doc/forum/ssh_vs_cifs__47__webdav.mdwn new file mode 100644 index 000000000..62bb9d3d9 --- /dev/null +++ b/doc/forum/ssh_vs_cifs__47__webdav.mdwn @@ -0,0 +1,7 @@ +Hello, + +I'm new to git-annex and I would like to know which is the best method to deploy it for my case. I would like to have a central repo in my Synology NAS but with files to be able to browse files (not a bare repo). This repo will not have remotes configured. The mobile clients will use the central repo to exchange files. I thinks that this setup is totally valid x-D. Now my question is more related to how to share the repo in the Synology NAS. I am considering to use cifs/webdav for LAN/WAN access to the repo or SSH for LAN/WAN access. Which is the recommended setup? Which is the most optimum setup in terms of bandwidth or cpu usage (the CPU of my synology NAS is ARM). Thanks in advance and for this great piece of software! + +Best regards, + +Christian diff --git a/doc/forum/start_assistant_from_command_line.mdwn b/doc/forum/start_assistant_from_command_line.mdwn new file mode 100644 index 000000000..3f48dd6d3 --- /dev/null +++ b/doc/forum/start_assistant_from_command_line.mdwn @@ -0,0 +1,11 @@ +I wanted to try out this probably great piece of software you wrote, alas I do not use a Debian distro with managed software menus (i.e. I use OpenBox), so I cannot simply open the assistant through my programs-menu. In fact, to do that I'd need the command to start the assistant so I can add it manually myself. Sadly, the man page did not gave me any advices... :( + +Any chance to give me the terminal command to start the assistant? + +*** +edit: just to update the thread: everythings okay now. Thanks for this great program! + +the commands (as posted by Paul): + + git annex assistant + git annex webapp diff --git a/doc/forum/start_assistant_from_command_line/comment_1_f8dfce1fca9f1212ccaf84e431db71a9._comment b/doc/forum/start_assistant_from_command_line/comment_1_f8dfce1fca9f1212ccaf84e431db71a9._comment new file mode 100644 index 000000000..dc35d61bc --- /dev/null +++ b/doc/forum/start_assistant_from_command_line/comment_1_f8dfce1fca9f1212ccaf84e431db71a9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBhQgaA5QrFwT67-Bo0qPIx0HD9roDrso" + nickname="Paul" + subject="comment 1" + date="2013-10-21T19:20:28Z" + content=""" + git annex assitant + +starts the assitant itself, you propably want the gui which you start by + + git annex webapp +"""]] diff --git a/doc/forum/start_assistant_from_command_line/comment_2_e769c5d09afbff85961363ddc5eb4019._comment b/doc/forum/start_assistant_from_command_line/comment_2_e769c5d09afbff85961363ddc5eb4019._comment new file mode 100644 index 000000000..b970990d4 --- /dev/null +++ b/doc/forum/start_assistant_from_command_line/comment_2_e769c5d09afbff85961363ddc5eb4019._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkj7tMEJKcZpNXIFkHAAcNi5qJFSFyjn6o" + nickname="thissideup" + subject="comment 2" + date="2013-10-22T11:05:13Z" + content=""" +ah okay. That was what I was trying to do, but git-annex failed on my. Remembering that I was on Debian and checking the version (which was June 2012) - I supposed that I wasn't able to use the assistant yet. + +So now I am trying to compile from source using cabal, however I sadly ran into a roadblock: http://git-annex.branchable.com/forum/cabal_install_fails_on_uuid/ +"""]] diff --git a/doc/forum/switching_backends.mdwn b/doc/forum/switching_backends.mdwn new file mode 100644 index 000000000..dedf1ffcb --- /dev/null +++ b/doc/forum/switching_backends.mdwn @@ -0,0 +1,12 @@ +so git annex migrate can switch a file from using one backend to the other. + +I've done that with a bunch of files. + +The old files should become "unused" right? But they don't seem to be. "git annex unused" still shows me only 2 unused files, and I've just migrated dozens of files from SHA256 to SHA256E. + +Is it possible they're still "used" by other repos? I have two other repos, one reached by SSH and one on a USB drive. Neither one of them is "bare." So maybe those files are still used by the "master" branches there, I thought... I went over and did "git annex sync" on each. Still my newly migrated files are not showing up as "unused." + +I'm worried that my repo is going to bloat with unused files with the SHA256 backend, which mysteriously do not show up as "unused" in git annex unused, if I migrate any more. + +any ideas what piece of the puzzle I could be missing here? + diff --git a/doc/forum/switching_backends/comment_1_ecf4109c1148dafde3519243ae3c5a03._comment b/doc/forum/switching_backends/comment_1_ecf4109c1148dafde3519243ae3c5a03._comment new file mode 100644 index 000000000..29bc9f9c3 --- /dev/null +++ b/doc/forum/switching_backends/comment_1_ecf4109c1148dafde3519243ae3c5a03._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-28T03:20:38Z" + content=""" +Just noticed this -- http://git-annex.branchable.com/bugs/git_annex_migrate_leaves_old_backend_versions_around/ + +so I don't need to worry about disk space bloat; they're all just hardlinks. That's cool. Still would be nice to know why they don't show up as \"unused.\" But not as important. +"""]] diff --git a/doc/forum/switching_backends/comment_2_21f465a18f40b95dafd307fce0de659a._comment b/doc/forum/switching_backends/comment_2_21f465a18f40b95dafd307fce0de659a._comment new file mode 100644 index 000000000..82c9f2621 --- /dev/null +++ b/doc/forum/switching_backends/comment_2_21f465a18f40b95dafd307fce0de659a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-01-28T06:28:28Z" + content=""" +It won't show as unused as long as there are git refs that still refer to the file. That could be branches, or more likely you have not synced everything to the local repo yet. +"""]] diff --git a/doc/forum/switching_backends/comment_4_4c13d22c1695195e6b101bd20ef6bb42._comment b/doc/forum/switching_backends/comment_4_4c13d22c1695195e6b101bd20ef6bb42._comment new file mode 100644 index 000000000..7ffa519e0 --- /dev/null +++ b/doc/forum/switching_backends/comment_4_4c13d22c1695195e6b101bd20ef6bb42._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 4" + date="2013-01-28T14:30:55Z" + content=""" +If by \"synced to the local repo\" you mean run a git annex sync, then yes, I have done that. + +Here's an example of what I'm seeing: + + annex$ readlink subdir/subdir/file.txt + ../../.git/annex/objects/zV/57/SHA256E-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2.txt/SHA256E-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2.txt + annex$ find .git/annex/objects/ -name SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + .git/annex/objects//1w/Q4/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + .git/annex/objects//1w/Q4/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + annex$ git annex sync + commit + # On branch master + nothing to commit, working directory clean + ok + pull homeworld + ok + push homeworld + Everything up-to-date + ok + annex$ git annex unused + unused . (checking for unused data...) (checking master...) (checking sync/master...) (checking homeworld/master...) (checking toshiba/master...) (checking toshiba/synced/master...) ok + annex$ find .git/annex/objects/ -name SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + .git/annex/objects//1w/Q4/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + .git/annex/objects//1w/Q4/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2/SHA256-s3952--cb67d2cbadfea373ed8aa5ec434f246acccb33471a7e28a444138cc4fe8552c2 + annex$ + + +As you can see, there are two remotes, \"toshiba\" and \"homeworld\". Neither of them is bare, they have checked out \"master\" branches. Could they be the reason that some of this data isn't \"unused\"? (I ask because I notice it reports that it is checking homeworld/master and toshiba/master when it does the unused check) +"""]] diff --git a/doc/forum/switching_backends/comment_4_e1d4a48baac23fd3f67b20eba4eee8af._comment b/doc/forum/switching_backends/comment_4_e1d4a48baac23fd3f67b20eba4eee8af._comment new file mode 100644 index 000000000..d5f4e021e --- /dev/null +++ b/doc/forum/switching_backends/comment_4_e1d4a48baac23fd3f67b20eba4eee8af._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 4" + date="2013-02-05T19:16:48Z" + content=""" +If you have not yet run `git annex sync` on the remotes, then they are still referring to the old unmigrated keys, which is why `unused` will not remove them. +"""]] diff --git a/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn new file mode 100644 index 000000000..f92b5aca3 --- /dev/null +++ b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn @@ -0,0 +1,2 @@ +Is that really unsafe? Because I did that and the switch to direct mode seemed to leave a lot of files still as links, and when I panicked and switched back to indirect mode, a whole lot of stuff seemed to have become unannexed and I reannexed it. + diff --git a/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running/comment_1_7832243a36613c48d0077b438dbf8b4a._comment b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running/comment_1_7832243a36613c48d0077b438dbf8b4a._comment new file mode 100644 index 000000000..b27115bbb --- /dev/null +++ b/doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running/comment_1_7832243a36613c48d0077b438dbf8b4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-25T03:39:16Z" + content=""" +This may have been an unrelated issue -- I just realized that I somehow ended up with a bunch of files in the annex under the directory \"misc\" and others under the directory \"Misc\" -- I'm not sure how they got that way, since I'm on OS X and those are supposed to be the same directory -- but they get synced over to a linux box where they're different directories. This may be the source of some of the weirdness I saw; I'm not sure. I tried to fix it all up on the linux box so everything was in its own directory. + + +"""]] diff --git a/doc/forum/sync_between_indirect_and_direct_mode.mdwn b/doc/forum/sync_between_indirect_and_direct_mode.mdwn new file mode 100644 index 000000000..66833cbe5 --- /dev/null +++ b/doc/forum/sync_between_indirect_and_direct_mode.mdwn @@ -0,0 +1,6 @@ +I have a music repository(direct mode) in my Nexus 5 which I want to sync with remote repository(indirect mode). + +When I run 'git annex sync --content', it did not sync the content but when I changed remote repository to direct mode, content got synced. + +Do I need to set some configuration ? +Is it possible to sync content between direct and indirect mode repositories ? diff --git a/doc/forum/sync_between_indirect_and_direct_mode/comment_1_7efc0d79196675582571c05fdd133b53._comment b/doc/forum/sync_between_indirect_and_direct_mode/comment_1_7efc0d79196675582571c05fdd133b53._comment new file mode 100644 index 000000000..7cbcd3c39 --- /dev/null +++ b/doc/forum/sync_between_indirect_and_direct_mode/comment_1_7efc0d79196675582571c05fdd133b53._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-03-10T17:57:51Z" + content=""" +There is no difference between direct and indirect mode repositories when it comes to communication between repositories, so they can be used in any combination. +"""]] diff --git a/doc/forum/sync_between_indirect_and_direct_mode/comment_2_8ac84dbaf7a4d503497487cbdb1749d8._comment b/doc/forum/sync_between_indirect_and_direct_mode/comment_2_8ac84dbaf7a4d503497487cbdb1749d8._comment new file mode 100644 index 000000000..42b512627 --- /dev/null +++ b/doc/forum/sync_between_indirect_and_direct_mode/comment_2_8ac84dbaf7a4d503497487cbdb1749d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnDXvDvWTXmCqQ90ATTD4dV3Ii4YbnE8E0" + nickname="sys" + subject="git annex direct when not all content is in this repo" + date="2014-03-12T14:41:53Z" + content=""" +what does git annex direct do when all the content isn't available in the current repo (i am assuming it will leave symlinks for the missing content) +"""]] diff --git a/doc/forum/sync_between_indirect_and_direct_mode/comment_3_9acb237711669ec6046a8d07f9ed3b2c._comment b/doc/forum/sync_between_indirect_and_direct_mode/comment_3_9acb237711669ec6046a8d07f9ed3b2c._comment new file mode 100644 index 000000000..f743487b2 --- /dev/null +++ b/doc/forum/sync_between_indirect_and_direct_mode/comment_3_9acb237711669ec6046a8d07f9ed3b2c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-12T17:03:30Z" + content=""" +Direct mode does not require all content be present any more than indirect mode does, and missing content is represented the same in both modes, with broken symlinks. +"""]] diff --git a/doc/forum/sync_stages_deletions_on_remote.mdwn b/doc/forum/sync_stages_deletions_on_remote.mdwn new file mode 100644 index 000000000..73a51d0b0 --- /dev/null +++ b/doc/forum/sync_stages_deletions_on_remote.mdwn @@ -0,0 +1,72 @@ +I'm having an issue with 2 repos: one on my laptop, the other on my NAS. Both are in indirect mode, running Arch Linux, and have the latest Git version. Laptop has git-annex 5.20140411-gda795e0, NAS has 5.20140319-g9aa31b7 (from prebuilt tarballs). + +The issue is quite simple. When I `git-annex add` new files on my laptop, commit them, and then `git-annex sync` them, they show up as staged for deletion on my NAS. + + laptop $ git annex add some-file + laptop $ git commit -m "Add some-file" + laptop $ git annex sync + commit ok + pull ds413j + ok + push ds413j + Counting objects: 133, done. + Delta compression using up to 8 threads. + Compressing objects: 100% (78/78), done. + Writing objects: 100% (80/80), 10.64 KiB | 0 bytes/s, done. + Total 80 (delta 12), reused 0 (delta 0) + To ssh://**/** + 1dcd188..8ef4249 git-annex -> synced/git-annex + c0f45a6..21711d6 master -> synced/master + ok + laptop $ ssh $NAS + nas $ git status + On branch master + Changes to be committed: + (use "git reset HEAD ..." to unstage) + + deleted: some-file + + nas $ + +If I run `git annex sync` on the NAS, it will create a new commit that deletes that file. So I have to play with `git reset`/`git checkout` by hand to make sure that the new file won't be deleted. + +I'm not sure when this started, but I think it was after I did some stupid mistake (`git checkout -B master synced/master`, kill a `git annex sync` with Ctrl+C, or something else that even resulted in my non-bare repo to have "bare=true" in .git/config...). And I haven't yet been able to fix this. + +Any idea what can have caused this, how to fix it, and how to prevent it from happening again in the future? + +.git/config on NAS: + + [core] + repositoryformatversion = 0 + filemode = true + logallrefupdates = true + [annex] + uuid = d54ae60a-1f59-403c-923f-32ea3bf2d00f + version = 5 + diskreserve = 1 megabyte + autoupgrade = ask + debug = false + +.git/config on laptop: + + [core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + [branch "master"] + [annex] + uuid = f20cb506-945d-4c78-af1a-0aa884bb899b + version = 5 + diskreserve = 20 gigabytes + autoupgrade = ask + debug = false + expireunused = 7d + genmetadata = true + [push] + default = matching + [remote "ds413j"] + url = ssh://**/** + fetch = +refs/heads/*:refs/remotes/ds413j/* + annex-uuid = d54ae60a-1f59-403c-923f-32ea3bf2d00f + annex-sync = true diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_1_2b639066095e450c2d9be3b2775d24b3._comment b/doc/forum/sync_stages_deletions_on_remote/comment_1_2b639066095e450c2d9be3b2775d24b3._comment new file mode 100644 index 000000000..24495fd02 --- /dev/null +++ b/doc/forum/sync_stages_deletions_on_remote/comment_1_2b639066095e450c2d9be3b2775d24b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 1" + date="2014-04-17T12:16:41Z" + content=""" +Here's the output of `git annex sync --debug` (for a different commit): +"""]] diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_2_da5775526a2a476b6ead1cd1a735b8bd._comment b/doc/forum/sync_stages_deletions_on_remote/comment_2_da5775526a2a476b6ead1cd1a735b8bd._comment new file mode 100644 index 000000000..a3076faf7 --- /dev/null +++ b/doc/forum/sync_stages_deletions_on_remote/comment_2_da5775526a2a476b6ead1cd1a735b8bd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 2" + date="2014-04-17T19:28:59Z" + content=""" +`git annex sync` will push changes to your NAS, but this does not cause the work tree there to be updated. You must be running some command on the NAS that gets it work tree into the state you show. You need to tell us what that command is, since it seems to be where things are going wrong. Maybe you're running the git-annex assistant on the NAS, or maybe you run `git annex sync` on the NAS. +"""]] diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment b/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment new file mode 100644 index 000000000..fb9020252 --- /dev/null +++ b/doc/forum/sync_stages_deletions_on_remote/comment_3_9e07593228915936fadcf90373be9f4e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 3" + date="2014-04-22T14:59:47Z" + content=""" +Not running the assistant (freshly rebooted NAS, checked with `ps ax | grep annex`), not running any other git command. Still happened, until a few minutes ago: I found the cause for this issue... and it's quite frustrating. + +Every now and then, I interrupt a running `git annex sync` with Ctrl+C. And sometimes this causes my NAS repository to end up with `bare = true` in its `.git/config`. When this happens, I just remove the offending line and call it a day. Now I just added a `bare = false` line to that file, and that solved the problem. It seems that somehow, if you don't explicitely tell git that your repo is not bare, it considers it as a bare repository -- and the final push from `git annex sync` actually updates the `master` branch without updating the work tree. + +This is probably not a bug in git-annex, but rather a weird behaviour in git -- and for sure something I didn't expect to happend. But anyway it works now :) Leaving this here in case it helps other people. + +Joey, thanks again for your time and your help. +"""]] diff --git a/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment b/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment new file mode 100644 index 000000000..710392daa --- /dev/null +++ b/doc/forum/sync_stages_deletions_on_remote/comment_4_e5a3dc34c6229ec40bc999c3cab28041._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.114" + subject="comment 4" + date="2014-04-24T18:22:16Z" + content=""" +git sets bare = false in newly created non-bare repositories. Perhaps this is why? It seems likely that git has an inconsistent default if there's no configuration. Sounds worth filing a bug on git for. OTOH, messing with .git/config in nonstandard ways seems like a good way to cause yourself random pain too. +"""]] diff --git a/doc/forum/syncing_home_directories.mdwn b/doc/forum/syncing_home_directories.mdwn new file mode 100644 index 000000000..fcd391732 --- /dev/null +++ b/doc/forum/syncing_home_directories.mdwn @@ -0,0 +1,7 @@ +Hi, + +I synchronize home directories on a couple of machines using unison. Is there a recommended way to do the equivalent using git-annex? + +Thanks, + +John diff --git a/doc/forum/syncing_home_directories/comment_1_220a6e0ffe0ea610921a63c0a6e3beab._comment b/doc/forum/syncing_home_directories/comment_1_220a6e0ffe0ea610921a63c0a6e3beab._comment new file mode 100644 index 000000000..f4699e74a --- /dev/null +++ b/doc/forum/syncing_home_directories/comment_1_220a6e0ffe0ea610921a63c0a6e3beab._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-05T20:34:22Z" + content=""" +There are a few problems you are likely to run into if you try to store everything in git-annex: + +* git does not store certain things, including special file permissions, in a git repository +* you can't check a .git directory into another git repository +* git-annex locks files to prevent them being changed and this involves replacing them with symlinks (much less of a problem now that it has the direct mode) + +For these reasons, I currently encourage users to use one or more git-annex repositories to store and sync whatever large data files they need, but to confine this to subdirectories of the home directory. There are other tools like vcsh that are better suited to storing things like dotfiles in git, rather than using git-annex for that. And other tools like mr can make it easy to work with a set of repositories, so you can have your dotfiles stored in one or more repositories and your large files in others and update them all with one command. + +See for more on this.. +"""]] diff --git a/doc/forum/syncing_non-git_trees_with_git-annex.mdwn b/doc/forum/syncing_non-git_trees_with_git-annex.mdwn new file mode 100644 index 000000000..997378261 --- /dev/null +++ b/doc/forum/syncing_non-git_trees_with_git-annex.mdwn @@ -0,0 +1,46 @@ +I have a bunch of directory trees with large data files scattered over various computers and disk drives - they contain photos, videos, music, and so on. In many cases I initially copied one of these trees from one machine to another just as a cheap and dirty backup, and then made small modifications to both trees in ways I no longer remember. For example, I returned from a trip with a bunch of new photos, and then might have rotated some of them 90 degrees on one machine, and edited or renamed them on another. + +What I want to do now is use git-annex as a way of initially synchronising the trees, and then fully managing them on an ongoing basis. Note that the trees are *not* yet git repositories. In order to be able to detect straight-forward file renames, I believe that [[the SHA1 backend|tips/using_the_SHA1_backend]] probably makes the most sense. + +I've been playing around and arrived at the following setup procedure. For the sake of discussion, I assume that we have two trees `a` and `b` which live in the same directory referred to by `$td`, and that all large files end with the `.avi` suffix. + + # Setup git in 'a'. + cd $td/a + git init + + # Setup git-annex in 'a'. + echo '* annex.backend=SHA1' > .gitattributes + git add .gitattributes + git commit -m'use SHA1 backend' + git annex init + + # Annex all large files. + find -name \*.avi | xargs git annex add + git add . + git commit -m'Initial import' + + # Setup git in 'b'. + cd $td/b + git clone -n $td/a new + mv new/.git . + rmdir new + git reset # reset git index to b's wd - hangover from cloning from 'a' + + # Setup git-annex in 'b'. + # This merges a's (origin's) git-annex branch into the local git-annex branch. + git annex init + + # Annex all large files - because we're using SHA1 backend, some + # should hash to the same keys as in 'a'. + find -name \*.avi | xargs git annex add + git add . + git commit -m'Changes in b tree' + + git remote add a $td/a + + # Now pull changes in 'b' back to 'a'. + cd $td/a + git remote add b $td/b + git pull b master + +This seems to work, but have I missed anything? diff --git a/doc/forum/syncing_non-git_trees_with_git-annex/comment_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment b/doc/forum/syncing_non-git_trees_with_git-annex/comment_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment new file mode 100644 index 000000000..bdec50879 --- /dev/null +++ b/doc/forum/syncing_non-git_trees_with_git-annex/comment_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-14T17:31:31Z" + content=""" +This is an entirely reasonable way to go about it. + +However, doing it this way causes files in B to always \"win\" -- If the same filename is in both repositories, with differing content, the version added in B will superscede the version from A. If A has a file that is not in B, a git commit -a in B will commit a deletion of that file. + +I might do it your way and look at the changes in B before (or even after) committing them to see if files from A were deleted or changed. + +Or, I might just instead keep B in a separate subdirectory in the repository, set up like so: + +
+mv b old_b
+git clone a b
+cd b
+mv ../old_b .
+git annex add old_b --not --exclude '*.avi'
+
+ +Or, a third way would be to commit A to a branch like branchA and B to a separate branchB, and not merge the branches at all. +"""]] diff --git a/doc/forum/syncing_non-git_trees_with_git-annex/comment_2_49f15478781a0ad5e46e75319070335c._comment b/doc/forum/syncing_non-git_trees_with_git-annex/comment_2_49f15478781a0ad5e46e75319070335c._comment new file mode 100644 index 000000000..94b5c2ec1 --- /dev/null +++ b/doc/forum/syncing_non-git_trees_with_git-annex/comment_2_49f15478781a0ad5e46e75319070335c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmKPMUX0YHBjE93eBsEnacwZsddSDue3PY" + nickname="Oliver" + subject="comment 2" + date="2011-12-23T22:04:08Z" + content=""" +As joey points out the problem is B overwrites A, so that any files in A that aren't in B will be removed. But the suggestion to keep B in a separate subdirectory in the repository means I'll end up with duplicates of files in both A and B. What I want is to have the merged superset of all files from both A and B with only one copy of identical files. + +The problem is that unique symlinks in A/master are deleted when B/master is merged in. To add back the deleted files after the merge you can do this: + + git checkout master~1 deleted_file_name #checkout a single deleted file called deleted_file_name + git diff master~1 master --numstat --name-only --diff-filter=D #get the names of all files deleted between master and master~1 + git diff master~1 master --numstat --name-only --diff-filter=D | xargs git checkout master~1 #checkout all deleted files between master and master~1 + +Once the first merge has been done after set up, you can continue to make changes to A and B and future merges won't require accounting for deleted files in this way. +"""]] diff --git a/doc/forum/syncing_non-git_trees_with_git-annex/comment_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment b/doc/forum/syncing_non-git_trees_with_git-annex/comment_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment new file mode 100644 index 000000000..1793e686f --- /dev/null +++ b/doc/forum/syncing_non-git_trees_with_git-annex/comment_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="re-annexing previously annexed files" + date="2012-03-29T21:41:54Z" + content=""" +Here's another handy command-line which annexes all files in repo B which have already been annexed in repo A: + + git status --porcelain | sed -n '/^ T /{s///;p}' | xargs git annex add + +The 'T' outputted by git status for these files indicates a type change: it's a symlink to the annex in repo A, but a normal file in repo B. + +"""]] diff --git a/doc/forum/taskwarrior.mdwn b/doc/forum/taskwarrior.mdwn new file mode 100644 index 000000000..3e44cc610 --- /dev/null +++ b/doc/forum/taskwarrior.mdwn @@ -0,0 +1,11 @@ +I try to sync my taskWarrior files .task/*.data with git-annex ... but there is two problem : + +- i need to chmod 755 my files because taskWarrior doesn't recognize them, or say "problem with permission" + +- taskwarrior seems crazy with symbolic link used by git-annex, undo not work, task appear multiple times , etc. + +Is there any solution ? +Any user experienced the same problem? + +Thanks +Sr. diff --git a/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment b/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment new file mode 100644 index 000000000..c8682b378 --- /dev/null +++ b/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-08-06T12:44:11Z" + content=""" +* You could try metastore (not merge friendly), git-cache-meta (pretty minimal) or metamonger (not done yet) to sync your file permissions +* Look into direct mode to avoid symlinks +* Alternatively, check your taskwarrior files into git, not git-annex, to avoid symlinks +"""]] diff --git a/doc/forum/taskwarrior/comment_2_4b3d70501763f6d36c927ae37bbd33c2._comment b/doc/forum/taskwarrior/comment_2_4b3d70501763f6d36c927ae37bbd33c2._comment new file mode 100644 index 000000000..ec6bcb952 --- /dev/null +++ b/doc/forum/taskwarrior/comment_2_4b3d70501763f6d36c927ae37bbd33c2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-04-14T15:27:48Z" + content=""" +Using direct mode would replace symlinks with actual files. +"""]] diff --git a/doc/forum/telehash_syncing.mdwn b/doc/forum/telehash_syncing.mdwn new file mode 100644 index 000000000..3a5266506 --- /dev/null +++ b/doc/forum/telehash_syncing.mdwn @@ -0,0 +1,10 @@ +Hi + +I have read some info about telehash. It looks verry promising. I was wondering though how syncing will work. For example. I have 2 computers. Normal PC and a laptop. Mostly only one is on at a time. + +* Sync messages will be sent over telehash protocoll ? +* What if I push some changes (they will be synced to a shared repository) and laptop is not online. How will git-annex know what to sync from a shared repository ? +* Do you plan to send files/commits directly to online clients ? If 2 friends are online at the same time. +* What will happen with data on a shared repository if all clients have synced content ? Will it be deleted since it is not longer needed ? + +I was thinking of a model where you sync directly (if possible), and just drop shared content to repo for offline users. Whan everyone have pulled content it may be removed from shared repo. diff --git a/doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn b/doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn new file mode 100644 index 000000000..d289b9f50 --- /dev/null +++ b/doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn @@ -0,0 +1,6 @@ +Tell your git-annex stories here. Feel free to give as little or as much detail +as appropriate about how you're using it. How's it working out for you? + +See [[testimonials]] for some other stories. + +[[!meta author=Joey]] diff --git a/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_1_4884803ddee7f642a3ac995a19967a6a._comment b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_1_4884803ddee7f642a3ac995a19967a6a._comment new file mode 100644 index 000000000..2351378bc --- /dev/null +++ b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_1_4884803ddee7f642a3ac995a19967a6a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + subject="just amazing" + date="2012-04-12T17:12:41Z" + content=""" +git-annex is just amazing. I just started using it and for once, I have hope to be able to organize my files a little better than now. + +Currently, I have a huge homedir. From time to time, I move file away in external hard drives, then forget about them. When I want to look at them back, I just can't because I have forgotten where they are. I have also a ton of files on those drives that I can't access because they are not indexed. With git-annex I have hope to put all of these files on a git repository. I will be able to see them everywhere, and find them when I need to. + +I might stop loosing files for once. + +I might avoid having multiple copies of the same things over and over again, without knowing so. and regain some more disk space. + +For the moment, I'm archiving my photographs. But there is one thing that might not go very well: directory hierarchies where everything is important (file owner, specific permissions, symlinks). I won't just be able to blindly annex all of these files. But for the moment I'll stick at archiving ocuments and it should be amazing. + +[Mildred](http://mildred.fr) +"""]] diff --git a/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_2_61f5054918e7b36c191454365bc7f3b7._comment b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_2_61f5054918e7b36c191454365bc7f3b7._comment new file mode 100644 index 000000000..3bd981c5d --- /dev/null +++ b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_2_61f5054918e7b36c191454365bc7f3b7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cgray.myopenid.com/" + nickname="cgray" + subject="comment 2" + date="2012-04-14T01:18:53Z" + content=""" +Git-annex has really helped me with my media files. I have a big NAS drive where I keep all my music, tv, and movies files, each in their own git annex. I tend to keep the media that I want to watch or listen to on my laptop and then drop it when it is done. This way I don't have too much on my laptop at any one time, but I have a nice selection for when I'm traveling and don't have access to my NAS. + +Additionally, I have a mp3 player that will format itself randomly every few months or so. I keep my podcasts on it in a git annex and in a git annex on my laptop. When I am done with a podcast, I can delete it from the mp3 player and then sync that information with my laptop. With this method, I have a backup of what should be on my mp3 player, so I don't need to worry about losing it all when the mp3 player decides it's had enough. +"""]] diff --git a/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_3_db07e8703be606c998c831e91d300d69._comment b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_3_db07e8703be606c998c831e91d300d69._comment new file mode 100644 index 000000000..1a80bb480 --- /dev/null +++ b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_3_db07e8703be606c998c831e91d300d69._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://bergey.dreamwidth.org/" + ip="66.80.90.109" + subject="git-annex, media, emacs" + date="2012-08-31T01:47:36Z" + content=""" +I've been using git-annex for a month or two to manage my music collection. It's great to know I can drop files if I need space on the laptop, knowing exactly where I have other copies. Now I'm writing an emacs mode to help me keep track: https://gitorious.org/emacs-contrib/annex-mode + +Locally available files are colored differently, and pressing g runs `git annex get` on the file at point. +"""]] diff --git a/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_4_a58595969cdd42ed20210e9615b42e42._comment b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_4_a58595969cdd42ed20210e9615b42e42._comment new file mode 100644 index 000000000..d80423eac --- /dev/null +++ b/doc/forum/tell_us_how_you__39__re_using_git-annex/comment_4_a58595969cdd42ed20210e9615b42e42._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Best thing since sliced bread" + date="2012-11-21T13:08:57Z" + content=""" +It's amazing how perfect git annex is for my use case. + +I record music, which results in a bunch of big files that don't change, and a bunch of small files which change often. + +I also need these files to be preserved for the long haul, and be verified now and then. They also need to be backed up three or four times, because they're original files! Keeping track of all that was a headache before git annex, and I was also constantly awake at night because it was impossible to verify if everything's still okay. + +Now I just dump everything into my archive annex and I know where everything is, and that it's safe, period. I even set myself up a raspberry pi with a usb drive adapter and put some spindown code in a cron job. Now I have a hard drive at rest that I can access from anywhere at any time. The whole thing gets backed up by Amazon Glacier, but if Amazon starts getting pesky I can just add another backend and sync it up. I can even version my small files if I want to by putting them directly into git. This entire thing would have been such a huge undertaking but now it's easy. I dump everything into the annex and to the actual backups whenever I get round to it. It just has a natural flow to it. + +Et voila. Professional grade backups, at home, independant from any specific vendor. I absolutely never have to worry about my files going anywhere, and if I get super paranoid, I can just \"git annex fsck\" and mathematically prove to myself everything's still there. + +It's totally sad how many creative people will be losing their life's work in a couple of years because they rely on regular filesystems on their USB drives. Stuff like DropBox and SpiderOak is better than nothing but trusting single vendor to not screw up or mess with your life's work is just plain creepy. + +I just have a huge, warm fuzzy feeling now. If this sounds like I'm relentlessly hyping git annex, it's because I am! It deserves it! + + +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn new file mode 100644 index 000000000..8981200d8 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn @@ -0,0 +1,22 @@ +This is work in progress, since there is now a [[special_remotes/hook]] for users to plug in whatever they want as a remote, here's my recipe for using tahoe-lafs as a remote, this is a copy and paste the relavent section from my .git/config file + + tahoe-store-hook = tahoe put $ANNEX_FILE tahoe:$ANNEX_KEY + tahoe-retrieve-hook = tahoe get tahoe:$ANNEX_KEY $ANNEX_FILE + tahoe-remove-hook = tahoe rm tahoe:$ANNEX_KEY + tahoe-checkpresent-hook = tahoe ls tahoe:$ANNEX_KEY 2>&1 || echo FAIL + +Where `tahoe:` is a tahoe-lafs alias, ideally you should create a new alias (DIR-CAP or whatever the terminolgy is) to store your files, I just used the default `tahoe:` alias for testing. + +The only quirk I've noticed is this... + +
+$ git annex whereis .
+whereis frink.jar (2 copies) 
+  	084603a8-7243-11e0-b1f5-83102bcd7953  -- here (testtest)
+   	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a
+ok
+
+ +1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a is my [[!google tahoe-lafs]] remote, but there is no label/description on it. The checkpresent-hook was a little confusing when I was setting it up, I'm currently unsure if I am doing the right thing or not with my hook. My get and put commands are a little verbose for now, i might redirect it to /dev/null once I am happier with the overall performance/behaviour my setup. + +Other than the quirks above, I am able to put and get files from my tahoe-lafs remote. The only thing that I have not figured out is how to "remove a file" on the remote to free up space on the remote. diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment new file mode 100644 index 000000000..388641f69 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="whereis labels" + date="2011-04-29T13:08:35Z" + content=""" +You should be able to fix the missing label by editing .git-annex/uuid.log and adding + + 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a tahoe +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment new file mode 100644 index 000000000..e7c3d619d --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-29T15:24:56Z" + content=""" +If `tahoe ls` outputs only the key, on its own line, and exits nonzero if it's not present, then I think you did the right thing. + +To remove a file, use `git annex move file --from tahoe` and then you can drop it locally. +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment new file mode 100644 index 000000000..16ad9e988 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2011-04-29T15:33:24Z" + content=""" +@justin, I discovered that \"git annex describe\" did what I wanted + +@joey, yep that is the behaviour of \"tahoe ls\", thanks for the tip on removing the file from the remote. + +It seems to be working okay for now, the only concern is that on the remote everything is dumped into the same directory, but I can live with that, since I want to track biggish blobs and not lots of small little files. +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment new file mode 100644 index 000000000..5d271c6f3 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2011-04-29T16:17:11Z" + content=""" +I've just tried to use the ANNEX_HASH_ variables, example of my configuration + +
+    git config annex.tahoe-store-hook 'tahoe mkdir $ANNEX_HASH_1 && tahoe put $ANNEX_FILE tahoe:$ANNEX_HASH_1/$ANNEX_KEY'
+    git config annex.tahoe-retrieve-hook 'tahoe get tahoe:$ANNEX_HASH_1/$ANNEX_KEY $ANNEX_FILE'
+    git config annex.tahoe-remove-hook 'tahoe rm tahoe:$ANNEX_HASH_1/$ANNEX_KEY'
+    git config annex.tahoe-checkpresent-hook 'tahoe ls tahoe:$ANNEX_HASH_1/$ANNEX_KEY 2>&1 || echo FAIL'
+    git annex initremote library type=hook hooktype=tahoe encryption=none
+    git annex describe 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a library
+
+ +It's seems to work quite well for me now, I did run across this when I tried to drop a file locally, leaving the file on my remote + +
+jtang@x00:/tmp/annex3 $ git annex drop .
+drop frink.sh (checking library...) (unsafe) 
+  Could only verify the existence of 0 out of 1 necessary copies
+  Try making some of these repositories available:
+  	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a  -- library
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+drop t/frink.jar (checking library...) (unsafe) 
+  Could only verify the existence of 0 out of 1 necessary copies
+  Try making some of these repositories available:
+  	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a  -- library
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+git-annex: 2 failed
+1|jtang@x00:/tmp/annex3 $ 
+
+ +I do know that the files exist in my library as I have just inserted them, it seemed to work when I didnt have the hashing, it appears that the checkpresent doesn't seem to pass the ANNEX_HASH_* variables (from the limited debugging I did) +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment new file mode 100644 index 000000000..9127cdeea --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-04-29T18:01:04Z" + content=""" +I've corrected the missing `ANNEX_HASH_*` oversight. (It also affected removal, btw.) +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment new file mode 100644 index 000000000..80874db31 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 6" + date="2011-04-29T20:11:08Z" + content=""" +Cool, that seems to make things work as expected, here's an updated recipe + + +
+git config annex.tahoe-store-hook 'tahoe mkdir tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2 && tahoe put $ANNEX_FILE tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY'
+git config annex.tahoe-retrieve-hook 'tahoe get tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY $ANNEX_FILE'
+git config annex.tahoe-remove-hook 'tahoe rm tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY'
+git config annex.tahoe-checkpresent-hook 'tahoe ls tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY 2>&1 || echo FAIL'
+git annex initremote library type=hook hooktype=tahoe encryption=none
+git annex describe 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a library
+
+ + +I just needs some of the output redirected to /dev/null. + +(I updated this comment to fix a bug. --[[Joey]]) +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment new file mode 100644 index 000000000..1d75fb963 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="zooko" + ip="97.118.97.117" + subject="request for information, plus some ideas" + date="2011-05-14T05:07:17Z" + content=""" +Hey Jimmy: how's this working for you now? I would expect it to go slower and slower since Tahoe-LAFS has an O(N) algorithm for reading or updating directories. + +Of course, if it is still fast enough for your uses then that's okay. :-) + +(We're working on optimizations of this for future releases of Tahoe-LAFS.) + +I'd like to understand the desired behavior of store-hook and retrieve-hook better, in order to see if there is a more efficient way to use Tahoe-LAFS for this. + +Off to look for docs. + +Regards, + +Zooko +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment new file mode 100644 index 000000000..dc97128bd --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 8" + date="2011-05-14T10:02:26Z" + content=""" +@joey thanks for the update in the previous comment, I had forgotten about updating it. + +@zooko it's working okay for me right now, since I'm only putting fairly big blogs on stuff on to it and only things that I *really* care about. On the performance side, if it ran faster then it would be nicer :) +"""]] diff --git a/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_9_2592749c2f02b3e151896e31acba359b._comment b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_9_2592749c2f02b3e151896e31acba359b._comment new file mode 100644 index 000000000..ba58643b9 --- /dev/null +++ b/doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_9_2592749c2f02b3e151896e31acba359b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmsz4weoPXV2oEtv3zpo9dOxn_SEPz-7Iw" + nickname="Zooko" + subject="more notes about Tahoe-LAFS performance" + date="2014-04-21T07:18:06Z" + content=""" +In case anyone is reading this thread: https://github.com/zooko/tahoe-lafs/blob/3c13c138cf09e83d2f8001888e2a7de85564d406/docs/frontends/key-value-store.rst +"""]] diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn new file mode 100644 index 000000000..95cfe2538 --- /dev/null +++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_.mdwn @@ -0,0 +1,7 @@ +Hi, + +Is anyone having difficulties with the assistant and gpg-agent? Particularly with multiple repos syncing to a crypt backup? + +It seems to work for a while and then according to the error logs I can't decrypt the manifest...I'm wondering if there is some sort of locking involved that only lets one repo sync to a gcrypt repo at a time? I can't think why the gpg-agent would stop providing the key. + +I also have a rather horrible time with gpg-agent in general: I now start each repos git annex assistant individually in the shell (from which I can confirm the gpg-agent is working) rather than launch the web-app direct. diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment new file mode 100644 index 000000000..3ec016744 --- /dev/null +++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_1_4ad9a6a7cf5678ac0bc6d46a54f64cd3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2014-04-29T10:16:11Z" + content=""" +hmmm - a command line based git annex sync always works. So either the assistant has a separate locking mechanism or the assistant is somehow losing the gpg-agent environment. Does the assistant restart/respawn itself and lose access to the gpg-agent env? + +I'm somewhat clutching at straws here. +"""]] diff --git a/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment new file mode 100644 index 000000000..30bc72f54 --- /dev/null +++ b/doc/forum/trouble_with_multiple_remotes_syncing_to_gcrypt_based_ssh_repo_/comment_2_82dc18ed14879936d04133f248879fb9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2014-04-30T12:25:55Z" + content=""" +I see in the comments here a possible explanation... + +https://git-annex.branchable.com/bugs/GPG_passphrase_repeated_prompt/ +"""]] diff --git a/doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn b/doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn new file mode 100644 index 000000000..f94bd3804 --- /dev/null +++ b/doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn @@ -0,0 +1,32 @@ +When issuing a `git annex info`, I get: + +~~~ +$ git-annex info +repository mode: indirect +trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0 +semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + 85f8a5ea-6278-11e2-9978-ebb59e8f37a2 -- here (Music annex backup) + 9aff38f2-6447-11e2-8c89-ef50e6c0ea6c -- backupone (Music annex backupone) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 174.28 gigabytes (+1 megabyte reserved) +local annex keys: 5348 +local annex size: 25.62 gigabytes +annexed files in working tree: 5374 +size of annexed files in working tree: 25.68 gigabytes +bloom filter size: 16 mebibytes (1.1% full) +backend usage: + SHA256: 10692 + SHA256E: 30 +~~~ + +The troubling part (I think) is `trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0` + +Is there a command I can use to show all the uuid of known remotes? I thought I had marked all remotes pointing to /home/micas/Music/.git as `dead` + +Is there another reason for the output? How can I get trusted repos back to 0? + +**EDIT:** + +I removed the folder (was not a git repo at the time of the error) `/home/micas/Music` and the error went away. diff --git a/doc/forum/trusted_repositories:_fatal:_not_a_git_repo/comment_1_0a755a4a281c3bd130722093c8ddd080._comment b/doc/forum/trusted_repositories:_fatal:_not_a_git_repo/comment_1_0a755a4a281c3bd130722093c8ddd080._comment new file mode 100644 index 000000000..133a80e14 --- /dev/null +++ b/doc/forum/trusted_repositories:_fatal:_not_a_git_repo/comment_1_0a755a4a281c3bd130722093c8ddd080._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T20:10:14Z" + content=""" +Yeah, git-annex will skip a repository if its directory doesn't exist, but if the directory exists, it expects it to be a git repository, and will run git commands that use it (to get its config specifically). + +The ugly message is doing just what it should; letting you know you have a problem. +"""]] diff --git a/doc/forum/ui.mdwn b/doc/forum/ui.mdwn new file mode 100644 index 000000000..2ef8841a9 --- /dev/null +++ b/doc/forum/ui.mdwn @@ -0,0 +1,11 @@ +I just briefly tried git-annex. It's an interesting concept. + +My main frustration so far: I find it difficult to visualise and use the annex. Shell script contortions can obviously show you anything, but I don't have the ready knowledge to compose them. It would be nice to have some more user-friendly commands or even a GUI. + +'annex whereis' is fine for one file, but unweildly for many (e.g. a directory whose contents are always together, never divided between repositories). Is it possible to treat a given directory and all its contents as a single object? + +It is not clear what files are immediately available. Sometimes you don't care about annexed files that aren't stored in the current repository. Might it be nice to temporarily remove or hide symlinks for files that are not here right now? Then you could treat the repository more like a normal file heirarchy. Or how about something like 'git annex ls' to show only currently available files? + +assistant and sharebox fs sound like great basic synch options, but it would be really cool to have a fuse fs somewhere between raw git-annex and assistant. Putting a file in the directory would trigger git-annex to add it and sync. rm on that new file would not work by default because it's the only copy. rm --annex to get rid of the file from all repos. mv/cp to transfer between repos. ls to show only the files that are here now, ls --annex to display complete information in a clear way (well-formatted, colorized). Something like that. + +This has just been a random brain dump from a new user, hopefully it made some sense. diff --git a/doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment b/doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment new file mode 100644 index 000000000..84f30c5ea --- /dev/null +++ b/doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-20T19:51:19Z" + content=""" +It's pretty easy to configure ls to show broken symlinks in a different color. Run dircolors, and alias ls='ls --color==auto'. Then you can see which files are not there at a glance. + +The Linux file manager's I've tried (nautilus and thunar) also shows which files are present; you get a X on the icon of annexed files that are not present. +"""]] diff --git a/doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment b/doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment new file mode 100644 index 000000000..ee7995883 --- /dev/null +++ b/doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://mylesenglish.myopenid.com/" + ip="217.39.94.195" + subject="comment 2" + date="2013-09-16T19:21:31Z" + content=""" +This shell function behaves more like ls and shows the files that are present: + + ga-ls () { + CWD=`pwd` + cd ${1:-.} && git annex find | cut -d / -f 1 | uniq + cd ${CWD} + } + +"""]] diff --git a/doc/forum/unannex_alternatives.mdwn b/doc/forum/unannex_alternatives.mdwn new file mode 100644 index 000000000..efd05838e --- /dev/null +++ b/doc/forum/unannex_alternatives.mdwn @@ -0,0 +1,9 @@ +what is the work flow to get a file that is in git-annex out of there and into git? (current situation: `git-annex add`ed a bunch of pictures, later found make files in there which i'd rather have in git for proper source code control) + +the most intuitive thing to do is `git unannex`, which at first seemed to do the right thing, but when committing there came the hook and everything was back to where it was before. + +i could disable the hook as a workaround, but that doesn't smell like a good work flow. + +the [[man page|git-annex]] does warn that `unannex` is only supposed to be used against unintentional `git annex add`s (probably meaning that it should be used before something is committed), but the alternatives it suggests (`git rm` and `git annex drop`) don't to what i want to do. + +am i missing something or is there really no work flow for this? --[[chrysn]] diff --git a/doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment b/doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment new file mode 100644 index 000000000..7f278d2bc --- /dev/null +++ b/doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-02-02T00:39:10Z" + content=""" +Git-annex's commit hook does not prevent unannex being used. The file you unannex will not be checked into git anymore and will be a regular file again, not a git-annex symlink. + +For example, here's a transcript: + +
+joey@gnu:~/tmp>mkdir demo
+joey@gnu:~/tmp>cd demo
+joey@gnu:~/tmp/demo>git init
+Initialized empty Git repository in /home/joey/tmp/demo/.git/
+joey@gnu:~/tmp/demo>git annex init demo
+init demo ok
+joey@gnu:~/tmp/demo>echo hi > file
+joey@gnu:~/tmp/demo>git annex add file 
+add file ok
+(Recording state in git...)
+joey@gnu:~/tmp/demo>git commit -m add
+[master 64cf267] add
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+ create mode 100644 .git-annex/WORM:1296607093:3:file.log
+ create mode 120000 file
+joey@gnu:~/tmp/demo>git annex unannex file
+unannex file ok
+(Recording state in git...)
+joey@gnu:~/tmp/demo>ls -l file
+-rw-r--r-- 1 joey joey 3 Feb  1 20:38 file
+joey@gnu:~/tmp/demo>git commit
+[master 78a09cc] unannex
+ 2 files changed, 1 insertions(+), 2 deletions(-)
+ delete mode 120000 file
+joey@gnu:~/tmp/demo>ls -l file
+-rw-r--r-- 1 joey joey 3 Feb  1 20:38 file
+joey@gnu:~/tmp/demo>git status
+# On branch master
+# Untracked files:
+#   (use \"git add ...\" to include in what will be committed)
+#
+#	file
+nothing added to commit but untracked files present (use \"git add\" to track)
+
+"""]] diff --git a/doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment b/doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment new file mode 100644 index 000000000..91ddadf8c --- /dev/null +++ b/doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-02-02T00:41:24Z" + content=""" +And following on to my transcript, you can then add the file to git in the regular git way, and it works fine: + +
+joey@gnu:~/tmp/demo>git add file
+joey@gnu:~/tmp/demo>git commit
+[master 225ffc0] added as regular git file, not in annex
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ create mode 100644 file
+joey@gnu:~/tmp/demo>ls -l file
+-rw-r--r-- 1 joey joey 3 Feb  1 20:38 file
+joey@gnu:~/tmp/demo>git log file
+commit 225ffc048f5af7c0466b3b1fe549a6d5e9a9e9fe
+Author: Joey Hess 
+Date:   Tue Feb 1 20:43:13 2011 -0400
+
+    added as regular git file, not in annex
+
+commit 78a09cc791b875c3b859ca9401e5b6472bf19d08
+Author: Joey Hess 
+Date:   Tue Feb 1 20:38:30 2011 -0400
+
+    unannex
+
+commit 64cf267734adae05c020d9fd4d5a7ff7c64390db
+Author: Joey Hess 
+Date:   Tue Feb 1 20:38:18 2011 -0400
+
+    add
+
+"""]] diff --git a/doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment b/doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment new file mode 100644 index 000000000..9f3223578 --- /dev/null +++ b/doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-02-02T00:46:00Z" + content=""" +Sorry for all the followups, but I see now that if you unannex, then add the file to git normally, and commit, the hook *does* misbehave. + +This seems to be a bug. git-annex's hook thinks that you have used git annex unlock (or \"git annex edit\") on the file and are now committing a changed version, and the right thing to do there is to add the new content to the annex and update the symlink accordingly. I'll track this bug over at [[bugs/unannex_vs_unlock_hook_confusion]]. + +So, committing after unannex, and before checking the file into git in the +usual way, is a workaround. But only if you do a "git commit" to commit +staged changes. + +Anyway, this confusing point is fixed in git now! +"""]] diff --git a/doc/forum/unknown_response_from_git_cat-file.mdwn b/doc/forum/unknown_response_from_git_cat-file.mdwn new file mode 100644 index 000000000..e4c559815 --- /dev/null +++ b/doc/forum/unknown_response_from_git_cat-file.mdwn @@ -0,0 +1,8 @@ +Hi, + +when running git annex add in my direct mode repository, since a few days ago I only get: + +$ git annex add +git-annex: unknown response from git cat-file (":./Archiv/Someone missing",:./Archiv/Someone Like You Cover-fCvjvEGkTu4.flv) + +The :./Archiv/Someone missing part strikes me odd because it so much looks like broken shell meta-character escaping in git-annex, but I doubt that because it stopped working just suddenly. diff --git a/doc/forum/unknown_response_from_git_cat-file/comment_1_f26ba569e715fe69b6de3093930362ee._comment b/doc/forum/unknown_response_from_git_cat-file/comment_1_f26ba569e715fe69b6de3093930362ee._comment new file mode 100644 index 000000000..0ddef17af --- /dev/null +++ b/doc/forum/unknown_response_from_git_cat-file/comment_1_f26ba569e715fe69b6de3093930362ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-07T16:34:18Z" + content=""" +This is a bug in the 1.8.4 pre-release version of git. It will be fixed in the 1.8.4 release or another pre-release. git-annex version 4.20130802 has a workaround for this problem. +"""]] diff --git a/doc/forum/unlock__47__lock_always_gets_me.mdwn b/doc/forum/unlock__47__lock_always_gets_me.mdwn new file mode 100644 index 000000000..0891eed0e --- /dev/null +++ b/doc/forum/unlock__47__lock_always_gets_me.mdwn @@ -0,0 +1,11 @@ +Several times now I've done something like: + + $ git annex unlock movie.avi + $ mv /tmp/fixed.avi movie.avi + $ git annex lock movie.avi + +Oops, I just lost my fixed.avi! That really feels like the right sequence of operations to me, so I'm always surprised when I make that mistake. I would like to see the current `lock` renamed to something like `undo-unlock`, or have the behavior changed to be the same as `add`, or maybe warn and require a `--force` when the file has been changed. + +If changing current behavior is undesirable, maybe `unlock` could just print a reminder that `git annex add` is the correct next step after making changes? + +Failing that, I suppose I could slowly start to learn from my mistakes. diff --git a/doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment b/doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment new file mode 100644 index 000000000..c37561665 --- /dev/null +++ b/doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-07T17:15:31Z" + content=""" +Well, lock could check for modifications and require --force to lose them. But the check could be expensive for large files. + +But `git annex lock` is just a convenient way to run `git checkout`. And running `git checkout` or `git reset --hard` will lose your uncommitted file the same way obviously. + +Perhaps the best fix would be to get rid of `lock` entirely, and let the user use the underlying git commands same as they would to drop modifications to other files. It would then also make sense to remove `unlock`, leaving only `edit`. +"""]] diff --git a/doc/forum/unlock__47__lock_always_gets_me/comment_2_f89b4349dde840c355a3bc28908decdf._comment b/doc/forum/unlock__47__lock_always_gets_me/comment_2_f89b4349dde840c355a3bc28908decdf._comment new file mode 100644 index 000000000..f732c87da --- /dev/null +++ b/doc/forum/unlock__47__lock_always_gets_me/comment_2_f89b4349dde840c355a3bc28908decdf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 2" + date="2013-09-07T12:26:46Z" + content=""" +I too was totally flummoxed by this. +"""]] diff --git a/doc/forum/unlock__47__lock_always_gets_me/comment_3_acbab7b75726d34dccb5c9dab7b3e728._comment b/doc/forum/unlock__47__lock_always_gets_me/comment_3_acbab7b75726d34dccb5c9dab7b3e728._comment new file mode 100644 index 000000000..835222f19 --- /dev/null +++ b/doc/forum/unlock__47__lock_always_gets_me/comment_3_acbab7b75726d34dccb5c9dab7b3e728._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="It seems we've been heard" + date="2013-12-07T15:13:10Z" + content=""" +https://github.com/joeyh/git-annex/commit/cde099fe80cd2bc6345496c9266c41baf46c1976 : lock: Require --force. +"""]] diff --git a/doc/forum/unrelated_repositories_sync.mdwn b/doc/forum/unrelated_repositories_sync.mdwn new file mode 100644 index 000000000..030fb380d --- /dev/null +++ b/doc/forum/unrelated_repositories_sync.mdwn @@ -0,0 +1,15 @@ +I have no idea how to search for this here, so I'll just go the "lazy web" approach and just ask. + +Say I have two "conference" repos. One is the famous [conference procedings](https://github.com/RichiH/conference_proceedings) repo, and another one is a totally unrelated repo of local conferences that are not of world-wide significance. Let's call this second repo `presentations`. + +I would like to have my videos of both repos in a single repo. + +Can I add the `conference procedings` repo as a git remote to the `presentations` repo and have it do the right thing? + +In fact, I'm not even sure what the right thing would be here, I guess that's the first thing I would like to clear up. But I would like to do things like what the new [[metadata]] system does. For example, I would have only the "Debian" directory from `conference procedings` in my `presentations` repo. + +How would that work? Would I need to do some [subtree merging](http://git-scm.com/book/ch6-7.html) magic? or `git subtree`? or submodules? or should i just use myrepos and pretend I never brought up this idea? + +thanks! -- [[anarcat]] + +related: [[tips/migrating_two_seperate_disconnected_directories_to_git_annex/]] - but that creates a merged repo... diff --git a/doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment b/doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment new file mode 100644 index 000000000..7df8a0eb9 --- /dev/null +++ b/doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T19:51:06Z" + content=""" +It might help if you think about these two different repositories as branches. You have 2 branches with different files in them, and you want to produce a third branch with some mix of the two. + +I think git is perfectly capable of doing that. Where it gets hairy is dealing with merges when either of the 2 repositories change going forward. The same as if you've forked and modified source code, you will need to do *something* to resolve merges. +"""]] diff --git a/doc/forum/unsynced_folder.mdwn b/doc/forum/unsynced_folder.mdwn new file mode 100644 index 000000000..ceb04011e --- /dev/null +++ b/doc/forum/unsynced_folder.mdwn @@ -0,0 +1,3 @@ +If I have an archive with a lot of big files, is it possible to get one of them without using the command line, and without it popping up on other clients of that repository? +Is it possible to have a folder that will not be synced with other clients but will still download the file when i copy it from archive? +.gitignore probably wont work because that will not get the file from archive. diff --git a/doc/forum/unsynced_folder/comment_1_7d7a262f067c7b02d76e82637223934c._comment b/doc/forum/unsynced_folder/comment_1_7d7a262f067c7b02d76e82637223934c._comment new file mode 100644 index 000000000..7f746df12 --- /dev/null +++ b/doc/forum/unsynced_folder/comment_1_7d7a262f067c7b02d76e82637223934c._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T20:09:48Z" + content=""" +Sorry I took so long to answer. I think that it took me a few tries to understand your question. + +You want to have a special folder on a single clone of a repository, and be able to move files to that folder from the archive folder, and have it get the file content from the archive repository. But you don't want that file content to spread to any of the other repositories. + +This is possible to do by writing a custom [[preferred_content]] expression, and configuring the repository to use it. For simplicity, let's make the folder be called `archive/local`. This way, all the clients that do not use this preferred content expression will see that the file is still under the archive folder, and not want its content. + +Now we can take the preferred content expression used by client repositories normally: + + ((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1) + +And modify it: + + ((exclude=*/archive/* and exclude=archive/* and (not */archive/local/*) and (not archive/local/*)) or (not (copies=archive:1 or copies=smallarchive:1))) or (not copies=semitrusted+:1) + +You can use `git annex vifg` to edit the preferred content expressions, and paste that in. Should work. Untested. +"""]] diff --git a/doc/forum/update_via_cabal_fails.mdwn b/doc/forum/update_via_cabal_fails.mdwn new file mode 100644 index 000000000..aae8461c6 --- /dev/null +++ b/doc/forum/update_via_cabal_fails.mdwn @@ -0,0 +1,35 @@ +I tried to update git-annex via cabal. It fails due to lens not installing: + + juh@sokrates:~$ cabal update + Downloading the latest package list from hackage.haskell.org + juh@sokrates:~$ cabal install git-annex + Resolving dependencies... + In order, the following will be installed: + lens-4.2 (new version) + DAV-0.6.2 (reinstall) changes: http-client-0.3.1.1 -> 0.3.3.1, + http-client-tls-0.2.1.1 added, http-types-0.8.4 -> 0.8.5, lens-4.1.2 -> 4.2, + network-2.4.1.2 added, optparse-applicative-0.7.0.2 added, xml- conduit-1.2.0.1 + -> 1.2.0.2, xml-hamlet-0.4.0.8 added + git-annex-5.20140707 (new package) + Warning: Note that reinstalls are always dangerous. Continuing anyway... + [1 of 1] Compiling Main ( /tmp/lens-4.2-3107/lens-4.2/Setup. lhs, /tmp/lens-4.2-3107/lens-4.2/dist/setup/Main.o ) + Linking /tmp/lens-4.2-3107/lens-4.2/dist/setup/setup ... + Configuring lens-4.2... + Building lens-4.2... + Preprocessing library lens-4.2... + + src/Control/Lens/Internal/Zoom.hs:47:8: + Could not find module `Control.Monad.Trans.Except' + Perhaps you meant + Control.Monad.Trans.Cont (from transformers-0.3.0.0) + Control.Monad.Trans.Error (from transformers-0.3.0.0) + Control.Monad.Trans.List (from transformers-0.3.0.0) + Use -v to see a list of the files searched for. + Failed to install lens-4.2 + cabal: Error: some packages failed to install: + DAV-0.6.2 depends on lens-4.2 which failed to install. + git-annex-5.20140707 depends on lens-4.2 which failed to install. + lens-4.2 failed during the building phase. The exception was: + ExitFailure 1 + +I am not an experienced user of cabal. So any hints to solve the conflicts are appreciated. diff --git a/doc/forum/update_via_cabal_fails/comment_1_e1235dc2acd3bac3dd51b7614dabbb88._comment b/doc/forum/update_via_cabal_fails/comment_1_e1235dc2acd3bac3dd51b7614dabbb88._comment new file mode 100644 index 000000000..71fd0e60f --- /dev/null +++ b/doc/forum/update_via_cabal_fails/comment_1_e1235dc2acd3bac3dd51b7614dabbb88._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-09T17:58:48Z" + content=""" +It seems like you must have transformers-compat 0.1.1, and lens's dependency is slightly wrong, accepting that extremly old version. You'll need to upgrade it. +"""]] diff --git a/doc/forum/updating_the___34__number_of_copies__34__.mdwn b/doc/forum/updating_the___34__number_of_copies__34__.mdwn new file mode 100644 index 000000000..c28d26530 --- /dev/null +++ b/doc/forum/updating_the___34__number_of_copies__34__.mdwn @@ -0,0 +1,14 @@ +Is it possible to let git-annex check and update the "number of copies" or "whereis" information without recalculating the checksome? + +The use case is this: + +I have a very large "repo1": 300.000 files 1.5 TB. + +I copy it using low level tools for performance (clone the partition, netcat over network, or whatever...) + +Then i do "git annex init 'repo2'". +All files exist in both repos and the simlinks are valid, but git-annex does not know about it. +The "git-annex wehereis" only shows "repo1". How can I tell him without rehashing 1.6TB? + +Thx + diff --git a/doc/forum/updating_the___34__number_of_copies__34__/comment_1_327bdb0d9c190c60c7147b3acf07af09._comment b/doc/forum/updating_the___34__number_of_copies__34__/comment_1_327bdb0d9c190c60c7147b3acf07af09._comment new file mode 100644 index 000000000..2fd4ffaee --- /dev/null +++ b/doc/forum/updating_the___34__number_of_copies__34__/comment_1_327bdb0d9c190c60c7147b3acf07af09._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-12-01T18:40:46Z" + content=""" +Well, first of all, after copying a repository like this, you need to edit its .git/config and delete the annex.uuid setting. Otherwise, you will have two repositories with the same UUID, which is not good. + +Once you've done that, run `git annex fsck` in the new repository and it will do what you want. +"""]] diff --git a/doc/forum/updating_the___34__number_of_copies__34__/comment_2_7e11c839637e0894332e413cde02cee9._comment b/doc/forum/updating_the___34__number_of_copies__34__/comment_2_7e11c839637e0894332e413cde02cee9._comment new file mode 100644 index 000000000..269fc22bc --- /dev/null +++ b/doc/forum/updating_the___34__number_of_copies__34__/comment_2_7e11c839637e0894332e413cde02cee9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 2" + date="2012-12-01T19:27:59Z" + content=""" +Ok, that did the trick, except that it recalculates all cehcksums, which is exactly wat I do not want, as it is unnecessary and takes at 40MB/s just too long. Any other way? I think about adding the whereis info by hand, which simply feels wrong! +"""]] diff --git a/doc/forum/updating_the___34__number_of_copies__34__/comment_3_8b7a70fb3bb41e4eda412302834730bb._comment b/doc/forum/updating_the___34__number_of_copies__34__/comment_3_8b7a70fb3bb41e4eda412302834730bb._comment new file mode 100644 index 000000000..c13095090 --- /dev/null +++ b/doc/forum/updating_the___34__number_of_copies__34__/comment_3_8b7a70fb3bb41e4eda412302834730bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-12-01T19:37:26Z" + content=""" +git annex fsck --fast will skip the checksumming. +"""]] diff --git a/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__.mdwn b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__.mdwn new file mode 100644 index 000000000..76f03452d --- /dev/null +++ b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__.mdwn @@ -0,0 +1,20 @@ +Dear all, + From some time now I am wondering about a way to index a set of files, lets say PDF documents. The idea is to have a unique identifier for each file and to cross-reference using this identifier. For instance, I use a project management (PM) software (web based) on a public server of my university. Then I have a set of tasks saying, review document X, or Y. And those documents are stored on an internal server of my lab. +I see several options: + +1. Upload the required documents to the PM site and directly link +2. Share online my internal server and use the URL of the docs in the PM +3. Just use the unique identifier in the PM, and then look in git annex for that ID +4. Use some sort of document management system (DMS) + +Options 1 and 2 are impractical for several reasons. Option 4 usually requires that your files are inside the DMS. +So my questions are: + +* Do you think this is doable with git-annex? +* Is there an easy way to ask it: give me the document with this index? +* I think the best answer for this question is: git annex find --include '*' --format='${key} ${file}' | grep +* And conversely, how do I find the key of a certain document? + +Thanks in advance. +Best, + Juan diff --git a/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_1_955f3aac12c1ddb41267c5a23ccb79e3._comment b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_1_955f3aac12c1ddb41267c5a23ccb79e3._comment new file mode 100644 index 000000000..069d41c10 --- /dev/null +++ b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_1_955f3aac12c1ddb41267c5a23ccb79e3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="comment 1" + date="2014-07-03T19:10:53Z" + content=""" +To make git-annex output the key of a file, run: `git annex lookupkey $file` + +I don't know if the git-annex key is appropriate for your use-case. If the files never get changed, then it's a nice stable identifier. If ongoing changes are made to a file, and you want to link to the most recent version, the key would not be useful. + +You might also look at git-annex's [[metadata]]; you could make up some metadata field and value and attach it to a file, and it would persist as the file was modified. +"""]] diff --git a/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_2_0aff36755f49afddd5482a602a1ccd2b._comment b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_2_0aff36755f49afddd5482a602a1ccd2b._comment new file mode 100644 index 000000000..2ef754f16 --- /dev/null +++ b/doc/forum/use_case:_unique_indentifier_of_objets___40__doi_like__41__/comment_2_0aff36755f49afddd5482a602a1ccd2b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="comment 2" + date="2014-07-09T15:32:49Z" + content=""" +If I get this right, the key will change every time the file is changed. +If that's the case, seems that it won't be useful for my case. +Thanks for the time. +"""]] diff --git a/doc/forum/use_existing_ssh_keys__63__.mdwn b/doc/forum/use_existing_ssh_keys__63__.mdwn new file mode 100644 index 000000000..7f73c18bc --- /dev/null +++ b/doc/forum/use_existing_ssh_keys__63__.mdwn @@ -0,0 +1,5 @@ +Hi, a new user trying out git-annex 3.20130124 here. So far looks really promising, thanks. + +I setup a local annex using the assistant webapp. I then created a rsync cloud repo over ssh to my shell box in a nearby data center for it. Works ok. I already have ssh key setup inclding ssh-agent for quick logins to the server. It would be great if you could configure the assistant to use these existing keys instead of creating a new set of keys. Maybe keep the defaults as is, but provide the config for this hidden behind "trust me, I know what I'm doing" check box or something. + +Thanks again, I keep researching. diff --git a/doc/forum/use_existing_ssh_keys__63__/comment_1_c420c53f022bbd1b28494bc44d076feb._comment b/doc/forum/use_existing_ssh_keys__63__/comment_1_c420c53f022bbd1b28494bc44d076feb._comment new file mode 100644 index 000000000..93cb92c55 --- /dev/null +++ b/doc/forum/use_existing_ssh_keys__63__/comment_1_c420c53f022bbd1b28494bc44d076feb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-07T18:11:30Z" + content=""" +Hmm. The assistant already tries to cater to this case of having an existing key. When setting up a rsync or ssh remote, it first tries to ssh to the server without allowing a password to be prompted for. If this succeeds, it assumes you have a passwordless key and uses it. Otherwise, it sshes in once with a password prompt, and sets up its own key. +"""]] diff --git a/doc/forum/use_existing_ssh_keys__63__/comment_2_e4cae848e5701852073ced307832872b._comment b/doc/forum/use_existing_ssh_keys__63__/comment_2_e4cae848e5701852073ced307832872b._comment new file mode 100644 index 000000000..4aaaeacce --- /dev/null +++ b/doc/forum/use_existing_ssh_keys__63__/comment_2_e4cae848e5701852073ced307832872b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnwz07HJdp3nzLwCAl7OGKn_3m0tTO4Mxw" + nickname="Teemu" + subject="use existing ssh keys?" + date="2013-03-02T12:05:30Z" + content=""" +I also found the key setup confusing. I have many identity files for several server / service combinations, so the webapp key setup for an ssh+rsync cloud server always failed with too many identification attempts before I had the sense to move my keys temporarily away from ~/.ssh + +It would be really nice if the webapp would allow one either to pick an existing identity, or to create a new one with the aid of a couple of password logins. + +Also, having the created key to be restricted to only running rsync in the server would improve the chances of 'Share with a friend' use case being used. I don't think many people will want to give out full shell access to their servers in order to share some files. +"""]] diff --git a/doc/forum/use_existing_ssh_keys__63__/comment_3_a97c20b6df74c49e5f57c7caf962f1e2._comment b/doc/forum/use_existing_ssh_keys__63__/comment_3_a97c20b6df74c49e5f57c7caf962f1e2._comment new file mode 100644 index 000000000..e90ed07be --- /dev/null +++ b/doc/forum/use_existing_ssh_keys__63__/comment_3_a97c20b6df74c49e5f57c7caf962f1e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-03T16:57:22Z" + content=""" +When pairing with a local computer, both systems set up locked down ssh keys that only allow the pair to run git-annex on the repository being paired with. This does *not* involve full shell access. + +The \"remote server\" necessarily involves you already having shell access to the remote server. However, the ssh key that the assistant generates is again locked down to only being able to run git-annex on a single repository on the remote server. +"""]] diff --git a/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn new file mode 100644 index 000000000..86e317da8 --- /dev/null +++ b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn @@ -0,0 +1,7 @@ +I would like to use git-annex to synchronize 2 directories in the same manner as unison. + +I'm starting with 2 directories. There is an overlap of the same set of files in each directory, but each directory also has additional files as well. + +I create a git annex in each directory but when I do a git pull it merges and produces conflicts on those files that are the same. + +What is the correct workflow for this type of scenario? diff --git a/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment new file mode 100644 index 000000000..4682ea64f --- /dev/null +++ b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="comment 1" + date="2011-12-18T13:57:33Z" + content=""" +Are the files identical or different? I today did something like that with similar, but not identical directories containing media files, and git happily merged them. but there, same files had same content. + +Also, make sure you use the same backend. In my case, one of the machines runs Debian stable, so I use the WORM backend, not the SHA backend. +"""]] diff --git a/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_2_648946353c6d90c57351cce4010f1301._comment b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_2_648946353c6d90c57351cce4010f1301._comment new file mode 100644 index 000000000..bdd4b25e4 --- /dev/null +++ b/doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_2_648946353c6d90c57351cce4010f1301._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-12-19T18:24:59Z" + content=""" +I'd recommend using the SHA backend for this, the WORM backend would produce conflicts if the files' modification times changed. + +[[syncing_non-git_trees_with_git-annex]] describes one way to do it. +"""]] diff --git a/doc/forum/version_3_upgrade.mdwn b/doc/forum/version_3_upgrade.mdwn new file mode 100644 index 000000000..7fdbcbc80 --- /dev/null +++ b/doc/forum/version_3_upgrade.mdwn @@ -0,0 +1,9 @@ +after upgrading to git-annex 3, i'm stuck with diverging git-annex branches -- i didn't manage to follow this line in the directions: + +> After this upgrade, you should make sure you include the git-annex branch when git pushing and pulling. + +could you explain how to do that in a littel more detail? git pull seems to only merge master, although i have these ``.git/config`` settings: + + [branch "git-annex"] + remote = origin + merge = git-annex diff --git a/doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment b/doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment new file mode 100644 index 000000000..18746225e --- /dev/null +++ b/doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-08-17T01:33:08Z" + content=""" +It's ok that `git pull` does not merge the git-annex branch. You can merge it with `git annex merge`, or it will be done +automatically when you use other git-annex commands. + +If you use `git pull` and `git push` without any options, the defaults will make git pull and push the git-annex branch automatically. + +But if you're in the habit of doing `git push origin master`, that won't cause the git-annex branch to be pushed (use `git push origin git-annex` to manually push it then). Similarly, `git pull origin master` won't pull it. And also, the `remote.origin.fetch` setting in `.git/config` can be modified in ways that make `git pull` not automatically pull the git-annex branch. So those are the things to avoid after upgrade to v3, basically. +"""]] diff --git a/doc/forum/view_from_numeric_values.mdwn b/doc/forum/view_from_numeric_values.mdwn new file mode 100644 index 000000000..e1fc48a0f --- /dev/null +++ b/doc/forum/view_from_numeric_values.mdwn @@ -0,0 +1,9 @@ +Hi Joey, + +it would be nice when views could take numeric comparisons as filters. + + git annex metadata -s length=273.0 john_cage_4_33.mp3 + + git annex view length<=300 + +... here is the catch, < and > don't work well in shell, this needs some other Syntax. I think the underlying machinery (using numeric comparisons instead globs) should be quite trivial. Any Ideas about a Syntax? diff --git a/doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment b/doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment new file mode 100644 index 000000000..4df3034a2 --- /dev/null +++ b/doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="consistent syntax" + date="2014-03-25T15:25:43Z" + content=""" +Further thinking led to the idea to use the test(1) like syntax to filter matches. + + git annex view length=.* -lt 300 -gt 30 -o -eq 273 bpm=.* -eq 0 + +"""]] diff --git a/doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment b/doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment new file mode 100644 index 000000000..ff4fcc551 --- /dev/null +++ b/doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 2" + date="2014-03-26T17:53:28Z" + content=""" +I'm a little bit worried about the potential to reinvent SQL, badly. ;) + +As shown in your example, once you have ranges, it's natural to also want disjunctions, and then probably parenthesized expressions, and suddenly things are very complicated. + +Also, it's important that views remain reversable, so that committing a moved file in a view can unambiguously calculate the new metadata for it. I think that quickly becomes hard when adding these complications. +"""]] diff --git a/doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment b/doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment new file mode 100644 index 000000000..da6dded17 --- /dev/null +++ b/doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="comment 3" + date="2014-03-26T18:55:41Z" + content=""" +I'm a little bit worried about the potential to reinvent SQL, badly. ;) + +As shown in your example, once you have ranges, it's natural to also want disjunctions, and then probably parenthesized expressions, and suddenly things are very complicated. + +Also, it's important that views remain reversable, so that committing a moved file in a view can unambiguously calculate the new metadata for it. I think that quickly becomes hard when adding these complications. + +"""]] diff --git a/doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment b/doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment new file mode 100644 index 000000000..90cb1c22a --- /dev/null +++ b/doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="comment 4" + date="2014-03-26T20:03:51Z" + content=""" +I agree with you that things must stay simple. All what should be done is having the same effects like normal globs but adding arithmetic comparisons to it (could you think about a globbing extension over numeric values?). Then the generated views will have the same properties/semnatic as the normal glob'ed views without other side effects (if you want to go that far, this would even hold true for disjunct, parenthesized and otherwise complex expression). + +Example (how it should work, except my bug report 'set metadata on wrong files') + + git annex metadata a.txt -s foo=bar -s num=1 + git annex metadata b.txt -s foo=baz -s num=2 + git annex metadata c.txt -s foo=barf -s num=3 + + git annex view foo=bar* num=* -ne 2 + +should give + ./bar/1/a.txt ./barf/3/c.txt + +am I right now than one could + + mkdir -p ./baz/2 + mv /bar/1/a.txt ./baz/2 + +to change the metadata of a.txt, despite the foo=baz and num=2 fields where initially filtered out when creating the view? +If this assumption is true then having arithmetic filters, no matter how complex they are won't change the existing semantics over what globs do. + +"""]] diff --git a/doc/forum/view_including_files_with_no_tags.mdwn b/doc/forum/view_including_files_with_no_tags.mdwn new file mode 100644 index 000000000..7ed64fc7d --- /dev/null +++ b/doc/forum/view_including_files_with_no_tags.mdwn @@ -0,0 +1,5 @@ +Hi + +Is it possible to create a view which also includes files with no tag? + +I use something like `git annex view 'rating=*'` to view files sorted by rating but this view does not include files which don‘t have a rating yet. What I was looking for is a way to show tagged files and untagged files in one view. diff --git a/doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment b/doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment new file mode 100644 index 000000000..ec58308b7 --- /dev/null +++ b/doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 1" + date="2014-03-25T08:54:23Z" + content=""" +This is a TODO: + +http://git-annex.branchable.com/design/metadata/ + + unmatched files in filtered branches + + TODO Files not matching the view should be able to be included in the filtered branch, in a special location, an \"other\" directory. + +In the meantime, I do this before switching to the view: + + git annex metadata -s fieldIwant?=untagged + +This shows the files without any \"fieldIwant\" in the directory \"untagged\". Afterwards, I could (but don't need to in my workflow, it automatically gets removed), do this to remove it: + + git annex metadata -s fieldIwant-=untagged + +What the \"?=\" does is add that metadata only if the \"fieldIwant\" hasn't been set at all. +"""]] diff --git a/doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment b/doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment new file mode 100644 index 000000000..3f16a163f --- /dev/null +++ b/doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="Perfect" + date="2014-03-25T20:11:26Z" + content=""" +This works great. Nice workaround, thanks very much. +"""]] diff --git a/doc/forum/views___40__branches__41___never_get_deleted.mdwn b/doc/forum/views___40__branches__41___never_get_deleted.mdwn new file mode 100644 index 000000000..bba7762da --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted.mdwn @@ -0,0 +1,16 @@ +Hello everyone, +I would like to know if this is normal behavior or if it's a problem with my repository: + +Whenever I set a view with + +git annex view attr="\*"' + +a new branch representing the selected view gets created, as expected. The problem is that when I switch back to master ('git checkout master' or even 'git annex vpop') the view branch stays there, and all subsequent operations on the annex also consider the view branch, resulting a great slowdown if one has done many views (attr="this", attr="that", etc.). Is this normal? If so, why is it necessary for the branch to stay on? Does it speed up going back to the branch? Redoing git annex view attr="*" does not seem to take less time. + +Am I doing it wrong? Should I be deleting used view branches on my own? How? + +thanks for your replies. + +**EDIT:** I just found out that even if I delete view branches with git branch -D "views/attr=_" (which I'm not sure I should be doing), the branches are still checked when doing "git annex unused". That is, "git annex unused" lists "checking..." a whole lot of past views/branches which are not even there anymore (not listed with "git branch"). I also suspect that this is preventing deleted (git-rm) files from being collected from "unused". Is this a problem with my repo? Any way to fix this? + +=== git-annex version: **5.20140529-gb71f9bf** === diff --git a/doc/forum/views___40__branches__41___never_get_deleted/comment_1_ff53fa0b5f0c4a6554a37e3309e26925._comment b/doc/forum/views___40__branches__41___never_get_deleted/comment_1_ff53fa0b5f0c4a6554a37e3309e26925._comment new file mode 100644 index 000000000..61fcbfeb4 --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted/comment_1_ff53fa0b5f0c4a6554a37e3309e26925._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-06-04T18:04:30Z" + content=""" +You can delete the view branches if you like. I have considered making moving views clean up old branches, but I have also considered reusing existing view branches when popping back to an old view. + +git-annex unused can't look at branches that aren't there. Perhaps you have pushed the view branches to a remote repository, and it's checking those branches of the remote? See git branch -a. + +I think that it makes sense for unused to ignore (local) view branches, since these are by definition supposed to be views of an existing branch, so looking at the branch should be sufficient (and if the view is out of date and has files that have since been deleted from the branch, the user's intent is not to preserve those from unused reaping). So, made that change. +"""]] diff --git a/doc/forum/views___40__branches__41___never_get_deleted/comment_3_1d4a3f4e83b288262e291262a6636602._comment b/doc/forum/views___40__branches__41___never_get_deleted/comment_3_1d4a3f4e83b288262e291262a6636602._comment new file mode 100644 index 000000000..0a5d61e54 --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted/comment_3_1d4a3f4e83b288262e291262a6636602._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYMS6tQ8q9k1fylGyA9Q6fdFzRBotME2Q" + nickname="tom" + subject="EDIT reply comment:" + date="2014-06-04T19:44:18Z" + content=""" +> *You can delete the view branches if you like. I have considered making moving views clean up old branches, but I have also considered reusing existing view branches when popping back to an old view.* + +Alright, I'd very much welcome anyone of the two possibilities as I'm making heavy use of views and would benefit from any of the two solutions. + +> *Perhaps you have pushed the view branches to a remote repository, and it's checking those branches of the remote? See git branch -a.* + +That's it! Solution for future reference: The remote branches referenced in local repo did not exist anymore in any repo (I had deleted them earlier from the remote) so \"git push origin --delete \\" wouldn't work. This other command worked very well in cleaning up the overwhelming missing remote views all in one go: \"git fetch --prune \\" + +> *I think that it makes sense for unused to ignore (local) view branches, since these are by definition supposed to be views of an existing branch, so looking at the branch should be sufficient. So, made that change.* + +Thanks a lot! It makes perfect sense, looking forward to it on the next release. + +Now, it seems that even after pruning the view branches on the remote, *unused* would still not collect deleted files. I'm wondering if this is because there are other offline repos (backups which are not practical to take out of their resting place) I have not yet synchronized. I can see their main branches with git branch -a: remotes/oldbackup/git-annex, remotes/oldbackup/master, remotes/oldbackup/synced/git-annex, remotes/oldbackup/synced/master. Does this mean that until all repos (even the offline ones I never sync and work mostly as a backup for old stuff) are synchronized, 'unused' won't collect the deleted files? If so, is there a workaround for this? + +"""]] diff --git a/doc/forum/views___40__branches__41___never_get_deleted/comment_3_4e96e5325fd12e48f190fe551a6ac07e._comment b/doc/forum/views___40__branches__41___never_get_deleted/comment_3_4e96e5325fd12e48f190fe551a6ac07e._comment new file mode 100644 index 000000000..7ac31b1e9 --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted/comment_3_4e96e5325fd12e48f190fe551a6ac07e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYMS6tQ8q9k1fylGyA9Q6fdFzRBotME2Q" + nickname="tom" + subject="added comment" + date="2014-06-04T22:41:40Z" + content=""" +Specifically I'm looking for a workaround that would make this behavior possible in this use case: + +The user decides some file in the local repository are not needed anymore, they are not needed to be in any repository at all and wants to reclaim the space as soon as possible (or at least make the files available to 'unused' for later removal). Removing the content the from local repository (git-rm ?) the space can be immediately reclaimed in the local hard drive, without the need to connect and sync unavailable/far remotes. As the other remotes and old backups become available and sync, they delete the unused content as well (or at least make it available to 'unused'). + +Is there a way to achieve this? +"""]] diff --git a/doc/forum/views___40__branches__41___never_get_deleted/comment_4_a4764b5bfb08ebe90430ea14fcb6e8e0._comment b/doc/forum/views___40__branches__41___never_get_deleted/comment_4_a4764b5bfb08ebe90430ea14fcb6e8e0._comment new file mode 100644 index 000000000..762e4db53 --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted/comment_4_a4764b5bfb08ebe90430ea14fcb6e8e0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-05T17:35:31Z" + content=""" +`git annex drop --force $file; git rm $file` + +Makes sense in some situations anyway.. +"""]] diff --git a/doc/forum/views___40__branches__41___never_get_deleted/comment_5_02e08dffb01246010b390aeef8f32234._comment b/doc/forum/views___40__branches__41___never_get_deleted/comment_5_02e08dffb01246010b390aeef8f32234._comment new file mode 100644 index 000000000..a9b72087e --- /dev/null +++ b/doc/forum/views___40__branches__41___never_get_deleted/comment_5_02e08dffb01246010b390aeef8f32234._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYMS6tQ8q9k1fylGyA9Q6fdFzRBotME2Q" + nickname="tom" + subject="comment 5" + date="2014-06-06T09:57:32Z" + content=""" +ah, I get it. Thanks! +"""]] diff --git a/doc/forum/vlc_and_git-annex.mdwn b/doc/forum/vlc_and_git-annex.mdwn new file mode 100644 index 000000000..cb07f8183 --- /dev/null +++ b/doc/forum/vlc_and_git-annex.mdwn @@ -0,0 +1,11 @@ +I used to save movies with the srt subtitle files next to them. + +Usually vlc finds it because it's on the same directory than the movie file, however with git annex the link is located on another folder. +So after adding movies to git, the subtitles doesn't load anymore. + +couldn't find a quick fix. I'm thinking a bash script, but wanted to discuss it here with all annex users. + +I know It's out of annex scope, but I think a movie archive is a great scenario for git-annex. +most of my HD is filled up with movies from the camcorder, screencast, etc... +And we usually don't modify those files + diff --git a/doc/forum/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment b/doc/forum/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment new file mode 100644 index 000000000..700b3808d --- /dev/null +++ b/doc/forum/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-23T16:16:19Z" + content=""" +From what you say, it seems that vlc is following the symlink to the movie content, and then looking for subtitles next to the file the symlink points to. It would have to explicitly realpath the symlink to have this behavior, and this sounds like a misfeature.. perhaps you could point out to the vlc people the mistake in doing so? + +There's a simple use-case where this behavior is obviously wrong, without involving git-annex. Suppose I have a movie, and one version of subtitles for it, in directory `foo`. I want to modify the subtitles, so I make a new directory `bar`, symlink the large movie file from `foo` to save space, and copy over and edit the subtitles from `foo`. Now I run vlc in `bar` to test my new subtitles. If it ignores the locally present subtitles and goes off looking for the ones in `bar`, I say this is broken behavior. +"""]] diff --git a/doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment b/doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment new file mode 100644 index 000000000..3c69f5fe4 --- /dev/null +++ b/doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-12-23T18:43:05Z" + content=""" +Since subtitle files are typically pretty small, a workaround is to simply check them into git directly, and only use git-annex for the movies. (Or `git annex unannex` the ones you've already annexed.) +"""]] diff --git a/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout.mdwn b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout.mdwn new file mode 100644 index 000000000..f57e0ee83 --- /dev/null +++ b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout.mdwn @@ -0,0 +1,69 @@ +I am struggling for so long time, everytime getting different errors :( :( + +I digged up my backup and started from scratch. Still not working. + +On the (linux) server (directory contains already files): + + cd bin + git init + git annex init server + git annex direct + git annex add . + +Then, on the Windows client: + + $ git clone ssh://me@server/srv/data/bin bin + Cloning into 'bin'... + warning: remote HEAD refers to nonexistent ref, unable to checkout. + +What's going on here? + +EDIT: Of course, I would not ask if everything would work as expected. But the client repository in windows is always empty, no matter what I do (issueing git annex init, git add remote, git annex sync, ...) does not seem to help me ... + +EDIT2: When I continue on the windows side (despite the warning): + + cd bin + git annex init client + git annex sync + Permission denied (publickey,keyboard-interactive). + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + + Remote origin does not have git-annex installed; setting annex-ignore + commit ok + pull origin Already up-to-date! + Merge made by the 'recursive' strategy. + + + ok + push origin To ssh://me@server/srv/data/bin + b79922f..4fe0505 git-annex -> synced/git-annex + 2f6a601..02a2603 annex/direct/master -> synced/master + + ok + + +But that's not true, git-annex is definitely installed on the server (it's just the Debian package and it resides in /usr/bin/git-annex). In any case, the client repository is still empty + +EDIT3: Struggle, struggle, ... + +Finally, for whatever reason, the client dir is not empty. What seems to be missing on the server was: + + git annex sync + +but this is never written (also not in the walkthrough). Can anyone tell me if it's required and why? + +Furthermore, even that I "see" at least the file references now, I am not able to get them: + + $ git annex get apps + get apps/gitignore (not available) + Try making some of these repositories available: + 10d0ffd8-f499-4b55-83e6-ff58cd98edc5 -- server + + (Note that these git remotes have annex-ignore set: origin) + failed + git-annex: get: 1 failed + +That's an SSH remote, it *is* available! What is meant by that? + + diff --git a/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_1_c0d9758be80d1a349ffe82c80075bebd._comment b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_1_c0d9758be80d1a349ffe82c80075bebd._comment new file mode 100644 index 000000000..3601e2639 --- /dev/null +++ b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_1_c0d9758be80d1a349ffe82c80075bebd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.174.99" + subject="comment 1" + date="2014-05-10T21:20:36Z" + content=""" +I think, although not sure, that all of this is related of failing/inconsistent ssh calls. + +I filed a bug here: https://git-annex.branchable.com/bugs/git-annex_ignores_GIT__95__SSH + +The problem is that failure in ssh does not result in proper error messages in git-annex, resulting in inconsistent repositories. +"""]] diff --git a/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_2_c28dae2eb0ab825ee6d43735e04a18a3._comment b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_2_c28dae2eb0ab825ee6d43735e04a18a3._comment new file mode 100644 index 000000000..97671a2c5 --- /dev/null +++ b/doc/forum/warning:_remote_HEAD_refers_to_nonexistent_ref__44___unable_to_checkout/comment_2_c28dae2eb0ab825ee6d43735e04a18a3._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-05-16T16:49:09Z" + content=""" +After you add a file to a git repository, you have to git commit it. Using git-annex is no different. The walkthrough shows using `git commit`: ; you can use `git-annex sync` if you prefer. + +
+Permission denied (publickey,keyboard-interactive).
+ (merging origin/git-annex origin/synced/git-annex into git-annex...)
+ (Recording state in git...)
+
+   Remote origin does not have git-annex installed; setting annex-ignore
+
+ +git-annex uses a heuristic to determine if git-annex-shell is not installed on a remote server: It tries to run it, and if that fails, it tries to run git fetch. If that succeeds it assumes this means it can log into the server, but git-annex-shell is not installed. + +Above, that heuristic seems to have failed; you seem to have given the wrong password or something so it didn't run git-annex-shell, but then it was able to log in for the git fetch. + +You will need to run this command to fix it up: `git config remote.origin.annex-ignore false` +"""]] diff --git a/doc/forum/webapp___47___assistant_without_watch.mdwn b/doc/forum/webapp___47___assistant_without_watch.mdwn new file mode 100644 index 000000000..9bb1fcf1a --- /dev/null +++ b/doc/forum/webapp___47___assistant_without_watch.mdwn @@ -0,0 +1,9 @@ +I did not recieve feedback on my comment [1], so I try to post my question again but more clearly. + +Is it possible to run the assistent/the webapp without the functionality of 'git annex watch'? + +I'd like to use the assistant and to have the automatic syncing but I do not want the local repository to be watched. Instead I prefer to manually add/drop my files. + +I do not see the 'pause button' mentioned in my earlier question [1]. + +[1] http://git-annex.branchable.com/forum/webapp_and_manual_mode/ diff --git a/doc/forum/webapp___47___assistant_without_watch/comment_1_1bcd99aa81f937ded683e19a69d33dd9._comment b/doc/forum/webapp___47___assistant_without_watch/comment_1_1bcd99aa81f937ded683e19a69d33dd9._comment new file mode 100644 index 000000000..c76128ae3 --- /dev/null +++ b/doc/forum/webapp___47___assistant_without_watch/comment_1_1bcd99aa81f937ded683e19a69d33dd9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-26T18:14:17Z" + content=""" +The assistant is currently only able to transfer files that it has added itself. So if you disable syncing, you have to manually upload any files you add. + +I doubt that I will change this in the assistant, because supporting this use case would complicate it unnecessarily for a use case that is not what it's designed to do. It's more likely that `git annex sync` will get an option to also transfer file contents. +"""]] diff --git a/doc/forum/webapp___47___assistant_without_watch/comment_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment b/doc/forum/webapp___47___assistant_without_watch/comment_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment new file mode 100644 index 000000000..a44155876 --- /dev/null +++ b/doc/forum/webapp___47___assistant_without_watch/comment_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.140.110" + subject="comment 2" + date="2013-08-26T18:54:40Z" + content=""" +Thanks for the clarification. + +Although + +* not what I hoped for ;-) +* I don't see that it would get complicated +* I do not consider my use case special + +Anyway, thanks for this great piece of software. +"""]] diff --git a/doc/forum/webapp_and_manual_mode.mdwn b/doc/forum/webapp_and_manual_mode.mdwn new file mode 100644 index 000000000..f7a903387 --- /dev/null +++ b/doc/forum/webapp_and_manual_mode.mdwn @@ -0,0 +1,7 @@ +Somehow I seemingly have not understood the manual mode. + +If I have a file in my repository, that is not yet in the annex (or in git), and I start the webapp, that file is automatically added to git-annex (and git). + +Why is that? + +And how can I use the webapp without such interference? diff --git a/doc/forum/webapp_and_manual_mode/comment_1_5b5df5ffeb6ee15779972f13fdc11729._comment b/doc/forum/webapp_and_manual_mode/comment_1_5b5df5ffeb6ee15779972f13fdc11729._comment new file mode 100644 index 000000000..677dd0414 --- /dev/null +++ b/doc/forum/webapp_and_manual_mode/comment_1_5b5df5ffeb6ee15779972f13fdc11729._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-21T17:17:58Z" + content=""" +Setting a repository to manual mode prevents the assistant from transferring new files into that repository. You have to manually run `git annex get`. + +To prevent the assistant from automatically adding files, you can click the pause button next to the current repository in the webapp. +"""]] diff --git a/doc/forum/webapp_and_manual_mode/comment_2_a1f06b50d1317c78a301b47eb05d2617._comment b/doc/forum/webapp_and_manual_mode/comment_2_a1f06b50d1317c78a301b47eb05d2617._comment new file mode 100644 index 000000000..99efad90a --- /dev/null +++ b/doc/forum/webapp_and_manual_mode/comment_2_a1f06b50d1317c78a301b47eb05d2617._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="ringprince" + ip="134.76.2.1" + subject="comment 2" + date="2013-07-23T08:47:58Z" + content=""" +Not sure, what you mean. + +Disabling sync? +But that also disables sync, right? ;-) So, if I add a file manually (via command line) that file is not synced automatically, correct? + +I do not see any other 'pause' button next to the repository. + +I am fine with git-annex doing the syncing automatically for me, but I want to be in control over the files git annex actually uses. + +If I just downloaded a big file, I might want to check it first before having git-annex move it to other repositories. + + +"""]] diff --git a/doc/forum/webapp_and_manual_mode/comment_3_f0739bf4304a91a5d4ec33ac2421c966._comment b/doc/forum/webapp_and_manual_mode/comment_3_f0739bf4304a91a5d4ec33ac2421c966._comment new file mode 100644 index 000000000..04369e7cd --- /dev/null +++ b/doc/forum/webapp_and_manual_mode/comment_3_f0739bf4304a91a5d4ec33ac2421c966._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="Also confused by the manual mode" + date="2014-05-18T06:39:54Z" + content=""" +@Joeyh: would you mind explaining the modes maybe on their own wiki page? +I've got most of them but the sense and functioning of the manual method escapes me :-/ +"""]] diff --git a/doc/forum/webapp_does_not_start.mdwn b/doc/forum/webapp_does_not_start.mdwn new file mode 100644 index 000000000..3003af7d0 --- /dev/null +++ b/doc/forum/webapp_does_not_start.mdwn @@ -0,0 +1,72 @@ +Sorry, I have again an issue :( + +What could be the problem that the webapp is not starting (in Windows)? git annex just exists without messages, connection to localhost failes of course + + me@laptop /cygdrive/c/Data + $ git annex --verbose --debug webapp + + me@laptop /cygdrive/c/Data + $ + +If I run it within an annexed directory I get at least one message - but it still immideately exits: + + me@laptop /cygdrive/c/Data/annex + $ git annex --verbose --debug webapp + [2014-07-11 19:06:58 Pacific Daylight Time] chat: git-annex ["--verbose","--debug","webapp"] + + me@laptop /cygdrive/c/Data/annex + $ + + git-annex version: 5.20140707-g8116d10 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier ddar hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + + +EDIT: +1.) Interestingly, also "git annex test" fails: + + [...] + ok + push origin To C:/Data/.t\repo + bcc4611..91f5218 git-annex -> synced/git-annex + 6f47922..92c578a annex/direct/master -> synced/master + + ok + add ../dir2/foo ok + (Recording state in git...) + FAIL + Exception: .t/tmprepo9/.git/annex/journal: getDirectoryContents: permission denied (Access is denied.) + + 2 out of 83 tests failed + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + + + +2.) There's really something very weird going on. At the beginning it worked. Then it stopped (as per above). Sometimes, when I start it using "Git Bash" it works. But then not any more. +3.) Rebooting the machine does not help + +EDIT once again: +4.) I am afraid there is something big broken. Suddenly I could start the daemon again. The thing I did was to delete my complete annex. +But if I shutdown the daemon now I get: + + $ git annex webapp + Launching web browser on file://C:\cygwin\tmp\webapp85796.html + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + + (Recording state in git...) + WebApp crashed: ExitFailu + +... and the whole loop starts again. webapp daemon does not start as long as I delete the annex. Interestingly this is independent from %USERPROFILE%\.config. Deleting this directory does not change anything. So somehow git-annex "knows" that there is somewhere an annex and fails if it is. + diff --git a/doc/forum/webapp_does_not_start/comment_1_dd27d30ce305562a1552f46c87b1cd27._comment b/doc/forum/webapp_does_not_start/comment_1_dd27d30ce305562a1552f46c87b1cd27._comment new file mode 100644 index 000000000..cd3a7d3bc --- /dev/null +++ b/doc/forum/webapp_does_not_start/comment_1_dd27d30ce305562a1552f46c87b1cd27._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-14T19:05:32Z" + content=""" +git-annex stores the locations of repositories in `.config/git-annex/autostart` in what passes for a home directory on Windows. + +Are you sure it doesn't manage to at least open a web browser tab, possibly one with an error in it? This would be easy to miss if you have a lot of tabs open. I seem to have partially reproduced this, at least that's the behavior I see. + +The root of the problem seems to be that it thinks the daemon is running, but it's not. So it just opens the web browser and then stops. After I deleted .git/annex/daemon*, and .git/annex/url and .git/annex/daemon.log, `git annex webapp` worked again. +"""]] diff --git a/doc/forum/webapp_does_not_start/comment_2_ef37f40288a1181ca619ae13b0f7a994._comment b/doc/forum/webapp_does_not_start/comment_2_ef37f40288a1181ca619ae13b0f7a994._comment new file mode 100644 index 000000000..551f51845 --- /dev/null +++ b/doc/forum/webapp_does_not_start/comment_2_ef37f40288a1181ca619ae13b0f7a994._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-14T20:06:03Z" + content=""" +I think that I have fixed this problem. The Windows autobuilder should produce a fixed build within an hour. +"""]] diff --git a/doc/forum/webapp_does_not_start/comment_3_6e625dba9f7fa36bf9c7e9d77fbadeff._comment b/doc/forum/webapp_does_not_start/comment_3_6e625dba9f7fa36bf9c7e9d77fbadeff._comment new file mode 100644 index 000000000..296e066a7 --- /dev/null +++ b/doc/forum/webapp_does_not_start/comment_3_6e625dba9f7fa36bf9c7e9d77fbadeff._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="divB" + ip="128.12.90.218" + subject="comment 3" + date="2014-07-15T05:43:35Z" + content=""" +Thank you, really really great. This part seems to work again. +For some reason, the assistant takes the wrong (?) git.exe (as I described here: http://git-annex.branchable.com/forum/Restricting_SSH_+_supply_key/) +"""]] diff --git a/doc/forum/webapp_listen_port_with_autostart.mdwn b/doc/forum/webapp_listen_port_with_autostart.mdwn new file mode 100644 index 000000000..fc9d1241b --- /dev/null +++ b/doc/forum/webapp_listen_port_with_autostart.mdwn @@ -0,0 +1,3 @@ +To start the webapp on a X-less server it's possible to use the parameter `--listen` and then connect from a client with X to it. + +How can I start the webapp on all annex repos on this server like on a client with `assistant --autostart`? Would be nice to start the assistant on all configured repos which listens on a defined port, f.e. `git annex assistant --autostart --listen 0.0.0.0:8888`. It would be even nicer to have a parameter to chose a autostart configuration file, f.e. `git annex assistant --autostart --autostart-config /etc/git-annex/autostart --listen 0.0.0.0:8888`, so this could end up in a real server application, a init script would be easy to write... diff --git a/doc/forum/webapp_listen_port_with_autostart/comment_1_65dbcf3d8f6c16568f5a326242eab9c5._comment b/doc/forum/webapp_listen_port_with_autostart/comment_1_65dbcf3d8f6c16568f5a326242eab9c5._comment new file mode 100644 index 000000000..0c430cf7c --- /dev/null +++ b/doc/forum/webapp_listen_port_with_autostart/comment_1_65dbcf3d8f6c16568f5a326242eab9c5._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T18:49:25Z" + content=""" +Well, it would be possible to add a configuration setting in the repository that tells the assistant what address:port to listen on. + +But maybe it would be better to not use `assistant --autostart` in your situation? That command is basically the same as this shell script: + +[[!format sh " +#!/bin/sh +for dir in $(cat $HOME/.config/git-annex/autostart); do + cd $dir + git annex webapp & +done +"]] + +So you can write similar shell scripts that start the webapp with whatever options you like. +"""]] diff --git a/doc/forum/webapp_listen_port_with_autostart/comment_2_39664f833dedc1a4fe083eec9bc4a7cd._comment b/doc/forum/webapp_listen_port_with_autostart/comment_2_39664f833dedc1a4fe083eec9bc4a7cd._comment new file mode 100644 index 000000000..0d48ba825 --- /dev/null +++ b/doc/forum/webapp_listen_port_with_autostart/comment_2_39664f833dedc1a4fe083eec9bc4a7cd._comment @@ -0,0 +1,75 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmiqeXJtP04fzHOjXs17kHO33v7dWR2xwA" + nickname="Jaco" + subject="Init Script" + date="2013-11-23T08:28:32Z" + content=""" +Hi Joey, + +Could you help out with writing an init.d script to safely start and stop the webapp on a headless server? +I made an attempt below based on examples from the internet, but have no idea if it will work. + + #!/bin/bash + # git-annex + # chkconfig: 345 20 80 + # description: Git Annex WebApp startup and shutdown script. + # processname: git-annex + + + DAEMON=git-annex webapp + + NAME=git-annex + DESC=\"Git Annex WebApp init script\" + PIDFILE=/var/run/$NAME.pid + SCRIPTNAME=/etc/init.d/$NAME + + case \"$1\" in + start) + printf \"%-50s\" \"Starting $NAME...\" + for dir in $(cat $HOME/.config/git-annex/autostart); do + cd $dir + PID=`$DAEMON > /dev/null 2>&1 & echo $!` + #echo \"Saving PID\" $PID \" to \" $PIDFILE + if [ -z $PID ]; then + printf \"%s\n\" \"Fail\" + else + echo $PID > $PIDFILE + printf \"%s\n\" \"Ok\" + fi + done + ;; + status) + printf \"%-50s\" \"Checking $NAME...\" + if [ -f $PIDFILE ]; then + for PID in $(cat $PIDFILE); do + if [ -z \"`ps axf | grep ${PID} | grep -v grep`\" ]; then + printf \"%s\n\" \"Process dead but pidfile exists\" + else + echo \"Running\" + fi + done + else + printf \"%s\n\" \"Service not running\" + fi + ;; + stop) + printf \"%-50s\" \"Stopping $NAME\" + if [ -f $PIDFILE ]; then + for PID in $(cat $PIDFILE); do + kill -HUP $PID + printf \"%s\n\" \"Ok\" + done + rm -f $PIDFILE + else + printf \"%s\n\" \"pidfile not found\" + fi + ;; + restart) + $0 stop + $0 start + ;; + *) + echo \"Usage: $0 {status|start|stop|restart}\" + exit 1 + esac +"""]] diff --git a/doc/forum/what_happens_to_deleted_files__63__.mdwn b/doc/forum/what_happens_to_deleted_files__63__.mdwn new file mode 100644 index 000000000..5890a06b3 --- /dev/null +++ b/doc/forum/what_happens_to_deleted_files__63__.mdwn @@ -0,0 +1,24 @@ +I have two repositories: A(direct) and B(indirect). At some point, I performed the following steps: + +1. Add a file in A. +2. Sync A. +3. Sync B, but not get all files. +4. In B, remove a file F that was newly added in A, using `git rm` and `git commit`. +5. Now get all files from A. + +This results in all "current" files being copied from A to B, but not file F. + +If I checkout a branch in B for an older commit which still had file F, I can see the symlink created in the branch. But now if I try to get the file in B from A, annex says that the remote is not available: + + sameerds@gajanan:/mnt/mandos/test$ git annex get + get IMG_0570.JPG + Unable to access these remotes: A + + Try making some of these repositories available: + 530e4f81-474d-4b0b-9f13-4beb7361302c -- A + failed + git-annex: get: 1 failed + +The remote for A exists in the listing for `git remote`, and `git annex sync` does not make this error message go away. If I checkout `master` again, then everything works fine. + +But of course, this a different problem from my original one. It would a way to bring all files from the remote, that are ever used by any commit reachable in the local git history, irrespective of the currently checkout out commit. Perhaps an option `--deep-copy` to the standard `git annex get`. diff --git a/doc/forum/what_happens_to_deleted_files__63__/comment_1_a476174646ad3adfbbe0cafdd7d42d08._comment b/doc/forum/what_happens_to_deleted_files__63__/comment_1_a476174646ad3adfbbe0cafdd7d42d08._comment new file mode 100644 index 000000000..5959db535 --- /dev/null +++ b/doc/forum/what_happens_to_deleted_files__63__/comment_1_a476174646ad3adfbbe0cafdd7d42d08._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://sameer.sbuddhe.net/blog/" + nickname="sameerds" + subject="never mind ..." + date="2013-12-31T04:06:43Z" + content=""" +... I discovered the [[`--all` option|http://git-annex.branchable.com/forum/Moving_older_version__39__s_file_content_without_doing_checkout/]] which does just what I was looking for! + + +"""]] diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes.mdwn b/doc/forum/whereis_command_with_file_names_instead_of_hashes.mdwn new file mode 100644 index 000000000..6b4b3bf01 --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes.mdwn @@ -0,0 +1,7 @@ +Hi + +I have a laptop, server and a regular PC. Laptop and PC are using same "backup" repo on server. Thay all get notified via ssh. My goal is to have synchronization and backup in one remote repo. When I wan to list all files on all repos i do: + + git-annex whereis -A (some files do fail. Don't know why) + +But that displays hashes. Not file names. How can to list file names on all repos instead of hashes ? diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_1_4eaca07152916adc18032fb404e4dd92._comment b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_1_4eaca07152916adc18032fb404e4dd92._comment new file mode 100644 index 000000000..3ad0becfe --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_1_4eaca07152916adc18032fb404e4dd92._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="-A --all operate on all versions of all files" + date="2014-07-07T07:42:03Z" + content=""" +Hi + +`-A` operates on all the files even on files which are not accessible from your current working directory. If you omit the `-A` then filenames will be printed. +"""]] diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_2_94b43ac23ff8332b35723422eede8997._comment b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_2_94b43ac23ff8332b35723422eede8997._comment new file mode 100644 index 000000000..2ab6b8e0b --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_2_94b43ac23ff8332b35723422eede8997._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 2" + date="2014-07-07T08:40:57Z" + content=""" +Yes they will be omitted. I just want to list files that are on my laptop (for example) and on remote repo. +"""]] diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_3_45ffa6dd17667ecd6685f85f34046eff._comment b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_3_45ffa6dd17667ecd6685f85f34046eff._comment new file mode 100644 index 000000000..b0d48ef99 --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_3_45ffa6dd17667ecd6685f85f34046eff._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="git annex whereis --in origin" + date="2014-07-07T09:45:48Z" + content=""" +So you only want to see whereis for files which are present on certain annexes? You can use `git annex whereis --in e64553d0-779a-4c79-939a-d5b7f3e56a57` or `git annex whereis --in origin` (modify the repo names). + +Have a look on [QUERY COMMANDS](/git-annex/). +"""]] diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_4_d459fbcf0db59b821ae67f4949e48103._comment b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_4_d459fbcf0db59b821ae67f4949e48103._comment new file mode 100644 index 000000000..24643f063 --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_4_d459fbcf0db59b821ae67f4949e48103._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 4" + date="2014-07-07T10:05:06Z" + content=""" +git-annex whereis --not --in here + +Does not display anything. + +git-annex whereis --not --in here -A + +Displays files on remote only. Every file has an additional message (0 copies) failed. This displays hash names. How to display file names ? I am 100% sure that my remote repo has some files that are not present on laptop or PC. +"""]] diff --git a/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_5_e52a8c9cb418fbc2e2cba71f37bd44ad._comment b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_5_e52a8c9cb418fbc2e2cba71f37bd44ad._comment new file mode 100644 index 000000000..eff34edb6 --- /dev/null +++ b/doc/forum/whereis_command_with_file_names_instead_of_hashes/comment_5_e52a8c9cb418fbc2e2cba71f37bd44ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 5" + date="2014-07-07T10:06:03Z" + content=""" +One more thing. I am using indirect mode with assistant. If that matters in some way. +"""]] diff --git a/doc/forum/windows_port__63__.mdwn b/doc/forum/windows_port__63__.mdwn new file mode 100644 index 000000000..092b8f8e1 --- /dev/null +++ b/doc/forum/windows_port__63__.mdwn @@ -0,0 +1,2 @@ +Any progress on Windows port? That would be very nice to have! +Depending on the scale of it, I might be able to help. diff --git a/doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment b/doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment new file mode 100644 index 000000000..95323ff99 --- /dev/null +++ b/doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-12T06:43:02Z" + content=""" +[[todo/windows_support]] has everything I know about making a windows port. This badly needs someone who understand Windows to dive into it. The question of how to create a symbolic link (or the relevant Windows equivilant) from haskell on Windows +is a good starting point.. +"""]] diff --git a/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn b/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn new file mode 100644 index 000000000..3be01480e --- /dev/null +++ b/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn @@ -0,0 +1 @@ +Know what'd be a sweet feature? A file explorer in the webapp that lets you get and drop files (for a Manual local repository). Especially when the webapp becomes available on Android. I'd love to be able to select what is and isn't present on a small device by some means other than moving files around. diff --git a/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer/comment_1_c818a6d44dc13a56460b1865f70eb97c._comment b/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer/comment_1_c818a6d44dc13a56460b1865f70eb97c._comment new file mode 100644 index 000000000..6cc0cf38b --- /dev/null +++ b/doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer/comment_1_c818a6d44dc13a56460b1865f70eb97c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T14:55:43Z" + content=""" +There's a page called [[design/assistant/partial_content]] that discusses this idea and related things. +"""]] diff --git a/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn new file mode 100644 index 000000000..8896fee37 --- /dev/null +++ b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn @@ -0,0 +1,4 @@ +I'm trying to distribute a large annex to a number of smaller archive drives. + +While copying to a directory special remote, the current behaviour is to continue trying copying files into a remote, even as diskspace there has been exhausted. +It would make sense for git-annex copy to actually stop instead. diff --git a/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_1_467e5e3db3e836030bc4b4f15846951f._comment b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_1_467e5e3db3e836030bc4b4f15846951f._comment new file mode 100644 index 000000000..5c5f17ca9 --- /dev/null +++ b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_1_467e5e3db3e836030bc4b4f15846951f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-18T19:49:43Z" + content=""" +Hmm, it might make sense to stop if there is no more space at all. However, just because the first file doesn't fit doesn't mean several following, smaller files can't be copied into the remaining space. + +Since it checks the free space before actually copying anything, it's not like there's much overhead in running through the list of files it was asked to copy and trying to copy them all, either. + +So, I'm unconvinced on this one. +"""]] diff --git a/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment new file mode 100644 index 000000000..ee535549f --- /dev/null +++ b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2013-07-18T20:22:05Z" + content=""" +Actually with 4.20130709, I see the drive (ntfs-3g under Linux, gpg-encrypted special remote) being filled to 0 remaining space, even with reservespace of 300mb. Guess it's another bug anyway. +"""]] diff --git a/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_3_0ef8c37350fc192d9b784fbab1d9f318._comment b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_3_0ef8c37350fc192d9b784fbab1d9f318._comment new file mode 100644 index 000000000..a33cbcd27 --- /dev/null +++ b/doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_3_0ef8c37350fc192d9b784fbab1d9f318._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 3" + date="2013-07-20T20:33:37Z" + content=""" +Indeed, that was a bug with encrypted directory special remotes. Fixed it. +"""]] diff --git a/doc/forum/working_without_git-annex_commits.mdwn b/doc/forum/working_without_git-annex_commits.mdwn new file mode 100644 index 000000000..00a61f3f0 --- /dev/null +++ b/doc/forum/working_without_git-annex_commits.mdwn @@ -0,0 +1,20 @@ +Is it possible to use git-annex without having [[location tracking]] commits in the style of "got a video I want to rewatch on the plane" or "freed up space" in the main tree? + +I consider these changes to be volatile, and irrelevant to the archive history. While they are unproblematic when it comes to merging, they make the commit tree rather complicated, especially with multiple users (as opposed to a single user managing his files on an external disk, a server and his laptop). Some users might even want to contribute to a shared repository without reporting on what they checked out. + +As a minimal solution, I configured a repository to ``.gitignore`` ``.git-annex/*:*.log``, but even when using modes that do not require that information (``git annex copy --from`` instead of ``git annex get``), that failes when git-annex tried to git-add ignored files. + +A more elaborate solution might be to keep location tracking information in a branch on its own (as suggested in [[todo/branching]]), keeping the main tree clean of such commits. A stealth user could then configure that branch to never be pushed. (Alternatively, if git-annex respects .gitignore and doesn't try to check in changes on ignored files, he could locally ``.gitignore`` ``.git-annex/*:*.log``.) + +> A stealth user can simply avoid pushing, and so keep their repository +> in a forked state, that can still pull changes from origin. +> +> Beyond that, [[todo/branching]] is the best solution. +> +> I don't think that gitignoring the log files is a good plan, because +> if the files are left modified and uncommitted, git will not be able to +> merge other changes it pulls. The automerging of log files only works +> if any local changes to them have been committed. +> +> It would be possible to add a knob that +> simply blocks all local modifications to the log files. --[[Joey]] diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn new file mode 100644 index 000000000..ee3185ddc --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn @@ -0,0 +1,27 @@ +I am running git-annex on Mac OS 10.9 and syncing to a Linux device that was attached to a Synology NAS. Both were running December versions of git-annex. + +While working on an application in IntelliJ my workspace.xml file disappeared. It went from being a real file to being a symlink to a location that didn't exist. + +The symlink looks like this: workspace.xml -> ../../../.git/annex/objects/M2/8W/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml + +I tried git-annex fsck and I get this message: ** No known copies exist of XXXXXXX/workspace.xml + +"XXXXXXX" is a path I needed to obscure I can see it in the git-annex repo but it is a reference to a symlink that doesn't exist + +It was mentioned in another thread ( http://git-annex.branchable.com/forum/git_annex_on_osx_only_creating_symlinks__63____63__/ ) that this could happen if I did a forced drop but I do not use git-annex on the command line. I'm using the assistant and having it manage all of my files for me. + +I tried looking at the log for it and it shows this: + +
+timmattison$ /Applications/git-annex.app/Contents/MacOS/git-annex log XXXXXXX/.idea/workspace.xml 
+- 2014-01-03 19:49:58 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex
++ 2014-01-03 17:08:32 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex
+(Recording state in git...)
+
+ +So I can see that the git-annex thinks the file was deleted but what really happened is that IntelliJ just modified it. workspace.xml files are modified very often when working in IntelliJ. + +Is this a known bug that has been fixed in the new version (2013-12-30 or later)? + +Thanks, +Tim diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_1_00b084f9786de6516f46065c0cb00e79._comment b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_1_00b084f9786de6516f46065c0cb00e79._comment new file mode 100644 index 000000000..32e4972ca --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_1_00b084f9786de6516f46065c0cb00e79._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-06T18:38:51Z" + content=""" +If the file was modified, git-annex should notice and add the new version. So the mere act of modifying the file does not explain how you ended up with a symlink to the old version of the file. Although it does explain why git-annex log would show that the old version of the file had been deleted. + +What does `git log` say when run on the workspace.xml file? + +"""]] diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_2_138499b36d28c5e267b4aad8792dc87e._comment b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_2_138499b36d28c5e267b4aad8792dc87e._comment new file mode 100644 index 000000000..1407a8ad3 --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_2_138499b36d28c5e267b4aad8792dc87e._comment @@ -0,0 +1,48 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="git log for workspace.xml" + date="2014-01-06T19:17:13Z" + content=""" +git log on the file gives a ton of output, is this what you need? + +commit 93157022d8ee57097db29fcc669e99e218b54657 +Author: Tim Mattison +Date: Fri Jan 3 17:08:03 2014 -0500 + +commit 04dab5520f33140a21882515b4036f71729a5f89 +Author: Tim Mattison +Date: Fri Jan 3 17:06:54 2014 -0500 + +commit b75be90bf91c9f9314e567d5a28e4497070de9af +Author: Tim Mattison +Date: Fri Jan 3 16:58:24 2014 -0500 + +commit 4045b2d7a71b9ab692c20eeab73bf196a280940d +Author: Tim Mattison +Date: Fri Jan 3 16:58:05 2014 -0500 + +commit 25de8a1fcd5cce53b8077443dccba1591255431f +Author: Tim Mattison +Date: Fri Jan 3 16:57:32 2014 -0500 + +commit dd118ae88cdccb5a7d68a7ae14033304865cfc4e +Author: Tim Mattison +Date: Fri Jan 3 16:53:37 2014 -0500 + +commit eaa5f85b7feed8ba17e3874763b4d7aa6e05b5c1 +Author: Tim Mattison +Date: Fri Jan 3 16:53:23 2014 -0500 + +commit 4d310d7d16234a1a6bcf0f14ebae232c57d904a7 +Author: Tim Mattison +Date: Fri Jan 3 16:52:42 2014 -0500 + +commit 2487ae7f99c7b81c1648fdc88d0b39a1cf6e4d03 +Author: Tim Mattison +Date: Fri Jan 3 16:52:21 2014 -0500 + +commit 9e0040311c43e6e1f04ff3b8fdd3ac5570c8f2d1 +Author: Tim Mattison +Date: Fri Jan 3 16:51:54 2014 -0500 +"""]] diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_3_6c59c494b563e56d061417eb2216bb19._comment b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_3_6c59c494b563e56d061417eb2216bb19._comment new file mode 100644 index 000000000..f31e7cf4d --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_3_6c59c494b563e56d061417eb2216bb19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Formatting!" + date="2014-01-06T19:22:36Z" + content=""" +I swear, some day I'll get the formatting correct. Sorry! +"""]] diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment new file mode 100644 index 000000000..3ca8a6295 --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Just happened again" + date="2014-01-16T16:23:00Z" + content=""" +This happened again and now I have this: + +lrwxr-xr-x 1 timmattison staff 197 Jan 16 11:18 distribute-client-applications.sh -> ../../../.git/annex/objects/JV/91/SHA256E-s921--51fc6a6e2924ff6e2673971b5786fe0f204a5984a700a2241cc77383f04f544e.sh/SHA256E-s921--51fc6a6e2924ff6e2673971b5786fe0f204a5984a700a2241cc77383f04f544e.sh + +This was on the machine that had the file, not a remote machine it was syncing to. I was editing the script, I ran it, the bash script segfaulted (expected), and then git-annex essentially deleted the file. Can you help me understand why this happens? It's obvious when it is a file I'm working on but I'm afraid it could be happening to other files and I don't know about it. +"""]] diff --git a/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_5_50526283b35997cece2f087507cdd4ee._comment b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_5_50526283b35997cece2f087507cdd4ee._comment new file mode 100644 index 000000000..ebf175cf2 --- /dev/null +++ b/doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_5_50526283b35997cece2f087507cdd4ee._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-06T18:22:31Z" + content=""" +Do you edit this file in multiple places? This could be an occurance of this bug: [[bugs/direct_mode_merge_can_overwrite_local,_non-annexed_files]] which is fixed in the latest release. + +If the program that writes the workspace.xml file did so by first deleting it, and then writing the new version, this could result in the assistant committing the deletion, which makes the new version a local, non-annexed file, and then if a pull is received that modified the file, I think the above bug could happen. + +You could tell if this was the case by looking at the git log of the directory containing the file, and see if it has been repeatedly deleted and added back to the repository. The git log snippet you pasted unfortunately does not let me tell this information. +"""]] diff --git a/doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__.mdwn b/doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__.mdwn new file mode 100644 index 000000000..2332f1bd5 --- /dev/null +++ b/doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__.mdwn @@ -0,0 +1,7 @@ +Hello people :) + +I'm learning to use git annex and I'm doing some tests to know how it works from an user point of view... My big goal would be to use git annex to track my entire /home directory in direct mode, so I would be able to sync my main computer with my laptop in a really effective way. But of course I feel some fear because things could go wrong and of course I have lots of important files I can't lose —nothing really important since I'll backup that /home in an external hard drive, but it would make me cry if I have to spend some hours restoring my /home :S + +So, do you think that tracking all the /home would be a reasonable goal? + +Thanks a lot for your time :) diff --git a/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 b/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 new file mode 100644 index 000000000..94d07524b --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 1" + date="2013-12-09T06:07:00Z" + content=""" +I do track my home dir using annex, but instead of one giant annex I have multiple annex repos. It is much faster than one giant annex and when used in combination with mr you can threat all repos as one. +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..e74d16945 --- /dev/null +++ b/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 @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0" + nickname="Milan" + subject="comment 2" + date="2013-12-09T11:16:48Z" + content=""" +what is 'mr'? +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..669046584 --- /dev/null +++ b/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 @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 3" + date="2013-12-09T14:56:13Z" + content=""" +It [1] allows you to run commands on a set of repositories. + +[1] http://myrepos.branchable.com/ +"""]] diff --git a/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 b/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 new file mode 100644 index 000000000..3e4c8aeb2 --- /dev/null +++ b/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 @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqimC5gbxsILaBlnuVXYtfSMDIhiyvHfw" + nickname="Valentín" + subject="comment 4" + date="2013-12-10T19:34:06Z" + content=""" +Hi Hamza :) + +I like your way of achieving the same goal —and existing ``mr``, which I hadn't known until now, it looks like the best alternative. + +Thanks a lot for your time :) +"""]] diff --git a/doc/future_proofing.mdwn b/doc/future_proofing.mdwn new file mode 100644 index 000000000..c9d1f068c --- /dev/null +++ b/doc/future_proofing.mdwn @@ -0,0 +1,38 @@ +Imagine putting a git-annex drive in a time capsule. In 20, or 50, or 100 +years, you'd like its contents to be as accessible as possible to whoever +digs it up. + +This is a hard problem. git-annex cannot completely solve it, but it does +its best to not contribute to the problem. Here are some aspects of the +problem: + +* How are files accessed? Git-annex carefully adds minimal complexity + to access files in a repository. Nothing needs to be done to extract + files from the repository; they are there on disk in the usual way, + with just some symlinks pointing at the annexed file contents. + Neither git-annex nor git is needed to get at the file contents. + + (Also, git-annex provides an "uninit" command that moves everything out + of the annex, if you should ever want to stop using it.) + +* What file formats are used? Will they still be readable? To deal with + this, it's best to stick to plain text files, and the most common + image, sound, etc formats. Consider storing the same content in multiple + formats. + +* What filesystem is used on the drive? Will that filesystem still be + available? Whatever you choose to use, git-annex can put files on it. + Even if you choose (ugh) FAT. + +* What is the hardware interface of the drive? Will hardware still exist + to talk to it? + +* What if some of the data is damaged? git-annex facilitates storing a + configurable number of [[copies]] of the file contents. The metadata + about your files is stored in git, and so every clone of the repository + means another copy of that is stored. Also, git-annex uses filenames + for the data that encode everything needed to match it back to the + metadata. So if a filesystem is badly corrupted and all your annexed + files end up in `lost+found`, they can easily be lifted back out into + another clone of the repository. Even if the filenames are lost, + it's possible to [[tips/recover_data_from_lost+found]]. diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn new file mode 100644 index 000000000..26ccb9a40 --- /dev/null +++ b/doc/git-annex-shell.mdwn @@ -0,0 +1,133 @@ +# NAME + +git-annex-shell - Restricted login shell for git-annex only SSH access + +# SYNOPSIS + +git-annex-shell [-c] command [params ...] + +# DESCRIPTION + +git-annex-shell is a restricted shell, similar to git-shell, which +can be used as a login shell for SSH accounts. + +Since its syntax is identical to git-shell's, it can be used as a drop-in +replacement anywhere git-shell is used. For example it can be used as a +user's restricted login shell. + +# COMMANDS + +Any command not listed below is passed through to git-shell. + +Note that the directory parameter should be an absolute path, otherwise +it is assumed to be relative to the user's home directory. Also the +first "/~/" or "/~user/" is expanded to the specified home directory. + +* configlist directory + + This outputs a subset of the git configuration, in the same form as + `git config --list`. This is used to get the annex.uuid of the remote + repository. + + When run in a repository that does not yet have an annex.uuid, one + will be created, as long as a git-annex branch has already been pushed to + the repository. + +* inannex directory [key ...] + + This checks if all specified keys are present in the annex, + and exits zero if so. + +* dropkey directory [key ...] + + This drops the annexed data for the specified keys. + +* recvkey directory key + + This runs rsync in server mode to receive the content of a key, + and stores the content in the annex. + +* sendkey directory key + + This runs rsync in server mode to transfer out the content of a key. + +* transferinfo directory key + + This is typically run at the same time as sendkey is sending a key + to the remote. Using it is optional, but is used to update + progress information for the transfer of the key. + + It reads lines from standard input, each giving the number of bytes + that have been received so far. + +* commit directory + + This commits any staged changes to the git-annex branch. + It also runs the annex-content hook. + +* notifychanges + + This is used by `git-annex remotedaemon` to be notified when + refs in the remote repository are changed. + +* gcryptsetup gcryptid + + Sets up a repository as a gcrypt repository. + +# OPTIONS + +Most options are the same as in git-annex. The ones specific +to git-annex-shell are: + +* --uuid=UUID + + git-annex uses this to specify the UUID of the repository it was expecting + git-annex-shell to access, as a sanity check. + +* -- fields=val fields=val.. -- + + Additional fields may be specified this way, to retain compatability with + past versions of git-annex-shell (that ignore these, but would choke + on new dashed options). + + Currently used fields include remoteuuid=, associatedfile=, + and direct= + +# HOOK + +After content is received or dropped from the repository by git-annex-shell, +it runs a hook, `.git/hooks/annex-content` (or `hooks/annex-content` on a bare +repository). The hook is not currently passed any information about what +changed. + +# ENVIRONMENT + +* GIT_ANNEX_SHELL_READONLY + + If set, disallows any command that could modify the repository. + + Note that this does not prevent passing commands on to git-shell. + For that, you also need ... + +* GIT_ANNEX_SHELL_LIMITED + + If set, disallows running git-shell to handle unknown commands. + +* GIT_ANNEX_SHELL_DIRECTORY + + If set, git-annex-shell will refuse to run commands that do not operate + on the specified directory. + +# SEE ALSO + +[[git-annex]](1) + +git-shell(1) + +# AUTHOR + +Joey Hess + + + +Warning: Automatically converted into a man page by mdwn2man. Edit with care diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn new file mode 100644 index 000000000..8ba3558d3 --- /dev/null +++ b/doc/git-annex.mdwn @@ -0,0 +1,1793 @@ +# NAME + +git-annex - manage files with git, without checking their contents in + +# SYNOPSIS + +git annex command [params ...] + +# DESCRIPTION + +git-annex allows managing files with git, without checking the file +contents into git. While that may seem paradoxical, it is useful when +dealing with files larger than git can currently easily handle, whether due +to limitations in memory, checksumming time, or disk space. + +Even without file content tracking, being able to manage files with git, +move files around and delete files with versioned directory trees, and use +branches and distributed clones, are all very handy reasons to use git. And +annexed files can co-exist in the same git repository with regularly +versioned files, which is convenient for maintaining documents, Makefiles, +etc that are associated with annexed files but that benefit from full +revision control. + +When a file is annexed, its content is moved into a key-value store, and +a symlink is made that points to the content. These symlinks are checked into +git and versioned like regular files. You can move them around, delete +them, and so on. Pushing to another git repository will make git-annex +there aware of the annexed file, and it can be used to retrieve its +content from the key-value store. + +# EXAMPLES + + # git annex get video/hackity_hack_and_kaxxt.mov + get video/_why_hackity_hack_and_kaxxt.mov (not available) + I was unable to access these remotes: server + Try making some of these repositories available: + 5863d8c0-d9a9-11df-adb2-af51e6559a49 -- my home file server + 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive + ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive + failed + # sudo mount /media/usb + # git remote add usbdrive /media/usb + # git annex get video/hackity_hack_and_kaxxt.mov + get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok + + # git annex add iso + add iso/Debian_5.0.iso ok + + # git annex drop iso/Debian_4.0.iso + drop iso/Debian_4.0.iso ok + + # git annex move iso --to=usbdrive + move iso/Debian_5.0.iso (moving to usbdrive...) ok + +# COMMONLY USED COMMANDS + +Like many git commands, git-annex can be passed a path that +is either a file or a directory. In the latter case it acts on all relevant +files in the directory. When no path is specified, most git-annex commands +default to acting on all relevant files in the current directory (and +subdirectories). + +* `add [path ...]` + + Adds files in the path to the annex. If no path is specified, adds + files from the current directory and below. + + Files that are already checked into git, or that git has been configured + to ignore will be silently skipped. (Use `--force` to add ignored files.) + + Dotfiles are skipped unless explicitly listed, or the --include-dotfiles + option is used. + +* `get [path ...]` + + Makes the content of annexed files available in this repository. This + will involve copying them from another repository, or downloading them, + or transferring them from some kind of key-value store. + + Normally git-annex will choose which repository to copy the content from, + but you can override this using the `--from` option. + +* `drop [path ...]` + + Drops the content of annexed files from this repository. + + git-annex will refuse to drop content if it cannot verify it is + safe to do so. This can be overridden with the `--force` switch. + + To drop content from a remote, specify `--from`. + +* `move [path ...]` + + When used with the `--from` option, moves the content of annexed files + from the specified repository to the current one. + + When used with the `--to` option, moves the content of annexed files from + the current repository to the specified one. + +* `copy [path ...]` + + When used with the `--from` option, copies the content of annexed files + from the specified repository to the current one. + + When used with the `--to` option, copies the content of annexed files from + the current repository to the specified one. + + To avoid contacting the remote to check if it has every file + when copying --to the repository, specify `--fast` + + To force checking the remote for every file when copying --from the + repository, specify `--force`. + +* `status [path ...]` + + Similar to `git status --short`, displays the status of the files in the + working tree. Shows files that are not checked into git, files that + have been deleted, and files that have been modified. + Particularly useful in direct mode. + +* `unlock [path ...]` + + Normally, the content of annexed files is protected from being changed. + Unlocking an annexed file allows it to be modified. This replaces the + symlink for each specified file with a copy of the file's content. + You can then modify it and `git annex add` (or `git commit`) to inject + it back into the annex. + +* `edit [path ...]` + + This is an alias for the unlock command. May be easier to remember, + if you think of this as allowing you to edit an annexed file. + +* `lock [path ...]` + + Use this to undo an unlock command if you don't want to modify + the files, or have made modifications you want to discard. + +* `sync [remote ...]` + + Use this command when you want to synchronize the local repository with + one or more of its remotes. You can specify the remotes to sync with by + name; the default is to sync with all remotes. + Or specify `--fast` to sync with the remotes with the + lowest annex-cost value. + + The sync process involves first committing all local changes, + then fetching and merging the `synced/master` and the `git-annex` branch + from the remote repositories, and finally pushing the changes back to + those branches on the remote repositories. You can use standard git + commands to do each of those steps by hand, or if you don't want to + worry about the details, you can use sync. + + Merge conflicts are automatically handled by sync. When two conflicting + versions of a file have been committed, both will be added to the tree, + under different filenames. For example, file "foo" would be replaced + with "foo.somekey" and "foo.otherkey". + + Note that syncing with a remote will not update the remote's working + tree with changes made to the local repository. However, those changes + are pushed to the remote, so they can be merged into its working tree + by running "git annex sync" on the remote. + + With the `--content` option, the contents of annexed files in the work + tree will also be uploaded and downloaded from remotes. By default, + this tries to get each annexed file that the local repository does not + yet have, and then copies each file to every remote that it is syncing with. + This behavior can be overridden by configuring the preferred content of + a repository. See see PREFERRED CONTENT below. + +* `merge` + + This performs the same merging (and merge conflict resolution) + that is done by the sync command, but without pushing or pulling any data. + + One way to use this is to put `git annex merge` into a repository's + post-receive hook. Then any syncs to the repository will update its working + copy automatically. + +* `mirror [path ...]` + + This causes a destination repository to mirror a source repository. + + To use the local repository as the source repository, + specify mirror `--to` remote. + + To use a remote as the source repository, specify mirror `--from` remote. + + Each specified file in the source repository is mirrored to the destination + repository. If a file's content is present in the source repository, it is + copied to the destination repository. If a file's content is not present in + the source repository, it will be dropped from the destination repository + when the numcopies setting allows. + + Note that mirror does not sync the git repository, but only the file + contents. + + Also, --all may be specified to mirror all objects stored in the git + annex, not only objects used by currently existing files. However, this + bypasses checking the .gitattributes annex.numcopies setting when + dropping files. + +* `addurl [url ...]` + + Downloads each url to its own file, which is added to the annex. + + To avoid immediately downloading the url, specify `--fast`. + + To avoid storing the size of the url's content, and accept whatever + is there at a future point, specify `--relaxed`. (Implies `--fast`.) + + Normally the filename is based on the full url, so will look like + "www.example.com_dir_subdir_bigfile". For a shorter filename, specify + `--pathdepth=N`. For example, `--pathdepth=1` will use "dir/subdir/bigfile", + while `--pathdepth=3` will use "bigfile". It can also be negative; + `--pathdepth=-2` will use the last two parts of the url. + + Or, to directly specify what file the url is added to, specify `--file`. + This changes the behavior; now all the specified urls are recorded as + alternate locations from which the file can be downloaded. In this mode, + addurl can be used both to add new files, or to add urls to existing files. + + When quvi is installed, urls are automatically tested to see if they + point to a video hosting site, and the video is downloaded instead. + +* `rmurl file url` + + Record that the file is no longer available at the url. + +* `import [path ...]` + + Moves files from somewhere outside the git working copy, and adds them to + the annex. Individual files to import can be specified. + If a directory is specified, the entire directory is imported. + + git annex import /media/camera/DCIM/* + + By default, importing two files with the same contents from two different + locations will result in both files being added to the repository. + (With all checksumming backends, including the default SHA256E, + only one copy of the data will be stored.) + + To not delete files from the import location, use the + `--duplicate` option. This could allow importing the same files repeatedly + to different locations in a repository. More likely, it could be used to + import the same files to a number of different branches or separate git + repositories. + + To only import files whose content has not been seen before by git-annex, + use the `--deduplicate` option. Duplicate files will be deleted from the + import location. + + To only import files whose content has not been seen before by git-annex, + but avoid deleting duplicate files, use the `--skip-duplicates` option. + + The `--clean-duplicates` option does not import any new files, but any files + found in the import location that are duplicates of content in the annex + are deleted. + + (Note that using `--deduplicate` or `--clean-duplicates` with the WORM + backend does not look at file content, but filename and mtime.) + +* `importfeed [url ...]` + + Imports the contents of podcast feeds. Only downloads files whose + urls have not already been added to the repository before, so you can + delete, rename, etc the resulting files and repeated runs won't duplicate + them. (Use `--force` to force downloading urls it's seen before.) + + Use `--template` to control where the files are stored. + The default template is '${feedtitle}/${itemtitle}${extension}' + (Other available variables: feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid, itempubdate, title, author) + + The `--relaxed` and `--fast` options behave the same as they do in addurl. + + When quvi is installed, links in the feed are tested to see if they + are on a video hosting site, and the video is downloaded. This allows + importing eg, youtube playlists. + +* `watch` + + Watches for changes to files in the current directory and its subdirectories, + and takes care of automatically adding new files, as well as dealing with + deleted, copied, and moved files. With this running as a daemon in the + background, you no longer need to manually run git commands when + manipulating your files. + + By default, all files in the directory will be added to the repository. + (Including dotfiles.) To block some files from being added, use + `.gitignore` files. + + By default, all files that are added are added to the annex, the same + as when you run `git annex add`. If you configure annex.largefiles, + files that it does not match will instead be added with `git add`. + + To not daemonize, run with `--foreground` ; to stop a running daemon, + run with `--stop`. + +* `assistant` + + Like watch, but also automatically syncs changes to other remotes. + Typically started at boot, or when you log in. + + With the `--autostart` option, the assistant is started in any repositories + it has created. These are listed in `~/.config/git-annex/autostart`. + +* `webapp` + + Opens a web app, that allows easy setup of a git-annex repository, + and control of the git-annex assistant. If the assistant is not + already running, it will be started. + + By default, the webapp can only be accessed from localhost, and running + it opens a browser window. + + To use the webapp on a remote computer, use the `--listen=address` + option to specify the address the web server should listen on + (or set annex.listen). + This disables running a local web browser, and outputs the url you + can use to open the webapp. + + When using the webapp on a remote computer, you'll almost certianly + want to enable HTTPS. The webapp will use HTTPS if it finds + a .git/annex/privkey.pem and .git/annex/certificate.pem. Here's + one way to generate those files, using a self-signed certificate: + + openssl genrsa -out .git/annex/privkey.pem 4096 + openssl req -new -x509 -key .git/annex/privkey.pem > .git/annex/certificate.pem + +# REPOSITORY SETUP COMMANDS + +* `init [description]` + + Until a repository (or one of its remotes) has been initialized, + git-annex will refuse to operate on it, to avoid accidentally + using it in a repository that was not intended to have an annex. + + It's useful, but not mandatory, to initialize each new clone + of a repository with its own description. If you don't provide one, + one will be generated using the username, hostname and the path. + +* `describe repository description` + + Changes the description of a repository. + + The repository to describe can be specified by git remote name or + by uuid. To change the description of the current repository, use + "here". + +* `initremote name [param=value ...]` + + Creates a new special remote, and adds it to `.git/config`. + + The remote's configuration is specified by the parameters. Different + types of special remotes need different configuration values. The + command will prompt for parameters as needed. + + All special remotes support encryption. You can either specify + `encryption=none` to disable encryption, or specify + `encryption=hybrid keyid=$keyid ...` to specify a GPG key id (or an email + address associated with a key). + + There are actually three schemes that can be used for management of the + encryption keys. When using the encryption=hybrid scheme, additional + GPG keys can be given access to the encrypted special remote easily + (without re-encrypting everything). When using encryption=shared, + a shared key is generated and stored in the git repository, allowing + anyone who can clone the git repository to access it. Finally, when using + encryption=pubkey, content in the special remote is directly encrypted + to the specified GPG keys, and additional ones cannot easily be given + access. + + Note that with encryption enabled, a cryptographic key is created. + This requires sufficient entropy. If initremote seems to hang or take + a long time while generating the key, you may want to Ctrl-c it and + re-run with `--fast`, which causes it to use a lower-quality source of + randomness. + + Example Amazon S3 remote: + + git annex initremote mys3 type=S3 encryption=hybrid keyid=me@example.com datacenter=EU + +* `enableremote name [param=value ...]` + + Enables use of an existing special remote in the current repository, + which may be a different repository than the one in which it was + originally created with the initremote command. + + The name of the remote is the same name used when originally + creating that remote with "initremote". Run "git annex enableremote" + with no parameters to get a list of special remote names. + + Some special remotes may need parameters to be specified every time. + For example, the directory special remote requires a directory= parameter. + + This command can also be used to modify the configuration of an existing + special remote, by specifying new values for parameters that were + originally set when using initremote. (However, some settings such as + the as the encryption scheme cannot be changed once a special remote + has been created.) + + The GPG keys that an encrypted special remote is encrypted with can be + changed using the keyid+= and keyid-= parameters. These respectively + add and remove keys from the list. However, note that removing a key + does NOT necessarily prevent the key's owner from accessing data + in the encrypted special remote + (which is by design impossible, short of deleting the remote). + + One use-case of keyid-= is to replace a revoked key with + a new key: + + git annex enableremote mys3 keyid-=revokedkey keyid+=newkey + + Also, note that for encrypted special remotes using plain public-key + encryption (encryption=pubkey), adding or removing a key has NO effect + on files that have already been copied to the remote. Hence using + keyid+= and keyid-= with such remotes should be used with care, and + make little sense except in cases like the revoked key example above. + +* `numcopies [N]` + + Tells git-annex how many copies it should preserve of files, over all + repositories. The default is 1. + + Run without a number to get the current value. + + When git-annex is asked to drop a file, it first verifies that the + required number of copies can be satisfied amoung all the other + repositories that have a copy of the file. + + This can be overridden on a per-file basis by the annex.numcopies setting + in .gitattributes files. + +* `trust [repository ...]` + + Records that a repository is trusted to not unexpectedly lose + content. Use with care. + + To trust the current repository, use "here". + +* `untrust [repository ...]` + + Records that a repository is not trusted and could lose content + at any time. + +* `semitrust [repository ...]` + + Returns a repository to the default semi trusted state. + +* `dead [repository ...]` + + Indicates that the repository has been irretrievably lost. + (To undo, use semitrust.) + +* `group repository groupname` + + Adds a repository to a group, such as "archival", "enduser", or "transfer". + The groupname must be a single word. + + Omit the groupname to show the current groups that a repository is in. + +* `ungroup repository groupname` + + Removes a repository from a group. + +* `wanted repository [expression]` + + When run with an expression, configures the content that is preferred + to be held in the archive. See PREFERRED CONTENT below. + + For example: + + git annex wanted . "include=*.mp3 or include=*.ogg" + + Without an expression, displays the current preferred content setting + of the repository. + +* `schedule repository [expression]` + + When run with an expression, configures scheduled jobs to run at a + particular time. This can be used to make the assistant periodically run + incremental fscks. See SCHEDULED JOBS below. + +* `vicfg` + + Opens EDITOR on a temp file containing most of the above configuration + settings, as well as a few others, and when it exits, stores any changes + made back to the git-annex branch. + +* `direct` + + Switches a repository to use direct mode, where rather than symlinks to + files, the files are directly present in the repository. + + As part of the switch to direct mode, any changed files will be committed. + + Note that git commands that operate on the work tree are often unsafe to + use in direct mode repositories, and can result in data loss or other + bad behavior. + +* `indirect` + + Switches a repository back from direct mode to the default, indirect mode. + + As part of the switch from direct mode, any changed files will be committed. + +# REPOSITORY MAINTENANCE COMMANDS + +* `fsck [path ...]` + + With no parameters, this command checks the whole annex for consistency, + and warns about or fixes any problems found. This is a good compliment to + `git fsck`. + + With parameters, only the specified files are checked. + + To check a remote to fsck, specify `--from`. + + To avoid expensive checksum calculations (and expensive transfers when + fscking a remote), specify `--fast`. + + To start a new incremental fsck, use the `--incremental` option. Then + the next time you fsck, you can instead use the `--more` option + to skip over files that have already been checked, and continue + where it left off. + + The `--incremental-schedule` option makes a new incremental fsck be + started a configurable time after the last incremental fsck was started. + Once the current incremental fsck has completely finished, it causes + a new one to start. + + Maybe you'd like to run a fsck for 5 hours at night, picking up each + night where it left off. You'd like this to continue until all files + have been fscked. And once it's done, you'd like a new fsck pass to start, + but no more often than once a month. Then put this in a nightly cron job: + + git annex fsck --incremental-schedule 30d --time-limit 5h + + To verify data integrity only while disregarding required number of copies, + use `--numcopies=1`. + +* `unused` + + Checks the annex for data that does not correspond to any files present + in any tag or branch, and prints a numbered list of the data. + + To only show unused temp and bad files, specify `--fast`. + + To check for annexed data on a remote, specify `--from`. + + After running this command, you can use the `--unused` option to + operate on all the unused data that was found. For example, to + move all unused data to origin: + + git annex unused; git annex move --unused --to origin + +* `dropunused [number|range ...]` + + Drops the data corresponding to the numbers, as listed by the last + `git annex unused` + + You can also specify ranges of numbers, such as "1-1000". + Or, specify "all" to drop all unused data. + + To drop the data from a remote, specify `--from.` + +* `addunused [number|range ...]` + + Adds back files for the content corresponding to the numbers or ranges, + as listed by the last `git annex unused`. The files will have names + starting with "unused." + +* `fix [path ...]` + + Fixes up symlinks that have become broken to again point to annexed content. + This is useful to run if you have been moving the symlinks around, + but is done automatically when committing a change with git too. + +* `upgrade` + + Upgrades the repository to current layout. + +* `forget` + + Causes the git-annex branch to be rewritten, throwing away historical + data about past locations of files. The resulting branch will use less + space, but `git annex log` will not be able to show where + files used to be located. + + To also prune references to repositories that have been marked as dead, + specify `--drop-dead`. + + When this rewritten branch is merged into other clones of + the repository, `git-annex` will automatically perform the same rewriting + to their local `git-annex` branches. So the forgetfulness will automatically + propagate out from its starting point until all repositories running + git-annex have forgotten their old history. (You may need to force + git to push the branch to any git repositories not running git-annex.) + +* `repair` + + This can repair many of the problems with git repositories that `git fsck` + detects, but does not itself fix. It's useful if a repository has become + badly damaged. One way this can happen is if a repository used by git-annex + is on a removable drive that gets unplugged at the wrong time. + + This command can actually be used inside git repositories that do not + use git-annex at all; when used in a repository using git-annex, it + does additional repairs of the git-annex branch. + + It works by deleting any corrupt objects from the git repository, and + retrieving all missing objects it can from the remotes of the repository. + + If that is not sufficient to fully recover the repository, it can also + reset branches back to commits before the corruption happened, delete + branches that are no longer available due to the lost data, and remove any + missing files from the index. It will only do this if run with the + `--force` option, since that rewrites history and throws out missing data. + Note that the `--force` option never touches tags, even if they are no + longer usable due to missing data. + + After running this command, you will probably want to run `git fsck` to + verify it fixed the repository. Note that fsck may still complain about + objects referenced by the reflog, or the stash, if they were unable to be + recovered. This command does not try to clean up either the reflog or the + stash. + + It is also a good idea to run `git annex fsck --fast` after this command, + to make sure that the git-annex branch reflects reality. + +# QUERY COMMANDS + +* `find [path ...]` + + Outputs a list of annexed files in the specified path. With no path, + finds files in the current directory and its subdirectories. + + By default, only lists annexed files whose content is currently present. + This can be changed by specifying matching options. To list all + annexed files, present or not, specify `--include "*"`. To list all + annexed files whose content is not present, specify `--not --in=here` + + To output filenames terminated with nulls, for use with xargs -0, + specify `--print0`. Or, a custom output formatting can be specified using + `--format`. The default output format is the same as `--format='${file}\\n'` + + These variables are available for use in formats: file, key, backend, + bytesize, humansize, keyname, hashdirlower, hashdirmixed, mtime (for + the mtime field of a WORM key). + +* `whereis [path ...]` + + Displays a information about where the contents of files are located. + +* `list [path ...]` + + Displays a table of remotes that contain the contents of the specified + files. This is similar to whereis but a more compact display. Only + configured remotes are shown by default; specify --allrepos to list + all repositories. + +* `log [path ...]` + + Displays the location log for the specified file or files, + showing each repository they were added to ("+") and removed from ("-"). + + To limit how far back to search for location log changes, the options + `--since`, `--after`, `--until`, `--before`, and `--max-count` can be specified. + They are passed through to git log. For example, `--since "1 month ago"` + + To generate output suitable for the gource visualization program, + specify `--gource`. + +* `info [directory ...]` + + Displays some statistics and other information, including how much data + is in the annex and a list of all known repositories. + + To only show the data that can be gathered quickly, use `--fast`. + + When a directory is specified, shows a differently formatted info + display for that directory. In this mode, all of the matching + options can be used to filter the files that will be included in + the information. + + For example, suppose you want to run "git annex get .", but + would first like to see how much disk space that will use. + Then run: + + git annex info --fast . --not --in here + +* `version` + + Shows the version of git-annex, as well as repository version information. + +* `map` + + Helps you keep track of your repositories, and the connections between them, + by going out and looking at all the ones it can get to, and generating a + Graphviz file displaying it all. If the `dot` command is available, it is + used to display the file to your screen (using x11 backend). (To disable + this display, specify `--fast`) + + This command only connects to hosts that the host it's run on can + directly connect to. It does not try to tunnel through intermediate hosts. + So it might not show all connections between the repositories in the network. + + Also, if connecting to a host requires a password, you might have to enter + it several times as the map is being built. + + Note that this subcommand can be used to graph any git repository; it + is not limited to git-annex repositories. + +# METADATA COMMANDS + +* `metadata [path ...] [-s field=value -s field+=value -s field-=value ...] [-g field]` + + The content of a file can have any number of metadata fields + attached to it to describe it. Each metadata field can in turn + have any number of values. + + This command can be used to set metadata, or show the currently set + metadata. + + To show current metadata, run without any -s parameters. The --json + option will enable json output. + + To only get the value(s) of a single field, use -g field. + The values will be output one per line, with no other output, so + this is suitable for use in a script. + + To set a field's value, removing any old value(s), use -s field=value. + + To add an additional value, use -s field+=value. + + To remove a value, use -s field-=value. + + To set a value, only if the field does not already have a value, + use -s field?=value + + To set a tag, use -t tag, and use -u tag to remove a tag. + + For example, to set some tags on a file and also its author: + + git annex metadata annexscreencast.ogv -t video -t screencast -s author+=Alice + +* `view [tag ...] [field=value ...] [field=glob ...] [!tag ...] [field!=value ...]` + + Uses metadata to build a view branch of the files in the current branch, + and checks out the view branch. Only files in the current branch whose + metadata matches all the specified field values and tags will be + shown in the view. + + Multiple values for a metadata field can be specified, either by using + a glob (`field="*"`) or by listing each wanted value. The resulting view + will put files in subdirectories according to the value of their fields. + + Once within such a view, you can make additional directories, and + copy or move files into them. When you commit, the metadata will + be updated to correspond to your changes. + + There are fields corresponding to the path to the file. So a file + "foo/bar/baz/file" has fields "/=foo", "foo/=bar", and "foo/bar/=baz". + These location fields can be used the same as other metadata to construct + the view. + + For example, `/=podcasts` will only include files from the podcasts + directory in the view, while `podcasts/=*` will preserve the + subdirectories of the podcasts directory in the view. + +* `vpop [N]` + + Switches from the currently active view back to the previous view. + Or, from the first view back to original branch. + + The optional number tells how many views to pop. + +* `vfilter [tag ...] [field=value ...] [!tag ...] [field!=value ...]` + + Filters the current view to only the files that have the + specified field values and tags. + +* `vadd [field=glob ...] [field=value ...] [tag ...]` + + Changes the current view, adding an additional level of directories + to categorize the files. + + For example, when the view is by author/tag, `vadd year=*` will + change it to year/author/tag. + + So will `vadd year=2014 year=2013`, but limiting the years in view + to only those two. + +* `vcycle` + + When a view involves nested subdirectories, this cycles the order. + + For example, when the view is by year/author/tag, `vcycle` will switch + it to author/tag/year. + +# UTILITY COMMANDS + +* `migrate [path ...]` + + Changes the specified annexed files to use the default key-value backend + (or the one specified with `--backend`). Only files whose content + is currently available are migrated. + + Note that the content is also still available using the old key after + migration. Use `git annex unused` to find and remove the old key. + + Normally, nothing will be done to files already using the new backend. + However, if a backend changes the information it uses to construct a key, + this can also be used to migrate files to use the new key format. + +* `reinject src dest` + + Moves the src file into the annex as the content of the dest file. + This can be useful if you have obtained the content of a file from + elsewhere and want to put it in the local annex. + + Automatically runs fsck on dest to check that the expected content was + provided. + + Example: + + git annex reinject /tmp/foo.iso foo.iso + +* `unannex [path ...]` + + Use this to undo an accidental `git annex add` command. It puts the + file back how it was before the add. + + Note that for safety, the content of the file remains in the annex, + until you use `git annex unused` and `git annex dropunused`. + + This is not the command you should use if you intentionally annexed a + file and don't want its contents any more. In that case you should use + `git annex drop` instead, and you can also `git rm` the file. + + Normally this does a slow copy of the file. In `--fast` mode, it + instead makes a hard link from the file to the content in the annex. + But use --fast mode with caution, because editing the file will + change the content in the annex. + +* `uninit` + + Use this to stop using git annex. It will unannex every file in the + repository, and remove all of git-annex's other data, leaving you with a + git repository plus the previously annexed files. + +* `reinit uuid|description` + + Normally, initializing a repository generates a new, unique identifier + (UUID) for that repository. Occasionally it may be useful to reuse a + UUID -- for example, if a repository got deleted, and you're + setting it back up. + + Use this with caution; it can be confusing to have two existing + repositories with the same UUID. Also, you will probably want to run + a fsck. + +# PLUMBING COMMANDS + +* `pre-commit [path ...]` + + This is meant to be called from git's pre-commit hook. `git annex init` + automatically creates a pre-commit hook using this. + + Fixes up symlinks that are staged as part of a commit, to ensure they + point to annexed content. Also handles injecting changes to unlocked + files into the annex. When in a view, updates metadata to reflect changes + made to files in the view. + +* `lookupkey [file ...]` + + This plumbing-level command looks up the key used for a file in the + index. The key is output to stdout. If there is no key (because + the file is not present in the index, or is not a git-annex managed file), + nothing is output, and it exits nonzero. + +* `examinekey [key ...]` + + This plumbing-level command is given a key, and prints information + that can be determined purely by looking at the key. + + To specify what information to print, use `--format`. Or use `--json` + to get all available information in JSON format. + + The same variables can be used in the format string as can be used in + the format string of git annex find (except there is no file option + here). + + For example, the location a key's value is stored (in indirect mode) + can be looked up by running: + + git annex examinekey --format='.git/annex/objects/${hashdirmixed}${key}/${key}' + +* `fromkey key file` + + This plumbing-level command can be used to manually set up a file + in the git repository to link to a specified key. + +* `dropkey [key ...]` + + This plumbing-level command drops the annexed data for the specified + keys from this repository. + + This can be used to drop content for arbitrary keys, which do not need + to have a file in the git repository pointing at them. + +* `transferkey` + + This plumbing-level command is used to request a single key be + transferred. Either the --from or the --to option can be used to specify + the remote to use. A --file option can be used to hint at the file + associated with the key. + +* `transferkeys` + + This plumbing-level command is used by the assistant to transfer data. + It is fed instructions about the keys to transfer using an internal + stdio protocol, which is intentionally not documented (as it may change + at any time). + +* `rekey [file key ...]` + + This plumbing-level command is similar to migrate, but you specify + both the file, and the new key to use for it. + + With `--force`, even files whose content is not currently available will + be rekeyed. Use with caution. + +* `findref [ref]` + + This is similar to the find command, but instead of finding files in the + current work tree, it finds files in the specified git ref. + + Most MATCHING OPTIONS can be used with findref, to limit the files it + finds. However, the --include and --exclude options will not work. + +* `resolvemerge` + + Resolves a conflicted merge, by adding both conflicting versions of the + file to the tree, using variants of their filename. This is done + automatically when using `git annex sync` or `git annex merge`. + + Note that only merge conflicts that involve an annexed file are resolved. + Merge conflicts between two files that are not annexed will not be + automatically resolved. + +* `test` + + This runs git-annex's built-in test suite. + + There are several parameters, provided by Haskell's tasty test framework. + +* `remotedaemon` + + Detects when network remotes have received git pushes and fetches from them. + +* `xmppgit` + + This command is used internally to perform git pulls over XMPP. + +# OPTIONS + +* `--force` + + Force unsafe actions, such as dropping a file's content when no other + source of it can be verified to still exist, or adding ignored files. + Use with care. + +* `--fast` + + Enable less expensive, but also less thorough versions of some commands. + What is avoided depends on the command. + +* `--auto` + + Enable automatic mode. Commands that get, drop, or move file contents + will only do so when needed to help satisfy the setting of numcopies, + and preferred content configuration. + +* `--all` + + Operate on all data that has been stored in the git annex, + including old versions of files. This is the default behavior when + running git-annex in a bare repository; in a non-bare repository the + normal behavior is to only operate on specified files in the working + tree. + +* `--unused` + + Operate on all data that has been determined to be unused by + a previous run of `git-annex unused`. + +* `--key=key` + + Operate on only the specified key. + +* `--quiet` + + Avoid the default verbose display of what is done; only show errors + and progress displays. + +* `--verbose` + + Enable verbose display. + +* `--json` + + Rather than the normal output, generate JSON. This is intended to be + parsed by programs that use git-annex. Each line of output is a JSON + object. Note that JSON output is only usable with some git-annex commands, + like info, find, whereis, and metadata. + +* `--debug` + + Show debug messages. + +* `--no-debug` + + Disable debug messages. + +* `--from=repository` + + Specifies a repository that content will be retrieved from, or that + should otherwise be acted on. + + It should be specified using the name of a configured remote. + +* `--to=repository` + + Specifies a repository that content will be sent to. + + It should be specified using the name of a configured remote. + +* `--numcopies=n` + + Overrides the numcopies setting, forcing git-annex to ensure the + specified number of copies exist. + + Note that setting numcopies to 0 is very unsafe. + +* `--time-limit=time` + + Limits how long a git-annex command runs. The time can be something + like "5h", or "30m" or even "45s" or "10d". + + Note that git-annex may continue running a little past the specified + time limit, in order to finish processing a file. + + Also, note that if the time limit prevents git-annex from doing all it + was asked to, it will exit with a special code, 101. + +* `--trust=repository` +* `--semitrust=repository` +* `--untrust=repository` + + Overrides trust settings for a repository. May be specified more than once. + + The repository should be specified using the name of a configured remote, + or the UUID or description of a repository. + +* `--trust-glacier-inventory` + + Amazon Glacier inventories take hours to retrieve, and may not represent + the current state of a repository. So git-annex does not trust that + files that the inventory claims are in Glacier are really there. + This switch can be used to allow it to trust the inventory. + + Be careful using this, especially if you or someone else might have recently + removed a file from Glacier. If you try to drop the only other copy of the + file, and this switch is enabled, you could lose data! + +* `--backend=name` + + Specifies which key-value backend to use. This can be used when + adding a file to the annex, or migrating a file. Once files + are in the annex, their backend is known and this option is not + necessary. + +* `--format=value` + + Specifies a custom output format. The value is a format string, + in which '${var}' is expanded to the value of a variable. To right-justify + a variable with whitespace, use '${var;width}' ; to left-justify + a variable, use '${var;-width}'; to escape unusual characters in a variable, + use '${escaped_var}' + + Also, '\\n' is a newline, '\\000' is a NULL, etc. + +* `--user-agent=value` + + Overrides the User-Agent to use when downloading files from the web. + +* `--notify-finish` + + Caused a desktop notification to be displayed after each successful + file download and upload. + + (Only supported on some platforms, eg Linux with dbus. A no-op when + not supported.) + +* `--notify-start` + + Caused a desktop notification to be displayed when a file upload + or download has started, or when a file is dropped. + +* `-c name=value` + + Overrides git configuration settings. May be specified multiple times. + +# MATCHING OPTIONS + +These options can all be specified multiple times, and can be combined to +limit which files git-annex acts on. + +Arbitrarily complicated expressions can be built using these options. +For example: + + --exclude '*.mp3' --and --not -( --in=usbdrive --or --in=archive -) + +The above example prevents git-annex from working on mp3 files whose +file contents are present at either of two repositories. + +* `--exclude=glob` + + Skips files matching the glob pattern. The glob is matched relative to + the current directory. For example: + + --exclude='*.mp3' --exclude='subdir/*' + + Note that this will not match anything when using --all or --unused. + +* `--include=glob` + + Skips files not matching the glob pattern. (Same as `--not --exclude`.) + For example, to include only mp3 and ogg files: + + --include='*.mp3' --or --include='*.ogg' + + Note that this will not skip anything when using --all or --unused. + +* `--in=repository` + + Matches only files that git-annex believes have their contents present + in a repository. Note that it does not check the repository to verify + that it still has the content. + + The repository should be specified using the name of a configured remote, + or the UUID or description of a repository. For the current repository, + use `--in=here` + +* `--in=repository@{date}` + + Matches files currently in the work tree whose content was present in + the repository on the given date. + + The date is specified in the same syntax documented in + gitrevisions(7). Note that this uses the reflog, so dates far in the + past cannot be queried. + + For example, you might need to run `git annex drop .` to temporarily + free up disk space. The next day, you can get back the files you dropped + using `git annex get . --in=here@{yesterday}` + +* `--copies=number` + + Matches only files that git-annex believes to have the specified number + of copies, or more. Note that it does not check remotes to verify that + the copies still exist. + +* `--copies=trustlevel:number` + + Matches only files that git-annex believes have the specified number of + copies, on remotes with the specified trust level. For example, + `--copies=trusted:2` + + To match any trust level at or higher than a given level, + use 'trustlevel+'. For example, `--copies=semitrusted+:2` + +* `--copies=groupname:number` + + Matches only files that git-annex believes have the specified number of + copies, on remotes in the specified group. For example, + `--copies=archive:2` + +* `--lackingcopies=number` + + Matches only files that git-annex believes need the specified number or + more additional copies to be made in order to satisfy their numcopies + settings. + +* `--approxlackingcopies=number` + + Like lackingcopies, but does not look at .gitattributes annex.numcopies + settings. This makes it significantly faster. + +* `--inbackend=name` + + Matches only files whose content is stored using the specified key-value + backend. + +* `--inallgroup=groupname` + + Matches only files that git-annex believes are present in all repositories + in the specified group. + +* `--smallerthan=size` +* `--largerthan=size` + + Matches only files whose content is smaller than, or larger than the + specified size. + + The size can be specified with any commonly used units, for example, + "0.5 gb" or "100 KiloBytes" + +* `--metadata field=glob` + + Matches only files that have a metadata field attached with a value that + matches the glob. The values of metadata fields are matched case + insensitively. + +* `--want-get` + + Matches files that the preferred content settings for the repository + make it want to get. Note that this will match even files that are + already present, unless limited with e.g., `--not --in .` + + Note that this will not match anything when using --all or --unused. + +* `--want-drop` + + Matches files that the preferred content settings for the repository + make it want to drop. Note that this will match even files that have + already been dropped, unless limited with e.g., `--in .` + + Note that this will not match anything when using --all or --unused. + +* `--not` + + Inverts the next matching option. For example, to only act on + files with less than 3 copies, use `--not --copies=3` + +* `--and` + + Requires that both the previous and the next matching option matches. + The default. + +* `--or` + + Requires that either the previous, or the next matching option matches. + +* `-(` + + Opens a group of matching options. + +* `-)` + + Closes a group of matching options. + +# PREFERRED CONTENT + +Each repository has a preferred content setting, which specifies content +that the repository wants to have present. These settings can be configured +using `git annex vicfg` or `git annex wanted`. +They are used by the `--auto` option, and by the git-annex assistant. + +The preferred content settings are similar, but not identical to +the matching options specified above, just without the dashes. +For example: + + exclude=archive/* and (include=*.mp3 or smallerthan=1mb) + +The main differences are that `exclude=` and `include=` always +match relative to the top of the git repository, and that there is +no equivilant to `--in`. + +When a repository is in one of the standard predefined groups, like "backup" +and "client", setting its preferred content to "standard" will use a +built-in preferred content expression developed for that group. + +# SCHEDULED JOBS + +The git-annex assistant daemon can be configured to run scheduled jobs. +This is similar to cron and anacron (and you can use them if you prefer), +but has the advantage of being integrated into git-annex, and so being able +to e.g., fsck a repository on a removable drive when the drive gets +connected. + +The scheduled jobs can be configured using `git annex vicfg` or +`git annex schedule`. + +These actions are available: "fsck self", "fsck UUID" (where UUID +is the UUID of a remote to fsck). After the action comes the duration +to allow the action to run, and finally the schedule of when to run it. + +To schedule multiple jobs, separate them with "; ". + +Some examples: + + fsck self 30m every day at any time + fsck self 1h every month at 3 AM + fsck self 1h on day 1 of every month at any time + fsck self 1h every week divisible by 2 at any time + +# CONFIGURATION VIA .git/config + +Like other git commands, git-annex is configured via `.git/config`. +Here are all the supported configuration settings. + +* `annex.uuid` + + A unique UUID for this repository (automatically set). + +* `annex.backends` + + Space-separated list of names of the key-value backends to use. + The first listed is used to store new files by default. + +* `annex.diskreserve` + + Amount of disk space to reserve. Disk space is checked when transferring + content to avoid running out, and additional free space can be reserved + via this option, to make space for more important content (such as git + commit logs). Can be specified with any commonly used units, for example, + "0.5 gb", "500M", or "100 KiloBytes" + + The default reserve is 1 megabyte. + +* `annex.largefiles` + + Allows configuring which files `git annex add` and the assistant consider + to be large enough to need to be added to the annex. By default, + all files are added to the annex. + + The value is a preferred content expression. See PREFERRED CONTENT + for details. + + Example: + + annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h) + +* `annex.numcopies` + + This is a deprecated setting. You should instead use the + `git annex numcopies` command to configure how many copies of files + are kept acros all repositories. + + This config setting is only looked at when `git annex numcopies` has + never been configured. + + Note that setting numcopies to 0 is very unsafe. + +* `annex.genmetadata` + + Set this to `true` to make git-annex automatically generate some metadata + when adding files to the repository. + + In particular, it stores year and month metadata, from the file's + modification date. + + When importfeed is used, it stores additional metadata from the feed. + +* `annex.queuesize` + + git-annex builds a queue of git commands, in order to combine similar + commands for speed. By default the size of the queue is limited to + 10240 commands; this can be used to change the size. If you have plenty + of memory and are working with very large numbers of files, increasing + the queue size can speed it up. + +* `annex.bloomcapacity` + + The `git annex unused` command uses a bloom filter to determine + what data is no longer used. The default bloom filter is sized to handle + up to 500000 keys. If your repository is larger than that, + you can adjust this to avoid `git annex unused` not noticing some unused + data files. Increasing this will make `git-annex unused` consume more memory; + run `git annex info` for memory usage numbers. + +* `annex.bloomaccuracy` + + Adjusts the accuracy of the bloom filter used by + `git annex unused`. The default accuracy is 1000 -- + 1 unused file out of 1000 will be missed by `git annex unused`. Increasing + the accuracy will make `git annex unused` consume more memory; + run `git annex info` for memory usage numbers. + +* `annex.sshcaching` + + By default, git-annex caches ssh connections using ssh's + ControlMaster and ControlPersist settings + (if built using a new enough ssh). To disable this, set to `false`. + +* `annex.alwayscommit` + + By default, git-annex automatically commits data to the git-annex branch + after each command is run. If you have a series + of commands that you want to make a single commit, you can + run the commands with `-c annex.alwayscommit=false`. You can later + commit the data by running `git annex merge` (or by automatic merges) + or `git annex sync`. + +* `annex.delayadd` + + Makes the watch and assistant commands delay for the specified number of + seconds before adding a newly created file to the annex. Normally this + is not needed, because they already wait for all writers of the file + to close it. On Mac OSX, when not using direct mode this defaults to + 1 second, to work around a bad interaction with software there. + +* `annex.expireunused` + + Controls what the assistant does about unused file contents + that are stored in the repository. + + The default is `false`, which causes + all old and unused file contents to be retained, unless the assistant + is able to move them to some other repository (such as a backup repository). + + Can be set to a time specification, like "7d" or "1m", and then + file contents that have been known to be unused for a week or a + month will be deleted. + +* `annex.fscknudge` + + When set to false, prevents the webapp from reminding you when using + repositories that lack consistency checks. + +* `annex.autoupgrade` + + When set to ask (the default), the webapp will check for new versions + and prompt if they should be upgraded to. When set to true, automatically + upgrades without prompting (on some supported platforms). When set to + false, disables any upgrade checking. + + Note that upgrade checking is only done when git-annex is installed + from one of the prebuilt images from its website. This does not + bypass e.g., a Linux distribution's own upgrade handling code. + + This setting also controls whether to restart the git-annex assistant + when the git-annex binary is detected to have changed. That is useful + no matter how you installed git-annex. + +* `annex.autocommit` + + Set to false to prevent the git-annex assistant from automatically + committing changes to files in the repository. + +* `annex.startupscan` + + Set to false to prevent the git-annex assistant from scanning the + repository for new and changed files on startup. This will prevent it + from noticing changes that were made while it was not running, but can be + a useful performance tweak for a large repository. + +* `annex.listen` + + Configures which address the webapp listens on. The default is localhost. + Can be either an IP address, or a hostname that resolves to the desired + address. + +* `annex.debug` + + Set to true to enable debug logging by default. + +* `annex.version` + + Automatically maintained, and used to automate upgrades between versions. + +* `annex.direct` + + Set to true when the repository is in direct mode. Should not be set + manually; use the "git annex direct" and "git annex indirect" commands + instead. + +* `annex.crippledfilesystem` + + Set to true if the repository is on a crippled filesystem, such as FAT, + which does not support symbolic links, or hard links, or unix permissions. + This is automatically probed by "git annex init". + +* `remote..annex-cost` + + When determining which repository to + transfer annexed files from or to, ones with lower costs are preferred. + The default cost is 100 for local repositories, and 200 for remote + repositories. + +* `remote..annex-cost-command` + + If set, the command is run, and the number it outputs is used as the cost. + This allows varying the cost based on e.g., the current network. The + cost-command can be any shell command line. + +* `remote..annex-start-command` + + A command to run when git-annex begins to use the remote. This can + be used to, for example, mount the directory containing the remote. + + The command may be run repeatedly when multiple git-annex processes + are running concurrently. + +* `remote..annex-stop-command` + + A command to run when git-annex is done using the remote. + + The command will only be run once *all* running git-annex processes + are finished using the remote. + +* `remote..annex-shell` + + Specify an alternative git-annex-shell executable on the remote + instead of looking for "git-annex-shell" on the PATH. + + This is useful if the git-annex-shell program is outside the PATH + or has a non-standard name. + +* `remote..annex-ignore` + + If set to `true`, prevents git-annex + from storing file contents on this remote by default. + (You can still request it be used by the `--from` and `--to` options.) + + This is, for example, useful if the remote is located somewhere + without git-annex-shell. (For example, if it's on GitHub). + Or, it could be used if the network connection between two + repositories is too slow to be used normally. + + This does not prevent git-annex sync (or the git-annex assistant) from + syncing the git repository to the remote. + +* `remote..annex-sync` + + If set to `false`, prevents git-annex sync (and the git-annex assistant) + from syncing with this remote. + +* `remote..annex-readonly` + + If set to `true`, prevents git-annex from making changes to a remote. + This both prevents git-annex sync from pushing changes, and prevents + storing or removing files from read-only remote. + +* `remote..annexUrl` + + Can be used to specify a different url than the regular `remote..url` + for git-annex to use when talking with the remote. Similar to the `pushUrl` + used by git-push. + +* `remote..annex-uuid` + + git-annex caches UUIDs of remote repositories here. + +* `remote..annex-trustlevel` + + Configures a local trust level for the remote. This overrides the value + configured by the trust and untrust commands. The value can be any of + "trusted", "semitrusted" or "untrusted". + +* `remote..annex-availability` + + Can be used to tell git-annex whether a remote is LocallyAvailable + or GloballyAvailable. Normally, git-annex determines this automatically. + +* `remote..annex-bare` + + Can be used to tell git-annex if a remote is a bare repository + or not. Normally, git-annex determines this automatically. + +* `remote..annex-ssh-options` + + Options to use when using ssh to talk to this remote. + +* `remote..annex-rsync-options` + + Options to use when using rsync + to or from this remote. For example, to force ipv6, and limit + the bandwidth to 100Kbyte/s, set it to `-6 --bwlimit 100` + +* `remote..annex-rsync-upload-options` + + Options to use when using rsync to upload a file to a remote. + + These options are passed after other applicable rsync options, + so can be used to override them. For example, to limit upload bandwidth + to 10Kbye/s, set `--bwlimit 10`. + +* `remote..annex-rsync-download-options` + + Options to use when using rsync to download a file from a remote. + + These options are passed after other applicable rsync options, + so can be used to override them. + +* `remote..annex-rsync-transport` + + The remote shell to use to connect to the rsync remote. Possible + values are `ssh` (the default) and `rsh`, together with their + arguments, for instance `ssh -p 2222 -c blowfish`; Note that the + remote hostname should not appear there, see rsync(1) for details. + When the transport used is `ssh`, connections are automatically cached + unless `annex.sshcaching` is unset. + +* `remote..annex-bup-split-options` + + Options to pass to bup split when storing content in this remote. + For example, to limit the bandwidth to 100Kbyte/s, set it to `--bwlimit 100k` + (There is no corresponding option for bup join.) + +* `remote..annex-gnupg-options` + + Options to pass to GnuPG for symmetric encryption. For instance, to + use the AES cipher with a 256 bits key and disable compression, set it + to `--cipher-algo AES256 --compress-algo none`. (These options take + precedence over the default GnuPG configuration, which is otherwise + used.) + +* `annex.ssh-options`, `annex.rsync-options`, + `annex.rsync-upload-options`, `annex.rsync-download-options`, + `annex.bup-split-options`, `annex.gnupg-options` + + Default options to use if a remote does not have more specific options + as described above. + +* `annex.web-options` + + Options to pass when running wget or curl. + For example, to force ipv4 only, set it to "-4" + +* `annex.quvi-options` + + Options to pass to quvi when using it to find the url to download for a + video. + +* `annex.http-headers` + + HTTP headers to send when downloading from the web. Multiple lines of + this option can be set, one per header. + +* `annex.http-headers-command` + + If set, the command is run and each line of its output is used as a HTTP + header. This overrides annex.http-headers. + +* `annex.web-download-command` + + Use to specify a command to run to download a file from the web. + (The default is to use wget or curl.) + + In the command line, %url is replaced with the url to download, + and %file is replaced with the file that it should be saved to. + +* `annex.secure-erase-command` + + This can be set to a command that should be run whenever git-annex + removes the content of a file from the repository. + + In the command line, %file is replaced with the file that should be + erased. + + For example, to use the wipe command, set it to `wipe -f %file` + +* `remote..rsyncurl` + + Used by rsync special remotes, this configures + the location of the rsync repository to use. Normally this is automatically + set up by `git annex initremote`, but you can change it if needed. + +* `remote..buprepo` + + Used by bup special remotes, this configures + the location of the bup repository to use. Normally this is automatically + set up by `git annex initremote`, but you can change it if needed. + +* `remote..ddarrepo` + + Used by ddar special remotes, this configures + the location of the ddar repository to use. Normally this is automatically + set up by `git annex initremote`, but you can change it if needed. + +* `remote..directory` + + Used by directory special remotes, this configures + the location of the directory where annexed files are stored for this + remote. Normally this is automatically set up by `git annex initremote`, + but you can change it if needed. + +* `remote..s3` + + Used to identify Amazon S3 special remotes. + Normally this is automatically set up by `git annex initremote`. + +* `remote..glacier` + + Used to identify Amazon Glacier special remotes. + Normally this is automatically set up by `git annex initremote`. + +* `remote..webdav` + + Used to identify webdav special remotes. + Normally this is automatically set up by `git annex initremote`. + +* `remote..tahoe` + + Used to identify tahoe special remotes. + Points to the configuration directory for tahoe. + +* `remote..annex-xmppaddress` + + Used to identify the XMPP address of a Jabber buddy. + Normally this is set up by the git-annex assistant when pairing over XMPP. + +* `remote..gcrypt` + + Used to identify gcrypt special remotes. + Normally this is automatically set up by `git annex initremote`. + + It is set to "true" if this is a gcrypt remote. + If the gcrypt remote is accessible over ssh and has git-annex-shell + available to manage it, it's set to "shell". + +* `remote..hooktype`, `remote..externaltype` + + Used by hook special remotes and external special remotes to record + the type of the remote. + +# CONFIGURATION VIA .gitattributes + +The key-value backend used when adding a new file to the annex can be +configured on a per-file-type basis via `.gitattributes` files. In the file, +the `annex.backend` attribute can be set to the name of the backend to +use. For example, this here's how to use the WORM backend by default, +but the SHA256E backend for ogg files: + + * annex.backend=WORM + *.ogg annex.backend=SHA256E + +The numcopies setting can also be configured on a per-file-type basis via +the `annex.numcopies` attribute in `.gitattributes` files. This overrides +other numcopies settings. +For example, this makes two copies be needed for wav files and 3 copies +for flac files: + + *.wav annex.numcopies=2 + *.flac annex.numcopies=3 + +Note that setting numcopies to 0 is very unsafe. + +These settings are honored by git-annex whenever it's operating on a +matching file. However, when using --all, --unused, or --key to specify +keys to operate on, git-annex is operating on keys and not files, so will +not honor the settings from .gitattributes. + +Also note that when using views, only the toplevel .gitattributes file is +preserved in the view, so other settings in other files won't have any +efffect. + +# FILES + +These files are used by git-annex: + +`.git/annex/objects/` in your git repository contains the annexed file +contents that are currently available. Annexed files in your git +repository symlink to that content. + +`.git/annex/` in your git repository contains other run-time information +used by git-annex. + +`~/.config/git-annex/autostart` is a list of git repositories +to start the git-annex assistant in. + +`.git/hooks/pre-commit-annex` in your git repository will be run whenever +a commit is made, either by git commit, git-annex sync, or the git-annex +assistant. + +# SEE ALSO + +Most of git-annex's documentation is available on its web site, + + +If git-annex is installed from a package, a copy of its documentation +should be included, in, for example, `/usr/share/doc/git-annex/`. + +# AUTHOR + +Joey Hess + + + +Warning: Automatically converted into a man page by mdwn2man. Edit with care. diff --git a/doc/git-union-merge.mdwn b/doc/git-union-merge.mdwn new file mode 100644 index 000000000..8e3c34f8f --- /dev/null +++ b/doc/git-union-merge.mdwn @@ -0,0 +1,38 @@ +# NAME + +git-union-merge - Join branches together using a union merge + +# SYNOPSIS + +git union-merge ref ref newref + +# DESCRIPTION + +Does a union merge between two refs, storing the result in the +specified newref. + +The union merge will always succeed, but assumes that files can be merged +simply by concacenating together lines from all the oldrefs, in any order. +So, this is useful only for branches containing log-type data. + +Note that this does not touch the checked out working copy. It operates +entirely on git refs and branches. + +# EXAMPLE + + git union-merge git-annex origin/git-annex refs/heads/git-annex + +Merges the current git-annex branch, and a version from origin, +storing the result in the git-annex branch. + +# BUGS + +File modes are not currently merged. + +# AUTHOR + +Joey Hess + + + +Warning: Automatically converted into a man page by mdwn2man. Edit with care diff --git a/doc/how_it_works.mdwn b/doc/how_it_works.mdwn new file mode 100644 index 000000000..69e5256e3 --- /dev/null +++ b/doc/how_it_works.mdwn @@ -0,0 +1,42 @@ +This page gives a high-level view of git-annex. For a detailed +low-level view, see [[the_man_page|git-annex]] and [[internals]]. + +You do not need to read this page to get started with using git-annex. The +[[walkthrough]] provides step-by-step instructions. + +Still reading? Ok. Git's man page calls it "a stupid content +tracker". With git-annex, git is instead "a stupid filename and metadata" +tracker. The contents of annexed files are not stored in git, only the +names of the files and some other metadata remain there. + +The contents of the files are kept by git-annex in a distributed key/value +store consisting of every clone of a given git repository. That's a fancy +way to say that git-annex stores the actual file content somewhere under +`.git/annex/`. (See [[internals]] for details and note that in +[[direct_mode]] the file contents are left in the work tree.) + +That was the values; what about the keys? Well, a key is calculated for a +given file when it's first added into git-annex. Normally this uses a hash +of its contents, but various [[backends]] can produce different sorts of +keys. The file that gets checked into git is just a symlink to the key +under `.git/annex/`. If the content of a file is modified, that produces +a different key (and the symlink is changed). + +A file's content can be [[transferred|transferring_data]] from one +repository to another by git-annex. Which repositories contain a given +value is tracked by git-annex (see [[location_tracking]]). It stores this +tracking information in a separate branch, named "git-annex". All you ever +do with the "git-annex" branch is push/pull it around between repositories, +to [[sync]] up git-annex's view of the world. + +That's really all there is to it. Oh, there are [[special_remotes]] that +let values be stored other places than git repositories (anything from +Amazon S3 to a USB key), and there's a pile of commands listed in +[[the_man_page|git-annex]] to handle moving the values around and managing +them. But if you grok the description above, you can see through all that. +It's really just symlinks, keys, values, and a git-annex branch to store +additional metadata. + +--- + +Next: [[install]] or [[walkthrough]] diff --git a/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment b/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment new file mode 100644 index 000000000..60aeab732 --- /dev/null +++ b/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="minor suggestion" + date="2013-08-10T14:31:31Z" + content=""" +The contents of large files are not stored in git, only the names of the files and some other metadata remain there. + +Would this read better to the newbie as: + +The contents of 'annexed' files are not stored in git, only the names of the files and some other metadata remain there. + +First time for me, the note about large files made me think that maybe annex operated on files above a certain size. +"""]] diff --git a/doc/how_it_works/comment_2_2a8ce5859040d815e6234fc18f5f1961._comment b/doc/how_it_works/comment_2_2a8ce5859040d815e6234fc18f5f1961._comment new file mode 100644 index 000000000..cc16f465d --- /dev/null +++ b/doc/how_it_works/comment_2_2a8ce5859040d815e6234fc18f5f1961._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm4cjowB3PaZP00vEr255d1GdUBikE9Qdg" + nickname="Matthew" + subject="clarification about what is moved / stored and where" + date="2014-02-10T12:53:44Z" + content=""" +Just to support Nigel's comment; it's good to be precise and clear about what happens to the files from the start. +I've sent a similar suggestion to the mailing list. + +"""]] diff --git a/doc/index.mdwn b/doc/index.mdwn new file mode 100644 index 000000000..fd166212e --- /dev/null +++ b/doc/index.mdwn @@ -0,0 +1,46 @@ +[[!inline raw=yes pages="summary"]] + +[[!sidebar content=""" +[[!inline feeds=no template=bare pages=sidebar]] + +[[Feeds]]: + + +[[!inline pages="internal(feeds/*)" archive=yes show=8 feeds=no]] + +"""]] + + + + + + + +
[[!inline feeds=no template=bare pages=links/key_concepts]][[!inline feeds=no template=bare pages=links/the_details]][[!inline feeds=no template=bare pages=links/other_stuff]]
+ + + + + + +
[[!inline feeds=no template=bare pages=use_case/bob]][[!inline feeds=no template=bare pages=use_case/alice]]
+ +If that describes you, or if you're some from column A and some from column +B, then git-annex may be the tool you've been looking for to expand from +keeping all your small important files in git, to managing your large +files with git. + + + + + + +
[[!inline feeds=no template=bare pages=footer/column_a]][[!inline feeds=no template=bare pages=footer/column_b]]
+ +---- + +git-annex is [[Free Software|license]], written in [Haskell](http://www.haskell.org/). +You can [[contribute]]! + +git-annex's wiki is powered by [Ikiwiki](http://ikiwiki.info/) and +hosted by [Branchable](http://branchable.com/). diff --git a/doc/install.mdwn b/doc/install.mdwn new file mode 100644 index 000000000..4c2712855 --- /dev/null +++ b/doc/install.mdwn @@ -0,0 +1,33 @@ +## Pick your OS + +[[!table format=dsv header=yes data=""" +detailed instructions | quick install +[[OSX]] | [download git-annex.app](http://downloads.kitenet.net/git-annex/OSX/current/) +  [[Homebrew]] | `brew install git-annex` +[[Android]] | [download git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/) **beta** +[[Linux|linux_standalone]] | [download prebuilt linux tarball](http://downloads.kitenet.net/git-annex/linux/current/) +  [[Debian]] | `apt-get install git-annex` +  [[Ubuntu]] | `apt-get install git-annex` +  [[Fedora]] | `yum install git-annex` +  [[FreeBSD]] | `pkg_add -r hs-git-annex` +  [[ArchLinux]] | `yaourt -Sy git-annex` +  [[NixOS]] | `nix-env -i git-annex` +  [[Gentoo]] | `emerge git-annex` +  [[ScientificLinux5]] | +  [[openSUSE]] | +  [[Docker]] | +[[Windows]] | [download installer](http://downloads.kitenet.net/git-annex/windows/current/) **alpha** +"""]] + +## Using cabal + +As a haskell package, git-annex can be installed from source pretty easily +[[using cabal|cabal]]. + +## Installation from scratch + +This is not recommended, but if you really want to, see [[fromscratch]]. + +## See also + +[[autobuild overview|builds]] diff --git a/doc/install/Android.mdwn b/doc/install/Android.mdwn new file mode 100644 index 000000000..080fad80b --- /dev/null +++ b/doc/install/Android.mdwn @@ -0,0 +1,37 @@ +Now git-annex can be used on Android! + +[[Documentation for using git-annex on Android|/android]] + +## Android app + +First, ensure your Android device is configured to allow installation +of the app. Go to Setup -> Security, and enable "Unknown Sources". + +Then download the git-annex.apk for your version of Android, and +open it to install. + +* [Android 4.4 and 4.3 git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/4.3/git-annex.apk) +* [Android 4.0 to 4.2 git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/4.0/git-annex.apk) + +## autobuilds + +A daily build is also available, thanks to Mesar Hameed and the University +of Bath CS department. + +* [Android 4.4 and 4.3 git-annex.apk](http://downloads.kitenet.net/git-annex/autobuild/android/4.3/git-annex.apk) +* [Android 4.0 to 4.2 git-annex.apk](http://downloads.kitenet.net/git-annex/autobuild/android/4.0/git-annex.apk) +* [build logs](http://downloads.kitenet.net/git-annex/autobuild/android/) + +## building it yourself + +git-annex can be built from source for Android. + +1. Run `standalone/android/buildchroot` as root (requires debootstrap). + This builds a chroot with a `builder` user. + The rest of the build will run in this chroot as that user. +2. In the chroot, run `standalone/android/install-haskell-packages` + Note that this will break from time to time as new versions of packages + are released, and the patches it applies have to be updated when + this happens. +3. Finally, once the chroot is set up, you can build an Android binary + with `make android`, and `make androidapp` will build the complete APK. diff --git a/doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment b/doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment new file mode 100644 index 000000000..f6a71981e --- /dev/null +++ b/doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="+1 F-Droid" + date="2013-09-24T18:36:48Z" + content=""" +Availability in F-Droid would be really neat. I imagine the unusual build requirements would require some work though. +"""]] diff --git a/doc/install/Android/comment_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment b/doc/install/Android/comment_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment new file mode 100644 index 000000000..6ab3dbd4a --- /dev/null +++ b/doc/install/Android/comment_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.57.121" + subject="re F-Droid" + date="2014-05-03T14:58:02Z" + content=""" +See also . +"""]] diff --git a/doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment b/doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment new file mode 100644 index 000000000..f57fb8d79 --- /dev/null +++ b/doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmK0703vNSIQsP1mGf-4MAPnsBZiSc6yVo" + nickname="Emre" + subject="What am I missing?" + date="2013-10-15T21:54:07Z" + content=""" +I've setup repositories on both my linux PC & android mini pc and added jabber account on both. They are both at my home network. They detected each other fine. But when it comes to syncing files, there's a message which says \"Unable to download files from your other devices\" with a button for \"add a cloud repository\". I don't need to add a cloud repository since both computers are at the same network? Or am I missing something in the architecture of git-annex that even to sync two local computers in the same LAN, annex would still need an external repo? (and if so, why would that be?) +I'm not really willing to add an external repository as I intend to add large files and I don't want that they are first uploaded using a slow connection & then re-downloaded. +What am I missing? +"""]] diff --git a/doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment b/doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment new file mode 100644 index 000000000..772fa1d6a --- /dev/null +++ b/doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 12" + date="2013-10-16T16:05:45Z" + content=""" +To make computers on your network directly communicate, they must be connected together using the user interface. This is normally using the local pairing interface. But local pairing does not yet work on Android. The best you can do to instead on your Android device, add the Linux PC as a ssh server. This will let the Android device send/receive files directly with it over the local network. +"""]] diff --git a/doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment b/doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment new file mode 100644 index 000000000..13f9c659f --- /dev/null +++ b/doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://josh.easyid.net/" + ip="208.100.171.144" + subject="Minimum version of Android?" + date="2013-06-18T22:05:02Z" + content=""" +Does this require 4.x? +"""]] diff --git a/doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment b/doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment new file mode 100644 index 000000000..bf5978674 --- /dev/null +++ b/doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 2" + date="2013-06-25T17:58:57Z" + content=""" +I have not heard of anyone using older than 4.x with success. In particular, several people reported 2.3 doesn't work. +"""]] diff --git a/doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment b/doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment new file mode 100644 index 000000000..c049bfcab --- /dev/null +++ b/doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA" + nickname="Joe" + subject="comment 3" + date="2013-07-04T15:06:36Z" + content=""" +Is it safe to upgrade by installing a daily build over an existing version? Will that overwrite any settings? +"""]] diff --git a/doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment b/doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment new file mode 100644 index 000000000..2745044a4 --- /dev/null +++ b/doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 4" + date="2013-07-05T00:53:00Z" + content=""" +It is safe to re-install, all your data and settings are stored in /sdcard and will not be touched, even if you delete the app! +"""]] diff --git a/doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment b/doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment new file mode 100644 index 000000000..efba6aeeb --- /dev/null +++ b/doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmrb8I1K5jjNr7ZrLSvgmkeQGjYauPeGJU" + nickname="Martin" + subject="comment 8" + date="2013-08-18T16:44:02Z" + content=""" +Any chance that older versions of Android will be supported in the future? +"""]] diff --git a/doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment b/doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment new file mode 100644 index 000000000..989304242 --- /dev/null +++ b/doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://openlifechallenge.wordpress.com/" + nickname="O" + subject="Add to F-Droid" + date="2013-09-08T09:56:38Z" + content=""" +Hi, +Really enjoy this app for Android! Super simple to use but it would be great if you could fix a folder navigator option when choosing location for device repo, right now it does not work. + +Could you also add it to the F-Droid repository? +"""]] diff --git a/doc/install/ArchLinux.mdwn b/doc/install/ArchLinux.mdwn new file mode 100644 index 000000000..3dd7271c4 --- /dev/null +++ b/doc/install/ArchLinux.mdwn @@ -0,0 +1,19 @@ +There are three non non-official packages for git-annex in the Archlinux User Repository. Any of these may be installed manually per [AUR guidelines](https://wiki.archlinux.org/index.php/AUR_User_Guidelines#Installing_packages) or using a wrapper such as [`yaourt`](https://wiki.archlinux.org/index.php/yaourt) shown below. + +1. The simplest method is to use the [git-annex-bin](https://aur.archlinux.org/packages/git-annex-bin/) package based on the [prebuilt Linux tarballs](http://downloads.kitenet.net/git-annex/linux/current/). This package includes many of the binary shims from the pre-built package. Although common Linux system utilities have been stripped in favor of normal dependencies, the pre-configured Haskell libraries included out of the box make this an easy install. The disadvantage is the resulting installation is a bit on the heavy side at nearly 100M. + + $ yaourt -Sy git-annex-bin + +2. A more traditional source package is available at [git-annex](https://aur.archlinux.org/packages/git-annex/). This depends on a large number of Haskell packages available from a third party repository or through Cabal. This has been historically a bit problematic and the package frequently sits flagged out of date. The state of dependencies also varies, so some intervention may be required to get this option to work. + + $ yaourt -Sy git-annex + +3. A development package is available at [git-annex-git](https://aur.archlinux.org/packages/git-annex-git/) that functions similarly to the source package but builds directly from the HEAD of the git repository rather that the last official release. + + $ yaourt -Sy git-annex-git + +Finally you may choose to forgo the Archlinux package system and install git-annex directly through cabal. + + $ pacman -S git rsync curl wget gnupg openssh cabal-install + $ cabal update + $ cabal install git-annex --bindir=$HOME/bin diff --git a/doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment b/doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment new file mode 100644 index 000000000..d4db23292 --- /dev/null +++ b/doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlwYMdU0H7P7MMlD0v_BcczO-ZkYHY4zuY" + nickname="Morris" + subject="Arch Linux" + date="2012-10-17T13:21:24Z" + content=""" +For Arch Linux there should be the AUR package [git-annex-bin](https://aur.archlinux.org/packages.php?ID=63503) mentioned, because it's easier to install (no haskell dependencies to be installed) and is based on the prebuild linux binary tarball. +"""]] diff --git a/doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment b/doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment new file mode 100644 index 000000000..9b1f29623 --- /dev/null +++ b/doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="Stalling when creating repository in assistant" + date="2013-09-13T05:09:49Z" + content=""" +I am experiencing a weird issue with any install I've had on this one (and only) ArchLinux machine: all of aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 and a Cabal install just stall when trying to create the initial Git annex repo in the webapp. + +When started, it offers me to create the annex in ~/annex/ or ~/Desktop/annex/, where ~ gets turned into /home/USER when I press “Make repository”, but nothing else happens. This is regardless of if that repo exists when I try to create it or start the webapp. + +If I start the webapp from an existing annex (now in ~/annex), it seems to work a bit better, but any other remote (SSH) server that I try to add fails. I just get a fleeting Bootstrap message box when I click “Check this server”, and nothing in the logs of eithr git annex webapp or the ssh logs of the server. + +Any idea? Where should I look for more debug information? +. + +"""]] diff --git a/doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment b/doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment new file mode 100644 index 000000000..48a2888a2 --- /dev/null +++ b/doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 3" + date="2013-09-13T15:35:59Z" + content=""" +Please post a [[bug report|bugs]] and start the webapp with the --debug option. +"""]] diff --git a/doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment b/doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment new file mode 100644 index 000000000..9146da9c8 --- /dev/null +++ b/doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 4" + date="2013-09-16T01:23:58Z" + content=""" +Done [0]. Not much debug output, unfortunately... + +[0] http://git-annex.branchable.com/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/?updated +"""]] diff --git a/doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment b/doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment new file mode 100644 index 000000000..b3ed0846b --- /dev/null +++ b/doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://alerque.com/" + nickname="Caleb" + subject="Out of date" + date="2013-12-28T22:04:24Z" + content=""" +The AUR package you reference is woefully out of date. I have updated the standalone variant so it might be worth using that until the maintainer catches up. + + yaourt -Sy git-annex-standalone +"""]] diff --git a/doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment b/doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment new file mode 100644 index 000000000..9f158347b --- /dev/null +++ b/doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqWbWVRH2k9spSMqKfIXBP1G3ekkj9Igg" + nickname="Rado" + subject="problem installing using cabal: language-javascript missing" + date="2014-03-28T22:38:04Z" + content=""" +Configuring gnuidn-0.2.1... +cabal: The program c2hs is required but it could not be found. +Failed to install gnuidn-0.2.1 +Configuring language-javascript-0.5.9... +cabal: The program happy version >=1.18.5 is required but it could not be +found. +Failed to install language-javascript-0.5.9 +cabal: Error: some packages failed to install: +git-annex-5.20140320 depends on language-javascript-0.5.9 which failed to +install. +gnuidn-0.2.1 failed during the configure step. The exception was: +ExitFailure 1 +hjsmin-0.1.4.6 depends on language-javascript-0.5.9 which failed to install. +language-javascript-0.5.9 failed during the configure step. The exception was: +ExitFailure 1 +network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install. +yesod-static-1.2.2.4 depends on language-javascript-0.5.9 which failed to +install. +[r-c@rc-laptop ~]$ cabal install language-javascript +Resolving dependencies... +Configuring language-javascript-0.5.9... +cabal: The program happy version >=1.18.5 is required but it could not be +found. +Failed to install language-javascript-0.5.9 +cabal: Error: some packages failed to install: +language-javascript-0.5.9 failed during the configure step. The exception was: +ExitFailure 1 + +Can you help how to solve? +"""]] diff --git a/doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment b/doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment new file mode 100644 index 000000000..3d7826bc1 --- /dev/null +++ b/doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://alerque.com/" + nickname="Caleb" + subject="dep problems" + date="2014-03-28T22:50:37Z" + content=""" +@rado The Haskel dependencies can be a nightmare to sort out for the un-initiated. You can side-step the whole issue by uninstalling the pre-built version that that has all the dependencies built in out of the box. + +Just grab the git-annex-bin package from the AUR and be done with it. (The -bin and -standalone packages recently merged so there is just -bin now). +"""]] diff --git a/doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment b/doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment new file mode 100644 index 000000000..3e6d6b3a8 --- /dev/null +++ b/doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqWbWVRH2k9spSMqKfIXBP1G3ekkj9Igg" + nickname="Rado" + subject="I solved it installing dependencies....but dont know hot to start it..." + date="2014-03-29T07:45:19Z" + content=""" +cabal install gsasl +cabal install happy +cabal install language-javascript +cabal install alex +cabal install c2hs + +after installing writing in terminal: git-annex, git-annex webapp does nothing... +can you help how to start git-annex? +"""]] diff --git a/doc/install/Debian.mdwn b/doc/install/Debian.mdwn new file mode 100644 index 000000000..c71d4d244 --- /dev/null +++ b/doc/install/Debian.mdwn @@ -0,0 +1,20 @@ +## Debian testing or unstable + + sudo apt-get install git-annex + +## Debian 7.0 "wheezy": + + sudo apt-get install git-annex + +Note: This version does not include support for the [[assistant]]. +A backport is available with the assistant and other new features. + +Follow the instructions to [enable backports](http://backports.debian.org/Instructions/). + + sudo apt-get -t wheezy-backports install git-annex + +## Debian 6.0 "squeeze" + +Follow the instructions to [enable backports](http://backports.debian.org/Instructions/). + + sudo apt-get -t squeeze-backports install git-annex diff --git a/doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment b/doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment new file mode 100644 index 000000000..86f1d6050 --- /dev/null +++ b/doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Miles" + ip="88.175.62.104" + subject="installed git-annex on debian but cannot find it" + date="2013-08-19T23:29:24Z" + content=""" +I am an absolute beginner when it comes to linux in debian in particular. I installed git-annex via the root terminal, but now I do not know where to find it. I searched for in the file system but could not locate it. Any help is appreciated. +"""]] diff --git a/doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment b/doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment new file mode 100644 index 000000000..6f32c2b0b --- /dev/null +++ b/doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_GWOEjK4Sn4hUB6ofFlE3CNeC7tO56J8" + nickname="John" + subject="Re: installed git-annex on debian but cannot find it " + date="2013-08-20T00:50:28Z" + content=""" +@Miles - The command is git annex webapp to bring up the web interface. +"""]] diff --git a/doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment b/doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment new file mode 100644 index 000000000..563be1c6c --- /dev/null +++ b/doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA" + nickname="Dominik" + subject="debian squeeze" + date="2014-05-16T22:58:52Z" + content=""" +I'm tring to set up a bare repo on a debian squeeze server and sync it to windows client. Unfortunately the direct mode does not seem to be available for the git-annex version (3.20120629~bpo60+2 +) in the squeeze-backports + +Would you be able to update the version in that repository? Thank you for your hard work! Git-annex is awesome +"""]] diff --git a/doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._comment b/doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._comment new file mode 100644 index 000000000..cd42becc2 --- /dev/null +++ b/doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 17" + date="2014-05-17T17:03:31Z" + content=""" +Debian squeeze has an extremely ancient ghc compiler, and it would be a mammoth undertaking to build current git-annex using that. + +Use the linux standalone build instead. +"""]] diff --git a/doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment b/doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment new file mode 100644 index 000000000..9a4ed7c31 --- /dev/null +++ b/doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla7u6eLKNYZ09Z7xwBffqLaXquMQC07fU" + nickname="Matthias" + subject="squeeze-backports update?" + date="2011-08-17T12:34:46Z" + content=""" +Is there going to be an update of git-annex in debian squeeze-backports to a version that supports repository version 3? +Thx +"""]] diff --git a/doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment b/doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment new file mode 100644 index 000000000..b8b3d68f3 --- /dev/null +++ b/doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="Re: squeeze-backports update?" + date="2011-08-17T15:34:29Z" + content=""" +Yes, I uploaded it last night. +"""]] diff --git a/doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment b/doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment new file mode 100644 index 000000000..98d65740b --- /dev/null +++ b/doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkstq9oH1vHXY_VP0nYO9Gg3eKnKerDGRI" + nickname="Hadi" + subject="ARM" + date="2012-07-31T15:13:06Z" + content=""" +is there any package for Debian armhf? I'd love to install git-annex on my raspberry pi +"""]] diff --git a/doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment b/doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment new file mode 100644 index 000000000..8436f0354 --- /dev/null +++ b/doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 4" + date="2012-07-31T15:41:43Z" + content=""" +Yes, git-annex is available for every Debian architecture which supports Haskell, including all arm ports: + +
git-annex | 3.20120629         | wheezy            | source, amd64, armel, armhf, i386, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
+"""]] diff --git a/doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment b/doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment new file mode 100644 index 000000000..6d8cae2f0 --- /dev/null +++ b/doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://mey.vn/" + ip="46.65.14.106" + subject="libc6 dep version on amd64" + date="2013-05-28T15:28:47Z" + content=""" +hi Joey, + +i see from the release notes of the 4.20130521 release that the Debian package should now be built with libc6 2.13, which appears to be the case except for the amd64 arch (hence the amd64 package won't install as is on Wheezy on amd64) - is this a build glitch or is 2.14 needed on amd64 (i imagine as a dependency of one of git-annex's deps on that arch)? + +thanks! +"""]] diff --git a/doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment b/doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment new file mode 100644 index 000000000..253df3d07 --- /dev/null +++ b/doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-05-29T16:23:10Z" + content=""" +@mey.vn, Debian packages of git-annex, as uploaded to the Debian repositories, are built with whatever libc version the Debian autobuilder is running. You cannot, in general, install packages from Debian unstable into stable without upgrading your libc6. + +The release notes were not talking about the Debian packages, but about the [[Linux_standalone]] tarballs. Those are built with libc 2.13. +"""]] diff --git a/doc/install/Docker.mdwn b/doc/install/Docker.mdwn new file mode 100644 index 000000000..f3d7c189e --- /dev/null +++ b/doc/install/Docker.mdwn @@ -0,0 +1,32 @@ +There is not yet a pre-built Docker image for git-annex. However, it's +easy to add it to an image. + +For example: + + docker run -i -t joeyh/debian-unstable apt-get install git-annex + +# containers for autobuilders + +The git-annex Linux autobuilds are built using Docker containers. +Most of these are not published, but you can build your own. (See below.) + +Since the Android autobuilder container can take quite a lot of work to get +built, it is published. `docker pull joeyh/git-annex-android-builder` + +# building autobuilder containers using Propellor + +The Docker containers are built using +[Propellor](http://joeyh.name/code/propellor). To generate your own image, +Just install Propellor and add this to its `config.hs`: + +[[!format haskell """ +import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder + + , host hostname@"your.machine.net" = Just $ props + & Docker.configured + & Docker.docked container hostname "amd64-git-annex-builder" + , GitAnnexBuilder.standardAutoBuilderContainer dockerImage "amd64" 15 "2h" +"""]] + +This will autobuild every hour at :15, and the autobuilt image will be +left inside the container in /home/builder/gitbuilder/out/ diff --git a/doc/install/Fedora.mdwn b/doc/install/Fedora.mdwn new file mode 100644 index 000000000..9c31165f8 --- /dev/null +++ b/doc/install/Fedora.mdwn @@ -0,0 +1,40 @@ +git-annex is available in recent versions of Fedora. +[status](http://koji.fedoraproject.org/koji/packageinfo?packageID=14145) + +Should be as simple as: `yum install git-annex` + +Note: Fedora's build does not currently include the git-annex webapp. + +---- + +To install the latest version of git-annex on Fedora 18 and later, you can use `cabal`: + +
+# Install dependencies
+sudo yum install libxml2-devel gnutls-devel libgsasl-devel ghc cabal-install happy alex libidn-devel
+# Update the cabal list
+cabal update
+# Install c2hs, required by dependencies of git-annex, but not automatically installed
+cabal install --bindir=$HOME/bin c2hs
+# Install git-annex
+cabal install --bindir=$HOME/bin git-annex
+
+ +---- + +Older version? Here's an installation recipe for Fedora 14 through 15. + +
+sudo yum install ghc cabal-install
+git clone git://git-annex.branchable.com/ git-annex
+cd git-annex
+git checkout ghc7.0
+cabal update
+cabal install --only-dependencies
+cabal configure
+cabal build
+cabal install --bindir=$HOME/bin
+
+ +Note: You can't just use `cabal install git-annex`, because Fedora does +not yet ship ghc 7.4. diff --git a/doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment b/doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment new file mode 100644 index 000000000..bdc8c9e06 --- /dev/null +++ b/doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://mebus.myopenid.com/" + ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3" + subject="RPM of version 4.2" + date="2013-07-30T01:09:54Z" + content=""" +Hi! + +Isn't there an rpm package of version 4.2 available for Fedora 17 or 18? + +Thanks! + +Mebus + + +"""]] diff --git a/doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment b/doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment new file mode 100644 index 000000000..0a1de29b5 --- /dev/null +++ b/doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://mebus.pip.verisignlabs.com/" + nickname="Bussard" + subject="comment 2" + date="2013-07-30T20:41:07Z" + content=""" +When I try to build in from source on Fedora 17, I get this error: + +[ 77 of 163] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o ) +[ 78 of 163] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o ) + +Utility/Url.hs:111:88: + Couldn't match expected type `Maybe URI' with actual type `URI' + In the second argument of `fromMaybe', namely + `(newURI `relativeTo` u)' + In the expression: fromMaybe newURI (newURI `relativeTo` u) + In an equation for `newURI_abs': + newURI_abs = fromMaybe newURI (newURI `relativeTo` u) + +Any help? + +Mebus + + +"""]] diff --git a/doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment b/doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment new file mode 100644 index 000000000..4a8624961 --- /dev/null +++ b/doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 3" + date="2013-07-30T21:25:32Z" + content=""" +Edit Utility/Url.hs and play around with the version in the `MIN_VERSION_network` define. It seems to me that your system needs to build with the #else branch of the #ifdef, despite having a version of the haskell network package older than 2.4.0. It's possible that the haskell network package has been modified by Fedora. +"""]] diff --git a/doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment b/doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment new file mode 100644 index 000000000..afdbf1dc1 --- /dev/null +++ b/doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI" + nickname="Michele" + subject="installing on fc19" + date="2013-10-18T21:05:56Z" + content=""" +i share my experience in installing from source on fc19, I must admit these are useful only for haskell novices: +should cabal complain about missing libffi.so.5 (as it happened to me), do + + yum install compat-libffi + +and you'll get the missing library (the shipping version with fc19 is libffi.so.6) +also: in order for the git annex to be picked up globally or better to end up in the default path i had to: + + cabal install --global +"""]] diff --git a/doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment b/doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment new file mode 100644 index 000000000..df518ea11 --- /dev/null +++ b/doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://mebus.myopenid.com/" + ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3" + subject="Error on Fedora 19" + date="2013-10-19T14:57:12Z" + content=""" +On Fedora 19, I am getting this error: + +http://pastebin.com/raw.php?i=c9SNjbXV + +Mebus + + + +"""]] diff --git a/doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment b/doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment new file mode 100644 index 000000000..ffb6f0605 --- /dev/null +++ b/doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://mebus.myopenid.com/" + ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3" + subject="comment 6" + date="2013-10-19T15:09:34Z" + content=""" +Worked! I forgot to install c2hs. + +Mebus + + +"""]] diff --git a/doc/install/Fedora/comment_7_4832d271dcc63a6cd1c40fe38ad5e367._comment b/doc/install/Fedora/comment_7_4832d271dcc63a6cd1c40fe38ad5e367._comment new file mode 100644 index 000000000..ec9308b70 --- /dev/null +++ b/doc/install/Fedora/comment_7_4832d271dcc63a6cd1c40fe38ad5e367._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkJafmCf-sg9_OM0pynFYM3AO4WCgJiaMI" + nickname="Michele" + subject="building fails on fedora 19" + date="2014-05-26T15:31:10Z" + content=""" +latest version (git-annex-5.20140517) during cabal install git-annex I encounter this: + +[[!format sh \"\"\" +[266 of 457] Compiling Remote.WebDAV ( Remote/WebDAV.hs, dist/build/git-annex/git-annex-tmp/Remote/WebDAV.o ) + +Remote/WebDAV.hs:380:32: + Constructor `StatusCodeException' should have 3 arguments, but has been given 2 + In the pattern: StatusCodeException s _ + In an equation for `matchStatusCodeException': + matchStatusCodeException want (StatusCodeException s _) + | s == want = Just () + | otherwise = Nothing +Failed to install git-annex-5.20140517 +cabal: Error: some packages failed to install: +git-annex-5.20140517 failed during the building phase. The exception was: +ExitFailure 1 +\"\"\"]] +"""]] diff --git a/doc/install/Fedora/comment_8_80e167cde1a6511683a8f6e8029c0da6._comment b/doc/install/Fedora/comment_8_80e167cde1a6511683a8f6e8029c0da6._comment new file mode 100644 index 000000000..e649ff759 --- /dev/null +++ b/doc/install/Fedora/comment_8_80e167cde1a6511683a8f6e8029c0da6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.176" + subject="comment 8" + date="2014-05-27T16:08:14Z" + content=""" +@Michele, you seem to have an old version of the haskell DAV library installed. The simple solutions is probably `cabal install DAV` to upgrade to the new one. + +(The complex solution is to edit the file and copy the line 2 lines above the error, or fix the ifdefs somehow to work with whatever combination of versions of DAV and http-client or http-conduit you have installed.) +"""]] diff --git a/doc/install/FreeBSD.mdwn b/doc/install/FreeBSD.mdwn new file mode 100644 index 000000000..72b402c38 --- /dev/null +++ b/doc/install/FreeBSD.mdwn @@ -0,0 +1,2 @@ +git-annex is in FreeBSD ports in +[devel/git-annex](http://www.freshports.org/devel/hs-git-annex/) diff --git a/doc/install/Gentoo.mdwn b/doc/install/Gentoo.mdwn new file mode 100644 index 000000000..feeaad739 --- /dev/null +++ b/doc/install/Gentoo.mdwn @@ -0,0 +1,3 @@ +Gentoo users can: `emerge git-annex` + +A possibly more up-to-date version is in the haskell portage overlay. diff --git a/doc/install/Homebrew.mdwn b/doc/install/Homebrew.mdwn new file mode 100644 index 000000000..bd9a840b0 --- /dev/null +++ b/doc/install/Homebrew.mdwn @@ -0,0 +1,21 @@ +[Homebrew](http://brew.sh/) has [a formula](https://github.com/Homebrew/homebrew/commits/master/Library/Formula/git-annex.rb) for git-annex. + +Homebrew users can simply run `brew install git-annex` to install git-annex. + +## buiding git-annex from sources + +This is the old recipe for building git-annex from source, using +packages from homebrew. Useful if you want a newer version than the version +in homebrew. + +
+brew install haskell-platform git ossp-uuid md5sha1sum coreutils gnutls libidn gsasl pkg-config libxml2
+brew link libxml2 --force
+cabal update
+mkdir $HOME/bin
+PATH=$HOME/bin:$PATH
+PATH=$HOME/.cabal/bin:$PATH
+cabal install c2hs --bindir=$HOME/bin
+cabal install gnuidn
+cabal install git-annex --bindir=$HOME/bin
+
diff --git a/doc/install/Linux_standalone.mdwn b/doc/install/Linux_standalone.mdwn new file mode 100644 index 000000000..4e654febc --- /dev/null +++ b/doc/install/Linux_standalone.mdwn @@ -0,0 +1,34 @@ +If your Linux distribution does not have git-annex packaged up for you, +you can either build it [[fromscratch]], or you can use a handy +prebuilt tarball of the most recent release. + +This tarball should work on most Linux systems. It has basically no +dependencies and is self-contained. + +* i386: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-i386.tar.gz) +* amd64: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz) +* armel: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-armel.tar.gz) + +To use, just unpack the tarball, `cd git-annex.linux` and run `./runshell` +-- this sets up an environment where you can use `git annex`, as well +as everything else included in the bundle. + +Alternatively, you can unpack the tarball, and add the directory to your +`PATH`, or symlink the programs in the directory to a directory in your +PATH. This lets you use `git annex`, without overriding your system's +own versions of git, etc. + +The armel version can be installed on NAS devices and other embedded ARM +linux systems. + +* [[tips/Synology_NAS_and_git_annex]] +* [[forum_thread|forum/new_linux_arm_tarball_build]] + +## autobuilds + +A daily build is also available, thanks to Mesar Hameed and the University +of Bath CS department. + +* i386: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/i386/git-annex-standalone-i386.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/i386/)) +* amd64: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/amd64/git-annex-standalone-amd64.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/amd64/)) +* armel: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/armel/git-annex-standalone-armel.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/armel/)) diff --git a/doc/install/Linux_standalone/comment_1_1adc00aecc51f1e74701bd67cd74155d._comment b/doc/install/Linux_standalone/comment_1_1adc00aecc51f1e74701bd67cd74155d._comment new file mode 100644 index 000000000..8218aa40d --- /dev/null +++ b/doc/install/Linux_standalone/comment_1_1adc00aecc51f1e74701bd67cd74155d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="Are the ARM binaries ARMv6 or ARMv7?" + date="2014-02-26T21:04:44Z" + content=""" +I'm trying to run git-annex on my Raspberry PI, which is an ARMv6 device. But I can't tell if the prebuilt binaries are ARMv6 or ARMv7. The binaries seem to work, but it's not clear to me how early I should expect things to fail if they're compiled for ARMv7. +"""]] diff --git a/doc/install/Linux_standalone/comment_2_7983285b56fd10359a7cc3615fd1e2fe._comment b/doc/install/Linux_standalone/comment_2_7983285b56fd10359a7cc3615fd1e2fe._comment new file mode 100644 index 000000000..996263b18 --- /dev/null +++ b/doc/install/Linux_standalone/comment_2_7983285b56fd10359a7cc3615fd1e2fe._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-02-26T21:07:20Z" + content=""" +The arm binaries are ARMv6; they're built on a Debian armel system. + +Obviously there is a lot of variation in ARM instructions sets. Like Debian, we're shooting for lowest common denominator here. + +(Note: I'm going to be moving your comment and this one to the place you should have posted it...) +"""]] diff --git a/doc/install/NixOS.mdwn b/doc/install/NixOS.mdwn new file mode 100644 index 000000000..115f9fa53 --- /dev/null +++ b/doc/install/NixOS.mdwn @@ -0,0 +1,6 @@ +Users of the [Nix package manager](http://nixos.org/) can install it by running: + + nix-env -i git-annex + +The build status of the package within Nix can be seen on the [Hydra Build +Farm](http://hydra.nixos.org/job/nixpkgs/trunk/gitAndTools.gitAnnex). diff --git a/doc/install/NixOS/comment_1_4e487ddd2654a8a992c1538b9c3bf003._comment b/doc/install/NixOS/comment_1_4e487ddd2654a8a992c1538b9c3bf003._comment new file mode 100644 index 000000000..8424b632d --- /dev/null +++ b/doc/install/NixOS/comment_1_4e487ddd2654a8a992c1538b9c3bf003._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="build failure" + date="2014-06-09T15:13:18Z" + content=""" +Building git-annex with Nix 1.7 fails for me. Error: + + trying https://git.samba.org/?p=rsync.git;a=commitdiff_plain;h=0dedfbce2c1b851684ba658861fe9d620636c56a + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 100 2277 0 2277 0 0 2805 0 --:--:-- --:--:-- --:--:-- 5735 + output path `/nix/store/w6l1c3cdr52arymv3zgwly7razwnsdll-CVE-2014-2855.patch' should have sha256 hash `1jpwwdf07naqxc8fv1lspc95jgk50j5j3wvf037bjay2qzpwjmvf', instead has `0j1pqmwsqc5mh815x28izi4baki2y2r5q8k7ma1sgs4xsgjc4rk8' + building path(s) `/nix/store/85v7c8b3ygpfj8m8bk98kcygf29qcbq7-cacert-20131205.pem.bz2' + cannot build derivation `/nix/store/im9p1y2xbh08yrwp5yggj1ii884wv3ql-rsync-3.1.0.drv': 1 dependencies couldn't be built + killing process 2599 + cannot build derivation `/nix/store/sl48cnm06m7mcqxjfj2b0yv8am3blqr3-git-annex-5.20140517.drv': 1 dependencies couldn't be built + error: build of `/nix/store/sl48cnm06m7mcqxjfj2b0yv8am3blqr3-git-annex-5.20140517.drv' failed + +Someone has an idea what Nix expects me to do in this situation? +"""]] diff --git a/doc/install/OSX.mdwn b/doc/install/OSX.mdwn new file mode 100644 index 000000000..5a1505c60 --- /dev/null +++ b/doc/install/OSX.mdwn @@ -0,0 +1,55 @@ +## git-annex.app + +[[!img /assistant/osx-app.png align=right link=/assistant]] +For easy installation, use the prebuilt app bundle. + +* 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg) +* 10.8.2 Mountain Lion: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2) **warning: not being updated any longer** +* 10.7.5 Lion: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg) **warning: not being updated any longer** + +To run the [[git-annex_assistant|/assistant]], just +install the app, look for the icon, and start it up. + +To use git-annex at the command line, you can add +`git-annex.app/Contents/MacOS` to your `PATH` + +Alternatively, from the command line you can run +`git-annex.app/Contents/MacOS/runshell`, which makes your shell use all the +programs bundled inside the app, including not just git-annex, but git, and +several more. Handy if you don't otherwise have git installed. + +## autobuilds + +[[Joey]] autobuilds the app for Mavericks, thanks to Kevin McKenzie +for hosting the autobuilder. + +* [autobuild of git-annex.dmg](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/git-annex.dmg) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/)) + +## using Homebrew + +git-annex is now [[available in Homebrew|Homebrew]]! + +## using MacPorts + +Install the Haskell Platform from [[http://hackage.haskell.org/platform/mac.html]]. +The version provided by Macports is too old to work with current versions of git-annex. +Then execute + +
+sudo port install git-core ossp-uuid md5sha1sum coreutils gnutls libxml2 libgsasl pkgconfig
+sudo cabal update
+PATH=$HOME/bin:$PATH
+cabal install c2hs git-annex --bindir=$HOME/bin
+
+ +## PATH setup + +Do not forget to add to your PATH variable your ~/bin folder. In your .bashrc, for example: +
+PATH=$HOME/bin:$PATH
+
+ +See also: + +* [[forum/OSX__39__s_haskell-platform_statically_links_things]] +* [[forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set]] diff --git a/doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment b/doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment new file mode 100644 index 000000000..c2b43b2dd --- /dev/null +++ b/doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="Segmentation Fault" + date="2013-01-19T16:10:08Z" + content=""" +I guess my adventure ends here. :'( +"""]] diff --git a/doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment b/doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment new file mode 100644 index 000000000..d0c74d609 --- /dev/null +++ b/doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc" + nickname="Eric" + subject="Updating to latest build" + date="2013-01-25T06:05:35Z" + content=""" +What is the appropriate way to update to the latest build of git-annex using cabal? +"""]] diff --git a/doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment b/doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment new file mode 100644 index 000000000..cc57cbdfb --- /dev/null +++ b/doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="git annex on Snow Leopard" + date="2013-01-25T14:36:52Z" + content=""" +Is there any way I can try to solve or by-pass the Segmentation Fault I commeted before? +"""]] diff --git a/doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment b/doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment new file mode 100644 index 000000000..875db34f1 --- /dev/null +++ b/doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 13" + date="2013-02-05T19:46:29Z" + content=""" +@eric `cabal update && cabal upgrade git-annex` +"""]] diff --git a/doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment b/doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment new file mode 100644 index 000000000..1072dbc39 --- /dev/null +++ b/doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmCmNS-oUgYfNg85-LPuxzTZJUp0sIgprM" + nickname="Jonas" + subject="more homebrew" + date="2013-02-16T19:46:47Z" + content=""" +i had macports installed. then i installed brew, instaled haskell via brew. i needed to set + PATH=$HOME/bin:/usr/local/bin:$PATH +"""]] diff --git a/doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment b/doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment new file mode 100644 index 000000000..05f5654bc --- /dev/null +++ b/doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://launchpad.net/~wincus" + nickname="Juan Moyano" + subject="git annex on Snow Leopard" + date="2013-03-26T16:02:54Z" + content=""" +I'm having the same issue as @Pere, with a newer version of DAV :( + +cabal: Error: some packages failed to install: +DAV-0.3.1 failed during the building phase. The exception was: +ExitFailure 11 +git-annex-4.20130323 depends on shakespeare-css-1.0.3 which failed to install. +persistent-1.1.5.1 failed during the building phase. The exception was: +ExitFailure 11 +persistent-template-1.1.3.1 depends on persistent-1.1.5.1 which failed to +install. +shakespeare-css-1.0.3 failed during the building phase. The exception was: +ExitFailure 11 +yesod-1.1.9.2 depends on shakespeare-css-1.0.3 which failed to install. +yesod-auth-1.1.5.3 depends on shakespeare-css-1.0.3 which failed to install. +yesod-core-1.1.8.2 depends on shakespeare-css-1.0.3 which failed to install. +yesod-default-1.1.3.2 depends on shakespeare-css-1.0.3 which failed to +install. +yesod-form-1.2.1.3 depends on shakespeare-css-1.0.3 which failed to install. +yesod-json-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install. +yesod-persistent-1.1.0.1 depends on shakespeare-css-1.0.3 which failed to +install. +yesod-static-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install. + + + +*Any ideas?* + + +"""]] diff --git a/doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment b/doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment new file mode 100644 index 000000000..0098e745d --- /dev/null +++ b/doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="Snow Leopard Issues" + date="2013-04-14T20:17:17Z" + content=""" +I was able to build snow leopard completely for the first time over last night (it took a very long time to build all the tools and dependancies). Woohoo! + +The way I was able to fully build on a 32-bit 10.6 machine was this + +1. Delete ~/.ghc and ~/.cabal. They were full of random things and were causing problems. +2. `brew uninstall ghc and haskell-platform` +3. `brew update` +4. `brew install git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2` +5. `brew upgrade git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2` (Some of these were already installed/up to date. +6. `brew link libxml2` +7. `brew install haskell-platform` (This takes a long, long time). +8. `cabal update` (assuming you have added `~/.cabal/bin` to your path +9. `cabal install cablal-install` +10. `cabal install c2hs` +11. `cabal install git-annex` + + +It also appears to be running fairly smoothly than it had in the past on a 32-bit SL system. Thats also neat. + +The problem is that it seems to not really work as git annex though, probably due to the error relating you get when you start up the webapp: +Running +`git annex webapp` +The browser starts up, and I get 3 of these errors: +`Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents` + +Pairing with a local computer appears to work to systems running 10.7, but when you complete the process, they never show up in the repository list. + + +Also on a side note, when running `git annex webapp` it triggers the opening of an html file in whatever the default html file handler is. I edit a lot of html, so for me that is usually a text editor. I had to change the file handler to open html files with my web browser for the `git annex webapp` to actually work. Is there a way to change that so that `git annex webapp` uses the default web browser for the system rather than the default html file handler? +"""]] diff --git a/doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment b/doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment new file mode 100644 index 000000000..8955ab20b --- /dev/null +++ b/doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 17" + date="2013-04-16T20:31:10Z" + content=""" +@Bret, the assistant relies on FSEvents pretty heavily. It seems to me your best bet is to upgrade OSX to a version that supports FSEvents. + +You can certainly use the rest of git-annex on Snow Leopard without FSEvents. +"""]] diff --git a/doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment b/doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment new file mode 100644 index 000000000..9d8d8f755 --- /dev/null +++ b/doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="Can't update" + date="2013-04-18T00:58:19Z" + content=""" +The laptop is one of the first macbook pro's with a 32 bit chip, which apple dropped support for in 10.7, so the furthest it can update to is 10.6.x. :( +"""]] diff --git a/doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment b/doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment new file mode 100644 index 000000000..f244951e8 --- /dev/null +++ b/doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 19" + date="2013-04-18T02:05:34Z" + content=""" +sounds like a prime candidate for a nice lightweight linux distro ;) +"""]] diff --git a/doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment b/doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment new file mode 100644 index 000000000..ef273bf7b --- /dev/null +++ b/doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnEgT3Gxm4AAK4zu3ft5-PsUmY6dr1F-gE" + nickname="David" + subject="OSX app bundle" + date="2013-06-05T17:35:49Z" + content=""" +I'm using the annex assistant from the annex bundle for the convenience, but sometimes I use git-annex directly from the command line. I have /Applications/git-annex.app/Contents/MacOS/ in my path, but is there any way you could build the app bundle with the manpage in there so I could add it to my MANPATH? +"""]] diff --git a/doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment b/doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment new file mode 100644 index 000000000..e7d42b534 --- /dev/null +++ b/doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmJdzisfT6DhorwRz0kKJ_9-zQbccCopu4" + nickname="Alejandro" + subject="Macports _iconv" + date="2013-07-18T14:23:02Z" + content=""" +If you get an error like `undefined symbol _iconv for x86_64`, you're most likely using libiconv installed by macports. You can fix this by running + + cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib + +"""]] diff --git a/doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment b/doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment new file mode 100644 index 000000000..7dfa48132 --- /dev/null +++ b/doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 22" + date="2013-07-25T02:19:53Z" + content=""" +Rather than specifying --bindir on the command line for cabal, I edited my ~/.cabal/config to add this line: + + symlink-bindir: /usr/local/bin + +This installs the binaries to ~/.cabal/bin but symlinks them into /usr/local/bin alongside the links that homebrew installs. Additionally, I symlinked /usr/local/bin/git-annex-shell to /usr/local/bin/git-annex which made things work great from remote hosts via ssh. +"""]] diff --git a/doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment b/doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment new file mode 100644 index 000000000..08792aa21 --- /dev/null +++ b/doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="Build failure using Haskel Platform" + date="2013-09-15T18:49:01Z" + content=""" +I get this error when I try to build git-annex using \"cabal install git-annex\" + + [ 34 of 347] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o ) + [ 35 of 347] Compiling Utility.Process ( Utility/Process.hs, dist/build/git-annex/git-annex-tmp/Utility/Process.o ) + [ 36 of 347] Compiling Utility.Network ( Utility/Network.hs, dist/build/git-annex/git-annex-tmp/Utility/Network.o ) + [ 37 of 347] Compiling Utility.SRV ( Utility/SRV.hs, dist/build/git-annex/git-annex-tmp/Utility/SRV.o ) + + Utility/SRV.hs:70:54: + Couldn't match expected type `Maybe + [(Int, Int, Integer, B8.ByteString)]' + with actual type `Either + dns-1.0.0:Network.DNS.Internal.DNSError + [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]' + In the third argument of `maybe', namely `r' + In the second argument of `($)', namely + `maybe [] (orderHosts . map tohosts) r' + In a stmt of a 'do' block: + return $ maybe [] (orderHosts . map tohosts) r + Failed to install git-annex-4.20130909 + cabal: Error: some packages failed to install: + git-annex-4.20130909 failed during the building phase. The exception was: + ExitFailure 1 + +"""]] diff --git a/doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment b/doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment new file mode 100644 index 000000000..4b4bf3eb7 --- /dev/null +++ b/doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.128" + subject="comment 24" + date="2013-09-17T15:56:17Z" + content=""" +@Kristian, a new version of the DNS library has caused this. A workaround is to pass `-f-DNS` to the cabal command. + +I am in the process of adding support for the new DNS library version in git now. + +By the way, please [[file_a_bug|bugs]] if you have a big ugly looking build failure like that, so as to not clutter up this page. +"""]] diff --git a/doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment b/doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment new file mode 100644 index 000000000..2a924e8f9 --- /dev/null +++ b/doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnyMzZZLS1xGW1raqc_9Md6Ksdkvx5rUJU" + nickname="Michael" + subject="confusion with bundled programs" + date="2013-10-02T21:39:11Z" + content=""" +I have fiddled with the fresh (as of Oct 2nd) build of assistant on OS X 10.8.5, and there has been a lot of problems with bundled software + +bundled git is an old 1.7.x version which keeps saying in the daemon logs it is too old to honor .gitignores etc +at the same time I have git 1.8.4 installed through homebrew which works very nicely throughout my system + +I also have homebrew-installed gpg2: + +$ gpg2 --version +gpg (GnuPG) 2.0.21 +libgcrypt 1.5.3 + +(and have briefly experimented with using GPGSuite from gpgtools.org, which kept bailing with invalid autolocate directive in gpg.conf) + +however there is some unidentifiable gpg binary bundled with the assistant, which cannot connect to gpg-agent from gpg2, and doesn't work with GPGSuite (see above) + +is there a way to completely forgo usage of bundled software and have the webapp use whatever is already available on the system? + +"""]] diff --git a/doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment b/doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment new file mode 100644 index 000000000..9a5b9c9c1 --- /dev/null +++ b/doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 27" + date="2013-10-16T09:40:23Z" + content=""" +The [FSevents framework itself has been around since leopard](http://arstechnica.com/apple/2007/10/mac-os-x-10-5/7/). + +[This fsevents wrapper project](https://github.com/rastersize/CDEvents) supports snow leopard and even leopard, maybe it will provide some clues on how it was done. + +I'm guessing it would be worth it, [snow leopard is still the most popular OSX as of April](http://www.patentlyapple.com/patently-apple/2013/04/snow-leopard-remains-the-most-popular-version-of-os-x.html). From my own experience, snow leopard is a huge life extender for 2+ year old hardware. Lion just makes them sluggishly painful to use. + +Maybe someone could volunteer an SL machine for remote development? Sorry, mine are tied down :( +"""]] diff --git a/doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment b/doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment new file mode 100644 index 000000000..cc9b44c1a --- /dev/null +++ b/doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 27" + date="2013-10-16T15:14:53Z" + content=""" +The git-annex assistant uses **file level** FSevents to detect which files have been changed. Would it be possible to make it work with older versions that don't provide file-level events? Probably. The code for BSD kqueue deals with similar limitations in needing to scan the directory to find the files that actually changed. If someone cares about old versions of OSX and wants to do that work I'll happily support you. +"""]] diff --git a/doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment b/doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment new file mode 100644 index 000000000..a672a70c4 --- /dev/null +++ b/doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="dbus support?" + date="2013-10-18T08:24:11Z" + content=""" +Hello, + +I just compiled git-annex using cabal on OS X, and I see there is no dbus support: + + Assistant/Threads/NetWatcher.hs:26:0: + warning: #warning Building without dbus support; will poll for network connection changes + + Assistant/Threads/MountWatcher.hs:33:0: + warning: #warning Building without dbus support; will use mtab polling + +Is this problematic? I see I can install dbus using homebrew. If I do so, will I have dbus support (after recompiling git-annex)? +"""]] diff --git a/doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment b/doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment new file mode 100644 index 000000000..c0552d9d9 --- /dev/null +++ b/doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 29" + date="2013-10-18T15:58:59Z" + content=""" +I think I dragged you out of dev mode for commenting unnecessarily, sorry about that. Apparently, [Lion](http://www.redmondpie.com/os-x-lion-vs-os-x-snow-leopard-head-to-head-performance-showdown/) and [Mountain Lion are fine on older hardware](http://apple.stackexchange.com/questions/58453/will-mountain-lion-make-an-older-computer-run-faster-or-slower). For a while [a daemon cause Lion slowdowns for a day after upgrade](https://discussions.apple.com/message/15719036) for a while, which was enough to cause a reputation. +"""]] diff --git a/doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment b/doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment new file mode 100644 index 000000000..8d7010a1b --- /dev/null +++ b/doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-07-24T15:09:29Z" + content=""" +I've moved some outdated comments about installing on OSX to [[old_comments]]. +And also moved away some comments that helped build the instructions above. +"""]] diff --git a/doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment b/doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment new file mode 100644 index 000000000..9fcf7aa03 --- /dev/null +++ b/doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 30" + date="2013-10-19T15:31:45Z" + content=""" +@Alan you don't need to install dbus on OSX. The polling code will work. On the other hand if you'd like to experiment with installing dbus and report back, perhaps it's worth a try. It's nice when the git-annex assistant can instantly detect when drives are plugged in, and then the network connection changes and react to it. On Linux, dbus gives it that capability. +"""]] diff --git a/doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment b/doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment new file mode 100644 index 000000000..df9134194 --- /dev/null +++ b/doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="dbus and homebrew" + date="2013-10-20T17:25:04Z" + content=""" +I'm trying to build git-annex with dbus support, and even though I installed dbus (through homebrew), at the end of compilation I get the warning about \"building without dbus\". Is there something special I need to do for git-annex to see I have installed dbus? + +(Also, it tells me at the beginning that I don't have gcrypt, but libgcrypt is installed.) +"""]] diff --git a/doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment b/doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment new file mode 100644 index 000000000..290da58f8 --- /dev/null +++ b/doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 32" + date="2013-10-21T22:47:14Z" + content=""" +You probably need to install libdbus dev stuff, and then the haskell dbus library. But it's certainly going to need code changes to make git-annex use dbus in any way on OSX, assuming there are even useful dbus events generated for network connections and drives being mounted on OSX. + +It was saying \"gcrypt\" when it meant \"git-remote-gcrypt\". +"""]] diff --git a/doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment b/doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment new file mode 100644 index 000000000..7e2853a4e --- /dev/null +++ b/doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 33" + date="2013-10-23T11:39:51Z" + content=""" +I installed the haskell DBus library, but it's still not picking it up. Is there some additional option to pass to cabal, or is it supposed to find it automatically? +"""]] diff --git a/doc/install/OSX/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment b/doc/install/OSX/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment new file mode 100644 index 000000000..45b62b770 --- /dev/null +++ b/doc/install/OSX/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac" + nickname="Srinath" + subject="build issue with brew technique on Darwin Kernel Version 13.0.0" + date="2014-02-15T02:17:16Z" + content=""" +Following the Mac OS X brew instructions from the top of the board, I got the following error: + +[5 of 5] Compiling Yesod ( Yesod.hs, dist/build/Yesod.o ) +In-place registering yesod-1.2.5... +Installing library in /Users/srinathv/.cabal/lib/yesod-1.2.5/ghc-7.6.3 +Registering yesod-1.2.5... +Installed yesod-1.2.5 +cabal: Error: some packages failed to install: +git-annex-5.20140210 depends on libxml-sax-0.7.4 which failed to install. +libxml-sax-0.7.4 failed during the configure step. The exception was: +ExitFailure 1 +network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to +install. + + +Then I perused the comments and did: +$brew link libmxl2 --force +$cabal install git-annex --bindir=$HOME/bin + +with success. +"""]] diff --git a/doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment b/doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment new file mode 100644 index 000000000..69f3f0fee --- /dev/null +++ b/doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU" + nickname="Daniel" + subject="comment 3" + date="2013-01-15T15:22:43Z" + content=""" +Installing via the MacPorts method. I ran into this error. + + \"_locale_charset\", referenced from: _localeEncoding in libHSbase-4.5.1.0.a(PrelIOUtils.o) + ld: symbol(s) not found for architecture x86_64 + +I was able to solve and get git-annex to build buy providing the --extra-lib-dirs parameter + + cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib + +Cheers, [Daniel Wozniak](http://woz.io) +"""]] diff --git a/doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment b/doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment new file mode 100644 index 000000000..703f502f7 --- /dev/null +++ b/doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="Snow Leopard" + date="2013-01-18T15:51:48Z" + content=""" +Hi, + +Are there plans to provide a git-annex.app that works on Snow Leopard? + +Currently there are only installers for the Lions. + +http://downloads.kitenet.net/git-annex/OSX/current/ + +Thanks :-) + + +"""]] diff --git a/doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment b/doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment new file mode 100644 index 000000000..f3838e890 --- /dev/null +++ b/doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-12-10T17:00:43Z" + content=""" +For those that care, I've updated my autobuilder to the latest version of haskell-platform 2012.4.0.0 and it appears to be building correctly. +"""]] diff --git a/doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment b/doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment new file mode 100644 index 000000000..c188d8125 --- /dev/null +++ b/doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 5" + date="2013-01-18T17:25:36Z" + content=""" +What we need to provide a Snow Leopard or other version build, is access to a box running that version of OSX, or someone with a box that doesn't mind compiling stuff and setting up the autobuilder (not very hard). +"""]] diff --git a/doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment b/doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment new file mode 100644 index 000000000..a16e4cad0 --- /dev/null +++ b/doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="Snow Leopard" + date="2013-01-18T17:57:40Z" + content=""" +If the process is very automatic I might contribute. I mean, if you tell me, install this and that package and run this script once a week, I might be able to help. I have a MacBook from 2007 with Snow Leopard. I also have macports installed, but I'm not a programmer. +"""]] diff --git a/doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment b/doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment new file mode 100644 index 000000000..3c7e2b8b6 --- /dev/null +++ b/doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 7" + date="2013-01-18T20:16:52Z" + content=""" +If you can get it to build using the instructions for Brew (or MacPorts) on this page, it's easy to get from there to a distributable app. +"""]] diff --git a/doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment b/doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment new file mode 100644 index 000000000..bdc1698b7 --- /dev/null +++ b/doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0" + nickname="Pere" + subject="I couldn't install it on Snow Leopard" + date="2013-01-19T15:04:27Z" + content=""" +Bad news, it looks like I'm not able to install git-annex to my machine: When I run + + sudo cabal install c2hs git-annex --bindir=$HOME/bin + +I get the following error: + + cabal: Error: some packages failed to install: + DAV-0.3 failed during the building phase. The exception was: + ExitFailure 11 + git-annex-3.20130114 depends on yesod-core-1.1.7.1 which failed to install. + yesod-1.1.7.2 depends on yesod-core-1.1.7.1 which failed to install. + yesod-auth-1.1.3 depends on yesod-core-1.1.7.1 which failed to install. + yesod-core-1.1.7.1 failed during the building phase. The exception was: + ExitFailure 11 + yesod-default-1.1.3 depends on yesod-core-1.1.7.1 which failed to install. + yesod-form-1.2.0.2 depends on yesod-core-1.1.7.1 which failed to install. + yesod-json-1.1.2 depends on yesod-core-1.1.7.1 which failed to install. + yesod-persistent-1.1.0.1 depends on yesod-core-1.1.7.1 which failed to + install. + yesod-static-1.1.1.2 depends on yesod-core-1.1.7.1 which failed to install. + +What does *ExitFailure 11* mean? +"""]] diff --git a/doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment b/doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment new file mode 100644 index 000000000..afb733443 --- /dev/null +++ b/doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 9" + date="2013-01-19T16:02:35Z" + content=""" +sig11 is a Segmentation Fault, probably from a C library used by DAV for HTTP in this case. +"""]] diff --git a/doc/install/OSX/old_comments.mdwn b/doc/install/OSX/old_comments.mdwn new file mode 100644 index 000000000..ccb6785fd --- /dev/null +++ b/doc/install/OSX/old_comments.mdwn @@ -0,0 +1 @@ +Moved a bunch of outdated comments here, AFAIK all these issues are fixed. diff --git a/doc/install/OSX/old_comments/comment_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment b/doc/install/OSX/old_comments/comment_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment new file mode 100644 index 000000000..d655da725 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkp-1EQboBDqZ05MxOHNkwNQDM4luWYioA" + nickname="Charles" + subject="comment 10" + date="2012-11-15T13:26:57Z" + content=""" +Installing it with brew, I had to do the following steps before the final `cabal` command: + +* `cabal install c2hs` +* add `$HOME/.cabal/bin` to my `$PATH` (so that c2hs program can be found) +"""]] diff --git a/doc/install/OSX/old_comments/comment_10_798000aab19af2944b6e44dbc550c6fe._comment b/doc/install/OSX/old_comments/comment_10_798000aab19af2944b6e44dbc550c6fe._comment new file mode 100644 index 000000000..675a90eee --- /dev/null +++ b/doc/install/OSX/old_comments/comment_10_798000aab19af2944b6e44dbc550c6fe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 10" + date="2012-06-25T15:38:44Z" + content=""" +@Agustin you should be able to work around that with: cabal install git-annex --flags=-Inotify + +I've fixed it properly for the next release, it should only be using that library on Linux. +"""]] diff --git a/doc/install/OSX/old_comments/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment b/doc/install/OSX/old_comments/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment new file mode 100644 index 000000000..69a4f9128 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE" + nickname="Agustin" + subject="comment 11" + date="2012-06-27T08:54:52Z" + content=""" +Hi @joey! Perfect!... I'll do that then! + +Thanks for your time man! +"""]] diff --git a/doc/install/OSX/old_comments/comment_12_60d13f2c8e008af1041bea565a392c83._comment b/doc/install/OSX/old_comments/comment_12_60d13f2c8e008af1041bea565a392c83._comment new file mode 100644 index 000000000..e2e85aaa9 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_12_60d13f2c8e008af1041bea565a392c83._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHrjHxJAm39x8DR4bnbazQO6H0nMNuY9c" + nickname="Damien" + subject="sha256 alternative" + date="2012-06-30T14:34:11Z" + content=""" +in reply to comment 6: On my Mac (10.7.4) there's `/usr/bin/shasum -a 256 ` command that will produce the same output as `sha256sum `. +"""]] diff --git a/doc/install/OSX/old_comments/comment_13_a6f48c87c2d6eabe379d6e10a6cac453._comment b/doc/install/OSX/old_comments/comment_13_a6f48c87c2d6eabe379d6e10a6cac453._comment new file mode 100644 index 000000000..e5ce62b13 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_13_a6f48c87c2d6eabe379d6e10a6cac453._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHrjHxJAm39x8DR4bnbazQO6H0nMNuY9c" + nickname="Damien" + subject="gnu commands" + date="2012-07-01T17:03:57Z" + content=""" +…and another approach to the same problem: apparently git-annex also relies on the GNU coreutils (for instance, when doing `git annex get .`, `cp` complains about `illegal option -- -`). I do have the GNU coreutils installed with Homebrew, but they are all prefixed with `g`. So maybe you should try `gsha256sum` and `gcp` before `sha256sum` and `cp`, that seems like a more general solution. +"""]] diff --git a/doc/install/OSX/old_comments/comment_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment b/doc/install/OSX/old_comments/comment_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment new file mode 100644 index 000000000..35e0bb6ed --- /dev/null +++ b/doc/install/OSX/old_comments/comment_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 14" + date="2012-07-04T12:43:54Z" + content=""" +@Damien, hmm, it should not be using any cp options, unless when it was built there was a cp in the path that supported some option like -p. Can you check with --debug what cp parameters it's trying to use? + + +"""]] diff --git a/doc/install/OSX/old_comments/comment_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment b/doc/install/OSX/old_comments/comment_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment new file mode 100644 index 000000000..0005328c4 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 15" + date="2012-07-04T13:14:00Z" + content=""" +git-annex will now fall back to slower pure Haskell hashing code if `sha256sum`, etc programs are not in PATH. I'd still recommend installing the coreutils, as they're probably faster. + +(The `shasum` command seems to come from a perl library, so I have not tried to make git-annex use that one.) +"""]] diff --git a/doc/install/OSX/old_comments/comment_16_af6fe3540032cdf4400478de87771058._comment b/doc/install/OSX/old_comments/comment_16_af6fe3540032cdf4400478de87771058._comment new file mode 100644 index 000000000..5da4b22c6 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_16_af6fe3540032cdf4400478de87771058._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="Compiling git-annex on OSX (with 32 bit Haskell)" + date="2012-07-24T03:26:45Z" + content=""" +I came across an issue when following the instructions here: + + +I'm compiling the 'assistant' branch (522f568450a005ae81b24f63bb37e75320b51219). + + +The pre-compiled version of Haskell for OSX recommends the 32 bit installer, however git-annex compiles + +> Utility/libdiskfree.o Utility/libkqueue.o Utility/libmounts.o + +as 64 bit. The 'make' command fails on linking 32- and 64-bit code. + +So... I made a small change to the Makefile + +> CFLAGS=-Wall + +becomes + +> CFLAGS=-Wall -m32 + +I don't know if there is an easy way to programmatically check for this, or even if you'd want to spend time doing it, but it might help someone else out. + + +"""]] diff --git a/doc/install/OSX/old_comments/comment_17_8d3a0596db67108041728b20f2790f31._comment b/doc/install/OSX/old_comments/comment_17_8d3a0596db67108041728b20f2790f31._comment new file mode 100644 index 000000000..782f2fd75 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_17_8d3a0596db67108041728b20f2790f31._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 17" + date="2012-07-24T15:03:49Z" + content=""" +The instructions say to use cabal for a reason -- it's more likely to work. But I have made the Makefile detect the mismatched GHC and C compiler and force the C compiler to 32 bit. +"""]] diff --git a/doc/install/OSX/old_comments/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment b/doc/install/OSX/old_comments/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment new file mode 100644 index 000000000..1148a87ca --- /dev/null +++ b/doc/install/OSX/old_comments/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://www.schleptet.net/~cfm/" + ip="64.30.148.100" + subject="comment 1" + date="2011-08-30T14:31:36Z" + content=""" +You can also use Homebrew instead of MacPorts. Homebrew's `haskell-platform` is up-to-date, too: + + brew install haskell-platform git ossp-uuid md5sha1sum coreutils pcre + ln -s /usr/local/include/pcre.h /usr/include/pcre.h + +As of this writing, however, Homebrew's `md5sha1sum` has a broken mirror. I wound up getting that from MacPorts anyway. +"""]] diff --git a/doc/install/OSX/old_comments/comment_2_0327c64b15249596add635d26f4ce67f._comment b/doc/install/OSX/old_comments/comment_2_0327c64b15249596add635d26f4ce67f._comment new file mode 100644 index 000000000..5768d8b93 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_2_0327c64b15249596add635d26f4ce67f._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkEUhIcw37X2Kh-dznSMIb9Vgcq0frfdWs" + nickname="Ethan" + subject="GHC 7" + date="2012-03-28T19:06:51Z" + content=""" +The Haskell Platform installer for OSX uses GHC 7.0.4, which doesn't seem able to support the current version of git-annex. + +Cabal throws a very cryptic error about not being able to use the proper base package. + +I was able to install it by + +1. cloning the repo +2. merging the ghc7.0 branch +3. resolving merge conflicts in git-annex.cabal +4. cabal install git-annex.cabal + +(Note I also tried this with homebrew and had similar results) +"""]] diff --git a/doc/install/OSX/old_comments/comment_2_7683740a98182de06cb329792e0c0a25._comment b/doc/install/OSX/old_comments/comment_2_7683740a98182de06cb329792e0c0a25._comment new file mode 100644 index 000000000..113ef687a --- /dev/null +++ b/doc/install/OSX/old_comments/comment_2_7683740a98182de06cb329792e0c0a25._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY" + nickname="Douglas" + subject="setup: standalone/macos/git-annex.app/Contents/Info.plist: does not exist" + date="2012-10-06T14:46:55Z" + content=""" +I tried installing with cabal and homebrew on Mountain Lion. After cabal install git-annex I get: + + Linking dist/build/git-annex/git-annex ... + Installing executable(s) in /Users/dfc/.cabal/bin + setup: standalone/macos/git-annex.app/Contents/Info.plist: does not exist + cabal: Error: some packages failed to install: + git-annex-3.20121001 failed during the final install step. The exception was: + ExitFailure 1 + + +There is no directory named macos inside of standalone: + + jumbo:git-annex-3.20121001 dfc$ ls -l standalone/ + total 112 + -rw-r--r--+ 1 dfc staff 55614 Oct 6 10:40 licences.gz + drwxr-xr-x+ 6 dfc staff 204 Oct 6 10:40 linux + drwxr-xr-x+ 3 dfc staff 102 Oct 6 10:40 osx + +"""]] diff --git a/doc/install/OSX/old_comments/comment_34_c9362141d15a2f68a75df9f8bfe29da0._comment b/doc/install/OSX/old_comments/comment_34_c9362141d15a2f68a75df9f8bfe29da0._comment new file mode 100644 index 000000000..65a7e0ea7 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_34_c9362141d15a2f68a75df9f8bfe29da0._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl-xMSPoRHcT5d2nAc1K8pWVi-AexKkYik" + nickname="Ralf" + subject="Mac OS X Maverick - symbol not found" + date="2013-10-27T21:02:45Z" + content=""" +Just to mention that the beta dated 24 Oct 2013 and Joey's autobuild of 27 Oct both don't start with the following error message for git-annex, git-annex-webapp under Mac OS X 10.9 Maverick with latest XCode installed: + + dyld: Symbol not found: _objc_debug_taggedpointer_mask + Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I + in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + + Trace/BPT trap: 5 + +Many thanks. Can I help? +"""]] diff --git a/doc/install/OSX/old_comments/comment_35_8106196c3fef70652cb2106e2d5857db._comment b/doc/install/OSX/old_comments/comment_35_8106196c3fef70652cb2106e2d5857db._comment new file mode 100644 index 000000000..697dafa0b --- /dev/null +++ b/doc/install/OSX/old_comments/comment_35_8106196c3fef70652cb2106e2d5857db._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 35" + date="2013-10-27T21:06:57Z" + content=""" +We do not yet have an autobuild for 10.9. You can build from source: +"""]] diff --git a/doc/install/OSX/old_comments/comment_3_47c682a779812dda77601c24a619923c._comment b/doc/install/OSX/old_comments/comment_3_47c682a779812dda77601c24a619923c._comment new file mode 100644 index 000000000..251375cbe --- /dev/null +++ b/doc/install/OSX/old_comments/comment_3_47c682a779812dda77601c24a619923c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="ghc 7.0" + date="2012-03-28T19:18:58Z" + content=""" +You did the right thing, although just checking out the ghc-7.0 branch will avoid merge conflicts. I am trying to keep it fairly close to up-to-date. +"""]] diff --git a/doc/install/OSX/old_comments/comment_3_733147cebe501c60f2141b711f1d7f24._comment b/doc/install/OSX/old_comments/comment_3_733147cebe501c60f2141b711f1d7f24._comment new file mode 100644 index 000000000..51e667ab6 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_3_733147cebe501c60f2141b711f1d7f24._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnnIQkoUQo4RYzjUNyiB3v6yJ5aR41WG8k" + nickname="Markus" + subject="Updated install instructions with homebrew" + date="2012-08-07T06:46:47Z" + content=""" +To install git annex with homebrew simply do: + + brew update + brew install haskell-platform git ossp-uuid md5sha1sum coreutils pcre + cabal install git-annex + +Then link the binary to your `PATH` e.g. with + + ln -s ~/.cabal/bin/git-annex* /usr/local/bin/ +"""]] diff --git a/doc/install/OSX/old_comments/comment_3_b090f40fe5a32e00b472a5ab2b850b4a._comment b/doc/install/OSX/old_comments/comment_3_b090f40fe5a32e00b472a5ab2b850b4a._comment new file mode 100644 index 000000000..a437704a3 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_3_b090f40fe5a32e00b472a5ab2b850b4a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.149" + subject="comment 3" + date="2012-10-06T21:05:45Z" + content=""" +@Douglas, I've fixed that in git. FWIW, the program is installed before that point. Actually, I am leaning toward not having cabal install that plist file at all. +"""]] diff --git a/doc/install/OSX/old_comments/comment_3_fc092412e99cf4c5f095b0ef710bc4de._comment b/doc/install/OSX/old_comments/comment_3_fc092412e99cf4c5f095b0ef710bc4de._comment new file mode 100644 index 000000000..47ad9feaf --- /dev/null +++ b/doc/install/OSX/old_comments/comment_3_fc092412e99cf4c5f095b0ef710bc4de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 17" + date="2012-07-24T06:33:13Z" + content=""" +@a-or-b that issue is logged here [[bugs/subtle build issue on OSX 10.7 and Haskell Platform (if you have the 32bit version installed)]], you can use cabal to build and install git-annex and it will detect if its 32 or 64bit automatically. +"""]] diff --git a/doc/install/OSX/old_comments/comment_4_d513e21512a9b207983d38abf348d00f._comment b/doc/install/OSX/old_comments/comment_4_d513e21512a9b207983d38abf348d00f._comment new file mode 100644 index 000000000..049f7e962 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_4_d513e21512a9b207983d38abf348d00f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm_-2XlXNyd6cCLI4n_jaBNqVUOWwJquko" + nickname="David" + subject="installing via homebrew" + date="2012-09-05T11:11:55Z" + content=""" +I had to: + + cabal update + +before: + + cabal install git-annex + + +"""]] diff --git a/doc/install/OSX/old_comments/comment_4_d68c36432c7be3f4a76f4f0d7300bac9._comment b/doc/install/OSX/old_comments/comment_4_d68c36432c7be3f4a76f4f0d7300bac9._comment new file mode 100644 index 000000000..b274707fb --- /dev/null +++ b/doc/install/OSX/old_comments/comment_4_d68c36432c7be3f4a76f4f0d7300bac9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmY_4MvT5yEeztrS7UIJseStUe4mtgp6YE" + nickname="Сергей" + subject="Have error" + date="2012-10-10T11:47:09Z" + content=""" +[ 98 of 248] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o ) +[ 99 of 248] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o ) + +Utility/Url.hs:111:88: + Couldn't match expected type `Maybe URI' with actual type `URI' + In the second argument of `fromMaybe', namely + `(newURI `relativeTo` u)' + In the expression: fromMaybe newURI (newURI `relativeTo` u) + In an equation for `newURI_abs': + newURI_abs = fromMaybe newURI (newURI `relativeTo` u) +cabal: Error: some packages failed to install: +git-annex-3.20121009 failed during the building phase. The exception was: +ExitFailure 1 +"""]] diff --git a/doc/install/OSX/old_comments/comment_4_e6109a964064a2a799768a370e57801d._comment b/doc/install/OSX/old_comments/comment_4_e6109a964064a2a799768a370e57801d._comment new file mode 100644 index 000000000..be3ba2be4 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_4_e6109a964064a2a799768a370e57801d._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkO9tsPZkAxEulq2pGCdwz4md-LqB0RcMw" + nickname="Reimund" + subject="Problems with Base & Crypto" + date="2012-04-25T22:56:18Z" + content=""" +I got the following error message trying to install git-annex: + + cabal: cannot configure git-annex-3.20120418. It requires base >=4.5 && <5 + For the dependency on base >=4.5 && <5 there are these packages: base-4.5.0.0. + However none of them are available. + base-4.5.0.0 was excluded because of the top level dependency base -any + +These are the steps I performed to make it work + +1. Download [Ghc 7.4](http://www.haskell.org/ghc/download). +2. Run `sudo cabal install git-annex --bindir=$HOME/bin`. +3. Compilation of the Crypto-4.2.4 dependency failed since it's not updated to work with Ghc 7.4. You need to patch SHA2.hs (steps below). +4. Run `sudo cabal install git-annex --bindir=$HOME/bin` a second time. + +The steps I did to patch the SHA2.hs file in Crypto-4.2.4: + +1. `cabal unpack crypto-4.2.4` +2. `cd Crypto-4.2.4` +3. `patch -p1 < crypto-4.2.4-ghc-7.4.patch` +4. `sudo cabal install`. + +PS: I used [this patchfile](http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/dev-haskell/crypto/files/crypto-4.2.4-ghc-7.4.patch?revision=1.1). +Then I did the last step a third time. +"""]] diff --git a/doc/install/OSX/old_comments/comment_5_50777853f808d57b957f8ce9a0f84b3d._comment b/doc/install/OSX/old_comments/comment_5_50777853f808d57b957f8ce9a0f84b3d._comment new file mode 100644 index 000000000..eca176178 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_5_50777853f808d57b957f8ce9a0f84b3d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHrjHxJAm39x8DR4bnbazQO6H0nMNuY9c" + nickname="Damien" + subject="sha256" + date="2012-06-01T16:13:05Z" + content=""" +If you're missing the `sha256sum` command with Homebrew, it's provided by `coreutils`. You have to change your `$PATH` before running `cabal install git-annex.cabal`: + + PATH=\"$(brew --prefix coreutils)/libexec/gnubin:$PATH\" +"""]] diff --git a/doc/install/OSX/old_comments/comment_5_626a4b4bf302d4ae750174f860402f70._comment b/doc/install/OSX/old_comments/comment_5_626a4b4bf302d4ae750174f860402f70._comment new file mode 100644 index 000000000..1b79a11e6 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_5_626a4b4bf302d4ae750174f860402f70._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.248.164" + subject="comment 5" + date="2012-10-10T15:34:23Z" + content=""" +@Сергей, I've fixeed that in git. +"""]] diff --git a/doc/install/OSX/old_comments/comment_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment b/doc/install/OSX/old_comments/comment_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment new file mode 100644 index 000000000..5cb813776 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 6" + date="2012-06-01T17:24:29Z" + content=""" +Last night I made it look in /opt/local/libexec/gnubin .. if there's another directory it could look in, let me know. I am reluctant to make it run the brew command directly. +"""]] diff --git a/doc/install/OSX/old_comments/comment_7_2ce7acab15403d3f993cec94ec7f3bc6._comment b/doc/install/OSX/old_comments/comment_7_2ce7acab15403d3f993cec94ec7f3bc6._comment new file mode 100644 index 000000000..32093ee51 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_7_2ce7acab15403d3f993cec94ec7f3bc6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://www.davidhaslem.com/" + nickname="David" + subject="comment 7" + date="2012-06-19T04:41:27Z" + content=""" +$(brew --prefix) should, in most cases, be /usr/local. That's the recommended install location for homebrew. + +I already had git installed and homebrew as my package manager - my install steps were as follows: + +1. brew install haskell-platform ossp-uuid md5sha1sum coreutils pcre +2. PATH=\"$(brew --prefix coreutils)/libexec/gnubin:$PATH\" cabal install git-annex + +"""]] diff --git a/doc/install/OSX/old_comments/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment b/doc/install/OSX/old_comments/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment new file mode 100644 index 000000000..cd128a6f1 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE" + nickname="Agustin" + subject="Installation not working on OS X 10.6.8" + date="2012-06-25T02:21:40Z" + content=""" +I try installing with brew because I already had brew setup in my machine, but all run ok but when I try to run cabal install git-annex I got an error with the hinotify-0.3.2 library complaining about a header file. + +Full trace: + +~~~ +sudo cabal install git-annex +Resolving dependencies... +Configuring hinotify-0.3.2... +Building hinotify-0.3.2... +Preprocessing library hinotify-0.3.2... +INotify.hsc:35:25: error: sys/inotify.h: No such file or directory +INotify.hsc: In function ‘main’: +INotify.hsc:259: error: invalid use of undefined type ‘struct inotify_event’ +INotify.hsc:260: error: invalid use of undefined type ‘struct inotify_event’ +INotify.hsc:261: error: invalid use of undefined type ‘struct inotify_event’ +INotify.hsc:262: error: invalid use of undefined type ‘struct inotify_event’ +INotify.hsc:265: error: invalid use of undefined type ‘struct inotify_event’ +INotify.hsc:266: error: invalid application of ‘sizeof’ to incomplete type ‘struct inotify_event’ +compiling dist/build/System/INotify_hsc_make.c failed (exit code 1) +command was: /usr/bin/gcc -c dist/build/System/INotify_hsc_make.c -o dist/build/System/INotify_hsc_make.o -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=704 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/directory-1.1.0.2/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/unix-2.5.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/old-time-1.1.0.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/bytestring-0.9.2.1/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/base-4.5.0.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/include/ +cabal: Error: some packages failed to install: +git-annex-3.20120624 depends on hinotify-0.3.2 which failed to install. +hinotify-0.3.2 failed during the building phase. The exception was: +ExitFailure 1 +~~~ + +Anyone has an idea how can I solve this. + +Thanks for the time! + +Agustin + +"""]] diff --git a/doc/install/OSX/old_comments/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment b/doc/install/OSX/old_comments/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment new file mode 100644 index 000000000..70fbc6c3c --- /dev/null +++ b/doc/install/OSX/old_comments/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE" + nickname="Agustin" + subject="For the moment" + date="2012-06-25T02:51:10Z" + content=""" +Hi Joey! I just comment that I could not install it but the issue is with the last version (the one you just release today, so no problem!! man on sunday?? you're awesome!!!) so I installed the previous one and no problem at all + +Thanks for all the efford and if you need me to try os whatever, feel free to ask! + +Thanks again + +Agustin +"""]] diff --git a/doc/install/OSX/old_comments/comment_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment b/doc/install/OSX/old_comments/comment_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment new file mode 100644 index 000000000..faa7b1b43 --- /dev/null +++ b/doc/install/OSX/old_comments/comment_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBEsNDl_6O4rHb2en3I0-fg-6fUxglaRQ" + nickname="chee" + subject="Recent install for OS X" + date="2012-11-13T04:40:05Z" + content=""" +if you are having trouble installing with `cabal install git-annex` at the moment, trouble of the XML kind, you'll need to do a couple things: + +`brew update` +`brew install libxml2` +`cabal update` +`cabal install libxml --extra-include-dirs=/usr/local/Cellar/libxml2/2.8.0/include/libxml2 --extra-lib-dirs=/usr/local/Cellar/libxml2/2.8.0/lib` + +well, then i hit a brick wall. + +well. + +I got it to work by manually symlinking from `../Cellar/libxml2/2.8.0/lib/`* into `/usr/local` and from `../../Cellar/libxml2/2.8.0/lib/` to `/usr/local/pkgconfig`, but i can't recommend it or claim to be too proud about it all. + +OS X already has an old libxml knocking around so this might ruin everything for me. + +let's find out ! +"""]] diff --git a/doc/install/ScientificLinux5.mdwn b/doc/install/ScientificLinux5.mdwn new file mode 100644 index 000000000..52d83f0d9 --- /dev/null +++ b/doc/install/ScientificLinux5.mdwn @@ -0,0 +1,62 @@ +For SL6/CentOS6 install the EPEL repo and yum install git-annex. + +I was waiting for my backups to be done hence this article, as I was using +_git-annex_ to manage my files and I decided I needed to have +git-annex on a SL5 based machine. SL5 is just an opensource +clone/recompile of RHEL5. + +I haven't tried to install the newer versions of Haskell Platform and +GHC in a while on SL5 to install git-annex. But the last time I checked +when GHC7 was out, it was a pain to install GHC on SL5. + +However I have discovered that someone has gone through the trouble of +packaging up GHC and Haskell Platform for RHEL based distros. + +* - Packaged GHC and Haskell Platform + RPM's for RHEL based systems. + +I'm primarily interested in installing _git-annex_ on SL5 based +systems. The installation process goes as such... + +First install GHC and Haskell Platform (you need root for these +following steps) + + $ wget http://sherkin.justhub.org/el5/RPMS/x86_64/justhub-release-2.0-4.0.el5.x86_64.rpm + $ rpm -ivh justhub-release-2.0-4.0.el5.x86_64.rpm + $ yum install haskell + +The RPM's don't place the files in /usr/bin, so you must add the +following to your .bashrc (from here on you don't need root if you +don't want things to be system wide) + + $ export PATH=/usr/hs/bin:$PATH + +Once the packages are installed and are in your execution path, using +cabal to configure and build git-annex just makes life easier, it +should install all the needed dependancies. + + $ cabal update + $ git clone git://git.kitenet.net/git-annex + $ cd git-annex + $ make git-annex.1 + $ cabal configure + $ cabal build + $ cabal install + +Or if you want to install it globallly for everyone (otherwise it will +get installed into $HOME/.cabal/bin) + + $ cabal install --global + +The above will take a while to compile and install the needed +dependancies. I would suggest any user who does should run the tests +that comes with git-annex to make sure everything is functioning as +expected. + +I haven't had a chance or need to install git-annex on a SL6 based +system yet, but I would assume something similar to the above steps +would be required to do so. + +The above is almost a cut and paste of , the above could probably be refined, it was what worked for me on SL5. Please feel free to re-edit and chop out or add useless bits of text in the above! + +Note: from the minor testing, it appears the compiled binaries from SL5 will work on SL6. diff --git a/doc/install/Ubuntu.mdwn b/doc/install/Ubuntu.mdwn new file mode 100644 index 000000000..fde0e1c12 --- /dev/null +++ b/doc/install/Ubuntu.mdwn @@ -0,0 +1,44 @@ +## Saucy + + sudo apt-get install git-annex + +Warning: The version of git-annex shipped in Ubuntu Saucy had +[a bug that can cause problems when creating repositories using the webapp](http://git-annex.branchable.com/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/). + +## Raring + + sudo apt-get install git-annex + +Note: This version is too old to include the [[assistant]] or its WebApp, +but is otherwise usable. + +## Precise + + sudo apt-get install git-annex + +Note: This version is too old to include the [[assistant]] or its WebApp, +but is otherwise usable. + +## Precise PPA + + + +A newer version of git-annex, including the [[assistant]] and WebApp. +(Maintained by François Marier) + + sudo add-apt-repository ppa:fmarier/git-annex + sudo apt-get update + sudo apt-get install git-annex + +If you don't have add-apt-repository installed run this command first: + + sudo apt-get install software-properties-common python-software-properties + + +## Oneiric + + sudo apt-get install git-annex + +Warning: The version of git-annex shipped in Ubuntu Oneiric +had [a bug that prevents upgrades from v1 git-annex repositories](https://bugs.launchpad.net/ubuntu/+source/git-annex/+bug/875958). +If you need to upgrade such a repository, get a newer version of git-annex. diff --git a/doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment b/doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment new file mode 100644 index 000000000..d598adfba --- /dev/null +++ b/doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkdiXn5s1wX2Zncy1S7_h-yPTv2gt0bmmY" + nickname="Jacob" + subject="comment 10" + date="2013-10-16T11:43:36Z" + content=""" +would be great to get the PPA updated with the latest git-annex; i'm finding synchronisation bugs (ie. updates made to word documents aren't replicated), and discovered its rather old now. +"""]] diff --git a/doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment b/doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment new file mode 100644 index 000000000..68a889176 --- /dev/null +++ b/doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="fmarier" + ip="207.134.53.206" + subject="Re: comment 10" + date="2013-10-16T13:43:37Z" + content=""" +Jacob: make sure you have the right URL for the PPA: https://launchpad.net/~fmarier/+archive/git-annex + +It used to be in my main PPA, now it's in a separate PPA by itself. The package was removed from the original PPA (hence it won't update) but is fully up to date in the new one. +"""]] diff --git a/doc/install/Ubuntu/comment_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment b/doc/install/Ubuntu/comment_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment new file mode 100644 index 000000000..7cbf8c0ae --- /dev/null +++ b/doc/install/Ubuntu/comment_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Raring?" + date="2013-11-01T20:28:04Z" + content=""" +I'm also on Raring and the latest version available is 3.20121112ubuntu4, nearly a year old. The PPA is only for Precise. The tarball is a daily snapshot, and I would much rather run a released version right now. What can I do? Can't the PPA be built automatically for Raring and Saucy? +"""]] diff --git a/doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment b/doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment new file mode 100644 index 000000000..3b48bb406 --- /dev/null +++ b/doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 1" + date="2013-05-20T15:53:25Z" + content=""" +Note that the fmarier ppa includes more than just git-annex. I've asked the author if he could segregate git-annex into a separate ppa. +"""]] diff --git a/doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment b/doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment new file mode 100644 index 000000000..2d8221be1 --- /dev/null +++ b/doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQ7ZdQxAps4v0cl5J3wKGWD8243Gy8-m0" + nickname="Phil" + subject="PPA Package Pinning" + date="2013-05-23T21:18:14Z" + content=""" +@Pedro, see for blocking all packages except git-annex from François's repo. +"""]] diff --git a/doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment b/doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment new file mode 100644 index 000000000..6d47d49be --- /dev/null +++ b/doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="New PPA only contains git-annex" + date="2013-06-15T07:45:13Z" + content=""" +As Pedro suggested, I've moved my git-annex backport to a separate PPA with only git-annex and the 220 Haskell packages it depends on. +"""]] diff --git a/doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment b/doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment new file mode 100644 index 000000000..04992f31e --- /dev/null +++ b/doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo" + nickname="Jeff" + subject="Packages way out of date" + date="2013-07-27T19:02:38Z" + content=""" +I'm setting up git-annex for myself (wanting to use the assistant to build myself a replacement for dropbox/box/ownCloud, etc.) and I installed the ubuntu package. Unfortunately, it is way out of date (3.20120406: amd64 i386). I didn't think to check the version. It's deceiving as the UI's are all the same, but it doesn't seem to work at all (syncing fails to remote servers, odd things happen with symlinking files to git object files, changing file permissions). + +It gives a bad first intro into git-annex on ubuntu (*nix?) machines. It might be best just to point people at the cabal install for now so we get the lastest and greatest. + +Anyway, thanks for the great tool, I'm looking forward to using it. +"""]] diff --git a/doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment b/doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment new file mode 100644 index 000000000..fc525af96 --- /dev/null +++ b/doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 5" + date="2013-07-27T20:12:33Z" + content=""" +Jeff, AFAIK the 3.20120406 in precise does not include the assistant at all. The Precise PPA is well up-to-date. +I don't think git-annex has anyone in Ubuntu updating the package, so it's whatever version is synced periodically from Debian. + +(AFAICS, all the problems Jeff had were due to manually creating an indirect mode repository when he expected direct mode.) +"""]] diff --git a/doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment b/doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment new file mode 100644 index 000000000..3f9a2fd19 --- /dev/null +++ b/doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo" + nickname="Jeff" + subject="comment 6" + date="2013-07-27T21:51:11Z" + content=""" +Ah, does it only have the webapp? I was able to boot the webapp and see messages, and it looked mostly the same, I assumed it was broken since no syncing was happening, but that would be due to the assistant not being there. + +I guess it's hard as a new user that goes straight for the easy/out-of-the box solution, via the assistant, after watching your video on it. I just assumed things were broken since I was seeing slightly different things. I didn't understand that the assistant was separate from the webapp (and was missing). + +Maybe mentioning the minimum required version on the assistant page to at least prompt users to check the version they're getting? I assumed following the link to the install guide, and installing the package for Ubuntu, would give me what I needed. + + +"""]] diff --git a/doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment b/doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment new file mode 100644 index 000000000..2cc1f6652 --- /dev/null +++ b/doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo" + nickname="Jeff" + subject="comment 7" + date="2013-07-27T21:53:45Z" + content=""" +I see how I missed this page too. I just saw the `apt-get install git-annex` and didn't even register Ubuntu as a link with more information. +"""]] diff --git a/doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment b/doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment new file mode 100644 index 000000000..d51ac5345 --- /dev/null +++ b/doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 8" + date="2013-07-27T21:53:57Z" + content=""" +The webapp is part of the assistant. I was told Precise didn't have it, but IIRC they were working on fixing that build, and perhaps that has happened now. +"""]] diff --git a/doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment b/doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment new file mode 100644 index 000000000..828b80e39 --- /dev/null +++ b/doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/2eeca722-8d1c-41fe-8fda-13af7eaff6ae" + nickname="Diggory" + subject="Outdated in 13.04" + date="2013-10-08T16:36:10Z" + content=""" +13.04 Raring also has fairly outdated packages: 3.20121112ubuntu4 +Is there a PPA or some such for this? I suppose since Saucy will be out soon this is less critical, but would still be useful. + +These don't have direct mode, which (I think; I haven't tested it yet) is the feature I've been waiting for. +"""]] diff --git a/doc/install/Windows.mdwn b/doc/install/Windows.mdwn new file mode 100644 index 000000000..79aaace92 --- /dev/null +++ b/doc/install/Windows.mdwn @@ -0,0 +1,39 @@ +git-annex now does Windows! + +* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed) +* Then, [install git-annex](https://downloads.kitenet.net/git-annex/windows/current/) + +This port is now in reasonably good shape for command-line use of +git-annex. The assistant and webapp are also usable. There are some known +problems and parts that don't work. See [[todo/windows_support]] for +current status. + +The autobuilder is not currently able to run the test suite, so +testing git-annex on Windows is up to you! To check that the build of +git-annex works in your Windows system, you are encouraged to run the test +suite before using git-annex on real data. After installation, run `git +annex test`. There will be a lot of output; the important thing is that it +should end with "All tests passed". + +## autobuilds + +A daily build is also available, thanks to Yury V. Zaytsev and +[NEST](http://nest-initiative.org/). + +* [download](https://downloads.kitenet.net/git-annex/autobuild/windows/) ([build logs](https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/)) + +## building it yourself + +To build git-annex from source on Windows, you need to install +the Haskell Platform, Mingw, and Cygwin. Use Cygwin to install: +gcc rsync git wget ssh gnupg + +Once the prerequisites are installed, run: + + cabal update + git clone git://git-annex.branchable.com/ gitannex + cd gitannex + build + +(To build the git-annex installer, you also need to install the NulSoft +installer system.) diff --git a/doc/install/cabal.mdwn b/doc/install/cabal.mdwn new file mode 100644 index 000000000..3270dd0f9 --- /dev/null +++ b/doc/install/cabal.mdwn @@ -0,0 +1,58 @@ +As a haskell package, git-annex can be installed using cabal. + +This involves building a lot of haskell packages from source, and so it has +a lot of moving parts, and it's not uncommon for it to be broken from time +to time. + +If you are not comfortable tracking down and dealing with library build +problems, installing git-annex with cabal is probably not the right choice +for you! + +## prerequisites + +Start by installing the [Haskell Platform][]. In Debian, this is as +simple as: + + sudo apt-get install haskell-platform + + [Haskell Platform]: http://hackage.haskell.org/platform/ + +## minimal build + +This builds git-annex without some features that require C libraries, that +can be harder to get installed. This is plenty to get started using it, +although it does not include the assistant or webapp. + + cabal update + PATH=$HOME/bin:$PATH + cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns" + +## full build + +To build with all features enabled, including the assistant and webapp, +you will need to install several C libraries and their headers, +including libgnutls, libgsasl, libxml2, and zlib. Then run: + + cabal update + PATH=$HOME/bin:$PATH + cabal install c2hs --bindir=$HOME/bin + cabal install git-annex --bindir=$HOME/bin + +## building from git checkout + +But maybe you want something newer (or older). Then [[download]] the version +you want, and use cabal as follows inside its source tree: + + cabal update + PATH=$HOME/bin:$PATH + cabal install c2hs --bindir=$HOME/bin + cabal install --only-dependencies + cabal configure + cabal build + cabal install --bindir=$HOME/bin + +## EKG + +When building with cabal, you can optionally enable the +[[EKG monitoring interface|ekg]]. This is great for debugging resource +usage problems. diff --git a/doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment b/doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment new file mode 100644 index 000000000..5b813baba --- /dev/null +++ b/doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 10" + date="2013-07-27T17:49:07Z" + content=""" +@Henning; see the [[OSX]] page for full installation instructions for OSX. Which include all the neccesary brew incantations. +"""]] diff --git a/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment b/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment new file mode 100644 index 000000000..94919710f --- /dev/null +++ b/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA" + nickname="Gregor" + subject="Installation on tonidoplug" + date="2013-08-03T07:19:54Z" + content=""" +I tried various ways to install git-annex on my [TonidoPlug](http://www.tonidoplug.com/). + +System Info: + + root@TonidoPlug2:~# uname -a + Linux TonidoPlug2 2.6.31.8-topkick1281p2-001-004-20101214 #1 Thu Jun 16 10:06:20 CST 2011 armv5tel GNU/Linux + +`apt-get` didn't work. + + root@TonidoPlug2:~# apt-get install git-annex + Reading package lists... Done + Building dependency tree + Reading state information... Done + E: Unable to locate package git-annex + +The Linux standalone installation results in an error message like this, when calling `git-annex` (or `git annex`) + + ~$ git-annex.linux/git-annex + /home/gitolite/git-annex.linux/bin/git-annex: 1: Syntax error: \")\" unexpected + +(git-annex.linux/bin/git-annex is a binary file and works fine on other distros) + +When installing with cabal, I get the error message (tried as root and gitolite user) + + ~$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\" + Resolving dependencies... + cabal: cannot configure git-annex-4.20130802. It requires base >=4.5 && <4.8 + For the dependency on base >=4.5 && <4.8 there are these packages: + base-4.5.0.0, base-4.5.1.0, base-4.6.0.0 and base-4.6.0.1. However none of + them are available. + base-4.5.0.0 was excluded because of the top level dependency base -any + base-4.5.1.0 was excluded because of the top level dependency base -any + base-4.6.0.0 was excluded because of the top level dependency base -any + base-4.6.0.1 was excluded because of the top level dependency base -any + +Any help is appreciated. +Thanks for providing git-annex. I started cleaning up my backups with it yesterday and really like it. +"""]] diff --git a/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment b/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment new file mode 100644 index 000000000..8d9c97898 --- /dev/null +++ b/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 12" + date="2013-08-07T16:31:30Z" + content=""" +The Linux standalone builds for i386 and amd64 will not work on Arm systems. + +There are builds of git-annex for arm in eg, Debian. You should be able to use one of those if this system is running Debian. You may need to upgrade to eg, Debian stable, which includes git-annex. + +It looks like you have an old and/or broken GHC compiler too. You could upgrade that to a newer version (eg from Debian stable) and build it that way, but it seems like the long way around if you have a Debian system there. +"""]] diff --git a/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment b/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment new file mode 100644 index 000000000..80e3a6ad1 --- /dev/null +++ b/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA" + nickname="Gregor" + subject="TonidoPlug" + date="2013-08-09T17:46:28Z" + content=""" +@Joey Thanks for the answer. I didn't want to mess around too much with the TonidoPlug. I am currently setting up a raspberry pi, which works fine. +"""]] diff --git a/doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment b/doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment new file mode 100644 index 000000000..93fca1653 --- /dev/null +++ b/doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlfIVXjkzrYE9qJAO2A0H7K6tKGMaSgc3U" + nickname="Daniel" + subject="Problems with cryptocipher" + date="2013-08-22T01:36:50Z" + content=""" +I had problems following these directions on recent releases of Fedora/Ubuntu. The install attempts failed on cryptocipher-0.3.1, which I think came as a dependency of Yesod. +I was able to work around this by installing yesod-platform with cabal first, then installing git-annex. +"""]] diff --git a/doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment b/doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment new file mode 100644 index 000000000..fc64af234 --- /dev/null +++ b/doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="77.247.181.162" + subject="git-annex assistant on Arm" + date="2013-08-23T03:07:11Z" + content=""" +I'd like to use the assistant's power on a Raspberry Pi to build an always-on file/sync server. Is there a way to get the assistant running on Arm? I know there's a Debian package, but it's Version 3.20120629 and comes without the assistant. Has anyone ever successfully built a recent git-annex version on Arm? What would I need in order to do it myself? +"""]] diff --git a/doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment b/doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment new file mode 100644 index 000000000..be14b3908 --- /dev/null +++ b/doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 16" + date="2013-08-23T17:37:52Z" + content=""" +The git-annex assistant can easily be built on arm. But not the webapp. It's entirely possible to use the assistant without the webapp though; you just have to make the git repository and configure the remotes by hand, and then the assistant will sync them the same way the webapp does. + +It is possible but very involved to build the webapp for arm. I do not anticipate doing it in the Debian package until ghc gets proper template haskell support for arm. See [[forum/Webapp_on_ARM]] +"""]] diff --git a/doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment b/doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment new file mode 100644 index 000000000..c0b570dfb --- /dev/null +++ b/doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="77.247.181.162" + subject="comment 17" + date="2013-08-23T18:51:51Z" + content=""" +Thanks for the quick answer. I will try to build git-annex with just the assistant, as you suggest, and once it works set up the server by hand as you suggest. + +BTW: Awesome job you're doing with git-annex. I appreciate your enthusiasm. +"""]] diff --git a/doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment b/doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment new file mode 100644 index 000000000..e3a523e22 --- /dev/null +++ b/doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="96.47.226.20" + subject="git-annex assistant for the Raspberry Pi" + date="2013-09-04T03:58:37Z" + content=""" +It took a while and a few tries, but I finally built the git-annex binary including the assistant on a Raspberry Pi. The build comes without the flags webapp, webdav, and dbus as these rely on a Template Haskell compiler that hasn't been ported to Arm architecture yet. + +I put the binary up on Github in case anyone's interested: +"""]] diff --git a/doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment b/doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment new file mode 100644 index 000000000..27a3e8c62 --- /dev/null +++ b/doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlu7K3h7Ry1uDAU_ERYGuqt0LoGNJqGuRo" + nickname="Nathan" + subject="Cabal installing git-annex on Ubuntu 12.04 Precise with GHC 7.6.3" + date="2013-09-25T22:39:04Z" + content=""" +I now realize [there is a Ubuntu 12.04 Precise PPA with a current +version of +git-annex](http://git-annex.branchable.com/install/Ubuntu/), so that's +probably a better choice, but here's how I cabal isntalled git-annex. + +1. Apt install non-cabal dependencies: + + sudo aptitude install c2hs libgsasl7-dev libxml2-dev + +2. Manually cabal install yesod-platform to avoid the [cryptocipher problem + mentioned above]( + http://git-annex.branchable.com/install/cabal/#comment-1807da37dc144b572b76aaf4b574bb54): + + cabal install yesod-platform + +3. Cabal install git-annex with DNS flag disabled: + + cabal install git-annex -f\"-dns\" + +I was getting this error building git-annex before disabling the DNS flag: + + Utility/SRV.hs:70:54: + Couldn't match expected type `Maybe + [(Int, Int, Integer, B8.ByteString)]' + with actual type `Either + dns-1.0.0:Network.DNS.Internal.DNSError + [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]' + In the third argument of `maybe', namely `r' + In the second argument of `($)', namely + `maybe [] (orderHosts . map tohosts) r' + In a stmt of a 'do' block: + return $ maybe [] (orderHosts . map tohosts) r + +Looking at Utiltity/SRV.hs, it appears that disabling the DNS flag +just makes git annex use a different DNS library (ADNS), not +actually disable DNS lookups. + +"""]] diff --git a/doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment b/doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment new file mode 100644 index 000000000..b280d3d3d --- /dev/null +++ b/doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJemqsekZTC5dvc-MAByUWaBvsYE-mFUo" + nickname="Gábor" + subject="Cabal dependencies" + date="2013-05-12T12:52:20Z" + content=""" +After finishing the installation the cabal way, here are the packages I installed. It is possible that there are other packages I installed previously as dependency for other packages. + + $ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 12.04.2 LTS + Release: 12.04 + Codename: precise + + $ apt-get install cabal-install libgnutls28-dev libgsasl7-dev c2hs libghc-libxml-sax-dev zlib1g-dev libghc-zlib-dev + $ cabal install git-annex --bindir=$HOME/bin +"""]] diff --git a/doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment b/doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment new file mode 100644 index 000000000..288c0e017 --- /dev/null +++ b/doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4" + nickname="Blake" + subject="Updating git-annex via cabal" + date="2013-10-09T21:21:22Z" + content=""" +What is the best way to update git-annex and the dependencies via cabal? Just the `$ cabal install *` commands again? +"""]] diff --git a/doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment b/doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment new file mode 100644 index 000000000..ef8a3d2a3 --- /dev/null +++ b/doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 21" + date="2013-10-11T17:09:33Z" + content=""" +If you run the \"cabal update\" command followed by the \"cabal install\" command it'll upgrade git-annex. +"""]] diff --git a/doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment b/doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment new file mode 100644 index 000000000..d7ff05617 --- /dev/null +++ b/doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="96.44.189.100" + subject=""Could not find module Crypto.Hash" error when building git-annex " + date="2013-10-21T19:55:12Z" + content=""" +Lately I get this error message when trying to build git-annex-v4.20131002: + + Utility/Hash.hs:7:8: + Could not find module `Crypto.Hash' + Perhaps you meant + Crypto.HMAC (needs flag -package crypto-api-0.10.2) + Use -v to see a list of the files searched for. + +crypto-api-0.10.2 is installed as a debian dev package. All the dependencies are met. I have no idea what's going on. +"""]] diff --git a/doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment b/doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment new file mode 100644 index 000000000..03a5b87ce --- /dev/null +++ b/doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 23" + date="2013-10-21T22:09:05Z" + content=""" +git-annex needs cryptohash version 0.10.0 or greater. You appear to have an old version. You can cabal `configure -f-CryptoHash` if it's for some reason failing to disable the cryptohash support despite the declared dependency not being met. +"""]] diff --git a/doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment b/doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment new file mode 100644 index 000000000..3bb160546 --- /dev/null +++ b/doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="37.130.227.133" + subject="comment 24" + date="2013-10-22T17:55:32Z" + content=""" +I fixed the error by installing a newer version of cryptohash. Thanks for pointing out the culprit. +"""]] diff --git a/doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment b/doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment new file mode 100644 index 000000000..929956ede --- /dev/null +++ b/doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="141.138.141.208" + subject="Bad version on Hackage" + date="2013-10-30T18:56:25Z" + content=""" +Quick note: The latest version in the Hackage repository (git-annex-4.20131024) fails to build, due to a faulty version of Assistant/Threads/Cronner.hs. +"""]] diff --git a/doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment b/doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment new file mode 100644 index 000000000..5b1f06023 --- /dev/null +++ b/doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 26" + date="2013-11-01T16:33:25Z" + content=""" +@RaspberryPie that only affected builds without the webapp, in any case it's fixed now. +"""]] diff --git a/doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment b/doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment new file mode 100644 index 000000000..4c007c9ad --- /dev/null +++ b/doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="37.221.160.203" + subject="comment 27" + date="2013-11-02T12:52:18Z" + content=""" +Okay, the error doesn't show up anymore. I didn't even get to Cronner though, because this time I got a different error: + + Assistant/Alert.hs:195:20: + Couldn't match expected type `Assistant ()' with actual type `()' + Expected type: Maybe Remote -> Assistant () + Actual type: Maybe Remote -> () + In the expression: noop + In an equation for `notFsckedNudge': notFsckedNudge _ = noop + +This is from trying to compile 4.20131101 with `-f\"-webapp -webdav\"` +"""]] diff --git a/doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment b/doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment new file mode 100644 index 000000000..19a570cae --- /dev/null +++ b/doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 28" + date="2013-11-02T17:40:18Z" + content=""" +Unfortunate about that. I've fixed it in git. + +(It would be best to file bug reports about build failures to avoid cluttering up this page.) +"""]] diff --git a/doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment b/doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment new file mode 100644 index 000000000..524a0db0c --- /dev/null +++ b/doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="robohack" + ip="24.67.98.78" + subject="cabal install failing due to problems building pcre-light-0.4" + date="2013-11-21T20:17:10Z" + content=""" +After a fresh install of Haskell, and following the instructions above, I end up with the following rather bizarre and unexpected problem: + + $ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\" + Resolving dependencies... + Configuring pcre-light-0.4... + Building pcre-light-0.4... + Preprocessing library pcre-light-0.4... + Base.hsc:103:18: error: pcre.h: No such file or directory + Base.hsc: In function ‘main’: + Base.hsc:402: error: ‘PCRE_ANCHORED’ undeclared (first use in this function) + Base.hsc:402: error: (Each undeclared identifier is reported only once + Base.hsc:402: error: for each function it appears in.) + Base.hsc:405: error: ‘PCRE_AUTO_CALLOUT’ undeclared (first use in this function) + +(followed by an error for every other macro that was expected to be defined in the header...) + + compiling dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c failed (exit code 1) + command was: /usr/bin/gcc -c dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c -o dist/build/Text/Regex/PCRE/Light/Base_hsc_make.o -m64 -fno-stack-protector -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=700 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/sw/lib/ghc-7.0.4/bytestring-0.9.1.10/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/base-4.3.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include/ + Failed to install pcre-light-0.4 + cabal: Error: some packages failed to install: + git-annex-3.20120230 depends on pcre-light-0.4 which failed to install. + pcre-light-0.4 failed during the building phase. The exception was: + ExitFailure 1 + +This is a somewhat older Mac OS X 10.6.8 system. + +I do have PCRE already installed via Fink, and pcre.h is in /sw/include. I see other -I/sw/... things in the compile command above, but obviously /sw/include is not one of them. + +Any clues for me? + +(Why the heck does git-annex need pcre in particular anyway??? I saw another regex library get installed earlier somewhere in this (massive) process.) + +"""]] diff --git a/doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment b/doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment new file mode 100644 index 000000000..5a7beea37 --- /dev/null +++ b/doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="E: Unable to locate package libghc-libxml-sax-dev" + date="2013-05-30T15:05:47Z" + content=""" +I get an error from the command as above: +$ sudo apt-get install cabal-install libgnutls28-dev libgsasl7-dev c2hs libghc libxml-sax-dev zlib1g-dev libghc-zlib-dev + +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise + +"""]] diff --git a/doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment b/doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment new file mode 100644 index 000000000..f068944b0 --- /dev/null +++ b/doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="robohack" + ip="24.67.98.78" + subject="hmmm... ok, the PCRE problem was odd, but now this:" + date="2013-11-21T20:30:54Z" + content=""" +The PCRE problem is solved trivially in my case with a couple more cabal install options, though the need for these seems oddly dissatisfying given the reams of other stuff that was successfully built and installed without these options. + +Now however I seem to have encountered a deeper problem: + + $ cabal install git-annex --bindir=$HOME/bin --extra-include-dirs=/sw/include --extra-lib-dirs=/sw/lib + Resolving dependencies... + [1 of 1] Compiling Main ( /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/Setup.hs, /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/Main.o ) + Linking /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/setup ... + hsc2hs Utility/StatFS.hsc + perl -i -pe 's/^{-# INCLUDE.*//' Utility/StatFS.hs + ghc -O2 -Wall -ignore-package monads-fd --make configure + + Utility/StatFS.hsc:54:8: + Could not find module `GHC.Foreign': + Use -v to see a list of the files searched for. + make: *** [Build/SysConfig.hs] Error 1 + Configuring git-annex-3.20120230... + Building git-annex-3.20120230... + Preprocessing executable 'git-annex' for git-annex-3.20120230... + + Git/Version.hs:11:18: + Could not find module `Build.SysConfig': + Use -v to see a list of the files searched for. + Failed to install git-annex-3.20120230 + cabal: Error: some packages failed to install: + git-annex-3.20120230 failed during the building phase. The exception was: + ExitFailure 1 + +"""]] diff --git a/doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment b/doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment new file mode 100644 index 000000000..224c1dc19 --- /dev/null +++ b/doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="robohack" + ip="24.67.98.78" + subject="a different error trying to build from the git repo...." + date="2013-11-21T21:14:54Z" + content=""" +I'm using the ghc7.0 branch because Fink's GHC is still at 7.0.4.... + + $ cabal build + Building git-annex-3.20120523... + Preprocessing executable 'git-annex' for git-annex-3.20120523... + [ 78 of 163] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o ) + + Utility/Url.hs:111:88: + Couldn't match expected type `Maybe URI' with actual type `URI' + In the second argument of `fromMaybe', namely + `(newURI `relativeTo` u)' + In the expression: fromMaybe newURI (newURI `relativeTo` u) + In an equation for `newURI_abs': + newURI_abs = fromMaybe newURI (newURI `relativeTo` u) + +"""]] diff --git a/doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment b/doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment new file mode 100644 index 000000000..8b2ae67f9 --- /dev/null +++ b/doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 32" + date="2013-11-22T16:27:36Z" + content=""" +@robohack, the ghc7.0 branch is not being maintained, and is so old I don't recommend it. To build it against current cabal you will probably need to version its dependency on network to an older version than 2.4.0. + +Also, git-annex has not depended on pcre for a long time. But you're building thoroughly old version so get to trip over every bug that's been reported for the past 2 years.. +"""]] diff --git a/doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment b/doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment new file mode 100644 index 000000000..8fab5a45f --- /dev/null +++ b/doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="Build failure" + date="2014-03-20T09:10:44Z" + content=""" +I followed the instructions and the invocation of + + cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\" + +resulted in the following error: + + Test.hs:107:41: Not in scope: `errMessage' + Failed to install git-annex-5.20140306 + cabal: Error: some packages failed to install: + git-annex-5.20140306 failed during the building phase. The exception was: + ExitFailure 1 + +I used the Haskell Platform for Mac OS X (10.8) + +"""]] diff --git a/doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment b/doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment new file mode 100644 index 000000000..619e79012 --- /dev/null +++ b/doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/a05bb829-932b-49f2-85a9-00dcda8b5e20" + nickname="Christian Pietsch" + subject="Re: Build failure" + date="2014-03-20T13:56:16Z" + content=""" +I get exactly the same error message as Matthias when attempting the minimal Cabal install on openSUSE 12.2 (x86_64) Linux. +"""]] diff --git a/doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment b/doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment new file mode 100644 index 000000000..899e4fc01 --- /dev/null +++ b/doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 35" + date="2014-03-20T16:06:22Z" + content=""" +The `errMessage` build failure is due to a new version of optparse-applicative. I've added support for it in git master. +"""]] diff --git a/doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment b/doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment new file mode 100644 index 000000000..f6e0d8503 --- /dev/null +++ b/doc/install/cabal/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNcHu5T1Pxzl-r2co9vf6SxXYWubv2P04" + nickname="Matthew" + subject="I did indeed get problems on Ubuntu 13.04" + date="2014-06-25T01:01:43Z" + content=""" +The issues I had were version mismatches when resolving dependencies of git-annex. + +It seems that when you install haskell-platform package with apt-get, it installs a bunch of haskell dependencies as apt packages, yet those aren't needed for any other system packages. So some people here who complain about version mismatches might not have intended to install any Haskell libraries with apt, they just come along for the ride by default. + +I can't remember the exact ones, but I ended up uninstalling some of the stuff that gets auto-installed along with haskell-platform, and using cabal to build those. Then all the git-annex dependencies worked. + +Why 13.04 in this day and age? Using Zentyal as a home server/gateway, and it currently runs on 13.04. + +This method might not work if you installed other apt packages that _do_ need those apt-based Haskell libraries. But if git-annex is all you need that uses the Haskell platform, might work. +"""]] diff --git a/doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment b/doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment new file mode 100644 index 000000000..daf7d0b5a --- /dev/null +++ b/doc/install/cabal/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment @@ -0,0 +1,69 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmveNWaFIL1zEehHr_0416bKBzsul5tGlE" + nickname="Daniel" + subject="Install fails horribly" + date="2014-07-10T23:11:51Z" + content=""" +``` +lyriondesktop:/home/zilti/tmp # cabal install c2hs +Resolving dependencies... +Configuring c2hs-0.17.2... +Building c2hs-0.17.2... +Preprocessing executable 'c2hs' for c2hs-0.17.2... +[ 1 of 26] Compiling Data.DLists ( src/Data/DLists.hs, dist/build/c2hs/c2hs-tmp/Data/DLists.o ) +[ 2 of 26] Compiling Control.StateTrans ( src/Control/StateTrans.hs, dist/build/c2hs/c2hs-tmp/Control/StateTrans.o ) + +src/Control/StateTrans.hs:77:1: Warning: + Module `Prelude' does not export `catch' +[ 3 of 26] Compiling Data.Errors ( src/Data/Errors.hs, dist/build/c2hs/c2hs-tmp/Data/Errors.o ) +[ 4 of 26] Compiling Data.Attributes ( src/Data/Attributes.hs, dist/build/c2hs/c2hs-tmp/Data/Attributes.o ) +[ 5 of 26] Compiling Text.Lexers ( src/Text/Lexers.hs, dist/build/c2hs/c2hs-tmp/Text/Lexers.o ) +[ 6 of 26] Compiling Control.StateBase ( src/Control/StateBase.hs, dist/build/c2hs/c2hs-tmp/Control/StateBase.o ) +[ 7 of 26] Compiling Data.NameSpaces ( src/Data/NameSpaces.hs, dist/build/c2hs/c2hs-tmp/Data/NameSpaces.o ) +[ 8 of 26] Compiling C2HS.C.Attrs ( src/C2HS/C/Attrs.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Attrs.o ) +[ 9 of 26] Compiling C2HS.C.Builtin ( src/C2HS/C/Builtin.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Builtin.o ) +[10 of 26] Compiling Paths_c2hs ( dist/build/autogen/Paths_c2hs.hs, dist/build/c2hs/c2hs-tmp/Paths_c2hs.o ) +[11 of 26] Compiling C2HS.Config ( src/C2HS/Config.hs, dist/build/c2hs/c2hs-tmp/C2HS/Config.o ) +[12 of 26] Compiling C2HS.Switches ( src/C2HS/Switches.hs, dist/build/c2hs/c2hs-tmp/C2HS/Switches.o ) +[13 of 26] Compiling C2HS.Version ( src/C2HS/Version.hs, dist/build/c2hs/c2hs-tmp/C2HS/Version.o ) +[14 of 26] Compiling System.CIO ( src/System/CIO.hs, dist/build/c2hs/c2hs-tmp/System/CIO.o ) +[15 of 26] Compiling Control.State ( src/Control/State.hs, dist/build/c2hs/c2hs-tmp/Control/State.o ) +[16 of 26] Compiling C2HS.State ( src/C2HS/State.hs, dist/build/c2hs/c2hs-tmp/C2HS/State.o ) +[17 of 26] Compiling C2HS.CHS.Lexer ( src/C2HS/CHS/Lexer.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS/Lexer.o ) + +src/C2HS/CHS/Lexer.hs:612:16: Warning: + Defined but not used: `lexeme' +[18 of 26] Compiling C2HS.CHS ( src/C2HS/CHS.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS.o ) +[19 of 26] Compiling C2HS.Gen.Header ( src/C2HS/Gen/Header.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Header.o ) +[20 of 26] Compiling C2HS.C.Trav ( src/C2HS/C/Trav.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Trav.o ) +[21 of 26] Compiling C2HS.C.Names ( src/C2HS/C/Names.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Names.o ) +[22 of 26] Compiling C2HS.C ( src/C2HS/C.hs, dist/build/c2hs/c2hs-tmp/C2HS/C.o ) +[23 of 26] Compiling C2HS.Gen.Monad ( src/C2HS/Gen/Monad.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Monad.o ) + +src/C2HS/Gen/Monad.hs:227:10: Warning: + Orphan instance: instance Read Ident +[24 of 26] Compiling C2HS.C.Info ( src/C2HS/C/Info.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Info.o ) +[25 of 26] Compiling C2HS.Gen.Bind ( src/C2HS/Gen/Bind.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Bind.o ) + +src/C2HS/Gen/Bind.hs:971:43: Warning: + In the use of `posColumn' (imported from Language.C.Data.Position): + Deprecated: \"column number information is inaccurate in presence of macros - do not rely on it.\" + +src/C2HS/Gen/Bind.hs:789:10: Warning: + Orphan instance: instance Num CInteger +[26 of 26] Compiling Main ( src/Main.hs, dist/build/c2hs/c2hs-tmp/Main.o ) +Linking dist/build/c2hs/c2hs ... +Installing executable(s) in /root/.cabal/bin +Installed c2hs-0.17.2 +lyriondesktop:/home/zilti/tmp # cabal install git-annex +Resolving dependencies... +Configuring gnuidn-0.2.1... +cabal: The program c2hs is required but it could not be found. +Failed to install gnuidn-0.2.1 +cabal: Error: some packages failed to install: +git-annex-5.20140709 depends on gnuidn-0.2.1 which failed to install. +gnuidn-0.2.1 failed during the configure step. The exception was: +ExitFailure 1 +network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install. +``` +"""]] diff --git a/doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment b/doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment new file mode 100644 index 000000000..7c44518d9 --- /dev/null +++ b/doc/install/cabal/comment_38_5c1e96221154a4ae4ebd636232044ced._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 38" + date="2014-07-11T18:30:55Z" + content=""" +@Daniel, I suggest you either follow the instuctions above, or if you don't want to follow the instructions, follow the error messages. :P In this case, the instructions say to do: + +> PATH=$HOME/bin:$PATH +> cabal install c2hs --bindir=$HOME/bin + +Which is exactly to work around the problem that we can see in your transcript: `Installing executable(s) in /root/.cabal/bin` + +Also, to reiterate the top of the page: If you are not comfortable tracking down and dealing with library build problems, installing git-annex with cabal is probably not the right choice for you! + +"""]] diff --git a/doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment b/doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment new file mode 100644 index 000000000..7a53b2b64 --- /dev/null +++ b/doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-30T15:25:29Z" + content=""" +If you're installing git-annex with cabal, there is no need to install any haskell library packages with apt-get. That includes libghc-libxml-sax-dev and libghc-zlib-dev. Without those, the apt-get line may work to install the C libraries needed for cabal to install the haskell libraries. + +However, see the the [[Ubuntu]] page for much easier ways to get git-annex installed. +"""]] diff --git a/doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment b/doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment new file mode 100644 index 000000000..4a04303ce --- /dev/null +++ b/doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Re: Comment 3" + date="2013-05-30T15:48:44Z" + content=""" +@Joey Many thanks. +I am new to Haskell (vaguely looked at it with DARCS) and git-annex. +After installing with apt-get on Ubuntu 12.04 LTS I found webapp was missing, hence have come here. +I am going through the correct steps now, it should be awesome when done. + +This seems to be a long build process (still going on my old laptop, much longer than apt-get). +Ubuntu git-annex packages from 13.10 Saucy I think are updated to include webapp. +"""]] diff --git a/doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment b/doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment new file mode 100644 index 000000000..59bdbdd13 --- /dev/null +++ b/doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Re: Comment 3" + date="2013-05-30T16:29:12Z" + content=""" +At the end of the build I got these errors: +Registering yesod-static-1.1.2.3... +Installing library in /home/nrb/.cabal/lib/yesod-static-1.1.2.3/ghc-7.4.1 +Registering yesod-static-1.1.2.3... +cabal: Error: some packages failed to install: +c2hs-0.16.4 depends on language-c-0.3.2.1 which failed to install. +dbus-0.10.4 depends on libxml-sax-0.7.4 which failed to install. +git-annex-4.20130521.2 depends on libxml-sax-0.7.4 which failed to install. +language-c-0.3.2.1 failed during the configure step. The exception was: +ExitFailure 1 +libxml-sax-0.7.4 failed during the configure step. The exception was: +ExitFailure 1 +network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to +install. + +One way I could fix this myself is to put together a VM with 13.10 or Debian in it and work inside that. +Or if I can get help to fix my issues here that would be great ;) +"""]] diff --git a/doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment b/doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment new file mode 100644 index 000000000..1ff7b4f76 --- /dev/null +++ b/doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Some errors after the build" + date="2013-05-30T16:38:37Z" + content=""" + Registering yesod-static-1.1.2.3... + Installing library in /home/nrb/.cabal/lib/yesod-static-1.1.2.3/ghc-7.4.1 + Registering yesod-static-1.1.2.3... + cabal: Error: some packages failed to install: + c2hs-0.16.4 depends on language-c-0.3.2.1 which failed to install. + dbus-0.10.4 depends on libxml-sax-0.7.4 which failed to install. + git-annex-4.20130521.2 depends on libxml-sax-0.7.4 which failed to install. + language-c-0.3.2.1 failed during the configure step. The exception was: + ExitFailure 1 + libxml-sax-0.7.4 failed during the configure step. The exception was: + ExitFailure 1 + network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to + install. + +"""]] diff --git a/doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment b/doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment new file mode 100644 index 000000000..40b202d4e --- /dev/null +++ b/doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="krig" + ip="46.194.28.123" + subject="Could not resolve dependencies for yesod" + date="2013-06-25T06:14:18Z" + content=""" +I'm having problems installing from cabal, and it seems related to yesod. I found an older discussion on something similar, where a constraint to require a newer version of yesod had been added, but I haven't figured out what was done to solve it. + +The problem seems to be that git-annex requires yesod < 1.2, but cabal is unable to install an older version. + + $ cabal install git-annex --bindir=$HOME/bin + Resolving dependencies... + cabal: Could not resolve dependencies: + trying: git-annex-4.20130601 + trying: git-annex-4.20130601:+webapp + rejecting: yesod-1.2.1.1, 1.2.1, 1.2.0.1, 1.2.0 (conflict: + git-annex-4.20130601:webapp => yesod(<1.2)) + trying: yesod-1.1.9.3 + $ + +From what I can tell, the problem is fixed in github master since yesod >= 1.2 is supported again. +"""]] diff --git a/doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment b/doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment new file mode 100644 index 000000000..536f30da0 --- /dev/null +++ b/doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 8" + date="2013-06-25T17:16:46Z" + content=""" +git-annex 4.20130621 once again builds with the current version of yesod. +"""]] diff --git a/doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment b/doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment new file mode 100644 index 000000000..3284c8caa --- /dev/null +++ b/doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl7dGdYtCHb7xleEOp6n8yaUQ4UtaiAEEs" + nickname="Henning" + subject="libxml-sax Error on OS X fresh install" + date="2013-07-27T13:11:23Z" + content=""" +I had - maybe the same problem as Nigel - with ExitFailure 1 libxml-sax-0.7.4 . + +I could fix this by forcing the link of libxml2 package with \"brew link libxml2 --force\". Maybe you should update your guide. I had this problem on 2 different machines running both the current versions of OS X. + +After this the build finished successfull. Maybe this helps. +"""]] diff --git a/doc/install/comment_1_0aa16754fb08d8f2a54c8c3f78b6c187._comment b/doc/install/comment_1_0aa16754fb08d8f2a54c8c3f78b6c187._comment new file mode 100644 index 000000000..1bf53f02a --- /dev/null +++ b/doc/install/comment_1_0aa16754fb08d8f2a54c8c3f78b6c187._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="Old versions from distributions (e.g. Debian stable) fail with online instructions." + date="2014-06-28T15:36:12Z" + content=""" +Hello everyone. + +Be aware that your distribution's package may be very old. +For example, at the time I write this, latest Debian stable is Debian 7.5 which is 2 months old. +But git-annex package there is two *years* old (tomorrow, it will be exactly two yezrs old). + +So, beware. If following [online walkthrough](https://git-annex.branchable.com/walkthrough/), either install a more recent git-annex (e.g. from [Debain backports](http://backports.debian.org/Instructions/)) or follow instructions from your local `/usr/share/doc/git-annex/html/walkthrough.html` instead. +"""]] diff --git a/doc/install/fromscratch.mdwn b/doc/install/fromscratch.mdwn new file mode 100644 index 000000000..46ee5a055 --- /dev/null +++ b/doc/install/fromscratch.mdwn @@ -0,0 +1,27 @@ +To install git-annex from scratch, you need a lot of stuff. Really +quite a lot. + +* Haskell stuff + * [The Haskell Platform](http://haskell.org/platform/) (GHC 7.4 or newer) + * A ton of haskell libraries. Rather than try to list them all here, + see git-annex.cabal. Probably the easiest way to install them: + `cabal update; cabal install git-annex --only-dependencies` +* Shell commands + * [git](http://git-scm.com/) (1.7.2 or newer; 1.8.5 or newer recommended) + * [xargs](http://savannah.gnu.org/projects/findutils/) + * [rsync](http://rsync.samba.org/) + * [curl](http://http://curl.haxx.se/) (optional, but recommended) + * [wget](http://www.gnu.org/software/wget/) (optional) + * [sha*sum](ftp://ftp.gnu.org/gnu/coreutils/) (optional) + * [gpg](http://gnupg.org/) (optional; needed for encryption) + * [lsof](ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/) + (optional; recommended for watch mode) + * [gcrypt](https://github.com/joeyh/git-remote-gcrypt) + (optional) + * [nocache](https://github.com/Feh/nocache) + (optional) + * multicast DNS support, provided on linux by [nss-mdns](http://www.0pointer.de/lennart/projects/nss-mdns/) + (optional; recommended for the assistant to support pairing well) + * [ikiwiki](http://ikiwiki.info) (optional; used to build the docs) + +Then just [[download]] git-annex and run: `make; make install` diff --git a/doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment b/doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment new file mode 100644 index 000000000..1b68d0f8c --- /dev/null +++ b/doc/install/fromscratch/comment_1_9d085e460553fa045999ab7cb945cdec._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="azul" + ip="91.36.153.149" + subject="cabal fails to resolve dependencies" + date="2014-06-19T08:49:05Z" + content=""" +I tried this on ubuntu 14.04 without any previous haskell installs and cabal failed to resolve the dependencies: + +rejecting: optparse-applicative-0.9.0 (conflict: hjsmin => +optparse-applicative>=0.7 && <0.9) + +[full log](paste.debian.net/105771/) +"""]] diff --git a/doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment b/doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment new file mode 100644 index 000000000..949ee0abf --- /dev/null +++ b/doc/install/fromscratch/comment_2_b7954521d9ab40622b665f278dd72e17._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="azul" + ip="91.36.173.120" + subject="conflict solved" + date="2014-06-20T06:13:09Z" + content=""" +`apt-get install happy alex libghc-hjsmin-dev` +solved the problem for me. The hjsmin lib was probably crucial. It seems a bunch of dependencies can also be installed as debs rather than through cabal. +`standalone/android/buildchroot-inchroot` gave me a clue. +"""]] diff --git a/doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment b/doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment new file mode 100644 index 000000000..1fade16c3 --- /dev/null +++ b/doc/install/fromscratch/comment_3_a3bf3ce57ea73515a059267f25b816eb._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="azul" + ip="91.36.173.120" + subject="c2hs required for cabal to install dependencies" + date="2014-06-20T06:35:35Z" + content=""" +Next thing i ran into was missing c2hs. +So +`apt-get install c2hs` before running the cabal install otherwise... + +
+$ cabal install git-annex --only-dependencies
+Resolving dependencies...
+Configuring gnuidn-0.2.1...
+cabal: The program c2hs is required but it could not be found.
+Failed to install gnuidn-0.2.1
+cabal: Error: some packages failed to install:
+gnuidn-0.2.1 failed during the configure step. The exception was:
+ExitFailure 1
+network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install.
+
+ +"""]] diff --git a/doc/install/openSUSE.mdwn b/doc/install/openSUSE.mdwn new file mode 100644 index 000000000..760def98c --- /dev/null +++ b/doc/install/openSUSE.mdwn @@ -0,0 +1,3 @@ +Haskell Platform is now [officially available for openSUSE](http://software.opensuse.org/package/haskell-platform) via 1-Click Install. + +At the time of writing, there are [unofficial packages of git-annex](http://software.opensuse.org/package/git-annex) available for openSUSE. It should also be possible to build it via cabal or from source as described on the [[install]] page. diff --git a/doc/internals.mdwn b/doc/internals.mdwn new file mode 100644 index 000000000..bf0fa668c --- /dev/null +++ b/doc/internals.mdwn @@ -0,0 +1,247 @@ +In the world of git, we're not scared about internal implementation +details, and sometimes we like to dive in and tweak things by hand. Here's +some documentation to that end. + +## `.git/annex/objects/aa/bb/*/*` + +This is where locally available file contents are actually stored. +Files added to the annex get a symlink checked into git that points +to the file content. + +First there are two levels of directories used for hashing, to prevent +too many things ending up in any one directory. +See [[hashing]] for details. + +Each subdirectory has the [[name_of_a_key|key_format]] in one of the +[[key-value_backends|backends]]. The file inside also has the name of the key. +This two-level structure is used because it allows the write bit to be removed +from the subdirectories as well as from the files. That prevents accidentially +deleting or changing the file contents. See [[lockdown]] for details. + +In [[direct_mode]], file contents are not stored in here, and instead +are stored directly in the file. However, the same symlinks are still +committed to git, internally. + +Also in [[direct_mode]], some additional data is stored in these directories. +`.cache` files contain cached file stats used in detecting when a file has +changed, and `.map` files contain a list of file(s) in the work directory +that contain the key. + +# `.git/annex/tmp/` + +This directory contains partially transferred objects. + +# `.git/annex/misctmp/` + +This is a temp directory for miscellaneous other temp files. + +While .git/annex/objects and .git/annex/tmp can be put on different +filesystems if desired, .git/annex/misctmp +has to be on the same filesystem as the work tree and git repository. + +# `.git/annex/bad/` + +git-annex fsck puts any bad objects it finds in here. + +# `.git/annex/transfers/` + +Contains information files for uploads and downloads that are in progress, +as well as any that have failed. Used especially by the assistant. +It is safe to delete these files. + +# `.git/annex/ssh/` + +ssh connection caching files are written in here. + +# `.git/annex/index` + +This is a git index file which git-annex uses for commits to the git-annex +branch. + +# `.git/annex/journal/` + +git-annex uses this to journal changes to the git-annex branch, +before committing a set of changes. + +## The git-annex branch + +This branch is managed by git-annex, with the contents listed below. + +The file `.git/annex/index` is a separate git index file it uses +to accumulate changes for the git-annex branch. +Also, `.git/annex/journal/` is used to record changes before they +are added to git. + +This branch operates on objects exclusively. No file names will ever +be stored in this branch. + +The files stored in this branch are all designed to be auto-merged +using git's [[union merge driver|git-union-merge]]. So each line +has a timestamp, to allow the most recent information to be identified. + +### `uuid.log` + +Records the UUIDs of known repositories, and associates them with a +description of the repository. This allows git-annex to display something +more useful than a UUID when it refers to a repository that does not have +a configured git remote pointing at it. + +The file format is simply one line per repository, with the uuid followed by a +space and then the description, followed by a timestamp. Example: + + e605dca6-446a-11e0-8b2a-002170d25c55 laptop timestamp=1317929189.157237s + 26339d22-446b-11e0-9101-002170d25c55 usb disk timestamp=1317929330.769997s + +## `numcopies.log` + +Records the global numcopies setting. + +The file format is simply a timestamp followed by a number. + +## `remote.log` + +Holds persistent configuration settings for [[special_remotes]] such as +Amazon S3. + +The file format is one line per remote, starting with the uuid of the +remote, followed by a space, and then a series of var=value pairs, +each separated by whitespace, and finally a timestamp. + +Encrypted special remotes store their encryption key here, +in the "cipher" value. It is base64 encoded, and unless shared [[encryption]] +is used, is encrypted to one or more gpg keys. The first 256 bytes of +the cipher is used as the HMAC SHA1 encryption key, to encrypt filenames +stored on the special remote. The remainder of the cipher is used as a gpg +symmetric encryption key, to encrypt the content of files stored on the special +remote. + +## `trust.log` + +Records the [[trust]] information for repositories. Does not exist unless +[[trust]] values are configured. + +The file format is one line per repository, with the uuid followed by a +space, and then either `1` (trusted), `0` (untrusted), `?` (semi-trusted), +`X` (dead) and finally a timestamp. + +Example: + + e605dca6-446a-11e0-8b2a-002170d25c55 1 timestamp=1317929189.157237s + 26339d22-446b-11e0-9101-002170d25c55 ? timestamp=1317929330.769997s + +Repositories not listed are semi-trusted. + +## `group.log` + +Used to group repositories together. + +The file format is one line per repository, with the uuid followed by a space, +and then a space-separated list of groups this repository is part of, +and finally a timestamp. + +## `preferred-content.log` + +Used to indicate which repositories prefer to contain which file contents. + +The file format is one line per repository, with the uuid followed by a space, +then a boolean expression, and finally a timestamp. + +Files matching the expression are preferred to be retained in the +repository, while files not matching it are preferred to be stored +somewhere else. + +## `required-content.log` + +Used to indicate which repositories are required to contain which file +contents. + +File format is identical to preferred-content.log. + +## `group-preferred-content.log` + +Contains standard preferred content settings for groups. (Overriding or +supplimenting the ones built into git-annex.) + +The file format is one line per group, staring with a timestamp, then a +space, then the group name followed by a space and then the preferred +content expression. + +## `aaa/bbb/*.log` + +These log files record [[location_tracking]] information +for file contents. These are placed in two levels of subdirectories +for hashing. See [[hashing]] for details. + +The name of the key is the filename, and the content +consists of a timestamp, either 1 (present) or 0 (not present), and +the UUID of the repository that has or lacks the file content. + +Example: + + 1287290776.765152s 1 e605dca6-446a-11e0-8b2a-002170d25c55 + 1287290767.478634s 0 26339d22-446b-11e0-9101-002170d25c55 + +## `aaa/bbb/*.log.web` + +These log files record urls used by the +[[web_special_remote|special_remotes/web]]. Their format is similar +to the location tracking files, but with urls rather than UUIDs. + +## `aaa/bbb/*.log.rmt` + +These log files are used by remotes that need to record their own state +about keys. Each remote can store one line of data about a key, in +its own format. + +Example: + + 1287290776.765152s e605dca6-446a-11e0-8b2a-002170d25c55 blah blah + 1287290767.478634s 26339d22-446b-11e0-9101-002170d25c55 foo=bar + +## `aaa/bbb/*.log.met` + +These log files are used to store arbitrary [[design/metadata]] about keys. +Each key can have any number of metadata fields. Each field has a set of +values. + +Lines are timestamped, and record when values are added (`field +value`), +but also when values are removed (`field -value`). Removed values +are retained in the log so that when merging an old line that sets a value +that was later unset, the value is not accidentially added back. + +For example: + + 1287290776.765152s tag +foo +bar author +joey + 1291237510.141453s tag -bar +baz + +The value can be completely arbitrary data, although it's typically +reasonably short. If the value contains any whitespace +(including \r or \r), it will be base64 encoded. Base64 encoded values +are indicated by prefixing them with "!" + +## `schedule.log` + +Used to record scheduled events, such as periodic fscks. + +The file format is simply one line per repository, with the uuid followed by a +space and then its schedule, followed by a timestamp. + +There can be multiple events in the schedule, separated by "; " + +The format of the scheduled events is the same described in +the SCHEDULED JOBS section of the man page. + +Example: + + 42bf2035-0636-461d-a367-49e9dfd361dd fsck self 30m every day at any time; fsck 4b3ebc86-0faf-4892-83c5-ce00cbe30f0a 1h every year at any time timestamp=1385646997.053162s + +## `transitions.log` + +Used to record transitions, eg by `git annex forget` + +Each line of the file is a transition, followed by a timestamp. + +Example: + + ForgetGitHistory 1387325539.685136s + ForgetDeadRemotes 1387325539.685136s diff --git a/doc/internals/comment_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment b/doc/internals/comment_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment new file mode 100644 index 000000000..b42cd2fd8 --- /dev/null +++ b/doc/internals/comment_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="stoile" + ip="2a01:198:242:0:219:66ff:fef2:c021" + subject="tmp missing" + date="2013-11-16T12:16:48Z" + content=""" +There's no information about .git/annex/tmp here. +"""]] diff --git a/doc/internals/comment_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment b/doc/internals/comment_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment new file mode 100644 index 000000000..3c5f87bd5 --- /dev/null +++ b/doc/internals/comment_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 2" + date="2013-11-16T17:23:02Z" + content=""" +.git/annex/tmp is not very interesting. It's a temporary file directory. When transferring a key's content, git-annex uses a stable filename, which allows resuming interrupted downloads, or cleaning up aborted downloads with `git annex unused`. +"""]] diff --git a/doc/internals/hashing.mdwn b/doc/internals/hashing.mdwn new file mode 100644 index 000000000..cc4bc6456 --- /dev/null +++ b/doc/internals/hashing.mdwn @@ -0,0 +1,38 @@ +In both the .git/annex directory and the git-annex branch, two levels of +hash directories are used, to avoid issues with too many files in one +directory. + +Two separate hash methods are used. + +* hashdirmixed is only used for non-bare git repositories. + (We'd like to stop using this, but it'd be too annoying to change + all the git-annex symlinks!) + +* hashdirlower is used for bare git repositories, the + git-annex branch, and on special remotes as well. + +Note that `git annex find` and `git annex examinekey` can be used with +the `--format` option to find the hash directories. The explanation +below is only for completeness. + +## new hash format + +This uses two directories, each with a three-letter name, such as "f87/4d5" + +The directory names come from the md5sum of the [[key|key_format]]. + +For example: + + echo -n "SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" | md5sum + +## old hash format + +This uses two directories, each with a two-letter name, such as "pX/1J" + +It takes the md5sum of the key, but rather than a string, represents it as 4 +32bit words. Only the first word is used. It is converted into a string by the +same mechanism that would be used to encode a normal md5sum value into a +string, but where that would normally encode the bits using the 16 characters +0-9a-f, this instead uses the 32 characters "0123456789zqjxkmvwgpfZQJXKMVWGPF". +The first 2 letters of the resulting string are the first directory, and the +second 2 are the second directory. diff --git a/doc/internals/hashing/comment_1_9153e4f4f9335e524cf1b96a51bef41f._comment b/doc/internals/hashing/comment_1_9153e4f4f9335e524cf1b96a51bef41f._comment new file mode 100644 index 000000000..075bedfce --- /dev/null +++ b/doc/internals/hashing/comment_1_9153e4f4f9335e524cf1b96a51bef41f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnlotDRSLW2JVXY3SLSwhrcHteqUHhTtoY" + nickname="Péter" + subject="comment 1" + date="2014-01-31T00:45:47Z" + content=""" +The correct old hash value for the empty file SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 is pX/ZJ . + +The text describes the old hash value computation incorrectly, because it doesn't mention that 1 bit is skipped between each group of 5 bits. See the sample implementation in display_32bits_as_dir in https://github.com/joeyh/git-annex/blob/master/Locations.hs +"""]] diff --git a/doc/internals/key_format.mdwn b/doc/internals/key_format.mdwn new file mode 100644 index 000000000..ac52bddea --- /dev/null +++ b/doc/internals/key_format.mdwn @@ -0,0 +1,23 @@ +A git-annex key has this format: + + BACKEND-sNNNN-mNNNN--NAME + +For example: + + SHA256E-s31390--f50d7ac4c6b9031379986bc362fcefb65f1e52621ce1708d537e740fefc59cc0.mp3 + +* The backend is one of the [[key-value_backends|backends]], which + are always upper-cased. +* The name field at the end has a format dependent on the backend. It is + always the last field, and is prefixed with "--". Unlike other fields, + it may contain "-" in its content. It should not contain newline characters; + otherwise nearly anything goes. +* The "-s" field is optional, and is the size of the content in bytes. +* The "-m" field is optional, and is the mtime of the file when it was + added to git-annex, expressed as seconds from the epoch. + This is currently only used by the WORM backend. +* Other fields could be added in the future, if needed. +* Fields may appear, in any order (though always before the name field). + +The `git annex examinekey` command can be used to extract information from +a key. diff --git a/doc/internals/lockdown.mdwn b/doc/internals/lockdown.mdwn new file mode 100644 index 000000000..a7775cd3a --- /dev/null +++ b/doc/internals/lockdown.mdwn @@ -0,0 +1,44 @@ +Object files stored in `.git/annex/objects` are each put in their own directory. +This allows the write bit to be removed from both the file, and its directory, +which prevents accidentially deleting or changing the file contents. + +The reasoning for doing this follows: + +Normally with git, once you have committed a file, editing the file in the +working tree cannot cause you to lose the committed version. This is an +important property of git. Of course you can `rm -rf .git` and delete +commits if you like (before you've pushed them). But you can't lose a +committed version of the file because of something you do with the working +tree version. + +It's easy for git to do this, because committing a file makes a copy of it. +But git-annex does not make a local copy of a file added to it, because +the file could be very large. + +So, it's important for git-annex to find another way to preserve the expected +property that once committed, you cannot accidentially lose a file. +The most important protection it makes is just to remove the write bit of +the file. Thus preventing programs from modifying it. + +But, that does not prevent any program that might follow the symlink and +delete the symlinked file. This might seem an unlikely thing for a program to +do at first, but consider a command like: +`tar cf foo.tar foo --remove-files --dereference` + +When I tested this, I didn't know if it would remove the file foo symlinked +to or not! It turned out that my tar doesn't remove it. But it could +have easily went the other way. + +Rather than needing to worry about every possible program that might +decide to do something like this, git-annex removes the write bit from the +directory containing the annexed object, as well as removing the write +bit from the file. (The only bad consequence of this is that `rm -rf .git` +doesn't work unless you first run `chmod -R +w .git`) + +---- + +It's known that this lockdown mechanism is incomplete. The worst hole in +it is that if you explicitly run `chmod +w` on an annexed file in the working +tree, this follows the symlink and allows writing to the file. It would be +better to make the files fully immutable. But most systems either don't +support immutable attributes, or only let root make files immutable. diff --git a/doc/license.mdwn b/doc/license.mdwn new file mode 100644 index 000000000..837fd8c3b --- /dev/null +++ b/doc/license.mdwn @@ -0,0 +1,14 @@ +git-annex is Free Software. + +The majority of git-annex is licensed under the [[GPL]], version 3 or +higher. + +The git-annex webapp is licensed under the [[AGPL]], version 3 or higher. +Note that builds of git-annex that include the webapp may be licensed +under the AGPL as a whole. git-annex built without the webapp does +not include this code, so remains GPLed. + +git-annex contains a variety of other code, artwork, etc copyright by +others, under a variety of licences, including the [[LGPL]], BSD, +MIT, and Apache 2.0 licenses. For details, see +[this file](http://source.git-annex.branchable.com/?p=source.git;a=blob_plain;f=debian/copyright;hb=HEAD). diff --git a/doc/license/AGPL b/doc/license/AGPL new file mode 100644 index 000000000..dba13ed2d --- /dev/null +++ b/doc/license/AGPL @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/doc/license/GPL b/doc/license/GPL new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/doc/license/GPL @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/doc/license/LGPL b/doc/license/LGPL new file mode 100644 index 000000000..4362b4915 --- /dev/null +++ b/doc/license/LGPL @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/doc/links/key_concepts.mdwn b/doc/links/key_concepts.mdwn new file mode 100644 index 000000000..f1754e0c8 --- /dev/null +++ b/doc/links/key_concepts.mdwn @@ -0,0 +1,7 @@ +### key concepts + +* [[git-annex man page|git-annex]] +* [[how_it_works]] +* [[special_remotes]] +* [[sync]] +* [[direct_mode]] diff --git a/doc/links/other_stuff.mdwn b/doc/links/other_stuff.mdwn new file mode 100644 index 000000000..b1645d8cb --- /dev/null +++ b/doc/links/other_stuff.mdwn @@ -0,0 +1,9 @@ +### other stuff + +* [[testimonials]] +* [[privacy]] +* [[what git annex is not|not]] +* [[related_software]] +* [[public git-annex repos|publicrepos]] +* [[thanks]] +* [[sitemap]] diff --git a/doc/links/the_details.mdwn b/doc/links/the_details.mdwn new file mode 100644 index 000000000..a7f8633a8 --- /dev/null +++ b/doc/links/the_details.mdwn @@ -0,0 +1,8 @@ +### the details + +* [[encryption]] +* [[key-value backends|backends]] +* [[bare_repositories]] +* [[internals]] +* [[scalability]] +* [[design]] diff --git a/doc/location_tracking.mdwn b/doc/location_tracking.mdwn new file mode 100644 index 000000000..d40a7206f --- /dev/null +++ b/doc/location_tracking.mdwn @@ -0,0 +1,30 @@ +git-annex keeps track of in which repositories it last saw a file's content. +This location tracking information is stored in the git-annex branch. +Repositories record their UUID and the date when they get or drop +a file's content. + +This location tracking information is useful if you have multiple +repositories, and not all are always accessible. For example, perhaps one +is on a home file server, and you are away from home. Then git-annex can +tell you what git remote it needs access to in order to get a file: + + # git annex get myfile + get myfile (not available) + I was unable to access these remotes: home + +Another way the location tracking comes in handy is if you put repositories +on removable USB drives, that might be archived away offline in a safe +place. In this sort of case, you probably don't have a git remotes +configured for every USB drive. So git-annex may have to resort to talking +about repository UUIDs. If you have previously used "git annex init" +to attach descriptions to those repositories, it will include their +descriptions to help you with finding them: + + # git annex get myfile + get myfile (not available) + Try making some of these repositories available: + c0a28e06-d7ef-11df-885c-775af44f8882 -- USB archive drive 1 + e1938fee-d95b-11df-96cc-002170d25c55 + +In certain cases you may want to configure git-annex to [[trust]] +that location tracking information is always correct for a repository. diff --git a/doc/logo-old-bw.svg b/doc/logo-old-bw.svg new file mode 100644 index 000000000..11d362e5f --- /dev/null +++ b/doc/logo-old-bw.svg @@ -0,0 +1,60 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/doc/logo-old.png b/doc/logo-old.png new file mode 100644 index 000000000..38d335a45 Binary files /dev/null and b/doc/logo-old.png differ diff --git a/doc/logo-old.svg b/doc/logo-old.svg new file mode 100644 index 000000000..5741ffeb5 --- /dev/null +++ b/doc/logo-old.svg @@ -0,0 +1,77 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/doc/logo-old_small.png b/doc/logo-old_small.png new file mode 100644 index 000000000..867fecf86 Binary files /dev/null and b/doc/logo-old_small.png differ diff --git a/doc/logo.mdwn b/doc/logo.mdwn new file mode 100644 index 000000000..ae132bd2d --- /dev/null +++ b/doc/logo.mdwn @@ -0,0 +1,13 @@ +Variants of the git-annex logo. + +[[logo_small.png]] + +[[logo.svg]] + +[[logo-old.png]] + +[[logo-old_small.png]] + +[[logo-old.svg]] + +[[logo-old-bw.svg]] diff --git a/doc/logo.svg b/doc/logo.svg new file mode 100644 index 000000000..bd87eefef --- /dev/null +++ b/doc/logo.svg @@ -0,0 +1,92 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/doc/logo_16x16.png b/doc/logo_16x16.png new file mode 100644 index 000000000..c98663d57 Binary files /dev/null and b/doc/logo_16x16.png differ diff --git a/doc/logo_32x32.png b/doc/logo_32x32.png new file mode 100644 index 000000000..9075cc2b6 Binary files /dev/null and b/doc/logo_32x32.png differ diff --git a/doc/logo_small.png b/doc/logo_small.png new file mode 100644 index 000000000..252b761d0 Binary files /dev/null and b/doc/logo_small.png differ diff --git a/doc/meta.mdwn b/doc/meta.mdwn new file mode 100644 index 000000000..5ee36f8c0 --- /dev/null +++ b/doc/meta.mdwn @@ -0,0 +1,5 @@ +This wiki contains [[!pagecount pages="*"]] pages. + +Broken links: + +[[!brokenlinks ]] diff --git a/doc/metadata.mdwn b/doc/metadata.mdwn new file mode 100644 index 000000000..fed332351 --- /dev/null +++ b/doc/metadata.mdwn @@ -0,0 +1,47 @@ +git-annex allows you to store arbitrary metadata about the content of files +stored in the git-annex repository. The metadata is stored in the +`git-annex` branch, and so is automatically kept in sync with the rest of +git-annex's state, such as [[location_tracking]] information. + +Some of the things you can do with metadata include: + +* Using `git annex metadata file` to show all + the metadata associated with a file. +* [[tips/metadata_driven_views]] +* Limiting the files git-annex commands act on to those with + or without particular metadata. + For example `git annex find --metadata tag=foo --or --metadata tag=bar` +* Using it in [[preferred_content]] expressions. + For example "metadata=tag=important or not metadata=author=me" + +Each file (actually the underlying key) can have any number of metadata +fields, which each can have any number of values. For example, to tag +files, the `tag` field is typically used, with values set to each tag that +applies to the file. + +The field names are limited to alphanumerics (and `[_-.]`), and are case +insensitive. The metadata values can contain absolutely anything you +like -- but you're recommended to keep it simple and reasonably short. + +Here are some metadata fields that git-annex has special support for: + +* `tag` - With each tag being a different value. +* `year`, `month` - When this particular version of the file came into + being. +* `$field-lastchanged` - This is automatically maintained for each + field that's set, and gives the date and time of the most recent + change to the field. It cannot be modified directly. +* `lastchanged` - This is automatically maintained, giving the data and time + of the last change to any of the metadata of a file. + +To make git-annex automatically set the year and month when adding files, +run `git config annex.genmetadata true`. Also, see +[[tips/automatically_adding_metadata]]. + +git-annex's metadata can be updated in a distributed fashion. For example, +two users, each with their own clone of a repository, can set and unset +metadata at the same time, even for the same field of the same file. +When they push their changes, `git annex merge` will combine their +metadata changes in a consistent and (probably) intuitive way. + +See [[the metadata design page|design/metadata]] for more details. diff --git a/doc/metadata/comment_1_d367fdaf0425b59d694bf16059d47192._comment b/doc/metadata/comment_1_d367fdaf0425b59d694bf16059d47192._comment new file mode 100644 index 000000000..8fb93442c --- /dev/null +++ b/doc/metadata/comment_1_d367fdaf0425b59d694bf16059d47192._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="bremner" + ip="198.164.160.48" + subject="access metadata by key?" + date="2014-03-17T01:26:44Z" + content=""" +I'm hacking around with using metadata from an external special remote. Those work with keys, not files, so one option would be to add a GETMETADATA to the protocol. It also seems like it would not be too hard to add +an option to \"git annex metadata\" to take a key rather than a file. +"""]] diff --git a/doc/metadata/comment_2_e15d2b5a405db4ccdb91d6aad4a22983._comment b/doc/metadata/comment_2_e15d2b5a405db4ccdb91d6aad4a22983._comment new file mode 100644 index 000000000..1fd5a9fe1 --- /dev/null +++ b/doc/metadata/comment_2_e15d2b5a405db4ccdb91d6aad4a22983._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-17T19:32:39Z" + content=""" +I've made `git annex metadata --key` work. + +I'll wait and see what you come up with your special remote and add something to the protocol later if it makes sense. +"""]] diff --git a/doc/news.mdwn b/doc/news.mdwn new file mode 100644 index 000000000..95114cdcf --- /dev/null +++ b/doc/news.mdwn @@ -0,0 +1,11 @@ +[[!if test="news/*" then=""" +This is where announcements of new releases, features, and other news is +posted. git-annex users are recommended to subscribe to this page's RSS +feed. + +[[!inline pages="./news/* and !./news/*/* and !*/Discussion" rootpage="news" show="30"]] + +""" +else=""" +(Please see the changelog.) +"""]] diff --git a/doc/news/2013_git-annex_user_survey.mdwn b/doc/news/2013_git-annex_user_survey.mdwn new file mode 100644 index 000000000..269496e64 --- /dev/null +++ b/doc/news/2013_git-annex_user_survey.mdwn @@ -0,0 +1,5 @@ +Similar to the yearly git user survey, I am doing a +[2013 git-annex user survey](http://git-annex-survey.branchable.com/polls/2013/). + +If you use git-annex, +please take a few minutes to answer my questions! diff --git a/doc/news/LWN_article.mdwn b/doc/news/LWN_article.mdwn new file mode 100644 index 000000000..c1c0c4047 --- /dev/null +++ b/doc/news/LWN_article.mdwn @@ -0,0 +1,2 @@ +[Linux Weekly News](http://lwn.net/) has a nice +[article on git-annex](http://lwn.net/Articles/418337/) in it this week. diff --git a/doc/news/Presentation_at_FOSDEM.mdwn b/doc/news/Presentation_at_FOSDEM.mdwn new file mode 100644 index 000000000..48daf2678 --- /dev/null +++ b/doc/news/Presentation_at_FOSDEM.mdwn @@ -0,0 +1,4 @@ +git-annex will be briefly presented at FOSDEM, on Sunday February 4th at 15:40. +[Details](http://fosdem.org/2012/schedule/event/gitannex). + +Thanks to Richard Hartmann for making this presentation. diff --git a/doc/news/git_annex_fall_of_code.mdwn b/doc/news/git_annex_fall_of_code.mdwn new file mode 100644 index 000000000..79e0ff690 --- /dev/null +++ b/doc/news/git_annex_fall_of_code.mdwn @@ -0,0 +1,27 @@ +Thanks to my recent successful git-annex +[crowdfunding campaign](http://campaign.joeyh.name/), $1000 has been set +aside to award others for their contributions to git-annex by +the end of 2013. This is not a lot of money, but I hope that the +reward and recognition will encourage some more people to work on git-annex. + +You don't need to know Haskell! You could contribute some interesting and +useful special remote hooks, or write better documentation. + +On the other hand, if you have learned Haskell, this might be your first +chance to make some money with it! Some ideas for things to work on that +would be particularly award-worthy: + +* Port git-annex to IOS, using [ghc-ios](https://github.com/ghc-ios). + I don't plan to ever do this myself, but you could make it happen. +* Get the git-annex assistant working in Windows, building on the existing + port to Windows. Otherwise, this is on my roadmap for February. +* Solve existing [[bugs]] or [[todo]] items. There are more than I can + keep up with. + +The amount of the awards will vary depending on the size of the +contribution. Since this is getting started later than is ideal, +I reserve the right to extend it past the end of the year if I don't get +enough participants. + +If you'd like to participate in this program, just email me at +. --[[Joey]] diff --git a/doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn b/doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn new file mode 100644 index 000000000..8eab9a34a --- /dev/null +++ b/doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn @@ -0,0 +1,19 @@ +[[!meta title="sharebox: a FUSE filesystem for git-annex"]] + +Christophe-Marie Duquesne has just announced +[Sharebox](https://github.com/chmduquesne/sharebox-fs), a FUSE filesystem +relying on git-annex: + +
+
+What are your goals?  
+Seamless synchronization "à la dropbox".  
+Ability to use with big binary files such as mp3/movies.  
+Entirely decentralized.  
+Don't use unnecessary space  
+Keep it simple: avoid special VCS commands and keep a filesystem  
+interface as much as possible.
+
+
+ +While still alpha, this is promising. --[[Joey]] diff --git a/doc/news/sharebox_a_FUSE_filesystem_for_git-annex/comment_1_e238d1734238e37bb55ff952b32e06b8._comment b/doc/news/sharebox_a_FUSE_filesystem_for_git-annex/comment_1_e238d1734238e37bb55ff952b32e06b8._comment new file mode 100644 index 000000000..8754a7f9a --- /dev/null +++ b/doc/news/sharebox_a_FUSE_filesystem_for_git-annex/comment_1_e238d1734238e37bb55ff952b32e06b8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 1" + date="2012-09-27T00:08:19Z" + content=""" +This is what the assistant should aim to be...\"Like Dropbox\", but even better. +I would guess many people who pledged were thinking of this. +"""]] diff --git a/doc/news/version_5.20140529.mdwn b/doc/news/version_5.20140529.mdwn new file mode 100644 index 000000000..1b423cefa --- /dev/null +++ b/doc/news/version_5.20140529.mdwn @@ -0,0 +1,25 @@ +git-annex 5.20140529 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * Fix encoding of data written to git-annex branch. Avoid truncating + unicode characters to 8 bits. Allow any encoding to be used, as with + filenames (but utf8 is the sane choice). Affects metadata and repository + descriptions, and preferred content expressions. + * assistant: When there are multiple remotes giving different ways + to access the same repository, honor remote cost settings and use + the cheapest available. + * webapp: More robust startup when annex directory is not a git repo. + * initremote/enableremote: Basic support for using with regular git remotes; + initremote stores the location of an already existing git remote, + and enableremote setups up a remote using its stored location. + * webapp: Support for enabling known git repositories on ssh servers. + The repository must have been added using initremote. + * webapp: When setting up a ssh remote, record it using initremote, + so that it can be easily enabled elsewhere. + * webapp: When setting up a ssh remote, if the user inputs ~/foo, + normalize that to foo, since it's in the home directory by default. + * Use exceptions in place of deprecated MonadCatchIO-transformers + Thanks, Ben Gamari. + * android: Run busybox install with -s, since some versions of Android + prohibit making hard links. + * Android webapp: Fix EvilSplicer bugs that mangled the css files, + preventing icons from displaying, and also slightly broke the js files."""]] \ No newline at end of file diff --git a/doc/news/version_5.20140606.mdwn b/doc/news/version_5.20140606.mdwn new file mode 100644 index 000000000..d7f26b86f --- /dev/null +++ b/doc/news/version_5.20140606.mdwn @@ -0,0 +1,14 @@ +git-annex 5.20140606 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * webapp: When adding a new local repository, fix bug that caused its + group and preferred content to be set in the current repository, + even when not combining. + * webapp: Avoid stomping on existing description, group and + preferred content settings when enabling or combining with + an already existing remote. + * assistant: Make sanity checker tmp dir cleanup code more robust. + * unused: Avoid checking view branches for unused files. + * webapp: Include ssh port in mangled hostname. + * Windows: Fix bug introduced in last release that caused files + in the git-annex branch to have lines teminated with \r. + * Windows: Fix retrieving of files from local bare git repositories."""]] \ No newline at end of file diff --git a/doc/news/version_5.20140613.mdwn b/doc/news/version_5.20140613.mdwn new file mode 100644 index 000000000..d4413725d --- /dev/null +++ b/doc/news/version_5.20140613.mdwn @@ -0,0 +1,16 @@ +git-annex 5.20140613 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * Ignore setsid failures. + * Avoid leaving behind .tmp files when failing in some cases, including + importing files to a disk that is full. + * Avoid bad commits after interrupted direct mode sync (or merge). + * Fix build with wai 0.3.0. + * Deal with FAT's low resolution timestamps, which in combination with + Linux's caching of higher res timestamps while a FAT is mounted, caused + direct mode repositories on FAT to seem to have modified files after + they were unmounted and remounted. + * Windows: Fix opening webapp when repository is in a directory with + spaces in the path. + * Detect when Windows has lost its mind in a timezone change, and + automatically apply a delta to the timestamps it returns, to get back to + sane values."""]] \ No newline at end of file diff --git a/doc/news/version_5.20140707.mdwn b/doc/news/version_5.20140707.mdwn new file mode 100644 index 000000000..a00737b3b --- /dev/null +++ b/doc/news/version_5.20140707.mdwn @@ -0,0 +1,23 @@ +git-annex 5.20140707 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * assistant: Fix bug, introduced in last release, that caused the assistant + to make many unncessary empty merge commits. + * assistant: Fix one-way assistant->assistant sync in direct mode. + * Fix bug in annex.queuesize calculation that caused much more + queue flushing than necessary. + * importfeed: When annex.genmetadata is set, metadata from the feed + is added to files that are imported from it. + * Support users who have set commit.gpgsign, by disabling gpg signatures + for git-annex branch commits and commits made by the assistant. + * Fix memory leak when committing millions of changes to the git-annex + branch, eg after git-annex add has run on 2 million files in one go. + * Support building with bloomfilter 2.0.0. + * Run standalone install process when the assistant is started + (was only being run when the webapp was opened). + * Android: patch git to avoid fchmod, which fails on /sdcard. + * Windows: Got rid of that pesky DOS box when starting the webapp. + * Windows: Added Startup menu item so assistant starts automatically + on login. + * Windows: Fix opening file browser from webapp when repo is in a + directory with spaces. + * Windows: Assistant now logs to daemon.log."""]] \ No newline at end of file diff --git a/doc/news/version_5.20140709.mdwn b/doc/news/version_5.20140709.mdwn new file mode 100644 index 000000000..e7609949f --- /dev/null +++ b/doc/news/version_5.20140709.mdwn @@ -0,0 +1,11 @@ +git-annex 5.20140709 released with [[!toggle text="these changes"]] +[[!toggleable text=""" + * Fix race in direct mode merge code that could cause all files in the + repository to be removed. It should be able to recover repositories + experiencing this bug without data loss. See: + http://git-annex.branchable.com/bugs/bad\_merge\_commit\_deleting\_all\_files/ + * Fix git version that supported --no-gpg-sign. + * Fix bug in automatic merge conflict resolution, when one side is an + annexed symlink, and the other side is a non-annexed symlink. + * Really fix bug that caused the assistant to make many unncessary + empty merge commits."""]] diff --git a/doc/not.mdwn b/doc/not.mdwn new file mode 100644 index 000000000..3b7cdc1cf --- /dev/null +++ b/doc/not.mdwn @@ -0,0 +1,55 @@ +[[!meta title="what git-annex is not"]] + +* git-annex is not a backup system. It may be a useful component of an + [[archival|use_case/bob]] system, or a way to deliver files to a backup + system. For a backup system that uses git and that git-annex supports + storing data in, see [[special_remotes/bup]]. + +* git-annex is not a filesystem or DropBox clone. However, the git-annex + [[assistant]] is addressing some of the same needs in its own unique ways. + (There is also a FUSE filesystem built on top of git-annex, called + [ShareBox](https://github.com/chmduquesne/sharebox-fs).) + +* git-annex is not unison, but if you're finding unison's checksumming + too slow, or its strict mirroring of everything to both places too + limiting, then git-annex could be a useful alternative. + +* git-annex is more than just a workaround for git scalability + limitations that might eventually be fixed by efforts like + [git-bigfiles](http://caca.zoy.org/wiki/git-bigfiles). In particular, + git-annex's [[location_tracking]] allows having many repositories + with a partial set of files, that are copied around as desired. + +* git-annex is not some flaky script that was quickly thrown together. + I wrote it in Haskell because I wanted it to be solid and to compile + down to a binary. And it has a fairly extensive test suite. (Don't be + fooled by "make test" only showing a few dozen test cases; each test + involves checking dozens to hundreds of assertions.) + +* git-annex is not [git-media](https://github.com/schacon/git-media), + although they both approach the same problem from a similar direction. + I only learned of git-media after writing git-annex, but I probably + would have still written git-annex instead of using it. Currently, + git-media has the advantage of using git smudge filters rather than + git-annex's pile of symlinks, and it may be a tighter fit for certain + situations. It lacks git-annex's support for widely distributed storage, + using only a single backend data store. It also does not support + partial checkouts of file contents, like git-annex does. + +* git-annex is similarly not [git-fat](https://github.com/jedbrown/git-fat), + which also uses git smudge filters, and also lacks git-annex' widely + distributed storage and partial checkouts. + +* git-annex is also not [boar](http://code.google.com/p/boar/), + although it shares many of its goals and characteristics. Boar implements + its own version control system, rather than simply embracing and + extending git. And while boar supports distributed clones of a repository, + it does not support keeping different files in different clones of the + same repository, which git-annex does, and is an important feature for + large-scale archiving. + +* git-annex is not the [Mercurial largefiles extension](http://mercurial.selenic.com/wiki/LargefilesExtension). + Although mercurial and git have some of the same problems around large + files, and both try to solve them in similar ways (standin files using + mostly hashes of the real content). + diff --git a/doc/not/comment_10_d8fb9add7e98dadea2a39f8827f75447._comment b/doc/not/comment_10_d8fb9add7e98dadea2a39f8827f75447._comment new file mode 100644 index 000000000..ad7b699f9 --- /dev/null +++ b/doc/not/comment_10_d8fb9add7e98dadea2a39f8827f75447._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 10" + date="2013-12-11T15:40:35Z" + content=""" +@Zellyn, what you describe does not sound unreasonable. But it's hard to say if it's a backup. For example, if you delete a file from the archive folder, and that happened to be the only copy of the file, it's gone. + +It's definitely possible to use git-annex in backup-like ways, but what I want to discourage is users thinking that just putting files into git-annex means that they have a backup. Proper backups need to be designed, and tested. It helps to use software that is explicitly designed as a backup solution. git-annex is more about file distribution, and some archiving, than backups. +"""]] diff --git a/doc/not/comment_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment b/doc/not/comment_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment new file mode 100644 index 000000000..50c7e0da1 --- /dev/null +++ b/doc/not/comment_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Backup" + date="2013-12-11T17:38:39Z" + content=""" +@joeyh - ok, good to know. So as long as I realize I need to sync with my hard drives before deleting, it should work fine as a backup solution. Sweet! +"""]] diff --git a/doc/not/comment_12_a0ef1a045257659f0f8722e4987e0ccc._comment b/doc/not/comment_12_a0ef1a045257659f0f8722e4987e0ccc._comment new file mode 100644 index 000000000..3f9aa2087 --- /dev/null +++ b/doc/not/comment_12_a0ef1a045257659f0f8722e4987e0ccc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkRtPz8CAz_1sBR0Rf-b8OlQQ49v9JxOIE" + nickname="John" + subject="re: Not an backup" + date="2014-02-05T10:45:45Z" + content=""" +@joeyh.name But if I set numcopies=2 it won't let me drop the file right? I don't think we are mean to directly modify the archive; but if we do would git-annex detect the corruption and discourage us from dropping the other file? +"""]] diff --git a/doc/not/comment_13_c5c20576388f18daba3af913b44fb001._comment b/doc/not/comment_13_c5c20576388f18daba3af913b44fb001._comment new file mode 100644 index 000000000..38c96f707 --- /dev/null +++ b/doc/not/comment_13_c5c20576388f18daba3af913b44fb001._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 13" + date="2014-02-06T17:00:59Z" + content=""" +Yes, git-annex ensures your configured [[numcopies|copies]] is met before dropping a file. +"""]] diff --git a/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment b/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment new file mode 100644 index 000000000..01eb17b86 --- /dev/null +++ b/doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhufs6QGCQXnUEc6qrCcQIZTomUDKNeAQ" + nickname="Jeff" + subject="Git annex in a strange direct with .git/annex/objects mode" + date="2014-04-21T21:03:24Z" + content=""" +I'm doing something perhaps unreasonable and weird, and I'm wondering if there's a better way. + +I'm running a wget -mbc of a particular web site. It replicates down to a tree. +Then I'm ingesting the content into git annex via the normal 'git annex add' sequence. + +Later, when I'm going to update my replica of the website, I am running a 'git annex unlock' on the whole tree (90 gig in this case), and then running the 'wget -mbc ; git annex add' command sequence again. + +Is there any mechanism to convince git-annex to scan the file, and ingest (copy) it into objects if it is new content, while leaving the original files unlocked? This would give me the ability to avoid the 'git annex unlock' copy operation, which is lengthy. + +I'm aware this is inherently space inefficient. + +I'm sure there's some other problem with this idea that I'm missing. + +Thanks. + + +"""]] diff --git a/doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment b/doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment new file mode 100644 index 000000000..369acad22 --- /dev/null +++ b/doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 15" + date="2014-05-16T18:59:47Z" + content=""" +@Jeff, why did you post that comment here? Please use the [[forum]] for questions. + +(You may find it useful to use direct mode, or `git annex import --skip-duplicates` or something.) +"""]] diff --git a/doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment b/doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment new file mode 100644 index 000000000..6a7eed33b --- /dev/null +++ b/doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://bergey.dreamwidth.org/" + ip="66.80.90.109" + subject="git-media" + date="2012-07-14T15:42:05Z" + content=""" +I haven't used git-media, but from the README it looks as though they now support several backends. Might want to update the (very helpful!) comparison. +"""]] diff --git a/doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment b/doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment new file mode 100644 index 000000000..926df6bc1 --- /dev/null +++ b/doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="Sparkleshare" + date="2012-09-06T08:09:17Z" + content=""" +How does [sparkleshare](http://sparkleshare.org/) and git-annex (and git-annex assistant) compare? +"""]] diff --git a/doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment b/doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment new file mode 100644 index 000000000..eb66e0b3d --- /dev/null +++ b/doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 3" + date="2012-09-06T14:50:43Z" + content=""" +My understanding of sparkleshare (I've not used it) is that it uses a regular git repository, so has git's problems with large files and will not support partial checkouts. However, you might want to try it out and see if it works for you. +"""]] diff --git a/doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment b/doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment new file mode 100644 index 000000000..10baf5f45 --- /dev/null +++ b/doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment @@ -0,0 +1,51 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="Sparkleshare" + date="2012-09-15T01:28:05Z" + content=""" +Hi, + +I used sparkleshare lately in a project involving 3 computers and 2 people. and for ascii texts and even a few smaller binary things it works ok. + +But it does \"to much\" for media. at least at the moment, it just uses git for saving the data. That has a possitive and a negative aspect. + +possitive: + +1. you have a full history, if you delete a file its not gone for ever, so if you change it, the older version is still recoverable. +2. if you would as example use it from a laptop in a train without internet and you use a git server in the internet for the central server, and would change some files, then you or somebody else would write on the same txt file as example (html or something... latex...) you would be able to merge this files. +3. its not totaly bad for backup, because you can restore old files even if you delete it localy, because it will hold all history + + +negative: + +1. for bigger data its cracy. if you use it for movies as example, you would in git annex delete some stuff you want not to see anytime again, so you would delete it everywhere. and its really away, not beeing still there in the history +2. git as it is has issues with saving/transfairing very big files, and its slow on even mid-sized files lets say 100 5mb big files it would be slow. because at the moment sparkleshare uses git all this disatvantages are there. +3. as many clients you use lets say a projekt with 10 people, each of them have all files and all the history of this projekt/directory on their pc. +4. you need a central data-store git folder you can use a seperate pc for that or save it on a client, if you use a client for that you have to save the data double on this pc. + +(so you see for big files even if git would handle them faster you would waste massivly hard disk space) but again for pdfs a few pictures text files even some office files and stuff <100mb its great and easy to do. + + +I try it in a few words, sparkleshare is like dropbox but with file history ( I think dropbox dont have that???) but because git is not designed (yet) for big files it works somewhat ok for < 100mb stuff if you go very much higher > 1GB it will not be optimal. + +git annex dont saves the data itself in git but only the locations and the checksums. so its more like a adress book of your data. its a abstraction layer to your data, you can see on as many devises as you want even without no netzwerk internet connection active and only a very small hd see all your 5 Terrabyte of Data you might have, and move around directories sort around them... delete stuff you dont want if you can deside that by the name... and then when you come back to the connection you sync your actions and it does it to the files. + +And one big feature like joey said is that you cannot partialy load files from the repos to your device if it has as example only enough space for 1/10 of it. + +There is another thing, but because it is \"only\" a abstraction layer, it is theoreticaly easy to implement extentions to save your data on anything not only git repositories... + +Sparkleshare will switch to something else than git, maybe but then it will switch to this single protocol and stick to that. because it does not abstract stuff so hard. + +btw there is a alternative out there it forces you not to use git as vcs but you have to use a vcs (like git) and you dont have to use the client written in mono but only a smaller python script: + +http://www.mayrhofer.eu.org/dvcs-autosync + +but the idea behind it is the same except this 2 points ;) + + +but many free software developers dont like mono, so the change that it gets more love from more people is not totaly unlikely. + + +So way to long post but hope that helps somebody ;) +"""]] diff --git a/doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment b/doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment new file mode 100644 index 000000000..02597ceb8 --- /dev/null +++ b/doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn4bbuawnh-nSo9pAh8irYAcV4MQCcfdHo" + nickname="Stefan" + subject="comment 5" + date="2012-09-15T01:35:06Z" + content=""" +or to make it more simple ;) + +sparkleshare is for proejects and maybe backup your documents folder + +annex is for managing big binary files that not get modified most of the time and only added/synced or deleted. + +hope thats on the point, try to start using it also now, but am a bit blowen away what it all can do and what not... and how to get a good use case, and mixing media-management with backup of home and thinking on solving that all with annex without having it used ever ;) +"""]] diff --git a/doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment b/doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment new file mode 100644 index 000000000..9980f0e4c --- /dev/null +++ b/doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 6" + date="2012-09-27T10:17:18Z" + content=""" +Stefan: \"annex is for managing big binary files that not get modified most of the time and only added/synced or deleted.\" + +While this is true, the kickstarter title for assistant was \"Like dropbox\", and dropbox makes it transparent to edit files and they work with the filesystem. +So with assistant, lock/unlock should be automated and transparent to the user. Otherwise it's confusing and not simple at all to use, and at least OSX keeps giving errors because of the way it handles aliases. +So something like sharebox is essential to be included in assistant in my opinion. + +"""]] diff --git a/doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment b/doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment new file mode 100644 index 000000000..f1bb83353 --- /dev/null +++ b/doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="l3iggs" + ip="24.130.145.126" + subject="comment 7" + date="2013-02-03T03:57:05Z" + content=""" +hi joey, + +i'm excited by your project here but also confused by its direction. the kickstarter page has the header: \"git-annex assistant: Like DropBox, but with your own cloud.\" this page says \"git-annex is not a ... DropBox clone.\" these seem to be in direct opposition. + +i'm looking for what is described by the header on your kickstarter page. i assume your backers are looking for the the same thing (a self hosted DropBox). for my use, dropbox is perfect, except for the fact that i have to pay a monthly fee to store my data on someone else's server when i would like to buy my own storage medium and run some open source dropbox clone on my own server. + +can you explain more clearly what dropbox features your project lacks (/will lack)? and why where is a difference between your fundraising page and this one? + +maybe i'm just confused by the difference between git-annex and git-annex assistant. does git-annex assistant truely aim to be a dropbox clone? +"""]] diff --git a/doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment b/doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment new file mode 100644 index 000000000..1a955c862 --- /dev/null +++ b/doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 8" + date="2013-02-04T03:17:06Z" + content=""" +It's pretty much exactly what he said: + +> git-annex is not a filesystem or DropBox clone. However, the git-annex assistant is addressing some of the same needs in its own unique ways. + +The git-annex assistant is not exactly like DropBox; it's not a drop-in replacement that works exactly the way dropbox works. But as it stands, right now, it can (like Dropbox) run in the background and make sure that all of your files in a special directory are mirrored to another place (a USB drive, or a server to which you have SSH access, or another computer on your home network, or another computer somewhere else which has access to the same USB drive from time to time, or has accesss to the same SSH server or S3 repository or.... + +It works as is but is still under heavy development and features are being added rapidly. For example, up until a month or two ago, the files in your annex were replaced with softlinks whose content resided in a hidden directory. This caused some problems esp. on OS X where native programs don't handle softlinked files very gracefully. So Joey added an entirely new way of operating called \"direct mode\" which uses ordinary files, much like Dropbox does. + +So -- what you should expect from git-annex assistant is a program which solves many of the same problems Dropbox does (keeping a set of files magically in sync across computers) but does it in its own way, which won't be *exactly* like Dropbox; it will be more flexible but might require a little learning to figure out exactly how to use it the way you want. It's possible to get a very Dropbox-like system out of the box, especially now that you don't need to use softlinks, if you've got a place on the network you can use as a central remote repository for your files, or if you only want to synchronize two or more computers on the same local network. + +\"git-annex\" itself is the plumbing used by git-annex assistant, or to put it another way, the engine that the assistant has under the hood. Git-annex itself is extremely simple and stable but should only be used by people already familiar with the command line, perhaps even people already familiar with git. + +That's my point of view as an enthusiastic user. Joey may have his own perspective to share. :) + + + + +"""]] diff --git a/doc/not/comment_9_69aa47398a3c13ce64f146de985b727d._comment b/doc/not/comment_9_69aa47398a3c13ce64f146de985b727d._comment new file mode 100644 index 000000000..137cfc2df --- /dev/null +++ b/doc/not/comment_9_69aa47398a3c13ce64f146de985b727d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Not a backup system..." + date="2013-12-10T20:55:05Z" + content=""" +I'd like to understand the \"not a backup system\" point better. My current plan was to use git annex assistant to save my annex folder onto two hard drives, one at home and one at work. Step two is to move most big stuff into .../archive/... folders, and step three is to add an annex folder on my wife's laptop, so we can use the hard drives to back up everything. + +Does that sound unreasonable? +"""]] diff --git a/doc/polls.mdwn b/doc/polls.mdwn new file mode 100644 index 000000000..55c779867 --- /dev/null +++ b/doc/polls.mdwn @@ -0,0 +1,2 @@ +* [[2013 git-annex user survey|2013]] +* [[old polls|design/assistant/polls]] diff --git a/doc/polls/2013.mdwn b/doc/polls/2013.mdwn new file mode 100644 index 000000000..bda584d64 --- /dev/null +++ b/doc/polls/2013.mdwn @@ -0,0 +1,5 @@ +This has moved to a separate site due to load issues. + + + +Any votes you made here were carried over, so no need to vote twice! diff --git a/doc/preferred_content.mdwn b/doc/preferred_content.mdwn new file mode 100644 index 000000000..ec499de25 --- /dev/null +++ b/doc/preferred_content.mdwn @@ -0,0 +1,179 @@ +git-annex tries to ensure that the configured number of [[copies]] of your +data always exist, and leaves it up to you to use commands like `git annex +get` and `git annex drop` to move the content to the repositories you want +to contain it. But often, it can be good to have more fine-grained +control over which content is wanted by which repositories. Configuring +this allows the git-annex assistant as well as +`git annex get --auto`, `git annex drop --auto`, `git annex sync --content`, +etc to do smarter things. + +Preferred content settings can be edited using `git +annex vicfg`, or viewed and set at the command line with `git annex wanted`. +Each repository can have its own settings, and other repositories will +try to honor those settings when interacting with it. +(So there's no local `.git/config` for preferred content settings.) + +[[!template id=note text=""" +### [[quickstart|standard_groups]] + +Rather than writing your own preferred content expression, you can use +several standard ones included in git-annex that are tuned to cover different +common use cases. + +You do this by putting a repository in a group, +and simply setting its preferred content to "standard" to match whatever +is standard for that group. See [[standard_groups]] for a list. +"""]] + +The idea is that you write an expression that files are matched against. +If a file matches, the repository wants to store its content. +If it doesn't, the repository wants to drop its content +(if there are enough copies elsewhere to allow removing it). + +To check at the command line which files are matched by preferred content +settings, you can use the --want-get and --want-drop options. + +For example, `git annex find --want-get --not --in .` will find all the +files that `git annex get --auto` will want to get, and `git annex find +--want-drop --in .` will find all the files that `git annex drop --auto` +will want to drop. + +The expressions are very similar to the matching options documented +on the [[git-annex]] man page. At the command line, you can use those +options in commands like this: + + git annex get --include='*.mp3' --and -'(' --not --largerthan=100mb -')' + +The equivilant preferred content expression looks like this: + + include=*.mp3 and (not largerthan=100mb) + +So, just remove the dashes, basically. However, there are some differences +from the command line options to keep in mind: + +### difference: file matching + +While --include and --exclude match files relative to the current +directory, preferred content expressions always match files relative to the +top of the git repository. Perhaps you put files into `archive` directories +when you're done with them. Then you could configure your laptop to prefer +to not retain those files, like this: + + exclude=*/archive/* + +### difference: no "in=" + +Preferred content expressions have no direct equivilant to `--in`. + +Often, it's best to add repositories to groups, and match against +the groups in a preferred content expression. So rather than +`--in=usbdrive`, put all the USB drives into a "transfer" group, +and use "copies=transfer:1" + +### difference: dropping + +To decide if content should be dropped, git-annex evaluates the preferred +content expression under the assumption that the content has *already* been +dropped. If the content would not be wanted then, the drop can be done. +So, for example, `copies=2` in a preferred content expression lets +content be dropped only when there are currently 3 copies of it, including +the repo it's being dropped from. This is different than running `git annex +drop --copies=2`, which will drop files that currently have 2 copies. + +### difference: "present" + +There's a special "present" keyword you can use in a preferred content +expression. This means that content is wanted if it's present, +and not otherwise. This leaves it up to you to use git-annex manually +to move content around. You can use this to avoid preferred content +settings from affecting a subdirectory. For example: + + auto/* or (include=ad-hoc/* and present) + +Note that `not present` is a very bad thing to put in a preferred content +expression. It'll make it want to get content that's not present, and +drop content that is present! Don't go there.. + +### difference: "inpreferreddir" + +There's a special "inpreferreddir" keyword you can use in a +preferred content expression of a special remote. This means that the +content is preferred if it's in a directory (located anywhere in the tree) +with a special name. + +The name of the directory can be configured using +`git annex enableremote $remote preferreddir=$dirname` + +(If no directory name is configured, it uses "public" by default.) + +### difference: "standard" + +git-annex comes with some built-in preferred content expressions, that +can be used with repositories that are in some [[standard_groups]]. + +When a repository is in exactly one such group, you can use the "standard" +keyword in its preferred content expression, to match whatever content +the group's expression matches. +(If a repository is put into multiple standard +groups, "standard" will match anything.. so don't do that!) + +Most often, the whole preferred content expression is simply "standard". +But, you can do more complicated things, for example: +"`standard or include=otherdir/*`" + +### difference: "groupwanted" + +The "groupwanted" keyword can be used to refer to a preferred content +expression that is associated with a group. This is like the "standard" +keyword, but you can set up groupwanted preferred content expressions +using `git annex vicfg`. + +Note that when writing a groupwanted preferred content expression, +you can use all of the keywords listed above, including "standard". +(But not "groupwanted".) + +For example, to make a variant of the standard client preferred content +expression that does not want files in the "out" directory, you +could set `groupwanted client = standard and exclude=out/*`. +Then repositories that are in the client group and have their preferred +content expression set to "groupwanted" will use that, while +other client repositories that have their preferred content expression +set to "standard" will use the standard expression. + +Or, you could make a new group, with your own custom preferred content +expression tuned for your needs, and every repository you put in this +group and make its preferred content be "groupwanted" will use it. + +### difference: metadata matching + +This: + + git annex get --metadata tag=done + +becomes + + metadata=tag=done + +## upgrades + +It's important that all clones of a repository can understand one-another's +preferred content expressions, especially when using the git-annex +assistant. So using newly added keywords can cause a problem if +an older version of git-annex is in use elsewhere. + +Before git-annex version 5.20140320, when git-annex saw a keyword it +did not understand, it defaulted to assuming *all* files were +preferred content. From version 5.20140320, git-annex has a nicer fallback +behavior: When it is unable to parse a preferred content expression, +it assumes all files that are currently present are preferred content. + +Here are recent changes to preferred content expressions, and the version +they were added in. + +* "standard" 5.20140314 + (only when used in a more complicated expression; "standard" by + itself has been supported for a long time) +* "groupwanted=" 5.20140314 +* "metadata=" 5.20140221 +* "lackingcopies=", "approxlackingcopies=", "unused=" 5.20140127 +* "inpreferreddir=" 4.20130501 diff --git a/doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment b/doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment new file mode 100644 index 000000000..cd7c36fe4 --- /dev/null +++ b/doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 10" + date="2013-10-11T17:12:00Z" + content=""" +Georg, `drop --auto` will only drop files that are not preferred content. I'd need to know what preferred content expression you're using to say more. +"""]] diff --git a/doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment b/doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment new file mode 100644 index 000000000..728e23dc2 --- /dev/null +++ b/doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="Interplay with numcopies" + date="2012-12-05T20:41:26Z" + content=""" +How does the preferred content settings interfere with the numcopies setting? + +I could not get behind it. E.g. a case I do not unterstand: + +I have a preferred setting evaluating to true and still + + git annex get --auto + +does nothing, if the number of copies produced would surpass the numcopies setting. + + +Thx +"""]] diff --git a/doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment b/doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment new file mode 100644 index 000000000..51e5f2701 --- /dev/null +++ b/doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 2" + date="2012-12-06T17:24:29Z" + content=""" +Yeah, that didn't make sense. I've fixed it, so it gets files if needed for either numcopies or preferred content. +"""]] diff --git a/doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment b/doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment new file mode 100644 index 000000000..e6d13ca04 --- /dev/null +++ b/doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 4" + date="2012-12-10T19:46:01Z" + content=""" +It was a bug in the backup group's preferred content pagespec, introduced by the changes I made to fix the previous problem. Now fixed. +"""]] diff --git a/doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment b/doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment new file mode 100644 index 000000000..0ac5dec52 --- /dev/null +++ b/doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 4" + date="2012-12-07T20:24:18Z" + content=""" +Built a new copy of git-annex yesterday. I have a \"client\" on my macbook, and two \"backup\"s, one on an external HD, one on an ssh git remote. + +git annex get --auto works beautifully! + +It doesn't seem to work for copying content *to* a place where it's needed, though. + +If I drop a file from my \"backup\" USB drive, and then go back to my macbook and do a \"git annex sync\" and \"git annex copy --to=usbdrive --auto\" it does not send the file out to the USB drive, even though by preferred content settings, the USB drive should \"want\" the file because it's a backup drive and it wants all content. + +Similarly, if I add a new file on my macbook and then do a \"git annex copy --to=usbdrive auto\" it does not get copied to the USB drive. + +Is this missing functionality, or should the preferred content setting for remotes only affect the assistant? +"""]] diff --git a/doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment b/doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment new file mode 100644 index 000000000..7074541eb --- /dev/null +++ b/doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2012-12-11T16:03:04Z" + content=""" +thanks! + +"""]] diff --git a/doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment b/doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment new file mode 100644 index 000000000..12deccb35 --- /dev/null +++ b/doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 6" + date="2013-01-10T03:00:52Z" + content=""" +Is there a way to change these definitions for a given annex? + +ie: in this repo make \"client\" mean + + present and exclude=*/archive/* and exclude=archive/* +"""]] diff --git a/doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment b/doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment new file mode 100644 index 000000000..3beac6ba8 --- /dev/null +++ b/doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 7" + date="2013-01-10T03:51:38Z" + content=""" +Sorry, there's not. The expressions used for \"standard\" are built in. +"""]] diff --git a/doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment b/doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment new file mode 100644 index 000000000..3c914ee92 --- /dev/null +++ b/doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 8" + date="2013-01-10T10:24:28Z" + content=""" +By way of a feature request: Maybe the way to do this is to have an additional keyword like \"config\" or \"repo\" that allows you to use vicfg and/or git config to set alternative rules and even additional group names. + +In git config: + + annex.groups. = present and exclude=*/archive/* and exclude=archive/* + +in vicfg: + + # (for passport) + #trust A0637025-ED47-4F95-A887-346121F1B4A0 = semitrusted + + # (for passport) + group A0637025-ED47-4F95-A887-346121F1B4A0 = transfer + + # (for passport) + preferred-content A0637025-ED47-4F95-A887-346121F1B4A0 = repo + + # (for transfer) + group-content transfer = present and exclude=*/archive/* and exclude=archive/* + +"""]] diff --git a/doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment b/doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment new file mode 100644 index 000000000..e1c2d4164 --- /dev/null +++ b/doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="drop only files located in archive" + date="2013-10-08T17:53:08Z" + content=""" +Is there a way to drop only the files that are located in an \"archive\" directory? +I want to drop all files when calling + + git annex drop --auto + +if I move them to the archive. But I want to keep the files that are outside of the archive, even if they are already present in other repos. As far as I have seen and tested, as soon as I have the files in an other repo all files get dropped, also the ones outside the archive directory. Or do I have to increase \"numcopies\" in order to circumvent the \"(not copies=semitrusted+:1)\" case? +"""]] diff --git a/doc/preferred_content/standard_groups.mdwn b/doc/preferred_content/standard_groups.mdwn new file mode 100644 index 000000000..5622dcb57 --- /dev/null +++ b/doc/preferred_content/standard_groups.mdwn @@ -0,0 +1,126 @@ +git-annex comes with some built-in [[preferred_content]] settings, that can +be used with repositories that are in special groups. To make a +repository use one of these, just set its preferred content expression +to "standard", and put it in one of these groups. For example, to put the current +repository in the manual group and use this group to control the preferred +content, run + + git annex wanted . standard + git annex group . manual + +In the webapp, just edit the repository and select the group. + +(Note that most of these standard expressions also make the repository +want to get any content that is only currently available on untrusted and +dead repositories. So if an untrusted repository gets connected, +any repository that can will back it up.) + +The following standard groups are available: + +### client + +All content is wanted, unless it's for a file in a "archive" directory, +which has reached an archive repository, or is unused. + +`(((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1` + +### transfer + +Use for repositories that are used to transfer data between other +repositories, but do not need to retain data themselves. For +example, a repository on a server, or in the cloud, or a small +USB drive used in a sneakernet. + +The preferred content expression for these causes them to get and retain +data until all clients have a copy. + +`not (inallgroup=client and copies=client:2) and ($client)` + +(Where $client is a copy of the preferred content expression used for +clients.) + +The "copies=client:2" part of the above handles the case where +there is only one client repository. It makes a transfer repository +speculatively prefer content in this case, even though it as of yet +has nowhere to transfer it to. Presumably, another client repository +will be added later. + +### backup + +All content is wanted. Even content of old/deleted files. + +`include=* or unused` + +### incremental backup + +Only wants content that's not already backed up to another backup +or incremental backup repository. + +`((include=* or unused) and (not copies=backup:1) and (not copies=incrementalbackup:1)) or approxlackingcopies=1` + +### small archive + +Only wants content that's located in an "archive" directory, and +only if it's not already been archived somewhere else. + +`((include=*/archive/* or include=archive/*) and not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1` + +### full archive + +All content is wanted, unless it's already been archived somewhere else. + +`(not (copies=archive:1 or copies=smallarchive:1)) or approxlackingcopies=1` + +Note that if you want to archive multiple copies (not a bad idea!), +you can set `groupwanted archive` to a version of +the above preferred content expression with a larger number of copies +than 1. Then make the archive repositories have a preferred +content expression of "groupwanted" in order to use your modified +version. + +### source + +Use for repositories where files are often added, but that do not need to +retain files for local use. For example, a repository on a camera, where +it's desirable to remove photos as soon as they're transferred elsewhere. + +The preferred content expression for these causes them to only retain +data until a copy has been sent to some other repository. + +`not (copies=1)` + +### manual + +This gives you nearly full manual control over what content is stored in the +repository. This allows using the [[assistant]] without it trying to keep a +local copy of every file. Instead, you can manually run `git annex get`, +`git annex drop`, etc to manage content. Only content that is already +present is wanted. + +The exception to this manual control is that content that a client +repository would not want is not wanted. So, files in archive +directories are not wanted once their content has +reached an archive repository. + +`present and ($client)` + +(Where $client is a copy of the preferred content expression used for +clients.) + +### public + +This is used for publishing information to a repository that can be +publically accessed. Only files in a directory with a particular name +will be published. (The directory can be located anywhere in the +repository.) + +The name of the directory can be configured using +`git annex enableremote $remote preferreddir=$dirname` + +### unwanted + +Use for repositories that you don't want to exist. This will result +in any content on them being moved away to other repositories. (Works +best when the unwanted repository is also marked as untrusted or dead.) + +`exclude=*` diff --git a/doc/preferred_content/standard_groups/comment_1_026e47e425d06c4b2580238b3187a379._comment b/doc/preferred_content/standard_groups/comment_1_026e47e425d06c4b2580238b3187a379._comment new file mode 100644 index 000000000..9a06d3791 --- /dev/null +++ b/doc/preferred_content/standard_groups/comment_1_026e47e425d06c4b2580238b3187a379._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + ip="2a01:e35:2f7b:8350:290:f5ff:feea:5546" + subject="difference between source and unwanted" + date="2014-04-02T22:25:26Z" + content=""" +What's the difference between `source` and `unwanted` ? + +- `source` (`not copies=1`) will keep files that have less than 1 copies, meaning zero copies, meaning no files. +- `unwanted` will exclude all files. + +Both gets to the same results, all files are moved elsewhere. Right? +"""]] diff --git a/doc/preferred_content/standard_groups/comment_2_460bae34ba7c05357318a202b2932d25._comment b/doc/preferred_content/standard_groups/comment_2_460bae34ba7c05357318a202b2932d25._comment new file mode 100644 index 000000000..c877a9222 --- /dev/null +++ b/doc/preferred_content/standard_groups/comment_2_460bae34ba7c05357318a202b2932d25._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 2" + date="2014-04-02T22:44:14Z" + content=""" +@Mildred, I think both preferred content expressions will do the same thing. There is, however a difference between the groups: The webapp notices when all files have gone from an unwanted repository, and will help the user finish deleting the repository. +"""]] diff --git a/doc/privacy.mdwn b/doc/privacy.mdwn new file mode 100644 index 000000000..3ac4b1eec --- /dev/null +++ b/doc/privacy.mdwn @@ -0,0 +1,47 @@ +git-annex users entrust it with data that is often intensively private. +Here's some things to know about how to maintain your privacy while using +git-annex. + +## browsing this web site + +This website supports https. [Use it.](https://git-annex.branchable.com/privacy/) + +## repository contents + +In general, anyone who can clone a git repository gets the ability to see +all current and past filenames in the repository, and their contents. +It's best to assume this also holds true for git-annex, as a general rule. + +There are some obvious exceptions: If you `git annex dropunused` old +content from all your repositories, then it's *gone*. If you `git annex +move` files to a offline drive then only those with physical access can see +their content. (The names of the files are still visible to anyone with a +clone of the repository.) + +git-annex can encrypt data stored in special remotes. This allows you to +store files in the cloud without exposing their file names, or their +contents. See [[design/encryption]] for details. + +When using the shared encryption method, the encryption key gets stored +in git, and so anyone who has a clone of your repository can decrypt files +from the encrypted special remote. + +When using encryption with a GPG key or keys, only those with access to the +GPG key can decrypt the content of files stored in an encrypted special +remote. + +## bug reporting + +When you file a [[bug|bugs]] report on git-annex, you may need to provide +debugging output or details about your repository. In general, git-annex +does not sanitize `--debug` output at all, so it may include the names of +files or other repository details. You should review any debug or other +output you post, and feel free to remove identifying information. + +Note that the git-annex assistant *does* sanitize XMPP protocol information +logged when debugging is enabled. + +If you prefer not to post information publicaly, you can send a GPG +encrypted mail to Joey Hess (gpg key ID 2512E3C7). +Or you can post a public bug report, and send a followup email with private +details. diff --git a/doc/publicrepos.mdwn b/doc/publicrepos.mdwn new file mode 100644 index 000000000..625522d34 --- /dev/null +++ b/doc/publicrepos.mdwn @@ -0,0 +1,19 @@ +git-annex repositories are often kept private, but here's a list of some of +the public repositories that you can clone to try out git-annex. + +* [downloads.kitenet.net](http://downloads.kitenet.net/) + `git clone https://downloads.kitenet.net/.git/` + Various downloads of things produced by Joey Hess, including git-annex + builds and videos. +* debconf-share + `git clone http://annex.debconf.org/debconf-share/.git/` + [DebConf](http://debconf.org/) Media, photos, videos, etc. +* [conference-proceedings](https://github.com/RichiH/conference_proceedings) + `git clone https://github.com/RichiH/conference_proceedings.git` + A growing collection of videos of technology conferences. + Submit a pull request to add your own! +* [ocharles's papers](https://github.com/ocharles/papers) + Lots of CS papers read by [Oliver](http://ocharles.org.uk/blog/). + +This is a wiki -- add your own public repository to the list! +See [[tips/centralized_git_repository_tutorial]]. diff --git a/doc/related_software.mdwn b/doc/related_software.mdwn new file mode 100644 index 000000000..0cd7d7fc8 --- /dev/null +++ b/doc/related_software.mdwn @@ -0,0 +1,15 @@ +Some folks have built other software on top of git-annex, or that is +designed to interoperate with it. + +* The [[git-annex assistant|assistant]] is included in git-annex, + and extends its use cases into new territory. +* [git-annex-watcher](https://github.com/rubiojr/git-annex-watcher) + is a status icon for your desktop. +* [[forum/gadu_-_git-annex_disk_usage]] is a du like utility that + is git-annex aware. +* [sizes](http://hackage.haskell.org/package/sizes) is another du-like + utility, with a `-A` switch that enables git-annex support. +* Emacs Org mode can auto-commit attached files to git-annex. +* [git annex darktable integration](https://github.com/xxv/darktable-git-annex) +* Emacs's [Magit mode](http://www.emacswiki.org/emacs/Magit) has + [magit integration](http://melpa.milkbox.net/?utm_source=dlvr.it&utm_medium=twitter#/magit-annex) diff --git a/doc/repomap.png b/doc/repomap.png new file mode 100644 index 000000000..dcd777e12 Binary files /dev/null and b/doc/repomap.png differ diff --git a/doc/required_content.mdwn b/doc/required_content.mdwn new file mode 100644 index 000000000..91c5614a8 --- /dev/null +++ b/doc/required_content.mdwn @@ -0,0 +1,17 @@ +Required content settings can be configured to do more complicated +things than just setting the required number of [[copies]] of your data. +For example, you could require that data be archived in at least two +archival repositories, and also require that one copy be stored offsite. + +The format of required content expressions is the same as +[[preferred_content]] expressions. + +Required content settings can be edited using `git annex vicfg`. +Each repository can have its own settings, and other repositories will +try to honor those settings when interacting with it. + +While [[preferred_content]] expresses a preference, it can be overridden +by simply using `git annex drop`. On the other hand, required content +settings are enforced; `git annex drop` will refuse to drop a file if +doing so would violate its required content settings. +(Although even this can be overridden using `--force`). diff --git a/doc/scalability.mdwn b/doc/scalability.mdwn new file mode 100644 index 000000000..cdc148e2f --- /dev/null +++ b/doc/scalability.mdwn @@ -0,0 +1,39 @@ +git-annex is designed for scalability. The key points are: + +* Arbitrarily large files can be managed. The only constraint + on file size are how large a file your filesystem can hold. + + While git-annex does checksum files by default, there + is a [[WORM_backend|backends]] available that avoids the checksumming + overhead, so you can add new, enormous files, very fast. This also + allows it to be used on systems with very slow disk IO. + +* Memory usage should be constant. This is a "should", because there + can sometimes be leaks (and this is one of haskell's weak spots), + but git-annex is designed so that it does not need to hold all + the details about your repository in memory. + +* Many files can be managed. The limiting factor is git's own + limitations in scaling to repositories with a lot of files, and as git + improves this will improve. Scaling to hundreds of thousands of files + is not a problem, scaling beyond that and git will start to get slow. + + To some degree, git-annex works around inefficiencies in git; for + example it batches input sent to certain git commands that are slow + when run in an enormous repository. + +* It can use as much, or as little bandwidth as is available. In + particular, any interrupted file transfer can be resumed by git-annex. + +## scalability tips + +* If the files are so big that checksumming becomes a bottleneck, consider + using the [[WORM_backend|backends]]. You can always `git annex migrate` + files to a checksumming backend later on. + +* If you're adding a huge number of files at once (hundreds of thousands), + you'll soon notice that git-annex periodically stops and say + "Recording state in git" while it runs a `git add` command that + becomes increasingly expensive. Consider adjusting the `annex.queuesize` + to a higher value, at the expense of it using more memory. + diff --git a/doc/shortcuts.mdwn b/doc/shortcuts.mdwn new file mode 100644 index 000000000..d0f647a64 --- /dev/null +++ b/doc/shortcuts.mdwn @@ -0,0 +1,12 @@ +[[!if test="enabled(shortcut)" + then="This wiki has shortcuts **enabled**." + else="This wiki has shortcuts **disabled**."]] + +This page controls what shortcut links the wiki supports. + +* [[!shortcut name=debbug url="http://bugs.debian.org/%S" desc="Debian bug #%s"]] +* [[!shortcut name=iki url="http://ikiwiki.info/%S/"]] +* [[!shortcut name=rfc url="https://www.ietf.org/rfc/rfc%s.txt" desc="RFC %s"]] +* [[!shortcut name=cve url="https://cve.mitre.org/cgi-bin/cvename.cgi?name=%s"]] +* [[!shortcut name=hackage url="http://hackage.haskell.org/package/%s"]] +* [[!shortcut name=commit url="http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=%s"]] diff --git a/doc/sidebar.mdwn b/doc/sidebar.mdwn new file mode 100644 index 000000000..ea11991a6 --- /dev/null +++ b/doc/sidebar.mdwn @@ -0,0 +1,12 @@ +[[!img logo_small.png link=no]] + +* [[install]] +* [[assistant]] +* [[walkthrough]] +* [[tips]] +* [[bugs]] +* [[todo]] +* [[forum]] +* [[comments]] +* [[contact]] +* [Flattr this](http://flattr.com/thing/84843/git-annex) diff --git a/doc/sitemap.mdwn b/doc/sitemap.mdwn new file mode 100644 index 000000000..c854ed639 --- /dev/null +++ b/doc/sitemap.mdwn @@ -0,0 +1,4 @@ +[[!map pages="page(*) and !*/discussion and !recentchanges +and !bugs/* and !examples/*/* and !news/* and !tips/* and !videos/* +and !design/assistant/blog/* +and !forum/* and !todo/* and !users/* and !ikiwiki/*"]] diff --git a/doc/special_remotes.mdwn b/doc/special_remotes.mdwn new file mode 100644 index 000000000..2ef98c40d --- /dev/null +++ b/doc/special_remotes.mdwn @@ -0,0 +1,83 @@ +git-annex can transfer data to and from configured git remotes. +Normally those remotes are normal git repositories (bare and non-bare; +local and remote), that store the file contents in their own git-annex +directory. + +But, git-annex also extends git's concept of remotes, with these special +types of remotes. These can be used just like any normal remote by git-annex. +They cannot be used by other git commands though. + +* [[S3]] (Amazon S3, and other compatible services) +* [[Amazon_Glacier|glacier]] +* [[bup]] +* [[ddar]] +* [[gcrypt]] (encrypted git repositories!) +* [[directory]] +* [[rsync]] +* [[webdav]] +* [[tahoe]] +* [[web]] +* [[xmpp]] +* [[hook]] + +The above special remotes are built into git-annex, and can be used +to tie git-annex into many cloud services. + +Here are specific instructions +for using git-annex with various services: + +* [[Amazon_S3|tips/using_Amazon_S3]] +* [[Amazon_Glacier|tips/using_Amazon_Glacier]] +* [[tips/Internet_Archive_via_S3]] +* [[Box.com|tips/using_box.com_as_a_special_remote]] +* [[Google drive|tips/googledriveannex]] +* [[Google Cloud Storage|tips/using_Google_Cloud_Storage]] +* [[Mega.co.nz|tips/megaannex]] +* [[SkyDrive|tips/skydriveannex]] +* [[OwnCloud|tips/owncloudannex]] +* [[Flickr|tips/flickrannex]] +* [[IMAP|forum/special_remote_for_IMAP]] +* [[Usenet|forum/nntp__47__usenet special remote]] +* [chef-vault](https://github.com/3ofcoins/knife-annex/) +* [hubiC](https://github.com/Schnouki/git-annex-remote-hubic) +* [pCloud](https://github.com/tochev/git-annex-remote-pcloud) + +Want to add support for something else? [[Write your own!|external]] + +## Ways to use special remotes + +There are many use cases for a special remote. You could use it as a +backup. You could use it to archive files offline in a drive with +encryption enabled so if the drive is stolen your data is not. You could +git annex move --to specialremote large files when your local drive is +getting full, and then git annex move the files back when free space is +again available. You could have one repository copy files to a special +remote, and then git annex get them on another repository, to transfer the +files between computers that do not communicate directly. + +The git-annex assistant makes it easy to set up rsync remotes using this +last scenario, which is referred to as a transfer repository, and arranges +to drop files from the transfer repository once they have been transferred +to all known clients. + +None of these use cases are particular to particular special remote types. +Most special remotes can all be used in these and other ways. It largely +doesn't matter for your use what underlying transport the special remote +uses. + +## Unused content on special remotes + +Over time, special remotes can accumulate file content that is no longer +referred to by files in git. Normally, unused content in the current +repository is found by running `git annex unused`. To detect unused content +on special remotes, instead use `git annex unused --from`. Example: + + $ git annex unused --from mys3 + unused mys3 (checking for unused data...) + Some annexed data on mys3 is not used by any files in this repository. + NUMBER KEY + 1 WORM-s3-m1301674316--foo + (To see where data was previously used, try: git log --stat -S'KEY') + (To remove unwanted data: git-annex dropunused --from mys3 NUMBER) + $ git annex dropunused --from mys3 1 + dropunused 12948 (from mys3...) ok diff --git a/doc/special_remotes/S3.mdwn b/doc/special_remotes/S3.mdwn new file mode 100644 index 000000000..5291a4eb6 --- /dev/null +++ b/doc/special_remotes/S3.mdwn @@ -0,0 +1,53 @@ +This special remote type stores file contents in a bucket in Amazon S3 +or a similar service. + +See [[tips/using_Amazon_S3]] and +[[tips/Internet_Archive_via_S3]] for usage examples. + +## configuration + +The standard environment variables `AWS_ACCESS_KEY_ID` and +`AWS_SECRET_ACCESS_KEY` are used to supply login credentials +for Amazon. You need to set these only when running +`git annex initremote`, as they will be cached in a file only you +can read inside the local git repository. + +A number of parameters can be passed to `git annex initremote` to configure +the S3 remote. + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `embedcreds` - Optional. Set to "yes" embed the login credentials inside + the git repository, which allows other clones to also access them. This is + the default when gpg encryption is enabled; the credentials are stored + encrypted and only those with the repository's keys can access them. + + It is not the default when using shared encryption, or no encryption. + Think carefully about who can access your repository before using + embedcreds without gpg encryption. + +* `datacenter` - Defaults to "US". Other values include "EU", + "us-west-1", and "ap-southeast-1". + +* `storageclass` - Default is "STANDARD". If you have configured git-annex + to preserve multiple [[copies]], consider setting this to "REDUCED_REDUNDANCY" + to save money. + +* `host` and `port` - Specify in order to use a different, S3 compatable + service. + +* `bucket` - S3 requires that buckets have a globally unique name, + so by default, a bucket name is chosen based on the remote name + and UUID. This can be specified to pick a bucket name. + +* `fileprefix` - By default, git-annex places files in a tree rooted at the + top of the S3 bucket. When this is set, it's prefixed to the filenames + used. For example, you could set it to "foo/" in one special remote, + and to "bar/" in another special remote, and both special remotes could + then use the same bucket. + +* `x-amz-*` are passed through as http headers when storing keys + in S3. diff --git a/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment b/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment new file mode 100644 index 000000000..bc06156cf --- /dev/null +++ b/doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-05-23T20:04:03Z" + content=""" +You can enable a special remote on a clone by running `git annex enableremote $name`, where $name is the name you used to originally create the special remote. (Older versions of git-annex used `git annex initremote` to enable the special remote on the clone.) + +(Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.) +"""]] diff --git a/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment b/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment new file mode 100644 index 000000000..5cd9b7311 --- /dev/null +++ b/doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="basak" + ip="2001:8b0:1c8::2" + subject="comment 11" + date="2013-05-24T09:38:40Z" + content=""" +Thanks Joey - initremote on my slightly older version appears to work. I'll use `enableremote` when I can. + +> (Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.) + +This doesn't do what I expect. The documentation suggests that my S3 _login_ credentials would be stored. I understand that the cipher would be stored; but isn't this a separate concept? Instead, I'm being asked to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`; my understanding was that git-annex will keep them in the repository for me, so that I don't have to set them after running `initremote` before cloning. This works, apart from surviving the cloning. I'm using `encryption=shared`; does this affect anything? Or am I using a version of git-annex (3.20121112ubuntu3) that's too old? +"""]] diff --git a/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment b/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment new file mode 100644 index 000000000..47b0aaefa --- /dev/null +++ b/doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-05-24T15:33:12Z" + content=""" +Ah -- No, your AWS creds are not stored. While some other special remotes, like webdav, can store all necessary credentials, it's not done for AWS. I didn't want git-annex to be responsible for someone accidentially publishing their AWS creds to their friends, since that could cost them a lot of money. +"""]] diff --git a/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment b/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment new file mode 100644 index 000000000..c8e84021b --- /dev/null +++ b/doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="basak" + ip="2001:8b0:1c8::2" + subject="comment 13" + date="2013-05-24T15:47:14Z" + content=""" +That's not what the documentation here says! It even warns me: \"Think carefully about who can access your repository before using embedcreds without gpg encryption.\" + +My use case: + +Occasional use of EC2, and a desire to store some persistent stuff in S3, since the dataset is large and I have limited bandwidth. I want to destroy the EC2 instance when I'm not using it, leaving the data in S3 for later. + +If I use git-annex to manage the S3 store, then I get the ability to clone the repository and destroy the instance. Later, I can start a new instance, push the repo back up, and would like to be able to then pull the data back out of S3 again. + +I'd really like the login credentials to persist in the repository (as the documentation here says it should). Even if I have to add a --yes-i-know-my-s3-credentials-will-end-up-available-to-anyone-who-can-see-my-git-repo flag. This is because I use some of my git repos to store private data, too. + +If I use an Amazon IAM policy as follows, I can generate a set of credentials that are limited to access to a particular prefix of a specific S3 bucket only - effectively creating a sandboxed area just for git-annex: + + { + \"Statement\": [{\"Sid\": \"Stmt1368780615583\", + \"Action\": [\"s3:GetObject\", \"s3:PutObject\", \"s3:DeleteObject\"], + \"Effect\": \"Allow\", + \"Resource\": [\"arn:aws:s3:::bucketname/prefix/*\"]} + ], + \"Statement\": [{\"Sid\": \"Stmt1368781573129\", + \"Action\": [\"s3:GetBucketLocation\"], + \"Effect\": \"Allow\", + \"Resource\": [\"arn:aws:s3:::bucketname\"]} + ] + } + +Doing this means that I have a different set of credentials for every annex, so it would be really useful to be able have these stored and managed within the repository itself. Each set is limited to what the annex stores, so there is no bigger compromise I have to worry about apart from the compromise of the data that the annex itself manages. +"""]] diff --git a/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment b/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment new file mode 100644 index 000000000..2285e9062 --- /dev/null +++ b/doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 14" + date="2013-05-24T16:45:25Z" + content=""" +I apologise for incorrect information. I was thinking about defaults when using the webapp. + +I have verified that embedcreds=yes stores the AWS creds, always. + + +"""]] diff --git a/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment b/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment new file mode 100644 index 000000000..a8b5573e7 --- /dev/null +++ b/doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio" + nickname="Tobias" + subject="different s3 storage URLs" + date="2013-08-23T08:59:32Z" + content=""" +Is it possible to change the S3 endpoint hosts? I'm running a radosgw with S3 support which I'd like to define as S3 remote for git-annex +"""]] diff --git a/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment b/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment new file mode 100644 index 000000000..508cedca4 --- /dev/null +++ b/doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 16" + date="2013-08-23T17:39:56Z" + content=""" +Yes, you can specify the host to use when setting up the remote. It's actually documented earlier on this very page, if ou search for \"host\". Any S3 compatabile host will probably work -- the Internet Archive's S3 does, for example. +"""]] diff --git a/doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment b/doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment new file mode 100644 index 000000000..17e35e7d9 --- /dev/null +++ b/doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY" + nickname="Matt" + subject="environment variables" + date="2012-05-29T12:40:25Z" + content=""" +Just noting that the environment variables `ANNEX_S3_ACCESS_KEY_ID` and `ANNEX_S3_SECRET_ACCESS_KEY` seem to have been changed to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` +"""]] diff --git a/doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment b/doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment new file mode 100644 index 000000000..f535559ae --- /dev/null +++ b/doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 2" + date="2012-05-29T19:10:46Z" + content=""" +Thanks, I've fixed that. (You could have too.. this is a wiki ;) +"""]] diff --git a/doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment b/doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment new file mode 100644 index 000000000..abb6aacc9 --- /dev/null +++ b/doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY" + nickname="Matt" + subject="comment 3" + date="2012-05-30T00:26:33Z" + content=""" +Thanks! Being new here, I didn't want to overstep my boundaries. I've gone ahead and made a small edit and will do so elsewhere as needed. +"""]] diff --git a/doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment b/doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment new file mode 100644 index 000000000..8c17f7d64 --- /dev/null +++ b/doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmX5gPNK35Dub-HzR0Yb3KXllbqc0rYRYs" + nickname="Eduardo" + subject="bucket/folder s3 remotes" + date="2012-08-09T10:52:07Z" + content=""" +it'd be really nice being able to configure a S3 remote of the form `/` (not really a folder, of course, just the usual prefix trick used to simulate folders at S3). The remote = bucket architecture is not scalable at all, in terms of number of repositories. + +how hard would it be to support this? + +thanks, this is the only thing that's holding us back from using git-annex, nice tool! +"""]] diff --git a/doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment b/doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment new file mode 100644 index 000000000..325db6799 --- /dev/null +++ b/doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 5" + date="2012-08-09T18:01:06Z" + content=""" +I guess this could be useful if you have a *lot* of buckets already in use at S3, or if you want to be able to have a lot of distinct S3 special remotes. Implemented the `fileprefix` setting. Note that I have not tested it, beyond checking it builds, since I let my S3 account expire. Your testing would be appreciated. + +"""]] diff --git a/doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment b/doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment new file mode 100644 index 000000000..742dbedc2 --- /dev/null +++ b/doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnY9ObrNrQuRp8Xs0XvdtJJssm5cp4NMZA" + nickname="alan" + subject="Rackspace Cloud Files support?" + date="2012-08-23T21:00:11Z" + content=""" +Any chance I could bribe you to setup Rackspace Cloud Files support? We are using them and would hate to have a S3 bucket only for this. + +https://github.com/rackspace/python-cloudfiles +"""]] diff --git a/doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment b/doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment new file mode 100644 index 000000000..c243cde13 --- /dev/null +++ b/doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc" + nickname="Eric" + subject="S3 Remote Future Proof?" + date="2013-01-20T09:21:50Z" + content=""" +Joey, I'm curious to understand how future proof an S3 remote is. Can I restore my files without git-annex? +"""]] diff --git a/doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment b/doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment new file mode 100644 index 000000000..6997719d1 --- /dev/null +++ b/doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="68.119.100.5" + subject="comment 8" + date="2013-01-20T20:37:09Z" + content=""" +If encryption is not used, the files are stored in S3 as-is, and can be accessed directly. They are stored in a hashed directory structure with the names of their key used, rather than the original filename. To get back to the original filename, a copy of the git repo would also be needed. + +With encryption, you need the gpg key used in the encryption, or, for shared encryption, a symmetric key which is stored in the git repo. + +See [[future proofing]] for non-S3 specific discussion of this topic. +"""]] diff --git a/doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment b/doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment new file mode 100644 index 000000000..51b7ab16a --- /dev/null +++ b/doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="basak" + ip="2001:8b0:1c8::2" + subject="Recovering from a clone" + date="2013-05-22T18:32:05Z" + content=""" +How do I recover a special remote from a clone, please? I see that `remote.log` has most of the details, but my remote is not configured on my clone and I see no obvious way to do it. And I used `embedcreds`, but the only credentials I can see are stored in .git/annex/creds/ so did not survive a clone. I'm confused because the documentation here for `embedcreds` says that clones should have access. + +As a workaround, it looks like copying the remote over from `.git/config` as well as the credentials from `.git/annex/creds/` seems to work. Is there some other way I'm supposed to do this, or is this the intended way? +"""]] diff --git a/doc/special_remotes/bup.mdwn b/doc/special_remotes/bup.mdwn new file mode 100644 index 000000000..f2d465e77 --- /dev/null +++ b/doc/special_remotes/bup.mdwn @@ -0,0 +1,39 @@ +This special remote type stores file contents in a +[bup](http://github.com/bup/bup) repository. By using git-annex +in the front-end, and bup as a remote, you get an easy git-style +interface to large files, and easy backups of the file contents using git. + +This is particularly well suited to collaboration on projects involving +large files, since both the git-annex and bup repositories can be +accessed like any other git repository. + +See [[walkthrough/using_bup]] for usage examples. + +Each individual key is stored in a bup remote using `bup split`, with +a git branch named the same as the key name. Content is retrieved from +bup using `bup join`. All other bup operations are up to you -- consider +running `bup fsck --generate` in a cron job to generate recovery blocks, +for example; or clone bup's git repository to further back it up. + +## configuration + +These parameters can be passed to `git annex initremote` to configure bup: + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `buprepo` - Required. This is passed to `bup` as the `--remote` + to use to store data. To create the repository,`bup init` will be run. + Example: "buprepo=example.com:/big/mybup" or "buprepo=/big/mybup" + (To use the default `~/.bup` repository on the local host, specify "buprepo=") + +Options to pass to `bup split` when sending content to bup can also +be specified, by using `git config annex.bup-split-options`. This +can be used to, for example, limit its bandwidth. + +## notes + +[[git-annex-shell]] does not support bup, due to the wacky way that bup +starts its server. So, to use bup, you need full shell access to the server. diff --git a/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment b/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment new file mode 100644 index 000000000..97f9b9ea9 --- /dev/null +++ b/doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://sekenre.wordpress.com/" + nickname="sekenre" + subject="Synchronizing Bup repositories" + date="2013-05-07T16:46:34Z" + content=""" +Hi All, + +I managed to answer my questions above about copying changes between local bup repositories efficiently. + +You run the following commands + + git annex copy . --to bup_repo_1 # Uses bup split in the background (slow) + rsync -av /mnt/repodisk1/repo/ /mnt/repodisk2/repo/ \ + --exclude=config --exclude=*.bloom --exclude=*.midx # rsync without bup-specific indices (speed depends on delta between repositories) + BUP_DIR=/mnt/repodisk2/repo/ bup midx -a && bup bloom # rebuild bup-specific indices on the target (this is extremely fast) + git annex copy . --to bup_repo_2 # Records file is now available in repo2 (also extremely fast) + +Now `git annex whereis` will show the correct location and `git annex get --from bup_repo_2` will work. + +So far in my testing I haven't found any problems... + +"""]] diff --git a/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment b/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment new file mode 100644 index 000000000..c699c6241 --- /dev/null +++ b/doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk" + nickname="Tim" + subject="bup location data not synced through annex assistant" + date="2013-05-15T15:08:54Z" + content=""" +I set up 2 servers running git annex assistant, both with a ~/annex dir and an additional ~/annex-bup bup repo. There is no additional cloud repository. +For test, I added my /etc dir which uploaded correctly from server1, but which never arrived on server2 + + bup@bup1:~/annex/etc$ git annex whereis updatedb.conf + whereis updatedb.conf (3 copies) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- here (bup@bup1:~/annex) + adfc1307-771f-40e9-b794-bae2e1f21b8b -- bup2-annex-bup + e4e0ac0b-992a-4312-a4ac-fc8d3d9f7c0f -- bup1-annex-bup + ok + + bup@bup2:~/annex/etc$ git annex whereis updatedb.conf + whereis updatedb.conf (1 copy) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- bup1 (bup@bup1:~/annex) + ok + +As you can see, server 2 just doesn't know the data is already on it's own disk in it's local bup repo. +Is there a reason this data does not get synced? Should I set up a transfer repo? +"""]] diff --git a/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment b/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment new file mode 100644 index 000000000..a790daea3 --- /dev/null +++ b/doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk" + nickname="Tim" + subject="my bad" + date="2013-05-15T15:39:31Z" + content=""" +Sorry, looks like I did initremote twice on the same folder, instead of enableremote the second time... +"""]] diff --git a/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment b/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment new file mode 100644 index 000000000..02691c690 --- /dev/null +++ b/doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgbXwQtPQSG8igdS7U8l031N8sqDmuyvk" + nickname="Albert" + subject="Error with bup and gnupg" + date="2012-10-22T20:56:56Z" + content=""" +Hello, + +I get this error when trying to use git-annex with bup and gnupg: + +
+move importable_pilot_surveys.tar (gpg) (checking localaseebup...) (to localaseebup...) 
+Traceback (most recent call last):
+  File \"/usr/lib/bup/cmd/bup-split\", line 133, in 
+    progress=prog)
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 167, in split_to_shalist
+    for (sha,size,bits) in sl:
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 118, in _split_to_blobs
+    for (blob, bits) in hashsplit_iter(files, keep_boundaries, progress):
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 86, in _hashsplit_iter
+    bnew = next(fi)
+  File \"/usr/lib/bup/bup/helpers.py\", line 86, in next
+    return it.next()
+  File \"/usr/lib/bup/bup/hashsplit.py\", line 49, in blobiter
+    for filenum,f in enumerate(files):
+  File \"/usr/lib/bup/cmd/bup-split\", line 128, in 
+    files = extra and (open(fn) for fn in extra) or [sys.stdin]
+IOError: [Errno 2] No such file or directory: '-'
+
+ + +I was able to work-around this issue by altering /usr/lib/bup/cmd/bup-split (though I don't think its a bup bug) to just pull from stdin: + +files = [sys.stdin] + +on ~ line 128. + +Any ideas? Also, do you think that bup's data-deduplication does anything when gnupg is enabled, i.e. is it just as well to use a directory remote with gnupg? + +Thanks! Git annex rules! + +Albert +"""]] diff --git a/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment b/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment new file mode 100644 index 000000000..97af184f3 --- /dev/null +++ b/doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 2" + date="2012-10-23T20:01:43Z" + content=""" +@Albert, thanks for reporting this bug (but put them in [[bugs]] in future please). + +This is specific to using the bup special remote with encryption. Without encryption it works. And no, it won't manage to deduplicate anything that's encrypted, as far as I know. + +I think bup-split must have used - for stdin in the past, but now, it just reads from stdin when no file is specified, so I've updated git-annex. +"""]] diff --git a/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment b/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment new file mode 100644 index 000000000..2e3e38992 --- /dev/null +++ b/doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://sekenre.wordpress.com/" + nickname="sekenre" + subject="Bup remotes in git-annex assistant" + date="2013-03-13T12:54:56Z" + content=""" +Hi, + +Is the bup remote available via the Assistant user interface? + +Unrelated question; + +If you are syncing files between two bup repos on local usb drives, does it use git to sync the changes or does it use \"bup split\" to re-add the file? (Basically, is the syncing as efficient as possible using git-annex or would I have to go to a lower level) + +Many Thanks, +Sek +"""]] diff --git a/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment b/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment new file mode 100644 index 000000000..0607e5f6c --- /dev/null +++ b/doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-03-13T16:05:50Z" + content=""" +I don't plan to support creating bup spefial remotes in the assistant, currently. Of course the assistant can use bup special remotes you set up. + +Your two bup repos would be synced using bup-split. +"""]] diff --git a/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment b/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment new file mode 100644 index 000000000..288f8765d --- /dev/null +++ b/doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZWCbRYPVnwscdkdEDwgQHZJLwW6H_AHo" + nickname="Tobias" + subject="bup fail?" + date="2013-03-31T21:05:32Z" + content=""" +I've run into problems storing a huge number of files in the bup repo. It seems that thousands of branches are a problem. I don't know if it's a problem of git-annex, bup, or the filesystem. + +How about adding an option to store tree/commit ids in git-annex instead of using branches in bup? +"""]] diff --git a/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment b/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment new file mode 100644 index 000000000..a2284c3e1 --- /dev/null +++ b/doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-02T21:24:06Z" + content=""" +`bup-split` uses a git branch to name the objects stored in the bup repository. So it will be limited by any scalability issues affecting large numbers of git branches. I don't know what those are. + +Yes, it would be possible to make git-annex store this in the git-annex branch instead. +"""]] diff --git a/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment b/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment new file mode 100644 index 000000000..62376a6e4 --- /dev/null +++ b/doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70" + nickname="Yung-Chin" + subject="re scaling issue" + date="2013-05-03T14:57:51Z" + content=""" +Tobias/joey, + +I think there are at least two scaling issues that may be causing you trouble. One is that bup writes pack+idx files rather than bare objects, and if you send 1 file per call to bup-split, you end up with a pair of pack and idx files for each such call. When you later try to retrieve a blob, bup currently just calls git, and git will have to traverse all these tiny idx files looking for the right hash (bare objects you could at least find by name). You can probably ameliorate the pain by calling git repack (look at the -a and --max-pack-size switches) on your bup repository. The other is the \"thousands of branches\" issue, and I think \"git pack-refs --all\" (that's again on your bup repository) might help a little bit. + +It would certainly help performance if you could store blob/tree ids in git-annex instead of branch names. For small files, all bup would need to store is a blob, but currently you end up storing a blob, a tree, and a commit (and looking-up all of those, plus the ref too, on calling bup-join). (you might want to patch bup-split, so it would allow you to ask it for \"--blob-or-tree\", because currently if you say you pass it -b for blob-ids, then for bigger files you get a series of IDs, whereas you'd be much better off with a tree-id there) +"""]] diff --git a/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment b/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment new file mode 100644 index 000000000..d6021f764 --- /dev/null +++ b/doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70" + nickname="Yung-Chin" + subject="comment 9" + date="2013-05-03T16:34:05Z" + content=""" +Thinking about this some more, a very elegant way to make a bup remote could actually be to just pass the whole .git/annex tree into bup-index/save (you could avoid sending some files by only bup-indexing select subtrees, or by using --exclude-*'s, but you'd run bup-save over the whole .git/annex tree). You could then use bup-restore to retrieve files or whole subtrees, and you'd refer to the files you're retrieving by their actual pathname under which they live in .git/annex (if that doesn't make sense it's because I've misunderstood how git-annex is organised!), so something like \"bup restore branch_name/latest/.git/annex/aa/bb/sha-of-some-sort\" would work - that's cute, right? And you'd only have 1 branch. + +However... somebody who is good with lazy-evaluation would need to rework bup.vfs: currently, if you'd call bup-restore on a path like that, it would instantiate a _lot_ of vfs-nodes you don't need - to begin with, it would make a node for every commit you ever made (on any branch!) - on a big repository you'd wait ages for it to just find the commit objects... +"""]] diff --git a/doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment b/doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment new file mode 100644 index 000000000..79cbe3713 --- /dev/null +++ b/doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQqKSVY98PVGDIaYZdK9CodJdbh7cFfhY" + nickname="Ashwin" + subject="Rackspace Cloud Files support" + date="2013-03-22T08:20:40Z" + content=""" +It'd be really cool to have Rackspace cloud files support. Like the guy above me said, I would submit a patch but not if I have to learn Haskell first :) +"""]] diff --git a/doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment b/doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment new file mode 100644 index 000000000..f2f9c4a8f --- /dev/null +++ b/doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="Re: Webhook special remote" + date="2013-04-12T08:54:47Z" + content=""" +@Alex: You might see if the newly-added [[todo/wishlist: allow configuration of downloader for addurl]] could be made to do what you need... I've not played around with it yet, but perhaps you could set the downloader to be something that can sort out the various URLs and send them to the correct downloading tool? +"""]] diff --git a/doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment b/doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment new file mode 100644 index 000000000..5146cca36 --- /dev/null +++ b/doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="How to establish local preference for (special) remotes" + date="2013-05-22T14:06:48Z" + content=""" +Sorry if it is RTFM... If I have multiple original (reachable) remotes, how could I establish my preference for which one to be used in any given location? + +usecase: if I clone a repository within amazon cloud instance -- I would now prefer if this (or all -- user-wide configuration somehow?) repository 'get's load from URLs originating in the cloud of this zone (e.g. having us-east-1.s3.amazonaws.com/ in their URLs). +"""]] diff --git a/doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment b/doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment new file mode 100644 index 000000000..8e5a8015d --- /dev/null +++ b/doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="Remote costs" + date="2013-05-22T14:15:03Z" + content=""" +This should be implemented with costs + +I refer you too: http://git-annex.branchable.com/design/assistant/blog/day_213__costs/ + +This has been implemented in the assistant, so if you use that, changing priority should be as simple as changing the order of the remotes on the web interface. Whichever remote is highest on the list, is the one your client will fetch from. +"""]] diff --git a/doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment b/doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment new file mode 100644 index 000000000..cd0a8eb58 --- /dev/null +++ b/doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 14" + date="2013-05-22T14:30:00Z" + content=""" +You do not need to use the assistant to configure the costs of remotes. Just set `remote..annex-cost` to appropriate values. See also the documentation for the `remote..annex-cost-command` which allows your own code to calculate costs. +"""]] diff --git a/doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment b/doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment new file mode 100644 index 000000000..3e2ea9948 --- /dev/null +++ b/doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="remotes costs" + date="2013-05-22T18:33:11Z" + content=""" +Thank you -- that is nice! + +Could costs be presented in 'whereis' and 'status' commands? e.g. like we know APT repositories priorities from apt-cache policy -- now I do not see them (at least in 4.20130501... updating to sid's 0521 now) + +"""]] diff --git a/doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment b/doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment new file mode 100644 index 000000000..8b1fcd831 --- /dev/null +++ b/doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="compression -- storage and transfer" + date="2013-05-22T18:48:59Z" + content=""" +Is there any remote which would not only compress during transfer (I believe rsync does that, right?) but also store objects compressed? + +I thought bup would do both -- but it seems that git annex receives data uncompressed from a bup remote, and bup remote requires ssh access. + +In my case I want to make publicly available files which are binary blobs which could be compressed very well. It would be a pity if I waste storage on my end and also incur significant traffic, which could be avoided if data load was transferred compressed. May be HTTP compression (http://en.wikipedia.org/wiki/HTTP_compression) could somehow be used efficiently for this purpose (not sure if load then originally could already reside in a compressed form to avoid server time to re-compress it)? +"""]] diff --git a/doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment b/doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment new file mode 100644 index 000000000..f576e2723 --- /dev/null +++ b/doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Re: compression -- storage and transfer" + date="2013-05-22T19:17:33Z" + content=""" +ha -- apparently it is trivial to configure apache to serve pre-compressed files (e.g. see http://stackoverflow.com/questions/75482/how-can-i-pre-compress-files-with-mod-deflate-in-apache-2-x) and they arrive compressed to client with + +Content-Encoding: gzip + +but unfortunately git-annex doesn't like those (fails to \"verify\") -- do you think it could be implemented for web \"special remotes\"? that would be really nice -- then I could store such load on another website, and addurl links to the compressed content +"""]] diff --git a/doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment b/doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment new file mode 100644 index 000000000..2345bba21 --- /dev/null +++ b/doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 18" + date="2013-05-23T23:25:02Z" + content=""" +All special remotes store files compressed when you enable encryption. Not otherwise, though. + +As far as the web special remote and pre-compressed files, files are downloaded from the web using `wget` or (of wget is not available) `curl`. So if you can make it work with those commands, it should work. +"""]] diff --git a/doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment b/doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment new file mode 100644 index 000000000..b8c701ade --- /dev/null +++ b/doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="compressed storage/transfer -- gzip Content-Type" + date="2013-05-25T06:41:37Z" + content=""" +FWIW -- eh -- unfortunately it seems not that transparent. wget seems to not support decompression at all, curl can do with explicit --compressed, BUT it doesn't distinguish url to a \"natively\" .gz file and pre-compressed content. And I am not sure if it is possible to anyhow reliably distinguish the two urls. In the case of obtaining pre-compressed file from my sample apache server the only difference in the http response header is that it gets \"compound\" ETag: +compare ETag: \"3acb0e-17b38-4dd5343744660\" (for directly asking zeros100.gz) vs \"3acb0e-17b38-4dd5343744660;4dd5344e1537e\" (requesting zeros100) where portion past \";\" I guess signals the caching tag for gzipping, but not exactly sure on that since it seems to be not a part of standard. Also for zeros100 I am getting \"TCN: choice\"... once again not sure if that is any how reliably indicative for my purpose. So I guess there is no good way ATM via Content-Type request. +"""]] diff --git a/doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment b/doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment new file mode 100644 index 000000000..ec1bea419 --- /dev/null +++ b/doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="MediaFire" + date="2013-01-17T12:17:54Z" + content=""" +MediaFire offers 50GB of free storage (max size 200MB). It would be great to support it as a new special remote. +"""]] diff --git a/doc/special_remotes/comment_20_6b7242721f2f2c77b634568cb737e3e3._comment b/doc/special_remotes/comment_20_6b7242721f2f2c77b634568cb737e3e3._comment new file mode 100644 index 000000000..b17896a68 --- /dev/null +++ b/doc/special_remotes/comment_20_6b7242721f2f2c77b634568cb737e3e3._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg" + nickname="Bence" + subject="Testing a special remote" + date="2013-11-24T08:24:36Z" + content=""" +Is there a unit test or integration test to check for the behavior of a special remote implementation and/or validity? + +I don't speak Haskell, so maybe there are some in the source but maybe I wouldn't recognize, so I haven't checked. If there are any tests how should I use it? + +Thank you, +Bence +"""]] diff --git a/doc/special_remotes/comment_21_5c11e69c28b9ed4cbe238a36c0839a47._comment b/doc/special_remotes/comment_21_5c11e69c28b9ed4cbe238a36c0839a47._comment new file mode 100644 index 000000000..1645e03e6 --- /dev/null +++ b/doc/special_remotes/comment_21_5c11e69c28b9ed4cbe238a36c0839a47._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 21" + date="2013-11-24T15:58:30Z" + content=""" +@Bence the closest I have is some tests of particular special remotes inside Test.hs. The shell equivilant of that code is: + +[[!format sh \"\"\" +set -e +git annex copy file --to remote # tests store +git annex drop file # tests checkpresent when remote has file +git annex move file --from remote # tests retrieve and remove +\"\"\"]] +"""]] diff --git a/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment b/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment new file mode 100644 index 000000000..c642f3975 --- /dev/null +++ b/doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Enhancing special remotes as backup spaces" + date="2014-04-22T21:08:49Z" + content=""" +Hi Joey, + +I am thinking about using google drive as an encrypted backup for my important files. However, I fear that if all my git annex repositories are unrecoverable that the encrypted data on the special remote will not help me much. Assuming I have backed up my gpg key I still get a bunch of decrypted files but the folder structure is lost. Would it be possible to implement something like a safety feature that also uploads an (encrypted) tar of all symlinks (pointing to the respective encrypted files) of the (current/or master-branch) git working tree? + +I am almost sure this is already implementable using hooks however I could not find information on which types of hooks are available. I am looking for one that is triggered once after all copy/move operations to a special remote are finished. Can you point me in the right direction? + +Marek + + +"""]] diff --git a/doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment b/doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment new file mode 100644 index 000000000..6ec99abc9 --- /dev/null +++ b/doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 23" + date="2014-05-16T19:11:00Z" + content=""" +@donkeyicydragon one way to accomplish that would be to just tar up `.git` -- excluding `.git/annex/objects` and add that to git-annex like any other file. You could make a git post-commit hook that does that, but that seems overboard. + +Or, you could just make a git clone of your repo to a local removable drive, and use that as a local backup. +"""]] diff --git a/doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment b/doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment new file mode 100644 index 000000000..840a9d626 --- /dev/null +++ b/doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-17T16:44:25Z" + content=""" +Mediafire does not appear to offer any kind of API for its storage. +"""]] diff --git a/doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment b/doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment new file mode 100644 index 000000000..84fe385e0 --- /dev/null +++ b/doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="MediaFire REST API" + date="2013-01-17T16:53:41Z" + content=""" +Wouldn't this be enough? http://developers.mediafire.com/index.php/REST_API +"""]] diff --git a/doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment b/doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment new file mode 100644 index 000000000..c5979f819 --- /dev/null +++ b/doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="JABOF special remote" + date="2013-01-19T08:34:32Z" + content=""" +Similar to a JABOD, this would be Just A Bunch Of Files. I already have a NAS with a file structure conducive to serving media to my TV. However, it's not capable (currently) of running git-annex locally. It would be great to be able to tell annex the path to a file there as a remote much like a web remote from \"git annex addurl\". That way I can safely drop all the files I took with me on my trip, while annex still verifies and counts the file on the NAS as a location. + +There are some interesting things to figure out for this to be efficient. For example, SHAs of the files. Maybe store that in a metadata file in the directory of the files? Or perhaps use the WORM backend by default? +"""]] diff --git a/doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment b/doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment new file mode 100644 index 000000000..1a9eb390a --- /dev/null +++ b/doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 5" + date="2013-01-19T16:05:13Z" + content=""" +The web special remote is recently able to use file:// URL's, so you can just point to files on some arbitrary storage if you want to. +"""]] diff --git a/doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment b/doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment new file mode 100644 index 000000000..0f11973f7 --- /dev/null +++ b/doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlBia1J9-PoXgZYj2LASf7Bs__IqK3T8qQ" + nickname="Greg" + subject="Rackspace US/UK" + date="2013-01-30T11:33:12Z" + content=""" +It'd be awesome to be able to use Rackspace as remote storage as an alternative to S3, I would submit a patch, but know 0 Haskell :D +"""]] diff --git a/doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment b/doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment new file mode 100644 index 000000000..043ad8eb5 --- /dev/null +++ b/doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn-UoTjMBsVh6q4HNViGwJi-5FNaCVQB7E" + nickname="Nico" + subject="Rapidshare" + date="2013-02-02T16:49:58Z" + content=""" +Would it be possible to support Rapidshare as a new special remote? +They offer unlimited storage for 6-10€ per month. It would be great for larger backups. +Their API can be found here: http://images.rapidshare.com/apidoc.txt +"""]] diff --git a/doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment b/doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment new file mode 100644 index 000000000..85e663296 --- /dev/null +++ b/doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="'webhook' special remote?" + date="2013-02-24T15:05:27Z" + content=""" +Is there any chance a special remote that functions like a hybrid of 'web' and 'hook'? At least in theory, it should be relatively simple, since it would only support 'get' and the only meaningful parameters to pass would be the URL and the output file name. + +Maybe make it something like git config annex.myprogram-webhook 'myprogram $ANNEX_URL $ANNEX_FILE', and fetching could work by adding a --handler or --type parameter to addurl. + +The use case here is anywhere that simple 'fetch the file over HTTP/FTP/etc' isn't workable - maybe it's on rapidshare and you need to use plowshare to download it; maybe it's a youtube video and you want to use youtube-dl, maybe it's a chapter of a manga and you want to turn it into a CBZ file when you fetch it. + +"""]] diff --git a/doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment b/doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment new file mode 100644 index 000000000..88f021c6a --- /dev/null +++ b/doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlRThEwuPnr8_bcuuCTQ0rQd3w6AfeMiLY" + nickname="Alex" + subject="comment 9" + date="2013-02-24T15:13:16Z" + content=""" +A *ridiculously* cool possibility would be to allow them to match against URLs and then handle those (youtube-dl for youtube video URLs, for instance), but that would be additional work on your end and isn't really necessary. +"""]] diff --git a/doc/special_remotes/ddar.mdwn b/doc/special_remotes/ddar.mdwn new file mode 100644 index 000000000..8de86e2c7 --- /dev/null +++ b/doc/special_remotes/ddar.mdwn @@ -0,0 +1,40 @@ +This special remote type stores file contents in a +[ddar](https://github.com/basak/ddar) repository. This provides easy +de-duplication when you use git-annex to manage many files that are similar. + +Unlike bup, ddar uses its own storage format, which allows for both creation +and deletion of de-deduplicated files. In addition to using local storage, ddar +archives can be remote, providing that ddar is installed on the remote machine +and ssh is available to it. + +See [[walkthrough/using_ddar]] for usage examples. + +## encryption + +Encryption is nominally supported, but is not useful. Since effective +encryption necessarily obfuscates file contents, similar areas across different +files are no longer visible to ddar and cannot be de-duplicated. + +## compression + +The same caveat with encryption also generally applies to compression, since +file compression changes file contents such that similar regions across files +no longer appear similar. An exception is `gzip --rsyncable`, which is +specifically designed to work around this issue. This is the only compression +mechanism with which de-duplication remains effective. + +## configuration + +These parameters can be passed to `git annex initremote` to configure ddar: + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. However, note that encryption renders all de-duplication +ineffective. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `ddarrepo` - Required. This is passed to `ddar` as the path to the ddar + archive to use. If it doesn't exist, the ddar repository will be created + automatically when a file is first copied to it. To use a remote ddar + repository, use a colon (`:`) to separate the hostname from the remote path. + Example: "ddarrepo=example.com:/big/myddar" or "ddarrepo=/big/myddar" diff --git a/doc/special_remotes/directory.mdwn b/doc/special_remotes/directory.mdwn new file mode 100644 index 000000000..b79cf7544 --- /dev/null +++ b/doc/special_remotes/directory.mdwn @@ -0,0 +1,39 @@ +This special remote type stores file contents in directory. + +One use case for this would be if you have a removable drive that +you want to use to sneakernet files between systems (possibly with +[[encrypted|encryption]] contents). Just set up both systems to use +the drive's mountpoint as a directory remote. + +Note that directory remotes have a special directory structure +(by design, the same as the \[[rsync|rsync]] remote). +If you just want two copies of your repository with the files "visible" +in the tree in both, the directory special remote is not what you want. +Instead, you should use a regular `git clone` of your git-annex repository. + +## configuration + +These parameters can be passed to `git annex initremote` to configure the +remote: + +* `directory` - The path to the directory where the files should be stored + for the remote. The directory must already exist. Typically this will + be an empty directory, or a directory already used as a directory remote. + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `chunksize` - Avoid storing files larger than the specified size in the + directory. For use on directories on mount points that have file size + limitations. The default is to never chunk files. + The value can use specified using any commonly used units. + Example: `chunksize=100 megabytes` + Note that enabling chunking on an existing remote with non-chunked + files is not recommended. + +Setup example: + + # git annex initremote usbdrive type=directory directory=/media/usbdrive/ encryption=none + # git annex describe usbdrive "usb drive on /media/usbdrive/" diff --git a/doc/special_remotes/directory/comment_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment b/doc/special_remotes/directory/comment_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment new file mode 100644 index 000000000..f29d54b59 --- /dev/null +++ b/doc/special_remotes/directory/comment_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment @@ -0,0 +1,49 @@ +[[!comment format=mdwn + username="dietz" + ip="128.119.40.196" + subject="annexing external files" + date="2013-07-18T20:57:53Z" + content=""" +This is great work. I've developed a serious annex-addiction and now I want to use it everywhere! In particular I was hoping to apply it to this use case: + +I have large files/directories (approx 5 TB) on an nfs mount to which is a) write-protected (think \"read-only medium\") and b) used by non-git users. Both reasons prevent me from setting up a git-annex repos there. However, I would like to use git-annex to keep track of the paths and get/drop files from my different computers. + +On one of my servers, I set up a git annex repos, hoping to only manage the structure, the locations, and the number of copies. I don't want to have copies of the 5TB files in that repository, as disk space is not unlimited (just for the sake of making them available to my laptop). + +I as banking on using a special remote (either directory or rsync) to tell the git-annex repos where the actual data is. + +I am not concerned with data loss, as it is backed up in regular time intervals by our sysadmin. + + +I tried both directory remote and rsync remote but there seems to be a missing piece (I suppose its add). Any ideas? + +This is what I did: + + +I added the directory remote and an rsync remote + +- $ git annex initremote collections type=directory directory=/my/nfs/dir encryption=none +- $ git annex initremote rsync type=rsync rsyncurl=ssh://myserver/mnt/nfs/dir encryption=none + +the copy command fails without complaints + $ git annex copy --from collections + +I tried adding virtual files to git annex + +- $ git annex add file/inside/dir + +but still any kind of get/copy command does not get any new files + + +It would be awesome if I could use git-annex for this, to keep track of my copies and copies of copies. And then I could also keep track of data on my write-protected DVDs. + +Is there any chance? + +Thanks a lot! + +-- Laura + + + + +"""]] diff --git a/doc/special_remotes/directory/comment_12._comment b/doc/special_remotes/directory/comment_12._comment new file mode 100644 index 000000000..608fb62cd --- /dev/null +++ b/doc/special_remotes/directory/comment_12._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 2" + date="2013-07-19T13:54:10Z" + content=""" +@Laura the directory special remote requires files to +be in a particular directory structure with special names +git-annex comes up with. So you can't use it on an existing +tree of files like that. + +What you can do is use the [[web_special_remote|web]], +with a `file://` url to point to the files wherever +they are stored. So for example, +`git annex addurl file:///media/dvd/file` +"""]] diff --git a/doc/special_remotes/directory/comment_12_311cd013fd8db47856d84161119e059d._comment b/doc/special_remotes/directory/comment_12_311cd013fd8db47856d84161119e059d._comment new file mode 100644 index 000000000..21ab5aaa9 --- /dev/null +++ b/doc/special_remotes/directory/comment_12_311cd013fd8db47856d84161119e059d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="dietz" + ip="128.119.40.196" + subject="comment 12" + date="2013-07-20T06:06:31Z" + content=""" +Using the web remote is a pretty nice trick! + +Thanks, Joey - I would not have guessed that. + +-- Laura +"""]] diff --git a/doc/special_remotes/directory/comment_1_e8a53592adb13f7d7f212a2eb5a18a31._comment b/doc/special_remotes/directory/comment_1_e8a53592adb13f7d7f212a2eb5a18a31._comment new file mode 100644 index 000000000..b2a041c53 --- /dev/null +++ b/doc/special_remotes/directory/comment_1_e8a53592adb13f7d7f212a2eb5a18a31._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc" + nickname="Paul" + subject="how is this different than rsync?" + date="2012-06-22T22:10:19Z" + content=""" +Thanks for this great tool! I was wondering what the differences are between using `type=directory`, `type=rsync`, or a bare git repo for directories? + +I guess I can't use just a regular repo because my USB drive is formatted as `vfat` -- which threw me for a loop the first time I heard about `git-annex` about a year ago, because I followed the walkthrough, and it didn't work as expected and gave up (now I know it was just a case of PEBKAC). It might be worth adding a note about [vfat](http://git-annex.branchable.com/bugs/fat_support/) to the \"Adding a remote\" section of the [walkthrough](http://git-annex.branchable.com/walkthrough/), since the unstated assumption there is that the USB drive is formatted as a filesystem that supports symlinks. + +Thanks again, my scientific data management just got a lot more sane! +"""]] diff --git a/doc/special_remotes/directory/comment_2_d949edad6a330079f9e15f703f9091e3._comment b/doc/special_remotes/directory/comment_2_d949edad6a330079f9e15f703f9091e3._comment new file mode 100644 index 000000000..77b4c4d22 --- /dev/null +++ b/doc/special_remotes/directory/comment_2_d949edad6a330079f9e15f703f9091e3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 2" + date="2012-06-25T15:29:29Z" + content=""" +The directory and rsync special remotes intentionally use the same layout. So the same directory could be set up as both types of special remotes. + +The main reason to use this rather than a bare git repo is that it supports encryption. +"""]] diff --git a/doc/special_remotes/directory/comment_3_49009f4e9e335c9a9d0422aa59c9a432._comment b/doc/special_remotes/directory/comment_3_49009f4e9e335c9a9d0422aa59c9a432._comment new file mode 100644 index 000000000..b8ec51049 --- /dev/null +++ b/doc/special_remotes/directory/comment_3_49009f4e9e335c9a9d0422aa59c9a432._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="dropping a directory remote?" + date="2013-01-15T22:29:15Z" + content=""" +How do I drop a directory remote after initremote? Say I want to start over and enable chunking (not supposed to be enabled on an existing directory), can I simply git remote rm it? +"""]] diff --git a/doc/special_remotes/directory/comment_4_f5e9b0b477c4e521f8633fd274757fa3._comment b/doc/special_remotes/directory/comment_4_f5e9b0b477c4e521f8633fd274757fa3._comment new file mode 100644 index 000000000..53fc857a3 --- /dev/null +++ b/doc/special_remotes/directory/comment_4_f5e9b0b477c4e521f8633fd274757fa3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 4" + date="2013-01-17T18:22:26Z" + content=""" +The best way to remove a special remote is to first `git annex move --from $remote` to get all the content out of it, then `git annex dead $remote` and finally you can `git remote rm $remote` +"""]] diff --git a/doc/special_remotes/directory/comment_5_e790718423c41f5ea8047ea5225bfacd._comment b/doc/special_remotes/directory/comment_5_e790718423c41f5ea8047ea5225bfacd._comment new file mode 100644 index 000000000..dae22fc8f --- /dev/null +++ b/doc/special_remotes/directory/comment_5_e790718423c41f5ea8047ea5225bfacd._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3HGoDpnOPob5jOjvIootmkve1-nCpRiI" + nickname="Kalle" + subject="Directory remote with files accessible from non git-annex system?" + date="2013-01-20T15:44:16Z" + content=""" + + + + +"""]] diff --git a/doc/special_remotes/directory/comment_6_325aac80b86588912c4fd61339ccbd0b._comment b/doc/special_remotes/directory/comment_6_325aac80b86588912c4fd61339ccbd0b._comment new file mode 100644 index 000000000..7b9d21605 --- /dev/null +++ b/doc/special_remotes/directory/comment_6_325aac80b86588912c4fd61339ccbd0b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://nicolas-schodet.myopenid.com/" + ip="2a01:e35:8ae6:f130:1e4b:d6ff:fe78:1ddb" + subject="comment 6" + date="2013-06-26T17:52:12Z" + content=""" +I tried the suggestion on comment 4, but when I add again a remote with the same path, it gets the same repository identifier and is considered dead. Is that expected? + +My use case: I use a usb drive to transfer some large files from one git annex to another, then I use the usb drive for something else and the special remote is removed. Later I want to use the same usb drive again, but when I create the repository, it starts in the dead state. +"""]] diff --git a/doc/special_remotes/directory/comment_7_4206db69d68d9917623ce02500387021._comment b/doc/special_remotes/directory/comment_7_4206db69d68d9917623ce02500387021._comment new file mode 100644 index 000000000..b1a3b953e --- /dev/null +++ b/doc/special_remotes/directory/comment_7_4206db69d68d9917623ce02500387021._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 7" + date="2013-06-26T18:30:39Z" + content=""" +@nicolas, I suspect you are using `git annex initremote` with the same name that you used for the now dead-and-buried remote. That causes it to be reanimated, which is not what you want. + +Since git-annex version 4.20130501, `git annex initremote` is reserved for creating new remotes, not enabling old ones, so it will refuse to do this. That's to avoid exactly this confusion. + +Using `git annex initremote` with a different remote name, and the same directory should work just fine. +"""]] diff --git a/doc/special_remotes/directory/comment_8_acd9023511fe43817718bc89430f96c3._comment b/doc/special_remotes/directory/comment_8_acd9023511fe43817718bc89430f96c3._comment new file mode 100644 index 000000000..29801fa36 --- /dev/null +++ b/doc/special_remotes/directory/comment_8_acd9023511fe43817718bc89430f96c3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 8" + date="2013-06-26T18:46:40Z" + content=""" +For the use case you're describing, it might be better to define the usb key as a remote set to \"manual.\" Then, you can copy over the things you want with git annex copy --to=usbkey and when you're done drop everything with git annex drop --from=usbkey and never destroy the remote. +"""]] diff --git a/doc/special_remotes/directory/comment_9_d330eb808a990bb71034613c297a265e._comment b/doc/special_remotes/directory/comment_9_d330eb808a990bb71034613c297a265e._comment new file mode 100644 index 000000000..47ac7541d --- /dev/null +++ b/doc/special_remotes/directory/comment_9_d330eb808a990bb71034613c297a265e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nicolas-schodet.myopenid.com/" + ip="2a01:e35:8ae6:f130:1e4b:d6ff:fe78:1ddb" + subject="comment 9" + date="2013-06-26T20:05:20Z" + content=""" +Thanks for your answers. You're right, the simplest solution for me is to never remove the remote. If my directory is lost, I realized that I can simply create an empty directory. +"""]] diff --git a/doc/special_remotes/external.mdwn b/doc/special_remotes/external.mdwn new file mode 100644 index 000000000..d96999693 --- /dev/null +++ b/doc/special_remotes/external.mdwn @@ -0,0 +1,27 @@ +There are three ways to implement a new special remote: + +1. Using the [[hook]] special remote to tell git-annex what commands + to run to store and retrieve data. This is the easiest way, and + is great for prototyping. +2. Writing it in Haskell and adding it to git-annex. +3. Writing a program in any language you like that speaks the + [[design/external_special_remote_protocol]]. + +The rest of this page concentrates on writing new external special remotes. +It's not hard! + +* All you need is to make a program with a name like `git-annex-remote-$bar`. +* Install it in PATH. +* When the user runs `git annex initremote foo type=external externaltype=$bar`, + it will use your program. +* If things don't seem to work, pass `--debug` and you'll see, amoung other + things, a transcript of git-annex's communication with your program. +* If you build a new special remote, please add it to the list + of [[special_remotes]]. + +Here's a simple shell script example, which can easily be adapted +to run whatever commands you need. Or better, re-written in some better +language of your choice. See [[design/external_special_remote_protocol]] +for the details. + +[[!inline pages="special_remotes/external/example.sh" feeds=no]] diff --git a/doc/special_remotes/external/example.sh b/doc/special_remotes/external/example.sh new file mode 100755 index 000000000..5152ccc28 --- /dev/null +++ b/doc/special_remotes/external/example.sh @@ -0,0 +1,195 @@ +#!/bin/sh +# git-annex external special remote program +# +# This is basically the same as git-annex's built-in directory special remote. +# +# Install in PATH as git-annex-remote-directory +# +# Copyright 2013 Joey Hess; licenced under the GNU GPL version 3 or higher. + +set -e + +# This program speaks a line-based protocol on stdin and stdout. +# When running any commands, their stdout should be redirected to stderr +# (or /dev/null) to avoid messing up the protocol. +runcmd () { + "$@" >&2 +} + +# Gets a value from the remote's configuration, and stores it in RET +getconfig () { + ask GETCONFIG "$1" +} + +# Stores a value in the remote's configuration. +setconfig () { + echo SETCONFIG "$1" "$2" +} + +# Sets LOC to the location to use to store a key. +calclocation () { + ask DIRHASH "$1" + LOC="$mydirectory/$RET/$1" +} + +# Asks for some value, and stores it in RET +ask () { + echo "$1" "$2" + read resp + # Tricky POSIX shell code to split first word of the resp, + # preserving all other whitespace + case "${resp%% *}" in + VALUE) + RET="$(echo "$resp" | sed 's/^VALUE \?//')" + ;; + *) + RET="" + ;; + esac +} + +# This remote doesn't need credentials to access it, +# but many of them will. Here's how to handle requiring the user +# set MYPASSWORD and MYLOGIN when running initremote. The creds +# will be stored securely for later use, so the user only needs +# to provide them once. +setupcreds () { + if [ -z "$MYPASSWORD" ] || [ -z "$MYLOGIN" ]; then + echo INITREMOTE-FAILURE "You need to set MYPASSWORD and MYLOGIN environment variables when running initremote." + else + echo SETCREDS mycreds "$MYLOGIN" "$MYPASSWORD" + echo INITREMOTE-SUCCESS + fi +} + +getcreds () { + echo GETCREDS mycreds + read resp + case "${resp%% *}" in + CREDS) + MYLOGIN="$(echo "$resp" | sed 's/^CREDS \([^ ]*\) .*/\1/')" + MYPASSWORD="$(echo "$resp" | sed 's/^CREDS [^ ]* //')" + ;; + esac + +} + +# This has to come first, to get the protocol started. +echo VERSION 1 + +while read line; do + set -- $line + case "$1" in + INITREMOTE) + # Do anything necessary to create resources + # used by the remote. Try to be idempotent. + # + # Use GETCONFIG to get any needed configuration + # settings, and SETCONFIG to set any persistent + # configuration settings. + # + # (Note that this is not run every time, only when + # git annex initremote or git annex enableremote is + # run.) + + # The directory provided by the user + # could be relative; make it absolute, + # and store that. + getconfig directory + mydirectory="$(readlink -f "$RET")" || true + setconfig directory "$mydirectory" + if [ -z "$mydirectory" ]; then + echo INITREMOTE-FAILURE "You need to set directory=" + else + if mkdir -p "$mydirectory"; then + setupcreds + else + echo INITREMOTE-FAILURE "Failed to write to $mydirectory" + fi + fi + ;; + PREPARE) + # Use GETCONFIG to get configuration settings, + # and do anything needed to get ready for using the + # special remote here. + getcreds + getconfig directory + mydirectory="$RET" + if [ -d "$mydirectory" ]; then + echo PREPARE-SUCCESS + else + echo PREPARE-FAILURE "$mydirectory not found" + fi + ;; + TRANSFER) + key="$3" + file="$4" + case "$2" in + STORE) + # Store the file to a location + # based on the key. + # XXX when possible, send PROGRESS + calclocation "$key" + mkdir -p "$(dirname "$LOC")" + if runcmd cp "$file" "$LOC"; then + echo TRANSFER-SUCCESS STORE "$key" + else + echo TRANSFER-FAILURE STORE "$key" + fi + ;; + RETRIEVE) + # Retrieve from a location based on + # the key, outputting to the file. + # XXX when easy to do, send PROGRESS + calclocation "$key" + if runcmd cp "$LOC" "$file"; then + echo TRANSFER-SUCCESS RETRIEVE "$key" + else + echo TRANSFER-FAILURE RETRIEVE "$key" + fi + ;; + esac + ;; + CHECKPRESENT) + key="$2" + calclocation "$key" + if [ -e "$LOC" ]; then + echo CHECKPRESENT-SUCCESS "$key" + else + if [ -d "$mydirectory" ]; then + echo CHECKPRESENT-FAILURE "$key" + else + # When the directory does not exist, + # the remote is not available. + # (A network remote would similarly + # fail with CHECKPRESENT-UNKNOWN + # if it couldn't be contacted). + echo CHECKPRESENT-UNKNOWN "$key" "this remote is not currently available" + fi + fi + ;; + REMOVE) + key="$2" + calclocation "$key" + # Note that it's not a failure to remove a + # key that is not present. + if [ -e "$LOC" ]; then + if runcmd rm -f "$LOC"; then + echo REMOVE-SUCCESS "$key" + else + echo REMOVE-FAILURE "$key" + fi + else + echo REMOVE-SUCCESS "$key" + fi + ;; + *) + # The requests listed above are all the ones + # that are required to be supported, so it's fine + # to say that any other request is unsupported. + echo UNSUPPORTED-REQUEST + ;; + esac +done + +# XXX anything that needs to be done at shutdown can be done here diff --git a/doc/special_remotes/gcrypt.mdwn b/doc/special_remotes/gcrypt.mdwn new file mode 100644 index 000000000..2e07741d3 --- /dev/null +++ b/doc/special_remotes/gcrypt.mdwn @@ -0,0 +1,50 @@ +[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/) +adds support for encrypted remotes to git. The git-annex gcrypt special +remote allows git-annex to also store its files in such repositories. +Naturally, git-annex encrypts the files it stores too, so everything +stored on the remote is encrypted. + +See [[tips/fully_encrypted_git_repositories_with_gcrypt]] for some examples +of using gcrypt. + +## configuration + +These parameters can be passed to `git annex initremote` to configure +gcrypt: + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for encryption of both the files + git-annex stores in the repository, as well as to encrypt the git + repository itself. May be repeated when multiple participants + should have access to the repository. + +* `gitrepo` - Required. The path or url to the git repository + for gcrypt to use. This repository should be either empty, or an existing + gcrypt repositry. + +* `shellescape` - See [[rsync]] for the details of this option. + +## notes + +For git-annex to store files in a repository on a remote server, you need +shell access, and `rsync` must be installed. Those are the minimum +requirements, but it's also recommended to install git-annex on the remote +server, so that [[git-annex-shell]] can be used. + +While you can use git-remote-gcrypt with servers like github, git-annex +can't store files on them. In such a case, you can just use +git-remote-gcrypt directly. + +If you use encryption=hybrid, you can add more gpg keys that can access +the files git-annex stored in the gcrypt repository. However, due to the +way git-remote-gcrypt encrypts the git repository, you will need to somehow +force it to re-push everything again, so that the encrypted repository can +be decrypted by the added keys. Probably this can be done by setting +`GCRYPT_FULL_REPACK` and doing a forced push of branches. + +Recent versions of git-annex configure gcrypt-publish-participants when +setting up a gcrypt repository. This is done to avoid unncessary gpg +passphrase prompts, but it does publish the gpg keyids that can decrypt the +repository. Unset it if you need to obscure that. diff --git a/doc/special_remotes/glacier.mdwn b/doc/special_remotes/glacier.mdwn new file mode 100644 index 000000000..fe784c453 --- /dev/null +++ b/doc/special_remotes/glacier.mdwn @@ -0,0 +1,47 @@ +This special remote type stores file contents in Amazon Glacier. + +To use it, you need to have [glacier-cli](http://github.com/basak/glacier-cli) +installed. + +The unusual thing about Amazon Glacier is the multiple-hour delay it takes +to retrieve information out of Glacier. To deal with this, commands like +"git-annex get" request Glacier start the retrieval process, and will fail +due to the data not yet being available. You can then wait approximately +four hours, re-run the same command, and this time, it will actually +download the data. + +## configuration + +The standard environment variables `AWS_ACCESS_KEY_ID` and +`AWS_SECRET_ACCESS_KEY` are used to supply login credentials +for Amazon. You need to set these only when running +`git annex initremote`, as they will be cached in a file only you +can read inside the local git repository. + +A number of parameters can be passed to `git annex initremote` to configure +the Glacier remote. + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `embedcreds` - Optional. Set to "yes" embed the login credentials inside + the git repository, which allows other clones to also access them. This is + the default when gpg encryption is enabled; the credentials are stored + encrypted and only those with the repository's keys can access them. + + It is not the default when using shared encryption, or no encryption. + Think carefully about who can access your repository before using + embedcreds without gpg encryption. + +* `datacenter` - Defaults to "us-east-1". + +* `vault` - By default, a vault name is chosen based on the remote name + and UUID. This can be specified to pick a vault name. + +* `fileprefix` - By default, git-annex places files in a tree rooted at the + top of the Glacier vault. When this is set, it's prefixed to the filenames + used. For example, you could set it to "foo/" in one special remote, + and to "bar/" in another special remote, and both special remotes could + then use the same vault. diff --git a/doc/special_remotes/glacier/comment_1_fcd856b99dc6b3f9141b65fe639ef76b._comment b/doc/special_remotes/glacier/comment_1_fcd856b99dc6b3f9141b65fe639ef76b._comment new file mode 100644 index 000000000..1d6d89433 --- /dev/null +++ b/doc/special_remotes/glacier/comment_1_fcd856b99dc6b3f9141b65fe639ef76b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2013-05-16T00:54:21Z" + content=""" +The glacier-cli tool seems to have been abandoned, and there are a number of outstanding issues with it. boto has a `glacier` tool, but it doesn't seem to include caching, which seems to be something git annex needs. + +Looking through the PRs, it seems like we should build a tool specifically tailored to git annex's needs. It seems that there are at least three of us willing to hack on this if it's in Python. I'm not sure any of us knows haskell, though... +"""]] diff --git a/doc/special_remotes/glacier/comment_2_38fcca87074f6ea31a12569a822aa8c9._comment b/doc/special_remotes/glacier/comment_2_38fcca87074f6ea31a12569a822aa8c9._comment new file mode 100644 index 000000000..939832b32 --- /dev/null +++ b/doc/special_remotes/glacier/comment_2_38fcca87074f6ea31a12569a822aa8c9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="basak" + ip="2001:8b0:1c8::2" + subject="comment 2" + date="2013-05-17T08:35:10Z" + content=""" +I'm the glacier-cli author. It is not abandoned! + +glacier-cli is supposed to map to Glacier exactly, so that it is compatible with all other tools. Most of the outstanding PRs break this essential behaviour, so I have not merged them. Many of the feature requests and bugs related to the upstream boto library, which is just about the best maintained client library that exists for AWS on any platform (and Amazon have adopted it now, IIRC). I have written appropriate reviews on all the PRs. + +If there is specific behaviour that git-annex needs, them I am happy to accept PRs for this, provided that they do not break the ability (and default) for glacier-cli to talk to Glacier natively without an extra layer of interpretation. If an extra layer of interpretation is needed (eg. forbidding duplicate \"keys\"), then this needs to be an option, or wrapped in a separate tool, or written into git-annex's Glacier special remote. +"""]] diff --git a/doc/special_remotes/glacier/comment_3_cea5bcb162e4288847ba5f25464a0406._comment b/doc/special_remotes/glacier/comment_3_cea5bcb162e4288847ba5f25464a0406._comment new file mode 100644 index 000000000..8a8b914ad --- /dev/null +++ b/doc/special_remotes/glacier/comment_3_cea5bcb162e4288847ba5f25464a0406._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 3" + date="2013-05-19T05:56:45Z" + content=""" +Hi! :) + +The main issue I'm hitting is the \"Multiple rows were found for one()\" error. I think I get this when git-annex tries to upload the same file twice (which may be a bug in git-annex, which could apply de-duplication earlier), but I think I also get it when trying to upload a file whose upload I've canceled in the past. + +I don't quite understand what git-annex needs here, and I totally understand that you're writing a general-purpose tool. But there does seem to be an issue that git-annex needs fixed one way or another. + +I'm happy to try fixing it myself if you can help me understand what's going on (I didn't quite understand your review in the PR), but if I'm the only person in the world using git-annex to back up to glacier, that scares me a little! + + copy foo/bar/baz (checking glacier...) Traceback (most recent call last): + File \"/home/jlebar/code/glacier-cli/glacier\", line 694, in + App().main() + File \"/home/jlebar/code/glacier-cli/glacier\", line 680, in main + args.func(args) + File \"/home/jlebar/code/glacier-cli/glacier\", line 579, in archive_checkpresent + last_seen = self.cache.get_archive_last_seen(args.vault, args.name) + File \"/home/jlebar/code/glacier-cli/glacier\", line 157, in get_archive_last_seen + result = self._get_archive_query_by_ref(vault, ref).one() + File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py\", line 2182, in one + \"Multiple rows were found for one()\") + sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one() + +"""]] diff --git a/doc/special_remotes/glacier/comment_4_0c92cc82c7ac513130f862391a02d329._comment b/doc/special_remotes/glacier/comment_4_0c92cc82c7ac513130f862391a02d329._comment new file mode 100644 index 000000000..2de6632eb --- /dev/null +++ b/doc/special_remotes/glacier/comment_4_0c92cc82c7ac513130f862391a02d329._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="basak" + ip="2001:8b0:1c8::2" + subject="comment 4" + date="2013-05-22T18:10:32Z" + content=""" +Let's discuss this in a bug. I've created http://git-annex.branchable.com/bugs/Glacier_remote_uploads_duplicates/ +"""]] diff --git a/doc/special_remotes/glacier/comment_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment b/doc/special_remotes/glacier/comment_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment new file mode 100644 index 000000000..ee535e1f1 --- /dev/null +++ b/doc/special_remotes/glacier/comment_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 5" + date="2013-06-03T09:03:57Z" + content=""" +You are not the only one, Justin. I am just getting into git-annex and I am setting up a glacier remote as I write this. +"""]] diff --git a/doc/special_remotes/glacier/comment_6_adb1db354dc4941e4b004e4ba34660d7._comment b/doc/special_remotes/glacier/comment_6_adb1db354dc4941e4b004e4ba34660d7._comment new file mode 100644 index 000000000..717060fcb --- /dev/null +++ b/doc/special_remotes/glacier/comment_6_adb1db354dc4941e4b004e4ba34660d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="I know this thread is old but..." + date="2013-11-18T00:27:50Z" + content=""" +It's working well for me, though I seem to sometimes still hit the duplicate bug listed above. +"""]] diff --git a/doc/special_remotes/glacier/comment_7_747e403aac5acaba00e220931e926951._comment b/doc/special_remotes/glacier/comment_7_747e403aac5acaba00e220931e926951._comment new file mode 100644 index 000000000..045fb6041 --- /dev/null +++ b/doc/special_remotes/glacier/comment_7_747e403aac5acaba00e220931e926951._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq4ClC5EMN1Vq1DpWXAqP5TiDnCK1mSfk" + nickname="Jonas" + subject="Expected cost for a repository" + date="2013-11-24T22:32:16Z" + content=""" +Is there a way to estimate the cost of storing a repo on glacier? + +I'm especially worried because of the cost of STORE and RETRIEVE requests; there are hundreds of thousands of small files in my annex repo, so that request cost could easily dominate storage cost. Does the glacier remote do anything to minimize the number of objects stored in glacier? +"""]] diff --git a/doc/special_remotes/glacier/comment_8_a04bb5f27c1a7cfffe881903f973dbec._comment b/doc/special_remotes/glacier/comment_8_a04bb5f27c1a7cfffe881903f973dbec._comment new file mode 100644 index 000000000..4fc831959 --- /dev/null +++ b/doc/special_remotes/glacier/comment_8_a04bb5f27c1a7cfffe881903f973dbec._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhaXbLZQ5uQ6fM2kV0n8bj6IwZjx2CLeM" + nickname="Shane" + subject="Annex can't find Glacier remote" + date="2014-06-26T05:50:38Z" + content=""" +I'm setting up git-annex with glacier-cli for the first time. I have installed git-annex via Yum and glacier-cli according to the instructions on Github. The `glacier` command is in my path. I did not set up hooks with Git annex as it appears that using hooks for glacier is no longer required. + +Here is my version information for git-annex: + + $ git-annex version + git-annex version: 3.20120523 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +When I attempt to add my Glacier remote, here is what I see: + + $ git annex initremote glacier type=glacier keyid=ABCDEFG + git-annex: Unknown remote type glacier + +Is there something else I need to do in order to correctly install Glacier integration with git-annex? I'm having trouble finding up-to-date information that describes the installation process. +"""]] diff --git a/doc/special_remotes/glacier/comment_9_89c4506e079c299fd098d0fe746d032a._comment b/doc/special_remotes/glacier/comment_9_89c4506e079c299fd098d0fe746d032a._comment new file mode 100644 index 000000000..ae8c27ee2 --- /dev/null +++ b/doc/special_remotes/glacier/comment_9_89c4506e079c299fd098d0fe746d032a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="that is an ancient version of git-annex, Shane" + date="2014-07-02T17:11:24Z" + content=""" +The first git-annex release to support glacier without using hooks was 3.20121126. +"""]] diff --git a/doc/special_remotes/hook.mdwn b/doc/special_remotes/hook.mdwn new file mode 100644 index 000000000..8cf31ed02 --- /dev/null +++ b/doc/special_remotes/hook.mdwn @@ -0,0 +1,109 @@ +This special remote type lets you store content in a remote of your own +devising, configured via some simple hooks. + +It's not recommended to use this remote type when another like [[rsync]] +or [[directory]] will do. If your hooks are not carefully written, data +could be lost. + +If you're building a special remote for others to use, +instead consider building an [[external_special_remote|external]]. + +## example + +Here's a simple example that stores content on clay tablets. If you +implement this example in the real world, I'd appreciate a tour +next Apert! :) --[[Joey]] + + # git config annex.cuneiform-store-hook 'tocuneiform < "$ANNEX_FILE" | tablet-writer --implement=stylus --title="$ANNEX_KEY" | tablet-proofreader | librarian --shelve --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2' + # git config annex.cuneiform-retrieve-hook 'librarian --get --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" | tablet-reader --implement=coffee --implement=glasses --force-monastic-dedication | fromcuneiform > "$ANNEX_FILE"' + # git config annex.cuneiform-remove-hook 'librarian --get --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" | goon --hit-with-hammer' + # git config annex.cuneiform-checkpresent-hook 'librarian --find --force-distrust-catalog --floor=$ANNEX_HASH_1 --shelf=$ANNEX_HASH_2 --title="$ANNEX_KEY" --shout-title' + # git annex initremote library type=hook hooktype=cuneiform encryption=none + # git annex describe library "the reborn Library of Alexandria (upgrade to bronze plates pending)" + +Can you spot the potential data loss bugs in the above simple example? +(Hint: What happens when the `tablet-proofreader` exits nonzero?) + +## configuration + +These parameters can be passed to `git annex initremote`: + +* `hooktype` - Required. This specifies a collection of hooks to use for + this remote. + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +## hooks + +Each type of hook remote is specified by a collection of hook commands. +Each hook command is run as a shell command line, and should return nonzero +on failure, and zero on success. + +These environment variables are used to communicate with the hook commands: + +* `ANNEX_KEY` - name of a key to store, retrieve, remove, or check. +* `ANNEX_FILE` - a file containing the key's content +* `ANNEX_HASH_1` - short stable value, based on the key, can be used for hashing + into 1024 buckets. +* `ANNEX_HASH_2` - another hash value, can be used for a second level of hashing + +The settings to use in git config for the hook commands are as follows: + +* `annex.$hooktype-store-hook` - Command run to store a key in the special remote. + `ANNEX_FILE` contains the content to be stored. + +* `annex.$hooktype-retrieve-hook` - Command run to retrieve a key from the special remote. + `ANNEX_FILE` is a file that the retrieved content should be written to. + The file may already exist with a partial + copy of the content (or possibly just garbage), to allow for resuming + of partial transfers. + +* `annex.$hooktype-remove-hook` - Command to remove a key from the special remote. + +* `annex.$hooktype-checkpresent-hook` - Command to check if a key is present + in the special remote. Should output the key name to stdout, on its own line, + if and only if the key has been actively verified to be present in the + special remote (caching presence information is a very bad idea); + all other output to stdout will be ignored. + +## combined hook program + +This interface is deprecated -- it's better, and not much harder, +to write an [[external_special_remote|external]]! + +Rather than setting all of the above hooks, you can write a single +program that handles everything, and set a single hook to make it be used. + + # git config annex.demo-hook /usr/local/bin/annexdemo + # git annex initremote mydemorepo type=hook hooktype=demo encryption=none + +The program just needs to look at the `ANNEX_ACTION` environment variable +to see what it's being asked to do. For example: + +[[!format sh """ +#!/bin/sh +set -e +case "$ANNEX_ACTION" in + store) + demo-upload "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY" < "$ANNEX_FILE" + ;; + retrieve) + demo-download "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY" > "$ANNEX_FILE" + ;; + remove) + demo-nuke "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY" + ;; + checkpresent) + if demo-exists "$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY"; then + echo "$ANNEX_KEY" + fi + ;; + *) + echo "unknown ANNEX_ACTION: $ANNEX_ACTION" >&2 + exit 1 + ;; +esac +"""]] diff --git a/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment b/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment new file mode 100644 index 000000000..2163ba76d --- /dev/null +++ b/doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="helmut" + ip="89.0.176.236" + subject="Asynchronous hooks?" + date="2012-10-13T09:46:14Z" + content=""" +Is there a way to use asynchronous remotes? Interaction with git annex would have to +split the part of initiating some action from completing it. + +I imagine I could `git annex copy` a file to an asynchronous remote and the command +would almost immediately complete. Later I would learn that the transfer is +completed, so the hook must be able to record that information in the `git-annex` +branch. An additional plumbing command seems required here as well as a way to +indicate that even though the store-hook completed, the file is not transferred. + +Similarly `git annex get` would immediately return without actually fetching the +file. This should already be possible by returning non-zero from the retrieve-hook. +Later the hook could use plumbing level commands to actually stick the received file +into the repository. + +The remove-hook should need no changes, but the checkpresent-hook would be more like +a trigger without any actual result. The extension of the plumbing required for the +extension to the receive-hook could update the location log. A downside here is that +you never know when a fsck has completed. + +My proposal does not include a way to track the completion of actions, but relies on +the hook to always complete them reliably. It is not clear that this is the best road +for asynchronous hooks. + +One use case for this would be a remote that is only accessible via uucp. Are there +other use cases? Is the drafted interface useful? +"""]] diff --git a/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment b/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment new file mode 100644 index 000000000..ec64dd96d --- /dev/null +++ b/doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg" + nickname="Bence" + subject="More environment variables" + date="2013-07-09T10:28:58Z" + content=""" +Could you please include the original filename+path in the environment variables (_next to ANNEX_KEY & ANNEX_FILE_)? Like ANNEX_FILENAME and ANNEX_PATH. + +Having these infos in a hook would help eg. a flickr backend to be more usefull. [Tags](http://www.flickr.com/help/tags/) would contain the ANNEX_KEY and the image title could be the original filename (ANNEX_FILENAME). Also, having directory path (ANNEX_PATH) for the given file, the uploading process could put images into the proper sets/collections. Voila, you have a \"filesystem based\" flickr image gallery (almost like flickrfs). + +Other backends, like AmazonS3 having [meta data](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html) also could benefit from this. + +To build the Death Star further, an _annex.$hooktype-**sync**-hook_ would instruct the backend to sync data, eg. place or move images/files in the proper image-sets/directories after they are moved/repositioned in git-annex, but that would be the backend's job, not git-annex's. Maybe the sync-hook would be called when _git annex sync_ is called. This is just an idea. + +While writing this, a new hook for sharing came into my mind: _annex.$hooktype-**share**-hook_. +Calling this on a file/directory (_git annex share my_image_to_share.jpg_) would return a publicly shareable (short)url pointing to the file/directory. This would work for web-backends like AmazonS3, flickr, DropBox, Google Drive, ... +"""]] diff --git a/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment b/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment new file mode 100644 index 000000000..0f8c80254 --- /dev/null +++ b/doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 3" + date="2013-07-09T10:54:58Z" + content=""" +I have requested this before. But it doesn't seem to be entirely doable because some items may have multiple equally correct filenames/paths. And some items may have zero filenames/paths. + +That said I hope a solution can be found because I really want this feature too. And would implement it in all my hooks. + +And for some of the cases i don't really see it as an issue. If you have a public flickr repo with clean(unencrypted) files. It is because you want to access existing files. If an object has no filename/path the hook could/would/should just ignore the file, sure this means no backup of old versions of files, but you can have other backends for those versions. + +The bigger issue is with the same file existing multiple places in the annex, which filename/path should be used? And the filename/path can change between sync(if it is deleted from one of the positions). I personally still see this as being entirely doable. The key for downloading would always be the same, so worst case scenario is the image may be duplicated on flickr. Or that the picture only one of the multiple folders it should be in on flickr. Still, i see these issues as being minor, and that usability would increase if this was implemented, even with these caveats. + +And there probably is some issues I haven't realized/know about. + +"""]] diff --git a/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment b/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment new file mode 100644 index 000000000..988d17def --- /dev/null +++ b/doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg" + nickname="Bence" + subject="checkpresent success and failure" + date="2013-07-31T13:06:21Z" + content=""" +What value should be returned in the \"checkpresent-hook\" to signal that the given file does not exist in the given backend? + +Should the called hook process return an exit code less or greater then zero? In this case the following is displayed: +>(user error (sh [\"-c\",\"name_of_the_process\"] exited 1)) failed + +This tells that the process failed (no internet connection or something that prevents the process from doing its job) and not that result is false, which would mean the file/entry does not exist in the given backend. +If the return code is zero the file is treated as existing file/entry (no matter what I write to stderr). + +Also I think, the \"checkpresent\" block misses the ending ;; in the example. + +Here is my work-in-progress hook: https://gist.github.com/parhuzamos/31bf4516eea434e0d248 +"""]] diff --git a/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment b/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment new file mode 100644 index 000000000..a4c7b525e --- /dev/null +++ b/doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 5" + date="2013-07-31T16:25:55Z" + content=""" +The checkpresent hook should always exit 0 unless there was an exceptional condition (eg, perhaps it cannot check if the file exists one way or the other). Like the documentation for it says, the important thing is what it outputs to stdout, which should contain the key name if it's present, and should not contain the key name if it's not present. + +I hope you post to this website about your special remote when you get it fully working! +"""]] diff --git a/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment b/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment new file mode 100644 index 000000000..e7c218f57 --- /dev/null +++ b/doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg" + nickname="Bence" + subject="comment 6" + date="2013-07-31T17:34:50Z" + content=""" +Roger that. + +If this is acceptable: [terminal output screenshot](http://i.imgur.com/lsJJYwF.png), than I'm almost done and will publish soon. +(Of course a REST API using client would much be better, but this is just the start.) + +"""]] diff --git a/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment b/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment new file mode 100644 index 000000000..68cdf6545 --- /dev/null +++ b/doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 7" + date="2013-07-31T17:42:22Z" + content=""" +If I were you I'd suppress that \"File not found\" error. + +Hook special remotes *can* output messages to stderr, and it's also fine to output eg, progress bars to stdout when seding/receving files. But unnecessary cluttery output should be avoided. +"""]] diff --git a/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment b/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment new file mode 100644 index 000000000..81cc32511 --- /dev/null +++ b/doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg" + nickname="Bence" + subject="checkpresent again" + date="2013-08-01T23:18:38Z" + content=""" +In the current [HEAD](https://github.com/joeyh/git-annex/commit/bb74db6ef094324062adcf26a677113ee6fd0e58) the \"checkpresent\" method in [Hook.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Hook.hs#L145) is missing a \"return\" while other hooks have a return value eg. [Directory.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Directory.hs#L241), [Rsync.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Rsync.hs#L272), ... + + +I noticed that if my *checkpresent* hook does not output anything (to be exact: I commented out all the lines in the block) it behaves strangely. I copied the test file to \"copyrepo\", removed it by hand (so git-annex does not know about the change) and executed a fsck. + + ~/annex5/test1/123 $ git annex fsck --from copyrepo --fast + fsck somefile.1 (checking copyrepo...) (fixing location log) + ** Based on the location log, somefile.1 + ** was expected to be present, but its content is missing. + failed + +running the check again + + ~/annex5/test1/123 $ ga fsck --from copyrepo --fast + fsck somefile.1 (checking copyrepo...) ok + +and running the check again without --fast + + ~/annex5/test1/123 $ ga fsck --from copyrepo + fsck somefile.1 (checking copyrepo...) ok + +It thinks, the file is in the repo but it is not. + +"""]] diff --git a/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment b/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment new file mode 100644 index 000000000..89719adfb --- /dev/null +++ b/doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 9" + date="2013-08-01T23:51:48Z" + content=""" +The behavior you show with `fsck --from` is that the first time it's run against the damaged remote it notices the file is not present using the checkpresent hook. It then updates the location log. The subsequent times it's run, it sees that the location log says the file is not present in the remote. It verifies this is the case by calling the checkpresent hook. Since the two data sources agree, and numcopies is still satisfied, it prints \"ok\". There does not seem to be a bug here. + +(`return` in Haskell does not do what you would expect to happen in a traditional imperative language. It does not alter control flow, and any function using `return` can be mechanically converted to one that does not use `return`.) +"""]] diff --git a/doc/special_remotes/rsync.mdwn b/doc/special_remotes/rsync.mdwn new file mode 100644 index 000000000..b2a9d23f5 --- /dev/null +++ b/doc/special_remotes/rsync.mdwn @@ -0,0 +1,56 @@ +This special remote type rsyncs file contents to somewhere else. + +Setup example: + + # git annex initremote myrsync type=rsync rsyncurl=rsync://rsync.example.com/myrsync keyid=joey@kitenet.net + # git annex describe myrsync "rsync server" + +Or for using rsync over SSH + + # git annex initremote myrsync type=rsync rsyncurl=ssh.example.com:/myrsync keyid=joey@kitenet.net + # git annex describe myrsync "rsync server" + +## configuration + +These parameters can be passed to `git annex initremote` to configure rsync: + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `rsyncurl` - Required. This is the url or `hostname:/directory` to + pass to rsync to tell it where to store content. + +* `shellescape` - Optional. Set to "no" to avoid shell escaping normally + done when using rsync over ssh. That escaping is needed with typical + setups, but not with some hosting providers that do not expose rsynced + filenames to the shell. You'll know you need this option if `git annex get` + from the special remote fails with an error message containing a single + quote (`'`) character. If that happens, you can run enableremote + setting shellescape=no. + +The `annex-rsync-options` git configuration setting can be used to pass +parameters to rsync. + +## annex-rsync-transport + +You can use the `annex-rsync-transport` git configuration setting to choose +whether we run rsync over ssh or rsh. This setting is also used to specify +parameters that git annex will pass to ssh/rsh. + +ssh is the default transport; if you'd like to run rsync over rsh, modify your +.git/config to include + + annex-rsync-transport = rsh + +under the appropriate remote. + +To pass parameters to ssh/rsh, include the parameters after "rsh" or +"ssh". For example, to configure ssh to use the private key at +`/path/to/private/key`, specify + + annex-rsync-transport = ssh -i /path/to/private/key + +Note that environment variables aren't expanded here, so for example, you +cannot specify `-i $HOME/.ssh/private_key`. diff --git a/doc/special_remotes/rsync/comment_10_43e8fa3517c1f5935f02ad06fbed63dc._comment b/doc/special_remotes/rsync/comment_10_43e8fa3517c1f5935f02ad06fbed63dc._comment new file mode 100644 index 000000000..185bd97ec --- /dev/null +++ b/doc/special_remotes/rsync/comment_10_43e8fa3517c1f5935f02ad06fbed63dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="comment 10" + date="2013-08-25T20:59:41Z" + content=""" +@joey I don't understand you last comment where you state that special remotes can act as transfer repositories \"to transfer the files between computers that do not communicate directly\". If there's no communication, ie git pushes or pulls, between the computers then they don't know what file names the files on the special remote map to. They need to somehow communicate the git repo too, don't they? +"""]] diff --git a/doc/special_remotes/rsync/comment_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment b/doc/special_remotes/rsync/comment_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment new file mode 100644 index 000000000..c8fc8831a --- /dev/null +++ b/doc/special_remotes/rsync/comment_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 11" + date="2013-08-26T18:36:03Z" + content=""" +@Chris yes in that case you still need, a central git repository (which need not be on a host that supports git-annex), or the assistant can use xmpp to sync the git data. +"""]] diff --git a/doc/special_remotes/rsync/comment_1_9e180c397486989beab21699b8e8f103._comment b/doc/special_remotes/rsync/comment_1_9e180c397486989beab21699b8e8f103._comment new file mode 100644 index 000000000..a4c403e7e --- /dev/null +++ b/doc/special_remotes/rsync/comment_1_9e180c397486989beab21699b8e8f103._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="diepes" + ip="105.227.34.36" + subject="rsync description and example" + date="2013-03-29T15:57:20Z" + content=""" +Hi, I would like to see a example of setting up / using e.g. rsync.net as a repo. + + +Please also provide a highlevel description of how the rsync repo fits in with git-annex. + + +Q1. can you adds files to the remote rsync repo, and will they be detected and synced back ? +Q2. is all the git history rsync'd to remote ? how do i recover if i loose all data except the remote rsync repo ? + +"""]] diff --git a/doc/special_remotes/rsync/comment_2_25545dc0b53f09ae73b29899c8884b02._comment b/doc/special_remotes/rsync/comment_2_25545dc0b53f09ae73b29899c8884b02._comment new file mode 100644 index 000000000..3a6e25b0d --- /dev/null +++ b/doc/special_remotes/rsync/comment_2_25545dc0b53f09ae73b29899c8884b02._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-29T17:12:47Z" + content=""" +No, special remotes do not contain a copy of the git repository, and no, git-annex does not notice when files are added to remote rsync repositories. Suggest you read [[special_remotes]]. +"""]] diff --git a/doc/special_remotes/rsync/comment_3_960a89b1ae7e3888ffba06baa963dc21._comment b/doc/special_remotes/rsync/comment_3_960a89b1ae7e3888ffba06baa963dc21._comment new file mode 100644 index 000000000..37911a7e7 --- /dev/null +++ b/doc/special_remotes/rsync/comment_3_960a89b1ae7e3888ffba06baa963dc21._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="diepes" + ip="105.227.34.36" + subject="sshfs ? and no sync from special remote to 2nd git-annex ?" + date="2013-03-29T22:09:49Z" + content=""" +* It sound to me it would be 1st prize if the cloud provider supported the git-annex functionality over ssh. +* Then it could be a full git-annex repo, and used for recovery if my laptop with the git info gets lost. +* From special remotes \"These can be used just like any normal remote by git-annex\" +* Your comment \"No, special remotes do not contain a copy of the git repository\" + + * so a special remote is + +1. \"A. just a remote filesystem, that contains the objects with sha1 names ? \" +2. \"B. there is no git info and thus no file name & directory details or am i missing something ?\" +3. \"C. you can't use the remote as a cloud drive to sync changes e.g. file moves, renames between two other git-annex repositories ? (no meta data)\" +4. \"D. the data on the cloud/rsync storage can not be used directly it has to moved into a git-annex capable storage location. \" + +* Would it not be better to mount the remote storage over ssh(sshfs) and then use full git-annex on mounted directory ? +"""]] diff --git a/doc/special_remotes/rsync/comment_4_db84816c31239953dd21f23a8c557b43._comment b/doc/special_remotes/rsync/comment_4_db84816c31239953dd21f23a8c557b43._comment new file mode 100644 index 000000000..4e95fac20 --- /dev/null +++ b/doc/special_remotes/rsync/comment_4_db84816c31239953dd21f23a8c557b43._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="diepes" + ip="41.160.8.49" + subject="rsync.net support git and rsync, not git-annex" + date="2013-05-13T14:44:53Z" + content=""" +how would i use rsync.net as a full repository ? (annex files and git repo) + +It support's rsync, and I discovered now git as well. + +I had a look at the webapp and can't figure out how to set it up, so I can have multiple remote's sync to rsync.net for annex files and git sync. + +Link: http://www.rsync.net/resources/howto/github_integration.html + +"""]] diff --git a/doc/special_remotes/rsync/comment_5_ccaffa4aded9dab88c76a856b96ea5b9._comment b/doc/special_remotes/rsync/comment_5_ccaffa4aded9dab88c76a856b96ea5b9._comment new file mode 100644 index 000000000..3368b59ed --- /dev/null +++ b/doc/special_remotes/rsync/comment_5_ccaffa4aded9dab88c76a856b96ea5b9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="cehteh" + ip="217.8.62.137" + subject="rsync daemon mode" + date="2013-07-27T01:35:37Z" + content=""" +rsync has a --daemon mode with a simple challenge-response authentication but no encryption. This offers a nice lightweight alternative to ssh, especially when we +store/transfer encrypted content anyways. Is this already supported in git-annex, if yes how to set it up? +"""]] diff --git a/doc/special_remotes/rsync/comment_6_e687b9482b177e1351c8c65ea617d3fa._comment b/doc/special_remotes/rsync/comment_6_e687b9482b177e1351c8c65ea617d3fa._comment new file mode 100644 index 000000000..a5cf0514b --- /dev/null +++ b/doc/special_remotes/rsync/comment_6_e687b9482b177e1351c8c65ea617d3fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 6" + date="2013-07-28T00:11:38Z" + content=""" +The first example on this page shows using rsync:// to store files on a system using the rsync daemon. +"""]] diff --git a/doc/special_remotes/rsync/comment_7_e122979ea811d9ef835ba05bb936190f._comment b/doc/special_remotes/rsync/comment_7_e122979ea811d9ef835ba05bb936190f._comment new file mode 100644 index 000000000..8cb1d72b4 --- /dev/null +++ b/doc/special_remotes/rsync/comment_7_e122979ea811d9ef835ba05bb936190f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="rsync remote is basically more intended for backups ?" + date="2013-08-17T17:40:47Z" + content=""" +If I get it correctly, it is mainly useable as a backup, which will accumulate contents of the objects managed by git-annex over time. + +It would be great to have a use case illustrating its use in concrete matters. Thanks in advance. +"""]] diff --git a/doc/special_remotes/rsync/comment_8_d566113318d0aa7500d76ffe1bd46069._comment b/doc/special_remotes/rsync/comment_8_d566113318d0aa7500d76ffe1bd46069._comment new file mode 100644 index 000000000..1e6bf8aa4 --- /dev/null +++ b/doc/special_remotes/rsync/comment_8_d566113318d0aa7500d76ffe1bd46069._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 8" + date="2013-08-22T18:02:00Z" + content=""" +There are many use cases for a rsync special remote. You could use it as a backup. You could use it to archive files offline in a drive with encryption enabled so if the drive is stolen your data is not. You could `git annex move --to rsyncremote` large files when your local drive is getting full, and then `git annex move` the files back when free space is again available. You could have one repository copy files to a rsync remote, and then `git annex get` them on another repository, to transfer the files between computers that do not communicate directly. The git-annex assistant makes it easy to set up rsync remotes using this last scenario, which is referred to as a transfer repository, and arranges to drop files from the transfer repository once they have been transferred to all known clients. + +None of these use cases are particular to rsync remotes. Most special remotes can all be used in these and other ways. It largely doesn't matter for your use what underlying transport the special remote uses. +"""]] diff --git a/doc/special_remotes/rsync/comment_9_5dcf10a502b2d4feac46b620d43e9d00._comment b/doc/special_remotes/rsync/comment_9_5dcf10a502b2d4feac46b620d43e9d00._comment new file mode 100644 index 000000000..b7690cf68 --- /dev/null +++ b/doc/special_remotes/rsync/comment_9_5dcf10a502b2d4feac46b620d43e9d00._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="Added use cases to "special remotes"" + date="2013-08-22T20:23:13Z" + content=""" +Thanks @joeyh. I've taken the liberty to add your use case description to [[special remotes]]. Hope this helps. +"""]] diff --git a/doc/special_remotes/tahoe.mdwn b/doc/special_remotes/tahoe.mdwn new file mode 100644 index 000000000..df1ca620f --- /dev/null +++ b/doc/special_remotes/tahoe.mdwn @@ -0,0 +1,47 @@ +This special remote stores file contents using +[Tahoe-LAFS](http://tahoe-lafs.org/). There are a number of commercial +providers, or you can build your own tahoe storage grid. + +Since Tahoe-LAFS encrypts all data stored in it, git-annex does not do any +additional encryption of its own. + +Note that data stored in a tahoe remote cannot be dropped from it, as +Tahoe-LAFS does not support removing data once it is stored in the Tahoe grid. +This, along with Tahoe's ability to recover data when some nodes fail, +makes a tahoe special remote an excellent choice for storing backups. + +Typically you will have an account on a Tahoe-LAFS storage grid, which +is represented by an "introducer furl". You need to supply this to +git-annex in the `TAHOE_FURL` environment variable when initializing the +remote. git-annex will then generate a tahoe configuration directory for +the remote under `~/.tahoe/git-annex/`, and automatically start the tahoe +daemon as needed. + +## configuration + +These parameters can be passed to `git annex initremote` to configure +the tahoe remote. + +* `shared-convergence-secret` - Optional. Can be useful to set to + allow tahoe to deduplicate information. By default, a new + shared-convergence-secret is created for each tahoe remote. + +* `embedcreds` - Optional. Set to "yes" embed the tahoe credentials + (specifically the introducer-furl and shared-convergence-secret) + inside the git repository, which allows other clones to also use them + in order to access the tahoe grid. + + Think carefully about who can access your git repository, and + whether you want to give them access to your tahoe system before + using embedcreds! + +Setup example: + + # TAHOE_FURL=... git annex initremote tahoe type=tahoe embedcreds=yes + +## old version of tahoe special remote + +An older implementation of tahoe for git-annex used +the hook special remote. It is not compatible with this newer +implementation. See +[[tahoe-lafs|forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs]]. diff --git a/doc/special_remotes/web.mdwn b/doc/special_remotes/web.mdwn new file mode 100644 index 000000000..cd20a93bb --- /dev/null +++ b/doc/special_remotes/web.mdwn @@ -0,0 +1,11 @@ +git-annex can use the WWW as a special remote, downloading urls to files. +See [[tips/using_the_web_as_a_special_remote]] for usage examples. + +## notes + +Currently git-annex only supports downloading content from the web; +it cannot upload to it or remove content. + +This special remote uses arbitrary urls on the web as the source for content. +git-annex can also download content from a normal git remote, accessible by +http. diff --git a/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment b/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment new file mode 100644 index 000000000..d01e17da3 --- /dev/null +++ b/doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.berger.myopenid.com/" + nickname="obergix" + subject="Which URL prefix are supported ?" + date="2013-08-17T08:44:05Z" + content=""" +It is not clear whether only http:// URLs are supported. Can you list others ? +"""]] diff --git a/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment b/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment new file mode 100644 index 000000000..ff2018117 --- /dev/null +++ b/doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-08-17T08:59:11Z" + content=""" +When it says \"arbitrary urls\", it means it. The only requirement is that the url be well formed and that wget or whatever command you have it configured to use via annex.web-download-command knows how to download it. +"""]] diff --git a/doc/special_remotes/webdav.mdwn b/doc/special_remotes/webdav.mdwn new file mode 100644 index 000000000..21b213ee5 --- /dev/null +++ b/doc/special_remotes/webdav.mdwn @@ -0,0 +1,42 @@ +This special remote type stores file contents in a WebDAV server. + +## configuration + +The environment variables `WEBDAV_USERNAME` and `WEBDAV_PASSWORD` are used +to supply login credentials. You need to set these only when running +`git annex initremote`, as they will be cached in a file only you +can read inside the local git repository. + +A number of parameters can be passed to `git annex initremote` to configure +the webdav remote. + +* `encryption` - One of "none", "hybrid", "shared", or "pubkey". + See [[encryption]]. + +* `keyid` - Specifies the gpg key to use for [[encryption]]. + +* `embedcreds` - Optional. Set to "yes" embed the login credentials inside + the git repository, which allows other clones to also access them. This is + the default when gpg encryption is enabled; the credentials are stored + encrypted and only those with the repository's keys can access them. + + It is not the default when using shared encryption, or no encryption. + Think carefully about who can access your repository before using + embedcreds without gpg encryption. + +* `url` - Required. The URL to the WebDAV directory where files will be + stored. This can be a subdirectory of a larger WebDAV repository, and will + be created as needed. Use of a https URL is strongly + encouraged, since HTTP basic authentication is used. + +* `chunksize` - Avoid storing files larger than the specified size in + WebDAV. For use when the WebDAV server has file size + limitations. The default is to never chunk files. + The value can use specified using any commonly used units. + Example: `chunksize=75 megabytes` + Note that enabling chunking on an existing remote with non-chunked + files is not recommended. + +Setup example: + + # WEBDAV_USERNAME=joey@kitenet.net WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex chunksize=75mb keyid=joey@kitenet.net diff --git a/doc/special_remotes/webdav/comment_10_2c087a132c2203ac20636800bf73dfa7._comment b/doc/special_remotes/webdav/comment_10_2c087a132c2203ac20636800bf73dfa7._comment new file mode 100644 index 000000000..48f89ca41 --- /dev/null +++ b/doc/special_remotes/webdav/comment_10_2c087a132c2203ac20636800bf73dfa7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnq-RfkVpFN15SWvQ2lpSGAi0XpNQuLxKM" + nickname="Yuval" + subject="re: Change Password" + date="2014-05-04T19:09:55Z" + content=""" +I have Carl's problem as well. Changed box.com's password and now things are crazy. +"""]] diff --git a/doc/special_remotes/webdav/comment_11_cde4fccaf551ba1eab8235ebf6654316._comment b/doc/special_remotes/webdav/comment_11_cde4fccaf551ba1eab8235ebf6654316._comment new file mode 100644 index 000000000..267fc3580 --- /dev/null +++ b/doc/special_remotes/webdav/comment_11_cde4fccaf551ba1eab8235ebf6654316._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-05-16T18:19:21Z" + content=""" +You can change the webdav password by running: + +WEBDAV_USERNAME=whatever WEBDAV_PASSWORD=newpassword git annex enableremote $remotename +"""]] diff --git a/doc/special_remotes/webdav/comment_12_76423262fceeced32ab18fa38ed53bdb._comment b/doc/special_remotes/webdav/comment_12_76423262fceeced32ab18fa38ed53bdb._comment new file mode 100644 index 000000000..3d15fc0fb --- /dev/null +++ b/doc/special_remotes/webdav/comment_12_76423262fceeced32ab18fa38ed53bdb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="comment 12" + date="2014-05-17T20:47:00Z" + content=""" +I tried it, but I do have som troubles. Changing password seemed to have worked. At least I do think it did say OK. Any further action generates the following response: + +$ git annex fsck --from box.com3 Literatur/Science/Papers/Modén/2006.pdf + +fsck Literatur/Science/Papers/Modén/2006.pdf (gpg) (checking box.com3...) (StatusCodeException (Status {statusCode = 401, statusMessage = \"Unauthorized\"}) [(\"Server\",\"nginx\"),(\"Date\",\"Sat, 17 May 2014 19:04:51 GMT\"),(\"Content-Type\",\"application/xml; charset=utf-8\"),(\"Content-Length\",\"235\"),(\"Connection\",\"keep-alive\"),(\"Vary\",\"Host\"),(\"WWW-Authenticate\",\"Basic realm=\\"dav.box.com\\"\"),(\"X-Response-Body-Start\",\"\n\n Sabre_DAV_Exception_NotAuthenticated\n Username or password does not match\n\n\")] (CJ {expose = []})) failed +git-annex: fsck: 1 failed + +It seems it is not available to use the correct password. I tried to use initremote and create a new remote, and this works. In the end no data is lost, as three copies out of my four are still there. I will keep my old remote around for some time if there is any sort of errorfinding that can be done. +"""]] diff --git a/doc/special_remotes/webdav/comment_14_2390020fa7daac8a6d3e8b713bd3b8e7._comment b/doc/special_remotes/webdav/comment_14_2390020fa7daac8a6d3e8b713bd3b8e7._comment new file mode 100644 index 000000000..b6f624a62 --- /dev/null +++ b/doc/special_remotes/webdav/comment_14_2390020fa7daac8a6d3e8b713bd3b8e7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="Box.com and unknown CA?" + date="2014-05-21T04:07:36Z" + content=""" +When trying to enable box.com for jabber sharing, I get: + + WebDAV failed to write file: TlsException (HandshakeFailed (Error_Protocol (\"certificate has unknown CA\",True,UnknownCa))): user error + +How can I debug this situation? +"""]] diff --git a/doc/special_remotes/webdav/comment_1_6b523eea78eae1d19fe2a9950ee33e3a._comment b/doc/special_remotes/webdav/comment_1_6b523eea78eae1d19fe2a9950ee33e3a._comment new file mode 100644 index 000000000..768720fe5 --- /dev/null +++ b/doc/special_remotes/webdav/comment_1_6b523eea78eae1d19fe2a9950ee33e3a._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://rfhbuk.myopenid.com/" + ip="109.145.123.81" + subject="git-annex initremote failing for webdav servers" + date="2012-12-01T10:18:04Z" + content=""" +Unfortunately, trying to set up the following webdav servers fail. Some of the terminal output of git-annex --debug initremote ... is below, but it may not really helpful. Can I help any further, can a webdav remote be set up in a different way? (The box.com webdav initremote worked fine.) Cheers + + +With livedrive.com: + + [2012-12-01 10:15:12 GMT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--recipient\",\"xxxxxxxxxxxxxx\"] + (encryption setup with gpg key xxxxxxxxxxxxxx) (testing WebDAV server...) + git-annex: \"Bad Request\": user error + failed + git-annex: initremote: 1 failed + + +With sd2dav.1und1.de: + + [2012-12-01 10:13:10 GMT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--recipient\",\"xxxxxxxxxxxxxx\"] + (encryption setup with gpg key xxxxxxxxxxxxxx) (testing WebDAV server...) + git-annex: \"Locked\": user error + failed + git-annex: initremote: 1 failed +"""]] diff --git a/doc/special_remotes/webdav/comment_2_83fc4e7d9ba7a05c8500da659f561b8f._comment b/doc/special_remotes/webdav/comment_2_83fc4e7d9ba7a05c8500da659f561b8f._comment new file mode 100644 index 000000000..8a23ad493 --- /dev/null +++ b/doc/special_remotes/webdav/comment_2_83fc4e7d9ba7a05c8500da659f561b8f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 2" + date="2012-12-01T18:34:05Z" + content=""" +I tried signing up for livedrive, but I cannot log into it with WebDav at all. Do they require a Pro account to use WebDav? + +When it's \"testing webdav server\", it tries to make a collection (a subdirectory), and uploads a file to it, and sets the file's properties, and deletes the file. One of these actions must be failing, perhaps because the webdav server implementation does not support it. Or perhaps because the webdav client library is doing something wrong. I've instrumented the test, so it'll say which one. +"""]] diff --git a/doc/special_remotes/webdav/comment_3_239367ad639c61ecdf87a89f7ac53efe._comment b/doc/special_remotes/webdav/comment_3_239367ad639c61ecdf87a89f7ac53efe._comment new file mode 100644 index 000000000..2d559b7af --- /dev/null +++ b/doc/special_remotes/webdav/comment_3_239367ad639c61ecdf87a89f7ac53efe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-12-01T20:13:36Z" + content=""" +I've identified the problem keeping it working with livedrive. Once a patch I've written is applied to the Haskell DAV library, I'll be able to update git-annex to support it. + +I don't know about sd2dav.1und1.de. The error looks like it doesn't support WebDAV file locking. +"""]] diff --git a/doc/special_remotes/webdav/comment_4_ffa52f7776cdc8caa28667b5eadae123._comment b/doc/special_remotes/webdav/comment_4_ffa52f7776cdc8caa28667b5eadae123._comment new file mode 100644 index 000000000..24dd85bf5 --- /dev/null +++ b/doc/special_remotes/webdav/comment_4_ffa52f7776cdc8caa28667b5eadae123._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 4" + date="2012-12-01T21:14:34Z" + content=""" +Good news, livedrive is supported now, by git-annex's master branch. +"""]] diff --git a/doc/special_remotes/webdav/comment_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment b/doc/special_remotes/webdav/comment_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment new file mode 100644 index 000000000..7d5f3af5d --- /dev/null +++ b/doc/special_remotes/webdav/comment_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="192.100.130.7" + subject="WebDAV without locking" + date="2013-01-16T12:44:16Z" + content=""" +Hi Joey, + +you are right, the 1-und-1.de implementation of WebDAV does not support locking. + +Do you think there is a way to make that service work with git-annex anyhow -- say, by allowing the user to disable file-locking? I've worked around the problem with 1-und-1.de by using fuse+davfs2 to mount the storage in my file system and access it through the directory backend, but FUSE is dead slow, unfortunately, and this solution really sucks. +"""]] diff --git a/doc/special_remotes/webdav/comment_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment b/doc/special_remotes/webdav/comment_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment new file mode 100644 index 000000000..150c984a8 --- /dev/null +++ b/doc/special_remotes/webdav/comment_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 6" + date="2013-01-17T18:23:27Z" + content=""" +It seems it must advertise it supports the LOCK and UNLOCK http actions, but fails when they're used. + +The DAV library I am using always locks if it seems the server supports it. So this will need changes to that library. I've filed a bug requesting the changes. +"""]] diff --git a/doc/special_remotes/webdav/comment_7_6fa7e11331db5a943015bd5367eb3d73._comment b/doc/special_remotes/webdav/comment_7_6fa7e11331db5a943015bd5367eb3d73._comment new file mode 100644 index 000000000..324760c4c --- /dev/null +++ b/doc/special_remotes/webdav/comment_7_6fa7e11331db5a943015bd5367eb3d73._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="SSL certificates" + date="2013-03-25T16:09:54Z" + content=""" +Trying to use webdav leads in: + + git-annex: HandshakeFailed (Error_Protocol (\"certificate rejected: not coping with anything else Start (Container Context 0)\",True,CertificateUnknown)) + +How can I disable the SSL certificate check? +"""]] diff --git a/doc/special_remotes/webdav/comment_8_2627b41f80c7511b27464e2040b128a8._comment b/doc/special_remotes/webdav/comment_8_2627b41f80c7511b27464e2040b128a8._comment new file mode 100644 index 000000000..96ae19d11 --- /dev/null +++ b/doc/special_remotes/webdav/comment_8_2627b41f80c7511b27464e2040b128a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-03-27T16:38:47Z" + content=""" +I don't think the checking of SSL certificates can currently be disabled. +"""]] diff --git a/doc/special_remotes/webdav/comment_9_b8f17efe524bb45a3e16705996df1265._comment b/doc/special_remotes/webdav/comment_9_b8f17efe524bb45a3e16705996df1265._comment new file mode 100644 index 000000000..365bf7042 --- /dev/null +++ b/doc/special_remotes/webdav/comment_9_b8f17efe524bb45a3e16705996df1265._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="Change Password" + date="2014-05-02T12:30:58Z" + content=""" +I want to change the password that I use on a webdav service (Heartbleed mitigration). What do I need to do to in git annex to make it have access to the new password? Thanks in anvance. +"""]] diff --git a/doc/special_remotes/xmpp.mdwn b/doc/special_remotes/xmpp.mdwn new file mode 100644 index 000000000..0f1c93b25 --- /dev/null +++ b/doc/special_remotes/xmpp.mdwn @@ -0,0 +1,39 @@ +XMPP (Jabber) is used by the [[assistant]] as a git remote. This is, +technically not a git-annex special remote (large files are not transferred +over XMPP; only git commits are sent). + +Typically XMPP will be set up using the web app, but here's how a manual +set up could be accomplished: + +1. xmpp login credentials need to be stored in `.git/annex/creds/xmpp`. + Obviously this file should be mode 600. An example file: + + XMPPCreds {xmppUsername = "joeyhess", xmppPassword = "xxxx", xmppHostname = "xmpp.l.google.com.", xmppPort = 5222, xmppJID = "joeyhess@gmail.com"} + +2. A git remote is created using a special url, of the form `xmpp::user@host` + For the above example, it would be `url = xmpp::joeyhess@gmail.com` + +3. The uuid of one of the other clients using XMPP should be configured + using the `annex.uuid` setting, the same as is set up for other remotes. + +With the above configuration, the [[assistant]] will use xmpp remotes much as +any other git remote. Since XMPP requires a client that is continually running +to see incoming pushes, the XMPP remote cannot be used with git at the +command line. + +## XMPP server support status +[[!table data=""" +Provider|Status|Type|Notes +[[Gmail|http://gmail.com]]|Working|?|Google Apps: [setup your SRV records](http://www.olark.com/gtalk/check_srv) or configure `.git/annex/creds/xmpp` manually +[[Coderollers|http://www.coderollers.com/xmpp-server/]]|Working|[[Openfire|http://www.igniterealtime.org/projects/openfire/]] +[[jabber.me|http://jabber.me/]]|Working|[[Tigase|http://www.tigase.org/]] +[[xmpp.ru.net|https://www.xmpp.ru.net]]|Working|[[jabberd2|http://jabberd2.org/]] +[[jabber.org|http://jabber.org]]|Working|[[Isode M-Link|http://www.isode.com/products/m-link.html]] +-|Working|[[Prosody|http://prosody.im/]]|No providers tested. +-|Working|[[Metronome|http://www.lightwitch.org/]]|No providers tested. +-|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/]]|ejabberd|[[Authentication bug|https://support.process-one.net/browse/EJAB-1632]]: Fixed in debian unstable (>= 2.1.10-5) and stable (>=2.1.10-4+deb7u1) +-|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/#comment-4ce5aeabd12ca3016290b3d8255f6ef1]]|jabberd14|No further information +"""]] +List of providers: [[http://xmpp.net/]] + +See also: [[xmpp_protocol_design_notes|design/assistant/xmpp]] diff --git a/doc/special_remotes/xmpp/comment_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment b/doc/special_remotes/xmpp/comment_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment new file mode 100644 index 000000000..0380af359 --- /dev/null +++ b/doc/special_remotes/xmpp/comment_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="Google Apps & SRV" + date="2013-11-27T18:13:18Z" + content=""" +To make XMPP via a Google Apps account work out of the box, all you need to do is add the correct SRV records to your domain's DNS zone. If you do, you don't need to manually create creds/xmpp, you can just use the web interface, enter your full apps email address and password (remember, if 2-factor, this needs to be an application-specific password). + +To create the correct SRV records (and check whether they're correct), see http://www.olark.com/gtalk/check_srv +"""]] diff --git a/doc/special_remotes/xmpp/comment_11_05d9a67b9331656b4035399641cedb1b._comment b/doc/special_remotes/xmpp/comment_11_05d9a67b9331656b4035399641cedb1b._comment new file mode 100644 index 000000000..4b343bda2 --- /dev/null +++ b/doc/special_remotes/xmpp/comment_11_05d9a67b9331656b4035399641cedb1b._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm0yDI6AsAuXPDHIDXm5H9EGDXkuwb1efA" + nickname="Yann" + subject="XMPP not working in Raspberry PI build" + date="2013-12-27T23:16:23Z" + content=""" +Hi, + +I have the same problem that users Carlo and RaspberryPie have: XMPP not working and no XMPP log in the build. + +I did a quick strace during the daemon start and I noticed than the raspberry pi build doesn't even try to read the creds/xmpp files contrary to the standard git-annex package on my ubuntu workstation. + +To me, it seems the XMPP thread is not started at all. +Does someone know any reason why the XMPP thread could not be started ? + +If there is anything I can do to help debug this issue, let me know. + +Yann + + + +"""]] diff --git a/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment b/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment new file mode 100644 index 000000000..060aa5bd7 --- /dev/null +++ b/doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="User defined server" + date="2013-04-17T09:45:59Z" + content=""" +It would be nice if you could expand the XMPP setup in the assistant to support an \"advanced\" settings view where a custom server could be defined. + +Example: I have a google Apps domain called mytest.com, with the users bla1@mytest.com and bla2@mytest.com. When trying to add either of those accounts to the assistant XMPP will try to use mytest.com as the jabber server, and not googles server. + +"""]] diff --git a/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment b/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment new file mode 100644 index 000000000..02f70d0f2 --- /dev/null +++ b/doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 2" + date="2013-04-17T22:28:39Z" + content=""" +Yeah, I agree, this would be nice. + +For your own domain, you can configure DNS like this: [[http://support.google.com/a/bin/answer.py?hl=en&answer=34143]] to make XMPP find the right server. But for some that's not an option and the \"advanced\" mode would be useful in that case. +"""]] diff --git a/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment b/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment new file mode 100644 index 000000000..7643d4d7d --- /dev/null +++ b/doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="46.19.143.203" + subject="Missing prerequisites for XMPP syncing?" + date="2013-09-17T06:53:59Z" + content=""" +I set up two fresh annexes that can talk via XMPP and no other way. After I fire up the assistants I expect them to sync their metadata, but nothing happens. One log gives me an 'XMPPClient: received: [\"Unknown message\"]' message every two minutes. The other one doesn't contain the string XMPP at all, not once. So my suspicion is that this particular version of git-annex doesn't support XMPP, which is weird because: + + $ git annex version + git-annex version: 4.20130909 + build flags: Assistant Pairing Testsuite S3 Inotify XMPP DNS Feeds + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +This is the version output from the other machine: + + $ git annex version + git-annex version: 4.20130827 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +What am I missing? Are there more build flags for XMPP than the one called XMPP? (Also, no, I can't just copy versions between machines b/c the architectures are different. And yep, the one giving me trouble is ARM.) +"""]] diff --git a/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment b/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment new file mode 100644 index 000000000..db217cff9 --- /dev/null +++ b/doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 4" + date="2013-09-19T21:07:35Z" + content=""" +If you have the XMPP flag in your git-annex build, it will support XMPP. Are you sure you set up the xmpp creds file and the xmpp special remote correctly on the ARM machine? (I assume it has no webapp, so you had to set that up manually..) + +Here's how you can do that manually: + +1. Run git-annex on a machine with the webapp, set up XMPP, and copy the .git/annex/creds/xmpp to the machine without the webapp. +2. On the machine without the webapp, add a git remote that has its \"url = xmpp::loginname@xmppserver.com\" and its annex-uuid set to the annex.uuid of the repository on the first machine. +3. Run git-annex assistant on the machine without the webapp. +"""]] diff --git a/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment b/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment new file mode 100644 index 000000000..298c4392a --- /dev/null +++ b/doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment @@ -0,0 +1,73 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="37.221.161.234" + subject="Nope" + date="2013-09-24T22:05:55Z" + content=""" +Your guess is right, Joey, I'm configuring by hand as the ARM machine has no webapp. And yes, I'm mostly sure I set up everything correctly. The XMPP account is working, and my configuration of git-annex is all but identical to your example. + +Here's what I do. First on the machine with the webapp: + + mkdir ~/test + cd ~/test + git init + git annex init + git annex webapp + +I set up XMPP from within the webapp. The file ~/test/.git/annex/creds/xmpp is created with the correct credentials. (BTW: The file's default permissions are 620 instead of 600 - is that a bug?) + +I add a file or two to the annex for good measure. Then, on the ARM machine: + + mkdir ~/test + cd ~/test + git init + git annex init + mkdir .git/annex/creds + scp -2 webappmachine:~/test/.git/annex/creds/xmpp .git/annex/creds + chmod 600 .git/annex/creds/xmpp + git remote add webappmachine xmpp::login@server + +The final step is to edit .git/config on the ARM machine. The [remote] section now looks like this: + + [remote \"webappmachine\"] + url = xmpp::login@server + fetch = +refs/heads/*:refs/remotes/webappmachine/* + annex-uuid = aaaaaaaa-bbbb-cccc-dddddddddddd + +where aaaaaaaa-bbbb-cccc-dddddddddddd is the return value of `git config --get annex.uuid` on the webapp machine. + +I then run `git annex assistant` on the ARM machine and expect the two machines to synchronize their metadata, e.g. the number of knownn annex keys in the repo. But it doesn't happen. + +So I set `debug = true`, restart the assistants and check the log. This is what I get on the webapp machine: + + [2013-09-24 17:45:41 EDT] XMPPClient: connected a5/25577ac4-3248-4c83-8391-bd93708bcf2b + [2013-09-24 17:45:41 EDT] XMPPClient: received: [\"Presence from a5/dc9bcde8-fe18-47de-807c-c620019279f2 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Presence from a5/900e3b6e-a7f4-4a6a-8d12-ed94de429258 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"push\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"])], elementNodes = []})\",\"NotifyPush [UUID \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"]\"] + [2013-09-24 17:45:42 EDT] XMPPClient: push notification for + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"] + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (CanPush (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\") [34f875cc7fa1198414f93990af9ab78e6cee893e,6fad42234060361435d6cf2ab4bd40e438c2d05c])\"] + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"git-annex\"] + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"log\",\"refs/heads/git-annex..6fad42234060361435d6cf2ab4bd40e438c2d05c\",\"--oneline\",\"-n1\"] + [2013-09-24 17:45:42 EDT] chat: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"cat-file\",\"--batch\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Unknown message\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (PushRequest (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\"))\"] + [2013-09-24 17:45:42 EDT] XMPPSendPack: started running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\")) + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"] + [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"] + [2013-09-24 17:45:42 EDT] call: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"branch\",\"-f\",\"synced/master\"] + [2013-09-24 17:45:42 EDT] XMPPSendPack: finished running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\")) False + +And from then on, in two-minute intervals: + + [2013-09-24 17:47:42 EDT] XMPPClient: received: [\"Unknown message\"] + [2013-09-24 17:49:42 EDT] XMPPClient: received: [\"Unknown message\"] + [2013-09-24 17:51:42 EDT] XMPPClient: received: [\"Unknown message\"] + +The log on the ARM machine is rather unhelpful. Actually it doesn't even contain the string \"XMPP\". This looks to me like the webapp machine tries to communicate via Jabber but doesn't get any intelligible answer. And this is the reason I wondered whether the problem lies with my self-compiled ARM git-annex binary. I actually spent a while compiling 4.20130909 with all flags but webapp and webdav, but the result is still the same. + +Any other ideas what I'm doing wrong here? +"""]] diff --git a/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment b/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment new file mode 100644 index 000000000..750e0874a --- /dev/null +++ b/doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 6" + date="2013-09-25T18:13:24Z" + content=""" +If you're not getting an \"XMPPClient: connected\", then my guess would be that your git-annex build's XMPP is screwed up somehow. For example, if it hung forever when connecting to the XMPP server, it would never get as far as printing that message. (If it tried and failed to connect, you'd get a message about the connection having failed.) +"""]] diff --git a/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment b/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment new file mode 100644 index 000000000..0ad65336b --- /dev/null +++ b/doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="46.165.221.166" + subject="comment 7" + date="2013-09-26T03:46:18Z" + content=""" +I see. Is there a way to check whether the build is corrupt? The build logs gave me nothing. + +Anyway, XMPP is not the most important feature to me. It still bugs me though that it doesn't work when it should. +"""]] diff --git a/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment b/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment new file mode 100644 index 000000000..79dd2892b --- /dev/null +++ b/doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 8" + date="2013-10-22T14:30:58Z" + content=""" +Same setup, same problem... no log output on raspberry pi. +"""]] diff --git a/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment b/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment new file mode 100644 index 000000000..3505f3aaf --- /dev/null +++ b/doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4" + nickname="Jörn" + subject="Same problem, no XMPP showing up in daemon.log" + date="2013-11-21T21:13:16Z" + content=""" +I have the same setup like @RaspberryPie, except that my server is not running on the Pi but on Debian7-amd64. On my client (OSX, self-compiled using cabal) I can see XMPP log entries like @RaspberryPi, however, on the Debian7 machine (also self-compiled) I do not see any XMPP entry in the daemon.log. Setup regarding .git/annex/creds/xmpp and the special xmpp remote is correct (checked a thousand times). + +Do you have any idea what could be wrong, Joey? Thanks a lot. + +Output of git annex version: + + git-annex version: 5.20131120 + build flags: Assistant Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 4 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + +Jörn +"""]] diff --git a/doc/summary.mdwn b/doc/summary.mdwn new file mode 100644 index 000000000..be7b2cc2c --- /dev/null +++ b/doc/summary.mdwn @@ -0,0 +1,11 @@ +git-annex allows managing files with git, without checking the file +contents into git. While that may seem paradoxical, it is useful when +dealing with files larger than git can currently easily handle, whether due +to limitations in memory, time, or disk space. + +[[!img assistant/thumbnail.png link=assistant align=right]] +git-annex is designed for git users who love the command line. +For everyone else, the [[git-annex assistant|assistant]] turns +git-annex into an easy to use folder synchroniser. + +To get a feel for git-annex, see the [[walkthrough]]. diff --git a/doc/sync.mdwn b/doc/sync.mdwn new file mode 100644 index 000000000..0250d2fef --- /dev/null +++ b/doc/sync.mdwn @@ -0,0 +1,44 @@ +The `git annex sync` command provides an easy way to keep several +repositories in sync. + +Often git is used in a centralized fashion with a central bare repository +which changes are pulled and pushed to using normal git commands. +That works fine, if you don't mind having a central repository. + +But it can be harder to use git in a fully decentralized fashion, with no +central repository and still keep repositories in sync with one another. +You have to remember to pull from each remote, and merge the appropriate +branch after pulling. It's difficult to *push* to a remote, since git does +not allow pushes into the currently checked out branch. + +`git annex sync` makes it easier using a scheme devised by Joachim +Breitner. The idea is to have a branch `synced/master` (actually, +`synced/$currentbranch`), that is never directly checked out, and serves +as a drop-point for other repositories to use to push changes. + +When you run `git annex sync`, it merges the `synced/master` branch +into `master`, receiving anything that's been pushed to it. (If there is a +conflict in this merge, [[automatic_conflict_resolution]] is used to +resolve it). Then it fetches from each remote, and merges in any changes that +have been made to the remotes too. Finally, it updates `synced/master` +to reflect the new state of `master`, and pushes it out to each of the remotes. + +This way, changes propagate around between repositories as `git annex sync` +is run on each of them. Every repository does not need to be able to talk +to every other repository; as long as the graph of repositories is +connected, and `git annex sync` is run from time to time on each, a given +change, made anywhere, will eventually reach every other repository. + +The workflow for using `git annex sync` is simple: + +* Make some changes to files in the repository, using `git-annex`, + or anything else. +* Run `git annex sync` to save the changes. +* Next time you're working on a different clone of that repository, + run `git annex sync` to update it. + +Note that by default, `git annex sync` only synchronises the git +repositories, but does not transfer the content of annexed files. If you +want to fully synchronise two repositories content, +you can use `git annex sync --content`. You can also configure +[[preferred_content]] settings to make only some content be synced. diff --git a/doc/sync/comment_10_2cd8ab86f498d6f676f859b552f831eb._comment b/doc/sync/comment_10_2cd8ab86f498d6f676f859b552f831eb._comment new file mode 100644 index 000000000..da4d01965 --- /dev/null +++ b/doc/sync/comment_10_2cd8ab86f498d6f676f859b552f831eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9AR8BqG4RPw_Ov2lnDCJWMuM6WMRobQ" + nickname="Dav" + subject="Sorry to just be getting back..." + date="2014-01-26T22:51:28Z" + content=""" +The URLs in question in this case were read-only github https URLs. In any case, my problems are solved by what you've already suggested. I think a less error-sounding response to read-only https repos sounds nice! +"""]] diff --git a/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment b/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment new file mode 100644 index 000000000..430322975 --- /dev/null +++ b/doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="sync slow with content switch" + date="2014-04-22T20:37:05Z" + content=""" +I noticed that in a test with 2 local repositories and around 2'000 files \"git annex sync\" is still very fast, but \"git annex sync --content\" takes multiple seconds. Is this avoidable? + +I have a central repo and client repos. I want to copy all content to the central repo after a commit. Right now, I use \"git annex group central backup\", \"git annex wanted central standard\", and a hook that triggers \"git annex sync --content\" after each commit. Maybe there is a more efficient way to do this? Thanks for sharing thoughts. +"""]] diff --git a/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment b/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment new file mode 100644 index 000000000..b7e2ea189 --- /dev/null +++ b/doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://mshri.livejournal.com/" + ip="129.170.212.202" + subject="Sync specific branch or ignore a branch during sync" + date="2014-04-25T15:37:53Z" + content=""" + +I too feel that syncing all remotes by default is the right thing to do, but I think it should be limited to the 'master' and 'git-annex' branch. I often create branches that I want to keep local and do not want them to be synced. But I want 'master' and 'git-annex' branches to be synced with all remotes. + +So it would be nice to able to set an option to sync all branches or just the 'master' and 'git-annex' or to able to ignore some branches during git annex sync + +Shri + +"""]] diff --git a/doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment b/doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment new file mode 100644 index 000000000..08ea5e843 --- /dev/null +++ b/doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 13" + date="2014-05-15T08:28:09Z" + content=""" +I agree with mshri. It’s confusing to have every local branch wind up on every remote (and it hinders «git annex unused»). + +I tried working around this by just including relevant branches in the «fetch» refspec, but this will only work until another remote pushes the branches again. +"""]] diff --git a/doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment b/doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment new file mode 100644 index 000000000..66798dbb1 --- /dev/null +++ b/doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 14" + date="2014-05-15T08:58:26Z" + content=""" +Added a wishlist item +"""]] diff --git a/doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment b/doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment new file mode 100644 index 000000000..94d34a2a8 --- /dev/null +++ b/doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 15" + date="2014-05-15T19:53:16Z" + content=""" +We seem to have some rumor going around that `git annex sync` pushes all branches. It does not. It pushes only the git-annex branch and the currently checked out branch. +"""]] diff --git a/doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._comment b/doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._comment new file mode 100644 index 000000000..587444d36 --- /dev/null +++ b/doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 16" + date="2014-05-15T19:54:54Z" + content=""" +@Matthias, `git annex sync --content` has to check each file to see if any other repository wants it. This is necessarily going to get slow when there are a lot of files. The assistant does a similar syncing but uses some tricks to avoid scanning all the files too often, while still managing to keep them all in sync -- it can do this since it's a long-running daemon and is aware when files have changed. +"""]] diff --git a/doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment b/doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment new file mode 100644 index 000000000..fa228c5ae --- /dev/null +++ b/doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="very nice" + date="2012-02-25T15:02:18Z" + content=""" +Here's a way to get from a starting point of two or more peer directory trees *not* tracked by git or git-annex, to the point where they can be synced in the manner described above: [[forum/syncing_non-git_trees_with_git-annex/]] +"""]] diff --git a/doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment b/doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment new file mode 100644 index 000000000..901bb41bd --- /dev/null +++ b/doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU" + nickname="Daniel" + subject="Its just grand" + date="2013-01-04T14:45:35Z" + content=""" +I cam upon git-annex a few months ago. I saw immidiately how it could help with some frustrations I've been having. One in particlar is keeping my vimrc in sync accross multiple locations and platforms. I finally took the time to give it a try after I finally hit my boiling point this morning. I went through the [walkthrough](http://git-annex.branchable.com/walkthrough/) and now I have an annax everywhere I need it. `git annex sync` and my vimrc is up-to-date, simply grand! + +Thanks so much for making git-annex, +[Daniel Wozniak](http://woz.io) +"""]] diff --git a/doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment b/doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment new file mode 100644 index 000000000..b3b45a1e4 --- /dev/null +++ b/doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnVX_teMpJeQkyheivad_1XSCFSjpiWgx8" + nickname="Diggory" + subject="synchronising stored files with a bare repository" + date="2013-01-11T16:52:38Z" + content=""" +Good for syncing indexes, but if I want to synchronise all data files too (specifically pushing to a remote bare repository), how do I do that? +"""]] diff --git a/doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment b/doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment new file mode 100644 index 000000000..1ba0e61ad --- /dev/null +++ b/doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 4" + date="2013-01-11T18:18:07Z" + content=""" +Yes, sync only syncs the git branches, not git-annex data. To sync the date, you can run a command such as `git annex copy --to bareremote`. You could run that in cron. Or, the [[assistant]] can be run as a daemon, and automatically syncs git-annex data. +"""]] diff --git a/doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment b/doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment new file mode 100644 index 000000000..dd7be6f45 --- /dev/null +++ b/doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://elmimmo.myopenid.com/" + nickname="chocolate.camera" + subject="How to sync content with git-annex, not assistant" + date="2013-10-11T09:58:12Z" + content=""" +Sure assistant can sync git-annex data across remotes. But how do I tell a repo to sync git-annex data, but not so manually as to having to know what exactly needs to be copied from/to where? +"""]] diff --git a/doc/sync/comment_6_012e9d4468d0b88ee3c5dad3911c3606._comment b/doc/sync/comment_6_012e9d4468d0b88ee3c5dad3911c3606._comment new file mode 100644 index 000000000..24381237f --- /dev/null +++ b/doc/sync/comment_6_012e9d4468d0b88ee3c5dad3911c3606._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9AR8BqG4RPw_Ov2lnDCJWMuM6WMRobQ" + nickname="Dav" + subject="Syncing only a specific branch" + date="2013-11-24T17:48:22Z" + content=""" +By default, `git annex sync` will sync to all remotes, unless you specify a remote. So, I have to specify, e.g., `git annex sync origin`. I can simplify this with aliases, I suppose, but I do a lot of teaching non-programmer scientists... so it'd be nice to be able to configure this (so beginning users don't have to keep track of as many things). + +Is there (or will there be) a way to do this? +"""]] diff --git a/doc/sync/comment_7_6276e100d1341f1a0be368f54de0ae7b._comment b/doc/sync/comment_7_6276e100d1341f1a0be368f54de0ae7b._comment new file mode 100644 index 000000000..c40a31200 --- /dev/null +++ b/doc/sync/comment_7_6276e100d1341f1a0be368f54de0ae7b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 7" + date="2013-11-26T20:08:33Z" + content=""" +I feel that syncing with all remotes by default is the right thing for git annex sync to do. +"""]] diff --git a/doc/sync/comment_8_b89161c82c05634d35f6b65bf8360a96._comment b/doc/sync/comment_8_b89161c82c05634d35f6b65bf8360a96._comment new file mode 100644 index 000000000..115a0866a --- /dev/null +++ b/doc/sync/comment_8_b89161c82c05634d35f6b65bf8360a96._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9AR8BqG4RPw_Ov2lnDCJWMuM6WMRobQ" + nickname="Dav" + subject="Use case for not syncing to all remotes" + date="2013-12-08T19:20:26Z" + content=""" +Just in case you haven't considered such a scenario - maybe you have suggestions for how to collaborate more effectively with git annex (and avoid warning messages): + +I'm trying to teach beginning scientist programmers (mostly graduate students), and a common scenario is to fork some scientific code. I'd like forking on github to be mundane, and not trigger warnings, and generally have as little for folks to explicitly keep track of as possible (this seems to be a common concern we share, which leads you to prefer syncing to all remotes without the option to configure the default behavior!). + +However, I am currently working with students on forking and fixing up scientific code where the upstream maintainer doesn't want to allow pushes upstream, except via pull request. So, part of our approach is to set up some common shared datasets in git annex (and these just end up in our fork). If we have an \"upstream\" remote, git annex will try to sync with it, and report an error. + +So - that's why I'd like to be able to configure the deactivation of syncing to a defined branch (e.g., \"upstream\"). However, if you have other suggestions to smooth the workflow, I would also like to hear those! +"""]] diff --git a/doc/sync/comment_9_849883b7cc05bfcb01914d8737098010._comment b/doc/sync/comment_9_849883b7cc05bfcb01914d8737098010._comment new file mode 100644 index 000000000..ac65b03e6 --- /dev/null +++ b/doc/sync/comment_9_849883b7cc05bfcb01914d8737098010._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 9" + date="2013-12-12T17:54:55Z" + content=""" +@Dav what kind of url does the upstream remote have? Perhaps it would be sufficient to make sync skip trying to push to git:// and http[s]:// remotes. Both are unlikely to accept pushes and in the cases where they do accept pushes it would be fine to need a manual `git push`. + +Anyway, you can already configure which remotes get synced with. From the man page: + +
+       remote.<name>.annex-sync
+              If set to false, prevents  git-annex  sync  (and  the  git-annex
+              assistant) from syncing with this remote.
+
+ +So `git config remote.upstream.annex-sync=false` +"""]] diff --git a/doc/templates/bare.tmpl b/doc/templates/bare.tmpl new file mode 100644 index 000000000..2d476b716 --- /dev/null +++ b/doc/templates/bare.tmpl @@ -0,0 +1 @@ + diff --git a/doc/templates/buglist.tmpl b/doc/templates/buglist.tmpl new file mode 100644 index 000000000..a5d93e9bb --- /dev/null +++ b/doc/templates/buglist.tmpl @@ -0,0 +1,25 @@ +
+ + + + + + + + [] + + +
+ +Posted + +by + + + + + + + + +
diff --git a/doc/templates/bugtemplate.mdwn b/doc/templates/bugtemplate.mdwn new file mode 100644 index 000000000..6214e8f74 --- /dev/null +++ b/doc/templates/bugtemplate.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. + + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/templates/walkthrough.tmpl b/doc/templates/walkthrough.tmpl new file mode 100644 index 000000000..a500a5a86 --- /dev/null +++ b/doc/templates/walkthrough.tmpl @@ -0,0 +1,2 @@ +

+ diff --git a/doc/testimonials.mdwn b/doc/testimonials.mdwn new file mode 100644 index 000000000..65fe8adce --- /dev/null +++ b/doc/testimonials.mdwn @@ -0,0 +1,34 @@ +
+ + + + + + + + + + +
+ +
+What excites me about GIT ANNEX is how it fundamentally tracks the +backup and availability of any data you own, and allows you to share +data with a large or small audience, ensuring that the data survives. +
+-- Jason Scott + +Seen on IRC: +
+oh my god, git-annex is amazing
+this is the revolution in fucking with gigantic piles of files that I've been waiting for
+
+ +And then my own story: I have a ton of drives. I have a lot of servers. I +live in a cabin on **dialup** and often have 1 hour on broadband in a week +to get everything I need. Without git-annex, managing all this would not be +possible. It works perfectly for me, not a surprise since I wrote it, but +still, it's a different level of "perfect" than anything I could put +together before. --[[Joey]] + +See also: [[design/assistant/blog/day_288__success_stories]] diff --git a/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment b/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment new file mode 100644 index 000000000..2c5facd1f --- /dev/null +++ b/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="gjost" + ip="108.205.152.179" + subject="distributed digital repository" + date="2013-11-14T00:39:49Z" + content=""" +I am in the process of building a distributed digital repository using Git and git-annex as a foundation. Our project is to collect and preserve archival-quality audio and video from multiple bandwidth-challenged remote sites. We're using git-annex to help us sneakernet the metadata and binaries around and to maintain multiple copies in geographically separate locations. Git very neatly addresses the problem of tracking changes, while git-annex makes it possible to track the flow of information through a network of distributed repositories. +"""]] diff --git a/doc/thanks.mdwn b/doc/thanks.mdwn new file mode 100644 index 000000000..62b0b82c2 --- /dev/null +++ b/doc/thanks.mdwn @@ -0,0 +1,372 @@ +The development of git-annex was made possible by the generous +donations of many people. I want to say "Thank You!" to each of +you individually, but until I meet all 1500 of you, this page will have to +do. You have my most sincere thanks. --[[Joey]] + +(If I got your name wrong, or you don't want it publically posted here, +email .) + +## 2013-2014 + +Continued git-annex development was [crowd funded](https://campaign.joeyh.name/) +by these excellent people. *Hug* + +Eric Hanchrow, Michael Barabanov, Douglas Butts, Cody Woodard, Anna Hess, +Maggie Hess, Francois Marier, Michael Linksvayer, Alexander Brem, Yaroslav +Halchenko, Otavio Real Salvador, Giovanni Moretti, Mark Hepburn, Jim +Cheetham, Ali Gündüz, Chia Shee Liang, Vincent Arel-Bundock, Mark R Jones, +Willard Korfhage, Faidon Liambotis, Daniel Callahan, Sheila Miguez, +Christopher Webber, Daniel Patterson, Charity Hanif, Blair Mckenzie, Romain +Lenglet, Joseph Liu, Robert Beaty, Remy van Elst, Juho Snellman, Jason +Davidson, Dane Larsen, Kuno Woudt, Navishkar Rao, Ryan Sorensen, Jonathan +Castello, Nimrod Mesika, Amitai Schlair, Zellyn Hunter, Jan Pieper, Boyd +Smith, Brett Eisenberg, Péter Károly Juhász, Allan Franta, Aaron De Vries, +Donald Plummer, Joona Lehtomäki, Evan Anderson, Pedro Côrte-Real, Bradley +Unterrheiner, Wietse van Buitenen, James Shubin, Daniel de Kok, Michael +Zehrer, Peter deHaan, David Schmitt, Ian Downes, Gioele Barabucci, Gergely +Nagy, Diego Ongaro, Jonas Wiklund, Strakhov Artem, £ukasz Szczęsny, Peter +Olson, Thomas Berker, Greg Young, narf, Michael Jakl, Andrea Rota, Tobias +Nix, Andreas Olsson, Tobias Ussing, Pere Quintana Segui, Pierre Gambarotto, +Yuriy Zaytsev, Thomas Djärv, Thomas Hochstein, Simon Lundmark, Damien +Diederen, Arthur Lutz, Gert Van Gool, Jed Brown, Sören Brunk, Thorsten +Bormer, Vincent Sanders, Thomas Lundstrøm, Robert Connolly, Marc Seeger, +Per Andreas Buer, Thomas Andersen, Hendrik Müller Hofstede, Dominik +Wagenknecht, Robert Walker, Nicholas Weigand, Maximilian Weigand, Thomas +Jost, John, Angel Ramboi, Thomas Bartels, Fernando Jimenez, Tobias +Mersmann, András Veres-Szentkirályi, Richard Hartmann, John Hedges, +Nedialko Andreev, Roderik Koenders, Sławomir Gwizdowski, Aapo Laitinen, +Jonathan Harrington, Dirk Kraft, Fabian Bartschke, Philip Frank, Patrick +Steegstra, Roberto Zedda, Leon Major, Torbjørn Thorsen, Lukas Anzinger, +Pollan Ruben, Daniel Hofer, Johannes Krampf, Jörn Gersdorf, Kristoffer Egil +Bonarjee, David Iwanowitsch, Daniel Egger, Titus Stahl, Robin Sheat, Thomas +Nicolaisen, Karsten Heymann, Askings & Medina Business Services, Pieter +Mulder, Geoffrey Huntley, Wouter Mooij, Kari Oikarinen, sven dowideit, +Ethan Aubin, Nathan Rickerby, Tobias Brunner, Stian Haukaas Eikeland, Jan +Dittberner, Jeffrey Goeke-Smith, Joseph Cullen, James Orr, Markus Plangg, +Glendon Solsberry, Georg Bauer, Andreas Leha, Ian Kozhurin, Boris Hupkens +van der Elst, Daniel Brockman, Scott Robinson, Olaf Lorenzen, Øyvind +Andersen Holm, Logan Owen, Christopher Douglass, Nicolas Pouillard, Florian +Schlegel, Hans-Christian Jehg, Thomas Mechtler, Joshua McKinney, Tom +Atkins, Paul Scott-Wilson, Rafal Czlonka, Benjamin Williams, Ulises Vitulli, Mesar +Hameed, Vishakh Vishakh, Daniel Washburn, Maximilian Haack, Jan Gondol, +Carlo Matteo Capocasa, Jevgenijs Zolotarskis, John Cooper, Matthew Gregg, +Peter Jarosak, Edward Heil, Kyle Kurtenbach, David Kaminski, Joonathan +Mägi, Piotr Ożarowski, Ernest Braganza, Adam Sjøgren, Simon Michael, +Protonet, Valentin Churavy, Trenton Cronholm, Ellis Whitehead, Maarten +Everts, Paul Tötterman, Julien Lefrique, Robert F Donnelly, +LeastAuthority.com, Floris Bruynooghe, Kevin Krouse, Bernhard Schmidt, +Jason Woofenden, Jacek Nykis, Benjamin Carrillo, Teemu Hukkanen, William +Heinbockel, Kristofer Bergstrom, Richard Gibson, Julian Andres Klode, +Jeffrey Guenthner, Jochen Kupperschmidt, Andrew Eskridge, Eric Wallmander, +Aaron Haviland, Evan Deaubl, Felix Crux, Matthew Marshall, Hamish Coleman, +xymostech, Matthew Mercer, Ben Challenor, András Csáki, Stelian Iancu, +Dmitri Popov, Anthony DiSanti, Perttu Luukko, Daniel Glassey, Aurélien +Pinceaux, Svenne Krap, Sven Hartge, Frank Blendinger, Lisa Feilen, Kyle +Kujala-Korpela, Walter Somerville, Filippo Giunchedi, Tyler Willingham, +Gernot Schulz, Daniel Gervais, Denver Gingerich, Nicolas Joseph, tommy, +bak, Grejdi G, Gabriel de Perthuis, Mayank Jain, Radu Raduta, Gregory +Grossmeier, Errol Hess, Janin Kolenc, Sean Whitton, Philippe Gauthier, +Ananda Widyadharma, Jochen Bartl, Fredrik Hammar, THM Schoemaker, Marek +Jawurek, Johan Herland, Gian-Maria Daffre, Justine Lam, Ori Livneh, Arnaud +Berthomier, Chad Horohoe, Lois DeFiore, Lieven Baes, Patrick Wheeler, James +Kim, Carlos Trijueque Albarran, Ritesh Nadhani, chesty, Andre Pereira, +Eskild Hustvedt, David Wagner, Maximiliano Curia, András Széll, Allan +Holman, Thomas Langewouters, Anonymous, Yannick Leyendecker, Peter +Daengeli, Josh Taylor, Abhishek Dasgupta, Maarten Aertsen, Mark Sheppard, +Markus Engström, Samuel Tardieu, Geog Wechslberger, Abdó Roig, Dmitry +Markushevich, Sergio Rubio, Jim Paris, Vivek Gani, Brock Spratlen, Nathan +Howell, Alan Chan, Alexandre Dupas, Daniel Atlas, Patrick Hallen, Matthew +Forrester, Binyamin Cherniavsky, Florent Fourcot, Nathan Yergler, Hannibal +Skorepa, Cedric Staub, Melissa Binde, Marc Bobillier, Zoran Zaric, Ralph +Mayer, Jay Pozo, Walter Somerville, Remy Honig, Bernhard Urban, Nurullah +Akkaya, Ari Pollak, Kalle Svensson, Stephan Schulz, Joshua Honeycutt, +Justin Keyes, Filias Heidt, Manish Sharma, Benoît Zugmeyer, Andrew Kraut, +Markus Breitenberger, Dominik Deobald, Aren Olson, Tobias Ammann, Peter +Lloyd, Pierre Chambart, Michael Alan Dorman, Kyle Meyer, Kristoffer +Gronlund, Jay Dugger, Jeff McNeill, Oskari Timperi, Mathias Linden, +Ole-Morten Duesund, Tom Lowenthal, Anders Lannerback, Tony Cantor, +Stephanie Eikenberry, Vanja Cvelbar, Fabrice Rossi, Franz Pletz, Karl +Wiberg, Sam Kleinman, Vincent Demeester, Tristan Helmich, Zero Art Radio, +Bruno Bigras, Ævar Arnfjörð Bjarmason, Stanley Yamane, Christopher Browne, +David Whittington, Fredrik Gustafsson, Peter Hogg, Tom Francart, Wouter +Verhelst, Christian Savard, wundersolutions, Andreas Fuchs, Eric Kidd, +Georg Lehner, Berin Martini, Stewart Wright, Bence Albertini, Stefan +Schmitt, Antoine Boegli, jscit, Christopher Kernahan, A Marshall, Jürgen +Peters, Aaron Whitehouse, Jouni K Seppanen, Michael Albertson, Andreas +Laas, Thomas Herok, Aurelien Gazagne, Bryan W Stitt, anonymous, Chris +Kastorff, Henning Hasemann, Leonardo Taglialegne, Frank Thomas, Frédéric +Schütz, Riad Wahby, Maxwell Swadling, Bram Senders, Péter Párkányi, Tom +Dimiduk, Christian Kellermann, Kilian Evang, Christian Studer, Tim +Humphrey, Jürgen, Richard Collins, Renaud Casenave-Péré, Patrick Lynn, +Gregor Gramlich, Hugo Mougard, Arun Srinivasan, Paul Tagliamonte, Don +Armstrong, Adam DeWitt, Timothy Hobbs, Jacob Briggs, Mark Eichin, Matthew +Raso-Barnett, Damien Raude-Morvan, Mark Lopez, Mattias Olsson, Marco A L +Barbosa, Thomas de Ruiter, Anders Claesson, Philipp Meier, Henrik Ahlgren, +Michael Hofmann, Audric SCHILTKNECHT, Wojtek Burakiewicz, Christian +Dietrich, Jacob Kirkwood, Fabian Jansen, gregor herrmann, Martin Werner, +Adam Baxter, Sören Köpping, Pierce Lopez, David Lehn, Michal Politowski, +John Lawrence, Nicholas Golder, Adam Spiers, Pär Mattsson, Matt Lee, +Timo Heister, Asbjørn Sloth Tønnesen, James Valleroy, Felix Gruber, Björn +Pettersson, Nicola Chiapolini, Christer Stenbrenden, Hannes Maier-Flaig, +Paul Walker, Cary Kempston, Andrew Cant, Albert Drengg, +Martin Pollow, Karl-Georg Sommer, Francois Cocquemas, Daniel Bross, Martin +Florian, Grigorios Prasinos, Olivier Berger, Andreas Herten, Kyle MacLea, +Sozykin Mikhail, André Klärner, Pascal VITOUX, Gunilla Johansson, Dara +Adib, Nicolas Bonifas, Glen Ogilvie, TasLUG, Shaun Westmacott, Georgi +Valkov, Nicolas Dietrich, Auroch, Rasmus Pank Roulund, Michael Niewiera, +Benjamin Koch, Joe Bogner, Christoph Varga, Florian Eitel, Tobias Braun, +Jochen Schulz, Diggory Hardy, Stephane Barland, Sebastian Bober, Arash +Rouhani-Kalleh, Geoffrey Irving, Hans Tzou, Mark Booth, Christoph Neckel, +Aleksandar Iliev, Baldur Kristinsson, Adam Colton, KAWACHI TAKASHI, Michal +Sojka, Alexander Brandstedt, Jarno Elonen, Rob Sharp, John Pybus, Antonino +Mazzurco, Damon Haley, Jason Locklin, ULRICH KORTENKAMP, Karthik +Poobalasubramanian, Alexandre Garel, David Clark, Jeff Johnson, +Mica Semrick, Paul Staab, Rémi Vanicat, Martin Holtschneider, Jan Ivar +Beddari, Peter Simons, Thomas Koch, Justin Geibel, Guillaume DELVIT, Shanti +Bouchez, Oliver Brandt, François Deppierraz, Chad Walstrom, Tim Mattison, +Jakub Antoni Tyszko, Casa do Boneco, Florian Tham, +and 30 anonymous bitcoin users + +With an especial thanks to the WikiMedia foundation, +and Rede Mocambos. + +## 2012-2013 + + +The git-annex assistant was [crowd funded on Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/). + +### Major Backers + +These people are just inspiring in their enthusiasm and generosity to this +project. + +* Jason Scott +* strager + +### Beta Testers + +Whole weeks of my time were made possible thanks to each of these +people, and their testing is invaluable to the development of +the git-annex assistant. + +* Jimmy Tang +* David Pollak +* Pater +* Francois Marier +* Paul Sherwood +* Fred Epma +* Robert Ristroph +* Josh Triplett +* David Haslem +* AJ Ashton +* Svenne Krap +* Drew Hess +* Peter van Westen + +### Prioritizers + +These forward-thinking people contributed generously just to help +set my priorities in which parts of the git-annex assistant were most +important to develop. + +Paul C. Bryan, Paul Tötterman, Don Marti, Dean Thompson, Djoume, David Johnston +Asokan Pichai, Anders Østhus, Dominik Wagenknecht, Charlie Fox, Yazz D. Atlas, +fenchel, Erik Penninga, Richard Hartmann, Graham, Stan Yamane, Ben Skelton, +Ian McEwen, asc, Paul Tagliamonte, Sherif Abouseda, Igor Támara, Anne Wind, +Mesar Hameed, Brandur K. Holm Petersen, Takahiro Inoue, Kai Hendry, +Stephen Youndt, Lee Roberson, Ben Strawbridge, Andrew Greenberg, Alfred Adams +Andrew, Aaron De Vries, Monti Knazze, Jorge Canseco, Hamish, Mark Eichin, +Sherif Abouseda, Ben Strawbridge, chee rabbits, Pedro Côrte-Real + +And special thanks to Kevin McKenzie, who also gave me a login to a Mac OSX +machine, which has proven invaluable, Jimmy Tang who has helped +with Mac OSX autobuilding and packaging, and Yury V. Zaytsev who +provides the Windows autobuilder. + +### Other Backers + +Most of the success of the Kickstarter is thanks to these folks. Some of +them spent significant amounts of money in the guise of getting some +swag. For others, being listed here, and being crucial to making the +git-annex assistant happen was reward enough. Large or small, these +contributions were, literally, my bread and butter this year. + +Amitai Schlair, mvime, Romain Lenglet, James Petts, Jouni Uuksulainen, +Wichert Akkerman, Robert Bellus, Kasper Souren, rob, Michiel Buddingh', +Kevin, Rob Avina, Alon Levy, Vikash, Michael Alan Dorman, Harley Pig, +Andreas Olsson, Pietpiet, Christine Spang, Liz Young, Oleg Kosorukov, +Allard Hoeve, Valentin Haenel, Joost Baaij, Nathan Yergler, Nathan Howell, +Frédéric Schütz, Matti Eskelinen, Neil McGovern, Lane Lillquist, db48x, +Stuart Prescott, Mark Matienzo, KarlTheGood, leonm, Drew Slininger, +Andreas Fuchs, Conrad Parker, Johannes Engelke, Battlegarden, Justin Kelly, +Robin Wagner, Thad Ward, crenquis, Trudy Goold, Mike Cochrane, Adam Venturella, +Russell Foo, furankupan, Giorgio Occhioni, andy, mind, Mike Linksvayer, +Stefan Strahl, Jelmer Vernooij, Markus Fix, David Hicks, Justin Azoff, +Iain Nicol, Bob Ippolito, Thomas Lundstrøm, Jason Mandel, federico2, +Edd Cochran, Jose Ortega, Emmett Agnew, Rudy Garcia, Kodi, Nick Rusnov, +Michael Rubin, Tom de Grunt, Richard Murray, Peter, Suzanne Pierce, Jared +Marcotte, folk, Eamon, Jeff Richards, Leo Sutedja, dann frazier, Mikkel +kristiansen, Matt Thomas, Kilian Evang, Gergely Risko, Kristian Rumberg, +Peter Kropf, Mark Hepburn, greymont, D. Joe Anderson, Jeremy Zunker, ctebo, +Manuel Roumain, Jason Walsh, np, Shawn, Johan Tibell, Branden Tyree, Dinyar +Rabady, Andrew Mason, damond armstead, Ethan Aubin, TomTom Tommie, Jimmy +Kaplowitz, Steven Zakulec, mike smith, Jacob Kirkwood, Mark Hymers, Nathan +Collins, Asbjørn Sloth Tønnesen, Misty De Meo, James Shubin, +Jim Paris, Adam Sjøgren, miniBill, Taneli, Kumar Appaiah, Greg Grossmeier, +Sten Turpin, Otavio Salvador, Teemu Hukkanen, Brian Stengaard, bob walker, +bibeneus, andrelo, Yaroslav Halchenko, hesfalling, Tommy L, jlargentaye, +Serafeim Zanikolas, Don Armstrong, Chris Cormack, shayne.oneill, Radu +Raduta, Josh S, Robin Sheat, Henrik Mygind, kodx, Christian, Geoff +Crompton, Brian May, Olivier Berger, Filippo Gadotti, Daniel Curto-Millet, +Eskild Hustvedt, Douglas Soares de Andrade, Tom L, Michael Nacos, Michaël +P., William Roe, Joshua Honeycutt, Brian Kelly, Nathan Rasch, jorge, Martin +Galese, alex cox, Avery Brooks, David Whittington, Dan Martinez, Forrest +Sutton, Jouni K. Seppänen, Arnold Cano, Robert Beaty, Daniel, Kevin Savetz, +Randy, Ernie Braganza, Aaron Haviland, Brian Brunswick, asmw, sean, Michael +Williams, Alexander, Dougal Campbell, Robert Bacchas, Michael Lewis, Collin +Price, Wes Frazier, Matt Wall, Brandon Barclay, Derek van Vliet, Martin +DeMello, kitt hodsden, Stephen Kitt, Leif Bergman, Simon Lilburn, Michael +Prokop, Christiaan Conover, Nick Coombe, Tim Dysinger, Brandon Robinson, +Philip Newborough, keith, Mike Fullerton, Kyle, Phil Windley, Tyler Head, +George V. Reilly, Matthew, Ali Gündüz, Vasyl Diakonov, Paolo Capriotti, +allanfranta, Martin Haeberli, msingle, Vincent Sanders, Steven King, Dmitry +Gribanov, Brandon High, Ben Hughes, Mike Dank, JohnE, Diggory Hardy, +Michael Hanke, valhalla, Samuli Tuomola, Jeff Rau, Benjamin Lebsanft, John +Drago, James, Aidan Cooper, rondie, Paul Kohler, Matthew Knights, Aaron +Junod, Patrick R McDonald, Christopher Browne, Daniel Engel, John SJ +Anderson, Peter Sarossy, Mike Prasad, Christoph Ender, Jan Dittberner, +Zohar, Alexander Jelinek, stefan, Danny O'Brien, Matthew Thode, Nicole +Aptekar, maurice gaston, Chris Adams, Mike Klemencic, Reedy, Subito, Tobias +Gruetzmacher, Ole-Morten Duesund, André Koot, mp, gdop, Cole Scott, Blaker, +Matt Sottile, W. Craig Trader, Louis-Philippe Dubrule, Brian Boucheron, +Duncan Smith, Brenton Buchbach, Kyle Stevenson, Eliot Lash, Egon Elbre, +Praveen, williamji, Thomas Schreiber, Neil Ford, Ryan Pratt, Joshua Brand, +Peter Cox, Markus Engstrom, John Sutherland, Dean Bailey, Ed Summers, +Hillel Arnold, David Fiander, Kurt Yoder, Trevor Muñoz, keri, Ivan +Sergeyenko, Shad Bolling, Tal Kelrich, Steve Presley, gerald ocker, Essex +Taylor, Josh Thomson, Trevor Bramble, Lance Higgins, Frank Motta, Dirk +Kraft, soundray, Joe Haskins, nmjk, Apurva Desai, Colin Dean, docwhat, +Joseph Costello, Jst, flamsmark, Alex Lang, Bill Traynor, Anthony David, +Marc-André Lureau, AlNapp, Giovanni Moretti, John Lawrence, João Paulo +Pizani Flor, Jim Ray, Gregory Thrush, Alistair McGann, Andrew Wied, +Koutarou Furukawa, Xiscu Ignacio, Aaron Sachs, Matt, Quirijn, Chet +Williams, Chris Gray, Bruce Segal, Tom Conder, Louis Tovar, Alex Duryee, +booltox, d8uv, Decklin Foster, Rafael Cervantes, Micah R Ledbetter, Kevin +Sjöberg, Johan Strombom, Zachary Cohen, Jason Lewis, Yves Bilgeri, Ville +Aine, Mark Hurley, Marco Bonetti, Maximilian Haack, Hynek Schlawack, +Michael Leinartas, Andreas Liebschner, Duotrig, Nat Fairbanks, David +Deutsch, Colin Hayhurst, calca, Kyle Goodrick, Marc Bobillier, Robert +Snook, James Kim, Olivier Serres, Jon Redfern, Itai Tavor, Michael +Fladischer, Rob, Jan Schmid, Thomas H., Anders Söderbäck, Abhishek +Dasgupta, Jeff Goeke-Smith, Tommy Thorn, bonuswavepilot, Philipp Edelmann, +Nick, Alejandro Navarro Fulleda, Yann Lallemant, andrew brennan, +Dave Allen Barker Jr, Fabian, Lukas Anzinger, Carl Witty, Andy Taylor, +Andre Klärner, Andrew Chilton, Adam Gibbins, Alexander Wauck, Shane O'Dea, +Paul Waite, Iain McLaren, Maggie Ellen Robin Hess, Willard Korfhage, +Nicolas, Eric Nikolaisen, Magnus Enger, Philipp Kern, Andrew Alderwick, +Raphael Wimmer, Benjamin Schötz, Ana Guerrero, Pete, Pieter van der Eems, +Aaron Suggs, Fred Benenson, Cedric Howe, Lance Ivy, Tieg Zaharia, Kevin +Cooney, Jon Williams, Anton Kudris, Roman Komarov, Brad Hilton, Rick Dakan, +Adam Whitcomb, Paul Casagrande, Evgueni Baldin, Robert Sanders, Kagan +Kayal, Dean Gardiner, micah altman, Cameron Banga, Ross Mcnairn, Oscar +Vilaplana, Robin Graham, Dan Gervais, Jon Åslund, Ragan Webber, Noble Hays, +stephen brown, Sean True, Maciek Swiech, faser, eikenberry, Kai Laborenz, +Sergey Fedoseev, Chris Fournier, Svend Sorensen, Greg K, wojtek, Johan +Ribenfors, Anton, Benjamin, Oleg Tsarev, PsychoHazard, John Cochrane, +Kasper Lauritzen, Patrick Naish, Rob, Keith Nasman, zenmaster, David Royer, +Max Woolf, Dan Gabber, martin rhoads, Martin Schmidinger, Paul +Scott-Wilson, Tom Gromak, Andy Webster, Dale Webb, Jim Watson, Stephen +Hansen, Mircea, Dan Goodenberger, Matthias Fink, Andy Gott, Daniel, Jai +Nelson, Shrayas Rajagopal, Vladimir Rutsky, Alexander, Thorben Westerhuys, +hiruki, Tao Neuendorffer Flaherty, Elline, Marco Hegenberg, robert, Balda, +Brennen Bearnes, Richard Parkins, David Gwilliam, Mark Johnson, Jeff Eaton, +Reddawn90, Heather Pusey, Chris Heinz, Colin, Phatsaphong Thadabusapa, +valunthar, Michael Martinez, redlukas, Yury V. Zaytsev, Blake, Tobias +"betabrain" A., Leon, sopyer, Steve Burnett, bessarabov, sarble, krsch.com, +Jack Self, Jeff Welch, Sam Pettiford, Jimmy Stridh, Diego Barberá, David +Steele, Oscar Ciudad, John Braman, Jacob, Nick Jenkins, Ben Sullivan, Brian +Cleary, James Brosnahan, Darryn Ten, Alex Brem, Jonathan Hitchcock, Jan +Schmidle, Wolfrzx99, Steve Pomeroy, Matthew Sitton, Finkregh, Derek Reeve, +GDR!, Cory Chapman, Marc Olivier Chouinard, Andreas Ryland, Justin, Andreas +Persenius, Games That Teach, Walter Somerville, Bill Haecker, Brandon +Phenix, Justin Shultz, Colin Scroggins, Tim Goddard, Ben Margolin, Michael +Martinez, David Hobbs, Andre Le, Jason Roberts, Bob Lopez, Gert Van Gool, +Robert Carnel, Anders Lundqvist, Aniruddha Sathaye, Marco Gillies, Basti +von Bejga, Esko Arajärvi, Dominik Deobald, Pavel Yudaev, Fionn Behrens, +Davide Favargiotti, Perttu Luukko, Silvan Jegen, Marcelo Bittencourt, +Leonard Peris, smercer, Alexandre Dupas, Solomon Matthews, Peter Hogg, +Richard E. Varian, Ian Oswald, James W. Sarvey, Ed Grether, Frederic +Savard, Sebastian Nerz, Hans-Chr. Jehg, Matija Nalis, Josh DiMauro, Jason +Harris, Adam Byrtek, Tellef, Magnus, Bart Schuurmans, Giel van Schijndel, +Ryan, kiodos, Richard 'maddog' Collins, PawZubr, Jason Gassel, Alex +Boisvert, Richard Thompson, maddi bolton, csights, Aaron Bryson, Jason Chu, +Maxime Côté, Kineteka Systems, Joe Cabezas, Mike Czepiel, Rami Nasra, +Christian Simonsen, Wouter Beugelsdijk, Adam Gibson, Gal Buki, James +Marble, Alan Chambers, Bernd Wiehle, Simon Korzun, Daniel Glassey, Eero af +Heurlin, Mikael, Timo Engelhardt, Wesley Faulkner, Jay Wo, Mike Belle, +David Fowlkes Jr., Karl-Heinz Strass, Ed Mullins, Sam Flint, +Hendrica, Mark Emer Anderson, Joshua Cole, Jan Gondol, Henrik Lindhe, +Albert Delgado, Patrick, Alexa Avellar, Chris, sebsn1349, Maxim Kachur, +Andrew Marshall, Navjot Narula, Alwin Mathew, Christian Mangelsdorf, Avi +Shevin, Kevin S., Guillermo Sanchez Estrada, Alex Krieger, Luca Meier, Will +Jessop, Nick Ruest, Lani Aung, Ulf Benjaminsson, Rudi Engelbrecht, Miles +Matton, Cpt_Threepwood, Adam Kuyper, reacocard, David Kilsheimer, Peter +Olson, Bill Fischofer, Prashant Shah, Simon Bonnick, Alexander Grudtsov, +Antoine Boegli, Richard Warren, Sebastian Rust, AlmostHuman, Timmy +Crawford, PC, Marek Belski, pontus, Douglas S Butts, Eric Wallmander, Joe +Pelar, VIjay, Trahloc, Vernon Vantucci, Matthew baya, Viktor Štujber, +Stephen Akiki, Daniil Zamoldinov, Atley, Chris Thomson, Jacob Briggs, Falko +Richter, Andy Schmitz, Sergi Sagas, Peder Refsnes, Jonatan, Ben, Bill +Niblock, Agustin Acuna, Jeff Curl, Tim Humphrey, bib, James Zarbock, +Lachlan Devantier, Michal Berg, Jeff Lucas, Sid Irish, Franklyn, Jared +Dickson, Olli Jarva, Adam Gibson, Lukas Loesche, Jukka Määttä, Alexander +Lin, Dao Tran, Kirk, briankb, Ryan Villasenor, Daniel Wong, barista, Tomas +Jungwirth, Jesper Hansen, Nivin Singh, Alessandro Tieghi, Billy Roessler, +Peter Fetterer, Pallav Laskar, jcherney, Tyler Wang, Steve, Gigahost, Beat +Wolf, Hannibal Skorepa, aktiveradio, Mark Nunnikhoven, Bret Comnes, Alan +Ruttenberg, Anthony DiSanti, Adam Warkiewicz, Brian Bowman, Jonathan, Mark +Filley, Tobias Mohr, Christian St. Cyr, j. faceless user, Karl Miller, +Thomas Taimre, Vikram, Jason Mountcastle, Jason, Paul Elliott, Alexander, +Stephen Farmer, rayslava, Peter Leurs, Sky Kruse, JP Reeves, John J Schatz, +Martin Sandmair, Will Thompson, John Hergenroeder, Thomas, Christophe +Ponsart, Wolfdog, Eagertolearn, LukasM, Federico Hernandez, Vincent Bernat, +Christian Schmidt, Cameron Colby Thomson, Josh Duff, James Brown, Theron +Trowbridge, Falke, Don Meares, tauu, Greg Cornford, Max Fenton, Kenneth +Reitz, Bruce Bensetler, Mark Booth, Herb Mann, Sindre Sorhus, Chris +Knadler, Daniel Digerås, Derek, Sin Valentine, Ben Gamari, david +lampenscherf, fardles, Richard Burdeniuk, Tobias Kienzler, Dawid Humbla, +Bruno Barbaroxa, D Malt, krivar, James Valleroy, Peter, Tim Geddings, +Matthias Holzinger, Hanen, Petr Vacek, Raymond, Griff Maloney, Andreas +Helveg Rudolph, Nelson Blaha, Colonel Fubar, Skyjacker Captain Gavin +Phoenix, shaun, Michael, Kari Salminen, Rodrigo Miranda, Alan Chan, Justin +Eugene Evans, Isaac, Ben Staffin, Matthew Loar, Magos, Roderik, Eugenio +Piasini, Nico B, Scott Walter, Lior Amsalem, Thongrop Rodsavas, Alberto de +Paola, Shawn Poulen, John Swiderski, lluks, Waelen, Mark Slosarek, Jim +Cristol, mikesol, Bilal Quadri, LuP, Allan Nicolson, Kevin Washington, +Isaac Wedin, Paul Anguiano, ldacruz, Jason Manheim, Sawyer, Jason +Woofenden, Joe Danziger, Declan Morahan, KaptainUfolog, Vladron, bart, Jeff +McNeill, Christian Schlotter, Ben McQuillan, Anthony, Julian, Martin O, +altruism, Eric Solheim, MarkS, ndrwc, Matthew, David Lehn, Matthew +Cisneros, Mike Skoglund, Kristy Carey, fmotta, Tom Lowenthal, Branden +Tyree, Aaron Whitehouse + +### Also thanks to + +* The Kickstarter team, who have unleashed much good on the world. +* The Haskell developers, who toiled for 20 years in obscurity + before most of us noticed them, and on whose giant shoulders I now stand, + in awe of the view. +* The Git developers, for obvious reasons. +* All of git-annex's early adopters, who turned it from a personal + toy project into something much more, and showed me the interest was there. +* Rsync.net, for providing me a free account so I can make sure git-annex + works well with it. +* LeastAuthority.com, for providing me a free Tahoe-LAFS grid account, + so I can test git-annex with that, and back up the git-annex assistant + screencasts. +* Anna and Mark, for the loan of the video camera; as well as the rest of + my family, for your support. Even when I couldn't explain what I was + working on. +* The Hodges, for providing such a congenial place for me to live and work + on these first world problems, while you're off helping people in the + third world. diff --git a/doc/tips.mdwn b/doc/tips.mdwn new file mode 100644 index 000000000..eda84c867 --- /dev/null +++ b/doc/tips.mdwn @@ -0,0 +1,4 @@ +This page is a place to document tips and techniques for using git-annex. + +[[!inline pages="tips/* and !tips/*/*" archive="yes" +rootpage="tips" postformtext="Add a new tip about:" show=0]] diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn new file mode 100644 index 000000000..c32eb966f --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn @@ -0,0 +1,111 @@ +I've been wrestling with git-annex to try to make it build on Debian, or more specifically, wrestling with Haskell dependencies. + +After a fair amount of futzing around, and pestering a bunch of people in the process (thanks for the help! :) ) I finally managed to make it build. + +I figured I would post the steps here, since it's not completely trivial, and I expect that a few others might be interested in building newer versions as well. + +There appears to currently be two methods: + +* Debian packages on Wheezy plus Sid + * Starting out on Wheezy, and then picking the rest from Sid (it seems at least libghc-safesemaphore-dev from Sid is critical for newer git-annex) + * WebDAV suport will not be available with this method +* Cabal packages + + +#Debian packages on Wheezy plus Sid + +##Start off with a clean wheezy chroot + + sudo debootstrap wheezy debian-wheezy + sudo chroot debian-wheezy + +##Install some build tools + + apt-get update + apt-get install devscripts git + +##Get git-annex (either by cloning or simply moving the source into the chroot) + + mkdir /src + cd /src + git clone git://git-annex.branchable.com/source.git git-annex + cd git-annex + +##Remove WebDAV dependency which can't be satisfied anywhere + + sed '/libghc-dav-dev/d' -i debian/control + +##Create dummy build-depends package and install all available Wheezy dependencies using it + + mk-build-deps + dpkg -i git-annex-build-deps*.deb + apt-get install -f + +(this will remove the build-depends package) + +##Add Sid sources and install all available Sid dependencies + + echo "deb http://http.debian.net/debian sid main" >>/etc/apt/sources.list + apt-get update + dpkg -i git-annex-build-deps*.deb + apt-get install -f + +(the build-depends package should now be fully installed) + +##Disable the 'make test' that fails due to missing hothasktags + + echo >>debian/rules + echo "override_dh_auto_test:" >>debian/rules + +##Build! + + debuild -us -uc -Igit + + +#Cabal packages + +##Start off with a clean Sid(/Wheezy) chroot + + sudo debootstrap sid debian-sid + sudo chroot debian-sid + +##Install a smaller set of tools and build-depends from Debian (cabal needs these to compile the Haskell stuff) + + apt-get update + apt-get install ghc cabal-install devscripts libz-dev pkg-config c2hs libgsasl7-dev libxml2-dev libgnutls-dev c2hs git debhelper ikiwiki perlmagick uuid rsync openssh-client fakeroot + +##Get git-annex (either by cloning or simply moving the source into the chroot) + + mkdir /src + cd /src + git clone git://git-annex.branchable.com/source.git git-annex + cd git-annex + +##Install the Haskell build-dependencies from cabal + + cabal update + cabal install --only-dependencies + +##Optional step which doesn't work (might in the future) +If we want to run the 'make test' after build we need hothasktags, which is only available via cabal + + apt-get install happy + cabal install hothasktags + export PATH=$PATH:~/.cabal/bin + +But this currently fails silently inside make test->fast->tags, and if you dig a bit (manually edit the makefile to be more verbose) you see + + hothasktags: ./Command/AddUnused.hs: hGetContents: invalid argument (invalid byte sequence) + +##Disable the 'make test' that fails + + echo >>debian/rules + echo "override_dh_auto_test:" >>debian/rules + +##Remove all Debian package haskell depends (taken care of by cabal instead) + + sed '/\tlibghc/d' -i debian/control + +## Build! + + debuild -us -uc -Igit diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment new file mode 100644 index 000000000..55cf0b97b --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkCw26IdxXXPBoLcZsQFslM67OJSJynb1w" + nickname="Alexander" + subject="can't install git-annex on OS X Mountain Lion without disabling WebDAV support" + date="2013-04-29T17:57:03Z" + content=""" +possibly related to this Debian issue: + +trying to install git-annex with cabal on OS X 10.8.3, the build fails with + + + Loading package DAV-0.4 ... linking ... ghc: + lookupSymbol failed in relocateSection (relocate external) + ~/.cabal/lib/DAV-0.4/ghc-7.4.2/HSDAV-0.4.o: unknown symbol `_DAVzm0zi4_PathszuDAV_version1_closure' + ghc: unable to load package `DAV-0.4' + Failed to install git-annex-4.20130417 + cabal: Error: some packages failed to install: + git-annex-4.20130417 failed during the building phase. The exception was: + ExitFailure 1 + + +This was after following all of the instructions for the Homebrew install at [http://git-annex.branchable.com/install/OSX/](http://git-annex.branchable.com/install/OSX/) +I was able to work around this issue by installing with the WebDAV flag disabled (ie, added the option --flags=\"-WebDAV\" to last command in the OS X install instructions): + + cabal install git-annex --bindir=$HOME/bin --flags=\"-WebDAV\" + +"""]] diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment new file mode 100644 index 000000000..7e8e295fd --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-30T21:51:50Z" + content=""" +@Alexander that DAV-0.4 problem is a bug in DAV, not git-annex. I've informed its author and it should be fixed soon, in a new version of DAV. +"""]] diff --git a/doc/tips/Crude_Windows_Sync.mdwn b/doc/tips/Crude_Windows_Sync.mdwn new file mode 100644 index 000000000..88138a0b1 --- /dev/null +++ b/doc/tips/Crude_Windows_Sync.mdwn @@ -0,0 +1,35 @@ +Here's a workaround to start syncing folders on Windows right now. It's a bit command line heavy, so you might need to set this up for your users. But I would much rather do this than use some other syncing solution and then have to migrate. + +(1) Create a remote server git annex repository with the assistant on Linux or Mac. + +(2) [Install git](http://git-scm.com/) on the Windows machine. + +(3) [Install git-annex for Windows](http://git-annex.branchable.com/install/Windows/) on the Windows machine. Don't forget to run the installer as administrator. + +(4) Run _Git Bash_ from the system menu, and run these commands to clone your repository. + + ssh-keygen + cat .ssh/id_rsa.pub | ssh username@my-server.com "cat >> ~/.ssh/authorized_keys" + git clone username@my-server.com:/path/to/annex + cd annex + git annex init + +(5) Create a script that will trigger a full sync + + echo ' + #!/bin/bash + git annex sync + git annex get * + git annex add . + git annex sync + git annex copy * --to origin + ' > sync.sh + chmod +x sync.sh + ./sync.sh + +(6) Copy the "Git Bash" shortcut from your windows menu to your desktop, and change the link target to: + + C:\Program Files\Git\bin\sh.exe" --login -i "annex/sync.sh" + +Now ask your users to run this shortcut before and after they change files. You can also put it into the "autostart" folder to sync at boot. + diff --git a/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn new file mode 100644 index 000000000..9e347c73f --- /dev/null +++ b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn @@ -0,0 +1,59 @@ +If you're anything like me¹, you have a copy of your annex on a computer running at home², set up so you can access it from anywhere like this: + + ssh myhome.no-ip.org + +This is totally great! Except, there is no way for your home computer to pull your changes, because there is no *on-the-go.no-ip.org*. You can get clunky and use a *bare git repository and git push*, but there is a better way. + +First, install *openssh-server* on your *on-the-go* computer + + sudo apt-get install openssh-server # Adjust to your flavor of unix + +Then, log into your *home* computer, with *port forwarding*: + + ssh me@myhome.no-ip.org -R 2201:localhost:22 + +Your *home* computer can now ssh into your *on-the-go* computer, as long as you keep the above shell running. + +You can now add your *on-the-go* computer as a remote on your *home* computer. Use the port forwarding shell you just connected with the command above, if you like. + + ssh-keygen -t rsa + ssh-copy-id "me@localhost -p 2201" + cd ~/annex + git remote add on-the-go ssh://me@localhost:2201/home/myuser/annex + +Now you can run normal annex operations, as long as the port forwarding shell is running³. + + git annex sync + git annex get on-the-go some/big/file + git annex info + +You can add more computers by repeating with a different port, e.g. 2202 or 2203 (or any other). + +If you're security paranoid (like me), read on. If you're not, that's it! Thanks for reading! + +--- +Paranoid Area + +Note you're granting passwordless access to your on-the-go computer to your home computer. I believe that's all right, as long as: + +* Your home computer is really in your home, and not at a friend's house or some datacenter +* Your home computer can be accessed only by ssh, and not HTTP or Samba or NTP or (shoot me now!) FTP +* Only you (and perhaps trustworthy family) have access to your home computer +* You have reasonably strong passwords or key-only logins on both your home and on-the-go computers. +* You regularly install security updates on both computers (sudo apt-get update && sudo apt-get upgrade) + +In any case, the setup is much, much, much more secure than Dropbox. With Dropbox, you have exactly the same setup, but: + +* Your data is stored in some datacenter. It's supposed to be encrypted. It might not be. +* Lot's of people have routine access to your files, and plausible reason to. Bored employees might regularly be doing some 'maintenance work' involving your pictures. +* The dropbox software can do anything it likes on your computer, and it's closed source so you don't know if it does. A disgruntled employee could put a trojan into it. +* Dropbox might have a backdoor for employee access to any file on your computer. This might be done with the best of intentions, but a mal-intentioned or careless employee might still erase things or send sensitive files from your computer by email. +* A truly huge amount of eyes connected to incredibly smart brains have looked at openssh and found it secure. Everybody trusts openssh. With dropbox, there is, well, dropbox. Whoever that is. + +----- + +¹ Me=Carlo, not Joey. I'm pretty sure doing what I wrote here is a good idea, but in case it turns out to be catastrophically dumb, it's my fault, not his. + +² My always-on computer at home is a raspberry pi with a 32GB USB stick. Best self-hosted dropbox you could imagine. + +³ You can just forward the port, but not open a shell, by adding the -N command. This could be useful for connecting on startup, e.g. in /etc/rc.local. I prefer to open the shell to forward the ports, maybe use it, and close it to stop it. diff --git a/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment b/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment new file mode 100644 index 000000000..71a1db9c8 --- /dev/null +++ b/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-30T16:25:58Z" + content=""" +If you don't trust your home computer with shell access, you can lock it down in `.ssh/authorized_keys` to only be able to run git-annex-shell. See [[forum/Restricting_git-annex-shell_to_a_specific_repository]] +"""]] diff --git a/doc/tips/Delay_Assistant_Startup_on_Login.mdwn b/doc/tips/Delay_Assistant_Startup_on_Login.mdwn new file mode 100644 index 000000000..74652308a --- /dev/null +++ b/doc/tips/Delay_Assistant_Startup_on_Login.mdwn @@ -0,0 +1,13 @@ +# Problem +I noticed that after installing git-annex assistant, my start up times greatly increased because the assistant does a startup scan while everything else is loading. +# Solution (for people using Gnome) +The solution I came up with is to delay the assistant's startup, as well as setting its IO priority as idle. To do this in Gnome 3, run: + + gnome-session-properties +Find the "Git Annex Assistant" entry in the Startup Programs tab, then click edit. Change this: + + /usr/local/bin/git-annex assistant --autostart (your location of git-annex may be different) +to this: + + bash -c "sleep 30; ionice -c3 /usr/local/bin/git-annex assistant --autostart" (replace /usr/local/bin to wherever git-annex is installed) +The "sleep 30" command delays the startup of the assistant by 30 seconds, and "ionice -c3" sets git-annex's IO priority to "idle," the lowest level. diff --git a/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment b/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment new file mode 100644 index 000000000..fe8cb80ba --- /dev/null +++ b/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~alphapapa" + nickname="alphapapa" + subject="ionice not supported by deadline scheduler" + date="2013-06-28T17:43:47Z" + content=""" +Linux's deadline I/O scheduler does not support ionice. It is now the default on some distros, including Ubuntu. CFQ does support ionice. +"""]] diff --git a/doc/tips/Git_annex_and_Calibre.mdwn b/doc/tips/Git_annex_and_Calibre.mdwn new file mode 100644 index 000000000..71f955656 --- /dev/null +++ b/doc/tips/Git_annex_and_Calibre.mdwn @@ -0,0 +1,120 @@ +The problem +=========== + +[Calibre](http://calibre-ebook.com/) is a ebook manager that is +available in [debian](http://packages.debian.org/sid/calibre). I use +it to maintain my library, but also to dowload every day an epub +version of a French newspaper and then put it on my kobo. + +Configuring git annex for this +============================== + +I wanted to use git-annex, so + + $ git init + $ git annex init "some useful name" + +But I don't want every thing in annex, because Calibre use some text +file to save some metadata, so I used: + + $ git config annex.largefiles "include=* exclude=*.opf exclude=*.json" + +then lets add everything + + $ git annex add * + $ git add * + $ git commit -m "first commit" + +Calibre need read and write access on the its database, so let unlock it: + + $ git annex unlock metadata.db + +On my other computer I only need to do + + $ git clone $user@$host:Calibre\ library + $ cd Calibre\ library + $ git annex init "another useful name" + $ git annex get . + $ git annex unlock metadata.db + +The problem is that every time you will `git annex sync`, git annex +will lock again the metadata.db, so lets unlock it automatically. I +use git hooks, in `.git/hooks/post-commit` I have + + #!/bin/bash + + git annex edit metadata.db + +don't forget to make this file executable + + $ chmod a+x .git/hooks/post-commit + +Day to day operation +==================== + + $ git annex add . + +Will put new file into the annex + + $ git add . + +Will take care of the files that should no go into annex + + $ git annex sync + +Will make the repositories exchange informations about all this, and +make remote change local + + $ git annex get . + +Will make remote book locally available + +Merge conflict +-------------- +You should not run calibre on the two computer simultaneously, or +without syncing before it. If you do, you will have a conflict that +git-annex will automatically *solve* by rename both of the file. + +You can then either: + + - Choose one. If no books have been changed or added on one of the + computer, to use the other `metadata.db` will not make you loose + any information + - rebuild it. `calibredb restore_database` won't do it, but will tell + you how to do it. + +Checking the library +-------------------- +You can use `calibredb check_library` to check you library is +correct. If you use git for it, it will always tell you that it is not +correct: there is this author ".git" it doesn't know about. Just don't +care about it. + +Maybe this can be solved by using `vcsh` but apparently +`vcsh`+`git annex` it not well tested yet. + +Automatic stuff +--------------- +I use `mr` to automatically run all this, but some config could be +done (I believe) to have `git annex copy --auto` do what it should. + +There are also the git annex assistant for this kind of automatic +synchronizations of contents, but I don't know if my automatic +unlocking of one file will break this. + +It might be interesting to find someway to unlock and lock the library +only when running calibre, a simple script to launch calibre will do +that. Note that each time you will lock and unlock, you will have a +new commit in git. + +Another solution +=================== +You could also use direct mode in place of the auto unlock feature + + git annex direct + +The remove the `post-commit` git hook (or do not add it). Its a +simpler solution, but remember that interaction between git annex direct +repositories and plain git are complex and sometimes downright dangerous. See [[direct mode]] for details. + +In particular, do *not* called `git add *` in the above steps, as that will commit all books into git. diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn new file mode 100644 index 000000000..97f5828d3 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn @@ -0,0 +1,19 @@ +I worked out how to retroactively annex a large file that had been checked into a git repo some time ago. I thought this might be useful for others, so I am posting it here. + +Suppose you have a git repo where somebody had checked in a large file you would like to have annexed, but there are a bunch of commits after it and you don't want to loose history, but you also don't want everybody to have to retrieve the large file when they clone the repo. This will re-write history as if the file had been annexed when it was originally added. + +This command works for me, it relies on the current behavior of git which is to use a directory named .git-rewrite/t/ at the top of the git tree for the extracted tree. This will not be fast and it will rewrite history, so be sure that everybody who has a copy of your repo is OK with accepting the new history. If the behavior of git changes, you can specify the directory to use with the -d option. Currently, the t/ directory is created inside the directory you specify, so "-d ./.git-rewrite/" should be roughly equivalent to the default. + +Enough with the explanation, on to the command: +
+git filter-branch --tree-filter 'for FILE in file1 file2 file3;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all
+
+ +replace file1 file2 file3... with whatever paths you want retroactively annexed. If you wanted bigfile1.bin in the top dir and subdir1/bigfile2.bin to be retroactively annexed try: +
+git filter-branch --tree-filter 'for FILE in bigfile1.bin subdir1/bigfile2.bin;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all
+
+ +**If your repo has tags** then you should take a look at the git-filter-branch man page about the --tag-name-filter option and decide what you want to do. By default this will re-write the tags "nearly properly". + +You'll probably also want to look at the git-filter-branch man page's section titled "CHECKLIST FOR SHRINKING A REPOSITORY" if you want to free up the space in the existing repo that you just changed history on. diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment new file mode 100644 index 000000000..d4e34e8cd --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-16T00:11:38Z" + content=""" +Man, I wish you'd written this a couple weeks ago. :) I was never able to figure that incantation out and ended up unannexing and re-annexing the whole thing to get rid of the file I inadvertently checked into git instead of the annex. +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment new file mode 100644 index 000000000..a3ea62385 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 2" + date="2013-03-13T12:05:49Z" + content=""" +Based on the hints given here I've worked on a filter to both annex and add urls via filter-branch: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-filter](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-filter) + +The script above is very specific but I think there are a few ideas that can be used in general, the general structure is + + #!/bin/bash + + # links that already exist + links=$(mktemp) + find . -type l >\"$links\" + + # remove from staging area first to not block and then annex + git rm --cached --ignore-unmatch -r bin* + git annex add -c annex.alwayscommit=false bin* + + # compare links before and after annexing, remove links that existed before + newlinks=$(mktemp -u) + mkfifo \"$newlinks\" + comm -13 <(sort \"$links\") <(find . -type l | sort) > \"$newlinks\" & + + # rewrite links + while IFS= read -r file + do + # link is created below .git-rewrite/t/ during filter-branch, strip two parents for correct target + ln -sf \"$(readlink \"$file\" | sed -e 's%^\.\./\.\./%%')\" \"$file\" + done < \"$newlinks\" + + git annex merge + +which would be run using + + git filter-branch --tree-filter path/annex-filter --tag-filter cat -- --all + +or similar. + +* I'm using `find` to make sure the only rewritten symlinks are for the newly annexed files, this way it is possible to annex an unknown set of filenames +* If doing several git annex commands using `-c annex.alwayscommit=false` and doing a `git annex merge` at the end instead might be faster. +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment new file mode 100644 index 000000000..9b8aa58f8 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="arand" + ip="130.238.245.202" + subject="comment 3" + date="2013-03-18T14:39:52Z" + content=""" +One thing I noticed is that git-annex needs to checksum each file even if they were previously annexed (rather obviously since there is no general way to tell if the file is the same as the old one without checksumming), but in the specific case that we are replacing files that are already in git, we do actually have the sha1 checksum for each file in question, which could be used. + +So, trying to work with this, I wrote a filter script that starts out annexing stuff in the first commit, and continously writes out sha1<->filename<->git-annex-object triplets to a global file, when it then starts with the next commit, it compares the sha1s of the index with those of the global file, and any matches are manually symlinked directly to the corresponding git-annex-object without checksumming. + +I've done a few tests and this seems to be considerably faster than letting git-annex checksum everything. + +This is from a git-svn import of the (free software) Red Eclipse game project, there are approximately 3500 files (images, maps, models, etc.) being annexed in each commit (and around 5300 commits, hence why I really, really care about speed): + +10 commits: ~7min + +100 commits: ~38min + +For comparison, the old and new method (the difference should increase with the amount of commits): + +old, 20 commits ~32min + +new, 20 commits: ~11min + +The script itself is a bit of a monstrosity in bash(/grep/sed/awk/git), and the files that are annexed are hardcoded (removed in forming $oldindexfiles), but should be fairly easy to adapt: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-ffilter](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-ffilter) + +The usage would be something like: + + rm /tmp/annex-ffilter.log; git filter-branch --tree-filter 'ANNEX_FFILTER_LOG=/tmp/annex-ffilter.log ~/utv/scripts/annex-ffilter' --tag-name-filter cat -- branchname + +I suggest you use it with at least two orders of magnitude more caution than normal filter-branch. + +Hope it might be useful for someone else wrestling with filter-branch and git-annex :) +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment new file mode 100644 index 000000000..ab1d4e006 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknOATcOkmzX4jKuET5Z2RsaFUNnLKnQsU" + nickname="Stephen" + subject="comment 4" + date="2013-06-22T07:43:09Z" + content=""" +Thanks for the tip :) One question though: how do I push this new history out throughout my other Annexes? +All I managed to make it do was revert the rewrite so the raw file appeared again... +"""]] diff --git a/doc/tips/Internet_Archive_via_S3.mdwn b/doc/tips/Internet_Archive_via_S3.mdwn new file mode 100644 index 000000000..15f241c9f --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3.mdwn @@ -0,0 +1,85 @@ +[The Internet Archive](http://www.archive.org/) allows members to upload +collections using an Amazon S3 +[compatible API](http://www.archive.org/help/abouts3.txt), and this can +be used with git-annex's [[special_remotes/S3]] support. + +So, you can locally archive things with git-annex, define remotes that +correspond to "items" at the Internet Archive, and use git-annex to upload +your files to there. Of course, your use of the Internet Archive must +comply with their [terms of service](http://www.archive.org/about/terms.php). + +A nice added feature is that whenever git-annex sends a file to the +Internet Archive, it records its url, the same as if you'd run `git annex +addurl`. So any users who can clone your repository can download the files +from archive.org, without needing any login or password info. This makes +the Internet Archive a nice way to publish the large files associated with +a public git repository. + +## webapp setup + +Just go to "Add Another Repository", pick "Internet Archive", +and you're on your way. + +## basic setup + +Sign up for an account, and get your access keys here: + + + # export AWS_ACCESS_KEY_ID=blahblah + # export AWS_SECRET_ACCESS_KEY=xxxxxxx + +Specify `host=s3.us.archive.org` when doing `initremote` to set up +a remote at the Archive. This will enable a special Internet Archive mode: +Encryption is not allowed; you are required to specify a bucket name +rather than having git-annex pick a random one; and you can optionally +specify `x-archive-meta*` headers to add metadata as explained in their +[documentation](http://www.archive.org/help/abouts3.txt). + + # git annex initremote archive-panama type=S3 \ + host=s3.us.archive.org bucket=panama-canal-lock-blueprints \ + x-archive-meta-mediatype=texts x-archive-meta-language=eng \ + x-archive-meta-title="original Panama Canal lock design blueprints" + initremote archive-panama (Internet Archive mode) ok + # git annex describe archive-panama "a man, a plan, a canal: panama" + describe archive-panama ok + +Then you can annex files and copy them to the remote as usual: + + # git annex add photo1.jpeg --backend=SHA256E + add photo1.jpeg (checksum...) ok + # git annex copy photo1.jpeg --fast --to archive-panama + copy (to archive-panama...) ok + +Once a file has been stored on archive.org, it cannot be (easily) removed +from it. Also, git-annex whereis will tell you a public url for the file +on archive.org. (It may take a while for archive.org to make the file +publically visibile.) + +Note the use of the SHA256E [[backend|backends]] when adding files. That is +the default backend used by git-annex, but even if you don't normally use +it, it makes most sense to use the WORM or SHA256E backend for files that +will be stored in the Internet Archive, since the key name will be exposed +as the filename there, and since the Archive does special processing of +files based on their extension. + +## publishing only one subdirectory + +Perhaps you have a repository with lots of files in it, and only want +to publish some of them to a particular Internet Archive item. Of course +you can specify which files to send manually, but it's useful to +configure [[preferred_content]] settings so git-annex knows what content +you want to store in the Internet Archive. + +One way to do this is using the "public" repository type. + + git annex enableremote archive-panama preferreddir=panama + git annex wanted archive-panama standard + git annex group archive-panama public + +Now anything in a "panama" directory will be sent to that remote, +and anything else won't. You can use `git annex copy --auto` or the +assistant and it'll do the right thing. + +When setting up an Internet Archive item using the webapp, this +configuration is automatically done, using an item name that the user +enters as the name of the subdirectory. diff --git a/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment b/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment new file mode 100644 index 000000000..7c2ce48fc --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="how to use with simply addurl?" + date="2013-10-09T22:27:27Z" + content=""" +It doesn't seem like git annex addurl by itself supports the archive.org urls... + +[[!format txt \"\"\" +anarcat@marcos:presentations$ git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + failed to verify url exists: http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +\"\"\"]] + +I also tried the \"details\" url () - but that just downloads the webpage, not the video either... + +Even the ultimate video URL doesn't work: + +[[!format txt \"\"\" +anarcat@marcos:presentations$ git annex addurl --debug --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +[2013-10-09 18:26:30 EDT] call: quvi [\"-v\",\"mute\",\"--support\",\"http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm\"] +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm [2013-10-09 18:26:30 EDT] read: curl [\"-s\",\"--head\",\"-L\",\"http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm\",\"-w\",\"%{http_code}\"] + + failed to verify url exists: http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +\"\"\"]] + +... even though that URL actually gives out a proper 200 OK response code. + +Any ideas? --[[anarcat]] +"""]] diff --git a/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment b/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment new file mode 100644 index 000000000..9b4ac58b2 --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 2" + date="2013-10-11T17:08:27Z" + content=""" +This was a misleading error message. The url you are trying to add to the file does not match the size recorded for the file already in the annex. (Or possibly the file's key has no recorded size). If you really want to add the url to the file despite it being a different encoding, you can use --relaxed, although fsck may not like the result if you ever end up downloading that url.. + +(Please file bug reports for problems in the future, rather than posting comments on only vaguely related pages which as we can see here can turn out to be entirely offtopic.) +"""]] diff --git a/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment b/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment new file mode 100644 index 000000000..3745d544c --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="still a bug, filed separately!" + date="2013-10-11T18:49:06Z" + content=""" +Aaah, of course, sorry for the noise here. It turns out that this is *not* because the filesize (or even the checksum, for that matter) are different, so there's clearly a bug there, and i filed it in [[bugs/addurl_fails_on_the_internet_archive]]. Thanks! +"""]] diff --git a/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn b/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn new file mode 100644 index 000000000..df19f68b8 --- /dev/null +++ b/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn @@ -0,0 +1,21 @@ +Combining git-annex with [Shamir secret sharing](http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing) +is an useful way to securely back up highly sensitive files, +such as a gpg key or bitcoin wallet. + +Shamir secret sharing creates N shares of a file, of which any M can be +used to reconstitute the original file. Anyone who has less than M shares +cannot tell anything about the original file, other than its size. + +Where git-annex comes in is as a way to manage these shares. They can be +added to the annex, and then git-annex used to move one share to each clone +of the repository. Since git-annex keeps track of where each file is +stored, this can aid later finding the shares again when they're needed, as +well as making ongoing management of the shares easier. + +Note that this conveniece comes at a price: Any attacker who gets a copy +of the git repository can use it to figure out where the shares are +located. While this is not a crippling flaw, and can be worked around, it +needs to be considered when implementing this technique. + +Here is an example of this method being used for a ~/.gnupg directory: + diff --git a/doc/tips/Synology_NAS_and_git_annex.mdwn b/doc/tips/Synology_NAS_and_git_annex.mdwn new file mode 100644 index 000000000..50c604483 --- /dev/null +++ b/doc/tips/Synology_NAS_and_git_annex.mdwn @@ -0,0 +1,59 @@ +# How to use git-annex on a Synology NAS + +This is known to work with DSM 4.3-3810 Update 1 and git-annex standalone version 5.20131224-g6ca5271. + +## Installation Steps + +(1) In the DSM Package Center, install Git, which is available from Synology (no third-party repository needed). + +(2) Download the latest [[standalone|install/Linux_standalone]] git-annex build for Linux on armel. + +(3) Extract it somewhere sensible (eg: a bin/ directory your users home directory) + +(4) Go into the git-annex.linux directory and ./runshell. You can now run git-annex as you normally would. + +## How to sync with the Synology NAS + +### On the Synology +(1) Setup port forwarding and associated dynamic dns, if applicable. Many good guides online for this. + +(2) Setup ssh key based authentication with the Synology for each computer you want to sync with it. You want a specific key that is used only by git-annex, for each computer. Again, many good guides online. + +(3) In the Synology .ssh/authorized_keys file for your account, add (substituing your username) +[[!format sh """ +command="/home/$yourusername/.ssh/git-annex-shell" +"""]] +to the beginning of the line. Eg, it would look like this: +[[!format sh """ +command="/home/greg/.ssh/git-annex-shell" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT1yE96E/JQNPt0ziiNYJRvndCvLK4uG5h/SNYoAIBF1uH6L7VYAt3HWVqSyi3BcV70WDZ/yWgtNzbrcir46JpvEHMcvYaXLbANwoDGNjG/gsz7kP/8VUxZ6hG3P3ICuwnqVum5+rYXm6oj3xzWPfTRhhRoDZLOQdevSNpdGNaa/lSg8Vuq2suHwjQlQb8AIUuCZmS5cm6XwoUq/jJtN4LTuTPqMjzA6NkdhWM2Kigi9jPQBFborkYBPMphmZwBZiVnhsH1XpaOff+mP03D2gF/huC+b1vbWQstjuehUbY59rvJ4ijb3810Uq2ep7dwLagmILtX5GbL+GS64pAn9sIP annex-othercomputer +"""]] + +(4) the git-annex-shell script in your .ssh should be created for you aftering your initial ./runshell + +(5) Double check that the script points to the correct directory of where your extracted git-annex.linux lives. + +### On the other computers - the manual way +(1) See step 2 above about creating the specific git-annex ssh keys. + +(2) In your .ssh/config, create an alias for your Synology that includes specifying the right sshkey. For example, mine looks like: +[[!format sh """ +Host synologyhost + HostName mydynamicdomain.no-ip.org + IdentityFile /home/greg/.ssh/annex_rsa +"""]] + +(3) Now when you clone the git repo from the Synology, or add it as a remote, do the following: +[[!format sh """ +git clone greg@synologyhost:/absolute/path/to/annexname annexname +"""]] +or + +[[!format sh """ +git remote add synology greg@synologyhost:/absolute/path/to/annexname +"""]] + +(4) Run git-annex sync + +### On the other computers - Using the assistant + +(1) Use the webapp to add the remote. I'm not sure if there are any gotchas here as I have not done it this way yet. diff --git a/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment b/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment new file mode 100644 index 000000000..e7a1db937 --- /dev/null +++ b/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrP-0DGtHDJbWSXeiyk0swNkK1aejoN3c" + nickname="sebastien" + subject="new dev site for syno dsm 5.0" + date="2014-03-25T10:20:46Z" + content=""" +There is a new website with documentation to create App for new synology dsm 5.0 here : http://www.synology.com/en-us/support/developer +A good way to distribute git annex to lot of people ? :) +"""]] diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn new file mode 100644 index 000000000..ccae0fced --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn @@ -0,0 +1,36 @@ +I have an annex that syncs my personal files on all my computers. It works great. Phones are different. + +For one, everything's a bit slower to sync, there's battery considerations, and I just don't need every last old file on my phone. Then there's some files I explicitly don't want on my phone in case it gets lost, like family pictures, passport scans, or private keys. + +But I still want photos, videos and voice recordings I make on my phone to be synced to my server. A transfer repo would work, but I want to keep them. Then there's my PDF book collection; that would certainly be nice to always have around in case I have half on hour on a bus. And my music collection ought to be around as well. + +So I came up with this solution, and I'm very happy with it. + + include=Music/* or include=Books/* or present + +This will sync my music and book collections to my phone whenever I add something new on my computers, and it will sync and keep anything I add to the annex on my phone. Best of all worlds! Impressed how flexible preferred content is. More full-sync folders can be added like this: + + include=Music/* or include=Books/* or include = Notes/* or present + +To add them, I first had to figure out the uuid of my phone repo. So I added a new tab on android, and did + + cd /sdcard/annex + git config annex.uuid + +Then I went to one of my computers, and did + + git annex vicfg + +And changed the line + + content [phone-uuid] = standard + +to + + content [phone-uuid] = include=Music/* or include=Books/* or Notes/* or present + +and commented out + + #group [phone-uuid] = client + +And waited for it to sync. diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment new file mode 100644 index 000000000..8938684f8 --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-16T17:29:03Z" + content=""" +That's great, that's how I hoped people would be able to use preferred content settings. + +I'd suggest adding support for archive directories to this. So if you create a file on the phone and are done with it, you can move it to an archive directory, and it will then be dropped from the phone once it reaches an archive repository. + +This should accomplish that. (Untested) + +`((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and (include=Music/* or include=Books/* or present)` +"""]] diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment new file mode 100644 index 000000000..1b84eee81 --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXlmnJKsPulm2S_hwwRm3Ky27Zyf-wKMw" + nickname="Chad" + subject="Pulling *.flac files as well... too much data" + date="2013-12-31T19:26:36Z" + content=""" +I've tried setting up my own phone in a similar manner. Unfortunately for me, I store my `*.flac` files in the same location as my `*.mp3` files. For obvious reasons, I do not want to copy these up to my phone. This, however, is not working for me. + + content PHONEUID = ((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and (include=keepass/* or include=Books/* or present) and (include=Music/* and exclude=Music/*.flac and exclude=Music/*/*.flac) + +I still get `*.flac` files in the repo. +"""]] diff --git a/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn new file mode 100644 index 000000000..4ee023de3 --- /dev/null +++ b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn @@ -0,0 +1,46 @@ +[[todo/wishlist: an "assistant" for web-browsing -- tracking the sources of the downloads]] suggests using git-annex as a tool to store downloads tied +to their URLs. This also enables people to have their files stored offline, +while being able to git annex drop them at any time and redownload them +with git annex get. Additionally, a clone of the repo can be used to +download whatever files are desired from online. + +This tip explains how to implement a similar system to the one described in +the linked wishlist with existing software and features of git-annex. + +The first step is to install the Firefox plugin +[FlashGot](http://flashgot.net/). We will use it to provide the Firefox +shortcuts to add things to our annex. + +We also need a normal download manager, if we want to get status updates as +the download is done. We'll need to configure git-annex to use it by +setting `annex.web-download-command` as Joey describes in his comment on +[[todo/wishlist: allow configuration of downloader for addurl]]. See the +manpage [[git-annex]] for more information on setting configuration. + +Once we have installed all that, we need a script that has an interface +which FlashGot can treat as a downloader, but which calls git-annex to do +the actual downloading. Such a script is available from +. Download it and store it +somewhere it can live, or cut and paste: + +[[!format sh """ +#!/bin/bash +# $1=folder to cd to (must be a git annex repo) +# $2=URL to download + +cd "$1" +git-annex addurl "$2" +"""]] + +Finally, we need to configure FlashGot to use the script as a downloader. +Go to Tools > Add-ons in Firefox. Click "Preferences" on FlashGot. Click +the Add button next to the list of download managers. Enter a name for the +git-annex downloader. Choose the script that was downloaded from the +"Locate executable file" dialog that appears. Now set the command line +arguments template to be "[FOLDER] [URL]" (you can find more substitution +expressions in the Placeholders dropdown above the Command line arguments +template field). You're done! + +Go ahead and test it by trying to download a file using FlashGot. It should +offer as one of its available download managers the new manager you created +just above. Select it and have fun! diff --git a/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment new file mode 100644 index 000000000..4c5c3cdfa --- /dev/null +++ b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T20:16:02Z" + content=""" +As of my last commit, you don't really need a separate download manager. The webapp will now display urls that `git annex addurl` is downloading in among the other transfers. +"""]] diff --git a/doc/tips/ZSH_completion.mdwn b/doc/tips/ZSH_completion.mdwn new file mode 100644 index 000000000..f3ececd46 --- /dev/null +++ b/doc/tips/ZSH_completion.mdwn @@ -0,0 +1,13 @@ +ZSH users, here's some good news: after 2 years of silence, the completion function for git-annex has been updated. It now supports *all* git-annex commands (as of 5.20140517) and has many improvements for completing arguments, remotes, groups, and backends. + +To install it: + +1. make sure your have Python 3 installed (as `python3` somewhere in your `$PATH`; tested with 3.4, should work with 3.2+) +2. get it from [GitHub](https://github.com/Schnouki/git-annex-zsh-completion) +3. copy `_git-annex` to somewhere in your `$fpath` (I use `$HOME/.config/zsh/completion`) +4. run `autoload -U path/to/_git-annex` +5. type `git annex ` + +This is very far from being perfect, but it's (IMHO) better than nothing. If you have any issue or suggestion, please [tell me](https://github.com/Schnouki/git-annex-zsh-completion/issues)! + +Many thanks to Frank Terbeck and Valentin Haenel, the original authors of this completion function ([source](https://github.com/esc/git-annex-zsh-completion)). diff --git a/doc/tips/assume-unstaged.mdwn b/doc/tips/assume-unstaged.mdwn new file mode 100644 index 000000000..63f5f820a --- /dev/null +++ b/doc/tips/assume-unstaged.mdwn @@ -0,0 +1,31 @@ +[[!meta title="using assume-unstages to speed up git with large trees of annexed files"]] + +Git update-index's assume-unstaged feature can be used to speed +up `git status` and stuff by not statting the whole tree looking for changed +files. + +This feature works quite well with git-annex. Especially because git +annex's files are immutable, so aren't going to change out from under it, +this is a nice fit. If you have a very large tree and `git status` is +annoyingly slow, you can turn it on: + + git config core.ignoreStat true + +When `git mv` and `git rm` are used, those changes *do* get noticed, even +on assume-unchanged files. When new files are added, eg by `git annex add`, +they are also noticed. + +There are two gotchas. Both occur because `git add` does not stage +assume-unchanged files. + +1. When an annexed file is moved to a different directory, it updates + the symlink, and runs `git add` on it. So the file will move, + but the changed symlink will not be noticed by git and it will commit a + dangling symlink. +2. When using `git annex migrate`, it changes the symlink and `git adds` + it. Again this won't be committed. + +These can be worked around by running `git update-index --really-refresh` +after performing such operations. I hope that `git add` will be changed +to stage changes to assume-unchanged files, which would remove this +only complication. --[[Joey]] diff --git a/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment new file mode 100644 index 000000000..d253feb5b --- /dev/null +++ b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2djv2EYwk43rfJIAQXjYt_vfuOU-#a11a6" + nickname="Olivier R" + subject="It doesn't work 100%" + date="2012-05-03T21:42:54Z" + content=""" +When you remove tracked files... it doesn't show the new status. it's like if the file was ignored. + + +"""]] diff --git a/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment new file mode 100644 index 000000000..474d7b399 --- /dev/null +++ b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00" + nickname="Jakukyo" + subject="comment 2" + date="2013-09-05T12:14:42Z" + content=""" +> There are two gotchas... + +So just always run `git annex add` after editing a file +and `git update-index --really-refresh` after migrating +backend? + +"""]] diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn new file mode 100644 index 000000000..e6d02defa --- /dev/null +++ b/doc/tips/automatically_adding_metadata.mdwn @@ -0,0 +1,24 @@ +git-annex's [[metadata]] works best when files have a lot of useful +metadata attached to them. + +To make git-annex automatically set the year and month when adding files, +run `git config annex.genmetadata true`. + +A git commit hook can be set up to extract lots of metadata from files +like photos, mp3s, etc. + +1. Install the `extract` utility, from + `apt-get install extract` +2. Download [[pre-commit-annex]] and install it in your git-annex repository + as `.git/hooks/pre-commit-annex`. + Remember to make the script executable! +3. Run: `git config metadata.extract "artist album title camera_make video_dimensions"` + +Now any fields you list in metadata.extract to will be extracted and +stored when files are committed. + +To get a list of all possible fields, run: `extract -L | sed 's/ /_/g'` + +By default, if a git-annex already has a metadata field for a file, +its value will not be overwritten with metadata taken from files. +To allow overwriting, run: `git config metadata.overwrite true` diff --git a/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment b/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment new file mode 100644 index 000000000..59f0e958a --- /dev/null +++ b/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2014-03-03T07:44:29Z" + content=""" +http://projects.iq.harvard.edu/fits might be an even better choice than libextractor. We use it in work and its not too bad, but it can be slow to startup due to the JVM. +"""]] diff --git a/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment b/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment new file mode 100644 index 000000000..13b3865e1 --- /dev/null +++ b/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-04-01T04:18:10Z" + content=""" +is there a way for this to be done globally, without having to install and configure the hook for each repository? it seems like a fairly useful feature that could be factored in git-annex itself (as opposed to be shipped as a shell script)... + +also, is there a way to retroactively parse the tags from existing files (as opposed to only new files added to the repo). + +thanks +"""]] diff --git a/doc/tips/automatically_adding_metadata/comment_3_02e5314f827d17d482343e8f22c42fd9._comment b/doc/tips/automatically_adding_metadata/comment_3_02e5314f827d17d482343e8f22c42fd9._comment new file mode 100644 index 000000000..644ece527 --- /dev/null +++ b/doc/tips/automatically_adding_metadata/comment_3_02e5314f827d17d482343e8f22c42fd9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 3" + date="2014-04-17T20:15:07Z" + content=""" +@anarcat, I have modified [[pre-commit-annex]] so if it's passed already annexed files, it'll extract their metadata. + +So this can be used to add metadata to files added before you installed the hook, or if you've configured more fields to be extracted. +"""]] diff --git a/doc/tips/automatically_adding_metadata/pre-commit-annex b/doc/tips/automatically_adding_metadata/pre-commit-annex new file mode 100755 index 000000000..fe818d032 --- /dev/null +++ b/doc/tips/automatically_adding_metadata/pre-commit-annex @@ -0,0 +1,71 @@ +#!/bin/sh +# +# This script can be used to add git-annex metadata to files when they're +# committed. It is typically installed as .git/hooks/pre-commit-annex +# +# You can also run this script by hand, passing it the names of files +# already checked into git-annex, and it will extract/refresh the git-annex +# metadata from the files. +# +# Copyright 2014 Joey Hess +# License: GPL-3+ + +extract="$(git config metadata.extract || true)" +want="$(perl -e 'print (join("|", map {s/_/ /g; "^$_ - "} (split " ", shift())))' "$extract")" + +if [ -z "$want" ]; then + exit 0 +fi + +case "$(git config --bool metadata.overwrite || true)" in + true) + overwrite=1 + ;; + *) + overwrite="" + ;; +esac + +addmeta () { + file="$1" + field="$2" + value="$3" + afield="$(echo "$field" | tr ' ' _)" + if [ "$overwrite" ]; then + p="$afield=$value" + + else + p="$afield?=$value" + fi + git -c annex.alwayscommit=false annex metadata "$file" -s "$p" --quiet +} + +if git rev-parse --verify HEAD >/dev/null 2>&1; then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +IFS=" +" + +process () { + if [ -e "$f" ]; then + for l in $(extract "$f" | egrep "$want"); do + field="${l%% - *}" + value="${l#* - }" + addmeta "$f" "$field" "$value" + done + fi +} + +if [ -n "$*" ]; then + for f in $@; do + process "$f" + done +else + for f in $(git diff-index --name-only --cached $against); do + process "$f" + done +fi diff --git a/doc/tips/automatically_getting_files_on_checkout.mdwn b/doc/tips/automatically_getting_files_on_checkout.mdwn new file mode 100644 index 000000000..bbb3b302e --- /dev/null +++ b/doc/tips/automatically_getting_files_on_checkout.mdwn @@ -0,0 +1,15 @@ +Normally git-annex does not retrieve file contents when checking out a +tree. In some use cases, it makes sense to always have the contents of +files available after a `git checkout` or `git update`. This can be +accomplished by installing the following as `.git/hooks/post-checkout` + + #!/bin/sh + # Uses git-annex to get all files in the specified directories + # (relative to the top of the repository) on checkout. + dirs=. + top="$(git rev-parse --show-toplevel)" + for dir in "$dirs"; do git annex get $top/$dir"; done + +By default, all files in the whole repository will be made available. The +`dirs` setting can be configured if you only want to get files in certian +directories. diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn new file mode 100644 index 000000000..0983c7d31 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn @@ -0,0 +1,2 @@ +When git annex does fsck on (for example) a GPG-encrypted special directory remote, it first transfers the whole file into .git/annex/tmp directory. +If your annex is on an SSD, it's a good idea to make .git/annex/tmp a symlink to say /var/tmp so SSD isn't worn down. This actually may be a better default. diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment new file mode 100644 index 000000000..9c7bc2ed1 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 1" + date="2013-07-31T15:15:41Z" + content=""" +Of course, this only works when /var/tmp isn't on SSD itself. Perhaps tmpfs (e.g. a /tmp on many distros) is good -- after checking that there's enough space to transfer a particular file. +"""]] diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment new file mode 100644 index 000000000..929019705 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="there's a problem" + date="2013-08-04T17:15:05Z" + content=""" +If .git/annex/tmp is a symlink to another fs, then adding doesn't work: + + add file1.jpg (checksum...) + git-annex: /path/to/.git/annex/tmp/tmp30148: rename: unsupported operation (Invalid cross-device link) + +It looks like it would be good to have two types of tmp directories here, one for adding, another one for verifying (and that one could be redirected off SSD). + +"""]] diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment new file mode 100644 index 000000000..2624a4fd3 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="guilhem" + ip="46.239.117.180" + subject="comment 3" + date="2013-08-19T01:05:40Z" + content=""" +A nice feature would be to perform the `fsck` on the (encrypted) remote itself, as it would avoid to clutter either the network or the tmpdir. However, that requires some changes in git-annex's backend. Indeed it would no longer be enough to store a single digest per (plain) file: a new digest needs to be stored for each encrypted copy. It is not necessarily a big deal, but the backend would need to be reorganized carefully. +"""]] diff --git a/doc/tips/centralised_repository:_starting_from_nothing.mdwn b/doc/tips/centralised_repository:_starting_from_nothing.mdwn new file mode 100644 index 000000000..7018697a0 --- /dev/null +++ b/doc/tips/centralised_repository:_starting_from_nothing.mdwn @@ -0,0 +1,71 @@ +If you are starting from nothing (no existing `git` or `git-annex` repository) and want to use a server as a centralised repository, try the following steps. + +On the server where you'll hold the "master" repository: + + server$ cd /one/git + server$ mkdir m + server$ cd m + server$ git init --bare + Initialized empty Git repository in /one/git/m/ + server$ git annex init origin + init origin ok + server$ + +Clone that to the laptop: + + laptop$ cd /other + laptop$ git clone ssh://server//one/git/m + Cloning into 'm'... + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 0), reused 0 (delta 0) + Receiving objects: 100% (5/5), done. + warning: remote HEAD refers to nonexistent ref, unable to checkout. + + laptop$ cd m + laptop$ git annex init laptop + init laptop ok + laptop$ + +Add some content: + + laptop$ git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) --2011-12-15 08:13:10-- http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + Resolving kitenet.net (kitenet.net)... 2001:41c8:125:49::10, 80.68.85.49 + Connecting to kitenet.net (kitenet.net)|2001:41c8:125:49::10|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 39362757 (38M) [audio/ogg] + Saving to: `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' + + 100%[======================================>] 39,362,757 2.31M/s in 17s + + 2011-12-15 08:13:27 (2.21 MB/s) - `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' saved [39362757/39362757] + + (checksum...) ok + (Recording state in git...) + +Don't forget to commit it: + + laptop$ git commit -m 'See Joey play.' + [master (root-commit) 106e923] See Joey play. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg + laptop$ + +All fine, now push it back to the centralised master: + + laptop$ git push origin master + Counting objects: 20, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (11/11), done. + Writing objects: 100% (18/18), 1.50 KiB, done. + Total 18 (delta 1), reused 1 (delta 0) + To ssh://server//one/git/m + 3ba1386..ad3bc9e git-annex -> git-annex + laptop$ + +You'll probably want to use `git annex copy --to origin` to copy the +annexed file contents to the server. See the [[walkthrough]] for details. + +You can add more "client" repositories by following the `laptop` +sequence of operations. diff --git a/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment b/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment new file mode 100644 index 000000000..22857af3e --- /dev/null +++ b/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-23T19:19:53Z" + content=""" +See also: [[centralized_git_repository_tutorial]] +"""]] diff --git a/doc/tips/centralized_git_repository_tutorial.mdwn b/doc/tips/centralized_git_repository_tutorial.mdwn new file mode 100644 index 000000000..00283829f --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial.mdwn @@ -0,0 +1,140 @@ +The [[walkthrough]] builds up a decentralized git repository setup, but +git-annex can also be used with a centralized bare repository, just like +git can. This tutorial shows how to set up a centralized repository hosted on +GitHub. + +## set up the repository, and make a checkout + +I've created a repository for technical talk videos, which you can +[fork on Github](https://github.com/joeyh/techtalks). +Or make your own repository on GitHub (or elsewhere) now. + +On your laptop, [[install]] git-annex, and clone the repository: + + # git clone git@github.com:joeyh/techtalks.git + # cd techtalks + +Tell git-annex to use the repository, and describe where this clone is +located: + + # git annex init 'my laptop' + init my laptop ok + +Let's tell git-annex that GitHub doesn't support running git-annex-shell there. +This means you can't store annexed file *contents* on GitHub; it would +really be better to host the bare repository on your own server, which +would not have this limitation. (If you want to do that, check out +[[using_gitolite_with_git-annex]].) + + # git config remote.origin.annex-ignore true + +## add files to the repository + +Add some files, obtained however. + + # youtube-dl -t 'http://www.youtube.com/watch?v=b9FagOVqxmI' + # git annex add *.mp4 + add Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 (checksum) ok + (Recording state in git...) + # git commit -m "added a video. I have not watched it yet but it sounds interesting" + +This file is available directly from the web; so git-annex can download it: + + # git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg + (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) + (checksum...) ok + (Recording state in git...) + # git commit -a -m 'added a screencast I made' + +Feel free the rename the files, etc, using normal git commands: + + # git mv Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 Haskell_Amuse_Bouche.mp4 + # git mv kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg git-annex_coding_in_haskell.ogg + # git commit -m 'better filenames' + +Now push your changes back to the central repository. This first time, +remember to push the git-annex branch, which is used to track the file +contents. + + # git push origin master git-annex + To git@github.com:joeyh/techtalks.git + * [new branch] master -> master + * [new branch] git-annex -> git-annex + +That push went fast, because it didn't upload large videos to GitHub. +To check this, you can ask git-annex where the contents of the videos are: + + # git annex whereis + whereis Haskell_Amuse_Bouche.mp4 (1 copy) + 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here + ok + whereis git-annex_coding_in_haskell.ogg (2 copies) + 00000000-0000-0000-0000-000000000001 -- web + 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here + ok + +## make more checkouts + +So far you have a central repository, and a checkout on a laptop. +Let's make another checkout that's used as a backup. You can put it anywhere +you like, just make it be somewhere your laptop can access. A few options: + +* Put it on a USB drive that you can plug into the laptop. +* Put it on a desktop. +* Put it on some server in the local network. +* Put it on a remote VPS. + +I'll use the VPS option, but these instructions should work for +any of the above. + + # ssh server + server# sudo apt-get install git-annex + +Clone the central repository as before. (If the clone fails, you need +to add your server's ssh public key to github -- see +[this page](http://help.github.com/ssh-issues/).) + + server# git clone git@github.com:joeyh/techtalks.git + server# cd techtalks + server# git config remote.origin.annex-ignore true + server# git annex init 'backup' + init backup (merging origin/git-annex into git-annex...) ok + +Notice that the server does not have the contents of any of the files yet. +If you run `ls`, you'll see broken symlinks. We want to populate this +backup with the file contents, by copying them from your laptop. + +Back on your laptop, you need to configure a git remote for the backup. +Adjust the ssh url as needed to point to wherever the backup is. (If it +was on a local USB drive, you'd use the path to the repository instead.) + + # git remote add backup ssh://server/~/techtalks + +Now git-annex on your laptop knows how to reach the backup repository, +and can do things like copy files to it: + + # git annex copy --to backup git-annex_coding_in_haskell.ogg + copy git-annex_coding_in_haskell.ogg (checking backup...) + 12877824 2% 255.11kB/s 00:00 + ok + +You can also `git annex move` files to it, to free up space on your laptop. +And then you can `git annex get` files back to your laptop later on, as +desired. + +After you use git-annex to move files around, remember to push, +which will broadcast its updated location information. + + # git push + +## take it farther + +Of course you can create as many checkouts as you desire. If you have a +desktop machine too, you can make a checkout there, and use `git remote +add` to also let your desktop access the backup repository. + +You can add remotes for each direct connection between machines you find you +need -- so make the laptop have the desktop as a remote, and the desktop +have the laptop as a remote, and then on either machine git-annex can +access files stored on the other. diff --git a/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment b/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment new file mode 100644 index 000000000..c509d7579 --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="sync, push, pull with/to/from centralized bare repository" + date="2013-10-07T06:45:19Z" + content=""" +Hi Joey, + +thanks for tutorial with the centralized repo. I am currently trying to set up a central bare repo for two clients (they cannot communicate directly with each other). I am not sure if I am pushing/pulling the right way. + +On the server I did: + + git init --bare + git annex init origin + +On Cĺient Alice (I want to give Bob a chance get call \"git annex get\" from \"origin\"): + + git clone ssh://tktest@192.168.56.104/~/annex . + git annex init Alice + git annex merge + git annex add . + git commit -a -m \"Added tutorial\" + git push origin master git-annex + git annex copy . --to origin + +On Client Bob I have called \"clone, init, merge, add, push, copy\" also. + +Now the tricky part - do I have to call \"git annex sync\" at Alice's side to get the updates from Bob over origin? +I ran into troubles if I called \"copy --to origin\" before \"git push origin master git-annex\". How can I resolve a non-fast-forware on the git-annex branch? +Some notes about how to sync over a central bare repo would be nice here =) + +Thanks a lot, Georg +"""]] diff --git a/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment b/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment new file mode 100644 index 000000000..21b286fff --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.80" + subject="How can I resolve a non-fast-forware on the git-annex branch?" + date="2013-10-07T17:08:32Z" + content=""" +By either running `git annex sync`, or if you want to pull and push yourself, by running `git annex merge` before pushing. +"""]] diff --git a/doc/tips/downloading_podcasts.mdwn b/doc/tips/downloading_podcasts.mdwn new file mode 100644 index 000000000..7805f84cb --- /dev/null +++ b/doc/tips/downloading_podcasts.mdwn @@ -0,0 +1,79 @@ +You can use git-annex as a podcatcher, to download podcast contents. +No additional software is required, but your git-annex must be built +with the Feeds feature (run `git annex version` to check). + +All you need to do is put something like this in a cron job: + +`cd somerepo && git annex importfeed http://url/to/podcast http://other/podcast/url` + +This downloads the urls, and parses them as RSS, Atom, or RDF feeds. +All enclosures are downloaded and added to the repository, the same as if you +had manually run `git annex addurl` on each of them. + +git-annex will avoid downloading a file from a feed if its url has already +been stored in the repository before. So once a file is downloaded, +you can move it around, delete it, `git annex drop` its content, etc, +and it will not be downloaded again by repeated runs of +`git annex importfeed`. Just how a podcatcher should behave. + +## templates + +To control the filenames used for items downloaded from a feed, +there's a --template option. The default is +`--template='${feedtitle}/${itemtitle}${extension}'` + +Other available template variables: +feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid, +itempubdate, author, title. + +## catching up + +To catch up on a feed without downloading its contents, +use `git annex importfeed --relaxed`, and delete the symlinks it creates. +Next time you run `git annex addurl` it will only fetch any new items. + +## fast mode + +To add a feed without downloading its contents right now, +use `git annex importfeed --fast`. Then you can use `git annex get` as +usual to download the content of an item. + +## storing the podcast list in git + +You can check the list of podcast urls into git right next to the +files it downloads. Just make a file named feeds and add one podcast url +per line. + +Then you can run git-annex on all the feeds: + +`xargs git-annex importfeed < feeds` + +## distributed podcatching + +A nice benefit of using git-annex as a podcatcher is that you can +run `git annex importfeed` on the same url in different clones +of a repository, and `git annex sync` will sync it all up. + +## centralized podcatching + +You can also have a designated machine which always fetches all podcstas +to local disk and stores them. That way, you can archive podcasts with +time-delayed deletion of upstream content. You can also work around slow +downloads upstream by podcatching to a server with ample bandwidth or work +around a slow local Internet connection by podcatching to your home server +and transferring to your laptop on demand. + +## youtube playlists + +If your git-annex is also built with quvi support, you can also use +`git annex importfeed` on youtube playlists. It will automatically download +the videos linked to by the playlist. + +## metadata + +As well as storing the urls for items imported from a feed, git-annex can +store additional [[metadata]], like the author, and itemdescription. +This can then be looked up later, used in [[metadata_driven_views]], etc. + +To make all available metadata from the feed be stored: +`git config annex.genmetadata true` diff --git a/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment b/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment new file mode 100644 index 000000000..3bf5afe68 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 10" + date="2013-08-05T16:47:30Z" + content=""" +`cabal install feed` should get the necessary library installed so that git-annex will build with feeds support. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment b/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment new file mode 100644 index 000000000..fd3459926 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 11" + date="2013-08-06T04:20:16Z" + content=""" + $ cabal install feed + Resolving dependencies... + All the requested packages are already installed: + feed-0.3.9.1 + Use --reinstall if you want to reinstall anyway. + +Then I reinstalled `git-annex` but it still doesn't find the feeds flag. + + $ git annex version + git-annex version: 4.20130802 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Do I need to do something like: + + cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns -feed\" + +...but what are the default flags to include in addition to `-feed` +"""]] diff --git a/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment b/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment new file mode 100644 index 000000000..e75a44a8c --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 12" + date="2013-08-06T04:24:10Z" + content=""" +-f-Feed will disable the feature. -fFeed will try to force it on. + +You can probably work out what's going wrong using cabal install -v3 +"""]] diff --git a/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment b/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment new file mode 100644 index 000000000..8d1242818 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 13" + date="2013-08-06T05:42:45Z" + content=""" +So I ran `cabal install -v3` and looked at the output, + + Flags chosen: feed=True, tdfa=True, testsuite=True, android=False, + production=True, dns=True, xmpp=True, pairing=True, webapp=True, + assistant=True, dbus=True, inotify=True, webdav=True, s3=True + +This looks like feed should be on. + +There doesn't appear to be any errors in the compile either. + +Is it as simple as a bug where this flag just doesn't show in the `git annex version` command? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment b/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment new file mode 100644 index 000000000..4bc831f7f --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 14" + date="2013-08-07T16:03:12Z" + content=""" +Yes, it did turn out to be as simple as my having forgotten that I have to manually add features to the version list. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment b/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment new file mode 100644 index 000000000..0f998d066 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://23.gs/" + ip="46.165.197.5" + subject="No file extension?" + date="2013-08-12T13:21:50Z" + content=""" +It seems git-annex is a bit overzealous when sanitizing the file extension, currently I get: \"Nerdkunde/Let_s_go_to_the_D_M_C_A_m4a\" from http://www.nerdkunde.de/episodes.m4a.rss with the default template and only \"Nerdkunde/Let_s_go_to_the_D_M_C_A._m4a\" if I add the \".\" in the template myself... +"""]] diff --git a/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment b/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment new file mode 100644 index 000000000..4419d02a8 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 16" + date="2013-08-12T13:32:46Z" + content=""" +The filename extension is a known issue and already fixed in the development version, see +"""]] diff --git a/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment b/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment new file mode 100644 index 000000000..bc49e5dd0 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpKmTa1OPwy5Jk24pOoD8Vlo2jahzTPnw" + nickname="Stephen" + subject="rss authentication" + date="2013-08-13T13:32:52Z" + content=""" +If a podcast requires authentication, is there a way to pass credentials through? I tried `http://user:pass@site.com/rss.xml` but it didn't work. + +"""]] diff --git a/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment b/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment new file mode 100644 index 000000000..9e3244315 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="--fast and --relaxed" + date="2013-08-16T07:27:59Z" + content=""" +Hi, + +the explanations to --fast and --relaxed on this page could be extended a bit. I looked it up in the man page, but it is not yet clear to me when I would use one or the other with feeds. Also, does “Next time you run git annex addurl it will only fetch any new items.” really only apply to --relaxed, and not --fast? + +Furthermore, it would be good if there were a template variable `itemnum` that I can use to ensure that `ls` prints the casts in the right order, even when the titles of the items are not helpful. + +Greetings, +Joachim +"""]] diff --git a/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment b/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment new file mode 100644 index 000000000..41313a87d --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 19" + date="2013-08-22T15:25:02Z" + content=""" +I would expect user:pass@site.com to work if the site is using http basic auth. `importfeed` just runs `wget` (or `curl`) to do all downloads, and wget's documentation says that works. It also says you can use ~/.netrc to store the password for a site. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment b/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment new file mode 100644 index 000000000..014fe3f50 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="ckeen" + ip="79.249.110.228" + subject="Filename too long" + date="2013-07-30T14:39:44Z" + content=""" +It seems that some of my feeds get stored into keys that generate a too long filename: + + podcasts/.git/annex/tmp/b1f_325_URL-s143660317--http&c%%feedproxy.google.com%~r%mixotic%~5%urTIRWQK2OQ%Mixotic__258__-__Michael__Miller__-__Galactic__Technolgies.mp3.log.web: + openBinaryFile: invalid argument (File name too long) + +Is there a way to work around this? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment b/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment new file mode 100644 index 000000000..6060be655 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 20" + date="2013-08-22T15:29:11Z" + content=""" +The git-annex man page has a bit more to say about --relaxed and --fast. Their behavior when used with `importfeed` is the same as with `addurl`. + +If the podcast feed provides an `itemid`, you can use that in the filename template. I don't know how common that is. Due to the way `importfeed` works, it cannot keep track of eg, an incrementing item number itself. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_21_98a1dacc8d264ff31801e6c5c5f2612d._comment b/doc/tips/downloading_podcasts/comment_21_98a1dacc8d264ff31801e6c5c5f2612d._comment new file mode 100644 index 000000000..eebc00ad9 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_21_98a1dacc8d264ff31801e6c5c5f2612d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Sazius" + ip="62.78.213.233" + subject="comment 21" + date="2014-07-01T20:52:06Z" + content=""" +For some podcast feeds I typically wish to view the description of the show before I decide to download it or not. Is there some way to perform that use case using git annex? I know `itemdescription` is something I can include in the template for the filename, but the descriptions can be really long... doesn't seem very elegant to have that in the file name. Could the description for example be included as metadata of the item? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_22_00cc7a2fb936d7ea3d5d3764a1637663._comment b/doc/tips/downloading_podcasts/comment_22_00cc7a2fb936d7ea3d5d3764a1637663._comment new file mode 100644 index 000000000..2fba1b57d --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_22_00cc7a2fb936d7ea3d5d3764a1637663._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.55" + subject="metadata" + date="2014-07-03T18:25:32Z" + content=""" +Good idea, Sazius! + +I've made importfeed store the metadata, as long as annex.genmetadata is set in .git/config. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment b/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment new file mode 100644 index 000000000..f8ba1155c --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T17:16:07Z" + content=""" +@ckeen You seem to be using a filesystem that does not support filenames 150 characters long. This is unusual -- even windows and android can support a filename up to 255 characters in length. `git-annex addurl` already deals with this sort of problem by limiting the filename to 255 characters. If you'd like to file a bug report with details about your system, I can try to make git-annex support its limitations, I suppose. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment b/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment new file mode 100644 index 000000000..7e5633865 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="Great stuff!" + date="2013-07-30T21:21:57Z" + content=""" +Looking forward to seeing it in Debian unstable; where it will definitely replace my hpodder setup. + +I guess there is no easy way to re-use the files already downloaded with hpodder? At first I thought that `git annex importfeed --relaxed` followed by adding the files to the git annex would work, but `importfeed` stores URLs, not content-based hashes, so it wouldn’t match up. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment b/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment new file mode 100644 index 000000000..1693c4bdc --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 4" + date="2013-07-30T21:29:50Z" + content=""" +@nomeata, well, you can, but it has to download the files again. + +When run without --fast, `importfeed` does use content based hashes, so if you run it in a temporary directory, it will download the content redundantly, hash it and see it's the same, and add the url to that hash. You can then delete the temporary directory, and the files hpodder had downloaded will have the url attached to them now. I don't know if this really buys you anything over deleting the hpodder files and starting over though. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment b/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment new file mode 100644 index 000000000..f5df9910f --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ckeen" + ip="79.249.110.228" + subject="Force a reload of a feed?" + date="2013-07-31T10:35:50Z" + content=""" +Currently I have my podcasts imported with --fast. For some reason there are podcast episodes missing. This has been done propably during my period of toying with the feature. If I retry on a clean annex I see all episodes. My suspicion is that git-annex has been interrupted during downloading a feed but now somehow thinks it's already there. How can I debug this situation and/or force git annex to retry all the links in a feed? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment b/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment new file mode 100644 index 000000000..caeca0151 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="use the force" + date="2013-07-31T16:20:39Z" + content=""" +The only way it can skip downloading a file is if its url has already been seen before. Perhaps you deleted them? + +I've made `importfeed --force` re-download files it's seen before. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment b/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment new file mode 100644 index 000000000..ac2c89a36 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ckeen" + ip="78.108.63.46" + subject="--force reload all URLs" + date="2013-08-01T09:47:34Z" + content=""" +Is it intentionally saving URLs with a prefixed 2_? I have sorted out all missing URLs and renamed it, so no harm done, but it has been a bit of a hassle to get there. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment b/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment new file mode 100644 index 000000000..0995d8075 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 8" + date="2013-08-01T16:05:10Z" + content=""" +I've now made importfeed --force a bit smarter about reusing existing files. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment b/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment new file mode 100644 index 000000000..3045c9894 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="How do I switch on the 'feeds' feature?" + date="2013-08-05T04:52:41Z" + content=""" +Joey - your initial post said: + + git-annex must be built with the Feeds feature (run git annex version to check). + +...but how do I actually switch on the feeds feature? + +I install git-annex from cabal, so I do + + cabal update + cabal install git-annex + +which I did this morning and now `git annex version` gives me: + + git-annex version: 4.20130802 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +So it is the latest version, but without Feeds. :-( +"""]] diff --git a/doc/tips/dropboxannex.mdwn b/doc/tips/dropboxannex.mdwn new file mode 100644 index 000000000..0f82f659d --- /dev/null +++ b/doc/tips/dropboxannex.mdwn @@ -0,0 +1,29 @@ +dropboxannex 0.2.0 +========= + +Hook program for gitannex to use dropbox as backend + +# Requirements: + + python2 + python-pkg-resources + +Credit for the Dropbox api interface goes to Dropbox. + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/dropboxannex.git + +This should make a ~/dropboxannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/dropboxannex; chmod +x git-annex-remote-dropbox; sudo ln -sf `pwd`/git-annex-remote-dropbox /usr/local/bin/git-annex-remote-dropbox + +# Commands for gitannex: + + git annex initremote dropbox type=external externaltype=dropbox encryption=shared folder=gitannex + git annex describe dropbox "the dropbox library" + diff --git a/doc/tips/emacs_integration.mdwn b/doc/tips/emacs_integration.mdwn new file mode 100644 index 000000000..2390474a4 --- /dev/null +++ b/doc/tips/emacs_integration.mdwn @@ -0,0 +1,25 @@ +bergey has developed an emacs mode for browsing git-annex repositories, +dired style. + + + +Locally available files are colored differently, and pressing g runs +`git annex get` on the file at point. + +---- + +John Wiegley has developed a brand new git-annex interaction mode for +Emacs, which aims to integrate with the standard facilities +(C-x C-q, M-x dired, etc) rather than invent its own interface. + + + +He has also added support to org-attach; if +`org-attach-git-annex-cutoff' is non-nil and smaller than the size + of the file you're attaching then org-attach will `git annex add the +file`; otherwise it will "git add" it. + +---- + +[magit-annex](https://github.com/kyleam/magit-annex) adds magit support +for a few features, including adding files and syncing. diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn new file mode 100644 index 000000000..6c6ac643f --- /dev/null +++ b/doc/tips/file_manager_integration.mdwn @@ -0,0 +1,119 @@ +Integrating git-annex and your file manager provides an easy way to select +annexed files to get or drop. + +[[!toc]] + +## GNOME (nautilus) + +Recent git-annex comes with built-in nautilus integration. Just pick the +action from the menu. + +[[!img assistant/nautilusmenu.png]] + +[[!img assistant/downloadnotification.png]] + +This is set up by making simple scripts in +`~/.local/share/nautilus/scripts`, with names like "git-annex get" + +## KDE (Dolphin/Konqueror) + +Create a file `~/.kde4/share/kde4/services/ServiceMenus/git-annex.desktop` with the following contents: + + [Desktop Entry] + Type=Service + ServiceTypes=all/allfiles + MimeType=all/all; + Actions=GitAnnexGet;GitAnnexDrop; + X-KDE-Priority=TopLevel + X-KDE-Submenu=Git-Annex + X-KDE-Icon=git-annex + X-KDE-ServiceTypes=KonqPopupMenu/Plugin + + [Desktop Action GitAnnexGet] + Name=Get + Icon=git-annex + Exec=git-annex get --notify-start --notify-finish -- %U + + [Desktop Action GitAnnexDrop] + Name=Drop + Icon=git-annex + Exec=git-annex drop --notify-start --notify-finish -- %U + +## XFCE (Thunar) + +XFCE uses the Thunar file manager, which can also be easily configured to allow for custom actions. Just go to the "Configure custom actions..." item in the "Edit" menu, and create a custom action for get and drop with the following commands: + + git-annex drop --notify-start --notify-finish -- %F + +for drop, and for get: + + git-annex drop --notify-start --notify-finish -- %F + +This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: + + + git-annex + git-annex get + 1396278104182858-3 + git-annex get --notify-start --notify-finish -- %F + get the files from a remote git annex repository + * + + + + + + + + + git-annex + git-annex drop + 1396278093174843-2 + git-annex drop --notify-start --notify-finish -- %F + drop the files from the local repository + * + + + + + + + + +The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions). + +## OS X (Finder) + +For OS X, it is possible to get context menus in Finder. Due to how OS X deals with sym links, one needs to operate on folders if using indirect mode. Direct mode operation has not been tested. + +1. Open Automator and create a new Service. +2. Using the Drop down menus in the top create the sentence "Service receives selected folders in Finder.app" to have it work on folders. For direct mode operation it is probably reasonable to select "files or folders". +3. Add a "Run shell script" element and fill in line with the following script: + + #!/usr/bin/bash + source ~/.bash_profile + for f in "$@" + do + cd "$(dirname "$f")" && git-annex get "$f" + done + +The purpose of the first line is there to get git-annex on to the path. The reason for the for loop is in case multiple files or folders are marked when running the context menu command. + +Finally save the the workflow under the name for which it should be listed in the context menu. + +## your file manager here + +Edit this page and add instructions! + +## general + +If your file manager can run a command on a file, it should be easy to +integrate git-annex with it. A simple script will suffice: + + #!/bin/sh + git-annex get --notify-start --notify-finish -- "$@" + +The --notify-start and --notify-stop options make git-annex display a +desktop notification. This is useful to give the user an indication that +their action took effect. Desktop notifications are currently only +implemented for Linux. diff --git a/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment b/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment new file mode 100644 index 000000000..2dedcc884 --- /dev/null +++ b/doc/tips/file_manager_integration/comment_1_0f82520f415b4715946358658e1799a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="Finder added" + date="2014-04-23T13:19:02Z" + content=""" +For some reason I do not manage to get the shell script to pretty print. I can also supply a screenshot of the Automator, but do not manage to upload it to the wiki. +"""]] diff --git a/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment b/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment new file mode 100644 index 000000000..ad3e4c0b4 --- /dev/null +++ b/doc/tips/file_manager_integration/comment_2_9cb6b7fcb8e33a75efd2f92d7e40a9c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-04-23T17:49:09Z" + content=""" +@Carl, I've fixed the formatting. To add a picture, you'd need to send me a pull request adding it to the git repo. +"""]] diff --git a/doc/tips/finding_duplicate_files.mdwn b/doc/tips/finding_duplicate_files.mdwn new file mode 100644 index 000000000..94fc85400 --- /dev/null +++ b/doc/tips/finding_duplicate_files.mdwn @@ -0,0 +1,21 @@ +Maybe you had a lot of files scattered around on different drives, and you +added them all into a single git-annex repository. Some of the files are +surely duplicates of others. + +While git-annex stores the file contents efficiently, it would still +help in cleaning up this mess if you could find, and perhaps remove +the duplicate files. + +Here's a command line that will show duplicate sets of files grouped together: + + git annex find --include '*' --format='${file} ${escaped_key}\n' | \ + sort -k2 | uniq --all-repeated=separate -f1 | \ + sed 's/ [^ ]*$//' + +Here's a command line that will remove one of each duplicate set of files: + + git annex find --include '*' --format='${file} ${escaped_key}\n' | \ + sort -k2 | uniq --repeated -f1 | sed 's/ [^ ]*$//' | \ + xargs -d '\n' git rm + +--[[Joey]] diff --git a/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment b/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment new file mode 100644 index 000000000..77a308b90 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="comment 10" + date="2013-08-31T18:20:58Z" + content=""" +I'm already spreading the word. Handling scientific papers, data, simulations and code has been quite a challenge during my academic career. While code was solved long ago, the three first items remained a huge problem. +I'm sure many of my colleagues will be happy to use it. +Is there any hashtag or twitter account? I've seen that you collected some of my tweets, but I don't know how you did it. Did you search for git-annex? +Best, + Juan +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment b/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment new file mode 100644 index 000000000..03ab1b3c7 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="sameerds" + ip="106.51.197.116" + subject="a shell script that handles spaces in file names" + date="2013-12-31T10:24:06Z" + content=""" +I used the following shell pipeline to remove duplicate files in one go: + + (1) git annex find --format='${key}:${file}\n' \ + (2) | cut -d '-' -f 4- \ + (3) | sort \ + (4) | uniq --all-repeated=separate -w 40 \ + (5) | awk -vRS= -vFS='\n' '{for (i = 2; i <= NF; i++) print $i}' \ + (6) | cut -d ':' -f 2- \ + (7) | xargs -d '\n' git rm + +1. Generate a list of keys and file names separated by a colon (':'). +2. Cut out the initial part of the key so that the hash is at the beginning of the line. The `-f 4-` ensures that dashes in the filename do not result in truncation. +3. Sort the entire list. +4. Uniquify and print duplicates in groups separated by blank lines. Use the first 40 characters, which matches the length of a SHA1 hash. Other hashes will require a different length. +5. Use awk to print all but the first line in each group. The empty `-vRS` sets blank line as the record separator, and the `-vFS` sets newline as the field separator. The for-loop prints each field except the first. +6. Cut out the key and keep only the file name by relying on the colon introduced in the first step. +7. Use xargs to separate file names by newline, which takes care of spaces in the file names. Send this list of arguments to `git rm`. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment b/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment new file mode 100644 index 000000000..d1bd4475e --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="Cool" + date="2011-12-23T19:16:50Z" + content=""" +Very nice :) Just for reference, here's [my Perl implementation](https://github.com/aspiers/git-config/blob/master/bin/git-annex-finddups). As per [this discussion](http://git-annex.branchable.com/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/#comment-fb15d5829a52cd05bcbd5dc53edaffb2) it would be interesting to benchmark these two approaches and see if one is substantially more efficient than the other w.r.t. CPU and memory usage. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment b/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment new file mode 100644 index 000000000..605c804dd --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="problems with spaces in filenames" + date="2012-09-05T02:12:18Z" + content=""" +note that the sort -k2 doesn't work right for filenames with spaces in them. On the other hand, git-rm doesn't seem to like the escaped names from escaped_file. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_3._comment b/doc/tips/finding_duplicate_files/comment_3._comment new file mode 100644 index 000000000..44eeb5075 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_3._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="mhameed" + ip="82.32.202.53" + subject="problems with spaces in filenames" + date="Wed Sep 5 09:38:56 BST 2012" + content=""" + +Spaces, and other special chars can make filename handeling ugly. +If you don't have a restriction on keeping the exact filenames, then +it might be easiest just to get rid of the problematic chars. + + #!/bin/bash + + function process() { + dir="$1" + echo "processing $dir" + pushd $dir >/dev/null 2>&1 + + for fileOrDir in *; do + nfileOrDir=`echo "$fileOrDir" | sed -e 's/\[//g' -e 's/\]//g' -e 's/ /_/g' -e "s/'//g" ` + if [ "$fileOrDir" != "$nfileOrDir" ]; then + echo renaming $fileOrDir to $nfileOrDir + git mv "$fileOrDir" "$nfileOrDir" + else + echo "skipping $fileOrDir, no need to rename." + fi + done + + find ./ -mindepth 1 -maxdepth 1 -type d | while read d; do + process "$d" + done + popd >/dev/null 2>&1 + } + + process . + +Maybe you can run something like this before checking for duplicates. + +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment b/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment new file mode 100644 index 000000000..f1a86f43c --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="more about spaces..." + date="2012-09-09T19:33:01Z" + content=""" +Ironically, previous renaming to remove spaces, plus some synching is how I ended up with these duplicates. For what it is worth, aspiers perl script worked out for me with a small modification. I just only printed out the duplicates with spaces in them (quoted). +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment b/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment new file mode 100644 index 000000000..23beb779f --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaBh9VNJ-RZ26wJZ4BEhMN1IlPT-DK6JA" + nickname="Alex" + subject="printing keys first is the easiest workaround" + date="2013-04-01T23:32:23Z" + content=""" +Since the keys are sure to have nos paces in them, putting them first makes working with the output with tools like sort, uniq, and awk simpler. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment b/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment new file mode 100644 index 000000000..31601a989 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkBYpLu_NOj7Uq0-acvLgWhxF8AUEIJbo" + nickname="Chris" + subject="Find files by key" + date="2013-05-03T04:14:55Z" + content=""" +Is there any simple way to search for files with a given key? + +At the moment, the best I've come up with is this: + +```` +git annex find --include '*' --format='${key} ${file}' | grep +```` + +where `` is the key. This seems like an awfully longwinded approach, but I don't see anything in the docs indicating a simpler way to do it. Am I missing something? +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment b/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment new file mode 100644 index 000000000..d97b0d500 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-05-13T18:42:14Z" + content=""" +@Chris I guess there's no really easy way because searching for a given key is not something many people need to do. + +However, git does provide a way. Try `git log --stat -S $KEY` +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment b/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment new file mode 100644 index 000000000..26c34fcfa --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="This is an awesome feature" + date="2013-08-28T13:40:23Z" + content=""" +Thanks. I have quite a lot of papers in PDF formats. Now I'm saving space, have them controlled, synchronized with many devices and found more than 200 duplicates. +Is there a way to donate to the project? You really deserve it. +Thanks. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment b/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment new file mode 100644 index 000000000..a20ca16ed --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.7" + subject="comment 9" + date="2013-08-28T20:25:20Z" + content=""" +@Juan the best thing to do is tell people about git-annex, help them use it, and file bug reports. Just generally be part of the git-annex community. + +(If you really want to donate to me, is still open.) +"""]] diff --git a/doc/tips/flickrannex.mdwn b/doc/tips/flickrannex.mdwn new file mode 100644 index 000000000..7e836a003 --- /dev/null +++ b/doc/tips/flickrannex.mdwn @@ -0,0 +1,50 @@ +flickrannex +========= + +Hook program for gitannex to use flickr as backend + +# Requirements: + + python2 + +Credit for the flickr api interface goes to: http://stuvel.eu/flickrapi +Credit for the png library goes to: https://github.com/drj11/pypng +Credit for the png tEXt patch goes to: https://code.google.com/p/pypng/issues/detail?id=65 + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/flickrannex.git + +This should make a ~/flickrannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/flickrannex; chmod +x git-annex-remote-flickr; sudo ln -sf `pwd`/git-annex-remote-flickr /usr/local/bin/git-annex-remote-flickr + +# Commands for gitannex: + + USERNAME="username@provider.com" git annex initremote flickr type=external externaltype=flickr encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. The hook will wait for 30s for you to login and authenticate. + + git annex describe dropbox "the flickr library" + +# Notes + +## Unencrypted mode +The photo name on flickr is currently the GPGHMACSHA1 version. + +## Encrypted mode +The current version base64 encodes all the data, which results in ~35% larger filesize. + +## Including directories as tags +This feature is currently disabled, if it gets implemented again it will most likely not require user action to enable it. + +In this case the image: + /home/me/annex-photos/holidays/2013/Greenland/img001.jpg +would get the following tags: "holidays" "2013" "Greenland" +(assuming "/home/me/annex-photos" is the top level in the annex...) + +Caveat Emptor - Tags will *always* be NULL for indirect repos - we don't (easily) know the human-readable file name. diff --git a/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment b/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment new file mode 100644 index 000000000..7bda45e5c --- /dev/null +++ b/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 10" + date="2013-06-07T09:39:59Z" + content=""" +I'm not even sure if chunksize is exposed to the hooks at all. + +As it is, the hook will check the filesize, and if the filesize is more than 30mbyte it will exit 1. + +Chunking may be implemented down the road. I do believe joeyh might have some plans that will touch this issue, so I'd rather wait. Than re-invent the wheel yet again. + +"""]] diff --git a/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment b/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment new file mode 100644 index 000000000..e59aa6500 --- /dev/null +++ b/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="git annex get failed" + date="2013-08-02T14:29:30Z" + content=""" +Hi, I am coming back to this and testing Flickr as a repository for moving files about and have run into what may be my very basic misunderstanding with vanilla annex. + +I copied one file to Flickr and dropped it elsewhere (--force). I assumed that the file was on Flickr ok but that the numcopies setting required the force because of the semi-trust level of the Flickr remote. + +Then I find I can't get the file back, even though there is a record of it from whereis. + +Can you help enlighten me as to what am I missing? I assumed whereis would only report files that exist and can be copied back. If not my error, I can raise bug or search for logs. Thanks in advance for any help. + +[[!format perl \"\"\" + + +nrb@nrb-ThinkPad-T61:~/tmp$ git annex whereis +whereis libpeerconnection.log (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +whereis test.cgi (1 copy) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) +ok +whereis walkthrough.sh (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +whereis walkthrough.sh~ (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +nrb@nrb-ThinkPad-T61:~/tmp$ git annex get test.cgi +get test.cgi (from flickr...) + +git-annex: /home/nrb/tmp/.git/annex/tmp/SHA256E-s48--a01eedbee949120aeda41e566f9ae8faef1c2bacaa6d7bb8e45050fb8df6d09d.cgi: rename: does not exist (No such file or directory) +failed +git-annex: get: 1 failed +nrb@nrb-ThinkPad-T61:~/tmp$ + +\"\"\"]] +"""]] diff --git a/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment b/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment new file mode 100644 index 000000000..003755f30 --- /dev/null +++ b/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment @@ -0,0 +1,58 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="re: git annex get failed" + date="2013-08-02T15:02:14Z" + content=""" +Another try - this time a slightly simpler setup using my version of the walkthrough commands + +[[!format bash \"\"\" + +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex drop walkthrough.sh --from usbdrive +drop usbdrive walkthrough.sh ok +(Recording state in git...) +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex move walkthrough.sh --to flickr +move walkthrough.sh (gpg) (checking flickr...) (to flickr...) +/home/nrb/repos/gits/flickrannex/flickrannex.py:92: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. + if res: +/home/nrb/repos/gits/flickrannex/flickrannex.py:100: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. + if res: +ok +(Recording state in git...) +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex whereis +whereis walkthrough.sh (1 copy) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) +ok +whereis walkthrough.sh~ (3 copies) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) + 7803d853-d231-4bb4-b696-f12a950fb96b -- here (my laptop) + d60d75f9-d878-4214-af20-fa055134ae77 -- usbdrive (portable USB drive) +ok +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex get walkthrough.sh +get walkthrough.sh (from flickr...) (gpg) +git-annex: /home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--02f600d7e8b071d2945270fd5e7fc26dd066ff31: openBinaryFile: does not exist (No such file or directory) +gpg: decrypt_message failed: eof + + Unable to access these remotes: flickr + + Try making some of these repositories available: + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) +failed +git-annex: get: 1 failed +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex fsck --from flickr +fsck walkthrough.sh (gpg) (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh + ** was expected to be present, but its content is missing. + + ** No known copies exist of walkthrough.sh +failed +fsck walkthrough.sh~ (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh~ + ** was expected to be present, but its content is missing. +failed +(Recording state in git...) +git-annex: fsck: 2 failed +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ + +\"\"\" ]] +"""]] diff --git a/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment b/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment new file mode 100644 index 000000000..19faa585e --- /dev/null +++ b/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="Version 0.1.10 pushed" + date="2013-09-11T20:31:25Z" + content=""" +Since the initial release of this hook a lot of issues have been fixed, and a few features added. + +I would highly suggest that everyone who is using this hook update to the latest version as i would consider one of the bugs to be fairly major. + + +"""]] diff --git a/doc/tips/flickrannex/comment_14_c728f10074d194efa8b2c60e97d275e7._comment b/doc/tips/flickrannex/comment_14_c728f10074d194efa8b2c60e97d275e7._comment new file mode 100644 index 000000000..f625d6bc0 --- /dev/null +++ b/doc/tips/flickrannex/comment_14_c728f10074d194efa8b2c60e97d275e7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="great job on that plugin!" + date="2014-04-15T04:47:17Z" + content=""" +it's pretty awesome to have 1TB of free storage like that out there... but for storing photos, it could be improved - I filed a few bugs on the github repo here: + +https://github.com/TobiasTheViking/flickrannex/issues/created_by/anarcat?state=open + +thanks! +"""]] diff --git a/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment b/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment new file mode 100644 index 000000000..d015dc195 --- /dev/null +++ b/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-06-05T21:33:42Z" + content=""" +Get the statically linked version from here http://git-annex.branchable.com/install/Linux_standalone/ + +I believe the new hook format was introduced in version 4.20130521 +"""]] diff --git a/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment b/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment new file mode 100644 index 000000000..14d7a1b7c --- /dev/null +++ b/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="missing configuration for flickr-checkpresent-hook" + date="2013-06-05T20:44:25Z" + content=""" + + +9 days ago: [the annex] \"hook format a few versions ago, and this is using the new hook format\". + +Looks very handy. I am just starting with this, but can't seem to get it working as a remote after following the simple walkthrough. All goes well until: + + $ git annex copy . --to flickr + copy walkthrough.sh (checking flickr...) + missing configuration for flickr-checkpresent-hook + git-annex: checkpresent hook misconfigured + +my Ubuntu 12.04: + + $ git annex version + git-annex version: 4.20130516.1 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +I guess my \"git-annex version is still too old\"? Any idea what version is needed? Even better if I can figure out which Linux distribution/release has the most up to date version of annex. + +"""]] diff --git a/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment b/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment new file mode 100644 index 000000000..741b0c5ba --- /dev/null +++ b/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 4" + date="2013-06-05T22:02:29Z" + content=""" +The path for the binary \"/usr/bin/python2\" is wrong. + +It could be any of /usr/bin/python /usr/bin/python2.6 /usr/bin/python2.7 + +Or maybe in /usr/local/bin + +you can try running \"which python\" or \"which python2\" to get the real path. +"""]] diff --git a/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment b/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment new file mode 100644 index 000000000..1c19711df --- /dev/null +++ b/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="missing configuration for flickr-checkpresent-hook" + date="2013-06-05T22:00:48Z" + content=""" +Many thanks. + +I used gitannex-install and was left with a slight anomaly: + + Installing...........done + git-annex version 4.20130601 has been installed + $ git-annex version + git-annex version: 4.20130531-g5df09b5 + +But I guess this includes the new hook format. I get a bit further: + + $ git annex copy . --to flickr + copy walkthrough.sh (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed + copy walkthrough.sh~ (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed + git-annex: copy: 2 failed + + +"""]] diff --git a/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment b/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment new file mode 100644 index 000000000..dbeaafb73 --- /dev/null +++ b/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="comment 5" + date="2013-06-05T22:11:14Z" + content=""" +Thanks, but on my machine I get: + + $ which python2 + /usr/bin/python2 + +I have scripted all my walkthrough commands, blowing away the test repositories and flickr settings first each time. This re-runs the flickr scripts and git config annex.flickr-hook etc. + +I can't spot anything here. + + +"""]] diff --git a/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment b/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment new file mode 100644 index 000000000..8e7b15ed0 --- /dev/null +++ b/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 6" + date="2013-06-06T09:44:11Z" + content=""" +That's weird... + +You could try adding \"--dbglevel 1 --stderr\" arguments to the hook command and give me the output. But the way i read the log it seems like it doesn't even launch the python intrepreter. I might be wrong though. + + +"""]] diff --git a/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment b/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment new file mode 100644 index 000000000..9e0eb0a73 --- /dev/null +++ b/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Unencrypted flickr can only accept picture and video files" + date="2013-06-06T10:24:58Z" + content=""" +Thanks and sorry to trouble you, it is my error, I picked unencrypted option (thinking it would be less of an issue) and am using a text file for test, gave an error line: + + 10:53:07 [flickrannex-0.1.5] main : 'Unencrypted flickr can only accept picture and video files' + +I've not looked through your code yet, but could that message be printed when not in debug mode? +"""]] diff --git a/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment b/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment new file mode 100644 index 000000000..ff11a618a --- /dev/null +++ b/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 8" + date="2013-06-06T10:51:39Z" + content=""" +I'll make it so, in the next version i push. +"""]] diff --git a/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment b/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment new file mode 100644 index 000000000..f25cd04c1 --- /dev/null +++ b/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0" + nickname="Milan" + subject="chunksize" + date="2013-06-07T09:09:56Z" + content=""" +Hi! Does this backend support chunksize option? If yes, is it possible to set it after the remote has been added to the repository? +Thanks, Milan. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn b/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn new file mode 100644 index 000000000..2b038b2ca --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn @@ -0,0 +1,127 @@ +[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/) +adds support for encrypted remotes to git. The git-annex +[[gcrypt special remote|special_remotes/gcrypt]] allows git-annex to +also store its files in such repositories. Naturally, git-annex encrypts +the files it stores too, so everything stored on the remote is encrypted. + +Here are some ways you can use this awesome stuff.. + +[[!toc ]] + +This page will show how to set it up at the command line, but the git-annex +[[assistant]] can also be used to help you set up encrypted git +repositories. + +## prerequisites + +* Install +[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/) +* Install git-annex version 4.20130909 or newer. + +## encrypted backup drive + +Let's make a USB drive into an encrypted backup repository. It will contain +both the full contents of your git repository, and all the files you +instruct git-annex to store on it, and everything will be encrypted so that +only you can see it. + +First, you need to set up a gpg key. You might consider generating a +special purpose key just for this use case, since you may end up wanting to +put the key on multiple machines that you would not trust with your +main gpg key. + +You need to tell git-annex the keyid of the key when setting up the +encrypted repository: + + git init --bare /mnt/encryptedbackup + git annex initremote encryptedbackup type=gcrypt gitrepo=/mnt/encryptedbackup keyid=$mykey + git annex sync encryptedbackup + +Now you can copy (or even move) files to the repository. After +sending files to it, you'll probably want to do a sync, which pushes +the git repository changes to it as well. + + git annex copy --to encryptedbackup ... + git annex sync encryptedbackup + +Note that if you lose your gpg key, it will be *impossible* to get the +data out of your encrypted backup. You need to find a secure way to store a +backup of your gpg key. Printing it out and storing it in a safe deposit box, +for example. + +You can actually specifiy keyid= as many times as you like to allow any one +of a set of gpg keys to access this repository. So you could add a friend's +key, or another gpg key you have. + +To restore from the backup, just plug the drive into any machine that has +the gpg key used to encrypt it, and then: + + git clone gcrypt::/mnt/encryptedbackup restored + cd restored + git annex enableremote encryptedbackup gitrepo=/mnt/encryptedbackup + git annex get --from encryptedbackup + +## encrypted git-annex repository on a ssh server + +If you have a ssh server that has rsync installed, you can set up an +encrypted repository there. Works just like the encrypted drive except +without the cable. + +First, on the server, run: + + git init --bare encryptedrepo + +(Also, install git-annex on the server if it's possible & easy to do so. +While this will work without git-annex being installed on the server, it +is recommended to have it installed.) + +Now, in your existing git-annex repository, set up the encrypted remote: + + git annex initremote encryptedrepo type=gcrypt gitrepo=ssh://my.server/home/me/encryptedrepo keyid=$mykey + git annex sync encryptedrepo + +If you're going to be sharing this repository with others, be sure to also +include their keyids, by specifying keyid= repeatedly. + +Now you can copy (or even move) files to the repository. After +sending files to it, you'll probably want to do a sync, which pushes +the git repository changes to it as well. + + git annex copy --to encryptedrepo ... + git annex sync encryptedbackup + +Anyone who has access to the repo it and has one of the keys +used to encrypt it can check it out: + + git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo + cd myrepo + git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo + git annex get --from encryptedrepo + +## private encrypted git remote on hosting site + +You can use gcrypt to store your git repository in encrypted form on any +hosting site that supports git. Only you can decrypt its contents. +Using it this way, git-annex does not store large files on the hosting site; it's +only used to store your git repository itself. + + git remote add encrypted gcrypt::ssh://hostingsite/myrepo.git + git push encrypted master git-annex + +Now you can carry on using git-annex with your new repository. For example, +`git annex sync` will sync with it. + +To check out the repository from the hosting site, use the same gcrypt:: +url you used when setting it up: + + git clone gcrypt::ssh://hostingsite/myrepo.git + +## multiuser encrypted git remote on hosting site + +Suppose two users want to share an encrypted git remote. Both of you +need to set up the remote, and configure gcrypt to encrypt it so that both +of you can see it. + + git remote add sharedencrypted gcrypt::ssh://hostingsite/myrepo.git + git config remote.sharedencrypted.gcryt-participants "$mykey $friendkey" + git push sharedencrypted master git-annex diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment new file mode 100644 index 000000000..4ee70bcd7 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 10" + date="2013-11-04T17:58:36Z" + content=""" +> \"We could symetrically encrypt the repository with a keyfile that's stored in the repository itself\" +> Then you would need to decrypt the repository in order get the key you need to decrypt the repository. The impossibility of this design is why I didn't do that! + +Sorry, I ment that the file containing the symmetric encryption key should obviously not be used to encrypt itself, it would be stored in the repository \"unencrypted\" (but protected with a passphrase) + +> store a non-encrypted gpg key alongside the repsitory encrypted with it, but then you have to rely on a passphrase for all your security. + +Exactly. I think such a mode be a great addition. It might not be as secure as encryption based on a private key - depending on the passphrase strength -, but it would certainly be a lot more convenient and portable (and still much more secure than the shared encryption method). +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment new file mode 100644 index 000000000..9aab8b22e --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlY4LE-xEyztjJeXSot7JIGGFWgBfabgwc" + nickname="Peter" + subject="GPG Key specification" + date="2013-12-09T13:32:51Z" + content=""" +Hi there, + +I try to follow the instructions provided here but I don't manage it to get my repo encrypted. Here are the steps: + +1) git init --bare Encrypted +2) git-annex init +3) git annex initremote encryptedbackup type=gcrypt gitrepo=~/tmp/Encrypted encryption=pubkey keyid=DXXXX + +The last step takes a lof of time to run. Basically my key doesn't get used at all: + + # ps -ax | grep gpg + 4743 pts/4 SL+ 0:00 gpg --quiet --trust-model always --gen-random --armor 2 256 + 4753 pts/0 S+ 0:00 grep gpg + + +... instead a new pgp key is generated. How comes??! + +Any help would be appreciated. + +Thx and cheers, + +cyneox + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment new file mode 100644 index 000000000..182b5eabb --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 12" + date="2013-12-12T19:27:23Z" + content=""" +@Peter, in your example, it *is* going to use your gpg key to encrypt files. gpg is being used to generate a 256 bit random value (not a key), which will be used as a random seed for HMAC scrambling of the keys stored in the encrypted special remote. + +If that's taking too long to generate for your liking, you can pass --fast, which will make gpg use /dev/urandom to generate it rather than /dev/random. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment new file mode 100644 index 000000000..7bce4c1c2 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://jspk.clavid.com/" + nickname="flabbergast" + subject="gcrypted repository structure" + date="2013-12-30T12:07:44Z" + content=""" +I'm a bit confused about how do the gcrypted repositories actually work with git-annex. As far as I can tell, using git-remote-gcrypt with pure git produces a directory containing a couple of files with names looking like hashes. These files contain the whole repository - I checked by cloning the encrypted repo. + +With git-annex: The instructions on this page suggest first creating a bare repo (creating a normal git repo layout). When I do this and then do the next step (`git annex initremote ...`) git-remote-gcrypt complains that the repository doesn't exist (which is correct from its point of view, as there is no encrypted repo yet) and creates a new one (so now there are both structures of a bare git repo _and_ an encrypted repo alongside in the same directory). The setup sort of works, but the bare git repo is never touched after that (or at least it shouldn't be, as it has nothing to do with the encrypted repo). + +I've tried also following the instructions, only skipping the first step entirely (ie. no bare repo created). As far as I can tell, git-remote-gcrypt will run \"fine\" (will create a new encrypted repo), but git-annex itself complains that \"could not lock config file \/.git/config\" and quits. Interestingly enough, the following gets around this \"problem\" and also results in a working setup (`~/annex` is a git-annex repo). + + cd ~/annex + mkdir -p /tmp/test/.git + touch /tmp/test/.git/config + git annex initremote encr type=gcrypt gitrepo=/tmp/test keyid=\"XXX\" + git annex sync encr + +Then `git clone gcrypt::/tmp/test restored` will successfully recover the whole git-annex repo into `restored`. + +So finally the question: is creating a bare git repo really necessary; and if not, is writing into `.git/config` necessary? + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment new file mode 100644 index 000000000..6df29f991 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 14" + date="2013-12-31T19:26:55Z" + content=""" +@flabbergast, you seem to be confused about how git-remote-gcrypt stores its data. The data is stored as git commits inside a bare repository. That is why the instructions say to create a bare repository first. (I think it's also possible to use git-remote-gcrypt in a rsync mode where it just uploads encrypted files to an empty directory and does not use a bare git repository, but git-annex does not use it like that.) + +Your mkdir and touch commands effecetively create a bare git repository too. + +If you're having a problem, I suggest filing a bug report (not a comment on this page) with the full details. The examples show on this page have been tested, and work. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment new file mode 100644 index 000000000..71305e650 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="Is there a way to specify a preferred pgp key?" + date="2013-11-01T18:57:38Z" + content=""" +Hi, + +I think the current behavior of the special remote is a bit annoying when one has several pgp keys. + +Indeed, I've followed the encrypted backup drive example specifying the id of a dedicated key in the initremote step, so far so good. Doing that, I was prompted for my key phrase by the gnome keyring daemon, as expected. + +The annoying part starts right at the git annex sync step. Indeed, when git-remote-gcrypt tries to decrypt the manifest from the encrypted remote, rather than trying only the key specified during the initremote step, it tries all my (secret) keys. This means that I get prompted for the key phrase of all those keys (minus the correct one which is already unlocked...). + +In the future, this might possible to avoid by allowing gcrypt to fetch a preferred key from git config and to use with the --try-secret-key option available gnupg 2.1.x. But for 1.x or 2.0.x, the simpler option --default-key does not seem to alter the order in which keys are tried to decrypt the manifest. Also, it does not seem to be a problem of the gnome keyring daemon, but rather a gpg problem as when the daemon is replaced by the standard gpg-agent, the same problem occurs. + +Meanwhile, is there any way to avoid this problem? +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment new file mode 100644 index 000000000..b154263fe --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="A possible solution" + date="2013-11-02T14:22:13Z" + content=""" +I'm answering to myself :-). A possible solution to the annoying pass phrase asking with current gnupg is to use a specialized secret keyring. One first exports the secret key used for this repository in a specific keyring as follows: + +`gpg --export-secret-keys keyid | gpg --import --no-default-keyring --secret-keyring mygitannexsecret.gpg` + +This will create a keyring in $HOME/.gnupg with only the specific key. + +Then, in the git-remote-gcrypt shell script, gpg should be called as follows + +`gpg --no-default-keyring --secret-keyring mygitannexsecret.gpg -q -d ...` + +when decrypting the manifest in order to try only the specific key. This behavior can be easily triggered via some git configuration variable. + +Any comment? + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment new file mode 100644 index 000000000..0ce74d767 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T17:32:28Z" + content=""" +Fabrice, I've filed a bug report about this: +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment new file mode 100644 index 000000000..9b1307df4 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 4" + date="2013-11-03T22:35:07Z" + content=""" +The way I would want to setup git-annex (assistant) is \"Wuala/Spideroak style\": two computers with a full checkout of the repository, changes automatically being synced between them, even if the two computers are never online simultaneously, and encryption should be done locally: the (special) remote should not be able to view file listings or content. + +Do I understand it correctly that the gcrypt remote is the only way to make this happen? I tried to create such a setup via the webapp but failed. Adding the repository and remote (via \"Encrypt with GnuPG key\") on the first computer went OK*, but trying to enable that remote on the other computer fails: clicking enable asks me for the SSH password, but after that I just get redirected to a blank screen, with nothing to see in the logfile after the succesful call to ssh-keygen. No entry for the second computer is being added to authorized_keys on the remote. + +Perhaps this is because at this point the assistant is unable to actually parse the content of the encrypted repository? I tried importing the private key that was used while creating the repository on the other computer, but that made no difference. + +Thinking about this for a while, I believe gpg keys aren't actually particularly suited for this usecase. Even without the bug above, one would either have to awkwardly copy a private key to all hosts that are syncing to the repository; or, every time a new (or reinstalled) host wants to sync the repository, you would manually have to add the new keyid to the config and do the forced push + GCRYPT_FULL_REPACK, presumably having to reupload your entire history. Apart from this, having to backup a private key (outside of your git-annex based backups!) would be quite inconvenient. + +How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository. + +*although it erroneously used \"E0D2F776E7F674E3\" as key-id while the actual id is E7F674E3; where did that other half come from? +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment new file mode 100644 index 000000000..8e767254c --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 5" + date="2013-11-04T04:40:53Z" + content=""" +> How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository. + +Isn't that what the regular shared-encryption remote already does? Except it doesn't put a passphrase on the key, because anyone who has access to the local repo wouldn't need access to the remote one anyway. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment new file mode 100644 index 000000000..1a5d7f6e1 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 6" + date="2013-11-04T07:39:21Z" + content=""" +> _How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository._ + +As Adam wrote, without a passphrase, this is the shared encryption method. With an encrypted key, this is more or less the hybrid (default) scheme. The thing is that you have to share a secret to have a encrypted remote. I don't use the webapp, so I don't know what's happening in your case, but this is how it should work with the command line tools. First Alice create the encrypted remote with her pgp key. As far as I understand, git annex creates (via gpg) a key for a symmetric cypher which is stored in the repository, encrypted with Alice public key. If Alice wants to share the repository with Bob, she must either give a key pair (so the private key also, of course) to Bob or ask Bob for his public key. In the first case, Bob can clone the repository directly (upon reception of the key pair), while in the second case, Alice has to active Bob's public key (with `git annex enableremote myremote keyid+=bobsId`). In this case, again as far as I understand, the symmetric key is reencrypted for both Alice and Bob in the repo. + +I understand that you tried the first case with the webapp and that it did not work. I had a similar problem documented in this [http://git-annex.branchable.com/bugs/git-annex-shell:_gcryptsetup_permission_denied](bug). Maybe you could had some comments to this bug description? + +> _*although it erroneously used \"E0D2F776E7F674E3\" as key-id while the actual id is E7F674E3; where did that other half come from?_ + +This is the long id of your pgp key (16 characters as opposed to 8 for the short id). +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment new file mode 100644 index 000000000..dfb2a3b92 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 7" + date="2013-11-04T09:01:13Z" + content=""" +Thanks for the responses. Please correct me if I'm wrong, but the way I understood it, using the shared encryption scheme creates a conflict between \"changes being synced between them, even if the two computers are never online simultaneously\" and \"encryption should be done locally: the (special) remote should not be able to view file listings or content.\" + +- If I use shared encryption \"the webapp way\", only the file contents will be rsynced to the remote, not the repository itself. This means that different hosts are unable to sync unless they are online simultaneously, so that commit data can be sent directly between them via XMPP. In practice, this would mean my hosts are never synced (because I don't keep my home computer running when I leave for work, and vice versa) + +- If I use shared encryption and additionally put the repository itself on a remote, that remote would have the keys to fully decrypt the repository, that's not acceptable. + +Reading through the docs again, the hybrid scheme actually seems to be closer to what I want than the shared scheme, but it still has a major downside: the encryption only applies to the files itself, so in order to get \"offline sync\" there still has to be a 'remote' for the repository itself, which will contain all your metadata unencrypted. And also it would depend on the user being able to manually setup and backup a set of gpg keys instead of just memorizing a secure passphrase. + +@Fabrice Looks like the bug you found could very well be the cause of the problem I had; I'll try it again when a new version is available. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment new file mode 100644 index 000000000..86f3f5cad --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 8" + date="2013-11-04T10:31:56Z" + content=""" +I think you are (at least partially) right. Of course, the only way to sync completely computers that are not on together is to use either a usb drive or a third always on computer. (I've to confess I did not understand first when I read git annex docs, shame on me ;-) If you don't want to trust completely this computer (I don't, for instance), you must : + +* use an encrypted git repository on this computer; + +* and use either hybrid or pubkey encryption. + +But contrarily to what you seem to imply (I hope I understand you correctly), if you do that, the third computer can still figure out a few things (usage patterns, such as where connections come from), but that's all. You've got full sync and everything is encrypted, both the git part and the files handled by the annex. This applied only to encrypted git special remotes as other remotes do not store the git part. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment new file mode 100644 index 000000000..24e5f5b83 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 9" + date="2013-11-04T17:07:55Z" + content=""" +\"We could symetrically encrypt the repository with a keyfile that's stored in the repository itself\" + +Then you would need to decrypt the repository in order get the key you need to decrypt the repository. The impossibility of this design is why I didn't do that! + +It would certainly be possible to store a non-encrypted gpg key alongside the repsitory encrypted with it, but then you have to rely on a passphrase for all your security. + +You should file a bug report for the bug you saw.. +"""]] diff --git a/doc/tips/googledriveannex.mdwn b/doc/tips/googledriveannex.mdwn new file mode 100644 index 000000000..d628173e9 --- /dev/null +++ b/doc/tips/googledriveannex.mdwn @@ -0,0 +1,32 @@ +googledriveannex 0.2.0 +========= + +Hook program for gitannex to use Google Drive as backend + +# Requirements: + + python2 + python-httplib2 + +Credit for the googledrive api interface goes to google + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/googledriveannex.git + +This should make a ~/googledriveannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/googledriveannex; chmod +x git-annex-remote-googledrive; sudo ln -sf `pwd`/git-annex-remote-googledrive /usr/local/bin/git-annex-remote-googledrive + +# Commands for gitannex: + + git annex initremote googledrive type=external externaltype=googledrive encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. Authenticate and you will be proved with a code. + + OAUTH='authentication code' git annex initremote googledrive type=external externaltype=googledrive encryption=shared folder=gitannex + git annex describe googledrive "the googledrive library" diff --git a/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment b/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment new file mode 100644 index 000000000..aac4a8e08 --- /dev/null +++ b/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmlnEK_po7A0xMC9Xdp0FdcBgYllsCORXM" + nickname="Johnny" + subject="Shared google drive on multiple hosts" + date="2014-03-14T16:40:11Z" + content=""" +I have now configured my Googledrive on Laptop1 according to the guide above, how do I add the same remote on Laptop2? It would be nice if this was described in the guide, include where the encryption keys are stored. + +"""]] diff --git a/doc/tips/googledriveannex/comment_2_c98c00e87bc921158c9c3698fd9f89c9._comment b/doc/tips/googledriveannex/comment_2_c98c00e87bc921158c9c3698fd9f89c9._comment new file mode 100644 index 000000000..e90903b19 --- /dev/null +++ b/doc/tips/googledriveannex/comment_2_c98c00e87bc921158c9c3698fd9f89c9._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl64jV2rE8GMogJ6XuqESSkz78RVBgVdGw" + nickname="Mesut" + subject="I can't add google drive as remote" + date="2014-04-10T07:55:56Z" + content=""" +Hi, + +I am new to git-annex and I want to use google drive as remote but I can't. + +I create syslink to `googledriveannex` in `/usr/local/bin`. + +When I execute below command, command waiting but not make anything: + +`$ git annex initremote googledrive type=external externaltype=googledrive encryption=shared folder=gitannex` + +`initremote googledrive (encryption setup)` # Waiting but does not do anything. + +What I am doing wrong? + +Thanks for helps + +"""]] diff --git a/doc/tips/googledriveannex/comment_3_e7ba5620c0946874f0ae1287f99d1177._comment b/doc/tips/googledriveannex/comment_3_e7ba5620c0946874f0ae1287f99d1177._comment new file mode 100644 index 000000000..c80dbf01f --- /dev/null +++ b/doc/tips/googledriveannex/comment_3_e7ba5620c0946874f0ae1287f99d1177._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 3" + date="2014-04-17T20:58:41Z" + content=""" +@Mesut, I think you're doing everything right. It can take a long time for the highly secure gpg key to be generated. Sit tight and let it finish, or you can pass --fast to generate a key that is a tiny bit less secure. +"""]] diff --git a/doc/tips/googledriveannex/comment_4_239091adaea6ae39fa9a4d9719667a98._comment b/doc/tips/googledriveannex/comment_4_239091adaea6ae39fa9a4d9719667a98._comment new file mode 100644 index 000000000..7c9675045 --- /dev/null +++ b/doc/tips/googledriveannex/comment_4_239091adaea6ae39fa9a4d9719667a98._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="donkeyicydragon" + subject="Googledrive annex on second repository" + date="2014-04-19T20:45:23Z" + content=""" +Hi Johnny, + +I wrote a patch for googledriveannex that fixed this problem for me. First you add the google drive special remote in repo1 then you clone repo1 into repo2. In repo2 you do \"git annex enableremote googldrivespecialremotename\" and it should work. +The problem was that the init method, that is called by git annex when a special remote is first created but also when it is enabled somewhere else, did not factor in the possibility that it had already been created. +I will simultaneously submit the patch to the author of the special remote plugin but here it is for you to quickly get going: + + diff --git a/git-annex-remote-googledrive b/git-annex-remote-googledrive + index 49cd917..c8e70f3 100755 + --- a/git-annex-remote-googledrive + +++ b/git-annex-remote-googledrive + @@ -330,13 +330,16 @@ def initremote(line): + oauth = os.getenv(\"OAUTH\") or \"\" + encryption = common.getConfig(\"encryption\") + myfolder = common.getConfig(\"folder\") + - stored_creds = sys.modules[\"__main__\"].login({\"oauth\": oauth}) + - if len(myfolder) and stored_creds: + - common.sprint('SETCONFIG myfolder ' + myfolder + '') + - common.sprint('SETCONFIG stored_creds ' + json.dumps(stored_creds) + '') + - common.sprint('INITREMOTE-SUCCESS') + + if not common.getConfig(\"stored_creds\"): + + stored_creds = sys.modules[\"__main__\"].login({\"oauth\": oauth}) + + if len(myfolder) and stored_creds: + + common.sprint('SETCONFIG myfolder ' + myfolder + '') + + common.sprint('SETCONFIG stored_creds ' + json.dumps(stored_creds) + '') + + common.sprint('INITREMOTE-SUCCESS') + + else: + + common.sprint('INITREMOTE-FAILURE You need to set OAUTH environment variables and folder and encryption parameters when running initremote.') + else: + - common.sprint('INITREMOTE-FAILURE You need to set OAUTH environment variables and folder and encryption parameters when running initremote.') + + common.sprint('INITREMOTE-SUCCESS') + common.log(\"Done\") + + def prepare(line): + -- +"""]] diff --git a/doc/tips/imapannex.mdwn b/doc/tips/imapannex.mdwn new file mode 100644 index 000000000..eed2d4ab7 --- /dev/null +++ b/doc/tips/imapannex.mdwn @@ -0,0 +1,25 @@ +imapannex 0.2.0 +========= + +Hook program for gitannex to use imap as backend + +# Requirements: + + python2 + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/imapannex.git + +This should make a ~/imapannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/imapannex; chmod +x git-annex-remote-imap; sudo ln -sf `pwd`/git-annex-remote-imap /usr/local/bin/git-annex-remote-imap + +# Commands for gitannex: + + USERNAME="username@provider.com" PASSWORD="password" git annex initremote imap type=external externaltype=imap encryption=shared folder=gitannex method="Normal password" ssl="SSL/TLS" host="imap.host.com" port="993" + git annex describe imap "the imap library" diff --git a/doc/tips/megaannex.mdwn b/doc/tips/megaannex.mdwn new file mode 100644 index 000000000..46bab4aef --- /dev/null +++ b/doc/tips/megaannex.mdwn @@ -0,0 +1,29 @@ +megaannex 0.2.0 +========= + +Hook program for gitannex to use mega.co.nz as backend + +# Requirements: + + python2 + requests>=0.10 + pycrypto + +Credit for the mega api interface goes to: https://github.com/richardasaurus/mega.py + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/megaannex.git + +This should make a ~/megaannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/megaannex; chmod +x git-annex-remote-mega; sudo ln -sf `pwd`/git-annex-remote-mega /usr/local/bin/git-annex-remote-mega + +# Commands for gitannex: + + USERNAME="user" PASSWORD="pword" git annex initremote mega type=external externaltype=mega encryption=shared folder=gitannex + git annex describe mega "the mega.co.nz library" diff --git a/doc/tips/metadata_driven_views.mdwn b/doc/tips/metadata_driven_views.mdwn new file mode 100644 index 000000000..5128c18e2 --- /dev/null +++ b/doc/tips/metadata_driven_views.mdwn @@ -0,0 +1,152 @@ +git-annex now has support for storing +[[arbitrary metadata|metadata]] about annexed files. For example, this can be +used to tag files, to record the author of a file, etc. The metadata is +synced around between repositories with the other information git-annex +keeps track of. + +One nice way to use the metadata is through **views**. You can ask +git-annex to create a view of files in the currently checked out branch +that have certian metadata. Once you're in a view, you can move and copy +files to adjust their metadata further. Rather than the traditional +hierarchical directory structure, views are dynamic; you can easily +refine or reorder a view. + +Let's get started by setting some tags on files. No views yet, just some +metadata: + +[[!template id=note text=""" +To avoid needing to manually tag files with the year (and month), +run `annex.genmetadata true`, and git-annex will do it for you +when adding files. +"""]] + + # git annex metadata --tag todo work/2014/* + # git annex metadata --untag todo work/2014/done/* + # git annex metadata --tag urgent work/2014/presentation_for_tomorrow.odt + # git annex metadata --tag done work/2013/* work/2014/done/* + # git annex metadata --tag work work + # git annex metadata --tag video videos + # git annex metadata --tag work videos/operating_heavy_machinery.mov + # git annex metadata --tag done videos/old + # git annex metadata --tag new videos/lotsofcats.ogv + # git annex metadata --tag sound podcasts + # git annex metadata --tag done podcasts/*/old + # git annex metadata --tag new podcasts/*/recent + +So, you had a bunch of different kinds of files sorted into a directory +structure. But that didn't really reflect how you approach the files. +Adding some tags lets you categorize the files in different ways. + +Ok, metadata is in place, but how to use it? Time to change views! + + # git annex view tag=* + view (searching...) + + Switched to branch 'views/_' + ok + +[[!template id=note text=""" +Notice that a single file may appear in multiple directories +depending on its tags. For example, `lotsofcats.ogv` is in +both `new/` and `video/`. +"""]] + +This searched for all files with any tag, and created a new git branch +that sorts the files according to their tags. + + # tree -d + work + todo + urgent + done + new + video + sound + +Ah, but you're at work now, and don't want to be distracted by cat videos. +Time to filter the view: + + # git annex vfilter tag=work + vfilter + Switched to branch 'views/(work)/_' + ok + +Now only the work files are in the view, and they're otherwise categorized +according to their other tags. So you can check the `urgent/` directory +to see what's next, and look in `todo/` for other work related files. + +Now that you're in a tag based view, you can move files around between the +directories, and when you commit your changes to git, their tags will be +updated. + + # git mv urgent/presentation_for_tomorrow_{work;2014}.odt ../done + # git commit -m "a good day's work" + metadata tag-=urgent + metadata tag+=done + +You can return to a previous view by running `git annex vpop`. If you pop +all the way out of all views, you'll be back on the regular git branch you +originally started from. You can also use `git checkout` to switch between +views and other branches. + +## fields + +Beyond simple tags and directories, you can add whatever kinds of metadata +you like, and use that metadata in more elaborate views. For example, let's +add a year field. + + # git checkout master + # git annex metadata --set year=2014 work/2014 + # git annex metadata --set year=2013 work/2013 + # git annex view year=* tag=* + +Now you're in a view with two levels of directories, first by year and then +by tag. + + # tree -d + 2014 + |-- work + |-- todo + |-- urgent + `-- done + 2013 + |-- work + `-- done + +Oh, did you want it the other way around? Easy! + + # git annex vcycle + # tree -d + work + |-- 2014 + `-- 2013 + todo + `-- 2014 + urgent + `-- 2014 + done + |-- 2014 + `-- 2013 + +## location fields + +Let's switch to a view containing only new podcasts. And since the +podcasts are organized into one subdirectory per show, let's +include those subdirectories in the view. + + # git checkout master + # git annex view tag=new podcasts/=* + # tree -d + This_Developers_Life + Escape_Pod + GitMinutes + The_Haskell_Cast + StarShipSofa + +That's an example of using part of the directory layout of the original +branch to inform the view. Every file gets fields automatically set up +corresponding to the directory it's in. So a file"foo/bar/baz/file" has +fields "/=foo", "foo/=bar", and "foo/bar/=baz". These location fields +can be used the same as other metadata to construct the view. + +This has probably only scratched the surface of what you can do with views. diff --git a/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment b/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment new file mode 100644 index 000000000..808a332af --- /dev/null +++ b/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlFZFMFm-AapYAgV_V5X9HRJxWvhdiX9fY" + nickname="Reiner" + subject="comment 1" + date="2014-03-24T21:11:31Z" + content=""" +I have played around with views and found out that I can create new tags by creating directories in the view and that I can created files in those new directories that are not contained in the original working tree. The behavoiur of git annex in this behaviour is a bit strange. + +Assume for example you have a file \"foo\" with tag \"t1\" and switch to the tag view. Then create a directory \"t2\" and a file \"bar\" in it. Add the file, sync, and switch back to the master branch. If you enter the tag view again, the directory \"t2\" will be vanished, i.e. your newly created file is gone, too. This is not surprising, as the file has never been added to the original working tree. However, another \"git annex sync\" will restore the file. + +I am unsure what behaviour I would expect, maybe it shouldn't be possible to files to a view in the first place, or newly created files might be collected in a separate branch. On the other hand, it seems reasonable to add a new file with a new tag at the same time. Anyway, I found it confusing that I can seemingly lose a file like this. It took me a bit of time to figure out that another sync recovers the file. +"""]] diff --git a/doc/tips/metadata_driven_views/comment_2_13ae4e3668b693c0eefaca23b88515cf._comment b/doc/tips/metadata_driven_views/comment_2_13ae4e3668b693c0eefaca23b88515cf._comment new file mode 100644 index 000000000..3ec563311 --- /dev/null +++ b/doc/tips/metadata_driven_views/comment_2_13ae4e3668b693c0eefaca23b88515cf._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="possible to have a view based on file location info?" + date="2014-06-08T03:55:24Z" + content=""" +For example, I'd like to have a view that only contains files present in this git-annex repository (no dangling symlinks). + +"""]] diff --git a/doc/tips/migrating_data_to_a_new_backend.mdwn b/doc/tips/migrating_data_to_a_new_backend.mdwn new file mode 100644 index 000000000..b9acb8bd1 --- /dev/null +++ b/doc/tips/migrating_data_to_a_new_backend.mdwn @@ -0,0 +1,16 @@ +Maybe you started out using the WORM backend, and have now configured +git-annex to use SHA1. But files you added to the annex before still +use the WORM backend. There is a simple command that can migrate that +data: + + # git annex migrate my_cool_big_file + migrate my_cool_big_file (checksum...) ok + +You can only migrate files whose content is currently available. Other +files will be skipped. + +After migrating a file to a new backend, the old content in the old backend +will still be present. That is necessary because multiple files +can point to the same content. The `git annex unused` subcommand can be +used to clear up that detritus later. Note that hard links are used, +to avoid wasting disk space. diff --git a/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn b/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn new file mode 100644 index 000000000..8f078c78b --- /dev/null +++ b/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn @@ -0,0 +1,77 @@ +Scenario +-------- + +You are a new git-annex user. You have already files spread around many computers and wish to migrate those into git-annex, without having to recopy all files all over the place. + +Let's say, for example, you have a server, named `marcos` and a workstation named `angela`. You have your audio collection stored in `/srv/mp3` in `marcos` and `~/mp3` on `angela`, but only `marcos` has all the files, and `angela` only has a subset. + +We also assume that `marcos` has an SSH server. + +How do you add all this stuff to git-annex? + +Create the biggest git-annex repository +--------------------------------------- + +Start with `marcos`, with the complete directory: + + cd /srv/mp3 + git init + git annex init + git annex add . + git commit -m "git annex yay" + +This will checksum all files and add them to the `git-annex` branch of the git repository. Wait for this process to complete. + +Create the smaller repo and synchronise +--------------------------------------- + +On `angela`, we want to synchronise the git annex metadata with `marcos`. We need to initialize a git repo with `marcos` as a remote: + + cd ~/mp3 + git init + git remote add marcos marcos.example.com:/srv/mp3 + git fetch marcos + git annex info # this should display the two repos + git annex add . + +This will, again, checksum all files and add them to git annex. Once that is done, you can verify that the files are really the same as marcos with `whereis`: + + git annex whereis + +This should display something like: + + whereis Orange Seeds/I remember.wav (2 copies) + b7802161-c984-4c9f-8d05-787a29c41cfe -- marcos (anarcat@marcos:/srv/mp3) + c2ca4a13-9a5f-461b-a44b-53255ed3e2f9 -- here (anarcat@angela) + ok + +Once you are sure things went on okay, you can synchronise this with `marcos`: + + git annex sync + +This will push the metadata information to marcos, so it knows which files are available on `angela`. From there on, you can freely get and move files between the two repos! + +Importing files from a third directory +-------------------------------------- + +Say that some files on `angela` are actually spread out outside of the `~/mp3` directory. You can use the `git annex import` command to add those extra directories: + + cd ~/mp3 + git annex import ~/music/ + +(!) Be careful that `~/music` is not a git-annex repository, or this will [[destroy it!|bugs/git annex import destroys a fellow git annex repository]]. + +Deleting deleted files +---------------------- + +It is quite possible some files were removed (or renamed!) on `marcos` but not on `angela`, since it was synchronised only some time ago. A good way to find out about those files is to use the `--not --in` argument, for example, on `angela`: + + git annex whereis --in here --not --in marcos + +This will show files that are on `angela` and not on `marcos`. They could be new files that were only added on `angela`, so be careful! A manual analysis is necessary, but let's say you are certain those files are not relevant anymore, you can delete them from `angela`: + + git annex drop + +If the file is a renamed or modified version from the original, you may need to use `--force`, but be careful! If you delete the wrong file, it will be lost forever! + +> (!) Maybe this wouldn't happen with [[direct mode]] and an fsck? --[[anarcat]] diff --git a/doc/tips/offline_archive_drives.mdwn b/doc/tips/offline_archive_drives.mdwn new file mode 100644 index 000000000..1063cbc26 --- /dev/null +++ b/doc/tips/offline_archive_drives.mdwn @@ -0,0 +1,69 @@ +After you've used git-annex for a while, you will have data in your repository +that you don't want to keep in the limited disk space of a laptop or a server, +but that you don't want to entirely delete. + +This is where git-annex's support for offline archive drives shines. +You can move old files to an archive drive, which can be kept offline if +it's not practical to keep it spinning. Better, you can move old files to +two or more archive drives, in case one of them later fails to spin up. +(One consideration when [[future_proofing]] your archive.) + +To set up an archive drive, you can take any removable drive, format +it with a filesystem you'll be able to read some years later, and then follow +the [[walkthrough]] to set up a repository on it that is a git remote of +the repository in your computer you want to archive. In short: + + cd /media/archive + git clone ~/annex + cd ~/annex + git remote add archivedrive /media/archive/annex + git annex sync archivedrive + +Don't forget to tell git-annex this is an archive drive (or a backup +drive; see [[preferred_content]].). Also, give the drive a description that matches something you write on +its label, so you can find it later: + + git annex group archivedrive archive + git annex wanted archivedrive standard + git annex describe archivedrive "my first archive drive (SATA)" + +Or you can use the assistant to set up the drive for you. +(Nice video tutorial here: [[videos/git-annex_assistant_archiving]]) + +(Keeping the archive drive in an offsite location? Consider encrypting +it! See [[fully_encrypted_git_repositories_with_gcrypt]].) + +Then, when the archive drive is plugged in, you can easily copy files to +it: + + cd ~/annex + git-annex copy --auto --to archivedrive + +Or, if you're using the assistant, it will automatically notice when the drive +gets plugged in and copy files that need to be archived. + +When you want to get rid of the local file, leaving only the copy on the +archive, you can just: + + git annex drop file + +The archive drive has to be plugged in for this to work, so git-annex +can verify it still has the file. If you had configured git-annex to +always store 2 [[copies]], it will need 2 archive drives plugged in. +You may find it useful to configure a [[trust]] setting for the drive to +avoid needing to haul it out of storage to drop a file. + +Now the really nice thing. When your archive drive gets filled up, you +can simply remove it, store it somewhere safe, and replace it with a new +drive, which can be mounted at the same location for simplicity. Set up +the new drive the same way described above, and use it to archive even more +files. + +Finally, when you want to access one of the files you archived, you can +just ask for it: + + git annex get file + +If necessary git-annex will tell you which archive drive you need to +pull out of storage to get the file back. This is where the description +you entered earlier comes in handy. diff --git a/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment b/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment new file mode 100644 index 000000000..5855b0f7a --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="git annex sync" + date="2013-10-06T08:59:24Z" + content=""" +Shouldn't it be +git annex sync archivedrive +instead of +git annex sync archive +in the first examples. As the name of the remote is \"archivedrive\", IMO \"sync\" should be called with the name of the remote. +"""]] diff --git a/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment b/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment new file mode 100644 index 000000000..3ff074ff3 --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="git annex copy not working" + date="2013-10-06T10:18:10Z" + content=""" +Is the feature \"git-annex copy --auto --to usb\" working? +I have created a backup repo on my usb drive but when I call \"git-annex copy --auto --to usb\" nothing happens. + +I have called \"git annex group usb backup\" and \"git annex sync usb\" to set up the repo. + +What is the correct way to get the data out to the backup repo? + +Best regards, Georg +"""]] diff --git a/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment b/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment new file mode 100644 index 000000000..cd5888009 --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="thanks for your checking.." + date="2013-10-06T17:04:24Z" + content=""" +The example was missing a preferred content setting, without which --auto doesn't copy anything unless needed to satisfy numcopies: + +git annex wanted archivedrive standard +"""]] diff --git a/doc/tips/owncloudannex.mdwn b/doc/tips/owncloudannex.mdwn new file mode 100644 index 000000000..e0b6bd37c --- /dev/null +++ b/doc/tips/owncloudannex.mdwn @@ -0,0 +1,28 @@ +owncloudannex 0.2.0 +========= + +Hook program for gitannex to use owncloud as backend + +# Requirements: + + python2 + python-requests + +Credit for the webdav api interface goes to https://launchpad.net/python-webdav-lib + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/owncloudannex.git + +This should make a ~/owncloudannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/owncloudannex; chmod +x git-annex-remote-owncloud; sudo ln -sf `pwd`/git-annex-remote-owncloud /usr/local/bin/git-annex-remote-owncloud + +# Commands for gitannex: + + USERNAME="login" PASSWORD="password" git annex initremote owncloud type=external externaltype=owncloud encryption=shared folder=gitannex url="https://host/remote.php/webdav/" + git annex describe dropbox "the owncloud library" diff --git a/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment b/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment new file mode 100644 index 000000000..47e33042e --- /dev/null +++ b/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="owncloud hook exited nonzero" + date="2013-07-10T05:03:47Z" + content=""" +hi + +I got the above message, and cannot sync to my owncloud. Here is the log file i had: + +>[2013-07-10 12:30:31 HKT] main: starting assistant version 4.20130627 +(scanning...) [2013-07-10 12:30:31 HKT] Watcher: Performing startup scan +(started...) git-annex: Daemon is already running. +git-annex: Daemon is already running. +[2013-07-10 12:44:04 HKT] Committer: Adding sync2Servers.sh + +>add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 12:44:04 HKT] Committer: Committing changes to git +(gpg) + +>owncloud hook exited nonzero! +>git-annex: Daemon is already running. +[2013-07-10 12:51:07 HKT] main: Syncing with owncloud + +>owncloud hook exited nonzero! +>[2013-07-10 12:53:10 HKT] Committer: Adding 2 files +ok +(Recording state in git...) +(Recording state in git...) +add syncByRsync/DSCN1810.JPG (checksum...) ok +add syncByRsync/DSCN1810.JPG (checksum...) [2013-07-10 12:53:10 HKT] Committer: Committing changes to git + +>owncloud hook exited nonzero! +[2013-07-10 12:53:50 HKT] main: Syncing with owncloud + owncloud hook exited nonzero! + owncloud hook exited nonzero! + +thanks + +yan +"""]] diff --git a/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment b/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment new file mode 100644 index 000000000..6ea0b033c --- /dev/null +++ b/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 2" + date="2013-07-10T08:21:39Z" + content=""" +Personally i've only seen that when the server ran out of space. But lets see what is going on. + +Please run this command + +git config annex.owncloud-hook '/usr/bin/python2 ~/owncloudannex/owncloudannex.py --dbglevel 1 --stderr' + +And then replicate the error. It should give me some debug information to work with. + +"""]] diff --git a/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment b/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment new file mode 100644 index 000000000..f7e3f0ee4 --- /dev/null +++ b/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment @@ -0,0 +1,87 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 3" + date="2013-07-10T08:46:27Z" + content=""" +hi Tobias + +Thanks your suggestion for list of my error log, here it is: + +[2013-07-10 16:27:58 HKT] main: starting assistant version 4.20130627 +(scanning...) [2013-07-10 16:27:58 HKT] Watcher: Performing startup scan +(started...) [2013-07-10 16:28:14 HKT] Committer: Adding 2 files + +add syncByRsync/sync2Servers.sh (checksum...) ok +add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 16:28:14 HKT] Committer: Committing changes to git +[2013-07-10 16:31:12 HKT] Watcher: add direct DSCN1810.JPG +[2013-07-10 16:31:12 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"] +[2013-07-10 16:31:12 HKT] Committer: Adding DSCN1810.JPG +ok +(Recording state in git...) +(Recording state in git...) +add DSCN1810.JPG [2013-07-10 16:31:12 HKT](checksum...) Watcher: add direct DSCN1810.JPG +[2013-07-10 16:31:12 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"] + + DSCN1810.JPG changed while it was being added +[2013-07-10 16:31:12 HKT] Committer: delaying commit of 1 changes +[2013-07-10 16:31:13 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"] +[2013-07-10 16:31:13 HKT] Committer: Adding 2 files +failed +add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] +ok +add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012024.JPG\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] +[2013-07-10 16:31:13 HKT] Committer: committing 2 changes +[2013-07-10 16:31:13 HKT] Committer: Committing changes to git +[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit\",\"--allow-empty-message\",\"--no-edit\",\"-m\",\"\",\"--quiet\",\"--no-verify\"] +[2013-07-10 16:31:13 HKT] Committer: queued Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing : new file created +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] +[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"write-tree\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit-tree\",\"a8337a989b58b29eee5fd2fa7a4c0b8ec45d5e59\",\"-p\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] call: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-ref\",\"refs/heads/git-annex\",\"267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"symbolic-ref\",\"HEAD\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"refs/heads/master\"] +[2013-07-10 16:31:13 HKT] Transferrer: Transferring: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"] +[2013-07-10 16:31:13 HKT] call: git-annex [\"transferkeys\",\"--readfd\",\"46\",\"--writefd\",\"36\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"] +[2013-07-10 16:31:13 HKT] read:[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"cat-file\",\"--batch\"] +(gpg) [2013-07-10 16:31:13 HKT] TransferWatcher: transfer starting: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing +[2013-07-10 16:31:13 HKT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"48\",\"--symmetric\",\"--force-mdc\"] +[2013-07-10 16:31:14 HKT] call: sh [\"-c\",\"/usr/bin/python2 /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr\"] + + 16:31:16 [owncloudannex-0.1.1] : 'START' + 16:31:16 [owncloudannex-0.1.1] main : 'ARGS: 'ANNEX_ACTION=store ANNEX_KEY=GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f ANNEX_HASH_1=fp ANNEX_HASH_2=23 ANNEX_FILE=/home/yan/annex_testing/.git/annex/tmp/GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr'' + 16:31:16 [owncloudannex-0.1.1] readFile : ''/home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.conf' - 'r'' + 16:31:16 [owncloudannex-0.1.1] readFile : 'Done' + 16:31:16 [owncloudannex-0.1.1] login : '' + 16:31:16 [owncloudannex-0.1.1] login : 'Using base: wingyan.no-ip.org - {'Authorization': 'Basic Y2h1bmd5YW41QGdtYWlsLmNvbTp5YW5fd2lraQ=='}' + 16:31:16 [owncloudannex-0.1.1] login : 'res: ' + 16:31:16 [owncloudannex-0.1.1] findInFolder : 'u'gitannex'() - '/'()' + 16:31:17 [owncloudannex-0.1.1] findInFolder : 'propfind: /owncloud/remote.php/webdav - '\n\n Sabre_DAV_Exception_NotAuthenticated\n Username or password does not match\n 1.7.6\n\n'' + 16:31:17 [owncloudannex-0.1.1] findInFolder : 'Failure' + 16:31:17 [owncloudannex-0.1.1] createFolder : '/gitannex' + 16:31:18 [owncloudannex-0.1.1] createFolder : 'Failure: 401 - '\n\n Sabre_DAV_Exception_NotAuthenticated\n Username or password does not match\n 1.7.6\n\n'' + + + owncloud hook exited nonzero! +[2013-07-10 16:31:18 HKT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\", transferKey = Key {keyName = \"911ba6148fbcbe4afe53772f1216b8204f403ed4ee06cb90c3c3ac25e56d9402.JPG\", keyBackendName = \"SHA256E\", keySize = Just 1893431, keyMtime = Nothing}} + +I figured out it is a *Username or password does not match*, and i saw the content of owncloudannex.conf as \"uname\": \"myGmail@gmail.com\", but i quickly saw my WebDAV login to owncloud as my user name, not gmail address, so i changed this \"uname\": \"my_normal_user_name_not_gmail_acc\" inside owncloudannex.conf. Finally, i got it work. So, i think, user name should not be a gmail address, should be owncloud login user name. + +Another issue, i had a look into /WebDAV.../gitannex/, it is git repos. file, for my user opinion, it is better that it is a real file content that we can see the file(such as photos) by owncloud web client directly, rather that owncloud is a file server to keep git repos only. + +Thanks + +yan +"""]] diff --git a/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment b/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment new file mode 100644 index 000000000..c7a0875df --- /dev/null +++ b/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 4" + date="2013-07-10T08:54:13Z" + content=""" +Hm, an error like that it really should print without the need of debug information. I'll look into it. + +And if you want the real file content, not encrypted, just change \"shared\" to \"none\" in the line: + +git annex initremote owncloud type=hook hooktype=owncloud encryption=shared + +I'm not sure if you can change this after you initialized the remote though. And also, the folder structure and filenames will be as you see them now on the owncloud. I'd need some more data from gitannex to make it show the real directory structure. But that doesn't seem feasible. + +Why would you even want the data unencrypted on owncloud anyways? i mean on flickr, or googledocs, i kinda get it. but for owncloud? + +"""]] diff --git a/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment b/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment new file mode 100644 index 000000000..170e8b857 --- /dev/null +++ b/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 5" + date="2013-07-10T09:43:55Z" + content=""" +hi Tobias + +thanks your sharing, i am still in have a trial of git-annex, so i do not yet have real data on the server, so i just del. all and re-create both client and server repos in owncloud, i can got what you said, and see my photo. + +Actually, i am studying git-annex. 1) It can syncs the data from my client computer to server. 2) i would like that other and anywhere computers through browser can view my server data which do not need to download all data into a new client. So my original goal is i can have a web to display the content of my files, and see owncloud have a nice web. + +Regarding to GDoc, flickr, etc. they have space limitation, so i install owncloud as my own computer. I also see the , but it is not yet at roadmap. + +thanks +"""]] diff --git a/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment b/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment new file mode 100644 index 000000000..7b10068c5 --- /dev/null +++ b/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 6" + date="2013-07-10T09:50:14Z" + content=""" +A 1 terabyte limit(for flickr) should be enough for most people. No? +"""]] diff --git a/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment b/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment new file mode 100644 index 000000000..56e71276d --- /dev/null +++ b/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 7" + date="2013-07-10T09:56:54Z" + content=""" +i have not got this 1 terabyte limit from flick before. I will have a look. I still consider some my own data, it is better to keep at my own server. +"""]] diff --git a/doc/tips/powerful_file_matching.mdwn b/doc/tips/powerful_file_matching.mdwn new file mode 100644 index 000000000..47f8c8a64 --- /dev/null +++ b/doc/tips/powerful_file_matching.mdwn @@ -0,0 +1,36 @@ +git-annex has a powerful syntax for making it act on only certain files. + +The simplest thing is to exclude some files, using wild cards: + + git annex get --exclude '*.mp3' --exclude '*.ogg' + +But you can also exclude files that git-annex's [[location_tracking]] +information indicates are present in a given repository. For example, +if you want to populate newarchive with files, but not those already +on oldarchive, you could do it like this: + + git annex copy --not --in oldarchive --to newarchive + +Without the --not, --in makes it act on files that *are* in the specified +repository. So, to remove files that are on oldarchive: + + git annex drop --in oldarchive + +Or maybe you're curious which files have a lot of copies, and then +also want to know which files have only one copy: + + git annex find --copies 7 + git annex find --not --copies 2 + +The above are the simple examples of specifying what files git-annex +should act on. But you can specify anything you can dream up by combining +the things above, with --and --or -( and -). Those last two strange-looking +options are parentheses, for grouping other options. You will probably +have to escape them from your shell. + +Here are the mp3 files that are in either of two repositories, but have +less than 3 copies: + + git annex find --not --exclude '*.mp3' --and \ + -\( --in usbdrive --or --in archive -\) --and \ + --not --copies 3 diff --git a/doc/tips/recover_data_from_lost+found.mdwn b/doc/tips/recover_data_from_lost+found.mdwn new file mode 100644 index 000000000..ceb43e3f3 --- /dev/null +++ b/doc/tips/recover_data_from_lost+found.mdwn @@ -0,0 +1,19 @@ +Suppose something goes wrong, and fsck puts all the files in lost+found. +It's actually very easy to recover from this disaster. + +First, check out the git repository again. Then, in the new checkout: + + $ mkdir recovered-content + $ sudo mv ../lost+found/* recovered-content + $ sudo chown you:you recovered-content + $ chmod -R u+w recovered-content + $ git annex add recovered-content + $ git reset HEAD recovered-content + $ rm -rf recovered-content + $ git annex fsck + +The way that works is that when git-annex adds the same content that was in +the repository before, all the old links to that content start working +again. This works particularly well if the SHA* backends are used, but even +with the default backend it will work pretty well, as long as fsck +preserved the modification time of the files. diff --git a/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment b/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment new file mode 100644 index 000000000..f609d8def --- /dev/null +++ b/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWBvsZvSsAL8P2ye3F0OBStjFCVnOImzM" + nickname="Jarno" + subject="Why fsck?" + date="2014-01-02T22:09:03Z" + content=""" +Other steps I understand but what is the purpose of the last, \"git annex fsck\"? +Shouldn't \"git annex add\" recreate any missing annex files and therefore fix dangling symlinks? +"""]] diff --git a/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment b/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment new file mode 100644 index 000000000..f1afdca49 --- /dev/null +++ b/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 2" + date="2014-01-03T21:19:39Z" + content=""" +The `git annex fsck` at the end will verify if you've managed to recover all the files. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository.mdwn b/doc/tips/recovering_from_a_corrupt_git_repository.mdwn new file mode 100644 index 000000000..084f76852 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository.mdwn @@ -0,0 +1,17 @@ +I have found this the most reliable way to recover from a corrupt git repository. I have had a lot of them lately, there might be a regression in btrfs in Ubuntu's Linux 3.8.0-33 (!). + +1. Create a clone of a known good repository. +2. Add the clone as an object alternate to the broken repository. +3. Do a `git-repack -a -d` to lift the external objects into repo-local packs. +4. Remove the clone + +[[!format sh """ +$ cd /tmp/ +$ git clone good-host:/path/to/good-repo +$ cd /home/user/broken-repo +$ echo /tmp/good-repo/.git/objects/ > .git/objects/info/alternates +$ git repack -a -d +$ rm -rf /tmp/good-repo +"""]] + +... and push early, push often. ;-) diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment new file mode 100644 index 000000000..d212e23f3 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-11T16:01:59Z" + content=""" +Better, since version 4.20131024, `git annex repair` can be run to automatically do this, and more. (Including recovering data in corrupt git repositories that you forgot to push!) +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment new file mode 100644 index 000000000..c018c4ca5 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 2" + date="2013-11-12T16:14:50Z" + content=""" +I am using git-annex 20131106 and I tried `git annex repair` first. It seems git is making assumptions that if I have object A then I must have object B that A depends on. Or maybe it freaks out because the object is not missing, just full of zeroes. I haven't done any analysis on exactly what situation causes this. When I have time, I will. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment new file mode 100644 index 000000000..63f443a31 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 3" + date="2013-11-12T16:17:42Z" + content=""" +Luckily, so far the objects getting corrupted have been in past commits (maybe only in packfiles?), not the latest ones, so I have been able to recover even though HEAD has been unique to the local repo. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment new file mode 100644 index 000000000..8d454fc3e --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 4" + date="2013-11-12T17:10:06Z" + content=""" +Hm. This is bad. My hunch that btrfs was the culprit seems to have been wrong. After having switched things around, along with lots of `git annex sync` in various places, I now have a corrupt repo on ext4. It must be git or git-annex that does something wrong. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment new file mode 100644 index 000000000..eeb3ceef2 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 6" + date="2013-11-12T18:10:21Z" + content=""" +If you can reliably corrupt a git repository, it's highly likely your hardware (disk or memory) is broken. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment new file mode 100644 index 000000000..16b2329b9 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 6" + date="2013-11-12T17:22:01Z" + content=""" +This is my symptom too: [[forum/Git annex 'corrupting' itself]] +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment new file mode 100644 index 000000000..5047bcca4 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 7" + date="2013-11-12T18:12:49Z" + content=""" +> I tried git annex repair first. It seems git is making assumptions that if I have object A then I must have object B that A depends on. Or maybe it freaks out because the object is not missing + +`git annex repair` is supposed to deal with these situations. If it fails to fix such a broken repository, please file a detailed bug report, ideally with a link to a copy of the repository. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment new file mode 100644 index 000000000..78144b893 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 8" + date="2013-11-14T10:00:20Z" + content=""" +Several machines started showing this behavior around 4.20131106 or 4.20131101. I will find a way to reproduce when I can find the time. +"""]] diff --git a/doc/tips/remote_webapp_setup.mdwn b/doc/tips/remote_webapp_setup.mdwn new file mode 100644 index 000000000..57993df76 --- /dev/null +++ b/doc/tips/remote_webapp_setup.mdwn @@ -0,0 +1,49 @@ +Here's the scenario: You have a remote server you can ssh into, +and you want to use the git-annex webapp there, displaying back on your local +web browser. + +Sure, no problem! It can even be done securely! + +Let's start by making the git-annex repository on the remote server. + + git init annex + cd annex + git annex init + +Now, you need to generate a private key and a certificate for HTTPS. +These files are stored in `.git/annex/privkey.pem` and +`.git/annex/certificate.pem` inside the git repository. Here's +one way to generate those files, using a self-signed certificate: + + (umask 077 ; openssl genrsa -out .git/annex/privkey.pem 4096) + openssl req -new -x509 -key .git/annex/privkey.pem > .git/annex/certificate.pem + +With those files in place, git-annex will automatically only accept HTTPS +connections. That's good, since HTTP connections are not secure over the +big bad internet. + +All that remains is to make the webapp listen on the external interface +of the server. Normally, for security, git-annex only listens on localhost. +Tell it what hostname to listen on: + + git config annex.listen host.example.com + +(If your hostname doesn't work, its IP address certianly will..) + +When you run the webapp configured like that, it'll print out the +URL to use to open it. You can paste that into your web browser. + + git annex webapp + http://host.example.com:42232/?auth=ea7857ad... + +Notice that the URL has a big jumble of letters at the end -- this is a +secret token that the webapp uses to verify you're you. So random attackers +can't find your webapp and do bad things with it. + +If you like, you can make the server run `git annex assistant --autostart` +on boot. + +To automate opening the remote server's webapp in your local browser, +just run this: + + firefox "$(ssh host.example.com git annex webapp)" diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn new file mode 100644 index 000000000..893408c2f --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn @@ -0,0 +1,51 @@ +Sparkleshare and dvcs-autosync are tools to automatically commit your +changes to git and keep them in sync with other repositories. Unlike +git-annex, they don't store the file content on the side, but directly in +the git repository. Great for small files, less good for big files. + +Here's how to use the [[git-annex assistant|/assistant]] to do the same +thing, but even better! + +---- + +First, get git-annex version 4.20130329 or newer. + +---- + +Let's suppose you're delveloping a video game, written in C. You have +source code, and some large game assets. You want to ensure the source +code is stored in git -- that's what git's for! And you want to store +the game assets in the git annex -- to avod bloating your git repos with +possibly enormous files, but still version control them. + +All you need to do is configure git-annex to treat your C files +as small files. And treat any file larger than, say, 100kb as a large +file that is stored in the annex. + + git config annex.largefiles "largerthan=100kb and not (include=*.c or include=*.h)" + +---- + +Now if you run `git annex add`, it will only add the large files to the +annex. You can `git add` the small files directly to git. + +Note that in order to use `git add` on the small files, your repository +needs to be in indirect mode, rather than [[direct mode]]. If it's in +direct mode, `git add` will fail. You can fix that: + + git annex indirect + +---- + +A less manual option is to run `git annex assistant`. It will *automatically* +add the large files to the annex, and store the small files in git. +It'll notice every time you modify a file, and immediately commit it, +too. And sync it out to other repositories you configure using `git annex +webapp`. + +---- + +It's also possible to disable the use of the annex entirely, and just +have the assistant *always* put every file into git, no matter its size: + + git config annex.largefiles "exclude=*" diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment new file mode 100644 index 000000000..b00d961d0 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 10" + date="2013-12-12T17:35:28Z" + content=""" +The behavior is direct mode is a bug: [[bugs/when syncing a direct repository, git annex delete non annexed new git files]]. Hopefully it will be fixed soon. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment new file mode 100644 index 000000000..cc48eca66 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 11" + date="2013-12-12T19:58:53Z" + content=""" +The abovementioned bug is fixed in git, and will be in a release tomorrow. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment new file mode 100644 index 000000000..b0ff0114a --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://hands.com/~phil/" + nickname="hands" + subject="software from the future?" + date="2013-03-31T17:30:34Z" + content=""" +I think you probably meant at least version 4.20130323 ;-) +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment new file mode 100644 index 000000000..2367c938d --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-31T18:50:35Z" + content=""" +I meant 4.20130329 +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment new file mode 100644 index 000000000..91122360a --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment @@ -0,0 +1,60 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="Trying this feature" + date="2013-04-14T13:04:55Z" + content=""" +I just gave this feature a try, but it seems it doesn't work as expected or maybe I don't understand it: + + ~/annex/largefilestest % git init + ~/annex/largefilestest (git)-[master] % git annex init \"test repo\" + ~/annex/largefilestest (git)-[master] % git config annex.largefiles \"not include=*.txt\" + +Now I copy two files to this directory and add both to the annex + + ~/annex/largefilestest (git)-[master] % ll + total 100 + -rw-rw-r-- 1 tobru tobru 93709 Oct 19 16:14 dpkg-get-selections.txt + -rw-rw-r-- 1 tobru tobru 7256 Jan 6 15:52 x3400.jpg + ~/annex/largefilestest (git)-[master] % git annex add . + add x3400.jpg (checksum...) ok + (Recording state in git...) + ~/annex/largefilestest (git)-[master] % git status + # On branch master + # + # Initial commit + # + # Changes to be committed: + # (use \"git rm --cached ...\" to unstage) + # + # new file: x3400.jpg + # + # Untracked files: + # (use \"git add ...\" to include in what will be committed) + # + # dpkg-get-selections.txt + ~/annex/largefilestest (git)-[master] % ll + total 96 + -rw-rw-r-- 1 tobru tobru 93709 Oct 19 16:14 dpkg-get-selections.txt + lrwxrwxrwx 1 tobru tobru 192 Jan 6 15:52 x3400.jpg -> .git/annex/objects/vf/QX/SHA256E-s7256--60e5b69ade5619e37f7fcaa964626da9c415959d861241aa13e2516fffc2dddf.jpg/SHA256E-s7256--60e5b69ade5619e37f7fcaa964626da9c415959d861241aa13e2516fffc2dddf.jpg + +So the picture is added to the annex as expected. But the .txt file is not added to git. Do I have to manually add this to git? And why is the picture seen as new file by git? + +The second question could be answered by: \"run git annex sync\". Is this correct? Because after running this command, git does not see this file as a new file anymore: + + ~/annex/largefilestest (git)-[master] % git annex sync + commit + [master (root-commit) a0afb14] git-annex automatic sync + 1 file changed, 1 insertion(+) + create mode 120000 x3400.jpg + ok + git-annex: no branch is checked out + ~/annex/largefilestest (git)-[master] % git status + # On branch master + # Untracked files: + # (use \"git add ...\" to include in what will be committed) + # + # dpkg-get-selections.txt + nothing added to commit but untracked files present (use \"git add\" to track) + +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment new file mode 100644 index 000000000..14a909014 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-14T18:37:50Z" + content=""" +Like it says in the tip, `git annex add` will add the large files to git. You can add the small files with `git add`; git-annex won't do that for you. + +To automatically add both sorts of files, you can use the `git annex watch` or `git annex assistant` daemons. The latter also keeps files in sync between repositories automatically. + +(Why did the picture show up as a new file in git? Because you hadn't committed it. This is the same as when you `git add` a file; +it's only staged in the index; `git status` will show it is new until you `git commit`) +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment new file mode 100644 index 000000000..5d638a3b8 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="mimetypes" + date="2013-05-01T20:37:33Z" + content=""" +Does `annex.largefiles` support mimetypes? F.e. `git config annex.largefiles \"not mimetype=text/plain\"` +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment new file mode 100644 index 000000000..bd2212ffb --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnPOttrEmm9CQYxzWrmgGN7LXy98gDkrlM" + nickname="binet" + subject="annex.largefiles and direct mode" + date="2013-09-16T22:50:48Z" + content=""" +I was wondering if the annex.largefiles feature was compatible with direct mode? +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment new file mode 100644 index 000000000..2144b0ec8 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 7" + date="2013-09-19T18:03:29Z" + content=""" +annex.largefiles does not support mime types. I agree it would be a useful addition. + +annex.largefiles can be used with direct mode. I would only recommending using it this way using the assistant, which will keep straight which files are which and commit them appropriately. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment new file mode 100644 index 000000000..466d03e29 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="Disappearing files" + date="2013-12-08T12:16:37Z" + content=""" +I've tried this with version 5.20131130, but my files disappear if I modify them on the remote end. + +My setup: +- A local repository, direct mode, client group, annex.largefiles \"exclude=*.txt\" +- A remote one, also direct mode, backup group, annex.largefiles \"exclude=*.txt\" +Both are running the assistant. + +If I create a .txt file locally, it gets committed and pushed to the remote as described. But, if I then modify that file on the remote end, the file gets deleted from both repositories. Also, if I create a file on the remote end, it's pushed to the local one (according to the log) but it never appears in the directory. + +Changing the remote from 'backup' to 'client' group doesn't seem to make any difference. + +Is there a 'best practice' on using git-annex like SparkleShare? I mean, syncing changes on all repositories but keeping a history of changes in git. + +Thanks! +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment new file mode 100644 index 000000000..3f104e702 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="comment 9" + date="2013-12-08T20:41:41Z" + content=""" +After further testing, it seems that the setup I wanted works when both repos are set as indirect, instead of direct as comment 7 recommends. With both repos in indirect mode, the changes are propagated correctly and the files not selected by annex.largefiles are kept in git. +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site.mdwn b/doc/tips/setup_a_public_repository_on_a_web_site.mdwn new file mode 100644 index 000000000..3b971e0c2 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site.mdwn @@ -0,0 +1,55 @@ +Let's say you want to distribute some big files to the whole world. +You can of course, just drop them onto a website. But perhaps you'd like to +use git-annex to manage those files. And as an added bonus, why not let +anyone in the world clone your site and use `git-annex get`! + +My site like this is [downloads.kitenet.net](https://downloads.kitenet.net). +Here's how I set it up. --[[Joey]] + +1. Set up a web site. I used Apache, and configured it to follow symlinks. + `Options FollowSymLinks` +2. Put some files on the website. Make sure it works. +3. `git init; git annex init` +4. `git config core.sharedrepository world` (Makes sure files + are always added with permissions that allow everyone to read them.) +5. We want users to be able to clone the git repository over http, because + git-annex can download files from it over http as well. For this to + work, `git update-server-info` needs to get run after commits. The + git `post-update` hook will take care of this, you just need to enable + the hook. `chmod +x .git/hooks/post-update` +6. `git annex add; git commit -m added` +7. Make sure users can still download files from the site directly. +8. Instruct advanced users to clone a http url that ends with the "/.git/" + directory. For example, for downloads.kitenet.net, the clone url + is `https://downloads.kitenet.net/.git/` +9. Set up a git `post-receive` hook to update the repository's working tree + when changes are pushed to it. See below for details. + +When users clone over http, and run git-annex, it will +automatically learn all about your repository and be able to download files +right out of it, also using http. + +## post-receive hook + +If you have git-annex 4.20130703, the post-receive hook mentioned above +in step 9 just needs to run `git annex merge`. + +With older versions of git-annex, you can instead use `git annex sync`. + +There are two gotchas with some versions of git to be aware of when writing +this post-receive hook. + +1. The hook may be run with the current directory set to the `.git` + directory, and not the top of your work tree. So you need to `cd ..` or + similar in the hook. +2. `GIT_DIR` may be set to `.`, which will not be right after changing + directory. So you will probably want to unset it. + +Here's a post-receive hook that takes these problems into account: + +
+#!/bin/sh
+unset GIT_DIR
+cd ..
+git annex merge
+
diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment new file mode 100644 index 000000000..cc0a0f2b3 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnYLUTs4jFpBPwOlIIJ6qD8xdqZPboJafM" + nickname="Oluf" + subject="Combine this with a 'public' repository-group" + date="2013-07-16T09:44:26Z" + content=""" +Hi, + +would it be possible to do this whith the contents of a public repository-group (a non-bare public repository)? +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment new file mode 100644 index 000000000..7bfb89b36 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-16T17:54:28Z" + content=""" +You can choose which files get stored in the public repository, and are thus accessible to the public. +However, note that since the git repository is published, anyone could clone it and see all the names and hashes of your files, even if you've not pushed the file contents to the public repository. + +Currently the way the \"public\" [[repository group|preferred_content]] works only makes it be usable with special remotes. This is because it uses a `preferreddir` setting in the special remote configuration. +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment new file mode 100644 index 000000000..05894c73e --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRRUUZo3W7pAoRoST8P_l0PtUBhvYuzDg" + nickname="Lyle" + subject="web storage" + date="2014-01-17T22:59:27Z" + content=""" +Is there a low cost web hosting solution that would support a public git-annex repo relatively simply with simple access to download the public files. + +I figure I could set up an Amazon EC2 micro instance and mount an s3 share, hosting the git-annex remote, but this is a lot of overhead for something that dropbox does with 1 click \"share dropbox link\"? + +Any suggestions would be great! +"""]] diff --git a/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn b/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn new file mode 100644 index 000000000..5ca3b45ec --- /dev/null +++ b/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn @@ -0,0 +1,39 @@ +Scenario +======== + +You have a server where you want to welcome other people to push files, say for a family photo album. People have their own user account, so by default they will not be able to read/write from each other's repositories, due to git-annex strict restrictions. + +Solution +======== + +Setup a shared git repository: + + git init shared ; cd shared # you can also do this on an existing git annex repo + git config core.sharedrepository group + chmod g+rwX -R . + chown -R :media . + +The idea here is to use the new (since [[news/version 4.20130909]]) support for git's `sharedRepository` configuration and restrict access to a specific group (instead of the default, a single user). You can also this to make the files accessible to all users on the system: + + git config core.sharedrepository world + chmod a+rwX -R . + +This will make sure that you anyone can operate that git annex repository remotely. + +Third party applications +------------------------ + +Now if another application that is not aware of git's `sharedRepository` configuration (say a [[bittorrent]] daemon) writes files there, you may want to make sure that the files created are also writable by everyone. This is more tricky, but one way of doing this is with the [[!wikipedia setgid]] bit: + + find -type d -exec chmod g+s {} \; + +You will also need to start the process with a proper [[!wikipedia umask]] (`002` instead of `022`). + +(!) I haven't actually tested this part. --[[anarcat]] + +See also +======== + + * [[tips/setup a public repository on a web site]] + * [[news/version 4.20130909]] + * [[bugs/acl not honoured in rsync remote]]: why this does not work on encrypted remotes diff --git a/doc/tips/shared_git_annex_directory_between_multiple_users/comment_1_01db8cf9dff016bd8e0498d36f325418._comment b/doc/tips/shared_git_annex_directory_between_multiple_users/comment_1_01db8cf9dff016bd8e0498d36f325418._comment new file mode 100644 index 000000000..4b7b516c5 --- /dev/null +++ b/doc/tips/shared_git_annex_directory_between_multiple_users/comment_1_01db8cf9dff016bd8e0498d36f325418._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="madduck" + ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c" + subject="Does not work" + date="2014-04-06T10:48:06Z" + content=""" +This does not seem to work, even with latest git-annex. I think it's because git-annex [[!debbug desc=\"creates files without honouring +s on the parent directory\" 729757]]. I just found out it also doesn't honour default ACLs. I hope this can be fixed soon. +"""]] diff --git a/doc/tips/skydriveannex.mdwn b/doc/tips/skydriveannex.mdwn new file mode 100644 index 000000000..3b4aee04a --- /dev/null +++ b/doc/tips/skydriveannex.mdwn @@ -0,0 +1,32 @@ +skydriveannex 0.2.1 +========= + +Hook program for gitannex to use [skydrive](http://en.wikipedia.org/wiki/SkyDrive) (previously *Windows Live SkyDrive* and *Windows Live Folders*) as backend + +# Requirements: + + python2 + python-yaml + +Credit for the Skydrive api interface goes to https://github.com/mk-fg/python-skydrive + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/skydriveannex.git + +This should make a ~/skydriveannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/skydriveannex; chmod +x git-annex-remote-skydrive; sudo ln -sf `pwd`/git-annex-remote-skydrive /usr/local/bin/git-annex-remote-skydrive + +# Commands for gitannex: + + git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. Authenticate, and use the last url as OAUTH key. + + OAUTH='URL after last redirect' git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=gitannex + git annex describe skydrive "the skydrive library" diff --git a/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment b/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment new file mode 100644 index 000000000..58b6c9077 --- /dev/null +++ b/doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="Syncing not working :-/" + date="2014-05-17T19:52:33Z" + content=""" +Error log says: + + git-annex-remote-skydrive is not installed in PATH (/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/usr/bin:/bin:/usr/sbin:/sbin) + +BUT I did a symlink, I even did 2 to 2 different locations that are in my path: + + cd /Users/ovi/skydriveannex/ + ln -sf `pwd`/git-annex-remote-skydrive /usr/bin/git-annex-remote-skydrive + ln -sf `pwd`/git-annex-remote-skydrive /opt/local/bin/git-annex-remote-skydrive +"""]] diff --git a/doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment b/doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment new file mode 100644 index 000000000..5bca3dfee --- /dev/null +++ b/doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="working for git-annex assistant?" + date="2014-05-13T18:40:31Z" + content=""" +Will following these steps lead to the Skydrive repo being visible and recognized by the assistant too? +"""]] diff --git a/doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment b/doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment new file mode 100644 index 000000000..0c737129b --- /dev/null +++ b/doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-05-16T16:26:50Z" + content=""" +The assistant will use any repositories you set up, no matter how you set them up. +"""]] diff --git a/doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment b/doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment new file mode 100644 index 000000000..892462cb3 --- /dev/null +++ b/doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="Hitting trouble" + date="2014-05-16T17:49:59Z" + content=""" + shiny-2:skydriveannex ovi$ git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=git-annex + git-annex: First run: git-annex init + shiny-2:skydriveannex ovi$ + +Above wasn't mentioned in the tutorial so I tried it: + + shiny-2:skydriveannex ovi$ git-annex init + init ok + (Recording state in git...) + shiny-2:skydriveannex ovi$ + +What now? Never got asked about any OAUTH... +"""]] diff --git a/doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment b/doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment new file mode 100644 index 000000000..7edc9d414 --- /dev/null +++ b/doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 4" + date="2014-05-16T17:51:29Z" + content=""" +And no link was opened automatically +"""]] diff --git a/doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment b/doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment new file mode 100644 index 000000000..f6a4c7415 --- /dev/null +++ b/doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 5" + date="2014-05-16T19:03:34Z" + content=""" +You have to run git-annex init before you can use other git-annex commands. I think if you run git annex initremote now, it will work. +"""]] diff --git a/doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment b/doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment new file mode 100644 index 000000000..d589a676c --- /dev/null +++ b/doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="comment 6" + date="2014-05-16T19:25:03Z" + content=""" +tried it but no luck: + + git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=git-annex + initremote skydrive (encryption setup) (shared cipher) env: python2: No such file or directory + git-annex: external special remote protocol error, unexpectedly received \"\" (unable to parse command) +"""]] diff --git a/doc/tips/skydriveannex/comment_7_7fcd9c6b5e2a3fc7b753eeac06164036._comment b/doc/tips/skydriveannex/comment_7_7fcd9c6b5e2a3fc7b753eeac06164036._comment new file mode 100644 index 000000000..d789a8d94 --- /dev/null +++ b/doc/tips/skydriveannex/comment_7_7fcd9c6b5e2a3fc7b753eeac06164036._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="making some progress" + date="2014-05-17T19:08:16Z" + content=""" +Figured out how to solve that: + which python + /opt/local/bin/python + shiny-2:git-annex ovi$ sudo ln -s `which python` /usr/bin/python2 + +The URL opened in my browser, I allowed access, waited for the redirect, copied the URL, hit the next problem: + + OAUTH='https://login.live.com/oauth20_desktop.srf?code=hidden_on_purpose' git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=git-annex +initremote skydrive (encryption setup) (shared cipher) 21:06:27 [skydriveannex-0.2.1] : 'Starting' + 21:06:27 [skydriveannex-0.2.1] login : 'EXCEPTION api.auth_get_token:ImportError('No module named requests',)' + git-annex: You need to set OAUTH environment variables and folder and encryption parameters when running initremote. +"""]] diff --git a/doc/tips/skydriveannex/comment_8_856eaa1b167033aede91a937099c7833._comment b/doc/tips/skydriveannex/comment_8_856eaa1b167033aede91a937099c7833._comment new file mode 100644 index 000000000..0fc61da00 --- /dev/null +++ b/doc/tips/skydriveannex/comment_8_856eaa1b167033aede91a937099c7833._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="Done! Success!" + date="2014-05-17T19:23:06Z" + content=""" +realized I need requests. to install I need pip. + + sudo port install py27-pip + + pip install requests + + login : 'EXCEPTION api.auth_get_token:ImportError('No module named six',)' + + pip install six + +Finished! Seems to be working and I can see this repository in my assistant! +"""]] diff --git a/doc/tips/skydriveannex/comment_9_cfcf767a1bf07957b76d7f44ef8a9500._comment b/doc/tips/skydriveannex/comment_9_cfcf767a1bf07957b76d7f44ef8a9500._comment new file mode 100644 index 000000000..614e74c98 --- /dev/null +++ b/doc/tips/skydriveannex/comment_9_cfcf767a1bf07957b76d7f44ef8a9500._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="QUESTION" + date="2014-05-17T19:29:37Z" + content=""" +Wondering about this: + + encryption=shared + +I read what it means: http://git-annex.branchable.com/encryption/ + +But now I'm wondering how the repos which I set up via the assistant have been setup. when setting them up I only had the choice between \"encrypt all files\" and \"disable encryption\" so how can I check what settings my other repos are using? +"""]] diff --git a/doc/tips/untrusted_repositories.mdwn b/doc/tips/untrusted_repositories.mdwn new file mode 100644 index 000000000..cdb5da7c3 --- /dev/null +++ b/doc/tips/untrusted_repositories.mdwn @@ -0,0 +1,28 @@ +Suppose you have a USB thumb drive and are using it as a git annex +repository. You don't trust the drive, because you could lose it, or +accidentally run it through the laundry. Or, maybe you have a drive that +you know is dying, and you'd like to be warned if there are any files +on it not backed up somewhere else. Maybe the drive has already died +or been lost. + +You can let git-annex know that you don't trust a repository, and it will +adjust its behavior to avoid relying on that repositories's continued +availability. + + # git annex untrust usbdrive + untrust usbdrive ok + +Now when you do a fsck, you'll be warned appropriately: + + # git annex fsck . + fsck my_big_file + Only these untrusted locations may have copies of this file! + 05e296c4-2989-11e0-bf40-bad1535567fe -- portable USB drive + Back it up to trusted locations with git-annex copy. + failed + +Also, git-annex will refuse to drop a file from elsewhere just because +it can see a copy on the untrusted repository. + +It's also possible to tell git-annex that you have an unusually high +level of trust for a repository. See [[trust]] for details. diff --git a/doc/tips/using_Amazon_Glacier.mdwn b/doc/tips/using_Amazon_Glacier.mdwn new file mode 100644 index 000000000..402e50a9d --- /dev/null +++ b/doc/tips/using_Amazon_Glacier.mdwn @@ -0,0 +1,75 @@ +Amazon Glacier provides low-cost storage, well suited for archiving and +backup. But it takes around 4 hours to get content out of Glacier. + +Recent versions of git-annex support Glacier. To use it, you need to have +[glacier-cli](http://github.com/basak/glacier-cli) installed. + +First, export your Amazon AWS credentials: + + # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91" + # export AWS_SECRET_ACCESS_KEY="s3kr1t" + +Now, create a gpg key, if you don't already have one. This will be used +to encrypt everything stored in Glacier, for your privacy. Once you have +a gpg key, run `gpg --list-secret-keys` to look up its key id, something +like "2512E3C7" + +Next, create the Glacier remote. + + # git annex initremote glacier type=glacier keyid=2512E3C7 + initremote glacier (encryption setup with gpg key C910D9222512E3C7) (gpg) ok + +The configuration for the Glacier remote is stored in git. So to make another +repository use the same Glacier remote is easy: + + # cd /media/usb/annex + # git pull laptop + # git annex enableremote glacier + initremote glacier (gpg) ok + +Now the remote can be used like any other remote. + + # git annex move my_cool_big_file --to glacier + copy my_cool_big_file (gpg) (checking glacier...) (to glacier...) ok + +But, when you try to get a file out of Glacier, it'll queue a retrieval +job: + + # git annex get my_cool_big_file + get my_cool_big_file (from glacier...) (gpg) + glacier: queued retrieval job for archive 'GPGHMACSHA1--862afd4e67e3946587a9ef7fa5beb4e8f1aeb6b8' + Recommend you wait up to 4 hours, and then run this command again. + failed + +Like it says, you'll need to run the command again later. Let's remember to +do that: + + # at now + 4 hours + at> git annex get my_cool_big_file + +Another oddity of Glacier is that git-annex is never entirely sure +if a file is still in Glacier. Glacier inventories take hours to retrieve, +and even when retrieved do not necessarily represent the current state. + +So, git-annex plays it safe, and avoids trusting the inventory: + + # git annex copy important_file --to glacier + copy important_file (gpg) (checking glacier...) (to glacier...) ok + # git annex drop important_file + drop important_file (gpg) (checking glacier...) + Glacier's inventory says it has a copy. + However, the inventory could be out of date, if it was recently removed. + (Use --trust-glacier if you're sure it's still in Glacier.) + + (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + +Like it says, you can use `--trust-glacier` if you're sure +Glacier's inventory is correct and up-to-date. + +A final potential gotcha with Glacier is that glacier-cli keeps a local +mapping of file names to Glacier archives. If this cache is lost, or +you want to retrieve files on a different box than the one that put them in +glacier, you'll need to use `glacier vault sync` to rebuild this cache. + +See [[special_remotes/Glacier]] for details. diff --git a/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment b/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment new file mode 100644 index 000000000..9d81d6bca --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="missing steps?" + date="2014-02-18T23:51:00Z" + content=""" +I setup a glacier remote on one machine and it successfully created the vault and is syncing files to it. + +One another machine, after git-annex sync'ing, I did: + + +[[!format sh \"\"\" +greg@x200s:~/Photos$ git-annex enableremote glacier +enableremote glacier + Set both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to use glacier +git-annex: Failed creating glacier vault. +\"\"\"]] + +So then I try: +[[!format sh \"\"\" +greg@x200s:~/Photos$ AWS_ACCESS_KEY_ID=HAHA AWS_SECRET_ACCESS_KEY=NOPE git-annex --debug enableremote glacier +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"show-ref\",\"git-annex\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..8108714116d08f93aa427b9ddced48cd5f2b4b72\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..742ba908f791e440a6cc85073ef505a96dd66aa4\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..071487394544a20253a70ada4ea71fcc28f9fc13\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..c8aecc22da7b84bbb82f083ce783cc699cef1c67\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] chat: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"cat-file\",\"--batch\"] +enableremote glacier [2014-02-18 15:43:56 PST] call: glacier [\"--region=us-west-2\",\"vault\",\"create\",\"glacier-7e5c0010-2634-4a5e-bc7b-6fea84b8b947\"] +git-annex: Failed creating glacier vault. +\"\"\"]] + +What am I missing? + +Also, why is it trying to *create* the valut? It's already there with content in it! +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment b/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment new file mode 100644 index 000000000..ed482906b --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-20T19:24:09Z" + content=""" +@greg, the only thing you might have missed is the need to use `glacier vault sync` to build a cache if enabling the glacier remote in another place. And that whole issue with it needing a local cache may mean few people are using glacier with more than one repository accessing the remote. + +However, this sounds like a bug. There is a comment in the source code that \"glacier vault create will succeed even if the vault already exists.\" .. perhaps it has changed since that was written. Or perhaps the command failed for some other reason, I don't know. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment b/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment new file mode 100644 index 000000000..a8c765bcb --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-20T19:34:48Z" + content=""" +I've changed it to avoid running glacier value create when enabling an existing glacier remote. Hopefully that fixes it. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment b/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment new file mode 100644 index 000000000..47fa6868f --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 4" + date="2014-02-20T22:04:58Z" + content=""" +Along with stupid python problems which are now fixed (all my fault, and hopefully didn't cause more noise here than needed), the only thing that didn't go as stated was: + +[[!format sh \"\"\" +greg@x200s:~/Photos$ git-annex enableremote glacier +enableremote glacier + Set both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to use glacier +git-annex: Failed creating glacier vault. +greg@x200s:~/Photos$ AWS_ACCESS_KEY_ID=lolno AWS_SECRET_ACCESS_KEY=lolno git-annex enableremote glacier +enableremote glacier ok +(Recording state in git...) +greg@x200s:~/Photos$ +\"\"\"]] + +The guide says that info is sync'd. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment b/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment new file mode 100644 index 000000000..5e0e6c716 --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="good" + date="2014-02-21T15:20:39Z" + content=""" +If you mean the creds are not remembered, that's controlled by the embedcreds= option to initremote, and it only defaults to embedding them for gacier when using strong encryption (not encryption=shared). +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment b/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment new file mode 100644 index 000000000..65128b72c --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="confirmed" + date="2014-02-21T17:53:02Z" + content=""" +Yeah, I choose no encryption for this one for worst case scenario reasons (I still want photos of my kid even if I loss my gpg key and my house burns down). Now about setting up http://git.kitenet.net/?p=gpg.git;a=blob;f=README.sss;hb=HEAD ...... +"""]] diff --git a/doc/tips/using_Amazon_S3.mdwn b/doc/tips/using_Amazon_S3.mdwn new file mode 100644 index 000000000..0c68c7387 --- /dev/null +++ b/doc/tips/using_Amazon_S3.mdwn @@ -0,0 +1,37 @@ +git-annex extends git's usual remotes with some [[special_remotes]], that +are not git repositories. This way you can set up a remote using say, +Amazon S3, and use git-annex to transfer files into the cloud. + +First, export your Amazon AWS credentials: + + # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91" + # export AWS_SECRET_ACCESS_KEY="s3kr1t" + +Now, create a gpg key, if you don't already have one. This will be used +to encrypt everything stored in S3, for your privacy. Once you have +a gpg key, run `gpg --list-secret-keys` to look up its key id, something +like "2512E3C7" + +Next, create the S3 remote, and describe it. + + # git annex initremote cloud type=S3 keyid=2512E3C7 + initremote cloud (encryption setup with gpg key C910D9222512E3C7) (checking bucket) (creating bucket in US) (gpg) ok + # git annex describe cloud "at Amazon's US datacenter" + describe cloud ok + +The configuration for the S3 remote is stored in git. So to make another +repository use the same S3 remote is easy: + + # cd /media/usb/annex + # git pull laptop + # git annex initremote cloud + initremote cloud (gpg) (checking bucket) ok + +Now the remote can be used like any other remote. + + # git annex copy my_cool_big_file --to cloud + copy my_cool_big_file (gpg) (checking cloud...) (to cloud...) ok + # git annex move video/hackity_hack_and_kaxxt.mov --to cloud + move video/hackity_hack_and_kaxxt.mov (checking cloud...) (to cloud...) ok + +See [[special_remotes/S3]] for details. diff --git a/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment new file mode 100644 index 000000000..60d96cb44 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY" + nickname="Matt" + subject="ANNEX_S3 vs AWS for keys" + date="2012-05-29T12:24:25Z" + content=""" +The instructions state ANNEX_S3_ACCESS_KEY_ID and ANNEX_SECRET_ACCESS_KEY but git-annex cannot connect with those constants. git-annex tells me to set both \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\" instead, which works. This is with Xubuntu 12.04. +"""]] diff --git a/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment new file mode 100644 index 000000000..dc809cb12 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 2" + date="2012-05-29T19:10:42Z" + content=""" +Thanks, I've fixed that. (You could have too.. this is a wiki ;) +"""]] diff --git a/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment b/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment new file mode 100644 index 000000000..e83ade0c7 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="64.71.7.82" + subject="Altering AWS credentials" + date="2014-04-15T21:59:43Z" + content=""" +If I revoke old AWS credentials and create new ones, how would I inform git-annex of the change to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`? +"""]] diff --git a/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment b/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment new file mode 100644 index 000000000..5bcf34b74 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 4" + date="2014-04-17T19:44:55Z" + content=""" +You can use `git annex enableremote` to change an existing remote's configuration. So this should work: + + # export AWS_ACCESS_KEY_ID=\"newRANDOMGOBBLDEYGOOK\" + # export AWS_SECRET_ACCESS_KEY=\"news3kr1t\" + # git annex enableremote cloud + +"""]] diff --git a/doc/tips/using_Google_Cloud_Storage.mdwn b/doc/tips/using_Google_Cloud_Storage.mdwn new file mode 100644 index 000000000..d44e4f17f --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage.mdwn @@ -0,0 +1,9 @@ +[Google Cloud Storage](https://cloud.google.com/products/cloud-storage) +supports the same API as Amazon S3, so the +[[S3 special remote|special_remotes/S3]] can be used with it. +Here is a configuration example: + + git annex initremote cloud type=S3 encryption=none host=storage.googleapis.com port=80 + +Thanks to jterrance for the [original tip](https://gist.github.com/4576324). +--[[Joey]] diff --git a/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment b/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment new file mode 100644 index 000000000..3a4d02f32 --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="AWS credentials" + date="2013-05-31T10:23:23Z" + content=""" +This looks very valuable - Google are offering a free 5GB up until 2013 June 30th + +Sign in here[1] get your credentials here[2] under the section “Interoperable Access” (Source[3]) + + # Set up AWS credentials + $ export AWS_ACCESS_KEY_ID=\"YOUR-KEY\" + $ export AWS_SECRET_ACCESS_KEY=\"YOUR-SECRET\" + +1. http://gs-signup-redirect.appspot.com/ -or- https://developers.google.com/storage/docs/signup +2. https://storage.cloud.google.com/m +3. http://fog.io/storage/ +"""]] diff --git a/doc/tips/using_Google_Cloud_Storage/comment_2_0843bfb776b8b6d5de4de7fda4489f34._comment b/doc/tips/using_Google_Cloud_Storage/comment_2_0843bfb776b8b6d5de4de7fda4489f34._comment new file mode 100644 index 000000000..5a888348e --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage/comment_2_0843bfb776b8b6d5de4de7fda4489f34._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlPfB0_GcGJ827kZqRE1PF4D23rxpfOeg4" + nickname="Björn" + subject="Can't find developer API key and secret" + date="2014-06-01T21:25:54Z" + content=""" +According to the last comment, and this page: +* https://developers.google.com/storage/docs/migrating#keys + +there's supposed to be a \"Interoperable Access\" menu option, something I can't find. Note that both the previous comment and this page refers to Googles old Developer Console. + +I can find a few things under \"APIs and Auth\" => \"Credentials\" under the heading \"Public API access\", but no matter what kind of key I try to create I can't get anything other than an API key. No secrets here, and no \"Show\"-button for newly created keys. + +Another thing worth mentioning is that these API keys I'm seeing do not like described in that first link in this comment. It's much longer, contains both upper- and lowercase and also contains dashes. +"""]] diff --git a/doc/tips/using_Google_Cloud_Storage/comment_3_9738f145014d8eae1f1aae7c39e71d31._comment b/doc/tips/using_Google_Cloud_Storage/comment_3_9738f145014d8eae1f1aae7c39e71d31._comment new file mode 100644 index 000000000..cd8caecc7 --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage/comment_3_9738f145014d8eae1f1aae7c39e71d31._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlPfB0_GcGJ827kZqRE1PF4D23rxpfOeg4" + nickname="Björn" + subject="comment 3" + date="2014-06-17T19:18:09Z" + content=""" +I just found the \"Interoperable access\" thing. The instructions from Google (linked in previous comments) are not perfect. + +After step 4 click \"Google Cloud Storage\", then at the bottom you have a heading called \"Interoperable Access\" where you have to activate it for this project. + +Then it appears at the bottom of the left hand menu. +"""]] diff --git a/doc/tips/using_box.com_as_a_special_remote.mdwn b/doc/tips/using_box.com_as_a_special_remote.mdwn new file mode 100644 index 000000000..ac59834f5 --- /dev/null +++ b/doc/tips/using_box.com_as_a_special_remote.mdwn @@ -0,0 +1,71 @@ +[Box.com](http://box.com/) is a file storage service, currently notable +for providing 50 gb of free storage if you sign up with its Android client. +(Or a few gb free otherwise.) + +git-annex can use Box as a [[special remote|special_remotes]]. +Recent versions of git-annex make this very easy to set up: + + WEBDAV_USERNAME=you@example.com WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex chunksize=75mb encryption=shared + +Note the use of chunksize; Box has a 100 mb maximum file size, and this +breaks up large files into chunks before that limit is reached. + +# old davfs2 method + +This method is deprecated, but still documented here just in case. +Note that the files stored using this method cannot reliably be retreived +using the webdav special remote. + +## davfs2 setup + +* First, install + the [davfs2](http://savannah.nongnu.org/projects/davfs2) program, + which can mount Box using WebDAV. On Debian, just `sudo apt-get install davfs2` +* Allow users to mount davfs filesystems, by ensuring that + `/sbin/mount.davfs` is setuid root. On Debian, just `sudo dpkg-reconfigure davfs2` +* Add yourself to the davfs2 group. + + sudo adduser $(whoami) davfs2 + +* Edit `/etc/fstab`, and add a line to mount Box using davfs. + + sudo mkdir -p /media/box.com + echo "https://dav.box.com/dav/ /media/box.com davfs noauto,user 0 0" | sudo tee -a /etc/fstab + +* Create `~/.davfs2/davfs2.conf` with some important settings: + + mkdir ~/.davfs2/ + echo use_locks 0 > ~/.davfs2/davfs2.conf + echo cache_size 1 >> ~/.davfs2/davfs2.conf + echo delay_upload 0 >> ~/.davfs2/davfs2.conf + +* Create `~/.davfs2/secrets`. This file contains your Box.com login and password. + Your login is probably the email address you signed up with. + + echo "/media/box.com joey@kitenet.net mypassword" > ~/.davfs2/secrets + chmod 600 ~/.davfs2/secrets + +* Now you should be able to mount Box, as a non-root user: + + mount /media/box.com + +## git-annex setup + +You need git-annex version 3.20120303 or newer, which adds support for chunking +files larger than Box's 100 mb limit. + +Create the special remote, in your git-annex repository. +** This example is non-encrypted; fill in your gpg key ID for a securely +encrypted special remote! ** + + git annex initremote box.com type=directory directory=/media/box.com chunksize=2mb encryption=none + +Now git-annex can copy files to box.com, get files from it, etc, just like +with any other special remote. + + % git annex copy bigfile --to box.com + bigfile (to box.com...) ok + % git annex drop bigfile + bigfile (checking box.com...) ok + % git annex get bigfile + bigfile (from box.com...) ok diff --git a/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment b/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment new file mode 100644 index 000000000..075fd802a --- /dev/null +++ b/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlmvi8Z-rUen8xIety5uiJitI5rnMrz8Jk" + nickname="Timothy" + subject="updated url for drive mount" + date="2013-12-18T20:20:12Z" + content=""" +I had to change the url in fstab to https://**dav**.box.com/dav +"""]] diff --git a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn new file mode 100644 index 000000000..594d8c480 --- /dev/null +++ b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn @@ -0,0 +1,59 @@ +## Intro + +This tip is based on my (Matt Ford) experience of using `git annex` with my out-and-about netbook which hits many different wifi networks and has no fixed home or address. + +I'm not using a bare repository that allows pushing (an alternative solution) nor do I fancy allowing `git push` to run against my desktop checked out repository (perhaps I worry over nothing?) + +None of this is really `git annex` specific but I think it is useful to know... + +## Dealing with no fixed hostname + +Essentially set up two repos as per the [[walkthrough]]. + +Desktop as follows: + + cd ~/annex + git init + git annex init "desktop" + +And the laptop like this + + git clone ssh://desktop/annex + git init + git annex init "laptop" + +Now we want to add the the repos as remotes of each other. + +For the laptop it is easy: + + git remote add desktop ssh://desktop/~/annex + +However for the desktop to add an ever changing laptops hostname it's a little tricky. We make use of remote SSH tunnels to do this. Essentially we have the laptop (which always knows it's own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on it's own SSH server port (22). + +To do this make part of your laptop's SSH config look like this: + + Host desktop + User matt + HostName desktop.example.org + RemoteForward 2222 localhost:22 + +Now on the desktop to connect over the tunnel to the laptop's SSH port you need this: + + Host laptop + User matt + HostName localhost + port 2222 + +So to add the desktop's remote: + +a) From the laptop ensure the tunnel is up + + ssh desktop + +b) From the desktop add the remote + + git remote add laptop ssh://laptop/~/annex + +So now you can work on the train, pop on the wifi at work upon arrival, and sync up with a `git pull && git annex get`. + +An alternative solution may be to use direct tunnels over Openvpn. diff --git a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment new file mode 100644 index 000000000..e627ead47 --- /dev/null +++ b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 1" + date="2011-12-23T13:31:33Z" + content=""" +ControlPersist is awesome - thanks! + +Here's [an alternative, git-specific approach](http://thread.gmane.org/gmane.comp.version-control.home-dir/502). +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex.mdwn b/doc/tips/using_gitolite_with_git-annex.mdwn new file mode 100644 index 000000000..31f34c6fb --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex.mdwn @@ -0,0 +1,149 @@ +[Gitolite](https://github.com/sitaramc/gitolite) is a git repository +manager. Here's how to add git-annex support to gitolite, so you can +`git annex copy` files to a gitolite repository, and `git annex get` +files from it. + +A nice feature of using gitolite with git-annex is that users can be given +read-only access to a repository, and this allows them to `git annex get` +file contents, but not change anything. + +First, you need new enough versions: + +* the current `master` branch of gitolite works with git-annex (tested 2014-04-19), + but v3.5.3 and earlier v3.x require use of the `git-annex` branch. +* gitolite 2.2 also works -- this version contains a git-annex-shell ADC + and supports "ua" ADCs. +* git-annex 3.20111016 or newer needs to be installed on the gitolite + server. Don't install an older version, it wouldn't be secure! + +### Instructions for gitolite `master` branch + +To setup gitolite to work with git-annex, you can follow the instructions on the gitolite website, +and just add `'git-annex-shell ua',` to the ENABLE list in `~/.gitolite.rc`. + +Here are more detailed instructions: + +1: Create a `git` user + +
+sudo adduser \
+   --system \
+   --shell /bin/bash \
+   --gecos 'git version control' \
+   --group \
+   --disabled-password \
+   --home /home/git git
+
+ +2: Copy a public SSH key for the user you want to be the gitolite administrator. +In the instructions below, I placed the key in a file named `/home/git/me.pub`. + +3: Clone and install gitolite + +First switch to the `git` user (e.g. `sudo su - git`) and then run: + +
+cd
+git clone https://github.com/sitaramc/gitolite.git
+mkdir -p bin
+./gitolite/install -ln
+
+ +4: Add `~/bin` to `PATH` + +Make sure that `~/bin` is in the `PATH`, since that's where gitolite installed its binary. Do something like this: + +
+echo 'export PATH=/home/git/bin:$PATH' >> .profile
+export PATH=/home/git/bin:$PATH
+
+ +5: Configure gitolite + +Edit `~/.gitolite.rc` to enable the git-annex-shell command. +Find the `ENABLE` list and add this line in there somewhere: + +
+'git-annex-shell ua',
+
+ +Now run gitolite's setup: + +
+gitolite setup -pk me.pub
+rm me.pub
+
+ +### Instructions for gitolite 2.2 + +And here's how to set it up. The examples are for gitolite as installed +on Debian with apt-get, but the changes described can be made to any +gitolite installation, just with different paths. + +Set `$GL_ADC_PATH` in `.gitolite.rc`, if you have not already done so. + +
+echo '$GL_ADC_PATH = "/usr/local/lib/gitolite/adc/";' >>~gitolite/.gitolite.rc
+
+ +Make the ADC directory, and a "ua" subdirectory. + +
   
+mkdir -p /usr/local/lib/gitolite/adc/ua
+
+ +Install the git-annex-shell ADC into the "ua" subdirectory from the gitolie repository. + +
   
+cd /usr/local/lib/gitolite/adc/ua/
+cp gitolite/contrib/adc/git-annex-shell .
+
+ +Now all gitolite repositories can be used with git-annex just as any +ssh remote normally would be used. For example: + +
+# git clone gitolite@localhost:testing
+Cloning into testing...
+Receiving objects: 100% (18/18), done.
+# cd testing
+# git annex init
+init  ok
+# cp /etc/passwd my-cool-big-file
+# git annex add my-cool-big-file
+add my-cool-big-file ok
+(Recording state in git...)
+# git commit -m added
+[master d36c8b4] added
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ create mode 120000 my-cool-big-file
+# git push --all
+Counting objects: 17, done.
+Delta compression using up to 2 threads.
+Compressing objects: 100% (12/12), done.
+Writing objects: 100% (14/14), 1.39 KiB, done.
+Total 14 (delta 0), reused 1 (delta 0)
+To gitolite@localhost:testing
+   c552a38..db4653e  git-annex -> git-annex
+   29cd204..d36c8b4  master -> master
+# git annex copy --to origin
+copy my-cool-big-file (checking origin...) (to origin...) 
+WORM-s2502-m1318875140--my-cool-big-file
+        2502 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)
+
+sent 2606 bytes  received 31 bytes  1758.00 bytes/sec
+total size is 2502  speedup is 0.95
+ok
+
+ + +### Troubleshooting + +I got an error like this when setting up gitolite *after* setting up a local git repo and git annex: + +
+git-annex-shell: First run: git-annex init
+Command ssh ["git@git.example.com","git-annex-shell 'configlist' '/~/myrepo.git'"] failed; exit code 1
+
+ +because I forgot to "git push --all" after adding the new gitolite remote. diff --git a/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment b/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment new file mode 100644 index 000000000..b01779cb4 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="git-annex no longer supported by gitolite g3" + date="2013-03-25T12:47:21Z" + content=""" +See http://gitolite.com/gitolite/dev-status.html for some details. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment b/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment new file mode 100644 index 000000000..1fbbd9b8a --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + nickname="mildred" + subject="Problems with URL ending with ".git"" + date="2013-05-24T12:15:16Z" + content=""" +Hi, + +I noticed using the git-annex branch of gitolite v3 that the same URL with \".git\" at the end would not work in git-annex. For example my test repository was `git@git2.mildred.fr:u/mildred/Annex.git` but it didn't work until I converted it to `git@git2.mildred.fr:u/mildred/Annex` + +On the server, the repository is in `repositories/u/mildred/Annex.git` + +If I try a copy with git-annex for example, I would get: + + $ git annex copy titi --to test + copy titi (checking test...) FATAL: u/mildred/Annex.git mildred DENIED + + (unable to check test) failed + git-annex: copy: 1 failed + +(test is the name of my remote and titi is my file) + +Note, in my gitolite conf, I have: + + repo u/CREATOR/[a-zA-Z0-9].* + C = @all + RW+D = CREATOR + RW = WRITERS + R = READERS + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment b/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment new file mode 100644 index 000000000..f692dd93e --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 12" + date="2013-07-25T03:20:15Z" + content=""" +latest code of gitolite does not support git-annex ? I could not find a way to make it work ? +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment b/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment new file mode 100644 index 000000000..bc674a592 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9tgeFE5v-arAYYftSv3yUTI5Q4qB2C9M" + nickname="Khaije" + subject="git-annex with gitolite FTW" + date="2013-08-13T15:13:07Z" + content=""" +The steps to activate git-annex integration have changed/simplified for v3. + + +1) during install, be sure to use the 'git-annex' branch, rather than master[fn:1]. + +2) to enable git-annex-shell, open ~/.gitolite.rc and insert 'git-annex-shell' => 'ua' into the hash list in the COMMANDS array.[fn:2] +#'git-annex-shell' => 'ua', + + + + +[fn:1] We'd like to have this feature-branch merged to master, so please send Sitaram feedback, positive and negative, based on your experiences. +[fn:2] There is no GL_ADC_PATH and no \"ua\" subdirectory here, and nothing to \"install\"; the command now comes with gitolite. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment b/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment new file mode 100644 index 000000000..048dfa698 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSbvo_NbY-ev1VKtzwo7nEqUmvRO6rXGA" + nickname="François" + subject="comment 14" + date="2013-09-22T18:30:45Z" + content=""" +@khaije + +Could you paste your config file? Here is mine: http://paste.debian.net/44856/ +I don't have any COMMANDS array. Could you elaborate your modifications please? + +Thanks. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment b/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment new file mode 100644 index 000000000..f07116983 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRaueN1AcM8pIMofH5-wQ1Kr4T0GBe8sA" + nickname="wayne" + subject="git-annex with gitolite-rc" + date="2013-10-19T17:03:32Z" + content=""" +@François + +The proper array in .gitolite.rc seems to be the \"ENABLE\" array, which it appears is parsed into the COMMANDS array in src/lib/Gitolite/Rc.pm + +@Khaije + +Using 'git-annex-shell' => 'ua' doesn't seem to work for me. The program still fails in src/gitolite-shell around line 163 (gitolite repo version b1d3c05): + + _die \"suspicious characters loitering about '$soc'\" + if $rc{COMMANDS}{ words[0] } ne 'ua' and $soc !~ $REMOTE_COMMAND_PATT; + +When I insert $rc{COMMANDS}{ words[0] } into the _die message, it shows up as \"1\" instead of \"ua\" as I was expecting. + +When I manually set $rc{COMMANDS}{ words[0] } to 'ua' slightly earlier in the script, the git-annex-shell command gets run but it seems to fail to parse the result of the configlist command properly because then I get + + Failed to get annex.uuid configuration of repository origin + + Instead, got: \"annex.uuid=\ncore.gcrypt=\n\" + + +I am actually about to give up on the notion of using git-annex and gitolite together. Maybe. I am interested to know if anyone else is having similar problems. + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment b/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment new file mode 100644 index 000000000..5e0e6acd6 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmbo-yMzW_lkBrS4ICNn5XMr8saYtI1_WY" + nickname="Douglas" + subject="Any further info regarding gitolite support?" + date="2013-11-14T03:20:31Z" + content=""" +We have reached the same point as the previous poster from 25 days ago. +$ git annex copy --to origin +FATAL: suspicious characters loitering about 'git-annex-shell 'configlist' '/~/testing'' + + Remote origin does not have git-annex installed; setting remote.origin.annex-ignore +git-annex: cannot determine uuid for origin + +Anyone actually have this working? +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment b/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment new file mode 100644 index 000000000..57152bad7 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9tgeFE5v-arAYYftSv3yUTI5Q4qB2C9M" + nickname="Khaije" + subject="comment 17" + date="2013-11-23T02:14:12Z" + content=""" +my gitolite.rc is available at https://gist.github.com/khaije1/7609848 + +For whatever reason I've found this to be very simple to get working so I'd guess there's a missing ingredient somewhere. The combination of gitolite and git-annex is valuable to me so I'll add documents to the url above in hopes it will assist some people with getting the same value. + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment b/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment new file mode 100644 index 000000000..882478f5b --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawll4Kgp7nMuOKdB0FfbcYZ3KRq7HCS0Slc" + nickname="Laura" + subject="Using Gitolite 3.2" + date="2014-01-17T20:14:16Z" + content=""" +Adding: + + 'git-annex-shell' =>1, + +To the .gitolite.rc file resulted in the \"FATAL: suspicous characters loitering about 'git-annex-shell 'configlist' '/~/testing''... + + +Gitolite source code (https://github.com/sitaramc/gitolite/commit/b1d3c0571409b7c6279fc6a77253c3bc262ab425#diff-79a3701e9e2cee0ea1316451c21a3fec) requires this entry: + +'git-annex-shell ua' + + + + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment b/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment new file mode 100644 index 000000000..636794aba --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnftLWVOF0DUdXr2HSW4IKzuqtW8V7X3YU" + nickname="Adrian" + subject="How can the git annex init command be called on the server?" + date="2014-03-25T06:58:56Z" + content=""" +The latest commit in the gitolite repository \"git-annex support, finally in master!\" looks really promissing. I'm currently using ubuntu trusty with updated gitolite3 package and the configuration provided by Khaije. One line needs to be changed: 'git-annex-shell' => 'ua', instead of 'git-annex-shell' =>1, + +However, one little detail is still open for me. I need to call the server side \"git annex init\" on the server (sudo su gitolite3; cd ~/repositories/testing.git && git annex init). I cannot find a way to initialize the server from client side. E.g. git annex init && git push --all is not enough. The man page describes git annex initremote for other server types but not for gitolite remotes. Wouldn't we need something similar for gitolite as well? Or is there a better solution which I do not recognize? + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment b/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment new file mode 100644 index 000000000..807180660 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.openid.albertlash.com/openid/" + ip="71.178.29.218" + subject="comment 1" + date="2011-12-24T06:08:45Z" + content=""" +Looks like you are missing a closing double quote on the line: + + +echo '$GL_ADC_PATH = \"/usr/local/lib/gitolite/adc/;' >>~gitolite/.gitolite.rc + +right after /; + +I got this working by the way - great stuff. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment b/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment new file mode 100644 index 000000000..45ff960f4 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 20" + date="2014-03-26T18:24:30Z" + content=""" +@Adrian, that's good news. It would be helpful if someone could update the top of this page to document how to use git-annex with the new version of gitolite. +This is a wiki.. + +You're not supposed to need to use initremote when dealing with normal git remotes. It seems that something got lost that automatically initialize the remote repository in this situation. I've fixed it so that it will be set up when `git-annex-shell configlist` is run. + +(@wayne, this fixes the problem you reported too..) +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_21_d2feaaf22d41413048dabf706d1b267e._comment b/doc/tips/using_gitolite_with_git-annex/comment_21_d2feaaf22d41413048dabf706d1b267e._comment new file mode 100644 index 000000000..2746ee41b --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_21_d2feaaf22d41413048dabf706d1b267e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="Worked for me, updated wiki" + date="2014-04-19T09:41:11Z" + content=""" +I tried the `master` branch of gitolite today on my server, and it works fine! Updated the wiki with the commands I used to setup gitolite. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment b/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment new file mode 100644 index 000000000..007a009ea --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-12-24T16:54:31Z" + content=""" +I've fixed the typo (anyone can edit pages in this wiki FWIW.) +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment b/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment new file mode 100644 index 000000000..243764054 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="repo name conventions?" + date="2011-12-30T21:41:13Z" + content=""" +I'm confused by the fact that the git-annex-shell adc rejects any repo names that don't start with /~/ since none of my repos start that way. It seems work ok if I just delete /\~ from the front of the regex, but I feel like I must be missing something. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment b/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment new file mode 100644 index 000000000..c53ce01d9 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-12-31T00:29:45Z" + content=""" +Well a repo url like `gitolite@localhost:testing` puts it in the gitolite user's /~/testing + +This worked when I added the gitolite stuff, anyway.. Let's see if it still does: + +
+joey@gnu:~/tmp>mkdir g
+joey@gnu:~/tmp>cd g
+joey@gnu:~/tmp/g>git init
+Initialized empty Git repository in /home/joey/tmp/g/.git/
+joey@gnu:~/tmp/g>git annex init
+init  ok
+joey@gnu:~/tmp/g>git remote add test 'gitolite@localhost:testing'
+joey@gnu:~/tmp/g>touch foo
+joey@gnu:~/tmp/g>git annex add foo
+add foo (checksum...) ok
+(Recording state in git...)
+joey@gnu:~/tmp/g>git annex copy foo --to test --debug
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"foo\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"check-attr\",\"annex.numcopies\",\"-z\",\"--stdin\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"show-ref\",\"git-annex\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"cat-file\",\"--batch\"]
+Running: ssh [\"-4\",\"gitolite@localhost\",\"git-annex-shell 'configlist' '/~/testing'\"]
+
+ +Still seems right, the ADC's regexp will match this the git-annex shell command. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment b/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment new file mode 100644 index 000000000..052fc90d6 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="gitolite gets different paths for different urls" + date="2011-12-31T01:50:49Z" + content=""" +I guess there is some path rewriting going in in gitolite proper because if try a url of the form +ssh://git@localhost/testing, then it still works with gitolite, but fails with the ADC because +the repo is passed as /testing: +
+Running: ssh [\"git@host\",\"git-annex-shell 'configlist' '/recommend'\"]
+Running: ssh [\"git@host\",\"git-annex-shell 'configlist' '/recommend'\"]
+
+ +What I have to ask Sitaram and or find in the docs is if this is a bug or a feature in gitolite. I can see how the leading slash would get swallowed up by this line +
+$repo = \"'$REPO_BASE/$repo.git'\"
+
+in gl-auth-command, but I guess that isn't the whole story. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment b/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment new file mode 100644 index 000000000..ce888cb13 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="ssh://gitolite-host/repo-name is supposed to work" + date="2011-12-31T03:34:17Z" + content=""" +I confirmed with Sitaram that this is intentional, if probably under-documented. +Since the ADC strips the leading /~/ in assigning $start anyway, I guess something like the following will work +
+
+diff --git a/contrib/adc/git-annex-shell b/contrib/adc/git-annex-shell
+index 7f9f5b8..523dfed 100755
+--- a/contrib/adc/git-annex-shell
++++ b/contrib/adc/git-annex-shell
+@@ -28,7 +28,7 @@ my $cmd=$ENV{SSH_ORIGINAL_COMMAND};
+ # the second parameter.
+ # Further parameters are not validated here (see below).
+ die \"bad git-annex-shell command: $cmd\"
+-    unless $cmd =~ m#^(git-annex-shell '\w+' ')/\~/([0-9a-zA-Z][0-9a-zA-Z._\@/+-
++    unless $cmd =~ m#^(git-annex-shell '\w+' ')/(?:\~\/)?([0-9a-zA-Z][0-9a-zA-Z.
+ my $start = $1;
+ my $repo = $2;
+ my $end = $3;
+
+"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment b/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment new file mode 100644 index 000000000..bdbecd4d9 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-12-31T18:32:28Z" + content=""" +That patch seems ok, it doesn't seem to allow through any repo locations that were blocked before. + +So, it has my blessing.. but the ADC is in gitolite and will need to be patched there. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment b/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment new file mode 100644 index 000000000..0717bab1c --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="afaict git annex normalizes urls on the client side." + date="2011-12-31T22:29:38Z" + content=""" +After some debugging printing, here is my current understanding. + +- urls of the form git@host:~repo or ssh://git@host + + - git sends commands like \"git-receive-pack '~/repo' + - gitolite converts these to $REPO_BASE/~/repo which fails. ~/repo would also fail fwiw. + - git-annex sends seems /~/repo, which works + +- urls of the form git@host:/repo or ssh://git@host/repo + + - git sends \"git-receive-pack '/db/cs3383'\" + - gitolite converts this to $REPO_BASE/repo which works + - git annex sends \"git-annex-shell 'inannex' '/repo' ...\" which works, but only with the patch above. + +- urls of the form git@host:repo + + - git sends \"git-receive-pack 'repo' + - gitolite converts this to $REPO_BASE/repo, which works + - git-annex sends \"git-annex-shell 'inannex' '/~/db/cs3383'...\", which also works for git-annex-shell. + +So the weird case is the last one where git and git-annex are sending different things over the wire. +I don't know if you have other motivations for doing the url normalization on the client side, but it isn't needed for gitolite, and in some sense complicates things a little. On the other hand, now that I see what is going on, it isn't a big deal to just strip the leading /~ off in the adc. It does lead to the odd situation of some URLs working for git-annex but not git. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment b/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment new file mode 100644 index 000000000..fc297ff17 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 9" + date="2012-01-02T16:27:55Z" + content=""" +Ah right. git-annex normalizes all git ssh style user@host:dir to valid uris, which is where the `/~/` comes from. I don't anticipate this changing on the git-annex side. +"""]] diff --git a/doc/tips/using_the_SHA1_backend.mdwn b/doc/tips/using_the_SHA1_backend.mdwn new file mode 100644 index 000000000..70dc2ef75 --- /dev/null +++ b/doc/tips/using_the_SHA1_backend.mdwn @@ -0,0 +1,11 @@ +A handy alternative to the default [[backend|backends]] is the +SHA1 backend. This backend provides more git-style assurance that your data +has not been damaged. And the checksum means that when you add the same +content to the annex twice, only one copy need be stored in the backend. + +The only reason it's not the default is that it needs to checksum +files when they're added to the annex, and this can slow things down +significantly for really big files. To make SHA1 the default, just +add something like this to `.gitattributes`: + + * annex.backend=SHA1 diff --git a/doc/tips/using_the_web_as_a_special_remote.mdwn b/doc/tips/using_the_web_as_a_special_remote.mdwn new file mode 100644 index 000000000..62ef58b69 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote.mdwn @@ -0,0 +1,109 @@ +The web can be used as a [[special_remote|special_remotes]] too. + + # git annex addurl http://example.com/video.mpeg + addurl example.com_video.mpeg (downloading http://example.com/video.mpeg) + ########################################################## 100.0% + ok + +Now the file is downloaded, and has been added to the annex like any other +file. So it can be renamed, copied to other repositories, and so on. + +To add a lot of urls at once, just list them all as parameters to +`git annex addurl`. + +## trust issues + +Note that git-annex assumes that, if the web site does not 404, and has the +right file size, the file is still present on the web, and this counts as +one [[copy|copies]] of the file. If the file still seems to be present +on the web, it will let you remove your last copy, trusting it can be +downloaded again: + + # git annex drop example.com_video.mpeg + drop example.com_video.mpeg (checking http://example.com/video.mpeg) ok + +If you don't [[trust]] the web to this degree, just let git-annex know: + + # git annex untrust web + untrust web ok + +With the result that it will hang onto files: + + # git annex drop example.com_video.mpeg + drop example.com_video.mpeg (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + Also these untrusted repositories may contain the file: + 00000000-0000-0000-0000-000000000001 -- web + (Use --force to override this check, or adjust numcopies.) + failed + +## attaching urls to existing files + +You can also attach urls to any file already in the annex: + + # git annex addurl --file my_cool_big_file http://example.com/cool_big_file + addurl my_cool_big_file ok + # git annex whereis my_cool_big_file + whereis my_cool_big_file (2 copies) + 00000000-0000-0000-0000-000000000001 -- web + 27a9510c-760a-11e1-b9a0-c731d2b77df9 -- here + +## configuring filenames + +By default, `addurl` will generate a filename for you. You can use +`--file=` to specify the filename to use. + +If you're adding a bunch of related files to a directory, or just don't +like the default filenames generated by `addurl`, you can use `--pathdepth` +to specify how many parts of the url are put in the filename. +A positive number drops that many paths from the beginning, while a negative +number takes that many paths from the end. + + # git annex addurl http://example.com/videos/2012/01/video.mpeg + addurl example.com_videos_2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=2 + addurl 2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=-2 + addurl 01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + +## videos + +
+ +There's support for downloading videos from sites like YouTube, Vimeo, +and many more. This relies on [quvi](http://quvi.sourceforge.net/) to find +urls to the actual videos files. + +When you have quvi installed, you can just +`git annex addurl http://youtube.com/foo` and it will detect that +it is a video and download the video content for offline viewing. + +Later, in another clone of the repository, you can run `git annex get` on +the file and it will also be downloaded with the help of quvi. This works +even if the video host has transcoded or otherwise changed the video +in the meantime; the assumption is that these video files are equivilant. + +There is an `annex.quvi-options` configuration setting that can be used +to pass parameters to quvi. For example, you could set `git config +annex.quvi-options "--format low"` to configure it to download low +quality videos from YouTube. + +Note that for performance reasons, the url is not checked for redirects, +so some shortened urls will not be detected. You can +either load the short url in a browser to get the full url, or you +can force use of quvi with redirect detection, by prepending "quvi:" to the +url. + +To download a youtube playlist, you need to find the feed associated with that +playlist, and pass it to `git annex importfeed`. There does not seem to be +an easy link anywhere to get the feed, but you can construct its url +manually. For a playlist like +"https://www.youtube.com/playlist?list=PL4F80C7D2DC8D9B6C", the +feed is "http://gdata.youtube.com/feeds/api/playlists/PL4F80C7D2DC8D9B6C" + +More details about youtube feeds at +-- `git-annex importfeed` should handle all of them. + +## podcasts + +This is done using `git annex importfeed`. See [[downloading podcasts]]. diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment b/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment new file mode 100644 index 000000000..ee1a271ea --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc" + nickname="Paul" + subject="can addurl use hashing once the file is downloaded?" + date="2012-09-20T21:01:30Z" + content=""" +There are resources that I want to add to my annex that are currently available +via a URL, but it seems like if I add these using `git-annex addurl`, they get +symlinked to file in the annex/objects directory that starts with `URL-...`, +instead of the more typical `SHA256-...`, and this does not change even after +the files are downloaded. + +My concern is that I really want to ensure that these files don't change, which +is the appeal of content-addressable symlinking of normal files (as opposed to +URL addressable ones). + +Would there be a way to automate the injection of hash-based symlinking for +files that are added via addurl? Sometimes I add a bunch of files via ``addurl +--fast``, and after I've download them via ``get``, it would be nice to have +those files have the same level of data integrity as when I download them using +something outside of git-annex, add them to the annex, and do an ``addurl +--file`` afterward. + +Thanks for all of your hard work! + +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment b/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment new file mode 100644 index 000000000..b015cdcec --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-09-20T21:55:57Z" + content=""" +`addurl` only uses the URL- keys if you run it with --fast. Otherwise it downloads the content and hashes it the same as `add` does. + +If you use `--fast`, you can go back and `git annex migrate` the file once it's been downloaded, to convert +it to the SHA backend. +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment b/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment new file mode 100644 index 000000000..0601f3005 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="how to drop one of the urls?" + date="2013-04-12T14:53:29Z" + content=""" +is there a way to remove one of the urls? e.g. if I have + + $> git annex whereis fail2ban_logo.png + whereis fail2ban_logo.png (1 copy) + 00000000-0000-0000-0000-000000000001 -- web + + web: http://www.fail2ban.org/fail2ban_logo.png + web: http://www.onerussian.com/tmp/statsmodes.png + ok + +and would like to remove the fail2ban.org one... ? +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment b/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment new file mode 100644 index 000000000..bd55a7872 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-22T21:28:03Z" + content=""" +You can use `git annex rmurl $file $url`, which I just added to git-annex. + +(Also, `git annex drop $file --from web` will remove all the urls..) +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_5_5ee9717e74ca2afed98e81fc0ea98a95._comment b/doc/tips/using_the_web_as_a_special_remote/comment_5_5ee9717e74ca2afed98e81fc0ea98a95._comment new file mode 100644 index 000000000..b1060147f --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_5_5ee9717e74ca2afed98e81fc0ea98a95._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 5" + date="2014-04-04T15:25:39Z" + content=""" +Adding videos from youtube ends up with it using the URL backend, even without fast. + + $ git init quvitest + $ cd quvitest/ + $ git annex init + $ git annex addurl https://www.youtube.com/watch?v=mghhLqu31cQ + (... file is downloaded ...) + $ find .git/annex/objects/ -type f + .git/annex/objects/1J/Wp/URL--quvi&chttps&c%%www.youtube.com%watch,63v,61mghhLqu31cQ/URL--quvi&chttps&c%%www.youtube.com%watch,63v,61mghhLqu31cQ + +Is migrating manually required or should I log a bug? +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_6_dceb15bd656e69eefa3ca975d9d642de._comment b/doc/tips/using_the_web_as_a_special_remote/comment_6_dceb15bd656e69eefa3ca975d9d642de._comment new file mode 100644 index 000000000..0c39eb183 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_6_dceb15bd656e69eefa3ca975d9d642de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 6" + date="2014-04-07T20:07:45Z" + content=""" +Using the URL backend for youtube is intentional. Youtube may serve up different encodings for the same video over time, and this way git-annex treats them all as equvilant. If you want to \"freeze\" the repository to the current one, use `git annex migrate`, and be prepared for `git annex get --from web` to not work long term. +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_7_0bde977c62a53c90cb20491936bc399d._comment b/doc/tips/using_the_web_as_a_special_remote/comment_7_0bde977c62a53c90cb20491936bc399d._comment new file mode 100644 index 000000000..df5b0ef41 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_7_0bde977c62a53c90cb20491936bc399d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkXKIAfgPsuV-EJpXm3jCc3q9IZwzvCcw" + nickname="Garrett" + subject="Default pathdepth" + date="2014-05-08T21:36:00Z" + content=""" +Is there away to change the default pathdepth so I do not need to add --pathdepth=-1 everything I run addurl? +"""]] diff --git a/doc/tips/visualizing_repositories_with_gource.mdwn b/doc/tips/visualizing_repositories_with_gource.mdwn new file mode 100644 index 000000000..25a69c1b7 --- /dev/null +++ b/doc/tips/visualizing_repositories_with_gource.mdwn @@ -0,0 +1,22 @@ +[Gource](http://code.google.com/p/gource/) is an amazing animated +visualisation of a git repository. + +Normally, gource shows files being added, removed, and changed in +the repository, and the user(s) making the changes. Of course it can be +used in this way in a repository using git-annex too; just run `gource`. + +The other way to use gource with git-annex is to visualise the movement of +annexed file contents between repositories. In this view, the "users" are +repositories, and they move around the file contents that are being added +or removed from them with git-annex. + +[[!img screenshot.jpg]] + +To use gource this way, first go into the directory you want to visualize, +and use `git annex log` to make an input file for `gource`: + + git annex log --gource | tee gource.log + sort gource.log | gource --log-format custom - + +The `git annex log` can take a while, to speed it up you can use something +like `--after "4 months ago"` to limit how far back it goes. diff --git a/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment b/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment new file mode 100644 index 000000000..38bde579d --- /dev/null +++ b/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9IQStaE1el95_9s77CgmJhxZwCwUeN9A" + nickname="Sam" + subject="You can also use it for LIVE display now" + date="2013-12-19T14:29:18Z" + content=""" +hi, check out http://puffingdev.com/live-gource-visually-display-your-svngit-activity-live/ + +You can use it to display LIVE updates of a git repo, nice to have on a screen in your company's common area for example. +"""]] diff --git a/doc/tips/visualizing_repositories_with_gource/screenshot.jpg b/doc/tips/visualizing_repositories_with_gource/screenshot.jpg new file mode 100644 index 000000000..9d3096b99 Binary files /dev/null and b/doc/tips/visualizing_repositories_with_gource/screenshot.jpg differ diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn b/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn new file mode 100644 index 000000000..78f4977a2 --- /dev/null +++ b/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn @@ -0,0 +1,27 @@ +A git-annex repository on a removable USB drive is great, until the cable +falls out at the wrong time and git's repository gets trashed. The way +git checksums everything and the poor quality of USB media makes this +perhaps more likely than you would expect. If this happens to you, +here's a way to recover that makes the most of whatever data is left +on the drive. + +* First, run `git fsck`. If it does not report any problems, your data + is fine, and you don't need to proceed further. +* So `git fsck` says the git repository is corrupted. But probably the data + git-annex stored is fine. Your first step is to clone another copy + of the git repository from somewhere else. Let's call this clone + "$good", and the corrupted repository "$bad". +* Preserve your git configuration changes, and the `annex.uuid` setting: + `mv $bad/.git/config $good/.git/config` +* Move annexed data into the new repository: `mkdir $good/.git/annex; mv + $bad/.git/annex/objects $good/.git/annex/objects` +* Reinitalize git-annex: `cd $good; git annex init` +* Check for any problems with the annexed data: `cd $good; git annex fsck` +* Now you can remove the corrupted repository, the new one is ready to use. + +Alternatively, recent versions of git-annex have a `git annex repair` +command that uses to repair a +repository in-place. The git-annex assistant will detect most corruptions +and offer to run the repair for you automatically. + +--[[Joey]] diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment new file mode 100644 index 000000000..3954bef0d --- /dev/null +++ b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_1_c3543190eae2af594f3e050057e80db6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnq-RfkVpFN15SWvQ2lpSGAi0XpNQuLxKM" + nickname="Yuval" + subject="Automation" + date="2014-04-27T11:34:44Z" + content=""" +Could this step be automated? +"""]] diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_2_025178c2b11affe2d42a87544b897dc8._comment b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_2_025178c2b11affe2d42a87544b897dc8._comment new file mode 100644 index 000000000..beb177d00 --- /dev/null +++ b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_2_025178c2b11affe2d42a87544b897dc8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="comment 2" + date="2014-05-23T23:50:58Z" + content=""" +What if the drive is destroyed? How would I re-initialize a new drive to act as a substitute for the remote that was just lost? +"""]] diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_3_9a6bae9c0326ecc7610f5415db20f49e._comment b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_3_9a6bae9c0326ecc7610f5415db20f49e._comment new file mode 100644 index 000000000..870d7b93f --- /dev/null +++ b/doc/tips/what_to_do_when_a_repository_is_corrupted/comment_3_9a6bae9c0326ecc7610f5415db20f49e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.36" + subject="comment 3" + date="2014-05-24T18:29:03Z" + content=""" +@Maarten git clone from one of the other clones of the repository to the new drive. Also, recent versions of git-annex have a `git annex reinit` command that can be used to easily initialize a repository with the same settings as a repository that was lost. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository.mdwn b/doc/tips/what_to_do_when_you_lose_a_repository.mdwn new file mode 100644 index 000000000..363eeea4e --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository.mdwn @@ -0,0 +1,19 @@ +So you lost a thumb drive containing a git-annex repository. Or a hard +drive died or some other misfortune has befallen your data. + +Unless you configured backups, git-annex can't get your data back. But it +can help you deal with the loss. + +Go somewhere that knows about the lost repository, and mark it as +dead: + + git annex dead usbdrive + +This retains the [[location_tracking]] information for the repository, +but avoids trying to access it, or list it as a location where files +are present. + +If you later found the drive, you could let git-annex know it's found +like so: + + git annex semitrust usbdrive diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment new file mode 100644 index 000000000..a7fce26ef --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://dlaxalde.myopenid.com/" + nickname="dl" + subject="comment 1" + date="2012-05-31T14:36:33Z" + content=""" +Is there a way to have git-annex completely ignore a repository? I see that +the `dead` command adds the uuid of the repository to `trust.log` but does +not change `uuid.log`. Is it enough to remove the corresponding line in +`uuid.log` and `trust.log`? +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment new file mode 100644 index 000000000..a8d044c28 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.243" + subject="comment 3" + date="2012-05-31T17:01:37Z" + content=""" +`dead` is the best we can do. The automatic merging used on the git-annex branch tends to re-add lines that are deleted in one repo when merging with another that still has them. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment new file mode 100644 index 000000000..37058399c --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="Update?" + date="2013-12-16T00:31:27Z" + content=""" +Is it reasonable to update this page to include `git-annex forget`? +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment new file mode 100644 index 000000000..e0aa916a6 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 4" + date="2013-12-16T17:04:44Z" + content=""" +I wouldn't recommend running `git annex forget --drop-dead` right after losing a drive. You might find the drive again, or get the dead drive to work again. Even if you know you'll never find it, you may want to query git-annex to find files that were only located on that drive, and deal with them, etc. + +But if you're worried about that information in the git-annex branch cluttering up the git repository, you keep in mind that `git annex forget` will let you remove it at some point in the future. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment new file mode 100644 index 000000000..49323b29e --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="forget command" + date="2013-12-17T05:52:52Z" + content=""" +Unfortunately, I plugged in the drive and it was alive just long enough to clone the repo and pull down about half of the data. Then it just started clicking. I did my best to wipe the drive before I returned it, but it didn't even make it that far. + +Now I've got a replacement drive. Since my system auto-mounts based on the partition label; I had been using the label to identify external drives. So I want to describe the drive the same way to my system & git-annex. + +In this case, I think I'd like to completely get rid of any notion the repos have of the old drive. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment new file mode 100644 index 000000000..5a124cc1b --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 6" + date="2013-12-17T16:11:52Z" + content=""" +You could use `git annex forget --drop-dead` in that situation, but what I would do is first `git annex describe lostremote \"my old drive that I lost\"` and then set up the replacement drive with whatever description you had before. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment new file mode 100644 index 000000000..3b4b79da3 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="still need to remove the remote after a "dead"" + date="2014-03-07T18:03:47Z" + content=""" +Hello, + +I decommissioned a machine and installed git annex on another machine, with the same IP as the initial one. To avoid errors, I declared the first repository as dead and created a new one (with a new remote). However, I also had to remove the git remote to the dead machine as \"git annex sync\" kept telling me synchronizing to this dead machine failed (the ssh succeeded, using the name automatically generated by git annex, but the repository was not at the same path on the new machine, so it could not find it). + +Should a dead repository not tried to be synchronized at all during git annex sync? + +Thanks, + +Alan +"""]] diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn b/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn new file mode 100644 index 000000000..961776e19 --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn @@ -0,0 +1,9 @@ +Here's the annex-du script that I use: + +#!/bin/sh +git annex find "$@" --include '*' --format='${bytesize}\n' |awk '{ sum += $1; nfiles++; } END { printf "%d files, %.3f MB\n", nfiles, sum/1000000 } ' + +This one can be slow on a large number of files, but it has an advantage of being able to use all of the filtering available in git annex find. +For example, to figure out how much is stored in remote X, do + +annex-du --in=X diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment new file mode 100644 index 000000000..4c3e3c22b --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 1" + date="2013-07-12T19:36:28Z" + content=""" +Ah, I just found that git annex info can do the same :) +Disregard this. +"""]] diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment new file mode 100644 index 000000000..fe4b3d0d2 --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-08-30T06:09:29Z" + content=""" +You may want to try my `sizes` tool on Hackage. Just pass `-A` and it will be aware of the annex and report sizes as if no files were annexed. The only downside is that it reports file usage for replicated content multiple times, as if you'd copied the data out of the annex rather than hardlinked all duplicate copies (although, this may be exactly the behavior some people want). +"""]] diff --git a/doc/todo.mdwn b/doc/todo.mdwn new file mode 100644 index 000000000..62224c3be --- /dev/null +++ b/doc/todo.mdwn @@ -0,0 +1,4 @@ +This is git-annex's todo list. Link items to [[todo/done]] when done. A more complete [[design/roadmap/]] is also available. + +[[!inline pages="./todo/* and !./todo/done and !link(done) +and !*/Discussion" actions=yes postform=yes show=0 archive=yes]] diff --git a/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo.mdwn b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo.mdwn new file mode 100644 index 000000000..00f500d10 --- /dev/null +++ b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo.mdwn @@ -0,0 +1 @@ +One problem I keep having when using a direct repo is that in order to get to the previous versions of a file you have to convert that repo to indirect and then checkout previous commits this becomes problematic when the repo in question is large conversion takes a long time and applications gets confused if there are open files from the repo as they go from actual files to symlinks. Is it possible to have a separate annex command that will checkout a previous version of a file to a different directory so we can replace/inspect it. diff --git a/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_1_6f477af942aeb98683a56bcf0e819a38._comment b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_1_6f477af942aeb98683a56bcf0e819a38._comment new file mode 100644 index 000000000..e97e40f62 --- /dev/null +++ b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_1_6f477af942aeb98683a56bcf0e819a38._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 1" + date="2014-05-13T20:25:22Z" + content=""" +I’ve added a bug on basically the same issue. +http://git-annex.branchable.com/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__/ + +One problem is that if your direct-mode repo is on VFAT, you can’t even switch to indirect mode temporarily. +"""]] diff --git a/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_2_45c22f596a18d5dc2331cfeef8c767fa._comment b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_2_45c22f596a18d5dc2331cfeef8c767fa._comment new file mode 100644 index 000000000..200210a02 --- /dev/null +++ b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_2_45c22f596a18d5dc2331cfeef8c767fa._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 2" + date="2014-05-17T14:18:31Z" + content=""" +It occured to me that one could do something like that by «git show +earlier-commit:file > filename». A problem with this is that a +subsequent «get» will get the old content, but won’t put it in place +until invoking «fsck». + +"""]] diff --git a/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_3_cbca264d86fe733b8106a4bf50c0c6ff._comment b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_3_cbca264d86fe733b8106a4bf50c0c6ff._comment new file mode 100644 index 000000000..265e0995a --- /dev/null +++ b/doc/todo/A_Way_To_Extract_Previous_Versions_of_a_File_From_a_Direct_Repo/comment_3_cbca264d86fe733b8106a4bf50c0c6ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 3" + date="2014-05-17T14:24:20Z" + content=""" +Plus it seems that the file can’t be dropped normally afterwards. +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn new file mode 100644 index 000000000..d3e20b6db --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn @@ -0,0 +1,9 @@ +I like the way btsync search for the peer. So if I need to sync my laptop and other family laptop both with a total different and changing network setup the two device found each other do NAT traversal if needed use relays but the end the two folders are synced. But its closed-source :( I like git and git-annex looks really great. I'm learning it now. + +First I thought with xmpp I can sync files without ssh/rsync or other remote access to my devices just with two jabber account. Now I know I can't. :( + +It would be just great to have some means to sync files without cloud just the two device. Without the ssh / rsync jut share some secret and the devices do the rest. :-o + +Anyway thanks for hearing. I'm looking forward to know more about git-annex. Thank you for that sw. =-<>-= + +> [[design/assistant/telehash]] --[[Joey]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment new file mode 100644 index 000000000..13571e681 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkEHjHAWnJ0BJzdv_hePwU1my8X4wCseh8" + nickname="Sz" + subject="comment 1" + date="2013-07-23T11:00:21Z" + content=""" +Why not use xmpp for file transfer too not only for git sync? +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment new file mode 100644 index 000000000..2bff793f0 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + ip="83.145.237.224" + subject="comment 2" + date="2013-07-23T11:37:53Z" + content=""" +Transferring the data over XMPP would almost certainly take too much XMPP server bandwidth, but using something like [libjingle](https://developers.google.com/talk/libjingle/) to set up P2P connections should work nicely. That would require libjingle (or equivalent) bindings for Haskell, though. Libjingle negotiates over XMPP to set up the P2P connection and provides a TCP-like layer for reliable, ordered communication. One could use that for both git metadata and the file transfers. +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment new file mode 100644 index 000000000..d0c000d2b --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkEHjHAWnJ0BJzdv_hePwU1my8X4wCseh8" + nickname="Sz" + subject="comment 3" + date="2013-07-24T09:08:45Z" + content=""" +I'm for it! +1 +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment new file mode 100644 index 000000000..f3bafca89 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-08-03T07:12:40Z" + content=""" +NAT traversal requires central infrastructure and is unreliable at best. Obviously, a for-profit entity like bittorrent can shoulder that. + +For LAN situations, [zeroconf](http://www.zeroconf.org/) along with passphrase-based pairing may be the long-term answer. Arguably, that would enhance vanilla Git almost as much as it would enhance git-annex, but that does not seem likely to happen. +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment new file mode 100644 index 000000000..07b001c2e --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 5" + date="2013-08-25T07:48:18Z" + content=""" +What is the problem with bittorrent protocol in general? +It is some technicality or purely philosophical? + +Best, + Laszlo + +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment new file mode 100644 index 000000000..41e1bda78 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 6" + date="2013-08-25T08:39:15Z" + content=""" +I just did a cursory search on haskell torrent support. And the required pieces do seem to be be there. +https://github.com/jlouis/combinatorrent or https://github.com/astro/haskell-torrent for downloading. i'm not sure if either supports DHT, but that exists here https://github.com/aninhumer/haskell-dht + +That said, i think implementing this would require some quite major overhauls in the system. It probably won't be trivial to implement. + +Note: This is for straight \"bittorrent\", not for \"bittorrent sync\". Bittorrent sync is closed source, and while an API might come at some point, it doesn't currently exist. + +I do seem to recall joeyh talking about supporting further transport protocols(perhaps through hooks). So I'm adding the above links for future reference if this does get implemented. + +But IMHO, this doesn't seem like a trivial feature to add. It might have to take some refactoring of some core git-annex parts. Certain things have to be changed quite a bit. + +Currently a git-annex client doesn't really require anything(except rsync) to sync from a remote. With bittorrent with DHT support to share between clients, suddenly git-annex will have to maintain a constant bittorrent thread(maybe multiple) that constantly seeds all the files in the git-annex repository, while waiting for a potential remote to request data. + +So even if this happens, it is probably gonna take some time. + +Just my 2cents. +"""]] diff --git a/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn b/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn new file mode 100644 index 000000000..d04eee18d --- /dev/null +++ b/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn @@ -0,0 +1 @@ +Having it named starting with "Add to ..." would improve its convenience visibility (would even position before "Add to Dropbox" ;) ) diff --git a/doc/todo/Bittorrent-like_features.mdwn b/doc/todo/Bittorrent-like_features.mdwn new file mode 100644 index 000000000..1dfe2c627 --- /dev/null +++ b/doc/todo/Bittorrent-like_features.mdwn @@ -0,0 +1,47 @@ +There are two different possible ways git-annex could use bittorrent: + +Let's describe those one by one. + +[[!toc]] + +Downloading files from multiple git-annex sources simultaneously +================================================================ + +Having your remotes (optionally!) act like a swarm would be an awesome feature to have because you bring in a lot of new features that optimize storage, bandwidth, and overall traffic usage. This would be made a lot easier if parts of it were implemented in small steps that added a nifty feature. The best part is, each of these could be implemented by themselves, and they're all features that would be really useful. + + 1. Concurrent downloads of a file from remotes. + + This would make sense to have, it saves upload traffic on your remotes, and you also get faster DL speeds on the receiving end. + + 2. Implementing part of the super-seeding capabilities. + + You upload pieces of a file to different remotes from your laptop, and on your desktop you can download all those pieces and put them together again to get a complete file. If you really wanted to get fancy, you could build in redundancy (ala RAID) so if a remote or two gets lost, you don't lose the entire file. This would be a very efficient use of storage if you have a bunch of free cloud storage accounts (~1GB each) and some big files you want to back up. + + 3. Setting it up so that those remotes could talk to one another and share those pieces. + + This is where it gets more like bittorrent. Useful because you upload 1 copy and in a few hours, have say, 5 complete copies on 5 different remotes. You could add or remove remotes from a swarm locally, and push those changes to those remotes, which then adapt themselves to suit the new rules and share those with other remotes in the swarm (rules should be GPG-signed as a safety precaution). Also, if/when deltas get implemented, you could push that delta to the swarm and have all the remotes adopt it. This is cooler than regular bittorrent because the shared file can be updated. As a safety precaution, the delta could be GPG signed so a corrupt file doesn't contaminate the entire swarm. Each remote could have bandwidth/storage limits set in a dotfile. + +This is a high-level idea of how it might work, and it's also a HUGE set of features to add, but if implemented, you'd be saving a ton of resources, adding new use cases, and making git-annex more flexible. + +Obviously, Step 3 would only work on remotes that you have control of processes on, but if given login credentials to cloud storage remotes (potentially dangerous!) they could read/write to something like dropbox or rsync. + +Another thing, this would be completely trackerless. You just use remote groups (or create swarm definitions) and share those with your remotes. **It's completely decentralized!** + +This was originally posted [[as a forum post|forum/Wishlist:_Bittorrent-like_transfers]] by [[users/GLITTAH]]. + +Update: note how [[design/assistant/telehash/]] may be able to answer this specific use case. + +Using an external client (addurl torrent support) +================================================= + +The alternative to this would be to add `addurl` support for bittorrent files. The same way we can now add Youtube videos to a git-annex repository thanks to [[quvi]], we could also simply do: + + git annex addtorrent debian-live-7.0.0-amd64-standard.iso.torrent + +or even better: + + git annex addurl http://cdimage.debian.org/debian-cd/current-live/amd64/bt-hybrid/debian-live-7.0.0-amd64-standard.iso.torrent + +This way, a torrent would just become another source for a specific file. When we `get` the file, it fires up `$YOUR_FAVORITE_TORRENT_CLIENT` to download the file. + +That way we avoid the implementation complexity of shoving a complete bittorrent client within the assistant. The `get` operation would block until the torrent is downloaded, i guess... --[[anarcat]] diff --git a/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment b/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment new file mode 100644 index 000000000..eba291af9 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Gastlag" + ip="109.190.97.30" + subject="Gittorrent" + date="2013-08-28T21:49:56Z" + content=""" +May this could interest you : few years ago somes tried to mix Git and Bittorrent. + +http://www.advogato.org/article/994.html +http://utsl.gen.nz/gittorrent/rfc.html +http://code.google.com/p/gittorrent/ +https://git.wiki.kernel.org/index.php/SoC2010Application#Did_your_organization_participate_in_past_GSoCs.3F_If_so.2C_please_summarize_your_involvement_and_the_successes_and_challenges_of_your_participation +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment b/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment new file mode 100644 index 000000000..ed6e92fd8 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTIL7ubr5opWM69Q5VtCxuxC2H0SSnzic" + nickname="Petr" + subject="Regarding the approach to connect all nodes in one network and stream from them" + date="2013-12-29T07:32:05Z" + content=""" +Have a look at http://socialvpn.wordpress.com/. Behind that project is couple of interesting tools worth to investigate. +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment b/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment new file mode 100644 index 000000000..a405bed09 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2014-01-02T01:31:05Z" + content=""" +> git annex addurl http://cdimage.debian.org/debian-cd/current-live/amd64/bt-hybrid/debian-live-7.0.0-amd64-standard.iso.torrent + +This is bad idea; it means you will be reliant on torrent files and trackers when magnet links are the way to go. +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment b/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment new file mode 100644 index 000000000..6787a2460 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2014-01-02T01:32:37Z" + content=""" +There's a bittorrent library for Haskell, btw: http://hackage.haskell.org/package/bittorrent + +Native support in form of a special remote would arguably be best... +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment b/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment new file mode 100644 index 000000000..620c82e97 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 5" + date="2014-04-01T04:43:16Z" + content=""" +re #3, sure, magnet link support would be awesome as well but i'd prefer to start with something i could digest more easily. + +looking at the source, it seems to me that the [quvi implementation](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=46b6d75) could serve as an example as to how this would work. more particularly, there's this concept of a [downloader](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=46b6d75#patch5) that can be used to tap into `addurl` directly. there's a check to see if the downloader is supported, for example. + +so we would need: + +1. see if the URL / magnet link can be turned into a .torrent somehow +2. figure out what the filename(s!) will be +3. start the torrent and wait for its completion, ideally with some progress bar + +i asked around to see if transmission-remote could do this, because it would be nice if we could use an existing daemon (instead of having to rebootstrap the whole DHT at every download). so far, I can't see how it could be done cleanly - maybe we would need to use the simpler \"bittorrent\" commandline client, or maybe tap into libtorrent... + +in any case, one of the key problems here is that addurl assumes that the URL maps to a single file, not a directory full of file, which is the way bittorrent works. I am not sure how to fix that assumption. +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_6_489505da4143fb1c2bf21e7af695cdef._comment b/doc/todo/Bittorrent-like_features/comment_6_489505da4143fb1c2bf21e7af695cdef._comment new file mode 100644 index 000000000..678bb109b --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_6_489505da4143fb1c2bf21e7af695cdef._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmHp5oVW8Z9v_vHs5FRtlYj80TYMQWVTS0" + nickname="dhead" + subject="comment 6" + date="2014-06-10T02:18:43Z" + content=""" +What about Syncthing protocol ? +https://github.com/calmh/syncthing/blob/master/protocol/PROTOCOL.md +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn new file mode 100644 index 000000000..941ac9e5a --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn @@ -0,0 +1,22 @@ +Note: This may not be a bug maybe the software doesn't work the way I think. + +What steps will reproduce the problem? + +Using the webapp, I created a normal repo on my desktop. I then added a 'Removable drive' repo on my usb stick. + +I want all my files to be synced and accessibles on both repos so I set the 'Removable drive' repo to 'client'. + + +What is the expected output? What do you see instead? + +When I look in the 'annex' folder on my usb stick. I see a git repo (annex, branches, hooks) instead of seeing the files in the same way the 'annex' repo on my desktop is. + + +What version of git-annex are you using? On what operating system? + +I'm using 9e57edff287ac53fc4b1cefef7271e9ed17f2285 (Fri Feb 22 15:19:25 2013 +0000). + +Ubuntu 12.10 x86_64 + +[[!tag /design/assistant]] +[[!meta title="assistant should set up non-bare repos on removable drives, and update them when syncing with them"]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment new file mode 100644 index 000000000..282e78298 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 1" + date="2013-02-22T21:46:59Z" + content=""" +You have a bare git repository on your USB stick. The assistant uses bare repositories on USB sticks currently, although recent changes to support FAT make it possible to use non-bare repositories. + +For this to really work the way you want it to, the assistant would need to start updating local non-bare repositories whenever it pushed changes to them. Currently the assistant only updates the repository it's running in, so a non-bare repository on USB would lag behind and show an old version of the directory until manually updated with `git annex sync`. +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment new file mode 100644 index 000000000..da1fcbc0f --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 2" + date="2013-02-27T00:02:01Z" + content=""" +Struggling to get the assistant to behave properly, including a similar situation to the above. + +I start the assistant with 'git annex webapp' and create an annex from the webapp. +Adding an SSH remote (even if just a different directory on localhost) with \"Remote server\", creates the remote directory with what looks like what the contents of .git should be (annex, branches, hooks, objects etc.), regardless of the group chosen. + +Judging from your above comment, this means it is creating a bare repository. Why would it be doing this for an SSH remote, where git-annex-shell is available? + +System: Arch Linux +git-annex version: 3.20130216 +Installed with: yaourt -S git-annex-bin +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment new file mode 100644 index 000000000..48d1b2604 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-02-27T01:12:29Z" + content=""" +Xyem, if you use git to clone a repo, instead of letting the assistant do it for you, you can get a non-bare repo. See the walkthrough for some examples. You can keep its working tree up to date with \"git annex sync\" run in that directory. + +Only helpful if you don't mind using git annex at the command line, I know. + +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment new file mode 100644 index 000000000..8ad0de3a5 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 4" + date="2013-02-27T12:16:45Z" + content=""" +@edheil: +Yes, I have found that creating the repositories outside of the assistant (or directly on each machine through the assistant) and adding the remotes manually doesn't have this issue.. but as I am not setting this up for myself, so dropping to the command line is an issue (she's not averse to it, but also isn't a power user). + +It seems that the assistant/webapp is replacing dropbox functionality, while ignoring the functionality of git-annex. Perhaps I am misunderstanding the goal of it..? + +My intended use case in the situation where this issue comes up is: + +Repository on desktop has a copy of all files in indirect mode. +Repository on netbook only has a copy of files added locally or fetched manually. +Dropping a file in the netbook annex should cause it to be uploaded to the desktop repository (when it is available). Files should be fetchable/droppable (and unlockable) using the webapp from the desktop/netbook repository respectively. + +But it looks like this is (currently) unachievable as the webapp provides no method of fetching/dropping files, the assistant does not create the remote repositories correctly and requires dropping to the command line if worked around. Eep! + +Hope this doesn't come off as sour complaining. I was introduced to git-annex by a friend about a week ago (she only learned about it about 2-3 weeks ago and *loves* it) and it is a very nice and flexible tool which fits my own use case perfectly, meeting and exceeding every expectation.. until it came to the assistant and webapp (which makes me wonder why Joey is working on an Android port..). +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment new file mode 100644 index 000000000..26b472dc7 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2013-02-27T17:05:07Z" + content=""" +There is a way to fetch/drop files if you don't want to use the command line, though it's not nearly as flexible as using a command line. If you've got a machine set as \"client\" then dragging files into a subdirectory named \"archive\" drops them, and dragging them out of that subdirectory fetches them. + +Honestly, moving files in and out of directories, and preferred content settings, have both been subject to the occasional regression, so there have been times this hasn't worked right, but in theory, that's how you do it. + +Unfortunately if you've got more than one \"client\" machine, this means adding/dropping files on one will affect them all, as file movements propagate. +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment new file mode 100644 index 000000000..3fadb6219 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 6" + date="2013-02-27T17:06:45Z" + content=""" +also... I've never used the feature where you have two local machines running git-annex and you tell one to share a repo with the other through the web interface, but maybe it would be helpful for this scenario? Apologies if you've already tried that. +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment new file mode 100644 index 000000000..03d9950bc --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-02-27T17:43:45Z" + content=""" +The way this is supposed to (and does) work is that you use the webapp to create a repository on each computer, and then you pair them together using either local pairing or xmpp pairing. + +Today's release of git-annex also adds UI in the webapp to create additional local repositories that are connected to the current repository. However these are not really intended to be put on removable drives since the assistant needs to be running on them to keep them up-to-date. +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment new file mode 100644 index 000000000..1ef87e6a6 --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 8" + date="2013-02-27T18:36:16Z" + content=""" +@Joey: +As my use case is 1 person using multiple machines, I didn't think local/XMPP pairing was appropriate. + +Local pairing because the netbook leaves the network the desktop machine is on, which is when transferring the files is wanted (otherwise, they would just use the desktop...). +XMPP pairing description implies that it is for 2 different people (thus 2 different addresses). Can it be used where both annexes are using the same address? Or does the address also allow you to include the location (i.e. name@host.com/netbook)? + +It definitely sounds like I am misunderstanding how this is supposed to work so I apologise for that. Please keep up the excellent work. git-annex is one of those tools I wish I had learned about a long time ago! + +@edheil: Interesting workaround, thanks. +"""]] diff --git a/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_9_3f0bfc5a79aa59ac76a6968aacda6655._comment b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_9_3f0bfc5a79aa59ac76a6968aacda6655._comment new file mode 100644 index 000000000..d370bb28d --- /dev/null +++ b/doc/todo/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_9_3f0bfc5a79aa59ac76a6968aacda6655._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="confusing..." + date="2014-05-14T05:04:01Z" + content=""" +this is still really confusing. having to create the repo by hand is a really confusing step - i have setup an external drive to have my files with me as i move around, having to go through hoops to find them in a bare repository seems contrary to the spirit of \"future proofing\" inherent to git annex. + +the solution i found was to `git init` the repo on the removable drive before adding it through the webapp. i hope this can eventually be fixed, as it led to confusion among many other users (e.g. [[forum/Accessing_files_in_bare_repository/]], [[bugs/Adding a repository as a \"remote server\" creates a bare repository next to the existing one/]], [[forum/remote server client repositories are bare!?/]] and so on). --[[anarcat]] +"""]] diff --git a/doc/todo/Chunks_support_in_all_special_remotes.mdwn b/doc/todo/Chunks_support_in_all_special_remotes.mdwn new file mode 100644 index 000000000..d6a1509f7 --- /dev/null +++ b/doc/todo/Chunks_support_in_all_special_remotes.mdwn @@ -0,0 +1,5 @@ +The special remote `directory` support files split in chunks, other special remotes do not. + +Support for chunks is useful, for example, to be able to upload large files over slow, unreliable connections or to minimize the amount of data to be sent when only part of a big file has been changed. + +Couldn't the code used to split, checksum and reconstruct the files in the `directory` remote be used also in all the other special remotes? diff --git a/doc/todo/Chunks_support_in_all_special_remotes/comment_1_d12604dbeb42bbb6850425d237cb01e7._comment b/doc/todo/Chunks_support_in_all_special_remotes/comment_1_d12604dbeb42bbb6850425d237cb01e7._comment new file mode 100644 index 000000000..93ff8e53f --- /dev/null +++ b/doc/todo/Chunks_support_in_all_special_remotes/comment_1_d12604dbeb42bbb6850425d237cb01e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-11T20:17:05Z" + content=""" +See [[design/assistant/chunks]] +"""]] diff --git a/doc/todo/Deleting_Unused_Files_by_Age.mdwn b/doc/todo/Deleting_Unused_Files_by_Age.mdwn new file mode 100644 index 000000000..b72768bca --- /dev/null +++ b/doc/todo/Deleting_Unused_Files_by_Age.mdwn @@ -0,0 +1,13 @@ +I periodically move unused files to one of my servers. What I would like to +do is drop any unused file that has been unused for say more than 6 months? +I would like to not drop all unused files. + +> It strikes me that this is quite similar to how git handles deleting +> stale refs with the reflog. So, if `git annex unused` were changed to +> also look at the reflog, it would keep all files referred to by all refs +> in the reflog, until the reflog expires. You could then set reflog expiry +> to 6 months, and be done. +> +> However, I think that many users expect git annex unused to be able to +> immediately find and remove a file after it's been deleted. So this +> probably needs to be a configurable behavior. --[[Joey]] diff --git a/doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn b/doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn new file mode 100644 index 000000000..c2cf26f83 --- /dev/null +++ b/doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn @@ -0,0 +1,9 @@ +The automatic conflict resolution currently seems to only work within +the context of sync, when merging «synced/foo» into «foo». It would be +convenient if this functionality were exposed for manual merges +between local branches. + +E.g., one might invoke «git annex merge» or «git annex autoresolve» +after «git merge» when conflicts are found. + +> [[done]] as resolvemerge. --[[Joey]] diff --git a/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running.mdwn b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running.mdwn new file mode 100644 index 000000000..7f7a482b9 --- /dev/null +++ b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running.mdwn @@ -0,0 +1,5 @@ +I’m just experimenting with git-annex on a repo of ~150k files in about the same number of directories (WORM-backend). Calling, e.g., «git annex status» will take several minutes while stat()-ing all the files (for changes, I presume). + +This might already be on you todo list, but I was wondering whether it is possible to increase the performance of «annex status» (or related commands) when «annex watch» is running in the background. In that case, «status» could rely on cached data built-up at some point during initialization, plus based on the data that was accumulated via inotify. (Hopefully, all this won’t even be needed anymore on btrfs at some point in the future.) + +(I’m not very knowledgable in these things, so just out of curiosity: I noticed that, even though the «status» invocation takes ages, no HDD activity occurs and all the metadata is probably already in the Linux caches from a run I conducted immediately beforehand. Why do you figure that is? Is context switching so hugely expensive?) diff --git a/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_1_e5f2630591ffa7758ca4250a061a8589._comment b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_1_e5f2630591ffa7758ca4250a061a8589._comment new file mode 100644 index 000000000..446562f85 --- /dev/null +++ b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_1_e5f2630591ffa7758ca4250a061a8589._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-10T19:37:38Z" + content=""" +Neither `git annex watch` nor the `assistant` persistently store any data about the files in the repository in memory. They cannot speed up `git annex status`. + +I'm not sure what's the point of running `git annex status` while the daemon is running, since the daemon will normally immediately notice changes and commit them. The status output should thus generally be empty. + +FWIW, `git annex status` takes 0.3s in my largest repo (55k files), on an SSD. That's in indirect mode, and the time is almost completely spent in running `git ls-files --modified`, which is probably about as fast as it can be. In a direct mode repository, it will be rather slower, since it has to query git for the key that was last committed for each file, in order to look up that key's info and see if the file has been modified. +"""]] diff --git a/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_2_f8a5cc905d5b06bdbb1a778ab866a28c._comment b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_2_f8a5cc905d5b06bdbb1a778ab866a28c._comment new file mode 100644 index 000000000..315569ca1 --- /dev/null +++ b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_2_f8a5cc905d5b06bdbb1a778ab866a28c._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 2" + date="2014-07-11T11:46:08Z" + content=""" +Yes, you’re probably right that the benefit of this is slim when the +watching daemon auto-adds new files. So the «status» output would +never change and show the status that upheld before starting the +daemon. + +The reason I brought this up that I recall reading a comment of yours +somewhere on the site, to the effect that the assistant can sometimes +speed up certain operations, because it can make certain valid +assumptions on the state of the repo due to the fact that the +assistant has been monitoring it. I don’t recall what those operations +were, though. That’s why it occurred to me whether there might be a +daemon that just monitors via inotify, and neither adds nor syncs, and +only provides information to certain commands to speed things up under +some circumstances. + +In general, is it accurate to say that git-annex mostly takes the +«space» option when making a space/time-trade-offs? I noticed that the +memory consumption is really slim most of the time, and wondered +whether there might be options of speeding operations up by relying on +more memory instead (perhaps also doing persistent caching). On the +other hand, in some regards you are probably committed to the +time/memory trade-offs taken by vanilla git, so maybe there’s not much +room for improvement, git-annex wise… + +Maybe direct-mode repos on the order of 100k’s of files are just not +practical. I’m using indirect mode for my really big repos now, and +it’s now responsive enough to use (except for «annex unused», which is +inherently expensive, as you once explained). At least commiting won’t +take tens of minutes that way. I’ll just have to make the software +play nicely with the symlinks. + +BTW, the file-system seems to have a huge impact on this. My large +direct mode annex is practically unusable on ext (tens of minutes per +commit), but still usable on btrfs (a few minutes). I’m migrating one +disk to btrfs at home and will do some controlled benchmarks then. The +added bonus is that directories don’t always take up a full block. + +"""]] diff --git a/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_3_626c629654508d0d948ece849d43ed86._comment b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_3_626c629654508d0d948ece849d43ed86._comment new file mode 100644 index 000000000..58cf33c10 --- /dev/null +++ b/doc/todo/Faster___171__git_annex_status__187___when___171__git_annex_watch__187___is_running/comment_3_626c629654508d0d948ece849d43ed86._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 3" + date="2014-07-11T11:54:26Z" + content=""" +Ah, interesting, some caching ideas are already discussed at [https://git-annex.branchable.com/design/caching_database/]. +"""]] diff --git a/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn b/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn new file mode 100644 index 000000000..d9d9795cb --- /dev/null +++ b/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn @@ -0,0 +1,42 @@ +Direct mode is great because it removes symlinks. A must-have for directories like `~/Documents`. Unfortunately, it removes the possibility to use `git` commands other than `git-annex`. Also, it doen't preserve history of files. + +I would be great to have a mode where: + +- files are available in plain, not as sylinks +- the repository could still be trusted to hold version of some files from other repositories +- from a user point of view, the history of a file before the checkout would be preserved. + +In feature rich file systems that have copy on write feature, it could be implemented by having the files in both places at the same time: + +- the current version of a file would be in the working copy +- the file in the working copy would be a copy-on-write of the file in the annex repository +- when the file in the working copy changes, `git-annex` notices it and copy the file in the annex repository using copy-on-write semantic + +If the file system do not support copy-on-write, it could be an option (do you want secure direct mode that takes twice the disk space or light direct mode that don't preserve the history of your files?) + +This would make direct more much more robust. + +copy on write is available using `cp --reflink=always`. It correspond to the following code ([coreutils src/copy.c line 224](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/copy.c#n224)): + + /* Perform the O(1) btrfs clone operation, if possible. + Upon success, return 0. Otherwise, return -1 and set errno. */ + static inline int + clone_file (int dest_fd, int src_fd) + { + #ifdef __linux__ + # undef BTRFS_IOCTL_MAGIC + # define BTRFS_IOCTL_MAGIC 0x94 + # undef BTRFS_IOC_CLONE + # define BTRFS_IOC_CLONE _IOW (BTRFS_IOCTL_MAGIC, 9, int) + return ioctl (dest_fd, BTRFS_IOC_CLONE, src_fd); + #else + (void) dest_fd; + (void) src_fd; + errno = ENOTSUP; + return -1; + #endif + } + +Looking at the code it would be preferable to exec directly to `cp`, see [copy_range() on LWN](http://lwn.net/Articles/550621/) and this [more recent article about splice() on LWN](http://lwn.net/Articles/567086/) + +Also, `cp --reflink` fall back to copy when copy-on-write is not available while `cp --reflink=always` do not. diff --git a/doc/todo/LIst_of_Available_Remotes_in_Webapp.mdwn b/doc/todo/LIst_of_Available_Remotes_in_Webapp.mdwn new file mode 100644 index 000000000..89274bb8d --- /dev/null +++ b/doc/todo/LIst_of_Available_Remotes_in_Webapp.mdwn @@ -0,0 +1 @@ +When using git-annex in a distributed fashion (lots of repos everywhere) It is easy to lose track of which remotes has a particular repo and enable it. Currently I have to run `git annex info` and see which remotes are available then add them through the webapp. Would it be possible to make webapp show all repos not just the ones it is syncing give an option to enable it. diff --git a/doc/todo/LIst_of_Available_Remotes_in_Webapp/comment_1_23fe2f3cd44c4357a385452dcd5eedef._comment b/doc/todo/LIst_of_Available_Remotes_in_Webapp/comment_1_23fe2f3cd44c4357a385452dcd5eedef._comment new file mode 100644 index 000000000..9e22dafca --- /dev/null +++ b/doc/todo/LIst_of_Available_Remotes_in_Webapp/comment_1_23fe2f3cd44c4357a385452dcd5eedef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 1" + date="2014-04-17T20:54:18Z" + content=""" +I chose to make the webapp only show available remotes when it knows how to enable them. So it will show S3 special remotes, Box.com special remotes, etc. This avoids cluttering up the display of a shared repository with a list of all of your friend's removable drives, for example. + +I would like to make the webapp smarter about handling repositories on remote ssh servers. As long as the server name is in the global DNS, the webapp could easily walk the user through setting up such a remote. The missing piece is that nothing is logged in remotes.log for these remotes, and so the assistant doesn't know the server name. +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn new file mode 100644 index 000000000..419b6795e --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn @@ -0,0 +1,9 @@ +### Please describe the problem. +Instead of storing config for each remote in ~/.ssh/config, which mixes the user own config with that of git-annex-assistant, which is irritating if (like me) you store your ssh config in a vcs. Since the option -F allows the choice of the config file, it should be possible to move the config into ~/.ssh/git-annex/config. The only issue I see is according to the ssh man page on my system states that the system-wide config is ignored if a config file is specified on the command line. + +### What version of git-annex are you using? On what operating system? +I'm using git-annex 4.20130601 on a Debian Testing/Unstable/Experimental mix. + +[[!tag design/assistant]] + +[[wontfix]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment new file mode 100644 index 000000000..5997664e0 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-11T14:44:47Z" + content=""" +The only interface git provides to do this is `GIT_SSH`, which would have to be set to a wrapper script that runs ssh with the desirned options. + +And if that were used, `git pull` by itself would not work on the repositories set up by the assistant. I don't consider that very nice. +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment new file mode 100644 index 000000000..3cf75df08 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-11T14:48:01Z" + content=""" +Also, if you're going to set up something like local pairing, why would you *not* want to commit that config to git along with your other ssh configs? Config files in $HOME are quite frequently edited by helper programs to configure changes, and I personally commit those changes all the time. + +Perhaps your real problem is that you have one `.ssh/config` that is shared between multiple hosts, and the git-annex settings are specific to a single host. Have you considered using [vcsh](https://github.com/RichiH/vcsh)? +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment new file mode 100644 index 000000000..3442fb2b2 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3Wgg0XiqYFwM_Pw1RxZwlpNFi65g17sM" + nickname="James" + subject="comment 3" + date="2013-06-12T01:12:24Z" + content=""" +Ah, ok, I presumed there was an option in git to set a per-repository ssh command. I've looked at vcsh, but I'm not that confident with git remotes, so I don't use it (I use hg). If a per-repository ssh command added to git, would you consider adding this? +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment new file mode 100644 index 000000000..5a22c98f7 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-06-12T19:23:50Z" + content=""" +If it were sane, I'd probably use it. + +In the meantime, I'm moving this to [[todo]]. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn new file mode 100644 index 000000000..98dd58d5e --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn @@ -0,0 +1,23 @@ +The [[special remotes]] available all do great things and enable a ton of different services to be integrated. + +Strikingly, the one service I can't satisfactorily integrate with git-annex is a remote folder on a eg NAS (think: computer without git-annex installed) that I want to look like the original annex. As in, when I do a 'tree annexdir' it'd look the same on both locations (except, on the remote there would not be any symlinks, it'd be like it was in directmode, and there would not be a .git subdir). + +## Why? Use Case? + +I have a Synology NAS that I share access with with my wife. I want her to be able to access the files (photos/videos/music) in a sane manner (ie: not traversing sub-sub-sub 'randomly' named directories) but I also want to be able to manage them with git-annex on my machine (to gain the standard git-annex benefits, specifically the bob the archivist use case). The NAS has the ability to use ssh+rsync, so I'll assume those two tools can be used. + +This special remote could be thought of as the 'least common denominator of special remotes'; almost any server with ssh+rsync could be a remote, no matter if you have install privs or if the architecture (eg: ARM) is supported by git-annex. + +## Issues? + +First and foremost, this can't be (really really shouldn't be) a trusted remote; my wife could accidentally delete all files on the NAS while I am away. So my local git-annex shouldn't assume the NAS counts towards numcopies (unless I'm a real masochist). + +Secondly, what to do when files change/are added/removed on the special remote? Probably the same thing that the assistant does with everything. The only thing special is that new/modified files will need to be copied locally from this special remote before being added to the annex (to get hash and such). + +> This is not feaisble given git-annex's design. If I wanted to +> make something completely unlike git-annex, I suppose it could be done, +> but it's off topic here. [[wontfix|done]]. +> +> If you want to use git-annex on a Synology NAS, the arm standalone build +> will work, and then you can use the command-line, or the assistant +> to maintain a git repository that contains your files as desired. --[[Joey]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment new file mode 100644 index 000000000..575748b56 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 10" + date="2013-12-16T20:41:47Z" + content=""" +How is that better than `rsync -a gitrepo cleandirectory`? + +Perhaps better related to the original problem of getting git-annex running on a Synology NAS, [[forum/new linux arm tarball build]]. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment new file mode 100644 index 000000000..1ec5bbc54 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 1" + date="2013-11-27T14:59:11Z" + content=""" +You could mount this NAS as a network drive on your computer (via samba for example or, even better, nfs), couldn't you? In this case you could use a real annex repository, and not a remote one. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment new file mode 100644 index 000000000..89663893e --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="mounting over NFS/etc ..." + date="2013-11-27T16:01:50Z" + content=""" +TroisSinges: Yeah, I could, but that'd limit me to being on the local network when I want to interact with the repo; not ideal. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment new file mode 100644 index 000000000..60d422838 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 3" + date="2013-11-28T02:36:15Z" + content=""" ++1 on this suggestion. + +Not all NASs are created equal so SAMBA/NFS isn't always the most recent version, upgrades aren't always possible (yes, I'm looking at you Drobo!) so sometimes you just can't do what g-a needs to do (locks are my big problem). + +This would be a great option to have, even with the downsides of losing a lot of the awesome-sauce of git-annex. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment new file mode 100644 index 000000000..f79fb4940 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVICFY2CDP08xdsPr3cgmScomy9HA-1sk" + nickname="Andrew" + subject="comment 4" + date="2013-11-29T04:11:24Z" + content=""" ++1 for this style of repository (again). + +Presenting the content of a git-annex repository in a way that + +1. is transparent (nobody but me need know or care it's a git-annex repository) +2. doesn't require installation (NAS or other device I can't install to) +3. works without thinking (doesn't required commits or checkouts or manual deferencing symlinks - see also point 1) + +would fulfil the \"like dropbox but awesome\" idea from the Kickstarter. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment new file mode 100644 index 000000000..f87bf1aec --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 5" + date="2013-12-05T19:52:52Z" + content=""" +Comment #1 was my initial reaction. A regular direct mode git-annex repository on the mounted NAS share. + +I don't quite understand the response to it \"that'd limit me to being on the local network when I want to interact with the repo\". How could git-annex update this NAS if it's not on the local network? + +So far, the only reason that has been brought up that makes sense to me is locking. git-annex does use locking in its repository to prevent 2 git-annex commands run at the same time doing conflicting operations. (Lack of that locking could in some cases cause data loss.) I think git-annex's locking is limited entirely to files within the .git directory. So, if a SMB mount for a NAS does not support locking, one approach could be to move the .git directory to local disk, and use `GIT_DIR` to make it be used when operating in that repository. This should get you exactly what was requested. Whether it makes sense or is sufficiently easy to use is another question. + +I tend to think that a better use of a NAS in many cases is to put a directory or rsync (if it supports rsync) special remote on the NAS, and have git-annex on the individual client machines. The webapp could have a UI that makes setting up a NAS like that simple, and it would be easy to do. + +The use case for having a mirrored directory tree on the NAS seems to be limited to when the clients using it are something that cannot run git-annex itself, but that still cares about filenames, as opposed to just operating on file contents. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment new file mode 100644 index 000000000..75614d69f --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 6" + date="2013-12-05T19:57:32Z" + content=""" +The other problem with this idea is that it seems to want the assistant to watch the file tree in the NAS, and make commits etc when files there are changed. + +But, any computer on the network that has the NAS mounted can change a file! AFAIK there is no interface to detect when such changes have happened; inotify does not help. It seems git-annex would have to expensively periodically scan the directory to find changes. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment new file mode 100644 index 000000000..7ff072d4c --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 7" + date="2013-12-05T21:20:54Z" + content=""" +> How could git-annex update this NAS if it's not on the local network? + +ssh and port forwarding, like any home server. + +> I tend to think that a better use of a NAS in many cases is to put a directory or rsync (if it supports rsync) special remote on the NAS, and have git-annex on the individual client machines. + +I'm thinking of this like the public view of a git-annex repository. I want anyone to be able to view/download the files as they normally would. + +> The use case for having a mirrored directory tree on the NAS seems to be limited to when the clients using it are something that cannot run git-annex itself, but that still cares about filenames, as opposed to just operating on file contents. + +That's exactly my use case. + +> So far, the only reason that has been brought up that makes sense to me is locking. + +Locking is actually tangential to the issue/use case. Direct mode would solve that issue, but git-annex isn't built for the Synology NAS platform, so it isn't an option. + +> The other problem with this idea is that it seems to want the assistant to watch the file tree in the NAS, and make commits etc when files there are changed. + +I think you read too much into that part. :) I only want git-annex to do things when I 'sync' or similar. I'm actually not wanting *the assistant* to do much in this case. This might even be a non-assistant applicable use case. (I don't use the assistant in my large repositories, like photos and videos and music.) I only mentioned the assistant to point out that it has some of the logic (what to do with changed/deleted files) already. + +And honestly, I'd be fine with an implementation that overwrote all changes on this special remote on each sync (as needed). The response to that suggestion is \"just use rsync by itself to put the files on the NAS\" but that assumes I have all of the files on my local checkout (I don't). +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment new file mode 100644 index 000000000..3aeb04e53 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="gan" + ip="85.224.8.104" + subject="Hook implementation?" + date="2013-12-07T01:15:46Z" + content=""" +1. I would propose the name \"plain directory\" for this special remote. Clean is not a good description, IMHO. + +2. When I read this a week ago I took the opportunity to play with the special remote hook, because as far as I can understand this could be a relatively trivial implementation that need not necessarily be in git-annex \"core\". And I'd like to contribute back to the git-annex community and help a brother out... I used the method of calling a single script from all hook points, and inside it look at what operation was requested. +I didn't get that far before giving up however. I got the feeling that hook would benefit from some extension and a bit more complete API to really create the opportunity for third-party extensions to git-annex this way. I would prefer that the hook script can handle several instances of remotes without creating custom hook scripts for each instance. Specifically I think a hook is needed also for \"init\" of a new remote (to get a unique identifier, and other parameters given by the user such as in this particular case, the path to the \"clean directory\") What do you think? +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment new file mode 100644 index 000000000..d96ac6987 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="pseudocode" + date="2013-12-08T15:23:36Z" + content=""" +The implementation should really be nothing more than the following to be run from a regular git annex repository with a configures special plain directory remote: + + foreach(path : allAnnexedFiles) { + if(remote.exists(path) && remote.filesize(path) === expectedFilesize) goto finally; + + if(fileAvailableLocally(path)) { + copyFileToRemote(path); + goto finally; + } + + if(shouldCopyFromElsewhere && canCopyFileFromSomeOtherRemote(path)) { + copyFileFromSomeOtherRemoteToRemote(path); + } + + finally: + logThatFileExistsOnRemote(path); + } + + foreach(remotePath : filesInRemoteDir) { + if(fileIsAnnexed(remotePath) || fileIsIgnored(remotePath) continue; + + delete(remotePath); + } + +The above pseude code assumes +- that the no other process is working on the remote at the same time. +- that the remote is not trusted. +- that nobody expects changes done at the remote to propagate to other clones. +"""]] diff --git a/doc/todo/Not_working_on_Android-x86.mdwn b/doc/todo/Not_working_on_Android-x86.mdwn new file mode 100644 index 000000000..56f2ce962 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86.mdwn @@ -0,0 +1,19 @@ +[[!meta title="Android is only autobuilt for arm, not x86 or mips"]] + +### Please describe the problem. + +git-annex doesn't start on [Android-x86](http://www.android-x86.org) in VirtualBox (version 4.1.18-dfsg-2+deb7u1). + +On Android 4.2.2 (android-x86-4.2-20130228.iso) it starts the terminal which prints nothing but `[Terminal session finished]`. +On Android 4.3 (android-x86-4.3-20130725.iso) it starts the terminal and prints: + + In mgmain JNI_OnLoad + + [Terminal session finished] + +The browser/webapp is never started. + +### What version of git-annex are you using? On what operating system? + +Version 1.0.52 for Android. I made sure to install the correct APK files for each version of Android. + diff --git a/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment b/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment new file mode 100644 index 000000000..4bcca0ab4 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-22T16:37:36Z" + content=""" +git-annex is a native binary, and is currently only being built for arm android. + +Is Android on x86 a thing used on real-world hardware? I have only seen it in the context of a developer's test environment. + +The instructions for building git-annex from source for Android should work on x86. The ghc-android build would need to be tweaked to build a cross compiler targeting that architecture. This can be done by editing settings near the top of ghc-android's `build.sh`. + +I am going to move this from bugs/ to todo/ after posting this comment, because it is certiantly not a bug, but a wishlist item at best. +"""]] diff --git a/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment b/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment new file mode 100644 index 000000000..3f568f555 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYSw35UMlOf9rFlP5EUTBz7is5X09qVXI" + nickname="Johannes" + subject="Support on Motorola razr i" + date="2013-11-28T16:10:38Z" + content=""" +Hi, +I'm using the Motorola razr i. So there is a usecase, where a x86 CPU is used in a mobile phone. If it's easy as you described, can you build a Version with x86 support? + +Thanks +Jack +"""]] diff --git a/doc/todo/Not_working_on_Android-x86/comment_3_6b609af60bf1c477139e40eba5cb0c4e._comment b/doc/todo/Not_working_on_Android-x86/comment_3_6b609af60bf1c477139e40eba5cb0c4e._comment new file mode 100644 index 000000000..e4ac8f820 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86/comment_3_6b609af60bf1c477139e40eba5cb0c4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.191" + subject="comment 3" + date="2014-04-20T21:01:50Z" + content=""" +Samsung Galaxy Tab 3 (GT-P5210) also needs this. + +Each new git-annex builder takes me days to set up, and is an ongoing drain to keep running. I would much rather walk someone else through setting one up, unless this becomes a very common architecture for android. +"""]] diff --git a/doc/todo/Pause_all_transfers_in_all_annexes_watched_by_the_assistant.mdwn b/doc/todo/Pause_all_transfers_in_all_annexes_watched_by_the_assistant.mdwn new file mode 100644 index 000000000..2ce33f726 --- /dev/null +++ b/doc/todo/Pause_all_transfers_in_all_annexes_watched_by_the_assistant.mdwn @@ -0,0 +1,11 @@ +## Use case: + +You have a few annexes that the assistant is watching for you. You're somewhere with poor wifi speed. You also just added a bunch of big files to a few annexes. Now all of a sudden your connection suffers and you want an easy way to pause all transfers until you're on a faster connection without losing the automatic 'add' and such of the assistant (iow: without having to shutdown the daemon). + +## Proposal: + +A "Pause all transfers" button in the webapp that pauses all transfers from all annexes the assistant is watching. + +It should toggle to "Resume all transfers" when pushed so you can also easily start the transfers again when you get somewhere else. + +This may or may not make more sense if the webapp showed all watched repos in a single view (instead of the separate pages/views as it is now). diff --git a/doc/todo/Recovering_from_a_bad_sync.mdwn b/doc/todo/Recovering_from_a_bad_sync.mdwn new file mode 100644 index 000000000..d60406568 --- /dev/null +++ b/doc/todo/Recovering_from_a_bad_sync.mdwn @@ -0,0 +1,31 @@ +Instead of using `sync origin` for the first sync and a simple `sync` for the other syncs, + + # on pc1 + git annex init "pc1" + git annex direct + git annex add . + git annex sync origin # remote specified on the first sync + + # add some files + git annex add . + git annex sync + +I used `sync` first and only later I used `sync origin` + + # on pc1 + git annex init "pc1" + git annex direct + git annex add . + git annex sync + + # add some files + git annex add . + git annex sync origin # remote specified on a later sync + +These sequences of commands create two completely different git histories. + +More important, if one clones on pc2 the first repository, they will see both the pc1 remote and the pc2 remote. Instead, if one clones on pc2 the repository created by the second combination of commands, they will see only the pc2 remote. + +What commands should I use on pc1 to fix the history so that when pc2 clones from the origin repository it will see both the pc1 remote and its own local remote? + +> [[done]]; fixed per my comments. --[[Joey]] diff --git a/doc/todo/Recovering_from_a_bad_sync/comment_1_6f5f518a3190534b737203787149ef3c._comment b/doc/todo/Recovering_from_a_bad_sync/comment_1_6f5f518a3190534b737203787149ef3c._comment new file mode 100644 index 000000000..fc354be3d --- /dev/null +++ b/doc/todo/Recovering_from_a_bad_sync/comment_1_6f5f518a3190534b737203787149ef3c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-14T18:27:43Z" + content=""" +If this is a todo item at all, it may make sense to make `git annex sync` sync even with git remotes that have no annex-uuid. + +As far as solving the problem, I think you just need to sync more in order to get the full list of remotes propigated around to all the remotes. Sync automatically merges disconnected git histories no matter how they got that way or how long they have been disconnected or diverged. +"""]] diff --git a/doc/todo/Recovering_from_a_bad_sync/comment_2_e494df56dcede4d14bcaa4cdbf3da4f5._comment b/doc/todo/Recovering_from_a_bad_sync/comment_2_e494df56dcede4d14bcaa4cdbf3da4f5._comment new file mode 100644 index 000000000..011129336 --- /dev/null +++ b/doc/todo/Recovering_from_a_bad_sync/comment_2_e494df56dcede4d14bcaa4cdbf3da4f5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-14T18:38:58Z" + content=""" +It seems that the person who filed this todo item also filed [[bugs/sync does not commit with alwasycommit = false]] and got pretty confused by that. + +So, repurposing this todo item to be about perhaps syncing with remotes that have no annex-uuid by default. +"""]] diff --git a/doc/todo/Recovering_from_a_bad_sync/comment_3_4d4904bcbf97401c7c11338f32577f96._comment b/doc/todo/Recovering_from_a_bad_sync/comment_3_4d4904bcbf97401c7c11338f32577f96._comment new file mode 100644 index 000000000..1d173f0ef --- /dev/null +++ b/doc/todo/Recovering_from_a_bad_sync/comment_3_4d4904bcbf97401c7c11338f32577f96._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 3" + date="2014-07-15T18:23:50Z" + content=""" +Making `git annex sync` automatically sync with remotes with no annex-uuid is more complicated than I first thought. + +In the case of a remote accessed over ssh, `git annex sync` already does sync with such a remote. Of course, it will set annex-ignore on it, since it has no annex-uuid. (Needed eg, for github, or just for preventing a repo from being used by git-annex if you don't want it to be.) Still, the git branches get synced, which is the behavior that we want. + +So, only local remotes are affected. Note that `git annex assistant` automatically git-annex inits the local remote when it lacks a uuid, and syncs with it. That seems ok. + +However `git annex sync` currently ignores the local remote when it has no uuid. Seems that this happens due to a bug, not intentionally. tryGitConfigRead tries to bootstrap up an annex state to read the repos's config, but this cannot be done in a repo that is not yet initialized. Result is the repo state is not read, and so it's treated as a local remote that is not currently available (ie, a disconnected disk). +"""]] diff --git a/doc/todo/Recursive_addurl_simlar_to_wget_--recursive.mdwn b/doc/todo/Recursive_addurl_simlar_to_wget_--recursive.mdwn new file mode 100644 index 000000000..bd0d9f170 --- /dev/null +++ b/doc/todo/Recursive_addurl_simlar_to_wget_--recursive.mdwn @@ -0,0 +1,7 @@ +## Use Case + +I want to import a bunch of files that are hosted somewhere, they nicely sorted by year and such. Instead of addurl'ing each by hand (or writing a custom script each time this happens) I want to simply: + +git-annex addurl --recursive http://somehost.tld/somedir/ + +For sanity, mimicking wget closely with default depth of 5, but customizable with the --level switch. diff --git a/doc/todo/Recursive_addurl_simlar_to_wget_--recursive/comment_1_4ecd9ddba1b63b571555ec9bef18e2d8._comment b/doc/todo/Recursive_addurl_simlar_to_wget_--recursive/comment_1_4ecd9ddba1b63b571555ec9bef18e2d8._comment new file mode 100644 index 000000000..72326c478 --- /dev/null +++ b/doc/todo/Recursive_addurl_simlar_to_wget_--recursive/comment_1_4ecd9ddba1b63b571555ec9bef18e2d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-07T20:10:51Z" + content=""" +Recursively traversing websites is *hard*, so I would rather leave it out of git-annex. +"""]] diff --git a/doc/todo/Show_repo_type_in_repo_list.mdwn b/doc/todo/Show_repo_type_in_repo_list.mdwn new file mode 100644 index 000000000..40fbe6537 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list.mdwn @@ -0,0 +1 @@ +It would be helpful to show each repo's type in the list. diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment b/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment new file mode 100644 index 000000000..10c0c17df --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T23:45:39Z" + content=""" +Currently if you go to the edit page for the repository, it shows some information about it, including its type and often its location, at the bottom of the page. + +I tend to feel that putting anything else in the repo list would result in it being too cluttered. +"""]] diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment b/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment new file mode 100644 index 000000000..7d4a36324 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-02T23:59:16Z" + content=""" +I understand. Well, here's what I'm looking at right now. :) + +[[http://alphapapa.net/outbox/view.png]] + +I just think it would be very useful to say \"Client\" or \"Transfer\" or \"Full Backup\" next to each one, and there's often plenty of room, depending on the size of the window. Especially when one's trying to wrap one's head around git-annex, being reminded what each repo is for would help a lot. Otherwise you basically have to put it in the name or description yourself...so why not just go ahead and show it? :) + +Another option might be to have an icon for each type. +"""]] diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment b/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment new file mode 100644 index 000000000..3f8b82695 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-03T00:19:34Z" + content=""" +I'd be happy to put in some icons if someone finds some good (and suitably licensed) ones that cover the different types of repositories. +"""]] diff --git a/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn b/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn new file mode 100644 index 000000000..00cdad0fe --- /dev/null +++ b/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? +Sync a lot of small files. + +What is the expected output? What do you see instead? +The expected output is hopefully a fast transfer. + +But currently it seems like git-annex is only using one thread to transfer(per host or total?) + +An option to select number of transfer threads to use(possibly per host) would be very nice. + +> Opening a lot of connections to a single host is probably not desirable. +> +> I do want to do something to allow slow hosts to not hold up transfers to +> other hosts, which might involve running multiple queued transfers at +> once. The webapp already allows the user to force a given transfer to +> happen immediately. --[[Joey]] + +And maybe also an option to limit how long a queue the browser should show, it can become quite resource intensive with a long queue. + +> The queue is limited to 20 items for this reason. --[[Joey]] diff --git a/doc/todo/Time_Stamping_of_Events_in_Webapp.mdwn b/doc/todo/Time_Stamping_of_Events_in_Webapp.mdwn new file mode 100644 index 000000000..0762f47ba --- /dev/null +++ b/doc/todo/Time_Stamping_of_Events_in_Webapp.mdwn @@ -0,0 +1,3 @@ +Currently events happening in the webapp (sync upload etc. on the right) has no time stamp thus user has no way to tell when was the last sync happened. Which is problematic when not using XMPP and repos lag behind. + +> [[dup|done]] of --[[Joey]] diff --git a/doc/todo/Use_MediaScannerConnection_on_Android.mdwn b/doc/todo/Use_MediaScannerConnection_on_Android.mdwn new file mode 100644 index 000000000..afce9308d --- /dev/null +++ b/doc/todo/Use_MediaScannerConnection_on_Android.mdwn @@ -0,0 +1,7 @@ +Currently if photos or videos are copied into the Camera/DCIM directory on an Android device, or deleted the Gallery doesn't notice the changes. + +It is necessary to call MediaScannerConnection - http://developer.android.com/reference/android/media/MediaScannerConnection.html - to notify the system of the change. + +More info, and some sample Java code: http://stackoverflow.com/questions/13270789/how-to-run-media-scanner-in-android + +It'd be awesome if the assistant did this on files it has changed. Possibly just under Camera/DCIM, but perhaps it should be configurable. MediaScannerConnection is also used to notify and index new music files. diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn new file mode 100644 index 000000000..a42a81d02 --- /dev/null +++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn @@ -0,0 +1,7 @@ +There are times when it is handy to be able to upload a file to a web host somewhere and share a link for that file to a select few people. + +It seems to be that the assistant could handle this scenario. It could generate a directory with a random name on the remote, and transfer the file there (using the existing filename) and the appropriate URL could be displayed in the assistant webapp to allow the user to copy the URL to send it to the appropriate people. + +Note: Joey and I had a quick chat about this use case at LCA2013. + +[[!tag design/assistant]] diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment new file mode 100644 index 000000000..35f735191 --- /dev/null +++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-02-09T22:38:56Z" + content=""" +This would be an extremely cool feature to rip off from Dropbox. :) + +"""]] diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_2_735afa6f87a93cdf333c17da32010620._comment b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_2_735afa6f87a93cdf333c17da32010620._comment new file mode 100644 index 000000000..b2e6c0dac --- /dev/null +++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_2_735afa6f87a93cdf333c17da32010620._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-04-07T04:35:39Z" + content=""" +i wonder if the assistant or the new daemon couldn't do this job as well... -- [[anarcat]] +"""]] diff --git a/doc/todo/Views_Demo.mdwn b/doc/todo/Views_Demo.mdwn new file mode 100644 index 000000000..54704afa6 --- /dev/null +++ b/doc/todo/Views_Demo.mdwn @@ -0,0 +1,15 @@ +Joey, + +I've been thinking about leveraging git-annex for a workgroup document repository and I have just watched your views demo. The timing of the demo is great because I need to deploy a document repository with per-document metadata and your views concept seems like a great mechanism for associating metadata to documents and for displaying that metadata. + +While I don't expect to use your views concept for my workgroup repostory, a later iteration might do. + +The metadata in my use case begins with all the weird metadata seen on a book's copyright page. In addition, per-document provenance, like how one found the document and (if we're lucky) a URL where the latest version of the document may be found. Metadata values may be simple strings or may be markdown text. + +So, are you considering a metadata syntax that can support complex metadata? One example is multiple authors. Another issue is complex metadata values, like key=abstract and value="markdown text...". + +FWIW, + +Bob + +> [[closing|done]]; requested feature was already present --[[Joey]] diff --git a/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment b/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment new file mode 100644 index 000000000..4c9b05635 --- /dev/null +++ b/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-24T18:17:04Z" + content=""" +All that should work fine. All metadata fields are multivalued, and the value can be any arbitrary data. +"""]] diff --git a/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn b/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn new file mode 100644 index 000000000..6e852b9f2 --- /dev/null +++ b/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn @@ -0,0 +1,14 @@ +It would be nice if a couple of additional environment variables to be set for hook uses. + +In particular: + + GIT_ANNEX_DIRECT=`git config annex.direct` + +and + + GIT_TOP_LEVEL=`git rev-parse --show-toplevel` + + +I've made some changes to flickrannex to allow the sub-directories above the uploaded image to be added as tags. This change has been merged into trunk: [[https://github.com/TobiasTheViking/flickrannex]] + +What I needed was both the environment variables mentioned above. One is set as part of the annex-hook and the other I guestimate from the file path. If it was set in git-annex it would be much cleaner (and accurate). So...I think this info would be useful for other hook. diff --git a/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment b/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment new file mode 100644 index 000000000..4d0409d58 --- /dev/null +++ b/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T19:36:08Z" + content=""" +Is this still relevant? +"""]] diff --git a/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant.mdwn b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant.mdwn new file mode 100644 index 000000000..972247c84 --- /dev/null +++ b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant.mdwn @@ -0,0 +1,3 @@ +Auto-repair takes up a lot of computing power, greatly slowing down the machine. It also still happens very often here, several times a month on different hardware, leading it to become an annoyance (and it would be easier and faster to perform manual repairs if that should be required). + +Therefore I'd like a setting that makes the assistant not attempt to repair on its own. Either not do anything at all, or display a message about it instead. diff --git a/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_1_3274820a0d1f10c505f15cd29a37b95a._comment b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_1_3274820a0d1f10c505f15cd29a37b95a._comment new file mode 100644 index 000000000..d4839cb1d --- /dev/null +++ b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_1_3274820a0d1f10c505f15cd29a37b95a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 1" + date="2014-05-21T18:29:16Z" + content=""" +What auto-repair are you referring to? + +If you schedule a fsck of the repository in the webapp, then when that finds a problem with the git repository, it will be repaired. So if you don't want this, remove any scheduled fsck jobs. + +The assistant also detects a few common problems at startup that prevent it from working, such as a corrupt index file, and automatically repairs those. These repairs only happen at startup. If the index file is corrupt, it has to delete it and re-add every file to the repository, which is expensive, but otherwise it would be completely non-functional. +"""]] diff --git a/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_2_2cf5aef3f1d340c4ed6249ef94c1b607._comment b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_2_2cf5aef3f1d340c4ed6249ef94c1b607._comment new file mode 100644 index 000000000..015dd8cd7 --- /dev/null +++ b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_2_2cf5aef3f1d340c4ed6249ef94c1b607._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.3" + subject="comment 2" + date="2014-05-21T18:35:42Z" + content=""" +Note that this is asking for a workaround for the bug [[bugs/Auto-repair_greatly_slows_down_the_machine]]. I would rather get to the bottom of that bug, but need more information to do so. +"""]] diff --git a/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_3_6c53d82e62b2d269a941ba967d05adf5._comment b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_3_6c53d82e62b2d269a941ba967d05adf5._comment new file mode 100644 index 000000000..07b1b2557 --- /dev/null +++ b/doc/todo/Wishlist:_disable_auto-repair_for_the_assistant/comment_3_6c53d82e62b2d269a941ba967d05adf5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.103.55" + subject="comment 3" + date="2014-05-21T19:18:19Z" + content=""" +I'm referring to the large auto-repairs of the actual git repository, as mentioned in the bug report you are referring to. I was under the impression that the fscks also did the equivalent of 'git annex fsck' (which is greatly desired, even without the 'git fsck' checks). I realize it is a sort of workaround, but it is because the 'annex fsck' bit is desired, while the 'git annex repair' bit makes my computer unusable, the last time for over 24 hours, while it was running (at which point I needed to kill it and perform a manual repair). +"""]] diff --git a/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn b/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn new file mode 100644 index 000000000..ff7773d3e --- /dev/null +++ b/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn @@ -0,0 +1,7 @@ +In certain situations different client annexes might get the same remote repository added, but before being synced. + +Once the two clients sync they will both have two remotes with the same name. But only one UUID will have any content(Assuming only one client pushed). + +It would be nice to have some (automatic?) way to resolve this conflict. + +Not sure if anything sane can be done if both clients have pushed? diff --git a/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode.mdwn b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode.mdwn new file mode 100644 index 000000000..196b8f420 --- /dev/null +++ b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode.mdwn @@ -0,0 +1,8 @@ +Please let me know if there already is a way of achieving this; I’ve googled around a lot, but could not find any information pertaining to my particular problem. + +I am using direct mode in a bunch of repositories where I need quick write access to content and where I am not interested in preserving history. Some of these repositories do contain regular symlinks, however. Now, I suppose that in indirect repos, the way of adding symlinks would be to just «git add» them. However, since these are direct mode repos, I cannot do this. + +Is there already a good way of adding symlinks in direct mode? If not, I would find it useful if there were one. + +Best regards, +T. diff --git a/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_1_6c6e192bc0f70a386cd4275f98e1bd6f._comment b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_1_6c6e192bc0f70a386cd4275f98e1bd6f._comment new file mode 100644 index 000000000..83ccf32de --- /dev/null +++ b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_1_6c6e192bc0f70a386cd4275f98e1bd6f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="134.147.14.84" + subject="comment 1" + date="2014-07-07T12:48:07Z" + content=""" +Can it be considered safe adding symlinks via «git -c core.bare=false add symlink; git -c core.bare=false commit -m Update»? If not, is there a better way? +"""]] diff --git a/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_2_8e22cfdbeb2c841870a623cf4c7baf60._comment b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_2_8e22cfdbeb2c841870a623cf4c7baf60._comment new file mode 100644 index 000000000..b88ec65ae --- /dev/null +++ b/doc/todo/__171__git_annex_add__187___for_symlinks_in_direct_mode/comment_2_8e22cfdbeb2c841870a623cf4c7baf60._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-10T19:54:30Z" + content=""" +That is safe, but you have to be very careful anytime you override with -c core.bare=false. For example, if you did a `git commit -a`, it would commit your large files directly into git, which you don't want. + + +"""]] diff --git a/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn b/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn new file mode 100644 index 000000000..b2678bee8 --- /dev/null +++ b/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn @@ -0,0 +1,2 @@ +My original use case was for using git-annex find from scripts, where I didn't want to depend on the branch +checked out at the time, but rather write something like "git annex find --branch=master $searchterms" diff --git a/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment b/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment new file mode 100644 index 000000000..6d5320d41 --- /dev/null +++ b/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-17T19:48:57Z" + content=""" +The difficulty with adding a --branch is that if it causes git-annex to operate on a list of (file, key) from the branch, then commands that actually modify the working tree would modify it, instead of the branch. So the options seem to be only generating a list of keys, and so only letting commands that operate on keys work (which rules out the `git annex find` example), or carefully arranging for commands that actually affect the work tree to not be usable with this option. + +I'm not sure how many commands are affected. The ones I can immediately think of are sync, lock, unlock. (Commands like get obviously affect the work tree in direct mode, but it's fine to have getting a file from a branch also update files in the work tree, if they pointed at the same key.) +"""]] diff --git a/doc/todo/allow_removing_jabber_configuration.mdwn b/doc/todo/allow_removing_jabber_configuration.mdwn new file mode 100644 index 000000000..62370258d --- /dev/null +++ b/doc/todo/allow_removing_jabber_configuration.mdwn @@ -0,0 +1,5 @@ +right now it is unclear through the webapp how to unconfigure a jabber +account, which is especially critical considering the password needs to be +stored in the clear (where?). -- [[anarcat]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn new file mode 100644 index 000000000..f5088ccee --- /dev/null +++ b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn @@ -0,0 +1,50 @@ +[[!meta title="webapp does not accept ssh alias for ssh remote"]] + +What steps will reproduce the problem? + +Using the assistant, create an SSH remote. Try to use an alias as the name +of the remote (e.g. I have a server which I have aliased to "homeworld" in +my .ssh/config. When I'm at home, that is an alias for 192.168.1.253. +When I'm not at home, I edit .ssh/config so that "homeworld" becomes an +alias for a hostname at no-ip.com.) Despite the fact that "homeworld" is a +viable ssh target because of the alias, the assistant doesn't recognize it +as a valid host to ssh to. + +I had trouble with an ip address the first time I tried it but just tried +it again and it worked fine, so please disregard that part of the title of +this bug report. + + +What is the expected output? What do you see instead? + +expected output = move to the "create a repository -- rsync or regular" page. +observed output = "cannot resolve host name" + + +What version of git-annex are you using? On what operating system? + + Version: 3.20130102 OS X Lion + + +Please provide any additional information below. + +I realize this is kind of a power user whine. Using an ssh alias which +does not correspond to an actual resolvable hostname (and cannot, because +it's supposed to be a layer of indirection over the hostname) is not an +everyday problem for an average user. + +> The assistant tries to resolve the hostname explicitly +> to catch user's typos, and also expands it to a FQDN, to make +> it more likely to be able to reach the host when roaming to other +> networks. +> +> Also, the assistant sets up it *own* .ssh/config hostname alias, +> in order to make it use the special ssh key that it generates for the host. +> So that is not compatable with using a ssh host alias you've set up. +> Even if it knew about your alias, it would set up a new hostname alias, and +> whatever machinery you have to update the alias would not work. +> +> You can, of course, add git remotes using any ssh alias you like, by +> hand, and restart the assistant and it will use them. --[[Joey]] + +[[!tag /design/assistant]] diff --git a/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_6b71a390fd16f593216793aec590d9a8._comment b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_6b71a390fd16f593216793aec590d9a8._comment new file mode 100644 index 000000000..6f4d00b2b --- /dev/null +++ b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_6b71a390fd16f593216793aec590d9a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2014-05-22T20:05:54Z" + content=""" +A temporary workaround is to add an entry to /etc/hosts until the remote is added. +"""]] diff --git a/doc/todo/assistant_parallel_file_transfers.mdwn b/doc/todo/assistant_parallel_file_transfers.mdwn new file mode 100644 index 000000000..aafddf038 --- /dev/null +++ b/doc/todo/assistant_parallel_file_transfers.mdwn @@ -0,0 +1,15 @@ +Hi and thank you for an incredible piece of software and great work! + +I've noticed that when I add new files to a repository and I have my USB drive connected, the assistant alternate it's transfers of files. And only transfers one queued file at the time. + +file1 -->> Internet offsite computer +file1 -->> USB drive +file2 -->> Internet offsite computer +file2 -->> USB drive + + +I would prefer a logic where the assistant transfer files in parallel to my different repositories. I know that it might not be a good thing doing that with network accessed repositories, but when I have "low cost", locally attached USB drives it would be great if the transfers could be done in parallel. + + +Is there a configuration option for this already? + diff --git a/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn b/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn new file mode 100644 index 000000000..361585a78 --- /dev/null +++ b/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn @@ -0,0 +1,16 @@ +When maintaining several replica of the same git-annex repo "git annex sync" is quite handy. +But it would be even handier if "git annex sync" would also perform automatic "git merge synced/*" actions on all remotes. + +Clearly, this is beneficial when the user wants to keep all working copies synchronized. +This is likely the case in git annex assistant like scenarios. And it's always the case in my day to day scenarios :-) +I'm not sure about other use cases that I've hard time imagining... + +As just discussed on IRC (#vcs-home/OFTC), this could be implemented in various ways: + +1) By doing ssh on each remote and running the appropriate "git merge ..." commands there. + The drawback of this is that quite often it won't be permitted to ssh on the remote and run arbitrary commands there. + +2) Having a default post-receive hook, created at the time of "git annex init" that automatically does the merges when contacted by other remotes as a consequence of "git annex sync". + + +Thanks for git-annex! diff --git a/doc/todo/build_a_user_guide.mdwn b/doc/todo/build_a_user_guide.mdwn new file mode 100644 index 000000000..97414391b --- /dev/null +++ b/doc/todo/build_a_user_guide.mdwn @@ -0,0 +1,3 @@ +there's a lot of good documentation on this wiki, but it's hard to find sometimes. it's also unclear if we should look in the [[git-annex]] manpage or elsewhere in the wiki or where. this is a typical problem with the use of wikis for documentation: it's there, but hard to find. it doesn't mean a wiki shouldn't be used but, as with any user manual, special care needs to be taken about structure, organisation and making sure the manual is exhaustive. + +a good example of this problem is [[todo/document_standard_groups_more_extensively_in_the_UI]]. --[[anarcat]] diff --git a/doc/todo/cache_key_info.mdwn b/doc/todo/cache_key_info.mdwn new file mode 100644 index 000000000..d4352ccf7 --- /dev/null +++ b/doc/todo/cache_key_info.mdwn @@ -0,0 +1,37 @@ +Most of git-annex is designed to be fast no matter how many other files are +in the annex. Things like add/get/drop/move/fsck have good locality; +they will only operate on as many files as you need them to. + +(git commit can get a little slow with a great deal of files, +but that's out of scope -- and recent git-annex versions use queuing +to save git add from piling up too much in the index.) + +But currently two git-annex commands are quite slow when annexes become large +in quantity of files. These are unused and status. +(Both have --fast versions that don't do as much). +> (Update: status has become acceptably fast; most of its slowdown was due to using a bad data structure; scanning the tree is not particularly slow and it no longer looks at the git-annex branch.) + +unused is slow because it needs two pieces of information that are not +quick to look up, and require examining the whole repo, very seekily: + +1. The keys present in the annex. Found by looking thru .git/annex/objects +2. The keys referenced by files in git. Found by finding every file + in git, and looking at its symlink. + +Of these, the first is less expensive (typically, an annex does not have every +key in it). It could be optimized fairly simply, by adding a database +of keys present in the annex that is optimised to list them all. The +database would be updated by the few functions that move content in and +out. + +The second is harder to optimise, because the user can delete, revert, +copy, add, etc files in git at will, and git-annex does not have a good way +to watch that and maintain a database of what keys are being referenced. + +It could use a post-commit hook and examine files changed by commits, etc. +But then staged files would be left out. It might be sufficient to +make --fast trust the database... except unused will suggest *deleting* +data if nothing references it. Or maybe it could be required to have a +clean tree with nothing staged before running git-annex unused. + +Anyway, this is a semi-longterm item for me. --[[Joey]] diff --git a/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment new file mode 100644 index 000000000..086e7f3e8 --- /dev/null +++ b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-05-17T07:27:02Z" + content=""" +Sounds like a good idea. + +* git annex fsck (or similar) should check/rebuild the caches +* I would simply require a clean tree with a verbose error. 80/20 rule and defaulting to save actions. +"""]] diff --git a/doc/todo/checksum_verification_on_transfer.mdwn b/doc/todo/checksum_verification_on_transfer.mdwn new file mode 100644 index 000000000..c9d505aec --- /dev/null +++ b/doc/todo/checksum_verification_on_transfer.mdwn @@ -0,0 +1,7 @@ +Since most file transfers, particularly to/from encrypted special remotes involve git-annex streaming through the contents of the file anyway, it should be possible to add a verification of the checksum nearly for free. The main thing needed is probably a faster haskell checksum library than Data.Digest.Pure.Sha, which is probably slow enough to be annoying. + +I have not verified if an upload could be aborted before sending the data to the remote if a checksum failure is detected. It may be dependent on the individual special remote implementations. Some probably stream the encrypted data directly out the wire, while others need to set up a temp file to run a command on. It would certainly be possible to at least make the upload abort and fail if a bad checksum was detected. + +Doing the same for downloads is less useful, because the data is there locally to be fscked. The real advantage would be doing the check for uploads, to ensure that hard-to-detect corrupted files don't reach special remotes. + +--[[Joey]] diff --git a/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment b/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment new file mode 100644 index 000000000..5de1251da --- /dev/null +++ b/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-09-09T11:50:05Z" + content=""" +Doing this during downloads would still be nice. + +While the files are easier to fsck, users will need to actually do this. If it happenend automatically, it would increase safety and reduce disk i/o. + +Of course, this will not detect degradation during/after writing. + +If you don't make it the default, please at least make it optional for us bordering on OCD when it comes to data storage. + + +Richard +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes.mdwn b/doc/todo/clear_file_names_in_special_remotes.mdwn new file mode 100644 index 000000000..1b6a9f935 --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes.mdwn @@ -0,0 +1,13 @@ +To properly use amazon AWS S3 for CDN, we need to publish videos to S3. Ideally, we would like to do this via git-annex as the back-end of video.debian.net is being migrated to git-annex by me, atm. + +Obviously, we will need clear text names and proper directory structure, not SHA512E file names. This would need to be supported by the S3 special remote. + +I talked to TobiasTheViking in the past and he hinted at a reasonably clean way to do this, but that a clean solution would need support from git-annex. I will link him to this page and ask him to supply whatever info is needed. + + +Thanks, +Richard + +> This is not feaisble given git-annex's design. If I wanted to +> make something completely unlike git-annex, I suppose it could be done, +> but it's off topic here. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment b/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment new file mode 100644 index 000000000..7ca8e1916 --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:26:37Z" + content=""" +I don't see how this can possibly be done. A single git-annex object can have any number of file names, which can change at any time. +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment b/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment new file mode 100644 index 000000000..b7f5a409e --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2014-03-26T22:32:18Z" + content=""" +In that case, we would need to export the same file name several times, just like direct mode does. + +Could files be tracked via metadata? And yes, fsck would be... interesting... +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment b/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment new file mode 100644 index 000000000..a925cb2de --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-27T17:44:46Z" + content=""" +Sounds like \"I want a pony to me\". +"""]] diff --git a/doc/todo/commit_in_direct_mode.mdwn b/doc/todo/commit_in_direct_mode.mdwn new file mode 100644 index 000000000..1bdba2144 --- /dev/null +++ b/doc/todo/commit_in_direct_mode.mdwn @@ -0,0 +1,9 @@ +As of right now, the only way to commit changes to direct repositories is `git annex sync [remote]`. +There is no way to specify what directory to operate on. +When moving around files on a larger scale, the ability to commit specific subsets of changes would be rather nice. + +`git annex commit [path]` or `git annex sync [remote] -- [path]` would probably make sense. + + +Thanks, +Richard diff --git a/doc/todo/ctrl_c_handling.mdwn b/doc/todo/ctrl_c_handling.mdwn new file mode 100644 index 000000000..7101d578f --- /dev/null +++ b/doc/todo/ctrl_c_handling.mdwn @@ -0,0 +1,5 @@ +Sometimes I start off a large file transfer to a new remote (a la "git-annex copy . --to glacier"). + +I believe all of the special remotes transfer the files one at a time, which is good, and provides a sensible place to interrupt a copy/move operation. + +Wish: When I press ctrl+c in the terminal, git-annex will catch that and finish it's current transfer and then exit cleanly (ie: no odd backtraces in the special remote code). For the case where the file currently being transfered also needs to be killed (ie: it's a big .iso) then subsequent ctrl+c's can do that. diff --git a/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment new file mode 100644 index 000000000..16139c78d --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-21T21:36:14Z" + content=""" +This really depends on the remote, some can resume where they were interrupted, such as rsync, and some cannot, such as glacier (and, er, encrypted rsync). +"""]] diff --git a/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment new file mode 100644 index 000000000..827b99afa --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="very remote specific" + date="2014-02-21T22:11:16Z" + content=""" +Yeah, this is very remote specific and probably means adding the functionality there as well (eg: in the glacier.py code, not only in git-annex haskell). Maybe I should file bugs there accordingly :) +"""]] diff --git a/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment new file mode 100644 index 000000000..ed7e4d3b6 --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-21T22:34:14Z" + content=""" +Hmm, I forget if it's possible for git-annex to mask SIGINT when it runs glacier or rsync, so that the child process does not receive it, but the parent git-annex does. +"""]] diff --git a/doc/todo/custom_f-droid_repo.mdwn b/doc/todo/custom_f-droid_repo.mdwn new file mode 100644 index 000000000..7d32d45d5 --- /dev/null +++ b/doc/todo/custom_f-droid_repo.mdwn @@ -0,0 +1,3 @@ +It would be great to have a custom f-droid repo "alla guardianproject.info" (before getting git-annex into the main f-droid repo). + +See (). diff --git a/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment b/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment new file mode 100644 index 000000000..f1c682fbc --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T20:45:32Z" + content=""" +The f-droid developers are willing to add git-annex in principle, their build environment just needs to have its build dependencies added to it. I've completely automated (except for occasional breakage due to changes on hackage) to setup of the necessary cross build environment. I have not had time to look into how to integrate that into the f-droid build system, and it would be great if someone with interest could do so. + +I suspect that setting up a custom f-droid repo would be just as much work, plus more work on an ongoing basis. +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment b/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment new file mode 100644 index 000000000..34aa063f4 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR6E5iUghMWdUGlbA9CCs8DKaoigMjJXw" + nickname="Efraim" + subject="comment 2" + date="2014-03-06T10:06:02Z" + content=""" +I've noticed that fdroidserver is available in the main debian repos, and not having really looked at it too much yet, if it shares similar code to wannabuild then it should be possible to continue everything as you're already doing it, just in addition rsync or git push the code base to a local fdroidserver instance and also copy the binary over once it's set up. +(if I understood wannabuild correctly, if you upload new source and a prebuilt binary it will mark that architecture as built.) +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment b/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment new file mode 100644 index 000000000..dda348874 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 3" + date="2014-03-06T22:49:22Z" + content=""" +F-droid compiles all the binaries themselves internally. +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_4_55f05624f0e939f7b8d0c505285e5690._comment b/doc/todo/custom_f-droid_repo/comment_4_55f05624f0e939f7b8d0c505285e5690._comment new file mode 100644 index 000000000..a122aae92 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_4_55f05624f0e939f7b8d0c505285e5690._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.57.121" + subject="this topic in their Submission Queue" + date="2014-05-03T14:59:11Z" + content=""" +I opened [a request to add git-annex](https://f-droid.org/forums/topic/git-annex/) in the F-Droid's submission queue about a year ago. + +Just posting here the link, so that all the discussion (not much) can be found by those interested. + +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_6_de4229f04daf48a153e2f44f57a05a3b._comment b/doc/todo/custom_f-droid_repo/comment_6_de4229f04daf48a153e2f44f57a05a3b._comment new file mode 100644 index 000000000..033e35377 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_6_de4229f04daf48a153e2f44f57a05a3b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.57.121" + subject=" clarification: a custom F-Droid server just to post your updated apps" + date="2014-05-03T15:57:55Z" + content=""" +If I've understood Efraim correctly, he means that someone (perhaps, Joey) can run a custom F-Droid server with Joey's builds of the app **copied to the repo as is (without rebuilding there)**, so that those using an F-Droid client would get the updates through this standard path (for them) instead of manually looking for updates here. + +Like from a custom APT repository run not by Debian (in this case -- F-Droid team), but by an independent developer who is providing package builds not avaialble in Debian by building the packages himself, signing them, and putting them into his own APT repo (indexing them). + +"""]] diff --git a/doc/todo/do_not_bug_me_about_intermediate_files.mdwn b/doc/todo/do_not_bug_me_about_intermediate_files.mdwn new file mode 100644 index 000000000..99a8f5b19 --- /dev/null +++ b/doc/todo/do_not_bug_me_about_intermediate_files.mdwn @@ -0,0 +1,7 @@ +[[!meta title="--notify-finish operates on a per-file, not per-process basis"]] + +so this is another UX pickyness, but it seems important to me. + +i like the new [[desktop notifications|tips/file_manager_integration]], but they are little too verbose. when i choose "git annex get" on the folder, if there's a lot of files, it will flood me with all the files being transfered in a mostly incomprehensible list of files being transfered. + +what i would expect is more: "starting transfer of folder X", "transfer of folder X finished!", only two message per item i chose. this is especially a problem with DVD backups, which have a bunch of small files (screenshots, .nfos and so on) and large video files - so it seems the thing has finished transfering, while it's only partly done. --[[anarcat]] diff --git a/doc/todo/document_standard_groups_more_extensively_in_the_UI.mdwn b/doc/todo/document_standard_groups_more_extensively_in_the_UI.mdwn new file mode 100644 index 000000000..1e9afdef9 --- /dev/null +++ b/doc/todo/document_standard_groups_more_extensively_in_the_UI.mdwn @@ -0,0 +1,14 @@ +i have been using git-annex for a while now, yet I still can't quite wrap my head around [[preferred_content/standard groups]], especially how they are documented in about/repogroups in the assistant web interface. i have repeatedly synced files where they shouldn't have been synced (usually by setting the repo as "client" or "transfer") and also destroyed files I wanted to keep by setting it to "unwanted" (actually, that was by pressing the "delete" button on the repo, which i didn't expect to drop the files on the remote...) + +i have been able to understand a lot of what's going on by trial and error and by decrypting the [[preferred_content]] expressions on the wiki. + +it seems to me the [[preferred_content/standard groups]] wiki page and the `about/repogroups` URL in the assistant should be merged: + + 1. the assistant should be more explicit: maybe it should have examples of what will happen in some cases to give an idea. maybe "stories" like "a transfer repo is for when you have two client repos that can't talk to each other, so you use a transfer repo, e.g. a portable hard drive, to transfer files between them". having the actual, current [[preferred_content]] expressions from the [[preferred_content/standard groups]] groups page would also help, maybe in a smaller font to not scare people of + 2. the [[preferred_content/standard groups]] wiki page should be expanded to include narratives like the ones that are in the `about/repogroups` page of the assistant. that way people looking at the software from the outside can understand the mechanics better + +ideally, that documentation would be the one and the same so that a change on one side would reflect on the other. + +in fact, having an inline manual in the assistant would be a must: we want this thing to work offline, so it should be able to access this wiki, or whatever of it is shipped with git-annex. + +that way we wouldn't have this kind of inconsistencies... more generally, maybe we could even [[build a user guide]]! -- [[anarcat]] diff --git a/doc/todo/done.mdwn b/doc/todo/done.mdwn new file mode 100644 index 000000000..e7c98081b --- /dev/null +++ b/doc/todo/done.mdwn @@ -0,0 +1,4 @@ +recently fixed [[todo]] items. + +[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10 +archive=yes]] diff --git a/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn b/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn new file mode 100644 index 000000000..257054a90 --- /dev/null +++ b/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn @@ -0,0 +1,2 @@ + +While trying so establish a jabber link via a server that runs a nonstandard port I came across the problem that git-annex always appends :5222 to the jabber server address. This effectively stops the connection procedure at a point where it does not need to. diff --git a/doc/todo/fast_migrate.mdwn b/doc/todo/fast_migrate.mdwn new file mode 100644 index 000000000..1571d880a --- /dev/null +++ b/doc/todo/fast_migrate.mdwn @@ -0,0 +1,16 @@ +Moved this comment to todo list --[[Joey]] + +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnfM7ZF0Q5U9k1LljyDXH37cuXU5Gx6gtM" + nickname="A" + subject="fast migrate" + date="2014-07-05T08:21:20Z" + content=""" +dear Joey and everybody else, + some time ago I used \"git annex migrate\" to bring all my repositories up-to-date; after that I found (to my dismay) that some keys are SHA256, some others are SHA256E, so my data is not really deduplicated ; now, it would possible to migrate from SHAnnnE to SHAnnn (and vice versa) very fast... but currently AFAICS git-annex recomputes the whole checksum, and this (on my USB2.0 old disks) takes forever; may somebody please implement a fast migration? +"""]] + +> Certianly doable, for $hashE to $hash. Probably about an hour's work. +> --[[Joey]] + +>> [[done]] --[[Joey]] diff --git a/doc/todo/free_space_checking_for_local_special_remotes.mdwn b/doc/todo/free_space_checking_for_local_special_remotes.mdwn new file mode 100644 index 000000000..0fd2eac59 --- /dev/null +++ b/doc/todo/free_space_checking_for_local_special_remotes.mdwn @@ -0,0 +1,4 @@ +Should be possible to configure an annex.diskreserve setting for local +special remotes, such as a directory special remote or possibly a bup +special remote. (Although bup's deltas will make storing some versions of +files take less space than git-annex would have to assume it would take.) diff --git a/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment b/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment new file mode 100644 index 000000000..00c4c5625 --- /dev/null +++ b/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-11T16:19:26Z" + content=""" +Directory special remotes do already honor annex.diskreserve, it turns out. Let's repurpose this bug to be about adding a per-remote configuration, in case the main annex.diskreserve is not appropriate. +"""]] diff --git a/doc/todo/git-annex_ignores_GIT__95__SSH.mdwn b/doc/todo/git-annex_ignores_GIT__95__SSH.mdwn new file mode 100644 index 000000000..9af05496a --- /dev/null +++ b/doc/todo/git-annex_ignores_GIT__95__SSH.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. + +git uses environment variable GIT_SSH to determine SSH client. + +I set it to plink.exe because I extensively use pageant infrastructure and do NOT want to have 2 systems lying around. + +Unfortunately git-annex seems to ignore that. + +Even worse, it results in unpredicted behavior because the git part works (e.g. clone) whereas annex/rsync does not resulting in half-ok repositories without meaningful error messages. + +It only becomes evident when ssh.exe in the git repository is deleted. + +### What steps will reproduce the problem? + +Set %GIT_SSH% and remove ssh.exe + +You will get + + git-annex: ssh: createProcess: does not exist (No such file or directory) + failed + git-annex: drop: 1 failed + +### What version of git-annex are you using? On what operating system? + +Windows 8, + + $ git annex version + git-annex version: 5.20140411-gda795e0 + build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + + +### Please provide any additional information below. + + diff --git a/doc/todo/git-annex_ignores_GIT__95__SSH/comment_1_958dd21d7e981232f03b4516521ac226._comment b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_1_958dd21d7e981232f03b4516521ac226._comment new file mode 100644 index 000000000..c13c3d089 --- /dev/null +++ b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_1_958dd21d7e981232f03b4516521ac226._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T16:42:41Z" + content=""" +This is good spotting of a git configuration that git-annex does not support. + +However, I doubt that even if I made it use `GIT_SSH`, it would be useful. git-annex uses several features that are probably unique to openssh, including connection caching. While you could disable annex.sshcaching and perhaps get a different ssh to work, it would be much slower. +"""]] diff --git a/doc/todo/git-annex_ignores_GIT__95__SSH/comment_2_319a7e8122e7bc25d9399ba463a16158._comment b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_2_319a7e8122e7bc25d9399ba463a16158._comment new file mode 100644 index 000000000..1294196ba --- /dev/null +++ b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_2_319a7e8122e7bc25d9399ba463a16158._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="divB" + ip="171.67.172.81" + subject="comment 2" + date="2014-05-17T23:58:19Z" + content=""" +Hi Joey, + +Thanks for your answer. In my opinion, this would be an important requirement for various reasons: + +1.) It is very confusing and results in unpredictable errors. I spent days in finding out what caused all the weird stuff that happened. Even if it is not supported, an error message or at least warning should be issued. + +2.) At least in Windows, plink.exe is the quasi-standard SSH client. All SW I am aware of supports at least plink.exe as alternative to openssh (SVN, git, unison, ...). Even within cygwin I often use plink for X11 forwarding etc. If features like SSH caching do not work with that it's totally fine. + +3.) Even for a unix environment, it is critical to be able to use a wrapper (or at least to configure SSH parameters). In my opinion, this should and must work consistently (git, git-annex and rsync). For example what if I have a dedicated public key for a repository and to not want to use %HOME%\.ssh\id_rsa ? +For unison, I use a wrapper my_ssh.cmd which wraps specialized parameters (in particular SSH key, port) with plink.exe to ssh.exe's interface. Similarly, I might be interested in disabling agent functionality and use GSSAPI etc. etc. + +A little bit OT now: I already wondered if and how inefficient git-annex is in this regard. For example, if I sync content, it seems that ssh opens a new connection for each file! (at least each file results in a signing request in my agent). This happens even if I use ssh.exe. Is there anything wrong? + +Thanks + +"""]] diff --git a/doc/todo/git-annex_ignores_GIT__95__SSH/comment_3_cc1936f18721a912bb77903be6c4a45f._comment b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_3_cc1936f18721a912bb77903be6c4a45f._comment new file mode 100644 index 000000000..ff50c0599 --- /dev/null +++ b/doc/todo/git-annex_ignores_GIT__95__SSH/comment_3_cc1936f18721a912bb77903be6c4a45f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 3" + date="2014-06-06T10:49:27Z" + content=""" +Agreed. I'd rather lose connection caching than have to maintain both putty keys and openssh keys on my windows machines. +"""]] diff --git a/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn new file mode 100644 index 000000000..fd93554ec --- /dev/null +++ b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +git annex get fileName- should perform a hash check on the file content before adding to the local repository + + +### What steps will reproduce the problem? +Two scenarios: +1) Malicious user and owner of repository being pulled from can edit his/her local .git/annex/objects directory +to alter the file content. For src code, this could be to insert a bug, insert a backdoor, or for example +to replace an image file artifact for a website, with a pornographic image. +The user pulling the file content with "git annex get fileName" might not be aware of the file contents +until they actually examine the file or perform an fsck or commit locally. +In the meantime a kiddy porn image could be sitting in their repository or a src code backdoor can get incorporated and deployed etc. +2) a file could also simply get corrupted during download. An inherent hash check during the 'annex get' would +point out the problem immediately. +To reproduce: create repoNum1, and clone it to create repoNum2. manual edit/replace content in repoNum1/.git/annex/objects/... +then perform a 'git annex get ' from repoNum2 on the file that has been manipulated + + +### What version of git-annex are you using? On what operating system? +3.2012112ubuntu2 on running linux mint + + +### Please provide any additional information below. + +Aside: Thanks Joey - this is fantastic work you are doing. You have really improved git. The ability to checkout +an entire tree - but selectively get only the content actually needed is a real killer feature. +Kudos and again many many thanks +M. + + +# End of transcript or log. +"""]] + +> [[duplicate|done]] of [[checksum_verification_on_transfer]] --[[Joey]] diff --git a/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment new file mode 100644 index 000000000..621e01d6f --- /dev/null +++ b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-15T19:38:48Z" + content=""" +If you don't trust a remote repository, then you should either + +a) Not use that repository at all, because its malicious owner could put any evil file he wants in it with an entirely correct hash. + +b) Make it a gcrypt remote so all content stored on it is encrypted. Decrypting it will include validating that you get out what you originally put in. + +So these scenarios are not good arguments for validating every file after it's downloaded. + +If it were possible to do a rolling checksum as part of the download, rather than needing to pull the entire file back off disk and checksum it, I'd do so. But it's generally not; for example when git-annex is downloading a file using rsync it may resume part way through a previous interrupted download, and rsync is storing the file to disk, not streaming it to git-annex. +"""]] diff --git a/doc/todo/hidden_files.mdwn b/doc/todo/hidden_files.mdwn new file mode 100644 index 000000000..191e9c328 --- /dev/null +++ b/doc/todo/hidden_files.mdwn @@ -0,0 +1,30 @@ +Add a `git annex hide $file` that behaves like drop, checking counter info +and updating location log to say the current repo no longer has a file -- +but does not actually remove the content. + +Then `git annex unused` can be used to clean it up later. And in the +meantime, it's still locally accessible. This can be useful if you're +planning to need to free up space later, but want to hold onto the content +for a while. Possibly you'll be disconnected later, so it's easier to push +out that intent now. + +-- + +TODO: + +* Make 100% sure this is safe. Drop, etc should never check content files + are present on other repos if the location log doesn't say the repo + has the content. + +* What will `git annex get` do if it's asked to get a file that has been + hidden? + +> Unless I am missing something: Make sure the data is correct (for SHA1 or other tracking) and restore locally. If that's not the case, delete and restore from remote. -- RichiH + +---- + +Is 'unused' a good name? 'clean' and 'autoclean' would make more sense, imo. 'clean' deletes everything, whereas an optional 'autoclean' could try to be smart based on disk usage and/or SHA1, etc. -- RichiH + +> Nah, `git annex unused/dropunused` already exist. --[[Joey]] + +>> OK, in that case forget what I said. No idea about your internal policy, but feel free to delete this part of the page, then. -- RichiH diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn new file mode 100644 index 000000000..46d9de34f --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn @@ -0,0 +1,5 @@ +It would be great to be able to use the pubDate of the entries with the --template option of importfeed. + +Text.Feed.Query has a getItemPublishDate (and a getFeedPubDate, if we want some kind of ${feeddate}). + +The best would be to allow a reformating of the date(s) with (for example) %Y-%m-%D diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment new file mode 100644 index 000000000..cc3d85faf --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="gueux" + ip="2a01:240:fe6d:0:7986:3659:a8bd:64f1" + subject="syntax" + date="2013-09-12T14:05:16Z" + content=""" +use \"itemdate\" and \"feeddate\" as names? + +use ${itemdate=%Y-%m-%D} syntax option? +"""]] diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment new file mode 100644 index 000000000..c8770ec6e --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 2" + date="2013-09-13T19:53:52Z" + content=""" +getItemPublishDate returns a String, which can contain any of several date formats. Deferred until the feed library has something more sane. +Upstream bug: + +As for how to format the date in the feed, I would be ok with having itemdate (YYYYMMDD), itemyear (YYYY), itemmonth (MM) and itemday (DD). Full date formatting seems like overkill here. +"""]] diff --git a/doc/todo/integrate_support_for_spideroak_as_archive__47__backup.mdwn b/doc/todo/integrate_support_for_spideroak_as_archive__47__backup.mdwn new file mode 100644 index 000000000..c71df466c --- /dev/null +++ b/doc/todo/integrate_support_for_spideroak_as_archive__47__backup.mdwn @@ -0,0 +1,9 @@ +SpiderOak is a great backup service and many of us have unlimited accounts with them since World Backup Day. That makes SpiderOak a very interesting candidate for use as an archive or backup node. I can think of only two ways to go about this: + +1. Designate one of your computers as an archive/backup and use spideroak independantly to sync that archive. This is very unattractive, since it makes the spideroak backup completely unknown to git-annex. + +2. Integrate the SpiderOak CLI tool somehow as a remote. I don't know to what extent this would be possible, but if it were, that'd be awesome. And a lot of work, presumably. + +Bonus option: + +3. Can the SpiderOak API be useful? https://spideroak.com/faq/questions/37/how_do_i_use_the_spideroak_web_api/ diff --git a/doc/todo/integrate_support_for_spideroak_as_archive__47__backup/comment_1_a47ea814f6d7727bbd0eeca6d1fd3219._comment b/doc/todo/integrate_support_for_spideroak_as_archive__47__backup/comment_1_a47ea814f6d7727bbd0eeca6d1fd3219._comment new file mode 100644 index 000000000..7790a7f2d --- /dev/null +++ b/doc/todo/integrate_support_for_spideroak_as_archive__47__backup/comment_1_a47ea814f6d7727bbd0eeca6d1fd3219._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 1" + date="2014-05-19T15:05:49Z" + content=""" +If spideroak has a CLI tool that can get/put/delete individual files, it should be quite easy to use [[the_external_special_remote|special_remotes/external]] to support it. The demo shell script could be used as a starting place. + +I built that so that others can easily write special remotes, and so unless spideroak's CLI is free software, I don't anticipate working on this myself. +"""]] diff --git a/doc/todo/keep_annexed_files_for_a_while.mdwn b/doc/todo/keep_annexed_files_for_a_while.mdwn new file mode 100644 index 000000000..cf85b11f3 --- /dev/null +++ b/doc/todo/keep_annexed_files_for_a_while.mdwn @@ -0,0 +1,8 @@ +I don't want files that I dropped to immediately disappear from my local or all of my remotes repos on the next sync. Especially in situations where changes to the git-annex repo get automatically and immediately replicated to remote repos, I want a configurable "grace" period before files in .git/annex/objects get really deleted. + +This has similarities to the "trash" on a desktop. It might also be nice to + +* configure a maximum amount of space of the "trash" +* have a way to see the contents of the trash to easily recover deleted files + +Maybe it would make sense to just move dropped files to the desktops trash? "git annex trash" as an alternative to drop? diff --git a/doc/todo/notifications.mdwn b/doc/todo/notifications.mdwn new file mode 100644 index 000000000..99f72798b --- /dev/null +++ b/doc/todo/notifications.mdwn @@ -0,0 +1,3 @@ +Just started today with git-annex and it looks great replacement for proprietary syncing solutions (well in allot of aspects it's much better than proprietary solutions) but I do believe desktop and email notifications are must have features. + +I think these services would be nice to have: growl, libnotify, email, twitter (publicly sharing with a group or repository stored on public server for users to download). diff --git a/doc/todo/openwrt_package.mdwn b/doc/todo/openwrt_package.mdwn new file mode 100644 index 000000000..70a4ae03f --- /dev/null +++ b/doc/todo/openwrt_package.mdwn @@ -0,0 +1,6 @@ +hi + +recently i have installed openwrt on my mikrotik routerboard. i am verry suprised how well it works. it lacks git-annex package. openwrt has git and i can install it. + +how can i build one on a mips arch ? +is it possible to build multiple architecture standalone binaries ? diff --git a/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment new file mode 100644 index 000000000..78029694a --- /dev/null +++ b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 1" + date="2014-02-06T17:26:58Z" + content=""" +I would be quite happy if someone took care of adding git-annex to openwrt. + +I don't have time to personally handle packaging for different linux distributions myself. What I could do is add mips builds of git-annex to the existing standalone linux builds. These would need to be built the same way the arm builds are done, using a Debian chroot and qemu to run tools from it. This is rather a lot of work for me to set up, and I don't know if I'd have to do it for both little and big endian mips. + +Also, it seems that Debian does not currently have a working haskell toolchain for mips. Which may well mean that ghc is not in a working state on mips at all. +"""]] diff --git a/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment new file mode 100644 index 000000000..d99fa13f1 --- /dev/null +++ b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 2" + date="2014-02-11T21:05:00Z" + content=""" +if debian does not have working toolchain for mips then there is no way to port it into mips machines. +am i correct ? +"""]] diff --git a/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment new file mode 100644 index 000000000..9c9157d18 --- /dev/null +++ b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-11T21:39:34Z" + content=""" +Actually, debian stable does still have ghc building for mips/mipsel. It's just newer versions that have failed to build and nobody has fixed it yet. +"""]] diff --git a/doc/todo/optimise_git-annex_merge.mdwn b/doc/todo/optimise_git-annex_merge.mdwn new file mode 100644 index 000000000..91d18ebd7 --- /dev/null +++ b/doc/todo/optimise_git-annex_merge.mdwn @@ -0,0 +1,23 @@ +Typically `git-annex merge` is fast, but it could still be sped up. + +`git-annex merge` runs `git-hash-object` once per file that needs to be +merged. Elsewhere in git-annex, `git-hash-object` is used in a faster mode, +reading files from disk via `--stdin-paths`. But here, the data is not +in raw files on disk, and I doubt writing them is the best approach. +Instead, I'd like a way to stream multiple objects into git using stdin. +Sometime, should look at either extending git-hash-object to support that, +or possibly look at using git-fast-import instead. + +--- + +`git-annex merge` also runs `git show` once per file that needs to be +merged. This could be reduced to a single call to `git-cat-file --batch`, +There is already a Git.CatFile library that can do this easily. --[[Joey]] + +> This is now done, part above remains todo. --[[Joey]] + +--- + +Merging used to use memory proportional to the size of the diff. It now +streams data, running in constant space. This probably sped it up a lot, +as there's much less allocation and GC action. --[[Joey]] diff --git a/doc/todo/parallel_possibilities.mdwn b/doc/todo/parallel_possibilities.mdwn new file mode 100644 index 000000000..9c0e69e29 --- /dev/null +++ b/doc/todo/parallel_possibilities.mdwn @@ -0,0 +1,13 @@ +One of my reasons for using haskell was that it provides the possibility of +some parallell processing. Although since git-annex hits the filesystem +heavily and mostly runs other git commands, maybe not a whole lot. + +Anyway, each git-annex command is broken down into a series of independant +actions, which has some potential for parallelism. + +Each action has 3 distinct phases, basically "check", "perform", and +"cleanup". The perform actions are probably parellizable; the cleanup may be +(but not if it has to run git commands to stage state; it can queue +commands though); the check should be easily parallelizable, although they +may access the disk or run minor git query commands, so would probably not +want to run too many of them at once. diff --git a/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment b/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment new file mode 100644 index 000000000..4aceb3abd --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 1" + date="2011-04-08T12:41:43Z" + content=""" +I also think, that fetching keys via rsync can be done by one rsync process, when the keys are fetched from one host. This would avoid establishing a new TCP connection for every file. +"""]] diff --git a/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment b/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment new file mode 100644 index 000000000..6ecce52c4 --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="comment 2" + date="2011-05-20T20:14:15Z" + content=""" +I agree with Christian. + +One should first make a better use of connections to remotes before exploring parallel possibilities. One should pipeline the requests and answers. + +Of course this could be implemented using parallel&concurrency features of Haskell to do this. +"""]] diff --git a/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment b/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment new file mode 100644 index 000000000..0d646a7a8 --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 3" + date="2013-07-17T19:59:50Z" + content=""" +Note that git-annex now uses locks to communicate among multiple processes, so it's now possible to eg run two `git annex get` processes, and one will skip over the file the other is downloading and go on to the next file, and so on. + +This is an especially nice speedup when downloading encrypted data, since the decryption of one file will tend to happen while the other process is downloading the next file (assuming files of approximately the same size, and that decryption takes approxiately as long as downloading). + +The only thing preventing this being done by threads in one process, enabled by a -jN option, is that the output would be a jumbled mess. +"""]] diff --git a/doc/todo/read-only_removable_drives.mdwn b/doc/todo/read-only_removable_drives.mdwn new file mode 100644 index 000000000..379074897 --- /dev/null +++ b/doc/todo/read-only_removable_drives.mdwn @@ -0,0 +1,7 @@ +Here's yet another weird use case. I have a ext3 external drive for storing media that i brought to the office. Naturally, all files on the drive are owned by my desktop user (uid = 1000). In the office, my userid is different (say 1001), so git-annex doesn't see the removable drive at all (which is a little confusing). But even if i try to add the repo on the drive as an external repo, it says it can't write to it (which is true). + +I would expect it to at least be able to leech the files off of it. + +Otherwise, I would welcome advice on how to fix this problem without doing a `sudo chown -R` every time i plug this drive somewhere ... --[[anarcat]] + +> Workaround: `sudo setfacl -R -m u:anarcat:rwx /media/foo/annex` diff --git a/doc/todo/read-only_removable_drives/comment_1_979455e3694ae2403134ed6fa2add2fa._comment b/doc/todo/read-only_removable_drives/comment_1_979455e3694ae2403134ed6fa2add2fa._comment new file mode 100644 index 000000000..ac98d6845 --- /dev/null +++ b/doc/todo/read-only_removable_drives/comment_1_979455e3694ae2403134ed6fa2add2fa._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2014-05-16T18:10:28Z" + content=""" +The assistant ignores drives that it cannot write to. This is a very good heuristic to avoid listing every special device in linux, OSX, etc as possible removable drives. I don't think it makes sense for the assistant to try to handle this use case. + +Is there some problem using git-annex at the command line with a remote that is read-only? I don't see any problem in my tests. + +
+joey@darkstar:~/tmp/r>git annex drop
+drop foo ok
+(Recording state in git...)
+joey@darkstar:~/tmp/r>ls -ld ../readonly
+drwxr-xr-x 3 root root 4096 May 16 14:08 ../readonly/
+joey@darkstar:~/tmp/r>git annex get --from readonly
+get foo (from readonly...) ok
+(Recording state in git...)
+
+"""]] diff --git a/doc/todo/redundancy_stats_in_status.mdwn b/doc/todo/redundancy_stats_in_status.mdwn new file mode 100644 index 000000000..56095fd33 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status.mdwn @@ -0,0 +1,23 @@ +Currently, `git annex status` only shows the size of 1 copy of each file. +If numcopies is being used for redundancy, much more disk can actually be +in use than status shows. + +One idea: + + known annex size: 2 terabytes (plus 4 terabytes of redundant copies) + +But, to get that number, it would have to walk every location log, +counting how many copies currently exist of each file. That would make +status a lot slower than it is. + +One option is to just put it at the end of the status: + + redundancy: 300% (4 terabytes of copies) + +And ctrl-c if it's taking too long. + +Hmm, fsck looks at that same info. Maybe it could cache the redundancy +level it discovers? Since fsck can be run incrementally, it would be tricky +to get an overall number. And the number would tend to be stale, but +then again it might also be nice if status shows how long ago the last fsck +was. diff --git a/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment b/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment new file mode 100644 index 000000000..801c1da03 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-10-30T08:09:13Z" + content=""" +I like the idea of using fsck as a pre-run for status. + +Basically, it's the same as `updatedb` and `locate`; locate will warn the user if it considers its cache to be too old, as well. +"""]] diff --git a/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment b/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment new file mode 100644 index 000000000..a4711b2a3 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 2" + date="2013-09-25T18:03:55Z" + content=""" +`git annex status .` or otherwise running it with a directory has recently started walking all the location logs for all files in the directory in order to display variance from configured numcopies. It would be easy to add a redundancy counter to that. + +It would slow down the global status when not passed a directory to add redundancy info there. Maybe local is enough? +"""]] diff --git a/doc/todo/required_content.mdwn b/doc/todo/required_content.mdwn new file mode 100644 index 000000000..6afeee5c9 --- /dev/null +++ b/doc/todo/required_content.mdwn @@ -0,0 +1,23 @@ +We have preferred content, which is advisory, and numcopies, which is +enforced (except by `git annex move`). What is missing is an expression +like preferred content, which is enforced. So, required content. + +For example, I might want a repository that is required to contain +`*.jpeg`. This would make get --auto get it (it's implicitly part of the +preferred content), and would make drop refuse to drop it. + +> I've implemented the basic required content. Currently only configurable +> via `vicfg`, because I don't think a lot of people are going to want to +> use it. +> +> Note that I did not yet add the active verification discussed below. +> So if required content is set to `not inallgroup=backup`, or +> `not copies=10`, trying to drop a file will not go off and prove +> that there are 10 copies or that the file is in every repository in +> the backup group. It will assume that the location log is accurate +> and go by that. +> +> I think this is enough to cover Richard's case, at least. +> In his example, A B and C are in group anchor and have required +> content set to `include=*`, and D E F have it set to +> `not inallgroup=anchor`. --[[Joey]] diff --git a/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment b/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment new file mode 100644 index 000000000..7d490a9d7 --- /dev/null +++ b/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2014-03-10T17:15:54Z" + content=""" +To give a specific example of what I want to do: + +I have a bunch of repos + +* A, Machine1 -- anchor repository and sometimes used to add new content +* B, Machine2 -- anchor repository, offsite +* C, External1 -- anchor repository, stored off-site +* D, Laptop -- transient repo to carry data around and to add new content +* E, USB1 -- transient, travel backups +* F, USB2 -- transient, travel backups + +A-C should get _all_ data. A-F trust A-C to always retain all data, online checks for availability are not needed because A-C run frequent fsck. Ideally, `git annex drop` should be no-op in A-C. + +D-F should retain data as long as it's not been saved in _all_ of A-C. As soon as A-C have copies, `git annex drop` in D-F should drop that content; before that, they _must not_ drop said content. + +Richard +"""]] diff --git a/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment b/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment new file mode 100644 index 000000000..dece48c01 --- /dev/null +++ b/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="partial implementation plan" + date="2014-03-19T16:37:05Z" + content=""" +* When there is a required content expression, OR it with the preferred content expression. This will make the assistant, --auto etc want to get required content. +* When checking if something can be dropped, check the required content expression. Only Command.Drop does this so nicely centralized in one place. +* When checking required content expression for drop, must do active verification of terminals that relate to other copies, for the same reason the numcopies check when dropping does active validation. This includes `copies=`, `lackingcopies=`, `approxlackingcopies=`, `inallgroup=`. + +The last is where the complication comes in. Seems to need a cache of places the key was just now verified to be present, which can be used to avoid unnecessary redundant active verification (for example \"not (copies=2 and inallgroup=bar)\" would otherwise redundantly check some remotes). The numcopies checking code should use the same cache too. + +* Finally, if the required content cannot be satisfied, it would be nice to know which terminal failed in order to show the user a useful error message. The current Matcher does not provide a way to do that though. Or could just say, \"unable to satisfy required content: $expression\" +"""]] diff --git a/doc/todo/required_content/comment_3_b16a8e8b45ceee887c8c0167b7859654._comment b/doc/todo/required_content/comment_3_b16a8e8b45ceee887c8c0167b7859654._comment new file mode 100644 index 000000000..f4047baf5 --- /dev/null +++ b/doc/todo/required_content/comment_3_b16a8e8b45ceee887c8c0167b7859654._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2014-05-18T06:49:35Z" + content=""" + 22:34:10 < joeyh> required content is implemented, though active verification is not +"""]] diff --git a/doc/todo/resuming_encrypted_uploads.mdwn b/doc/todo/resuming_encrypted_uploads.mdwn new file mode 100644 index 000000000..b3aaa7f96 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads.mdwn @@ -0,0 +1,22 @@ +Resuming interrupted uploads to encrypted special remotes is not currently +possible, because gpg does not produce consistent output. Special remotes +that could support resuming include rsync and glacier. + +Without consistent output, git-annex would need to locally cache the encrypted +file, and reuse that cache when resuming an upload. This would make +encrypted uploads more expensive in terms of both file IO and disk space +used. + +[It would be possible to write to the cache at the same time the special +remote is being fed data, and if the special remote upload fails, continue +writing the rest of the file. That would avoid half the overhead, since +the file would not need to be read from, just written to. (Although OS +caching may accomplish the same thing.)] + +Also, `git annex unused` would need to show temp files for uploads, +the same as it currently shows temp files for downloads, and users would +sometimes need to manually dropunused old uploads, that never completed. + +The question, then, is whether resuming uploads is useful enough to add +this overhead and user-visible complexity. +--[[Joey]] diff --git a/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment b/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment new file mode 100644 index 000000000..cf35de049 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 1" + date="2012-12-28T23:23:29Z" + content=""" +Doesn't the encryption part already write an encrypted version completely to disk before starting to upload? (At least with the rsync remote?) So the disk space and I/O usage is already there. (Except that it's probably a temporary file that's deleted after it was created, so that it's not kept around by the filesystem when certain destructive events strike.) +"""]] diff --git a/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment b/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment new file mode 100644 index 000000000..a2bab9244 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2012-12-29T08:00:56Z" + content=""" +Being able to resume transfers of encrypted files would absolutely be useful! Disk space is cheap, but bandwidth is not. +"""]] diff --git a/doc/todo/sharedRepository_mode_not_supported_by_git-annex.mdwn b/doc/todo/sharedRepository_mode_not_supported_by_git-annex.mdwn new file mode 100644 index 000000000..85005dbc1 --- /dev/null +++ b/doc/todo/sharedRepository_mode_not_supported_by_git-annex.mdwn @@ -0,0 +1,7 @@ +git's core.SharedRepository is supported by git-annex, but only +with the group/all/world/everybody settings. core.SharedRepository=0644 +etc is not supported. + +There's no insormountable reason why not, Joey just hates umask mode math +stuff and nobody has sent a patch. Note that Annex.Content.freezeContent +should remove the write bit from files, no matter what. diff --git a/doc/todo/smudge.mdwn b/doc/todo/smudge.mdwn new file mode 100644 index 000000000..6103ffa61 --- /dev/null +++ b/doc/todo/smudge.mdwn @@ -0,0 +1,162 @@ +git-annex should use smudge/clean filters. + +---- + +Update: Currently, this does not look likely to work. In particular, +the clean filter needs to consume all stdin from git, which consists of the +entire content of the file. It cannot optimise by directly accessing +the file in the repository, because git may be cleaning a different +version of the file during a merge. + +So every `git status` would need to read the entire content of all +available files, and checksum them, which is too expensive. + +> Update from GitTogether: Peff thinks a new interface could be added to +> git to handle this sort of case in an efficient way.. just needs someone +> to do the work. --[[Joey]] + +---- + +The clean filter is run when files are staged for commit. So a user could copy +any file into the annex, git add it, and git-annex's clean filter causes +the file's key to be staged, while its value is added to the annex. + +The smudge filter is run when files are checked out. Since git annex +repos have partial content, this would not git annex get the file content. +Instead, if the content is not currently available, it would need to do +something like return empty file content. (Sadly, it cannot create a +symlink, as git still wants to write the file afterwards.) + +So the nice current behavior of unavailable files being clearly missing due +to dangling symlinks, would be lost when using smudge/clean filters. +(Contact git developers to get an interface to do this?) + +Instead, we get the nice behavior of not having to remeber to `git annex +add` files, and just being able to use `git add` or `git commit -a`, +and have it use git-annex when .gitattributes says to. Also, annexed +files can be directly modified without having to `git annex unlock`. + +### design + +In .gitattributes, the user would put something like "* filter=git-annex". +This way they could control which files are annexed vs added normally. + +(git-annex could have further controls to allow eg, passing small files +through to regular processing. At least .gitattributes is a special case, +it should never be annexed...) + +For files not configured this way, git-annex could continue to use +its symlink method -- this would preserve backwards compatability, +and even allow mixing the two methods in a repo as desired. + +To find files in the repository that are annexed, git-annex would do +`ls-files` as now, but would check if found files have the appropriate +filter, rather than the current symlink checks. To determine the key +of a file, rather than reading its symlink, git-annex would need to +look up the git blob associated with the file -- this can be done +efficiently using the existing code in `Branch.catFile`. + +The clean filter would inject the file's content into the annex, and hard +link from the annex to the file. Avoiding duplication of data. + +The smudge filter can't do that, so to avoid duplication of data, it +might always create an empty file. To get the content, `git annex get` +could be used (which would hard link it). A `post-checkout` hook might +be used to set up hard links for all currently available content. + +#### clean + +The trick is doing it efficiently. Since git a2b665d, v1.7.4.1, +something like this works to provide a filename to the clean script: + + git config --global filter.huge.clean huge-clean %f + +This could avoid it needing to read all the current file content from stdin +when doing eg, a git status or git commit. Instead it is passed the +filename that git is operating on, in the working directory. +(Update: No, doesn't work; git may be cleaning a different file content +than is currently on disk, and git requires all stdin be consumed too.) + +So, WORM could just look at that file and easily tell if it is one +it already knows (same mtime and size). If so, it can short-circuit and +do nothing, file content is already cached. + +SHA1 has a harder job. Would not want to re-sha1 the file every time, +probably. So it'd need a local cache of file stat info, mapped to known +objects. + +But: Even with %f, git actually passes the full file content to the clean +filter, and if it fails to consume it all, it will crash (may only happen +if the file is larger than some chunk size; tried with 500 mb file and +saw a SIGPIPE.) This means unnecessary works needs to be done, +and it slows down *everything*, from `git status` to `git commit`. +**showstopper** I have sent a patch to the git mailing list to address +this. (Update: apparently +can't be fixed.) + +#### smudge + +The smudge script can also be provided a filename with %f, but it +cannot directly write to the file or git gets unhappy. + +### dealing with partial content availability + +The smudge filter cannot be allowed to fail, that leaves the tree and +index in a weird state. So if a file's content is requested by calling +the smudge filter, the trick is to instead provide dummy content, +indicating it is not available (and perhaps saying to run "git-annex get"). + +Then, in the clean filter, it has to detect that it's cleaning a file +with that dummy content, and make sure to provide the same identifier as +it would if the file content was there. + +I've a demo implementation of this technique in the scripts below. + +---- + +### test files + +huge-smudge: + +
+#!/bin/sh
+read f
+file="$1"
+echo "smudging $f" >&2
+if [ -e ~/$f ]; then
+	cat ~/$f # possibly expensive copy here
+else
+	echo "$f not available"
+fi
+
+ +huge-clean: + +
+#!/bin/sh
+file="$1"
+cat >/tmp/file
+# in real life, this should be done more efficiently, not trying to read
+# the whole file content!
+if grep -q 'not available' /tmp/file; then
+	awk '{print $1}' /tmp/file # provide what we would if the content were avail!
+	exit 0
+fi
+echo "cleaning $file" >&2
+# XXX store file content here
+echo $file
+
+ +.gitattributes: + +
+*.huge filter=huge
+
+ +in .git/config: + +
+[filter "huge"]
+        clean = huge-clean %f
+        smudge = huge-smudge %f
+
diff --git a/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment b/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment
new file mode 100644
index 000000000..a4eb3cf23
--- /dev/null
+++ b/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://christian.amsuess.com/chrysn"
+ nickname="chrysn"
+ subject="git-add instead of git-annex-add"
+ date="2011-02-26T21:43:21Z"
+ content="""
+would, with these modifications in place, there still be a way to *really* git-add a file? (my main repository contains both normal git and git-annex files.)
+"""]]
diff --git a/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment b/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment
new file mode 100644
index 000000000..3a223e1c7
--- /dev/null
+++ b/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://dieter-be.myopenid.com/"
+ nickname="dieter"
+ subject="symlinks"
+ date="2011-04-03T20:30:21Z"
+ content="""
+> (Sadly, it cannot create a symlink, as git still wants to write the file afterwards.
+> So the nice current behavior of unavailable files being clearly missing due to dangling symlinks, would be lost when using smudge/clean filters. (Contact git developers to get an interface to do this?)
+
+Have you checked what the smudge filter sees when the input is a symlink? Because git supports tracking symlinks, so it should also support pushing symlinks through a smudge filter, right?
+Either way: yes, contact the git devs, one can only ask and hope.  And if you can demonstrate the awesomeness of git-annex they might get more 1interested :)
+"""]]
diff --git a/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment b/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment
new file mode 100644
index 000000000..cd64b7001
--- /dev/null
+++ b/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn1QhtPvsRBV7pfaDW_ZTPFv_ZIxSzQ8Rg"
+ nickname="Paul Léo"
+ subject="comment 3"
+ date="2013-11-13T20:41:52Z"
+ content="""
+> SHA1 has a harder job. Would not want to re-sha1 the file every time, probably. So it'd need a local cache of file stat info, mapped to known objects.
+
+I think that is not true? If gits wants the file to be cleaned, it thinks that the file was changed. So you would have to SHA1 it anyway if you don't want rely on WORM (which git already does in the first step anyway).
+"""]]
diff --git a/doc/todo/ssh_special_remote.mdwn b/doc/todo/ssh_special_remote.mdwn
new file mode 100644
index 000000000..be38f4209
--- /dev/null
+++ b/doc/todo/ssh_special_remote.mdwn
@@ -0,0 +1,44 @@
+ssh:// remotes are not special remotes. Perhaps it would be useful to have
+a special remote that wraps a ssh:// remote? This would allow setting up a
+ssh:// remote that can be enabled using the webapp's normal UI for enabling
+special remotes.
+
+Enabling such a special remote would just make a regular git remote, so
+there would be no need to implement the methods to get/put data. (Although
+it might need to provide stubs to appease the compiler.)
+
+> Above is done. The command line interface in initremote and enableremote
+> is not too easy or perhaps useful, but it works great in the webapp.
+> --[[Joey]]
+
+It could optionally embed the ssh private key into the git-annex branch as
+a credential, for when you want anyone who has access to the git repo to be
+able to use the (locked-down) git-annex-shell on that server.
+
+> Leaving this todo open for this ssh private key embedcreds part.
+> I think it makes sense to do, but it it probably not too easy.
+> ([[webapp_ssh_setup_should_work_with_locked_down_git-annex-shell_account]]
+> needs to be fixed first). --[[Joey]]
+
+[[!meta title="remember ssh remote including optionally ssh key"]]
+
+----
+
+I am on the fence about whether this would be useful, and would appreciate
+use cases.
+
+One use case I was thinking about was a LAN with a central server, with a
+shared account with a git-annex repository on it. But then I realized this
+wouldn't really help set up git-annex in that situation, most of the time,
+because new clients would have the central server added as their first
+remote. 
+
+(It would help if one client paired with another new client, but
+that is unncessarily round-about most of the time.) 
+
+It might help in a more complex situation, where the LAN is not the whole
+network an a client might come onto the LAN already knowing about the
+central server there. --[[Joey]]
+
+A very compelling use case is switching from XMPP to a ssh server,
+and wanting to make it easy for users. --[[Joey]]
diff --git a/doc/todo/stream_feature__63__.mdwn b/doc/todo/stream_feature__63__.mdwn
new file mode 100644
index 000000000..860edfc81
--- /dev/null
+++ b/doc/todo/stream_feature__63__.mdwn
@@ -0,0 +1,23 @@
+I am just asking myself, is it stupid to think that streaming in git annex would be a good idea and wouldnt it be totaly easy to implement?
+
+Ok just tried to link to files over ssh, it creates a link but you cant open with it its content ^^
+
+But at least the files you have access over some filesystem as example samba/sshfs or just a other directory or usb-drive you could stream instead of "get"
+
+you could add another mode like direct and indirect, like symbolic-links or something like that?
+
+Sadly linux is to stupid to allow direct ssh links ( thats maybe one of the biggest features hurd has over linux  ) but you could mount with sshfs readonly (checking first if sshfs is installed) to mount the files there and then map the links there.
+
+ok I am not so shure how hard it would be and how much bug potentials it creates, but it would be great I guess.
+
+git annex is a bit like a telephone book, where you get a list of where the targets are. So using it to call the persons so that they drive to you to talk with you is nice. But I think the better feature would be if you just talk with the guy over the telephone directly bevore he comes to you (streaming)
+
+I mean you did one great thing, you did make cloudy thing peer to peer, like git is targeted too but for smaller files, yes there are may use cases without this feature, but I would be really glad if it could do that too, if I give annex 5 locations on other pcs usb-sticks etc, I find it stupid to additionaly do setup all this sources again a second time for streaming, and then I have maybe even 2 different file names because you map stuff in git.
+
+So sorry its late here, I am a bit tired so I maybe dont know what I am talking right now, my english isnt the best, too, but I think it would be a great feature.
+
+I mean on your setup, with slow internet, you maybe always make a get command, but here, if I link to youtube, I have no problem to stream it, or even on internal network between my pcs I have gb-lan, I start directly movies streaming, I would only use get, in rare cases where I need them on a train, the normal thing is to stream stuff.
+
+So I have to go sleep now 
+
+bye
diff --git a/doc/todo/support_S3_multipart_uploads.mdwn b/doc/todo/support_S3_multipart_uploads.mdwn
new file mode 100644
index 000000000..711ac41b2
--- /dev/null
+++ b/doc/todo/support_S3_multipart_uploads.mdwn
@@ -0,0 +1,14 @@
+Did not know of this when I wrote S3 support. Ability to resume large
+uploads would be good.
+
+
+
+Also allows supporting files > 5 gb, a S3 limit I was not aware of.
+
+NB: It would work just as well to split the object and upload the N parts
+to S3, but not bother with S3's paperwork to rejoin them into one object. 
+Only reasons not to do that are a) backwards compatability with 
+the existing S3 remote and b) this would not allow accessing the content
+in S3 w/o using git-annex, which could be useful in some scenarios.
+
+--[[Joey]]
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
new file mode 100644
index 000000000..524782bc7
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
@@ -0,0 +1,6 @@
+As discussed on debconf, I have the following use case:
+
+* I have a dump remote, a folder on my webserver where files are uploaded through the web app. I don't have git on the webserver, just a plain folder.
+* I have git-annex repo on a development server. The development server polls the webserver (ssh/ftp) once in an hour and synchronizes the state of the local git-annex repo with the state found on the webserver and commits that.
+* This is not meant to be backup facility. I just want to be able to have a state on my development machine that is very likely to the state on the webserver.
+
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment
new file mode 100644
index 000000000..d9abb3a3c
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 1"
+ date="2013-08-13T21:44:17Z"
+ content="""
+We had a conversation about this IRL. At the time, I thought I understood what you wanted. Reading the above, I am not so sure.
+
+What I thought you wanted was something like `git annex mirror --from remote`, which would, for each object known to git-annex that the location log said was present on the remote, make sure that the local repo had the object too, and for each object that the location log said was not present on the remote, drop it from the local repo (if numcopies etc allowed).
+
+`git annex mirror --to remote` could also be used as the complement of the above.
+
+If that's not the sort of thing you meant, let me know.
+"""]]
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment
new file mode 100644
index 000000000..3d459371f
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://thkoch2001.myopenid.com/"
+ nickname="thkoch"
+ subject="pseudocode"
+ date="2013-08-14T04:58:22Z"
+ content="""
+lets say my local annex is in direct mode, then the following might already do what I want:
+
+cd $LOCAL_ANNEX
+rsync --recursive --delete $REMOTE .
+git annex add && git commit
+
+It would however be nice if I could do the same with an annex in indirect mode or even a bare annex.
+"""]]
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment
new file mode 100644
index 000000000..df4be033b
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 3"
+ date="2013-08-24T16:35:33Z"
+ content="""
+Seems to me that this could easily be dealt with by installing git-annex on the webserver, making the directory there a git repository, and using either a cron job or `git annex watch` to commit files as they were changed there.
+
+Then you can make a direct mode, indirect mode, or even a bare clone on your local machine and use git-annex to get the files.
+
+Maybe you have good reasons for not wanting to go that route. And rsync on a direct mode repository should work, provided to tell it to not delete `.git`. :P I don't see any way to make rsync work in an indirect mode repository. As for trying to make git-annex handle this import over rsync itself in a way that would work in an indirect mode repository, let alone a bare repository -- I don't see a good way to do it and it seems quite special case and likely to get quite complicated to implement.
+
+In the meantime, I did implement `git annex mirror`, which I think is a much more interesting and generally useful tool to have. And could even be used in my recommended solution above.
+"""]]
diff --git a/doc/todo/tahoe_lfs_for_reals.mdwn b/doc/todo/tahoe_lfs_for_reals.mdwn
new file mode 100644
index 000000000..2caeef11d
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals.mdwn
@@ -0,0 +1,23 @@
+[[forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs]] is a good
+start, but Zooko points out that using Tahoe's directory translation layer
+incurs O(N^2) overhead as the number of objects grows. Also, making
+hash subdirectories in Tahoe is expensive. Instead it would be good to use
+it as a key/value store directly. The catch is that doing so involves
+sending the content to Tahoe, and getting back a key identifier.
+
+This would be fairly easy to do as a [[backend|backends]], which can assign its
+own key names (although typically done before data is stored in it),
+but a tahoe-lafs special remote would be more flexible.
+
+To support a special remote, a mapping is needed from git-annex keys to
+Tahoe keys, stored in the git-annex branch.
+
+> This is now done, however, there are 3 known
+> problems: 
+> 
+> * tahoe start run unncessarily 
+> * web.port can conflict 
+> * Nothing renews leases, which is a problem on grids that expire.
+>   
+
+> --[[Joey]] 
diff --git a/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment b/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment
new file mode 100644
index 000000000..16ef882a4
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="zooko"
+ ip="97.118.97.117"
+ subject="performance"
+ date="2011-05-17T19:20:39Z"
+ content="""
+Hm... O(N^2)? I think it just takes O(N). To read an entry out of a directory you have to download the entire directory (and store it in RAM and parse it). The constants are basically \"too big to be good but not big enough to be prohibitive\", I think. jctang has reported that his special remote hook performs well enough to use, but it would be nice if it were faster.
+
+The Tahoe-LAFS folks are working on speeding up mutable files, by the way, after which we would be able to speed up directories.
+"""]]
diff --git a/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment b/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment
new file mode 100644
index 000000000..6dba86c47
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 2"
+ date="2011-05-17T19:57:33Z"
+ content="""
+Whoops! You'd only told me O(N) twice before..
+
+So this is not too high priority. I think I would like to get the per-remote storage sorted out anyway, since probably it will be the thing needed to convert the URL backend into a special remote, which would then allow ripping out the otherwise unused pluggable backend infrastructure.
+
+Update: Per-remote storage is now sorted out, so this could be implemented
+if it actually made sense to do so.
+"""]]
diff --git a/doc/todo/union_mounting.mdwn b/doc/todo/union_mounting.mdwn
new file mode 100644
index 000000000..c42a05502
--- /dev/null
+++ b/doc/todo/union_mounting.mdwn
@@ -0,0 +1,10 @@
+It should be possible to union mount annexes. So if multiple drives have
+content, an annex mounting them both would have available all the 
+content from all the drives.
+
+This could be done by just making .git/annex/KEY link to the actual content
+on the mounted annex.
+
+(Need to make sure the [[copy_tracking|copies]] code does not
+confused and think the symlink is a copy of the content.. Also need to make
+sure that code that writes to .git/annex does not follow symlinks.))
diff --git a/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
new file mode 100644
index 000000000..3fadf6fa3
--- /dev/null
+++ b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog"
+ nickname="Michael"
+ subject="comment 1"
+ date="2013-03-01T01:26:36Z"
+ content="""
+This would indeed be very helpful when remotely mounting a photo/video collection over samba.
+"""]]
diff --git a/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
new file mode 100644
index 000000000..08901ee17
--- /dev/null
+++ b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://edheil.wordpress.com/"
+ ip="173.162.44.162"
+ subject="comment 2"
+ date="2013-03-01T04:50:28Z"
+ content="""
++1 this would be sweet as hell
+
+"""]]
diff --git a/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
new file mode 100644
index 000000000..ae925adf0
--- /dev/null
+++ b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://ypid.wordpress.com/"
+ nickname="ypid"
+ subject="Please add this ;)"
+ date="2014-03-13T19:10:17Z"
+ content="""
++1 This would be so great. For me the only thing which is missing in this awesome project.
+"""]]
diff --git a/doc/todo/unwanted_repository_version_upgrades.mdwn b/doc/todo/unwanted_repository_version_upgrades.mdwn
new file mode 100644
index 000000000..189550803
--- /dev/null
+++ b/doc/todo/unwanted_repository_version_upgrades.mdwn
@@ -0,0 +1,25 @@
+Is it possible to freeze or peg repositories at a particular version, or to prevent automatic repository version upgrades?  Is it possible to "downgrade" a repository?
+
+### Please describe the problem.
+
+We have a number of repositories on a shared file server.  These repositories are accessed by multiple machines.  Some of these repositories appear to have gotten upgraded and are now unusable on machines running older versions of git-annex.
+
+We're getting this message:
+[[!format sh """
+user@system:/path/to/repository$ git annex status
+git-annex: Repository version 5 is not supported. Upgrade git-annex.
+"""]]
+
+The machine experiencing the problem is running Debian Wheezy (Stable).
+[[!format sh """
+user@system:/path/to/repository$ git version
+git version 1.7.10.4
+user@system:/path/to/repository$ git annex version
+git-annex version: 3.20120629
+local repository version: 5
+default repository version: 3
+supported repository versions: 3
+upgrade supported from repository versions: 0 1 2
+"""]]
+
+I'm guessing that one of the machines with access to this repository was running a newer version of git-annex, and that the repository was upgraded in the course of some action.
diff --git a/doc/todo/unwanted_repository_version_upgrades/comment_1_48f71865b65db4574a10e5c32ee22197._comment b/doc/todo/unwanted_repository_version_upgrades/comment_1_48f71865b65db4574a10e5c32ee22197._comment
new file mode 100644
index 000000000..2eee18f1a
--- /dev/null
+++ b/doc/todo/unwanted_repository_version_upgrades/comment_1_48f71865b65db4574a10e5c32ee22197._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 1"
+ date="2014-06-04T18:14:19Z"
+ content="""
+If your repository is not using direct mode, it's completely safe to edit .git/config and set the version back to 3. There is no change between 3 and 5 for indirect mode repositories.
+
+Unfortunately, using git-annex version 5 will automatically upgrade the repository to 5 again. In general, I only want git-annex to support one version at a time, to avoid complicating the code. I did try leaving the indirect mode repositories at v3, but that didn't work out (some details in [[!commit b1d7474c1d713a5b422948178abb4e5f39e85096]]).
+
+I kind of think that part of the problem is that you're using git-annex repositories accessed via a file server. If your server had git-annex installed on it and the clients talked to it only by sshing in and running git-annex-shell, it would not matter if the clients had a newer version, because they'd never access the central repository directly.
+"""]]
diff --git a/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn b/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn
new file mode 100644
index 000000000..d9226d21f
--- /dev/null
+++ b/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn
@@ -0,0 +1,12 @@
+Having the option of choosing for every file if we want it in our repository or not would be a great feature. It is currently possible using the wanted expression, but it is not very flexible, or it becomes unmaintainable.
+
+I tried with two repositories a and b, with the following wanted expressions :
+
+* for a: `not metadata=unwanted=`
+* for b: `not metadata=unwanted=`
+
+I think those expressions should be included in standard wanted expressions.
+
+Also, to improbe the feature, it should be possible to set (or remove) metadata in directories, and those should automatically affect their content.
+
+And we could imagine a `git annex unwant` command that would add the unwanted metadata to a file, copy it to other repositories, and attempt to drop it.
diff --git a/doc/todo/view_git_annex_log_in_webapp.mdwn b/doc/todo/view_git_annex_log_in_webapp.mdwn
new file mode 100644
index 000000000..3815643b2
--- /dev/null
+++ b/doc/todo/view_git_annex_log_in_webapp.mdwn
@@ -0,0 +1,5 @@
+Just gave git annex a quick try for a few minutes and I must admit it's pretty great.
+
+A must have feature for me is to be able to view git annex log in the web app as "git annex log" doesn't got BIDI support (RTL scripts like Arabic, Farsi, Hebrew).
+Adding Bi-directional text support would be too much to ask from a developer that don't know these languages thus the solution is to use the already the web browser to handle that.
+
diff --git a/doc/todo/view_git_annex_log_in_webapp/comment_1_945054441d93423b2c7b81712b364a3c._comment b/doc/todo/view_git_annex_log_in_webapp/comment_1_945054441d93423b2c7b81712b364a3c._comment
new file mode 100644
index 000000000..362119bae
--- /dev/null
+++ b/doc/todo/view_git_annex_log_in_webapp/comment_1_945054441d93423b2c7b81712b364a3c._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmHp5oVW8Z9v_vHs5FRtlYj80TYMQWVTS0"
+ nickname="dhead"
+ subject="comment 1"
+ date="2014-05-30T00:13:27Z"
+ content="""
+...the already built in BIDI support the web browser to handle that.
+"""]]
diff --git a/doc/todo/view_git_annex_log_in_webapp/comment_2_0f434dfe80e90951870218bc1b76c374._comment b/doc/todo/view_git_annex_log_in_webapp/comment_2_0f434dfe80e90951870218bc1b76c374._comment
new file mode 100644
index 000000000..f9e14a55f
--- /dev/null
+++ b/doc/todo/view_git_annex_log_in_webapp/comment_2_0f434dfe80e90951870218bc1b76c374._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.176"
+ subject="comment 2"
+ date="2014-05-30T00:32:25Z"
+ content="""
+I don't understand this request at all
+
+* There are plenty of console emulators with bidi support. If you need bidi support, surely you have already found and are using one of them?
+* `git annex log` does not output much that seems likely to need bidi support. At least no more than any other git-annex command, specifically names of remotes, and names of files.
+* `git annex log` is a low-level tool, almost a debugging tool. Users of the webapp might be interested in which repositories a file has gotten to, but surely not the history of past locations of files.
+"""]]
diff --git a/doc/todo/webapp_ssh_setup_should_work_with_locked_down_git-annex-shell_account.mdwn b/doc/todo/webapp_ssh_setup_should_work_with_locked_down_git-annex-shell_account.mdwn
new file mode 100644
index 000000000..d91bd4be5
--- /dev/null
+++ b/doc/todo/webapp_ssh_setup_should_work_with_locked_down_git-annex-shell_account.mdwn
@@ -0,0 +1,7 @@
+When the webapp is used to set up a ssh repository, it should detect if
+there is already a repository, and sshing in to the server forces running
+git-annex-shell (perhaps by it being set to the user's login shell). 
+
+In this case it should just use the already set up repository. Note that
+it would not be possible to add a new repository on the server using only
+git-annex-shell. --[[Joey]]
diff --git a/doc/todo/windows_git-annex_service.mdwn b/doc/todo/windows_git-annex_service.mdwn
new file mode 100644
index 000000000..5a7e91752
--- /dev/null
+++ b/doc/todo/windows_git-annex_service.mdwn
@@ -0,0 +1,30 @@
+## git-annex as service on windows
+
+Use nssm to run git-annex as a service. Will need to include it in the
+git-annex bundle.
+
+Problem: nssm runs git-annex as a service as a LocalService user. (Or some
+similar user.) This leads to permission problems, when the normal user
+tries to write to its directory.
+
+Solution: Make `git-annex mkservice $repo` command (only avilable on
+Windows) that does:
+
+1. git -c core.sharedRepository=true init $repo
+2. cd $repo; git annex init
+4. chmod 777 -R $repo
+5. Add $repo to C:\.config\git-annex\autostart
+6. If git-annex service does not yet exist in nssm, set it up and start it.
+
+**Problem**: With 2 users writing to one repository, files and subdirs
+will end up owned by git-annex or by the desktop user, and the other user 
+won't be able to eg, edit a file or remove a file from a directory.
+
+Make git-annex read `C:\.config\git-annex\autostart`
+on Windows, in addition to the one in $HOME. This way, `git annex assistant
+--autostart` and `git annex webapp` will use it, no matter which user.
+
+WIP git branch: `winservice`
+
+> I am calling this [[done]], it's not done using a service, but it works.
+> --[[Joey]]
diff --git a/doc/todo/windows_git-annex_service/comment_11_c3af14453e99dae5425deaa26ca7310e._comment b/doc/todo/windows_git-annex_service/comment_11_c3af14453e99dae5425deaa26ca7310e._comment
new file mode 100644
index 000000000..83e2ba514
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_11_c3af14453e99dae5425deaa26ca7310e._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA"
+ nickname="Dominik"
+ subject="running as service"
+ date="2014-05-13T17:40:57Z"
+ content="""
+Hey, just tried git-annex on windows. Love the idea, but the windows port still seems to be a work in progress. I thought I'd check in here and see if i could help. Maybe this is a start:
+
+You can setup any executable file as a windows service using Sc.exe included in the Windows Resource Kit.
+https://support.microsoft.com/kb/251192?SmcNavTabIndex=1
+Its pretty easy and straightforward 
+
+Another option would be installing the service using nsis, here is one possible plugin that should do the trick: http://nsis.sourceforge.net/NSIS_Simple_Service_Plugin
+"""]]
diff --git a/doc/todo/windows_git-annex_service/comment_11_e2dda1037cc85f03613f2774c139ad56._comment b/doc/todo/windows_git-annex_service/comment_11_e2dda1037cc85f03613f2774c139ad56._comment
new file mode 100644
index 000000000..df945b517
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_11_e2dda1037cc85f03613f2774c139ad56._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 11"
+ date="2014-06-16T23:47:36Z"
+ content="""
+I am stuck with apparently intractable permissions problems, if the git-annex service doesn't run as the same user who wants to use the git-annex repository.
+
+nssm is supposed to let the user the service runs as be set on the Log on tab, but I cannot get it to accept any user/password there, on my XP test VM. If anyone gets that tab in nssm to work, let me know.
+"""]]
diff --git a/doc/todo/windows_git-annex_service/comment_12_249a48a241f14f32dab49f381d2de3b3._comment b/doc/todo/windows_git-annex_service/comment_12_249a48a241f14f32dab49f381d2de3b3._comment
new file mode 100644
index 000000000..9b7e87654
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_12_249a48a241f14f32dab49f381d2de3b3._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA"
+ nickname="Dominik"
+ subject="comment 12"
+ date="2014-06-17T00:01:35Z"
+ content="""
+To get rid of permission problems, you may find setacl useful. Chmod and chown from msys dont't seem to work correctly with windows 8
+"""]]
diff --git a/doc/todo/windows_git-annex_service/comment_12_d3d91ddc00bc275455022d86b779b148._comment b/doc/todo/windows_git-annex_service/comment_12_d3d91ddc00bc275455022d86b779b148._comment
new file mode 100644
index 000000000..df4545911
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_12_d3d91ddc00bc275455022d86b779b148._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 12"
+ date="2014-05-15T20:36:09Z"
+ content="""
+@Dominik, thanks for the links. Now that the webapp handles prompting for ssh passwords, the console is entirely vestigial and I'd like to get rid of it. The sc commands seems possible to use; there are also haskell libraries for building windows services.
+
+The tricky part is that multiple git-annex assistant processes can be running, if there are multiple local repositories. This seems to be hard to do as a service.
+"""]]
diff --git a/doc/todo/windows_git-annex_service/comment_13_59fbe4d07cdbeb786bae792f9c709ddd._comment b/doc/todo/windows_git-annex_service/comment_13_59fbe4d07cdbeb786bae792f9c709ddd._comment
new file mode 100644
index 000000000..3d630ed0c
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_13_59fbe4d07cdbeb786bae792f9c709ddd._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://johan.kiviniemi.name/"
+ nickname="Johan"
+ subject="comment 13"
+ date="2014-05-16T02:27:51Z"
+ content="""
+“The tricky part is that multiple git-annex assistant processes can be running, if there are multiple local repositories.”
+
+This would probably mean a lot of work, but it might be nice if there was just a single git-annex assistant per user which could take care of multiple local repos. The UI would be nicer, too, since the status of and notifications from every repository could be shown in the same place.
+"""]]
diff --git a/doc/todo/windows_git-annex_service/comment_13_f1d254fe85b0e5cbc7edf9096af4f942._comment b/doc/todo/windows_git-annex_service/comment_13_f1d254fe85b0e5cbc7edf9096af4f942._comment
new file mode 100644
index 000000000..894eb4b6c
--- /dev/null
+++ b/doc/todo/windows_git-annex_service/comment_13_f1d254fe85b0e5cbc7edf9096af4f942._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 13"
+ date="2014-06-17T16:52:55Z"
+ content="""
+I have messed with the windows ACLs some yesterday, but I don't know how or if it's possible to set ACLs on a directory, such that everything created inside it will be writable by two different users. Certainly this is doable on POSIX; if it's doable on Windows, I'll revisit services.
+
+----
+
+
+For now, it seems that a better option may be to not run git-annex as a service, but use various dos-window hiding technologies.
+
+
+
+I have successfully gotten this to work using nircmd. make a git-annex-webapp.bat, containing:
+
+
+title GitAnnex
+nircmd.exe win hide ititle \"GitAnnex\"
+git annex webapp
+
+ +This works, although the DOS box flashes onscreen for maybe 1/10th of a second before nircmd hides it. A git-annex-assistant.bat could run git-annex assistant --autostart, and would be suitable to be setup to run on startup. + +(It seems that it's possible to write a VBScript or C# program that sets up a hidden WScript.Shell and runs a command in it. That might avoid the window flash. However, it seems hard to get VBScript to run, and I have not investigated C#.) +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_14_79fc0ff98c5bba2ed616e52e5a58e28f._comment b/doc/todo/windows_git-annex_service/comment_14_79fc0ff98c5bba2ed616e52e5a58e28f._comment new file mode 100644 index 000000000..9d7fb9ff0 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_14_79fc0ff98c5bba2ed616e52e5a58e28f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA" + nickname="Dominik" + subject="multiple git-annex assistant processes" + date="2014-05-16T23:05:28Z" + content=""" +shouldn't be a problem though if all processes are spawned from the same service though, right? Or what problems did you have in mind? +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_14_7d5fdac0084c4742967879f5f0f9fccf._comment b/doc/todo/windows_git-annex_service/comment_14_7d5fdac0084c4742967879f5f0f9fccf._comment new file mode 100644 index 000000000..5aba4e8e4 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_14_7d5fdac0084c4742967879f5f0f9fccf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 14" + date="2014-06-17T16:56:32Z" + content=""" +Note that nircmd is not free software; but can be distributed free of charge, provided all the files in the zip are included and unmodified. Sucks, but it's windows.. +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_15_8f10491f8c0a151284e6d81a83eab212._comment b/doc/todo/windows_git-annex_service/comment_15_8f10491f8c0a151284e6d81a83eab212._comment new file mode 100644 index 000000000..c7247ce45 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_15_8f10491f8c0a151284e6d81a83eab212._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 15" + date="2014-06-17T17:10:28Z" + content=""" + is another option. + +How to run VB script: + + +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_15_fcd34607116183cc1a764fb307eabe0a._comment b/doc/todo/windows_git-annex_service/comment_15_fcd34607116183cc1a764fb307eabe0a._comment new file mode 100644 index 000000000..57505d1d9 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_15_fcd34607116183cc1a764fb307eabe0a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 15" + date="2014-06-04T20:49:26Z" + content=""" +`sc` can only be used by the administrator. That is problimatic. + +Also, in order for sc to be used, the program has to have support for it. It cannot be any arbitrary program. win32-service adds such support. However, I have not been able to get programs using win32-service to build: +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_16_51800fd83cd979b021eabdd4c44cfd61._comment b/doc/todo/windows_git-annex_service/comment_16_51800fd83cd979b021eabdd4c44cfd61._comment new file mode 100644 index 000000000..7efe7b338 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_16_51800fd83cd979b021eabdd4c44cfd61._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 16" + date="2014-06-17T17:18:34Z" + content=""" +Using wscript to run a file containing this will start the webapp w/o any console flicker: + +
+Set objshell=CreateObject(\"Wscript.Shell\")
+objShell.Run(\"git-annex webapp\"), 0, False
+
+"""]] diff --git a/doc/todo/windows_git-annex_service/comment_16_6a6424f23772e57f1adb1807ca8b93fa._comment b/doc/todo/windows_git-annex_service/comment_16_6a6424f23772e57f1adb1807ca8b93fa._comment new file mode 100644 index 000000000..53b705d05 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_16_6a6424f23772e57f1adb1807ca8b93fa._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="service not needed" + date="2014-06-04T21:16:06Z" + content=""" +Seems that all I need to do is pass -optl-mwindows when building git-annex; this will produce a binary that does not open a console window when started from the start menu, but still runs in the background. So it will work as the webapp. + +**However**, it can't be used at the command line. So, I think I should make a git-annex-webapp shim that's built that way and starts the real webapp. + +But, some work needs to be done, because when run this way, git-annex can't write to stdout or stderr, which it tries to do, and so crashes on startup. + +Also, when git-annex is built that way and tries to run git.. windows helpfully opens a command.exe to display any output git might have. So we get lots of flickering command.exe windows. +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_17_62a1a33c2aaf4b0b8a0149ec526907d7._comment b/doc/todo/windows_git-annex_service/comment_17_62a1a33c2aaf4b0b8a0149ec526907d7._comment new file mode 100644 index 000000000..520e50154 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_17_62a1a33c2aaf4b0b8a0149ec526907d7._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA" + nickname="Dominik" + subject="comment 17" + date="2014-06-05T16:42:02Z" + content=""" +Actually you can create a service from any program or batch file using srvany.exe from the windows resource kit: http://support.microsoft.com/kb/137890. An alternative would be the Non-Sucking Service Manager http://nssm.cc/ +Also nsis has some plugins for creating services, but i havent tried any of them: http://nsis.sourceforge.net/How_do_I_start/stop/create/remove/check_a_service + +Upsides: +1) You don't have to touch your code or change anything in the compilation just to create the service +2) git-annex will still work fine from the console +Downside: You'd have to include an extra binary or plugin in your installer for creating the service + +But I'm pretty sure that none of the commandline calls would pop up in a new window that way, but if you need the verbose mode, you could still start the webapp from console instead as service and everything will show as expected +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_18_3a408492107ca6f120b631ce8c41faef._comment b/doc/todo/windows_git-annex_service/comment_18_3a408492107ca6f120b631ce8c41faef._comment new file mode 100644 index 000000000..494e3f43a --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_18_3a408492107ca6f120b631ce8c41faef._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="nssm notes" + date="2014-06-10T18:16:00Z" + content=""" +* Have to install and run nssm as an administrator. (It may be possible to get it to run as a non-administrator user if the admin sets it up. I haven't succeeded.) +* `nssm install git-annex` +* Set path to git-annex, and set Arguments to: `assistant --autostart` +* In Exit tab, change Restart to \"No action\" +* In Process tab, uncheck \"Console window\" +* Repositories to start up have to be listed in `C:\Documents and Settings\LocalService\.config\git-annex\autostart` + (rather than the normal user home directory) + +After all that it works! Even opening git-annex webapp from the menu avoids the console window (it appears briefly but then goes away). + +Most of this setup could be boiled down to a command line invocation, which git-annex could do at install time. However, it would still need to be run by the admin. Luckily the git-annex installation process already only works as admin (and I guess I could close the bug about that if it gets a legitimate reason to need admin..) + +Some changes in git-annex would improve this. + +* Maybe have a way to specify the user that git-annex is running on behalf of, and look in that user's home directory, rather than LocalService. (Other parts of the webapp UI, like adding a new repository, also use LocalService as the home directory, which is confusing). +* Starting the webapp for the first time to create a repository still opens a console window, so find a workaround for this. +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_19_c6cbc8fe9218f90c661cd1026658c939._comment b/doc/todo/windows_git-annex_service/comment_19_c6cbc8fe9218f90c661cd1026658c939._comment new file mode 100644 index 000000000..ec3cf7b09 --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_19_c6cbc8fe9218f90c661cd1026658c939._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA" + nickname="Dominik" + subject="comment 19" + date="2014-06-10T18:24:22Z" + content=""" +That sounds great! I'll try it out on windows 8 aswell once i get around to it. +"""]] diff --git a/doc/todo/windows_git-annex_service/comment_20_ca245781a37db5546da3f7204adbeebb._comment b/doc/todo/windows_git-annex_service/comment_20_ca245781a37db5546da3f7204adbeebb._comment new file mode 100644 index 000000000..badb5308a --- /dev/null +++ b/doc/todo/windows_git-annex_service/comment_20_ca245781a37db5546da3f7204adbeebb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 20" + date="2014-06-10T19:11:57Z" + content=""" +This seems pretty close to a command line to install the service with nssm. + +
+nssm install git-annex 'C:\Program Files\Git\cmd\git-annex.exe' assistant --autostart
+nssm set git-annex AppExit 0 Ignore
+nssm set git-annex AppExit 1 Ignore
+nssm set git-annex AppDirectory C:\
+nssm set git-annex AppNoConsole 1
+nssm start git-annex
+
+"""]] diff --git a/doc/todo/windows_support.mdwn b/doc/todo/windows_support.mdwn new file mode 100644 index 000000000..a48fcbc4e --- /dev/null +++ b/doc/todo/windows_support.mdwn @@ -0,0 +1,121 @@ +The git-annex Windows port is beta, but rapidly becoming polished and +usable! + +## status + +* XMPP library not yet built. (See below.) + +* Local pairing seems to fail, after acking on Linux box, it stalls. + (Also, of course, the Windows box is unlikely to have a ssh server, + so only pairing with a !Windows box will work.) + +* gcrypt is not ported to windows (and as a shell script, may need + to be rewritten) + +* Incremental fsck sets the sticky bit to record when a file is fscked, + and this is not done on windows, so fsck doesn't behave incrementally + there. + +* Deleting a git repository from inside the webapp fails "RemoveDirectory + permision denied ... file is being used by another process" + +## potential encoding problems + +[[bugs/Unicode_file_names_ignored_on_Windows]] is fixed, but some potential +problems remain, since the FileSystemEncoding that git-annex relies on +seems unreliable/broken on Windows. + +* When git-annex displays a filename that it's acting on, there + can be mojibake on Windows. For example, "háčky.txt" displays + the accented characters as instead the pairs of bytes making + up the utf-8. Tried doing various things to the stdout handle + to avoid this, but only ended up with encoding crashes, or worse + mojibake than this. + +* `md5FilePath` still uses the filesystem encoding, and so may produce the + wrong value on Windows. This would impact keys that contain problem characters + (probably coming from the filename extension), and might cause + interoperability problems when git-annex generates the hash directories of a + remote, for example a rsync remote. + +* `encodeW8` is used in Git.UnionMerge, and while I fixed the other calls to + encodeW8, which all involved ByteStrings reading from git and so can just + treat it as utf-8 on Windows (via `decodeBS`), in the union merge case, + the ByteString has no defined encoding. It may have been written on Unix + and contain keys with invalid unicode in them. On windows, the union + merge code should probably check if it's valid utf-8, and if not, + abort the merge. + +* If interoperating with a git-annex repository from a unix system, it's + possible for a key to contain some invalid utf-8, which means its filename + cannot even be represented on Windows, so who knows what will happen in that + case -- probably it will fail in some way when adding the object file + to the Windows repo. + +* If data from the git repo does not have a unicode encoding, it will be + mangled in various places on Windows, which can lead to undefined behavior. + +## minor problems + +* rsync special remotes with a rsyncurl of a local directory are known + buggy. (git-annex tells rsync C:foo and it thinks it means a remote host + named C...) +* webapp lets user choose to encrypt repo, and generate gpg key, + before checking that gcrypt is not installed +* Ssh connection caching does not work on Windows, so `git annex get` + has to connect twice to the remote system over ssh per file, which + is much slower than on systems supporting connection caching. +* glacier-cli is not easily available (probably) +* user feedback: "Git on windows installer provides openssh 4.6. git-annex installer + provides openssh 6.2 . This seems to create problems regarding how + `known_hosts` file path is setup. Setting `GIT_SSH=` to the git-annex + openssh version fixes the problem." + However, I don't know how to determine what that location is after + it's been installed. Maybe look for ssh.exe in same directory as + git-annex.exe? --[[Joey]] + +## stuff needing testing + +* test that adding a repo on a removable drive works; that git is synced to + it and files can be transferred to it and back +* Does stopping in progress transfers work in the webapp? + +## trying to build XMPP + +Lots of library deps: + +1. gsasl-$LATEST.zip from (includes + gnuidn and gnutls) +2. pkg-config from + +3. libxml2 from mingw: + + both the -dll and the -dev +3. Extract all the above into the Haskell platform's mingw directory. Note + that pkg-config needs to be moved out of a named subdirectory. +4. Run in DOS prompt (not cygwin!): cabal install network-protocol-xmpp + +Current FAIL: + +
+Loading package gnutls-0.1.5 ... ghc.exe: internal error: Misaligned section: 18206e5b
+    (GHC version 7.6.3 for i386_unknown_mingw32)
+        Please report this as a GHC bug:
+	http://www.haskell.org/ghc/reportabug
+
+ + + +Note: This only happens in the TH link stage. So building w/o the webapp +works with XMPP. + +Options: + +1. Use EvilSplicer, building first without XMPP library, but with its UI, + and a second time without TH, but with the XMPP library. Partially done + on the `winsplicehack` branch, but requires building patched versions + of lots of yesod dependency chain to export modules referenced by TH + splices, like had to be done on Android. Horrible pain. Ugly as hell. +2. Make a helper program with the XMPP support in it, that does not use TH. +3. Swich to a different XMPP client library, like + diff --git a/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment b/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment new file mode 100644 index 000000000..fb061962e --- /dev/null +++ b/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 10" + date="2013-08-04T18:23:00Z" + content=""" +Encryption is now working on Windows. +"""]] diff --git a/doc/todo/windows_support/comment_11_c91eb7da8ee05064a5bc4a6e2203314b._comment b/doc/todo/windows_support/comment_11_c91eb7da8ee05064a5bc4a6e2203314b._comment new file mode 100644 index 000000000..f4a2eaa7f --- /dev/null +++ b/doc/todo/windows_support/comment_11_c91eb7da8ee05064a5bc4a6e2203314b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-06-16T23:48:03Z" + content=""" +service stuff moved to [[todo/windows_git-annex_service]] +"""]] diff --git a/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment new file mode 100644 index 000000000..fd5b6f5cd --- /dev/null +++ b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkRITTYYsN0TFKN7G5sZ6BWGZOTQ88Pz4s" + nickname="Zoltán" + subject="cygwin" + date="2012-05-15T00:14:08Z" + content=""" +What about [Cygwin](http://cygwin.com/)? It emulates POSIX fairly well under Windows (including signals, forking, fs (also things like /dev/null, /proc), unix file permissions), has all standard gnu utilities. It also emulates symlinks, but they are unfortunately incompatible with NTFS symlinks introduced in Vista [due to some stupid restrictions on Windows](http://cygwin.com/ml/cygwin/2009-10/msg00756.html). + +If git-annex could be modified to not require symlinks to work, the it would be a pretty neat solution (and you get a real shell, not some command.com on drugs (aka cmd.exe)) +"""]] diff --git a/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment new file mode 100644 index 000000000..e37a55575 --- /dev/null +++ b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5cj-itfFHq_yhJHdzk3QOPp-PNW_MjPU" + nickname="Michael" + subject="+1 Cygwin" + date="2012-05-23T19:30:21Z" + content=""" +Windows support is a must. In my experience, binary file means proprietary editor, which means Windows. + +Unfortunately, there's not much overlap between people who use graphical editors in Windows all day vs. people who are willing to tolerate Cygwin's setup.exe, compile a Haskell program, learn git and git-annex's 90-odd subcommands, and use a mintty terminal to manage their repository, especially now that there's a sexy GitHub app for Windows. + +That aside, I think Windows-based content producers are still *the* audience for git-annex. First Windows support, then a GUI, then the world. +"""]] diff --git a/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment new file mode 100644 index 000000000..0b48db750 --- /dev/null +++ b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://xolus.net/openid/max" + nickname="B0FH" + subject="What about NTFS support ?" + date="2012-08-02T17:45:10Z" + content=""" +Has git-annex been tested with an NTFS-formatted disk under Linux ? NTFS is supposed to be case-sensitive and to allow symlinks, and these are supposed to work with ntfs3g. +"""]] diff --git a/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment new file mode 100644 index 000000000..66f9ca71f --- /dev/null +++ b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc" + nickname="Paul" + subject="Re: What about NTFS support?" + date="2012-08-16T19:30:38Z" + content=""" +I successfully use git-annex on an NTFS formatted external USB drive, so yes, it is possible and works well. +"""]] diff --git a/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment new file mode 100644 index 000000000..8f76ee258 --- /dev/null +++ b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/dASECLNzvckz4VwqUGYsvthiplY.#d2c27" + nickname="A. D. Sicks" + subject="comment 5" + date="2012-09-09T23:48:21Z" + content=""" +Haskell has C++ binding, so it should be possible to port it to .net/Mono with a VB GUI for Windows users. Windows has a primitive form of symlinks called shortcuts. Perhaps shortcut support in Windows could replace the use of symlinks. I've used shortcuts since XP to put my home Windows directory on another partition and never had a hitch... + +If anyone is interested in working on this, hit me up. I would like to use this in my XP vbox to have access to files on my host OS...I have a student edition of Visual Studio 2005 to do an open source port... +"""]] diff --git a/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment new file mode 100644 index 000000000..bf9f86f41 --- /dev/null +++ b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnlwEMhiNYv__mEUABW4scn83yMraC3hqE" + nickname="Sean" + subject="NTFS symlinks" + date="2013-01-11T21:44:21Z" + content=""" +It seems that NTFS (from Vista forward) has full POSIX support for symlinks. At least, Wikipedia [seems to think so.](http://en.wikipedia.org/wiki/NTFS_symbolic_link). What about doing like GitHub and using MinGW for compatibility? Cygwin absolutely blows in terms of installation size and compatability with the rest of Windows. +"""]] diff --git a/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment new file mode 100644 index 000000000..0ee09ac5a --- /dev/null +++ b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o" + nickname="Dominik" + subject="So close :-)" + date="2013-06-30T12:46:40Z" + content=""" +I was fighting my way forward until I read here that special remote with ssh+rsync and encryption doesn't work. Interestingly I got everything working so far, ssh login is keybased, gpg -k works and the remote setup also correctly cooperated with gpg... but it just didn't sync. Any ideas how complex it is to get this last missing piece moving? +"""]] diff --git a/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment new file mode 100644 index 000000000..fe193f7e0 --- /dev/null +++ b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 8" + date="2013-06-30T17:58:08Z" + content=""" +It should be easy to fix whatever's wrong the the rsync special remote. Just a matter of debugging that. + +Adding encryption support on Windows is stuck at a roadblock I don't know the way around. To drive gpg, git-annex uses the `--passphrase-fd` option, and sends the \"passphrase\" (really a big block of binary foo!) over a file descriptor of a pipe that it set up. + +Windows, AFAIK, doesn't have file descriptors, or at least there is no equivilant to them that I have access to in the Haskell POSIX compatability layer for Windows. I am reluctant to fall back to using `--passphrase-file` on Windows, since that would be a massive security hole (as would passing the passphrase as a parameter via `--passphrase=`). +"""]] diff --git a/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment new file mode 100644 index 000000000..9ae337886 --- /dev/null +++ b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o" + nickname="Dominik" + subject="comment 9" + date="2013-07-31T10:29:51Z" + content=""" +The tradeoff for me is a \"local\" security hole (where I can secure my own laptop) vs. a remotely exploitable thing... If it needs to go through a file, so be it -- it would however be good if that file would be overwritten with garbage before being deleted :-) +"""]] diff --git a/doc/todo/wishlist:_--maxdepth_option_for_git_annex_find.mdwn b/doc/todo/wishlist:_--maxdepth_option_for_git_annex_find.mdwn new file mode 100644 index 000000000..c309f2491 --- /dev/null +++ b/doc/todo/wishlist:_--maxdepth_option_for_git_annex_find.mdwn @@ -0,0 +1,22 @@ +`git annex find` currently makes for a great way to find which files are already local, and don't need to get `git annex get` gotten; obviously `ls` just shows me all the files in a given directory, disregarding git-annex (and without recursing to subdirectories). I think that adding a '--maxdepth' option to `git annex find` would make it much easier to use at directories high up in the directory structure, since currently `git annex find` recurses all subdirectories necessarily, when I really just want to see whether or not there are git-annex files present from a given directory. + +Obviously, since directories themselves are not git-annex objects, there is no way to say whether or not they are "present", but perhaps the most intuitive would be to say whether or not any git-annex files under a given directory are present. + +For example, if I have: +./ ++-- subdir0/ +| +-- file0 (present in local git-annex repo) +| +-- file1 (present in local git-annex repo) ++-- subdir1/ +| +-- file0 (not present in local git-annex repo) +| +-- file1 (not present in local git-annex repo) ++-- file2 (present in local git-annex repo) + +and I type `git annex find --maxdepth 1 .`, the output might look something like: +subdir0/ +file2 + +rather than: +subdir0/file0 +subdir0/file1 +file2 diff --git a/doc/todo/wishlist:_Add_--byte-limit_option.mdwn b/doc/todo/wishlist:_Add_--byte-limit_option.mdwn new file mode 100644 index 000000000..28642b50d --- /dev/null +++ b/doc/todo/wishlist:_Add_--byte-limit_option.mdwn @@ -0,0 +1,14 @@ +This option is related to `--time-limit`, but stops after processing X +bytes. For example, I often need to free up a certain amount of space on +a disk and want `git-annex move` to stop after it has copied a specified +amount of data: + + git annex move --to otherdisk --byte-limit 3G + git annex drop --auto --byte-limit 500m + git annex get --byte-limit 500m + +I've been using some `annex.diskreserve` trickery now and then to +accomplish this, but it's a bit cumbersome and also not a very precise +way to specify the amount I want to copy/move/get. The last example +would also be a useful command to limit the traffic when I'm connecting +via mobile – get as much as possible, but don't blow the mobile quota. diff --git a/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn new file mode 100644 index 000000000..96552eecc --- /dev/null +++ b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn @@ -0,0 +1,7 @@ +It would be very nice with an "advanced settings" for jabber and webdav support. + +Currently XMPP fails if you use a google apps account. Since the domain provided in the email is not the same as the XMPP server. + +Same goes for webdav support. If i have my own webdav server somewhere on the internet there is no way to set it up in the assistant. + +[[!tag /design/assistant]] diff --git a/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment new file mode 100644 index 000000000..61cd3fc2e --- /dev/null +++ b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="Hooks too" + date="2013-05-22T10:40:33Z" + content=""" +It would actually be very nice if this could be done with hooks too. + +Especially with the new hook method. + +Take this hook + + mega-hook = /usr/bin/python2 ~/sources/megaannex/megaannex.py + +git-annex could make a request with either the parameter(or environment variable) \"getsettingsobject\" that could return. {\"username\": \"\", \"password\": \"\", \"folder\": \"\"}. + +The point being git-annex can request from the hooks program what settings it takes, and give a web interface to set it. Then store the information in the creds folder(ew ew, that folder is unencrypted, oh well) and pass it to the hook on run. + +The advantage being that users wouldn't have to edit a settings file manually (this is currently also the case for the IMAP special remote, which also requires a settings file). +"""]] diff --git a/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn b/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn new file mode 100644 index 000000000..5fec39d98 --- /dev/null +++ b/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn @@ -0,0 +1 @@ +As suggested during the first Gitify BoF during DebConf13: Adding a way to have on-demand dropping of content in a given remote would allow a user to quickly free up disk space on demand while still heeding numcopies etc. diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn new file mode 100644 index 000000000..3ecb42197 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn @@ -0,0 +1,3 @@ +A big part of my online use is done via a low-speed connection over my mobile phone, this is limited to 16KB/sec because I always use up my 500MB quota the very first day of the month. `;-/` So when I need to download big files, I first download them to my online server, then transfer the files to my laptop with git-annex. If I'm connected via GSM, this occupies all the bandwidth and everything else moves like a heavily sedated slug. So if I want to work via VNC or SSH, I have to terminate ongoing transfers with Ctrl-C and then hopefully remember to restart it when I work locally. I know git-annex is robust enough to handle this gracefully, but it would be really nice to have a continuous connection going on in the background, limited to a value I choose. + +rsync(1) has a `--bwlimit` (bandwidth limit) where you can specify max download/upload speed in kilobytes/sec. It would be great if a similar option was integrated into git-annex. Thanks in advance. diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment new file mode 100644 index 000000000..78ca76939 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="trickle" + date="2013-01-22T22:44:52Z" + content=""" +not exactly integrated, but you can easily use trickle for this. + + trickle -d 50 git annex ... +"""]] diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment new file mode 100644 index 000000000..70f04c616 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="Yay, trickle works" + date="2013-01-23T01:36:21Z" + content=""" +Justin, thanks a lot! trickle(1) works great. I didn't know about this program, but I'm not surprised that such a program is available. It never ceases to amaze me what's possible in a *NIX environment. +"""]] diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment new file mode 100644 index 000000000..a5f8f6a1b --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2013-01-24T01:55:10Z" + content=""" +In addition to trickle, the git-annex man page has examples of how to make rsync use --bwlimit + +Something like trickle is needed to limit rates for remotes not using rsync, however. +"""]] diff --git a/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn new file mode 100644 index 000000000..85fc2785c --- /dev/null +++ b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn @@ -0,0 +1,7 @@ +I would like to use the automated AWS lifecycle rules to move the git annex files store on S3 to Glacier after a bit of time. Git annex need must support this kind of S3 files explicitly in order for it to work. + +This is different from the adding a Glacier remote to git annex because of the reasons explained in . + +Basically, the files moved by AWS from S3 to Glacier are not available under the normal Glacier API. In fact, the moved S3 files are listed as available but under the `GLACIER` storage class and need a RESTORE request before they can be GET like other S3 files. Trying to GET an S3 file that has been moved to Glacier will not restore it from Glacier and will result in an 403 error. + +I suppose DELETE needs special care as well. diff --git a/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier/comment_1_eb934756cb2af7fa13ad3b5fad7f85b2._comment b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier/comment_1_eb934756cb2af7fa13ad3b5fad7f85b2._comment new file mode 100644 index 000000000..92554aa31 --- /dev/null +++ b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier/comment_1_eb934756cb2af7fa13ad3b5fad7f85b2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4" + nickname="Ovidiu" + subject="Keen to see this happen too!" + date="2014-05-08T21:44:30Z" + content=""" +Or alternatively support for S3 Lifecycle Rules. +I'm not exactly sure what git-annex assistant does if it backs up into a S3 bucket with i.e. a rule to archive everything 1 month later into Glacier. Can it restore/access? +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn new file mode 100644 index 000000000..d53fa56ab --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn @@ -0,0 +1,14 @@ +We're using git-annex to manage large files as part of a team. + +We have a central repository of large files that everyone grabs from. + +We would like to be able to get the files without updating the `git-annex` branch. This way it doesn't pollute the history with essentially always unreachable locations. + +I think the easiest way would be to just add an option to not update the `git-annex` branch when `annex get` is executed. + +Thoughts? + +> See [[untracked_remotes]] for a todo item that will probably +> be useful in this sitation. Since that describes better what +> this bug report seems to be asking for, I am closing this one. +> [[closed|done]] --[[Joey]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment new file mode 100644 index 000000000..61d82e2ae --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 1" + date="2013-07-17T23:23:50Z" + content=""" +I'm interested to hear that your team is using git-annex. + +Have you tried `git config annex.alwayscommit false`? This will avoid committing, and just store the info in a local journal -- so even `git annex fsck` will still work. + +Hmm, perhaps you want to update the branch when running `git annex copy` to put files onto the server, but not when getting them? A switch to disable updating the branch would then make sense. Any use of fsck would notice the inconsistency though, and commit a fix to the git-annex branch -- unless you also used the new switch when running fsck. + +But what happens if someone makes a change, pushes to the server, but forgets to `git annex copy` the file? Everyone would then be left with a missing file that git annex doesn't know where it is. One of the reasons it tracks the locations is so that if necessary you know which repository such a misplaced fail is stored in. And can go track down that person's laptop and apply a cluebat. ;) Do you do something on the server to prevent this scenario? +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment new file mode 100644 index 000000000..3379742d2 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 2" + date="2013-07-17T23:42:25Z" + content=""" +What would happen if we wanted to copy a file to the server +with that set? or even when running `git annex add` +You understood me exactly though. +We'd like to be able to get the files without a commit, but copy them +with a commit of the changes. +The way we operate, if somebody makes a change with regards to +largefiles, they should also add a test for it. +Ideally, the test suite would catch it. That or people would +realize that theres a new big file and send around an email to +see who was trying to a largefile when they couldn't reach it. + +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment new file mode 100644 index 000000000..14ab5f65a --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 3" + date="2013-07-18T00:12:39Z" + content=""" +Actually, when a file is sent to a git repository on the server, it will update the location log on that side. So even if the client has alwayscommit=false, other clients will learn the file has reached the server. + +So that might just work for you. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment new file mode 100644 index 000000000..c1f148fdb --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 4" + date="2013-07-18T18:03:00Z" + content=""" +If you can have developers only add large files on the central server, avoiding using git annex sync and only pulling from git repo should work, I think. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment new file mode 100644 index 000000000..aa547d790 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 5" + date="2013-07-18T21:17:45Z" + content=""" +Wow. This worked better than expected. I'm still trying to understand the implementation (I'm not familiar with Haskell), but there is some magic going on. + +To explain: + +I didn't expect that when I added a file (Locally and to the annex remote) that when somebody else did a pull, git-annex would recognize this and update the working copy to download and include that file. + +I'm not sure if this is intended behavior or not (since I thought all commands had to go through git-annex) but I like it nonetheless. + +Thanks again for the tips! +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment new file mode 100644 index 000000000..3f10e48ad --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 6" + date="2013-07-18T21:23:58Z" + content=""" +Disregard that. I was testing it with a particular file that didn't exactly play nice. + +Basically, to test this before production I used `dd bs=1024 count=100000 if=/dev/zero of=bigfile`. + +When I did a `git pull`, it showed the symlink as being valid. + +When I changed the command to `dd bs=1024 count=100000 if=/dev/urandom of=bigfile` then it showed the symlink as bad after pulling. + +Weird! +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment new file mode 100644 index 000000000..deb25a9ce --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 7" + date="2013-07-18T21:48:06Z" + content=""" +If you wanted to auto-get files on git pull, you could trying putting git annex get into .git/hooks/post-merge (needs to be marked as executable). +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment new file mode 100644 index 000000000..4901a2d97 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 8" + date="2013-07-20T20:07:53Z" + content=""" +`dd bs=1024 count=100000 if=/dev/zero of=bigfile` obviously creates the same data each time, so if that same size empty file has previously been in a repository, and the content is still present there, the symlink will automatically point to it when it gets added. In other words, git-annex performs automatic deduplication of file contents, and so it was able to save you a download in this case. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment new file mode 100644 index 000000000..2287f6935 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 9" + date="2014-01-02T17:25:50Z" + content=""" +I have now implemented a way to mark a remote as readonly. This prevents git-annex from pushing anything to the remote, or modifying it in other ways. + +It seems that in your use case, you might want to avoid git-annex sync pushing the git-annex branch, but still push a branch like master. So far, it's up to you to decide which branches to manually push; readonly disables all pushing. +"""]] diff --git a/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn b/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn new file mode 100644 index 000000000..8919bae3f --- /dev/null +++ b/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn @@ -0,0 +1,30 @@ +During the campaign adding a chunking feature to obscure filesize for encrypted files was added to the roadmap. But there is still one potentially valuable set* of data that git-annex can help obscure: when you access your remotes. + +This data can be used to determine when a user is actively using a remote, but if a remote is always accessed at the same time that data becomes less useful. Somebody could still monitor total traffic over a long period and figure out that a remote was more active in a given week or month, but scheduling reduces the resolution of your access times and their data. Maybe this isn't the most important feature to add, but it would be nice to have, and could possibly be built on top of the existing git-annex scheduler. It could work by queuing inter-remote transactions ('get', 'copy', 'sync', etc.), so that jobs start at the same time every day, or even the same time and day every week. + +Possible syntax examples: +###Setting up the schedule: +git annex queue schedule Monday:1730 (starts every monday at 5:30PM) + +git annex queue schedule 1400 (starts every day at 2PM) + +###Queuing git-annex commands: +git annex queue prepend sync (pretends 'sync' to the very front of the queue) + +git annex queue append get file.ISO (appends to queue file.ISO for retrieval from a repo) + +###Viewing/editing queue: +git annex queue view (view the current queue, jobs displayed with corresponding numbers) + +git annex queue rm 20 (removes job 20 from queue) + + +\*The four I can think of are: + +* File contents (solved by crypto) + +* File size (solved on the remote by chunking, but total traffic usage can't be helped) + +* User IP/Remote IP (solved by VPN - outside scope of git-annex, unless someone writes a plugin) + +* Access times (obscured by a queue and scheduling) diff --git a/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn b/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn new file mode 100644 index 000000000..c074988b0 --- /dev/null +++ b/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn @@ -0,0 +1,4 @@ +I've looked for this feature in the webapp but can't find it... + +I mainly use the webapp and have been wondering 'how many copies of file X are there' and 'where are the copies of file Y'? +This is available in the commandline interface but it would be nice to have this in the webapp too. diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn new file mode 100644 index 000000000..626f5a03f --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn @@ -0,0 +1,5 @@ +Also suggested during the first Gitify BoF during DebConf13: + +`git annex drop` deletes immediately. In some situations a mechanism to tell git-annex "I would like to hold onto this data if possible, but if you need the space, please delete it" could be nice. + +An obvious question would be how to do cleanups. With the assistant, that's easy. On CLI, at the very least `git annex fsck` should list, and optionally delete, that data. diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment new file mode 100644 index 000000000..32d0c0112 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="How should this interact with the trust model and location tracking?" + date="2013-10-04T11:13:11Z" + content=""" +This could become complicated. AFAIU, right now git-annex keeps track of files as either present or absent. With this feature it's tempting to introduce a third state 'potentially dropped' (or 'dropped in a relaxed fashion') but do you then treat them as if they were dropped depending in wether they are on a trusted or untrusted repo? Or maybe a potentially dropped file in a trusted repo is treated as a file in a semitrusted repo? This becomes convoluted. You also need a command to undrop a file in case you decide that you really want to keep it and in order to do this you need a command to see which files are up for relaxed dropping.... + +As an alternative approach maybe it makes sense to extend [[preferred content]] expressions to take file sizes and disk usage into account. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment new file mode 100644 index 000000000..40f299fa0 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="comment 2" + date="2013-10-04T20:17:07Z" + content=""" +I don't think that a third state would be necessary. Actually dropping the file when it happens would need to do the same numcopies verification that `git annex drop` does now. + +I agree it might be simpler to first improve the power of preferred content expressions. Unfortunately one thing that cannot be put in them is anything that probes the current state of the system. This is because repo A on machine X needs to be able to calculate the preferred content of repo B on machine Y. +But I could certainly add file size as a preferred content term, since that info is known throughout the network. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_3_3e830035df580601f038ce3a7003c39d._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_3_3e830035df580601f038ce3a7003c39d._comment new file mode 100644 index 000000000..8b4b132cb --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_3_3e830035df580601f038ce3a7003c39d._comment @@ -0,0 +1,63 @@ +[[!comment format=mdwn + username="erics" + ip="76.10.136.8" + subject="comment 3" + date="2014-05-04T00:48:55Z" + content=""" +I think things would be simpler if a \"drop --relaxed\" file were to look to +the outside world just like one that was dropped without \"--relaxed\". +In particular, even if a file is dropped with \"--relaxed\": + + - the file's work-tree symlink should be broken synchronously by the + \"drop --relaxed\" command (as opposed to only being broken later, + if and when the file physically goes away) + + - other repos should no longer see the file as available from this repo + +Basically, the idea is to add a third state, but **not** a user-visible one. +Rather, it should be a well hidden implementation detail, which doesn't +affect the conceptual model (very much like git's own distinction between +loose and packed objects). Thus, *logically dropped* would be a +better name than *potentially dropped*. + +Corollaries: + + - A logically (but not physically) dropped file should *not* count towards + satisfying the numcopies limit, i.e. if some other repo has been asked + to drop the file too + + - That in turn means that \"git annex drop --relaxed\" needs to satisfy a + numcopies check at the time the user runs it; it's not enough to only do + the check later, at physical-deletion time. (At that point, there should probably be + a second numcopies check. I don't know whether the model requires it, + but even if not, paranoia is good :-) ) + + - If the user wants to use the file again, they have to \"git annex get\" it + again, just like usual -- but if the file hasn't been physically deleted yet, + the \"get\" will be nearly instantaneous, since the data won't have to be copied + +One possible implementation would be to have \"drop --relaxed\" behave almost identically +to a non-relaxed drop -- do all the same safety checks, bookkeeping, etc. The only +difference would be to have it rename the file at the end, rather +than deleting it outright. (Logically dropped files could stay in their same +directory, but with a distinguishing filename, or they could be moved to a +parallel tree, e.g. *.git/annex/dropped*. I don't have an opinion on that choice; +I've just picked one arbitrarily to keep talking about.) + +\"get\" would simply search .git/annex/dropped before going off to remote +repos, and if the file is found there, would move (not copy) it back into +.git/annex/objects. + +An alternative might be to set some kind of *logically dropped* flag, but +that would probably be a much more intrusive change; a lot of places in the +code would have to check the flag. Doing it as a file rename would make for a much more +localized change; most of git-annex would completely ignore .git/annex/dropped, and just go +about its business as it has always done. + +(It might be tempting to think of (or even implement) .git/annex/dropped as a +very low-cost remote, but that's not accurate; the semantics are different.) + +I'm just starting to experiment with git-annex, so I can only hope that what +I'm saying isn't completely silly... + +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_4_e5516689bc128c061dcd66649dc69584._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_4_e5516689bc128c061dcd66649dc69584._comment new file mode 100644 index 000000000..3e2d6689c --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_4_e5516689bc128c061dcd66649dc69584._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="216.145.95.162" + subject="comment 4" + date="2014-05-19T16:56:15Z" + content=""" +erics, that all makes a lot of sense, except I don't know if there's actually a use case for a git-annex that behaves that way. It doesn't seem to solve the original use case. + +I'd be inclinded to instead use the new metadata support. A file could have a tag that indicates it's not strongly wanted, and if git-annex get doesn't have enough space it could seek out and drop such files. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_5_be740e4b06d9130ae6afc5783da3c0e0._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_5_be740e4b06d9130ae6afc5783da3c0e0._comment new file mode 100644 index 000000000..32beef427 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_5_be740e4b06d9130ae6afc5783da3c0e0._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="erics" + ip="76.10.136.8" + subject="comment 5" + date="2014-06-03T17:49:10Z" + content=""" +> It doesn't seem to solve the original use case. + +It doesn't? The OP requested: + +> I would like to hold onto this data if possible, but if you need the space, please delete it + +It looks to me as though my suggestion does just that -- or am I misunderstanding what they asked for? +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_6_79d115f95cec46bb51e7fba078524db1._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_6_79d115f95cec46bb51e7fba078524db1._comment new file mode 100644 index 000000000..6e376e316 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_6_79d115f95cec46bb51e7fba078524db1._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="erics" + ip="76.10.136.8" + subject="Metadata vs "drop --relaxed"" + date="2014-06-03T18:20:50Z" + content=""" +[This isn't as much about my suggested implementation for \"drop --relaxed\" as about whether the feature is worth providing in the first place. I'm not arguing strongly for it, actually; just continuing the discussion.] + +> I'd be inclinded to instead use the new metadata support. + +I see metadata as more for static attributes of a given file -- this thing is \"a picture\", \"related to project X\", \"from Mary\". Thus, the combination of metadata plus preferred-content settings seems to me more suitable for static preferences (likely ones that implement some kind of policy, however informal); e.g. \"this repo wants pictures but not mp3s\", or \"Mary's stuff but not Alex's\". + +\"drop --relaxed\", on the other hand, would be good for more ad-hoc usage: \"disk space is getting tight; hmm, I'm not using *foo* today, so git-annex, please delete my local copy of *${myrepo}/foo* -- but only as much as you have to, because I'm going to want it again tomorrow\". + +One reason not to want to use metadata and preferred-content settings for such short-term, ad-hoc needs is that you then have to remember to go undo the changes later. That's even worse if you had to add ad-hoc metadata, and now have to go delete it all again. Undoing a \"drop --relaxed\", on the other hand, consists of a simple \"git annex get\". + +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn b/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn new file mode 100644 index 000000000..92b5dee27 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn @@ -0,0 +1,10 @@ +Similar to how + + git commit -m 'foo' + +works, if I run + + git annex sync -m 'my hovercraft is full of eels' + +git annex should use that commit message instead of the default ones. That way, I could use [[sync]] directly and not be forced to commit prior to syncing just to make sure I have a useful commit message. + diff --git a/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit.mdwn b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit.mdwn new file mode 100644 index 000000000..b7a7865c8 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit.mdwn @@ -0,0 +1,5 @@ +I would like to have way, ideally a per-repo-cloud setting which syncs around automatically, to not have `git annex sync` autocommit staged additions. + +I often have quite complex additions with a mix of `git add` and `git annex add` in various stages of completion; running `git annex sync` regularly to see what state the other repos are in should not autocommit if possible. + +Richard diff --git a/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_1_fff7cdff9e4bc988139152a799b65c99._comment b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_1_fff7cdff9e4bc988139152a799b65c99._comment new file mode 100644 index 000000000..1e455c486 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_1_fff7cdff9e4bc988139152a799b65c99._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 1" + date="2014-05-13T20:23:11Z" + content=""" +This could be particularly useful for direct-mode repositories. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_2_b8dd92d7710a9d194312058e53c38d21._comment b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_2_b8dd92d7710a9d194312058e53c38d21._comment new file mode 100644 index 000000000..cc6cd727b --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_2_b8dd92d7710a9d194312058e53c38d21._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="zardoz" + ip="92.227.51.179" + subject="comment 2" + date="2014-05-13T20:27:38Z" + content=""" +I filed a bug today, which boils down to a related issue. + +http://git-annex.branchable.com/bugs/git_annex_list__47__whereis_and_uncommited_local_changes/ +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_3_206e319f6d7c6b0d1f05af2475a8b335._comment b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_3_206e319f6d7c6b0d1f05af2475a8b335._comment new file mode 100644 index 000000000..8e2a57e14 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync__96___without_auto-commit/comment_3_206e319f6d7c6b0d1f05af2475a8b335._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2014-05-16T19:02:08Z" + content=""" +Well, you could: git fetch --all; git annex merge; git push origin +"""]] diff --git a/doc/todo/wishlist:_add_--symlink_option_to_import.mdwn b/doc/todo/wishlist:_add_--symlink_option_to_import.mdwn new file mode 100644 index 000000000..96cbf2850 --- /dev/null +++ b/doc/todo/wishlist:_add_--symlink_option_to_import.mdwn @@ -0,0 +1 @@ +Make 'git annex import' for each imported file leave a symlink behind. One may consider this a bit nasty as this introduces symlinks out of the annex. There are also some things careful to consider, link to the annexed symlinks or into the .git/annex/objects store? the first breaks views, the second relies on implementation details. Shall these be absolute (i'd say yes) or relative (won't harm) links etc. But after all it gives a easier migration and possibly even some new usage to manage files outside of the annex. A sister-command for 'export' comes in mind, drop a symlink anywhere. Anyways, when you feel this is a good idea, keep it, otherwise just delete this idea. Thanks ;) diff --git a/doc/todo/wishlist:_add_--symlink_option_to_import/comment_1_d5d853142d401b95577567e3eb43495e._comment b/doc/todo/wishlist:_add_--symlink_option_to_import/comment_1_d5d853142d401b95577567e3eb43495e._comment new file mode 100644 index 000000000..62d4264cb --- /dev/null +++ b/doc/todo/wishlist:_add_--symlink_option_to_import/comment_1_d5d853142d401b95577567e3eb43495e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 1" + date="2014-07-15T18:53:47Z" + content=""" +Well, it's easy enough to make symlinks to content in a git-annex repository yourself if you want to. I don't see why this belongs in `git annex import`, which is too complicated already. +"""]] diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn new file mode 100644 index 000000000..85c8874fc --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn @@ -0,0 +1,6 @@ +It could be useful for Linux users and package maintainers to have systemd .service file samples to launch the assistant and the webapp. + +For multi-user systems, we could have a git-annex-webapp@username.service . + +See [systemd documentation](http://www.freedesktop.org/software/systemd/man/systemd.service.html) for informations about those files. +See [archlinux wiki](https://wiki.archlinux.org/index.php/Systemd/Services) for .service examples. diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment new file mode 100644 index 000000000..5e8c8a374 --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-19T15:33:18Z" + content=""" +Wouldn't this involve running it as root or a dedicated user? Neither is ideal. git-annex already uses .desktop files to auto-start when the user who is using it logs in. +"""]] diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment new file mode 100644 index 000000000..5dfeedf37 --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVE2R20dyfPQIzdi6urVUUAXtD6eeBsr0" + nickname="Benoît" + subject="comment 2" + date="2013-10-19T15:43:36Z" + content=""" + Not necessarily. I have a systemd instance handling my userland services. See [archlinux wiki systemd/User](https://wiki.archlinux.org/index.php/Systemd/User). +"""]] diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn new file mode 100644 index 000000000..2d291608b --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn @@ -0,0 +1,3 @@ +It is now relatively easy to build your own S3-compatible storage system with software such as Ceph radosgw or Openstack Swift. + +So a way for users to specify their own S3 url would come pretty handy in the webapp's "add S3 remote" page. diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment new file mode 100644 index 000000000..b6125fd6e --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T20:16:43Z" + content=""" +Such S3 clones are supported if you make the repository at the command line. See [[S3_special_remote_documentation|special_remotes/S3]]. + +I think the question comes down to, is it worth adding UI in the webapp for this, or is it likely that someone who is using a S3 clone knows the endpoint url to use? Similarly, the webapp only offers box.com as a WebDAV remote, although there are many other DAV servers. What I'm trying to do with the UI is guide the user through finding a place to store their data, and covering every step as easily as possible. +"""]] diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment new file mode 100644 index 000000000..bd3885a96 --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgy5Qf4bivpTfYPw_yh92OcDlesrVTREg" + nickname="François" + subject="comment 2" + date="2014-01-12T20:31:44Z" + content=""" +I understand your concerns about keeping the UI straightforward. + +It makes sense however to allow users to add a custom backend without using the CLI. What about a new \"Custom backend (expert only)\" option which directly asks for a string with the arguments to 'git annex initremote'? +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn new file mode 100644 index 000000000..c910ace83 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn @@ -0,0 +1,28 @@ +A replacement for a web-browser's downloads menu that uses git-annex internally ([[`addurl`|tips/using the web as a special remote]] command for the download, and `drop` or `git rm` for the clean up) would be quite helpful: + +say, when working on a topic, writing a paper or similar things, I usually have a Git repo with my text, all relevant data and processing code, and possibly other background information. It's nice to store the literature you needed at the same place where you work. (So that it is easy to catch up with what I was doing and thinking over when I left this work aside for a while, perhaps after cloning the repo from another location.) + +When I find an interesting literature, I save the file to the directory with my work, and read it. Then I might return to it to re-read it. There might be references to this document from my work, so I'd like them to work as links (perhaps pointing at the local file, but also at the source URL for the case when my document is read by someone else not on my system). + +I need to keep track of the source URLs for the documents I have saved which I read and use. + +That's a task that fits well git-annex. + +Note that doing the dull work of copying and pasting the URL and the downloading it and then opening it for reading is a pain to do every time I'm interested in a document I have found on the web. (Of course, I would need to fill out the bibliogrphic information for this document if I want to refer to it, but that can be done later. Initially, I wish I just don't lose the source URL of a document at the moment when I get interested in it and start reading.) + +So, I could be assisted by a replacement of the "downloads" menu of, say, Firefox: whenever I want to open a file for viewing (like a PDF), it should ask me where to save it, and I'd choose the directory with my work, then it should register it with git-annex (so that the source URL is saved, and perhaps it should also write down the referring page's URL somewhere nearby automatically), download it, and open with a viewer for reading. + +Then I'll have the interesting literature there when I'm offline; the source URLs would be saved, so that they can be put into the references. Also, if I distribute this work with Git, at another location git-annex can be used to easily get all the literature again. + +(Hmmm... probably, the browser that this will be simplest for me to implement for is emacs-w3m; simply, some functions calling git-annex...) + +> This seems fairly doable to implement since the git-annex [[design/assistant]] +> already has a webapp. So a javascript toolbar thing could be made that +> submits the current url (or maybe links dragged into it?) to the webapp +> for adding to the annex. +> +> The only wrinkle is that the webapp runs under a new url each time +> it starts, due to using a high port and embedding some auth token in the +> url. --[[Joey]] + +[[!tag /design/assistant]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment new file mode 100644 index 000000000..4c20561c7 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-09-25T23:55:44Z" + content=""" +You know about `git annex addurl` right? It doesn't help with the browser integration (though I bet there are existing download manager extensions you could re-use for this) but it takes care of the other use cases. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment new file mode 100644 index 000000000..c958fd08f --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://m-f-k.myopenid.com/" + ip="93.207.162.28" + subject="+1" + date="2012-10-05T20:00:31Z" + content=""" +Copy+Paste+Open is to much for lazy people like me;) I like the idea of a direct browser download manager integration. This would make it so much easier to find find the original source of a downloaded file when you're to lazy to write it down somewhere in the first place … +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment new file mode 100644 index 000000000..30515a49b --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="the scheme to follow to use the addurl command is longer" + date="2012-09-26T00:07:11Z" + content=""" +Justin, yes, I know. To use [[addurl|tips/using the web as a special remote]], I should force myself not to click on a link to view it, but rather to copy it, paste into the command line with addurl (then it will be downloaded, and I can run a command to view it...). Not terrible, probably learnable. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment new file mode 100644 index 000000000..7efd583c0 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="I've just written a script that does this (with a Firefox download manager)" + date="2013-04-09T02:51:26Z" + content=""" +So I've just written a two-line shell script that makes [FlashGot](http://flashgot.net/) able to do this. It's available on GitHub at . + +This could be even neater if Git-annex had the ability to set the download manager... Wishlist created: [[wishlist:_allow_configuration_of_downloader_for_addurl]] +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment new file mode 100644 index 000000000..494aab7a8 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-09T03:36:29Z" + content=""" +Wishlist implemented ;) + +A full example of doing this would make a nice addition to [[tips]] ... +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment new file mode 100644 index 000000000..d0545153f --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-11T15:12:00Z" + content=""" +See [[tips/Using_Git-annex_as_a_web_browsing_assistant]]. + +I am leaving this bug open for now, as some javascript that passes the url off to the webapp is still a nice idea to build. + +A solution to the webapp's url always changing could be to have a file:/// url that the webapp creates, and javascript submits to, that then passes the request off to the webapp, probably by using additional javadcript in the html file. Assuming javascript security allows this. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment new file mode 100644 index 000000000..484db1e81 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-11T15:41:16Z" + content=""" +A less round-about method would be to have the webapp listen for links dropped into its page. You could then have the webapp open in a tab, and just drag urls there to add them to the annex. + +I'm not sure if it's possible to intercept drags into a tab. Default browser behavior is certainly to redirect the tab to the url dropped into it. + +If someone finds out how to do this, I will build it. +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn new file mode 100644 index 000000000..873988eea --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn @@ -0,0 +1 @@ +The `annex.largefiles` feature is very nice to mix annexed files with normal git managed files. I'd like to be able to configure this setting on the webapp and that the configuration directive would be synchronized accross all remotes. diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment new file mode 100644 index 000000000..e402d26c3 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:46:28Z" + content=""" +It might make sense to sync this across remotes and have it edited with `git annex vicfg` + +Putting it in the webapp would need some nice interface for constructing the underlying expression. Might be doable for at least simple filtering (ie, files larger than XX or with extensions .A, .B, .C). I tend to think of this as a setting for people comfortable with the command line though. +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment new file mode 100644 index 000000000..0e24014d2 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio" + nickname="Tobias" + subject="feedback" + date="2013-11-05T21:23:11Z" + content=""" +> It might make sense to sync this across remotes and have it edited with git annex vicfg + +That would be great! + +> Putting it in the webapp would need some nice interface for constructing the underlying expression. Might be doable for at least simple filtering (ie, files larger than XX or with extensions .A, .B, .C). I tend to think of this as a setting for people comfortable with the command line though. + +I could live with a simple filtering interface without too many fancy stuff. The fancy stuff could be done on the command line if needed... +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn new file mode 100644 index 000000000..f38e41dd3 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn @@ -0,0 +1 @@ +It would be nice to have mimetype support on the `annex.largefiles` configuration directive. F.e. `git config annex.largefiles "not mimetype=text/plain"` diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment new file mode 100644 index 000000000..b06008475 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhE8Xar6m4x3JSILXdm-Y5KhwHTH5qzKQ" + nickname="bruno" + subject="+1" + date="2013-10-14T14:43:11Z" + content=""" +Big +1 for this feature: this would really help configuring annex.largefiles +"""]] diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn new file mode 100644 index 000000000..acc8b363e --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn @@ -0,0 +1 @@ +An interesting feature, when an archived file cannot be removed from all clients because of the minimum number of copies required, would be to remove it from the repositories with the smallest amount of free space available. diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment new file mode 100644 index 000000000..89fe4c069 --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 1" + date="2013-09-19T21:01:30Z" + content=""" +That might be useful in some cases. git-annex can only tell how much free space is available on remotes that are mounted to the local filesystem. Did you use case involve removable drives? +"""]] diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment new file mode 100644 index 000000000..d2b29c239 --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 2" + date="2013-09-20T19:03:13Z" + content=""" +I was not thinking of removable drives, but only of \"client\" repositories. Ideally, git-annex would query the remaining space of all connected client repositories to choose on which repositories to drop a copy. +"""]] diff --git a/doc/todo/wishlist:_derived_content_support.mdwn b/doc/todo/wishlist:_derived_content_support.mdwn new file mode 100644 index 000000000..19556a13e --- /dev/null +++ b/doc/todo/wishlist:_derived_content_support.mdwn @@ -0,0 +1,8 @@ +I handle some video and music files with git annex and it would be awesome if git annex supported tracking of relations between files. + +Example: +I have music in flac on my htpc, but i think flac is way overkill to have on my Android device, so i transcode them to ogg/mp3 on my htpc and then sync them to my Android device. + +Transcoding is a good example for this type of feature, but there might be other uses too. + +The basic thing is to know a file is a "copy" of another file, but its a generated result, so the actual file is not important, but the source is. diff --git a/doc/todo/wishlist:_disable_automatic_commits.mdwn b/doc/todo/wishlist:_disable_automatic_commits.mdwn new file mode 100644 index 000000000..03ed40211 --- /dev/null +++ b/doc/todo/wishlist:_disable_automatic_commits.mdwn @@ -0,0 +1,36 @@ +When using the [[/assistant]] on some of my repositories, I would like to +retain manual control over the granularity and contents of the commit +history. Some motivating reasons: + +* manually specified commit messages makes the history easier to follow +* make a series of minor changes to a file over a period of a few hours would result in a single commit rather than capturing intermediate incomplete edits + +* manual choice of which files to annex (based on predicted usage) could be useful, e.g. a repo might contain a 4MB PDF which you want available in *every* remote even without `git annex get`, and also some 2MB images which are only required in some remotes + +> This particular case is now catered to by the ["manual" repository group](/preferred_content/standard_groups/) +> in [[preferred content]] settings. --[[Joey]] + +Obviously this needs to be configurable at least per repository, and +ideally perhaps even per remote, since usage habits can vary from machine +to machine (e.g. I could choose to commit manually from my desktop machine +which has a nice comfy keyboard and large screen, but this would be too +much pain to do from my tiny netbook). + +In fact, this is vaguely related to [[design/assistant/partial_content]], +since the usefulness of the commit history depends on the context of the +data being manipulated, which in turn depends on which subdirectories are +being touched. So any mechanism for disabling sync per directory could +potentially be reused for disabling auto-commit per directory. + +According to Joey, it should be easy to arrange for the watcher thread not +to run, but would need some more work for the assistant to notice manual +commits in order to sync them; however the assistant already does some +crazy inotify watching of git refs, in order to detect incoming pushes, so +detecting manual commits wouldn't be a stretch. + +[[!tag design/assistant]] + +> You can do this now by pausing committing via the webapp, +> or setting `annex.autocommit=false`. +> +> The assistant probably doesn't push such commits yet. diff --git a/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn b/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn new file mode 100644 index 000000000..741466994 --- /dev/null +++ b/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn @@ -0,0 +1 @@ +It would be nice to have an indication of the status of the remotes in the webapp, for example with a field showing "In Sync", "Syncing", or the date of the last successful synchronization for unreachable remotes. diff --git a/doc/todo/wishlist:_do_not_import_new_files.mdwn b/doc/todo/wishlist:_do_not_import_new_files.mdwn new file mode 100644 index 000000000..62dc6334a --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files.mdwn @@ -0,0 +1,7 @@ +[[!meta title="mass reinject of any known content from a directory"]] + +Right now `git annex import DIR/*` will import all the files in DIR, both those that are already known to git-annex and those that are new. Using the option `--skip-duplicates` one can import only new files that are in DIR but unknown to git-annex. + +It would be nice if there were an opposite `--only-duplicates` option that could be used to import only the files that are already known to git, ignoring the new files in DIR. + +PS: it would also be nice to have aliases like `--only-new-files` and `--skip-new-files` for `--skip-duplicates` and `--only-duplicates`. diff --git a/doc/todo/wishlist:_do_not_import_new_files/comment_1_b41c214599d6601257a9d824cebbffcc._comment b/doc/todo/wishlist:_do_not_import_new_files/comment_1_b41c214599d6601257a9d824cebbffcc._comment new file mode 100644 index 000000000..fbb5571cb --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files/comment_1_b41c214599d6601257a9d824cebbffcc._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://ypid.wordpress.com/" + ip="213.153.84.215" + subject="gitignore" + date="2014-07-12T17:59:42Z" + content=""" +Hi + +The gitignore file is probably what you are looking for which is also honored by git-annex. Some documentation: + +* [On git-scm](http://git-scm.com/docs/gitignore) +* [On gitready](http://de.gitready.com/beginner/2009/01/19/ignoring-files.html) +* [On github](https://help.github.com/articles/ignoring-files) +"""]] diff --git a/doc/todo/wishlist:_do_not_import_new_files/comment_2_7b26171458baaf5c0057276d2d97e14c._comment b/doc/todo/wishlist:_do_not_import_new_files/comment_2_7b26171458baaf5c0057276d2d97e14c._comment new file mode 100644 index 000000000..bedf9a54c --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files/comment_2_7b26171458baaf5c0057276d2d97e14c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 2" + date="2014-07-14T18:30:38Z" + content=""" +You can use --clean-duplicates unless your goal is for some reason to add the duplicate files to your repository a second time. +"""]] diff --git a/doc/todo/wishlist:_do_not_import_new_files/comment_3_6f80ce6cee4519d4f69193d5086e194a._comment b/doc/todo/wishlist:_do_not_import_new_files/comment_3_6f80ce6cee4519d4f69193d5086e194a._comment new file mode 100644 index 000000000..e66cc5ea9 --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files/comment_3_6f80ce6cee4519d4f69193d5086e194a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://svario.it/gioele" + nickname="gioele" + subject="comment 3" + date="2014-07-15T06:54:40Z" + content=""" +> You can use --clean-duplicates unless your goal is for some reason to add the duplicate files to your repository a second time. + +My use case is that I clone an existing remote on a PC where there are already some of the annexed files (+ others). + +My workflow would be: + +* clone git-annex server:~/Documents.git +* git annex init \"other pc\" +* git annex import --skip-new (or --only-duplicates) ~/Dump/* + +~/Dump contains many other files in addition to those found in the Documents repository. + +In this case --clean-duplicate would not be the correct solution. +"""]] diff --git a/doc/todo/wishlist:_do_not_import_new_files/comment_4_22a7a03c30174e42e6d8e639e31e1d34._comment b/doc/todo/wishlist:_do_not_import_new_files/comment_4_22a7a03c30174e42e6d8e639e31e1d34._comment new file mode 100644 index 000000000..f53fb6395 --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files/comment_4_22a7a03c30174e42e6d8e639e31e1d34._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 4" + date="2014-07-15T19:01:24Z" + content=""" +So the goal is to inject any known objects from the dump into the local annex to avoid needing to re-transfer them. + +It seems to me that in this case, you would not even want to create new symlinks in the git repository. + +`git annex reinject` might be a better place to put code to handle this than `git annex import`. +"""]] diff --git a/doc/todo/wishlist:_do_not_import_new_files/comment_5_4294e92e2f4efb9dd10b280f5c9843f7._comment b/doc/todo/wishlist:_do_not_import_new_files/comment_5_4294e92e2f4efb9dd10b280f5c9843f7._comment new file mode 100644 index 000000000..e312c083d --- /dev/null +++ b/doc/todo/wishlist:_do_not_import_new_files/comment_5_4294e92e2f4efb9dd10b280f5c9843f7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.2" + subject="comment 5" + date="2014-07-15T19:13:05Z" + content=""" +A fundamental problem with this idea is that git-annex's keys can use any of many checksumming backends. So, which checksum should it try? Running every possible checksum on a file is going to re-read it repeatedly and be expensive. + +`git annex import` avoids this problem by using whatever the default backend is configured to be for the filename it's importing. This is good enough to make repeated runs of `git annex import` work ok, but when we get into trying to reinject whole directory trees like this, I don't think that's good enough. +"""]] diff --git a/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn b/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn new file mode 100644 index 000000000..6299899e4 --- /dev/null +++ b/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn @@ -0,0 +1,5 @@ +Given that git/config will have information on remotes and maybe costs, it might be a good idea to do a simple round robin selection of remotes to download files where the costs are the same. + +This of course assumes that we like the idea of "parallel" launching and running of curl/rsync processes... + +This wish item is probably only useful for the paranoid people who store more than 1 copy of their data. diff --git a/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment b/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment new file mode 100644 index 000000000..6a5fd3d53 --- /dev/null +++ b/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T16:39:35Z" + content=""" +I dunno about parrallel downloads -- eek! -- but there is at least room for improvement of what \"git annex get\" does when there are multiple remotes that have a file, and the one it decides to use is not available, or very slow, or whatever. +"""]] diff --git a/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn b/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn new file mode 100644 index 000000000..b7b1bad0c --- /dev/null +++ b/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn @@ -0,0 +1 @@ +It would be great to be able to do **private encrypted git remote on hosting site** and **multiuser encrypted git remote on hosting site** as explained in [[tips/fully encrypted git repositories with gcrypt]] through the webapp. I think it's a pretty common usecase that can be very useful for people not owning a proper server. diff --git a/doc/todo/wishlist:_generic_annex.cost-command.mdwn b/doc/todo/wishlist:_generic_annex.cost-command.mdwn new file mode 100644 index 000000000..6adf1460e --- /dev/null +++ b/doc/todo/wishlist:_generic_annex.cost-command.mdwn @@ -0,0 +1,17 @@ +### Current setup + +ATM git-annex has + +remote..annex-cost +remote..annex-cost-command # command is not provided cmdline options by annex + +to set the cost for a given remote. That requires setting up one of those variables per each host, and possibly hardcoding options for the annex-cost-command providing e.g. the remote name. + +### Suggestion + +wouldn't it be more general and thus more flexible to have a repository-wide + +annex.cost-command + +which could take options %remote, %file and assessed accordingly per each file upon '--get' request to allow maximal flexibility: e.g. some files might better be fetched from remotes supporting transfer compression, some from the web, etc. Also it might be worth providing %remote_kind ("special" vs "git") to disambiguate %remote's? + diff --git a/doc/todo/wishlist:_git_annex_diff.mdwn b/doc/todo/wishlist:_git_annex_diff.mdwn new file mode 100644 index 000000000..4acfee255 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_diff.mdwn @@ -0,0 +1,9 @@ +git diff is not very helpful for annexed files. + +How about a git annex diff command that allows to compare two versions of an annexed file? + +Should be relatively simple, only there would have to be a way to deal with the situation where not both versions are present in the repository. Either abort with a message showing the command you need to run to get the missing version(s). Or even interactively volunteer to get it automatically, asking the user for confirmation. + +Of course you wouldn't want to diff two large files, but with git annex assistant, all files are annexed by default (right?), so this would be useful. + +There might already be a way to easily diff two versions of an annexed file which I'm missing -- in that case please point me to it! :) diff --git a/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment b/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment new file mode 100644 index 000000000..86772e2fd --- /dev/null +++ b/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T20:00:16Z" + content=""" +`git diff` is quite flexible; it can use external diff drivers to perform the diff. Someone could write a diff driver that knows about git-annex symlinks, and shows some kind of diff of the file contents (since the files are probably binary, this gets into how to display a diff of different file types..) +"""]] diff --git a/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn b/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn new file mode 100644 index 000000000..7ab493083 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_._also_return_numcopies_setting.mdwn @@ -0,0 +1 @@ +The stats produced by `git annex info .` are nice but I often find myself separately looking up the actual numcopies set value. Can this also be included in the report please? diff --git a/doc/todo/wishlist:_git_annex_info_UUID.mdwn b/doc/todo/wishlist:_git_annex_info_UUID.mdwn new file mode 100644 index 000000000..0d1270e1e --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID.mdwn @@ -0,0 +1,8 @@ +All repos contain some level of information about all other tracked repositories. +It would be nice if I could see that info, preferably with a timestamp telling me when the last sync happened. + +`git annex info UUID/name` would be suggestion. + + +Thanks, +Richard diff --git a/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment b/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment new file mode 100644 index 000000000..ab94b7dea --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-02T02:16:10Z" + content=""" +git-annex vicfg shows everything (except location tracking info and some remote.log stuff that it would be hard to present in any useful way). + +It would be good to make `git annex info` segment its list of repos by group. The only other information is location tracking info and scheduling, which I think vicfg gives a good overview of. +"""]] diff --git a/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment b/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment new file mode 100644 index 000000000..271c88798 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment @@ -0,0 +1,8 @@ +One piece of information that's sometimes useful, but not always, is to get a count of keys present in another remote plus the size of the remote. + +Thus, I could verify that some repos are empty, archive repos have every single file, etc etc. + +I still think that info is best suited for `git annex info name/UUID` as it's more volatile than what `git annex vicfg` displays. + + +Richard diff --git a/doc/todo/wishlist:_history_of_operations.mdwn b/doc/todo/wishlist:_history_of_operations.mdwn new file mode 100644 index 000000000..a79f500ff --- /dev/null +++ b/doc/todo/wishlist:_history_of_operations.mdwn @@ -0,0 +1,8 @@ +Hi, + +I would love to have a page of "history" or "events" in the webapp. Similar to how Dropbox or Box show it. +I've been using git-annex for my personal files for a few months now, and I feel like this is the only feature missing to start using it in a production multi-user environment. + +Thanks + +[[!tag design/assistant]] diff --git a/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment b/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment new file mode 100644 index 000000000..bb872532d --- /dev/null +++ b/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="I second this wishlist item" + date="2013-07-24T16:48:59Z" + content=""" +I too would like to see a recent history of events in the assistant webapp. A simple listing of what changed when and by whom would be sufficient. +"""]] diff --git a/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn b/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn new file mode 100644 index 000000000..ffdee8840 --- /dev/null +++ b/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. + +`git annex reinject` refuses to work while in direct mode. + +When in direct mode git annex reinject could simply perform `rm $symlink; mv $file_copy .; git annex add $file`. I prefer having git annex doing that so I am sure I am not messing up (mistakenly adding new files for instance) and everything is properly managed. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130516.1 + +~~~~ +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +~~~~ + +> [[fixed|done]]. Why did I take so long to do this, it was a trivial 1 +> word change! --[[Joey]] diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn b/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn new file mode 100644 index 000000000..b021c9091 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn @@ -0,0 +1,18 @@ +Imagine this situation: +You have a laptop and a NAS. +On your laptop you want to consume a large media file located on the NAS. +So you type: + + git annex get --from nas mediafile + +But now you have to wait for the download to complete, unless either + +* rsync is pointed directly to the file in the object storage ("--inplace") +or +* the symlink temporarily points to the partial file during a transfer + +which would allow you instantaneous consumption of your media. +It might make sense to make this behavior configurable, because not everyone might agree with having partial content (that mismatches its key) around. + + +So what do you say? diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment new file mode 100644 index 000000000..c4c222431 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-18T20:08:13Z" + content=""" +There's now an easy way to do this: + + git annex find --include=* --format='.git/annex/tmp/${hashdirmixed}${key}/${key}\n' + +Pass it the file or files you're interested in to get their partially transferred contents. +"""]] diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment new file mode 100644 index 000000000..8e955fd48 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 3" + date="2012-11-04T19:58:28Z" + content=""" +I'm not at all comfortable with either idea. Temporarily repointing the symlink could lead to accidentially git committing a bad symlink. Or the user accidentially doing something with a partially transferred file. Running rsync in place would break lots of things that assume that, once the file is present, it can be assumed to be the full and correct file. (Obviously fsck doesn't assume that, but checks made by `git annex drop` do, for example.) + +However, you can access partially transferred files by key in `.git/annex/tmp`. It would be easy to write some hack that looks at the symlink to get the key, and then spits out the name of the partial file in `.git/annex/tmp.`. +"""]] diff --git a/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn b/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn new file mode 100644 index 000000000..b5cf88bf8 --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn @@ -0,0 +1,8 @@ +This is probably an extension of [[wishlist: more info in the standard commit message of `sync`]]: + +It would also help debugging if the default commit messages listed, e.g., the name of all the files modified by that commit (or merge). + +> No, it would not help debugging to put redundant info in commit +> messages. It will only make your repository take up more disk space. +> git log --stat will already show you the files changes by +> any commit. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn new file mode 100644 index 000000000..4e5e3a171 --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn @@ -0,0 +1,3 @@ +Could you include the REPO and UUID information in the "automatic sync" commit message? + +This would make troubleshooting easier. (not there was much trouble with git-annex!) diff --git a/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment new file mode 100644 index 000000000..bede77efc --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-15T02:26:31Z" + content=""" +See also [[wishlist: more info in commit messages in general]] for a similar but more generic wish. +"""]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn new file mode 100644 index 000000000..e50ebbde5 --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn @@ -0,0 +1,7 @@ +Right now the assistant can have a huge list of pending transfers for certain hosts if its data is a bit outdated, or a host hasn't been synced lately. When starting up it will then attempt each transfer to said host (which will in turn fail, but at times take time to time out), possibly before doing other stuff like attempting to download new files, or copy files to online hosts. + +I suggest that if a transfer fails for host X, and there are other pending transfers, say to host Y and from Z, then all other pending transfers to/from X gets pushed to the back of the queue, to avoid having to wait a long time for several transfers to time out before doing useful stuff. + +The prime example for me was this morning, when a laptop that was turned off had a huge amount of queued transfers to it, resulting in the assistant attempting a load of transfers to that host before it retrieved a new file that I had created on another machine yesterday. + +[[!tag design/assistant]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment new file mode 100644 index 000000000..3b6101ed5 --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-12-01T19:22:03Z" + content=""" +There are several difficulties with reordering the queue that way. One is that the failure may be intermittent; another is that the queue is fed by a scanning process, so doesn't always have a well-defined end. + +Another way to deal with this problem, which I think I prefer, is to allow multiple actions from the queue to run at once. Then slow or unreachable remotes don't block it from using other remotes. +"""]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment new file mode 100644 index 000000000..62d46bccd --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="84.48.83.221" + subject="comment 2" + date="2012-12-01T19:31:18Z" + content=""" +I agree your method might be preferable, the end result is the same, and would have avoided the issues I had (and, of course, running multiple transfers at once has other benefits as well). + +An alternate way would be to push every transfer NOT from host X to the front of the queue (avoiding most of the \"no defined end\" issue and largely solving the problem), but if multiple actions at once is feasible then that'd still be much nicer. +"""]] diff --git a/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn b/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn new file mode 100644 index 000000000..7a9b81f72 --- /dev/null +++ b/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn @@ -0,0 +1,37 @@ +It would be nice if the 'unused' command could optionally display info about the actual files behind its cryptic keys. + +I created a (very rough) bash script that simply splices in some info from git log -S'KEY' --numstat into the unused list, like so: + + arand@mas:~/annex(master)$ bash ~/utv/scripts/annex-vunused + unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking origin/HEAD...) (checking seagate/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s1073741824--49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14.img + 8f479a4 Sat Feb 23 16:14:12 2013 +0100 remove bigfile + 0 1 dummy_bigfile.img + 2988d18 Sat Feb 23 16:13:48 2013 +0100 dummy file + 1 0 dummy_bigfile.img + (To see where data was previously used, try: git log --stat -S'KEY')To remove unwanted data: git-annex dropunused NUMBER + ok +The script: + + #!/bin/bash + + pipe="$(mktemp -u)" + mkfifo "$pipe" + + git annex unused >"$pipe" || exit 1 & + + while read -r line + do + key="$(echo "$line" | sed 's/^[^-]*-\([^-]*\)-.*/\1/')" + echo -n "$line" + test -n "$key" && \ + echo && \ + git log --format="%h %cd %s" --numstat -S"$key" | \ + sed '/^$/d;/git-annex automatic sync/,/^ /d;s/^/\t\t/' + + done < "$pipe" + rm "$pipe" + +It would be nice if something like this was available as an option, since it's good way to get a quick overview of what the content is, and if it's safe to drop it. diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn b/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn new file mode 100644 index 000000000..ddf15a144 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn @@ -0,0 +1,3 @@ +The metadata storage for direct mode (V3) is this. In directory .git/annex/objects, there is one .map for all annexed file, and one .cache for all files in the working tree. Both are small files, containing only 1 line or a few lines. I have a repo with lots of photos, and this created lots of small files. I believe this will cause many performance issues. + +It would be great if these files are packed, maybe also in the git pack files format. diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment new file mode 100644 index 000000000..543e1c048 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-04T19:18:16Z" + content=""" +\"I believe this will cause many performance issues.\" + +Such as? +"""]] diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment new file mode 100644 index 000000000..5028636c4 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="namelessjon" + ip="193.132.159.169" + subject="inode starvation" + date="2014-01-09T15:30:16Z" + content=""" +This happened to me a few times when creating new annex folders. + +I use lvm to create virtual partitions and have/had several 'bulk media' logical volumes which used ext4 with -T largefile4 (i.e. one inode per 4mb) because they're storing files with 20mb+ sizes (RAW images, downloaded screencasts, FLAC soundfiles, etc). Between the extra directories git annex creates, the extra files, and the .git/object directory, I ran out of inodes on a few occasions from the profusion of small files. In some cases, I worked around this by shunting data around, or adding incrementally and then 'git gc'ing a lot to at least have a small .git/objects dir. A packed metadata would help to deal with this. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely.mdwn b/doc/todo/wishlist:_perform_fsck_remotely.mdwn new file mode 100644 index 000000000..f2187d912 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely.mdwn @@ -0,0 +1,39 @@ +Currently, when `fsck`'ing a remote, files are first downloaded to a temporary +file locally, decrypted if needed, and finally digested; the temporary file is +then either thrown away, or quarantined, depending on the value of that digest. + +Whereas this approach works with any kind of remote, in the particular case +where the user is granted execution rights on the digest command, one could +avoid cluttering the network and digest the file remotely. I propose the +addition of a per-remote git option `annex-remote-fsck` to switch between the +two behaviors. + + +There is an issue with encrypted specialremotes, though. As hinted at +[[here|tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/#comment-70055f166f7eeca976021d24a736b471]], +since the digest of a ciphertext can't be deduced from that of a plaintext in +general one would needs, before sending an encrypted file to such a remote, to +digest it and store that digest somewhere (together with the cipher's size and +perhaps other meta-information). + +The usual directory structure (`.../.../{backend}-s{size}--{digest}.log`) seems +perfectly suitable to store these informations. Lines there would look like +`{timestamp}s {numcopy} {UUID} {remote digest}`. Of course, it implies that +remote digest commands are trustworthy (are doing the right thing), and that +the digest output are not tampered by others who have access to the git repo. +But that's outside the current threat model, I guess. + +Actually, since git-annex always includes a MDC in the ciphertexts, we could do +something clever and even avoid running a digest algorithm. According to the +[[OpenPGP standard|https://tools.ietf.org/html/rfc4880#section-5.14]] the MDC +is essentially a SHA-1 hash of the plaintext. I'm still investigating if it's +even possible, but in theory it would be enough (with non-chained ciphers at +least) to download a few bytes from the encrypted remote, decrypt those bytes +to retrieve the hash, and compare that hash with the known value. Of course +there is a downside here, namely that files tampered anywhere but on the MDC +packets would not be detected by `fsck` (but gpg will warn when decrypting the +file). + + +My 2 cents :-) Is there something I missed? I suppose there was a reason to +perform `fsck` locally at the first place... diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment new file mode 100644 index 000000000..6bf6af23a --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-22T15:18:35Z" + content=""" +The only reason fsck is done locally for remotes is ease of implementation and it being a generic operation that supports any kind of special remote. + +Seems that the the only types of remotes where a remote fsck is a possibility are some rsync remotes and git remotes. +git remotes already have git-annex installed, so the fsck could be run locally on the remote system using it. + +I don't know if I see a benefit with the MDC check. Any non-malicious data corruption on the remote is likely to affect the body of the file and not the small portion that holds the MDC. So checking the MDC does not seem much better than the current existence check done by `git annex fsck --fast --from remote`. + +As for storing the remote digest on the git-annex branch, my initial reaction was just that it's potentially a lot of bloat. Thinking about it some more, when using non-shared encryption, there is currently no way, given just a clone of a git repository, to match up files in git with encrypted objects stored on a special remote. So storing the remote digest might be considered to weaken the security. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment new file mode 100644 index 000000000..5418ff991 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 2" + date="2013-08-22T16:56:55Z" + content=""" +Oh yeah, the MDC paragraph was pretty much pointless indeed. Oops :-P + +I agree that this would potentially add some noise to the index, and weaken the +security, but depending on the threat model and people's preferences that's an +option that's worth considering IMHO. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment new file mode 100644 index 000000000..91d07b765 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="68.119.96.78" + subject="comment 3" + date="2013-12-21T16:27:16Z" + content=""" +There is now a remoteFsck action in the Remote data structure. So far it is only implemented for git remotes, and `git annex fsck` does not use it; only the assistant does. +"""]] diff --git a/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn b/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn new file mode 100644 index 000000000..3876f2197 --- /dev/null +++ b/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn @@ -0,0 +1,6 @@ +Based on an irc conversation earlier today: + +19:50 < warp> joeyh: what is the best way to figure out the (remote) filename for a file stored in an rsync remote? + +20:43 < joeyh> warp: re your other question, probably the best thing would be to make the whereis command print out locations for each remote, as it always does for the web special remotes + diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn new file mode 100644 index 000000000..2bfb90b54 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn @@ -0,0 +1,7 @@ +I think it would be interesting to have a way to recursively import a local directory without actually moving files around. And to be able to checksum these files as well (without moving them into the annex). + +This would work somewhat similar to looping over a directory and adding file:// remotes for each file. + +A use case is importing optical media (read-only), whilst keeping that media as a remote, and being able to calculate checksums directly without moving any files around. + +For single files, it would also be interesting if addurl had a "--localchecksum" option that would only work for file:// urls, and make it checksum files directly from their source location?) diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment new file mode 100644 index 000000000..caefee9a8 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 1" + date="2013-03-10T23:29:55Z" + content=""" +Recursively adding urls is already feasiable with some simple scripting: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-importdir](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-importdir) + +but this is obviously missing the checksumming bit though. +"""]] diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment new file mode 100644 index 000000000..64d592479 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-11T03:04:44Z" + content=""" +See also: [[forum/Managing a large number of files archived on many pieces of read-only medium (E.G. DVDs)]] +particularly [[this comment|forum/Managing a large number of files archived on many pieces of read-only medium (E.G. DVDs)#comment-908dbe02f29e011f030bba4ab5ef73d1]] +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn new file mode 100644 index 000000000..545bd861d --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn @@ -0,0 +1,26 @@ +Apart from Tahoe-LAFS (covered by [[todo/tahoe lfs for reals]] and [[forum/tips: special_remotes/hook with tahoe-lafs]]), [[special remotes]] (which I understand as real storage backends) for other other [peer network data stores](http://en.wikipedia.org/wiki/Distributed_data_store#Peer_network_node_data_stores_2) would be interesting. + +I mean gnunet, freenet, BitTorrent (also trackerless). + +Before dropping a file locally, the BitTorrent client should check that all parts are still available from the peers. + +Of course, there is no guarantee assumed that the content won't disappear from the peer network in future: they act more like a cache rather than an archive on whose lifespan you decide. (I'm only not sure about gnunet now: whether there is a rule of dropping unused content from it, like in freenet.) + +So, a copy in peer networks shouldn't be counted on by git-annex as much as a copy on a storage you control: probably, by efault, it shouldn't let you delete the local copy if there is a copy in a peer network unless you saved it somewhere else. + +(Think of such a scenario: I could save some of my public large data on external disks/DVDs and keep them at home, and also put them onto peer networks with the same nterface of git-annex which I would be used to; I would also use the git-annex interface to check from time to time that the content is still present, i.e. "cached", on the peer networks. Whenever I'm away from home, and unexpectedly need to show this content to someone, or have a look at it for some reason, I could get it from the peer network "cache".) + +Also networks like namecoin (derived from bitcoin) can be used as a key-value store. Despite being a peer network, a system like namecoin actually could offer the publisher more control over the lifespan of the content: he should be able to offer "financial" reward for others processing his key-value data. (But I'm not sure namecoin is designed reasonably for this reward system to work actually; but there might be appearing other similar systems.) + +## A different view: extend the key-value backends with ways to look for the content in other content-addressable storage systems +We might want to look for the registered files in other [content-addressable storage systems](http://en.wikipedia.org/wiki/Content-addressable_storage#Open-source_implementations) (and also to be able to put the files there for storage). + +For example: + +* [**GNUnet**](http://en.wikipedia.org/wiki/Gnunet) uses its own hash format to address the content. git-annex could extend its own [[backends]] with a one to work with GNUnet, and by default have a built-in [[special remote|special remotes]] that would interact with GNUnet when looking for a content or storing some content. No special setup of the special remote in each repo should be necessary, because GNUnet is "global", so we'd just use the user's already configured GNUnet client. Just turning the builtin GNUnet special remote on or off should be an option (in the repo configuration, and when calling the commands that would query it, like `whereis`). +* **freenet** is similar. +* Similarly, a backend for the hashes used in **BitTorrent** and **magnet links** could be used. If we want a trackerless mode, then probably it's a similar case for a "global"/built-in special remote that needs no local setup in each repo. Using a selected tracker would mean setting up a special remote in our repo. +* **Git** itself can be viwed as place to look for the content. There could be a corresponding backend and a builtin special remote (needing no extra setup) to look for the content among the objects stored in the local Git repo. (What if we have a copy of a file that we've put under the control of git-annex in a previous Git commit? We could get it from the object store of Git.) +* **Venti**, [[**Tahoe-LAFS**|todo/tahoe lfs for reals]] would need a backend for their hashes, and a specially setup special remote in each repo where we'd like to use them--because these are not "global" system, we must setup the path to the instance of the filesystem we'd like to use. +* probably, there must be other interesting cases of this kind... +* (I'm also thinking about using somethng like a **bibliographic information** as a key, but then it wouldn't guarantee identical files: the same paper can be stored in different formats, etc. Cf. [**URNs**](http://en.wikipedia.org/wiki/Uniform_resource_name#Examples), via . Also, an URN like bibliographic information can't be computed from the file, it will have to be entered manually or obtained from another directory of URNs.) diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment new file mode 100644 index 000000000..80a245d14 --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-25T22:57:19Z" + content=""" +The best first step to adding such kinds of data stores to git-annex is probably to use the [[special_remotes/hook]] special remote to access them. +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment new file mode 100644 index 000000000..c58f97c1c --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="comment 2" + date="2012-09-25T23:29:49Z" + content=""" +I see. But then, as with Tahoe-LAFS, they also have their own formats for checksums, keys, which could be re-used in git-annex, and that needs special treatment. +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment new file mode 100644 index 000000000..dac333174 --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-18T19:49:09Z" + content=""" +The new [[special_remotes/external]] special remote's protocol has GETSTATE and SETSTATE commands that can be used to store per-remote values in the git-annex branch. + +So, please go make these special remotes using it! +"""]] diff --git a/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn b/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn new file mode 100644 index 000000000..b88a038ea --- /dev/null +++ b/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn @@ -0,0 +1 @@ +Special remote support for [Ubuntu One](http://one.ubuntu.com) would be nice. They're [using propietary but open protocol](https://wiki.ubuntu.com/UbuntuOne/TechnicalDetails#ubuntuone-storageprotocol) based on [Google Protocol Buffers](http://code.google.com/p/protobuf/). There's [protobuf for Haskell](http://code.google.com/p/protobuf-haskell/) so it should be possible to compile [the protocol file](http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-storage-protocol/trunk/view/head:/ubuntuone/storageprotocol/protocol.proto) to Haskell code and then use that to implement the native Ubuntu special remote. diff --git a/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment new file mode 100644 index 000000000..4fb9bc95e --- /dev/null +++ b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T20:02:14Z" + content=""" +I suggest that if someone wants to build this, they use the new external special remote protocol to do it. +"""]] diff --git a/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_2_17e948acb1e29793cf172cd6def4160b._comment b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_2_17e948acb1e29793cf172cd6def4160b._comment new file mode 100644 index 000000000..20230e3f9 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_2_17e948acb1e29793cf172cd6def4160b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="madduck" + ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c" + subject="Ubuntu One to be discontinued" + date="2014-04-07T05:11:52Z" + content=""" +Thanksfully, Canonical have stopped this silliness, Ubuntu One will be discontinued, so this todo can be marked \"wontfix\" and archived. +"""]] diff --git a/doc/todo/wishlist:_swift_backend.mdwn b/doc/todo/wishlist:_swift_backend.mdwn new file mode 100644 index 000000000..28bd265fa --- /dev/null +++ b/doc/todo/wishlist:_swift_backend.mdwn @@ -0,0 +1,5 @@ +[swift](http://swift.openstack.org/) is the object storage of Openstack. Think S3, but fully open source. As it's backed by rackspace.com, NASA, Dell and several other major players, adoption rates will explode. + +I can provide a test account soonish if need be, else rackspace.com if offering swift storage. Their API gateway lives at https://auth.api.rackspacecloud.com/v1.0 + +Richard diff --git a/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment b/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment new file mode 100644 index 000000000..98a998c1c --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-05-14T10:04:36Z" + content=""" +I don't suppose this SWIFT api is compatible with the eucalytpus walrus api ? +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment b/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment new file mode 100644 index 000000000..97863b095 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-05-14T15:00:51Z" + content=""" +It does offer a S3 compability layer, but that is de facto non-functioning as of right now. +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment b/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment new file mode 100644 index 000000000..90af10c41 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="+1" + date="2012-09-18T08:52:21Z" + content=""" +OVH (french IT company) is migrating its could storage infrastructure to swift/openstack and the next few weeks. +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment b/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment new file mode 100644 index 000000000..21fa52aaf --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5Z8wzidsumLYQnHdrVxpCx8vsd9llSlg" + nickname="Emanuele" + subject="comment 4" + date="2013-11-22T15:52:42Z" + content=""" +OVH is offering free accounts with 25GB of storage on their hubiC service: https://hubic.com/en/ + +The API documentation (based on OAuth2 and OpenStack Swift) is available at https://api.hubic.com/ +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment b/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment new file mode 100644 index 000000000..1f0ff9f63 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 5" + date="2014-02-11T13:38:53Z" + content=""" +FYI, I just published a [special remote for hubiC](https://github.com/Schnouki/git-annex-remote-hubic) that uses the OAuth API for authentication and the SWIFT API for data transfers. Parts of it are specific for hubiC (mostly auth.py), but it should be possible to adapt it to other SWIFT providers as well. +"""]] diff --git a/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn b/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn new file mode 100644 index 000000000..4b661101d --- /dev/null +++ b/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn @@ -0,0 +1,3 @@ +As git annex keeps logs about file transfers anyway, it should be relatively easy to add traffic accounting to a repo. That would allow me to monitor how much traffic a given repo generates. As I might end up hosting git-annex repos for a few personal friends, I need/want a way to track the heavy hitters. -- RichiH + +PS: If you ever plan to host git-annex similar branchable, this would probably be of interest to you, as well :) diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn b/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn new file mode 100644 index 000000000..83ce53127 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn @@ -0,0 +1,20 @@ +In regular repos, objects are stored in files of the form: .git/annex/objects/xY/z1/SHA1-.../SHA1-.... (scheme 1) + +On (some) special remotes, the corresponding file is stored at: .../abc/def/SHA1-... (scheme 2) + +I'm not sure why the same scheme as in .git/objects isn't used, but it would be useful that the two-directory prefix were the same for all objects stores. + +My use case is: I synchronize a git repo, say containing photos, to a server on which I can't install git-annex. I want the server to store all annexed files. For the photos to be viewed online, the annex store must use the scheme 1 (because the symlinks point to files with scheme 1). So I need to rsync .git/annex/objects manually from my desktop, because a git-annex rsync remote uses scheme 2. On the other hand, the repo on this server is not known by git-annex (like it would if I used a rsync remote). + +At least it would be valuable (to get around above problem) to have a plumbing command giving the 2-directory prefix from a given key, for example: + +$ git annex prefix-dir SHA1-s2--3f786850e387550fdab836ed7e6dc881 + +7w/88 + +f18/122 + + +Even if the 2 schemes were unified, this prefix-dir command would still be useful when hacking around git-annex (for now I need to maintain a dictionary structure). + +Thanks a lot. diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment new file mode 100644 index 000000000..86c33d434 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="comment 1" + date="2013-10-04T20:50:33Z" + content=""" +Using the mixed case hash directory names is not desirable because people want to use git-annex on a variety of filesystems and operating systems that treat them in a variety of broken ways. However, migrating to the all lower case hash directory names would require changing every git-annex symlink in every git repository, and I do not want to inflict that on my users. + +It seems to me that the best solution to your problem is to install git-annex on your server, which should not be very hard. +"""]] diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment new file mode 100644 index 000000000..5c5269f8c --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 2" + date="2013-10-05T10:45:16Z" + content=""" +Thank you for prompt answer. I didn't know there were tarballs, +and indeed I managed to install them easily (although I had to +manually install glibc version 2.9, only 2.7 was installed). + +I found that bare git repos also use lower case hash directory +names... I still would be happy with an optional migration to all +lower case, with a new key-value backend, to avoid this little +complication which happens sometimes (say when converting a repo +from non-bare to bare). +"""]] diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment new file mode 100644 index 000000000..e6acad3b9 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 3" + date="2013-10-07T13:33:40Z" + content=""" +By the way, I just had the case above, i.e. convert a bare repo to non-bare. In order to keep the annex files, I cloned the bare one, and git-annex move'ed all annex content to the new repo, and to my surprise it was slow, as if all files where copied (or maybe they were only checksummed?), instead of being only renamed (old and new repos were on the same partition). So I restate that at least a command line tool giving the prefix dirs would be useful, to allow scripting for this kind of situation. +"""]] diff --git a/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn b/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn new file mode 100644 index 000000000..4b0694422 --- /dev/null +++ b/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn @@ -0,0 +1,9 @@ +as far as I know, if you `git clone` locally a git-annex enabled repository, it will not have all the files available. you would need to use `git annex get` and all files would be copied over, wasting a significant amount of space. + +`git-clone` has this `--local` flags which hardlinks objects in `.git/objects`, but also, maybe more interestingly, has a `--shared` option to simply tell git to look in another repo for objects. it seems to me git-annex could leverage those functionalities to avoid file duplication when using local repositories. + +this would be especially useful for [ikiwiki](http://ikiwiki.info/forum/ikiwiki_and_big_files). + +This is a [[wishlist]], but I would also welcome implementation pointers to do this myself, thanks! --[[anarcat]] + +> [[dup|done]] diff --git a/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment b/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment new file mode 100644 index 000000000..4ef5f8414 --- /dev/null +++ b/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T17:14:28Z" + content=""" +git-annex uses cp --reflink=auto. So on a filesystem supporting COW file copies, like btrfs, `git annex get` will not use any disk space when getting from the same filesystem. + +I do not like the idea of using hardlinks, because changing the file in one repository would change it in the other, which may not be desired. + +[[union_mounting]] seems to cover this item pretty well, so I will close this as a duplicate. +"""]] diff --git a/doc/todo/wishlist:alias_system.mdwn b/doc/todo/wishlist:alias_system.mdwn new file mode 100644 index 000000000..1f5012966 --- /dev/null +++ b/doc/todo/wishlist:alias_system.mdwn @@ -0,0 +1 @@ +To implement things like my custom `git annex-push` without the dash, i.e. `git annex push`, an alias system for git-annex would be nice. diff --git a/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment b/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment new file mode 100644 index 000000000..ea8f2bd30 --- /dev/null +++ b/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T19:38:19Z" + content=""" +Why not just use git's alias system? It can't make `git annex $foo` aliases, but `git $foo` is shorter anyway.. +"""]] diff --git a/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn new file mode 100644 index 000000000..e0b1b5f5f --- /dev/null +++ b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn @@ -0,0 +1 @@ +otherwise now it is impossible to judge how old those are when opening the dashboard diff --git a/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment new file mode 100644 index 000000000..97760e739 --- /dev/null +++ b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-16T02:22:18Z" + content=""" ++1 +"""]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn new file mode 100644 index 000000000..fe32f7dd7 --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn @@ -0,0 +1,9 @@ +When adding a Remote server through the webapp, it set-up a specific SSH key for later sync. + +However, when the remote has been set-up manually, then later gets the assistant thrown at it, there doesn't appear to be a way to create and deploy such a key. This option could be offered in, e.g., the settings of the repo in the webapp. + +> I feel this is out of scope for the assistant. If the user is able to +> manually add a git remote at the command line, then they should be able +> to configure ssh keys too. I don't want to complicate the assistant with +> a lot of code that tries to deal with half-configured things the user +> manually set up. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment new file mode 100644 index 000000000..d8e3f9337 --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-22T13:08:21Z" + content=""" +Hum, fair enough. The webapp might not be the best target. However, there might already be some logic to deploy the key, only not exposed in any UI (web or CLI). + +However, I was under the impression that the key thath git-annex installs remotely is also limited to running git-annex-related tasks (using the command option; I cannot find any example in my configurations at the moment), rather than providing a generic login shell which happens to be used for git-annex. + +The command to run on the remote server did not seem to be trivial (this is what I'm currently bumping against), and I guess there already are a few functions which create and install the authorized_files entry. Maybe providing, e.g., a + + git-annex installkey REMOTE + +command, automating only this key-setup step for the user, would be good? +"""]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_2_06230669218541ac392d674bedd43176._comment b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_2_06230669218541ac392d674bedd43176._comment new file mode 100644 index 000000000..79ebb5e7c --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_2_06230669218541ac392d674bedd43176._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="Manual solution" + date="2014-06-14T13:59:38Z" + content=""" +My problem stems from the fact that I manually git clone the git-annex repo, which prevents the assistant from creating the setup to use passwordless keys. I just reverse-engineered a working setup to work up what I was missing. I jot it down here for reference, but I guess the bottomline is that if you want to use the assistant with a repo, do it from the start. + +I assume that the client has a clone of the git(-annex) repo of the server. + + client$ git clone server:annex + +Our goal is to let git-annex on the client know that there is a specific key to use when connecting to server that will let it access the git-annex-shell (without a password). We first create the key. + + client:~$ ssh-keygen -t rsa -f ~/.ssh/git-annex/key.git-annex-server-user_annex + [enter an empty passphrase] + +We can then create a virtual SSH host on the client that will use this key to connect to the server, in client:~/.ssh/config: + + # Added manually for git-annex + Host git-annex-server-user_annex + Hostname server + Port 22 + IdentityFile ~/.ssh/git-annex/key.git-annex-server-user_annex + IdentitiesOnly yes + StrictHostKeyChecking yes + +(git-annex seems to use .2F (%2F) to encode path separators in the filenames.) + +The server then needs to know to let the key in, but only for git-annex in the specific folder. This is done in server:.ssh/authorized_keys: + + command=\"GIT_ANNEX_SHELL_DIRECTORY='annex' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAA... user@client + +The bit starting with ssh-rsa is the public key created in client:.ssh/git-annex/key.git-annex-server-user_annex.pub at the same time as the private key. + +Finally, all that remains is to change the remote in the client clone to use the virtual SSH host. + + client:~/annex $ git remote set-url origin ssh://user@git-annex-server-user_annex/~/annex + client:~/annex $ git remote set-url origin --push ssh://user@git-annex-server-user_annex/~/annex + +If everything worked, a sync from the client should now work without asking for a password, and starting the assistant will not either. + +"""]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_3_002afd775b82a0ced609c8305803a6c2._comment b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_3_002afd775b82a0ced609c8305803a6c2._comment new file mode 100644 index 000000000..2515349a6 --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_3_002afd775b82a0ced609c8305803a6c2._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 3" + date="2014-06-14T14:15:55Z" + content=""" +After having done that on my first test repo, git-annex could sync, but failed to get the files. + + client:~/annex$ git annex get file + get file (not available) + Try making some of these repositories available: + 12345678-90ab-cdef-1234567890abcdef1 -- user@server:~/annex [origin] + + (Note that these git remotes have annex-ignore set: origin) + failed + git-annex: get: 1 failed + +The note helps: the problem is with the origin remote having annex-ignore set. git-annex therefore ignores it. This is easily fixed by just setting the flag to false. + + client:~/annex$ git config remote.origin.annex-ignore false + +"""]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_4_9e8fdc41fdefcb8be0d6bae7cd4a04a9._comment b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_4_9e8fdc41fdefcb8be0d6bae7cd4a04a9._comment new file mode 100644 index 000000000..06d16239a --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_4_9e8fdc41fdefcb8be0d6bae7cd4a04a9._comment @@ -0,0 +1,59 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 4" + date="2014-07-09T01:09:33Z" + content=""" +And the ultimate, copy/pastable one, using shell variables: + + export GASERVER=server + export GAUSER=user + export GAPATH=/path + +For the new client (using bash): + + export GASANEPATH=${GAPATH//\//.2F} + export GASSHHOSTNAME=${GASERVER}-${GAUSER}_${GASANEPATH} + ssh-keygen -t rsa -f ~/.ssh/git-annex/key.git-annex-$GASSHHOSTNAME + cat << EOF >> ~/.ssh/config + # Added manually for git-annex + Host git-annex-$GASSHHOSTNAME + Hostname $GASERVER + IdentityFile ~/.ssh/git-annex/key.git-annex-$GASSHHOSTNAME + IdentitiesOnly yes + StrictHostKeyChecking yes + EOF + ssh-copy-id -i ~/.ssh/git-annex/key.git-annex-$GASSHHOSTNAME $GAUSER@$GASERVER + git remote add ${GASERVER/.*/} ssh://${GAUSER}@git-annex-${GASSHHOSTNAME}${GAPATH} + git config remote.${GASERVER/.*/}.annex-ignore false + +After the `ssh-copy-id` stage, the key can be used to get a full session. This +needs to be limited on the server, by prepending the following to the newly +added key in `.ssh/authorized_keys`, replacing `GAPATH` by the value of `$GAPATH`: + + command=\"GIT_ANNEX_SHELL_DIRECTORY='GAPATH' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty + +From the client, one can make sure this has been limite properly by trying to log in with the key: + + ssh -i ~/.ssh/git-annex/key.git-annex-$GASSHHOSTNAME $GAUSER@$GASERVER -o IdentitiesOnly=yes + +It should reply with the `git-annex-shell` helper complaing: + + git-annex-shell: bad parameters + + Usage: git-annex-shell [-c] command [parameters ...] [option ...] + + Plumbing commands: + + commit DIRECTORY commits any staged changes to the git-annex branch + configlist DIRECTORY outputs relevant git configuration + dropkey DIRECTORY KEY ... drops annexed content for specified keys + gcryptsetup DIRECTORY VALUE sets up gcrypt repository + inannex DIRECTORY KEY ... checks if keys are present in the annex + notifychanges DIRECTORY sends notification when git refs are changed + recvkey DIRECTORY KEY runs rsync in server mode to receive content + sendkey DIRECTORY KEY runs rsync in server mode to send content + transferinfo DIRECTORY KEY updates sender on number of bytes of content received + +... and this should be all set. +"""]] diff --git a/doc/todo/wishlist_degraded_files.mdwn b/doc/todo/wishlist_degraded_files.mdwn new file mode 100644 index 000000000..0b265c5eb --- /dev/null +++ b/doc/todo/wishlist_degraded_files.mdwn @@ -0,0 +1,5 @@ +This is an idea to have a small placeholder file that is put into +place when the file's actual content is not available in the local +annex. + +Details being discussed here: diff --git a/doc/transferring_data.mdwn b/doc/transferring_data.mdwn new file mode 100644 index 000000000..d1ec5963f --- /dev/null +++ b/doc/transferring_data.mdwn @@ -0,0 +1,19 @@ +git-annex can transfer data to or from any of a repository's git remotes. +Depending on where the remote is, the data transfer is done using rsync +(over ssh or locally), or plain cp (with copy-on-write +optimisations on supported filesystems), or using curl (for repositories +on the web). Some [[special_remotes]] are also supported that are not +traditional git remotes. + +If a data transfer is interrupted, git-annex retains the partial transfer +to allow it to be automatically resumed later. + +It's equally easy to transfer a single file to or from a repository, +or to launch a retrievel of a massive pile of files from whatever +repositories they are scattered amongst. + +git-annex automatically uses whatever remotes are currently accessible, +preferring ones that are less expensive to talk to. + +[[!img repomap.png caption="A real-world repository interconnection map +(generated by git-annex map)"]] diff --git a/doc/trust.mdwn b/doc/trust.mdwn new file mode 100644 index 000000000..1fd47fd1d --- /dev/null +++ b/doc/trust.mdwn @@ -0,0 +1,59 @@ +Git-annex supports several levels of trust of a repository: + +* semitrusted (default) +* untrusted +* trusted +* dead + +## semitrusted + +Normally, git-annex does not fully trust its stored [[location_tracking]] +information. When removing content, it will directly check +that other repositories have enough [[copies]]. + +Generally that explicit checking is a good idea. Consider that the current +[[location_tracking]] information for a remote may not yet have propagated +out. Or, a remote may have suffered a catastrophic loss of data, or itself +been lost. + +There is still some trust involved here. A semitrusted repository is +depended on to retain a copy of the file content; possibly the only +[[copy|copies]]. + +(Being semitrusted is the default. The `git annex semitrust` command +restores a repository to this default, when it has been overridden. +The `--semitrust` option can temporarily restore a repository to this +default.) + +## untrusted + +An untrusted repository is not trusted to retain data at all. Git-annex +will retain sufficient [[copies]] of data elsewhere. + +This is a good choice for eg, portable drives that could get lost. Or, +if a disk is known to be dying, you can set it to untrusted and let +`git annex fsck` warn about data that needs to be copied off it. + +To configure a repository as untrusted, use the `git annex untrust` +command. + +## trusted + +Sometimes, you may have reasons to fully trust the location tracking +information for a repository. For example, it may be an offline +archival drive, from which you rarely or never remove content. Deciding +when it makes sense to trust the tracking info is up to you. + +One way to handle this is just to use `--force` when a command cannot +access a remote you trust. Or to use `--trust` to specify a repisitory to +trust temporarily. + +To configure a repository as fully and permanently trusted, +use the `git annex trust` command. + +## dead + +This is used to indicate that you have no trust that the repository +exists at all. It's appropriate to use when a drive has been lost, +or a directory irretrevably deleted. It will make git-annex avoid +even showing the repository as a place where data might still reside. diff --git a/doc/upgrades.mdwn b/doc/upgrades.mdwn new file mode 100644 index 000000000..0b43a972d --- /dev/null +++ b/doc/upgrades.mdwn @@ -0,0 +1,106 @@ +Occasionally improvments are made to how git-annex stores its data, +that require an upgrade process to convert repositories made with an older +version to be used by a newer version. It's annoying, it should happen +rarely, but sometimes, it's worth it. + +There's a committment that git-annex will always support upgrades from all +past versions. After all, you may have offline drives from an earlier +git-annex, and might want to use them with a newer git-annex. + +git-annex will notice if it is run in a repository that +needs an upgrade, and refuse to do anything. To upgrade, +use the "git annex upgrade" command. + +The upgrade process is guaranteed to be conflict-free. Unless you +already have git conflicts in your repository or between repositories. +Upgrading a repository with conflicts is not recommended; resolve the +conflicts first before upgrading git-annex. + +## Upgrade events, so far + +### v4 -> v5 (git-annex version 5.x) + +The upgrade from v4 to v5 is handled +automatically, and only affects [[direct mode]] repositories. + +This upgrade involves changing direct mode repositories to operate with +core.bare=true. + +### v3 -> v4 (git-annex version 4.x) + +v4 was only used for [[direct_mode]], to ensure that a version of git-annex +that understands direct mode was used with a direct mode repository. + +### v2 -> v3 (git-annex version 3.x) + +Involved moving the .git-annex/ directory into a separate git-annex branch. + +After this upgrade, you should make sure you include the git-annex branch +when git pushing and pulling. + +### tips for this upgrade + +This upgrade is easier (and faster!) than the previous upgrades. +You don't need to upgrade every repository at once; it's sufficient +to upgrade each repository only when you next use it. + +Example upgrade process: + + cd localrepo + git pull + git annex upgrade + git commit -m "upgrade v2 to v3" + git gc + +### v1 -> v2 (git-annex version 0.20110316) + +Involved adding hashing to .git/annex/ and changing the names of all keys. +Symlinks changed. + +Also, hashing was added to location log files in .git-annex/. +And .gitattributes needed to have another line added to it. + +Previously, files added to the SHA [[backends]] did not have their file +size tracked, while files added to the WORM backend did. Files added to +the SHA backends after the conversion will have their file size tracked, +and that information will be used by git-annex for disk free space checking. +To ensure that information is available for all your annexed files, see +[[upgrades/SHA_size]]. + +### tips for this upgrade + +This upgrade can tend to take a while, if you have a lot of files. + +Each clone of a repository should be individually upgraded. +Until a repository's remotes have been upgraded, git-annex +will refuse to communicate with them. + +Start by upgrading one repository, and then you can commit +the changes git-annex staged during upgrade, and push them out to other +repositories. And then upgrade those other repositories. Doing it this +way avoids git-annex doing some duplicate work during the upgrade. + +Example upgrade process: + + cd localrepo + git pull + git annex upgrade + git commit -m "upgrade v1 to v2" + git push + + ssh remote + cd remoterepo + git pull + git annex upgrade + ... + +### v0 -> v1 (git-annex version 0.04) + +Involved a reorganisation of the layout of .git/annex/. Symlinks changed. + +Handled more or less transparently, although git-annex was just 2 weeks +old at the time, and had few users other than Joey. + +Before doing this upgrade, set annex.version: + + git config annex.version 0 diff --git a/doc/upgrades/SHA_size.mdwn b/doc/upgrades/SHA_size.mdwn new file mode 100644 index 000000000..97603ba91 --- /dev/null +++ b/doc/upgrades/SHA_size.mdwn @@ -0,0 +1,20 @@ +Before version 2 of the git-annex repository, files added to the SHA +[[backends]] did not have their file size tracked, while files added to the +WORM backend did. The file size information is used for disk free space +checking. + +Files added to the SHA backends after the conversion will have their file +size tracked automatically. This disk free space checking is an optional +feature and since you're more likely to be using more recently added files, +you're unlikely to see any bad effect if you do nothing. + +That said, if you have old files added to SHA backends that lack file size +tracking info, here's how you can add that info. After [[upgrading|upgrades]] +to repository version 2, in each repository run: + + git annex migrate + git commit -m 'migrated keys for v2' + +The usual caveats about [[tips/migrating_data_to_a_new_backend]] +apply; you will end up with unused keys that you can later clean up with +`git annex unused`. diff --git a/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment b/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment new file mode 100644 index 000000000..7b6be1532 --- /dev/null +++ b/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I" + nickname="Asheesh" + subject="The fact that the keys changed causes merge conflicts" + date="2012-06-25T00:28:59Z" + content=""" +FYI, I have run into a problem where if you 'git annex sync' between various 'git annex v3' repositories, if the different repositories are using different encodings of the SHA1 information (one including size, one not), then the 'git merge' will declare that they conflict. + +There's no indication that 'git annex migrate' is the right tool to run, except from perusing the 'git annex' man page. In my opinion this is a major user interface problem. + +-- Asheesh. +"""]] diff --git a/doc/upgrades/gcrypt.mdwn b/doc/upgrades/gcrypt.mdwn new file mode 100644 index 000000000..65f80f86e --- /dev/null +++ b/doc/upgrades/gcrypt.mdwn @@ -0,0 +1,25 @@ +Unfortunately the initial gcrypt repository layout had to be changed +after git-annex version 4.20130920. If you have an encrypted git repository +created using version 4.20130920 or 4.20130909, you need to manually +upgrade it. + +If you look at the contents of your gcrypt repository, you will +see a bare git repository, with a few three-letter subdirectories, +which are where git-annex stores its encrypted file contents: + +
+27f/  branches/  description  hooks/  objects/
+HEAD  config     f37/         info/   refs/
+
+ +In the example above, the subdirectories are `27f` and `f37`. + +All you need to do to transition is move those subdirectories +into an `annex/objects` directory. + + mkdir annex ; mkdir annex/objects ; mv 27f f37 annex/objects + +Probably those are the only 3 letter things inside your git repository, +so this will probably work: + + mkdir annex ; mkdir annex/objects ; mv ??? annex/objects diff --git a/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment b/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment new file mode 100644 index 000000000..8805f4a8d --- /dev/null +++ b/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmj3kEGlCiy_Y-wb6AIBBnJ0B_SiPHV5Bo" + nickname="Thomas" + subject="small omission" + date="2013-09-25T04:59:03Z" + content=""" +In your second example, `mv ??? annex` has to be `mv ??? annex/objects`, I think. +"""]] diff --git a/doc/use_case/Alice.mdwn b/doc/use_case/Alice.mdwn new file mode 100644 index 000000000..cdd3ea546 --- /dev/null +++ b/doc/use_case/Alice.mdwn @@ -0,0 +1,24 @@ +### use case: The Nomad + +Alice is always on the move, often with her trusty netbook and a small +handheld terabyte USB drive, or a smaller USB keydrive. She has a server +out there on the net. She stores data, encrypted in the Cloud. + +All these things can have different files on them, but Alice no longer +has to deal with the tedious process of keeping them manually in sync, +or remembering where she put a file. git-annex manages all these data +sources as if they were git remotes. +[[more about special remotes|special_remotes]] + +When she has 1 bar on her cell, Alice queues up interesting files on her +server for later. At a coffee shop, she has git-annex download them to her +USB drive. High in the sky or in a remote cabin, she catches up on +podcasts, videos, and games, first letting git-annex copy them from +her USB drive to the netbook (this saves battery power). +[[more about transferring data|transferring_data]] + +When she's done, she tells git-annex which to keep and which to remove. +They're all removed from her netbook to save space, and Alice knows +that next time she syncs up to the net, her changes will be synced back +to her server. +[[more about distributed version control|distributed_version_control]] diff --git a/doc/use_case/Bob.mdwn b/doc/use_case/Bob.mdwn new file mode 100644 index 000000000..7a90cdd11 --- /dev/null +++ b/doc/use_case/Bob.mdwn @@ -0,0 +1,25 @@ +### use case: The Archivist + +Bob has many drives to archive his data, most of them +[[kept offline|tips/offline_archive_drives]], in a safe place. + +With git-annex, Bob has a single directory tree that includes all +his files, even if their content is being stored offline. He can +reorganize his files using that tree, committing new versions to git, +without worry about accidentally deleting anything. + +When Bob needs access to some files, git-annex can tell him which drive(s) +they're on, and easily make them available. Indeed, every drive knows what +is on every other drive. +[[more about location tracking|location_tracking]] + +Bob thinks long-term, and so he appreciates that git-annex uses a simple +repository format. He knows his files will be accessible in the future +even if the world has forgotten about git-annex and git. +[[more about future-proofing|future_proofing]] + +Run in a cron job, git-annex adds new files to archival drives at night. It +also helps Bob keep track of intentional, and unintentional copies of +files, and logs information he can use to decide when it's time to duplicate +the content of old drives. +[[more about backup copies|copies]] diff --git a/doc/users.mdwn b/doc/users.mdwn new file mode 100644 index 000000000..b9bab48ec --- /dev/null +++ b/doc/users.mdwn @@ -0,0 +1,9 @@ +Users of this wiki, feel free to create a subpage of this one and talk +about yourself on it, within reason. You can link to it to sign your +comments. + +List of users +============= +[[!inline pages="users/* and !users/*/* and !*/Discussion" +feeds=no archive=yes sort=title template=titlepage +rootpage="users" postformtext="Add yourself as an git-annex user:"]] diff --git a/doc/users/anarcat.mdwn b/doc/users/anarcat.mdwn new file mode 100644 index 000000000..7a911e78f --- /dev/null +++ b/doc/users/anarcat.mdwn @@ -0,0 +1,55 @@ +I use git-annex to manage huge files, mostly video and audio attached to other git repositories (such as presentations), but I also use git-annex to manage my music collection across multiple devices. I also use it to manage the `ISO` images I download, podcasts, and youtube videos. + +See . + +[[!toc]] + +My tips +======= + +... or the ones I commented it, to be more precise. + +[[!inline pages="tips/* and and link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]] + + +My todos +======== + +... same. + +[[!inline pages="todo/* and !todo/done and !link(todo/done) and +link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]] + +Done +---- + +[[!inline pages="todo/* and !todo/done and link(todo/done) and +link(users/anarcat)" feeds=no actions=yes archive=yes show=0]] + +My bugs +======= + +... same. + +[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and +link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0 template=buglist]] + +Fixed +----- + +[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and +link(users/anarcat)" feeds=no actions=yes archive=yes show=0 template=buglist]] + +Forum posts +=========== + +Forums where I posted. + +[[!inline pages="forum/* and link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]] + +Git annex dev news +================== + +I find the recent changes a little too noisy, but i want more than just the [[news]], so i made up this little hybrid feed: + +[[!inline pages="(news/* and !news/*/* and !*/Discussion) or (devblog/* and !devblog/*/*)" feedonly="yes"]] diff --git a/doc/users/chrysn.mdwn b/doc/users/chrysn.mdwn new file mode 100644 index 000000000..ba4261567 --- /dev/null +++ b/doc/users/chrysn.mdwn @@ -0,0 +1,11 @@ +* **name**: chrysn +* **website**: +* **uses git-annex for** managing the family's photos (and possibly videos and music in the future). +* **likes git-annex because** it adds a layer of commit semantics over a regular file system without keeping everything in duplicate locally. +* **would like git-annex not to** be required any more at all when + * git itself learns to use cow filesystems to avoid abundant disk usage, and + * git gets better with shallow clones. + + git-annex might then still be a simpler tool that watches over what can be safely dropped from a particular shallow clone + + (the issues with shallow clones seem to relate primarily to shallow history; i haven't read anything about what would happen if all commits were checked out, but not all trees and blobs) diff --git a/doc/users/clacke.mdwn b/doc/users/clacke.mdwn new file mode 100644 index 000000000..c48cd311f --- /dev/null +++ b/doc/users/clacke.mdwn @@ -0,0 +1,3 @@ +Claes Wallin (韋嘉誠) + +[[https://microca.st/clacke]] diff --git a/doc/users/claes.wallin.mdwn b/doc/users/claes.wallin.mdwn new file mode 100644 index 000000000..9e79a5fc9 --- /dev/null +++ b/doc/users/claes.wallin.mdwn @@ -0,0 +1 @@ +[[!meta redir=clacke]] diff --git a/doc/users/fmarier.mdwn b/doc/users/fmarier.mdwn new file mode 100644 index 000000000..d04b6968d --- /dev/null +++ b/doc/users/fmarier.mdwn @@ -0,0 +1,6 @@ +# François Marier + +Free Software and Debian Developer. Lead developer of [Libravatar](https://www.libravatar.org) + +* [Blog](http://feeding.cloud.geek.nz) and [homepage](http://fmarier.org) +* [Identica](http://identi.ca/fmarier) / [Twitter](https://twitter.com/fmarier) diff --git a/doc/users/gebi.mdwn b/doc/users/gebi.mdwn new file mode 100644 index 000000000..121bedbdd --- /dev/null +++ b/doc/users/gebi.mdwn @@ -0,0 +1 @@ +Michael Gebetsroither diff --git a/doc/users/greg.mdwn b/doc/users/greg.mdwn new file mode 100644 index 000000000..95873c575 --- /dev/null +++ b/doc/users/greg.mdwn @@ -0,0 +1,3 @@ +Greg Grossmeier + + diff --git a/doc/users/joey.mdwn b/doc/users/joey.mdwn new file mode 100644 index 000000000..306e1cc76 --- /dev/null +++ b/doc/users/joey.mdwn @@ -0,0 +1,2 @@ +Joey Hess + diff --git a/doc/users/sameerds.mdwn b/doc/users/sameerds.mdwn new file mode 100644 index 000000000..6df5f181c --- /dev/null +++ b/doc/users/sameerds.mdwn @@ -0,0 +1,3 @@ +Extremely grateful user of git-annex. + +[[http://sameer.sbuddhe.net/]] diff --git a/doc/users/tobiastheviking.mdwn b/doc/users/tobiastheviking.mdwn new file mode 100644 index 000000000..31398dae9 --- /dev/null +++ b/doc/users/tobiastheviking.mdwn @@ -0,0 +1,13 @@ +Tobias Ussing + +See: + +* [[tips/flickrannex]] - [[https://github.com/TobiasTheViking/flickrannex/]] +* [[tips/imapannex]] - [[https://github.com/TobiasTheViking/imapannex]] +* [[tips/dropboxannex]] - [[https://github.com/TobiasTheViking/dropboxannex]] +* [[tips/skydriveannex]] - [[https://github.com/TobiasTheViking/skydriveannex]] +* [[tips/googledriveannex]] - [[https://github.com/TobiasTheViking/googledriveannex]] +* [[tips/owncloudannex]] - [[https://github.com/TobiasTheViking/owncloudannex]] +* [[tips/megaannex]] - [[https://github.com/TobiasTheViking/megaannex]] +* [[forum/nntp__47__usenet_special_remote/]] + diff --git a/doc/videos.mdwn b/doc/videos.mdwn new file mode 100644 index 000000000..4bfcdbc9f --- /dev/null +++ b/doc/videos.mdwn @@ -0,0 +1,8 @@ +Talks and screencasts about git-annex. + +These videos are also available in a public git-annex repository +`git clone https://downloads.kitenet.net/.git/` + +[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="2"]] + +[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="0" archive=yes skip=2 feeds=no]] diff --git a/doc/videos/FOSDEM2012.mdwn b/doc/videos/FOSDEM2012.mdwn new file mode 100644 index 000000000..30d1e37d5 --- /dev/null +++ b/doc/videos/FOSDEM2012.mdwn @@ -0,0 +1,7 @@ +
+A 15 minute introduction to git-annex, +presented by Richard Hartmann at FOSDEM 2012. + +[[!meta date="1 Jan 2012"]] +[[!meta title="git-annex presentation by Richard Hartmann at FOSDEM 2012"]] diff --git a/doc/videos/LCA2013.mdwn b/doc/videos/LCA2013.mdwn new file mode 100644 index 000000000..0f29ce052 --- /dev/null +++ b/doc/videos/LCA2013.mdwn @@ -0,0 +1,8 @@ +
+A 45 minute talk and demo of git-annex and the assistant), presented by Joey Hess at LCA 2013. + +[[!meta date="1 Feb 2013"]] +[[!meta title="git-annex presentation by Joey Hess at Linux.Conf.Au 2013"]] diff --git a/doc/videos/git-annex_assistant_archiving.mdwn b/doc/videos/git-annex_assistant_archiving.mdwn new file mode 100644 index 000000000..7e891c2f7 --- /dev/null +++ b/doc/videos/git-annex_assistant_archiving.mdwn @@ -0,0 +1,5 @@ +
+A 9 minute screencast +covering archiving your files with the [[git-annex assistant|/assistant]]. diff --git a/doc/videos/git-annex_assistant_introduction.mdwn b/doc/videos/git-annex_assistant_introduction.mdwn new file mode 100644 index 000000000..93f9df1ba --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction.mdwn @@ -0,0 +1,5 @@ +
+A 8 minute screencast +introducing the [[git-annex assistant|/assistant]]. diff --git a/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment b/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment new file mode 100644 index 000000000..c969bacbc --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="modules" + ip="85.16.227.39" + subject="Great screencast" + date="2013-03-16T14:16:37Z" + content=""" +I am starting to understand the concept :) Thank you. + +The assistant is working perfect with local repos and removable drives but i have problems to setup a remote repos. On a fresh debian server with base setup and rsync installed and ssh-keys for login. I got a green \"Scanned 93.xxx.xx.xxx_annex\" message on dashboard, but there is never a finished transfer. Its \"queued\" on all files and nothing seems to happens on clicking the \"play\" button behind files (x-ing files removes them from dashboard). Also i saw there is a second option in your screencast for remote servers (\"Use a git reposoitory on the server\") which does not show up on my side. Do i need to setup git-annex on server for second option? (with git-annex version 4.20130314). + + + + + +"""]] diff --git a/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment b/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment new file mode 100644 index 000000000..8b6d2a1e9 --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-16T16:04:30Z" + content=""" +@modules: Yes, you're only given the option to use a git repository on the server if it has both git and git-annex installed. You can install any version of git-annex there. For example, Debian stable ships with one that will work. +I plan to make that screen clearer when the git repository option is not available. + +I'm not sure what'd going on with your rsync transfers not running. I can say that if the \"play\" icon is visible, the transfer has been paused. While a transfer is running, the \"pause\" icon is visible instead, to let you pause it. +This may be as simple as you having misunderstood the icons and paused the currently running transfer, which prevents any transfers from running. If not, suggest you enable debug logs in the Preferences page, and consider filing a [[bug_report|bugs]]. +"""]] diff --git a/doc/videos/git-annex_assistant_lan.mdwn b/doc/videos/git-annex_assistant_lan.mdwn new file mode 100644 index 000000000..aa9245fe5 --- /dev/null +++ b/doc/videos/git-annex_assistant_lan.mdwn @@ -0,0 +1,6 @@ +
+A 10 minute screencast +showing how to get started using the [[git-annex assistant|/assistant]], +including sharing files on a local network, and installation on a server. diff --git a/doc/videos/git-annex_assistant_lan/comment_1_df8c8b6d9d63fbf5462b225edbb23c82._comment b/doc/videos/git-annex_assistant_lan/comment_1_df8c8b6d9d63fbf5462b225edbb23c82._comment new file mode 100644 index 000000000..8c67a5cfb --- /dev/null +++ b/doc/videos/git-annex_assistant_lan/comment_1_df8c8b6d9d63fbf5462b225edbb23c82._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="How is the binary found on the server?" + date="2014-06-05T12:05:40Z" + content=""" +Great screencast! There is one thing that intrigues me: since you simply uncompress the binary in some folder, how does gitannex figures out where the binary lives there? +"""]] diff --git a/doc/videos/git-annex_assistant_lan/comment_2_d4e3122da9c9e27fbe872e09fcde762b._comment b/doc/videos/git-annex_assistant_lan/comment_2_d4e3122da9c9e27fbe872e09fcde762b._comment new file mode 100644 index 000000000..c62f1d016 --- /dev/null +++ b/doc/videos/git-annex_assistant_lan/comment_2_d4e3122da9c9e27fbe872e09fcde762b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="magic" + date="2014-06-10T16:13:35Z" + content=""" +In the screencast, I run git-annex after unpacking it, and this lets it register where it's installed at. + +So it is important to run git-annex after you unpack it. +"""]] diff --git a/doc/videos/git-annex_assistant_lan/comment_3_d43ee0a335c2f010b437cf28437455c2._comment b/doc/videos/git-annex_assistant_lan/comment_3_d43ee0a335c2f010b437cf28437455c2._comment new file mode 100644 index 000000000..39fb1aefc --- /dev/null +++ b/doc/videos/git-annex_assistant_lan/comment_3_d43ee0a335c2f010b437cf28437455c2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="Where is it registered?" + date="2014-06-11T11:27:02Z" + content=""" +I'm curious: how do you register it? Does it only work on Linux? (I've had to add paths to my setup under OS X, so it would be great if there was such a simpler way.) +"""]] diff --git a/doc/videos/git-annex_assistant_lan/comment_4_c710e27db41311b157d8caaafc32dc7e._comment b/doc/videos/git-annex_assistant_lan/comment_4_c710e27db41311b157d8caaafc32dc7e._comment new file mode 100644 index 000000000..1035f6348 --- /dev/null +++ b/doc/videos/git-annex_assistant_lan/comment_4_c710e27db41311b157d8caaafc32dc7e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2014-06-11T19:56:49Z" + content=""" +Running git-annex will also register it on OSX. The registration just consists of making a ~/.ssh/git-annex-shell that runs the real git-annex-shell. The assistant detects when it needs to use that wrapper when setting up a repository. +"""]] diff --git a/doc/videos/git-annex_assistant_remote_sharing.mdwn b/doc/videos/git-annex_assistant_remote_sharing.mdwn new file mode 100644 index 000000000..6d9a97e8e --- /dev/null +++ b/doc/videos/git-annex_assistant_remote_sharing.mdwn @@ -0,0 +1,6 @@ +
+A 6 minute screencast +showing how to share files between your computers in different locations, +such as home and work. diff --git a/doc/videos/git-annex_assistant_sync_demo.mdwn b/doc/videos/git-annex_assistant_sync_demo.mdwn new file mode 100644 index 000000000..2df2a3a91 --- /dev/null +++ b/doc/videos/git-annex_assistant_sync_demo.mdwn @@ -0,0 +1,8 @@ +A screencast demoing the git-annex assistant syncing between Nicaragua +and the United Kingdom for the first time. + + + +[video](http://joeyh.name/screencasts/git-annex-assistant.ogg) + +[[!meta date="Thu Jul 5 16:36:06 2012 -0600"]] diff --git a/doc/videos/git-annex_views_demo.mdwn b/doc/videos/git-annex_views_demo.mdwn new file mode 100644 index 000000000..c860129fd --- /dev/null +++ b/doc/videos/git-annex_views_demo.mdwn @@ -0,0 +1,11 @@ +A quick screencast demoing an experimental new feature, +[[tips/metadata_driven_views]]. + + + +[video](https://downloads.kitenet.net/videos/git-annex/git-annex_views_demo.ogg) + +Credits: + +* RichiH for +* Michi for keyboard cat cameo diff --git a/doc/videos/git-annex_watch_demo.mdwn b/doc/videos/git-annex_watch_demo.mdwn new file mode 100644 index 000000000..3909f73b5 --- /dev/null +++ b/doc/videos/git-annex_watch_demo.mdwn @@ -0,0 +1,7 @@ +A quick screencast demoing the `git annex watch` daemon. + + + +[video](http://joeyh.name/screencasts/git-annex-watch.ogg) + +[[!meta date="Mon Jun 11 16:02:14 2012 -0400"]] diff --git a/doc/videos/git-annex_weppapp_demo.mdwn b/doc/videos/git-annex_weppapp_demo.mdwn new file mode 100644 index 000000000..b982d32fd --- /dev/null +++ b/doc/videos/git-annex_weppapp_demo.mdwn @@ -0,0 +1,8 @@ +A quick screencast demoing the early `git annex webapp` and +automatic USB drive mount detection and syncing. + + + +[video](http://joeyh.name/screencasts/git-annex-webapp.ogg) + +[[!meta date="Sun Jul 29 14:41:41 2012 -0400"]] diff --git a/doc/walkthrough.mdwn b/doc/walkthrough.mdwn new file mode 100644 index 000000000..94c31e477 --- /dev/null +++ b/doc/walkthrough.mdwn @@ -0,0 +1,26 @@ +A walkthrough of the basic features of git-annex. + +[[!toc]] + +[[!inline feeds=no trail=yes show=0 template=walkthrough pagenames=""" + walkthrough/creating_a_repository + walkthrough/adding_a_remote + walkthrough/adding_files + walkthrough/renaming_files + walkthrough/getting_file_content + walkthrough/syncing + walkthrough/transferring_files:_When_things_go_wrong + walkthrough/removing_files + walkthrough/removing_files:_When_things_go_wrong + walkthrough/modifying_annexed_files + walkthrough/using_ssh_remotes + walkthrough/moving_file_content_between_repositories + walkthrough/quiet_please:_When_git-annex_seems_to_skip_files + walkthrough/using_tags_and_branches + walkthrough/unused_data + walkthrough/fsck:_verifying_your_data + walkthrough/fsck:_when_things_go_wrong + walkthrough/backups + walkthrough/automatically_managing_content + walkthrough/more +"""]] diff --git a/doc/walkthrough/adding_a_remote.mdwn b/doc/walkthrough/adding_a_remote.mdwn new file mode 100644 index 000000000..97690dfcd --- /dev/null +++ b/doc/walkthrough/adding_a_remote.mdwn @@ -0,0 +1,19 @@ +Like any other git repository, git-annex repositories have remotes. +Let's start by adding a USB drive as a remote. + + # sudo mount /media/usb + # cd /media/usb + # git clone ~/annex + # cd annex + # git annex init "portable USB drive" + # git remote add laptop ~/annex + # cd ~/annex + # git remote add usbdrive /media/usb/annex + +This is all standard ad-hoc distributed git repository setup. +The only git-annex specific part is telling it the name +of the new repository created on the USB drive. + +Notice that both repos are set up as remotes of one another. This lets +either get annexed files from the other. You'll want to do that even +if you are using git in a more centralized fashion. diff --git a/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment b/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment new file mode 100644 index 000000000..4b0b9c0fd --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-19T01:18:49Z" + content=""" +After doing the above with two required copy per file, `git annex fsck` complained that I had only one copy per file even though I had created my clone, already. Once I `git pull`ed from the second repo, not getting any changes for obvious reasons, `git annex fsck` was happy. So I am not sure how my addition was incorrect. -- RichiH +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment b/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment new file mode 100644 index 000000000..015417a4f --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-19T15:35:38Z" + content=""" +Yes, you have to pull down location tracking information in order for fsck to be satisfied in that situation. But since this is a walkthrough, and neither fsck or numcopies settings are mentioned until later, it's ok for this pull to be described a few steps along in [[getting file content]]. + +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment b/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment new file mode 100644 index 000000000..9280f2dcc --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="comment 3" + date="2011-04-02T20:24:33Z" + content=""" + * why the `git remote add laptop ~/annex` ? this remote already exists under the name origin. + * doesn't the last command need to be `git remote add usbdrive /media/usb/annex`? because the actual repo would be in /media/usb/annex, not /media/usb? +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment b/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment new file mode 100644 index 000000000..b4dcb6422 --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-04-03T02:32:17Z" + content=""" +Good spotting on the last line, fixed. + +The laptop remote is indeed redundant, but it leads to clearer views of what is going on later in the walkthrough (\"git pull laptop master\", \"(copying from laptop...)\"). And if the original clone is made from a central bare repo, this reinforces that you'll want to set up remotes for other repos on the computer. +"""]] diff --git a/doc/walkthrough/adding_files.mdwn b/doc/walkthrough/adding_files.mdwn new file mode 100644 index 000000000..b014c3ee7 --- /dev/null +++ b/doc/walkthrough/adding_files.mdwn @@ -0,0 +1,12 @@ + # cd ~/annex + # cp /tmp/big_file . + # cp /tmp/debian.iso . + # git annex add . + add big_file (checksum...) ok + add debian.iso (checksum...) ok + # git commit -a -m added + +When you add a file to the annex and commit it, only a symlink to +the content is committed to git. The content itself is stored in +git-annex's backend, `.git/annex/` (or in [[direct_mode]] the file +is left as-is). diff --git a/doc/walkthrough/automatically_managing_content.mdwn b/doc/walkthrough/automatically_managing_content.mdwn new file mode 100644 index 000000000..ec55c1cc8 --- /dev/null +++ b/doc/walkthrough/automatically_managing_content.mdwn @@ -0,0 +1,45 @@ +Once you have multiple repositories, and have perhaps configured numcopies, +any given file can have many more copies than is needed, or perhaps fewer +than you would like. How to manage this? + +The whereis subcommand can be used to see how many copies of a file are known, +but then you have to decide what to get or drop. In this example, there +are perhaps not enough copies of the first file, and too many of the second +file. + + # cd /media/usbdrive + # git annex whereis + whereis my_cool_big_file (1 copy) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + whereis other_file (3 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here] + 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive + +What would be handy is some automated versions of get and drop, that only +gets a file if there are not yet enough copies of it, or only drops a file +if there are too many copies. Well, these exist, just use the --auto option. + + # git annex get --auto --numcopies=2 + get my_cool_big_file (from laptop...) ok + # git annex drop --auto --numcopies=2 + drop other_file ok + +With two quick commands, git-annex was able to decide for you how to +work toward having two copies of your files. + + # git annex whereis + whereis my_cool_big_file (2 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here] + whereis other_file (2 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive + +The --auto option can also be used with the copy command, +again this lets git-annex decide whether to actually copy content. + +The above shows how to use --auto to manage content based on the number +of copies. It's also possible to configure, on a per-repository basis, +which content is desired. Then --auto also takes that into account +see [[preferred_content]] for details. diff --git a/doc/walkthrough/backups.mdwn b/doc/walkthrough/backups.mdwn new file mode 100644 index 000000000..b51a88794 --- /dev/null +++ b/doc/walkthrough/backups.mdwn @@ -0,0 +1,27 @@ +git-annex can be configured to require more than one copy of a file exists, +as a simple backup for your data. This is controlled by the +numcopies setting, which defaults to 1 copy. Let's +change that to require 2 copies, and send a copy of every file +to a USB drive. + + # git annex numcopies 2 + # git annex copy . --to usbdrive + +Now when we try to `git annex drop` a file, it will verify that it +knows of 2 other repositories that have a copy before removing its +content from the current repository. + +The numcopies setting used above is the global default. +You can also vary the number of copies needed, depending on the file name. +So, if you want 3 copies of all your flac files, but only 1 copy of oggs: + + # echo "*.ogg annex.numcopies=1" >> .gitattributes + # echo "*.flac annex.numcopies=3" >> .gitattributes + +Or, you might want to make a directory for important stuff, and configure +it so anything put in there is backed up more thoroughly: + + # mkdir important_stuff + # echo "* annex.numcopies=3" > important_stuff/.gitattributes + +For more details about the numcopies setting, see [[copies]]. diff --git a/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment b/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment new file mode 100644 index 000000000..466b3d369 --- /dev/null +++ b/doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="madduck" + ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c" + subject="Warn while inconsistent" + date="2014-04-06T20:44:17Z" + content=""" +Sure, git-annex prevents me from dropping files unless there are numcopies around elsewhere, but shouldn't it also ensure that numcopies cannot be set unless that requirement is already met? + +Furthermore, shouldn't it ensure that when new files are added, they are automatically distributed to fulfill the requirement? +"""]] diff --git a/doc/walkthrough/creating_a_repository.mdwn b/doc/walkthrough/creating_a_repository.mdwn new file mode 100644 index 000000000..51ff1c72b --- /dev/null +++ b/doc/walkthrough/creating_a_repository.mdwn @@ -0,0 +1,6 @@ +This is very straightforward. Just tell it a description of the repository. + + # mkdir ~/annex + # cd ~/annex + # git init + # git annex init "my laptop" diff --git a/doc/walkthrough/fsck:_verifying_your_data.mdwn b/doc/walkthrough/fsck:_verifying_your_data.mdwn new file mode 100644 index 000000000..62e15b6fa --- /dev/null +++ b/doc/walkthrough/fsck:_verifying_your_data.mdwn @@ -0,0 +1,16 @@ +You can use the fsck subcommand to check for problems in your data. What +can be checked depends on the key-value [[backend|backends]] you've used +for the data. For example, when you use the SHA1 backend, fsck will verify +that the checksums of your files are good. Fsck also checks that the +[[numcopies|copies]] setting is satisfied for all files. + + # git annex fsck + fsck some_file (checksum...) ok + fsck my_cool_big_file (checksum...) ok + ... + +You can also specify the files to check. This is particularly useful if +you're using sha1 and don't want to spend a long time checksumming everything. + + # git annex fsck my_cool_big_file + fsck my_cool_big_file (checksum...) ok diff --git a/doc/walkthrough/fsck:_when_things_go_wrong.mdwn b/doc/walkthrough/fsck:_when_things_go_wrong.mdwn new file mode 100644 index 000000000..85d9f20fe --- /dev/null +++ b/doc/walkthrough/fsck:_when_things_go_wrong.mdwn @@ -0,0 +1,13 @@ +Fsck never deletes possibly bad data; instead it will be moved to +`.git/annex/bad/` for you to recover. Here is a sample of what fsck +might say about a badly messed up annex: + + # git annex fsck + fsck my_cool_big_file (checksum...) + git-annex: Bad file content; moved to .git/annex/bad/SHA1:7da006579dd64330eb2456001fd01948430572f2 + git-annex: ** No known copies exist of my_cool_big_file + failed + fsck important_file + git-annex: Only 1 of 2 copies exist. Run git annex get somewhere else to back it up. + failed + git-annex: 2 failed diff --git a/doc/walkthrough/getting_file_content.mdwn b/doc/walkthrough/getting_file_content.mdwn new file mode 100644 index 000000000..f92704ff3 --- /dev/null +++ b/doc/walkthrough/getting_file_content.mdwn @@ -0,0 +1,12 @@ +A repository does not always have all annexed file contents available. +When you need the content of a file, you can use "git annex get" to +make it available. + +We can use this to copy everything in the laptop's annex to the +USB drive. + + # cd /media/usb/annex + # git annex sync laptop + # git annex get . + get my_cool_big_file (from laptop...) ok + get iso/debian.iso (from laptop...) ok diff --git a/doc/walkthrough/modifying_annexed_files.mdwn b/doc/walkthrough/modifying_annexed_files.mdwn new file mode 100644 index 000000000..693eae944 --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files.mdwn @@ -0,0 +1,44 @@ +Normally, the content of files in the annex is prevented from being modified. +(Unless your repository is using [[direct_mode]].) + +That's a good thing, because it might be the only copy, you wouldn't +want to lose it in a fumblefingered mistake. + + # echo oops > my_cool_big_file + bash: my_cool_big_file: Permission denied + +In order to modify a file, it should first be unlocked. + + # git annex unlock my_cool_big_file + unlock my_cool_big_file (copying...) ok + +That replaces the symlink that normally points at its content with a copy +of the content. You can then modify the file like any regular file. Because +it is a regular file. + +(If you decide you don't need to modify the file after all, or want to discard +modifications, just use `git annex lock`.) + +When you `git commit`, git-annex's pre-commit hook will automatically +notice that you are committing an unlocked file, and add its new content +to the annex. The file will be replaced with a symlink to the new content, +and this symlink is what gets committed to git in the end. + + # echo "now smaller, but even cooler" > my_cool_big_file + # git commit my_cool_big_file -m "changed an annexed file" + add my_cool_big_file ok + [master 64cda67] changed an annexed file + 1 files changed, 1 insertions(+), 1 deletions(-) + +There is one problem with using `git commit` like this: Git wants to first +stage the entire contents of the file in its index. That can be slow for +big files (sorta why git-annex exists in the first place). So, the +automatic handling on commit is a nice safety feature, since it prevents +the file content being accidentally committed into git. But when working with +big files, it's faster to explicitly add them to the annex yourself +before committing. + + # echo "now smaller, but even cooler yet" > my_cool_big_file + # git annex add my_cool_big_file + add my_cool_big_file ok + # git commit my_cool_big_file -m "changed an annexed file" diff --git a/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment b/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment new file mode 100644 index 000000000..5fc26496e --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="sorta why git-annex exists in the first place -- not only the slow index " + date="2012-09-25T22:04:01Z" + content=""" +> Git wants to first stage the entire contents of the file in its index. That can be slow for big files (sorta why git-annex exists in the first place) + +I think that git-annex's usefulness is not only because of the Git's index overhead: I like its idea because it will help track the copies in the \"[[special remotes]]\", which are not Git because + +* they are either not under my control (e.g., web URLs), +* or because it's not convenient to hold a Git repo there (an external disk/DVD with files can be viewed easily by a human, but imposing a Git repo structure on it would either at least double the consume space: for the history of the commits and for the working dir, or make it \"unreadable\" for a human, if it is a bare repo); +* or because it's nearly impossible to put a Git repo on a storage like peer networks without special tools. +"""]] diff --git a/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment b/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment new file mode 100644 index 000000000..6a2d2c2a6 --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="feature request: unlock --drop" + date="2013-05-30T20:26:52Z" + content=""" +ATM unlock copies original file for modifications, so that original copy remains under annex and possibly to-be-edited copy created. +But if I am \"unlock\"ing file I might simply not be interested in a previous copy and want to maintain only a single (possibly edited) new copy. +What if there was a mode where the actual file is simply moved into \"unlocked\" location for editing, thus effectively dropping the actual content from git annex. That would allow to not inquire lengthy copying/wasting local space. If then I would need a previous copy I would just \"get\" it again. +"""]] diff --git a/doc/walkthrough/more.mdwn b/doc/walkthrough/more.mdwn new file mode 100644 index 000000000..0a4a5b94e --- /dev/null +++ b/doc/walkthrough/more.mdwn @@ -0,0 +1,3 @@ +So ends the walkthrough. By now you should be able to use git-annex. + +Want more? See [[tips]] for lots more features and advice. diff --git a/doc/walkthrough/moving_file_content_between_repositories.mdwn b/doc/walkthrough/moving_file_content_between_repositories.mdwn new file mode 100644 index 000000000..3ffcc1175 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories.mdwn @@ -0,0 +1,13 @@ +Often you will want to move some file contents from a repository to some +other one. For example, your laptop's disk is getting full; time to move +some files to an external disk before moving another file from a file +server to your laptop. Doing that by hand (by using `git annex get` and +`git annex drop`) is possible, but a bit of a pain. `git annex move` +makes it very easy. + + # git annex move my_cool_big_file --to usbdrive + move my_cool_big_file (to usbdrive...) ok + # git annex move video/hackity_hack_and_kaxxt.mov --from fileserver + move video/hackity_hack_and_kaxxt.mov (from fileserver...) + SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 82MB 199.1KB/s 07:02 + ok diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment new file mode 100644 index 000000000..b3dc8fe7a --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-22T23:41:51Z" + content=""" +I may be missing something obvious, but when I copy to a remote repository, the object files are created, but no softlinks are created. When I pull everything from the remote, it pulls only files the local repo knows about already. + + A + / \ + B C + +Moving from B to A creates no symlinks in A but the object files are moved to A. Copying back from A to B restores the object files in B and keeps them in A. + +Copying from A to an empty C does not create any object files nor symlinks. Copying from C to A creates no symlinks in A but the object files are copied to A. + +-- RichiH + +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment new file mode 100644 index 000000000..a6f8e9cf9 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-23T00:38:10Z" + content=""" +`git annex move` only moves content. All symlink management is handled by git, so you have to keep repositories in sync using git as you would any other repo. When you `git pull B` in A, it will get whatever symlinks were added to B. + +(It can be useful to use a central bare repo and avoid needing to git pull from one repo to another, then you can just always push commits to the central repo, and pull down all changes from other repos.) +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment new file mode 100644 index 000000000..9a128f1ed --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-03-23T02:07:49Z" + content=""" +Ah yes, I feel kinda stupid in hindsight. + +As the central server is most likely a common use case, would you object if I added that to the walkthrough? If you have any best practices on how to automate a push with every copy to a bare remote? AFAIK, git does not store information about bare/non-bare remotes, but this could easily be put into .git/config by git annex. + +-- RichiH +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment new file mode 100644 index 000000000..8b4d9a053 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-03-23T15:28:00Z" + content=""" +I would not mind if the walkthrough documented the central git repo case. But I don't want to complicate it unduely (it's long enough), and it's important that the fully distributed case be shown to work, and I assume that people already have basic git knowledge, so documenting the details of set up of a bare git repo is sorta out of scope. (There are also a lot of way to do it, using github, or gitosis, or raw git, etc.) +"""]] diff --git a/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn b/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn new file mode 100644 index 000000000..188ca634b --- /dev/null +++ b/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn @@ -0,0 +1,27 @@ +One behavior of git-annex is sometimes confusing at first, but it turns out +to be useful once you get to know it. + + # git annex drop * + # + +Why didn't git-annex seem to do anything despite being asked to drop all the +files? Because it checked them all, and none of them are present. + +Most git-annex commands will behave this way when they're able to quickly +check that nothing needs to be done about a file. + +Running a git-annex command without specifying any file name will +make git-annex look for files in the current directory and its +subdirectories. So, we can add all new files to the annex easily: + + # echo hi > subdir/subsubdir/newfile + # git annex add + add subdir/subsubdir/newfile ok + +When doing this kind of thing, having nothing shown for files +that it doesn't need to act on is useful because it prevents swamping +you with output. You only see the files it finds it does need to act on. + +So remember: If git-annex seems to not do anything when you tell it to, it's +not being lazy -- It's checked that nothing needs to be done to get to the +state you asked for! diff --git a/doc/walkthrough/removing_files.mdwn b/doc/walkthrough/removing_files.mdwn new file mode 100644 index 000000000..9b85d9c3b --- /dev/null +++ b/doc/walkthrough/removing_files.mdwn @@ -0,0 +1,17 @@ +When you're using git-annex you can `git rm` a file just like you usually +would with git. Just like with git, this removes the file from your work +tree, but it does not remove the file's content from the git repository. +If you check the file back out, or revert the removal, you can get it back. + +Git-annex adds the ability to remove the content of a file from your local +repository to save space. This is called "dropping" the file. + +You can always drop files safely. Git-annex checks that some other +repository still has the file before removing it. + + # git annex drop iso/debian.iso + drop iso/Debian_5.0.iso ok + +Once dropped, the file will still appear in your work tree as a broken symlink. +You can use `git annex get` to as usual to get this file back to your local +repository. diff --git a/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment b/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment new file mode 100644 index 000000000..1c8719cec --- /dev/null +++ b/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="DavidEdmondson" + subject="Is it necessary to commit after the 'drop'?" + date="2011-09-05T15:43:25Z" + content=""" +In fact is it possible? Nothing changed as far as git is concerned. + +"""]] diff --git a/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment b/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment new file mode 100644 index 000000000..f5fb8dc7f --- /dev/null +++ b/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-09-05T15:59:27Z" + content=""" +Good catch. It used to be necessary before there was a git-annex branch, but not now. +"""]] diff --git a/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn b/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn new file mode 100644 index 000000000..ccd2d197f --- /dev/null +++ b/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn @@ -0,0 +1,24 @@ +Before dropping a file, git-annex wants to be able to look at other +remotes, and verify that they still have a file. After all, it could +have been dropped from them too. If the remotes are not mounted/available, +you'll see something like this. + + # git annex drop important_file other.iso + drop important_file (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + Unable to access these remotes: usbdrive + Try making some of these repositories available: + 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive + ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive + (Use --force to override this check, or adjust numcopies.) + failed + drop other.iso (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + No other repository is known to contain the file. + (Use --force to override this check, or adjust numcopies.) + failed + +Here you might --force it to drop `important_file` if you [[trust]] your backup. +But `other.iso` looks to have never been copied to anywhere else, so if +it's something you want to hold onto, you'd need to transfer it to +some other repository before dropping it. diff --git a/doc/walkthrough/renaming_files.mdwn b/doc/walkthrough/renaming_files.mdwn new file mode 100644 index 000000000..85964d1ea --- /dev/null +++ b/doc/walkthrough/renaming_files.mdwn @@ -0,0 +1,13 @@ + # cd ~/annex + # git mv big_file my_cool_big_file + # mkdir iso + # git mv debian.iso iso/ + # git commit -m moved + +You can use any normal git operations to move files around, or even +make copies or delete them. + +Notice that, since annexed files are represented by symlinks, +the symlink will break when the file is moved into a subdirectory. +But, git-annex will fix this up for you when you commit -- +it has a pre-commit hook that watches for and corrects broken symlinks. diff --git a/doc/walkthrough/syncing.mdwn b/doc/walkthrough/syncing.mdwn new file mode 100644 index 000000000..57fe47db0 --- /dev/null +++ b/doc/walkthrough/syncing.mdwn @@ -0,0 +1,27 @@ +Notice that in the [[previous example|getting_file_content]], `git annex +sync` was used. This lets git-annex know what has changed in the other +repositories like the laptop, and so it knows about the files present there and can +get them. + +Let's look at what the sync command does in more detail: + + # cd /media/usb/annex + # git annex sync + commit + nothing to commit (working directory clean) + ok + pull laptop + ok + push laptop + ok + +After you run sync, the git repository will be updated with all changes +made to its remotes, and any changes in the git repository will be pushed +out to its remotes, where a sync will get them. This is especially useful +when using git in a distributed fashion, without a [[central bare +repository|tips/centralized_git_repository_tutorial]]. See [[sync]] for +details. + +By default `git annex sync` only syncs the metadata about your +files that is stored in git. It does not sync the contents of files, that +are managed by git-annex. To do that, you can use `git annex sync --content` diff --git a/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn b/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn new file mode 100644 index 000000000..cfb70aaf9 --- /dev/null +++ b/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn @@ -0,0 +1,17 @@ +After a while, you'll have several annexes, with different file contents. +You don't have to try to keep all that straight; git-annex does +[[location_tracking]] for you. If you ask it to get a file and the drive +or file server is not accessible, it will let you know what it needs to get +it: + + # git annex get video/hackity_hack_and_kaxxt.mov + get video/_why_hackity_hack_and_kaxxt.mov (not available) + Unable to access these remotes: usbdrive, server + Try making some of these repositories available: + 5863d8c0-d9a9-11df-adb2-af51e6559a49 -- my home file server + 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive + ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive + failed + # sudo mount /media/usb + # git annex get video/hackity_hack_and_kaxxt.mov + get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok diff --git a/doc/walkthrough/unused_data.mdwn b/doc/walkthrough/unused_data.mdwn new file mode 100644 index 000000000..1d655b89a --- /dev/null +++ b/doc/walkthrough/unused_data.mdwn @@ -0,0 +1,35 @@ +It's possible for data to accumulate in the annex that no files in any +branch point to anymore. One way it can happen is if you `git rm` a file +without first calling `git annex drop`. And, when you modify an annexed +file, the old content of the file remains in the annex. Another way is when +migrating between key-value [[backends]]. + +This might be historical data you want to preserve, so git-annex defaults to +preserving it. So from time to time, you may want to check for such data: + + # git annex unused + unused . (checking for unused data...) + Some annexed data is no longer used by any files in the repository. + NUMBER KEY + 1 SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e + 2 SHA1-s14--f1358ec1873d57350e3dc62054dc232bc93c2bd1 + (To see where data was previously used, try: git log --stat -S'KEY') + (To remove unwanted data: git-annex dropunused NUMBER) + ok + +After running `git annex unused`, you can follow the instructions to examine +the history of files that used the data, and if you decide you don't need that +data anymore, you can easily remove it from your local repository. + + # git annex dropunused 1 + dropunused 1 ok + +Hint: To drop a lot of unused data, use a command like this: + + # git annex dropunused 1-1000 + +Rather than removing the data, you can instead send it to other +repositories: + + # git annex copy --unused --to backup + # git annex move --unused --to archive diff --git a/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment b/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment new file mode 100644 index 000000000..2be2a6463 --- /dev/null +++ b/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="finding data that isn't unused, but should be." + date="2012-10-17T20:32:11Z" + content=""" +Sometimes links to annexed data still exists on some branch, when it was supposed to be dropped. Here is how I found these; perhaps there is a simpler way. + + % git annex find --format '${key}\n' | sort > /tmp/known-keys + % find .git/annex/objects -type f -exec basename {} \; | sort > /tmp/local-keys + % comm -23 /tmp/local-keys /tmp/known-keys + +to look for what branch these are on, try + + % git log --stat --all -S$key + +for one of the keys output above. In my case it was the same remote branch keeping them all alive. + + +*EDIT* sort key lists to make comm work properly + +"""]] diff --git a/doc/walkthrough/using_bup.mdwn b/doc/walkthrough/using_bup.mdwn new file mode 100644 index 000000000..3a6a8776a --- /dev/null +++ b/doc/walkthrough/using_bup.mdwn @@ -0,0 +1,37 @@ +Another [[special_remote|special_remotes]] that git-annex can use is +a [[special_remotes/bup]] repository. Bup stores large file contents +in a git repository of its own, with deduplication. Combined with +git-annex, you can have git on both the frontend and the backend. + +Here's how to create a bup remote, and describe it. + +[[!template id=note text=""" +Instead of specifying a remote system, you could choose to make a bup +remote that is only accessible on the current system, by passing +"buprepo=/big/mybup". +"""]] + + # git annex initremote mybup type=bup encryption=none buprepo=example.com:/big/mybup + initremote bup (bup init) + Initialized empty Git repository in /big/mybup/ + ok + # git annex describe mybup "my bup repository at example.com" + describe mybup ok + +Now the remote can be used like any other remote. + + # git annex move my_cool_big_file --to mybup + move my_cool_big_file (to mybup...) + Receiving index from server: 1100/1100, done. + ok + +Note that, unlike other remotes, bup does not really support removing +content from its git repositories. This is a feature. :) + + # git annex move my_cool_big_file --from mybup + move my_cool_big_file (from mybup...) + content cannot be removed from bup remote + failed + git-annex: 1 failed + +See [[special_remotes/bup]] for details. diff --git a/doc/walkthrough/using_ddar.mdwn b/doc/walkthrough/using_ddar.mdwn new file mode 100644 index 000000000..50f9eedde --- /dev/null +++ b/doc/walkthrough/using_ddar.mdwn @@ -0,0 +1,32 @@ +Another [[special_remote|special_remotes]] that git-annex can use is +a [[special_remotes/ddar]] repository. ddar stores large file contents +in a directory structure of its own, with deduplication. For remote +repositories, ddar requires that ssh is available on the remote, with ddar also +installed remotely. When copying files to the remote, ddar only needs to send +over the network the parts of the files that are not already present remotely. + +Unlike bup, ddar uses its own storage format, which allows for both creation +and deletion of de-deduplicated files. + +Here's how to create a ddar remote, and describe it. + +[[!template id=note text=""" +Instead of specifying a remote system, you could choose to make a ddar +remote that is only accessible on the current system, by passing +"ddarrepo=/big/myddar". +"""]] + + # git annex initremote myddar type=ddar encryption=none ddarrepo=example.com:/big/myddar + initremote ddar (ddar init) + Initialized empty Git repository in /big/myddar/ + ok + # git annex describe myddar "my ddar repository at example.com" + describe myddar ok + +Now the remote can be used like any other remote. + + # git annex move my_cool_big_file --to myddar + move my_cool_big_file (to myddar...) + ok + +See [[special_remotes/ddar]] for details. diff --git a/doc/walkthrough/using_ssh_remotes.mdwn b/doc/walkthrough/using_ssh_remotes.mdwn new file mode 100644 index 000000000..1dc8fa55b --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes.mdwn @@ -0,0 +1,33 @@ +So far in this walkthrough, git-annex has been used with a remote +repository on a USB drive. But it can also be used with a git remote +that is truly remote, a host accessed by ssh. + +Say you have a desktop on the same network as your laptop and want +to clone the laptop's annex to it: + + # git clone ssh://mylaptop/home/me/annex ~/annex + # cd ~/annex + # git annex init "my desktop" + +Now you can get files and they will be transferred (using `rsync` via `ssh`): + + # git annex get my_cool_big_file + get my_cool_big_file (getting UUID for origin...) (from origin...) + SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 2159 2.1KB/s 00:00 + ok + +When you drop files, git-annex will ssh over to the remote and make +sure the file's content is still there before removing it locally: + + # git annex drop my_cool_big_file + drop my_cool_big_file (checking origin..) ok + +Note that normally git-annex prefers to use non-ssh remotes, like +a USB drive, before ssh remotes. They are assumed to be faster/cheaper to +access, if available. There is a annex-cost setting you can configure in +`.git/config` to adjust which repositories it prefers. See +[[the_man_page|git-annex]] for details. + +Also, note that you need full shell access for this to work -- +git-annex needs to be able to ssh in and run commands. Or at least, +your shell needs to be able to run the [[git-annex-shell]] command. diff --git a/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment b/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment new file mode 100644 index 000000000..6cd9bb848 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla7u6eLKNYZ09Z7xwBffqLaXquMQC07fU" + nickname="Matthias" + subject="Hint for Debian/Ubuntu" + date="2012-11-07T13:10:15Z" + content=""" +In Debian/Ubuntu the default .bashrc returns immediately if the shell is non-interactive. Make sure to setup the PATH such that it is updated with the location of git-annex-shell before this check! This just cost me an hour of debugging as I didn't notice the return statement early on... +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment b/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment new file mode 100644 index 000000000..9768300dc --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniXLhO9mLn-7EDfawdENZ2fQwlGy5w_oc" + nickname="Michał" + subject="unrecognized command" + date="2013-03-12T06:32:56Z" + content=""" +Thanks Matthias, I fought with this as well, this was the tip I needed to move on. I'm using the Linux standalone, and I had 2 issues getting everything to work without getting git-annex-shell errors. + +1. The autoinstalled wrapper could not be found, I had to comment the \"Ubuntu exit\" line and add the $HOME/.ssh to path to get rid of \"command not found\" +2. Had to modify the wrapper by replacing the \"$SSH_ORIGINAL_COMMAND\" by \"$@\" to get rid of \"fatal: unrecognized command ''\" + + +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment b/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment new file mode 100644 index 000000000..28c3aa92d --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-03-12T11:15:11Z" + content=""" +@Michael, the standalone tarball is really meant to run the git-annex assistant. The first time \"git annex webapp\" is run, it will set up the ssh wrapper for you. + +I have updated the wrapper to work when ssh is not configured to force a key to run a command. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment b/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment new file mode 100644 index 000000000..8973978ad --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 2" + date="2012-05-27T20:53:05Z" + content=""" +When `git annex get` does nothing, it's because it doesn't know a place to get the file from. + +This can happen if the `git-annex` branch has not propigated from the place where the file was added. +For example, if on the laptop you had run `git pull ssh master`, that would only pull the master branch, not the git-annex branch. + +An easy way to ensure the git-annex branch is kept in sync is to run `git annex sync` +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment b/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment new file mode 100644 index 000000000..212140196 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="cannot get files" + date="2012-05-27T20:33:09Z" + content=""" +Hi, + +I could successfully clone my ssh repo's annex to my laptop, following these instructions. +I'm also able to sync the repositories (laptop and ssh) when I commit new files in the ssh repo. + +However, every time I try to get files from the ssh repo (using 'git annex get some_file'), nothing happens. +Do you know what can be happening? + +Thanks! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment b/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment new file mode 100644 index 000000000..75a133d84 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 3" + date="2012-05-27T21:13:50Z" + content=""" +Thanks for the quick replay! + +I already did 'git annex sync', but it didn't work. The steps were: 'git clone ssh...', then 'cd annex', then 'git annex init \"laptop\"' + +After that, I did a 'git annex sync', and tried to get the file, but nothing happens. That's why I found it weird. +Any other thing that might have happened? + +Thanks again! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment b/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment new file mode 100644 index 000000000..3df03abc2 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 4" + date="2012-05-27T21:33:11Z" + content=""" +Try running `git annex whereis` on the file and see where it says it is. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment b/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment new file mode 100644 index 000000000..703b89ebf --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 5" + date="2012-05-27T21:42:56Z" + content=""" +Hi, + +I guess the problem is with git-annex-shell. I tried to do 'git annex get file --from name_ssh_repo', and I got the following: + +bash: git-annex-shell: command not found; failed; exit code 127 + +The same thing happens if I try to do 'git annex whereis' + +git-annex-shell is indeed installed. How can I make my shell recognize this command? + +Thanks a lot! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment b/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment new file mode 100644 index 000000000..4d5961ca9 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 6" + date="2012-05-27T22:08:50Z" + content=""" +git-annex-shell needs to be installed in the `PATH` on any host that will hold annexed files. + +If you installed with cabal, it might be `.cabal/bin/`. Whereever it was installed to is apparently not on the PATH that is set when you ssh into that host. + + +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment b/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment new file mode 100644 index 000000000..700b170ad --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 7" + date="2012-05-27T23:35:17Z" + content=""" +Hi, + +It was already installed in PATH. In fact, I can call it from the command line, and it is recognized (e.g. calling 'git-annex-shell' gives me 'git-annex-shell: bad parameters'). However, every time I do a 'git annex whereis' or 'git annex get file --from repo', it gives me the following error: + +bash: git-annex-shell: command not found +Command ssh [\"-S\",\"/Users/username/annex/.git/annex/ssh/username@example.edu\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"username@example.edu\",\"git-annex-shell 'configlist' '/~/annex'\"] failed; exit code 127 + +I tried to run this ssh command, but it gives me the same 'command not found' error. It seems that the problem is with the ssh repo? +The ssh repo has a git-annex-shell working and installed in PATH. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment b/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment new file mode 100644 index 000000000..148f016db --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmB-gCGEs--zfmvYU-__Hj2FbliUXgxMDs" + nickname="Jakub" + subject="Path problems" + date="2012-07-13T19:15:15Z" + content=""" +Hi, + +I have a same 'git-annex-shell command not found' problem as above. I've installed git annex via cabal into my ~/.haskell_bin directory. Then I've added this dir both to ~/.bashrc and ~/.zshrc. I can run git annex or 'git annex-shell' and everything is fine. My guess is that haskell is trying to spawn git-annex-shell with some current $PATH unaware shell like dash maybe? + +I've fixed this behavior by using a really ugly hack - I've symlinked ~/.haskell_bin/git-annex-shell to /usr/bin/git-annex-shell on all my machines and the problem is gone. Somehow haskell (or whatever is trying to call git-annex-shell) is unaware of path modifications from .bashrc/.zshrc + +Here is the path modification I've used: + +export PATH=~/.haskell_bin:$PATH +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment b/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment new file mode 100644 index 000000000..ddb96da36 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmB-gCGEs--zfmvYU-__Hj2FbliUXgxMDs" + nickname="Jakub" + subject="Fixed" + date="2012-07-13T19:27:46Z" + content=""" +Found the problem: + +One should never use ~ in such path: + +WRONG export PATH=~/somedir:$PATH + +Instead one should use $HOME: + +GOOD export PATH=$HOME/somedir:$PATH + +Can I surpress the message that shell failed with status 255 when a repo is unavailible? I've got two repos pointing to one machine - either via vpn or local lan and I keep getting erros if one is unavailible: + +ssh: connect to host 10.9.0.1 port 39882: No route to host +Command ssh [\"-S\",\"/home/pielgrzym/annex/.git/annex/ssh/nas\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"nas\",\"git-annex-shell 'configlist' '/~/annex'\"] failed; exit code 255 + + +"""]] diff --git a/doc/walkthrough/using_tags_and_branches.mdwn b/doc/walkthrough/using_tags_and_branches.mdwn new file mode 100644 index 000000000..b147ea466 --- /dev/null +++ b/doc/walkthrough/using_tags_and_branches.mdwn @@ -0,0 +1,14 @@ +Like git, git-annex hangs on to every old version of a file (by default), +so you can make tags and branches, and can check them out later to look at +the old files. + + # git tag 1.0 + # rm -f my_cool_big_file + # git commit -m deleted + # git checkout 1.0 + # cat my_cool_big_file + yay! old version still here + +Of course, when you `git checkout` an old branch, some old versions of +files may not be locally available, and may be stored in some other +repository. You can use `git annex get` to get them as usual. diff --git a/ghci b/ghci new file mode 100755 index 000000000..206bbbc7a --- /dev/null +++ b/ghci @@ -0,0 +1,4 @@ +#!/bin/sh +# ghci using objects built by cabal +make dist/caballog +$(grep 'ghc --make' dist/caballog | head -n 1 | perl -pe 's/--make/--interactive/; s/.\/[^\.\s]+.hs//; s/-package-id [^\s]+//g; s/-hide-all-packages//; s/-threaded//; s/-O//') $@ diff --git a/git-annex.cabal b/git-annex.cabal new file mode 100644 index 000000000..ba23d281e --- /dev/null +++ b/git-annex.cabal @@ -0,0 +1,232 @@ +Name: git-annex +Version: 5.20140717 +Cabal-Version: >= 1.8 +License: GPL-3 +Maintainer: Joey Hess +Author: Joey Hess +Stability: Stable +Copyright: 2010-2014 Joey Hess +License-File: COPYRIGHT +Extra-Source-Files: CHANGELOG +Homepage: http://git-annex.branchable.com/ +Build-type: Custom +Category: Utility +Synopsis: manage files with git, without checking their contents into git +Description: + git-annex allows managing files with git, without checking the file + contents into git. While that may seem paradoxical, it is useful when + dealing with files larger than git can currently easily handle, whether due + to limitations in memory, time, or disk space. + . + Even without file content tracking, being able to manage files with git, + move files around and delete files with versioned directory trees, and use + branches and distributed clones, are all very handy reasons to use git. And + annexed files can co-exist in the same git repository with regularly + versioned files, which is convenient for maintaining documents, Makefiles, + etc that are associated with annexed files but that benefit from full + revision control. + +Flag S3 + Description: Enable S3 support + +Flag WebDAV + Description: Enable WebDAV support + +Flag Inotify + Description: Enable inotify support + +Flag Dbus + Description: Enable dbus support + +Flag Assistant + Description: Enable git-annex assistant and watch command + +Flag Webapp + Description: Enable git-annex webapp + +Flag Webapp-secure + Description: Secure webapp + +Flag Pairing + Description: Enable pairing + +Flag XMPP + Description: Enable notifications using XMPP + +Flag DNS + Description: Enable the haskell DNS library for DNS lookup + +Flag Production + Description: Enable production build (slower build; faster binary) + +Flag Android + Description: Cross building for Android + Default: False + +Flag AndroidSplice + Description: Building to get TH splices for Android + Default: False + +Flag TestSuite + Description: Embed the test suite into git-annex + +Flag TDFA + Description: Use regex-tdfa for wildcards + +Flag Feed + Description: Enable podcast feed support + +Flag Quvi + Description: Enable use of quvi to download videos + +Flag Tahoe + Description: Enable the tahoe special remote + +Flag CryptoHash + Description: Enable use of cryptohash for checksumming + +Flag DesktopNotify + Description: Enable desktop environment notifications + +Flag EKG + Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/) + Default: False + +Executable git-annex + Main-Is: git-annex.hs + Build-Depends: MissingH, hslogger, directory, filepath, + containers, utf8-string, network (>= 2.0), mtl (>= 2), + bytestring, old-locale, time, HTTP, + extensible-exceptions, dataenc, SHA, process, json, + base (>= 4.5 && < 4.9), monad-control, exceptions (>= 0.5), + IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process, + SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3), + data-default, case-insensitive + CC-Options: -Wall + GHC-Options: -Wall + Extensions: PackageImports + -- Some things don't work with the non-threaded RTS. + GHC-Options: -threaded + + if flag(Production) + GHC-Options: -O2 + + if (os(windows)) + Build-Depends: Win32, Win32-extras + C-Sources: Utility/winprocess.c + else + Build-Depends: unix + -- Need to list these because they're generated from .hsc files. + Other-Modules: Utility.Touch Utility.Mounts + Include-Dirs: Utility + C-Sources: Utility/libdiskfree.c Utility/libmounts.c + CPP-Options: -DWITH_CLIBS + + if flag(TestSuite) + Build-Depends: tasty (>= 0.7), tasty-hunit, tasty-quickcheck, tasty-rerun, + optparse-applicative + CPP-Options: -DWITH_TESTSUITE + + if flag(TDFA) + Build-Depends: regex-tdfa + CPP-Options: -DWITH_TDFA + else + Build-Depends: regex-compat + + if flag(CryptoHash) + Build-Depends: cryptohash (>= 0.10.0) + CPP-Options: -DWITH_CRYPTOHASH + + if flag(S3) + Build-Depends: hS3 + CPP-Options: -DWITH_S3 + + if flag(WebDAV) + Build-Depends: DAV ((>= 0.3 && < 0.6) || > 0.6), + http-client, http-conduit, http-types, lifted-base + CPP-Options: -DWITH_WEBDAV + + if flag(Assistant) && ! os(solaris) + CPP-Options: -DWITH_ASSISTANT + + if flag(Assistant) + if os(linux) && flag(Inotify) + Build-Depends: hinotify + CPP-Options: -DWITH_INOTIFY + else + if os(darwin) + Build-Depends: hfsevents + CPP-Options: -DWITH_FSEVENTS + else + if os(windows) + Build-Depends: Win32-notify + CPP-Options: -DWITH_WIN32NOTIFY + else + if (! os(solaris) && ! os(linux)) + if flag(Android) + Build-Depends: hinotify + CPP-Options: -DWITH_INOTIFY + else + CPP-Options: -DWITH_KQUEUE + C-Sources: Utility/libkqueue.c + + if (os(linux)) + if flag(Dbus) + Build-Depends: dbus (>= 0.10.3) + CPP-Options: -DWITH_DBUS + + if flag(DesktopNotify) + if flag(Dbus) + Build-Depends: dbus (>= 0.10.3), fdo-notify (>= 0.3) + CPP-Options: -DWITH_DESKTOP_NOTIFY -DWITH_DBUS_NOTIFICATIONS + + if flag(Android) + Build-Depends: data-endian + CPP-Options: -D__ANDROID__ -DANDROID_SPLICES -D__NO_TH__ + if flag(AndroidSplice) + CPP-Options: -DANDROID_SPLICES + + if flag(Webapp) + Build-Depends: + yesod, yesod-default, yesod-static, yesod-form, yesod-core, + http-types, transformers, wai, wai-extra, warp, warp-tls, + blaze-builder, crypto-api, hamlet, clientsession, + template-haskell, data-default, aeson, path-pieces, + shakespeare + CPP-Options: -DWITH_WEBAPP + if flag(Webapp) && flag (Webapp-secure) + Build-Depends: warp-tls (>= 1.4), securemem, byteable + CPP-Options: -DWITH_WEBAPP_SECURE + + if flag(Pairing) + Build-Depends: network-multicast, network-info + CPP-Options: -DWITH_PAIRING + + if flag(XMPP) && (! os(windows)) + Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4), xml-types + CPP-Options: -DWITH_XMPP + + if flag(DNS) + Build-Depends: dns + CPP-Options: -DWITH_DNS + + if flag(Feed) + Build-Depends: feed + CPP-Options: -DWITH_FEED + + if flag(Quvi) + Build-Depends: aeson + CPP-Options: -DWITH_QUVI + + if flag(Tahoe) + Build-Depends: aeson + CPP-Options: -DWITH_TAHOE + + if flag(EKG) + Build-Depends: ekg + GHC-Options: -with-rtsopts=-T + CPP-Options: -DWITH_EKG + +source-repository head + type: git + location: git://git-annex.branchable.com/ diff --git a/git-annex.hs b/git-annex.hs new file mode 100644 index 000000000..f1af0eea5 --- /dev/null +++ b/git-annex.hs @@ -0,0 +1,85 @@ +{- git-annex main program dispatch + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +import System.Environment (getArgs, getProgName) +import System.FilePath + +import qualified CmdLine.GitAnnex +import qualified CmdLine.GitAnnexShell +#ifdef WITH_TESTSUITE +import qualified Test +#endif + +#ifdef mingw32_HOST_OS +import Utility.UserInfo +import Utility.Env +import Config.Files +import System.Process +import System.Exit +#endif + +main :: IO () +main = do + ps <- getArgs + run ps =<< getProgName + where + run ps n + | isshell n = CmdLine.GitAnnexShell.run ps + | otherwise = +#ifdef mingw32_HOST_OS + winEnv gitannex ps +#else + gitannex ps +#endif + gitannex ps = +#ifdef WITH_TESTSUITE + case ps of + ("test":ps') -> Test.main ps' + _ -> CmdLine.GitAnnex.run ps +#else + CmdLine.GitAnnex.run ps +#endif + isshell n = takeFileName n == "git-annex-shell" + +#ifdef mingw32_HOST_OS +{- On Windows, if HOME is not set, probe it and set it. + - This is a workaround for some Cygwin commands needing HOME to be set, + - and for there being no known way to set environment variables on + - Windows, except by passing an environment in each call to a program. + - While ugly, this workaround is easier than trying to ensure HOME is set + - in all calls to the affected programs. + - + - If TZ is set, unset it. + - TZ being set can interfere with workarounds for Windows timezone + - horribleness, and prevents getCurrentTimeZone from seeing the system + - time zone. + - + - Due to Windows limitations, have to re-exec git-annex with the new + - environment. + -} +winEnv :: ([String] -> IO ()) -> [String] -> IO () +winEnv a ps = do + e <- getEnvironment + home <- myHomeDir + let e' = wantedenv e home + if (e' /= e) + then do + cmd <- readProgramFile + (_, _, _, pid) <- createProcess (proc cmd ps) + { env = Just e' } + exitWith =<< waitForProcess pid + else a ps + where + wantedenv e home = delEntry "TZ" $ case lookup "HOME" e of + Nothing -> e + Just _ -> addEntries + [ ("HOME", home) + , ("CYGWIN", "nodosfilewarning") + ] e +#endif diff --git a/git-union-merge.hs b/git-union-merge.hs new file mode 100644 index 000000000..0e4cd644c --- /dev/null +++ b/git-union-merge.hs @@ -0,0 +1,48 @@ +{- git-union-merge program + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +import System.Environment + +import Common +import qualified Git.UnionMerge +import qualified Git.Config +import qualified Git.CurrentRepo +import qualified Git.Branch +import qualified Git.Index +import qualified Git + +header :: String +header = "Usage: git-union-merge ref ref newref" + +usage :: IO a +usage = error $ "bad parameters\n\n" ++ header + +tmpIndex :: Git.Repo -> FilePath +tmpIndex g = Git.localGitDir g "index.git-union-merge" + +setup :: Git.Repo -> IO () +setup = cleanup -- idempotency + +cleanup :: Git.Repo -> IO () +cleanup g = nukeFile $ tmpIndex g + +parseArgs :: IO [String] +parseArgs = do + args <- getArgs + if length args /= 3 + then usage + else return args + +main :: IO () +main = do + [aref, bref, newref] <- map Git.Ref <$> parseArgs + g <- Git.Config.read =<< Git.CurrentRepo.get + _ <- Git.Index.override $ tmpIndex g + setup g + Git.UnionMerge.merge aref bref g + _ <- Git.Branch.commit "union merge" newref [aref, bref] g + cleanup g diff --git a/standalone/android/Makefile b/standalone/android/Makefile new file mode 100644 index 000000000..4f64b4e9a --- /dev/null +++ b/standalone/android/Makefile @@ -0,0 +1,170 @@ +# Cross-compiles utilities needed for git-annex on Android, +# and builds the Android app. + +# Add Android cross-compiler to PATH (as installed by ghc-android) +ANDROID_CROSS_COMPILER?=$(HOME)/.ghc/$(shell cat abiversion)/bin +PATH:=$(ANDROID_CROSS_COMPILER):$(PATH) + +# Paths to the Android SDK and NDK. +export ANDROID_SDK_ROOT?=$(HOME)/.android/adt-bundle-linux-x86/sdk +export ANDROID_NDK_ROOT?=$(HOME)/.android/android-ndk + +# Where to store the source tree used to build utilities. This +# directory will be created by `make source`. +GIT_ANNEX_ANDROID_SOURCETREE?=$(HOME)/.android/git-annex-sourcetree + +GITTREE=$(GIT_ANNEX_ANDROID_SOURCETREE)/git/installed-tree + +VER=$(shell perl -e '$$_=<>;print m/\((.*?)\)/'<../../CHANGELOG) + +build: start + if [ ! -e "$(GIT_ANNEX_ANDROID_SOURCETREE)" ]; then $(MAKE) source; fi + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/git/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/term/build-stamp + + perl -i -pe 's/(android:versionName=)"[^"]+"/$$1"'$(VER)'"/' $(GIT_ANNEX_ANDROID_SOURCETREE)/term/AndroidManifest.xml + + # Debug build because it does not need signing keys. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && tools/build-debug + + # Install executables as pseudo-libraries so they will be + # unpacked from the .apk. + mkdir -p $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/busybox $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.busybox.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/ssh $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.ssh.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/ssh-keygen $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.ssh-keygen.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/rsync $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.rsync.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/g10/gpg $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.gpg.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git-shell $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-shell.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git-upload-pack $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-upload-pack.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/* + cp runshell $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.runshell.so + cp start $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.start.so + + # remove git stuff we don't need to save space + rm -rf $(GITTREE)/bin/git-cvsserver \ + $(GITTREE)/libexec/git-core/git-daemon \ + $(GITTREE)/libexec/git-core/git-show-index \ + $(GITTREE)/libexec/git-core/mergetools \ + $(GITTREE)/libexec/git-core/git-credential-* \ + $(GITTREE)/libexec/git-core/git-cvsserver \ + $(GITTREE)/libexec/git-core/git-cvsimport \ + $(GITTREE)/libexec/git-core/git-fast-import \ + $(GITTREE)/libexec/git-core/git-http-backend \ + $(GITTREE)/libexec/git-core/git-imap-send \ + $(GITTREE)/libexec/git-core/git-instaweb \ + $(GITTREE)/libexec/git-core/git-p4 \ + $(GITTREE)/libexec/git-core/git-remote-test* \ + $(GITTREE)/libexec/git-core/git-submodule \ + $(GITTREE)/libexec/git-core/git-svn \ + $(GITTREE)/libexec/git-core/git-web--browse + # Most of git is in one multicall binary, but a few important + # commands are still shell scripts. Those are put into + # a tarball, along with a list of all the links that should be + # set up. + cd $(GITTREE) && mkdir -p links + cd $(GITTREE) && find -samefile bin/git -not -wholename ./bin/git > links/git + cd $(GITTREE) && find -samefile bin/git-shell -not -wholename ./bin/git-shell > links/git-shell + cd $(GITTREE) && find -samefile bin/git-upload-pack -not -wholename ./bin/git-upload-pack > links/git-upload-pack + cd $(GITTREE) && find -type f -not -samefile bin/git -not -samefile bin/git-shell -not -samefile bin/git-upload-pack|tar czf ../git.tar.gz -T - + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git.tar.gz $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.tar.gz.so + + git rev-parse HEAD > $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.version.so + cp ../trustedkeys.gpg $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.trustedkeys.so + + mkdir -p ../../tmp/4.0 ../../tmp/4.3 + + cp ../../tmp/androidtree/dist/build/git-annex/4.3/git-annex $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && ant debug + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/term/bin/Term-debug.apk ../../tmp/4.3/git-annex.apk + + cp ../../tmp/androidtree/dist/build/git-annex/4.0/git-annex $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && ant debug + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/term/bin/Term-debug.apk ../../tmp/4.0/git-annex.apk + +$(GIT_ANNEX_ANDROID_SOURCETREE)/openssl/build-stamp: + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl && CC=$$(which cc) ./Configure android + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/build-stamp: openssh.patch openssh.config.h + # This is a known-good version that the patch works with. + # TODO: Upgrade + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && git reset --hard 0a8617ed5af2f0248d0e9648e26b224e16ada742 + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && ./configure --host=arm-linux-androideabi --with-ssl-dir=../openssl --without-openssl-header-check + cat openssh.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && patch -p1) + cp openssh.config.h $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/config.h + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && sed -i -e 's/getrrsetbyname.o //' openbsd-compat/Makefile + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && sed -i -e 's/auth-passwd.o //' Makefile + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && $(MAKE) ssh ssh-keygen + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/build-stamp: busybox_config + cp busybox_config $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/.config + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && git reset --hard a758e3e1e04e7705f5d37b2f27be654cd0e7282c + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && yes '' | $(MAKE) oldconfig + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/git/build-stamp: git.patch + cat git.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && git am) + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && $(MAKE) install NO_OPENSSL=1 NO_GETTEXT=1 NO_GECOS_IN_PWENT=1 NO_GETPASS=1 NO_NSEC=1 NO_MKDTEMP=1 NO_PTHREADS=1 NO_PERL=1 NO_CURL=1 NO_EXPAT=1 NO_TCLTK=1 NO_ICONV=1 prefix= DESTDIR=installed-tree + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/build-stamp: rsync.patch + # This is a known-good version that the patch works with. + cat rsync.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && git reset --hard eec26089b1c7bdbb260674480ffe6ece257bca63 && git am) + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/automake/lib/config.sub $(GIT_ANNEX_ANDROID_SOURCETREE)/automake/lib/config.guess $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/ + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && ./configure --host=arm-linux-androideabi --disable-locale --disable-iconv-open --disable-iconv --disable-acl-support --disable-xattr-support + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/build-stamp: + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && git checkout gnupg-1.4.15 + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./autogen.sh + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./configure --host=arm-linux-androideabi --disable-gnupg-iconv --disable-card-support --disable-agent-support --disable-photo-viewers --disable-keyserver-helpers --disable-nls + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg; $(MAKE) || true # expected failure in doc build + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/term/build-stamp: term.patch icons + # This is a known-good version that the patch works with. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && git reset --hard 3d34b3c42295c215b62e70f3ee696dd664ba08ce + cat term.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && patch -p1) + (cd icons && tar c .) | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term/res && tar x) + # This renaming has a purpose. It makes the path to the app's + # /data directory shorter, which makes ssh connection caching + # sockets placed there have more space for their filenames. + # Also, it avoids overlap with the Android Terminal Emulator + # app, if it's also installed. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && find -name .git -prune -o -type f -print0 | xargs -0 perl -pi -e 's/jackpal/ga/g' + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && perl -pi -e 's/Terminal Emulator/Git Annex/g' res/*/strings.xml + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && echo y | tools/update.sh + touch $@ + +source: $(GIT_ANNEX_ANDROID_SOURCETREE) + +$(GIT_ANNEX_ANDROID_SOURCETREE): + mkdir -p $(GIT_ANNEX_ANDROID_SOURCETREE) + git clone git://git.savannah.gnu.org/automake.git $(GIT_ANNEX_ANDROID_SOURCETREE)/automake + git clone git://git.debian.org/git/d-i/busybox $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox + git clone git://git.kernel.org/pub/scm/git/git.git $(GIT_ANNEX_ANDROID_SOURCETREE)/git + git clone git://git.samba.org/rsync.git $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync + git clone git://git.gnupg.org/gnupg.git $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg + git clone git://git.openssl.org/openssl $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl + git clone git://github.com/CyanogenMod/android_external_openssh.git $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh + git clone git://github.com/jackpal/Android-Terminal-Emulator.git $(GIT_ANNEX_ANDROID_SOURCETREE)/term + +clean: + rm -rf $(GITTREE) + rm -f start + +reallyclean: clean + rm -rf $(GIT_ANNEX_ANDROID_SOURCETREE) diff --git a/standalone/android/abiversion b/standalone/android/abiversion new file mode 100644 index 000000000..4cc4c14cd --- /dev/null +++ b/standalone/android/abiversion @@ -0,0 +1 @@ +android-14/arm-linux-androideabi-4.8 diff --git a/standalone/android/buildchroot b/standalone/android/buildchroot new file mode 100755 index 000000000..396beab78 --- /dev/null +++ b/standalone/android/buildchroot @@ -0,0 +1,27 @@ +#!/bin/sh +set -e +if [ "$(whoami)" != root ]; then + echo "Must run this as root!" >&2 + exit 1 +fi + +debootstrap --arch=i386 stable debian-stable-android +cp $0-inchroot debian-stable-android/tmp +cp $0-inchroot-asuser debian-stable-android/tmp +cp $(dirname $0)/abiversion debian-stable-android/tmp + +# Don't use these vars in the chroot. +unset TMP +unset TEMP +unset TMPDIR +unset TEMPDIR + +chroot debian-stable-android "tmp/$(basename $0)-inchroot" + +echo +echo +echo "debian-stable-android is set up, with a user builder" +echo "your next step is probably to check out git-annex in this chroot" +echo "and run standalone/android/install-haskell-packages" +echo +echo diff --git a/standalone/android/buildchroot-inchroot b/standalone/android/buildchroot-inchroot new file mode 100755 index 000000000..5c462d8cc --- /dev/null +++ b/standalone/android/buildchroot-inchroot @@ -0,0 +1,32 @@ +#!/bin/sh +# Runs inside the chroot set up by buildchroot +set -e +set -x +if [ "$(whoami)" != root ]; then + echo "Must run this as root!" >&2 + exit 1 +fi + +# java needs this mounted to work +mount -t proc proc /proc || true + +echo "deb-src http://ftp.us.debian.org/debian stable main" >> /etc/apt/sources.list +apt-get update +apt-get -y install build-essential ghc git libncurses5-dev cabal-install +apt-get -y install happy alex +apt-get -y install llvm-3.0 # not 3.1; buggy on arm. 3.2 is ok too +apt-get -y install ca-certificates curl file m4 autoconf zlib1g-dev +apt-get -y install libgnutls-dev libxml2-dev libgsasl7-dev pkg-config c2hs +apt-get -y install ant default-jdk rsync wget gnupg lsof +apt-get -y install gettext unzip python +apt-get -y install locales +# works around a dependncy issue with the current hjsmin +apt-get -y install libghc-hjsmin-dev +echo en_US.UTF-8 UTF-8 >> /etc/locale.gen +locale-gen +apt-get clean +wget http://snapshot.debian.org/archive/debian/20130903T155330Z/pool/main/a/automake-1.14/automake_1.14-1_all.deb +dpkg -i automake*.deb +rm *.deb +useradd builder --create-home || true +su builder -c $0-asuser diff --git a/standalone/android/buildchroot-inchroot-asuser b/standalone/android/buildchroot-inchroot-asuser new file mode 100755 index 000000000..fd27f3fc5 --- /dev/null +++ b/standalone/android/buildchroot-inchroot-asuser @@ -0,0 +1,44 @@ +#!/bin/sh +# Runs inside the chroot set up by buildchroot, as the user it creates +set -e +set -x + +# Put in /tmp by buildchroot, but when bootstrapping with propellor, +# this is run inside a checked out git-annex tree. +if [ -e /tmp/abiversion ]; then + ABIVERSION=$(cat /tmp/abiversion) +else + ABIVERSION=$(cat standalone/android/abiversion) +fi + +cd +rm -rf .ghc .cabal .android +cabal update +cabal install happy alex --bindir=$HOME/bin +PATH=$HOME/bin:$PATH +export PATH +mkdir -p .android +cd .android +git clone https://github.com/joeyh/ghc-android +cd ghc-android +git checkout stable-ghc-snapshot +./build + +# This saves 2 gb, and the same sources are in build-*/ghc +rm -rf stage0 + +# Set up android SDK where the git-annex android Makefile +# expects to find it. +cd .. +ln -s ghc-android/android-ndk-* android-ndk +wget http://dl.google.com/android/adt/adt-bundle-linux-x86-20130917.zip +unzip adt*.zip +rm adt*.zip +mv adt-bundle-linux-x86-* adt-bundle-linux-x86 +rm -rf adt-bundle-linux-x86/eclipse + +# The git-annex android Makefile needs this cc symlink. +ln -s arm-linux-androideabi-gcc $HOME/.ghc/$ABIVERSION/bin/cc + +git config --global user.email androidbuilder@example.com +git config --global user.name androidbuilder diff --git a/standalone/android/busybox_config b/standalone/android/busybox_config new file mode 100644 index 000000000..28ea880d9 --- /dev/null +++ b/standalone/android/busybox_config @@ -0,0 +1,997 @@ +# Run "make android2_defconfig", then "make". +# +# Tested with the standalone toolchain from ndk r6: +# android-ndk-r6/build/tools/make-standalone-toolchain.sh --platform=android-8 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Busybox Settings +# + +# +# General Configuration +# +# CONFIG_DESKTOP is not set +# CONFIG_EXTRA_COMPAT is not set +# CONFIG_INCLUDE_SUSv2 is not set +# CONFIG_USE_PORTABLE_CODE is not set +CONFIG_PLATFORM_LINUX=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +# CONFIG_SHOW_USAGE is not set +# CONFIG_FEATURE_VERBOSE_USAGE is not set +# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_FEATURE_INSTALLER=y +# CONFIG_INSTALL_NO_USR is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_UNICODE_SUPPORT is not set +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=0 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +# CONFIG_LONG_OPTS is not set +# CONFIG_FEATURE_DEVPTS is not set +# CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_FEATURE_UTMP is not set +# CONFIG_FEATURE_WTMP is not set +# CONFIG_FEATURE_PIDFILE is not set +# CONFIG_FEATURE_SUID is not set +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +# CONFIG_FEATURE_HAVE_RPC is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +# CONFIG_LFS is not set +CONFIG_CROSS_COMPILER_PREFIX="arm-linux-androideabi-" +CONFIG_EXTRA_CFLAGS="" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Installation Options ("make install" behavior) +# +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Busybox Library Tuning +# +# CONFIG_FEATURE_SYSTEMD is not set +# CONFIG_FEATURE_RTMINMAX is not set +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SMALL=1 +# CONFIG_FEATURE_FAST_TOP is not set +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_USE_TERMIOS=y +# CONFIG_FEATURE_EDITING is not set +CONFIG_FEATURE_EDITING_MAX_LEN=0 +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=0 +# CONFIG_FEATURE_EDITING_SAVEHISTORY is not set +# CONFIG_FEATURE_TAB_COMPLETION is not set +# CONFIG_FEATURE_USERNAME_COMPLETION is not set +# CONFIG_FEATURE_EDITING_FANCY_PROMPT is not set +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_FEATURE_NON_POSIX_CP is not set +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_FEATURE_COPYBUF_KB=4 +# CONFIG_FEATURE_SKIP_ROOTFS is not set +# CONFIG_MONOTONIC_SYSCALL is not set +# CONFIG_IOCTL_HEX2STR_ERROR is not set +# CONFIG_FEATURE_HWIB is not set + +# +# Applets +# + +# +# Archival Utilities +# +CONFIG_FEATURE_SEAMLESS_XZ=y +CONFIG_FEATURE_SEAMLESS_LZMA=y +CONFIG_FEATURE_SEAMLESS_BZ2=y +CONFIG_FEATURE_SEAMLESS_GZ=y +CONFIG_FEATURE_SEAMLESS_Z=y +CONFIG_AR=y +CONFIG_FEATURE_AR_LONG_FILENAMES=y +CONFIG_FEATURE_AR_CREATE=y +CONFIG_BUNZIP2=y +CONFIG_BZIP2=y +CONFIG_CPIO=y +CONFIG_FEATURE_CPIO_O=y +CONFIG_FEATURE_CPIO_P=y +CONFIG_DPKG=y +CONFIG_DPKG_DEB=y +# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set +CONFIG_GUNZIP=y +CONFIG_GZIP=y +# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set +CONFIG_LZOP=y +CONFIG_LZOP_COMPR_HIGH=y +CONFIG_RPM2CPIO=y +CONFIG_RPM=y +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_AUTODETECT=y +CONFIG_FEATURE_TAR_FROM=y +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y +CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_FEATURE_TAR_TO_COMMAND is not set +CONFIG_FEATURE_TAR_UNAME_GNAME=y +CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y +# CONFIG_FEATURE_TAR_SELINUX is not set +CONFIG_UNCOMPRESS=y +CONFIG_UNLZMA=y +CONFIG_FEATURE_LZMA_FAST=y +CONFIG_LZMA=y +CONFIG_UNXZ=y +CONFIG_XZ=y +CONFIG_UNZIP=y + +# +# Coreutils +# +CONFIG_BASENAME=y +CONFIG_CAT=y +# CONFIG_DATE is not set +# CONFIG_FEATURE_DATE_ISOFMT is not set +# CONFIG_FEATURE_DATE_NANO is not set +# CONFIG_FEATURE_DATE_COMPAT is not set +# CONFIG_ID is not set +# CONFIG_GROUPS is not set +CONFIG_TEST=y +CONFIG_FEATURE_TEST_64=y +CONFIG_TOUCH=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y +CONFIG_BASE64=y +CONFIG_CAL=y +CONFIG_CATV=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_CHROOT=y +CONFIG_CKSUM=y +CONFIG_COMM=y +CONFIG_CP=y +# CONFIG_FEATURE_CP_LONG_OPTIONS is not set +CONFIG_CUT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y +CONFIG_FEATURE_DD_IBS_OBS=y +# CONFIG_DF is not set +# CONFIG_FEATURE_DF_FANCY is not set +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +# CONFIG_ENV is not set +# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set +CONFIG_EXPAND=y +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set +# CONFIG_EXPR is not set +# CONFIG_EXPR_MATH_SUPPORT_64 is not set +CONFIG_FALSE=y +CONFIG_FOLD=y +# CONFIG_FSYNC is not set +CONFIG_HEAD=y +CONFIG_FEATURE_FANCY_HEAD=y +# CONFIG_HOSTID is not set +CONFIG_INSTALL=y +# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set +CONFIG_LN=y +# CONFIG_LOGNAME is not set +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +# CONFIG_FEATURE_LS_COLOR is not set +# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +# CONFIG_FEATURE_MKDIR_LONG_OPTIONS is not set +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_FEATURE_MV_LONG_OPTIONS is not set +CONFIG_NICE=y +CONFIG_NOHUP=y +CONFIG_OD=y +CONFIG_PRINTENV=y +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set +CONFIG_SEQ=y +CONFIG_SHA1SUM=y +CONFIG_SHA256SUM=y +CONFIG_SHA512SUM=y +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_FEATURE_FLOAT_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +CONFIG_SPLIT=y +CONFIG_FEATURE_SPLIT_FANCY=y +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +CONFIG_STTY=y +CONFIG_SUM=y +CONFIG_SYNC=y +CONFIG_TAC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TRUE=y +# CONFIG_TTY is not set +CONFIG_UNAME=y +CONFIG_UNEXPAND=y +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set +CONFIG_UNIQ=y +# CONFIG_USLEEP is not set +CONFIG_UUDECODE=y +CONFIG_UUENCODE=y +CONFIG_WC=y +CONFIG_FEATURE_WC_LARGE=y +# CONFIG_WHO is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls, more and telnet +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_FGCONSOLE=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_KBD_MODE is not set +# CONFIG_LOADFONT is not set +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" +CONFIG_SETKEYCODES=y +CONFIG_SETLOGCONS=y +CONFIG_SHOWKEY=y +# CONFIG_FEATURE_LOADFONT_PSF2 is not set +# CONFIG_FEATURE_LOADFONT_RAW is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +CONFIG_PIPE_PROGRESS=y +CONFIG_RUN_PARTS=y +# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +CONFIG_FEATURE_RUN_PARTS_FANCY=y +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_PATCH=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=0 +# CONFIG_FEATURE_VI_8BIT is not set +# CONFIG_FEATURE_VI_COLON is not set +# CONFIG_FEATURE_VI_YANKMARK is not set +CONFIG_FEATURE_VI_SEARCH=y +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set +CONFIG_FEATURE_VI_USE_SIGNALS=y +# CONFIG_FEATURE_VI_DOT_CMD is not set +# CONFIG_FEATURE_VI_READONLY is not set +# CONFIG_FEATURE_VI_SETOPTS is not set +# CONFIG_FEATURE_VI_SET is not set +CONFIG_FEATURE_VI_WIN_RESIZE=y +# CONFIG_FEATURE_VI_ASK_TERMINAL is not set +# CONFIG_FEATURE_VI_OPTIMIZE_CURSOR is not set +# CONFIG_AWK is not set +# CONFIG_FEATURE_AWK_LIBM is not set +CONFIG_CMP=y +CONFIG_DIFF=y +# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_ED is not set +CONFIG_SED=y +# CONFIG_FEATURE_ALLOW_EXEC is not set + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +# CONFIG_FEATURE_FIND_MMIN is not set +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +# CONFIG_FEATURE_FIND_XDEV is not set +# CONFIG_FEATURE_FIND_MAXDEPTH is not set +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +# CONFIG_FEATURE_FIND_EXEC is not set +# CONFIG_FEATURE_FIND_USER is not set +# CONFIG_FEATURE_FIND_GROUP is not set +# CONFIG_FEATURE_FIND_NOT is not set +# CONFIG_FEATURE_FIND_DEPTH is not set +# CONFIG_FEATURE_FIND_PAREN is not set +# CONFIG_FEATURE_FIND_SIZE is not set +# CONFIG_FEATURE_FIND_PRUNE is not set +# CONFIG_FEATURE_FIND_DELETE is not set +# CONFIG_FEATURE_FIND_PATH is not set +# CONFIG_FEATURE_FIND_REGEX is not set +# CONFIG_FEATURE_FIND_CONTEXT is not set +# CONFIG_FEATURE_FIND_LINKS is not set +CONFIG_GREP=y +# CONFIG_FEATURE_GREP_EGREP_ALIAS is not set +# CONFIG_FEATURE_GREP_FGREP_ALIAS is not set +# CONFIG_FEATURE_GREP_CONTEXT is not set +CONFIG_XARGS=y +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +# CONFIG_BOOTCHARTD is not set +# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +# CONFIG_HALT is not set +# CONFIG_FEATURE_CALL_TELINIT is not set +# CONFIG_TELINIT_PATH="" +# CONFIG_INIT is not set +# CONFIG_FEATURE_USE_INITTAB is not set +# CONFIG_FEATURE_KILL_REMOVED is not set +# CONFIG_FEATURE_KILL_DELAY=0 +# CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +# CONFIG_FEATURE_INITRD is not set +# CONFIG_INIT_TERMINAL_TYPE="linux" +# CONFIG_MESG is not set +# CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y + +# +# Login/Password Management Utilities +# +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set +# CONFIG_FEATURE_SHADOWPASSWDS is not set +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +# CONFIG_USE_BB_CRYPT is not set +# CONFIG_USE_BB_CRYPT_SHA is not set +# CONFIG_ADDUSER is not set +# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set +# CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_FIRST_SYSTEM_ID=0 +CONFIG_LAST_SYSTEM_ID=0 +# CONFIG_ADDGROUP is not set +# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set +# CONFIG_DELUSER is not set +# CONFIG_DELGROUP is not set +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set +# CONFIG_GETTY is not set +# CONFIG_LOGIN is not set +# CONFIG_PAM is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set +# CONFIG_FEATURE_SECURETTY is not set +# CONFIG_PASSWD is not set +# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set +# CONFIG_CRYPTPW is not set +# CONFIG_CHPASSWD is not set +# CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set +# CONFIG_SULOGIN is not set +# CONFIG_VLOCK is not set + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +# CONFIG_FSCK is not set +CONFIG_LSATTR=y +CONFIG_TUNE2FS=y + +# +# Linux Module Utilities +# +# CONFIG_MODINFO is not set +# CONFIG_MODPROBE_SMALL is not set +# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE=y +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y +# CONFIG_INSMOD is not set +# CONFIG_RMMOD is not set +# CONFIG_LSMOD is not set +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +# CONFIG_MODPROBE is not set +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set +# CONFIG_DEPMOD is not set + +# +# Options common to multiple modutils +# +# CONFIG_FEATURE_2_4_MODULES is not set +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_FEATURE_MODUTILS_ALIAS is not set +# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set +# CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +# CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" + +# +# Linux System Utilities +# +CONFIG_BLOCKDEV=y +CONFIG_REV=y +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +CONFIG_BLKID=y +# CONFIG_FEATURE_BLKID_TYPE is not set +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +CONFIG_FBSET=y +CONFIG_FEATURE_FBSET_FANCY=y +CONFIG_FEATURE_FBSET_READMODE=y +CONFIG_FDFLUSH=y +CONFIG_FDFORMAT=y +CONFIG_FDISK=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +# CONFIG_FEATURE_GPT_LABEL is not set +CONFIG_FEATURE_FDISK_ADVANCED=y +CONFIG_FINDFS=y +CONFIG_FLOCK=y +CONFIG_FREERAMDISK=y +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_FEATURE_MINIX2 is not set +# CONFIG_MKFS_REISER is not set +# CONFIG_MKFS_VFAT is not set +CONFIG_GETOPT=y +CONFIG_FEATURE_GETOPT_LONG=y +CONFIG_HEXDUMP=y +CONFIG_FEATURE_HEXDUMP_REVERSE=y +CONFIG_HD=y +# CONFIG_HWCLOCK is not set +# CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS is not set +# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set +# CONFIG_IPCRM is not set +# CONFIG_IPCS is not set +CONFIG_LOSETUP=y +CONFIG_LSPCI=y +CONFIG_LSUSB=y +# CONFIG_MDEV is not set +# CONFIG_FEATURE_MDEV_CONF is not set +# CONFIG_FEATURE_MDEV_RENAME is not set +# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set +# CONFIG_FEATURE_MDEV_EXEC is not set +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +CONFIG_MKSWAP=y +CONFIG_FEATURE_MKSWAP_UUID=y +CONFIG_MORE=y +# CONFIG_MOUNT is not set +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +# CONFIG_FEATURE_MOUNT_HELPERS is not set +# CONFIG_FEATURE_MOUNT_LABEL is not set +# CONFIG_FEATURE_MOUNT_NFS is not set +# CONFIG_FEATURE_MOUNT_CIFS is not set +# CONFIG_FEATURE_MOUNT_FLAGS is not set +# CONFIG_FEATURE_MOUNT_FSTAB is not set +# CONFIG_PIVOT_ROOT is not set +# CONFIG_RDATE is not set +CONFIG_RDEV=y +CONFIG_READPROFILE=y +CONFIG_RTCWAKE=y +CONFIG_SCRIPT=y +CONFIG_SCRIPTREPLAY=y +# CONFIG_SETARCH is not set +# CONFIG_SWAPONOFF is not set +# CONFIG_FEATURE_SWAPON_PRI is not set +# CONFIG_SWITCH_ROOT is not set +# CONFIG_UMOUNT is not set +# CONFIG_FEATURE_UMOUNT_ALL is not set +# CONFIG_FEATURE_MOUNT_LOOP is not set +# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set +# CONFIG_FEATURE_MTAB_SUPPORT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +CONFIG_FEATURE_VOLUMEID_EXT=y +CONFIG_FEATURE_VOLUMEID_BTRFS=y +CONFIG_FEATURE_VOLUMEID_REISERFS=y +CONFIG_FEATURE_VOLUMEID_FAT=y +CONFIG_FEATURE_VOLUMEID_HFS=y +CONFIG_FEATURE_VOLUMEID_JFS=y +CONFIG_FEATURE_VOLUMEID_XFS=y +CONFIG_FEATURE_VOLUMEID_NTFS=y +CONFIG_FEATURE_VOLUMEID_ISO9660=y +CONFIG_FEATURE_VOLUMEID_UDF=y +CONFIG_FEATURE_VOLUMEID_LUKS=y +CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y +CONFIG_FEATURE_VOLUMEID_CRAMFS=y +CONFIG_FEATURE_VOLUMEID_ROMFS=y +CONFIG_FEATURE_VOLUMEID_SYSV=y +CONFIG_FEATURE_VOLUMEID_OCFS2=y +CONFIG_FEATURE_VOLUMEID_LINUXRAID=y + +# +# Miscellaneous Utilities +# +# CONFIG_CONSPY is not set +# CONFIG_NANDWRITE is not set +CONFIG_NANDDUMP=y +CONFIG_SETSERIAL=y +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +CONFIG_BEEP=y +CONFIG_FEATURE_BEEP_FREQ=4000 +CONFIG_FEATURE_BEEP_LENGTH_MS=30 +CONFIG_CHAT=y +CONFIG_FEATURE_CHAT_NOFAIL=y +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +CONFIG_FEATURE_CHAT_IMPLICIT_CR=y +CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y +CONFIG_FEATURE_CHAT_SEND_ESCAPES=y +CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y +CONFIG_FEATURE_CHAT_CLR_ABORT=y +CONFIG_CHRT=y +# CONFIG_CROND is not set +# CONFIG_FEATURE_CROND_D is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_FEATURE_CROND_DIR="" +# CONFIG_CRONTAB is not set +CONFIG_DC=y +CONFIG_FEATURE_DC_LIBM=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_DEVMEM=y +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +CONFIG_FBSPLASH=y +CONFIG_FLASHCP=y +CONFIG_FLASH_LOCK=y +CONFIG_FLASH_UNLOCK=y +# CONFIG_FLASH_ERASEALL is not set +# CONFIG_IONICE is not set +CONFIG_INOTIFYD=y +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_SMALL is not set +# CONFIG_FEATURE_LAST_FANCY is not set +# CONFIG_LESS is not set +CONFIG_FEATURE_LESS_MAXLINES=0 +# CONFIG_FEATURE_LESS_BRACKETS is not set +# CONFIG_FEATURE_LESS_FLAGS is not set +# CONFIG_FEATURE_LESS_MARKS is not set +# CONFIG_FEATURE_LESS_REGEXP is not set +# CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_FEATURE_LESS_DASHCMD is not set +# CONFIG_FEATURE_LESS_LINENUMS is not set +CONFIG_HDPARM=y +CONFIG_FEATURE_HDPARM_GET_IDENTITY=y +CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y +CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +CONFIG_MAN=y +# CONFIG_MICROCOM is not set +# CONFIG_MOUNTPOINT is not set +# CONFIG_MT is not set +CONFIG_RAIDAUTORUN=y +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set +# CONFIG_RUNLEVEL is not set +CONFIG_RX=y +CONFIG_SETSID=y +CONFIG_STRINGS=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +CONFIG_TIME=y +CONFIG_TIMEOUT=y +CONFIG_TTYSIZE=y +CONFIG_VOLNAME=y +# CONFIG_WALL is not set +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +CONFIG_NBDCLIENT=y +CONFIG_NC=y +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +# CONFIG_NC_110_COMPAT is not set +# CONFIG_PING is not set +# CONFIG_PING6 is not set +# CONFIG_FEATURE_FANCY_PING is not set +CONFIG_WHOIS=y +# CONFIG_FEATURE_IPV6 is not set +# CONFIG_FEATURE_UNIX_LOCAL is not set +# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +CONFIG_ARP=y +# CONFIG_ARPING is not set +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +CONFIG_DNSD=y +# CONFIG_ETHER_WAKE is not set +CONFIG_FAKEIDENTD=y +CONFIG_FTPD=y +CONFIG_FEATURE_FTP_WRITE=y +CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y +CONFIG_FTPGET=y +CONFIG_FTPPUT=y +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +# CONFIG_HOSTNAME is not set +CONFIG_HTTPD=y +CONFIG_FEATURE_HTTPD_RANGES=y +CONFIG_FEATURE_HTTPD_USE_SENDFILE=y +CONFIG_FEATURE_HTTPD_SETUID=y +CONFIG_FEATURE_HTTPD_BASIC_AUTH=y +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +CONFIG_FEATURE_HTTPD_CGI=y +CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y +CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y +CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y +CONFIG_FEATURE_HTTPD_ERROR_PAGES=y +CONFIG_FEATURE_HTTPD_PROXY=y +CONFIG_FEATURE_HTTPD_GZIP=y +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y +CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_IFENSLAVE is not set +# CONFIG_IFPLUGD is not set +CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +CONFIG_FEATURE_IFUPDOWN_IP=y +CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IPV4=y +# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_TUNNEL=y +CONFIG_FEATURE_IP_RULE=y +CONFIG_FEATURE_IP_SHORT_FORMS=y +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_IPRULE=y +CONFIG_IPCALC=y +CONFIG_FEATURE_IPCALC_FANCY=y +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +CONFIG_NETSTAT=y +CONFIG_FEATURE_NETSTAT_WIDE=y +CONFIG_FEATURE_NETSTAT_PRG=y +# CONFIG_NSLOOKUP is not set +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +CONFIG_PSCAN=y +CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set +CONFIG_TCPSVD=y +# CONFIG_TELNET is not set +# CONFIG_FEATURE_TELNET_TTYPE is not set +# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_TELNETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set +# CONFIG_TFTP is not set +# CONFIG_TFTPD is not set +# CONFIG_FEATURE_TFTP_GET is not set +# CONFIG_FEATURE_TFTP_PUT is not set +# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set +# CONFIG_TFTP_DEBUG is not set +# CONFIG_TRACEROUTE is not set +# CONFIG_TRACEROUTE6 is not set +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +CONFIG_TUNCTL=y +CONFIG_FEATURE_TUNCTL_UG=y +# CONFIG_UDHCPD is not set +# CONFIG_DHCPRELAY is not set +# CONFIG_DUMPLEASES is not set +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +CONFIG_DHCPD_LEASES_FILE="" +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +# CONFIG_FEATURE_UDHCP_PORT is not set +CONFIG_UDHCP_DEBUG=9 +CONFIG_FEATURE_UDHCP_RFC3397=y +CONFIG_FEATURE_UDHCP_8021Q=y +CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" +# CONFIG_UDPSVD is not set +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set +CONFIG_FEATURE_WGET_TIMEOUT=y +# CONFIG_ZCIP is not set + +# +# Print Utilities +# +CONFIG_LPD=y +CONFIG_LPR=y +CONFIG_LPQ=y + +# +# Mail Utilities +# +CONFIG_MAKEMIME=y +CONFIG_FEATURE_MIME_CHARSET="us-ascii" +CONFIG_POPMAILDIR=y +CONFIG_FEATURE_POPMAILDIR_DELIVERY=y +CONFIG_REFORMIME=y +CONFIG_FEATURE_REFORMIME_COMPAT=y +CONFIG_SENDMAIL=y + +# +# Process Utilities +# +CONFIG_IOSTAT=y +CONFIG_MPSTAT=y +CONFIG_NMETER=y +CONFIG_PMAP=y +# CONFIG_POWERTOP is not set +CONFIG_PSTREE=y +CONFIG_PWDX=y +CONFIG_SMEMCAP=y +# CONFIG_FREE is not set +CONFIG_FUSER=y +# CONFIG_KILL is not set +# CONFIG_KILLALL is not set +# CONFIG_KILLALL5 is not set +# CONFIG_PGREP is not set +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PKILL is not set +# CONFIG_PS is not set +# CONFIG_FEATURE_PS_WIDE is not set +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +CONFIG_RENICE=y +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +CONFIG_FEATURE_TOP_SMP_CPU=y +CONFIG_FEATURE_TOP_DECIMALS=y +CONFIG_FEATURE_TOP_SMP_PROCESS=y +CONFIG_FEATURE_TOPMEM=y +CONFIG_FEATURE_SHOW_THREADS=y +# CONFIG_UPTIME is not set +CONFIG_WATCH=y + +# +# Runit Utilities +# +CONFIG_RUNSV=y +CONFIG_RUNSVDIR=y +# CONFIG_FEATURE_RUNSVDIR_LOG is not set +CONFIG_SV=y +CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" +CONFIG_SVLOGD=y +CONFIG_CHPST=y +CONFIG_SETUIDGID=y +CONFIG_ENVUIDGID=y +CONFIG_ENVDIR=y +CONFIG_SOFTLIMIT=y +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_SETSEBOOL is not set +# CONFIG_SESTATUS is not set + +# +# Shells +# +CONFIG_ASH=y +# CONFIG_ASH_BASH_COMPAT is not set +# CONFIG_ASH_IDLE_TIMEOUT is not set +CONFIG_ASH_JOB_CONTROL=y +# CONFIG_ASH_ALIAS is not set +CONFIG_ASH_GETOPTS=y +# CONFIG_ASH_BUILTIN_ECHO is not set +# CONFIG_ASH_BUILTIN_PRINTF is not set +# CONFIG_ASH_BUILTIN_TEST is not set +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +# CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_ASH_EXPAND_PRMT is not set +CONFIG_CTTYHACK=y +# CONFIG_HUSH is not set +# CONFIG_HUSH_BASH_COMPAT is not set +# CONFIG_HUSH_BRACE_EXPANSION is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_SAVEHISTORY is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_HUSH_CASE is not set +# CONFIG_HUSH_FUNCTIONS is not set +# CONFIG_HUSH_LOCAL is not set +# CONFIG_HUSH_RANDOM_SUPPORT is not set +# CONFIG_HUSH_EXPORT_N is not set +# CONFIG_HUSH_MODE_X is not set +# CONFIG_MSH is not set +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +# CONFIG_FEATURE_BASH_IS_ASH is not set +# CONFIG_FEATURE_BASH_IS_HUSH is not set +CONFIG_FEATURE_BASH_IS_NONE=y +# CONFIG_SH_MATH_SUPPORT is not set +# CONFIG_SH_MATH_SUPPORT_64 is not set +# CONFIG_FEATURE_SH_EXTRA_QUIET is not set +CONFIG_FEATURE_SH_STANDALONE=y +# CONFIG_FEATURE_SH_NOFORK is not set +# CONFIG_FEATURE_SH_HISTFILESIZE is not set + +# +# System Logging Utilities +# +# CONFIG_SYSLOGD is not set +# CONFIG_FEATURE_ROTATE_LOGFILE is not set +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_SYSLOGD_DUP is not set +# CONFIG_FEATURE_SYSLOGD_CFG is not set +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +CONFIG_KLOGD=y +CONFIG_FEATURE_KLOGD_KLOGCTL=y +# CONFIG_LOGGER is not set diff --git a/standalone/android/clean-haskell-packages b/standalone/android/clean-haskell-packages new file mode 100755 index 000000000..b8c6132d6 --- /dev/null +++ b/standalone/android/clean-haskell-packages @@ -0,0 +1,6 @@ +#!/bin/sh +# Removes all currently installed cross-compiled haskell packages +# except those part of ghc. +# Useful if the build failed. +rm -f $(grep -l $HOME/.ghc/$(cat abiversion)/.cabal/lib/ $HOME/.ghc/android-14/arm-linux-androideabi-4.8/lib/*-ghc-*/package.conf.d/*.conf) +$HOME/.ghc/$(cat abiversion)/arm-linux-androideabi/bin/ghc-pkg recache diff --git a/standalone/android/dropbear.patch b/standalone/android/dropbear.patch new file mode 100644 index 000000000..84c7dfb6d --- /dev/null +++ b/standalone/android/dropbear.patch @@ -0,0 +1,55 @@ +From 014dadb02fd984828a6232534c47dba8e2f7818a Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 13 Feb 2013 15:29:52 -0400 +Subject: [PATCH] android patch for dropbear + +* Disable HOME override +* Use urandom to avoid blocking on every ssh connection. +* Enable use of netbsd_getpass.c +--- + cli-auth.c | 1 + + cli-main.c | 2 -- + options.h | 2 +- + 3 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/cli-auth.c b/cli-auth.c +index 4c17a21..91dfdf8 100644 +--- a/cli-auth.c ++++ b/cli-auth.c +@@ -31,6 +31,7 @@ + #include "ssh.h" + #include "packet.h" + #include "runopts.h" ++#include "netbsd_getpass.c" + + void cli_authinitialise() { + +diff --git a/cli-main.c b/cli-main.c +index 106006b..68cf023 100644 +--- a/cli-main.c ++++ b/cli-main.c +@@ -47,8 +47,6 @@ int main(int argc, char ** argv) { + _dropbear_exit = cli_dropbear_exit; + _dropbear_log = cli_dropbear_log; + +- putenv("HOME=/data/local"); +- + disallow_core(); + + cli_getopts(argc, argv); +diff --git a/options.h b/options.h +index 7625151..48e404d 100644 +--- a/options.h ++++ b/options.h +@@ -159,7 +159,7 @@ etc) slower (perhaps by 50%). Recommended for most small systems. */ + * however significantly reduce the security of your ssh connections + * if the PRNG state becomes guessable - make sure you know what you are + * doing if you change this. */ +-#define DROPBEAR_RANDOM_DEV "/dev/random" ++#define DROPBEAR_RANDOM_DEV "/dev/urandom" + + /* prngd must be manually set up to produce output */ + /*#define DROPBEAR_PRNGD_SOCKET "/var/run/dropbear-rng"*/ +-- +1.7.10.4 + diff --git a/standalone/android/git.patch b/standalone/android/git.patch new file mode 100644 index 000000000..32dd1cecc --- /dev/null +++ b/standalone/android/git.patch @@ -0,0 +1,54 @@ +From ec690f617cab405ec2c6420bde53e9d9ed984e5c Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 3 Jul 2014 15:55:17 -0400 +Subject: [PATCH] Revert "config: preserve config file permissions on edits" + +This reverts commit daa22c6f8da466bd7a438f1bc27375fd737ffcf3. + +This breaks on Android's /sdcard, which has a variety of FUSE +implentations, all total shite. + +diff --git a/config.c b/config.c +index a1aef1c..7f3303d 100644 +--- a/config.c ++++ b/config.c +@@ -1637,13 +1637,6 @@ int git_config_set_multivar_in_file(const char *config_filename, + MAP_PRIVATE, in_fd, 0); + close(in_fd); + +- if (fchmod(fd, st.st_mode & 07777) < 0) { +- error("fchmod on %s failed: %s", +- lock->filename, strerror(errno)); +- ret = CONFIG_NO_WRITE; +- goto out_free; +- } +- + if (store.seen == 0) + store.seen = 1; + +@@ -1792,7 +1785,6 @@ int git_config_rename_section_in_file(const char *config_filename, + int out_fd; + char buf[1024]; + FILE *config_file; +- struct stat st; + + if (new_name && !section_name_is_ok(new_name)) { + ret = error("invalid section name: %s", new_name); +@@ -1814,14 +1806,6 @@ int git_config_rename_section_in_file(const char *config_filename, + goto unlock_and_out; + } + +- fstat(fileno(config_file), &st); +- +- if (fchmod(out_fd, st.st_mode & 07777) < 0) { +- ret = error("fchmod on %s failed: %s", +- lock->filename, strerror(errno)); +- goto out; +- } +- + while (fgets(buf, sizeof(buf), config_file)) { + int i; + int length; +-- +2.0.1 + diff --git a/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch b/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch new file mode 100644 index 000000000..5f772bfdf --- /dev/null +++ b/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch @@ -0,0 +1,37 @@ +From 3779c75175e895f94b21341ebd6361e9d6af54fd Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 9 May 2013 12:36:23 -0400 +Subject: [PATCH] support Android cert store + +Android puts it in a different place and has only hashed files. +See https://github.com/vincenthz/hs-certificate/issues/19 +--- + System/Certificate/X509/Unix.hs | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/System/Certificate/X509/Unix.hs b/System/Certificate/X509/Unix.hs +index 8463465..74e9503 100644 +--- a/System/Certificate/X509/Unix.hs ++++ b/System/Certificate/X509/Unix.hs +@@ -35,7 +35,8 @@ import qualified Control.Exception as E + import Data.Char + + defaultSystemPath :: FilePath +-defaultSystemPath = "/etc/ssl/certs/" ++defaultSystemPath = "/system/etc/security/cacerts/" ++--defaultSystemPath = "/etc/ssl/certs/" + + envPathOverride :: String + envPathOverride = "SYSTEM_CERTIFICATE_PATH" +@@ -47,7 +48,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + && isDigit (s !! 9) + && (s !! 8) == '.' + && all isHexDigit (take 8 s) +- isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) ++ isCert x = (not $ isPrefixOf "." x) + + getSystemCertificateStore :: IO CertificateStore + getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) +-- +1.8.2.rc3 + diff --git a/standalone/android/haskell-patches/comonad_cross-build.patch b/standalone/android/haskell-patches/comonad_cross-build.patch new file mode 100644 index 000000000..ee8ae4268 --- /dev/null +++ b/standalone/android/haskell-patches/comonad_cross-build.patch @@ -0,0 +1,25 @@ +From 589c6a87ec62e35942c9a86ea8d91b443c80da99 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 23:07:02 +0000 +Subject: [PATCH] cross build + +--- + comonad.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/comonad.cabal b/comonad.cabal +index 5d34b13..756ed92 100644 +--- a/comonad.cabal ++++ b/comonad.cabal +@@ -13,7 +13,7 @@ copyright: Copyright (C) 2008-2013 Edward A. Kmett, + Copyright (C) 2004-2008 Dave Menendez + synopsis: Comonads + description: Comonads +-build-type: Custom ++build-type: Simple + extra-source-files: + .ghci + .gitignore +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/crypto-numbers_build-fix.patch b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch new file mode 100644 index 000000000..5c0693a31 --- /dev/null +++ b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch @@ -0,0 +1,227 @@ +From 0cfdb30120976290068f4bcbebbf236b960afbb6 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 26 Dec 2013 20:01:30 -0400 +Subject: [PATCH] hack to build + +--- + Crypto/Number/Basic.hs | 14 -------------- + Crypto/Number/ModArithmetic.hs | 29 ----------------------------- + Crypto/Number/Prime.hs | 18 ------------------ + crypto-numbers.cabal | 2 +- + 4 files changed, 1 insertion(+), 62 deletions(-) + +diff --git a/Crypto/Number/Basic.hs b/Crypto/Number/Basic.hs +index 65c14b3..eaee853 100644 +--- a/Crypto/Number/Basic.hs ++++ b/Crypto/Number/Basic.hs +@@ -20,11 +20,7 @@ module Crypto.Number.Basic + , areEven + ) where + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-#else + import Data.Bits +-#endif + + -- | sqrti returns two integer (l,b) so that l <= sqrt i <= b + -- the implementation is quite naive, use an approximation for the first number +@@ -63,25 +59,16 @@ sqrti i + -- gcde 'a' 'b' find (x,y,gcd(a,b)) where ax + by = d + -- + gcde :: Integer -> Integer -> (Integer, Integer, Integer) +-#if MIN_VERSION_integer_gmp(0,5,1) +-gcde a b = (s, t, g) +- where (# g, s #) = gcdExtInteger a b +- t = (g - s * a) `div` b +-#else + gcde a b = if d < 0 then (-x,-y,-d) else (x,y,d) where + (d, x, y) = f (a,1,0) (b,0,1) + f t (0, _, _) = t + f (a', sa, ta) t@(b', sb, tb) = + let (q, r) = a' `divMod` b' in + f t (r, sa - (q * sb), ta - (q * tb)) +-#endif + + -- | get the extended GCD of two integer using the extended binary algorithm (HAC 14.61) + -- get (x,y,d) where d = gcd(a,b) and x,y satisfying ax + by = d + gcde_binary :: Integer -> Integer -> (Integer, Integer, Integer) +-#if MIN_VERSION_integer_gmp(0,5,1) +-gcde_binary = gcde +-#else + gcde_binary a' b' + | b' == 0 = (1,0,a') + | a' >= b' = compute a' b' +@@ -105,7 +92,6 @@ gcde_binary a' b' + in if u2 >= v2 + then loop g x y (u2 - v2) v2 (a2 - c2) (b2 - d2) c2 d2 + else loop g x y u2 (v2 - u2) a2 b2 (c2 - a2) (d2 - b2) +-#endif + + -- | check if a list of integer are all even + areEven :: [Integer] -> Bool +diff --git a/Crypto/Number/ModArithmetic.hs b/Crypto/Number/ModArithmetic.hs +index 942c12f..f8cfc32 100644 +--- a/Crypto/Number/ModArithmetic.hs ++++ b/Crypto/Number/ModArithmetic.hs +@@ -29,12 +29,8 @@ module Crypto.Number.ModArithmetic + import Control.Exception (throw, Exception) + import Data.Typeable + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-#else + import Crypto.Number.Basic (gcde_binary) + import Data.Bits +-#endif + + -- | Raised when two numbers are supposed to be coprimes but are not. + data CoprimesAssertionError = CoprimesAssertionError +@@ -55,13 +51,7 @@ expSafe :: Integer -- ^ base + -> Integer -- ^ exponant + -> Integer -- ^ modulo + -> Integer -- ^ result +-#if MIN_VERSION_integer_gmp(0,5,1) +-expSafe b e m +- | odd m = powModSecInteger b e m +- | otherwise = powModInteger b e m +-#else + expSafe = exponentiation +-#endif + + -- | Compute the modular exponentiation of base^exponant using + -- the fastest algorithm without any consideration for +@@ -74,11 +64,7 @@ expFast :: Integer -- ^ base + -> Integer -- ^ modulo + -> Integer -- ^ result + expFast = +-#if MIN_VERSION_integer_gmp(0,5,1) +- powModInteger +-#else + exponentiation +-#endif + + -- note on exponentiation: 0^0 is treated as 1 for mimicking the standard library; + -- the mathematic debate is still open on whether or not this is true, but pratically +@@ -87,22 +73,15 @@ expFast = + -- | exponentiation_rtl_binary computes modular exponentiation as b^e mod m + -- using the right-to-left binary exponentiation algorithm (HAC 14.79) + exponentiation_rtl_binary :: Integer -> Integer -> Integer -> Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-exponentiation_rtl_binary = expSafe +-#else + exponentiation_rtl_binary 0 0 m = 1 `mod` m + exponentiation_rtl_binary b e m = loop e b 1 + where sq x = (x * x) `mod` m + loop !0 _ !a = a `mod` m + loop !i !s !a = loop (i `shiftR` 1) (sq s) (if odd i then a * s else a) +-#endif + + -- | exponentiation computes modular exponentiation as b^e mod m + -- using repetitive squaring. + exponentiation :: Integer -> Integer -> Integer -> Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-exponentiation = expSafe +-#else + exponentiation b e m + | b == 1 = b + | e == 0 = 1 +@@ -110,7 +89,6 @@ exponentiation b e m + | even e = let p = (exponentiation b (e `div` 2) m) `mod` m + in (p^(2::Integer)) `mod` m + | otherwise = (b * exponentiation b (e-1) m) `mod` m +-#endif + + --{-# DEPRECATED exponantiation_rtl_binary "typo in API name it's called exponentiation_rtl_binary #-} + exponantiation_rtl_binary :: Integer -> Integer -> Integer -> Integer +@@ -122,17 +100,10 @@ exponantiation = exponentiation + + -- | inverse computes the modular inverse as in g^(-1) mod m + inverse :: Integer -> Integer -> Maybe Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-inverse g m +- | r == 0 = Nothing +- | otherwise = Just r +- where r = recipModInteger g m +-#else + inverse g m + | d > 1 = Nothing + | otherwise = Just (x `mod` m) + where (x,_,d) = gcde_binary g m +-#endif + + -- | Compute the modular inverse of 2 coprime numbers. + -- This is equivalent to inverse except that the result +diff --git a/Crypto/Number/Prime.hs b/Crypto/Number/Prime.hs +index 0cea9da..458c94d 100644 +--- a/Crypto/Number/Prime.hs ++++ b/Crypto/Number/Prime.hs +@@ -3,9 +3,7 @@ + #ifndef MIN_VERSION_integer_gmp + #define MIN_VERSION_integer_gmp(a,b,c) 0 + #endif +-#if MIN_VERSION_integer_gmp(0,5,1) + {-# LANGUAGE MagicHash #-} +-#endif + -- | + -- Module : Crypto.Number.Prime + -- License : BSD-style +@@ -30,12 +28,7 @@ import Crypto.Number.Generate + import Crypto.Number.Basic (sqrti, gcde_binary) + import Crypto.Number.ModArithmetic (exponantiation) + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-import GHC.Base +-#else + import Data.Bits +-#endif + + -- | returns if the number is probably prime. + -- first a list of small primes are implicitely tested for divisibility, +@@ -78,21 +71,11 @@ findPrimeFromWith rng prop !n + -- | find a prime from a starting point with no specific property. + findPrimeFrom :: CPRG g => g -> Integer -> (Integer, g) + findPrimeFrom rng n = +-#if MIN_VERSION_integer_gmp(0,5,1) +- (nextPrimeInteger n, rng) +-#else + findPrimeFromWith rng (\g _ -> (True, g)) n +-#endif + + -- | Miller Rabin algorithm return if the number is probably prime or composite. + -- the tries parameter is the number of recursion, that determines the accuracy of the test. + primalityTestMillerRabin :: CPRG g => g -> Int -> Integer -> (Bool, g) +-#if MIN_VERSION_integer_gmp(0,5,1) +-primalityTestMillerRabin rng (I# tries) !n = +- case testPrimeInteger n tries of +- 0# -> (False, rng) +- _ -> (True, rng) +-#else + primalityTestMillerRabin rng tries !n + | n <= 3 = error "Miller-Rabin requires tested value to be > 3" + | even n = (False, rng) +@@ -129,7 +112,6 @@ primalityTestMillerRabin rng tries !n + | x2 == 1 = False + | x2 /= nm1 = loop' ws ((x2*x2) `mod` n) (r+1) + | otherwise = loop ws +-#endif + + {- + n < z -> witness to test +diff --git a/crypto-numbers.cabal b/crypto-numbers.cabal +index 9610e34..6669d78 100644 +--- a/crypto-numbers.cabal ++++ b/crypto-numbers.cabal +@@ -15,7 +15,7 @@ Extra-Source-Files: Tests/*.hs + + Flag integer-gmp + Description: Are we using integer-gmp? +- Default: True ++ Default: False + + Library + Build-Depends: base >= 4 && < 5 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/distributive_0.4.4_0001-fixes-for-cross-build.patch b/standalone/android/haskell-patches/distributive_0.4.4_0001-fixes-for-cross-build.patch new file mode 100644 index 000000000..4229d644d --- /dev/null +++ b/standalone/android/haskell-patches/distributive_0.4.4_0001-fixes-for-cross-build.patch @@ -0,0 +1,25 @@ +From 86eca0993e1716b4db14570836efbe838626892f Mon Sep 17 00:00:00 2001 +From: dummy +Date: Sun, 25 May 2014 09:11:15 +0200 +Subject: [PATCH] cross build + +--- + distributive.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/distributive.cabal b/distributive.cabal +index 9be5133..3e72c65 100644 +--- a/distributive.cabal ++++ b/distributive.cabal +@@ -12,7 +12,7 @@ bug-reports: http://github.com/ekmett/distributive/issues + copyright: Copyright (C) 2011-2014 Edward A. Kmett + synopsis: Distributive functors -- Dual to Traversable + description: Distributive functors -- Dual to Traversable +-build-type: Custom ++build-type: Simple + extra-source-files: + .ghci + .travis.yml +-- +2.0.0.rc2 + diff --git a/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch b/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch new file mode 100644 index 000000000..a00338fab --- /dev/null +++ b/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch @@ -0,0 +1,66 @@ +From aaef1aadb21a198475a656132ef4488b85b8fd1b Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 3 Jul 2014 23:22:47 +0000 +Subject: [PATCH] use android net.dns1 command instead of resolv.conf file + +Android has no /etc/resolv.conf. Some might have /system/etc/resolv.conf, +but even that does not seem likely. + +This is likely a little slow, but is at least fine for git-annex's uses, +since it only uses this library for occasional SRV lookups. +--- + Network/DNS/Resolver.hs | 11 +++++++++-- + dns.cabal | 1 + + 2 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/Network/DNS/Resolver.hs b/Network/DNS/Resolver.hs +index e4124b8..7aca431 100644 +--- a/Network/DNS/Resolver.hs ++++ b/Network/DNS/Resolver.hs +@@ -19,7 +19,7 @@ module Network.DNS.Resolver ( + ) where + + import Control.Applicative ((<$>), (<*>), pure) +-import Control.Exception (bracket) ++import Control.Exception (bracket, catch, IOException) + import qualified Data.ByteString.Char8 as BS + import Data.Char (isSpace) + import Data.List (isPrefixOf) +@@ -32,6 +32,7 @@ import Network.Socket (AddrInfoFlag(..), AddrInfo(..), SockAddr(..), PortNumber( + import Prelude hiding (lookup) + import System.Random (getStdRandom, randomR) + import System.Timeout (timeout) ++import System.Process + + #if mingw32_HOST_OS == 1 + import Network.Socket (send) +@@ -132,7 +133,13 @@ makeResolvSeed conf = ResolvSeed <$> addr + addr = case resolvInfo conf of + RCHostName numhost -> makeAddrInfo numhost Nothing + RCHostPort numhost mport -> makeAddrInfo numhost $ Just mport +- RCFilePath file -> toAddr <$> readFile file >>= \i -> makeAddrInfo i Nothing ++ RCFilePath file -> do ++ -- Android has no /etc/resolv.conf; use getprop command. ++ ls <- catch (lines <$> readProcess "getprop" ["net.dns1"] []) (const (return []) :: IOException -> IO [String]) ++ let addr = case ls of ++ [] -> "8.8.8.8" -- google public dns as a fallback only ++ (l:_) -> l ++ makeAddrInfo addr Nothing + toAddr cs = let l:_ = filter ("nameserver" `isPrefixOf`) $ lines cs + in extract l + extract = reverse . dropWhile isSpace . reverse . dropWhile isSpace . drop 11 +diff --git a/dns.cabal b/dns.cabal +index 0a08a9e..724a3e0 100644 +--- a/dns.cabal ++++ b/dns.cabal +@@ -38,6 +38,7 @@ Library + , network >= 2.3 + , random + , resourcet ++ , process + else + Build-Depends: base >= 4 && < 5 + , attoparsec +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/entropy_cross-build.patch b/standalone/android/haskell-patches/entropy_cross-build.patch new file mode 100644 index 000000000..37e85ed13 --- /dev/null +++ b/standalone/android/haskell-patches/entropy_cross-build.patch @@ -0,0 +1,25 @@ +From a3cc880bd06a8d7efda79339afa81e02decbd04b Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 14 Jul 2014 21:01:25 +0000 +Subject: [PATCH] fix cross build + +--- + entropy.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/entropy.cabal b/entropy.cabal +index 914d33a..9ab80f7 100644 +--- a/entropy.cabal ++++ b/entropy.cabal +@@ -16,7 +16,7 @@ bug-reports: https://github.com/TomMD/entropy/issues + stability: stable + -- build-type: Simple + -- ^^ Used for HaLVM +-build-type: Custom ++build-type: Simple + -- ^^ Test for RDRAND support using 'ghc' + cabal-version: >=1.10 + tested-with: GHC == 7.8.2 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch b/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch new file mode 100644 index 000000000..6f75da240 --- /dev/null +++ b/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch @@ -0,0 +1,43 @@ +From 311aab1ae9d7a653edfbec1351f548b98de85c4b Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Mon, 26 May 2014 21:54:18 +0000 +Subject: [PATCH] hack gnutls to link on android + +This uses a hardcoded path to the library, which includes the +arm-linux-androideabi-4.8 part. Will need to be changed when that changes.. + +Have to list all the libraries that gnutls depends on, pkgconfig depends +seems not to be working. +--- + gnutls.cabal | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/gnutls.cabal b/gnutls.cabal +index 5bfe687..61db23f 100644 +--- a/gnutls.cabal ++++ b/gnutls.cabal +@@ -31,16 +31,17 @@ source-repository this + library + hs-source-dirs: lib + ghc-options: -Wall -O2 ++ LD-Options: -L /home/builder/.ghc/android-14/arm-linux-androideabi-4.8/sysroot/usr/lib/ ++ ++ extra-libraries: gnutls nettle hogweed gmp z ++ pkgconfig-depends: gnutls + + build-depends: + base >= 4.0 && < 5.0 +- , bytestring >= 0.9 ++ , bytestring >= 0.10.3.0 + , transformers >= 0.2 + , monads-tf >= 0.1 && < 0.2 + +- extra-libraries: gnutls +- pkgconfig-depends: gnutls +- + exposed-modules: + Network.Protocol.TLS.GNU + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch new file mode 100644 index 000000000..42206a1cf --- /dev/null +++ b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch @@ -0,0 +1,25 @@ +From df0f41f92d003f7d59ef927737ffec3a9bd61827 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 7 May 2013 18:41:01 -0400 +Subject: [PATCH] avoid cabal hell + +--- + gsasl.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gsasl.cabal b/gsasl.cabal +index d991873..c5c2b19 100644 +--- a/gsasl.cabal ++++ b/gsasl.cabal +@@ -31,7 +31,7 @@ library + build-depends: + base >= 4.0 && < 5.0 + , transformers >= 0.2 +- , bytestring >= 0.9 ++ , bytestring >= 0.10.3.0 + + pkgconfig-depends: libgsasl >= 1.1 + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch b/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch new file mode 100644 index 000000000..bb9caec77 --- /dev/null +++ b/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch @@ -0,0 +1,47 @@ +From 7beec2e707d59f9573aa2dc7c57bd2a62f16b480 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 15 May 2013 19:06:03 -0400 +Subject: [PATCH] build without IPv6 stuff + +--- + Data/IP.hs | 2 +- + Data/IP/Addr.hs | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/Data/IP.hs b/Data/IP.hs +index cffef93..ea486c9 100644 +--- a/Data/IP.hs ++++ b/Data/IP.hs +@@ -6,7 +6,7 @@ module Data.IP ( + -- ** IP data + IP (..) + , IPv4, toIPv4, fromIPv4, fromHostAddress, toHostAddress +- , IPv6, toIPv6, fromIPv6, fromHostAddress6, toHostAddress6 ++ , IPv6, toIPv6, fromIPv6 -- , fromHostAddress6, toHostAddress6 + -- ** IP range data + , IPRange (..) + , AddrRange (addr, mask, mlen) +diff --git a/Data/IP/Addr.hs b/Data/IP/Addr.hs +index faaf0c7..5b556fb 100644 +--- a/Data/IP/Addr.hs ++++ b/Data/IP/Addr.hs +@@ -312,6 +312,7 @@ toHostAddress (IP4 addr4) + | byteOrder == LittleEndian = fixByteOrder addr4 + | otherwise = addr4 + ++{- + -- | The 'fromHostAddress6' function converts 'HostAddress6' to 'IPv6'. + fromHostAddress6 :: HostAddress6 -> IPv6 + fromHostAddress6 = IP6 +@@ -320,6 +321,8 @@ fromHostAddress6 = IP6 + toHostAddress6 :: IPv6 -> HostAddress6 + toHostAddress6 (IP6 addr6) = addr6 + ++-} ++ + fixByteOrder :: Word32 -> Word32 + fixByteOrder s = d1 .|. d2 .|. d3 .|. d4 + where +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch b/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch new file mode 100644 index 000000000..6182cba44 --- /dev/null +++ b/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch @@ -0,0 +1,25 @@ +From cb5252db1a0d515da69d9167a8b2facd839940b2 Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Mon, 11 Nov 2013 02:29:06 +0000 +Subject: [PATCH] fix build with new ghc + +--- + src/Language/JavaScript/Parser/Lexer.hs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/Language/JavaScript/Parser/Lexer.hs b/src/Language/JavaScript/Parser/Lexer.hs +index 79fa9c5..fa96e29 100644 +--- a/src/Language/JavaScript/Parser/Lexer.hs ++++ b/src/Language/JavaScript/Parser/Lexer.hs +@@ -712,7 +712,7 @@ alex_scan_tkn user orig_input len input s last_acc = + (offset) = (base +# ord_c) + (check) = alexIndexInt16OffAddr alex_check offset + +- (new_s) = if (offset >=# 0#) && (check ==# ord_c) ++ (new_s) = if (tagToEnum# (offset >=# 0#)) && (tagToEnum# (check ==# ord_c)) + then alexIndexInt16OffAddr alex_table offset + else alexIndexInt16OffAddr alex_deflt s + in +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch b/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch new file mode 100644 index 000000000..5b07f233b --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch @@ -0,0 +1,157 @@ +From 7861b133bb269b50fcf709291449cb0473818902 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Sun, 29 Dec 2013 21:29:23 +0000 +Subject: [PATCH] remove Network.BSD symbols not available in bionic + +--- + Network/BSD.hsc | 98 ------------------------------------------------------- + 1 file changed, 98 deletions(-) + +diff --git a/Network/BSD.hsc b/Network/BSD.hsc +index d6dae85..27910f4 100644 +--- a/Network/BSD.hsc ++++ b/Network/BSD.hsc +@@ -30,15 +30,6 @@ module Network.BSD + , getHostByAddr + , hostAddress + +-#if defined(HAVE_GETHOSTENT) && !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +- , getHostEntries +- +- -- ** Low level functionality +- , setHostEntry +- , getHostEntry +- , endHostEntry +-#endif +- + -- * Service names + , ServiceEntry(..) + , ServiceName +@@ -64,14 +55,6 @@ module Network.BSD + , getProtocolNumber + , defaultProtocol + +-#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +- , getProtocolEntries +- -- ** Low level functionality +- , setProtocolEntry +- , getProtocolEntry +- , endProtocolEntry +-#endif +- + -- * Port numbers + , PortNumber + +@@ -83,11 +66,7 @@ module Network.BSD + #if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) + , getNetworkByName + , getNetworkByAddr +- , getNetworkEntries + -- ** Low level functionality +- , setNetworkEntry +- , getNetworkEntry +- , endNetworkEntry + #endif + ) where + +@@ -303,31 +282,6 @@ getProtocolNumber proto = do + (ProtocolEntry _ _ num) <- getProtocolByName proto + return num + +-#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +-getProtocolEntry :: IO ProtocolEntry -- Next Protocol Entry from DB +-getProtocolEntry = withLock $ do +- ent <- throwNoSuchThingIfNull "getProtocolEntry" "no such protocol entry" +- $ trySysCall c_getprotoent +- peek ent +- +-foreign import ccall unsafe "getprotoent" c_getprotoent :: IO (Ptr ProtocolEntry) +- +-setProtocolEntry :: Bool -> IO () -- Keep DB Open ? +-setProtocolEntry flg = withLock $ trySysCall $ c_setprotoent (fromBool flg) +- +-foreign import ccall unsafe "setprotoent" c_setprotoent :: CInt -> IO () +- +-endProtocolEntry :: IO () +-endProtocolEntry = withLock $ trySysCall $ c_endprotoent +- +-foreign import ccall unsafe "endprotoent" c_endprotoent :: IO () +- +-getProtocolEntries :: Bool -> IO [ProtocolEntry] +-getProtocolEntries stayOpen = withLock $ do +- setProtocolEntry stayOpen +- getEntries (getProtocolEntry) (endProtocolEntry) +-#endif +- + -- --------------------------------------------------------------------------- + -- Host lookups + +@@ -402,31 +356,6 @@ getHostByAddr family addr = do + foreign import CALLCONV safe "gethostbyaddr" + c_gethostbyaddr :: Ptr HostAddress -> CInt -> CInt -> IO (Ptr HostEntry) + +-#if defined(HAVE_GETHOSTENT) && !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +-getHostEntry :: IO HostEntry +-getHostEntry = withLock $ do +- throwNoSuchThingIfNull "getHostEntry" "unable to retrieve host entry" +- $ trySysCall $ c_gethostent +- >>= peek +- +-foreign import ccall unsafe "gethostent" c_gethostent :: IO (Ptr HostEntry) +- +-setHostEntry :: Bool -> IO () +-setHostEntry flg = withLock $ trySysCall $ c_sethostent (fromBool flg) +- +-foreign import ccall unsafe "sethostent" c_sethostent :: CInt -> IO () +- +-endHostEntry :: IO () +-endHostEntry = withLock $ c_endhostent +- +-foreign import ccall unsafe "endhostent" c_endhostent :: IO () +- +-getHostEntries :: Bool -> IO [HostEntry] +-getHostEntries stayOpen = do +- setHostEntry stayOpen +- getEntries (getHostEntry) (endHostEntry) +-#endif +- + -- --------------------------------------------------------------------------- + -- Accessing network information + +@@ -488,33 +417,6 @@ getNetworkByAddr addr family = withLock $ do + foreign import ccall unsafe "getnetbyaddr" + c_getnetbyaddr :: NetworkAddr -> CInt -> IO (Ptr NetworkEntry) + +-getNetworkEntry :: IO NetworkEntry +-getNetworkEntry = withLock $ do +- throwNoSuchThingIfNull "getNetworkEntry" "no more network entries" +- $ trySysCall $ c_getnetent +- >>= peek +- +-foreign import ccall unsafe "getnetent" c_getnetent :: IO (Ptr NetworkEntry) +- +--- | Open the network name database. The parameter specifies +--- whether a connection is maintained open between various +--- networkEntry calls +-setNetworkEntry :: Bool -> IO () +-setNetworkEntry flg = withLock $ trySysCall $ c_setnetent (fromBool flg) +- +-foreign import ccall unsafe "setnetent" c_setnetent :: CInt -> IO () +- +--- | Close the connection to the network name database. +-endNetworkEntry :: IO () +-endNetworkEntry = withLock $ trySysCall $ c_endnetent +- +-foreign import ccall unsafe "endnetent" c_endnetent :: IO () +- +--- | Get the list of network entries. +-getNetworkEntries :: Bool -> IO [NetworkEntry] +-getNetworkEntries stayOpen = do +- setNetworkEntry stayOpen +- getEntries (getNetworkEntry) (endNetworkEntry) + #endif + + -- Mutex for name service lockdown +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch b/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch new file mode 100644 index 000000000..116fa320e --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch @@ -0,0 +1,34 @@ +From 63a7a97511266c1a9d2414d3314ee17fc88bb8f2 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 15:58:35 +0000 +Subject: [PATCH] configure misdetects accept4 + +--- + Network/Socket.hsc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 9af31f8..6c21209 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -503,7 +503,7 @@ accept sock@(MkSocket s family stype protocol status) = do + return new_sock + #else + with (fromIntegral sz) $ \ ptr_len -> do +-# ifdef HAVE_ACCEPT4 ++#if 0 + new_sock <- throwSocketErrorIfMinus1RetryMayBlock "accept" + (threadWaitRead (fromIntegral s)) + (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK)) +@@ -1615,7 +1615,7 @@ foreign import CALLCONV SAFE_ON_WIN "connect" + c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt + foreign import CALLCONV unsafe "accept" + c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt +-#ifdef HAVE_ACCEPT4 ++#if 0 + foreign import CALLCONV unsafe "accept4" + c_accept4 :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt + #endif +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch b/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch new file mode 100644 index 000000000..4cc22cbca --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch @@ -0,0 +1,28 @@ +From b1a581007759e2d9e53ef776e4f10d1de87b8377 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 7 May 2013 14:51:09 -0400 +Subject: [PATCH] getprotobyname hack for tcp and udp + +Otherwise, core network stuff fails to get the numbers for these protocols. +--- + Network/BSD.hsc | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/Network/BSD.hsc b/Network/BSD.hsc +index f0c9f5b..a289143 100644 +--- a/Network/BSD.hsc ++++ b/Network/BSD.hsc +@@ -259,6 +259,10 @@ instance Storable ProtocolEntry where + poke _p = error "Storable.poke(BSD.ProtocolEntry) not implemented" + + getProtocolByName :: ProtocolName -> IO ProtocolEntry ++getProtocolByName "tcp" = return $ ++ ProtocolEntry {protoName = "tcp", protoAliases = ["TCP"], protoNumber = 6} ++getProtocolByName "udp" = return $ ++ ProtocolEntry {protoName = "udp", protoAliases = ["UDP"], protoNumber = 17} + getProtocolByName name = withLock $ do + withCString name $ \ name_cstr -> do + throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name) +-- +1.8.2.rc3 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch b/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch new file mode 100644 index 000000000..da4a71af2 --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch @@ -0,0 +1,25 @@ +From bfecbc7bd09cbbebdef12aa525dc17109326db3f Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Sun, 29 Dec 2013 21:31:07 +0000 +Subject: [PATCH] no NODELAY on android + +--- + Network/Socket.hsc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 6c21209..c360889 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -923,7 +923,7 @@ packSocketOption so = + Just MaxSegment -> Just ((#const IPPROTO_TCP), (#const TCP_MAXSEG)) + #endif + #ifdef TCP_NODELAY +- Just NoDelay -> Just ((#const IPPROTO_TCP), (#const TCP_NODELAY)) ++ Just NoDelay -> Nothing -- Just ((#const IPPROTO_TCP), (#const TCP_NODELAY)) + #endif + #ifdef TCP_CORK + Just Cork -> Just ((#const IPPROTO_TCP), (#const TCP_CORK)) +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.5.0.0_0001-android-port-fixes.patch b/standalone/android/haskell-patches/network_2.5.0.0_0001-android-port-fixes.patch new file mode 100644 index 000000000..325b89fb4 --- /dev/null +++ b/standalone/android/haskell-patches/network_2.5.0.0_0001-android-port-fixes.patch @@ -0,0 +1,161 @@ +From b3cb294077b627892721a2ebf9e0ce81f35f8c4c Mon Sep 17 00:00:00 2001 +From: dummy +Date: Sun, 25 May 2014 09:28:45 +0200 +Subject: [PATCH] android port fixes + +Build note: Ensure a hsc2hs in PATH is modified to pass -x to the real +one, to enable cross-compiling. +--- + Network/Socket.hsc | 22 ++++++---------------- + Network/Socket/ByteString.hsc | 2 +- + Network/Socket/Internal.hsc | 2 +- + Network/Socket/Types.hsc | 4 ++-- + cbits/HsNet.c | 14 ++++++++++++++ + configure | 1 + + 6 files changed, 25 insertions(+), 20 deletions(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 607b270..04a83e8 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -35,7 +35,7 @@ module Network.Socket + , SockAddr(..) + , SocketStatus(..) + , HostAddress +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , HostAddress6 + , FlowInfo + , ScopeID +@@ -52,7 +52,7 @@ module Network.Socket + , HostName + , ServiceName + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORT) || 1 + , AddrInfo(..) + + , AddrInfoFlag(..) +@@ -134,7 +134,7 @@ module Network.Socket + -- * Special constants + , aNY_PORT + , iNADDR_ANY +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , iN6ADDR_ANY + #endif + , sOMAXCONN +@@ -326,16 +326,6 @@ socket family stype protocol = do + setNonBlockIfNeeded fd + socket_status <- newMVar NotConnected + let sock = MkSocket fd family stype protocol socket_status +-#if HAVE_DECL_IPV6_V6ONLY +-# if defined(mingw32_HOST_OS) +- -- the IPv6Only option is only supported on Windows Vista and later, +- -- so trying to change it might throw an error +- when (family == AF_INET6) $ +- E.catch (setSocketOption sock IPv6Only 0) $ (\(_ :: E.IOException) -> return ()) +-# else +- when (family == AF_INET6) $ setSocketOption sock IPv6Only 0 +-# endif +-#endif + return sock + + -- | Build a pair of connected socket objects using the given address +@@ -1061,9 +1051,9 @@ aNY_PORT = 0 + iNADDR_ANY :: HostAddress + iNADDR_ANY = htonl (#const INADDR_ANY) + +-foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32 ++foreign import CALLCONV unsafe "my_htonl" htonl :: Word32 -> Word32 + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + -- | The IPv6 wild card address. + + iN6ADDR_ANY :: HostAddress6 +@@ -1241,7 +1231,7 @@ unpackBits ((k,v):xs) r + ----------------------------------------------------------------------------- + -- Address and service lookups + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORT) || 1 + + -- | Flags that control the querying behaviour of 'getAddrInfo'. + data AddrInfoFlag +diff --git a/Network/Socket/ByteString.hsc b/Network/Socket/ByteString.hsc +index e21ad1b..c2dd70a 100644 +--- a/Network/Socket/ByteString.hsc ++++ b/Network/Socket/ByteString.hsc +@@ -197,7 +197,7 @@ sendMany sock@(MkSocket fd _ _ _ _) cs = do + liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) -> + throwSocketErrorWaitWrite sock "writev" $ + c_writev (fromIntegral fd) iovsPtr +- (fromIntegral (min iovsLen (#const IOV_MAX))) ++ (fromIntegral (min iovsLen (0x0026))) + #else + sendMany sock = sendAll sock . B.concat + #endif +diff --git a/Network/Socket/Internal.hsc b/Network/Socket/Internal.hsc +index 83333f7..0dd6a7d 100644 +--- a/Network/Socket/Internal.hsc ++++ b/Network/Socket/Internal.hsc +@@ -24,7 +24,7 @@ module Network.Socket.Internal + ( + -- * Socket addresses + HostAddress +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , HostAddress6 + , FlowInfo + , ScopeID +diff --git a/Network/Socket/Types.hsc b/Network/Socket/Types.hsc +index 48a43bb..1c5994f 100644 +--- a/Network/Socket/Types.hsc ++++ b/Network/Socket/Types.hsc +@@ -711,8 +711,8 @@ intToPortNumber v = PortNum (htons (fromIntegral v)) + portNumberToInt :: PortNumber -> Int + portNumberToInt (PortNum po) = fromIntegral (ntohs po) + +-foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16 +-foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16 ++foreign import CALLCONV unsafe "my_ntohs" ntohs :: Word16 -> Word16 ++foreign import CALLCONV unsafe "my_htons" htons :: Word16 -> Word16 + --foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32 + + instance Enum PortNumber where +diff --git a/cbits/HsNet.c b/cbits/HsNet.c +index 86b55dc..5ea1199 100644 +--- a/cbits/HsNet.c ++++ b/cbits/HsNet.c +@@ -6,3 +6,17 @@ + + #define INLINE + #include "HsNet.h" ++ ++#include ++uint16_t my_htons(uint16_t v) ++{ ++ htons(v); ++} ++uint32_t my_htonl(uint32_t v) ++{ ++ htonl(v); ++} ++uint16_t my_ntohs(uint16_t v) ++{ ++ ntohs(v); ++} +diff --git a/configure b/configure +index db8240d..41674d9 100755 +--- a/configure ++++ b/configure +@@ -1,4 +1,5 @@ + #! /bin/sh ++set -- --host=arm-linux-androideabi + # Guess values for system-dependent variables and create Makefiles. + # Generated by GNU Autoconf 2.69 for Haskell network package 2.3.0.14. + # +-- +2.0.0.rc2 + diff --git a/standalone/android/haskell-patches/primitive_0.5.3.0_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch b/standalone/android/haskell-patches/primitive_0.5.3.0_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch new file mode 100644 index 000000000..efee692b5 --- /dev/null +++ b/standalone/android/haskell-patches/primitive_0.5.3.0_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch @@ -0,0 +1,25 @@ +From ff2d1519fb294a123636ac6bd80e50741922c856 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Sun, 25 May 2014 09:41:13 +0200 +Subject: [PATCH] disable i386 opt stuff to allow cross-compilation + +--- + primitive.cabal | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/primitive.cabal b/primitive.cabal +index 9651dfd..b655e8d 100644 +--- a/primitive.cabal ++++ b/primitive.cabal +@@ -47,8 +47,6 @@ Library + cc-options: -O3 -fomit-frame-pointer -Wall + if !os(solaris) + cc-options: -ftree-vectorize +- if arch(i386) || arch(x86_64) +- cc-options: -msse2 + + source-repository head + type: git +-- +2.0.0.rc2 + diff --git a/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch new file mode 100644 index 000000000..c9723f3f7 --- /dev/null +++ b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch @@ -0,0 +1,135 @@ +From e1a2f80f6bec25921ab645a0aaf1c6422a8917ab Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 11 Nov 2013 01:06:58 +0000 +Subject: [PATCH] fix + +--- + Network/Socks5/Command.hs | 8 +------- + Network/Socks5/Conf.hs | 1 - + Network/Socks5/Lowlevel.hs | 1 - + Network/Socks5/Types.hs | 18 +----------------- + Network/Socks5/Wire.hs | 2 -- + 5 files changed, 2 insertions(+), 28 deletions(-) + +diff --git a/Network/Socks5/Command.hs b/Network/Socks5/Command.hs +index db95fbd..fdba5ec 100644 +--- a/Network/Socks5/Command.hs ++++ b/Network/Socks5/Command.hs +@@ -13,7 +13,6 @@ module Network.Socks5.Command + , Connect(..) + , Command(..) + , connectIPV4 +- , connectIPV6 + , connectDomainName + -- * lowlevel interface + , rpc +@@ -29,7 +28,7 @@ import qualified Data.ByteString as B + import qualified Data.ByteString.Char8 as BC + import Data.Serialize + +-import Network.Socket (Socket, PortNumber, HostAddress, HostAddress6) ++import Network.Socket (Socket, PortNumber, HostAddress) + import Network.Socket.ByteString + + import Network.Socks5.Types +@@ -65,11 +64,6 @@ connectIPV4 socket hostaddr port = onReply <$> rpc_ socket (Connect $ SocksAddre + where onReply (SocksAddrIPV4 h, p) = (h, p) + onReply _ = error "ipv4 requested, got something different" + +-connectIPV6 :: Socket -> HostAddress6 -> PortNumber -> IO (HostAddress6, PortNumber) +-connectIPV6 socket hostaddr6 port = onReply <$> rpc_ socket (Connect $ SocksAddress (SocksAddrIPV6 hostaddr6) port) +- where onReply (SocksAddrIPV6 h, p) = (h, p) +- onReply _ = error "ipv6 requested, got something different" +- + -- TODO: FQDN should only be ascii, maybe putting a "fqdn" data type + -- in front to make sure and make the BC.pack safe. + connectDomainName :: Socket -> String -> PortNumber -> IO (SocksHostAddress, PortNumber) +diff --git a/Network/Socks5/Conf.hs b/Network/Socks5/Conf.hs +index c29ff7b..007d382 100644 +--- a/Network/Socks5/Conf.hs ++++ b/Network/Socks5/Conf.hs +@@ -47,5 +47,4 @@ defaultSocksConfFromSockAddr sockaddr = SocksConf server SocksVer5 + where server = SocksAddress haddr port + (haddr,port) = case sockaddr of + SockAddrInet p h -> (SocksAddrIPV4 h, p) +- SockAddrInet6 p _ h _ -> (SocksAddrIPV6 h, p) + _ -> error "unsupported unix sockaddr type" +diff --git a/Network/Socks5/Lowlevel.hs b/Network/Socks5/Lowlevel.hs +index c10d9b9..2c3d59c 100644 +--- a/Network/Socks5/Lowlevel.hs ++++ b/Network/Socks5/Lowlevel.hs +@@ -17,7 +17,6 @@ resolveToSockAddr :: SocksAddress -> IO SockAddr + resolveToSockAddr (SocksAddress sockHostAddr port) = + case sockHostAddr of + SocksAddrIPV4 ha -> return $ SockAddrInet port ha +- SocksAddrIPV6 ha6 -> return $ SockAddrInet6 port 0 ha6 0 + SocksAddrDomainName bs -> do he <- getHostByName (BC.unpack bs) + return $ SockAddrInet port (hostAddress he) + +diff --git a/Network/Socks5/Types.hs b/Network/Socks5/Types.hs +index 7fbec25..17c7c83 100644 +--- a/Network/Socks5/Types.hs ++++ b/Network/Socks5/Types.hs +@@ -19,7 +19,7 @@ module Network.Socks5.Types + import Data.ByteString (ByteString) + import Data.Word + import Data.Data +-import Network.Socket (HostAddress, HostAddress6, PortNumber) ++import Network.Socket (HostAddress, PortNumber) + import Control.Exception + import qualified Data.ByteString.Char8 as BC + import Numeric (showHex) +@@ -53,12 +53,10 @@ data SocksMethod = + data SocksHostAddress = + SocksAddrIPV4 !HostAddress + | SocksAddrDomainName !ByteString +- | SocksAddrIPV6 !HostAddress6 + deriving (Eq,Ord) + + instance Show SocksHostAddress where + show (SocksAddrIPV4 ha) = "SocksAddrIPV4(" ++ showHostAddress ha ++ ")" +- show (SocksAddrIPV6 ha6) = "SocksAddrIPV6(" ++ showHostAddress6 ha6 ++ ")" + show (SocksAddrDomainName dn) = "SocksAddrDomainName(" ++ BC.unpack dn ++ ")" + + -- | Converts a HostAddress to a String in dot-decimal notation +@@ -69,20 +67,6 @@ showHostAddress num = concat [show q1, ".", show q2, ".", show q3, ".", show q4] + (num''',q3) = num'' `quotRem` 256 + (_,q4) = num''' `quotRem` 256 + +--- | Converts a IPv6 HostAddress6 to standard hex notation +-showHostAddress6 :: HostAddress6 -> String +-showHostAddress6 (a,b,c,d) = +- (concat . intersperse ":" . map (flip showHex "")) +- [p1,p2,p3,p4,p5,p6,p7,p8] +- where (a',p2) = a `quotRem` 65536 +- (_,p1) = a' `quotRem` 65536 +- (b',p4) = b `quotRem` 65536 +- (_,p3) = b' `quotRem` 65536 +- (c',p6) = c `quotRem` 65536 +- (_,p5) = c' `quotRem` 65536 +- (d',p8) = d `quotRem` 65536 +- (_,p7) = d' `quotRem` 65536 +- + -- | Describe a Socket address on the SOCKS protocol + data SocksAddress = SocksAddress !SocksHostAddress !PortNumber + deriving (Show,Eq,Ord) +diff --git a/Network/Socks5/Wire.hs b/Network/Socks5/Wire.hs +index 10bd262..a30f32e 100644 +--- a/Network/Socks5/Wire.hs ++++ b/Network/Socks5/Wire.hs +@@ -46,12 +46,10 @@ data SocksResponse = SocksResponse + + getAddr 1 = SocksAddrIPV4 <$> getWord32host + getAddr 3 = SocksAddrDomainName <$> (getWord8 >>= getByteString . fromIntegral) +-getAddr 4 = SocksAddrIPV6 <$> (liftM4 (,,,) getWord32host getWord32host getWord32host getWord32host) + getAddr n = error ("cannot get unknown socket address type: " ++ show n) + + putAddr (SocksAddrIPV4 h) = putWord8 1 >> putWord32host h + putAddr (SocksAddrDomainName b) = putWord8 3 >> putWord8 (fromIntegral $ B.length b) >> putByteString b +-putAddr (SocksAddrIPV6 (a,b,c,d)) = putWord8 4 >> mapM_ putWord32host [a,b,c,d] + + getSocksRequest 5 = do + cmd <- toEnum . fromIntegral <$> getWord8 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/stm-chans_cross-build.patch b/standalone/android/haskell-patches/stm-chans_cross-build.patch new file mode 100644 index 000000000..f0964d693 --- /dev/null +++ b/standalone/android/haskell-patches/stm-chans_cross-build.patch @@ -0,0 +1,25 @@ +From c1b166ad1dbed80f7eed7b9c1b2dc5c668eeb8fc Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Fri, 18 Oct 2013 23:28:56 +0000 +Subject: [PATCH] cross build + +--- + stm-chans.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/stm-chans.cabal b/stm-chans.cabal +index 89d4780..2119a74 100644 +--- a/stm-chans.cabal ++++ b/stm-chans.cabal +@@ -6,7 +6,7 @@ + -- and source-repository:. + Cabal-Version: >= 1.6 + -- We need a custom build in order to define __HADDOCK__ +-Build-Type: Custom ++Build-Type: Simple + + Name: stm-chans + Version: 3.0.0 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/system-filepath_cross-build.patch b/standalone/android/haskell-patches/system-filepath_cross-build.patch new file mode 100644 index 000000000..c9f9304a4 --- /dev/null +++ b/standalone/android/haskell-patches/system-filepath_cross-build.patch @@ -0,0 +1,25 @@ +From 0e728d5b049224394908d793c73902a8c981e636 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 26 May 2014 01:04:40 +0000 +Subject: [PATCH] fix cross build + +--- + system-filepath.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/system-filepath.cabal b/system-filepath.cabal +index d6aa726..f4e5e0f 100644 +--- a/system-filepath.cabal ++++ b/system-filepath.cabal +@@ -6,7 +6,7 @@ license-file: license.txt + author: John Millikin + maintainer: John Millikin + copyright: John Millikin 2010-2012 +-build-type: Custom ++build-type: Simple + cabal-version: >= 1.8 + category: System + stability: experimental +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch b/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch new file mode 100644 index 000000000..dd0a7fca9 --- /dev/null +++ b/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch @@ -0,0 +1,25 @@ +From 0ad071f80ee72e7b8ca5b0b70dfae5bbf8677969 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 12 Mar 2014 12:18:17 -0400 +Subject: [PATCH] cross build + +--- + unbounded-delays.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/unbounded-delays.cabal b/unbounded-delays.cabal +index 76d0a50..0f27569 100644 +--- a/unbounded-delays.cabal ++++ b/unbounded-delays.cabal +@@ -1,7 +1,7 @@ + name: unbounded-delays + version: 0.1.0.6 + cabal-version: >= 1.6 +-build-type: Custom ++build-type: Simple + author: Bas van Dijk + Roel van Dijk + maintainer: Bas van Dijk +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch new file mode 100644 index 000000000..4955d45cd --- /dev/null +++ b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch @@ -0,0 +1,69 @@ +From add5feeb9ee9b4ffa1b43e4ba04b63e5ac2bfaf7 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 14 Jul 2014 20:45:24 +0000 +Subject: [PATCH] hack for bionic + +--- + Data/UnixTime/Types.hsc | 12 ------------ + cbits/conv.c | 2 +- + unix-time.cabal | 1 - + 3 files changed, 1 insertion(+), 14 deletions(-) + +diff --git a/Data/UnixTime/Types.hsc b/Data/UnixTime/Types.hsc +index 2ad0623..04fd766 100644 +--- a/Data/UnixTime/Types.hsc ++++ b/Data/UnixTime/Types.hsc +@@ -12,8 +12,6 @@ import Data.Binary + + #include + +-#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) +- + -- | + -- Data structure for Unix time. + data UnixTime = UnixTime { +@@ -23,16 +21,6 @@ data UnixTime = UnixTime { + , utMicroSeconds :: {-# UNPACK #-} !Int32 + } deriving (Eq,Ord,Show) + +-instance Storable UnixTime where +- sizeOf _ = (#size struct timeval) +- alignment _ = (#alignment struct timeval) +- peek ptr = UnixTime +- <$> (#peek struct timeval, tv_sec) ptr +- <*> (#peek struct timeval, tv_usec) ptr +- poke ptr ut = do +- (#poke struct timeval, tv_sec) ptr (utSeconds ut) +- (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut) +- + #if __GLASGOW_HASKELL__ >= 704 + instance Binary UnixTime where + put (UnixTime (CTime sec) msec) = do +diff --git a/cbits/conv.c b/cbits/conv.c +index ec31fef..b7bc0f9 100644 +--- a/cbits/conv.c ++++ b/cbits/conv.c +@@ -96,7 +96,7 @@ time_t c_parse_unix_time_gmt(char *fmt, char *src) { + #else + strptime(src, fmt, &dst); + #endif +- return timegm(&dst); ++ return NULL; /* timegm(&dst); (not in Bionic) */ + } + + size_t c_format_unix_time(char *fmt, time_t src, char* dst, int siz) { +diff --git a/unix-time.cabal b/unix-time.cabal +index 5de3f7c..7a0c244 100644 +--- a/unix-time.cabal ++++ b/unix-time.cabal +@@ -15,7 +15,6 @@ Extra-Tmp-Files: config.log config.status autom4te.cache cbits/config.h + Library + Default-Language: Haskell2010 + GHC-Options: -Wall +- CC-Options: -fPIC + Exposed-Modules: Data.UnixTime + Other-Modules: Data.UnixTime.Conv + Data.UnixTime.Diff +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch b/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch new file mode 100644 index 000000000..12cb2a922 --- /dev/null +++ b/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch @@ -0,0 +1,79 @@ +From 87283f9b6f992a7f0e36c7b1bafc288bf2bf106a Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Mon, 11 Nov 2013 02:46:27 +0000 +Subject: [PATCH] build without v1 uuid which needs network-ino + +--- + Data/UUID/Util.hs | 11 ----------- + Data/UUID/V1.hs | 2 -- + uuid.cabal | 2 -- + 3 files changed, 15 deletions(-) + +diff --git a/Data/UUID/Util.hs b/Data/UUID/Util.hs +index 581391a..399e508 100644 +--- a/Data/UUID/Util.hs ++++ b/Data/UUID/Util.hs +@@ -3,7 +3,6 @@ module Data.UUID.Util ( + UnpackedUUID(..) + , unpack, pack + , version +- , extractMac + , extractTime + , setTime + ) where +@@ -13,7 +12,6 @@ import Data.Word + import Data.Word.Util + import Data.Bits + import Data.UUID.Internal +-import Network.Info + import Data.Int (Int64) + + version :: UUID -> Int +@@ -43,12 +41,3 @@ extractTime uuid = + timeAndVersionToTime :: Word16 -> Word16 + timeAndVersionToTime tv = tv .&. 0x0FFF + +-extractMac :: UUID -> Maybe MAC +-extractMac uuid = +- if version uuid == 1 +- then Just $ +- MAC (node_0 unpacked) (node_1 unpacked) (node_2 unpacked) (node_3 unpacked) (node_4 unpacked) (node_5 unpacked) +- else Nothing +- where +- unpacked = unpack uuid +- +diff --git a/Data/UUID/V1.hs b/Data/UUID/V1.hs +index 067e729..ca4c235 100644 +--- a/Data/UUID/V1.hs ++++ b/Data/UUID/V1.hs +@@ -37,8 +37,6 @@ import System.IO.Unsafe + + import qualified System.Random as R + +-import Network.Info +- + import Data.UUID.Builder + import Data.UUID.Internal + +diff --git a/uuid.cabal b/uuid.cabal +index 0a53059..57b1b86 100644 +--- a/uuid.cabal ++++ b/uuid.cabal +@@ -32,14 +32,12 @@ Library + cryptohash >= 0.7 && < 0.12, + deepseq == 1.3.*, + hashable (>= 1.1.1.0 && < 1.2.0) || (>= 1.2.1 && < 1.3), +- network-info == 0.2.*, + random >= 1.0.1 && < 1.1, + time >= 1.1 && < 1.5 + + Exposed-Modules: + Data.UUID + Data.UUID.Util +- Data.UUID.V1 + Data.UUID.V3 + Data.UUID.V4 + Data.UUID.V5 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch b/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch new file mode 100644 index 000000000..b3aa407df --- /dev/null +++ b/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch @@ -0,0 +1,36 @@ +From 2c736615e38ee4f582af9d98d7169cf07b84d875 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Mon, 10 Feb 2014 23:27:32 +0000 +Subject: [PATCH] support Android cert store + +Android puts it in a different place and has only hashed files. +See https://github.com/vincenthz/hs-certificate/issues/19 +--- + System/X509/Unix.hs | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/System/X509/Unix.hs b/System/X509/Unix.hs +index cbf9bbe..cab4f4a 100644 +--- a/System/X509/Unix.hs ++++ b/System/X509/Unix.hs +@@ -34,7 +34,7 @@ import qualified Control.Exception as E + import Data.Char + + defaultSystemPath :: FilePath +-defaultSystemPath = "/etc/ssl/certs/" ++defaultSystemPath = "/system/etc/security/cacerts/" + + envPathOverride :: String + envPathOverride = "SYSTEM_CERTIFICATE_PATH" +@@ -46,7 +46,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + && isDigit (s !! 9) + && (s !! 8) == '.' + && all isHexDigit (take 8 s) +- isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) ++ isCert x = (not $ isPrefixOf "." x) + + getSystemCertificateStore :: IO CertificateStore + getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch b/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch new file mode 100644 index 000000000..a899fb892 --- /dev/null +++ b/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch @@ -0,0 +1,35 @@ +From 63d07ae4a1e3b77cbe023364599f7c2c3e853d5f Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 28 Feb 2013 23:40:57 -0400 +Subject: [PATCH] hack to build on Android + +--- + Codec/Compression/Zlib/Stream.hsc | 4 ++-- + zlib.cabal | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/Codec/Compression/Zlib/Stream.hsc b/Codec/Compression/Zlib/Stream.hsc +index fe851e6..c6168f4 100644 +--- a/Codec/Compression/Zlib/Stream.hsc ++++ b/Codec/Compression/Zlib/Stream.hsc +@@ -921,7 +921,7 @@ foreign import ccall unsafe "zlib.h inflateInit2_" + + c_inflateInit2 :: StreamState -> CInt -> IO CInt + c_inflateInit2 z n = +- withCAString #{const_str ZLIB_VERSION} $ \versionStr -> ++ withCAString "1.2.5" $ \versionStr -> + c_inflateInit2_ z n versionStr (#{const sizeof(z_stream)} :: CInt) + + foreign import ccall unsafe "zlib.h inflate" +@@ -940,7 +940,7 @@ foreign import ccall unsafe "zlib.h deflateInit2_" + c_deflateInit2 :: StreamState + -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt + c_deflateInit2 z a b c d e = +- withCAString #{const_str ZLIB_VERSION} $ \versionStr -> ++ withCAString "1.2.5" $ \versionStr -> + c_deflateInit2_ z a b c d e versionStr (#{const sizeof(z_stream)} :: CInt) + + foreign import ccall unsafe "zlib.h deflateSetDictionary" +-- +1.7.10.4 + diff --git a/standalone/android/icons/drawable-hdpi/ic_launcher.png b/standalone/android/icons/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..6170d723c Binary files /dev/null and b/standalone/android/icons/drawable-hdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..f30483b38 Binary files /dev/null and b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-ldpi/ic_launcher.png b/standalone/android/icons/drawable-ldpi/ic_launcher.png new file mode 100644 index 000000000..0c5d55ab6 Binary files /dev/null and b/standalone/android/icons/drawable-ldpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..0e0b33e95 Binary files /dev/null and b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-mdpi/ic_launcher.png b/standalone/android/icons/drawable-mdpi/ic_launcher.png new file mode 100644 index 000000000..46302b21a Binary files /dev/null and b/standalone/android/icons/drawable-mdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..7febe040d Binary files /dev/null and b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-xhdpi/ic_launcher.png b/standalone/android/icons/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..601b787cb Binary files /dev/null and b/standalone/android/icons/drawable-xhdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..253e90eb8 Binary files /dev/null and b/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable/ic_launcher.png b/standalone/android/icons/drawable/ic_launcher.png new file mode 120000 index 000000000..28d94e566 --- /dev/null +++ b/standalone/android/icons/drawable/ic_launcher.png @@ -0,0 +1 @@ +../drawable-mdpi/ic_launcher.png \ No newline at end of file diff --git a/standalone/android/icons/drawable/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable/ic_stat_service_notification_icon.png new file mode 120000 index 000000000..3c30c49b0 --- /dev/null +++ b/standalone/android/icons/drawable/ic_stat_service_notification_icon.png @@ -0,0 +1 @@ +../drawable-mdpi/ic_stat_service_notification_icon.png \ No newline at end of file diff --git a/standalone/android/install-haskell-packages b/standalone/android/install-haskell-packages new file mode 100755 index 000000000..df870b96f --- /dev/null +++ b/standalone/android/install-haskell-packages @@ -0,0 +1,146 @@ +#!/bin/bash +# Bootstraps from an empty cabal to all the necessary haskell packages +# being installed, with the necessary patches to work on Android. +# +# You should install ghc-android first. +# +# Note that the newest version of packages is installed. +# It attempts to reuse patches for older versions, but +# new versions of packages often break cross-compilation by adding TH, +# etc +# +# Future work: Convert to using the method used here: +# https://github.com/kaoskorobase/ghc-ios-cabal-scripts/ + +set -e + +if [ ! -d haskell-patches ]; then + cd standalone/android +fi + +cabalopts="$@" + +setupcabal () { + cabal update + + # Workaround for http://www.reddit.com/r/haskell/comments/26045a/if_youre_finding_cabal_cant_build_your_project/ + # should be able to remove this eventually. + cabal install transformers-compat -fthree + cabal install mtl-2.1.3.1 + + # Some packages fail to install in a non unicode locale. + LANG=en_US.UTF-8 + export LANG + + # The android build chroot has recent versions of alex and happy + # installed here. + PATH=$HOME/bin:$PATH + export PATH +} + +cabalinstall () { + echo cabal install "$@" "$cabalopts" + eval cabal install "$@" "$cabalopts" +} + +patched () { + pkg=$1 + ver=$2 + if [ -z "$ver" ]; then + cabal unpack $pkg + else + cabal unpack $pkg-$ver + fi + cd $pkg* + git init + git config user.name dummy + git config user.email dummy@example.com + git add . + git commit -m "pre-patched state of $pkg" + for patch in ../../haskell-patches/${pkg}_* ../../../no-th/haskell-patches/${pkg}_*; do + if [ -e "$patch" ]; then + echo trying $patch + if ! patch -p1 < $patch; then + echo "failed to apply $patch" + echo "please resolve this, replace the patch with a new version, and exit the subshell to continue" + $SHELL + fi + fi + done + cabalinstall + rm -rf $pkg* + cd .. +} + +installgitannexdeps () { + pushd ../.. + echo cabal install --only-dependencies "$@" + cabal install --only-dependencies "$@" + popd +} + +install_pkgs () { + rm -rf tmp + mkdir tmp + cd tmp + + patched network + patched unix-time + patched lifted-base + patched zlib + patched MissingH + patched distributive + patched comonad + patched iproute + patched primitive + patched socks + patched entropy + patched vector + patched stm-chans + patched persistent + patched profunctors + patched skein + patched lens + patched certificate + patched x509-system + patched persistent-template + patched system-filepath + patched wai-app-static + patched shakespeare + patched shakespeare-css + patched shakespeare-js + patched yesod-routes + patched yesod-core + patched yesod-persistent + patched yesod-form + patched crypto-numbers + patched yesod-auth + patched yesod + patched shakespeare-text + patched process-conduit + patched DAV + patched yesod-static + patched uuid + patched dns + patched gnutls + patched unbounded-delays + + cd .. + + installgitannexdeps -fAndroid -f-Pairing +} + +echo +echo +echo native build +echo +setupcabal +installgitannexdeps + +echo +echo +echo cross build +echo +PATH=$HOME/.ghc/$(cat abiversion)/bin:$HOME/.ghc/$(cat abiversion)/arm-linux-androideabi/bin:$PATH +setupcabal +install_pkgs diff --git a/standalone/android/openssh.config.h b/standalone/android/openssh.config.h new file mode 100644 index 000000000..31e78e0b8 --- /dev/null +++ b/standalone/android/openssh.config.h @@ -0,0 +1,249 @@ +#define DISABLE_SHADOW 1 +#define DISABLE_UTMP 1 +#define DISABLE_UTMPX 1 +#define DISABLE_WTMP 1 +#define DISABLE_WTMPX 1 +#define ENABLE_PKCS11 /**/ +#define GETPGRP_VOID 1 +#define GLOB_HAS_ALTDIRFUNC 1 +#define HAS_SHADOW_EXPIRE 1 +#define HAVE_ADDR_IN_UTMP 1 +#define HAVE_ADDR_IN_UTMPX 1 +#define HAVE_ADDR_V6_IN_UTMP 1 +#define HAVE_ADDR_V6_IN_UTMPX 1 +#define HAVE_ASPRINTF 1 +#define HAVE_ATTRIBUTE__NONNULL__ 1 +#define HAVE_BASENAME 1 +#define HAVE_BCOPY 1 +#define HAVE_BN_IS_PRIME_EX 1 +#define HAVE_CLOCK 1 +#define HAVE_CLOCK_T 1 +#define HAVE_CONST_GAI_STRERROR_PROTO 1 +#define HAVE_CONTROL_IN_MSGHDR 1 +#define HAVE_DAEMON 1 +#define HAVE_DECL_GLOB_NOMATCH 1 +#define HAVE_DECL_H_ERRNO 1 +#define HAVE_DECL_MAXSYMLINKS 1 +#define HAVE_DECL_OFFSETOF 1 +#define HAVE_DECL_O_NONBLOCK 1 +#define HAVE_DECL_SHUT_RD 1 +#define HAVE_DECL_WRITEV 1 +#define HAVE_DECL__GETLONG 0 +#define HAVE_DECL__GETSHORT 0 +#define HAVE_DEV_PTMX 1 +#define HAVE_DIRENT_H 1 +#define HAVE_DIRFD 1 +#define HAVE_DIRNAME 1 +#define HAVE_DSA_GENERATE_PARAMETERS_EX 1 +#define HAVE_ENDIAN_H 1 +#define HAVE_ENDUTENT 1 +#define HAVE_ENDUTXENT 1 +#define HAVE_EVP_SHA256 1 +#define HAVE_EXIT_IN_UTMP 1 +#define HAVE_FCHMOD 1 +#define HAVE_FCHOWN 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FEATURES_H 1 +#define HAVE_FREEADDRINFO 1 +#define HAVE_FSBLKCNT_T 1 +#define HAVE_FSFILCNT_T 1 +#define HAVE_GAI_STRERROR 1 +#define HAVE_GETADDRINFO 1 +#define HAVE_GETCWD 1 +#define HAVE_GETNAMEINFO 1 +#define HAVE_GETOPT 1 +#define HAVE_GETOPT_H 1 +#define HAVE_GETPAGESIZE 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_GETTTYENT 1 +#define HAVE_GETUTENT 1 +#define HAVE_GETUTID 1 +#define HAVE_GETUTLINE 1 +#define HAVE_GETUTXENT 1 +#define HAVE_GETUTXID 1 +#define HAVE_GETUTXLINE 1 +#define HAVE_GLOB 1 +#define HAVE_GLOB_H 1 +#define HAVE_HEADER_AD 1 +#define HAVE_HMAC_CTX_INIT 1 +#define HAVE_HOST_IN_UTMP 1 +#define HAVE_HOST_IN_UTMPX 1 +#define HAVE_ID_IN_UTMP 1 +#define HAVE_ID_IN_UTMPX 1 +#define HAVE_INET_ATON 1 +#define HAVE_INET_NTOA 1 +#define HAVE_INET_NTOP 1 +#define HAVE_INT64_T 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_INTXX_T 1 +#define HAVE_IN_ADDR_T 1 +#define HAVE_ISBLANK 1 +#define HAVE_LASTLOG_H 1 +#define HAVE_LIBGEN_H 1 +#define HAVE_LIBNSL 1 +#define HAVE_LIBZ 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LINUX_AUDIT_H 1 +#define HAVE_LINUX_FILTER_H 1 +#define HAVE_LINUX_IF_TUN_H 1 +#define HAVE_LOGOUT 1 +#define HAVE_LOGWTMP 1 +#define HAVE_LONG_DOUBLE 1 +#define HAVE_LONG_LONG 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMORY_H 1 +#define HAVE_MKDTEMP 1 +#define HAVE_MMAP 1 +#define HAVE_MODE_T 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_NETDB_H 1 +#define HAVE_OPENSSL 1 +#define HAVE_PATHS_H 1 +#define HAVE_PID_IN_UTMP 1 +#define HAVE_PID_T 1 +#define HAVE_POLL 1 +#define HAVE_POLL_H 1 +#define HAVE_PRCTL 1 +#define HAVE_PROC_PID 1 +#define HAVE_PUTUTLINE 1 +#define HAVE_PUTUTXLINE 1 +#define HAVE_REALPATH 1 +#define HAVE_RECVMSG 1 +#define HAVE_RLIMIT_NPROC /**/ +#define HAVE_RSA_GENERATE_KEY_EX 1 +#define HAVE_RSA_GET_DEFAULT_METHOD 1 +#define HAVE_SA_FAMILY_T 1 +#define HAVE_SENDMSG 1 +#define HAVE_SETEGID 1 +#define HAVE_SETENV 1 +#define HAVE_SETEUID 1 +#define HAVE_SETGROUPS 1 +#define HAVE_SETREGID 1 +#define HAVE_SETRESGID 1 +#define HAVE_SETRESUID 1 +#define HAVE_SETREUID 1 +#define HAVE_SETRLIMIT 1 +#define HAVE_SETSID 1 +#define HAVE_SETUTENT 1 +#define HAVE_SETUTXENT 1 +#define HAVE_SETVBUF 1 +#define HAVE_SHA256_UPDATE 1 +#define HAVE_SIGACTION 1 +#define HAVE_SIGVEC 1 +#define HAVE_SIG_ATOMIC_T 1 +#define HAVE_SIZE_T 1 +#define HAVE_SNPRINTF 1 +#define HAVE_SOCKETPAIR 1 +#define HAVE_SO_PEERCRED 1 +#define HAVE_SSIZE_T 1 +#define HAVE_SS_FAMILY_IN_SS 1 +#define HAVE_STATFS 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRDUP 1 +#define HAVE_STRERROR 1 +#define HAVE_STRFTIME 1 +#define HAVE_STRICT_MKSTEMP 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRNLEN 1 +#define HAVE_STRPTIME 1 +#define HAVE_STRSEP 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRUCT_ADDRINFO 1 +#define HAVE_STRUCT_IN6_ADDR 1 +#define HAVE_STRUCT_SOCKADDR_IN6 1 +#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +#define HAVE_STRUCT_TIMESPEC 1 +#define HAVE_STRUCT_TIMEVAL 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYS_CDEFS_H 1 +#define HAVE_SYS_DIR_H 1 +#define HAVE_SYS_ERRLIST 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_MOUNT_H 1 +#define HAVE_SYS_NERR 1 +#define HAVE_SYS_POLL_H 1 +#define HAVE_SYS_PRCTL_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_SYSMACROS_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_UN_H 1 +#define HAVE_TCGETPGRP 1 +#define HAVE_TCSENDBREAK 1 +#define HAVE_TIME 1 +#define HAVE_TIME_H 1 +#define HAVE_TRUNCATE 1 +#define HAVE_TV_IN_UTMP 1 +#define HAVE_TV_IN_UTMPX 1 +#define HAVE_TYPE_IN_UTMP 1 +#define HAVE_TYPE_IN_UTMPX 1 +#define HAVE_UINTXX_T 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UNSETENV 1 +#define HAVE_UNSIGNED_LONG_LONG 1 +#define HAVE_UPDWTMP 1 +#define HAVE_UPDWTMPX 1 +#define HAVE_UTIMES 1 +#define HAVE_UTIME_H 1 +#define HAVE_UTMPNAME 1 +#define HAVE_UTMPXNAME 1 +#define HAVE_UTMP_H 1 +#define HAVE_U_CHAR 1 +#define HAVE_U_INT 1 +#define HAVE_U_INT64_T 1 +#define HAVE_U_INTXX_T 1 +#define HAVE_VASPRINTF 1 +#define HAVE_VA_COPY 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_WAITPID 1 +#define HAVE__GETLONG 1 +#define HAVE__GETSHORT 1 +#define HAVE__RES_EXTERN 1 +#define HAVE___FUNCTION__ 1 +#define HAVE___PROGNAME 1 +#define HAVE___VA_COPY 1 +#define HAVE___func__ 1 +#define IPV4_IN_IPV6 1 +#define LINK_OPNOTSUPP_ERRNO EPERM +#define LINUX_OOM_ADJUST 1 +#define LOCKED_PASSWD_PREFIX "!" +#define LOGIN_PROGRAM_FALLBACK "/bin/login" +#define MISSING_FD_MASK 1 +#define MISSING_HOWMANY 1 +#define OPENSSL_HAS_ECC 1 +#define OPENSSL_PRNG_ONLY 1 +#define PACKAGE_BUGREPORT "openssh-unix-dev@mindrot.org" +#define PACKAGE_NAME "OpenSSH" +#define PACKAGE_STRING "OpenSSH Portable" +#define PACKAGE_TARNAME "openssh" +#define PACKAGE_URL "" +#define PACKAGE_VERSION "Portable" +#define PAM_TTY_KLUDGE 1 +#define SANDBOX_RLIMIT 1 +#define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARM +#define SIZEOF_CHAR 1 +#define SIZEOF_INT 4 +#define SIZEOF_LONG_INT 8 +#define SIZEOF_LONG_LONG_INT 8 +#define SIZEOF_SHORT_INT 2 +#define SNPRINTF_CONST const +#define SPT_TYPE SPT_REUSEARGV +#define SSH_PRIVSEP_USER "shell" +#define SSH_TUN_COMPAT_AF 1 +#define SSH_TUN_LINUX 1 +#define SSH_TUN_PREPEND_AF 1 +#define STDC_HEADERS 1 +#define USER_PATH "/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin" +#define XAUTH_PATH "/usr/bin/xauth" +#define _PATH_BTMP "/var/log/btmp" +#define _PATH_PASSWD_PROG "/usr/bin/passwd" +#define _PATH_SSH_PIDDIR "/var/run" +#define ANDROID diff --git a/standalone/android/openssh.patch b/standalone/android/openssh.patch new file mode 100644 index 000000000..996143d0e --- /dev/null +++ b/standalone/android/openssh.patch @@ -0,0 +1,217 @@ +diff --git a/auth.c b/auth.c +index 6623e0f..dd10253 100644 +--- a/auth.c ++++ b/auth.c +@@ -337,7 +337,7 @@ expand_authorized_keys(const char *filename, struct passwd *pw) + char *file, ret[MAXPATHLEN]; + int i; + +- file = percent_expand(filename, "h", pw->pw_dir, ++ file = percent_expand(filename, "h", _PATH_ROOT_HOME_PREFIX, + "u", pw->pw_name, (char *)NULL); + + /* +@@ -347,7 +347,7 @@ expand_authorized_keys(const char *filename, struct passwd *pw) + if (*file == '/') + return (file); + +- i = snprintf(ret, sizeof(ret), "%s/%s", pw->pw_dir, file); ++ i = snprintf(ret, sizeof(ret), "%s/%s", _PATH_ROOT_HOME_PREFIX, file); + if (i < 0 || (size_t)i >= sizeof(ret)) + fatal("expand_authorized_keys: path too long"); + xfree(file); +@@ -436,7 +436,7 @@ secure_filename(FILE *f, const char *file, struct passwd *pw, + strerror(errno)); + return -1; + } +- if (realpath(pw->pw_dir, homedir) != NULL) ++ if (realpath(_PATH_ROOT_HOME_PREFIX, homedir) != NULL) + comparehome = 1; + + /* check the open file to avoid races */ +diff --git a/authfile.c b/authfile.c +index 7dd4496..00462e9 100644 +--- a/authfile.c ++++ b/authfile.c +@@ -613,6 +613,7 @@ int + key_perm_ok(int fd, const char *filename) + { + struct stat st; ++ return 1; /* check doesn't make sense on android */ + + if (fstat(fd, &st) < 0) + return 0; +diff --git a/misc.c b/misc.c +index 0bf2db6..4327d03 100644 +--- a/misc.c ++++ b/misc.c +@@ -25,6 +25,7 @@ + */ + + #include "includes.h" ++#include "pathnames.h" + + #include + #include +@@ -538,12 +539,13 @@ tilde_expand_filename(const char *filename, uid_t uid) + } else if ((pw = getpwuid(uid)) == NULL) /* ~/path */ + fatal("tilde_expand_filename: No such uid %ld", (long)uid); + +- if (strlcpy(ret, pw->pw_dir, sizeof(ret)) >= sizeof(ret)) ++ char *pw_dir=_PATH_ROOT_HOME_PREFIX; ++ if (strlcpy(ret, pw_dir, sizeof(ret)) >= sizeof(ret)) + fatal("tilde_expand_filename: Path too long"); + + /* Make sure directory has a trailing '/' */ +- len = strlen(pw->pw_dir); +- if ((len == 0 || pw->pw_dir[len - 1] != '/') && ++ len = strlen(pw_dir); ++ if ((len == 0 || pw_dir[len - 1] != '/') && + strlcat(ret, "/", sizeof(ret)) >= sizeof(ret)) + fatal("tilde_expand_filename: Path too long"); + +diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c +index d2bea21..5b5d599 100644 +--- a/openbsd-compat/getrrsetbyname.c ++++ b/openbsd-compat/getrrsetbyname.c +@@ -56,8 +56,7 @@ + #include + + #include "getrrsetbyname.h" +-#include "nameser.h" +-#include "nameser_compat.h" ++#include "arpa/nameser.h" + + #if defined(HAVE_DECL_H_ERRNO) && !HAVE_DECL_H_ERRNO + extern int h_errno; +diff --git a/pathnames.h b/pathnames.h +index b7b9d91..3c10b11 100644 +--- a/pathnames.h ++++ b/pathnames.h +@@ -67,7 +67,7 @@ + #endif + + #ifndef _PATH_ROOT_HOME_PREFIX +-#define _PATH_ROOT_HOME_PREFIX "/data" ++#define _PATH_ROOT_HOME_PREFIX getenv("HOME") + #endif + + /* +diff --git a/readconf.c b/readconf.c +index 097bb05..dcbc008 100644 +--- a/readconf.c ++++ b/readconf.c +@@ -1085,7 +1085,7 @@ read_config_file(const char *filename, const char *host, Options *options, + if ((f = fopen(filename, "r")) == NULL) + return 0; + +- if (checkperm) { ++ if (checkperm && 0) { + struct stat sb; + + if (fstat(fileno(f), &sb) == -1) +diff --git a/ssh-add.c b/ssh-add.c +index 738644d..f6fce4a 100644 +--- a/ssh-add.c ++++ b/ssh-add.c +@@ -471,7 +471,7 @@ main(int argc, char **argv) + } + + for (i = 0; default_files[i]; i++) { +- snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, ++ snprintf(buf, sizeof(buf), "%s/%s", _PATH_ROOT_HOME_PREFIX, + default_files[i]); + if (stat(buf, &st) < 0) + continue; +diff --git a/ssh-keygen.c b/ssh-keygen.c +index 4baf7df..ef8bb25 100644 +--- a/ssh-keygen.c ++++ b/ssh-keygen.c +@@ -224,7 +224,7 @@ ask_filename(struct passwd *pw, const char *prompt) + } + } + snprintf(identity_file, sizeof(identity_file), "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, name); ++ _PATH_ROOT_HOME_PREFIX, name); + fprintf(stderr, "%s (%s): ", prompt, identity_file); + if (fgets(buf, sizeof(buf), stdin) == NULL) + exit(1); +@@ -2268,7 +2268,7 @@ main(int argc, char **argv) + + /* Create ~/.ssh directory if it doesn't already exist. */ + snprintf(dotsshdir, sizeof dotsshdir, "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, ++ _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_DIR); + if (strstr(identity_file, dotsshdir) != NULL) { + if (stat(dotsshdir, &st) < 0) { +diff --git a/ssh.c b/ssh.c +index 898e966..ef6c858 100644 +--- a/ssh.c ++++ b/ssh.c +@@ -703,7 +703,7 @@ main(int ac, char **av) + fatal("Can't open user config file %.100s: " + "%.100s", config, strerror(errno)); + } else { +- r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, ++ r = snprintf(buf, sizeof buf, "%s/%s", _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_CONFFILE); + if (r > 0 && (size_t)r < sizeof(buf)) + (void)read_config_file(buf, host, &options, 1); +@@ -748,7 +748,7 @@ main(int ac, char **av) + if (options.local_command != NULL) { + debug3("expanding LocalCommand: %s", options.local_command); + cp = options.local_command; +- options.local_command = percent_expand(cp, "d", pw->pw_dir, ++ options.local_command = percent_expand(cp, "d", _PATH_ROOT_HOME_PREFIX, + "h", host, "l", thishost, "n", host_arg, "r", options.user, + "p", portstr, "u", pw->pw_name, "L", shorthost, + (char *)NULL); +@@ -888,7 +888,7 @@ main(int ac, char **av) + */ + if (config == NULL) { + r = snprintf(buf, sizeof buf, "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, ++ _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_DIR); + if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0) { + #ifdef WITH_SELINUX +@@ -1532,7 +1532,7 @@ load_public_identity_files(void) + if ((pw = getpwuid(original_real_uid)) == NULL) + fatal("load_public_identity_files: getpwuid failed"); + pwname = xstrdup(pw->pw_name); +- pwdir = xstrdup(pw->pw_dir); ++ pwdir = xstrdup(_PATH_ROOT_HOME_PREFIX); + if (gethostname(thishost, sizeof(thishost)) == -1) + fatal("load_public_identity_files: gethostname: %s", + strerror(errno)); +diff --git a/uidswap.c b/uidswap.c +index bc6194e..5cbf5d1 100644 +--- a/uidswap.c ++++ b/uidswap.c +@@ -28,7 +28,6 @@ + #include "xmalloc.h" + + #ifdef ANDROID +-#include + #include + #include + #endif +@@ -230,7 +229,7 @@ permanently_set_uid(struct passwd *pw) + debug("permanently_set_uid: %u/%u", (u_int)pw->pw_uid, + (u_int)pw->pw_gid); + +-#ifdef ANDROID ++#if 0 + if (pw->pw_uid == AID_SHELL) { + prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); + +@@ -317,7 +316,7 @@ permanently_set_uid(struct passwd *pw) + (u_int)pw->pw_uid); + } + +-#ifdef ANDROID ++#if 0 + if (pw->pw_uid == AID_SHELL) { + /* set CAP_SYS_BOOT capability, so "adb reboot" will succeed */ + header.version = _LINUX_CAPABILITY_VERSION; diff --git a/standalone/android/rsync.patch b/standalone/android/rsync.patch new file mode 100644 index 000000000..692e9cabb --- /dev/null +++ b/standalone/android/rsync.patch @@ -0,0 +1,40 @@ +From f91df535053958600d57f9df78d9ce84c8718655 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 13 Feb 2013 15:51:40 -0400 +Subject: [PATCH] android portability + +--- + authenticate.c | 3 ++- + batch.c | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/authenticate.c b/authenticate.c +index 7650377..626dec6 100644 +--- a/authenticate.c ++++ b/authenticate.c +@@ -296,7 +296,8 @@ void auth_client(int fd, const char *user, const char *challenge) + * + * OpenBSD has a readpassphrase() that might be more suitable. + */ +- pass = getpass("Password: "); ++ /*pass = getpass("Password: "); */ ++ exit(1); + } + + if (!pass) +diff --git a/batch.c b/batch.c +index a3e9dca..ee31532 100644 +--- a/batch.c ++++ b/batch.c +@@ -221,7 +221,7 @@ void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt) + stringjoin(filename, sizeof filename, + batch_name, ".sh", NULL); + fd = do_open(filename, O_WRONLY | O_CREAT | O_TRUNC, +- S_IRUSR | S_IWUSR | S_IEXEC); ++ S_IRUSR | S_IWUSR); + if (fd < 0) { + rsyserr(FERROR, errno, "Batch file %s open error", + filename); +-- +1.7.10.4 + diff --git a/standalone/android/runshell b/standalone/android/runshell new file mode 100755 index 000000000..68f23b481 --- /dev/null +++ b/standalone/android/runshell @@ -0,0 +1,133 @@ +#!/system/bin/sh +# This is runs a shell in an environment configured for git-annex. +# Nearly the only command that can be used in here is busybox! +# lib.start.so will run us in the root of our app directory +base=$(./busybox pwd) +cmd=$base/busybox + +set -e + +prep () { + # Cannot rely on Android providing a sane HOME + HOME="/sdcard/git-annex.home" + export HOME +} + +buildtree () { + $cmd echo "Installation starting to $base" + $cmd cat "lib/lib.version.so" + + if $cmd test -e "$base/bin"; then + $cmd mv "$base/bin" "$base/bin.old" + fi + $cmd mkdir -p "$base/bin" + + for prog in busybox git-annex git-shell git-upload-pack git gpg rsync ssh ssh-keygen; do + $cmd echo "installing $prog" + if $cmd test -e "$base/bin/$prog"; then + $cmd rm -f "$base/bin/$prog" + fi + $cmd ln -s "$base/lib/lib.$prog.so" "$base/bin/$prog" + done + + $cmd --install -s $base/bin + + $cmd rm -rf "$base/bin.old" + + $cmd tar zxf $base/lib/lib.git.tar.gz.so + for prog in git git-shell git-upload-pack; do + for link in $($cmd cat "$base/links/$prog"); do + $cmd echo "linking $link to $prog" + if $cmd test -e "$base/$link"; then + $cmd rm -f "$base/$link" + fi + $cmd ln -s "$base/bin/$prog" "$base/$link" + done + $cmd rm -f "$base/links/$prog" + done + + $cmd mkdir -p "$base/templates" + $cmd mkdir -p "$base/tmp" + + $cmd echo "#!/system/bin/sh" > "$base/runshell" + $cmd echo "exec $base/lib/lib.start.so" >> "$base/runshell" + $cmd chmod 755 runshell + + $cmd cat "$base/lib/lib.trustedkeys.so" > "$base/bin/trustedkeys.gpg" + $cmd cat "$base/lib/lib.version.so" > "$base/installed-version" + $cmd echo "Installation complete" +} + +install () { + if ! $cmd mkdir -p "$HOME"; then + $cmd echo "mkdir of $HOME failed!" + fi + if $cmd test ! -e "$base/bin/git-annex"; then + if ! buildtree > $HOME/git-annex-install.log 2>&1; then + $cmd echo "Installation failed! Please report a bug and attach $HOME/git-annex-install.log" + $cmd sh + fi + elif $cmd test ! -e "$base/installed-version" || ! $cmd cmp "$base/installed-version" "$base/lib/lib.version.so" >/dev/null; then + if ! buildtree > $HOME/git-annex-install.log 2>&1; then + $cmd echo "Upgrade failed! Please report a bug and attach $HOME/git-annex-install.log" + fi + fi +} + +run () { + PATH="$base/bin:$PATH" + export PATH + + ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH" + export ORIG_GIT_EXEC_PATH + GIT_EXEC_PATH=$base/libexec/git-core + export GIT_EXEC_PATH + + ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR" + export ORIG_GIT_TEMPLATE_DIR + GIT_TEMPLATE_DIR="$base/templates" + export GIT_TEMPLATE_DIR + + # Indicate which variables were exported above. + GIT_ANNEX_STANDLONE_ENV="GIT_EXEC_PATH GIT_TEMPLATE_DIR" + export GIT_ANNEX_STANDLONE_ENV + + # This is a temporary directory on a non-crippled filesystem. + # Needs to be as short a path as possible, for ssh sockets. + GIT_ANNEX_TMP_DIR=$base/tmp + export GIT_ANNEX_TMP_DIR + # /tmp probably doesn't exist, so also use it as TMPDIR + TMPDIR=$GIT_ANNEX_TMP_DIR + export TMPDIR + + if $cmd test ! -e "$HOME/.gitconfig"; then + git config --global user.email "git-annex@android" + git config --global user.name "android" + fi + + if $cmd test "$1"; then + cmd="$1" + shift 1 + exec "$cmd" "$@" + else + # As good a start point as any. + cd "$HOME" + + /system/bin/sh + fi +} + +if $cmd test -n "$MKFIFO"; then + # because java is insane + $cmd mkfifo "$MKFIFO" +else + if ! prep; then + $cmd echo "prep failed. Please report a bug." + read line + fi + if ! install; then + $cmd echo "install failed. Please report a bug." + read line + fi + run +fi diff --git a/standalone/android/start.c b/standalone/android/start.c new file mode 100644 index 000000000..c67c5da0c --- /dev/null +++ b/standalone/android/start.c @@ -0,0 +1,64 @@ +/* Installed as lib.start.so, this bootstraps a working busybox and uses + * it to run lib.runshell.so. */ + +#include +#include +#include +#include +#include +#include + +void chopdir (char *s) { + char *p=strrchr(s, '/'); + if (p == NULL) { + fprintf(stderr, "cannot find directory in %s", s); + exit(1); + } + p[0] = '\0'; +} + +main () { + char buf[1024]; + char *p; + struct stat st_buf; + + /* Get something like /data/data/ga.androidterm/lib/lib.start.so */ + int n=readlink("/proc/self/exe", buf, 1023); + if (n < 1) { + fprintf(stderr, "failed to find own name"); + exit(1); + } + buf[n] = '\0'; + + /* Change directory to something like /data/data/ga.androidterm */ + chopdir(buf); + chopdir(buf); + if (chdir(buf) != 0) { + perror("chdir"); + exit(1); + } + + if (stat("lib/lib.busybox.so", &st_buf) != 0) { + /* TODO my lib dir should be in LD_LIBRARY_PATH; check that */ + fprintf(stderr, "Falling back to hardcoded app location; cannot find expected files in %s\n", buf); + if (chdir("/data/data/ga.androidterm") != 0) { + perror("chdir"); + exit(1); + } + } + + /* If this is the first run, set up busybox symlink, + * which allows busybox to run. */ + if (stat("busybox", &st_buf) != 0) { + if (symlink("lib/lib.busybox.so", "busybox") != 0) { + /* Just in case! */ + if (link("lib/lib.busybox.so", "busybox") != 0) { + perror("link busybox"); + exit(1); + } + } + } + + execl("./busybox", "./busybox", "sh", "lib/lib.runshell.so", NULL); + perror("error running busybox sh"); +} diff --git a/standalone/android/term.patch b/standalone/android/term.patch new file mode 100644 index 000000000..efea69564 --- /dev/null +++ b/standalone/android/term.patch @@ -0,0 +1,598 @@ +diff --git a/AndroidManifest.xml b/AndroidManifest.xml +index b0e866a..1ab8515 100644 +--- a/AndroidManifest.xml ++++ b/AndroidManifest.xml +@@ -7,6 +7,7 @@ + + + ++ + + + + ++ + +@@ -34,8 +36,6 @@ + android:icon="@drawable/ic_menu_preferences" /> + +- + + Predešlé okno + Další okno + Reset terminálu +- Napiš email ++ WebApp + Speciální znaky + Přepnout soft. klávesnici + +@@ -124,4 +124,4 @@ + Není nastaveno žádné tlačitko pro funkční klávesu. + + Zavřít okno? +- +\ No newline at end of file ++ +diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml +index f6134a5..06d2e1f 100644 +--- a/res/values-de/strings.xml ++++ b/res/values-de/strings.xml +@@ -23,7 +23,7 @@ + Vorh. Fenster + Nächst. Fenster + Zurücksetzen +- Email schreiben ++ WebApp + Spezialtasten + Tastatur an/aus + +@@ -124,4 +124,4 @@ + + Beliebige Scripte im Terminal Emulator ausführen + Erlaubt Anwendungen, neue Fenster im Android Terminal Emulator zu öffnen und in diesen Befehle auszuführen. Dies schließt alle Berechtigungen von Android Terminal Emulator ein, inklusive Internetzugang und Schreib-/Leserechte auf der SD-Karte. +- +\ No newline at end of file ++ +diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml +index 94553b2..92d9e2a 100644 +--- a/res/values-es/strings.xml ++++ b/res/values-es/strings.xml +@@ -23,7 +23,7 @@ + Ventana anterior + Ventana posterior + Reiniciar consola +- Enviar email ++ WebApp + Teclas especiales + Ver/ocultar teclado + +diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml +index b9f0586..92a16a0 100644 +--- a/res/values-eu/strings.xml ++++ b/res/values-eu/strings.xml +@@ -23,7 +23,7 @@ + Aurreko leihoa + Hurrengo leihoa + Berrezarri terminala +- Bidali eposta ...(r)i ++ WebApp + Tekla bereziak + Txandakatu soft teklatua + +diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml +index beab2be..529f720 100644 +--- a/res/values-fr/strings.xml ++++ b/res/values-fr/strings.xml +@@ -24,7 +24,7 @@ + Fenêtre Préc. + Fenêtre Suiv. + Terminal par défaut +- Envoyer un e-mail ++ WebApp + Touches spéciales + Afficher/Masquer Clavier + +diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml +index 5dbecb5..ce917c5 100644 +--- a/res/values-hu/strings.xml ++++ b/res/values-hu/strings.xml +@@ -23,7 +23,7 @@ + Előző ablak + Következő ablak + Alaphelyzet +- Küldés emailben ++ WebApp + Speciális billentyűk + Billentyűzet ki/be + +@@ -148,4 +148,4 @@ + Az Alt billentyű ESC-et küld + Az Alt billentyű ESC-et küld. + Az Alt billentyű nem ESC-et küld. +- +\ No newline at end of file ++ +diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml +index e6a7294..9d97869 100644 +--- a/res/values-it/strings.xml ++++ b/res/values-it/strings.xml +@@ -23,7 +23,7 @@ + Fin. successiva + Fin. precedente + Reset terminale +- Invia email ++ WebApp + Tasti speciali + Mostra/nascondi tastiera + +diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml +index 502fa23..dbfe9fa 100644 +--- a/res/values-ja/strings.xml ++++ b/res/values-ja/strings.xml +@@ -23,7 +23,7 @@ + 前のウインドウ + 次のウインドウ + 端末をリセット +- メール送信 ++ WebApp + 特殊キー + ソフトキーボード + +diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml +index 06629d0..1d545b6 100644 +--- a/res/values-ka/strings.xml ++++ b/res/values-ka/strings.xml +@@ -23,7 +23,7 @@ + წინა ფანჯარა + შემდეგი ფანჯარა + ტერმინალის რესტარტი +- ელ-ფოსტის გაგზავნა ++ WebApp + სპეციალური ღილაკები + პროგრამული კლავიატურის ჩართ./გამორთ. + +diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml +index d81ee07..c370c6f 100644 +--- a/res/values-nb/strings.xml ++++ b/res/values-nb/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emulator + Innstillinger + Tilbakestill terminal +- Send epost til ++ WebApp + Spesielle tegn + Veksle virtuelt tastatur + +diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml +index 19fa3d0..e24fbf5 100644 +--- a/res/values-nl/strings.xml ++++ b/res/values-nl/strings.xml +@@ -23,7 +23,7 @@ + Vorig venster + Volgend venster + Herstellen +- E-mail sturen naar ++ WebApp + Speciale knoppen + Toetsenbord aan/uit + +diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml +index 25b3b43..2e0e651 100644 +--- a/res/values-pl/strings.xml ++++ b/res/values-pl/strings.xml +@@ -23,7 +23,7 @@ + Poprzednie okno + Następne okno + Wyczyść terminal +- Wyślij e-mail ++ WebApp + Przyciski specjalne + Pokaż klawiaturę + +diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml +index aa4ba54..aa3d735 100644 +--- a/res/values-pt-rPT/strings.xml ++++ b/res/values-pt-rPT/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emulator + Preferências + Reset terminal +- Email para ++ WebApp + Teclas especiais + Abrir teclado + +diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml +index 2d992f9..e53a9ac 100644 +--- a/res/values-pt/strings.xml ++++ b/res/values-pt/strings.xml +@@ -23,7 +23,7 @@ + Anterior + Seguinte + Repor terminal +- Enviar mensagem para ++ WebApp + Teclas especiais + Mostrar/ocultar teclado + +diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml +index 3c7ea06..7a072d0 100644 +--- a/res/values-ro/strings.xml ++++ b/res/values-ro/strings.xml +@@ -21,7 +21,7 @@ + "Fereastra anterioră" + "Fereastra următoare" + "Resetaţi " +- "E-mail" ++ WebApp + "Taste speciale" + "Comutați tastatura" + +@@ -123,4 +123,4 @@ + "Tasta Alt trimite ESC" + "Tasta Alt trimite ESC." + "Tasta Alt nu trimite ESC." +- +\ No newline at end of file ++ +diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml +index 0e96360..762324e 100644 +--- a/res/values-ru/strings.xml ++++ b/res/values-ru/strings.xml +@@ -8,7 +8,7 @@ + Предыдущее окно + Следующее окно + Сбросить терминал +- Отправить Email ++ WebApp + Специальные клавиши + Экранная клавиатура + Терминальное состояние этого окна было сброшено. +diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml +index ef35366..cc31d80 100644 +--- a/res/values-sk/strings.xml ++++ b/res/values-sk/strings.xml +@@ -23,7 +23,7 @@ + Dalšie okno + Predch. okno + Obnoviť term. +- Poslať e-mailom ++ WebApp + Špec. klávesy + Skryť/zobraziť klávesnicu + +diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml +index 1aa9055..8de6c09 100644 +--- a/res/values-sv/strings.xml ++++ b/res/values-sv/strings.xml +@@ -3,7 +3,7 @@ + Terminalemulator + Inställningar + Återställ terminal +- E-posta till ++ WebApp + Special tangenter + Växla till virtuellt tangentbord + Aktivera VäckningsLås +diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml +index b45fa12..fb70f78 100644 +--- a/res/values-tr/strings.xml ++++ b/res/values-tr/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emülatörü + Tercihler + Terminali yeniden başlat +- Email olarak yolla ++ WebApp + Özel tuşlar + Ekran klavyesine geç + +diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml +index 2f267a9..d3622c4 100644 +--- a/res/values-uk/strings.xml ++++ b/res/values-uk/strings.xml +@@ -8,7 +8,7 @@ + Попереднє вікно + Наступне вікно + Скинути термінал +- Відіслати Email ++ WebApp + Спеціальні клавіші + Екранна клавіатура + "Термінальний стан цього вікна було скинуто." +diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml +index 6f47b4f..81316ec 100644 +--- a/res/values-zh-rCN/strings.xml ++++ b/res/values-zh-rCN/strings.xml +@@ -18,7 +18,7 @@ + 终端模拟器 + 首选项 + 重置终端 +- 发送电子邮件到... ++ WebApp + 特殊键 + 打开/关闭软键盘 + +diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml +index afda0f1..37d1b50 100644 +--- a/res/values-zh-rTW/strings.xml ++++ b/res/values-zh-rTW/strings.xml +@@ -18,7 +18,7 @@ + 模擬終端 + 設定 + 結束 +- 以電郵傳送 ++ WebApp + 特別按鍵 + 顯示/隱藏鍵盤 + +diff --git a/res/values/defaults.xml b/res/values/defaults.xml +index 67287b2..9b7cfcd 100644 +--- a/res/values/defaults.xml ++++ b/res/values/defaults.xml +@@ -13,10 +13,10 @@ + 4 + 0 + false +- /system/bin/sh - +- ++ /data/data/ga.androidterm/lib/lib.start.so ++ git annex webapp + screen +- true ++ false + true + true + true +diff --git a/res/values/strings.xml b/res/values/strings.xml +index f1464e9..b06ec9a 100644 +--- a/res/values/strings.xml ++++ b/res/values/strings.xml +@@ -23,7 +23,7 @@ + Prev window + Next window + Reset term +- Email to ++ Open WebApp + Special keys + Toggle soft keyboard + +diff --git a/src/jackpal/androidterm/ShellTermSession.java b/src/jackpal/androidterm/ShellTermSession.java +index 501e7ab..0b43513 100644 +--- a/src/jackpal/androidterm/ShellTermSession.java ++++ b/src/jackpal/androidterm/ShellTermSession.java +@@ -80,12 +80,12 @@ public class ShellTermSession extends TermSession { + } + }; + +- public ShellTermSession(TermSettings settings, String initialCommand) { ++ public ShellTermSession(TermSettings settings, String initialCommand, String webAppFifo) { + super(); + + updatePrefs(settings); + +- initializeSession(); ++ initializeSession(webAppFifo); + mInitialCommand = initialCommand; + + mWatcherThread = new Thread() { +@@ -106,7 +106,7 @@ public class ShellTermSession extends TermSession { + setDefaultUTF8Mode(settings.defaultToUTF8Mode()); + } + +- private void initializeSession() { ++ private void initializeSession(String webAppFifo) { + TermSettings settings = mSettings; + + int[] processId = new int[1]; +@@ -128,9 +128,10 @@ public class ShellTermSession extends TermSession { + if (settings.verifyPath()) { + path = checkPath(path); + } +- String[] env = new String[2]; ++ String[] env = new String[3]; + env[0] = "TERM=" + settings.getTermType(); + env[1] = "PATH=" + path; ++ env[2] = "FIFO=" + webAppFifo; + + createSubprocess(processId, settings.getShell(), env); + mProcId = processId[0]; +diff --git a/src/jackpal/androidterm/Term.java b/src/jackpal/androidterm/Term.java +index 8a3a4ac..824025d 100644 +--- a/src/jackpal/androidterm/Term.java ++++ b/src/jackpal/androidterm/Term.java +@@ -20,6 +20,13 @@ import java.io.UnsupportedEncodingException; + import java.text.Collator; + import java.util.Arrays; + import java.util.Locale; ++import java.lang.Process; ++import java.lang.ProcessBuilder; ++import java.util.Map; ++ ++import java.io.FileReader; ++import java.io.BufferedReader; ++import java.io.File; + + import android.app.Activity; + import android.app.AlertDialog; +@@ -59,6 +66,11 @@ import android.view.inputmethod.InputMethodManager; + import android.widget.TextView; + import android.widget.Toast; + ++import android.content.Intent; ++import android.net.Uri; ++import android.app.Activity; ++import android.content.Context; ++ + import jackpal.androidterm.emulatorview.ColorScheme; + import jackpal.androidterm.emulatorview.EmulatorView; + import jackpal.androidterm.emulatorview.TermSession; +@@ -107,6 +119,9 @@ public class Term extends Activity implements UpdateCallback { + public static final String EXTRA_WINDOW_ID = "jackpal.androidterm.window_id"; + private int onResumeSelectWindow = -1; + ++ public static String appDir; ++ public static String webAppFifo; ++ + private PowerManager.WakeLock mWakeLock; + private WifiManager.WifiLock mWifiLock; + // Available on API 12 and later +@@ -257,6 +272,48 @@ public class Term extends Activity implements UpdateCallback { + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); ++ ++ try { ++ appDir = getApplicationContext().getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir; ++ } catch (Exception e) { ++ appDir = "/data/data/ga.androidterm"; ++ } ++ webAppFifo = appDir + "/fifo"; ++ ++ /* webapp url opening thread */ ++ new Thread() { ++ @Override ++ public void run() { ++ try { ++ /* First, set up the fifo that urls to open will be ++ * read from. This is complicated by java not being ++ * able to mkfifo. */ ++ File f = new File (webAppFifo); ++ if (! f.exists()) { ++ ProcessBuilder pb = new ProcessBuilder(appDir + "/lib/lib.start.so"); ++ Map env = pb.environment(); ++ env.put("MKFIFO", webAppFifo); ++ Process p = pb.start(); ++ p.waitFor(); ++ } ++ ++ /* Reading from the fifo blocks until a url is written ++ * to it. */ ++ while (true) { ++ BufferedReader buf = new BufferedReader(new FileReader(webAppFifo)); ++ String s = buf.readLine(); ++ try { ++ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); ++ startActivity(intent); ++ } catch (Exception e) { ++ } ++ ++ } ++ } catch (Exception e) { ++ } ++ } ++ }.start(); ++ + Log.e(TermDebug.LOG_TAG, "onCreate"); + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mSettings = new TermSettings(getResources(), mPrefs); +@@ -427,7 +484,7 @@ public class Term extends Activity implements UpdateCallback { + } + + protected static TermSession createTermSession(Context context, TermSettings settings, String initialCommand) { +- ShellTermSession session = new ShellTermSession(settings, initialCommand); ++ ShellTermSession session = new ShellTermSession(settings, initialCommand, webAppFifo); + // XXX We should really be able to fetch this from within TermSession + session.setProcessExitMessage(context.getString(R.string.process_exit_message)); + +@@ -911,31 +968,15 @@ public class Term extends Activity implements UpdateCallback { + } + + private void doEmailTranscript() { ++ // Hack: repurposed to open the git-annex webapp + TermSession session = getCurrentTermSession(); + if (session != null) { +- // Don't really want to supply an address, but +- // currently it's required, otherwise nobody +- // wants to handle the intent. +- String addr = "user@example.com"; +- Intent intent = +- new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" +- + addr)); +- +- String subject = getString(R.string.email_transcript_subject); +- String title = session.getTitle(); +- if (title != null) { +- subject = subject + " - " + title; +- } +- intent.putExtra(Intent.EXTRA_SUBJECT, subject); +- intent.putExtra(Intent.EXTRA_TEXT, +- session.getTranscriptText().trim()); + try { +- startActivity(Intent.createChooser(intent, +- getString(R.string.email_transcript_chooser_title))); +- } catch (ActivityNotFoundException e) { +- Toast.makeText(this, +- R.string.email_transcript_no_email_activity_found, +- Toast.LENGTH_LONG).show(); ++ BufferedReader buf = new BufferedReader(new FileReader("/sdcard/git-annex.home/.git-annex-url")); ++ String s = buf.readLine(); ++ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); ++ startActivity(intent); ++ } catch (Exception e) { + } + } + } +diff --git a/tools/build-debug b/tools/build-debug +index 1f15cd2..e611956 100755 +--- a/tools/build-debug ++++ b/tools/build-debug +@@ -34,4 +34,4 @@ fi + + rm -rf `find . -name bin -o -name obj -prune` + cd jni +-$ANDROID_NDK_ROOT/ndk-build && cd .. && ant debug ++$ANDROID_NDK_ROOT/ndk-build && cd .. +diff --git a/tools/update.sh b/tools/update.sh +index 57219c3..79b45ef 100755 +--- a/tools/update.sh ++++ b/tools/update.sh +@@ -18,7 +18,7 @@ command -v "$ANDROID" >/dev/null 2>&1 || { echo >&2 "The $ANDROID tool is not fo + + # Make sure target-11 is installed + +-$ANDROID update sdk -u -t android-11 ++$ANDROID update sdk -u -t android-18 + + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ATE_ROOT="$( cd $DIR/.. && pwd )" +@@ -31,5 +31,5 @@ for PROJECT_FILE in $PROJECT_FILES + do + PROJECT_DIR="$( dirname "$PROJECT_FILE" )" + echo "Updating $PROJECT_FILE" +- $ANDROID update project -p "$PROJECT_DIR" --target android-11 ++ $ANDROID update project -p "$PROJECT_DIR" --target android-18 + done diff --git a/standalone/licences.gz b/standalone/licences.gz new file mode 100644 index 000000000..e97ea95d0 Binary files /dev/null and b/standalone/licences.gz differ diff --git a/standalone/linux/haskell-patches/network_disable_accept4.patch b/standalone/linux/haskell-patches/network_disable_accept4.patch new file mode 100644 index 000000000..a1c07206a --- /dev/null +++ b/standalone/linux/haskell-patches/network_disable_accept4.patch @@ -0,0 +1,26 @@ +From f89652f762cf40e4c737fc1b9d6f395eb8df1959 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Mon, 10 Mar 2014 13:28:25 -0400 +Subject: [PATCH] disable use of accept4, for compatability with older systems + +See http://git-annex.branchable.com/bugs/Assistant_lost_dbus_connection_spamming_log/ +--- + Network/Socket.hsc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 6d304bb..d7fe733 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -510,7 +510,7 @@ accept sock@(MkSocket s family stype protocol status) = do + return new_sock + #else + with (fromIntegral sz) $ \ ptr_len -> do +-# ifdef HAVE_ACCEPT4 ++# if 0 + new_sock <- throwSocketErrorIfMinus1RetryMayBlock "accept" + (threadWaitRead (fromIntegral s)) + (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK)) +-- +1.9.0 + diff --git a/standalone/linux/install-haskell-packages b/standalone/linux/install-haskell-packages new file mode 100755 index 000000000..a8103b386 --- /dev/null +++ b/standalone/linux/install-haskell-packages @@ -0,0 +1,102 @@ +#!/bin/bash +# Bootstraps from an empty cabal (plus apt-get build-dep git-annex) +# to all the necessary haskell packages being installed, with the +# necessary patches to work on architectures that lack template haskell. +# +# Note that the newest version of packages is installed. +# It attempts to reuse patches for older versions, but +# new versions of packages often break cross-compilation by adding TH, +# etc +# +# Future work: Convert to using the method used here: +# https://github.com/kaoskorobase/ghc-ios-cabal-scripts/ + +set -e + +if [ ! -d haskell-patches ]; then + cd standalone/linux +fi + +cabalopts="$@" + +cabalinstall () { + echo cabal install "$@" "$cabalopts" + eval cabal install "$@" "$cabalopts" +} + +patched () { + pkg=$1 + shift 1 + cabal unpack $pkg + cd $pkg* + git init + git config user.name dummy + git config user.email dummy@example.com + git add . + git commit -m "pre-patched state of $pkg" + for patch in ../../haskell-patches/${pkg}_* ../../../no-th/haskell-patches/${pkg}_*; do + if [ -e "$patch" ]; then + echo trying $patch + if ! patch -p1 < $patch; then + echo "failed to apply $patch" + echo "please resolve this, replace the patch with a new version, and exit the subshell to continue" + $SHELL + fi + fi + done + cabalinstall "$@" + rm -rf $pkg* + cd .. +} + +installgitannexdeps () { + pushd ../.. + echo "cabal install QuickCheck -f-templateHaskell" + cabal install QuickCheck -f-templateHaskell + echo cabal install --only-dependencies "$@" + cabal install --only-dependencies "$@" + popd +} + +install_pkgs () { + rm -rf tmp + mkdir tmp + cd tmp + + patched network + patched wai-app-static + patched vector + patched aeson + patched shakespeare + patched yesod-routes + patched monad-logger + patched skein + patched yesod-core + patched persistent + patched persistent-template + patched file-embed + patched process-conduit + patched yesod-static + patched yesod-persistent + patched yesod-form + patched yesod-auth + patched yesod + patched generic-deriving + patched profunctors + patched reflection + patched lens + patched xml-hamlet + patched DAV + + cd .. + + installgitannexdeps +} + +cabal update + +# Some packages fail to install in a non unicode locale. +LANG=C.UTF-8 +export LANG + +install_pkgs diff --git a/standalone/linux/skel/README b/standalone/linux/skel/README new file mode 100644 index 000000000..2a321845f --- /dev/null +++ b/standalone/linux/skel/README @@ -0,0 +1,20 @@ +You can put this directory into your PATH, or symlink the programs in this +directory to anyplace already in your PATH, and use git-annex the same +as if you'd installed it using a package manager. + +Or, you can use the runshell script in this directory to start a shell +that is configured to use git-annex and the other utilities included in +this bundle, including git, gpg, rsync, ssh, etc. + +This should work on any Linux system of the appropriate architecture. +More or less. + + +How it works: This directory tree contains a lot of libraries and programs +that git-annex needs. But it's not a chroot. Instead, runshell sets a lot +of environment variables to cause files from here to be used, and a shim +around the binaries arranges for them to be run with the libraries in here. + +It shouldn't even be dependent on the host system's glibc libraries. +All that's needed is a kernel that supports the glibc included in this +bundle. diff --git a/standalone/linux/skel/git b/standalone/linux/skel/git new file mode 100755 index 000000000..7fbf82715 --- /dev/null +++ b/standalone/linux/skel/git @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git "$@" diff --git a/standalone/linux/skel/git-annex b/standalone/linux/skel/git-annex new file mode 100755 index 000000000..7fc864d87 --- /dev/null +++ b/standalone/linux/skel/git-annex @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex "$@" diff --git a/standalone/linux/skel/git-annex-shell b/standalone/linux/skel/git-annex-shell new file mode 100755 index 000000000..37dbca049 --- /dev/null +++ b/standalone/linux/skel/git-annex-shell @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex-shell "$@" diff --git a/standalone/linux/skel/git-annex-webapp b/standalone/linux/skel/git-annex-webapp new file mode 100755 index 000000000..24a533969 --- /dev/null +++ b/standalone/linux/skel/git-annex-webapp @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex webapp "$@" diff --git a/standalone/linux/skel/git-receive-pack b/standalone/linux/skel/git-receive-pack new file mode 100755 index 000000000..718541786 --- /dev/null +++ b/standalone/linux/skel/git-receive-pack @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-receive-pack "$@" diff --git a/standalone/linux/skel/git-shell b/standalone/linux/skel/git-shell new file mode 100755 index 000000000..20c184bdf --- /dev/null +++ b/standalone/linux/skel/git-shell @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-shell "$@" diff --git a/standalone/linux/skel/git-upload-pack b/standalone/linux/skel/git-upload-pack new file mode 100755 index 000000000..1df3f3f6c --- /dev/null +++ b/standalone/linux/skel/git-upload-pack @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-upload-pack "$@" diff --git a/standalone/linux/skel/runshell b/standalone/linux/skel/runshell new file mode 100755 index 000000000..73703358d --- /dev/null +++ b/standalone/linux/skel/runshell @@ -0,0 +1,105 @@ +#!/bin/sh +# Runs a shell command (or interactive shell) using the binaries and +# libraries bundled with this app. + +set -e + +base="$(dirname "$0")" + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi + +if [ ! -e "$base/bin/git-annex" ]; then + echo "** base directory $base does not contain bin/git-annex" >&2 + exit 1 +fi +if [ ! -e "$base/bin/git" ]; then + echo "** base directory $base does not contain bin/git" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# Install shim that's used to run git-annex-shell from ssh authorized_keys. +# The assistant also does this when run, but the user may not be using the +# assistant. +if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then + mkdir "$HOME/.ssh" >/dev/null 2>&1 || true + ( + echo "#!/bin/sh" + echo "set -e" + echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\"" + echo "else" + echo "exec $base/runshell git-annex-shell -c \"\$@\"" + echo "fi" + ) > "$HOME/.ssh/git-annex-shell" + chmod +x "$HOME/.ssh/git-annex-shell" +fi + +# And this shim is used by the webapp when adding a remote ssh server. +if [ ! -e "$HOME/.ssh/git-annex-wrapper" ]; then + mkdir "$HOME/.ssh" >/dev/null 2>&1 || true + ( + echo "#!/bin/sh" + echo "set -e" + echo "exec $base/runshell \"\$@\"" + ) > "$HOME/.ssh/git-annex-wrapper" + chmod +x "$HOME/.ssh/git-annex-wrapper" +fi + +# Put our binaries first, to avoid issues with out of date or incompatable +# system binaries. +ORIG_PATH="$PATH" +export ORIG_PATH +PATH=$base/bin:$PATH +export PATH + +# This is used by the shim wrapper around each binary. +for lib in $(cat $base/libdirs); do + GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH" +done +export GIT_ANNEX_LD_LIBRARY_PATH +GIT_ANNEX_LINKER="$base/$(cat $base/linker)" +export GIT_ANNEX_LINKER +GIT_ANNEX_SHIMMED="$base/shimmed" +export GIT_ANNEX_SHIMMED + +ORIG_GCONV_PATH="$GCONV_PATH" +export ORIG_GCONV_PATH +GCONV_PATH=$base/$(cat $base/gconvdir) +export GCONV_PATH + +ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH" +export ORIG_GIT_EXEC_PATH +GIT_EXEC_PATH=$base/git-core +export GIT_EXEC_PATH + +ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR" +export ORIG_GIT_TEMPLATE_DIR +GIT_TEMPLATE_DIR="$base/templates" +export GIT_TEMPLATE_DIR + +ORIG_MANPATH="$MANPATH" +export ORIG_MANPATH +MANPATH="$base/usr/share/man:$MANPATH" +export MANPATH + +# Indicate which variables were exported above and should be cleaned +# when running non-bundled programs. +GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH" +export GIT_ANNEX_STANDLONE_ENV + +if [ "$1" ]; then + cmd="$1" + shift 1 + exec "$cmd" "$@" +else + sh +fi diff --git a/standalone/no-th/evilsplicer-headers.hs b/standalone/no-th/evilsplicer-headers.hs new file mode 100644 index 000000000..2e23df0ce --- /dev/null +++ b/standalone/no-th/evilsplicer-headers.hs @@ -0,0 +1,38 @@ + + +{- This file was modified by the EvilSplicer, adding these headers, + - and expanding Template Haskell. + - + - ** DO NOT COMMIT ** + -} +import qualified Data.Monoid +import qualified Data.Set +import qualified Data.Set as Data.Set.Base +import qualified Data.Map +import qualified Data.Map as Data.Map.Base +import qualified Data.Foldable +import qualified Data.Text +import qualified Data.Text.Lazy.Builder +import qualified Data.Text.Lazy.Builder as Data.Text.Internal.Builder +import qualified Text.Shakespeare +import qualified Text.Hamlet +import qualified Text.Julius +import qualified Text.Css +import qualified "blaze-markup" Text.Blaze.Internal +import qualified Yesod.Core.Widget +import qualified Yesod.Routes.TH.Types +import qualified Yesod.Routes.Dispatch +import qualified WaiAppStatic.Storage.Embedded +import qualified WaiAppStatic.Storage.Embedded.Runtime +import qualified Data.FileEmbed +import qualified Data.ByteString.Internal +import qualified Data.Text.Encoding +import qualified Network.Wai +import qualified Network.Wai as Network.Wai.Internal +import qualified Yesod.Core.Types +import qualified GHC.IO +import qualified Data.ByteString.Unsafe +import qualified Data.ByteString.Char8 +{- End EvilSplicer headers. -} + + diff --git a/standalone/no-th/haskell-patches/DAV_build-without-TH.patch b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch new file mode 100644 index 000000000..45e9a3cec --- /dev/null +++ b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch @@ -0,0 +1,415 @@ +From 8e115228601a97b19d3f713ccf2d13f58838d927 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 26 May 2014 01:48:22 +0000 +Subject: [PATCH] expand TH + +--- + DAV.cabal | 24 +--- + Network/Protocol/HTTP/DAV.hs | 96 ++++++++++++---- + Network/Protocol/HTTP/DAV/TH.hs | 232 ++++++++++++++++++++++++++++++++++++++- + 3 files changed, 307 insertions(+), 45 deletions(-) + +diff --git a/DAV.cabal b/DAV.cabal +index bf54f44..04f375a 100644 +--- a/DAV.cabal ++++ b/DAV.cabal +@@ -42,29 +42,7 @@ library + , transformers-base + , xml-conduit >= 1.0 && < 1.3 + , xml-hamlet >= 0.4 && <= 0.5 +-executable hdav +- main-is: hdav.hs +- ghc-options: -Wall +- build-depends: base >= 4.5 && <= 5 +- , bytestring +- , bytestring +- , case-insensitive >= 0.4 +- , containers +- , either >= 4.1 +- , errors +- , http-client >= 0.2 +- , http-client-tls >= 0.2 +- , http-types >= 0.7 +- , lens >= 3.0 +- , lifted-base >= 0.1 +- , monad-control >= 0.3.2 +- , mtl >= 2.1 +- , network >= 2.3 +- , optparse-applicative >= 0.5.0 +- , transformers >= 0.3 +- , transformers-base +- , xml-conduit >= 1.0 && < 1.3 +- , xml-hamlet >= 0.4 && <= 0.5 ++ , text + + source-repository head + type: git +diff --git a/Network/Protocol/HTTP/DAV.hs b/Network/Protocol/HTTP/DAV.hs +index 94d21bc..c48618f 100644 +--- a/Network/Protocol/HTTP/DAV.hs ++++ b/Network/Protocol/HTTP/DAV.hs +@@ -78,7 +78,7 @@ import Network.HTTP.Types (hContentType, Method, Status, RequestHeaders, unautho + + import qualified Text.XML as XML + import Text.XML.Cursor (($/), (&/), element, node, fromDocument, checkName) +-import Text.Hamlet.XML (xml) ++import qualified Data.Text + + import Data.CaseInsensitive (mk) + +@@ -336,28 +336,84 @@ makeCollection url username password = choke $ evalDAVT url $ do + propname :: XML.Document + propname = XML.Document (XML.Prologue [] Nothing []) root [] + where +- root = XML.Element "D:propfind" (Map.fromList [("xmlns:D", "DAV:")]) [xml| +- +-|] +- ++ root = XML.Element "D:propfind" (Map.fromList [("xmlns:D", "DAV:")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:allprop") Nothing Nothing) ++ Map.empty ++ (concat []))]] + locky :: XML.Document + locky = XML.Document (XML.Prologue [] Nothing []) root [] +- where +- root = XML.Element "D:lockinfo" (Map.fromList [("xmlns:D", "DAV:")]) [xml| +- +- +- +- +-Haskell DAV user +-|] ++ where ++ root = XML.Element "D:lockinfo" (Map.fromList [("xmlns:D", "DAV:")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:lockscope") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:exclusive") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:locktype") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:write") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:owner") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeContent ++ (Data.Text.pack "Haskell DAV user")]]))]] ++ + + calendarquery :: XML.Document + calendarquery = XML.Document (XML.Prologue [] Nothing []) root [] + where +- root = XML.Element "C:calendar-query" (Map.fromList [("xmlns:D", "DAV:"),("xmlns:C", "urn:ietf:params:xml:ns:caldav")]) [xml| +- +- +- +- +- +-|] ++ root = XML.Element "C:calendar-query" (Map.fromList [("xmlns:D", "DAV:"),("xmlns:C", "urn:ietf:params:xml:ns:caldav")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:prop") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:getetag") Nothing Nothing) ++ Map.empty ++ (concat []))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:calendar-data") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:filter") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:comp-filter") Nothing Nothing) ++ (Map.insert ++ (XML.Name (Data.Text.pack "name") Nothing Nothing) ++ (Data.Text.concat ++ [Data.Text.pack "VCALENDAR"]) ++ Map.empty) ++ (concat []))]]))]] ++ +diff --git a/Network/Protocol/HTTP/DAV/TH.hs b/Network/Protocol/HTTP/DAV/TH.hs +index b072116..5a01bf9 100644 +--- a/Network/Protocol/HTTP/DAV/TH.hs ++++ b/Network/Protocol/HTTP/DAV/TH.hs +@@ -20,9 +20,11 @@ + + module Network.Protocol.HTTP.DAV.TH where + +-import Control.Lens (makeLenses) ++import Control.Lens + import qualified Data.ByteString as B + import Network.HTTP.Client (Manager, Request) ++import qualified Control.Lens.Type ++import qualified Data.Functor + + data Depth = Depth0 | Depth1 | DepthInfinity + instance Read Depth where +@@ -47,4 +49,230 @@ data DAVContext = DAVContext { + , _lockToken :: Maybe B.ByteString + , _userAgent :: B.ByteString + } +-makeLenses ''DAVContext ++allowedMethods :: Control.Lens.Type.Lens' DAVContext [B.ByteString] ++allowedMethods ++ _f_a2PF ++ (DAVContext __allowedMethods'_a2PG ++ __baseRequest_a2PI ++ __basicusername_a2PJ ++ __basicpassword_a2PK ++ __complianceClasses_a2PL ++ __depth_a2PM ++ __httpManager_a2PN ++ __lockToken_a2PO ++ __userAgent_a2PP) ++ = ((\ __allowedMethods_a2PH ++ -> DAVContext ++ __allowedMethods_a2PH ++ __baseRequest_a2PI ++ __basicusername_a2PJ ++ __basicpassword_a2PK ++ __complianceClasses_a2PL ++ __depth_a2PM ++ __httpManager_a2PN ++ __lockToken_a2PO ++ __userAgent_a2PP) ++ Data.Functor.<$> (_f_a2PF __allowedMethods'_a2PG)) ++{-# INLINE allowedMethods #-} ++baseRequest :: Control.Lens.Type.Lens' DAVContext Request ++baseRequest ++ _f_a2PQ ++ (DAVContext __allowedMethods_a2PR ++ __baseRequest'_a2PS ++ __basicusername_a2PU ++ __basicpassword_a2PV ++ __complianceClasses_a2PW ++ __depth_a2PX ++ __httpManager_a2PY ++ __lockToken_a2PZ ++ __userAgent_a2Q0) ++ = ((\ __baseRequest_a2PT ++ -> DAVContext ++ __allowedMethods_a2PR ++ __baseRequest_a2PT ++ __basicusername_a2PU ++ __basicpassword_a2PV ++ __complianceClasses_a2PW ++ __depth_a2PX ++ __httpManager_a2PY ++ __lockToken_a2PZ ++ __userAgent_a2Q0) ++ Data.Functor.<$> (_f_a2PQ __baseRequest'_a2PS)) ++{-# INLINE baseRequest #-} ++basicpassword :: Control.Lens.Type.Lens' DAVContext B.ByteString ++basicpassword ++ _f_a2Q1 ++ (DAVContext __allowedMethods_a2Q2 ++ __baseRequest_a2Q3 ++ __basicusername_a2Q4 ++ __basicpassword'_a2Q5 ++ __complianceClasses_a2Q7 ++ __depth_a2Q8 ++ __httpManager_a2Q9 ++ __lockToken_a2Qa ++ __userAgent_a2Qb) ++ = ((\ __basicpassword_a2Q6 ++ -> DAVContext ++ __allowedMethods_a2Q2 ++ __baseRequest_a2Q3 ++ __basicusername_a2Q4 ++ __basicpassword_a2Q6 ++ __complianceClasses_a2Q7 ++ __depth_a2Q8 ++ __httpManager_a2Q9 ++ __lockToken_a2Qa ++ __userAgent_a2Qb) ++ Data.Functor.<$> (_f_a2Q1 __basicpassword'_a2Q5)) ++{-# INLINE basicpassword #-} ++basicusername :: Control.Lens.Type.Lens' DAVContext B.ByteString ++basicusername ++ _f_a2Qc ++ (DAVContext __allowedMethods_a2Qd ++ __baseRequest_a2Qe ++ __basicusername'_a2Qf ++ __basicpassword_a2Qh ++ __complianceClasses_a2Qi ++ __depth_a2Qj ++ __httpManager_a2Qk ++ __lockToken_a2Ql ++ __userAgent_a2Qm) ++ = ((\ __basicusername_a2Qg ++ -> DAVContext ++ __allowedMethods_a2Qd ++ __baseRequest_a2Qe ++ __basicusername_a2Qg ++ __basicpassword_a2Qh ++ __complianceClasses_a2Qi ++ __depth_a2Qj ++ __httpManager_a2Qk ++ __lockToken_a2Ql ++ __userAgent_a2Qm) ++ Data.Functor.<$> (_f_a2Qc __basicusername'_a2Qf)) ++{-# INLINE basicusername #-} ++complianceClasses :: ++ Control.Lens.Type.Lens' DAVContext [B.ByteString] ++complianceClasses ++ _f_a2Qn ++ (DAVContext __allowedMethods_a2Qo ++ __baseRequest_a2Qp ++ __basicusername_a2Qq ++ __basicpassword_a2Qr ++ __complianceClasses'_a2Qs ++ __depth_a2Qu ++ __httpManager_a2Qv ++ __lockToken_a2Qw ++ __userAgent_a2Qx) ++ = ((\ __complianceClasses_a2Qt ++ -> DAVContext ++ __allowedMethods_a2Qo ++ __baseRequest_a2Qp ++ __basicusername_a2Qq ++ __basicpassword_a2Qr ++ __complianceClasses_a2Qt ++ __depth_a2Qu ++ __httpManager_a2Qv ++ __lockToken_a2Qw ++ __userAgent_a2Qx) ++ Data.Functor.<$> (_f_a2Qn __complianceClasses'_a2Qs)) ++{-# INLINE complianceClasses #-} ++depth :: Control.Lens.Type.Lens' DAVContext (Maybe Depth) ++depth ++ _f_a2Qy ++ (DAVContext __allowedMethods_a2Qz ++ __baseRequest_a2QA ++ __basicusername_a2QB ++ __basicpassword_a2QC ++ __complianceClasses_a2QD ++ __depth'_a2QE ++ __httpManager_a2QG ++ __lockToken_a2QH ++ __userAgent_a2QI) ++ = ((\ __depth_a2QF ++ -> DAVContext ++ __allowedMethods_a2Qz ++ __baseRequest_a2QA ++ __basicusername_a2QB ++ __basicpassword_a2QC ++ __complianceClasses_a2QD ++ __depth_a2QF ++ __httpManager_a2QG ++ __lockToken_a2QH ++ __userAgent_a2QI) ++ Data.Functor.<$> (_f_a2Qy __depth'_a2QE)) ++{-# INLINE depth #-} ++httpManager :: Control.Lens.Type.Lens' DAVContext Manager ++httpManager ++ _f_a2QJ ++ (DAVContext __allowedMethods_a2QK ++ __baseRequest_a2QL ++ __basicusername_a2QM ++ __basicpassword_a2QN ++ __complianceClasses_a2QO ++ __depth_a2QP ++ __httpManager'_a2QQ ++ __lockToken_a2QS ++ __userAgent_a2QT) ++ = ((\ __httpManager_a2QR ++ -> DAVContext ++ __allowedMethods_a2QK ++ __baseRequest_a2QL ++ __basicusername_a2QM ++ __basicpassword_a2QN ++ __complianceClasses_a2QO ++ __depth_a2QP ++ __httpManager_a2QR ++ __lockToken_a2QS ++ __userAgent_a2QT) ++ Data.Functor.<$> (_f_a2QJ __httpManager'_a2QQ)) ++{-# INLINE httpManager #-} ++lockToken :: ++ Control.Lens.Type.Lens' DAVContext (Maybe B.ByteString) ++lockToken ++ _f_a2QU ++ (DAVContext __allowedMethods_a2QV ++ __baseRequest_a2QW ++ __basicusername_a2QX ++ __basicpassword_a2QY ++ __complianceClasses_a2QZ ++ __depth_a2R0 ++ __httpManager_a2R1 ++ __lockToken'_a2R2 ++ __userAgent_a2R4) ++ = ((\ __lockToken_a2R3 ++ -> DAVContext ++ __allowedMethods_a2QV ++ __baseRequest_a2QW ++ __basicusername_a2QX ++ __basicpassword_a2QY ++ __complianceClasses_a2QZ ++ __depth_a2R0 ++ __httpManager_a2R1 ++ __lockToken_a2R3 ++ __userAgent_a2R4) ++ Data.Functor.<$> (_f_a2QU __lockToken'_a2R2)) ++{-# INLINE lockToken #-} ++userAgent :: Control.Lens.Type.Lens' DAVContext B.ByteString ++userAgent ++ _f_a2R5 ++ (DAVContext __allowedMethods_a2R6 ++ __baseRequest_a2R7 ++ __basicusername_a2R8 ++ __basicpassword_a2R9 ++ __complianceClasses_a2Ra ++ __depth_a2Rb ++ __httpManager_a2Rc ++ __lockToken_a2Rd ++ __userAgent'_a2Re) ++ = ((\ __userAgent_a2Rf ++ -> DAVContext ++ __allowedMethods_a2R6 ++ __baseRequest_a2R7 ++ __basicusername_a2R8 ++ __basicpassword_a2R9 ++ __complianceClasses_a2Ra ++ __depth_a2Rb ++ __httpManager_a2Rc ++ __lockToken_a2Rd ++ __userAgent_a2Rf) ++ Data.Functor.<$> (_f_a2R5 __userAgent'_a2Re)) ++{-# INLINE userAgent #-} +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/aeson_remove-TH.patch b/standalone/no-th/haskell-patches/aeson_remove-TH.patch new file mode 100644 index 000000000..dc40de79e --- /dev/null +++ b/standalone/no-th/haskell-patches/aeson_remove-TH.patch @@ -0,0 +1,40 @@ +From f147ec9aeaa03ca6e30232c84c413ef29b95fb62 Mon Sep 17 00:00:00 2001 +From: Your Name +Date: Tue, 20 May 2014 19:53:55 +0000 +Subject: [PATCH] avoid TH + +--- + aeson.cabal | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/aeson.cabal b/aeson.cabal +index 493d625..02dc6f4 100644 +--- a/aeson.cabal ++++ b/aeson.cabal +@@ -88,7 +88,6 @@ library + Data.Aeson.Generic + Data.Aeson.Parser + Data.Aeson.Types +- Data.Aeson.TH + + other-modules: + Data.Aeson.Functions +@@ -121,7 +120,6 @@ library + old-locale, + scientific >= 0.3.1 && < 0.4, + syb, +- template-haskell >= 2.4, + time, + unordered-containers >= 0.2.3.0, + vector >= 0.7.1 +@@ -164,7 +162,6 @@ test-suite tests + base, + containers, + bytestring, +- template-haskell, + test-framework, + test-framework-quickcheck2, + test-framework-hunit, +-- +2.0.0.rc2 + diff --git a/standalone/no-th/haskell-patches/file-embed_remove-TH.patch b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch new file mode 100644 index 000000000..a089f1f9e --- /dev/null +++ b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch @@ -0,0 +1,150 @@ +From 2b41af230ea5675592e87a2362d9c17bcd8df1db Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 10 Jun 2014 19:00:44 +0000 +Subject: [PATCH] remove TH + +--- + Data/FileEmbed.hs | 100 +++--------------------------------------------------- + 1 file changed, 5 insertions(+), 95 deletions(-) + +diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs +index aae9d5a..efdbb7b 100644 +--- a/Data/FileEmbed.hs ++++ b/Data/FileEmbed.hs +@@ -17,19 +17,18 @@ + -- > {-# LANGUAGE TemplateHaskell #-} + module Data.FileEmbed + ( -- * Embed at compile time +- embedFile +- , embedOneFileOf +- , embedDir +- , getDir ++ -- embedFile ++ --, embedOneFileOf ++ --, embedDir ++ getDir + -- * Inject into an executable + #if MIN_VERSION_template_haskell(2,5,0) +- , dummySpace ++ --, dummySpace + #endif + , inject + , injectFile + -- * Internal + , stringToBs +- , bsToExp + ) where + + import Language.Haskell.TH.Syntax +@@ -57,85 +56,12 @@ import Data.ByteString.Unsafe (unsafePackAddressLen) + import System.IO.Unsafe (unsafePerformIO) + import System.FilePath (()) + +--- | Embed a single file in your source code. +--- +--- > import qualified Data.ByteString +--- > +--- > myFile :: Data.ByteString.ByteString +--- > myFile = $(embedFile "dirName/fileName") +-embedFile :: FilePath -> Q Exp +-embedFile fp = +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile fp >> +-#endif +- (runIO $ B.readFile fp) >>= bsToExp +- +--- | Embed a single existing file in your source code +--- out of list a list of paths supplied. +--- +--- > import qualified Data.ByteString +--- > +--- > myFile :: Data.ByteString.ByteString +--- > myFile = $(embedFile' [ "dirName/fileName", "src/dirName/fileName" ]) +-embedOneFileOf :: [FilePath] -> Q Exp +-embedOneFileOf ps = +- (runIO $ readExistingFile ps) >>= \ ( path, content ) -> do +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile path +-#endif +- bsToExp content +- where +- readExistingFile :: [FilePath] -> IO ( FilePath, B.ByteString ) +- readExistingFile xs = do +- ys <- filterM doesFileExist xs +- case ys of +- (p:_) -> B.readFile p >>= \ c -> return ( p, c ) +- _ -> throw $ ErrorCall "Cannot find file to embed as resource" +- +--- | Embed a directory recursively in your source code. +--- +--- > import qualified Data.ByteString +--- > +--- > myDir :: [(FilePath, Data.ByteString.ByteString)] +--- > myDir = $(embedDir "dirName") +-embedDir :: FilePath -> Q Exp +-embedDir fp = do +- typ <- [t| [(FilePath, B.ByteString)] |] +- e <- ListE <$> ((runIO $ fileList fp) >>= mapM (pairToExp fp)) +- return $ SigE e typ +- + -- | Get a directory tree in the IO monad. + -- + -- This is the workhorse of 'embedDir' + getDir :: FilePath -> IO [(FilePath, B.ByteString)] + getDir = fileList + +-pairToExp :: FilePath -> (FilePath, B.ByteString) -> Q Exp +-pairToExp _root (path, bs) = do +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile $ _root ++ '/' : path +-#endif +- exp' <- bsToExp bs +- return $! TupE [LitE $ StringL path, exp'] +- +-bsToExp :: B.ByteString -> Q Exp +-#if MIN_VERSION_template_haskell(2, 5, 0) +-bsToExp bs = +- return $ VarE 'unsafePerformIO +- `AppE` (VarE 'unsafePackAddressLen +- `AppE` LitE (IntegerL $ fromIntegral $ B8.length bs) +-#if MIN_VERSION_template_haskell(2, 8, 0) +- `AppE` LitE (StringPrimL $ B.unpack bs)) +-#else +- `AppE` LitE (StringPrimL $ B8.unpack bs)) +-#endif +-#else +-bsToExp bs = do +- helper <- [| stringToBs |] +- let chars = B8.unpack bs +- return $! AppE helper $! LitE $! StringL chars +-#endif +- + stringToBs :: String -> B.ByteString + stringToBs = B8.pack + +@@ -177,22 +103,6 @@ padSize i = + let s = show i + in replicate (sizeLen - length s) '0' ++ s + +-#if MIN_VERSION_template_haskell(2,5,0) +-dummySpace :: Int -> Q Exp +-dummySpace space = do +- let size = padSize space +- let start = magic ++ size +- let chars = LitE $ StringPrimL $ +-#if MIN_VERSION_template_haskell(2,6,0) +- map (toEnum . fromEnum) $ +-#endif +- start ++ replicate space '0' +- let len = LitE $ IntegerL $ fromIntegral $ length start + space +- upi <- [|unsafePerformIO|] +- pack <- [|unsafePackAddressLen|] +- getInner' <- [|getInner|] +- return $ getInner' `AppE` (upi `AppE` (pack `AppE` len `AppE` chars)) +-#endif + + inject :: B.ByteString -- ^ bs to inject + -> B.ByteString -- ^ original BS containing dummy +-- +2.0.0 + diff --git a/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch new file mode 100644 index 000000000..83c8ffd2a --- /dev/null +++ b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch @@ -0,0 +1,394 @@ +From 9a41401d903f160e11d56fff35c24eb59d97885d Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 17 Dec 2013 19:04:40 +0000 +Subject: [PATCH] remove TH + +--- + src/Generics/Deriving/TH.hs | 354 -------------------------------------------- + 1 file changed, 354 deletions(-) + +diff --git a/src/Generics/Deriving/TH.hs b/src/Generics/Deriving/TH.hs +index 783cb65..9aab713 100644 +--- a/src/Generics/Deriving/TH.hs ++++ b/src/Generics/Deriving/TH.hs +@@ -19,18 +19,6 @@ + + -- Adapted from Generics.Regular.TH + module Generics.Deriving.TH ( +- +- deriveMeta +- , deriveData +- , deriveConstructors +- , deriveSelectors +- +-#if __GLASGOW_HASKELL__ < 701 +- , deriveAll +- , deriveRepresentable0 +- , deriveRep0 +- , simplInstance +-#endif + ) where + + import Generics.Deriving.Base +@@ -41,124 +29,6 @@ import Language.Haskell.TH.Syntax (Lift(..)) + import Data.List (intercalate) + import Control.Monad + +--- | Given the names of a generic class, a type to instantiate, a function in +--- the class and the default implementation, generates the code for a basic +--- generic instance. +-simplInstance :: Name -> Name -> Name -> Name -> Q [Dec] +-simplInstance cl ty fn df = do +- i <- reify (genRepName 0 ty) +- x <- newName "x" +- let typ = ForallT [PlainTV x] [] +- ((foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT (genRepName 0 ty)) +- (typeVariables i)) `AppT` (VarT x)) +- fmap (: []) $ instanceD (cxt []) (conT cl `appT` conT ty) +- [funD fn [clause [] (normalB (varE df `appE` +- (sigE (global 'undefined) (return typ)))) []]] +- +- +--- | Given the type and the name (as string) for the type to derive, +--- generate the 'Data' instance, the 'Constructor' instances, the 'Selector' +--- instances, and the 'Representable0' instance. +-deriveAll :: Name -> Q [Dec] +-deriveAll n = +- do a <- deriveMeta n +- b <- deriveRepresentable0 n +- return (a ++ b) +- +--- | Given the type and the name (as string) for the type to derive, +--- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector' +--- instances. +-deriveMeta :: Name -> Q [Dec] +-deriveMeta n = +- do a <- deriveData n +- b <- deriveConstructors n +- c <- deriveSelectors n +- return (a ++ b ++ c) +- +--- | Given a datatype name, derive a datatype and instance of class 'Datatype'. +-deriveData :: Name -> Q [Dec] +-deriveData = dataInstance +- +--- | Given a datatype name, derive datatypes and +--- instances of class 'Constructor'. +-deriveConstructors :: Name -> Q [Dec] +-deriveConstructors = constrInstance +- +--- | Given a datatype name, derive datatypes and instances of class 'Selector'. +-deriveSelectors :: Name -> Q [Dec] +-deriveSelectors = selectInstance +- +--- | Given the type and the name (as string) for the Representable0 type +--- synonym to derive, generate the 'Representable0' instance. +-deriveRepresentable0 :: Name -> Q [Dec] +-deriveRepresentable0 n = do +- rep0 <- deriveRep0 n +- inst <- deriveInst n +- return $ rep0 ++ inst +- +--- | Derive only the 'Rep0' type synonym. Not needed if 'deriveRepresentable0' +--- is used. +-deriveRep0 :: Name -> Q [Dec] +-deriveRep0 n = do +- i <- reify n +- fmap (:[]) $ tySynD (genRepName 0 n) (typeVariables i) (rep0Type n) +- +-deriveInst :: Name -> Q [Dec] +-deriveInst t = do +- i <- reify t +- let typ q = foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT q) +- (typeVariables i) +-#if __GLASGOW_HASKELL__ >= 707 +- let tyIns = TySynInstD ''Rep (TySynEqn [typ t] (typ (genRepName 0 t))) +-#else +- let tyIns = TySynInstD ''Rep [typ t] (typ (genRepName 0 t)) +-#endif +- fcs <- mkFrom t 1 0 t +- tcs <- mkTo t 1 0 t +- liftM (:[]) $ +- instanceD (cxt []) (conT ''Generic `appT` return (typ t)) +- [return tyIns, funD 'from fcs, funD 'to tcs] +- +- +-dataInstance :: Name -> Q [Dec] +-dataInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ _ _) -> mkInstance n +- TyConI (NewtypeD _ n _ _ _) -> mkInstance n +- _ -> return [] +- where +- mkInstance n = do +- ds <- mkDataData n +- is <- mkDataInstance n +- return $ [ds,is] +- +-constrInstance :: Name -> Q [Dec] +-constrInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ cs _) -> mkInstance n cs +- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c] +- _ -> return [] +- where +- mkInstance n cs = do +- ds <- mapM (mkConstrData n) cs +- is <- mapM (mkConstrInstance n) cs +- return $ ds ++ is +- +-selectInstance :: Name -> Q [Dec] +-selectInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ cs _) -> mkInstance n cs +- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c] +- _ -> return [] +- where +- mkInstance n cs = do +- ds <- mapM (mkSelectData n) cs +- is <- mapM (mkSelectInstance n) cs +- return $ concat (ds ++ is) +- + typeVariables :: Info -> [TyVarBndr] + typeVariables (TyConI (DataD _ _ tv _ _)) = tv + typeVariables (TyConI (NewtypeD _ _ tv _ _)) = tv +@@ -179,233 +49,9 @@ genName = mkName . (++"_") . intercalate "_" . map nameBase + genRepName :: Int -> Name -> Name + genRepName n = mkName . (++"_") . (("Rep" ++ show n) ++) . nameBase + +-mkDataData :: Name -> Q Dec +-mkDataData n = dataD (cxt []) (genName [n]) [] [] [] +- +-mkConstrData :: Name -> Con -> Q Dec +-mkConstrData dt (NormalC n _) = +- dataD (cxt []) (genName [dt, n]) [] [] [] +-mkConstrData dt r@(RecC _ _) = +- mkConstrData dt (stripRecordNames r) +-mkConstrData dt (InfixC t1 n t2) = +- mkConstrData dt (NormalC n [t1,t2]) +- +-mkSelectData :: Name -> Con -> Q [Dec] +-mkSelectData dt r@(RecC n fs) = return (map one fs) +- where one (f, _, _) = DataD [] (genName [dt, n, f]) [] [] [] +-mkSelectData dt _ = return [] +- +- +-mkDataInstance :: Name -> Q Dec +-mkDataInstance n = +- instanceD (cxt []) (appT (conT ''Datatype) (conT $ genName [n])) +- [funD 'datatypeName [clause [wildP] (normalB (stringE (nameBase n))) []] +- ,funD 'moduleName [clause [wildP] (normalB (stringE name)) []]] +- where +- name = maybe (error "Cannot fetch module name!") id (nameModule n) +- +-instance Lift Fixity where +- lift Prefix = conE 'Prefix +- lift (Infix a n) = conE 'Infix `appE` [| a |] `appE` [| n |] +- +-instance Lift Associativity where +- lift LeftAssociative = conE 'LeftAssociative +- lift RightAssociative = conE 'RightAssociative +- lift NotAssociative = conE 'NotAssociative +- +-mkConstrInstance :: Name -> Con -> Q Dec +-mkConstrInstance dt (NormalC n _) = mkConstrInstanceWith dt n [] +-mkConstrInstance dt (RecC n _) = mkConstrInstanceWith dt n +- [ funD 'conIsRecord [clause [wildP] (normalB (conE 'True)) []]] +-mkConstrInstance dt (InfixC t1 n t2) = +- do +- i <- reify n +- let fi = case i of +- DataConI _ _ _ f -> convertFixity f +- _ -> Prefix +- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n])) +- [funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []], +- funD 'conFixity [clause [wildP] (normalB [| fi |]) []]] +- where +- convertFixity (Fixity n d) = Infix (convertDirection d) n +- convertDirection InfixL = LeftAssociative +- convertDirection InfixR = RightAssociative +- convertDirection InfixN = NotAssociative +- +-mkConstrInstanceWith :: Name -> Name -> [Q Dec] -> Q Dec +-mkConstrInstanceWith dt n extra = +- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n])) +- (funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []] : extra) +- +-mkSelectInstance :: Name -> Con -> Q [Dec] +-mkSelectInstance dt r@(RecC n fs) = return (map one fs) where +- one (f, _, _) = +- InstanceD ([]) (AppT (ConT ''Selector) (ConT $ genName [dt, n, f])) +- [FunD 'selName [Clause [WildP] +- (NormalB (LitE (StringL (nameBase f)))) []]] +-mkSelectInstance _ _ = return [] +- +-rep0Type :: Name -> Q Type +-rep0Type n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- (conT ''D1) `appT` (conT $ genName [dt]) `appT` +- (foldr1' sum (conT ''V1) +- (map (rep0Con (dt, map tyVarBndrToName vs)) cs)) +- TyConI (NewtypeD _ dt vs c _) -> +- (conT ''D1) `appT` (conT $ genName [dt]) `appT` +- (rep0Con (dt, map tyVarBndrToName vs) c) +- TyConI (TySynD t _ _) -> error "type synonym?" +- _ -> error "unknown construct" +- --appT b (conT $ mkName (nameBase n)) +- b where +- sum :: Q Type -> Q Type -> Q Type +- sum a b = conT ''(:+:) `appT` a `appT` b +- +- +-rep0Con :: (Name, [Name]) -> Con -> Q Type +-rep0Con (dt, vs) (NormalC n []) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (conT ''S1 `appT` conT ''NoSelector `appT` conT ''U1) +-rep0Con (dt, vs) (NormalC n fs) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (foldr1 prod (map (repField (dt, vs) . snd) fs)) where +- prod :: Q Type -> Q Type -> Q Type +- prod a b = conT ''(:*:) `appT` a `appT` b +-rep0Con (dt, vs) r@(RecC n []) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` conT ''U1 +-rep0Con (dt, vs) r@(RecC n fs) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (foldr1 prod (map (repField' (dt, vs) n) fs)) where +- prod :: Q Type -> Q Type -> Q Type +- prod a b = conT ''(:*:) `appT` a `appT` b +- +-rep0Con d (InfixC t1 n t2) = rep0Con d (NormalC n [t1,t2]) +- +---dataDeclToType :: (Name, [Name]) -> Type +---dataDeclToType (dt, vs) = foldl (\a b -> AppT a (VarT b)) (ConT dt) vs +- +-repField :: (Name, [Name]) -> Type -> Q Type +---repField d t | t == dataDeclToType d = conT ''I +-repField d t = conT ''S1 `appT` conT ''NoSelector `appT` +- (conT ''Rec0 `appT` return t) +- +-repField' :: (Name, [Name]) -> Name -> (Name, Strict, Type) -> Q Type +---repField' d ns (_, _, t) | t == dataDeclToType d = conT ''I +-repField' (dt, vs) ns (f, _, t) = conT ''S1 `appT` conT (genName [dt, ns, f]) +- `appT` (conT ''Rec0 `appT` return t) +--- Note: we should generate Par0 too, at some point +- +- +-mkFrom :: Name -> Int -> Int -> Name -> Q [Q Clause] +-mkFrom ns m i n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- let wrapE e = lrE m i e +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- zipWith (fromCon wrapE ns (dt, map tyVarBndrToName vs) +- (length cs)) [0..] cs +- TyConI (NewtypeD _ dt vs c _) -> +- [fromCon wrapE ns (dt, map tyVarBndrToName vs) 1 0 c] +- TyConI (TySynD t _ _) -> error "type synonym?" +- -- [clause [varP (field 0)] (normalB (wrapE $ conE 'K1 `appE` varE (field 0))) []] +- _ -> error "unknown construct" +- return b +- +-mkTo :: Name -> Int -> Int -> Name -> Q [Q Clause] +-mkTo ns m i n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- let wrapP p = lrP m i p +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- zipWith (toCon wrapP ns (dt, map tyVarBndrToName vs) +- (length cs)) [0..] cs +- TyConI (NewtypeD _ dt vs c _) -> +- [toCon wrapP ns (dt, map tyVarBndrToName vs) 1 0 c] +- TyConI (TySynD t _ _) -> error "type synonym?" +- -- [clause [wrapP $ conP 'K1 [varP (field 0)]] (normalB $ varE (field 0)) []] +- _ -> error "unknown construct" +- return b +- +-fromCon :: (Q Exp -> Q Exp) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause +-fromCon wrap ns (dt, vs) m i (NormalC cn []) = +- clause +- [conP cn []] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ appE (conE 'M1) $ +- conE 'M1 `appE` (conE 'U1)) [] +-fromCon wrap ns (dt, vs) m i (NormalC cn fs) = +- -- runIO (putStrLn ("constructor " ++ show ix)) >> +- clause +- [conP cn (map (varP . field) [0..length fs - 1])] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` +- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map snd fs))) [] +- where prod x y = conE '(:*:) `appE` x `appE` y +-fromCon wrap ns (dt, vs) m i r@(RecC cn []) = +- clause +- [conP cn []] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` (conE 'U1)) [] +-fromCon wrap ns (dt, vs) m i r@(RecC cn fs) = +- clause +- [conP cn (map (varP . field) [0..length fs - 1])] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` +- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map trd fs))) [] +- where prod x y = conE '(:*:) `appE` x `appE` y +-fromCon wrap ns (dt, vs) m i (InfixC t1 cn t2) = +- fromCon wrap ns (dt, vs) m i (NormalC cn [t1,t2]) +- +-fromField :: (Name, [Name]) -> Int -> Type -> Q Exp +---fromField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conE 'I `appE` varE (field nr) +-fromField (dt, vs) nr t = conE 'M1 `appE` (conE 'K1 `appE` varE (field nr)) +- +-toCon :: (Q Pat -> Q Pat) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause +-toCon wrap ns (dt, vs) m i (NormalC cn []) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'M1 [conP 'U1 []]]]] +- (normalB $ conE cn) [] +-toCon wrap ns (dt, vs) m i (NormalC cn fs) = +- -- runIO (putStrLn ("constructor " ++ show ix)) >> +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 +- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map snd fs))]]] +- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) [] +- where prod x y = conP '(:*:) [x,y] +-toCon wrap ns (dt, vs) m i r@(RecC cn []) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'U1 []]]] +- (normalB $ conE cn) [] +-toCon wrap ns (dt, vs) m i r@(RecC cn fs) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 +- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map trd fs))]]] +- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) [] +- where prod x y = conP '(:*:) [x,y] +-toCon wrap ns (dt, vs) m i (InfixC t1 cn t2) = +- toCon wrap ns (dt, vs) m i (NormalC cn [t1,t2]) +- +-toField :: (Name, [Name]) -> Int -> Type -> Q Pat +---toField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conP 'I [varP (field nr)] +-toField (dt, vs) nr t = conP 'M1 [conP 'K1 [varP (field nr)]] +- +- + field :: Int -> Name + field n = mkName $ "f" ++ show n + +-lrP :: Int -> Int -> (Q Pat -> Q Pat) +-lrP 1 0 p = p +-lrP m 0 p = conP 'L1 [p] +-lrP m i p = conP 'R1 [lrP (m-1) (i-1) p] +- +-lrE :: Int -> Int -> (Q Exp -> Q Exp) +-lrE 1 0 e = e +-lrE m 0 e = conE 'L1 `appE` e +-lrE m i e = conE 'R1 `appE` lrE (m-1) (i-1) e + + trd (_,_,c) = c + +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/lens_no-TH.patch b/standalone/no-th/haskell-patches/lens_no-TH.patch new file mode 100644 index 000000000..7fdd70639 --- /dev/null +++ b/standalone/no-th/haskell-patches/lens_no-TH.patch @@ -0,0 +1,230 @@ +From bc312c7431877b3b788de5e7ce5ee743be73c0ba Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 10 Jun 2014 22:13:58 +0000 +Subject: [PATCH] remove TH + +--- + lens.cabal | 19 +------------------ + src/Control/Lens.hs | 8 ++------ + src/Control/Lens/Cons.hs | 2 -- + src/Control/Lens/Internal/Fold.hs | 2 -- + src/Control/Lens/Operators.hs | 2 +- + src/Control/Lens/Prism.hs | 2 -- + src/Control/Monad/Primitive/Lens.hs | 1 - + 7 files changed, 4 insertions(+), 32 deletions(-) + +diff --git a/lens.cabal b/lens.cabal +index d70c2f4..28af768 100644 +--- a/lens.cabal ++++ b/lens.cabal +@@ -10,7 +10,7 @@ stability: provisional + homepage: http://github.com/ekmett/lens/ + bug-reports: http://github.com/ekmett/lens/issues + copyright: Copyright (C) 2012-2014 Edward A. Kmett +-build-type: Custom ++build-type: Simple + -- build-tools: cpphs + tested-with: GHC == 7.4.1, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.1, GHC == 7.8.2 + synopsis: Lenses, Folds and Traversals +@@ -220,7 +220,6 @@ library + Control.Exception.Lens + Control.Lens + Control.Lens.Action +- Control.Lens.At + Control.Lens.Combinators + Control.Lens.Cons + Control.Lens.Each +@@ -248,29 +247,24 @@ library + Control.Lens.Internal.Reflection + Control.Lens.Internal.Review + Control.Lens.Internal.Setter +- Control.Lens.Internal.TH + Control.Lens.Internal.Zoom + Control.Lens.Iso + Control.Lens.Lens + Control.Lens.Level + Control.Lens.Loupe + Control.Lens.Operators +- Control.Lens.Plated + Control.Lens.Prism + Control.Lens.Reified + Control.Lens.Review + Control.Lens.Setter +- Control.Lens.TH + Control.Lens.Traversal + Control.Lens.Tuple + Control.Lens.Type + Control.Lens.Wrapped + Control.Lens.Zoom +- Control.Monad.Error.Lens + Control.Monad.Primitive.Lens + Control.Parallel.Strategies.Lens + Control.Seq.Lens +- Data.Aeson.Lens + Data.Array.Lens + Data.Bits.Lens + Data.ByteString.Lens +@@ -293,17 +287,10 @@ library + Data.Typeable.Lens + Data.Vector.Lens + Data.Vector.Generic.Lens +- Generics.Deriving.Lens +- GHC.Generics.Lens + System.Exit.Lens + System.FilePath.Lens +- System.IO.Error.Lens +- Language.Haskell.TH.Lens + Numeric.Lens + +- other-modules: +- Control.Lens.Internal.TupleIxedTH +- + cpp-options: -traditional + + if flag(safe) +@@ -405,7 +392,6 @@ test-suite doctests + deepseq, + doctest >= 0.9.1, + filepath, +- generic-deriving, + mtl, + nats, + parallel, +@@ -443,7 +429,6 @@ benchmark plated + comonad, + criterion, + deepseq, +- generic-deriving, + lens, + transformers + +@@ -478,7 +463,6 @@ benchmark unsafe + comonads-fd, + criterion, + deepseq, +- generic-deriving, + lens, + transformers + +@@ -495,6 +479,5 @@ benchmark zipper + comonads-fd, + criterion, + deepseq, +- generic-deriving, + lens, + transformers +diff --git a/src/Control/Lens.hs b/src/Control/Lens.hs +index 7e15267..433f1fc 100644 +--- a/src/Control/Lens.hs ++++ b/src/Control/Lens.hs +@@ -41,7 +41,6 @@ + ---------------------------------------------------------------------------- + module Control.Lens + ( module Control.Lens.Action +- , module Control.Lens.At + , module Control.Lens.Cons + , module Control.Lens.Each + , module Control.Lens.Empty +@@ -53,12 +52,11 @@ module Control.Lens + , module Control.Lens.Lens + , module Control.Lens.Level + , module Control.Lens.Loupe +- , module Control.Lens.Plated + , module Control.Lens.Prism + , module Control.Lens.Reified + , module Control.Lens.Review + , module Control.Lens.Setter +-#ifndef DISABLE_TEMPLATE_HASKELL ++#if 0 + , module Control.Lens.TH + #endif + , module Control.Lens.Traversal +@@ -69,7 +67,6 @@ module Control.Lens + ) where + + import Control.Lens.Action +-import Control.Lens.At + import Control.Lens.Cons + import Control.Lens.Each + import Control.Lens.Empty +@@ -81,12 +78,11 @@ import Control.Lens.Iso + import Control.Lens.Lens + import Control.Lens.Level + import Control.Lens.Loupe +-import Control.Lens.Plated + import Control.Lens.Prism + import Control.Lens.Reified + import Control.Lens.Review + import Control.Lens.Setter +-#ifndef DISABLE_TEMPLATE_HASKELL ++#if 0 + import Control.Lens.TH + #endif + import Control.Lens.Traversal +diff --git a/src/Control/Lens/Cons.hs b/src/Control/Lens/Cons.hs +index a80e9c8..7d27b80 100644 +--- a/src/Control/Lens/Cons.hs ++++ b/src/Control/Lens/Cons.hs +@@ -55,8 +55,6 @@ import Data.Vector.Unboxed (Unbox) + import qualified Data.Vector.Unboxed as Unbox + import Data.Word + +-{-# ANN module "HLint: ignore Eta reduce" #-} +- + -- $setup + -- >>> :set -XNoOverloadedStrings + -- >>> import Control.Lens +diff --git a/src/Control/Lens/Internal/Fold.hs b/src/Control/Lens/Internal/Fold.hs +index ab09c6b..43aa905 100644 +--- a/src/Control/Lens/Internal/Fold.hs ++++ b/src/Control/Lens/Internal/Fold.hs +@@ -37,8 +37,6 @@ import Data.Maybe + import Data.Semigroup hiding (Min, getMin, Max, getMax) + import Data.Reflection + +-{-# ANN module "HLint: ignore Avoid lambda" #-} +- + ------------------------------------------------------------------------------ + -- Folding + ------------------------------------------------------------------------------ +diff --git a/src/Control/Lens/Operators.hs b/src/Control/Lens/Operators.hs +index 9992e63..631e8e6 100644 +--- a/src/Control/Lens/Operators.hs ++++ b/src/Control/Lens/Operators.hs +@@ -111,7 +111,7 @@ module Control.Lens.Operators + , (<#~) + , (<#=) + -- * "Control.Lens.Plated" +- , (...) ++ --, (...) + -- * "Control.Lens.Review" + , ( # ) + -- * "Control.Lens.Setter" +diff --git a/src/Control/Lens/Prism.hs b/src/Control/Lens/Prism.hs +index 9e0bec7..0cf6737 100644 +--- a/src/Control/Lens/Prism.hs ++++ b/src/Control/Lens/Prism.hs +@@ -59,8 +59,6 @@ import Unsafe.Coerce + import Data.Profunctor.Unsafe + #endif + +-{-# ANN module "HLint: ignore Use camelCase" #-} +- + -- $setup + -- >>> :set -XNoOverloadedStrings + -- >>> import Control.Lens +diff --git a/src/Control/Monad/Primitive/Lens.hs b/src/Control/Monad/Primitive/Lens.hs +index ee942c6..2f37134 100644 +--- a/src/Control/Monad/Primitive/Lens.hs ++++ b/src/Control/Monad/Primitive/Lens.hs +@@ -20,7 +20,6 @@ import Control.Lens + import Control.Monad.Primitive (PrimMonad(..)) + import GHC.Prim (State#) + +-{-# ANN module "HLint: ignore Unused LANGUAGE pragma" #-} + + prim :: (PrimMonad m) => Iso' (m a) (State# (PrimState m) -> (# State# (PrimState m), a #)) + prim = iso internal primitive +-- +2.0.0 + diff --git a/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch new file mode 100644 index 000000000..c24fa5aa2 --- /dev/null +++ b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch @@ -0,0 +1,27 @@ +From 8e78a25ce0cc19e52d063f66bd4cd316462393d4 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 6 Mar 2014 23:27:06 +0000 +Subject: [PATCH] disable th + +--- + monad-logger.cabal | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/monad-logger.cabal b/monad-logger.cabal +index b0aa271..cd56c0f 100644 +--- a/monad-logger.cabal ++++ b/monad-logger.cabal +@@ -14,8 +14,8 @@ cabal-version: >=1.8 + + flag template_haskell { + Description: Enable Template Haskell support +- Default: True +- Manual: True ++ Default: False ++ Manual: False + } + + library +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/persistent-template_stub-out.patch b/standalone/no-th/haskell-patches/persistent-template_stub-out.patch new file mode 100644 index 000000000..29002eb32 --- /dev/null +++ b/standalone/no-th/haskell-patches/persistent-template_stub-out.patch @@ -0,0 +1,25 @@ +From 4b958f97bffdeedc0c946d5fdc9749d2cc566fcc Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 26 Dec 2013 15:54:37 -0400 +Subject: [PATCH] stub out + +--- + persistent-template.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/persistent-template.cabal b/persistent-template.cabal +index c4aee68..7905278 100644 +--- a/persistent-template.cabal ++++ b/persistent-template.cabal +@@ -24,7 +24,7 @@ library + , aeson + , monad-logger + , unordered-containers +- exposed-modules: Database.Persist.TH ++ exposed-modules: + ghc-options: -Wall + if impl(ghc >= 7.4) + cpp-options: -DGHC_7_4 +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch new file mode 100644 index 000000000..7a66e1fd1 --- /dev/null +++ b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch @@ -0,0 +1,41 @@ +From efd18199fa245e51e6137036062ded8b0b26f78c Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 17 Dec 2013 18:08:22 +0000 +Subject: [PATCH] disable TH + +--- + Database/Persist/Sql/Raw.hs | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/Database/Persist/Sql/Raw.hs b/Database/Persist/Sql/Raw.hs +index 73189dd..d432790 100644 +--- a/Database/Persist/Sql/Raw.hs ++++ b/Database/Persist/Sql/Raw.hs +@@ -11,7 +11,7 @@ import Data.IORef (writeIORef, readIORef, newIORef) + import Control.Exception (throwIO) + import Control.Monad (when, liftM) + import Data.Text (Text, pack) +-import Control.Monad.Logger (logDebugS) ++--import Control.Monad.Logger (logDebugS) + import Data.Int (Int64) + import Control.Monad.Trans.Class (lift) + import qualified Data.Text as T +@@ -22,7 +22,6 @@ rawQuery :: (MonadSqlPersist m, MonadResource m) + -> [PersistValue] + -> Source m [PersistValue] + rawQuery sql vals = do +- lift $ $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals + conn <- lift askSqlConn + bracketP + (getStmtConn conn sql) +@@ -34,7 +33,6 @@ rawExecute x y = liftM (const ()) $ rawExecuteCount x y + + rawExecuteCount :: MonadSqlPersist m => Text -> [PersistValue] -> m Int64 + rawExecuteCount sql vals = do +- $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals + stmt <- getStmt sql + res <- liftIO $ stmtExecute stmt vals + liftIO $ stmtReset stmt +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch b/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch new file mode 100644 index 000000000..8fa07e85a --- /dev/null +++ b/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch @@ -0,0 +1,24 @@ +From 7e85a025349877565a70c375ef55508f215eaaf8 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Wed, 21 May 2014 04:23:49 +0000 +Subject: [PATCH] remove TH + +--- + process-conduit.cabal | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/process-conduit.cabal b/process-conduit.cabal +index e6988e0..a2e03e0 100644 +--- a/process-conduit.cabal ++++ b/process-conduit.cabal +@@ -24,7 +24,6 @@ source-repository head + + library + exposed-modules: Data.Conduit.Process +- System.Process.QQ + + build-depends: base == 4.* + , template-haskell >= 2.4 +-- +2.0.0.rc2 + diff --git a/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch new file mode 100644 index 000000000..45397f3e5 --- /dev/null +++ b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch @@ -0,0 +1,26 @@ +From 392602f5ff14c0b5a801397d075ddcbcd890aa83 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 18 Apr 2013 17:50:59 -0400 +Subject: [PATCH] fix cross build + +--- + src/Data/Profunctor/Unsafe.hs | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/Data/Profunctor/Unsafe.hs b/src/Data/Profunctor/Unsafe.hs +index 025c7c4..0249274 100644 +--- a/src/Data/Profunctor/Unsafe.hs ++++ b/src/Data/Profunctor/Unsafe.hs +@@ -40,9 +40,6 @@ import Data.Tagged + import Prelude hiding (id,(.),sequence) + import Unsafe.Coerce + +-{-# ANN module "Hlint: ignore Redundant lambda" #-} +-{-# ANN module "Hlint: ignore Collapse lambdas" #-} +- + infixr 9 #. + infixl 8 .# + +-- +1.8.2.rc3 + diff --git a/standalone/no-th/haskell-patches/reflection_remove-TH.patch b/standalone/no-th/haskell-patches/reflection_remove-TH.patch new file mode 100644 index 000000000..4f8b4bc20 --- /dev/null +++ b/standalone/no-th/haskell-patches/reflection_remove-TH.patch @@ -0,0 +1,59 @@ +From c0f5dcfd6ba7a05bb84b6adc4664c8dde109e6ac Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 7 Mar 2014 04:30:22 +0000 +Subject: [PATCH] remove TH + +--- + fast/Data/Reflection.hs | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fast/Data/Reflection.hs b/fast/Data/Reflection.hs +index ca57d35..d3f8356 100644 +--- a/fast/Data/Reflection.hs ++++ b/fast/Data/Reflection.hs +@@ -59,7 +59,7 @@ module Data.Reflection + , Given(..) + , give + -- * Template Haskell reflection +- , int, nat ++ --, int, nat + -- * Useful compile time naturals + , Z, D, SD, PD + ) where +@@ -161,6 +161,7 @@ instance Reifies n Int => Reifies (PD n) Int where + -- instead of @$(int 3)@. Sometimes the two will produce the same + -- representation (if compiled without the @-DUSE_TYPE_LITS@ preprocessor + -- directive). ++{- + int :: Int -> TypeQ + int n = case quotRem n 2 of + (0, 0) -> conT ''Z +@@ -176,7 +177,7 @@ nat :: Int -> TypeQ + nat n + | n >= 0 = int n + | otherwise = error "nat: negative" +- ++-} + #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL < 704 + instance Show (Q a) + instance Eq (Q a) +@@ -195,6 +196,7 @@ instance Fractional a => Fractional (Q a) where + recip = fmap recip + fromRational = return . fromRational + ++{- + -- | This permits the use of $(5) as a type splice. + instance Num Type where + #ifdef USE_TYPE_LITS +@@ -254,7 +256,7 @@ instance Num Exp where + abs = onProxyType1 abs + signum = onProxyType1 signum + fromInteger n = ConE 'Proxy `SigE` (ConT ''Proxy `AppT` fromInteger n) +- ++-} + #ifdef USE_TYPE_LITS + addProxy :: Proxy a -> Proxy b -> Proxy (a + b) + addProxy _ _ = Proxy +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/shakespeare_remove-TH.patch b/standalone/no-th/haskell-patches/shakespeare_remove-TH.patch new file mode 100644 index 000000000..86022ec3d --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare_remove-TH.patch @@ -0,0 +1,1314 @@ +From 6de4e75bfbfccb8aedcbf3ee75e5d544f1eeeca5 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 3 Jul 2014 21:48:14 +0000 +Subject: [PATCH] remove TH + +--- + Text/Cassius.hs | 23 ------ + Text/Coffee.hs | 56 ++------------- + Text/Css.hs | 151 --------------------------------------- + Text/CssCommon.hs | 4 -- + Text/Hamlet.hs | 86 +++++++--------------- + Text/Hamlet/Parse.hs | 3 +- + Text/Julius.hs | 67 +++-------------- + Text/Lucius.hs | 46 +----------- + Text/Roy.hs | 51 ++----------- + Text/Shakespeare.hs | 70 +++--------------- + Text/Shakespeare/Base.hs | 28 -------- + Text/Shakespeare/I18N.hs | 178 ++-------------------------------------------- + Text/Shakespeare/Text.hs | 125 +++----------------------------- + shakespeare.cabal | 3 +- + 14 files changed, 78 insertions(+), 813 deletions(-) + +diff --git a/Text/Cassius.hs b/Text/Cassius.hs +index 91fc90f..c515807 100644 +--- a/Text/Cassius.hs ++++ b/Text/Cassius.hs +@@ -13,10 +13,6 @@ module Text.Cassius + , renderCss + , renderCssUrl + -- * Parsing +- , cassius +- , cassiusFile +- , cassiusFileDebug +- , cassiusFileReload + -- * ToCss instances + -- ** Color + , Color (..) +@@ -27,11 +23,8 @@ module Text.Cassius + , AbsoluteUnit (..) + , AbsoluteSize (..) + , absoluteSize +- , EmSize (..) +- , ExSize (..) + , PercentageSize (..) + , percentageSize +- , PixelSize (..) + -- * Internal + , cassiusUsedIdentifiers + ) where +@@ -43,25 +36,9 @@ import Language.Haskell.TH.Quote (QuasiQuoter (..)) + import Language.Haskell.TH.Syntax + import qualified Data.Text.Lazy as TL + import Text.CssCommon +-import Text.Lucius (lucius) + import qualified Text.Lucius + import Text.IndentToBrace (i2b) + +-cassius :: QuasiQuoter +-cassius = QuasiQuoter { quoteExp = quoteExp lucius . i2b } +- +-cassiusFile :: FilePath -> Q Exp +-cassiusFile fp = do +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- contents <- fmap TL.unpack $ qRunIO $ readUtf8File fp +- quoteExp cassius contents +- +-cassiusFileDebug, cassiusFileReload :: FilePath -> Q Exp +-cassiusFileDebug = cssFileDebug True [|Text.Lucius.parseTopLevels|] Text.Lucius.parseTopLevels +-cassiusFileReload = cassiusFileDebug +- + -- | Determine which identifiers are used by the given template, useful for + -- creating systems like yesod devel. + cassiusUsedIdentifiers :: String -> [(Deref, VarType)] +diff --git a/Text/Coffee.hs b/Text/Coffee.hs +index 488c81b..61db85b 100644 +--- a/Text/Coffee.hs ++++ b/Text/Coffee.hs +@@ -51,13 +51,13 @@ module Text.Coffee + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- coffee +- , coffeeFile +- , coffeeFileReload +- , coffeeFileDebug ++ -- coffee ++ --, coffeeFile ++ --, coffeeFileReload ++ --, coffeeFileDebug + + #ifdef TEST_EXPORT +- , coffeeSettings ++ --, coffeeSettings + #endif + ) where + +@@ -65,49 +65,3 @@ import Language.Haskell.TH.Quote (QuasiQuoter (..)) + import Language.Haskell.TH.Syntax + import Text.Shakespeare + import Text.Julius +- +-coffeeSettings :: Q ShakespeareSettings +-coffeeSettings = do +- jsettings <- javascriptSettings +- return $ jsettings { varChar = '%' +- , preConversion = Just PreConvert { +- preConvert = ReadProcess "coffee" ["-spb"] +- , preEscapeIgnoreBalanced = "'\"`" -- don't insert backtacks for variable already inside strings or backticks. +- , preEscapeIgnoreLine = "#" -- ignore commented lines +- , wrapInsertion = Just WrapInsertion { +- wrapInsertionIndent = Just " " +- , wrapInsertionStartBegin = "(" +- , wrapInsertionSeparator = ", " +- , wrapInsertionStartClose = ") =>" +- , wrapInsertionEnd = "" +- , wrapInsertionAddParens = False +- } +- } +- } +- +--- | Read inline, quasiquoted CoffeeScript. +-coffee :: QuasiQuoter +-coffee = QuasiQuoter { quoteExp = \s -> do +- rs <- coffeeSettings +- quoteExp (shakespeare rs) s +- } +- +--- | Read in a CoffeeScript template file. This function reads the file once, at +--- compile time. +-coffeeFile :: FilePath -> Q Exp +-coffeeFile fp = do +- rs <- coffeeSettings +- shakespeareFile rs fp +- +--- | Read in a CoffeeScript template file. This impure function uses +--- unsafePerformIO to re-read the file on every call, allowing for rapid +--- iteration. +-coffeeFileReload :: FilePath -> Q Exp +-coffeeFileReload fp = do +- rs <- coffeeSettings +- shakespeareFileReload rs fp +- +--- | Deprecated synonym for 'coffeeFileReload' +-coffeeFileDebug :: FilePath -> Q Exp +-coffeeFileDebug = coffeeFileReload +-{-# DEPRECATED coffeeFileDebug "Please use coffeeFileReload instead." #-} +diff --git a/Text/Css.hs b/Text/Css.hs +index 75dc549..20c206c 100644 +--- a/Text/Css.hs ++++ b/Text/Css.hs +@@ -166,22 +166,6 @@ cssUsedIdentifiers toi2b parseBlocks s' = + (scope, rest') = go rest + go' (Attr k v) = k ++ v + +-cssFileDebug :: Bool -- ^ perform the indent-to-brace conversion +- -> Q Exp +- -> Parser [TopLevel Unresolved] +- -> FilePath +- -> Q Exp +-cssFileDebug toi2b parseBlocks' parseBlocks fp = do +- s <- fmap TL.unpack $ qRunIO $ readUtf8File fp +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- let vs = cssUsedIdentifiers toi2b parseBlocks s +- c <- mapM vtToExp vs +- cr <- [|cssRuntime toi2b|] +- parseBlocks'' <- parseBlocks' +- return $ cr `AppE` parseBlocks'' `AppE` (LitE $ StringL fp) `AppE` ListE c +- + combineSelectors :: HasLeadingSpace + -> [Contents] + -> [Contents] +@@ -287,18 +271,6 @@ cssRuntime toi2b parseBlocks fp cd render' = unsafePerformIO $ do + + addScope scope = map (DerefIdent . Ident *** CDPlain . fromString) scope ++ cd + +-vtToExp :: (Deref, VarType) -> Q Exp +-vtToExp (d, vt) = do +- d' <- lift d +- c' <- c vt +- return $ TupE [d', c' `AppE` derefToExp [] d] +- where +- c :: VarType -> Q Exp +- c VTPlain = [|CDPlain . toCss|] +- c VTUrl = [|CDUrl|] +- c VTUrlParam = [|CDUrlParam|] +- c VTMixin = [|CDMixin|] +- + getVars :: Monad m => [(String, String)] -> Content -> m [(Deref, VarType)] + getVars _ ContentRaw{} = return [] + getVars scope (ContentVar d) = +@@ -342,111 +314,8 @@ compressBlock (Block x y blocks mixins) = + cc (ContentRaw a:ContentRaw b:c) = cc $ ContentRaw (a ++ b) : c + cc (a:b) = a : cc b + +-blockToMixin :: Name +- -> Scope +- -> Block Unresolved +- -> Q Exp +-blockToMixin r scope (Block _sel props subblocks mixins) = +- [|Mixin +- { mixinAttrs = concat +- $ $(listE $ map go props) +- : map mixinAttrs $mixinsE +- -- FIXME too many complications to implement sublocks for now... +- , mixinBlocks = [] -- foldr (.) id $(listE $ map subGo subblocks) [] +- }|] +- {- +- . foldr (.) id $(listE $ map subGo subblocks) +- . (concatMap mixinBlocks $mixinsE ++) +- |] +- -} +- where +- mixinsE = return $ ListE $ map (derefToExp []) mixins +- go (Attr x y) = conE 'Attr +- `appE` (contentsToBuilder r scope x) +- `appE` (contentsToBuilder r scope y) +- subGo (Block sel' b c d) = blockToCss r scope $ Block sel' b c d +- +-blockToCss :: Name +- -> Scope +- -> Block Unresolved +- -> Q Exp +-blockToCss r scope (Block sel props subblocks mixins) = +- [|((Block +- { blockSelector = $(selectorToBuilder r scope sel) +- , blockAttrs = concat +- $ $(listE $ map go props) +- : map mixinAttrs $mixinsE +- , blockBlocks = () +- , blockMixins = () +- } :: Block Resolved):) +- . foldr (.) id $(listE $ map subGo subblocks) +- . (concatMap mixinBlocks $mixinsE ++) +- |] +- where +- mixinsE = return $ ListE $ map (derefToExp []) mixins +- go (Attr x y) = conE 'Attr +- `appE` (contentsToBuilder r scope x) +- `appE` (contentsToBuilder r scope y) +- subGo (hls, Block sel' b c d) = +- blockToCss r scope $ Block sel'' b c d +- where +- sel'' = combineSelectors hls sel sel' +- +-selectorToBuilder :: Name -> Scope -> [Contents] -> Q Exp +-selectorToBuilder r scope sels = +- contentsToBuilder r scope $ intercalate [ContentRaw ","] sels +- +-contentsToBuilder :: Name -> Scope -> [Content] -> Q Exp +-contentsToBuilder r scope contents = +- appE [|mconcat|] $ listE $ map (contentToBuilder r scope) contents +- +-contentToBuilder :: Name -> Scope -> Content -> Q Exp +-contentToBuilder _ _ (ContentRaw x) = +- [|fromText . pack|] `appE` litE (StringL x) +-contentToBuilder _ scope (ContentVar d) = +- case d of +- DerefIdent (Ident s) +- | Just val <- lookup s scope -> [|fromText . pack|] `appE` litE (StringL val) +- _ -> [|toCss|] `appE` return (derefToExp [] d) +-contentToBuilder r _ (ContentUrl u) = +- [|fromText|] `appE` +- (varE r `appE` return (derefToExp [] u) `appE` listE []) +-contentToBuilder r _ (ContentUrlParam u) = +- [|fromText|] `appE` +- ([|uncurry|] `appE` varE r `appE` return (derefToExp [] u)) +-contentToBuilder _ _ ContentMixin{} = error "contentToBuilder on ContentMixin" +- + type Scope = [(String, String)] + +-topLevelsToCassius :: [TopLevel Unresolved] +- -> Q Exp +-topLevelsToCassius a = do +- r <- newName "_render" +- lamE [varP r] $ appE [|CssNoWhitespace . foldr ($) []|] $ fmap ListE $ go r [] a +- where +- go _ _ [] = return [] +- go r scope (TopBlock b:rest) = do +- e <- [|(++) $ map TopBlock ($(blockToCss r scope b) [])|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopAtBlock name s b:rest) = do +- let s' = contentsToBuilder r scope s +- e <- [|(:) $ TopAtBlock $(lift name) $(s') $(blocksToCassius r scope b)|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopAtDecl dec cs:rest) = do +- e <- [|(:) $ TopAtDecl $(lift dec) $(contentsToBuilder r scope cs)|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopVar k v:rest) = go r ((k, v) : scope) rest +- +-blocksToCassius :: Name +- -> Scope +- -> [Block Unresolved] +- -> Q Exp +-blocksToCassius r scope a = do +- appE [|foldr ($) []|] $ listE $ map (blockToCss r scope) a +- + renderCss :: Css -> TL.Text + renderCss css = + toLazyText $ mconcat $ map go tops +@@ -515,23 +384,3 @@ renderBlock haveWhiteSpace indent (Block sel attrs () ()) + | haveWhiteSpace = fromString ";\n" + | otherwise = singleton ';' + +-instance Lift Mixin where +- lift (Mixin a b) = [|Mixin a b|] +-instance Lift (Attr Unresolved) where +- lift (Attr k v) = [|Attr k v :: Attr Unresolved |] +-instance Lift (Attr Resolved) where +- lift (Attr k v) = [|Attr $(liftBuilder k) $(liftBuilder v) :: Attr Resolved |] +- +-liftBuilder :: Builder -> Q Exp +-liftBuilder b = [|fromText $ pack $(lift $ TL.unpack $ toLazyText b)|] +- +-instance Lift Content where +- lift (ContentRaw s) = [|ContentRaw s|] +- lift (ContentVar d) = [|ContentVar d|] +- lift (ContentUrl d) = [|ContentUrl d|] +- lift (ContentUrlParam d) = [|ContentUrlParam d|] +- lift (ContentMixin m) = [|ContentMixin m|] +-instance Lift (Block Unresolved) where +- lift (Block a b c d) = [|Block a b c d|] +-instance Lift (Block Resolved) where +- lift (Block a b () ()) = [|Block $(liftBuilder a) b () ()|] +diff --git a/Text/CssCommon.hs b/Text/CssCommon.hs +index 719e0a8..8c40e8c 100644 +--- a/Text/CssCommon.hs ++++ b/Text/CssCommon.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE TemplateHaskell #-} + {-# LANGUAGE GeneralizedNewtypeDeriving #-} + {-# LANGUAGE FlexibleInstances #-} + {-# LANGUAGE CPP #-} +@@ -156,6 +155,3 @@ showSize :: Rational -> String -> String + showSize value' unit = printf "%f" value ++ unit + where value = fromRational value' :: Double + +-mkSizeType "EmSize" "em" +-mkSizeType "ExSize" "ex" +-mkSizeType "PixelSize" "px" +diff --git a/Text/Hamlet.hs b/Text/Hamlet.hs +index 39c1528..6321cd3 100644 +--- a/Text/Hamlet.hs ++++ b/Text/Hamlet.hs +@@ -11,36 +11,36 @@ + module Text.Hamlet + ( -- * Plain HTML + Html +- , shamlet +- , shamletFile +- , xshamlet +- , xshamletFile ++ --, shamlet ++ --, shamletFile ++ --, xshamlet ++ --, xshamletFile + -- * Hamlet + , HtmlUrl +- , hamlet +- , hamletFile +- , hamletFileReload +- , ihamletFileReload +- , xhamlet +- , xhamletFile ++ --, hamlet ++ --, hamletFile ++ --, hamletFileReload ++ --, ihamletFileReload ++ --, xhamlet ++ --, xhamletFile + -- * I18N Hamlet + , HtmlUrlI18n +- , ihamlet +- , ihamletFile ++ --, ihamlet ++ --, ihamletFile + -- * Type classes + , ToAttributes (..) + -- * Internal, for making more + , HamletSettings (..) + , NewlineStyle (..) +- , hamletWithSettings +- , hamletFileWithSettings ++ --, hamletWithSettings ++ --, hamletFileWithSettings + , defaultHamletSettings + , xhtmlHamletSettings +- , Env (..) +- , HamletRules (..) +- , hamletRules +- , ihamletRules +- , htmlRules ++ --, Env (..) ++ --, HamletRules (..) ++ --, hamletRules ++ --, ihamletRules ++ --, htmlRules + , CloseStyle (..) + -- * Used by generated code + , condH +@@ -110,47 +110,9 @@ type HtmlUrl url = Render url -> Html + -- | A function generating an 'Html' given a message translator and a URL rendering function. + type HtmlUrlI18n msg url = Translate msg -> Render url -> Html + +-docsToExp :: Env -> HamletRules -> Scope -> [Doc] -> Q Exp +-docsToExp env hr scope docs = do +- exps <- mapM (docToExp env hr scope) docs +- case exps of +- [] -> [|return ()|] +- [x] -> return x +- _ -> return $ DoE $ map NoBindS exps +- + unIdent :: Ident -> String + unIdent (Ident s) = s + +-bindingPattern :: Binding -> Q (Pat, [(Ident, Exp)]) +-bindingPattern (BindAs i@(Ident s) b) = do +- name <- newName s +- (pattern, scope) <- bindingPattern b +- return (AsP name pattern, (i, VarE name):scope) +-bindingPattern (BindVar i@(Ident s)) +- | all isDigit s = do +- return (LitP $ IntegerL $ read s, []) +- | otherwise = do +- name <- newName s +- return (VarP name, [(i, VarE name)]) +-bindingPattern (BindTuple is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (TupP patterns, concat scopes) +-bindingPattern (BindList is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (ListP patterns, concat scopes) +-bindingPattern (BindConstr con is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (ConP (mkConName con) patterns, concat scopes) +-bindingPattern (BindRecord con fields wild) = do +- let f (Ident field,b) = +- do (p,s) <- bindingPattern b +- return ((mkName field,p),s) +- (patterns, scopes) <- fmap unzip $ mapM f fields +- (patterns1, scopes1) <- if wild +- then bindWildFields con $ map fst fields +- else return ([],[]) +- return (RecP (mkConName con) (patterns++patterns1), concat scopes ++ scopes1) +- + mkConName :: DataConstr -> Name + mkConName = mkName . conToStr + +@@ -158,6 +120,7 @@ conToStr :: DataConstr -> String + conToStr (DCUnqualified (Ident x)) = x + conToStr (DCQualified (Module xs) (Ident x)) = intercalate "." $ xs ++ [x] + ++{- + -- Wildcards bind all of the unbound fields to variables whose name + -- matches the field name. + -- +@@ -296,10 +259,12 @@ hamlet = hamletWithSettings hamletRules defaultHamletSettings + + xhamlet :: QuasiQuoter + xhamlet = hamletWithSettings hamletRules xhtmlHamletSettings ++-} + + asHtmlUrl :: HtmlUrl url -> HtmlUrl url + asHtmlUrl = id + ++{- + hamletRules :: Q HamletRules + hamletRules = do + i <- [|id|] +@@ -360,6 +325,7 @@ hamletFromString :: Q HamletRules -> HamletSettings -> String -> Q Exp + hamletFromString qhr set s = do + hr <- qhr + hrWithEnv hr $ \env -> docsToExp env hr [] $ docFromString set s ++-} + + docFromString :: HamletSettings -> String -> [Doc] + docFromString set s = +@@ -367,6 +333,7 @@ docFromString set s = + Error s' -> error s' + Ok (_, d) -> d + ++{- + hamletFileWithSettings :: Q HamletRules -> HamletSettings -> FilePath -> Q Exp + hamletFileWithSettings qhr set fp = do + #ifdef GHC_7_4 +@@ -408,6 +375,7 @@ strToExp s@(c:_) + | isUpper c = ConE $ mkName s + | otherwise = VarE $ mkName s + strToExp "" = error "strToExp on empty string" ++-} + + -- | Checks for truth in the left value in each pair in the first argument. If + -- a true exists, then the corresponding right action is performed. Only the +@@ -460,7 +428,7 @@ hamletUsedIdentifiers settings = + data HamletRuntimeRules = HamletRuntimeRules { + hrrI18n :: Bool + } +- ++{- + hamletFileReloadWithSettings :: HamletRuntimeRules + -> HamletSettings -> FilePath -> Q Exp + hamletFileReloadWithSettings hrr settings fp = do +@@ -487,7 +455,7 @@ hamletFileReloadWithSettings hrr settings fp = do + c VTUrlParam = [|EUrlParam|] + c VTMixin = [|\r -> EMixin $ \c -> r c|] + c VTMsg = [|EMsg|] +- ++-} + -- move to Shakespeare.Base? + readFileUtf8 :: FilePath -> IO String + readFileUtf8 fp = fmap TL.unpack $ readUtf8File fp +diff --git a/Text/Hamlet/Parse.hs b/Text/Hamlet/Parse.hs +index b7e2954..1f14946 100644 +--- a/Text/Hamlet/Parse.hs ++++ b/Text/Hamlet/Parse.hs +@@ -616,6 +616,7 @@ data NewlineStyle = NoNewlines -- ^ never add newlines + | DefaultNewlineStyle + deriving Show + ++{- + instance Lift NewlineStyle where + lift NoNewlines = [|NoNewlines|] + lift NewlinesText = [|NewlinesText|] +@@ -627,7 +628,7 @@ instance Lift (String -> CloseStyle) where + + instance Lift HamletSettings where + lift (HamletSettings a b c d) = [|HamletSettings $(lift a) $(lift b) $(lift c) $(lift d)|] +- ++-} + + htmlEmptyTags :: Set String + htmlEmptyTags = Set.fromAscList +diff --git a/Text/Julius.hs b/Text/Julius.hs +index ec30690..5b5a075 100644 +--- a/Text/Julius.hs ++++ b/Text/Julius.hs +@@ -14,17 +14,17 @@ module Text.Julius + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- js +- , julius +- , juliusFile +- , jsFile +- , juliusFileDebug +- , jsFileDebug +- , juliusFileReload +- , jsFileReload ++ -- js ++ -- julius ++ -- juliusFile ++ -- jsFile ++ --, juliusFileDebug ++ --, jsFileDebug ++ --, juliusFileReload ++ --, jsFileReload + + -- * Datatypes +- , JavascriptUrl ++ JavascriptUrl + , Javascript (..) + , RawJavascript (..) + +@@ -37,9 +37,9 @@ module Text.Julius + , renderJavascriptUrl + + -- ** internal, used by 'Text.Coffee' +- , javascriptSettings ++ --, javascriptSettings + -- ** internal +- , juliusUsedIdentifiers ++ --, juliusUsedIdentifiers + , asJavascriptUrl + ) where + +@@ -102,48 +102,3 @@ instance RawJS TL.Text where rawJS = RawJavascript . fromLazyText + instance RawJS Builder where rawJS = RawJavascript + instance RawJS Bool where rawJS = RawJavascript . unJavascript . toJavascript + +-javascriptSettings :: Q ShakespeareSettings +-javascriptSettings = do +- toJExp <- [|toJavascript|] +- wrapExp <- [|Javascript|] +- unWrapExp <- [|unJavascript|] +- asJavascriptUrl' <- [|asJavascriptUrl|] +- return $ defaultShakespeareSettings { toBuilder = toJExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- , modifyFinalValue = Just asJavascriptUrl' +- } +- +-js, julius :: QuasiQuoter +-js = QuasiQuoter { quoteExp = \s -> do +- rs <- javascriptSettings +- quoteExp (shakespeare rs) s +- } +- +-julius = js +- +-jsFile, juliusFile :: FilePath -> Q Exp +-jsFile fp = do +- rs <- javascriptSettings +- shakespeareFile rs fp +- +-juliusFile = jsFile +- +- +-jsFileReload, juliusFileReload :: FilePath -> Q Exp +-jsFileReload fp = do +- rs <- javascriptSettings +- shakespeareFileReload rs fp +- +-juliusFileReload = jsFileReload +- +-jsFileDebug, juliusFileDebug :: FilePath -> Q Exp +-juliusFileDebug = jsFileReload +-{-# DEPRECATED juliusFileDebug "Please use juliusFileReload instead." #-} +-jsFileDebug = jsFileReload +-{-# DEPRECATED jsFileDebug "Please use jsFileReload instead." #-} +- +--- | Determine which identifiers are used by the given template, useful for +--- creating systems like yesod devel. +-juliusUsedIdentifiers :: String -> [(Deref, VarType)] +-juliusUsedIdentifiers = shakespeareUsedIdentifiers defaultShakespeareSettings +diff --git a/Text/Lucius.hs b/Text/Lucius.hs +index 346883d..f38492b 100644 +--- a/Text/Lucius.hs ++++ b/Text/Lucius.hs +@@ -8,13 +8,9 @@ + {-# OPTIONS_GHC -fno-warn-missing-fields #-} + module Text.Lucius + ( -- * Parsing +- lucius +- , luciusFile +- , luciusFileDebug +- , luciusFileReload + -- ** Mixins +- , luciusMixin +- , Mixin ++ -- luciusMixin ++ Mixin + -- ** Runtime + , luciusRT + , luciusRT' +@@ -40,11 +36,8 @@ module Text.Lucius + , AbsoluteUnit (..) + , AbsoluteSize (..) + , absoluteSize +- , EmSize (..) +- , ExSize (..) + , PercentageSize (..) + , percentageSize +- , PixelSize (..) + -- * Internal + , parseTopLevels + , luciusUsedIdentifiers +@@ -67,18 +60,6 @@ import Data.List (isSuffixOf) + import Control.Arrow (second) + import Text.Shakespeare (VarType) + +--- | +--- +--- >>> renderCss ([lucius|foo{bar:baz}|] undefined) +--- "foo{bar:baz}" +-lucius :: QuasiQuoter +-lucius = QuasiQuoter { quoteExp = luciusFromString } +- +-luciusFromString :: String -> Q Exp +-luciusFromString s = +- topLevelsToCassius +- $ either (error . show) id $ parse parseTopLevels s s +- + whiteSpace :: Parser () + whiteSpace = many whiteSpace1 >> return () + +@@ -218,17 +199,6 @@ parseComment = do + _ <- manyTill anyChar $ try $ string "*/" + return $ ContentRaw "" + +-luciusFile :: FilePath -> Q Exp +-luciusFile fp = do +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- contents <- fmap TL.unpack $ qRunIO $ readUtf8File fp +- luciusFromString contents +- +-luciusFileDebug, luciusFileReload :: FilePath -> Q Exp +-luciusFileDebug = cssFileDebug False [|parseTopLevels|] parseTopLevels +-luciusFileReload = luciusFileDebug + + parseTopLevels :: Parser [TopLevel Unresolved] + parseTopLevels = +@@ -377,15 +347,3 @@ luciusRTMinified tl scope = either Left (Right . renderCss . CssNoWhitespace) $ + -- creating systems like yesod devel. + luciusUsedIdentifiers :: String -> [(Deref, VarType)] + luciusUsedIdentifiers = cssUsedIdentifiers False parseTopLevels +- +-luciusMixin :: QuasiQuoter +-luciusMixin = QuasiQuoter { quoteExp = luciusMixinFromString } +- +-luciusMixinFromString :: String -> Q Exp +-luciusMixinFromString s' = do +- r <- newName "_render" +- case fmap compressBlock $ parse parseBlock s s of +- Left e -> error $ show e +- Right block -> blockToMixin r [] block +- where +- s = concat ["mixin{", s', "}"] +diff --git a/Text/Roy.hs b/Text/Roy.hs +index 6e5e246..9ab0dbc 100644 +--- a/Text/Roy.hs ++++ b/Text/Roy.hs +@@ -39,12 +39,12 @@ module Text.Roy + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- roy +- , royFile +- , royFileReload ++ -- roy ++ --, royFile ++ --, royFileReload + + #ifdef TEST_EXPORT +- , roySettings ++ --, roySettings + #endif + ) where + +@@ -53,46 +53,3 @@ import Language.Haskell.TH.Syntax + import Text.Shakespeare + import Text.Julius + +--- | The Roy language compiles down to Javascript. +--- We do this compilation once at compile time to avoid needing to do it during the request. +--- We call this a preConversion because other shakespeare modules like Lucius use Haskell to compile during the request instead rather than a system call. +-roySettings :: Q ShakespeareSettings +-roySettings = do +- jsettings <- javascriptSettings +- return $ jsettings { varChar = '#' +- , preConversion = Just PreConvert { +- preConvert = ReadProcess "roy" ["--stdio", "--browser"] +- , preEscapeIgnoreBalanced = "'\"" +- , preEscapeIgnoreLine = "//" +- , wrapInsertion = Just WrapInsertion { +- wrapInsertionIndent = Just " " +- , wrapInsertionStartBegin = "(\\" +- , wrapInsertionSeparator = " " +- , wrapInsertionStartClose = " ->\n" +- , wrapInsertionEnd = ")" +- , wrapInsertionAddParens = True +- } +- } +- } +- +--- | Read inline, quasiquoted Roy. +-roy :: QuasiQuoter +-roy = QuasiQuoter { quoteExp = \s -> do +- rs <- roySettings +- quoteExp (shakespeare rs) s +- } +- +--- | Read in a Roy template file. This function reads the file once, at +--- compile time. +-royFile :: FilePath -> Q Exp +-royFile fp = do +- rs <- roySettings +- shakespeareFile rs fp +- +--- | Read in a Roy template file. This impure function uses +--- unsafePerformIO to re-read the file on every call, allowing for rapid +--- iteration. +-royFileReload :: FilePath -> Q Exp +-royFileReload fp = do +- rs <- roySettings +- shakespeareFileReload rs fp +diff --git a/Text/Shakespeare.hs b/Text/Shakespeare.hs +index 67d7dde..a510215 100644 +--- a/Text/Shakespeare.hs ++++ b/Text/Shakespeare.hs +@@ -15,12 +15,12 @@ module Text.Shakespeare + , WrapInsertion (..) + , PreConversion (..) + , defaultShakespeareSettings +- , shakespeare +- , shakespeareFile +- , shakespeareFileReload ++ -- , shakespeare ++ -- , shakespeareFile ++ -- , shakespeareFileReload + -- * low-level +- , shakespeareFromString +- , shakespeareUsedIdentifiers ++ -- , shakespeareFromString ++ -- , shakespeareUsedIdentifiers + , RenderUrl + , VarType (..) + , Deref +@@ -153,38 +153,6 @@ defaultShakespeareSettings = ShakespeareSettings { + , modifyFinalValue = Nothing + } + +-instance Lift PreConvert where +- lift (PreConvert convert ignore comment wrapInsertion) = +- [|PreConvert $(lift convert) $(lift ignore) $(lift comment) $(lift wrapInsertion)|] +- +-instance Lift WrapInsertion where +- lift (WrapInsertion indent sb sep sc e wp) = +- [|WrapInsertion $(lift indent) $(lift sb) $(lift sep) $(lift sc) $(lift e) $(lift wp)|] +- +-instance Lift PreConversion where +- lift (ReadProcess command args) = +- [|ReadProcess $(lift command) $(lift args)|] +- lift Id = [|Id|] +- +-instance Lift ShakespeareSettings where +- lift (ShakespeareSettings x1 x2 x3 x4 x5 x6 x7 x8 x9) = +- [|ShakespeareSettings +- $(lift x1) $(lift x2) $(lift x3) +- $(liftExp x4) $(liftExp x5) $(liftExp x6) $(lift x7) $(lift x8) $(liftMExp x9)|] +- where +- liftExp (VarE n) = [|VarE $(liftName n)|] +- liftExp (ConE n) = [|ConE $(liftName n)|] +- liftExp _ = error "liftExp only supports VarE and ConE" +- liftMExp Nothing = [|Nothing|] +- liftMExp (Just e) = [|Just|] `appE` liftExp e +- liftName (Name (OccName a) b) = [|Name (OccName $(lift a)) $(liftFlavour b)|] +- liftFlavour NameS = [|NameS|] +- liftFlavour (NameQ (ModName a)) = [|NameQ (ModName $(lift a))|] +- liftFlavour (NameU _) = error "liftFlavour NameU" -- [|NameU $(lift $ fromIntegral a)|] +- liftFlavour (NameL _) = error "liftFlavour NameL" -- [|NameU $(lift $ fromIntegral a)|] +- liftFlavour (NameG ns (PkgName p) (ModName m)) = [|NameG $(liftNS ns) (PkgName $(lift p)) (ModName $(lift m))|] +- liftNS VarName = [|VarName|] +- liftNS DataName = [|DataName|] + + type QueryParameters = [(TS.Text, TS.Text)] + type RenderUrl url = (url -> QueryParameters -> TS.Text) +@@ -348,6 +316,7 @@ pack' = TS.pack + {-# NOINLINE pack' #-} + #endif + ++{- + contentsToShakespeare :: ShakespeareSettings -> [Content] -> Q Exp + contentsToShakespeare rs a = do + r <- newName "_render" +@@ -399,16 +368,19 @@ shakespeareFile r fp = + qAddDependentFile fp >> + #endif + readFileQ fp >>= shakespeareFromString r ++-} + + data VarType = VTPlain | VTUrl | VTUrlParam | VTMixin + deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic) + ++{- + getVars :: Content -> [(Deref, VarType)] + getVars ContentRaw{} = [] + getVars (ContentVar d) = [(d, VTPlain)] + getVars (ContentUrl d) = [(d, VTUrl)] + getVars (ContentUrlParam d) = [(d, VTUrlParam)] + getVars (ContentMix d) = [(d, VTMixin)] ++-} + + data VarExp url = EPlain Builder + | EUrl url +@@ -417,8 +389,10 @@ data VarExp url = EPlain Builder + + -- | Determine which identifiers are used by the given template, useful for + -- creating systems like yesod devel. ++{- + shakespeareUsedIdentifiers :: ShakespeareSettings -> String -> [(Deref, VarType)] + shakespeareUsedIdentifiers settings = concatMap getVars . contentFromString settings ++-} + + type MTime = UTCTime + +@@ -435,28 +409,6 @@ insertReloadMap :: FilePath -> (MTime, [Content]) -> IO [Content] + insertReloadMap fp (mt, content) = atomicModifyIORef reloadMapRef + (\reloadMap -> (M.insert fp (mt, content) reloadMap, content)) + +-shakespeareFileReload :: ShakespeareSettings -> FilePath -> Q Exp +-shakespeareFileReload settings fp = do +- str <- readFileQ fp +- s <- qRunIO $ preFilter (Just fp) settings str +- let b = shakespeareUsedIdentifiers settings s +- c <- mapM vtToExp b +- rt <- [|shakespeareRuntime settings fp|] +- wrap' <- [|\x -> $(return $ wrap settings) . x|] +- return $ wrap' `AppE` (rt `AppE` ListE c) +- where +- vtToExp :: (Deref, VarType) -> Q Exp +- vtToExp (d, vt) = do +- d' <- lift d +- c' <- c vt +- return $ TupE [d', c' `AppE` derefToExp [] d] +- where +- c :: VarType -> Q Exp +- c VTPlain = [|EPlain . $(return $ +- InfixE (Just $ unwrap settings) (VarE '(.)) (Just $ toBuilder settings))|] +- c VTUrl = [|EUrl|] +- c VTUrlParam = [|EUrlParam|] +- c VTMixin = [|\x -> EMixin $ \r -> $(return $ unwrap settings) $ x r|] + + + +diff --git a/Text/Shakespeare/Base.hs b/Text/Shakespeare/Base.hs +index a0e983c..23b4692 100644 +--- a/Text/Shakespeare/Base.hs ++++ b/Text/Shakespeare/Base.hs +@@ -52,34 +52,6 @@ data Deref = DerefModulesIdent [String] Ident + | DerefTuple [Deref] + deriving (Show, Eq, Read, Data, Typeable, Ord) + +-instance Lift Ident where +- lift (Ident s) = [|Ident|] `appE` lift s +-instance Lift Deref where +- lift (DerefModulesIdent v s) = do +- dl <- [|DerefModulesIdent|] +- v' <- lift v +- s' <- lift s +- return $ dl `AppE` v' `AppE` s' +- lift (DerefIdent s) = do +- dl <- [|DerefIdent|] +- s' <- lift s +- return $ dl `AppE` s' +- lift (DerefBranch x y) = do +- x' <- lift x +- y' <- lift y +- db <- [|DerefBranch|] +- return $ db `AppE` x' `AppE` y' +- lift (DerefIntegral i) = [|DerefIntegral|] `appE` lift i +- lift (DerefRational r) = do +- n <- lift $ numerator r +- d <- lift $ denominator r +- per <- [|(%) :: Int -> Int -> Ratio Int|] +- dr <- [|DerefRational|] +- return $ dr `AppE` InfixE (Just n) per (Just d) +- lift (DerefString s) = [|DerefString|] `appE` lift s +- lift (DerefList x) = [|DerefList $(lift x)|] +- lift (DerefTuple x) = [|DerefTuple $(lift x)|] +- + derefParens, derefCurlyBrackets :: UserParser a Deref + derefParens = between (char '(') (char ')') parseDeref + derefCurlyBrackets = between (char '{') (char '}') parseDeref +diff --git a/Text/Shakespeare/I18N.hs b/Text/Shakespeare/I18N.hs +index a39a614..753cba7 100644 +--- a/Text/Shakespeare/I18N.hs ++++ b/Text/Shakespeare/I18N.hs +@@ -52,10 +52,10 @@ + -- + -- You can also adapt those instructions for use with other systems. + module Text.Shakespeare.I18N +- ( mkMessage +- , mkMessageFor +- , mkMessageVariant +- , RenderMessage (..) ++ --( mkMessage ++ --, mkMessageFor ++ ---, mkMessageVariant ++ ( RenderMessage (..) + , ToMessage (..) + , SomeMessage (..) + , Lang +@@ -106,143 +106,6 @@ instance RenderMessage master Text where + -- | an RFC1766 / ISO 639-1 language code (eg, @fr@, @en-GB@, etc). + type Lang = Text + +--- |generate translations from translation files +--- +--- This function will: +--- +--- 1. look in the supplied subdirectory for files ending in @.msg@ +--- +--- 2. generate a type based on the constructors found +--- +--- 3. create a 'RenderMessage' instance +--- +-mkMessage :: String -- ^ base name to use for translation type +- -> FilePath -- ^ subdirectory which contains the translation files +- -> Lang -- ^ default translation language +- -> Q [Dec] +-mkMessage dt folder lang = +- mkMessageCommon True "Msg" "Message" dt dt folder lang +- +- +--- | create 'RenderMessage' instance for an existing data-type +-mkMessageFor :: String -- ^ master translation data type +- -> String -- ^ existing type to add translations for +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default language +- -> Q [Dec] +-mkMessageFor master dt folder lang = mkMessageCommon False "" "" master dt folder lang +- +--- | create an additional set of translations for a type created by `mkMessage` +-mkMessageVariant :: String -- ^ master translation data type +- -> String -- ^ existing type to add translations for +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default language +- -> Q [Dec] +-mkMessageVariant master dt folder lang = mkMessageCommon False "Msg" "Message" master dt folder lang +- +--- |used by 'mkMessage' and 'mkMessageFor' to generate a 'RenderMessage' and possibly a message data type +-mkMessageCommon :: Bool -- ^ generate a new datatype from the constructors found in the .msg files +- -> String -- ^ string to append to constructor names +- -> String -- ^ string to append to datatype name +- -> String -- ^ base name of master datatype +- -> String -- ^ base name of translation datatype +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default lang +- -> Q [Dec] +-mkMessageCommon genType prefix postfix master dt folder lang = do +- files <- qRunIO $ getDirectoryContents folder +- (_files', contents) <- qRunIO $ fmap (unzip . catMaybes) $ mapM (loadLang folder) files +-#ifdef GHC_7_4 +- mapM_ qAddDependentFile _files' +-#endif +- sdef <- +- case lookup lang contents of +- Nothing -> error $ "Did not find main language file: " ++ unpack lang +- Just def -> toSDefs def +- mapM_ (checkDef sdef) $ map snd contents +- let mname = mkName $ dt ++ postfix +- c1 <- fmap concat $ mapM (toClauses prefix dt) contents +- c2 <- mapM (sToClause prefix dt) sdef +- c3 <- defClause +- return $ +- ( if genType +- then ((DataD [] mname [] (map (toCon dt) sdef) []) :) +- else id) +- [ InstanceD +- [] +- (ConT ''RenderMessage `AppT` (ConT $ mkName master) `AppT` ConT mname) +- [ FunD (mkName "renderMessage") $ c1 ++ c2 ++ [c3] +- ] +- ] +- +-toClauses :: String -> String -> (Lang, [Def]) -> Q [Clause] +-toClauses prefix dt (lang, defs) = +- mapM go defs +- where +- go def = do +- a <- newName "lang" +- (pat, bod) <- mkBody dt (prefix ++ constr def) (map fst $ vars def) (content def) +- guard <- fmap NormalG [|$(return $ VarE a) == pack $(lift $ unpack lang)|] +- return $ Clause +- [WildP, ConP (mkName ":") [VarP a, WildP], pat] +- (GuardedB [(guard, bod)]) +- [] +- +-mkBody :: String -- ^ datatype +- -> String -- ^ constructor +- -> [String] -- ^ variable names +- -> [Content] +- -> Q (Pat, Exp) +-mkBody dt cs vs ct = do +- vp <- mapM go vs +- let pat = RecP (mkName cs) (map (varName dt *** VarP) vp) +- let ct' = map (fixVars vp) ct +- pack' <- [|Data.Text.pack|] +- tomsg <- [|toMessage|] +- let ct'' = map (toH pack' tomsg) ct' +- mapp <- [|mappend|] +- let app a b = InfixE (Just a) mapp (Just b) +- e <- +- case ct'' of +- [] -> [|mempty|] +- [x] -> return x +- (x:xs) -> return $ foldl' app x xs +- return (pat, e) +- where +- toH pack' _ (Raw s) = pack' `AppE` SigE (LitE (StringL s)) (ConT ''String) +- toH _ tomsg (Var d) = tomsg `AppE` derefToExp [] d +- go x = do +- let y = mkName $ '_' : x +- return (x, y) +- fixVars vp (Var d) = Var $ fixDeref vp d +- fixVars _ (Raw s) = Raw s +- fixDeref vp (DerefIdent (Ident i)) = DerefIdent $ Ident $ fixIdent vp i +- fixDeref vp (DerefBranch a b) = DerefBranch (fixDeref vp a) (fixDeref vp b) +- fixDeref _ d = d +- fixIdent vp i = +- case lookup i vp of +- Nothing -> i +- Just y -> nameBase y +- +-sToClause :: String -> String -> SDef -> Q Clause +-sToClause prefix dt sdef = do +- (pat, bod) <- mkBody dt (prefix ++ sconstr sdef) (map fst $ svars sdef) (scontent sdef) +- return $ Clause +- [WildP, ConP (mkName "[]") [], pat] +- (NormalB bod) +- [] +- +-defClause :: Q Clause +-defClause = do +- a <- newName "sub" +- c <- newName "langs" +- d <- newName "msg" +- rm <- [|renderMessage|] +- return $ Clause +- [VarP a, ConP (mkName ":") [WildP, VarP c], VarP d] +- (NormalB $ rm `AppE` VarE a `AppE` VarE c `AppE` VarE d) +- [] +- + toCon :: String -> SDef -> Con + toCon dt (SDef c vs _) = + RecC (mkName $ "Msg" ++ c) $ map go vs +@@ -258,39 +121,6 @@ varName a y = + upper (x:xs) = toUpper x : xs + upper [] = [] + +-checkDef :: [SDef] -> [Def] -> Q () +-checkDef x y = +- go (sortBy (comparing sconstr) x) (sortBy (comparing constr) y) +- where +- go _ [] = return () +- go [] (b:_) = error $ "Extra message constructor: " ++ constr b +- go (a:as) (b:bs) +- | sconstr a < constr b = go as (b:bs) +- | sconstr a > constr b = error $ "Extra message constructor: " ++ constr b +- | otherwise = do +- go' (svars a) (vars b) +- go as bs +- go' ((an, at):as) ((bn, mbt):bs) +- | an /= bn = error "Mismatched variable names" +- | otherwise = +- case mbt of +- Nothing -> go' as bs +- Just bt +- | at == bt -> go' as bs +- | otherwise -> error "Mismatched variable types" +- go' [] [] = return () +- go' _ _ = error "Mistmached variable count" +- +-toSDefs :: [Def] -> Q [SDef] +-toSDefs = mapM toSDef +- +-toSDef :: Def -> Q SDef +-toSDef d = do +- vars' <- mapM go $ vars d +- return $ SDef (constr d) vars' (content d) +- where +- go (a, Just b) = return (a, b) +- go (a, Nothing) = error $ "Main language missing type for " ++ show (constr d, a) + + data SDef = SDef + { sconstr :: String +diff --git a/Text/Shakespeare/Text.hs b/Text/Shakespeare/Text.hs +index 6865a5a..e25a8be 100644 +--- a/Text/Shakespeare/Text.hs ++++ b/Text/Shakespeare/Text.hs +@@ -7,18 +7,18 @@ module Text.Shakespeare.Text + ( TextUrl + , ToText (..) + , renderTextUrl +- , stext +- , text +- , textFile +- , textFileDebug +- , textFileReload +- , st -- | strict text +- , lt -- | lazy text, same as stext :) ++ --, stext ++ --, text ++ --, textFile ++ --, textFileDebug ++ --, textFileReload ++ --, st -- | strict text ++ --, lt -- | lazy text, same as stext :) + -- * Yesod code generation +- , codegen +- , codegenSt +- , codegenFile +- , codegenFileReload ++ --, codegen ++ --, codegenSt ++ --, codegenFile ++ --, codegenFileReload + ) where + + import Language.Haskell.TH.Quote (QuasiQuoter (..)) +@@ -45,106 +45,3 @@ instance ToText Int32 where toText = toText . show + instance ToText Int64 where toText = toText . show + instance ToText Int where toText = toText . show + +-settings :: Q ShakespeareSettings +-settings = do +- toTExp <- [|toText|] +- wrapExp <- [|id|] +- unWrapExp <- [|id|] +- return $ defaultShakespeareSettings { toBuilder = toTExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- } +- +- +-stext, lt, st, text :: QuasiQuoter +-stext = +- QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- render <- [|toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +-lt = stext +- +-st = +- QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +-text = QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- quoteExp (shakespeare rs) $ filter (/='\r') s +- } +- +- +-textFile :: FilePath -> Q Exp +-textFile fp = do +- rs <- settings +- shakespeareFile rs fp +- +- +-textFileDebug :: FilePath -> Q Exp +-textFileDebug = textFileReload +-{-# DEPRECATED textFileDebug "Please use textFileReload instead" #-} +- +-textFileReload :: FilePath -> Q Exp +-textFileReload fp = do +- rs <- settings +- shakespeareFileReload rs fp +- +--- | codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +-codegenSettings :: Q ShakespeareSettings +-codegenSettings = do +- toTExp <- [|toText|] +- wrapExp <- [|id|] +- unWrapExp <- [|id|] +- return $ defaultShakespeareSettings { toBuilder = toTExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- , varChar = '~' +- , urlChar = '*' +- , intChar = '&' +- , justVarInterpolation = True -- always! +- } +- +--- | codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +--- You can use the normal text quasiquoters to generate code +-codegen :: QuasiQuoter +-codegen = +- QuasiQuoter { quoteExp = \s -> do +- rs <- codegenSettings +- render <- [|toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +--- | Generates strict Text +--- codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +-codegenSt :: QuasiQuoter +-codegenSt = +- QuasiQuoter { quoteExp = \s -> do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +-codegenFileReload :: FilePath -> Q Exp +-codegenFileReload fp = do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFileReload rs{ justVarInterpolation = True } fp +- return (render `AppE` rendered) +- +-codegenFile :: FilePath -> Q Exp +-codegenFile fp = do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFile rs{ justVarInterpolation = True } fp +- return (render `AppE` rendered) +diff --git a/shakespeare.cabal b/shakespeare.cabal +index 05b985e..dd8762a 100644 +--- a/shakespeare.cabal ++++ b/shakespeare.cabal +@@ -61,10 +61,9 @@ library + Text.Lucius + Text.Cassius + Text.Shakespeare.Base ++ Text.Css + Text.Shakespeare +- Text.TypeScript + other-modules: Text.Hamlet.Parse +- Text.Css + Text.MkSizeType + Text.IndentToBrace + Text.CssCommon +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch b/standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch new file mode 100644 index 000000000..7333742b0 --- /dev/null +++ b/standalone/no-th/haskell-patches/skein_hardcode_little-endian.patch @@ -0,0 +1,26 @@ +From 3a04b41ffce4e4e87b0fedd3a1e3434a3f06cc76 Mon Sep 17 00:00:00 2001 +From: foo +Date: Sun, 22 Sep 2013 00:18:12 +0000 +Subject: [PATCH] hardcode little endian + +This is the same as building with a cabal flag. + +--- + c_impl/optimized/skein_port.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/c_impl/optimized/skein_port.h b/c_impl/optimized/skein_port.h +index a2d0fc2..6929bb0 100644 +--- a/c_impl/optimized/skein_port.h ++++ b/c_impl/optimized/skein_port.h +@@ -45,6 +45,7 @@ typedef uint64_t u64b_t; /* 64-bit unsigned integer */ + * platform-specific code instead (e.g., for big-endian CPUs). + * + */ ++#define SKEIN_NEED_SWAP (0) + #ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */ + + #include "brg_endian.h" /* get endianness selection */ +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch b/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch new file mode 100644 index 000000000..4d39e91cf --- /dev/null +++ b/standalone/no-th/haskell-patches/vector_hack-to-build-with-new-ghc.patch @@ -0,0 +1,24 @@ +From b0a79f4f98188ba5d43b7e3912b36d34d099ab65 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 23:20:35 +0000 +Subject: [PATCH] cross build + +--- + Data/Vector/Fusion/Stream/Monadic.hs | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/Data/Vector/Fusion/Stream/Monadic.hs b/Data/Vector/Fusion/Stream/Monadic.hs +index 51fec75..b089b3d 100644 +--- a/Data/Vector/Fusion/Stream/Monadic.hs ++++ b/Data/Vector/Fusion/Stream/Monadic.hs +@@ -101,7 +101,6 @@ import GHC.Exts ( SpecConstrAnnotation(..) ) + + data SPEC = SPEC | SPEC2 + #if __GLASGOW_HASKELL__ >= 700 +-{-# ANN type SPEC ForceSpecConstr #-} + #endif + + emptyStream :: String +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch new file mode 100644 index 000000000..93314312f --- /dev/null +++ b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch @@ -0,0 +1,82 @@ +From 3aef808eee43c973ae1fbf6e8769d89b7f0d355b Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 10 Jun 2014 14:47:42 +0000 +Subject: [PATCH] deal with TH + +Export modules referenced by it. + +Should not need these icons in git-annex, so not worth using the Evil +Splicer. +--- + Network/Wai/Application/Static.hs | 4 ---- + WaiAppStatic/Storage/Embedded.hs | 8 ++++---- + wai-app-static.cabal | 4 +--- + 3 files changed, 5 insertions(+), 11 deletions(-) + +diff --git a/Network/Wai/Application/Static.hs b/Network/Wai/Application/Static.hs +index db2b835..b2c1aec 100644 +--- a/Network/Wai/Application/Static.hs ++++ b/Network/Wai/Application/Static.hs +@@ -33,8 +33,6 @@ import Control.Monad.IO.Class (liftIO) + + import Blaze.ByteString.Builder (toByteString) + +-import Data.FileEmbed (embedFile) +- + import Data.Text (Text) + import qualified Data.Text as T + +@@ -198,8 +196,6 @@ staticAppPieces _ _ req sendResponse + H.status405 + [("Content-Type", "text/plain")] + "Only GET is supported" +-staticAppPieces _ [".hidden", "folder.png"] _ sendResponse = sendResponse $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/folder.png")] +-staticAppPieces _ [".hidden", "haskell.png"] _ sendResponse = sendResponse $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/haskell.png")] + staticAppPieces ss rawPieces req sendResponse = liftIO $ do + case toPieces rawPieces of + Just pieces -> checkPieces ss pieces req >>= response +diff --git a/WaiAppStatic/Storage/Embedded.hs b/WaiAppStatic/Storage/Embedded.hs +index daa6e50..9873d4e 100644 +--- a/WaiAppStatic/Storage/Embedded.hs ++++ b/WaiAppStatic/Storage/Embedded.hs +@@ -3,10 +3,10 @@ module WaiAppStatic.Storage.Embedded( + embeddedSettings + + -- * Template Haskell +- , Etag +- , EmbeddableEntry(..) +- , mkSettings ++ --, Etag ++ --, EmbeddableEntry(..) ++ --, mkSettings + ) where + + import WaiAppStatic.Storage.Embedded.Runtime +-import WaiAppStatic.Storage.Embedded.TH ++--import WaiAppStatic.Storage.Embedded.TH +diff --git a/wai-app-static.cabal b/wai-app-static.cabal +index ef6f898..9a59d71 100644 +--- a/wai-app-static.cabal ++++ b/wai-app-static.cabal +@@ -33,7 +33,6 @@ library + , containers >= 0.2 + , time >= 1.1.4 + , old-locale >= 1.0.0.2 +- , file-embed >= 0.0.3.1 + , text >= 0.7 + , blaze-builder >= 0.2.1.4 + , base64-bytestring >= 0.1 +@@ -61,9 +60,8 @@ library + WaiAppStatic.Listing + WaiAppStatic.Types + WaiAppStatic.CmdLine +- other-modules: Util + WaiAppStatic.Storage.Embedded.Runtime +- WaiAppStatic.Storage.Embedded.TH ++ other-modules: Util + ghc-options: -Wall + extensions: CPP + +-- +2.0.0 + diff --git a/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch new file mode 100644 index 000000000..b6334d31f --- /dev/null +++ b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch @@ -0,0 +1,108 @@ +From b53713fbb4f3bb6bdd25b07afcaed4940b32dfa8 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 18 Dec 2013 03:32:44 +0000 +Subject: [PATCH] remove TH + +--- + Text/Hamlet/XML.hs | 81 +----------------------------------------------------- + 1 file changed, 1 insertion(+), 80 deletions(-) + +diff --git a/Text/Hamlet/XML.hs b/Text/Hamlet/XML.hs +index f587410..4e830bd 100644 +--- a/Text/Hamlet/XML.hs ++++ b/Text/Hamlet/XML.hs +@@ -1,9 +1,7 @@ + {-# LANGUAGE TemplateHaskell #-} + {-# OPTIONS_GHC -fno-warn-missing-fields #-} + module Text.Hamlet.XML +- ( xml +- , xmlFile +- ) where ++ () where + + import Language.Haskell.TH.Syntax + import Language.Haskell.TH.Quote +@@ -19,80 +17,3 @@ import qualified Data.Foldable as F + import Data.Maybe (fromMaybe) + import qualified Data.Map as Map + +-xml :: QuasiQuoter +-xml = QuasiQuoter { quoteExp = strToExp } +- +-xmlFile :: FilePath -> Q Exp +-xmlFile = strToExp . TL.unpack <=< qRunIO . readUtf8File +- +-strToExp :: String -> Q Exp +-strToExp s = +- case parseDoc s of +- Error e -> error e +- Ok x -> docsToExp [] x +- +-docsToExp :: Scope -> [Doc] -> Q Exp +-docsToExp scope docs = [| concat $(fmap ListE $ mapM (docToExp scope) docs) |] +- +-docToExp :: Scope -> Doc -> Q Exp +-docToExp scope (DocTag name attrs cs) = +- [| [ X.NodeElement (X.Element ($(liftName name)) $(mkAttrs scope attrs) $(docsToExp scope cs)) +- ] |] +-docToExp _ (DocContent (ContentRaw s)) = [| [ X.NodeContent (pack $(lift s)) ] |] +-docToExp scope (DocContent (ContentVar d)) = [| [ X.NodeContent $(return $ derefToExp scope d) ] |] +-docToExp scope (DocContent (ContentEmbed d)) = return $ derefToExp scope d +-docToExp scope (DocForall deref ident@(Ident ident') inside) = do +- let list' = derefToExp scope deref +- name <- newName ident' +- let scope' = (ident, VarE name) : scope +- inside' <- docsToExp scope' inside +- let lam = LamE [VarP name] inside' +- [| F.concatMap $(return lam) $(return list') |] +-docToExp scope (DocWith [] inside) = docsToExp scope inside +-docToExp scope (DocWith ((deref, ident@(Ident name)):dis) inside) = do +- let deref' = derefToExp scope deref +- name' <- newName name +- let scope' = (ident, VarE name') : scope +- inside' <- docToExp scope' (DocWith dis inside) +- let lam = LamE [VarP name'] inside' +- return $ lam `AppE` deref' +-docToExp scope (DocMaybe deref ident@(Ident name) just nothing) = do +- let deref' = derefToExp scope deref +- name' <- newName name +- let scope' = (ident, VarE name') : scope +- inside' <- docsToExp scope' just +- let inside'' = LamE [VarP name'] inside' +- nothing' <- +- case nothing of +- Nothing -> [| [] |] +- Just n -> docsToExp scope n +- [| maybe $(return nothing') $(return inside'') $(return deref') |] +-docToExp scope (DocCond conds final) = do +- unit <- [| () |] +- body <- fmap GuardedB $ mapM go $ conds ++ [(DerefIdent $ Ident "otherwise", fromMaybe [] final)] +- return $ CaseE unit [Match (TupP []) body []] +- where +- go (deref, inside) = do +- inside' <- docsToExp scope inside +- return (NormalG $ derefToExp scope deref, inside') +- +-mkAttrs :: Scope -> [(Maybe Deref, String, [Content])] -> Q Exp +-mkAttrs _ [] = [| Map.empty |] +-mkAttrs scope ((mderef, name, value):rest) = do +- rest' <- mkAttrs scope rest +- this <- [| Map.insert $(liftName name) (T.concat $(fmap ListE $ mapM go value)) |] +- let with = [| $(return this) $(return rest') |] +- case mderef of +- Nothing -> with +- Just deref -> [| if $(return $ derefToExp scope deref) then $(with) else $(return rest') |] +- where +- go (ContentRaw s) = [| pack $(lift s) |] +- go (ContentVar d) = return $ derefToExp scope d +- go ContentEmbed{} = error "Cannot use embed interpolation in attribute value" +- +-liftName :: String -> Q Exp +-liftName s = do +- X.Name local mns _ <- return $ fromString s +- case mns of +- Nothing -> [| X.Name (pack $(lift $ unpack local)) Nothing Nothing |] +- Just ns -> [| X.Name (pack $(lift $ unpack local)) (Just $ pack $(lift $ unpack ns)) Nothing |] +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch b/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch new file mode 100644 index 000000000..3e0d0d9ba --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch @@ -0,0 +1,34 @@ +From 583575461dc58b76c6c7e14d429f73182d49ef81 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 10 Jun 2014 20:29:51 +0000 +Subject: [PATCH] don't really build + +--- + yesod-auth.cabal | 11 ----------- + 1 file changed, 11 deletions(-) + +diff --git a/yesod-auth.cabal b/yesod-auth.cabal +index 906c08b..b4bc841 100644 +--- a/yesod-auth.cabal ++++ b/yesod-auth.cabal +@@ -65,17 +65,6 @@ library + , conduit-extra + , attoparsec-conduit + +- exposed-modules: Yesod.Auth +- Yesod.Auth.BrowserId +- Yesod.Auth.Dummy +- Yesod.Auth.Email +- Yesod.Auth.OpenId +- Yesod.Auth.Rpxnow +- Yesod.Auth.Message +- Yesod.Auth.GoogleEmail +- Yesod.Auth.GoogleEmail2 +- other-modules: Yesod.Auth.Routes +- Yesod.PasswordStore + ghc-options: -Wall + + source-repository head +-- +2.0.0 + diff --git a/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch new file mode 100644 index 000000000..07663ac80 --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch @@ -0,0 +1,771 @@ +From 9feb37d13dc8449dc4445db83485780caee4b7ff Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 10 Jun 2014 17:44:52 +0000 +Subject: [PATCH] expand and remove TH + +--- + Yesod/Core.hs | 30 +++--- + Yesod/Core/Class/Yesod.hs | 257 ++++++++++++++++++++++++++++++--------------- + Yesod/Core/Dispatch.hs | 38 ++----- + Yesod/Core/Handler.hs | 25 ++--- + Yesod/Core/Internal/Run.hs | 8 +- + Yesod/Core/Internal/TH.hs | 111 -------------------- + Yesod/Core/Types.hs | 3 +- + Yesod/Core/Widget.hs | 32 +----- + 8 files changed, 215 insertions(+), 289 deletions(-) + +diff --git a/Yesod/Core.hs b/Yesod/Core.hs +index 9b29317..7c0792d 100644 +--- a/Yesod/Core.hs ++++ b/Yesod/Core.hs +@@ -31,16 +31,16 @@ module Yesod.Core + , unauthorizedI + -- * Logging + , LogLevel (..) +- , logDebug +- , logInfo +- , logWarn +- , logError +- , logOther +- , logDebugS +- , logInfoS +- , logWarnS +- , logErrorS +- , logOtherS ++ --, logDebug ++ --, logInfo ++ --, logWarn ++ --, logError ++ --, logOther ++ --, logDebugS ++ --, logInfoS ++ --, logWarnS ++ --, logErrorS ++ --, logOtherS + -- * Sessions + , SessionBackend (..) + , customizeSessionCookies +@@ -87,17 +87,15 @@ module Yesod.Core + , readIntegral + -- * Shakespeare + -- ** Hamlet +- , hamlet +- , shamlet +- , xhamlet ++ --, hamlet ++ -- , shamlet ++ --, xhamlet + , HtmlUrl + -- ** Julius +- , julius ++ --, julius + , JavascriptUrl + , renderJavascriptUrl + -- ** Cassius/Lucius +- , cassius +- , lucius + , CssUrl + , renderCssUrl + ) where +diff --git a/Yesod/Core/Class/Yesod.hs b/Yesod/Core/Class/Yesod.hs +index 140600b..75daabc 100644 +--- a/Yesod/Core/Class/Yesod.hs ++++ b/Yesod/Core/Class/Yesod.hs +@@ -5,18 +5,22 @@ + {-# LANGUAGE CPP #-} + module Yesod.Core.Class.Yesod where + +-import Control.Monad.Logger (logErrorS) ++--import Control.Monad.Logger (logErrorS) + import Yesod.Core.Content + import Yesod.Core.Handler + + import Yesod.Routes.Class ++import qualified Text.Blaze.Internal ++import qualified Control.Monad.Logger ++import qualified Text.Hamlet ++import qualified Data.Foldable + + import Blaze.ByteString.Builder (Builder) + import Blaze.ByteString.Builder.Char.Utf8 (fromText) + import Control.Arrow ((***), second) + import Control.Monad (forM, when, void) + import Control.Monad.IO.Class (MonadIO (liftIO)) +-import Control.Monad.Logger (LogLevel (LevelInfo, LevelOther), ++import Control.Monad.Logger (Loc, LogLevel (LevelInfo, LevelOther), + LogSource) + import qualified Data.ByteString.Char8 as S8 + import qualified Data.ByteString.Lazy as L +@@ -33,7 +37,6 @@ import qualified Data.Text.Encoding.Error as TEE + import Data.Text.Lazy.Builder (toLazyText) + import Data.Text.Lazy.Encoding (encodeUtf8) + import Data.Word (Word64) +-import Language.Haskell.TH.Syntax (Loc (..)) + import Network.HTTP.Types (encodePath) + import qualified Network.Wai as W + import Data.Default (def) +@@ -94,18 +97,27 @@ class RenderRoute site => Yesod site where + defaultLayout w = do + p <- widgetToPageContent w + mmsg <- getMessage +- giveUrlRenderer [hamlet| +- $newline never +- $doctype 5 +- +- +- #{pageTitle p} +- ^{pageHead p} +- <body> +- $maybe msg <- mmsg +- <p .message>#{msg} +- ^{pageBody p} +- |] ++ giveUrlRenderer $ \ _render_aHra ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "<!DOCTYPE html>\n<html><head><title>"); ++ id (TBH.toHtml (pageTitle p)); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) ""); ++ Text.Hamlet.asHtmlUrl (pageHead p) _render_aHra; ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) ""); ++ Text.Hamlet.maybeH ++ mmsg ++ (\ msg_aHrb ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

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

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

Not Found +-

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

Not Found

\n

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

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

Not logged in +-

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

Not logged in

\n

Set the authRoute and the user will be redirected there.

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

Permission denied +-

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

Permission denied

\n

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

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

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

    Invalid Arguments

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

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

    Internal Server Error

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

    Method Not Supported +-

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

    Method Not Supported

    \n

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

    ") } + provideRep $ return $ object ["message" .= ("Bad method" :: Text), "method" .= TE.decodeUtf8With TEE.lenientDecode m] + + asyncHelper :: (url -> [x] -> Text) +@@ -682,8 +771,4 @@ loadClientSession key getCachedDate sessionName req = load + -- turn the TH Loc loaction information into a human readable string + -- leaving out the loc_end parameter + fileLocationToString :: Loc -> String +-fileLocationToString loc = (loc_package loc) ++ ':' : (loc_module loc) ++ +- ' ' : (loc_filename loc) ++ ':' : (line loc) ++ ':' : (char loc) +- where +- line = show . fst . loc_start +- char = show . snd . loc_start ++fileLocationToString loc = "unknown" +diff --git a/Yesod/Core/Dispatch.hs b/Yesod/Core/Dispatch.hs +index e0d1f0e..cc23fdd 100644 +--- a/Yesod/Core/Dispatch.hs ++++ b/Yesod/Core/Dispatch.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE TemplateHaskell #-} + {-# LANGUAGE OverloadedStrings #-} + {-# LANGUAGE TypeFamilies #-} + {-# LANGUAGE FlexibleInstances #-} +@@ -6,18 +5,18 @@ + {-# LANGUAGE CPP #-} + module Yesod.Core.Dispatch + ( -- * Quasi-quoted routing +- parseRoutes +- , parseRoutesNoCheck +- , parseRoutesFile +- , parseRoutesFileNoCheck +- , mkYesod ++ -- parseRoutes ++ --, parseRoutesNoCheck ++ --, parseRoutesFile ++ --, parseRoutesFileNoCheck ++ --, mkYesod + -- ** More fine-grained +- , mkYesodData +- , mkYesodSubData +- , mkYesodDispatch +- , mkYesodSubDispatch ++ --, mkYesodData ++ --, mkYesodSubData ++ --, mkYesodDispatch ++ --, mkYesodSubDispatch + -- ** Path pieces +- , PathPiece (..) ++ PathPiece (..) + , PathMultiPiece (..) + , Texts + -- * Convert to WAI +@@ -135,13 +134,6 @@ toWaiAppLogger logger site = do + , yreSite = site + , yreSessionBackend = sb + } +- messageLoggerSource +- site +- logger +- $(qLocation >>= liftLoc) +- "yesod-core" +- LevelInfo +- (toLogStr ("Application launched" :: S.ByteString)) + middleware <- mkDefaultMiddlewares logger + return $ middleware $ toWaiAppYre yre + +@@ -170,14 +162,7 @@ warp port site = do + ] + -} + , Network.Wai.Handler.Warp.settingsOnException = const $ \e -> +- when (shouldLog' e) $ +- messageLoggerSource +- site +- logger +- $(qLocation >>= liftLoc) +- "yesod-core" +- LevelError +- (toLogStr $ "Exception from Warp: " ++ show e) ++ when (shouldLog' e) $ error (show e) + } + where + shouldLog' = +@@ -211,7 +196,6 @@ defaultMiddlewaresNoLogging = acceptOverride . autohead . gzip def . methodOverr + -- | Deprecated synonym for 'warp'. + warpDebug :: YesodDispatch site => Int -> site -> IO () + warpDebug = warp +-{-# DEPRECATED warpDebug "Please use warp instead" #-} + + -- | Runs your application using default middlewares (i.e., via 'toWaiApp'). It + -- reads port information from the PORT environment variable, as used by tools +diff --git a/Yesod/Core/Handler.hs b/Yesod/Core/Handler.hs +index 2e5d7cb..83f93bf 100644 +--- a/Yesod/Core/Handler.hs ++++ b/Yesod/Core/Handler.hs +@@ -172,7 +172,7 @@ import Data.Text.Encoding (decodeUtf8With, encodeUtf8) + import Data.Text.Encoding.Error (lenientDecode) + import qualified Data.Text.Lazy as TL + import qualified Text.Blaze.Html.Renderer.Text as RenderText +-import Text.Hamlet (Html, HtmlUrl, hamlet) ++import Text.Hamlet (Html, HtmlUrl) + + import qualified Data.ByteString as S + import qualified Data.ByteString.Lazy as L +@@ -201,6 +201,7 @@ import Control.Exception (throwIO) + import Blaze.ByteString.Builder (Builder) + import Safe (headMay) + import Data.CaseInsensitive (CI) ++import qualified Text.Blaze.Internal + import qualified Data.Conduit.List as CL + import Control.Monad (unless) + import Control.Monad.Trans.Resource (MonadResource, InternalState, runResourceT, withInternalState, getInternalState, liftResourceT, resourceForkIO +@@ -847,19 +848,15 @@ redirectToPost :: (MonadHandler m, RedirectUrl (HandlerSite m) url) + -> m a + redirectToPost url = do + urlText <- toTextUrl url +- giveUrlRenderer [hamlet| +-$newline never +-$doctype 5 +- +- +- +- Redirecting... +- <body onload="document.getElementById('form').submit()"> +- <form id="form" method="post" action=#{urlText}> +- <noscript> +- <p>Javascript has been disabled; please click on the button below to be redirected. +- <input type="submit" value="Continue"> +-|] >>= sendResponse ++ giveUrlRenderer $ \ _render_awps ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "<!DOCTYPE html>\n<html><head><title>Redirecting...
    ") } ++ >>= sendResponse + + -- | Wraps the 'Content' generated by 'hamletToContent' in a 'RepHtml'. + hamletToRepHtml :: MonadHandler m => HtmlUrl (Route (HandlerSite m)) -> m Html +diff --git a/Yesod/Core/Internal/Run.hs b/Yesod/Core/Internal/Run.hs +index 09b4609..e1ef568 100644 +--- a/Yesod/Core/Internal/Run.hs ++++ b/Yesod/Core/Internal/Run.hs +@@ -16,8 +16,8 @@ import Control.Exception.Lifted (catch) + import Control.Monad (mplus) + import Control.Monad.IO.Class (MonadIO) + import Control.Monad.IO.Class (liftIO) +-import Control.Monad.Logger (LogLevel (LevelError), LogSource, +- liftLoc) ++import Control.Monad.Logger (Loc, LogLevel (LevelError), LogSource, ++ ) + import Control.Monad.Trans.Resource (runResourceT, withInternalState, runInternalState, createInternalState, closeInternalState) + import qualified Data.ByteString as S + import qualified Data.ByteString.Char8 as S8 +@@ -31,7 +31,7 @@ import qualified Data.Text as T + import Data.Text.Encoding (encodeUtf8) + import Data.Text.Encoding (decodeUtf8With) + import Data.Text.Encoding.Error (lenientDecode) +-import Language.Haskell.TH.Syntax (Loc, qLocation) ++import Language.Haskell.TH.Syntax (qLocation) + import qualified Network.HTTP.Types as H + import Network.Wai + #if MIN_VERSION_wai(2, 0, 0) +@@ -157,8 +157,6 @@ safeEh :: (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) + -> ErrorResponse + -> YesodApp + safeEh log' er req = do +- liftIO $ log' $(qLocation >>= liftLoc) "yesod-core" LevelError +- $ toLogStr $ "Error handler errored out: " ++ show er + return $ YRPlain + H.status500 + [] +diff --git a/Yesod/Core/Internal/TH.hs b/Yesod/Core/Internal/TH.hs +index 7e84c1c..a273c29 100644 +--- a/Yesod/Core/Internal/TH.hs ++++ b/Yesod/Core/Internal/TH.hs +@@ -23,114 +23,3 @@ import Yesod.Core.Content + import Yesod.Core.Class.Dispatch + import Yesod.Core.Internal.Run + +--- | Generates URL datatype and site function for the given 'Resource's. This +--- is used for creating sites, /not/ subsites. See 'mkYesodSub' for the latter. +--- Use 'parseRoutes' to create the 'Resource's. +-mkYesod :: String -- ^ name of the argument datatype +- -> [ResourceTree String] +- -> Q [Dec] +-mkYesod name = fmap (uncurry (++)) . mkYesodGeneral name [] False +- +--- | Sometimes, you will want to declare your routes in one file and define +--- your handlers elsewhere. For example, this is the only way to break up a +--- monolithic file into smaller parts. Use this function, paired with +--- 'mkYesodDispatch', to do just that. +-mkYesodData :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodData name res = mkYesodDataGeneral name False res +- +-mkYesodSubData :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodSubData name res = mkYesodDataGeneral name True res +- +-mkYesodDataGeneral :: String -> Bool -> [ResourceTree String] -> Q [Dec] +-mkYesodDataGeneral name isSub res = do +- let (name':rest) = words name +- fmap fst $ mkYesodGeneral name' rest isSub res +- +--- | See 'mkYesodData'. +-mkYesodDispatch :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodDispatch name = fmap snd . mkYesodGeneral name [] False +- +--- | Get the Handler and Widget type synonyms for the given site. +-masterTypeSyns :: Type -> [Dec] +-masterTypeSyns site = +- [ TySynD (mkName "Handler") [] +- $ ConT ''HandlerT `AppT` site `AppT` ConT ''IO +- , TySynD (mkName "Widget") [] +- $ ConT ''WidgetT `AppT` site `AppT` ConT ''IO `AppT` ConT ''() +- ] +- +-mkYesodGeneral :: String -- ^ foundation type +- -> [String] -- ^ arguments for the type +- -> Bool -- ^ it this a subsite +- -> [ResourceTree String] +- -> Q([Dec],[Dec]) +-mkYesodGeneral name args isSub resS = do +- renderRouteDec <- mkRenderRouteInstance site res +- routeAttrsDec <- mkRouteAttrsInstance site res +- dispatchDec <- mkDispatchInstance site res +- parse <- mkParseRouteInstance site res +- let rname = mkName $ "resources" ++ name +- eres <- lift resS +- let resourcesDec = +- [ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String) +- , FunD rname [Clause [] (NormalB eres) []] +- ] +- let dataDec = concat +- [ [parse] +- , renderRouteDec +- , [routeAttrsDec] +- , resourcesDec +- , if isSub then [] else masterTypeSyns site +- ] +- return (dataDec, dispatchDec) +- where site = foldl' AppT (ConT $ mkName name) (map (VarT . mkName) args) +- res = map (fmap parseType) resS +- +-mkMDS :: Q Exp -> MkDispatchSettings +-mkMDS rh = MkDispatchSettings +- { mdsRunHandler = rh +- , mdsSubDispatcher = +- [|\parentRunner getSub toParent env -> yesodSubDispatch +- YesodSubRunnerEnv +- { ysreParentRunner = parentRunner +- , ysreGetSub = getSub +- , ysreToParentRoute = toParent +- , ysreParentEnv = env +- } +- |] +- , mdsGetPathInfo = [|W.pathInfo|] +- , mdsSetPathInfo = [|\p r -> r { W.pathInfo = p }|] +- , mdsMethod = [|W.requestMethod|] +- , mds404 = [|notFound >> return ()|] +- , mds405 = [|badMethod >> return ()|] +- , mdsGetHandler = defaultGetHandler +- } +- +--- | If the generation of @'YesodDispatch'@ instance require finer +--- control of the types, contexts etc. using this combinator. You will +--- hardly need this generality. However, in certain situations, like +--- when writing library/plugin for yesod, this combinator becomes +--- handy. +-mkDispatchInstance :: Type -- ^ The master site type +- -> [ResourceTree a] -- ^ The resource +- -> DecsQ +-mkDispatchInstance master res = do +- clause' <- mkDispatchClause (mkMDS [|yesodRunner|]) res +- let thisDispatch = FunD 'yesodDispatch [clause'] +- return [InstanceD [] yDispatch [thisDispatch]] +- where +- yDispatch = ConT ''YesodDispatch `AppT` master +- +-mkYesodSubDispatch :: [ResourceTree a] -> Q Exp +-mkYesodSubDispatch res = do +- clause' <- mkDispatchClause (mkMDS [|subHelper . fmap toTypedContent|]) res +- inner <- newName "inner" +- let innerFun = FunD inner [clause'] +- helper <- newName "helper" +- let fun = FunD helper +- [ Clause +- [] +- (NormalB $ VarE inner) +- [innerFun] +- ] +- return $ LetE [fun] (VarE helper) +diff --git a/Yesod/Core/Types.hs b/Yesod/Core/Types.hs +index 7e3fd0d..994d322 100644 +--- a/Yesod/Core/Types.hs ++++ b/Yesod/Core/Types.hs +@@ -21,6 +21,7 @@ import Control.Monad.Catch (MonadCatch (..)) + import Control.Monad.Catch (MonadMask (..)) + #endif + import Control.Monad.IO.Class (MonadIO (liftIO)) ++import qualified Control.Monad.Logger + import Control.Monad.Logger (LogLevel, LogSource, + MonadLogger (..)) + import Control.Monad.Trans.Control (MonadBaseControl (..)) +@@ -187,7 +188,7 @@ data RunHandlerEnv site = RunHandlerEnv + , rheRoute :: !(Maybe (Route site)) + , rheSite :: !site + , rheUpload :: !(RequestBodyLength -> FileUpload) +- , rheLog :: !(Loc -> LogSource -> LogLevel -> LogStr -> IO ()) ++ , rheLog :: !(Control.Monad.Logger.Loc -> LogSource -> LogLevel -> LogStr -> IO ()) + , rheOnError :: !(ErrorResponse -> YesodApp) + -- ^ How to respond when an error is thrown internally. + -- +diff --git a/Yesod/Core/Widget.hs b/Yesod/Core/Widget.hs +index 481199e..8489fbe 100644 +--- a/Yesod/Core/Widget.hs ++++ b/Yesod/Core/Widget.hs +@@ -16,8 +16,8 @@ module Yesod.Core.Widget + WidgetT + , PageContent (..) + -- * Special Hamlet quasiquoter/TH for Widgets +- , whamlet +- , whamletFile ++ --, whamlet ++ --, whamletFile + , ihamletToRepHtml + , ihamletToHtml + -- * Convert to Widget +@@ -46,7 +46,7 @@ module Yesod.Core.Widget + , widgetToParentWidget + , handlerToWidget + -- * Internal +- , whamletFileWithSettings ++ --, whamletFileWithSettings + , asWidgetT + ) where + +@@ -207,35 +207,9 @@ addScriptRemote = flip addScriptRemoteAttrs [] + addScriptRemoteAttrs :: MonadWidget m => Text -> [(Text, Text)] -> m () + addScriptRemoteAttrs x y = tell $ GWData mempty mempty (toUnique $ Script (Remote x) y) mempty mempty mempty mempty + +-whamlet :: QuasiQuoter +-whamlet = NP.hamletWithSettings rules NP.defaultHamletSettings +- +-whamletFile :: FilePath -> Q Exp +-whamletFile = NP.hamletFileWithSettings rules NP.defaultHamletSettings +- +-whamletFileWithSettings :: NP.HamletSettings -> FilePath -> Q Exp +-whamletFileWithSettings = NP.hamletFileWithSettings rules +- + asWidgetT :: WidgetT site m () -> WidgetT site m () + asWidgetT = id + +-rules :: Q NP.HamletRules +-rules = do +- ah <- [|asWidgetT . toWidget|] +- let helper qg f = do +- x <- newName "urender" +- e <- f $ VarE x +- let e' = LamE [VarP x] e +- g <- qg +- bind <- [|(>>=)|] +- return $ InfixE (Just g) bind (Just e') +- let ur f = do +- let env = NP.Env +- (Just $ helper [|getUrlRenderParams|]) +- (Just $ helper [|liftM (toHtml .) getMessageRender|]) +- f env +- return $ NP.HamletRules ah ur $ \_ b -> return $ ah `AppE` b +- + -- | Wraps the 'Content' generated by 'hamletToContent' in a 'RepHtml'. + ihamletToRepHtml :: (MonadHandler m, RenderMessage (HandlerSite m) message) + => HtmlUrlI18n message (Route (HandlerSite m)) +-- +2.0.0 + diff --git a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch new file mode 100644 index 000000000..cb0ff9d08 --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch @@ -0,0 +1,1833 @@ +From 38834f94992679d8c4d936fec12eb32b82073553 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Wed, 21 May 2014 05:23:19 +0000 +Subject: [PATCH] splice TH + +--- + Yesod/Form/Fields.hs | 738 +++++++++++++++++++++++++++++++++--------------- + Yesod/Form/Functions.hs | 289 +++++++++++++------ + Yesod/Form/Jquery.hs | 129 +++++++-- + Yesod/Form/MassInput.hs | 233 ++++++++++++--- + Yesod/Form/Nic.hs | 65 ++++- + yesod-form.cabal | 1 - + 6 files changed, 1054 insertions(+), 401 deletions(-) + +diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs +index cd67820..46b5d96 100644 +--- a/Yesod/Form/Fields.hs ++++ b/Yesod/Form/Fields.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE QuasiQuotes #-} + {-# LANGUAGE TypeFamilies #-} + {-# LANGUAGE OverloadedStrings #-} + {-# LANGUAGE GeneralizedNewtypeDeriving #-} +@@ -18,9 +17,6 @@ module Yesod.Form.Fields + , timeField + , htmlField + , emailField +- , multiEmailField +- , searchField +- , AutoFocus + , urlField + , doubleField + , parseDate +@@ -37,15 +33,11 @@ module Yesod.Form.Fields + , selectFieldList + , radioField + , radioFieldList +- , checkboxesFieldList +- , checkboxesField + , multiSelectField + , multiSelectFieldList + , Option (..) + , OptionList (..) + , mkOptionList +- , optionsPersist +- , optionsPersistKey + , optionsPairs + , optionsEnum + ) where +@@ -72,6 +64,15 @@ import Control.Monad (when, unless) + import Data.Either (partitionEithers) + import Data.Maybe (listToMaybe, fromMaybe) + ++import qualified Text.Blaze as Text.Blaze.Internal ++import qualified Text.Blaze.Internal ++import qualified Text.Hamlet ++import qualified Yesod.Core.Widget ++import qualified Text.Css ++import qualified Data.Monoid ++import qualified Data.Foldable ++import qualified Control.Monad ++ + import qualified Blaze.ByteString.Builder.Html.Utf8 as B + import Blaze.ByteString.Builder (writeByteString, toLazyByteString) + import Blaze.ByteString.Builder.Internal.Write (fromWriteList) +@@ -84,15 +85,12 @@ import Data.Text as T (Text, concat, intercalate, unpack, pack, splitOn) + import qualified Data.Text.Read + + import qualified Data.Map as Map +-import Yesod.Persist (selectList, runDB, Filter, SelectOpt, Key, YesodPersist, PersistEntity, PersistQuery) + import Control.Arrow ((&&&)) + + import Control.Applicative ((<$>), (<|>)) + + import Data.Attoparsec.Text (Parser, char, string, digit, skipSpace, endOfInput, parseOnly) + +-import Yesod.Persist.Core +- + defaultFormMessage :: FormMessage -> Text + defaultFormMessage = englishFormMessage + +@@ -104,10 +102,24 @@ intField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidInteger s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOn ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -121,10 +133,24 @@ doubleField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidNumber s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOz ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -132,10 +158,24 @@ $newline never + dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day + dayField = Field + { fieldParse = parseHelper $ parseDate . unpack +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOJ ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -143,10 +183,23 @@ $newline never + timeField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m TimeOfDay + timeField = Field + { fieldParse = parseHelper parseTime +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOW ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -159,10 +212,18 @@ $newline never + htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html + htmlField = Field + { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . renderHtml) +@@ -171,8 +232,6 @@ $newline never + -- br-tags. + newtype Textarea = Textarea { unTextarea :: Text } + deriving (Show, Read, Eq, PersistField, Ord, ToJSON, FromJSON) +-instance PersistFieldSql Textarea where +- sqlType _ = SqlString + instance ToHtml Textarea where + toHtml = + unsafeByteString +@@ -190,10 +249,18 @@ instance ToHtml Textarea where + textareaField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Textarea + textareaField = Field + { fieldParse = parseHelper $ Right . Textarea +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -201,10 +268,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage) + => Field m p + hiddenField = Field + { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPo ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -212,20 +288,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex + textField = Field + { fieldParse = parseHelper $ Right + , fieldView = \theId name attrs val isReq -> +- [whamlet| +-$newline never +- +-|] ++ do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + + passwordField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Text + passwordField = Field + { fieldParse = parseHelper $ Right +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arPF ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -297,57 +408,24 @@ emailField = Field + case Email.canonicalizeEmail $ encodeUtf8 s of + Just e -> Right $ decodeUtf8With lenientDecode e + Nothing -> Left $ MsgInvalidEmail s +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] +- , fieldEnctype = UrlEncoded +- } ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arQe ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } + +--- | +--- +--- Since 1.3.7 +-multiEmailField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m [Text] +-multiEmailField = Field +- { fieldParse = parseHelper $ +- \s -> +- let addrs = map validate $ splitOn "," s +- in case partitionEithers addrs of +- ([], good) -> Right good +- (bad, _) -> Left $ MsgInvalidEmail $ cat bad +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] +- , fieldEnctype = UrlEncoded +- } +- where +- -- report offending address along with error +- validate a = case Email.validate $ encodeUtf8 a of +- Left e -> Left $ T.concat [a, " (", pack e, ")"] +- Right r -> Right $ emailToText r +- cat = intercalate ", " +- emailToText = decodeUtf8With lenientDecode . Email.toByteString +- +-type AutoFocus = Bool +-searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus -> Field m Text +-searchField autoFocus = Field +- { fieldParse = parseHelper Right +- , fieldView = \theId name attrs val isReq -> do +- [whamlet| +-$newline never +- +-|] +- when autoFocus $ do +- -- we want this javascript to be placed immediately after the field +- [whamlet| +-$newline never +-") } ++ ++ toWidget $ \ _render_aJMx ++ -> (Text.Css.CssNoWhitespace ++ . (foldr ($) [])) ++ [((++) ++ $ (map ++ Text.Css.TopBlock ++ (((Text.Css.Block ++ {Text.Css.blockSelector = Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "#", ++ toCss theId], ++ Text.Css.blockAttrs = (Prelude.concat ++ $ ([Text.Css.Attr ++ (Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "-webkit-appearance"]) ++ (Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "textfield"])] ++ : ++ (map ++ Text.Css.mixinAttrs ++ []))), ++ Text.Css.blockBlocks = (), ++ Text.Css.blockMixins = ()} :) ++ . ((foldr (.) id []) ++ . (concatMap Text.Css.mixinBlocks [] ++))) ++ [])))] ++ , fieldEnctype = UrlEncoded } -@@ -358,7 +436,30 @@ urlField = Field +@@ -365,7 +567,28 @@ urlField = Field Nothing -> Left $ MsgInvalidUrl s Just _ -> Right s , fieldView = \theId name attrs val isReq -> - [whamlet||] -+ do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ do { (asWidgetT . toWidget) + ((Text.Blaze.Internal.preEscapedText . pack) "") } + , fieldEnctype = UrlEncoded } -@@ -371,18 +472,56 @@ selectField :: (Eq a, RenderMessage site FormMessage) +@@ -378,18 +601,54 @@ selectField :: (Eq a, RenderMessage site FormMessage) => HandlerT site IO (OptionList a) -> Field (HandlerT site IO) a selectField = selectFieldHelper @@ -460,60 +733,58 @@ index cd67820..46b5d96 100644 -$newline never -") }) + -- onOpt -+ (\_theId _name _attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ (\_theId _name _attrs value isSel text -> do { (asWidgetT . toWidget) + ((Text.Blaze.Internal.preEscapedText . pack) "") }) + -- inside multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)] -@@ -405,11 +544,48 @@ multiSelectField ioptlist = +@@ -412,11 +671,45 @@ multiSelectField ioptlist = view theId name attrs val isReq = do opts <- fmap olOptions $ handlerToWidget ioptlist let selOpts = map (id &&& (optselected val)) opts @@ -522,68 +793,52 @@ index cd67820..46b5d96 100644 - $forall (opt, optsel) <- selOpts -

") } + -+ (\theId name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ (\theId name isSel -> do { (asWidgetT . toWidget) + ((Text.Blaze.Internal.preEscapedText . pack) + "") }) + -+ (\theId name attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ (\theId name attrs value isSel text -> do { (asWidgetT . toWidget) + ((Text.Blaze.Internal.preEscapedText . pack) + "") }) + @@ -699,99 +983,93 @@ index cd67820..46b5d96 100644 - -